summaryrefslogtreecommitdiff
path: root/system/shard-z80-altos/6/src/ALTOSSHD.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'system/shard-z80-altos/6/src/ALTOSSHD.ASM')
-rw-r--r--system/shard-z80-altos/6/src/ALTOSSHD.ASM1786
1 files changed, 1786 insertions, 0 deletions
diff --git a/system/shard-z80-altos/6/src/ALTOSSHD.ASM b/system/shard-z80-altos/6/src/ALTOSSHD.ASM
new file mode 100644
index 0000000..5df69fb
--- /dev/null
+++ b/system/shard-z80-altos/6/src/ALTOSSHD.ASM
@@ -0,0 +1,1786 @@
+ADDR B1 B2 B3 B4 ASCII INSTR PARAMETER COMMENT
+0100 C3 F9 01 ... JP 01F9 ; Init Shard + Start EUMEL0
+0103 C3 8C 0B ... JP 0B8C ; LIMIT
+0106 C3 2A 01 .*. JP 012A ; OUTPUT
+0109 C3 4B 01 .K. JP 014B ; BLOCKIN
+010C C3 53 01 .S. JP 0153 ; BLOCKOUT
+010F C3 5B 01 .[. JP 015B ; IOCONTROL
+0112 C3 AC 0B ... JP 0BAC ; SYSEND
+0115 C3 90 0B ... JP 0B90 ; SCHINF
+0118 C3 94 0B ... JP 0B94 ; SCHACC
+011B C3 89 0B ... JP 0B89 ; LONGMOVE
+011E 06 ; SHDVER = 6
+011F 00 00 ; ID 4
+0121 00 00 ; ID 5
+0123 00 00 ; ID 6
+0125 00 00 ; ID 7
+0127 C3 63 01 .c. JP 0163 ; I/O-Setzen fuer 'putboot'
+012A DD E5 .. PUSH IX ; OUTPUT (Kanal A, Length BC,
+012C FD E5 .. PUSH IY ; Addr HL, Ausgegeben BC,
+012E E5 . PUSH HL ; Carry SET : Alles raus)
+012F D5 . PUSH DE
+0130 F5 . PUSH AF
+0131 E5 . PUSH HL
+0132 CD A6 01 ... CALL 01A6 ; Zugriff auf Kanaltabelle --> IY/DE
+0135 D5 . PUSH DE ; DE --> IX (Addr. von Startaddr.)
+0136 DD E1 .. POP IX
+0138 EB . EX DE,HL
+0139 5E ^ LD E,(HL) ; (Startaddresse) --> DE
+013A 23 # INC HL
+013B 56 V LD D,(HL)
+013C E1 . POP HL ; Textstartaddresse
+013D CD 49 01 .I. CALL 0149 ; = JP (DE) Routine starten
+0140 D1 . POP DE ; ehem. Returnaddresse loeschen
+0141 7A z LD A,D
+0142 D1 . POP DE
+0143 E1 . POP HL
+0144 FD E1 .. POP IY
+0146 DD E1 .. POP IX
+0148 C9 . RET
+0149 D5 . PUSH DE
+014A C9 . RET ;-----------------------------------
+014B DD E5 .. PUSH IX ; BLOCKIN
+014D DD 21 02 00 .!.. LD IX,0002 ; Aufgabe 2
+0151 18 18 .. JR 016B ;----------------------------------
+0153 DD E5 .. PUSH IX ; BLOCKOUT
+0155 DD 21 03 00 .!.. LD IX,0003 ; Aufgabe 3
+0159 18 10 .. JR 016B ;----------------------------------
+015B DD E5 .. PUSH IX ; IOCONTROL
+015D DD 21 04 00 .!.. LD IX,0004 ; Aufgabe 4
+0161 18 08 .. JR 016B ;---------putboot Aufg. 5----------
+0163 DD E5 .. PUSH IX ;
+0165 DD 21 05 00 .!.. LD IX,0005 ; Aufgabe 5
+0169 18 00 .. JR 016B ;---------------------------------
+016B FD E5 .. PUSH IY ; Je nach IX Kanal-Aufgabe (I/O)
+016D D5 . PUSH DE
+016E E5 . PUSH HL
+016F CD 79 01 .y. CALL 0179 ; Register wurden gerettet
+0172 E1 . POP HL
+0173 D1 . POP DE
+0174 FD E1 .. POP IY
+0176 DD E1 .. POP IX
+0178 C9 . RET ;-----------------------------------
+0179 E5 . PUSH HL
+017A D5 . PUSH DE
+017B CD A6 01 ... CALL 01A6 ; Kanaladdr --> DE, IY
+017E DD 19 .. ADD IX,DE ; DE = 4. + 5. Byte + Aufgabennummer
+0180 DD 6E 00 .n. LD L,(IX+00) ; Byte zur Aufgabe
+0183 26 FF &. LD H,FF
+0185 D5 . PUSH DE
+0186 DD E1 .. POP IX ; IX = Addresse des tabellenentries
+0188 19 . ADD HL,DE ;
+0189 59 Y LD E,C ; BC = code1
+018A 78 x LD A,B
+018B B7 . OR A
+018C 28 05 (. JR Z,0193 ; EUMEL-Funktion 0<=code1<256
+018E 3C < INC A
+018F 28 02 (. JR Z,0193 ; Shard-Funktion -256<=code1<0
+0191 1E FF .. LD E,FF ; -1 = Illegale Funktion
+0193 7E ~ LD A,(HL)
+0194 23 # INC HL
+0195 BB . CP E ; Addresse mit der Funktionsnummer
+0196 28 07 (. JR Z,019F ; suchen
+0198 3C < INC A ; FF=Tabellenende
+0199 28 04 (. JR Z,019F
+019B 23 # INC HL
+019C 23 # INC HL
+019D 18 F4 .. JR 0193 ; naechste Funktionsnummer
+019F 5E ^ LD E,(HL)
+01A0 23 # INC HL
+01A1 56 V LD D,(HL) ; Sprung zur Addresse, die in der
+01A2 EB . EX DE,HL ; Tabelle steht
+01A3 D1 . POP DE ; DE= code2 (Eingang HL)
+01A4 E3 . EX (SP),HL
+01A5 C9 . RET ; ---------------------------------
+01A6 C5 . PUSH BC ; Kanalinfos aus Tabelle --> IY/DE
+01A7 11 05 00 ... LD DE,0005 ; Entrylaenge in der Tabelle
+01AA 21 12 02 !.. LD HL,0212 ; Tabellenanfang (Kanaele)
+01AD 46 F LD B,(HL) ; Erstes Byte ist Tabellenlaenge
+01AE 23 # INC HL
+01AF BE . CP (HL) ; Erstes Entrybyte ist Kanalnummer
+01B0 28 03 (. JR Z,01B5 ; Bis Kanal gefunden
+01B2 19 . ADD HL,DE
+01B3 10 FA .. DJNZ 01AF
+01B5 23 # INC HL ; 2. u. 3. Byte --> DE
+01B6 5E ^ LD E,(HL)
+01B7 23 # INC HL
+01B8 56 V LD D,(HL)
+01B9 D5 . PUSH DE ; 2. u. 3. Byte --> IY
+01BA FD E1 .. POP IY
+01BC 23 # INC HL ; 4. u. 5. Byte --> DE
+01BD 5E ^ LD E,(HL)
+01BE 23 # INC HL
+01BF 56 V LD D,(HL)
+01C0 C1 . POP BC ; gerettetes BC zurueck
+01C1 C9 . RET ;----------------------------------
+;============================= Parameterkanal ==============================
+01C2 01 5F 06 ; 1, IOCONTROL "typ"
+01C5 02 50 06 ; 2, IOCONTROL "frout"
+01C8 05 46 06 ; 5, IOCONTROL "size"
+01CB 06 ED 01 ; 6, IOCONTROL "flow"
+01CE 08 ED 01 ; 8, IOCONTROL "baud"
+01D1 09 ED 01 ; 9, IOCONTROL "bits"
+01D4 E2 ED 01 ; -30, IOCONTROL maske f. busystatus
+01D7 E1 ED 01 ; -31, IOCONTROL maske f. strobe setz.
+01DA FF 4C 06 ; -1, IOCONTROL ill.
+01DD FE 86 0B ; -2, Aufg. 5 : kanal init
+01E0 FF 55 06 ; -1, Aufg. 5 : BC = 1
+01E3 FF 4C 06 ; BLOCKIO ill.
+01E6 59 ; Parameterkanal : OUTPUT: 0659 ill.
+01E7 06 ;
+01E8 FD ; BLOCKIN : 01E3
+01E9 FD ; BLOCKOUT : 01E3
+01EA DC ; IOCONTROL : 01C2
+01EB F7 ; Aufg. 5 : 01DD
+01EC 00 ; Keine I/O moeglich
+ ; ----- set "flow","bits","baud" ---
+01ED 7D } LD A,L ; Kanal = addressierter kanal
+01EE 2E 00 .. LD L,00 ; 0 = Parameter setzen (code2)
+01F0 C3 63 01 .c. JP 0163 ; Aufgabe 5, L = 0
+01F3 7D } LD A,L ; kanal = addressierter Kanal
+01F4 2E 01 .. LD L,01 ; 1 = Parameter lesen (code2)
+01F6 C3 63 01 .c. JP 0163 ; Aufgabe 5, L = 1
+01F9 F3 . DI ;---------- Init Shard -------------
+01FA 3E 00 >. LD A,00 ; Page 0 = Interruptvektoren
+01FC ED 47 .G LD I,A
+01FE 31 00 B0 1.. LD SP,B000
+0201 3E 21 >! LD A,21 ; Kanal 0..32
+0203 01 FE FF ... LD BC,FFFE ; Funktion -2 = Kanalinit
+0206 3D = DEC A
+0207 F5 . PUSH AF
+0208 CD 63 01 .c. CALL 0163 ; Kanaele initialisieren (IRQ's)
+020B F1 . POP AF
+020C B7 . OR A
+020D 20 F4 . JR NZ,0203
+020F C3 10 1E ... JP 1E10 ; Systemstart EUMEL0 bzw. 'putboot'
+ ----------------------------------- Entry : Kanal, Puffer, ROUTINETBL
+0212 0C ; Tabelle mit 12 Kanaelen
+0213 20 00 00 E6 01 ; Parameterkanal, Kein Puffer
+0218 00 64 0C 0C 07 ; Hintergrund
+021D 01 CD 0C 7B 02 ; Kanal 1 .. 6 = seriell
+0222 02 5B 0D 7B 02 ;
+0227 03 E9 0D 7B 02
+022C 04 77 0E 7B 02
+0231 05 05 0F 7B 02
+0236 06 93 0F 7B 02
+023B 07 BD 0F EA 0A ; printer
+0240 08 C3 0F EA 0A ; parallel 1
+0245 09 C9 0F EA 0A ; parallel 2
+024A 1F CF 0F 7D 06 ; floppy
+024F FF 00 00 3F 06 ; illegal Kanal
+;======================== Serielle Kanaele =================================
+0254 01 5F 06 ; 1, IOCONTROL "typ"
+0257 02 36 05 ; 2, IOCONTROL "frout"
+025A 05 46 06 ; 5, IOCONTROL "size"
+025D 06 F3 01 ; 6, IOCONTROL "flow"
+0260 08 F3 01 ; 8, IOCONTROL "baud"
+0263 09 F3 01 ; 9, IOCONTROL "bits"
+0266 FD D6 02 ; -3, IOCONTROL "portinfo"
+0269 FF 4C 06 ; -1 ill.
+026C 06 2A 03 ; 6, Aufg .5 : "flow" setzen/info
+026F 08 F2 02 ; 8, Aufg. 5 : "baud" setzen/info
+0272 09 AA 03 ; 9, Aufg. 5 : "bits" setzen/info
+0275 FE A2 02 ; -2, Aufg. 5 : Kanal init
+0278 FF 4C 06 ; BLOCKIN/BLOCKOUT ill.
+027B 31 ; Seriell : 0431 = OUTPUT
+027C 04
+027D FD ; BLOCKIN : 0278
+027E FD ; BLOCKOUT : 0278
+027F D9 ; IOCONTROL : 0251
+0280 F1 ; Aufg. 5 : 026C
+0281 03 ; Typ : Stream I/O
+ ; Baudratetabelle : 1. Byte: Bit 7+6 = Vorteiler (Register4)
+ ; Bit 4 = DIV 256, DIV 16,Bit 5 : Mode (CTC)
+ ; 2. Byte: CTC-Zeitkonstante
+0282 40 9C ; 50 Baud
+0284 40 68 ; 75 Baud
+0286 40 47 ; 110 baud
+0288 E0 E8 ; 134.5 Baud
+028A E0 D0 ; 150 Baud
+028C A0 D0 ; 300 Baud
+028E 60 D0 ; 600 Baud
+0290 60 68 ; 1200 baud
+0292 60 45 ; 1800 Baud
+0294 60 34 ; 2400 Baud
+0296 60 23 ; 3600 Baud
+0298 60 1A ; 4800 Baud
+029A 60 11 ; 7200 Baud
+029C 60 0D ; 9600 Baud
+029E 60 07 ; 19200 Baud
+02A0 60 03 ; 38400 Baud
+02A2 FD 4E 1A .N. LD C,(IY+1A) ;------------- "kanal init" --------
+02A5 06 0D .. LD B,0D ; Commandport in (IY+1A)
+02A7 21 C9 02 !.. LD HL,02C9 ; 13 Bytes ausgeben
+02AA ED B3 .. OTIR ; An den Commandport schicken
+02AC FD 5E 1D .^. LD E,(IY+1D) ; Interruptvektor des Kanals
+02AF ED 57 .W LD A,I ; Vektortabellenaddresse High
+02B1 57 W LD D,A
+02B2 ED 59 .Y OUT (C),E ; Interruptvektor fuer Kanal
+02B4 0E 1E .. LD C,1E ; Serviceroutine am Pufferende
+02B6 06 00 .. LD B,00 ; (IY+1E)
+02B8 FD E5 .. PUSH IY
+02BA E1 . POP HL
+02BB 09 . ADD HL,BC
+02BC 06 04 .. LD B,04 ; 4 Interrupt (Vector+Status)
+02BE EB . EX DE,HL ; DE= Serviceroutinenaddresse
+02BF 73 s LD (HL),E ; HL = Interruptvektoraddresse
+02C0 23 # INC HL ; Serviceroutine eintragen
+02C1 72 r LD (HL),D
+02C2 23 # INC HL ; Fuer alle 4 Interrupts einen
+02C3 13 . INC DE ; Interrupthandler
+02C4 13 . INC DE
+02C5 13 . INC DE
+02C6 10 F7 .. DJNZ 02BF
+02C8 C9 . RET ;-------- Inittabelle Serielle -----
+02C9 14 44 ; reset ext status IRQs, Clock x16, 1 Stopbit,noparity
+02CB 03 61 ; Rx 7 Bits, Autoenables (CTS), Receiver enable
+02CD 05 EA ; Tx 8 Bits, DTR = 1, RTS = 1, Transmitter enable
+02CF 11 1F ; kein WAIT/RDY, Vektor incl. Status, alle IRQs an
+02D1 03 C1 ; Rx 8 Bits, Keine Autoenables, Receiver enable
+02D3 11 1F ; s.o.
+02D5 02 ; Interruptvektor folgt als naechstes Byte
+02D6 FD 4E 1A .N. LD C,(IY+1A) ;------"IOCONTROL portinfo -3"------
+02D9 06 01 .. LD B,01 ; ^ Status/Commandport
+02DB 3E 30 >0 LD A,30
+02DD F3 . DI
+02DE ED 41 .A OUT (C),B ; Read-Register 1 waehlen
+02E0 ED 40 .@ IN B,(C) ; Einlesen
+02E2 ED 79 .y OUT (C),A ; Error Reset = 30H
+02E4 ED 78 .x IN A,(C) ; Statusregister (0) lesen
+02E6 FB . EI
+02E7 E6 AC .. AND AC ; DCD,CTS,... durchlassen
+02E9 4F O LD C,A ; Lowbyte = Read-Register 1 Bits
+02EA 78 x LD A,B ; Highbyte = Read-Register 0 Bits
+02EB E6 70 .p AND 70 ; Nur Error-Bits durchlassen
+02ED DD B6 15 ... OR (IX+15) ; Schon vorhandene Fehler dazu
+02F0 47 G LD B,A
+02F1 C9 . RET ;----------- "baud" --------------
+02F2 01 01 00 ... LD BC,0001 ; Rueckmeldung "nicht moeglich"
+02F5 CB 7C .| BIT 7,H ; Keine Shard-spezifischen Baudrates
+02F7 C0 . RET NZ
+02F8 7C | LD A,H ; Schluessel --> A
+02F9 B7 . OR A
+02FA C8 . RET Z ; 0 ist ungueltiger Schluessel
+02FB FD CB 11 4E ...N BIT 1,(IY+11) ; Baudrateeinstellung moeglich ?
+02FF C8 . RET Z ; nein
+0300 0E 00 .. LD C,00 ; Rueckmeldung "ok"
+0302 CB 45 .E BIT 0,L ; 0 = Lesen, 1 = parameter setzen
+0304 C0 . RET NZ ; Nur Information, dann fertig
+0305 11 80 02 ... LD DE,0280 ; Tabelle der Baudrates/Timeconsts
+0308 6C l LD L,H
+0309 CB 25 .% SLA L
+030B 26 00 &. LD H,00 ; Schluessel * 2 + Tabellenanfang
+030D 19 . ADD HL,DE
+030E 7E ~ LD A,(HL) ; Timeconst
+030F E6 C0 .. AND C0 ; Taktvorteiler (1,16,32,64) waehlen
+0311 4F O LD C,A ; fuer SIO/DART-Register 4
+0312 3E 3F >? LD A,3F ; Nur Clock-Bits (6,7) veraendern
+0314 CD 1E 04 ... CALL 041E ; Clock x1, x16
+0317 7E ~ LD A,(HL) ;
+0318 E6 30 .0 AND 30 ; CTC Vorteiler (DIV16,DIV256)
+031A 07 . RLCA
+031B F6 05 .. OR 05 ; Modus = Timer, Kein IRQ, Timeconst
+031D FD 4E 1C .N. LD C,(IY+1C) ; CTC-Port fuer Baudrategenerator
+0320 ED 79 .y OUT (C),A ; An CTC ausgeben
+0322 23 # INC HL
+0323 7E ~ LD A,(HL) ; Timeconst fuer CTC
+0324 ED 79 .y OUT (C),A
+0326 01 00 00 ... LD BC,0000 ; "ok"
+0329 C9 . RET ;-------------- "flow" -------------
+032A CB 7C .| BIT 7,H ; Keine Shard-spezifischen "flow"s
+032C C2 55 06 .U. JP NZ,0655 ; BC = 1 liefern
+032F CB 45 .E BIT 0,L ; NZ, wenn nur Information
+0331 C2 5B 06 .[. JP NZ,065B ; "alles moeglich" melden
+0334 CD 07 06 ... CALL 0607 ; Flowmodebits loeschen
+0337 F3 . DI
+0338 FD CB 11 86 .... RES 0,(IY+11) ; Kein RTS/CTS
+033C FD CB 17 AE .... RES 5,(IY+17) ; Autoenables (CTS) loeschen
+0340 FD 36 12 04 .6.. LD (IY+12),04 ; AND-maske Statusport Tx-Full
+0344 FD 36 13 04 .6.. LD (IY+13),04 ; XOR-maske Statusport Tx-Full
+0348 25 % DEC H ; H=0, oder H>1
+0349 20 03 . JR NZ,034E
+034B CD FE 05 ... CALL 05FE ; H=1 : XON/XOFF setzen
+034E 25 % DEC H
+034F 20 14 . JR NZ,0365 ; H=0 : keine Flusskontrolle
+0351 FD CB 11 C6 .... SET 0,(IY+11) ; H=2 : RTS/CTS
+0355 FD CB 17 EE .... SET 5,(IY+17) ; Autoenables (CTS) moeglich
+0359 FD 36 12 2C .6., LD (IY+12),2C ; TxDfull, CTS on, DCD on
+035D FD 36 13 2C .6., LD (IY+13),2C ; Alle obigen Bits invertieren
+0361 FD 36 14 82 .6.. LD (IY+14),82 ; ?
+0365 FD 7E 17 .~. LD A,(IY+17) ; Writeregister 3
+0368 06 03 .. LD B,03 ; Register 3
+036A FD 4E 1A .N. LD C,(IY+1A) ; Commanndport
+036D ED 41 .A OUT (C),B ; Neuen Autoenableswert ausgeben
+036F ED 79 .y OUT (C),A
+0371 FB . EI
+0372 CD 3C 04 .<. CALL 043C ; ggf. XON/XOFF je nach Status ausg.
+0375 01 00 00 ... LD BC,0000 ; "ok"
+0378 C9 . RET ;----- RTS/DTR o.XON/XOFF set/reset
+0379 CD E9 05 ... CALL 05E9 ; testet BIT 0 (IY0+0)
+037C C4 3C 04 .<. CALL NZ,043C ; ggf XON/XOFF ausgeben
+037F FD CB 11 46 ...F BIT 0,(IY+11) ; NZ, wenn RTS/CTS eingestellt
+0383 C8 . RET Z
+0384 F3 . DI ; RTS/CTS ist eingestellt
+0385 FD 7E 14 .~. LD A,(IY+14) ; Bits, die bei RTS/CTS veraendert
+0388 4F O LD C,A ; werden: RTS/DTR
+0389 FD B6 19 ... OR (IY+19) ; Register 5 Wert
+038C A9 . XOR C ; RTS/DTR ggf loeschen
+038D FD 77 19 .w. LD (IY+19),A ; Wieder zurueckschreiben
+0390 FD 4E 1A .N. LD C,(IY+1A) ; Commandport
+0393 06 05 .. LD B,05 ; Register 5 beschreiben
+0395 ED 41 .A OUT (C),B
+0397 ED 79 .y OUT (C),A ; Neuen Wert laden
+0399 FB . EI
+039A C9 . RET ;-----------------------------------
+039B CD D6 05 ... CALL 05D6 ; Wenn XON/XOFF,
+039E C4 3C 04 .<. CALL NZ,043C ; XON oder XOFF ausgeben
+03A1 F3 . DI
+03A2 FD 7E 14 .~. LD A,(IY+14) ; RTS/DTR ggf. setzen
+03A5 FD B6 19 ... OR (IY+19) ; weiter wie oben
+03A8 18 E3 .. JR 038D ;------------ "bits" --------------
+03AA CB 7C .| BIT 7,H ; Keine Shard-Spezifischen "bits"
+03AC C2 55 06 .U. JP NZ,0655
+03AF CB 45 .E BIT 0,L ; Info: "alles moeglich" melden
+03B1 C2 5B 06 .[. JP NZ,065B
+03B4 7C | LD A,H ; H = stop * 32 + par * 8 + (bit-1)
+03B5 C6 20 . ADD A,20 ; Stopbits + 1 : 1..3, parity
+03B7 1F . RRA ; Bit 0,1 = parity
+03B8 1F . RRA ; Bit 2,3 = stopbits
+03B9 1F . RRA
+03BA E6 0F .. AND 0F ; restregister ausblenden
+03BC CB 4F .O BIT 1,A ;
+03BE 28 02 (. JR Z,03C2 ; Wenn gerader Parity:
+03C0 CB C7 .. SET 0,A ; Parity enablen
+03C2 4F O LD C,A ; C enthaelt OR-Wert fuer Register 4
+03C3 3E F0 >. LD A,F0 ; Nur Stopbits und Parity veraendern
+03C5 CD 1E 04 ... CALL 041E ; SIO-Register 4 veraendern
+03C8 7C | LD A,H ; Datenbits ausblenden
+03C9 E6 07 .. AND 07
+03CB 47 G LD B,A ; + 1 = Anzahl Datenbits
+03CC 04 . INC B
+03CD 3E 00 >. LD A,00
+03CF 16 F8 .. LD D,F8 ; 11111000
+03D1 37 7 SCF ; Maskenbits "AND" fuer ungueltige
+03D2 17 . RLA ; Datenbits links reinrotieren
+03D3 CB 22 ." SLA D ; Bei weniger als 5 Bits zusaetzl. 1
+03D5 10 FA .. DJNZ 03D1
+03D7 5F _ LD E,A
+03D8 CD 18 06 ... CALL 0618 ; Datenbitsmasken setzen
+03DB 16 00 .. LD D,00 ; Keine Bits invertieren
+03DD CD 1F 06 ... CALL 061F ; Datenbitmasken setzen AND/XOR
+03E0 CD 26 06 .&. CALL 0626
+03E3 06 00 .. LD B,00
+03E5 CB 54 .T BIT 2,H
+03E7 28 0C (. JR Z,03F5 ; 1,2,3,4,5 datenbits : 00
+03E9 CB 44 .D BIT 0,H ; 6 datenbits : 80H
+03EB 28 02 (. JR Z,03EF ; 7 datenbits : 40H
+03ED CB F8 .. SET 7,B ; 8 datenbits : C0H
+03EF CB 4C .L BIT 1,H
+03F1 28 02 (. JR Z,03F5
+03F3 CB F0 .. SET 6,B
+03F5 FD 7E 17 .~. LD A,(IY+17) ; Register 3 Wert
+03F8 E6 3F .? AND 3F ; Bits, die nicht veraendert werden
+03FA B0 . OR B
+03FB FD 77 17 .w. LD (IY+17),A ; Register 3 Wert setzen
+03FE 16 03 .. LD D,03
+0400 FD 4E 1A .N. LD C,(IY+1A) ; Command-Port
+0403 F3 . DI
+0404 ED 51 .Q OUT (C),D ; Register 3 selektieren
+0406 ED 79 .y OUT (C),A ; Neuen Register 3 Wert
+0408 CB 38 .8 SLR B ; Register 5 Bits "tiefer"
+040A FD 7E 19 .~. LD A,(IY+19) ; Alten Registerwert
+040D E6 9F .. AND 9F ; unbenoetigte Bits ausblenden
+040F B0 . OR B
+0410 FD 77 19 .w. LD (IY+19),A ; abspeichern
+0413 16 05 .. LD D,05 ;
+0415 ED 51 .Q OUT (C),D ; Register 5 selektieren
+0417 ED 79 .y OUT (C),A ; Wert in das Register schreiben
+0419 FB . EI
+041A 01 00 00 ... LD BC,0000 ; "ok"
+041D C9 . RET ;---------- Register 4 setzen -----
+041E F3 . DI ; A enthaelt Maske fuer alte Bits
+041F FD A6 18 ... AND (IY+18) ; Register 4 Maske
+0422 B1 . OR C ; Neuer Clock/Parity/Stopbit Wert
+0423 FD 77 18 .w. LD (IY+18),A ; In der Tabelle setzen
+0426 06 04 .. LD B,04 ;
+0428 FD 4E 1A .N. LD C,(IY+1A) ; Am Kommandoport ausgeben
+042B ED 41 .A OUT (C),B ; Register 4 waehlen
+042D ED 79 .y OUT (C),A ; Neuen Wert des Registers setzen
+042F FB . EI
+0430 C9 . RET ; ----------------------------------
+0431 CD CD 04 ... CALL 04CD ; Serieller OUTPUT:String in Puffer
+0434 F5 . PUSH AF ; schreiben fuer IRQ-Ausgabe
+0435 C5 . PUSH BC
+0436 C4 3C 04 .<. CALL NZ,043C ; NZ, wenn Puffer gefuellt
+0439 C1 . POP BC
+043A F1 . POP AF
+043B C9 . RET ;--------- ggf. XON/XOFF ausgeben--
+043C FD 4E 1A .N. LD C,(IY+1A) ; Statusportaddresse
+043F F3 . DI
+0440 ED 78 .x IN A,(C) ; Statusbyte
+0442 FD A6 12 ... AND (IY+12) ;"Transmitter full"-Bit ausmaskieren
+0445 FD AE 13 ... XOR (IY+13) ; Umdrehen, falls high-Aktiv
+0448 20 0A . JR NZ,0454 ; NZ=Puffer noch voll
+044A CD 45 05 .E. CALL 0545 ; Flusskontrolle pruefen(XON/XOFF-->A
+044D FD 4E 1B .N. LD C,(IY+1B) ; Addresse des Datenports seriell
+0450 28 02 (. JR Z,0454 ; Nichtausgeben, weil Flusskontrolle
+0452 ED 79 .y OUT (C),A ; Zeichen aus Akku ausgeben
+0454 FB . EI
+0455 C9 . RET ;--------Transmitbuffer empty IRQ-
+0456 FD E3 .. EX (SP),IY ; Ruecksprungaddresse -31
+0458 C5 . PUSH BC ; = Anfang der Kanalinfotabelle
+0459 F5 . PUSH AF
+045A 01 DF FF ... LD BC,FFDF ; -31
+045D FD 09 .. ADD IY,BC
+045F FD 4E 1A .N. LD C,(IY+1A) ; Kommandoport des Kanals
+0462 3E 28 >( LD A,28 ; reset interrupt pending
+0464 ED 79 .y OUT (C),A ; Kommando ausgeben
+0466 CD 3F 04 .?. CALL 043F ; Flusskontrolle durchfuehren
+0469 18 48 .H JR 04B3 ; Interruptende
+046B FD E3 .. EX (SP),IY ;------- External/Status Change IRQ
+046D C5 . PUSH BC
+046E F5 . PUSH AF
+046F 01 DC FF ... LD BC,FFDC ; IY := Kanaltabelleninfo
+0472 FD 09 .. ADD IY,BC
+0474 FD 4E 1A .N. LD C,(IY+1A) ; Statusportaddresse
+0477 ED 78 .x IN A,(C) ; Status einlesen
+0479 06 10 .. LD B,10 ; reset Ext/Status Interrupts
+047B ED 41 .A OUT (C),B
+047D FC D1 05 ... CALL M,05D1 ; break empfangen : bit 7 = 1
+0480 CD 3C 04 .<. CALL 043C ; Flusskontrolle durchfuehren
+0483 18 2E .. JR 04B3 ; interrupt ende
+0485 FD E3 .. EX (SP),IY ;--------special receive cond. IRQ
+0487 C5 . PUSH BC
+0488 F5 . PUSH AF
+0489 01 D6 FF ... LD BC,FFD6 ; IY := Kanaltabelleninfo
+048C FD 09 .. ADD IY,BC
+048E FD 4E 1A .N. LD C,(IY+1A) ; Status- u. Kommandoport
+0491 3E 01 >. LD A,01 ; Read-Register 1
+0493 06 30 .0 LD B,30
+0495 ED 79 .y OUT (C),A ; Reg.selekt
+0497 ED 78 .x IN A,(C) ; Status einlesen
+0499 ED 41 .A OUT (C),B ; Error-reset
+049B 47 G LD B,A
+049C FD B6 15 ... OR (IY+15)
+049F FD 77 15 .w. LD (IY+15),A ; Fehler vermerken
+04A2 78 x LD A,B
+04A3 FD A6 16 ... AND (IY+16) ; Zulaessige Fehler maskieren
+04A6 28 1B (. JR Z,04C3 ; keine Fehler, normale Eingabe
+04A8 FD 4E 1B .N. LD C,(IY+1B) ; Zeichen vom Datenport einlesen
+04AB ED 78 .x IN A,(C)
+04AD CD C9 05 ... CALL 05C9 ; Zeichen per Inputinterrupt melden
+04B0 CC 3C 04 .<. CALL Z,043C ; Flusskontrolle durchfuehren
+04B3 F1 . POP AF
+04B4 C1 . POP BC
+04B5 FD E1 .. POP IY
+04B7 FB . EI
+04B8 ED 4D .M RETI ;-------Receive Character avil. IRQ
+04BA FD E3 .. EX (SP),IY
+04BC C5 . PUSH BC
+04BD F5 . PUSH AF
+04BE 01 D9 FF ... LD BC,FFD9 ; IY := Pufferanfang
+04C1 FD 09 .. ADD IY,BC
+04C3 FD 4E 1B .N. LD C,(IY+1B) ; Datenport
+04C6 ED 78 .x IN A,(C) ; Zeichen einlesen
+04C8 CD A9 05 ... CALL 05A9 ; Zeichen per inputinterrupt melden
+04CB 18 E3 .. JR 04B0 ; Interrupt mit Flusskontroller ende
+04CD 78 x LD A,B ;--------String in Puffer schreiben
+04CE B1 . OR C ; Nichts Auszugeben --> SCF RET
+04CF 37 7 SCF
+04D0 C8 . RET Z
+04D1 C5 . PUSH BC ; String (HL/BC) in Puffer schreiben
+04D2 FD 7E 02 .~. LD A,(IY+02) ; IY - Kanaldescriptor
+04D5 FD 96 03 ... SUB (IY+03) ; Puffergroesse - Pufferzeigerwrite
+04D8 28 51 (Q JR Z,052B ; puffer ist voll
+04DA C5 . PUSH BC
+04DB 5F _ LD E,A ; freier Platz
+04DC 78 x LD A,B ; Highbyte > 0 ? Laenge
+04DD B7 . OR A
+04DE 28 02 (. JR Z,04E2
+04E0 0E FF .. LD C,FF ; Mehr als 255 Bytes Laenge
+04E2 7B { LD A,E ;
+04E3 B9 . CP C
+04E4 30 01 0. JR NC,04E7 ; Nicht genuegend Platz ?
+04E6 4F O LD C,A
+04E7 FD 7E 02 .~. LD A,(IY+02) ; Puffergroesse- Pufferreadzeiger
+04EA FD 96 04 ... SUB (IY+04)
+04ED 20 05 . JR NZ,04F4 ; Noch Platz
+04EF FD 36 04 00 .6.. LD (IY+04),00 ; Lesezeiger auf Anfang
+04F3 79 y LD A,C
+04F4 B9 . CP C
+04F5 30 01 0. JR NC,04F8
+04F7 4F O LD C,A
+04F8 06 00 .. LD B,00
+04FA C5 . PUSH BC
+04FB FD 56 07 .V. LD D,(IY+07) ; Pufferanfang + Pufferzeiger
+04FE FD 7E 06 .~. LD A,(IY+06)
+0501 FD 86 04 ... ADD (IY+04)
+0504 30 01 0. JR NC,0507
+0506 14 . INC D ; --> DE bringen
+0507 5F _ LD E,A ; und String von HL --> DE bringen
+0508 ED B0 .. LDIR
+050A C1 . POP BC
+050B FD 7E 04 .~. LD A,(IY+04)
+050E 81 . ADD C ; Pufferzeiger erhoehen
+050F FD 77 04 .w. LD (IY+04),A
+0512 F3 . DI
+0513 FD 7E 03 .~. LD A,(IY+03) ; Pufferzeigerwrite erhoehen
+0516 81 . ADD C ; darf kein IRQ auftreten
+0517 FD 77 03 .w. LD (IY+03),A
+051A FB . EI
+051B E3 . EX (SP),HL ; Stringlaenge (auf Stack) --> HL
+051C B7 . OR A
+051D ED 42 .B SBC HL,BC ; Reststringlaenge
+051F 44 D LD B,H
+0520 4D M LD C,L
+0521 E1 . POP HL
+0522 20 AE . JR NZ,04D2 ; Reststring ggf. ausgeben
+0524 C1 . POP BC ; Alle Zeichen uebernommen
+0525 37 7 SCF
+0526 FD CB 01 46 ...F BIT 0,(IY+01)
+052A C9 . RET ;----------------------------------
+052B E1 . POP HL
+052C B7 . OR A
+052D ED 42 .B SBC HL,BC
+052F 44 D LD B,H
+0530 4D M LD C,L
+0531 FD CB 01 46 ...F BIT 0,(IY+01)
+0535 C9 . RET ;----------- "frout" --------------
+0536 F3 . DI ; keine zeichen annehmen
+0537 FD 7E 02 .~. LD A,(IY+02) ; Puffergroesse - Pufferzeigerwrite
+053A 47 G LD B,A ; Pufferzeiger Write = anzahl Z.
+053B FD 96 03 ... SUB (IY+03)
+053E FB . EI
+053F B8 . CP B ; SCF, wenn Puffer leer
+0540 3F ? CCF
+0541 06 00 .. LD B,00
+0543 4F O LD C,A
+0544 C9 . RET ;----------------------------------
+0545 FD CB 01 66 ...f BIT 4,(IY+01) ; Flusskontrolle ?
+0549 20 37 7 JR NZ,0582 ; ja
+054B FD CB 01 4E ...N BIT 1,(IY+01)
+054F C8 . RET Z
+0550 FD CB 01 C6 .... SET 0,(IY+01) ; Zeichen aus Puffer lesen (IY+05)
+0554 FD 7E 03 .~. LD A,(IY+03)
+0557 B7 . OR A ; Writezeiger am Anfang (leer)
+0558 C8 . RET Z ; Zurueck
+0559 FD CB 01 86 .... RES 0,(IY+01)
+055D FD 35 .5 DEC (IY+03) ; Writezeiger DEC 1
+055F 03 . INC BC
+0560 FD 46 07 .F. LD B,(IY+07) ; Pufferanfang High
+0563 FD 7E 05 .~. LD A,(IY+05)
+0566 FD BE 02 ... CP (IY+02)
+0569 20 02 . JR NZ,056D
+056B 3E 00 >. LD A,00
+056D 3C < INC A
+056E FD 77 05 .w. LD (IY+05),A
+0571 3D = DEC A
+0572 FD 86 06 ... ADD (IY+06) ; Pufferanfang low
+0575 30 01 0. JR NC,0578
+0577 04 . INC B ; BC = Pufferzeiger
+0578 4F O LD C,A
+0579 0A . LD A,(BC) ; Zeichen aus Puffer (zeiger)
+057A FD A6 0C ... AND (IY+0C) ; Bit 8 ggf ausblenden
+057D FD AE 0D ... XOR (IY+0D) ;
+0580 04 . INC B
+0581 C9 . RET ; Flusskontrolle
+0582 FD CB 01 A6 .... RES 4,(IY+01)
+0586 FD CB 01 6E ...n BIT 5,(IY+01) ; XON oder XOFF ?
+058A 28 08 (. JR Z,0594
+058C FD CB 01 AE .... RES 5,(IY+01)
+0590 FD 7E 10 .~. LD A,(IY+10) ; XON (CTRL-Q) stattdessen ausgeben
+0593 C9 . RET ;-----------------------------------
+0594 F6 01 .. OR 01
+0596 FD 7E 0F .~. LD A,(IY+0F) ; XOFF stattdessen ausgeben
+0599 C9 . RET ;----------------------------------
+059A FD CB 01 4E ...N BIT 1,(IY+01) ; XON empfangen
+059E FD CB 01 CE .... SET 1,(IY+01)
+05A2 C9 . RET ;---------------------------------
+05A3 FD CB 01 8E .... RES 1,(IY+01) ; XOFF-empfangen
+05A7 18 1D .. JR 05C6
+05A9 FD A6 08 ... AND (IY+08) ;------- Zeichen per 'inputinterrupt'
+05AC FD AE 09 ... XOR (IY+09) ; masken fuer fehlerfreien receive
+05AF FD CB 01 56 ...V BIT 2,(IY+01) ; XON/XOFF ?
+05B3 28 0A (. JR Z,05BF
+05B5 FD BE 10 ... CP (IY+10) ; XON-Zeichen ?
+05B8 28 E0 (. JR Z,059A
+05BA FD BE 0F ... CP (IY+0F) ; XOFF-Zeichen ?
+05BD 28 E4 (. JR Z,05A3
+05BF 47 G LD B,A ; Zeichen in B verlangt
+05C0 FD 7E 00 .~. LD A,(IY+00) ; Kanalnummer
+05C3 CD 13 1E ... CALL 1E13 ; Inputinterrupt aufrufen
+05C6 F6 01 .. OR 01
+05C8 C9 . RET ;-------- fehlerhafter receive
+05C9 FD A6 0A ... AND (IY+0A) ; masken fuer fehlerhaften receive
+05CC FD AE 0B ... XOR (IY+0B)
+05CF 18 DE .. JR 05AF ; weiter wie normal
+05D1 FD 7E 0E .~. LD A,(IY+0E) ;--------- fehlerhafter receive ----
+05D4 18 D9 .. JR 05AF ; '?' ausgeben
+05D6 F3 . DI ;----------------------------------
+05D7 FD 7E 01 .~. LD A,(IY+01)
+05DA CB 5F ._ BIT 3,A
+05DC 28 09 (. JR Z,05E7
+05DE F6 30 .0 OR 30 ; Bit 4 + 5 setzen (XON/XOFF)
+05E0 FD 77 01 .w. LD (IY+01),A
+05E3 FD CB 01 46 ...F BIT 0,(IY+01)
+05E7 FB . EI
+05E8 C9 . RET ;----------------------------------
+05E9 F3 . DI ; von RTS/DTR - XON/XOFF Routine
+05EA FD 7E 01 .~. LD A,(IY+01) ; aufgerufen
+05ED CB 5F ._ BIT 3,A
+05EF 28 0B (. JR Z,05FC ; Unbekannte Flusskontrolle
+05F1 F6 10 .. OR 10
+05F3 E6 DF .. AND DF
+05F5 FD 77 01 .w. LD (IY+01),A
+05F8 FD CB 01 46 ...F BIT 0,(IY+01)
+05FC FB . EI
+05FD C9 . RET ;----------- XON/XOFF setzen --------
+05FE FD CB 01 DE .... SET 3,(IY+01)
+0602 FD CB 01 D6 .... SET 2,(IY+01)
+0606 C9 . RET ;--------- IO-Stop d. Flow loeschen
+0607 FD CB 01 9E .... RES 3,(IY+01) ; XON/XOFF loeschen
+060B FD CB 01 96 .... RES 2,(IY+01)
+060F FD CB 01 4E ...N BIT 1,(IY+01) ; XON Modus ?
+0613 FD CB 01 CE .... SET 1,(IY+01) ; XON-setzen
+0617 C9 . RET ;--------- Datenbitmasken ---------
+0618 FD 73 0C .s. LD (IY+0C),E ; AND-maske fuer Datenbits setzen
+061B FD 72 0D .r. LD (IY+0D),D ; Bei weniger als 5 Bits links 1er
+061E C9 . RET ;--------- Datenbitmasken setzen--
+061F FD 73 08 .s. LD (IY+08),E ; AND fuer fehlerfreien reiceive
+0622 FD 72 09 .r. LD (IY+09),D ; XOR
+0625 C9 . RET ;--------- Datenbitmasken setzen
+0626 FD 73 0A .s. LD (IY+0A),E ; AND fuer fehlerhaften receive
+0629 FD 72 0B .r. LD (IY+0B),D ; XOR
+062C C9 . RET ;-----------------------------------
+;======================== Illegaler Kanal =================================
+062D 01 5F 06 ; 1, IOCONTROL "typ"
+0630 02 50 06 ; 2, IOCONTROL "frout"
+0633 05 46 06 ; 5, IOCONTROL "size"
+0636 FF 4C 06 ; -1, IOCONTROL ill.
+0639 FF 55 06 ; -1, Aufg. 5 Nicht moeglich
+063C FF 4C 06 ; -1, BLOCKIN/BLOCKOUT nicht moegl.
+063F 59 06 ; Illegaler Kanal : OUTPUT 0659
+0641 FD ; BLOCKIN : 063C
+0642 FD ; BLOCKOUT : 063C
+0643 EE ; IOCONTROL : 062D
+0644 FA ; Aufg. 5 : 0636
+0645 00 ; Keine I/O moeglich
+0646 3E 00 >. LD A,00 ; ---------- "size" --------------
+0648 01 00 00 ... LD BC,0000 ; Null Bloecke
+064B C9 . RET ;----------- "illegal" -1 ---------
+064C 01 FF FF ... LD BC,FFFF ; Kann nicht ausgefuehrt werden
+064F C9 . RET ;------------ "frout" -------------
+0650 01 C8 00 ... LD BC,00C8 ; kann 200 zeichen uebernehmen
+0653 37 7 SCF ; Puffer leer
+0654 C9 . RET ;---------- "nicht moegl" ----------
+0655 01 01 00 ... LD BC,0001 ; Liefert 1
+0658 C9 . RET ;---------- "OUTPUT" --------------
+0659 37 7 SCF ; Alle Zeichen uebernommen
+065A C9 . RET ;------------- "ok" ----------------
+065B 01 00 00 ... LD BC,0000
+065E C9 . RET ; -------- "typ" ------------------
+065F 06 00 .. LD B,00 ; Type aus Parameterblock d. Kanals
+0661 DD 4E 06 .N. LD C,(IX+06)
+0664 C9 . RET ;----------------------------------
+;=========================== Floppykanal ==================================
+0665 05 95 06 ; 5, IOCONTROL "size"
+0668 01 5F 06 ; 1, IOCONTROL "typ"
+066B FF 4C 06 ; -1, IOCONTROL ill.
+066E FE 85 06 ; -2, Aufg. 5 : Kanal init
+0671 FF 55 06 ; -1, Aufg. 5 : Geht nicht
+0674 00 9D 06 ; 0, BLOCKIN : 069D
+0677 00 99 06 ; 0, BLOCKOUT : 0699
+067A FF 4C 06 ; -1, BLOCKOUT ill.
+067D 59 06 ; Floppy: OUTPUT 0659
+067F F7 ; BLOCKIN : 0674
+0680 FA ; BLOCKOUT : 0677
+0681 E8 ; IOCONTROL : 0665
+0682 F1 ; Aufg. 5 : 066E
+0683 0C ; Typ : BLOCKIO ohne format
+0684 04
+0685 3E 70 >p LD A,70 ; ----------- Floppyinit -----------
+0687 D3 0A .. OUT (0A),A ; Interruptvektor PIOA Floppy = $70
+0689 11 58 09 .X. LD DE,0958 ; Interruptroutine FDC
+068C ED 57 .W LD A,I ; In die Interruptvektortabelle
+068E 67 g LD H,A ; eintragen
+068F 2E 70 .p LD L,70
+0691 73 s LD (HL),E
+0692 23 # INC HL
+0693 72 r LD (HL),D
+0694 C9 . RET ;------------ "size" ---------------
+0695 01 D0 04 ... LD BC,04D0 ; 1232 Bloecke = 616K
+0698 C9 . RET ;----------- "BLOCKOUT" -----------
+0699 3E 01 >. LD A,01 ; A=1 : Write
+069B 18 01 .. JR 069E ; BLOCKIO
+069D AF . XOR A ;------------ "BLOCKIN" ----------
+069E E5 . PUSH HL ; Hauptspeicheraddresse
+069F 21 CF 04 !.. LD HL,04CF ; Mit Max. Blocknummer
+06A2 B7 . OR A
+06A3 ED 52 .R SBC HL,DE
+06A5 E1 . POP HL
+06A6 DA C9 0B ... JP C,0BC9 ; Block zu hoch = 3
+06A9 E5 . PUSH HL
+06AA 21 11 08 !.. LD HL,0811 ; Floppysemaphor reservieren
+06AD CD 47 0C .G. CALL 0C47
+06B0 E1 . POP HL
+06B1 EB . EX DE,HL ; DE = Hauptspeicheraddresse
+06B2 4F O LD C,A ; A= Read/Write,HL = Blocknummer
+06B3 7D } LD A,L
+06B4 E6 0F .. AND 0F ; A = Sektornummer 0..15
+06B6 CB 25 .% SLA L
+06B8 CB 14 .. RL H ; HL = Tracknummer
+06BA CB 25 .% SLA L ; Track = (Blocknr * 16) DIV 256
+06BC CB 14 .. RL H ; = Blocknr DIV 16
+06BE CB 25 .% SLA L
+06C0 CB 14 .. RL H
+06C2 CB 25 .% SLA L
+06C4 CB 14 .. RL H
+06C6 6F o LD L,A ; L = Sektor, H = Track
+06C7 79 y LD A,C ; A = Read/Write
+06C8 B7 . OR A
+06C9 FD 7E 08 .~. LD A,(IY+08)
+06CC 28 05 (. JR Z,06D3 ; Z, wenn Read
+06CE CD CA 09 ... CALL 09CA ; Write Floppy (Interrupt anstossen)
+06D1 18 03 .. JR 06D6 ; Skip
+06D3 CD BE 09 ... CALL 09BE ; Read Floppy (Interrupt anstossen)
+06D6 FD E5 .. PUSH IY
+06D8 CD 19 1E ... CALL 1E19 ; Zur Sicherheit einmal 'warte'
+06DB FD E1 .. POP IY
+06DD FD 7E 05 .~. LD A,(IY+05) ; Return von Floppy-IRQ-Routine
+06E0 3C < INC A
+06E1 28 F3 (. JR Z,06D6 ; FF = Busy, IRQ noch nicht beendet
+06E3 21 11 08 !.. LD HL,0811 ; Semaphor wieder freigeben
+06E6 CD 61 0C .a. CALL 0C61
+06E9 3D = DEC A ; Muss = 0 sein, sonst fehler
+06EA C2 AE 0B ... JP NZ,0BAE ; Fehler ggf. melden
+06ED 01 00 00 ... LD BC,0000 ; Return: ok
+06F0 C9 . RET ;-----------------------------------
+;========================= Hintergrundkanal (Harddisk) =====================
+06F1 05 34 07 ; 5, IOCONTROL "size"
+06F4 01 5F 06 ; 1, IOCONTROL "typ"
+06F7 FF 4C 06 ; -1, IOCONTROL ill.
+06FA FE 19 07 ; -2, Aufg. 5 : kanal Init
+06FD 9C 3C 07 ; -100, Aufg.5:Anz.HG-Bloecke setzen
+0700 FF 55 06 ; -1, Aufg. 5 : BC = 1
+0703 00 4D 07 ; 0, BLOCKIN
+0706 00 49 07 ; 0, BLOCKOUT
+0709 FF 4C 06 ; -1, BLOCKIO illg.
+070C 59 ; Hintergrund : OUTPUT 0659
+070D 06
+070E F7 ; BLOCKIN : 0703
+070F FA ; BLOCKOUT : 0706
+0710 E5 ; IOCONTROL : 06F1
+0711 EE ; Aufg. 5 : 06FA
+0712 0C ; Typ : BLOCKIN/BLOCKOUT
+0713 00 . NOP
+0714 01 00 00 ... LD BC,0000
+0717 00 . NOP
+0718 FF . RST 38 ;----------"HD-Init" ---------------
+0719 21 DA 0F !.. LD HL,0FDA ; Bei Floppy (0FDA) = 46H
+071C 22 0F 08 ".. LD (080F),HL ; Harddisktransferbufferaddresse
+071F DD 7E 0A .~. LD A,(IX+0A) ; New Cylinder Number
+0722 D3 22 ." OUT (22),A
+0724 3E 70 >p LD A,70 ; Interruptvektor FDC+HDC
+0726 D3 0A .. OUT (0A),A
+0728 11 58 09 .X. LD DE,0958 ; Interruptserviceroutinenaddresse
+072B ED 57 .W LD A,I
+072D 67 g LD H,A
+072E 2E 70 .p LD L,70
+0730 73 s LD (HL),E
+0731 23 # INC HL
+0732 72 r LD (HL),D
+0733 C9 . RET ;------------ "size" ---------------
+0734 FD 4E 01 .N. LD C,(IY+01) ; HG-Maxblock Low
+0737 FD 46 02 .F. LD B,(IY+02) ; High
+073A 03 . INC BC ; +1 = Anzahl Bloecke
+073B C9 . RET ;------ Anzahl-HG-Bloecke setzen ---
+073C FD 75 01 .u. LD (IY+01),L ; Letzter HD-Block
+073F FD 74 02 .t. LD (IY+02),H
+0742 FD 73 03 .s. LD (IY+03),E ; Erster HD-Block
+0745 FD 72 04 .r. LD (IY+04),D
+0748 C9 . RET ;-------- Hintergrund-Write ---------
+0749 3E 01 >. LD A,01 ;
+074B 18 01 .. JR 074E ;--------- Hintergrund-Read --------
+074D AF . XOR A
+074E E5 . PUSH HL ; Blocknummer in DE
+074F FD 6E 01 .n. LD L,(IY+01) ; Anzahl Hintergrundbloecke
+0752 FD 66 02 .f. LD H,(IY+02)
+0755 B7 . OR A
+0756 ED 52 .R SBC HL,DE
+0758 E1 . POP HL
+0759 DA C9 0B ... JP C,0BC9 ; Block zu hoch
+075C E5 . PUSH HL
+075D 21 11 08 !.. LD HL,0811 ; Harddisksemaphor reservieren
+0760 CD 47 0C .G. CALL 0C47
+0763 FD 6E 03 .n. LD L,(IY+03) ; Erster Harddiskblock
+0766 FD 66 04 .f. LD H,(IY+04)
+0769 19 . ADD HL,DE ; + Blocknummer
+076A EB . EX DE,HL
+076B E1 . POP HL ; DE=Blocknummer neu
+076C E5 . PUSH HL ; HL=Hauptspeicherzieladdresse
+076D F5 . PUSH AF ; Wird spaeter als BC gepopt
+076E B7 . OR A
+076F 20 03 . JR NZ,0774 ; NZ=Write
+0771 2A 0F 08 *.. LD HL,(080F) ; Harddiskbufferaddresse
+0774 CD A5 07 ... CALL 07A5 ; HDC fuer Transfer anstossen
+0777 DD E5 .. PUSH IX
+0779 CD 19 1E ... CALL 1E19 ; 'warte' EUMEL0 aufrufen
+077C DD E1 .. POP IX
+077E DD 7E 07 .~. LD A,(IX+07) ; Harddisk ready ?
+0781 3C < INC A ; FF = not ready
+0782 28 F3 (. JR Z,0777 ; weiter warten
+0784 21 11 08 !.. LD HL,0811 ; Semaphor freigeben
+0787 CD 61 0C .a. CALL 0C61
+078A 3D = DEC A ; Fehlercode
+078B C1 . POP BC
+078C E1 . POP HL
+078D C2 AE 0B ... JP NZ,0BAE ; Bei Fehler melden
+0790 78 x LD A,B ; A=1 : Write
+0791 B7 . OR A
+0792 20 0C . JR NZ,07A0 ; Bei Write kein Transfer mehr
+0794 EB . EX DE,HL ; DE = Hauptspeicherzieladdresse
+0795 2A 0F 08 *.. LD HL,(080F) ; Hauptspeicher fuer HD-Transfer
+0798 23 # INC HL ; Vorweg Status etc.
+0799 23 # INC HL
+079A 23 # INC HL
+079B 01 00 02 ... LD BC,0200 ; Vom HD-Buffer --> EUMEL-Block
+079E ED B0 .. LDIR
+07A0 01 00 00 ... LD BC,0000 ; "ok"
+07A3 C9 . RET ;----------------------------------
+07A4 C9 . RET
+07A5 E5 . PUSH HL ;----------- HD-Transfer anstoss. --
+07A6 F5 . PUSH AF ; A=1:Write,0=Read,HL=Mem.Addresse
+07A7 D5 . PUSH DE ; DE=Blocknummer
+07A8 06 00 .. LD B,00 ; Cachesize = 21 max.
+07AA 3A 05 00 :.. LD A,(0005) ; (5) = Cachegroesse
+07AD B7 . OR A
+07AE 28 26 (& JR Z,07D6 ; Nicht in Cache, neu berechnen
+07B0 4F O LD C,A
+07B1 7A z LD A,D ; D = Blocknummer High zum suchen
+07B2 21 05 00 !.. LD HL,0005 ; Tabellenanfang = 6
+07B5 09 . ADD HL,BC ; + Cachegroesse
+07B6 ED B9 .. CPDR ; Blocknummerhigh suchen
+07B8 20 1C . JR NZ,07D6 ; Nicht gefunden, Tabelle durch
+07BA F5 . PUSH AF ; gefunden, test, ob Blocknummerlow
+07BB E5 . PUSH HL ; auch stimmt
+07BC 21 1A 00 !.. LD HL,001A ; Tabellenanfang = 27
+07BF 09 . ADD HL,BC
+07C0 7B { LD A,E ; Blocknummer Low
+07C1 BE . CP (HL)
+07C2 28 07 (. JR Z,07CB ; Ja, Block gefunden in Cache
+07C4 E1 . POP HL
+07C5 F1 . POP AF
+07C6 EA B6 07 ... JP PE,07B6 ; Noch nicht die ganze Tabelle durch
+07C9 18 0B .. JR 07D6 ; Ganz durch, neu berechnen
+07CB E1 . POP HL ; Aus Cache entnehmen
+07CC F1 . POP AF
+07CD 21 44 00 !D. LD HL,0044
+07D0 09 . ADD HL,BC
+07D1 C1 . POP BC
+07D2 EB . EX DE,HL
+07D3 C3 A7 07 ... JP 07A7 ;----------------------------------
+07D6 E1 . POP HL
+07D7 F1 . POP AF
+07D8 D1 . POP DE
+07D9 01 40 04 .@. LD BC,0440 ; 1088 Bloecke subtrahieren
+07DC F5 . PUSH AF ; fuer Cylindernrhigh
+07DD AF . XOR A
+07DE ED 42 .B SBC HL,BC ; 1088 = 17(sektoren)*4(heads)*16
+07E0 3C < INC A
+07E1 30 FB 0. JR NC,07DE ; cylindernrh = blocknr DIV 1088
+07E3 09 . ADD HL,BC
+07E4 3D = DEC A ; restbloecke in HL
+07E5 07 . RLCA ; ins hoeherwertige Nibble bringen
+07E6 07 . RLCA ; (*16)
+07E7 07 . RLCA
+07E8 07 . RLCA
+07E9 F5 . PUSH AF
+07EA 01 44 00 .D. LD BC,0044 ; Cylindernummerlow
+07ED AF . XOR A ; restblocknr DIV 68 = cylindernrl
+07EE ED 42 .B SBC HL,BC
+07F0 3C < INC A
+07F1 30 FB 0. JR NC,07EE
+07F3 09 . ADD HL,BC
+07F4 3D = DEC A
+07F5 67 g LD H,A ; Cylinder = cylinderl*16+cylinderh
+07F6 F1 . POP AF
+07F7 B4 . OR H
+07F8 67 g LD H,A ; H = Cylinder
+07F9 7D } LD A,L ; Head = Blocknr MOD 4
+07FA E6 03 .. AND 03
+07FC 07 . RLCA ; Head ins Highnibble bringen
+07FD 07 . RLCA
+07FE 07 . RLCA
+07FF 07 . RLCA
+0800 CB 3D .= SLR L ; Sektor = restblocknr DIV 4
+0802 CB 3D .= SLR L ; 17. Sektor ist ungenutzt
+0804 4F O LD C,A
+0805 F1 . POP AF
+0806 FE 01 .. CP 01
+0808 79 y LD A,C
+0809 CA 6B 08 .k. JP Z,086B ; Z, wenn Write
+080C C3 5C 08 .\. JP 085C ; Read
+080F 00 . NOP ; HD-Transferpuffer
+0810 00 . NOP
+0811 00 . NOP
+;=============================== Timerinterrupt ===========================
+0812 11 2D 08 .-. LD DE,082D ;-------- Timer Init ----------------
+0815 ED 57 .W LD A,I
+0817 67 g LD H,A
+0818 2E C6 .. LD L,C6 ; HL = 00C6 Interruptserviceroutine
+081A 3E 33 >3 LD A,33 ; Fuer alle Kanaele einen programm.
+081C E6 FC .. AND FC ; C0=0, C2=1, C4=2, C6=3(timer)
+081E 4F O LD C,A
+081F ED 69 .i OUT (C),L ; Interruptvektor setzen
+0821 73 s LD (HL),E ; Addresse der Serviceroutine
+0822 23 # INC HL ; --> (00C6) fuer CTC-Kanal 3
+0823 72 r LD (HL),D
+0824 3E B5 >. LD A,B5 ; IRQ,Timer,DIV256,pos.flanke,kein
+0826 D3 33 .3 OUT (33),A ; externer trigger, timeconst folgt
+0828 3E FA >. LD A,FA ; 250 = Zeitkonstante:
+082A D3 33 .3 OUT (33),A ; Hz=4000000/256/250=62.5 ^ 16ms
+082C C9 . RET ;------ Timer-Service-IRQ ---------
+082D F5 . PUSH AF
+082E 3E 10 >. LD A,10 ; Alle 16ms Interrupt
+0830 CD 16 1E ... CALL 1E16 ; "timerinterrupt"
+0833 3A 5B 08 :[. LD A,(085B)
+0836 3C < INC A
+0837 FE 3E .> CP 3E ; Alle 62 Timerdurchlaeufe ~ 1s
+0839 28 07 (. JR Z,0842
+083B 32 5B 08 2[. LD (085B),A ; Zaehler INCR 1
+083E F1 . POP AF
+083F FB . EI
+0840 ED 4D .M RETI ;-------------IRQ-Ende--------------
+0842 AF . XOR A ; Sekundenzaehler auf 0
+0843 32 5B 08 2[. LD (085B),A
+0846 DD E5 .. PUSH IX
+0848 FD E5 .. PUSH IY
+084A E5 . PUSH HL
+084B D5 . PUSH DE
+084C C5 . PUSH BC
+084D C3 50 08 .P. JP 0850 ; Wird jede Sekunde aufgerufen
+0850 C1 . POP BC
+0851 D1 . POP DE
+0852 E1 . POP HL
+0853 FD E1 .. POP IY
+0855 DD E1 .. POP IX
+0857 F1 . POP AF
+0858 FB . EI
+0859 ED 4D .M RETI ;-----------IRQ-Ende----------------
+085B 00 . NOP ; Sekundenzaehler
+;============================= Harddisk I/O ===============================
+085C 0E 01 .. LD C,01 ;----------- HD-Read-Routine--------
+085E DD 36 09 01 .6.. LD (IX+09),01 ; Read-Kommando fuer HDC
+0862 ED 53 AB 09 .S.. LD (09AB),DE ; Zieladdresse
+0866 11 02 02 ... LD DE,0202 ; 515 Bytes
+0869 18 0D .. JR 0878
+086B 0E 05 .. LD C,05 ;---------- HD-Write-Routine -------
+086D DD 36 09 02 .6.. LD (IX+09),02 ; (09BA) = Track(High),Sektor(Low)
+0871 ED 53 AB 09 .S.. LD (09AB),DE ; Sourceaddresse, 02 = WriteCMD HDC
+0875 11 FF 01 ... LD DE,01FF ; 512 Bytes
+0878 DD 22 BC 09 .".. LD (09BC),IX ; IX retten
+087C ED 53 AD 09 .S.. LD (09AD),DE ; Anzahl Bytes zu uebertragen
+0880 DD 36 0C 05 .6.. LD (IX+0C),05
+0884 22 BA 09 ".. LD (09BA),HL
+0887 DD 36 07 FF .6.. LD (IX+07),FF
+088B 2A BA 09 *.. LD HL,(09BA)
+088E F6 01 .. OR 01 ; HD-Drive 1 auswaehlen
+0890 D3 20 . OUT (20),A ; Head und Drive selektieren
+0892 57 W LD D,A
+0893 79 y LD A,C
+0894 32 B7 09 2.. LD (09B7),A ; Read or Write 01/05
+0897 DB 23 .# IN A,(23) ; Status einlesen
+0899 CB 77 .w BIT 6,A
+089B 28 07 (. JR Z,08A4
+089D 3E 02 >. LD A,02 ; NZ = "write fault"
+089F D3 20 . OUT (20),A ; Drive 2 selektieren
+08A1 7A z LD A,D ; Headnummer setzen
+08A2 D3 20 . OUT (20),A
+08A4 7C | LD A,H ; Cylindernummer
+08A5 DD BE 0A ... CP (IX+0A) ; = Alter Cylinder
+08A8 CA C4 08 ... JP Z,08C4 ; ja, kein neuer Cylinderseek
+08AB DD 7E 0A .~. LD A,(IX+0A) ; alten Cylinder holen --> HDC
+08AE D3 21 .! OUT (21),A ; last significant Bits of CYL
+08B0 AF . XOR A ; most significant Bits of CYL = 0
+08B1 D3 21 .! OUT (21),A
+08B3 7C | LD A,H ; Neue Cylindernummer
+08B4 D3 22 ." OUT (22),A ; ausgeben und
+08B6 DD 77 0A .w. LD (IX+0A),A ; vermerken
+08B9 AF . XOR A ; Most significant Bits = 0
+08BA D3 22 ." OUT (22),A
+08BC 3E 10 >. LD A,10 ; Seek-Kommando an HDC
+08BE CD 5B 09 .[. CALL 095B
+08C1 2A BA 09 *.. LD HL,(09BA) ; Sektornummer
+08C4 7D } LD A,L ; ausgeben
+08C5 D3 21 .! OUT (21),A
+08C7 21 A9 09 !.. LD HL,09A9 ; DMA-Init-Tabelle
+08CA C5 . PUSH BC
+08CB 01 00 11 ... LD BC,1100 ; DMA-Transfer vorbereiten
+08CE ED B3 .. OTIR ; 17 Bytes an DMA-Controller
+08D0 C1 . POP BC
+08D1 DD 7E 09 .~. LD A,(IX+09) ; 01=Read, 02=Write
+08D4 CD 5B 09 .[. CALL 095B ; An HDC-Controller schicken
+08D7 DD 36 0C FF .6.. LD (IX+0C),FF ; Status in A
+08DB 21 40 09 !@. LD HL,0940 ; Fehlernummer (in L) --> IX+07
+08DE E5 . PUSH HL
+08DF 21 58 09 !X. LD HL,0958 ; HD-IRQ-Serviceroutine
+08E2 22 70 00 "p. LD (0070),HL ; in Vektortabelle eintragen
+08E5 2E 00 .. LD L,00
+08E7 E6 5D .] AND 5D ; HD-Status in A
+08E9 CA 46 09 .F. JP Z,0946 ; "ok"
+08EC CB 5F ._ BIT 3,A ; NZ, wenn "Record not found"
+08EE C2 11 09 ... JP NZ,0911 ;
+08F1 CB 67 .g BIT 4,A ; NZ, wenn "CRC error"
+08F3 28 03 (. JR Z,08F8
+08F5 2E 02 .. LD L,02 ; 2 = "crc err"
+08F7 C9 . RET ;-------------------------------
+08F8 CB 57 .W BIT 2,A ; NZ, wenn "bad sector"
+08FA 28 03 (. JR Z,08FF
+08FC 2E 03 .. LD L,03 ; "bad sect"
+08FE C9 . RET ;-------------------------------
+08FF CB 77 .w BIT 6,A ; NZ, wenn "write fault"
+0901 28 0B (. JR Z,090E
+0903 2E 04 .. LD L,04 ; "write fault"
+0905 3E 02 >. LD A,02 ; Drive 2 selektieren
+0907 D3 20 . OUT (20),A
+0909 E6 3F .? AND 3F
+090B D3 20 . OUT (20),A ; Heads 4..15 gibt es nicht
+090D C9 . RET ;-------------------------------
+090E 2E 05 .. LD L,05 ; "write fault"
+0910 C9 . RET ;------------------------------
+0911 2E 07 .. LD L,07 ; "rec not fnd"
+0913 DD 35 .5 DEC (IX+08) ; Noch einmal
+0915 08 . EX AF,AF'
+0916 C0 . RET NZ ; Nach 8 Versuchen:
+0917 E1 . POP HL
+0918 DD 36 0B 07 .6.. LD (IX+0B),07 ; Register fuer Cylinderpos etc.
+091C DD 36 08 08 .6.. LD (IX+08),08
+0920 DD 36 07 FF .6.. LD (IX+07),FF
+0924 DD 36 0C FF .6.. LD (IX+0C),FF
+0928 DD 36 0A 00 .6.. LD (IX+0A),00
+092C 3E 20 > LD A,20 ; Recalibrate Head
+092E CD 5B 09 .[. CALL 095B ; Kommando ausgeben
+0931 DD 7E 0B .~. LD A,(IX+0B)
+0934 DD 77 07 .w. LD (IX+07),A
+0937 21 58 09 !X. LD HL,0958 ; Dummy-IRQ-Vektor (EI, RETI)
+093A 22 70 00 "p. LD (0070),HL
+093D C3 A4 07 ... JP 07A4 ; RET
+0940 DD 75 07 .u. LD (IX+07),L
+0943 C3 A4 07 ... JP 07A4 ; NOP oder RET (i.d.R RET)
+0946 3E BB >. LD A,BB ; Lesemaske setzen
+0948 D3 00 .. OUT (00),A ; DMA-Kommando
+094A 3E 01 >. LD A,01 ; BIT0 = Register 0 wird gelesen
+094C D3 00 .. OUT (00),A ; Register 0 ist Statusregister
+094E DB 00 .. IN A,(00) ; DMA-Status einlesen (Readregister0)
+0950 E6 21 .! AND 21 ; Test, ob DMA laeuft
+0952 EE 01 .. XOR 01 ; Kein Blockende und DMA erhielt BCK
+0954 C8 . RET Z ; DMA- angestossen = 0
+0955 36 06 6. LD (HL),06 ; DMA-failed
+0957 C9 . RET
+0958 FB . EI
+0959 ED 4D .M RETI ;--------- Kommando an HDC --------
+095B E1 . POP HL ; in A
+095C 22 7F 09 ".. LD (097F),HL ; Returnaddresse --> CALL Fehler
+095F 21 68 09 !h. LD HL,0968 ; Interruptserviceroutine
+0962 22 70 00 "p. LD (0070),HL
+0965 D3 23 .# OUT (23),A ; Kommando ausgeben
+0967 C9 . RET ;-------- IRQ-Serviceroutine HDC-----
+0968 F5 . PUSH AF
+0969 DD E5 .. PUSH IX
+096B DD 2A BC 09 .*.. LD IX,(09BC)
+096F E5 . PUSH HL
+0970 DB 08 .. IN A,(08) ; HDC-IRQ ?
+0972 CB 7F .. BIT 7,A
+0974 F5 . PUSH AF
+0975 DB 23 .# IN A,(23) ; Status lesen (wird geloescht)
+0977 67 g LD H,A
+0978 3E 00 >. LD A,00
+097A D3 23 .# OUT (23),A ; Null (quiescent state) Kommando
+097C F1 . POP AF
+097D 7C | LD A,H
+097E C4 67 09 .g. CALL NZ,0967 ; Fehler --> L bringen
+0981 DB 04 .. IN A,(04) ; Drive/Controller Status FDC
+0983 E1 . POP HL
+0984 DD E1 .. POP IX
+0986 F1 . POP AF
+0987 FB . EI
+0988 ED 4D .M RETI ;-----------------------------------
+098A F5 . PUSH AF
+098B E5 . PUSH HL
+098C DD E5 .. PUSH IX
+098E DB 23 .# IN A,(23) ; Status einlesen (dummy)
+0990 DD 2A BC 09 .*.. LD IX,(09BC)
+0994 3E 40 >@ LD A,40 ; Welches Kommando ist das ???!!!
+0996 D3 23 .# OUT (23),A
+0998 DB 04 .. IN A,(04) ; FDC-Status einlesen
+099A DD 36 07 08 .6.. LD (IX+07),08
+099E 21 58 09 !X. LD HL,0958 ; Dummy-IRQ-Vektor
+09A1 22 70 00 "p. LD (0070),HL
+09A4 DD E1 .. POP IX
+09A6 E1 . POP HL
+09A7 F1 . POP AF
+09A8 C9 . RET ; DMA-Initialisierungstabelle -HDC-
+ ;-DMA-Register 6 (Kommandoregister) "RESET"
+09A9 C3 ; Softreset an DMA-Controller
+ ;-DMA-Register 0 (Port A Addressregister)
+09AA 7D ; A --> B uebertragen, BL & Adr folgt
+09AB 00 00 ; Startaddresse Port A
+09AD FF 01 ; Anzahl Bytes -1 (Bytecount)
+ ;-DMA-Register 1 (Port A Modus)
+09AF 14 ; Port A ist Speicher, INCR Adress
+ ;-DMA-Register 2 (Port B Modus)
+09B0 28 ; Port B ist IO-Port, Adr. konstant
+ ;-DMA-Register 4 (Betriebsart & Port B Adr.reg.)
+09B1 A5 ; Blockmodus, IO-Port B folgt
+09B2 21 ; 21 = Data I/O-Port fuer HDC
+ ;-DMA-Register 5 (Pin-Control)
+09B3 8A ; Stop am Blockende,Pin16=-CE,RDYakt1
+ ;-DMA-Register 6 (Kommando) "LOAD"
+09B4 CF ; Adresse & BL aus WR0/WR4 laden
+09B5 01 ; Wegen Maskenfehler: Direction umk.
+09B6 CF ; " Kommando "LOAD"
+09B7 01 ; 01 : B-->A, 05 : A-->B
+09B8 CF ; Kommando : "LOAD"
+09B9 87 ; DMA-Freigabe ------ bis hier
+09BA 00 . NOP ; Bereich fuer IX (retten)
+09BB 00 . NOP
+09BC 00 . NOP ; Sektornummer, 09BD = Tracknummer
+09BD 00 . NOP ;------- Floppy-Read anstoss.------
+;============================= Floppy I/O ==================================
+09BE FD 36 01 9F .6.. LD (IY+01),9F ; AND-Maske fuer FDC-Status-ready
+09C2 0E 01 .. LD C,01 ; DMA-Read-Kommando
+09C4 FD 36 02 88 .6.. LD (IY+02),88 ; FDC-Kommando read
+09C8 18 0A .. JR 09D4
+09CA FD 36 01 FF .6.. LD (IY+01),FF ;------- Floppy-Write anstoss.------
+09CE 0E 05 .. LD C,05 ; AND-Maske fuer FDC-Status-ready
+09D0 FD 36 02 A8 .6.. LD (IY+02),A8 ; ^ DMA-Write-Kommando,FDC-Kommandowrite
+09D4 FD 22 B1 0A .".. LD (0AB1),IY ; IY retten
+09D8 FB . EI
+09D9 E5 . PUSH HL
+09DA 21 C1 0A !.. LD HL,0AC1 ; DMA-Direction-Byte
+09DD 71 q LD (HL),C
+09DE E1 . POP HL
+09DF FD 36 0A 46 .6.F LD (IY+0A),46
+09E3 ED 53 B5 0A .S.. LD (0AB5),DE ; Zieladdresse fuer DMA
+09E7 FD 36 05 FF .6.. LD (IY+05),FF
+09EB CB BF .. RES 7,A
+09ED DD BE 07 ... CP (IX+07)
+09F0 28 1C (. JR Z,0A0E
+09F2 DD 77 07 .w. LD (IX+07),A
+09F5 22 C4 0A ".. LD (0AC4),HL ; track/sektor retten
+09F8 FD 7E 06 .~. LD A,(IY+06)
+09FB D3 05 .. OUT (05),A ; Tracknummer
+09FD D3 07 .. OUT (07),A ; Output to FDC
+09FF 3E 12 >. LD A,12 ; FDC-Kommando
+0A01 CD 76 0A .v. CALL 0A76
+0A04 FD 7E 09 .~. LD A,(IY+09) ; Floppydrive (Headselect)
+0A07 CB C7 .. SET 0,A ; Single Density
+0A09 D3 08 .. OUT (08),A ; Floppy Format + Headselect
+0A0B 2A C4 0A *.. LD HL,(0AC4) ; geretteter Sektor
+0A0E 7D } LD A,L ; Sektornumber
+0A0F D3 06 .. OUT (06),A
+0A11 7C | LD A,H ; Tracknummer
+0A12 FD BE 06 ... CP (IY+06)
+0A15 28 0A (. JR Z,0A21
+0A17 FD 77 06 .w. LD (IY+06),A
+0A1A D3 07 .. OUT (07),A ; Outputdatabyte Track setzen
+0A1C 3E 1A >. LD A,1A ; FDC-Kommando
+0A1E CD 76 0A .v. CALL 0A76
+0A21 DB 08 .. IN A,(08) ; Headloadinput testen
+0A23 CB 4F .O BIT 1,A
+0A25 FD 7E 02 .~. LD A,(IY+02) ; Read/Write-Kommando an FDC
+0A28 20 02 . JR NZ,0A2C ; Head ist auf der Floppy
+0A2A CB D7 .. SET 2,A ; Head muss noch auf Floppy
+0A2C 21 B3 0A !.. LD HL,0AB3 ; DMA-Tabelle
+0A2F 01 00 11 ... LD BC,1100 ; 17 Bytes in DMA schreiben
+0A32 ED B3 .. OTIR
+0A34 CD 76 0A .v. CALL 0A76 ; FDC-Kommando ausgeben (starten)
+0A37 FD 36 0A FF .6.. LD (IY+0A),FF
+0A3B 21 AE 0A !.. LD HL,0AAE
+0A3E 22 70 00 "p. LD (0070),HL
+0A41 DB 04 .. IN A,(04) ; FDC - Status
+0A43 FD A6 01 ... AND (IY+01) ; maske fuer 'fehler'
+0A46 CB 7F .. BIT 7,A
+0A48 20 11 . JR NZ,0A5B ; ist noch busy
+0A4A B7 . OR A ; Irgendwelche Fehler ?
+0A4B 20 05 . JR NZ,0A52
+0A4D FD 36 05 00 .6.. LD (IY+05),00 ; Kein Fehler, "ok"
+0A51 C9 . RET
+0A52 CB 67 .g BIT 4,A ; CRC ?
+0A54 20 0A . JR NZ,0A60
+0A56 FD 36 05 02 .6.. LD (IY+05),02 ; Fehler "crc err"
+0A5A C9 . RET
+0A5B FD 36 05 01 .6.. LD (IY+05),01 ; Fehler 1 : "busy"
+0A5F C9 . RET
+0A60 FD 36 05 FF .6.. LD (IY+05),FF ; Interrupt noch nicht beendet setz.
+0A64 3E 0A >. LD A,0A ; Kommando 10 an FDC
+0A66 CD 76 0A .v. CALL 0A76
+0A69 FD 36 05 02 .6.. LD (IY+05),02 ; Fehler 2 : "crc err"
+0A6D DB 04 .. IN A,(04) ; FDC-Status
+0A6F 21 AE 0A !.. LD HL,0AAE ; Dummy-IRQ Vektor (EI, RETI)
+0A72 22 70 00 "p. LD (0070),HL ; eintragen
+0A75 C9 . RET ;----------FDC Kommandoausgeben----
+0A76 E1 . POP HL ; Returnaddresse = Fehlernr.laden
+0A77 22 A5 0A ".. LD (0AA5),HL
+0A7A 21 96 0A !.. LD HL,0A96
+0A7D 22 70 00 "p. LD (0070),HL ; Floppy IRQ-Vektor setzen
+0A80 D3 04 .. OUT (04),A ; 1797 FDC Command
+0A82 C9 . RET ;----------------------------------
+0A83 F5 . PUSH AF
+0A84 FD 2A B1 0A .*.. LD IY,(0AB1) ; geretteter IY
+0A88 FD 36 05 02 .6.. LD (IY+05),02 ; "crc err"
+0A8C E5 . PUSH HL
+0A8D 21 AE 0A !.. LD HL,0AAE ; Dummy-Interrupt-Vektor
+0A90 22 70 00 "p. LD (0070),HL
+0A93 E1 . POP HL
+0A94 F1 . POP AF
+0A95 C9 . RET ;----- IRQ-Service-Routine ---------
+0A96 FB . EI ;
+0A97 FD E5 .. PUSH IY
+0A99 E5 . PUSH HL
+0A9A C5 . PUSH BC
+0A9B F5 . PUSH AF
+0A9C FD 2A B1 0A .*.. LD IY,(0AB1) ; geretteter IY
+0AA0 DB 08 .. IN A,(08) ; IRQ-Anford.Register
+0AA2 CB 77 .w BIT 6,A ; BIT6=FDC IRQ aufgetreten
+0AA4 C4 82 0A ... CALL NZ,0A82 ; Returnaddresse in CALL-Addresse
+0AA7 DB 23 .# IN A,(23) ; Statusbyte Harddisk loeschen
+0AA9 F1 . POP AF
+0AAA C1 . POP BC
+0AAB E1 . POP HL
+0AAC FD E1 .. POP IY
+0AAE FB . EI
+0AAF ED 4D .M RETI ;-----------------------------------
+0AB1 00 . NOP ; Platz zum retten von IY
+0AB2 00 . NOP ;- DMA-Initialisierung fuer FDC ---
+0AB3 C3 ; Softreset an DMA-Controller
+ ;-DMA-Register 0 (Port A Addressregister)
+0AB4 7D ; A --> B uebertragen, BL & Adr folgt
+0AB5 00 00 ; Startaddresse Port A
+0AB7 FF 01 ; Anzahl Bytes -1 (Bytecount)
+ ;-DMA-Register 1 (Port A Modus)
+0AB9 14 ; Port A ist Speicher, INCR Adress
+ ;-DMA-Register 2 (Port B Modus)
+0ABA 28 ; Port B ist IO-Port, Adr. konstant
+ ;-DMA-Register 4 (Betriebsart & Port B Adr.reg.)
+0ABB 85 ; Einzelbytemodus(!) IO-Port B folgt
+0ABC 07 ; 01 = Data I/O-Port fuer FDC
+ ;-DMA-Register 5 (Pin-Control)
+0ABD 8A ; Stop am Blockende,Pin16=-CE,RDYakt1
+ ;-DMA-Register 6 (Kommando) "LOAD"
+0ABE CF ; Adresse & BL aus WR0/WR4 laden
+0ABF 01 ; Wegen Maskenfehler: Direction umk.
+0AC0 CF ; " Kommando "LOAD"
+0AC1 01 ; 01 : B-->A, 05 : A-->B
+0AC2 CF ; Kommando : "LOAD"
+0AC3 87 ; DMA-Freigabe ------ bis hier
+0AC4 00 00 ;----------------------------------
+;=========================== Parallel Kanaele =============================
+0AC6 01 5F 06 ; 1 IOCONTROL "typ"
+0AC9 02 7B 0B ; 2 IOCONTROL "frout"
+0ACC 05 46 06 ; 5 IOCONTROL "size"
+0ACF FD 07 0B ; -3 IOCONTROL "Printerstat --> BC"
+0AD2 FC FF 0A ; -4 IOCONTROL"code2 --> Printerport"
+0AD5 FB 03 0B ; -5 IOCONTROL"code2 --> Pstatusport"
+0AD8 FF 4C 06 ; -1 IOCONTROL ill.
+0ADB E2 0D 0B ; -30 Aufg. 5, Maske fuer Busy-Status
+0ADE E1 14 0B ; -31 Aufg. 5, Maske fuer Printerstb.
+0AE1 FE F1 0A ; -2 Aufg. 5 = Kanal init
+0AE4 FF 55 06 ; -1, Aufg. 5 --> BC = 1
+0AE7 FF 4C 06 ; -1, BLOCKIN, BLOCKOUT ill.
+0AEA 1E ; Parallel 0B1E = OUTPUT
+0AEB 0B . DEC BC
+0AEC FD . ; BLOCKIN : 0AE7
+0AED FD . ; BLOCKOUT : 0AE7
+0AEE DC ; IOCONTROL : 0AC6
+0AEF F1 ; Aufg. 5 : 0ADB
+0AF0 03 ; Typ : Input/Ouput (Stream)
+0AF1 DB 10 .. IN A,(10) ;-------- Kanal Init ---------------
+0AF3 FD A6 03 ... AND (IY+03) ; Printer selektieren
+0AF6 FD AE 04 ... XOR (IY+04)
+0AF9 FD AE 05 ... XOR (IY+05)
+0AFC D3 10 .. OUT (10),A ; Ausgabe an Printerstatusport
+0AFE C9 . RET ;----------- "IOCONTROL -4" --------
+0AFF 7B { LD A,E ; Printerdata direkt ausgeben
+0B00 D3 11 .. OUT (11),A
+0B02 C9 . RET ;---------- "IOCONTROL -5"- --------
+0B03 7B { LD A,E ; datastrobe, input prime, control
+0B04 D3 10 .. OUT (10),A ; An Statusport (printer) ausgeben
+0B06 C9 . RET ;-------- "IOCONTROL -3" -----------
+0B07 DB 10 .. IN A,(10) ; Liest der Printerstatus ein
+0B09 4F O LD C,A
+0B0A 06 00 .. LD B,00
+0B0C C9 . RET ;----- Aufg. 5, "-14" --------------
+0B0D FD 73 01 .s. LD (IY+01),E ; code2 --> AND/XOR Masken "Busy"
+0B10 FD 72 02 .r. LD (IY+02),D
+0B13 C9 . RET ;----- Aufg. 5, "-15" -------------
+0B14 FD 73 03 .s. LD (IY+03),E ; code2, code3 --> Maske "selekt"
+0B17 FD 72 04 .r. LD (IY+04),D
+0B1A FD 74 05 .t. LD (IY+05),H
+0B1D C9 . RET ;--------- "OUTPUT" ---------------
+0B1E 78 x LD A,B ; Nichts auszugeben ?
+0B1F B1 . OR C
+0B20 37 7 SCF
+0B21 C8 . RET Z
+0B22 C5 . PUSH BC
+0B23 DB 10 .. IN A,(10) ; Status einelsen
+0B25 FD A6 03 ... AND (IY+03) ; Printerselekt.
+0B28 FD AE 04 ... XOR (IY+04)
+0B2B 57 W LD D,A
+0B2C FD AE 05 ... XOR (IY+05)
+0B2F 5F _ LD E,A
+0B30 E5 . PUSH HL
+0B31 09 . ADD HL,BC ; Ende des Textes
+0B32 E3 . EX (SP),HL
+0B33 41 A LD B,C ; Textlaenge Low (Pbuffersize < 256)
+0B34 0E 11 .. LD C,11 ; Dataport = 11H
+0B36 DB 10 .. IN A,(10) ; Printer busy ?
+0B38 FD A6 01 ... AND (IY+01)
+0B3B FD AE 02 ... XOR (IY+02)
+0B3E 20 1B . JR NZ,0B5B ; testen, ob printer da
+0B40 ED A3 .. OUTI ; Ein Zeichen ausgeben
+0B42 7A z LD A,D
+0B43 D3 10 .. OUT (10),A ; Printer Strobe an
+0B45 7B { LD A,E
+0B46 D3 10 .. OUT (10),A ; printer Strobe aus
+0B48 20 EC . JR NZ,0B36 ; Naechstes Zeichen
+0B4A 44 D LD B,H
+0B4B 4D M LD C,L
+0B4C E1 . POP HL
+0B4D E5 . PUSH HL
+0B4E B7 . OR A ; Anzahl Restzeichen --> BC
+0B4F ED 42 .B SBC HL,BC
+0B51 E5 . PUSH HL
+0B52 C5 . PUSH BC
+0B53 E1 . POP HL
+0B54 C1 . POP BC
+0B55 20 DC . JR NZ,0B33 ; Nochmal mit dem rest aufrufen
+0B57 E1 . POP HL
+0B58 C1 . POP BC
+0B59 37 7 SCF ; Alles uebernommen
+0B5A C9 . RET ;----------
+0B5B CD 72 0B .r. CALL 0B72 ; test,. ob printer bereit
+0B5E 28 E0 (. JR Z,0B40
+0B60 CD 72 0B .r. CALL 0B72
+0B63 28 DB (. JR Z,0B40
+0B65 54 T LD D,H
+0B66 5D ] LD E,L
+0B67 E1 . POP HL
+0B68 B7 . OR A
+0B69 ED 52 .R SBC HL,DE
+0B6B EB . EX DE,HL
+0B6C E1 . POP HL
+0B6D ED 52 .R SBC HL,DE ; Nicht alles uebernommen
+0B6F 44 D LD B,H
+0B70 4D M LD C,L
+0B71 C9 . RET ; ----------- "printerstatus" -----
+0B72 DB 10 .. IN A,(10) ; Status einlesen
+0B74 FD A6 01 ... AND (IY+01) ; Maskieren
+0B77 FD AE 02 ... XOR (IY+02) ; Kanal 7..9 selektieren
+0B7A C9 . RET ;-------------- "frout" ------------
+0B7B CD 72 0B .r. CALL 0B72 ; Puffer voll ?
+0B7E CA 50 06 .P. JP Z,0650 ; Nein, kann 200 Zeichen uebernehmen
+0B81 B7 . OR A
+0B82 01 00 00 ... LD BC,0000 ; Druckerpuffer voll --> 0 Zeichen
+0B85 C9 . RET ;--------- Aufg. 5 -2 -------------
+;================== Sonstige Shard-Routinen (Non I/O) =====================
+0B86 C3 12 08 ... JP 0812 ; Init Parameterkanal = Timerinit
+0B89 ED B0 .. LDIR ;------------ "LONGMOVE" -----------
+0B8B C9 . RET ;------------- "LIMIT" -------------
+0B8C 11 FF FF ... LD DE,FFFF ; Geht bis zum RAM-Ende
+0B8F C9 . RET ;------------ "SCHINF" -------------
+0B90 01 00 00 ... LD BC,0000 ; Kein Schattenspeicher vorhanden ?
+0B93 C9 . RET ;------------ "SCHACC" --------------
+0B94 F5 . PUSH AF
+0B95 E5 . PUSH HL
+0B96 CB 2C ., SRA H
+0B98 CB 1D .. RR L
+0B9A 7D } LD A,L
+0B9B CD AD 0B ... CALL 0BAD
+0B9E E1 . POP HL ?
+0B9F 7D } LD A,L
+0BA0 21 00 FC !.. LD HL,FC00
+0BA3 CB 47 .G BIT 0,A
+0BA5 28 03 (. JR Z,0BAA
+0BA7 21 00 FE !.. LD HL,FE00
+0BAA F1 . POP AF
+0BAB C9 . RET
+0BAC C9 . RET ; -----------"SYSEND"--------------
+0BAD C9 . RET ; ----- SHARD-fehler melden ------
+0BAE E1 . POP HL ; Ruecksprungaddresse
+0BAF E3 . EX (SP),HL
+0BB0 21 CD 0B !.. LD HL,0BCD ; Tabellenanfang Fehlernummer + text
+0BB3 16 00 .. LD D,00
+0BB5 4E N LD C,(HL) ; Textnummer aus Tabelle
+0BB6 23 # INC HL
+0BB7 B9 . CP C ; gesucht und gefunden ?
+0BB8 28 09 (. JR Z,0BC3 ; Ja, gefunden. Nummer melden
+0BBA 0C . INC C ; Naechste Fehlernummer
+0BBB 28 06 (. JR Z,0BC3
+0BBD 23 # INC HL
+0BBE 5E ^ LD E,(HL)
+0BBF 23 # INC HL
+0BC0 19 . ADD HL,DE
+0BC1 18 F2 .. JR 0BB5 ; Naechsten nehmen
+0BC3 4E N LD C,(HL) ; Fehlernummer in BC
+0BC4 06 00 .. LD B,00
+0BC6 23 # INC HL
+0BC7 E3 . EX (SP),HL ; Zur Rueckspungaddresse
+0BC8 E9 . JP (HL)
+0BC9 3E 09 >. LD A,09 ; Block zu hoch
+0BCB 18 E1 .. JR 0BAE ; melden ------------------------
+0BCD 01 01 09 ... LD BC,0901 ; #1 : "not ready", Typ 1
+0BD0 6E n LD L,(HL)
+0BD1 6F o LD L,A
+0BD2 74 t LD (HL),H
+0BD3 20 72 r JR NZ,0C47
+0BD5 65 e LD H,L
+0BD6 61 a LD H,C
+0BD7 64 d LD H,H
+0BD8 79 y LD A,C
+0BD9 02 . LD (BC),A ; #2 : "crc err". Typ 2
+0BDA 02 . LD (BC),A
+0BDB 07 . RLCA
+0BDC 63 c LD H,E
+0BDD 72 r LD (HL),D
+0BDE 63 c LD H,E
+0BDF 20 65 e JR NZ,0C46
+0BE1 72 r LD (HL),D
+0BE2 72 r LD (HL),D
+0BE3 03 . INC BC ; #3 : "bad sect". Typ 2
+0BE4 02 . LD (BC),A
+0BE5 08 . EX AF,AF'
+0BE6 62 b LD H,D
+0BE7 61 a LD H,C
+0BE8 64 d LD H,H
+0BE9 20 73 s JR NZ,0C5E
+0BEB 65 e LD H,L
+0BEC 63 c LD H,E
+0BED 74 t LD (HL),H
+0BEE 04 . INC B ; #4 : "write fault". Typ 2
+0BEF 02 . LD (BC),A
+0BF0 0B . DEC BC
+0BF1 77 w LD (HL),A
+0BF2 72 r LD (HL),D
+0BF3 69 i LD L,C
+0BF4 74 t LD (HL),H
+0BF5 65 e LD H,L
+0BF6 20 66 f JR NZ,0C5E
+0BF8 61 a LD H,C
+0BF9 75 u LD (HL),L
+0BFA 6C l LD L,H
+0BFB 74 t LD (HL),H
+0BFC 05 . DEC B ; #5 : "busy". Typ 2
+0BFD 02 . LD (BC),A
+0BFE 04 . INC B
+0BFF 62 b LD H,D
+0C00 75 u LD (HL),L
+0C01 73 s LD (HL),E
+0C02 79 y LD A,C
+0C03 06 02 .. LD B,02 ; #6 : "dma failed". Typ 2
+0C05 0A . LD A,(BC)
+0C06 64 d LD H,H
+0C07 6D m LD L,L
+0C08 61 a LD H,C
+0C09 20 66 f JR NZ,0C71
+0C0B 61 a LD H,C
+0C0C 69 i LD L,C
+0C0D 6C l LD L,H
+0C0E 65 e LD H,L
+0C0F 64 d LD H,H
+0C10 07 . RLCA ; #7 : "rec not fnd". Typ 2
+0C11 02 . LD (BC),A
+0C12 0B . DEC BC
+0C13 72 r LD (HL),D
+0C14 65 e LD H,L
+0C15 63 c LD H,E
+0C16 20 6E n JR NZ,0C86
+0C18 6F o LD L,A
+0C19 74 t LD (HL),H
+0C1A 20 66 f JR NZ,0C82
+0C1C 6E n LD L,(HL)
+0C1D 64 d LD H,H
+0C1E 08 . EX AF,AF' ; #8 : "timeout". Typ 2
+0C1F 02 . LD (BC),A
+0C20 07 . RLCA
+0C21 74 t LD (HL),H
+0C22 69 i LD L,C
+0C23 6D m LD L,L
+0C24 65 e LD H,L
+0C25 6F o LD L,A
+0C26 75 u LD (HL),L
+0C27 74 t LD (HL),H
+0C28 09 . ADD HL,BC ; #9 : "block zu hoch". Typ 3
+0C29 03 . INC BC
+0C2A 0D . DEC C
+0C2B 62 b LD H,D
+0C2C 6C l LD L,H
+0C2D 6F o LD L,A
+0C2E 63 c LD H,E
+0C2F 6B k LD L,E
+0C30 20 7A z JR NZ,0CAC
+0C32 75 u LD (HL),L
+0C33 20 68 h JR NZ,0C9D
+0C35 6F o LD L,A
+0C36 63 c LD H,E
+0C37 68 h LD L,B
+0C38 FF . RST 38 ; #255 : "wrg err code". Typ 1
+0C39 01 0C 77 ..w LD BC,770C
+0C3C 72 r LD (HL),D
+0C3D 67 g LD H,A
+0C3E 20 65 e JR NZ,0CA5
+0C40 72 r LD (HL),D
+0C41 72 r LD (HL),D
+0C42 20 63 c JR NZ,0CA7
+0C44 6F o LD L,A
+0C45 64 d LD H,H
+0C46 65 e LD H,L
+;=============================== Semaphorhandler ===========================
+0C47 35 5 DEC (HL) ; --- Semaphor (HL) testen, warte --
+0C48 34 4 INC (HL)
+0C49 36 01 6. LD (HL),01 ; Semaphor belegen
+0C4B C8 . RET Z ; unbeleget, return
+0C4C E5 . PUSH HL ; Register fuer 'warte' retten
+0C4D DD E5 .. PUSH IX
+0C4F FD E5 .. PUSH IY
+0C51 C5 . PUSH BC
+0C52 D5 . PUSH DE
+0C53 F5 . PUSH AF
+0C54 CD 19 1E ... CALL 1E19 ; "warte" bis Semaphor frei
+0C57 F1 . POP AF
+0C58 D1 . POP DE
+0C59 C1 . POP BC
+0C5A FD E1 .. POP IY
+0C5C DD E1 .. POP IX
+0C5E E1 . POP HL
+0C5F 18 E6 .. JR 0C47 ; Semaphor jetzt frei ?
+0C61 36 00 6. LD (HL),00 ; -------- Sempahor freigeben ------
+0C63 C9 . RET
+;=========================== Kanalpuffer + Kanalstatusbytes ================
+
+;----------------------------- Hintergrund Kanal 0 ------------------------
+0C64 00 ; Hintergrund
+0C65 FF 43 ; letzter EUMEL-Block (8,5MB)
+0C67 00 00 ; erster EUMEL-Block
+
+;----------------------------- Serieller Kanal 1 -------------------------
+0C69 FF ; 100 Bytes Puffer fuer Kanal 1
+ ...
+0CCC FF
+0CCD 01 IY+00 ; Kanal 1
+0CCE 03 01 ; Flusskontrollen Bits
+ BIT 0 :
+ BIT 1 : 0 = XOFF-Status, 1=XON
+ BIT 2 : XON/XOFF bei receive
+ BIT 3 : XON/XOFF bei transmit
+0CCF 64 02 ; Puffergroesse = 100
+0CD0 00 03 ; Pufferzeiger Write
+0CD1 00 04 ; Pufferzeiger Read
+0CD2 00 05 ;
+0CD3 69 0C 06 ; 0C69 = Pufferanfang
+0CD5 7F 08 ; AND-maske f. fehlerfreien receive
+0CD6 00 09 ; Datenbitmaske XOR "
+0CD7 7F 0A ; AND-maske f. fehlerhaften reiceive
+0CD8 00 0B ; Datenbitmaske XOR "
+0CD9 7F 0C ; Maske fuer Read aus Puffer AND
+0CDA 00 0D ; " XOR
+0CDB 3F ? 0E ; Zeichen fuer Fehlerhaften Receive
+0CDC 13 0F ; 19 = Stop (XOFF)
+0CDD 11 10 ; 17 = Weiter (XON)
+0CDE 02 11 ; BIT 1 = 1 : Baudrateeinst. moegl.
+ ; BIT 0 = 1 : RTS/CTS
+0CDF 04 12 ; AND-Maske Test Statusport (TxDfull)
+0CE0 04 13 ; XOR-Maske f. TxDfull (ggf invert.)
+0CE1 00 14 ; DTR/RTS - Bits im Register 5 (82H)
+0CE2 00 15 ; OR-Register fuer V24-Errors
+0CE3 00 16 ; AND-Maske fuer zulaessige Fehler
+0CE4 C1 17 ; Register 3 (Rxbits, Autoenables)
+0CE5 44 18 ; Register 4 (Stopb., Clock, parity)
+0CE6 EA 19 ; Register 5 (Txbits, RTS, DTR)
+0CE7 1D 1A ; Port Kanal 1 Status/Command
+0CE8 1C 1B ; Datenport Kanal 1 : DART Channel A
+0CE9 0C 1C ; BR-Generatorport: CTC1 - Kanal 0
+0CEA 88 1D ; Interruptvektor Kanal 1
+0CEB CD 56 04 CALL 0456 ; Transmitbuffer empty IRQ
+0CEE CD 6B 04 CALL 046B ; External/Status Change IRQ
+0CF1 CD BA 04 CALL 04BA ; Receive Character available IRQ
+0CF4 CD 85 04 CALL 0485 ; Special Receive condition IRQ
+
+;----------------------------- Serieller Kanal 2 --------------------------
+0CF7 FF ; 100 Bytes Puffer Kanal 2
+ ...
+0D5A FF
+0D5B 02 ; Kanal 2
+0D5C 03 ; Flusskontrollenbits
+0D5D 64 ; 100 = Puffergroesse
+0D5E 00 00 00 ; Pufferzeiger
+0D61 F7 0C ; 0CF7 = Pufferanfang Kanal 2
+0D63 7F 00 ; Masken fuer fehlerfreiene Receive
+0D65 7F 00 ; " fehlerhaften Receive
+0D67 7F 00 ; Masken fuer read aus Puffer
+0D69 3F ? ; Zeichen fuer fehlerhaften receive
+0D6A 13 11 ; XOFF/XON Zeichen
+0D6C 02 ; Baudrateeinstellung moeglich
+0D6D 04 04 ; Masken fuer Test Statusport:TxDfull
+0D6F 00 ; DTR/RTS Bits in Register 5
+0D70 00 00 ; Masken fuer zulaessige Fehler
+0D72 C1 44 EA ; Register 3, 4, 5 Werte
+0D75 1F ; Port Kanal 2 Status / Command
+0D76 1E ; Datenport Kanal 2 : DART Channel B
+0D77 0E ; BR-Generatorport: CTC1 - Kanal 1
+0D78 80 ; Interruptvektor Kanal 2
+0D79 CD 56 04 CALL 0456 ; Interruptroutinen
+0D7C CD 6B 04 CALL 046B
+0D7F CD BA 04 CALL 04BA
+0D82 CD 85 04 CALL 0485
+
+;------------------------------ Serieller kanal 3 -------------------------
+0D85 FF ; 100 Byte Datenpuffer (Senden)
+ ...
+0DE8 FF
+0DE9 03 ; Kanal 3
+0DEA 03 ; Flusskontrollenbits
+0DEB 64 ; Puffergroesse
+0DEC 00 00 00 ; Pufferzeiger
+0DEF 85 0D ; Pufferanfang Kanal 3 : 0D85
+0DF1 7F 00 ; Datenbitsmasken s.o
+0DF3 7F 00 ; "
+0DF5 7F 00 ; "
+0DF7 3F ? ; Zeichen bei fehlerhaftem Receive
+0DF8 13 11 ; XOFF/XON Zeichen
+0DFA 02 ; Baudrateeinstellung moeglich
+0DFB 04 04 ; Masken fuer Test Statusport:TxDfull
+0DFD 00 ; DTR/RTS Bits in register 5 (82H)
+0DFE 00 00 ; Masken fuer zulaessige Fehler
+0E00 C1 44 EA ; Register 3, 4, 5 Werte
+0E03 29 ; Port Kanal 3 Status / Command
+0E04 28 ; Datenport Kanal 3 : SIO 1 Channel A
+0E05 32 ; BR-generatorport: CTC2 - Kanal 2
+0E06 98 ; Interruptvektor Kanal 3
+0E07 CD 56 04 CALL 0456 ; Interruptroutinen
+0E0A CD 6B 04 CALL 046B
+0E0D CD BA 04 CALL 04BA
+0E10 CD 85 04 CALL 0485
+
+;--------------------------------- Serieller Kanal 4 -----------------------
+0E13 FF ; 100 Bytes Kanalpuffer
+ ...
+0E76 FF
+0E77 04 ; Kanal 4
+0E78 03 ; Flusskontrollenbits
+0E79 64 ; Puffergroesse
+0E7A 00 00 00 ; Pufferzeiger
+0E7D 13 0E ; Pufferanfang Kanal 4 : 0E13
+0E7F 7F 00 ; Datenbitmasken s.o.
+0E81 7F 00
+0E83 7F 00
+0E85 3F ? ; Zeichen bei fehlerhaften Receive
+0E86 13 11 ; XOFF/XON Zeichen
+0E88 02 ; Baudrateeinstellung moeglich
+0E89 04 04 ; Masken fuer TxDfull Status
+0E8B 00 ; RTS/DTR Bits (82H)
+0E8C 00 00 ; Masken fuer zulaessige Fehler
+0E8E C1 44 EA ; Register 3, 4, 5 Werter
+0E91 2B ; Port Kanal 4 Status/Command
+0E92 2A ; Datenport kanal 4 : SIO 1 Channel B
+0E93 31 ; BR-Generatorport: CTC2 - Kanal 1
+0E94 90 ; Interruptvektor Kanal 4
+0E95 CD 56 04 CALL 0456 ; Interruptroutinen
+0E98 CD 6B 04 CALL 046B
+0E9B CD BA 04 CALL 04BA
+0E9E CD 85 04 CALL 0485
+
+;-------------------------------- Serieller Kanal 5 -----------------------
+0EA1 FF ; 100 Bytes Ausgabepuffer
+ ...
+0F04 FF
+0F05 05 ; Kanal 5
+0F06 03 ; Flusskontrollenbits
+0F07 64 ; Puffergroesse
+0F08 00 00 00 ; Pufferzeiger
+0F0B A1 0E ; Pufferanfang : 0EA1
+0F0D 7F 00 ; Datenbitmasken s.o.
+0F0F 7F 00 ; "
+0F11 7F 00 ; "
+0F13 3F ? ; Zeichen fuer fehlerhaften Receive
+0F14 13 11 ; XOFF/XON Zeichen
+0F16 02 ; Baudrateeinstellung moeglich
+0F17 04 04 ; Maskenbits fuer Status TxDfull
+0F19 00 ; RTS/DTR Bits (82H)
+0F1A 00 00 ; Masken fuer zulaessige fehler
+0F1C C1 44 EA ; Register 3, 4, 5 Werte
+0F1F 2D ; Port Kanal 5 Status / Command
+0F20 2C ; Datenport kanal 5 : SIO 2 Channel A
+0F21 30 ; BR-Generatorport: CTC2 - Kanal 0
+0F22 A8 ; Interruptvektor Kanal 5
+0F23 CD 56 04 CALL 0456 ; Interruptroutinen
+0F26 CD 6B 04 CALL 046B
+0F29 CD BA 04 CALL 04BA
+0F2C CD 85 04 CALL 0485
+
+;--------------------------- Serieller kanal 6 ----------------------------
+0F2F FF ; 100 Bytes ausgabepuffer
+ ...
+0F92 FF
+0F93 06 ; Kanal 6
+0F94 03 ; Flusskontrollenbits
+0F95 64 ; Puffergroesse
+0F96 00 00 00 ; Pufferzeiger
+0F99 2F 0F ; Pufferanfang Kanal 6 : 0F2F
+0F9B 7F 00 ; Datenbitmasken s.o.
+0F9D 7F 00 ; "
+0F9F 7F 00 ; "
+0FA1 3F ? ; Zeichen fuer fehlerhaften Receive
+0FA2 13 11 ; XOFF/XON Zeichen
+0FA4 02 ; Baudrateeinstellung moeglich
+0FA5 04 04 ; Maskenbits Status TxDfull
+0FA7 00 ; RTS/DTR Bits in Register 5
+0FA8 00 00 ; Masken fuer zulaessige Fehler
+0FAA C1 44 EA ; Register 3, 4, 5 Werte
+0FAD 2F ; Port Kanal 6 : Status / Command
+0FAE 2E ; Datenport kanal 6 : SIO 2 Channel B
+0FAF 31 ; BR-Generatorport : CTC2 - Kanal 1
+0FB0 A0 ; Interruptvektor kanal 6
+0FB1 CD 56 04 CALL 0456 ; Interruptroutinen
+0FB4 CD 6B 04 CALL 046B
+0FB7 CD BA 04 CALL 04BA
+0FBA CD 85 04 CALL 0485
+
+;------------------------------- Parallelkanal 7 --------------------------
+0FBD 07 ; Kanal 7
+0FBE 20 ; AND-Maske fuer Printerbusy
+0FBF 00 ; XOR-Maske f. Printer 0 busy
+0FC0 FE ; AND-Maske fuer Printerstrobe
+0FC1 00 ; XOR-Maske1 fuer Printerstrobe an
+0FC2 01 ; XOR-Maske2 fuer Printerstrobe aus
+
+;------------------------------- Parallel Kanal 8 -------------------------
+0FC3 08 ; Kanal 8
+0FC4 40 ; AND-Maske fuer Printerbusy
+0FC5 00 ; XOR-Maske fuer Printer 1 busy
+0FC6 FD ; AND-Maske fuer Printerstrobe
+0FC7 00 ; XOR-Maske1 fuer Printerstrobe an
+0FC8 02 ; XOR-Maske2 fuer Printerstrobe aus
+
+;------------------------------ Parallel kanal 9 --------------------------
+0FC9 09 ; Kanal 9
+0FCA 80 ; AND-Maske f. Printerbusy
+0FCB 00 ; XOR-Maske f. Printer 2 busy
+0FCC FB ; AND-Maske fuer Printerstrobe
+0FCD 00 ; XOR-Maske1 fuer Printerstrobe an
+0FCE 04 ; XOR-maske2 fuer Printerstrobe aus
+
+;----------------------------- Floppy Kanal 31 ----------------------------
+0FCF 1F ; Kanal 31
+0FD0 00 ; IY+00
+0FD1 00 ; IY+01 FDC-AND-Maske Status-ready
+0FD2 00 ; 02 FDC-Kommando Read/Write
+0FD3 00 ; 03
+0FD4 00 ; 04
+0FD5 00 ; 05 : Returncode aus Floppy-IRQ
+0FD6 00 ; 06 : Alter Sektor
+0FD7 00 ; 07
+0FD8 04 ; 08
+0FD9 FF ; 09 Floppydrive (f. Headselect)
+0FDA 00 ; 0A - 46H = "F"
+;============================== SHARD ENDE =================================