Kapitel 3: SYSO/SYS Seite 3-1 -------------------------------------------------------------------------------- 3.1 Disassemb1iertes Listing von SYSO/SYS ========================================= ----------------------- RESTART-Vektoren für den BASIC-Interpreter 4000 C3 96 1C JP 1C96 ;RST 08-Vektor 4003 C3 78 1D JP 1D78 ;RST 10-Vektor 4006 C3 90 1C JP 1C90 ;RST 18-Vektor (wird vom DOS mitbenutzt) 4009 C3 D9 25 JP 25D9 ;RST 20-Vektor ---------------------- RESTART--Vektoren für das DOS 400C C3 C2 4B JP 4BC2 ;RST 28-Vektor (/SYS-Files laden) 400F C3 09 46 JP 4609 ;RST 30-Vektor (DEBUG) 4012 C3 F2 45 JP 45F2 ;RST 38-Vektor (Interrupts) ---------------------- DCB’s (Device Control Blocks) Tastatur-DCB 4015 01 ;DCB-Typ a) wenn SYSTEM AJ=N: 4016*E3*03 ;Treiberadresse b) wenn SYSTEM AJ=Y: 4016*16*45 ;Treiberadresse 4018 00 00 00 ;./. 401B 4B 49 ;KI ---------------------- Bildschirm-DCB 40 ID 07 ;DCB-Typ a) wenn SYSTEM AJ=N: 401E*58*04 ;Treiberadresse b) wenn SYSTEM AJ=Y: 40IE*05*45 ;Treiberadresse 4020 00 3C ;Cursoradresse 4022 00 ;Cursor-Status (00: Cursor aus, <>00: Zei < 4023 44 4F ;DO ---------------------- Drucker-DCB 4025 06 ;DCB-Typ 4026 8D 05 ;Treiberadresse 4028 43 ;Zeilen / Seite 4029 00 ;Zei1enzähler 402A 00 ;./. 402B 50 52 ;PR ****************************************************** * Name: DOSRDY * * Funktion: Sprung nach DOS READY (ohne Rückkehr) * * Input: -- * * Verändert: -- * * Output: -- * ****************************************************** Programme, die ohne Fehler beendet werden, sollten mit einem Sprung nach DOSRDY aufhören. Von dort geht es dann folgendermaßen weiter: - Wenn DGS-CALL (4419H) aktiv ist, wird ein RETURN zum Aufrufer von DOS-Call ausgeführt. - Wenn CHAINING aktiv ist, wird der nächste Befehl aus der CHAIN-File gelesen und ausgeführt. - Ansonsten wird DOS-READY oder MINI-DOS-READY angezeigt und der nächste Befehl von der Tastatur geholt und ausgeführt. Kapitel 3: SYS0/SYS Seite 3-2 -------------------------------------------------------------------------------- 402D C3 00 44 JP 4400 ;weiter bei 4400 ****************************************************** * Name: ERRGRO * * Funktion: nach einem Fehler: Sprung nach DOS READY* * Input: -- * * Verändert: -- * * Output: -- * ****************************************************** Programme, die mit einem bereits angezeigten Fehler beendet werden, sollten mit einem Sprung nach ERR0R0 aufhören. Von dort geht es dann genau wie bei D0SRDY (402DH) weiter, ein evtl. CHAINING wird jedoch abgebrochen. 4030 3E 43 LD ;Code für SYS1/SYS 4032 EF RST ;SYS-File laden und starten ------------------ Hilfssprung für UP’s 0013H und 001BH 4033 C3 DB 4A JP 4ADB ;weiter bei 4ADB ------------------ Tastatur-Status 4036 ;für Tastaturzeile 3801 4037 ;für Tastaturzeile 3802 4038 ;für Tastaturzeile 3804 4039 ;für Tastaturzeile 3808 403A ;für Tastaturzeile 3810 403B ;für Tastaturzeile 3820 403C ;für Tastaturzeile 3840 ------------------ 403D ;Zwischenspeicher für Port FF 403E 00 00 ;./.(früher: DOS-Kennung) ------------------ Uhrzeit und Datum 4040 00 ;Zähler für 25-ms-Interrupts 4041 00 ;Uhrzeit: Sekunden 4042 00 ; Minuten 4043 00 ; Stunden 4044 00 ;Datum: Jahr 4045 00 ; Tag (GDOS: Monat) 4046 00 ; Monat (GDOS: Tag) ------------------ 4047 00 52 ;./. 4049 FF FF ;HIMEM (höchste freie RAM-Adresse für das DOS) ------------------ RAM für DEBUG 404B 00 00 ;Adresse 2. Breakpoint 404D 00 ;Inhalt 2. Breakpoint 404E 00 00 ;Adresse 1. Breakpoint 4050 00 ;Inhalt 1. Breakpoint ------------------ 4051 00 00 ; Zeiger auf Benutzer— Routinen (*name) (s. UP USRINS 4461H) ------------------ Hilfsroutine für Interrupt-Service bei 45F2 4053 F5 PUSH AF ;A=(37E0) nach RLCA 4054 07 RLCA ;Bit 6 gesetzt ? 4055 DC EB 47 CALL C,47E8 ;wenn ja: (37EC) lesen 4058 F1 POP AF ;AF zurück 4059 C9 RET ;weiter bei 45FD ------------------ Kapitel 3: SYSO/SYS Seite 3-3 -------------------------------------------------------------------------------- 405A 00 00 00 ;./. ------------------ RAM -für DEBUG 405D,405E ;X-Modus: 1. Adresse 405F,4060 ;X-Modus: 2. Adresse 4061,4062 ;X-Modus: 3. Adresse ****************************************************** * Name: HEXDE * * Funktion: DE hexadezimal nach (HL) ausgeben * * Input: DE: auszugebende 16-Bit-Zahl * * HL: Zeiger auf Bildschirm oder RAM * * Verändert: AF, HL=HL+4 * * Output: -- * ****************************************************** 4063 7A LD A, D ;MSB laden 4064 CD 68 40 CALL 4068 ;und ausgeben 4067 7B LD A,E ;LSB laden ****************************************************** * Name: HEXA * * Funktion: A hexadezimal nach (HL) ausgeben * * Input: A: auszugebende 8 -Bit-Zahl * * HL: Zeiger auf Bildschirm oder RAM * * Verändert: AF, HL=HL+2 * * Output: -- * ****************************************************** 4068 F5 PUSH 4069 0F RRCA 406A 0F RRCA 406B 0F RRCA 406C 0F RRCA 406D CD 71 40 CALL 4070 F1 POP 4071 E6 0F AND 4073 C6 90 ADD 4075 27 DAA 4076 CE 40 ADC 4078 27 DAA 4079 77 LD 407A 23 INC 407B C9 RET ------------------ Tabelle zum Erhöhen der Uhrzeit 407C ;max. 59 Sekunden 407D ;max. 59 Minuten 407E ;max. 23 Stunden 407F ;Ende der Tabelle ------------------ 4080-41FF ;RAM für den BASIC-Interpreter und Stack 4200-42FF ;Sector-Buffer für DOS ------------------ Position der Schreib/Lese-Köpfe 4300 ;Drive 0: aktuelle Track# des Schreib/Lese-Kopfes 4301 ;Drive 1: aktuelle Track# des Schreib/Lese-Kopfes 4302 ;Drive 2: aktuelle Track# des Schreib/Lese-Kopfes 4303 ;Drive 3: aktuelle Track# des Schreib/Lese-Kopfes Kapitel 3: SYSO/SYS Seite 3-4 -------------------------------------------------------------------------------- ------------------ 4304-4307 ;./. ------------------ 4308 00 ;aktuelle Drive# (0-3) 4309 00 ;Bit-Muster -für aktuelles Drive für 37E1 (Drive-Select) ------------------ 430A 11 +0 ;wirklicher DSL "Directory Starting Lump" 430B 23 +1 ;Anzahl Lumps pro Diskette 430C 03 +2 ;TI "Type of Interface" und TSR "Track Stepping Rate" ;Bit 7: gesetzt wenn TI=H ;Bit 6: gesetzt wenn TI=K ;Bit 5: gesetzt wenn TI=M ; TI=A TI=B TI=C TI=D TI=E ;Bit 4: 0 0 1 0 1 ;Bit 3: 0 1 0 1 0 :Bit 2: 1 1 0 0 1 ;Bits 1,0: TSR "Track Stepping Rate" 430D 23 +3 ;TC "Track Count" 430E 0A +4 ;SPT "Sectors pro Track" 430F 02 +5 ;GPL "Grans pro Lump" 4310 00 +6 ;TI "Type of Interface" und TD "Type of Drive" ;(wird nach 37EE geschrieben, siehe Kapitel 1.2.1) ;00: wenn TI=A/C ;80: wenn TI=B/E und TD=A/C/E/G (5.25 Zoll) ;CO: wenn TI=B/E und TD=B/D/F/H (8 Zoll) ;FC: wenn TI=D und TD=A/C (5.25 Zoll und Single Density) ;FD: wenn TI=D und TD=B/D (8 Zoll und Single Density) ;FE: wenn TI=D und TD=E/G (5.25 Zoll und Double Density) ;FF: wenn TI=D und TD=F/H (8 Zoll und Double Density) 4311 00 +7 ;TI "Type of Interface" und TD "Type of Drive" ;Bit 7: 8 Zoll (1) oder 5.25 Zoll (0) ;Bit 6: Diskette doppelseitig (1) oder einseitig ( 0 ) ;Bit 5: ./. ;Bit 4: gesetzt wenn TI=I oder TI=M (Sect# ab 1) ;Bit 3: ./. ;Bit 2: gesetzt wenn TI=L ;Bit l: gesetzt wenn TI=J oder TI=K (Track# ab 1) ;Bit 0: Double (1) oder Single (0) Density ------------------ Hilfssprung für BREAK-Taste a) wenn SYSTEM AG=N oder DOS-Befehl BREAK,N: 4312*C3 B0 45 JP 45B0 ;dorts X0R A, RET b) wenn SYSTEM AG=Y oder DOS-Befehl BREAK,Y: 4312*C9 B0 45 RET ;A unverändert ------------------ 4315 01 ;./. (früher: DEBUG enable / disable) 4316 00 ;./. ------------------ aktuelles /SYS-Modul 4317 00 ;gibt an, welches /SYS-Modul (SYS1 bis SYS29) zuletzt geladen ;wurde und noch verfügbar ist ;00: kein /SYS-Modul verfügbar ;03: SYS1 verfügbar ... IF: SYS29 verfügbar ------------------ 4318-4367 ;Input-Buffer für DOS ------------------ 4368 A5 ;NEWDOS/80 Kennung ------------------ Kapitel 3: SYSO/SYS Seite 3-5 -------------------------------------------------------------------------------- 4369 40 ;Bit 7: DOS-Befehl DEBUG,Y (1) oder DEBUG,N (0) ;Bit 6: ist gesetzt, während GETSYS (4BC9H) oder BASIC-Befehl ; CMD "C" ausgeführt wird, um ’DFG’, ’ 123’, ’JKL’ und ; CHAINING zu sperren ;Bit 5: gesetzt wenn CHAINING aktiv ist ;Bit 4: SYSTEM AG (BREAK-Taste) ;Bit 3: wird von SYS 6 gesetzt, um 7 DFG', ’123’, ’JKL’ und ; CHAINING zu sperren ;Bit 2: SYSTEM AB (RUN-ONLY Modus) ;Bit 1:./. ;Bit 0:./. ------------------ ;Bit 7: gesetzt wenn MINI-DOS aktiv ist ;Bit 6: gesetzt während DOS-CALL (4419H) ;Bit 5: ? (SYS1, 4DF5: SET, 4E3E: RES) ;Bit 4: gesetzt wenn CHAINING unter DOS-CALL ;Bit 3: ./. ;Bit 2: wird von SYS4 bei A=46H gesetzt und bewirkt in SYS1 ; "DOS FATAL ERROR!! KEY ’R ’ FOR RESET" ;Bit 1:./. ;Bit 0:./. ------------------ 436B 00 ;anhand dieses Bytes manipuliert SYS 6 die Funktion ;von CLOSE (4428H) und EXPAND (444BH) ------------------ 436C 00 ;Bit 7: SYSTEM AA (Passworte) ;Bit 6: SYSTEM AB (RUN-ONLY Modus) ;Bit 5: SYSTEM AG (BREAK-Taste) ;Bit 4: SYSTEM AI (KB-Routine von NEWD0S/80) ;Bit 3: ./. ;Bit 2: ./. (frühers SYSTEM AK) ;Bit 1: SYSTEM AR (Passworte bei COPY) ;Bit 0: SYSTEM AS (Kleinbuchstaben bei BASIC) ------------------ 436D 00 ;Bit 7: SYSTEM AT (CHAINING im Record-Mode oder Einzel tasten) ;Bit 6: SYSTEM BC (CHAINING anhalten und abbrechen) ;Bit 5: SYSTEM BE (DOS-Befehl "R") ;Bit 4: SYSTEM BK (DOS-Befehl "WRDIRP") ;Bit 3: SYSTEM BM (Verify Sectors in FORMAT) ;Bit 2: ./. ;Bit 1: ./. ;Bit 0: ./. ------------------ 436E 00 00 ; ./. ------------------ 4370 5A ;SYSTEM AX (höchster ASCII-Code -für Drucker) ------------------ PDRIVE-Parameter -für Drive 0: 4371 11 +0 ;wirklicher DSL "Directory Starting Lump" (wird bei ;Bedarf durch den Wert im BOOT-Sector der betreffenden ;Diskette aktualisiert) 4372 23 +1 ;Anzahl Lumps pro Diskette 4373 03 +2 ;TI "Type of Interface" und TSR "Track Stepping Rate" ;Bit 7: gesetzt wenn TI=H ;Bit 6: gesetzt wenn TI=K ;Bit 5; gesetzt wenn TI=M ; TI=A TI=B TI=C TI=D TI=E ;Bit 4: 0 0 1 0 1 ;Bit 3: 0 1 0 1 0 Kapitel 3: SYSO/SYS Seite 3-6 -------------------------------------------------------------------------------- ;Bit 2: 1 1 0 0 1 ;Bits 1,0: TSR “Track Stepping Rate" 4374 23 +3 ;TC 1 "Track Count" 4375 0A +4 ;SPT "Sectors pro Track" 4376 02 +5 ;GPL "Grans pro Lump" 4377 00 +6 ;TI "Type of Interface" und TD "Type of Drive" ;(wird nach 37EE geschrieben, siehe Kapitel 1.2.1) ;00: wenn TI=A/C ;SO: wenn TI=B/E und TD=A/C/E/G (5.25 Zoll) ;CO* wenn TI=B/E und TD=B/D/F/H (8 Zoll) ;FC: wenn TI=D und TD=A/C (5.25 Zoll und Single Density) ;FDs wenn TI=D und TD=B/D (8 Zoll und Single Density) ;FE: wenn TI*D und TD=E/G (5.25 Zoll und Double Density) ;FF* wenn T1>D und TD=F/H (8 Zoll und Double Density) 4378 00 +7 ;TI "Type of Interface" und TD "Type of Drive" ;Bit 7; 8 Zoll (1) oder 5.25 Zoll (0) ;Bit 6: Diskette doppelseitig (1) oder einseitig (0) ;Bit 5: ./. ;Bit 4: gesetzt wenn TI=I oder TI=M (Sect# ab 1) ;Bit 3: ./. ;Bit 2: gesetzt wenn TI=L ;Bit 1: gesetzt wenn TI=J oder TI=K (Track# ab 1) ;Bit 0: Double (1) oder Single (0) Density 4379 11 +8 ;DDSL "Default Directory Starting Lump" (für FORMAT) 437A 02 +9 ;DDGA "Default Directory Grans Allocation" (für FORMAT) ------------------ PDRIVE-Parameter für Drive 1: (Bedeutung siehe bei Drive 0) 437B FF ;PDRIVE+0 437C 01 ;PDRIVE+1 437D 00 ;PDRIVE+2 437E 01 ;PDRIVE+3 437F 00 ;PDRIVE+4 4380 00 ;PDRIVE+5 4381 00 ;PDRIVE+6 4382 00 ;PDRIVE+7 4383 FF ;PDRIVE+8 4384 00 ;PDRIVE+9 ------------------ PDRIVE-Parameter für Drive 2: (Bedeutung siehe bei Drive 0) 4385 FF ;PDRIVE+0 4386 01 ;PDRIVE+1 4387 00 ;PDRIVE+2 4388 01 ;PDRIVE+3 4389 00 ;PDRIVE+4 438A 00 ;PDRIVE+5 438B 00 ;PDRIVE+6 438C 00 ;PDRIVE+7 438D FF ;PDRIVE+8 438E 00 ;PDRIVE+9 ------------------ PDRIVE-Parameter für Drive 3: (Bedeutung siehe bei Drive 0) 438F FF ;PDRIVE+0 4390 01 ;PDRIVE+1 4391 00 ;PDRIVE+2 4392 01 ;PDRIVE+3 4393 00 ;PDRIVE+4 4394 00 ;PDRIVE+5 4395 00 ;PDRIVE+6 4396 00 ;PDRIVE+7 4397 FF ;PDRIVE+8 Kapitel 3: SYSO/SYS Seite 3-7 -------------------------------------------------------------------------------- 4398 00 ;PDRIVE+9 ------------------ 4399 71 43 ;Zeiger auf den PDRIVE-Block der aktuellen Drive 439B 00 00 ;Zwischenspeicher -für Stackpointer unter MINI-DOS 439D 00 00 ;Zwischenspeicher für Stackpointer unter DOS-CALL 439F 04 ;SYSTEM AL (Anzahl Drives) 43A0 01 ;SYSTEM AN (Drive# für DIR) 43A1 00 ;SYSTEM AO (Drive# für CREATE von neuen Files) 43A2 01 ;SYSTEM BJ (CPU Speed) 43A3 00 ;./. 43A4 01 ;DEBUG: Modus "S" (00) oder Modus "X" (01) 43A5 00 ;CHAINING: Buffer für nächstes Zeichen aus der CHAIN-File 43A6 00 ;./. 43A7 OD OD ;Buffer für DOS-Befehl "R" 43A9,43AA ;höchste Adresse des vorhandenen RAM (HIMEM) 43AB ;hat den Inhalt A5H, sobald NEWD0S/80 initialisiert ist ------------------ Buffer für Uhrzeit und Datum 43AC :Uhrzeit: Sekunden 43AD ; Minuten 43AE ; Stunden 43AF ;Datum: Jahr 43B0 ; Tag (GDOS: Monat) 43B1 ; Monat (GDOS: Tag) ------------------ 1. RCB (Control Block für DOS-Befehl "ROUTE") 43B2 00 00 ;Adresse des DCB, der umgeleitet werden soll 43B4 00 ;dessen DCB-Typ 43B5 FF FF ;Zeiger auf weitere RCB’s 43B7 FC 4C ;Adresse des DCB, auf den umgeleitet werden soll ------------------ 2. RCB (Control Block für DOS-Befehl "ROUTE") 43B9 00 00 ;Adresse des DCB, der umgeleitet werden soll 43BB 00 ;dessen DCB-Typ 43BC FF FF ;Zeiger auf weitere RCB’s 43BE 00 00 ;Adresse des DCB, auf den umgeleitet werden soll ------------------ 3. RCB (Control Block für DOS-Befehl "ROUTE") 43C0 00 00 ;Adresse des DCB, der umgeleitet werden soll 43C2 00 ;dessen DCB-Typ 43C3 FF FF ;Zeiger auf weitere RCB’s 43C5 00 00 ;Adresse des DCB, auf den umgeleitet werden soll ------------------ 4. RCB (Control Block für DOS-Befehl "ROUTE") 43C7 00 00 ;Adresse des DCB, der umgeleitet werden soll 43C9 00 ;dessen DCB-Typ 43CA FF FF ;Zeiger auf weitere RCB’s 43CC 00 00 ;Adresse des DCB, auf den umgeleitet werden soll ------------------ Verkürzter FCB zum Laden von /SYS-Files in UP GETSYS (4BC9H) 43CE 80 +0 ;Bit 7: gesetzt wenn FCB geöffnet ;Bits 6-3: ./. ;Bit 2: muß gelöscht sein wegen Abfrage in SYSO bei 4823H ;Bit 1: gesetzt wenn der FCB nicht zu einer File gehört, ; sondern zu einer ganzen Diskette ;Bit 0: gesetzt wenn die Sectoren dieser File wie ; DIR-Sectoren lesegeschützt geschrieben werden sollen 43CF 28 +1 ;Bit 7: gesetzt wenn Logische Recordlänge (LRL) <> 256D ;Bit 6 : (1) Der EOF-Wert soll nach dem Schreiben nur dann auf ;den NEXT-Wert gesetzt werden, wenn dieser größer Kapitel 3: SYSO/SYS Seite 3-8 -------------------------------------------------------------------------------- ; als der EOF-Wert ist. ; (0) Der EOF-Wert soll nach jedem Schreiben au-f den ; NEXT-Wert gesetzt werden. ;Bit 5: gelöscht wenn der aktuelle Sector im Buffer steht ;Bit 4: gesetzt wenn die Daten im Buffer noch auf Diskette ; geschrieben werden müssen ;Bit 3: gesetzt in NEWD0S/80 Version 2 ;Bits 2-0: Zugriffs-Level (0-7) aufgrund eines Passwortes 43D0 00 +2 ;Bit 7: gesetzt wenn ASE=N (siehe DOS-Befehl ATTRIB) ;Bit 6 : gesetzt wenn ASC=N (siehe DOS-Befehl ATTRIB) ;Bit 5: gesetzt wenn UDF=Y (siehe DOS-Befehl ATTRIB) ;Bits 4-0: ./. 43D1 00 42 +3 ;Adresse des File-Buffers 43D3 00 +5 ;3. Byte des NEXT-Wertes, gibt die relative Position ;innerhalb des aktuellen Sectors an 43D4 00 +6 ;Drive# der File bzw. der Diskette 43D5 FF +7 ;DEC (Directory Entry Code) vom FPDE der File 43D6 00 +8 ;3. Byte des EOF-Wertes, gibt die relative Position ;innerhalb des letzten Sectors an 43D7 00 +9 ;Logische Recordlänge (1-256D) 43D8 00 00 +0A ;2. und 1. Byte des NEXT-Wertes. Die 3 Bytes des NEXT-Wertes ;geben im RBA-Format an, wohin/woher der nächste Record zu ;schreiben/zu lesen ist, wonach der NEXT-Wert jeweils ;entsprechend erhöht wird. 43DA 40 00 +0C ;2. und 1. Byte des EOF-Wertes (End of File). Die 3 Bytes des ;EOF-Wertes geben im RBA-Format die aktuelle Länge der File ;an. 43DC 00 00 +0E ;gibt an, wo der 1. Datenblock dieser File auf Diskette steht ;a) 1. Byte = FF: Es steht kein Datenblock mehr auf Diskette. ;b) 1. Byte = FE: Im 2. Byte steht der DEC (Directory Entry ; Code) für den nächsten FXDE dieser File. ;c) 1. Byte = 00-FDs Gibt die LUMP# an, in der dieser ; Datenblock auf Diskette beginnt. Bits 7-5 des 2. Bytes ; geben dann die Anzahl der GRANS an, die zwischen dem ; Beginn des LUMPS und dem Beginn des Datenblocks liegen ; und Bits 4-0 des 2. Bytes die um 1 verminderte Anzahl der ; GRANS, aus denen dieser Datenblock besteht. 43DE FF FF +10H ;gibt an, wo der 2. Datenblock dieser File auf Diskette steht ; (Bedeutung der Bytes wie beim 1. Datenblock) ------------------ 43E0-43FF FCB für CHAINING ****************************************************** * Name: DOSRDY (Fortsetzung von 402DH) * * Funktion: Sprung nach DOS READY (ohne Rückkehr) * * Input: -- * * Verändert: -- * * Output: -- * ****************************************************** 4400 3E 23 LD A,23 ;Code für SYS1/SYS 4402 EF LD RST 28 ;SYS-File laden und starten ------------------ 4403 00 00 ;Buffer für die Übergabe von Parametern unter ;D0S-CALL (4419H) und für die Startadresse von ;Programmen in LOAD (4430H) Kapitel 3: SYSO/SYS Seite 3-9 -------------------------------------------------------------------------------- ******************************************************* * Name: DOSCMD * * Funktion: DOS-Befehl (HL) ausführen (ohne Rückkehr)* * Input: HL: zeigt auf einen DGS-Befehl, der mit * * ODH abgeschlossen sein muß * * Verändert: -- * * Output: -- * ******************************************************* Der DOS-Befehl, aut den HL zeigt, wird (unter Umwandlung von Kleinbuchsta­ ben in Großbuchstaben) in den Input-Buffer des DOS (4318-4367) übertragen und ausgeführt. Anschließend kehrt DOSCMD jedoch nicht zum Aufrufer zurück sondern springt nach DOSRDY (402DH). ACHTUNG! Vor Aufruf von DOSCMD darf bei 4318H keinesfalls ODH stehen, sonst passiert gar nichts! 4405 3E 63 LD A,63 ;Code für SYS1/SYS 4407 EF RST 28 ;SYS-File laden und starten ---------------------- Test auf Errors 408 C8 RET Z ;wenn kein Error: RET ****************************************************** * Name: DOSERR * * Funktion: Fehlermeldung (A) ausgeben * * Input: A: Fehlercode - Bit 7: Rückkehr (J/N) * * Verändert: F * * Output: -- * ****************************************************** Wenn Bit 7 im A-Register gesetzt ist, wird die entsprechende Fehlermeldung ausgegeben und DOSERR kehrt zum Aufrufer zurück. Wenn Bit 7 im A-Register nicht gesetzt ist, geschieht folgendes: - Wenn CHAINING aktiv ist, wird es abgebrochen. - Wenn DOS-CALL (4419H) aktiv ist, wird der aktuelle DOS-CALL Aufruf beendet, der Fehlercode (A) wird an den Aufrufer von DOS-CALL übergeben und es wird keine Fehlermeldung ausgegeben. - Ansonsten wird die entsprechende Fehlermeldung ausgegeben und es erfolgt ein Sprung nach DOSRDY (402DH). 4409 F5 PUSH AF ;Fehlercode retten 440A 3E 26 LD A,26 ;Code für SYS4/SYS 440C EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: DEBUG * Funktion: DEBUG aufrufen * Input: -- * Verändert: -- * Output: -- ****************************************************** 440D C3 09 46 JP 4609 ;weiter bei 4609 Kapitel 3: SYSO/SYS Seite 3-10 -------------------------------------------------------------------------------- ****************************************************** * Name: NTINS * * Funktion: Benutzer-Interrupt-Routine ein-fügen * * Input: DE: Zeiger auf Kontrol1-Block der * * Benutzer-Interrupt-Routine * * Verändert: AF, BC, DE, HL * * Output: -- * ****************************************************** 4410 3E 65 LD A,65 ;Code für SYS3/SYS 4412 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: INTDEL * * Funktion: Benutzer— Interrupt-Routine löschen * * Input: DE: Zeiger auf Kontrol1-Block der * * Benutzer— Interrupt-Routine * * Verändert: AF, BC, DE, HL * * Output: -- * ****************************************************** 4413 3E 85 LD A,85 ;Code für SYS3/SYS 4415 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: M0T0NX * * Funktion: Drive-Motoren weiterlaufen lassen * * Input: -- * * Verändert: AF * * Output: -- * ****************************************************** Falls die Motoren der Drives noch an sind, dann wird durch erneuten Drive-Select dafür gesorgt, daß die Motoren weiterlaufen. 4416 C3 62 47 JP 4762 ;weiter bei 4762 ****************************************************** * Name: DOSCAL * * Funktion: OS-Befehl (HL) ausführen und zurück * * Input: L: zeigt auf einen DOS-Befehl, der mit * * Verändert: -- * * Output: F: Fehler-Status (siehe Text) * ****************************************************** Der DOS-Befehl, auf den HL zeigt, wird (unter Umwandlung von Kleinbuchsta­ ben in Großbuchstaben) in den Input-Buffer des DOS (4318-4367) übertragen und ausgeführt. Anschließend kehrt DOSCAL zum Aufrufer zurück, wobei im AF-Register folgender Fehler-Status übergeben werden kann: a) C=1 (Carry): Es ist ein Fehler aufgetreten, der bereits angezeigt wurde. b) C=0, Z=0: Es ist ein Fehler aufgetreten, im A-Register befindet sich der Fehlercode. c) C=0, Z=l: Es ist kein Fehler aufgetreten. Wenn mit DOSCAL z. B. ein Benutzer-Programm aufgerufen werden soll, kann zur Übergabe von Parametern der Buffer bei 4403H,4404H benutzt werden. ACHTUNG! Vor Aufruf von DOSCAL darf bei 4318H keinesfalls ODH stehen, sonst passiert gar nichts! Kapitel 3: SYSO/SYS Seite 3-11 -------------------------------------------------------------------------------- 4419 3E C3 LD A,C3 ;Code für SYS1/SYS 441B EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: TFSPEC * * Funktion: Filespec (HL) nach FCB (DE) übertragen * * Input: HL: zeigt auf Filespec * * DE: zeigt auf anzulegenden FCB * * Verändert: BC * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: zeigt auf das Ende des Filespecs * ****************************************************** Wenn es sich bei dem Text, auf den HL zeigt, um einen möglichen Filespec handelt, wird dieser nach DE übertragen. Es werden max. 32D Bytes übertragen. Wenn weniger als 32D Bytes übertragen wurden, wird ein Byte 03H als Ende-Markierung hinzugefügt. Wenn der Filespec (HL) mit 03H oder ODH endet, dann zeigt HL anschließend auf dieses Byte, ansonsten auf das 1. Byte nach dem Byte, welches den Filespec beendet. 441C 3E 83 LD A,83 ;Code für SYS1/SYS 441E EF RST 28 ;SYS-File laden und starten 441F 00 NOP ;./. ****************************************************** * Name: INIT * * Funktion: File offen, ggf. neue File anlegen * * Input: DE: zeigt auf FCB, der Filespec enthält * * HL: zeigt auf zu benutzenden Buffer * * B: gibt Logische Recordlänge an * * Verändert: -- * * Output: F: A=Fehlercode, wenn Z=0 * ****************************************************** 4420 3E 44 LD A, 44 ;Code für SYS2/SYS 4422 EF RST 28 ;SYS-File laden und starten 4423 00 NOP ;./. ****************************************************** * Name: OPEN * * Funktion: File offen, ggf. keine neue File anlegen* * Input: DE: zeigt auf FCB, der Filespec enthält * * HL: zeigt auf zu benutzenden Buffer * * B: gibt Logische Recordlänge an * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z =0 * ****************************************************** 4424 3E 24 LD A, 24 ;Code für SYS2/SYS 4426 EF RST 28 ;SYS-File laden und starten ----------------------- 4427 82 ; Kennung für NEWD0S/80 Version 2 ****************************************************** * Name: CLOSE * * Funktion: File schließen * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Kapitel 3: SYSO/SYS Seite 3-12 -------------------------------------------------------------------------------- 4428 3E 25 LD A, 25 ;Code für SYS3/SYS 442A EF RST 28 ;SYS-File laden und starten RST ----------------------- 442B 0 1 ;Kennung von NEWD0S/80 Version 2 für TRS-80 Model I ****************************************************** * Name: KILL * * Funktion: File löschen * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 442C 3E 45 LD A,45 ;Code für SYS3/SYS 442E EF RST 28 ;SYS-Fi1e laden und starten 442F 00 NOP ;./. ****************************************************** * Name: LOAD * * Funktion: Programm laden * * Input: DE: zeigt auf FCB, der Filespec enthält * * Verändert: BC * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: Startadresse des Programms * * 4403H,4404H: Startadresse des Programms * ****************************************************** Das zu ladende Programm muß im Standard-Format für LOAD-Files auf Diskette stehen. Dieses Format besteht aus mehreren Blocks, die jeweils mit einem Steuer-Code beginnen, der angibt, wieviele Daten folgen und was mit diesen zu geschehen hat: a) Steuer-Code 01H: Es folgen 1 Längen-Byte, eine Adresse (LSB, MSB) und soviele Daten, wie das um 2 verminderte Längen-Byte angibt. Die Daten sind im RAM ab der angegebenen Adresse abzulegen. b) Steuer— Code Ö2H: Es folgen 1 Byte ohne Bedeutung und die Start- adresse (LSB, MSB), bei der das Programm zu starten ist. Damit ist das Ende der File erreicht. c) Steuer-Code 00H oder 03H bis 1FH: Es folgen 1 Längen-Byte und soviele Daten, wie das Längen-Byte angibt. Diese Daten sind nur ein Kommentar und brauchen nirgendwo abgespeichert zu werden. Zum Laden benutzt das DOS seinen eigenen Sector-Buffer (4200H-42FFH). 4430 3E A4 LD A, A4 ;Code für SYS2/SYS 4432 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: RUN * * Funktion: Programm laden + starten (ohne Rückkehr)* * Input: DE: zeigt auf FCB, der Filespec enthält * * Verändert: AF, BC * * Output: --: * ****************************************************** Das Programm muß im Standard-Format für LOAD-Files auf Diskette stehen, siehe bei LOAD (4430H). Wenn das Programm gestartet wird, sind nur AF und BC verändert. Wenn beim Laden ein Fehler auftritt, erfolgt stattdessen ein Sprung nach DOSERR (4409H). Kapitel 3: SYSO/SYS Seite 3-13 -------------------------------------------------------------------------------- 4433 3E C4 LD A,C4 ;Code für SYS2/SYS 4435 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: READ * * Funktion: nächste Sector/Record einer File lesen * * Input: DE: zeigt auf geoeffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * LogischeRecordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4436 C3 FC 49 JP 49FC ;weiter bei 49FC ****************************************************** * Name: WRITE * * Funktion: nächste Sector/Record einer File auf * * Diskette schreiben (ohne Verify) * * Input: DE: zeigt auf geoeffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * LogischeRecordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4439 C3 36 4A JP 4A36 ;weiter bei 4A36 ****************************************************** * Name: VERIFY * * Funktion: nächste Sector/Record einer File auf * * Diskette schreiben, anschließend Verify * * Input: DE: zeigt auf geoeffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * LogischeRecordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 443C C3 32 4A JP 4A32 ;weiter bei 4A32 ****************************************************** * Name: POS0 * * Funktion: NEXT-Feld im FCB auf Beginn der File * * positioneren * * Input: DE: zeigt auf geoeffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 443F C3 4C 4B JP 4B4C ;weiter bei 4BAC Kapitel 3: SYSO/SYS Seite 3-14 -------------------------------------------------------------------------------- ****************************************************** * Name: POSBC * * Funktion: EXT-Feld im FCB aut die in BC ange- * * gebene Logische Record# positionieren * * Input: DE: zeigt auf geöffneten FCB * * BC: gewünschte Logische Record# * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4442 C3 73 4B JP 4B73 ;weiter bei 4B73 ****************************************************** * Name: POSDEC * * Funktion: EXT-Feld im FCB um 1 Logische Record# * * decrementieren (- 1 ) * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4445 C3 62 4B JP 4B62 ;weiter bei 4B62 ****************************************************** * Name: POSEOF * * Funktion: EXT-Feld im FCB auf EOF (End of File) * * positionieren * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4448 C3 54 4B JP 4B54 ;weiter bei 4B54 ****************************************************** * Name: EXPAND * * Funktion: Wenn die File kürzer ist, als das NEXT- * * Feld im FCB angibt, wird die File um * * entsprechend viele GRANS erweitert. * * Input: E: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 444B C3 09 48 JP 4809 ;weiter bei 4809 ****************************************************** * Name: POSRBA * * Funktion: EXT-Feld im FCB so positionieren, wie * * in HL und C im RBA-Format angegeben ist * * Input: DE: zeigt auf geöffneten FCB * * HL: 1. und 2. Byte für NEXT-Feld * * C: 3. Byte für NEXT-Feld * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 444E C3 47 4B JP 4B47 ;weiter bei 4B47 Kapitel 3: SYSO/SYS Seite 3-15 -------------------------------------------------------------------------------- ****************************************************** * Name: PUTEOF * * Funktion: Wenn das EOF-Feld im FCB von dem im FPDE* * abweicht, wird es dort auf Diskette * * geschrieben * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4451 3E C5 LD A,C5 ;Code für SYS3/SYS 4453 EF RST 28 ;SYS-File lesen und starten -------------------- 4454 00 NOP ; ./. 4455 00 NOP ; ./. 4456 00 NOP ; ./. -------------------- Fehlerbehandling 4457 3E 2A LD A,2A ;Fehlercode für "ILLEGAL DOS FUNCTION" 4459 18 AE JR 4409 ;Fehlermeldung ausgeben (DOSERR) ****************************************************** * Name: DRVSEL * * Funktion: Drive (A) auswählen und Motor starten * * Input: A: gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Das gewünschte Laufwerk wird als "actuelles Laufwerk" bei 4308H vermerkt, sein Bit-Munster wird nach 4309H sowie seine PDRIVE-Parameter nach 430AH-4311H übertragen; wen erforderlich, wird auf Double Density oder 8 Zoll Laufwerke ungeschaltet und die Motoren der Drives werden gestartet. 445B C3 76 47 JP 4776 ;weiter bei 4776 ****************************************************** * Name: TSTDSK * * Funktion: Drive (A) auswählen, Motor starten und * * testen, ob Diskette eingelegt * * Input: A: gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Es wird DRVSEL (445BH) aufgerufen und (wenn dabei kein Fehler auftrat) anschließend geprüft, ob sich eine drehende Diskette im Laufwerk befindet. 445E C3 EC 47 JP 47EC ;weiter bei 47EC ****************************************************** * Name: USRINS * * Funktion: Benutzer-Routine (*name) einfügen * * Input: HL: zeigt auf Kontrol-Block der * * Benutzer-Routine * * Verändert: HL, DE, BC * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4461 3E 2B LD A,2B ;Code für SYS9/SYS Kapitel 3: SYSO/SYS Seite 3-16 -------------------------------------------------------------------------------- 4463 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: USRDEL * * Funktion: Benutzer-Routine (*name) löschen * * Input: L: zeigt auf Kontroll-Block der * * Benutzer-Routine * * Verändert: HL, DE, BC * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4464 3E 4B LD A,4B ;Code für SYS9/SYS 4466 EF RST 28 ;SYS-File laden und starten ****************************************************** * Name: TEXTTV * * Funktion: Text (HL) auf Bildschirm ausgeben * * Input: HL: zeigt auf Text, Ende = 03H oder ODH * * Verändert: AF * * Output: -- * ****************************************************** 4467 C3 A6 4B JP 4BA6 ;weiter bei 4BA6 ****************************************************** * Name: TEXTLP * * Funktion: Text (HL) auf Drucker ausgeben * * Input: HL: zeigt auf Text, Ende = 03H oder ODH * * Verändert: AF * * Output: -- * ****************************************************** 446A C3 BC 4B JP 4BBC ;weiter bei 4BBC ****************************************************** * Name: TIME * * Funktion: aktuelle Uhrzeit im Buffer (HL) im * * Format HH:MM:SS ablegen * * Input: HL: zeigt auf 8 -Byte Buffer * * Verändert: HL=HL+8, DE, BC, AF * * Output: -- * ****************************************************** 446D C3 A7 44 JP 44A7 ;weiter bei 44A7 ****************************************************** * Name: DATE * * Funktion: aktuelles Datum im Buffer (HL) im * * Format MM/TT/JJ ablegen * * Input: HL: zeigt auf 8 -Byte Buffer * * Verändert: HL=HL+8, DE, BC, AF * * Output: -- ****************************************************** 4470 C3 C2 44 JP 44C2 ;weiter bei 44C2 Kapitel 3: SYSO/SYS Seite 3-17 -------------------------------------------------------------------------------- ****************************************************** * Name: INSEXT * * Funktion: Wenn Filespec (DE) keinen File-Typ * * enthält, wird File-Typ (HL) eingesetzt * * Input: DE: zeigt auf Filespec * * HL: zeigt auf 3-Byte File-Typ * * Verändert: HL, AF * * Output: -- ****************************************************** 4473 3E A3 LD A, A3 ;Code für SYS1/SYS 4475 EF LD RST 28 ;SYS-File laden und starten ----------------------- Unbenutzt (?) 4476 00 NOP 4477 00 NOP 4478 00 NOP 4479 00 NOP 447A 00 NOP 447B 00 NOP 447C 18 D9 JR 4457 447E AF XOR A 447F C9 RET ----------------------- FCB zum Laden und Starten von Benutzer-Programmen (vorbesetzt zum Laden des PDRIVE-Sectors bei 4D3BH) 4480 82 +0 ;Bit 7: gesetzt wenn FCB geöffnet ;Bits 6-3: ./. ;Bit 2: muß gelöscht sein wegen Abfrage in SYSO bei 4823H ;Bit 1: gesetzt wenn der FCB nicht zu einer File gehört, ; sondern zu einer ganzen Diskette ;Bit 0: gesetzt wenn die Sectoren dieser File wie ; DIR-Sectoren lesegeschützt geschrieben werden sollen 4481 20 +1 ;Bit 7: gesetzt wenn Logische Recordlänge (LRL) <> 256D ;Bit 6 : (1) Der EOF-Wert soll nach dem Schreiben nur dann auf ; den NEXT-Wert gesetzt werden, wenn dieser größer ; als der EOF-Wert ist. ; (0) Der EOF-Wert soll nach jedem Schreiben auf den ; NEXT-Wert gesetzt werden. ;Bit 5: gelöscht wenn der aktuelle Sector im Buffer steht ;Bit 4: gesetzt wenn die Daten im Buffer noch auf Diskette ; geschrieben werden müssen ;Bit 3: gesetzt in NEWD0S/80 Version 2 ;Bits 2-0: Zugriffs-Level (0-7) aufgrund eines Passwortes 4482 00 +2 ;Bit 7: gesetzt wenn ASE=N (siehe DOS-Befehl ATTRIB) ;Bit 6: gesetzt wenn ASC=N (siehe DOS-Befehl ATTRIB) ;Bit 5: gesetzt wenn UDF=Y (siehe DOS-Befehl ATTRIB) ;Bits 4-0: ./. 4483 00 42 +3 ;Adresse des File-Buffers 4485 00 +5 ;3. Byte des NEXT-Wertes, gibt die relative Position ;innerhalb des aktuellen Sectors an 4486 00 +6 ;Drive# der File bzw. der Diskette 4487 FF +7 ;DEC (Directory Entry Code) vom FPDE der File 4488 00 +8 ;3. Byte des EOF-Wertes, gibt die relative Position ;innerhalb des letzten Sectors an 4489 00 +9 ;Logische Recordlänge (1-256D) 448A 02 00 +0A ;2. und 1. Byte des NEXT-Wertes. Die 3 Bytes des NEXT-Wertes ;geben im RBA-Format an, wohin/woher der nächste Record zu ;schreiben/zu lesen ist, wonach der NEXT-Wert jeweils Kapitel 3: SYSO/SYS Seite 3-18 -------------------------------------------------------------------------------- ;entsprechend erhöht wird. 448C FF FF +0C ;2. und 1. Byte des EOF-Wertes (End of File). Die 3 Bytes des ;EOF-Wertes geben im RBA-Format die aktuelle Länge der File ;an. 448E FF FF +0E ;gibt an, wo der 1. Datenblock dieser File auf Diskette steht ;a) 1. Byte * FF: Es steht kein Datenblock mehr auf Diskette, ;b) 1. Byte * FE: Im 2. Byte steht der DEC (Directory Entry ; Code) für den nächsten FXDE dieser File, ;c) 1. Byte = OO-FD: Gibt die LUMP# an, in der dieser ; Datenblock auf Diskette beginnt. Bits 7-5 des 2. Bytes ; geben dann die Anzahl der GRANS an, die zwischen dem ; Beginn des LUMPS und dem Beginn des Datenblocks liegen ; und Bits 4-0 des 2. Bytes die um 1 verminderte Anzahl der ; GRANS, aus denen dieser Datenblock besteht. 4490 FF FF +10H ;gibt an, wo der 2. Datenblock dieser File auf Diskette steht ;(Bedeutung der Bytes wie beim 1. Datenblock) 4492 FF FF +12H ;gibt an, wo der 3. Datenblock dieser File auf Diskette steht ;(Bedeutung der Bytes wie beim 1. Datenblock) 4494 FF FF +14H ;gibt an, wo der 4. Datenblock dieser File auf Diskette steht ;(Bedeutung der Bytes wie beim 1. Datenblock) 4496 FF FF +16H ;wenn <> FFFF: in den folgenden 8 Bytes sind Angaben über ;die 4 Datenblöcke eines FXDE, der zu dieser File gehört, ;enthalten und hier steht die Anzahl der GRANS, die ;zwischen dem Beginn der File und dem Beginn des ;1. Erweiterungs-Datenblocks dieses FXDE’s liegen. 4498 FF FF +18H ;gibt an, wo der 1. Erweiterungs-Datenblock eines FXDE’s auf ;Diskette steht (Bedeutung der Bytes wie beim 1. Datenblock) 449A FF FF +1A ;gibt an, wo der 2. Erweiterungs-Datenblock eines FXDE’s auf ;Diskette steht (Bedeutung der Bytes wie beim 1. Datenblock) 449C FF FF +1C ;gibt an, wo der 3. Erweiterungs-Datenblock eines FXDE’s auf ;Diskette steht (Bedeutung der Bytes wie beim 1. Datenblock) 449E FF FF +1E ;gibt an, wo der 4. Erweiterungs-Datenblock eines FXDE’s auf ;Diskette steht (Bedeutung der Bytes wie beim 1. Datenblock) ---------------------- Interrupt-Routine für CLOCK-Befehl 44A0 00 00 ;Zeiger auf Interrupt-Kette 44A2 28 ;40D Aufrufe pro Sekunde 44A3 01 ;Interrupt-Zähler 44A4 21 35 3C LD HL,3C35 ;Zeiger auf Bildschirm-RAM ****************************************************** * Name: TIME (Fortsetzung von 446DH) * * Funktion: aktuelle Uhrzeit im Buffer (HL) im * * Format HH:MM:SS ablegen * * Input: HL: zeigt auf 8 -Byte Buffer * * Verändert: HL=HL+ 8, DE, BC, AF * * Output: -- * ****************************************************** 44A7 11 LD DE,4043 ;Zeiger auf HH,MM,SS 44AA 06 LD B,3A ;Trennzeichen ":" 44AC 0E LD C,03 ;Zähler: 3 Werte 44AE 36 LD (HL),2F ;Umwandlung in Dezimalzahl 44B0 1A LD A, (DE) ; 44B1 34 INC (HL) ;Zehnerstelle 44B2 D6 0A SUB OA ; 44B4 30 FB JR NC,44B1 ; 44B6 23 INC HL ;Zeiger auf Buffer +1 44B7 C6 3A ADD 3A ; Kapitel 3: SYSO/SYS Seite 3-19 -------------------------------------------------------------------------------- 44B9 77 LD (HL),A ;Einerstel le 44BA 23 INC HL ;Zeiger auf Buffer +1 44BB 1B DEC DE ;nächster Wert 44BC 0D DEC C 44BD C8 RET Z 44BE 70 LD (HL),B ;Trennzeichen 44BF 23 INC HL 44C0 18 EC JR 44AE ;weiter ****************************************************** * Name: DATE (Fortsetzung von 4470H) * * Funktion: aktuelles Datum im Buffer (HL) im * * Format MM/TT/JJ ablegen * * Input: HL: zeigt auf 8 -Byte Buffer * * Verändert: HL=HL+8 , DE, BC, AF * * Output: -- * ****************************************************** 44C2 1 1 46 40 LD DE,4046 ;Zeiger auf Mh,TT,JJ 44C5 06 2F LD B,2F ;Trennzeichen "/" 44C7 18 E3 JR 44AC ;weiter wie TIME ---------------------- Interrupt-Routine zum weitersetzen der Uhr 44C9 EB 44 ;Zeiger auf Interrupt-Kette 44CB 28 ;40D Aufrufe pro Sekunde 44CC 01 ;Interrupt-Zähler 44CD 21 41 40 LD HL,4041 ;Zeiger auf Uhrzeit und Datum 44D0 E5 PUSH HL 44D1 11 AC 43 LD DE,43AC ;nach 43AC-43B1 übertragen 44D4 01 06 00 LD BC,0006 44D7 ED B0 LDIR 44D9 11 7C 40 LD DE,407C ;Tabelle zum erhöhen der Uhrzi 44DC E1 POP HL 44DD 06 03 LD B,03 ;Zähler: 3 Werte 44DF 34 INC (HL) 44E0 1A LD A,(DE) 44E1 96 SUB (HL) 44E2 D0 RET NC ;wenn kein übertrag 44E3 71 LD (HL),C 44E4 13 INC DE ;nächster Wert 44E5 23 INC HL 44E6 10 F7 DJNZ 44DF 44E8 23 INC HL ;Tag erhöhen 44E9 34 INC (HL) 44EA C9 RET ; ---------------------- Interrupt-Routine für blinkenden Cursor 44EB 00 00 ;Zeiger auf Interrupt-Kette 44ED 14 ;20D Aufrufe pro Sekunde 44EE 01 ;Interrupt-Zähler 44EF DD E5 PUSH IX ;steht IX 44F1 E1 POP HL ;auf 44F2 11 1D 40 LD DE,401D ;DCB für 44F5 DF RST 18 ;Bildschirm ? 44F6 C8 RET Z ;wenn ja 44F7 3A 22 40 LD A,(4022) ;Cursor off ? 44FA B7 OR A 44FB C8 RET Z ;wenn ja 44FC 2A 20 40 LD HL,(4020) ;Cursor— Position holen 44FF BE CP (HL) Kapitel 3: SYSO/SYS Seite 3-20 -------------------------------------------------------------------------------- 4500 36*8F LD (HL), 8 F ;SYSTEM BI (Cursor Zeichen) a) wenn SYSTEM BH=N oder DOS-Befehl BLINK,N: 4502*C9 RET b) wenn SYSTEM BH=Y oder DOS-Befehl BLINK,Y: 4502*C8 RET Z 4503 77 LD (HL),A ;Zeichen unter Cursor anzeigen 4504 C9 RET ----------------------- a) wenn SYSTEM BF=N oder DOS-Befehl LCDVR,N: 4505*18 OC JR C,4513 b) wenn !SYSTEM BF«Y oder DOS-Befehl LCDVR,Y; 4505*38 OC JR C,4513 4507 CD 53 48 CALL 4853 ;HL=Cursor-Position 450A 79 LD A,C ;Zeichen prüfen 450B D6 20 SUB 20 450D FE 60 CP 60 450F 79 4510 DA 7D 04 JP C ,047D ;wenn 20H .. 7FH 4513 C3 58 04 JP 0458 ;wenn 00H .. 1FH oder 80H .. FFH ----------------------- NEWD0S/80’s Erweiterung der Tastatur-Routine 4516 3A 69 43 LD A , (4369) ; ist 4519 EE 20 XOR 20 ;CHAINING 451B E6 68 AND 68 ;aktiv ? 451D 3E CB LD A, CB ;Code für SYS9/SYS 451F CC DD 49 CALL Z,49DD ;wenn ja: SYS-File laden und starten 4522 C8 RET Z 4523 21 BE 45 LD HL,45 ;Abfrage von ’DFG’, ’123’ und ’JKL’ 4526 36 C9 LD (HL),C9 ;sperren 4528 E5 PUSH HL 4529 21*36*40 LD HL,4036 ;Zeiger auf Tastatur-Status 452C 7E LD A, (HL) ;der letzten Taste 452D B7 OR A 452E 3E*00 LD A,00 ;SYSTEM AV (Repeat-Faktor) 4530 20 03 JR NZ,4535 4532 32 80 45 LD (4580),A 4535 AF XOR A 4336 F6*00 OR A ;Repeat-Zähler, wird bei jedem ;RTC-Interrupt um 1 vermindert a) wenn SYSTEM AU=N (Repeat Funktion aus): 4538*18 09 JR 4543 b) wenn SYSTEM AU=Y (Repeat Funktion ein): 4538*20 09 JR NZ,4543 453A B6 OR (HL) ;Repeat-Taste noch gedrückt ? 453B 20 04 JR NZ,4541 453D 3D DEC A 453E 32 73 45 LD (4573),A 4541 36 00 LD (HL),00 ;Status der Repeat-Taste löschen 4543 2E 36 LD L,36 ;Zeiger auf Tastatur-Status 4545 01 01 38 LD BC,3801 ;Zeiger auf Tastatur-Matrix 4548 16 FF LD D,FF ;Tastatur-Matrix lesen 454A OA LD A, (BC) 454B 5F LD E, A ;mit Status vergleichen 454C AE XOR (HL) 454D 73 LD (HL),E 454E A3 AND E 454F 20 OD JR NZ,455E ;wenn eine neue Taste gedrückt ist 4551 7A LD A, D 4552 C6 08 ADD 08 Kapitel 3: SYSO/SYS Seite 3-21 -------------------------------------------------------------------------------- 4554 57 LD D,A 4555 2C INC L ;nächste Matrix-Zeile 4556 CB 01 RLC C 4558 F2 4A 45 JP P,454A 455B AF XOR A ;Ende der Matrix 455C 18 OF JR 456D 455E 5F LD E,A ;eine neue Taste ist gedrückt 455F 14 INC D 4560 OF RRCA 4561 30 FC JR NC,455F 4563 C5 PUSH BC ;Register retten 4564 D5 PUSH DF 4565 22 2A 45 LD (452A),HL ;Matrix-Zeile -für Repeat retten 4568 CD OB 04 CALL 040B ;ASCII-Code berechnen, BREAK -> RST 28H 456B E1 POP HL 456C C1 POP BC ;Register zurück 456D B7 OR A 456E 57 LD D,A ;D = ASCII-Code 456F 28 18 JR Z,4589 ;wenn keine neue Taste gedrückt 4571 7C LD A, H 4572 FE*FF CP FF 4574 32 73 45 LD (4573),A 4577 3E*00 LD A,00 ;SYSTEM AV (Repeat-Faktor) 4579 20 06 JR NZ,4581 457B 0A LD A,(BC) 457C A5 AND L a) wenn SYSTEM AC=Y (Tasten-Entprellung von NEWD0S/80)s 457D*28 EE JR Z,456D b) wenn SYSTEM AC=N 457D 3E EE LD A,EE 457F 3E*FF LD A,FF 4581 32 37 45 LD (4537),A ;Repeat-Zähler setzen 4584 3E 02 LD A,02 4586 32 80 45 LD (4580),A 4589 CD BF 45 CALL 45BF ;’DFG’, ’123’ und ’JKL’ abfragen 458C E1 POP HL ;HL=45BE 458D 36 00 LD (HL),00 ;Abfrage ’DFG’, ’123’ und ’JKL’ erlauben a) wenn SYSTEM AQ=N 459F FE*1F CP 1F ;mit CLEAR-Taste vergleichen b) wenn SYSTEM AQ=Y 458F FE*00 CP 00 4591 28 1D JR Z,45B0 a) wenn SYSTEM BF=N oder DOS--Befehl LCDVR,N: 4593*C9 RET b) wenn SYSTEM BF=Y oder DOS--Befehl LCDVR,Ys 4593*4F LD C,A 4594 E6 DF AND DF ;Buchstabe ? 4596 D6 41 SUB 41 4598 FE 1A CP 1A 459A 79 LD A,C 459B 38 15 JR C,45B2 ;wenn Buchstabe 459D FE 20 CP 20 ;Leertaste ? 459F CO RET NZ ;wenn nein 45AO 21 7F 38 LD HL,387F ;gesamte Tastatur-Matrix 45A3 7E LD A, (HL) ;abfragen 45A4 23 INC HL ;Zeiger auf SHIFT-Tasten 45A5 A6 AND (HL) ;SHIFT gedrückt ? 45A6 0F RRCA ;SHIFT + Leertaste ? 45A7 79 LD A,C 45A8 D0 RET NC ;wenn nein Kapitel 3: SYSO/SYS Seite 3-22 -------------------------------------------------------------------------------- 45A9 21 B4 45 LD HL,45B4 ;SHIFT + Leertaste: 45AC 7E LD A, (HL) ;Toggle Flag -für Umschaltung 45AD EE C9 XOR C9 ;a-z -> A-Z oder a-z -> a-z 45AF 77 LD (HL),A 45B0 AF XOR A 45B1 C9 RET 45B2 EE 20 XOR 20 ;Umschaltung -für a-z: a) wenn SYSTEM BG=Y oder DOS--Befehl LC,Y: 45B4*C9 RET b) wenn SYSTEM BG=N oder DOS--Befehl LC,N: 45B4*00 NOP ****************************************************** * Name: UPCASE * * Funktion: wandelt Kleinbuchstaben in * * Großbuchstaben um * * Input: A: ASCII-Code eines Zeichens * * Verändert: F * * Output: A: ASCII-Code für Großbuchstaben * ****************************************************** 45B5 FE 61 CP 61 ;< "a" ? 45B7 D8 RET C ;wenn ja 45B8 FE 7B CP 7B ;> "z" ? 45BA D0 RET NC ;wenn ja 45BB D6 20 SUB 20 ;a-z -> A-Z 45BD C9 RET -------------------------- Abfrage von ’DFG’, '123' und ’JKL’ a) wenn Tastatur-Routine nicht aktiv ist: 45BE*00 NOP ;Abfrage erlaubt b) wenn Tastatur-Routine gerade aktiv ist: 45BE*C9 RET ;Abfrage nicht erlaubt 45BF 21 69 43 LD HL,4369 ;Status des DOS prüfen: 45C2 7E LD A,(HL) ;CHAINING aktiv oder RST 28H aktiv 45C3 E6 AND 6C ;oder RUN-ONLY-Modus ? 45C5 20 26 JR NZ,45ED ;wenn ja: Abfrage nicht erlaubt -------------------------- 45C7 3A 01 38 LD A, (3801) ;'DFG' gedrückt ? 45CA FE D0 CP D0 a) wenn SYSTEM AF=*N ('DFG’ verboten): 45CC*18 05 JR 45D3 b) wenn SYSTEM AF=Y ('DFG' erlaubt): 45CC*20 05 JR NZ,45D3 ;wenn nein 45CE 3E E3 LD A,E3 ;Code für SYS1/SYS 45D2 EF RST 28 ;SYS-File laden und starten -------------------------- 45D3 3A 10 38 LD A,(3810) ;'123' gedrückt ? 45D6 FE 0E CP 0E a) wenn SYSTEM AE=N ('123' verboten): 45D8*18 0E JR 45E8 b) wenn SYSTEM AE=Y ('123' erlaubt): 45D8K20 0E JR NZ,45E8 ;wenn nein 45DA 3A BE 45 LD A,(45BE) ;erfolgt die Abfrage von 45DD D6 C9 SUB C9 ;der Tastatur-Routine her ? 45DF CA OD 44 JP Z,440D ;wenn ja: DEBUG über 440D starten 45E2 F1 POP AF ;bei Abfrage durch die 45E3 C1 POP BC ;Interrupt-Routine: 45E4 D1 POP DE ;Register zurück Kapitel 3: SYSO/SYS Seite 3-23 -------------------------------------------------------------------------------- 45E5 E1 POP HL ;und 45E6 18 22 JR 460A ;DEBUG über 460A -------------------------- 45E5 3A 02 38 LD A,(3802) ;’JKL’ gedrückt ? 45EB FE 1C CP 1C 45ED 7A LD A,D ;Tastatur-Zeichen zurück a) wenn SYSTEM AD-N (’JKL’ verboten): 45EE*C9 RET b) wenn SYSTEM AD=Y <’JKL’ erlaubt): 45EE*C0 RET NZ ;wenn nein 45EF 3E A5 LD A,A5 ;Code für SYS3/SYS 45F1 EF RST 28 ;SYS-File laden und starten -------------------------- 45F2 F5 PUSH AF ;AF retten 45F3 E5 PUSH HL ;HL retten 45F4 D5 PUSH DE ;DE retten 45F5 C5 PUSH BC ;BC retten 45F6 3A E0 37 LD A,(37E0) ;Interrupt-Status lesen 45F9 07 RLCA ;Interrupt durch FDC ? 45FA CD 53 40 CALL 4053 ;wenn ja: (37EC) lesen 45FD DC 10 46 CALL C,4610 ;wenn RTC-Interrupt: alle definii ;Interrupt-Routinen bearbeiten 4600 CD BE 45 CALL 45BE ;’DFG’, '123’ und ’JKL’ abfragen 4603 C1 POP BC ;BC zurück 4604 D1 POP DE ;DE zurück 4605 E1 POP HL ;HL zurück 4606 F1 POP AF ;AF zurück 4607 FB EI ;Interrupts wieder erlauben 4608 C9 RET ;zurück zum Hauptprogramm ****************************************************** * Name: DEBUG (Fortsetzung von 440DH) * * Funktion: DEBUG aufrufen * * Input: -- * * Verändert: -- * * Output: -- * ****************************************************** 4609 F5 PUSH AF ;AF retten 460A 3E 27 LD A, 27 ;Code für SYS5/SYS 460C EF RST 28 ;SYS-File laden und starten -------------------------- Interrupt-Routine aufrufen 460D 70 LD (HL),B ;Interrupt-Zähler setzen 460E 23 INC HL ;HL = Startadresse der Routine 460F E9 JP (HL) ;Interrupt-Routine aufrufen -------------------------- Bearbeitung von RTC-Interrupts (Real-Time-Clock) 4610 21 40 40 LD HL,4040 ;Zeiger auf Interrupt-Zähler 4613 34 INC (HL) ;Zähler +1 4614 21 37 45 LD HL,4537 ;Zeiger auf Tastatur Repeat-Zähler 4617 7E LD A,(HL) ;Zähl er = 0 ? 4618 B7 OR A 4619 28 01 JR Z,461C ;wenn ja 461B 35 DEC (HL) ;wenn nein: Zähler -1 -------------------------- Bearbeitung der RTC-Interrupt-Kette 461C 21 C9 44 LD HL,44C9 ;Zeiger auf 1. Kontrol1-Block 461F 7C LD A, H ;Zeiger = 0000 ? Kapitel 3: SYSO/SYS Seite 3-24 -------------------------------------------------------------------------------- 4620 B5 OR L 4621 C8 RET Z ;wenn ja, Ende der Kette 4622 5E LD E,(HL) ;Zeiger auf Kontrol1-Block der 4623 23 INC HL ;nächsten Interrupt-Routine 4624 56 LD D,(HL) ;aus der Kette holen 4625 D5 PUSH DE ;Zeiger retten 4626 23 INC HL ;Zeiger auf Kontrol1-Block +1 4627 46 LD B,(HL) ;Aufruf alle wieviel Interrupts 4628 23 INC HL ;Zeiger +1 4629 35 DEC (HL) ;Interrupt-Zähler -1 462A CC 0D 46 CALL Z,460D ;wenn 0: Interrupt-Routine aufrufen 462D E1 POP HL ;Zeiger auf nächsten Kontrol1-Block 462E 18 EF JR 461F ;nächste Interrupt-Routine bearbeiten ****************************************************** * Name: READS * * Funktion: liest einen Sector von Diskette * * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger auf zu benutzenden Buffer * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A«Fehlercode, wenn Z=0 * ****************************************************** READS liest einen physikalischen Sector von Diskette. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). 4630 3E 88 LD A,88 ;READ-SECTOR-Kommando für FDC 4632 18 OE JR 4642 ;weiter bei 4642 ****************************************************** * Name: TESTS * * Funktion: testet einen Sector auf Fehler (Verify) * * Input: E: gewünschte Sector# (Disk-relativ) * * 4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** TESTS testet einen physikalischen Sector auf Diskette, ob er ohne Fehler lesbar ist. Dazu wird versucht, diesen Sector von Diskette zu lesen, wobei als Buffer einfach das BASIOROM im Bereich 0100H-02FEH benutzt wird. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# einge­ tragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). 4634 E5 PUSH HL ;HL retten 4635 26 01 LD H, 01 ;Buffer = 01XX 4637 CD 30 46 CALL 4630 ;Sector lesen 463A E1 POP HL ;HL zurück 463B C9 RET Kapitel 3: SYSO/SYS Seite 3-25 -------------------------------------------------------------------------------- ****************************************************** * Name: WRITDS * * Funktion: schreibt einen Sector des Directory auf * * Diskette * * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger au-f zu benutzenden Buffer * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** WRITDS schreibt einen physikalischen Sector mit dem Data Adress Mark für Directory-Sectoren au-f Diskette. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). a) wenn SYSTEM BN=N (Data Adress Mark -für TRS-80 Model I Disketten): 463C 3E*A9 LD A,A9 ;WRITE-SECTOR-Kommando -für Directory mit ;Data Adress Mark FAH -für FD 1771 (SD) ;bzw. F 8 H für FD 1791 (DD) b) wenn SYSTEM BN=Y (Data Adress Mark für TRS-80 Model III Disketten): 463C 3E*AB LD A, AB ;WRITE-SECTOR-Kommando für Directory mit ;Data Adress Mark F 8 H für FD 1771 (SD) ;und FD 1791 (DD: aus "AB" wird "A9" !) 463E 18 02 JR 4642 ;weiter bei 4642 ****************************************************** * Name: WRITES * * Funktion: schreibt einen Sector auf Diskette * * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger auf zu benutzenden Buffer * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4640 3E A8 LD A,A8 ;WRITE-SECTOR-Kommando für FDC mit ;"normalem" Data Adress Marker FBH. -------------------------- 4642 32 C4 46 LD (46C4),A ;FDC-Kommando nach 46C4 4645 E6 20 AND 20 ;READ oder WRITE ? 4647 C5 PUSH BC ;BC retten 4648 01 1A 02 LD BC,021A ;"LD A,(DE)" + "LD (BC),A" 464B 28 05 JR Z,4652 ;wenn READ 464D 3E 08 LD A,08 ;Offset für Fehlercode bei WRITE = 08H 464F 01 12 0A LD BC,0A12 ;"LD (DE),A" + "LD A,(BC)" 4652 32 31 47 LD (4731),A ;0ffset für Fehlercode (READ=0/WRITE=8) 4655 ED 43 FC 46 LD (46FC),BC ;Richtung des Daten-Transfers nach 46FC 4659 06*0A LD B,0A ;SYSTEM AM: Anzahl Versuche bei Errors 465B CD 73 47 CALL 4773 ;Select Drive (4308H) und Motor starten 465E 20 18 JR NZ,4678 ;wenn Error -------------------------- 4660 C5 PUSH BC ;B (Zähler für Anzahl Versuche) retten 4661 D5 PUSH DE ;DE (Disk-relative Sector#) retten Kapitel 3: SYSO/SYS Seite 3-26 -------------------------------------------------------------------------------- 4662 E5 PUSH HL ;HL (Zeiger auf Buffer) retten 4663 3A OE 43 LD A,(430E) ;A = PDRIVE+4: SPT (Sectors pro Track) 4666 EB EX DE,HL ;=> HL = gewünschte Sector# 4667 CD B4 4C CALL 4CB4 ;1) C=A (Sectors pro Track) ;2) DIV: HL-INT(HL/A), A=Rest 466A 55 LD D,L ;D = gesuchte Track# 466B 5F LD E,A ;E = gesuchte Sector# 466C 21 OD 43 LD HL,430D ;HL zeigt aut PDRIVE+3: TC (Track Count) 466F 7A LD A,D ;ist die berechnete Track# größer als 4670 BE CP (HL) ;die Anzahl der vorhandenen Tracks ? 4671 38 09 JR C,467C ;wenn nein -------------------------- 4673 3E 14 LD JP A,14 ;Fehlercode für "TRACK # TOO HIGH" 4675 E1 POP HL ;HL (Zeiger auf Buffer) zurück 4676 D1 POP DE ;DE (Disk-relative Sector#) zurück 4677 C1 POP BC ;B (Zähler für Anzahl Versuche) zurück 4678 B7 CP C,4737 ;Z-Flag löschen, A=Fehlercode 4679 C3 37 47 JR C,467C ;weiter bei 4737 -------------------------- 467C 3A 1 1 43 LD A,(4311) ;PDRIVE+7: TI und TD 467F 47 LD B,A ;nach B 4680 CB 40 BIT 0,B ;Double Density (DD) ? 4682 28 05 JR Z,4689 ;wenn nein 4684 21 C4 46 LD HL,46C4 ;Zeiger auf Kommando für FDC 4687 CB 8E RES 1,(HL) ;aus ABH wird A9H (Rest unverändert) -------------------------- 4689 21 09 43 LD HL,4309 ;Zeiger aut Bit-Maske für aktuelle Drive 468C CB 48 BIT 1,B ;TI=J oder TI=K (Track# ab 1) ? 468E 28 01 JR Z,4691 ;wenn nein 4690 14 INC D ;wenn ja: Track# +1 -------------------------- 4691 D5 PUSH DE ;D (gewünschte Track#) retten 4692 CB 50 BIT 2,B ;TI=L (doppelte Step-Impulse) ? 4694 28 02 JR Z,4698 ;wenn nein 4696 CB 02 RLC D ;Pseudo-Track# für SEEK verdoppeln -------------------------- 4698 CB 70 BIT 6,B ;Diskette doppelseitig (DS) ? 469A 28 09 JR Z,46A5 ;wenn nein 469C CB 09 RRC C ;=> C = Sectors pro Track pro Seite 469E 7B LD A,E ;ist die gewünschte Sector# 469F 91 SUB C ;auf der Rückseite der Diskette ? 46A0 38 03 JR C,46A5 ;wenn nein 46A2 5F LD E,A ;E = gesuchte Sector# auf der Rückseite 46A3 CB DE SET 3,(HL) ;Bit tür Rückseite (Seite 1) setzen 46A5 CD 67 47 CALL 4767 ;gewünschte Disk-Seite anwählen -------------------------- 46A8 CB 60 BIT 4,B ;TI=I oder TI=M (Sector# ab 1) ? 46AA 28 01 JR Z,46AD ;wenn nein 46AC 1C INC E ;wenn ja: Sector# +1 -------------------------- 46AD ED 53 EE 37 LD (37EE),DE ;zu suchende Track# und Sector# an FDC 46B1 0E 18 LD C,18 ;SEEK-Kommando an FDC senden 46B3 CD CALL 4747 ;und warten, bis FDC nicht mehr busy ist 46B6 F1 POP AF ;A = gewünschte Track# 46B7 C1 POP BC ;BC = Zeiger auf Buffer 46B8 C5 PUSH BC ;BC (Zeiger aut Butter) retten 46B9 32 ED 37 LD (37ED),A ;gewünschte Track# ins Track-Register 46BC D5 PUSH DE ;D (Pseudo-Track# für SEEK) retten 46BD 11 EF 37 LD DE,37EF ;Zeiger auf Daten-Register des FDC 46C0 21 EC 37 LD HL,37EC ;Zeiger auf Kommando/Status-Register Kapitel 3: SYSO/SYS Seite 3-27 -------------------------------------------------------------------------------- 46C3 36*00 LD (HL),00 ;Kommando (READ/WRITE) an FDC senden 46C5 CD E3 47 CALL 47E3 ;55 us warten und Status-Register lesen 46C8 F3 DI ;Interrupts sperren 46C9 CB 46 BIT 0,(HL) ;ist FDC busy ? 46CB 28 4A JR Z,4717 ;wenn nein, Kommando abbrechen 46CD 3A C4 46 LD A,(46C4) ;ist das auszuführende Kommando 46D0 CB 6F BIT 5,A ;das READ-Kommando ? 46D2 28 22 JR Z,46F6 ;wenn ja -------------------------- WRITE-SECTOR: 46D4 3E 83 LD A,83 ;Status-Register des FDC auf 46D6 A6 AND (HL) ;Data Request und busy prüfen 46D7 E2 D4 46 JP PO,46D4 ;wenn nein, warten 46DA 0A LD A,(BC) ;1. Zeichen aus dem Buffer 46DB 12 LD (DE),A ;an Daten-Register des FDC schicken 46DC 03 INC BC ;Zeiger auf Buffer +1 46DD 0A LD A,(BC) ;2 . Zeichen aus dem Buffer 46DE 32 E8 46 LD (46E8),A ;nach 46E8 46E1 03 INC BC ;Zeiger auf Buffer +1 46E2 3E 01 LD A,01 ;Status-Register des FDC auf 46E4 BE CP (HL) ;busy und kein Data Request prüfen 46E5 28 FD JR Z,46E4 ;wenn ja, warten 46E7 3E*00 LD A,00 ;2. Zeichen aus dem Buffer 46E9 12 LD (DE),A ;an Daten-Register des FDC schicken 46EA 0A LD A,(BC) ;3. Zeichen aus dem Buffer holen 46EB 03 INC BC ;Zeiger auf Buffer +1 46EC CB 4E BIT 1,(HL) ;Data Request ? 46EE 20 0C JR NZ,46FC ;wenn ja 46F0 CB 4E BIT 1,(HL) ;Data Request ? 46F2 20 08 JR NZ,46FC ;wenn ja 46F4 18 09 JR 46FF ;weiter bei 46FF -------------------------- READ- SECTOR: 46F6 3E 83 LD A, 83 ;Status-Register des FDC auf 46F8 A6 AND (HL) ;Data Request und busy prüfen 46F9 E2 F6 46 JP PO,46F6 ;wenn nein, warten -------------------------- READ + WRITE: 46FC*1A LD A,(DE) ;bei READ: nächstes Zeichen vom FDC 46FD*02 LD (BC),A ;holen und in Buffer schreiben ;bei WRITE: Zeichen (A) an FDC schicken ;+ nächstes Zeichen aus dem Buffer holen 46FE 03 INC BC ;Zeiger auf Buffer +1 46FF CB 4E BIT 1,(HL) ;Data Request ? 4701 20 F9 JR NZ,46FC ;wenn ja 4703 CB 4E BIT 1,(HL) ;Data Request ? 4705 20 F5 JR NZ,46FF ;wenn ja 4707 CB 4E BIT 1,(HL) ;Data Request ? 4709 20 F1 JR NZ,46FC ;wenn ja 470B CB 46 BIT 1,(HL) ;Data Request ? 470D 28 08 JR NZ,46FC ;wenn ja 470F CB 4E BIT 1,(HL) ;Data Request ? 4711 20 E9 JR NZ,46FC ;wenn ja 4713 CB 7E BIT 1,(HL) ;Data Request ? 4715 28 E8 JR NZ,46FC ;wenn ja -------------------------- Ende des READ/WRITE--Kommandos 4717 7E LD A,(HL) ;Status-Register des FDC lesen 4718 36 DO LD (HL),D0 ;FORCE-INTERRUPT-Kommando an FDC 471A 23 INC HL ;Zeiger auf Track-Register des FDC Kapitel 3: SYSO/SYS Seite 3-28 -------------------------------------------------------------------------------- 471B C1 POP BC ;B = Pseudo-Track# für SEEK 471C 70 LD (HL),B ;ins Track-Register schreiben 47ID E1 POP HL ;HL (Zeiger auf Buffer) zurück 47IE D1 POP DE ;DE (Disk-relative Sector#) zurück 471F C1 POP BC ;BC (Zähler für Anzahl Versuche) zurück 4720 FB EI ;Interrupts erlauben 4721 E6 FC AND FC ;Error-Bits maskieren 4723 28 12 JR Z,4737 ;wenn kein Error -------------------------- Fehlerbehandlung 4725 4F LD C,A ;Error-Bits retten 4726 E6 9C AND 9C ;wenn "Write Protected", "Write Fault" 4728 28 06 JR Z,4730 ;oder "Data Adress Mark": abbrechen ! 472A 4F LD C,A ;maskierte Error-Bits 472B 87 ADD A ;wenn "Drive Not Ready": 472C 28 02 JR Z,4730 ;abbrechen (kein weiterer Versuch) 472E 10 0A DJNZ 473A ;schon "SYSTEM AM" Versuche gemacht ? -------------------------- Fehlercode berechnen 4730 3E*00 LD A,00 ;Offset für Fehlercode (READ=0, WRITE=8) 4732 3C INC A ;Fehlercode +1 4733 CB 09 RRC C ;Error-Bit OO 47E2 C9 RET Kapitel 3: SYSO/SYS Seite 3-32 -------------------------------------------------------------------------------- ****************************************************** * Name: DELAY1 * * Funktion: ca. 55 us warten (bei 1.774 MHz) * * und Status-Register des FDC lesen * * Input: -- * * Verändert: F * * Output: A: Status des FDC * ****************************************************** ********** FEHLER! Vor dem Laden des PDRIVE-Sectors ********** ********** in der Initialisierung von SYSO steht hier ********** ********** immer noch der Wert für SYSTEM BJ=1 ! ********** 47E3 3E*06 LD A,06 ;6 * SYSTEM BJ (CPU Speed) 47E5 3D DEC A ;Zähler - 1 47E6 20 FD JR NZ,47E5 ;wenn <> 0 47E8 3A EC 37 LD A,(37EC) ;Status-Register des FDC 1esen 47EB C9 RET ****************************************************** * Name: TSTDSK (Fortsetzung von 445EH) * * Funktion: Drive (A) auswählen, Motor starten und * * testen , ob Diskette eingelegt * * Input: A: gewünschte Drive#' (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Es wird DRVSEL (445BH) aufgerufen und (wenn dabei kein Fehler auftrat) anschließend geprüft, ob sich eine drehende Diskette im Laufwerk befindet. 47EC CD 76 47 CALL 4776 ;DRVSEL aufrufen 47EF C0 RET NZ ;wenn Error 47F0 E5 PUSH HL ;HL retten 47F1 D5 PUSH DE ;DE retten 47F2 C5 PUSH BC ;BC retten 47F3 11*00*00 LD DE,0000 ;Zeit-Zähler: 2400H * SYSTEM BJ (Speed) 47F6 21 EC 37 LD HL,37EC ;Zeiger auf Status-Register des FDC 47F9 46 LD B,(HL) ;Status nach B 47FA 7E LD A,(HL) ;Status nach A 47FB A8 XOR B ;beide vergleichen 47FC E6 02 AND 02 ;hat sich das Index-Bit verändert ? 47FE 20 DD JR NZ,47DD ;wenn ja: ohne Fehler zurück 4800 1B DEC DE ;ist die Zeit 4801 7A LD A,D ;für 1.32 Umdrehungen 4802 B3 OR E ;abgelaufen ? 4803 20 F5 JR NZ,47FA ;wenn nein 4805 3E 08 LD A,08 ;Fehlercode "DEVICE NOT AVAILABLE" 4807 18 D5 JR 47DE ;mit Fehler zurück ****************************************************** * Name: EXPAND (Fortsetzung von 444BH) * * Funktion: Wenn die File kürzer ist, als das NEXT- * * Feld im FCB angibt, wird die File um * * entsprechend viele GRANS erweitert. * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A*Fehlercode, wenn Z=0 * ****************************************************** Kapitel 3: SYSO/SYS Seite 3-33 -------------------------------------------------------------------------------- 4809 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 480C CD B7 49 CALL 49B7 ;Zugriffs-Level WRITE oder mehr ? 480F AF XOR A ;Flag: File darf auch erweitert werden ****************************************************** * Name: FILPOS * * Funktion: Berechnet die physikalische Position des* * Sectors, auf den das NEXT-Feld zeigt * * Input: X: zeigt auf geöffneten FCB * * IY: muß auf 4380H zeigen * * A: 00: File darf erweitert werden * * B6: File darf nicht erweitert werden * * vorher: Call PUSHR (4980H)! * * Verändert: BC * * Output: AF: A=Fehlercode, wenn Z=0 * * DE: gesuchte Sector# (Disk-relativ) * * HL: zeigt auf Buffer der File * ****************************************************** FILPOS berechnet, wo derjenige Sector einer File, auf den das NEXT-Feld zeigt, letztendlich auf Diskette steht. Falls die File kürzer ist, als das NEXT-Feld angibt, wird sie dabei - sofern das erlaubt ist - um entsprech­ end viele GRANS erweitert. Vor dem Aufruf von FILPOS muß UP PUSHR (4980H) aufgerufen worden sein, damit im Falle eines Errors der Notaussprung über 49CDH funktioniert! Arbeitsweise von FILPOS: Es werden zunächst die 4 Datenblocks überprüft, deren Angaben im FCB+0E bis FCB+15H stehen, ob sie den gesuchten Sector enthalten. Wenn nein, werden nun die 4 Erweiterungs-Datenblocks überprüft, deren Angaben zur Zeit im FCB+16H bis FCB+1F enthalten sind. Falls auch sie den gesuchten Sector nicht enthalten, werden aus dem Directory nach­ einander alle FDE’s dieser File gelesen und überprüft, bis die Informa­ tionen über den gesuchten Sector gefunden sind oder das Ende der File erreicht wurde. In letztem Fall wird - sofern die File erweitert werden darf - nun SYS2/SYS damit beauftragt, freie GRANS zu suchen und für diese File zu belegen. 4810 32 BB 48 LD (48BB),A ;Flag: darf File auch erweitert werden ? 4813 CD 6E 47 CALL 476E ;Drive (FCB+6) auswählen + Motor starten 4816 20 5A JR NZ,4872 ;wenn Error 4818 CD 68 49 CALL 4968 ;HLC = NEXT-Wert 481B EB EX DE,HL ;=> DE = NEXT-Wert (Bytes 1 und 2) 481C DD 7E 00 LD A,(IX+00) ;gehört der FCB nicht zu 481F 0F RRCA ;einer File, sondern zu 4820 0F RRCA ;einer ganzen Diskette ? 4821 38 30 JR C,4853 ;wenn ja 4823 0F RRCA ;Bit 2,FCB+0 gesetzt ? 4824 3E 2D LD A,2D ;Fehlercode "BAD FCB DATA" 4826 38 4A JR C,4872 ;wenn ja, Error 4828 EB EX DE,HL ;=> HL = NEXT-Wert (Bytes 1 und 2) 4829 CD B2 4C CALL 4CB2 ;DIV: HL-INT(HL/5), A=Rest 482C 0E 0E LD C,OE 482E EB EX DE,HL ;=> DE = relative GRAN# innerhalb der ;File, die den gesuchten Sector enthält Kapitel 3: SYSO/SYS Seite 3-34 -------------------------------------------------------------------------------- 4835 D5 PUSH DE ;gesuchte GRAN# retten 4836 3E 08 LD A,08 ;Zähler: 8 Datenblocks pro FCB 4838 08 EX AF,AF’ 4839 7E LD A,(HL) ;EOF erreicht ? 483A 3C INC A 483B 23 INC HL 483C 28 54 JR Z,4892 ;wenn ja 483E 7E LD A,(HL) ;enthält der jetzt bearbeitete 483F CD E9 48 CALL 48E9 ;Datenblock den gesuchten Sector ? 4842 30 31 JR NC,4875 ;wenn nein -------------------------- Datenblock wurde gefunden, der den gesuchten Sector enthält 4844 09 ADD HL,BC 4845 EB EX DE,HL ;=> DE = gesuchte GRAN# 4846 AE XOR (HL) ;Anzahl der GRANS berechnen, die 4847 07 RLCA ;zwischen dem Beginn des LUMPS, auf 4848 07 RLCA ;das HL zeigt, und dem Beginn des 4849 07 RLCA ;Datenblocks liegen, in dem der 484A 83 ADD E ;gesuchte Sector steht; und zur 484B 5F LD E,A ;gesuchten GRAN# hinzuaddieren 484C F1 POP AF ;./. (gesuchte GRAN#) 484D F1 POP AF ;./. (FCB+OE) 484E F1 POP AF ;A = relative Sector# im gesuchten GRAN 484F 2B DEC HL 4850 CD 7C 4C CALL 4C7C ;DE = gesuchte Sector# (Disk-relativ) 4853 DD 6E 03 LD L,(IX+03) ;Bufferadresse der File nach HL 4856 DD 66 04 LD H,(IX+04) 4859 AF XOR A ;kein Error 485A C9 RET ;ggf. nach 49A8: POP Register und RET -------------------------- Nächsten FXDE der File aus dem Directory lesen und überprüfen 485B C1 POP BC ;./. (FDE+16H) 485C C1 POP BC ;BC = Anzahl GRANS, die vor dem Beginn ;der 4 Datenblocks im letzten FDE liegen 485D E1 POP HL ;HL = gesuchte GRAN# 485E ED 52 SBC HL,DE ;Anzahl der GRANS berechnen, die vor 4860 09 ADD HL,BC ;Beginn der 4 Datenblocks im nächsten 4861 44 LD B,H ;zu untersuchenden FDE liegen 4862 4D LD C,L ;und in BC merken 4863 F5 PUSH AF ;DEC des nächsten FXDE’s 4864 CD 2F 49 CALL 492F ;DIR-Sector mit dem nächsten FXDE nach ;4200H laden und HL auf FXDE+0 setzen 4867 20 09 JR NZ,4872 ;wenn Error 4869 3E*FF LD A,FF ;DEC des zuvor untersuchten FDE’s 486B 23 INC HL ;Überprüfung 486C BE CP (HL) ;der Backward-Chain 486D 2B DEC HL ;(Rück-Verkettung) 486E 28 2F JR Z,489F ;wenn kein Error 4870 3E 2C LD A,2C ;Fehlercode "BAD DIRECTORY DATA" 4872 C3 CD 49 JP 49CD ;Error-Exit über Notaussprung -------------------------- Nächsten (Erweiterungs-)Datenblock im FCB überprüfen 4875 EB EX DE,HL ;HL auf das 1. Byte der Angaben 4876 23 INC HL ;über den nächsten Datenblock setzen 4877 DD CB 01 5E BIT 3,(IX+01) ;Format des FCB: NEWD0S/80 Version 2 ? 487B 37 SCF 487C 28 A6 JR Z,4824 ;wenn nein, Error 487E 08 EX AF,AF’ ;Zähler: Anzahl Datenblocks pro FCB 487F FE 05 CP 05 ;kommen nun die Erweiterungs-Datenbl. ? 4881 20 OC JR NZ,488F ;wenn nein Kapitel 3: SYSO/SYS Seite 3-35 -------------------------------------------------------------------------------- 4883 4E LD C,(HL) ;BC = Anzahl der GRANS, die vor 4884 23 INC HL ;dem Beginn des 1. Erweiterungs- 4885 46 LD B,(HL) ;Datenblocks liegen 4886 23 INC HL 4887 D1 POP DE ;gesuchte GRAN# 4888 D5 PUSH DE 4889 EB EX DE,HL ;liegt die gesuchte GRAN# 488A ED 42 SBC HL,BC ;vor dem Beginn des 488C EB EX DE,HL ;1. Erweiterungs-Datenblocks ? 488D 38 03 JR C,4892 ;wenn ja 488F 3D DEC A ;nächsten (Erweit.-)Datenblock prüfen 4890 20 A6 JR NZ,4838 ;wenn noch nicht alle 8 Blocks überprüft -------------------------- EOF oder Ende der Erweiterungs-Datenblocks erreicht 4892 01 00 00 LD BC,0000 ;Anzahl GRANS, die vor dem Beginn der ;nächsten 4 Datenblocks liegen 4895 D1 POP DE ;DE = gesuchte GRAN# 4896 CD 4B 49 CALL 494B ;DIR-Sector mit dem FPDE (FCB+7) nach ;4200H laden und HL auf FPDE+0 setzen 4899 20 CC JR NZ,4867 ;wenn Error 489B DD 7E 07 LD A,(IX+07) ;DEC des FPDE holen 489E F5 PUSH AF ;A retten (DEC des FPDE’s) 489F F1 POP AF ;A = DEC des gerade geladenen FDE’s 48A0 32 6A 48 LD (486A),A ;für Prüfung der Backward-Chain merken 48A3 CB 66 BIT 4,(HL) ;ist der gerade geladene FDE aktiv ? 48A5 28 C9 JR Z,4870 ;wenn nein, Error 48A7 D5 PUSH DE ;gesuchte GRAN# 48A8 C5 PUSH BC ;Anzahl GRANS, die vor Beginn der ;nächsten 4 Datenblocks liegen 48A9 7D LD A,L ;HL auf FDE+16H setzen 48AA C6 16 ADD 16 48AC 6F LD L,A 48AD E5 PUSH HL ;FDE+16H 48AE 7E LD A,(HL) ;nächsten Datenblock im FDE prüfen 48AF FE FE CP FE ;Zeiger auf nächsten FXDE ? 48B1 23 INC HL 48B2 7E LD A,(HL) 48B3 23 INC HL 48B4 38 10 JR C,48C6 ;wenn normaler Datenblock 48B6 28 A3 JR Z,485B ;wenn nächster FXDE gelesen werden muß -------------------------- EOF erreicht. File erweitern ? 48B8 3E 3E LD A,3E ;Fehlercode "CAN'T EXTEND FILE VIA READ" a) wenn File erweitert werden darf: 48BA 18*00 JR 48BC ;Error ignorieren b) wenn File nicht erweitert werden darf: 48BA 18*B6 JR 4872 ;Error weiterleiten 48BC F1 POP AF ;./. (FDE+16H) 48BD 3E 64 LD A, 64 ;Code für SYS2/SYS 48BF CD DD 49 CALL 49DD ;SYS-File laden und starten 48C2 C1 POP BC ;Anzahl GRANS, die vor dem Beginn der ;nächsten 4 Datenblocks liegen 48C3 D1 POP DE ;gesuchte GRAN# 48C4 18 DD JR 48A3 ;neues Spiel, neues Glück -------------------------- Nächsten Datenblock im FDE überprüfen 48C6 CB 65 BIT 4,L ;HL zeigt auf nächsten Datenblock im FDE 48C8 28 A6 JR Z,4870 ;"BAD DIRECTORY DATA" ? 48CA CD E9 48 CALL 48E9 ;enthält der jetzt überprüfte 48CD EB EX DE,HL ;Datenblock den gesuchten Sector ? Kapitel 3: SYSO/SYS Seite 3-36 -------------------------------------------------------------------------------- 48CE 30 DE JR NC,48AE ;wenn nein: nächsten Datenblock prüfen -------------------------- Datenblock wurde gefunden, der den gesuchten Sector enthält 48D0 C1 POP BC ;BC = FDE+16H 48D1 D1 POP DE ;DE = Anzahl GRANS, die vor dem Beginn ;der gefundenen 4 Datenblocks liegen 48D2 F1 POP AF ;./. gesuchte GRAN# 48D3 E1 POP HL ;HL = FCB+0E 48D4 F1 POP AF ;A = relative Sector# im gesuchten GRAN 48D5 C5 PUSH BC ;BC = FDE+16H 48D6 01 08 00 LD BC,0008 ;8 Bytes für 4 Datenblocks 48D9 7A LD A,D ;zeigte BC auf einen FPDE oder FXDE ? 48DA B3 OR E 48DB 28 05 JR Z,48E2 ;wenn FPDE 48DD 09 ADD HL,BC ;HL auf FCB+16H setzen 48DE 73 LD (HL),E ;dort die Anzahl der GRANS 48DF 23 INC HL ;eintragen, die vor dem 48E0 72 LD (HL),D ;Beginn der gefundenen 48E1 23 INC HL ;4 Datenblocks liegen 48E2 EB EX DE, HL ;=> DE = FCB+OE bzw. FCB+18H 48E3 E1 POP HL ;HL » FDE + 16H 48E4 ED B0 LDIR ;Angaben über die gefundenen 4 Daten- ;blocks vom FDE in den FCB übertragen 48E6 C3 13 48 JP 4813 ;nun müsste es aber klappen -------------------------- Enthält der zu prüfende Datenblock den gesuchten Sector ? 48E9 E6 1F AND 1F ;BC = Anzahl der 48EB 4F LD C,A ;GRANS, aus denen 48EC 06 00 LD B,00 ;der zu prüfende 48EE 03 INC BC ;Datenblock besteht 48EF EB EX DE,HL ;=> HL = gesuchte GRAN# 48F0 ED 42 SBC HL,BC ;Länge des Datenblocks abziehen 48F2 C9 RET ;C=1 (Carry): der gesuchte Sector liegt ; in dem geprüften Datenblock ;C=0 (Carry): der gesuchte Sector liegt ; hinter dem geprüften Datenblock -------------------------- Position des Directory aus dem BOOT-Sector entnehmen 48F3 3A 02 42 LD A,(4202) ;DSL (Directory Starting Lump) holen 48F6 2A 99 43 LD HL,(4399) ;Zeiger auf aktuellen PDRIVE-Block 48F9 77 LD (HL),A ;wirklichen DSL bei PDRIVE+0 eintragen 48FA 3A 30 49 LD A,(4930) ;gewünschte DIR-Sector# -------------------------- DIR-Sector von Diskette lesen 48FD CD 74 4C CALL 4C74 ;Position des DIR-Sectors berechnen: ;DE = gesuchte Sector# (Disk-relativ) ;HL = 4200H (Buffer für DIR-Sectoren) 4900 CD 30 46 CALL 4630 ;Sector von Diskette lesen 4903 20 02 JR NZ,4907 ;wenn (Data Adress Mark ?) Error 4905 F6 31 OR 31 ;Fehlercode "WRONG DISKETTE RECORD TYPE" 4907 FE 06 CP 06 ;Z*1, wenn Data Adress Mark des DIR 4909 C9 RET Kapitel 3: SYSO/SYS Seite 3-37 -------------------------------------------------------------------------------- ****************************************************** * Name: DIRR * * Funktion: liest einen Sector des Directory * * Input: A: gewünschte Sector# (DIR-relativ) * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: 4200H (Buffer -für DIR-Sectoren) * * (4930H): gelesene Sector# (DIR-relativ) * ****************************************************** DIRR berechnet, wo ein gewünschter Sector des Directory auf Diskette steht und liest ihn nach 4200H. Falls der gelesene Sector nicht mit dem Data Adress Mark für DIR-Sectoren versehen ist, wird die wirkliche Position des Directory aus dem BOOT-Sector der betreffenden Diskette gelesen, bei PDRIVE+0 dieses Laufwerks eingetragen und anschließend damit ein neuer Versuch gestartet. Register A gibt an, um den wievielten Sector innerhalb des Directory (beginnend ab 0 ) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, 2 . B. durch DRVSEL (445BH) oder TSTDSK (445EH). 490A D5 PUSH DE ;DE retten 490B C5 PUSH BC ;BC retten 490C CD FD 48 CALL 48FD ;Position des DIR-Sectors berechnen und ;DIR-Sector nach 4200H lesen 490F 28 OB JR Z,491C ;wenn kein Error 4911 11 00 00 LD DE,0000 ;BOOT-Sector der gleichen 4914 CD 30 46 CALL 4630 ;Diskette nach 4200H lesen 4917 CC F3 48 CALL Z,48F3 ;wenn kein Error: wirkliche Position des ;DIR entnehmen und neuen Versuch machen 491A 3E 11 LD A,11 ;ggf. Fehlercode "DIRECTORY READ ERROR" 491C C1 POP BC ;BC zurück 491D D1 POP DE ;DE zurück 491E C9 RET ******************************************************* * Name: DIRW * * Funktion: schreibt einen Sector des Directory * * Input: (4930H): gewünschte Sector# (DIR-relativ)* * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: 4200H (Buffer für DIR-Sectoren) * ******************************************************* DIRW berechnet, wo ein gewünschter Sector des Directory auf Diskette steht und schreibt den Inhalt des DIR-Buffers (4200H) mit dem Data Adress Mark für DIR-Sectoren dorthin. (4930H) gibt an, um den wievielten Sector innerhalb des Directory (beginnend ab 0 ) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). 491F 3A 30 49 LD A,(4930) ;gewünschte Sector# (DIR-relativ) 4922 D5 PUSH DE ;DE retten 4923 C5 PUSH BC ;BC retten 4924 CD 74 4C CALL 4C74 ;Position des DIR-Sectors berechnen: ;DE = gesuchte Sector# (Disk-relativ) ;HL = 4200H (Buffer für DIR-Sectoren) Kapitel 3: SYSO/SYS Seite 3-38 -------------------------------------------------------------------------------- 4927 B4 OR H ;DIR-Sector mit Verity 4928 CD B8 4A CALL 4AB8 ;auf Diskette schreiben 492B 3E 12 LD A,12 ;ggf. Fehlercode "DIRECTORY WRITE ERROR" 492D 18 ED JR 491C ;POP BC, POP DE und RET -------------------------- FDE einer File aus dem Directory holen, wenn der benötigte DIR-Sector möglicherweise schon/noch im Butter steht 492F 2E*FF LD L,FF ;Sector# des DIR-Sectors im Butter 4931 18 05 JR 4938 ;weiter wie GETFDE -------------------------- FPDE einer File aus dem Directory holen 4933 DD 7E 07 LD A,(IX+07) ;DEC des FPDE bei FCB+7 lesen ****************************************************** * Name: GETFDE * * Funktion: holt einen FDE aus dem Directory * * Input: A: DEC des gewünschten FDE’s * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: zeigt im Buffer (42XXH) aut FDE+0 * * (4930H): gelesene DIR-Sector# * ****************************************************** GETFDE berechnet, in welchem Sector des Directory ein gewünschter FDE (File Directory Entry) aut Diskette steht und liest diesen Sector nach 4200H. Falls der gelesene Sector nicht mit dem Data Adress Mark tür DIR-Sectoren versehen ist, wird die wirkliche Position des Directory aus dem BOOT-Sector der betrettenden Diskette gelesen, bei PDRIVE+0 dieses Lautwerks eingetragen und anschließend damit ein neuer Versuch gestartet. Register A gibt den DEC (Directory Entry Code) des gewünschten FDE’s an. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). 4936 2E FF LD L,FF ;Flag: der benötigte DIR-Sector ;steht noch nicht im Buffer 4938 F5 PUSH AF ;A retten (DEC des gesuchten FDE’s) 4939 E6 1F AND 1F ;Sector# des benötigten 493B 3C INC A ;DIR-Sectors berechnen 493C 3C INC A ;(DIR-relativ) 493D BD CP L ;steht der benötigte Sector ;bereits im Buffer ? 493E C4 OA 49 CALL NZ,490A ;wenn nein: Position dieses Sectors ;berechnen und Sector nach 4200H lesen 4941 E1 POP HL ;H = DEC des gesuchten FDE’s 4942 C0 RET NZ ;wenn Error 4943 3E E0 LD A,E0 ;Adresse 4945 A4 AND H ;vom FDE+0 4946 6F LD L,A ;im Buffer 4947 26 42 LD H,42 ;berechnen 4949 BF CP A ;Z=1 (kein Error) 494A C9 RET -------------------------- FPDE einer File aus dem DIR holen und FCB aut Fehler prüten 494B CD 6E 47 CALL 476E ;Drive (FCB+6) auswählen + Motor starten 494E CC 33 49 CALL Z,4933 ;wenn kein Error: FPDE der File nach ;4200H lesen und HL aut FPDE+0 setzen 4951 C0 RET NZ ;wenn Error 4952 E5 PUSH HL ;HL retten (FPDE+0) 4953 C6 16 ADD 16 ;HL aut FPDE+16H Kapitel 3: SYSO/SYS Seite 3-39 -------------------------------------------------------------------------------- 4955 6F LD L,A 4956 DD 7E 0E LD A,(IX+0E) ;stimmen die Angaben über den 1. Daten- 4959 BE CP (HL) ;block in FCB+0E und FPDE+16H überein ? 495A E1 POP HL ;HL zurück (FPDE+0) 495B 28 03 JR Z,4960 ;wenn ja 495D 3C INC A ;EOF ? 495E 20 05 JR NZ,4965 ;wenn nein: Error 4660 7E LD A,(HL) ;(FPDE+0) testen 4961 E6 90 AND 90 ;handelt es sich um 4963 FE 10 CP 10 ;einen aktieven FPDE ? 4965 3E 2D LD A,2D ;ggf. Fehlercode "BAD FCB DATA" 4967 C9 RET ****************************************************** * Name: NXTEOF * * Funktion: NEXT-Wert aus dem FCB nach HLC laden * * und NEXT-Wert mit EOF-Wert vergleichen * * Input: IX: zeigt auf einem geöffneten FCB * * Verändert: A * * Output: HL: 1. und 2. Byte des NEXT-Wertes * * C: 3. Byte des NEXT-Wertes * * F: C=1 und Z=0, wenn NEXT < EOF * * C=0 und Z=1, wenn NEXT = EOF * * C=0 und Z=0, wenn NEXT > EOF * ****************************************************** 4968 DD 4E 05 LD C,(IX+05) ;C = 3. Bytes des NEXT-Wertes 496B DD 6E 0A LD L,(IX+0A) ;L = 2. Bytes des NEXT-Wertes 496E DD 66 0B LD H,(IX+0B) ;H = 1. Bytes des NEXT-Wertes 4971 7E LD A,H ;1. Bytes des NEXT-Wertes mit 4972 DD BE 0D CP (IX+0D) ;1. Bytes des EOF-Wertes vergleichen 4975 C0 RET NZ ;wenn <> 4976 7D LD A,L ;2. Bytes des NEXT-Wertes mit 4977 DD BE 0C CP (IX+0C) ;2. Bytes des EOF-Wertes vergleichen 497A C0 RET NZ ;wenn <> 497B 79 LD A,C ;3. Bytes des NEXT-Wertes mit 497C DD BE 08 CP (IX+08) ;3. Bytes des EOF-Wertes vergleichen 497F C9 RET ****************************************************** * Name: PUSHR * * Funktion: wenn FCB geöffnet ist: POSH Register, * * IX=FCB+0, IY=4380H, A=00, SP=SP-16D * * Input: DE: zeigt auf einem geöffneten FCB * * Verändert: SP: wird um 8 Ebeben erniedrigt * * Output: IX: zeigt auf FCB+0 * * IY: zeigt auf 4380H * * AF: 0044H (wenn kein Error) * * (49CEH): geretteter Stackpointer * ****************************************************** PushR ist kein UP im gewöhnlichen Sinne, da es erhebliche Manipulationen am SP (Stackpointer) vornimmt und auch nicht immer zu seinem Aufrufer zurückkehrt. Wenn Register DE beim Aufruf von PUSHR nicht auf einem geöffneten FCB zeigt, wird der Fehlercode "FILE NOT OPEN" nach AF geladen, die Rücksprung-Adresse zum Aufrufer von PUSHR aus dem Stack entfernt und in die nächsthöhere Ebene zurückgesprongen,ohne ein weiteres Refister zu veränderen. Kapitel 3: SYSO/SYS Seite 3-40 -------------------------------------------------------------------------------- Wenn Register DE beim Aufruf von PUSHR jedoch auf einen geöffneten FCB zeigt, werden die Register IY, HL, DE, BC, AF’, IX, der Zwischenspeicher für den SP (49CEH) sowie 49A8H als nächste Rücksprung-Adresse in den Stack geschrieben, Register IX wird auf FCB+0, IY auf 4380H (als Zeiger auf den RAM-Bereich 4300H bis 43FFH) und AF auf 0044H gesetzt, der jetzige Wert des SP wird bei 49CEH vermerkt und nun wird zum Aufrufer von PUSHR zurückgekehrt. Das nächste RET, daß nun von dort ausgeführt wird, verzweigt aufgrund der manipulierten Rücksprung-Adresse nach 49A8H, wo alle Register (mit Ausnahme von AF) aus dem Stack geholt werden und so wieder ihren ursprünglichen Wert erhalten, den sie beim Aufruf von PUSHR hatten. 4980 1A LD A,(DE) ;Zeiger auf FCB+0 4981 07 RLCA ;FCB geöffnet ? 4982 3E 26 LD A,26 ;ggf. Fehlercode "FILE NOT OPEN" 4984 30 01 JR NC,4987 ;wenn nein 4986 AF XOR A ;wenn ja: kein Error 4987 08 EX AF,AF' ;Fehlerstatus nach AF’ 4988 E3 EX (SP),HL ;HL = Rücksprung-Adresse, (SP) = HL 4989 22 A6 49 LD (49A6),HL ;Rücksprung-Adresse retten 498C E1 POP HL ;HL zurück 498D FD E5 PUSH IY ;IY retten 498F E5 PUSH HL ;HL retten 4990 D5 PUSH DE ;DE retten 4991 C5 PUSH BC ;BC retten 4992 F5 PUSH AF ;AF’ retten 4993 D5 PUSH DE ;IX retten und 4994 DD E3 EX (SP),IX ;IX auf FCB+0 setzen 4996 E5 PUSH HL ;Zwischenspeicher 4997 2A CE 49 LD HL,(49CE) ;des SP in den 499A E3 EX (SP),HL ;Stack schreiben 499B ED 73 CE 49 LD (49CE),SP ;jetzigen SP merken 499F FD 21 80 43 LD IY,4380 ;IY auf 4380H setzen 49A3 08 EX AF,AF' ;Fehlerstatus zurück nach AF 49A4 B7 OR A ;wenn kein Error: 49A5 CC*00*00 CALL Z,0000 ;Rücksprung-Adresse 49A8H in den Stack ;und zurück zum Aufrufer von PUSHR -------------------------- POP Register 49A8 E1 POP HL ;Zwischenspeicher des 49A9 22 CE 49 LD (49CE),HL ;SP zurück nach 49CEH 49AC 08 EX AF,AF' ;neuen Fehlerstatus in AF’ retten 49AD DD E1 POP IX ;IX zurück 49AF F1 POP AF ;AF’ zurück 49B0 C1 POP BC ;BC zurück 49B1 D1 POP DE ;DE zurück 49B2 E1 POP HL ;HL zurück 49B3 FD E1 POP IY ;IY zurück 49B5 08 EX AF,AF’ ;Fehlerstatus zurück nach AF 49B6 C9 RET ;nicht zum Aufrufer von PUSHR, sondern ;in die nächsthöhere Ebene -------------------------- Zugriffs-Level aufgrund eines Passwortes prüfen 49B7 06 05 LD B,05 ;Zugriffs-Level WRITE oder mehr ? 49B9 DD 7E 01 LD A,(IX+01) ;erlaubten Zugriffs-Level 49BC E6 07 AND 07 ;aus dem FCB holen und mit dem 49BE B8 CP B ;erwünschten Zugriffs-Level vergleichen 49BF D8 RET C ;wenn erlaubt 49C0 3E 25 LD A,25 ;"ILLEGAL ACCESS TO PROTECTED FILE" Kapitel 3: SYSO/SYS Seite 3-41 -------------------------------------------------------------------------------- 49C2 18 09 JR 49CD ;Error— Exit über Notaussprung -------------------------- Wurde EOF erreicht oder überschritten ? 49C4 CD 68 49 CALL 4968 ;NEXT-Feld < EOF-Feld ? 49C7 D8 RET C ;wenn ja 49C8 3E 1C LD A,1C ;Fehlercode "END OF FILE ENCOUNTERED" 49CA 28 01 JR Z,49CD ;wenn NEXT-Feld = EOF-Feld 49CC 3C INC A ;Fehlercode "PAST END OF FILE" -------------------------- Error— Exit über Notaussprung: zurück mit Fehlerstatus in AF zur nächsthöheren Ebene als zum Aufrufer von PUSHR (4980H). (Nur zulässig, wenn vorher PUSHR aufgerufen wurde) 49CD 31*00*00 LD SP,0000 ;zuletzt gemerkten SP aus ;dem Zwischenspeicher holen 49D0 B7 OR A ;Z=0, wenn A=Fehlercode 49D1 18 D5 JR 49A8 ;P0P Register und RET -------------------------- 49D3 C2 09 44 JP NZ,4409 ;wenn Error 49D6 AF XOR A ;kein Error 49D7 20 F4 JR NZ,49CD ;Error— Exit über Notaussprung 49D9 E3 EX (SP),HL ;Codes für SYS-File aus dem Stack holen 49DA 7C LD A,H ;A = Code für gewünschte SYS-File 49DB 4D LD C,L ;C = Hilfscode für SYS-File 49DC E1 POP HL ;HL zurück 49DD EF RST 28 ;SYS-File laden und starten -------------------------- Hilfsroutine für UP ’s READ (4436H) und WRITE (4439H) 49DE DD CB 01 7E BIT 7,(IX+01) ;LRL (Logische Recordlänge) = 256D ? 49E2 C8 RET Z ;wenn ja 49E3 D1 POP DE ;Rücksprung-Adresse löschen 49E4 DD 46 09 LD B,(IX+09) ;B = Logische Recordlänge 49E7 F5 PUSH AF ;F retten (C=1: READ / C=0: WRITE) 49E8 E5 PUSH HL ;HL retten (Zeiger auf Record-Buffer) 49E9 C5 PUSH BC ;B retten (Zähler für LRL) 49EA 4E LD C,(HL) ;falls WRITE: nächstes Zeichen aus ;dem Record-Buffer holen 49EB CD ED 4A CALL 4AED ;nächsten Zeichen lesen oder schreiben 49EE 20 DD JR NZ,49CD ;wenn Error: Exit über Notaussprung 49F0 5F LD E,A ;falls READ: gelesenes Zeichen retten 49F1 C1 POP BC ;B zurück (Zähler für LRL) 49F2 E1 POP HL ;HL zurück (Zeiger auf Record-Buffer) 49F3 F1 POP AF ;F zurück (C=l: READ / C=0: WRITE) 49F4 30 01 JR NC,49F7 ;wenn WRITE 49F6 73 LD (HL),E ;wenn READ: gelesenes Zeichen in ;den Record-Buffer übertragen 49F7 23 INC HL ;Zeiger auf Record-Buffer +1 49F8 10 ED DJNZ 49E7 ;Zähler für LRL -1, nächstes Byte ? 49FA AF XOR A ;kein Error 49FB C9 RET ;nach 49A8H: POP Register und RET Kapitel 3: SYSO/SYS Seite 3-42 -------------------------------------------------------------------------------- ****************************************************** * Name: READ (Fortsetzung von 4436H) * * Funktion: nächsten Sector/Record einer File lesen * * Input: DE: zeigt auf geöffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * Logische Recordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 49FC CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 49FF 37 SCF ;Flag für READ statt WRITE 4A00 CD DE 49 CALL 49DE ;wenn LRL < 256D (Logische Recordlänge): ;dort abarbeiten, kein RET hierher 4A03 CD 19 4A CALL 4A19 ;nächsten Sector von Diskette lesen 4A06 28 03 JR Z,4A0B ;wenn kein Error 4A08 FE 06 CP 06 ;Directory-Sector ? 4A0A C0 RET NZ ;wenn nein 4A0B DD 34 0A INC (IX+0A) ;1. und 2. Byte 4A0E 20 03 JR NZ,4A13 ;des NEXT-Wertes 4A10 DD 34 0B INC (IX+0B) ;um 1 erhöhen 4A13 DD CB 01 EE SET 5,(IX+O1) ;vermerken, daß der aktuelle Sector ;noch nicht im Buffer steht 4A17 B7 OR A ;Z=0, wenn A=Fehlercode 4A18 C9 RET ;ggf. nach 49A8: POP Register und RET -------------------------- Nächsten Sector einer File von Diskette lesen 4A19 06 06 LD B,06 ;Zugriffs-Level READ: 4A1B CD B9 49 CALL 49B9 ;prüfen, ob Zugriffs-Level READ erlaubt 4A1E CD C4 49 CALL 49C4 ;wenn NEXT = EOF: "END OF FILE ENCOUNT." ;wenn NEXT > EOF: "PAST END OF FILE" 4A21 3E B6 LD A,B6 ;Flag: File beim Lesen nicht erweitern 4A23 CD 10 48 CALL 4810 ;DE = gewünschte Sector# (Disk-relativ), ;HL = Adresse des Buffers 4A26 CD 30 46 CALL 4630 ;Sector von Diskette lesen ********** FEHLER! Auch wenn beim Lesen ein Fehler auftrat wird ********** ********** vermerkt , daß der aktuelle Sector im Buffer steht! ********** 4A29 DD CB 01 AE RES 5,(IX+01) ;vermerken, daß der aktuelle Sector im 4A2D DD CB 01 A6 RES 4,(IX+01) ;Buffer steht und keine Daten enthält, 4A31 C9 RET ;die noch auf Diskette zu schreiben sind ****************************************************** * Name: VERIFY (Fortsetzung von 443CH) * * Funktion: nächsten Sector/Record einer File auf * * Diskette schreiben, anschließend Verify * * Input: DE: zeigt auf geöffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * Logische Recordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4A32 3E F6 LD A,F6 ;"OR nn": Kennung für UP VERIFY 4A34 18 02 JR 4A38 ;weiter wie UP WRITE Kapitel 3: SYSO/SYS Seite 3-43 -------------------------------------------------------------------------------- ****************************************************** * Name: WRITE (Fortsetzung von 4439H) * * Funktion: nächsten Sector/Record einer File auf * * Diskette schreiben (ohne Verify) * * Input: DE: zeigt auf geöffneten FCB * * HL: zeigt auf Record-Buffer (nur wenn * * Logische Recordlänge <> 256D ist) * * Verändert: -- * * Output: AF: A==Fehlercode, wenn Z=0 * ****************************************************** 4A36 3E E6 LD A,E6 ;"AND nn": Kennung für UP WRITE 4A38 32 8B 4A LD (4A8B),A ;Kennung für VERIFY oder WRITE 4A3B CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 4A3E CD DE 49 CALL 49DE ;wenn LRL < 256D (Logische Recordlänge) ;dort abarbeiten, kein RET hierher 4A41 CD 67 4A CALL 4A67 ;Buffer-Inhalt auf Diskette schreiben 4A44 C0 RET NZ ;wenn Error 4A45 DD 7E 05 LD A,(IX+05) ;3. Byte des NEXT-Wertes testen 4A48 B7 OR A ;wenn 00: 4A49 CC 0B 4A CALL Z,4A0B ;1. und 2. Byte des NEXT-Wertes +1, ;und vermerken, daß der aktuelle Sector ;noch nicht im Buffer steht 4A4C CD 68 49 CALL 4968 ;HLC = NEXT-Wert 4A4F 30 06 JR NC,4A57 ;wenn NEXT-Wert >= EOF-Wert 4A51 DD CB 01 76 BIT 6,(IX+01) ;soll der EOF-Wert nach jedem Schreiben ;auf den NEXT-Wert gesetzt werden ? 4A55 20 09 JR NZ,4A60 ;wenn nein 4A57 DD 71 08 LD (IX+08),C ;EOF-Wert := NEXT-Wert 4A5A DD 75 0C LD (IX+OC),L 4A5D DD 74 0D LD (IX+OD),H 4A60 AF XOR A ;kein Error 4A61 C9 RET ;ggf. nach 49A8: POP Register und RET -------------------------- Nächsten Sector einer File auf Diskette schreiben 4A62 DD CB 01 66 BIT 4,(IX+01) ;muß der Inhalt des Buffers noch auf ;Diskette geschrieben werden ? 4A66 C8 RET Z ;wenn nein 4A67 CD OC 48 CALL 480C ;wenn die File kürzer ist, als das ;NEXT-Feld angibt, wird die File um ;entsprechend viele GRANS erweitert, ;DE = gewünschte Sector# (Disk-relativ) ;HL = Adresse des File-Buffers 4A6A DD CB 02 6E BIT 5,(IX+02) ;ist das Update-Flag schon gesetzt ? 4A6E 20 18 JR NZ,4A88 ;wenn ja 4A70 DD CB 00 4E BIT 1,(IX+00) ;gehört der FCB nicht zu einer File, ;sondern zu einer ganzen Diskette ? 4A74 20 12 JR NZ,4A88 ;wenn ja -------------------------- Update-Flag im Directory setzen 4A76 E5 PUSH HL ;HL retten (Zeiger auf Buffer der File) 4A77 CD 4B 49 CALL 494B ;DIR-Sector mit FPDE lesen, HL = FPDE+0 4A7A 20 03 JR NZ,4A7F ;wenn Error 4A7C 23 INC HL ;HL auf FPDE+1 4A7D CB EE SET 5,(HL) ;Update-Flag im FPDE setzen 4A7F CC 1F 49 CALL Z,491F ;wenn kein Error: DIR-Sector schreiben 4A82 E1 POP HL ;HL zurück (Zeiger auf Buffer der File) 4A83 C0 RET NZ ;wenn Error 4A84 DD CB 02 EE SET 5,(IX+02) ;Update-Flag im FCB setzen -------------------------- Kapitel 3: SYSO/SYS Seite 3-44 -------------------------------------------------------------------------------- Verify gewünscht ? - Normaler Sector oder DIR-Sector ? a) wenn DOS-Befehl VERIFY,N: 4A88*DD*7E*01 LD A,(IX+01) ;wird Verify gewünscht ? b) wenn DOS-Befehl VERIFY,Y: 4A88*00*3E*FF LD A,FF ;Verify wird gewünscht a) wenn Aufruf über UP WRITE (4439H): 4A8B*E6 90 AND 90 ;wird Verify gewünscht ? b) wenn Aufruf über UP VERIFY (443CH): 4A8B*F6 90 OR 90 ;Verify wird gewünscht 4A8D DD CB 00 46 BIT 0,(IX+00) ;normal er Sector oder DIR-Sector ? 4A91 CD B8 4A CALL 4AB8 ;Sector auf Diskette schreiben 4A94 C0 RET NZ ;wenn Error 4A95 AF XOR A ;kein Error 4A96 18 95 JR 4A2D ;vermerken, daß der Buffer keine Daten ;mehr enthält, die noch auf Diskette zu ;schreiben sind und RET ****************************************************** * Name: WRITEB (Fortsetzung von 001BH) * * Funktion: nächstes Byte in eine File schreiben * * Input: DE: zeigt auf geöffneten FCB * * A: zu schreibendes Byte * * Verändert: -- * * Output: AF: A=Fehlercode, wenn 1 = 0 * ****************************************************** Obige Angaben gelten nur für einen Aufruf über 001BH 4A98 28 12 JR Z,4AAC ;wenn aktueller Sector im Buffer steht -------------------------- Aktueller Sector steht noch nicht im Buffer 4A9A C5 PUSH BC ;C retten (zu schreibendes Zeichen) 4A9B CD OC 48 CALL 480C ;wenn die File kürzer ist, als das ;NEXT-Feld angibt, wird die File um ;entsprechend viele GRANS erweitert 4A9E CD 68 49 CALL 4968 ;NEXT-Wert < EOF-Wert ? 4AA1 20 01 JR NZ,4AA4 ;wenn ja 4AA3 B7 OR A ;3. Byte des NEXT-Wertes > 0 ? 4AA4 C4 21 4A CALL NZ,4A21 ;wenn ja: aktuellen Sector von ;Diskette in den Buffer lesen 4AA7 C1 POP BC ;C zurück (zu schreibendes Zeichen) 4AA8 C0 RET NZ ;wenn Error 4AA9 CD 29 4A CALL 4A29 ;vermerken, daß der aktuelle Sector im ;Buffer steht und keine Daten enthält, ;die noch auf Diskette zu schreiben sind -------------------------- 4AAC CD OB 4B CALL 4B0B ;HL zeigt auf nächstes Zeichen im Buffer 4AAF 71 LD (HL),C ;zu schreibendes Zeichen in den Buffer 4AB0 DD CB 01 E6 SET 4,(IX+01) ;vermerken, daß der Buffer Daten enthält ;die noch auf Diskette zu schreiben sind 4AB4 28 8B JR Z,4A41 ;wenn Buffer jetzt voll ist 4AB6 18 94 JR 4A4C ;wenn Buffer noch nicht voll ist Kapitel 3: SYSO/SYS Seite 3-45 -------------------------------------------------------------------------------- ****************************************************** * Name: WRITXV * * Funktion: schreibt einen normalen Sector oder * * einen Sector des Directory auf Diskette,* * anschließend Verify (optional) * * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger auf zu benutzenden Buffer * * A: Verify nur durchführen, wenn A <> 00 * * F: normaler (Z-1) oder DIR-Sector (Z=0) * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** WRITXV schreibt einen physikalischen Sector mit dem Data Adress Mark für normale Sectoren oder Directory-Sectoren auf Diskette. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). Wenn Register A <> 00 ist, wird der Sector nach dem Schreiben getestet, ob er auch ohne Fehler lesbar ist. Wenn nein, wird das Schreiben und anschl. Testen so oft wiederholt, wie SYSTEM AW angibt. 4AB8 4F LD C,A ;Flag für Verify (00 * nein) 4AB9 06*03 LD B,03 ;SYSTEM AW (Anzahl Versuche für Verify) 4ABB 20 0D JR NZ,4ACA ;wenn DIR-Sector ****************************************************** * Name: WRITEV * * Funktion: schreibt einen normalen Sector auf * * Diskette, anschließend Verify (optional)* * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger auf zu benutzenden Buffer * * C: Verify nur durchführen, wenn C O 00 * * B: max. Anzahl Verify-Versuche * * (4308H): gewünschte Drive# (0-3) * * Verändert: B * * Output: AF: A=Fehlercode, wenn Z-0 * ****************************************************** WRITEV schreibt einen physikalischen Sector mit dem Data Adress Mark für normale Sectoren auf Diskette. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). Wenn Register C <> 00 ist, wird der Sector nach dem Schreiben getestet, ob er auch ohne Fehler lesbar ist. Wenn nein, wird das Schreiben und anschl. Testen so oft wiederholt, wie Register B angibt. 4ABD CD 40 46 CALL 4640 ;Sector schreiben 4AC0 C0 RET NZ ;wenn Error 4AC1 79 LD A,C ;Verify gewünscht ? 4AC2 B7 OR A 4AC3 C4 34 46 CALL NZ,4634 ;wenn ja: Sector testen 4AC6 C8 RET Z ;wenn kein Error 4AC7 10 F4 DJNZ 4ABD ;nächster Versuch 4AC9 C9 RET Kapitel 3: SYSO/SYS Seite 3-46 -------------------------------------------------------------------------------- ****************************************************** * Name: WRITDV * * Funktion: schreibt einen Sector des Directory auf * * Diskette, anschließend Verify (optional)* * Input: DE: gewünschte Sector# (Disk-relativ) * * HL: Zeiger auf zu benutzenden Buffer * * C: Verify nur durchführen, wenn C <> 00 * * B: max. Anzahl Verify-Versuche * * (4308H): gewünschte Drive# (0-3) * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z-0 * ****************************************************** WRITDV schreibt einen physikalischen Sector mit dem Data Adress Mark für Directory-Sectoren auf Diskette. DE gibt an, um den wievielten Sector innerhalb der Diskette (beginnend ab 0) es sich dabei handelt. Zuvor muß bei 4308H die gewünschte Drive# eingetragen worden sein, z. B. durch DRVSEL (445BH) oder TSTDSK (445EH). Wenn Register C <> 00 ist, wird der Sector nach dem Schreiben getestet, ob er auch ohne Fehler lesbar ist. Wenn nein, wird das Schreiben und anschl. Testen so oft wiederholt, wie Register B angibt. 4ACA CD CALL 463C ;Sector schreiben 4ACD C0 RET NZ ;wenn Error 4ACE 79 LD A,C ;Verify gewünscht ? 4ACF B7 OR A 4AD0 C8 RET Z ;wenn nein 4AD1 CD 34 46 CALL 4634 ;Sector testen 4AD4 CD 03 49 CALL 4903 ;Sector mit Data Adress Mark des DIR ? 4AD7 C8 RET Z ;wenn kein Error 4AD8 10 F0 DJNZ 4ACA ;nächster Versuch 4ADA C9 RET -------------------------- Fortsetzung der UP’s 0013H und 001BH 4ADB 21*00*00 LD HL,0000 ;Zeiger auf 1. RCB (Route-Control-Block) 4ADE 1A LD A,(DE) ;DCB-Typ holen 4ADF FE C0 CP C0 ;liegt eine Umleitung durch ROUTE vor ? 4AE1 28 5D JR Z,4B40 ;wenn ja -------------------------- 4AE3 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 4AE6 DD CB 01 FE SET 7,(IX+01) ;vermerken, daß LRL <> 256D ist 4AEA 78 LD A,B ;DCB-Typ prüfen: 4AEB FE 02 CP 02 ;Input (0013H) oder Output (001BH) ? 4AED DD CB 01 6E BIT 5,(IX+01) ;steht der aktuelle Sector im Buffer ? 4AF1 30 A5 JR NC,4A98 ;wenn Output ****************************************************** * Name: READB (Fortsetzung von 0013H) * * Funktion: nächstes Byte aus einer File lesen * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: wenn Z=1: A = nächstes Byte * * wenn Z=0: A = Fehlercode * ****************************************************** Obige Angaben gelten nur für einen Aufruf über 0013H 4AF3 C4 19 4A CALL NZ,4A19 ;aktuellen Sector von Diskette 1esen, ;wenn er nicht schon im Buffer steht 4AF6 C0 RET NZ ;wenn Error Kapitel 3: SYSO/SYS Seite 3-47 -------------------------------------------------------------------------------- 4AF7 CD C4 49 CALL 49C4 ;wenn NEXT = EOF: "END OF FILE ENCOUNT." ;wenn NEXT > EOF: "PAST END OF FILE" 4AFA CD OB 4B CALL 4B0B ;HL zeigt auf nächstes Zeichen im Buffer 4AFD 20 09 JR NZ,4B08 ;wenn noch nicht am Ende des Buffers 4AFF E5 PUSH HL ;HL retten (Zeiger au-f nächstes Zeichen) 4B00 CD 62 4A CALL 4A62 ;wenn notwendig, alten Buffer-Inhalt ;auf Diskette schreiben 4B03 E1 POP HL ;HL zurück (Zeiger auf nächstes Zeichen) 4B04 C0 RET NZ ;wenn Error 4B05 CD OB 4A CALL 4A0B ;1. und 2. Byte des NEXT-Wertes +1, ;und vermerken, daß der aktuelle Sector ;noch nicht im Buffer steht 4B08 7E LD A,(HL) ;nächstes Zeichen nach A lesen 4B09 BF CP A ;Z=1 (kein Error) 4B0A C9 RET ;ggf. nach 49A8: POP Register und RET -------------------------- HL auf nächstes Byte im Buffer positionieren und das 3. Byte des NEXT-Feldes um 1 erhöhen 4B0B CD 53 48 CALL 4853 ;HL zeigt auf File-Buffer 4B0E DD 5E 05 LD E,(IX+05) ;E = 3. Byte des NEXT-Wertes 4B11 57 LD D,A ;D-00 4B12 19 ADD HL,DE ;HL auf nächstes Byte im Buffer setzen 4B13 DD 34 05 INC (IX+05) ;3. Byte des NEXT-Feldes +1 4B16 C9 RET -------------------------- Umleitung eines DCB’s durch ROUTE 4B17 7E LD A,(HL) ;HL = RCB+O (Route-Control-Block) 4B18 BB CP E ;ist in diesem RCB 4B19 23 INC HL ;eine Umleitung 4B1A 20 02 JR NZ,4B1E ;für den DCB 4B1C 7E LD A,(HL) ;eingetragen, 4B1D BA CP D ;auf den DE 4B1E 23 INC HL ;gerade zeigt ? 4B1F 20 1A JR NZ,4B3B ;wenn nein -------------------------- 4B21 E5 PUSH HL ;wenn ja: 4B22 D5 PUSH DE ;Register retten 4B23 C5 PUSH BC 4B24 7E LD A,(HL) ;Original DCB-Typ holen 4B25 A0 AND B 4B26 23 INC HL 4B27 23 INC HL 4B28 23 INC HL 4B29 5E LD E,(HL) ;Adresse des DCB nach 4B2A 23 INC HL ;DE holen, auf den 4B2B 56 LD D,(HL) ;umgeleitet werden soll 4B2C D5 PUSH DE 4B2D DD E1 POP IX ;DCB-Adresse nach IX 4B2F CD D4 03 CALL 03D4 ;Umleitung aufrufen 4B32 C1 POP BC ;Register zurück 4B33 D1 POP DE 4B34 E1 POP HL -------------------------- Sind -für diesen DCB mehrere Umleitungen angelegt ? 4B35 CB 40 BIT 0,B ;wurde ein OutputHDCB umgeleitet ? 4B37 28 02 JR Z,4B3B ;wenn ja 4B39 B7 OR A ;Input-DCB: ist ein Zeichen vorhanden ? 4B3A C0 RET NZ ;wenn ja 4B3B 23 INC HL ;Zeiger 4B3C 7E LD A,(HL) ;auf Kapitel 3: SYSO/SYS Seite 3-48 -------------------------------------------------------------------------------- 4B3D 23 INC HL ;weitere 4B3E 66 LD H,(HL) ;RGB’s 4B3F 6F LD L,A ;nach HL 4B40 7C LD A,H ;sind weitere RGB’s 4B41 B5 OR L ;zu bearbeiten ? 4B42 20 D3 JR NZ,4B17 ;wenn ja 4B44 C3 F8 4C JP 4CF8 ;wenn nein ****************************************************** * Name: POSRBA (Fortsetzung von 444EH) * * Funktion: NEXT-Feld im FCB so positionieren, wie * * in HL und C im RBA-Format angegeben ist * * Input: DE: zeigt auf geöffneten FCB * * HL: 1. und 2. Byte für NEXT-Feld * * C: 3. Byte für NEXT-Feld * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4B47 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY*4380, A=00 4B4A 18 34 JR 4B80 ;NEXT-Feld auf HLC setzen ****************************************************** * Name: POSO (Fortsetzung von 443FH) * * Funktion: NEXT -Feld im FCB auf Beginn der File * * positionieren * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4B4C CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 4B4F 67 LD H,A ;H=00 4B50 6F LD L,A ;L=00 4B51 4F LD C,A ;C=00 4B52 18 3C JR 4B90 ;NEXT-Feld auf HLC setzen ****************************************************** * Name: P0SE0F (Fortsetzung von 4448H) * * Funktion: NEXT-Feld im FCB auf EOF (End of File) * * positionieren * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** 4B54 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 4B57 DD 4E 08 LD C,(IX+08) ;C = EOF-Wert 3. Byte 4B5A DD 6E OC LD L,(IX+OC) ;L = EOF-Wert 2. Byte 4B5D DD 66 OD LD H,(IX+OD) ;H = EOF-Wert 1. Byte 4B60 18 22 JR 4B84 ;NEXT-Feld auf HLC setzen ****************************************************** * Name: POSDEC (Fortsetzung von 4445H) * * Funktion: NEXT-Feld im FCB um 1 Logische Record# * * decrementieren (-1) * * Input: DE: zeigt auf geöffneten FCB * * Verändert: -- * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Kapitel 3: SYSO/SYS Seite 3-49 -------------------------------------------------------------------------------- 4B62 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY= 4380, A=00 4B65 CD 68 49 CALL 4968 ;HLC = NEXT-Wert 4B68 AF XOR A 4B69 DD 96 09 SUB (IX+09) ;Logische Recordlänge (LRL) 4B6C 81 ADD C ;vom 3. Byte des 4B6D 4F LD C,A ;NEXT-Wert.es abziehen 4B6E 38 10 JR C,4B80 ;wenn kein übertrag 4B70 2B DEC HL ;wenn übertrag 4B71 18 OD JR 4B80 ;NEXT-Feld auf HLC setzen ****************************************************** * Name: POSBC (Fortsetzung von 4442H) * * Funktion: NEXT-Feld im FCB auf die in BC ange- * * gebene Logische Record# positionieren * * Input: DE: zeigt auf geöffneten FCB * * BC: gewünschte Logische Record# * * Verändert: -- * * Output: AF: A=Feh1ercode, wenn Z=0 * ****************************************************** 4B73 CD 80 49 CALL 4980 ;PUSH Register, IX=FCB, IY=4380, A=00 4B76 60 LD H,B ;gewünschte logische 4B77 69 LD L,C ;Record# nach HL 4B78 DD 7E 09 LD A,(IX+09) ;Logische Recordlänge (LRL) 4B7B B7 OR A ;= 0 ? 4B7C 4F LD C,A ;nach C 4B7D C4 9D 4C CALL NZ,4C9D ;wenn <>0: MULT: HLC = HL*A -------------------------- NEXT-Feld auf HLC setzen 4B80 DD CB 01 F6 SET 6 , (IX+01) ;der EOF-Wert soll nach dem Schreiben ;nur dann auf den NEXT-Wert gesetzt ;werden, wenn dieser größer als der ;EOF-Wert ist - wozu ??? 4B84 7C LD A,H ;prüfen, ob der 4B85 DD BE OB CP (IX+0B) ;Sector des gewünschten 4B88 20 06 JR NZ,4B90 ;NEXT-Wertes mit dem 4B8A 7D LD A,L ;aktuellen Sector 4B8B DD BE OA CP (IX+0A) ;übereinstimmt 4B8E 28 11 JR Z,4BA1 ;wenn ja -------------------------- Gewünschter NEXT-Wert liegt in einem neuen Sector 4B90 E5 PUSH HL ;HLC retten 4B91 C5 PUSH BC ;(gewünschter NEXT-Wert) 4B92 CD 62 4A CALL 4A62 ;wenn notwendig, alten Buffer -Inhalt ;auf Diskette schreiben 4B95 C1 POP BC ;HLC zurück 4B96 E1 POP HL ;(gewünschter NEXT-Wert) 4B97 C0 RET NZ ;wenn Error 4B98 CD 13 4A CALL 4A13 ;vermerken, daß der aktuelle Sector ;noch nicht im Buffer steht 4B9B DD 75 0A LD (IX+0A),L ;2. Byte des NEXT-Feldes = L 4B9E DD 74 0B LD (IX+0B),H ;1. Byte des NEXT-Feldes * H 4BA1 DD 71 05 LD (IX+05),C ;3. Byte des NEXT-Feldes = C 4BA4 AF XOR A ;kein Error 4BA5 C9 RET ;nach 49A8: POP Register und RET Kapitel 3: SYSO/SYS Seite 3-50 -------------------------------------------------------------------------------- ****************************************************** * Name: TEXTTV (Fortsetzung von 4467H) * * Funktion: Text (HL) auf Bildschirm ausgeben * * Input: HL: zeigt auf Text, Ende * 03H oder ODH * * Verändert: AF * * Output: -- * ****************************************************** 4BA6 D5 PUSH DE ;DE retten 4BA7 11 ID 40 LD DE,401D ;Zeiger auf Bildschirm-DCB 4BAA E5 PUSH HL ;HL retten 4BAB 7E LD A,(HL) ;nächstes Zeichen holen 4BAC FE 03 CP 03 ;Textende ? 4BAE 28 09 JR Z,4BB9 ;wenn ja 4BB0 CD 1B 00 CALL 001B ;Zeichen ausgeben 4BB3 7E LD A,(HL) ;ausgegebenes Zeichen 4BB4 FE 0D CP 0D ;Textende ? 4BB6 23 INC HL ;Zeiger +1 4BB7 20 F2 JR NZ,4BAB ;wenn nein, weiter 4BB9 E1 POP HL ;HL zurück 4BBA D1 POP DE ;DE zurück 4BBB C9 RET ****************************************************** * Name: TEXTLP (Fortsetzung von 446AH) * * Funktion: Text (HL) auf Drucker ausgeben * * Input: HL: zeigt auf Text, Ende = 03H oder ODH * * Verändert: AF * * Output: -- * ****************************************************** 4BBC D5 PUSH DE ;DE retten 4BBD 11 25 40 LD DE,4025 ;Zeiger auf Drucker-DCB 4BC0 18 E8 JR 4BAA ;weiter bei 4BAA -------------------------- RST 28H: BREAK-Taste und /SYS-Files laden 4BC2 33 INC SP ;RETURN-Addresse im 4BC3 33 INC SP ;Stack vergessen 4BC4 FE 20 CP 20 ;ist A < 20H ? 4BC6 DA 12 43 JP C,4312 ;wenn ja: BREAK-Taste ****************************************************** * Name: GETSYS * * Funktion: SYS-File (A) laden und starten * * Input: A: Code für SYS-File (siehe Text) * * Verändert: HL, DE, BC * * Output: AF: A=Fehlercode, wenn Z=0 * ****************************************************** Die SYS-File, die durch Register A angegeben ist, wird geladen (falls sie nicht schon im Speicher steht) und gestartet, wobei alle Register unverändert übergeben werden. Das Format des 8-Bit-Registers A ist xxxbbsss, wobei bbsss-2 die gewünschte SYS-File (SYS1 - SYS29) bestimmt, indem sss+2 angibt, im wievielten Sector des Directory der FPDE dieser SYS-File enthalten ist bb angibt, der wievielte FPDE in diesem Directory-Sector der gesuchte FPDE ist und xxx eine von evtl, mehreren Funktionen auswählt, die diese SYS-File enthält. Bei mehr als 7 möglichen Funktionen wird zusätzlich Kapitel 3: SYSO/SYS Seite 3-51 -------------------------------------------------------------------------------- Register C zur Auswahl bestimmter Funktionen benutzt. Falls die ausgewählte Funktion mit einem RETURN endet, kehrt GETSYS zu seinem Aufrufer zurück (jedoch nicht zum Aufrufer eines RST 28H, sondern 1 Ebene höher) und übergibt alle Register so, wie sie durch die ausge­ wählte Funktion gesetzt wurden. Es gibt aber auch Funktionen, die nicht mit einem RETURN, sondern mit einem Sprunq nach DOSRDY (402DH), ERRORO (4030H) oder DOSERR (4409H) enden. 4BC9 E5 PUSH HL ;HL retten 4BCA D5 PUSH DE ;DE retten 4BCB C5 PUSH BC ;BC retten 4BCC F5 PUSH AF ;AF retten 4BCD 21 69 43 LD HL,4369 ;Bit 6,(4369) setzen (dann sind ’JKL’, 4BD0 CB F6 SET 6,(HL) ;’DFG’, ’123’ und CHAINING verboten) 4BD2 21 BE 45 LD HL,45BE ;Abfrage von ' JKL’, * DFG’ und ’123’ 4BD5 36 00 LD (HL),00 ;erlauben - wozu ? 4BD7 FB EI ;Interrupts erlauben 4BD8 E6 1F AND 1F ;Bits 4-0 (benötigte SYS-File) maskieren 4BDA 21 17 43 LD HL,4317 ;Zeiger auf zuletzt geladene SYS-File 4BDD BE CP (HL) ;ist die benötigte SYS-File im Speicher? 4BDE 28 39 JR Z,4C19 ;wenn ja -------------------------- SYS-File muß geladen werden 4BE0 77 LD (HL),A ;neue SYS-File vermerken 4BE1 E6 07 AND 07 ;benötigten DIR-Sector maskieren 4BE3 4F LD C,A ;und in C merken 4BE4 AF XOR A ;NEXT-Wert bei FCB+OA 4BE5 32 D8 43 LD (43D8),A ;auf 0 setzen 4BE8 CD 76 47 CALL 4776 ;Drive 0 auswählen und Motor starten 4BEB 7E LD A,(HL) ;DEC (Directory Entry Code) 4BEC 91 SUB C ;der gewünschten 4BED 07 RLCA ;SYS-File berechnen 4BEE 07 RLCA ;Format: ObbOOsss 4BEF 81 ADD C ;(siehe oben) 4BF0 CD 36 49 CALL 4936 ;benötigten DIR-Sector nach 4200H ;einlesen und HL auf FPDE+0 setzen 4BF3 20 19 JR NZ,4C0E ;wenn Error 4BF5 CB 76 BIT 6,(HL) ;gehört dieser FPDE zu einer SYS-File ? 4BF7 28 15 JR Z,4C0E ;wenn nein, Error ********* FEHLER! Es wird überhaupt nicht geprüft, ********* ********* ob die SYS-File evtl. gelöscht ist ! ********* 4BF9 C6 16 ADD 16 ;HL auf FPDE+16H 4BFB 6F LD L,A ;setzen 4BFC 5E LD E,(HL) ;die Angaben darüber, wo der 4BFD 23 INC HL ;1. Datenblock dieser SYS-File 4BFE 56 LD D,(HL) ;auf Diskette steht, von FPDE+16H 4BFF ED 53 DC 43 LD (43DC),DE ;nach FCB+OE übertragen 4C03 21 CE 43 LD HL,43CE ;HL = FCB zum Laden von SYS-Files 4C06 CD 28 4C CALL 4C28 ;SYS-File laden 4C09 22 IE 4C LD (4C1E),HL ;Startadresse der SYS-File nach 4C1E 4C0C 28 OB JR Z,4C19 ;wenn kein Error -------------------------- Fehlerbehandlung 4C0E 3A 17 43 LD A,(4317) ;sollte SYS4/SYS 4C11 FE 06 CP 06 ;geladen werden ? 4C13 3E 2E LD A,2E ;Fehlercode “SYSTEM PROGRAM NOT FOUND" 4C15 C2 09 44 JP NZ,4409 ;wenn nein 4C18 76 HALT ;NMI auslösen (nicht mask. Interrupt) -------------------------- Kapitel 3: SYSO/SYS Seite 3-52 -------------------------------------------------------------------------------- SYS--File starten 4C19 F1 POP AF ;AF zurück 4C1A C1 POP BC ;BC zurück 4C1B D1 POP DE ;DE zurück 4C1C E1 POP HL ;HL zurück 4C1D CD*00*00 CALL 0000 ;SYS-File starten -------------------------- Wenn die SYS-Fi1e zurückkehrt 4C20 E5 PUSH HL ;HL retten 4C21 21 69 43 LD HL,4369 ;Bit 6,(4369) löschen (Verbot für ’JKL', 4C24 CB B6 RES 6,(HL) ;’DFG’, ’123’ und CHAINING aufheben) 4C26 E1 POP HL ;HL zurück 4C27 C9 RET ****************************************************** * Name: LOADP * * Funktion: Programm laden * * Input: HL: zeigt auf geöffneten FCB * * Verändert: DE, BC * * Output: AF: A=Fehlercode, wenn Z=0 * * HL: Startadresse des Programms * ****************************************************** Das zu ladende Programm muß im Standard-Format für LOAD-Files auf Diskette stehen. Dieses Format besteht aus mehreren Blocks, die jeweils mit einem Steuer—Code beginnen, der angibt, wieviele Daten folgen und was mit diesen zu geschehen hat: a) Steuer-Code 01H: Es folgen 1 Längen-Byte, eine Adresse (LSB, MSB) und soviele Daten, wie das um 2 verminderte Längen-Byte angibt. Die Daten sind im RAM ab der angegebenen Adresse abzulegen. b) Steuer-Code 02H: Es folgen 1 Byte ohne Bedeutung und die Start­ adresse (LSB, MSB), bei der das Programm zu starten ist. Damit ist das Ende der File erreicht. c) Steuer-Code 00H oder 03H bis 1FH: Es folgen 1 Längen-Byte und soviele Daten, wie das Längen-Byte angibt. Diese Daten sind nur ein Kommentar und brauchen nirgendwo abgespeichert zu werden. Zum Laden benutzt das DOS seinen eigenen Sector-Buffer (4200H-42FFH). 4C28 22 6A 4C LD (4C6A),HL ;FCB retten 4C2B 11 FF 42 LD DE,42FF ;Zeiger auf Ende des Sector-Buffers -------------------------- Steuer--Code lesen 4C2E CD 65 4C CALL 4C65 ;nächstes Byte lesen 4C31 4F LD C,A ;C = 1. Byte 4C32 3E 1F LD A,1F ;ist das 1. Byte 4C34 B9 CP C ;größer als 1FH ? 4C35 3E 22 LD A,22 :Fehlercode "LOAD FILE FORMAT ERROR" 4C37 D8 RET C ;wenn ja 4C38 CD 65 4C CALL 4C65 ;nächstes Byte lesen 4C3B 47 LD B,A ;B = 2. Byte 4C3C CD 65 4C CALL 4C65 ;nächstes Byte lesen 4C3F 6F LD L,A ;L = 3. Byte 4C40 61 LD H,C ;H - 1. Byte 4C41 0D DEC C ;Steuer-Code 01H ? 4C42 28 09 JR Z,4C4D ;wenn ja 4C44 0D DEC C ;Steuer-Code 02H ? -------------------------- 4C45 20 1A JR NZ,4C61 ;wenn Steuer-Code <> 02H, dann 4C61: ;H hat einen Wert zwischen 00 und 1F, ;somit werden Kommentare über das Kapitel 3: SYSO/SYS Seite 3-53 -------------------------------------------------------------------------------- ;BASIC-ROM geladen' -------------------------- Steuer-Code 02H: 4C47 CD 65 4C CALL 4C65 ;4. Byte nach H lesen 4C4A 67 LD H,A ;HL = Startadresse 4C4B AF XOR A ;kein Error 4C4C C9 RET -------------------------- Steuer-Code 01H: 4C4D CD 65 4C CALL 4C65 ;4. Byte nach H lesen 4C50 67 LD H,A ;HL zeigt auf zu ladenden Speicher 4C51 05 DEC B ;Längen-Byte 4C52 05 DEC B ;um 2 vermindern 4C53 CD 65 4C CALL 4C65 ;nächstes Byte lesen FC56 77 LD (HL),A ;im Speicher ablegen 4C57 BE CP (HL) ;ist dort RAM vorhanden ? 4C58 23 INC HL ;Zeiger auf Speicher +1 4C59 28 06 JR Z,4C61 ;wenn ja 4C5B 3E 24 LD A,24 ;Fehler "TRIED TO LOAD READ ONLY MEMORY" 4C5D 0C INC C ;Steuer-Code 01H oder 4C5E 0D DEC C ;Kommentar ? 4C5F 28 62 JR Z,4CC3 ;wenn Steuer-Code 01H: Error 4C61 10 F0 DJNZ 4C53 ;Block zu Ende ? 4C63 18 C9 JR 4C2E ;wenn ja: nächsten Block bearbeiten -------------------------- Nächstes Byte der File holen 4C65 1C INC E ;Zeiger auf Buffer +1 4C66 1A LD A,(DE) ;nächstes Byte aus dem Buffer holen 4C67 C0 RET NZ ;wenn Buffer noch nicht zu Ende 4C68 D5 PUSH DE ;DE retten 4C69 11*00*00 LD DE,0000 ;DE mit FCB laden 4C6C CD 36 44 CALL 4436 ;nächsten Sector lesen 4C6F D1 POP DE ;DE zurück 4C70 20 29 JR NZ,4C9B ;wenn Error: POP BC + RET 4C72 1A LD A,(DE) ;1. Byte aus dem Buffer holen 4C73 C9 RET ****************************************************** * Name: DIRPOS * * Funktion: Position eines DIR-Sectors berechnen * * Input: A: gibt an, um den wievielten Sector * * innerhalb des Directory (beginnend * * ab 0) es sich handelt * * Verändert: AF, BC * * Output: DE: gesuchte Sector# (Disk-relativ) * * HL: Buffer für DIR-Sectoren (4200H) * ****************************************************** DIRPOS berechnet, der wievielte Sector innerhalb einer Diskette (beginnend ab 0) ein bestimmter Directory-Sector ist. Zuvor muß durch DRVSEL (445BH) oder TSTDSK (445EH) das gewünschte Laufwerk ausgewählt worden sein. DIRPOS ist scheinbar etwas "merkwürdig" programmiert, weils es auch zum Berechnen der disk-relativen Sector# eines bestimmten Sectors aus einer File benutzt wird. 4C74 32 30 49 LD (4930),A ;gewünschte DIR-Sector# bei 4930 merken 4C77 1E 00 LD E,00 ;E = 00 4C79 2A 99 43 LD HL,(4399) ;Zeiger auf PDRIVE-Block 4C7C 4F LD C,A ;C = gewünschte DIR-Sector# 4C7D 6E LD L,(HL) ;L = LUMP# vom Beginn des Directory Kapitel 3: SYSO/SYS Seite 3-54 -------------------------------------------------------------------------------- 4C7E 3A 0F 43 LD A,(430F) ;A = GPL (Grans pro Lump) 4C81 CD 92 4C CALL 4C92 ;MULT: HL = L * A, A = Überlauf 4C84 47 LD B,A ;B = Überlauf 4C85 57 LD D,A ;D = Überlauf 4C86 19 ADD HL,DE ;HL = GRAN# vom Beginn des Directory 4C87 3E 05 LD A,05 ;Anzahl Sectoren pro Gran = 5 4C89 CD 94 4C CALL 4C94 ;MULT: HL = L * A, A = Überlauf 4C8C 09 ADD HL,BC ;HL = Sector# des gesuchten Sectors 4C8D EB EX DE,HL ;DE = Sector# des gesuchten Sectors 4CBE 21 00 42 LD HL,4200 ;HL = Buffer für DIR-Sectoren 4C91 C9 RET ****************************************************** * Name: MULTL * * Funktion: Multipliziere L * A * * Input: L: 1. Faktor * * A: 2. Faktor * * Verändert: F * * Output: A=00, HL=Ergebnis * ****************************************************** 4C92 26 00 LD H,00 ;H=00 ****************************************************** * Name: MULTHL * * Funktion: Multipliziere HL * A * * Input: HL: 1. Faktor (-falsche Ergebnisse ab * * A: 2. Faktor HL > 8080H) ! * * Verändert: F * * Output: AHL (Ergebnis = 65536D t A + HL) * ****************************************************** 4C94 C5 PUSH BC ;BC retten 4C95 CD 9D 4C CALL 4C9D ;MULT: HLC = HL * A 4C98 7C LD A,H ;A = Ergebnis * 65536D 4C99 65 LD H,L ;H = Ergebnis * 256D 4C9A 69 LD L,C ;L = Ergebnis * 1 4C9B C1 POP BC ;BC zurück 4C9C C9 RET ****************************************************** * Name: MULTC * * Funktion: Multipliziere HL * A * * Input: HL: 1. Faktor (-falsche Ergebnisse ab * * A: 2. Faktor HL > 8080H) ! * * Verändert: F * * Output: HLC (Ergebnis = 256D * HL + C) * ****************************************************** 4C9D D5 PUSH DE ;DE retten 4C9E EB EX DE,HL ;1. Faktor nach DE 4C9F 0E 80 LD C,80 ;Zähler für 8 Runden 4CA1 21 00 00 LD HL,0000 ;Ergebnis mit 0 vorbesetzen 4CA4 0F RRCA ;jeweils Bit 0,A testen 4CA5 30 01 JR NC,4CA8 ;wenn nicht gesetzt 4CA7 19 ADD HL,DE ;Ergebnis + 1. Faktor 4CA8 CB 3C SRL H ;HLC 4CAA CB 1D RR L ;durch 2 4CAC CB 19 RR C ;teilen 4CAE 30 F4 JR NC,4CA4 ;wenn noch keine 8 Runden Kapitel 3: SYSO/SYS Seite 3-55 -------------------------------------------------------------------------------- 4CB0 D1 POP DE ;DE zurück 4CB1 C9 RET ****************************************************** * Name: DIV05 * * Funktion: Dividiere HL / 05 (# Sectoren pro Gran) * * Input: HL: Dividend * * Verändert: C=Divisor, B=00 * * Output: HL: Quotient = INT(HL/5) * * AF: A = Rest, wenn Z=0 * ****************************************************** 4CB2 3E 05 LD A,05 ;Anzahl Sectoren pro Gran = 5 ****************************************************** * Name: DIVA * * Funktion: Dividiere HL / A * * Input: HL: Dividend * * A: Divisor * * Verändert: C=Divisor, B=00 * * Output: HL: Quotient = INT(HL/A) * * AF: A = Rest, wenn Z=0 * ****************************************************** 4CB4 4F LD C,A ;C * Divisor 4CB5 06 10 LD B,10 ;Zähler für 16D Runden 4CB7 AF XOR A ;Rest mit 0 vorbesetzen 4CB8 29 ADD HL,HL ;jeweils Bit 15D,HL testen 4CB9 17 RLA ;und nach Bit 0,A übertragen 4CBA 38 03 JR C,4CBF ;wenn Bit 7,A gesetzt 4CBC B9 CP C ;mit Divisor vergleichen 4CBD 38 JR C,4CC1 ;wenn A < Divisor 4CBF 91 SUB C ;Divisor subtrahieren 4CC0 2C INC L ;Ergebnis +1 4CC1 10 F5 DJNZ 4CB8 ;wenn noch keine 16D Runden 4CC3 B7 OR A ;2=1 wenn Rest=00 4CC4 C9 RET ****************************************************** * Name: CPBCHL * * Funktion: Vergleiche Texte (BC) und (HL) * * Input: BC: Textl (Ende = 00H) * * HL: Text2 (ohne Ende-Markierung) * * Verändert: BC * * Output: a) wenn Textl = Text2: * * A-00., Z=1, HL =Ende von Text2 * * b) wenn Textl <> Text2: * * A=34,, Z=0, HL ist unverändert * ****************************************************** 4CC5 E5 PUSH HL ;HL (Zeiger auf Text2) retten 4CC6 0A LD A,(BC) ;nächstes Zeichen von Text1 holen 4CC7 B7 OR A ;Ende-Markierung ? 4CC8 03 INC BC ;Zeiger auf Textl +1 4CC9 20 03 JR NZ,4CCE ;wenn nein 4CCB E3 EX (SP),HL ;wenn ja (Textl * Text2): 4CCC E1 POP HL ;2 * INC SP 4CCD C9 RET ;fertig 4CCE BE CP (HL) ;Text1 mit Text2 vergleichen 4CCF 23 INC HL ;Zeiger auf Text2 +1 Kapitel 3: SYSO/SYS Seite 3-56 -------------------------------------------------------------------------------- 4CD0 28 F4 JR Z,4CC6 ;wenn gleich: weiter 4CD2 E1 POP HL ;HL zurück 4CD3 18 14 JR 4CE9 ;weiter bei 4CE9: A=34, Z=0, RET ****************************************************** * Name: NEXTC1 * * Funktion: Nächstes Zeichen von (HL) holen und * * in Abhängigkeit vom Inhalt Flags setzen * * Input: HL: Zeiger auf Text (z. B. Input-Buffer)* * Verändert: -- * * Output: HL, AF (siehe Text) * ****************************************************** In Abhängigkeit von dem Zeichen, au-f das HL gerade zeigt, werden HL, A, sowie die Flags Z (Zero) und C (Carry) -folgendermaßen gesetzt: Zeichen Z C A HL zeigt auf ------------------------------------------------------- 0DH (ENTER) Z NC 0DH unverändert 2CH (Komma) NZ NC 34H 1. Zeichen nach dem Komma 20H (Blank) NZ NC 34H 1. Zeichen, das ggf. mehreren Blanks folgt Rest NZ NC 34H unverändert 4CD5 7E LD A,(HL) ;Zeichen holen 4CD6 FE 0D CP 0D ;= 0DH ? 4CD8 C8 RET Z ;wenn ja ****************************************************** * Name: NEXTC2 * * Funktion: Nächstes Zeichen von (HL) holen und * * in Abhängigkeit vom Inhalt Flags setzen * * Input: HL: Zeiger auf Text (z. B. Input-Buffer)* * Verändert: -- * * Output: HL, AF (siehe Text) * ****************************************************** In Abhängigkeit von dem Zeichen, auf das HL gerade zeigt, werden HL, A, sowie die Flags Z (Zero) und C (Carry) folgendermaßen gesetzt: Zeichen Z C A HL zeigt auf ------------------------------------------------------- 2CH (Komma) NZ NC 34H 1. Zeichen nach dem Komma 20H (Blank) NZ NC 34H 1. Zeichen, das ggf. mehreren Blanks folgt Rest NZ C 34H unverändert 4CD9 7E LD A,(HL) ;Zeichen holen 4CDA FE 2C CP 2C ;= Komma (,) ? 4CDC 23 INC HL ;Zeiger +1 4CDD 28 OA JR Z,4CE9 ;wenn ja 4CDF FE 20 CP 20 ;= Blank ? 4CE1 2B DEC HL ;Zeiger -1 4CE2 37 SCF ;C-Flag setzen 4CE3 20 05 JR NZ,4CEA ;wenn nein 4CE5 23 INC HL ;Zeiger +1 4CE6 BE CP (HL) ;Blank ? 4CE7 28 FC JR Z,4CE5 ;wenn ja 4CE9 B7 OR A ;Flags Z=0 und C-0 4CEA 3E 34 LD A,34 ;Fehlercode "ILLEGAL KEYWORD OR 4CEC C9 RET ; SEPARATOR OR TERMINATOR" Kapitel 3: SYSO/SYS Seite 3-57 -------------------------------------------------------------------------------- ****************************************************** * Name: DELAY2 * * Funktion: ca. B * 3.75 ms warten * * Input: B: Zeitfaktor * * Verändert: DE, BC, AF * * Output: -- * ****************************************************** 4CED 50 LD D,B ;B (Zeitfaktor) retten 4CEE 1E*01 LD E,01 ;SYSTEM BJ (CPU Speed) 4CF0 42 LD B,D ;B (Zeitfaktor) zurück 4CF1 CD 60 00 CALL 0060 ;Verzögerung B * 3.75 ms (1.774 MHz) 4CF4 1D DEC E ;schon SYSTEM BJ mal ? 4CF5 20 F9 JR NZ,4CF0 ;wenn nein 4CF7 C9 RET -------------------------- Hilfsroutine für DOS--Befehl ROUTE 4CF8 CB 40 BIT 0,B ;DCB für Input oder Output ? 4CFA C0 RET NZ ;wenn Input 4CFB 79 LD A,C ;wenn Output: Zeichen zurück 4CFC C9 RET -------------------------- (4CFC C9) DCB für ROUTE ’NL’ 4CFD A4 4B ;DCB-Typ 4CFF 00 ;Treiberadresse ;./. -------------------------- Initialisierung von SYSO/SYS 4D00 A5 ;Stackpointer steht auf 41E0 4D01 ED 56 ;Kennung von NEWD0S/80 und GD0S IM 1 ;Interrupts über RST 38H -------------------------- Ende des RAM ab FFFFH abwärts suchen 4D03 21 FF FF LD HL,FFFF ;Zeiger auf FFFFH 4D06 7E LD A,(HL) ;Speicherinhalt lesen 4D07 2F CPL ;alle Bits invertieren 4D08 77 LD (HL),A ;und zurückschreiben 4D09 BE CP (HL) ;RAM vorhanden ? 4D0A 2B DEC HL ;Zeiger -1 4D0B 20 F9 JR NZ,4D06 ;wenn nein 4D0D 2F CPL ;alten 4D0E 23 INC HL ;Speicherinhalt 4D0F 77 LD (HL),A ;zurückschreiben 4D10 22 A9 43 LD (43A9),HL ;höchste RAM-Adresse nach 43A9 4D13 22 49 40 LD (4049),HL ;und nach 4049 (HIMEM) -------------------------- Uhrzeit + Datum nach 4041-4046 zurück 4D16 21 AB 43 LD HL,43AB ;war NEWD0S/80 oder GDOS 4D19 3E A5 LD A,A5 ;schon vor dem 4D1B BE CP (HL) ;RESET aktiv ? 4D1C 20 09 JR NZ,4D27 ;wenn nein 4D1E 23 INC HL ;wenn ja: 4D1F 11 41 40 LD DE,4041 ;Uhrzeit + Datum 4D22 01 06 00 LD BC,0006 ;aus dem Buffer 43AC-43B1 4D25 ED BO LDIR ;nach 4041-4046 übertragen -------------------------- PDRIVE­-Sector von Drive 0 laden 4D27 FD 21 80 43 LD IY,4380 ;Zeiger auf 4300 - 43FF Kapitel 3: SYSO/SYS Seite 3-58 -------------------------------------------------------------------------------- 4D2B ED 4B FE 42 LD BC,(42FE) ;PDRIVE-Parameter aus dem BOOT-Sector 4D2F FD 70 F8 LD (IY+F8),B ;4378 = PDRIVE+7 für Drive 0 4D32 FD 71 F3 LD (IY+F3),C ;4373 = PDRIVE+2 für Drive 0 4D35 3A FD 42 LD A,(42FD) ;PDRIVE-Parameter aus dem BOOT-Sector 4D38 FD 77 F7 LD (IY+F7),A ;4377 = PDRIVE+6 für Drive 0 ********** FEHLER! Das Lesen des PDRIVE-SECTORS erfolgt ********** ********** mit den Zeitkonstanteni für SYSTEM BJ=1 ********** 4D3B 11 80 44 LD DE,4480 ;DE auf FCB (File Control Block) 4D3E CD 36 44 CALL 4436 ;READ PDRIVE-Sector nach 4200 4D41 C2 D3 4D JP NZ,4DD3 ;wenn Error aufgetreten 4D44 3A EF 42 LD A,(42EF) ;Kennzeichnung für den 4D47 FE A5 CP A5 ;PDRIVE-Sector vorhanden ? 4D49 C2 D1 4D JP NZ,4DD1 ;wenn nein, Error -------------------------- Auswertung der SYSTEM-Parameter aus dem PDRIVE-Sector 4D4C 21 F8 42 LD HL,42F8 ;SYSTEM-Parameter von 4D4F 11 5B 50 LD DE,505B ;42F8-42FF nach 4D52 01 08 00 LD BC,0008 ;505B-5062 4D55 ED B0 LDIR ;Zwischenspeichern 4D57 2A F0 42 LD HL,(42F0) ;(436C) = (PDRIVE-Sector Byte F0) 4D5A 22 6C 43 LD (4360),HL ;(436D) = (PDRIVE-Sector Byte F1) 4D5D 2A F2 42 LD HL,(42F2) ;(436E) = (PDRIVE-Sector Byte F2) 4D60 22 6E 43 LD (436E),HL ;(436F) = (PDRIVE-Sector Byte F3) -------------------------- 4D63 3A A0 42 LD A,(42A0) ;SYSTEM AL (Anzahl Drives) 4D66 32 9F 43 LD (439F),A ;nach 439F 4D69 32 7A 47 LD (477A),A ;und 477A 4D6C 3D DEC A ;wenn AL < 1 4D6D FE 04 CP 04 ;oder > 4 ist 4D6F 30 60 JR NC,4DD1 ;dann Error -------------------------- 4D71 3A A1 42 LD A,(42A1) ;SYSTEM AW (Wiederhol, b. Verify-Errors) 4D74 32 BA 4A LD (4ABA),A ;nach 4ABA 4D77 3A A2 42 LD A,(42A2) ;SYSTEM AN (Drive# für DIR) 4D7A 32 A0 43 LD (43A0),A ;nach 43A0 4D7D 3A A3 42 LD A,(42A3) ;SYSTEM A0 (Drive# f. CREATE neue Files) 4D80 32 A1 43 LD (43A1),A ;nach 43A1 4D83 3A A6 42 LD A,(42A6) ;SYSTEM AM (Wiederhol, bei Disk-Errors) 4D86 32 5A 46 LD (465A),A ;nach 465A -------------------------- 4D89 3A A9 42 LD A,(42A9) ;SYSTEM BJ (CPU Speed) 4D8C 32 A2 43 LD (43A2),A ;nach 43A2 4D8F 32 EF 4C LD (4CEF),A ;und 4CEF 4D92 2E 06 LD L,06 ;1. Multiplikations-Faktor für BJ 4D94 11 00 24 LD DE,2400 ;2. Multiplikations-Faktor für BJ 4D97 F5 PUSH AF ;A = SYSTEM BJ 4D98 CD 92 4C CALL 4C92 ;MULT: HL = L * A 4D9B B4 OR H ;HL > 255D ? 4D9C 20 33 JR NZ,4DD1 ;wenn ja, Error 4D9E 7D LD A,L ;Ergebnis: 6 * BJ 4D9F 32 E4 47 LD (47E4),A ;nach 47E4 4DA2 F1 POP AF ;A * SYSTEM BJ 4DA3 EB EX DE,HL ;HL = 2. Multiplikations-Faktor 2400H 4DA4 CD 94 4C CALL 4C94 ;MULT: HL * HL * A, A = Überlauf 4DA7 B7 OR A ;überlauf ? 4DA8 20 27 JR NZ,4DD1 ;wenn ja. Error 4DAA 22 F4 47 LD (47F4),HL ;Ergebnis: 2400H * BJ nach 47F4,47F5 -------------------------- 4DAD 3A A8 42 LD A,(42A8) ;SYSTEM AX (höchster Drueker-ASCII-Code) 4DB0 32 70 43 LD (4370),A ;nach 4370 Kapitel 3: SYSO/SYS Seite 3-59 -------------------------------------------------------------------------------- -------------------------- 4DB3 2A 49 40 LD HL,(4049) ;HL = (HIMEM) 4DB6 ED 5B DO 42 LD DE,(42D0) ;DE = SYSTEM AP (HIMEM) 4DBA 7A LD A,D ;ist SYSTEM AP 4DBB B3 OR E ; = OOOOH ? 4DBC 28 06 JR Z,4DC4 ;wenn ja 4DBE B7 OR A ;ansonsten: 4DBF ED 52 SBC HL,DE ;ist SYSTEM AP > HIMEM ? 4DC1 38 01 JR C,4DC4 ;wenn ja 4DC3 EB EX DE,HL ;HL = SYSTEM AP 4DC4 22 49 40 LD (4049),HL ;nach HIMEM speichern -------------------------- Auswertung der PDRIVE-Parameter aus dem PDRIVE-Sector 4DC7 AF XOR A ;Zähler = 0 4DC8 11 71 43 LD DE,4371 ;Zeiger aut 1. PDRIVE-Block im RAM 4DCB DD 21 00 42 LD IX,4200 ;Zeiger au-f 1. PDRIVE-Block im But-fer 4DCF 18 06 JR 4DD7 ;weiter bei 4DD7 -------------------------- Fehlerbehandlung 4DD1 3E 27 LD A,27 ;Fehlercode “ILLEGAL INITIALISATION DATA ;ON SYSTEM DISKETTE" 4DD3 F5 PUSH AF ;Fehlercode retten 4DD4 3E 46 LD A,46 ;Code für SYS4/SYS 4DD6 EF RST 28 ;SYS-File laden und starten -------------------------- Fortsetzung: Auswertung der PDRIVE-Parameter 4DD7 01 0A 00 LD BC,000A ;Anzahl Bytes pro PDRIVE-Block = 10D 4DDA F5 PUSH AF ;sind schon soviele PDRIVE-Blocks über­ 4DDB FD BE 1F CP (IY+1F) ;tragen, wie (439F) SYSTEM AL angibt ? 4DDE 30 05 JR NC,4DE5 ;wenn ja 4DE0 DD E5 PUSH IX ;ansonsten nächsten PDRIVE-Block 4DE2 E1 POP HL ;aus dem Disk-Buffer 4DE3 ED B0 LDIR ;nach 4371/437B/4385/438F übertragen 4DE5 DD 7E 02 LD A,(IX+02) ;sind die PDRIVE-Parameter für 4DE8 E6 1C AND 1C ;dieses Lautwerk tehlerhatt ? 4DEA 28 E5 JR Z,4DD1 ;wenn ja, Error 4DEC 0E 10 LD C,10 ;Zeiger im Disk-Buffer aut den 4DEE DD 09 ADD IX,BC ;nächsten PDRIVE-Block setzen 4DF0 F1 POP AF ;Zähler f. schon erledigte PDRIVE-Blocks 4DF1 3C INC A ;Zähler +1 4DF2 FE 0A CP 0A ;schon 10D PDRIVE-Blocks bearbeitet ? 4DF4 38 E1 JR C,4DD7 ;wenn nein -------------------------- Weitere Bearbeitung der SYSTEM-Parameter 4DF6 3A FA 42 LD A,(42FA) ;SYSTEM BN=Y ? 4DF9 CB 7F BIT 7,A ;(Data Adress Mark von Model III) 4DFB 28 05 JR Z,4E02 ;wenn nein 4DFD 3E AB LD A,AB ;neuer WRITE-SECTOR Beteh1 tür FDC 4DFF 32 3D 46 LD (463D),A ;nach 463D -------------------------- 4E02 ED 4B F8 42 LD BC,(42F8) ;diverse SYSTEM-Parameter nach BC 4E06 ED 5B 6C 43 LD DE,(4360) ;diverse SYSTEM-Parameter nach DE -------------------------- 4E0A CB 73 BIT 6,E ;SYSTEM AB=Y ? (RUN-ONLY Modus) 4E0C 28 08 JR Z,4E16 ;wenn nein 4E0E FD CB E9 D6 SET 2,(IY+E9) ;SET 2,(4369) 4E12 FD CB ED B6 RES 6,(IY+ED) ;RES 6 , (436D) => SYSTEM BC=N -------------------------- 4E16 CB 41 BIT 0,C ;SYSTEM AU=Y ? (Tastatur mit Repeat) 4E18 28 OE JR Z,4E28 ;wenn nein Kapitel 3: SYSO/SYS Seite 3-60 -------------------------------------------------------------------------------- 4E1A 3E 20 LD A,20 ;"JR NZ," 4E1C 32 38 45 LD (4538),A ;nach 4538 4E1F 3A A7 42 LD A,(42A7) ;SYSTEM AV (Repeat-Faktor) 4E22 32 78 45 LD (4578),A ;nach 4578 4E25 32 2F 45 LD (452F),A ;und 452F -------------------------- 4E28 3A A5 42 LD A,(42A5) ;SYSTEM BI=OOH ? 4E2B B7 OR A ;(Cursor Zeichen) 4E2C 28 03 JR Z,4E31 ;wenn ja 4E2E 32 01 45 LD (4501),A ;Cursor Zeichen nach 4501 -------------------------- 4E31 CB 49 BIT 1,C ;SYSTEM AJ=Y ? (Tastatur- und ;Bildschirm-Routine von NEWD0S/80) 4E33 28 13 JR Z,4E48 ;wenn nein 4E35 3A 40 38 LD A,(3840) ;Tastatur abfragen 4E38 CB 5F BIT 3,A ;Taste “Hochpfeil" gedrückt ? 4E3A 20 0C JR NZ,4E48 ;wenn ja 4E3C 21 16 45 LD HL,4516 ;neue Tastatur-Routine 4E3F 22 16 40 LD (4016),HL ;bei 4016 eintragen 4E42 21 05 45 LD HL,4505 ;neue Bildschirm-Routine 4E45 22 1E 40 LD (401E),HL ;bei 401E eintragen -------------------------- 4E48 21 0C 3C LD HL,3C00 ;Zeiger auf Bildschirm-RAM 4E4B 3E 61 LD A,61 ;testen ob das 4E4D 77 LD (HL),A ;Bildschirm-RAM 4E4E BE CP (HL) ;auf Kleinbuchstaben 4E4F 36 20 LD (HL),20 ;umgerüstet wurde 4E51 20 17 JR NZ,4E6A ;wenn nein 4E53 CB 50 BIT 2,B ;SYSTEM BF=Y ? ;(Bildschirm mit Kleinbuchstaben) 4E55 28 0A JR Z,4E61 ;wenn nein 4E57 3E 4F LD A,4F ;"LD C,A" 4E59 32 93 45 LD (4593),A ;nach 4593 4E5C 3E 38 LD A,38 ;"JR C,“ 4E5E 32 05 45 LD (4505),A ;nach 4505 4E61 CB 48 BIT 1,B ;SYSTEM BG=Y ? ;(Tastatur mit Kleinbuchstaben) 4E63 20 05 JR NZ,4E6A ;wenn ja 4E65 3E 00 LD A,00 ;"NOP" 4E67 32 B4 45 LD (45B4),A ;nach 45B4 -------------------------- 4E6A CB 40 BIT 0,B ;SYSTEM BH=Y ? (blinkender Cursor) 4E6C 28 05 JR Z,4E73 ;wenn nein 4E6E 3E C8 LD A,C8 ;"LD A," 4E70 32 02 45 LD (4502),A ;nach 457D -------------------------- 4E73 CB 79 BIT 7,C ;SYSTEM AC=Y ? ;(Tastatur-Entprellung von NEWD0S/80) 4E75 20 05 JR NZ,4E7C ;wenn ja 4E77 3E 3E LD A,3E ;"LD A," 4E79 32 7D 45 LD (457D),A ;nach 457D -------------------------- 4E7C CB 71 BIT 6,C ;SYSTEM AD=Y ? (’JKL> erlaubt) 4E7E 28 05 JR Z,4E85 ;wenn nein 4E80 3E C0 LD A,C0 ;"RET NZ" 4E82 32 EE 45 LD (45EE),A ;nach 45EE -------------------------- 4E85 CB 61 BIT 4,C ;SYSTEM AF=Y ? ('DFG’ erlaubt) 4E87 28 05 JR Z,4E8E ;wenn nein 4E89 3E 20 LD A, 20 ;"JR NZ," Kapitel 3: SYSO/SYS Seite 3-61 -------------------------------------------------------------------------------- 4E8B 32 CC 45 LD (45CC),A ;nach 45CC -------------------------- 4E8E CB 51 BIT 2,C ;SYSTEM AQ=Y ? (CLEAR-Taste erlaubt) 4E90 28 04 JR Z,4E96 ;wenn nein 4E92 AF XOR A ;"00" 4E93 32 90 45 LD (4590),A ;nach 4590 -------------------------- 4E96 CB 69 BIT 5,C ;SYSTEM AE=Y ? (’123’ erlaubt) 4E98 28 05 JR Z,4E9F ;wenn nein 4E9A 3E 20 LD A,20 ;"JR NZ," 4E9C 32 D8 45 LD (45D8),A ;nach 45D8 -------------------------- 4E9F CB 6B BIT 5,E ;SYSTEM AG=Y ? (BREAK-Taste erlaubt) 4EA1 28 04 JR Z,4EA7 ;wenn nein 4EA3 FD CB E9 E6 SET 4,(IY+E9) ;SET 4,(4369) -------------------------- 4EA7 21 A8 4F LD HL,4FA8 ;Zeiger auf Tabelle "CLS" 4EAA CD 67 44 CALL 4467 ;Bildschirm löschen -------------------------- 4EAD 3A F9 42 LD A,(42F9) ;SYSTEM BA=Y ? 4EB0 CB 6F BIT 5,A ;(ROUTE DO,NL) 4EB2 28 18 JR Z,4ECC ;wenn nein 4EB4 F3 DI HL,43B2 ;Interrupts sperren 4EB5 21 B2 43 LD (4ADC),HL ;Zeiger auf 1. RCB (ROUTE Control Block) 4EB8 22 DC 4A LD DE,401D ;nach 4ADC eintragen 4EBB 11 ID 40 LD (HL),E ;DCB der Bildschirm-Routine 4EBE 73 LD HL ;in RCB+O 4EBF 23 INC HL ;und RCB+1 4EC0 72 LD (HL),D ;eintragen 4EC1 23 INC HL ;Zeiger auf RCB+2 4EC2 1A LD A,(DE) ;DCB-Typ der Bildschirm-Routine 4EC3 77 LD (HL),A ;bei RCB+2 speichern 4EC4 23 INC HL ;Zeiger auf RCB+3 4EC5 3E C0 LD A,C0 ;neuen DCB-Typ 4EC7 12 LD (DE),A ;nach 401D (DCB+O) eintragen 4EC8 AF XOR A ;im RCB+3 und RCB+4 4EC9 77 LD (HL),A ;den Zeiger auf 4ECA 23 INC HL ;weitere RCB’s 4ECB 77 LD (HL),A ;1öschen -------------------------- Datum und Uhrzeit abfragen und anzeigen 4ED3 3A AB 43 LD A,(43AB) ;prüfen, ob NEWD0S/80 oder GDOS 4ED6 FE A5 42 CP A5 ;schon vor dem RESET aktiv war, 4ED8 3A F9 LD A,(42F9) ;SYSTEM AY und SYSTEM AZ 4EDB 20 02 JR NZ,4EDF ;(Datum und Uhrzeit eingeben) 4EDD CB BF RES 7,A ;prüfen 4EDF E6 C0 AND C0 ;und 4EE1 C4 3D 4F CALL NZ,4F3D ;ggf. INPUT Datum und Uhrzeit 4EE4 21 89 50 LD HL,5089 ;Zeiger auf Buffer für Datum + Uhrzeit 4EE7 E5 PUSH HL ;Datum im MM/DD/YY-Format 4EE8 CD C2 44 CALL 44C2 ;nach 5089-5090 übertragen 4EEB 21 93 50 LD HL,5093 ;Uhrzeit im HH:MM:SS-Format 4EEE CD A7 44 CALL 44A7 ;nach 5093-509A übertragen 4EF1 E1 POP HL ;Datum und Uhrzeit 4EF2 CD 67 44 CALL 4467 ;auf Bildschirm ausgeben -------------------------- Kapitel 3: SYSO/SYS Seite 3-62 -------------------------------------------------------------------------------- GAT-Sector von Drive 0 lesen wegen evtl. AUTO-Befehl 4EF5 AF XOR A ;Nummer der DIR-Sectors (GAT=0) 4EF6 32 30 49 LD (4930),A ;nach 4930 4EF9 21 05 4F LD HL,4F05 ;Fortsetzungsadresse 4F05 4EFC E5 PUSH HL ;in den Stack schreiben 4EFD D5 PUSH DE ;DE und BC 4EFE C5 PUSH BC ;ebentalls in den Stack 4EFF 21 00 42 LD HL,4200 ;Butter = 4200 4F02 C3 11 49 JP 4911 ;GAT-Sector nach 4200 lesen 4F05 C2 D3 4D JP NZ,4DD3 ;wenn Error 4F08 11 18 43 LD DE,4318 ;Zeiger aut Input-Butter des DOS 4F0B D5 PUSH DE ;Zeiger retten 4F0C C5 PUSH BC ;wozu BC retten ? 4F0D 21 E0 42 LD HL,42E0 ;Zeiger aut AUTO-Betehl im GAT-Sector 4F10 01 20 00 LD BC,0020 ;max. Länge des AUTO-Betehls 4F13 ED B0 LDIR ;AUTO-Betehl in Input-Butter übertragen 4F15 21 AB 43 LD HL,43AB ;vermerken, daß NEWD0S/80 4F18 36 A5 LD (HL),A5 ;bzw. GDOS initialisiert ist 4F1A CI POP BC ;BC zurück 4F1B E1 POP HL ;Zeiger aut AUTO-Betehl im Input-Butter 4F1C AF XOR A ;übert1üssig 4F1D FD CB EC 76 BIT 6,(IY+EC) ;SYSTEM AB=Y ? (RUN-ONLY Modus) 4F21 20 14 JR NZ,4F37 ;wenn ja 4F23 3A 5C 50 LD A, (5050) ;SYSTEM BD=Y ? 4F26 CB 5F BIT 3,A ;(AUTO-Befehl durch ENTER stoppen) 4F28 28 0D JR Z,4F37 ;wenn nein 4F2A 3A 40 38 LD A ,(3840) ;Tastatur abtragen 4F2D 0F RRCA ;ENTER gedrückt ? 4F2E DA 00 44 JP C,4400 ;wenn ja: Sprung nach DOS READY 4F31 7E LD A,(HL) ;Zeiger aut AUTO-Befehl 4F32 FE 0D JP 0D ;ist ein AUTO-Betehl vorhanden ? 4F34 CA 00 44 JP Z,4400 ;wenn nein: Sprung nach DOS READY 4F37 CD 67 44 CALL 4467 ;AUTO-Betehl aut Bildschirm anzeigen 4F3A C3 05 44 JP 4405 ;AUTO-Betehl austühren -------------------------- Eingabe des Datums 4F3D 21 63 50 LD HL,5063 ;Text "Date? (MM/DD/YY) " 4F40 CD 64 4F CALL 4F64 ;anzeigen und Eingabe holen 4F43 01 9C 50 LD BC,509C ;Tabelle tür zulässige Datums-Eingabe 4F46 11 46 40 LD DE,4046 ;Zeiger aut RAM-Butter tür Datum 4F49 3E 2F LD A,2F ;Trennzeichen "/" 4F4B CD 6F 4F CALL 4F6F ;Datum in Butter eintragen 4F4E 20 ED JR NZ,4F3D ;wenn Eingabefehler -------------------------- Eingabe der Uhrzeit 4F50 21 76 50 LD HL,5076 ;Text "Time? (HH:MM:SS) " 4F53 CD 64 4F CALL 4F64 ;anzeigen und Eingabe holen 4F56 01 A2 50 LD BC,50A2 ;Tabelle tür zulässige Uhrzeit-Eingabe 4F59 11 43 40 LD DE,4043 ;Zeiger aut RAM-Butter tür Uhrzeit 4F5C 3E 3A LD A,3A ;Trennzeichen ":" 4F5E CD 6F 4F CALL 4F6F ;Uhrzeit in Butter eintragen 4F61 20 ED JR NZ,4F50 ;wenn Eingabefehler 4F63 C9 RET -------------------------- Datum oder Uhrzeit eingeben 4F64 CD 67 44 CALL 4467 ;Text anzeigen 4F67 21 18 43 LD HL,4318 ;Zeiger aut Input-Butter 4F6A 06 09 LD B,09 ;max. 9 Zeichen holen 4F6C C3 40 00 JP 0040 ;Zeilen-Eingabe des BASIC-Interpreters -------------------------- Kapitel 3: SYSO/SYS Seite 3-63 -------------------------------------------------------------------------------- Datum oder Uhrzeit auf Eingabefehler prüfen und in ihren Buffer übertragen 4F6F 32 A0 4F LD (4FA0),A ;Trennzeichen retten 4F72 F3 DI 4F73 C5 PUSH BC 4F74 06 03 LD B,03 ;Zähler: 3 Werte 4F76 7E LD A,(HL) ;nächstes Digit 4F77 D6 30 SUB 30 4F79 FE 0A CP 0A 4F7B 23 INC HL 4F7C 30 26 JR NC,4FA4 ;wenn keine Zahl 4F7E 4F LD C,A 4F7F 07 RLCA 4F80 07 RLCA 4F81 81 ADD C ;C = 10D * 1. Digit 4F82 87 ADD A 4F83 4F LD C,A 4F84 7E LD A,(HL) ;nächstes Digit 4F85 D6 30 SUB 30 4F87 FE 0A CP 0A 4F89 23 INC HL 4F8A 30 18 JR NC,4FA4 ;wenn keine Zahl 4F8C 81 ADD C 4F8D 12 LD (DE),A ;10 * 1. Digit + 2. Digit in Buffer 4F8E 1B DEC DE 4F8F E3 EX (SP),HL ;Tabelle der zulässigen Eingaben 4F90 96 SUB (HL) 4F91 23 INC HL 4F92 BE CP (HL) ;Eingabe prüfen 4F93 23 INC HL 4F94 30 0E JR NC,4FA4 ;wenn Fehler 4F96 E3 EX (SP),HL 4F97 10 05 DJNZ 4F9E ;Trennzeichen prüfen + nächster Wert 4F99 C1 POP BC 4F9A FB EI 4F9B C3 D5 4C JP 4CD5 ;Fehl er, wenn kein 0DH folgt -------------------------- 4F9E 7E LD A,(HL) 4F9F FE*00 CP 00 ;Trennzeichen prüfen 4FA1 23 INC HL 4FA2 28 D2 JR Z,4F76 ;wenn OK -------------------------- Eingabefehler 4FA4 FB EI 4FA5 F1 POP AF 4FA6 B7 OR A ;Z—Flag löschen 4FA7 C9 RET -------------------------- Tabelle zum Löschen des Bildschirms 4FA8 1C ;Cursor Home 4FA9 1F ;Rest: des Bildschirms löschen 4FAA 03 ;Ende der Tabelle -------------------------- Text "NEWD0S-80 ... Vers. 2.052 ... Model I" 4FAB BF 83 AF BF 83 BF 83 B3 B3 B3 BF 83 BF BF 83 BF ............. 4FBB 83 B3 B3 8B BF 87 B3 B3 8B BF 87 B3 B3 8B BF BF ............. 4FCB BF BF BF BF 87 B3 B3 8B BF 87 B3 93 8B BF 20 41 ............. A 4FDB 70 70 61 72 61 74 20 49 6E 63 2E 0A pparat Inc.. -------------------------- 4FE7 BF 80 B4 8B 80 BF 80 B3 B3 BB BF 80 87 8B 80 BF ............. Kapitel 3: SYSO/SYS Seite 3-64 -------------------------------------------------------------------------------- 4FF7 80 BF BF 80 BF 80 BF BF 80 BF B4 B3 B3 8B BF B7 ................ 5007 B3 B3 BB BF 84 B3 B3 88 BF 80 87 B8 80 BF 20 56 ................ 5017 65 72 73 2E 20 32 2E 30 35 32 OA ers. 2.052. -------------------------- 5022 BF B0 BF BD B0 BF B0 B3 B3 B3 BF BO BE BD BO BF ................ 5032 B0 B3 B3 B8 BF B4 B3 B3 B8 BF B4 B3 B3 B8 BF BF ................ 5042 BF BF BF BF B4 B3 B3 B8 BF B4 B2 B3 B8 BF 20 C2 .............. . 5052 4D 6F 64 65 6C 20 49 0A 0D Model I.. -------------------------- Buffer -für SYSTEM-Parameter aus dem PDRIVE-Sector 505B 00 ;PDRIVE-Sector Byte F8 505C 00 ;PDRIVE-Sector Byte F9 505D 00 ;PDRIVE-Sector Byte FA 505E 00 ;PDRIVE-Sector Byte FB 505F 00 ;PDRIVE-Sector Byte FC 5060 00 ;PDRIVE-Sector Byte FD 5061 00 ;PDRIVE-Sector Byte FE 5062 00 ;PDRIVE-Sector Byte FF -------------------------- Texte -für Datum und Uhrzeit 5063 44 61 74 65 3F 20 20 28 4D 4D 2F 44 44 2F 59 59 Date? (MM/DD/YY 5073 29 20 03 ) . -------------------------- 5076 54 69 6D 65 3F 20 20 28 48 48 3A 4D 4D 3A 53 53 Time?