From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/shard-z80-altos/6/src/ALTOSSHD.ASM | 1786 +++++++++++++++++++++++++++++ 1 file changed, 1786 insertions(+) create mode 100644 system/shard-z80-altos/6/src/ALTOSSHD.ASM (limited to 'system/shard-z80-altos/6/src') 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 ================================= -- cgit v1.2.3