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 =================================