1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
|
Changes in release 18:
----------------------
* Cleanups to it synthesizes correctly under Quartus II 5.1 SP2.
* For the parallel printer, don't use BREAK as end of job marker; it
turns out too many modern serial ports -- especially USB ones --
don't correctly handle an incoming BREAK. Instead, turn FF into FF
FF and use FF 00 as end of job. This is done in hardware, so the
firmware shouldn't notice. abcprintd has been changed accordingly.
* In abcprintd, print "box" (ASCII 127) as a solid dot; looks better
in standard PostScript Courier.
* Update the Z80 assembler, and include it in the release.
* Change the CPU core from T80 to TV80, so the design is now all
Verilog.
* This file changed from ISO-8859-1 encoding to UTF-8 encoding.
Changes in release 17:
----------------------
* Fix using SW3 as turbo button (broken in release 16.)
Changes in release 16:
----------------------
* Support the ABC80 sound generator. The original ABC80 had an
SN76477 semianalog synthesizer chip, largely crippled by using fixed RC
circuits for its adjustables. For the FPGA, emulate the operation
using digital logic, but I believe the correspondance should be very
good, at least to the extent that the real SN76477 matches the
datasheet. There is clearly *some* differences, or "out 6,255"
would be silent on ABC80. I simply made a guess as to how those
sounds should be generated. If someone with a real ABC80 could
record a set of files of all 128 sounds I might be able to get even
closer.
1 REM This program plays all 128 sounds in order
2 FOR I%=1% to 255% STEP 2%
3 GET Z¤
4 PRINT I%
5 OUT 6%,0%,6%,I%
6 NEXT I%
7 GET Z¤
8 OUT 6%,0%
* The display now shows the frequency in MHz by default.
* The LEDs can now be controlled programmatically if desired.
OUT 148,X X = 1 to control single LEDs + 2 to control display
OUT 149,L Sets the individual LEDs
OUT 150,A Sets the right display (units)
OUT 151,B Sets the left display (tens)
All of these can be read back via INP(port), too.
* Centralize all the non-ABC-compatible register handling (MMU, turbo,
LEDs.) The turbo can now be read back (via INP(144)), in addition
to the MMU registers which have always been readable.
* For those sick enough to want it, the cassette port is now connected
to the following pins on Prototype Connector 1 (J11):
Relay - pin 29
Output - pin 28
Input - pin 38
Ground - pin 26, 30 and 40
These signals are 5V and TTL-compatible. +5V is available on pin 2
of J12. See page 20 of the "Nios Development Board Reference
Manual, Cyclone Edition" (version 1.0).
Changes in release 14/15:
-------------------------
* Make the Ethernet controller available to the ABC80. The Verilog
for this is a bit ugly, because I really wanted to do something that
could be implemented on a real ABC-bus card, but the Ethernet chip
on the Altera board shares a bus with the memory.
The Ethernet chip is an SMSC 91C111 controller; it has 128
byte-sized registers, divided into 8 banks of 16 registers each.
This is implemented as follows:
OUT 1,25 - hardware select
OUT 2,R*8+B - select register R of bank B
OUT 0,data - write data from selected register
INP(0) - read data from selected register
WARNING: If you write the address select register (bank 1,
register 3) then you will need to power cycle the board before you
can access the Ethernet chip again.
* Support DBLE/NRML (141, 140) on the video display -- it should now
have all the capabilities of the ABC800C video unit, plus black text
and being able to press SW0 to reveal hidden text.
As I kid, I always wondered how DBLE/NRML were implemented in
hardware. The answer is, it's a pain!
* Make the printer interface closer to the original ABC80 Centronics
card. See data/printer.asm and printer.v.
Changes in release 13:
----------------------
* Fix bug introduced during port to msxz80asm that would cause the
comma (,) key, 44 decimal, to give a capital (D), 0x44 hex.
Changes in release 12:
----------------------
* Switch from the horrible "masm" Z80 assembler to msxz80asm:
http://savannah.nongnu.org/projects/z80asm/
* Use Write and Verify when writing to the CompactFlash card.
Changes in release 11:
----------------------
* CompactFlash mystery solved: there is a cf_power pin which turns off
power to the CompactFlash card on the board! It was left floating,
which apparently means the power supply to the CF card worked *most*
of the time... apparently not always. Tie this pin to VCC seems to
work.
* Cleaned up the generation of chargen.mif a bit. Also generate .bas
files to select Danish/Norwegian or International (= US) charset.
Changes in release 10:
----------------------
* Bang hard on getting the CompactFlash interface more stable. I
still get data corruption on cards after they have been used a while;
unfortunately it seems to be a bug on the cards themselves and I don't
know how to work around it.
* Remove some old debugging code in T80PIO.
* Four levels of speed control: 3, 6, 12, 25 MHz.
out 144,0 = 3 MHz, out 144,1 = 6 MHz etc.
* New LED assignment:
LED 0 - disk (CF) activity (for real!)
LED 1 - disk selected (like the old LED 0)
LED 2 - CF card in slot
LED 3 - CAS: relay (OUT 58,32)
LED 4 - CAS: data out (OUT 58,64)
LED 5 - turbo 3 (25 MHz)
LED 6 - turbo 2 (12, 25 MHz)
LED 7 - turbo 1 (6, 12, 25 MHz)
Changes in release 9:
---------------------
* Add support to use serial port B (DEBUG) as a lame printer port.
Since this port supports no handshake, at least on the board I have
(Altera Nios Development Kit Cyclone Edition), it simply prints
at default 115200 baud. Since serial printers are virtually extinct
I am using a program running on a Linux box to actually send the
data to my printer; see tools/abcprintd.c.
The hardware interface is as follows:
OUT 1,24 - hardware select
OUT 0,<byte> - send data byte
OUT 2,<time> - send BREAK for time+1 bit times
OUT 3,L,4,H - set baud rate to 25000000/(H:L+1)
INP(1) - bit 0: sending byte
bit 1: sending break
bit 2: handshake active (not currently used)
The idea is to wait until port 1 is zero before doing anything.
The printer ROM sends BREAK on CLOSE, so that the other side knows
that it can send the data to the printer now (job separator.)
* The top half of the Printer Option ROM area (7800h-7BFFh) is now
RAM; the idea is to move the UFD-DOS poke variables there
eventually.
(UFD-DOS was actually the operating system for ABC800, not ABC80.
I found a port of it to ABC800 in ABC-Klubbens programbank; this is
good since the older ABC80 DOS wouldn't have supported "hard drives"
or subdirectories.)
Changes in release 8:
---------------------
* A whole bunch of changes in version 7 was in the programming files,
but hadn't actually been checked into the published sources! In other
words, the source code was wrong, and I actually ended up having to
re-debug the CompactFlash controller from scratch. Fix a whole bunch
of glitches.
* Update the sources for Quartus II version 4.1 compatibility.
* New LED assignment:
LED 0 - disk (CF) activity (for real!)
LED 1 - disk selected (like the old LED 0)
LED 2 - CF card in slot
LED 3 - unused
LED 4 - unused
LED 5 - CAS: relay (OUT 58,32)
LED 6 - CAS: data out (OUT 58,64)
LED 7 - turbo (25 MHz)
Changes in release 7:
---------------------
* Make the "80-character BASIC patch ROM" available regardless of the
memory type; it's now enabled by bit 15 in the MMU physical page
number. Writes always go to the target memory type, but reads come
from the patch ROM if the address matches and it's enabled.
-> Note: This means the default memory map 1 isn't usable to load
something that shouldn't be patched, such as the checksum 11273
BASIC or a BASIC II. If so, the following program will "scrub"
map 1 and turn off the patch bits for all the entries:
1 FOR I%=0% to 63%
2 OUT 128%,I% : OUT 129%,1%
3 OUT 130%,INP(130%) : OUT 131%,INP(131%) AND 127%
4 NEXT I%
* Accordingly, change the "hyperspace" memory type to 7, and allow
bits [7:0] of the physical page to determine what byte gets
returned.
Changes in release 6:
---------------------
* Run at 25 MHz in turbo mode (3 MHz in non-turbo mode.)
-> At 25 MHz the standard key repeat rate is probably too fast.
In ABC80 keyboard repeat is done by timing loops in the BASIC
interpreter; this can be dealt with by loading the BASIC into RAM
and modifying it.
The following program can be used to copy the BASIC into RAM:
1 POKE 65408%,175%,111%,103%,95%,87%,79%,6%,128%,62%,4%,211%,132%
2 POKE 65420%,237%,176%,62%,21%,211%,132%,201%
3 Z%=CALL(65408%)
Note that when the BASIC is in RAM it is no longer automatically
switched between 40- and 80-character mode. It would require MMU
changes to make that happen automatically; I might add that later.
The delay before keyboard repeat is at bytes 767 *and* 816
(standard is 70); the delay between repeats is at byte 783
(standard is 8). I find the following rather usable at 25 MHz:
4 D%=255% : R%=32%
5 POKE 767%,D% : POKE 783%,R% : POKE 816%,D%
* *Actually* fix the clock generator!!
* Add keybindings: Home = Ctrl-Ö, End = Ctrl-Ä, PgUp = Ctrl-Å,
PgDn = Ctrl-Ü, Delete = Ctrl-D, Insert = Ctrl-F. This matches the
keybindings used by the TED text editor.
Changes in release 5:
---------------------
* Up and Down keys now return Ctrl-W and Ctrl-Z. If Ctrl is pressed
or Scroll Lock is pressed, Left and Right return Ctrl-A and Ctrl-S
instead of Ctrl-H and Ctrl-I. Backspace and Tab always return
Ctrl-H and Ctrl-I.
* Add a turbo button (sw3) that switches between 12.5 MHz and 3 MHz.
Turbo can also be controlled with OUT (144),<turbo>.
-> The design should be able to handle 25 MHz, but it would require
trimming the CPU -> MMU -> SRAM -> CPU path.
* Fix the clock generator so it generates 50 Hz and 7812.5 Hz
correctly.
Changes in release 4:
---------------------
* Handle the case where the CompactFlash card is removed from the
socket a bit saner.
* The firmware requires masm-0.1-hpa2 to assemble (yet another bug in
this horribly broken assembler fixed. Really need to find a better
one.)
* 80 character screen is now the default.
Changes in release 3:
---------------------
* 80-column mode now properly supported, including switching the BASIC
ROM.
* The 7-segment LED is used as a substitute for the sound generator.
|