;******************************************************** ;* * ;* QUELLTEXT VON DEP.COM VON DER MPM-SYSTEMDISK * ;* erweiterte Version 2.2 * ;* * ;******************************************************** ;* erhalten von U. Felgentreu, bearbeitet: M. Leubner * ;* * ;* Neue Leistungen sind: * ;* - Laufwerkwechsel; Laufwerk wird vor jeder * ;* Funktion neu angew{hlt, um eventuellen Dis- * ;* kettenwechsel zu erkennen! * ;* - USER-Wechsel * ;* - ]bergabe der Versionsnummer im Koppel-RAM * ;* - ]bergabe von Fehlertexten (mit Dateiname) * ;* neu ab Version 2.1 (03.08.93): * ;* - DIR-Anzeigen aus Standard DMA-Puffer * ;* - Anzeige "Keine Datei." * ;* - RAM-Laufwerk A: im TPA, selbstkonfigurierend * ;* (nach U. Felgentreu), Blockgr|~e = 1 KByte * ;* neu ab Version 2.2 (30.12.93): * ;* - Laufwerkwechsel }ber Dateiname m|glich * ;* - Bei undef. Fehler erscheint HEX-Zahl im Text * ;* 24.03.94: * ;* - Bit 7 bei Dateiname in Fehlertext r}ckgesetzt.* ;* * ;* DEP22.MAC * ;******************************************************** .Z80 ASEG ORG 100H ; BDOS EQU 5 FCB1 EQU 5CH FCB2 EQU 6CH DMA EQU 80H LF EQU 0AH CR EQU 0DH ESC EQU 1BH ;MicroDOS-Vereinbarungen: SYSLW EQU 0E9E2H ;Systemlaufwerk bei CAOS-MicroDOS EE04 EQU 0EE04H ;BIOS-Adresse f}r CONIN/CONOUT RAMSIZE EQU 0EED6H ;Anzahl der 2K-Gruppen der RAM-Disk OFFSET EQU 0F14DH ;Offset * 128 Byte bis Anfang RAM-Disk ;------- ;RAM-Floppy-Berechnungen: TPA EQU 0C800H ;TPA-Obergrenze RAM EQU (HIGH (TPA - (BASPU+80H)))/4 ;Anzahl 1K-Gruppen OFFS EQU 2 * (HIGH (TPA) - (4 * RAM)) ;Sektoren Offset ;------------------------------------------------------------------------ ;Vereinbarungen Koppel-RAM: ;Seite Adresse D004 IO-Adresse KC Verwendung ; 0 FC00H..FCFFH 00F0H..FFF0H von MicroDOS verwendet ; 1 FD00H..FDFFH 00F1H..FFF1H bisher frei, jetzt Erweiterungen ; 2 FE00H..FEFFH 00F2H..FFF2H Bytekoppelpuffer ; 3 FF00H..FFFFH 00F3H..FFF3H von MicroDOS verwendet ; ERRTX EQU 0FD00H ;00F1H Fehlertext STBYT2 EQU 0FD80H ;80F1H 2. Steuerbyte: ; Bit 0 - Anforderung ; Bit 1 - Laufwerkswechsel ; Bit 2 - Userwechsel ; Bit 7 - Fehlerr}ckmeldung LWANF EQU 0FD81H ;81F1H gefordertes Laufwerk ('A', 'B', ... 'H') UANF EQU 0FD82H ;82F1H aktuelle User-Nummer (00H ... 0FH) VERSION EQU 0FD83H ;83F1H Versionsnummer von DEP.COM DATEN EQU 0FE80H ;80F2H Datenpuffer 128 Byte lang STBYTE EQU 0FF80H ;80F3H 1. Steuerbyte: ; Bit 0 - Anforderung ; Bit 1 - 1=schreiben/0=lesen ; Bit 3 - open ; Bit 6 - close ; Bit 7 - Fehlerr}ckmeldung ; Bit 5 4 2 Funktionsauswahl: ; 0 0 0 Sektor lesen/schreiben Š ; 0 0 1 DIR-Anforderung ; 0 1 0 ERA ; 0 1 1 STAT ; 1 0 0 REN ; 1 0 1 SETRO ; 1 1 0 SETWR ; 1 1 1 BASIC-Byte lesen/schreiben FCODE EQU 0FF81H ;81F3H Fehlercode DIRBUF EQU 0FF82H ;82F3H Puffer f}r Dateiname oder Directory BASBYT EQU 0FF8EH ;8EF3H Daten f}r BASIC-Byte-Schnittstelle ;------------------------------------------------------------------------- PRMSG MACRO MSG,N .PRINTX *MSG,N* ENDM ; WERT1 EQU OFFS*128 WERT2 EQU (OFFS*128)+RAM*400H IF2 .RADIX 16 PRMSG ,%ENDADR PRMSG ,%STACK PRMSG ,%BUFFEND PRMSG ,%BASPU PRMSG ,%WERT1 PRMSG < bis :>,%WERT2 PRMSG ,%TPA .RADIX 10 PRMSG ,%RAM ENDIF ;------------------------ ;Initialisierung: ; START: LD SP,STACK LD E,0FEH LD C,2DH ;Fehlerbehandlung aus CALL BDOS XOR A LD (STBYT2),A ;kein LW-, User-Wechsel LD A,(LWNR) LD E,A LD C,0EH ;Laufwerk B: anw{hlen CALL BDOS LD C,25H ;Disk r}cksetzen LD DE,00FFH ;f}r alle Laufwerke CALL BDOS LD DE,DMA LD C,1AH ;DMA-Adresse setzen CALL BDOS ;R}ckkehr zum CAOS: LD E,ESC LD C,2 CALL BDOS LD E,5CH LD C,2 CALL BDOS LD HL,BYTE1 LD (EE04),HL ;RET eintragen f}r CONIN/CONOUT LD DE,INIT ;INITIAL.UUU LD C,0FH ;Datei |ffnen Š CALL BDOS INC A ;Datei gefunden? JR Z,INIT4 ;nein LD DE,INIT LD C,14H ;sequentiell lesen CALL BDOS INC A JR Z,INIT4 ;Fehler LD B,128 ;1 Sektor LD DE,DMA LD HL,DATEN ;Dateipuffer im Koppel-RAM INIT1: LD A,(DE) INC DE CP LF JR Z,INIT3 ;LF }bergehen AND A JR Z,INIT3 ;00 }bergehen CP 3 JR NZ,INIT2 ;^C XOR A ;=Ende INIT2: LD M,A INC HL INIT3: DJNZ INIT1 ;128 Bytes eintragen LD M,0 LD A,48H ;Kennung, F-Taste aktivieren JR INIT5 ; INIT4: LD A,0C8H ;Kennung, keine INITIAL.UUU INIT5: LD (STBYTE),A ;------ RAM-Disk initialisieren ------ LD HL,OFFS*128 ;Beginn RAM-Disk LD DE,32 ;Abstand DIR-Eintr{ge LD B,32 ;1K DIR = 32 Eintr{ge DIRA: LD M,0E5H ;l|schen ADD HL,DE DJNZ DIRA LD A,RAM-1 LD (RAMSIZE),A ;Anzahl Gruppen in DPH LD A,OFFS LD (OFFSET),A ;Offset f}r Treiber CALL ANZ ;LW, User r}ckmelden ; ;------ ABFRAGESCHLEIFE -------------- ; LOOP: LD SP,STACK LOOP0: LD A,22H LD (VERSION),A ;Versionsnummer 2.2 LD A,(STBYTE) BIT 0,A ;Anforderung 1? JR NZ,NORMAL ;ja LD A,(STBYT2) BIT 0,A ;Anforderung 2? JR Z,LOOP0 ;nein ;------- ;LW-Wechsel ausf}hren: ; BIT 1,A ;LW-Wechsel? JR Z,USER ;nein LD A,(LWANF) CALL LWW ;LW-Wechsel vorbereiten JR C,ERROR2 ;Falscher LW-Code CALL LWRES ;und ausf}hren JR C,ERROR2 ;BDOS-Fehler LD A,(STBYT2) ;USER-Bereich einstellen: USER: BIT 2,A ;User-Wechsel? JR Z,ANZEIGE ;nein LD A,(UANF) CALL USW ;USER-Wechsel ausf}hren JR C,ERROR2 ;LW und USER zur}ckmelden: ANZEIGE:CALL ANZ ;Anzeige-Bytes melden XOR A QUIT2: LD (STBYT2),A ;Anforderung quittieren JR LOOP ;Fehler in Anforderung 2: ERROR2: CALL ERROR ;Fehlerausgabe CALL ANZ ;aktuelles LW/USER melden LD A,80H JR QUIT2 ;Fehler setzen ; ;-------------------------------------------- ; M}hlhausen-Verteiler ;entsprechend der Anforderungen von STBYTE reagieren: ; NORMAL: ; PUSH AF ; BIT 3,A ;open? ; CALL NZ,LWRES ;Laufwerk r}cksetzen ; POP AF LD B,A ;Steuerbyte merken AND 34H ;lesen/schreiben? JP NZ,NO_SEQ ;nichts von beiden LD A,B BIT 1,A ;lesen oder schreiben? JP NZ,M0216 ;schreiben ;Sektor lesen: Š BIT 3,A ;open? JR Z,M01DA ;nein CALL INIFCB ;FCB vorbereiten JP C,ERROR1 ;Fehler im Dateiname CALL LWRES ;Laufwerk r}cksetzen LD HL,FCB1+9 ;Dateityp LD A,M CP ' ' ;leerer Typ? JR NZ,M01C1 ;nein LD A,(POINT) AND A ;Punkt in Dateiname enthalten? JR NZ,M01C1 ;ja LD M,'K' INC HL LD M,'C' INC HL LD M,'C' ;wenn nichts angegeben, dann .KCC M01C1: LD C,0FH ;Datei |ffnen CALL DOSFCB JR Z,ERROR1 ;Fehler ;1. Sektor lesen: XOR A ;1. Sektor LD (FCB1+32),A ;Datensatzzeiger "cr" M01F1: LD C,14H ;sequentiell lesen CALL DOSFCB JR Z,ERROR1 ;Fehler CP 1 ;Dateiende? LD H,81H ;Fehlercode JR Z,ERROR1 ;ja LD HL,DMA LD DE,DATEN ;Sektorpuffer LD BC,128 LDIR ;eintragen ; QUIT: XOR A LD (STBYTE),A ;Quittung f}r o.k. JP LOOP ;------- ;Fehler zur}ckmelden: ;PE: H Fehlernummer ; ERROR1: CALL ERROR ;Fehlerausgabe LD A,80H LD (STBYTE),A ;Fehler setzen JP LOOP ;n{chsten Sektor lesen: M01DA: BIT 6,A ;close? JR Z,M01F1 ;nein LD C,10H ;Datei schlie~en CALL DOSFCB JR Z,ERROR1 ;Fehler JP QUIT ;Sektor schreiben: M0216: BIT 3,A ;open? JP Z,M02A4 ;nein CALL INIFCB ;FCB vorbereiten JP C,ERROR1 ;Fehler im Dateiname CALL LWRES ;Laufwerk r}cksetzen ;Dateityp konvertieren: LD HL,FCB1+9 ;Dateityp LD A,'C' CP M ;.COM? JR NZ,M023A ;nein INC HL LD A,'O' CP M JR NZ,M024D ;nein INC HL LD A,'M' CP M LD HL,FCB1+9 JR Z,M0245 ;ja JR M024D ; M023A: LD A,' ' CP M ;ohne Typ? JR NZ,M024D ;nein LD A,(POINT) AND A ;Punkt in Dateiname? JR NZ,M024D ;ja M0245: LD M,'K' INC HL LD M,'C' INC HL LD M,'C' ;Wandlung in .KCC M024D: LD C,0FH ;Datei |ffnen CALL DOSFCB JR NZ,WR_ERA ;kein Fehler -> l|schen LD A,H OR A JR Z,M0266 ;Datei existiert nicht JP ERROR1 ;Diskettenfehler WR_ERA: LD C,13H ;gleichnamige Datei l|schen CALL DOSFCB JP Z,ERROR1 ;Fehler M0266: LD C,16H ;Datei erzeugen CALL DOSFCB JR NZ,M0273 LD A,H AND A JP NZ,ERROR1 ;Diskettenfehler LD H,83H JP Z,ERROR1 ;Directory voll M0273: LD HL,DATEN ;Sektorpuffer M0276: LD DE,DMA LD BC,128 LDIR ;}bernehmen LD C,15H ;sequentiell schreiben CALL DOSFCB JP Z,ERROR1 ;physicher Fehler LD H,83H ;neuer Fehler! (alt:81H) CP 1 Š JP Z,ERROR1 ;Directory voll LD H,82H ;Fehler f}r "Diskette voll" CP 2 JP Z,ERROR1 ;Disk voll JP QUIT ;n{chsten Sektor schreiben: M02A4: BIT 6,A ;close-schreiben? JR Z,M0273 ;nein M02A8: LD C,10H ;Datei schlie~en CALL DOSFCB JP Z,ERROR1 ;Fehler JP QUIT ;------- NO_SEQ: CP 34H ;Byte-Schnittstelle? JP NZ,UPVT1 ;nein ;Byte-Schnittstelle f}r BASIC: BIT 1,B ;lesen oder schreiben? JP Z,M036C ;lesen BIT 3,B ;open? JR Z,M0316 ;nein CALL BASFCB ;FCB und BASIC-Puffer vorbereiten JP C,ERROR1 ;Fehler im Dateiname CALL LWRES ;Laufwerk r}cksetzen LD C,0FH ;Datei |ffnen CALL DOSFCB JR NZ,BWR_E ;kein Fehler -> l|schen LD A,H AND A JR Z,M0309 ;Datei existiert nicht JP ERROR1 ;Diskettenfehler BWR_E: LD C,13H ;gleichnamige Datei l|schen CALL DOSFCB JP Z,ERROR1 ;Fehler M0309: LD C,16H ;Datei erzeugen CALL DOSFCB JR NZ,M0316 LD A,H AND A JP NZ,ERROR1 ;Diskettenfehler LD H,83H JP Z,ERROR1 ;Directory voll M0316: LD A,(BASBYT) ;BASIC-Datenbyte LD HL,(BAS_PU) ;Pufferpointer LD M,A ;in Puffer }bernehmen LD A,(STBYTE) BIT 6,A ;Close? JR Z,M032C ;nein BIT 7,A ;RUN-Switch setzen? JR Z,M033E ;nein LD M,1DH ;RUN-Switch (statt 03) JR M033E ; ŠM032C: INC HL LD (BAS_PU),HL ;Pufferpointer erh|hen LD A,L AND A ;128 Byte voll? JP NZ,QUIT ;nein LD HL,BASPU LD (BAS_PU),HL ;Pufferpointer Anfangswert JP M0276 ;Sektor schreiben ;Close BASIC-Datei: M033E: INC HL LD A,1AH LD HL,BASPU ;Puffer-Anfangswert LD DE,DMA LD BC,128 LDIR ;letzten Pufferinhalt eintragen LD C,15H ;Sektor schreiben CALL DOSFCB JP Z,ERROR1 ;physicher Fehler LD H,83H ;neuer Fehler! (alt:81H) CP 1 Š JP Z,ERROR1 ;Directory voll LD H,82H ;Fehler f}r "Diskette voll" CP 2 JP Z,ERROR1 ;Disk voll JP M02A8 ;Close ;BASIC-Datenbyte lesen: M036C: BIT 6,B ;close? JP NZ,QUIT ;ja BIT 3,B ;open? JR Z,M0389 ;nein CALL BASFCB ;FCB und BASIC-Puffer vorbereiten JP C,ERROR1 CALL LWRES ;Laufwerk r}cksetzen LD C,0FH ;Datei |ffnen CALL DOSFCB JP Z,ERROR1 ;Fehler XOR A ;Sektor 0 LD (FCB1+32),A M0389: LD HL,(BAS_PU) ;Pufferpointer LD A,L CP 128 ;Puffer ausgelesen? JR NZ,M03AF ;nein LD C,14H ;Sektor lesen CALL DOSFCB JP Z,ERROR1 ;phys. Fehler LD H,81H ;Error 81 CP 1 JP Z,ERROR1 ;Dateiende }berschritten LD HL,DMA LD DE,BASPU ;in BASIC-Puffer laden Š LD BC,128 LDIR M03AF: LD HL,(BAS_PU) ;Pufferpointer LD A,M ;Datenbyte LD (BASBYT),A ;BASIC-Daten INC HL LD A,L AND A ;voll? JR NZ,M03BE LD HL,BASPU ;wieder von vorn! M03BE: LD (BAS_PU),HL ;Pufferpointer JP QUIT ;------- ;Verteiler f}r verschiedene Funktionen: ; UPVT1: CP 4 ;DIR? JP Z,DIR CP 10H ;ERA? JP Z,ERA CP 20H ;REN? JP Z,REN CP 14H ;STAT? JR Z,STAT CP 24H ;SETRO? JP Z,SETRO CP 30H ;SETWR? JP Z,SETWR JP LOOP ;zur Sicherheit ;------- STAT: CALL LWRES ;Laufwerk r}cksetzen JP C,ERROR1 ; LD DE,DMA ; LD C,1AH ;DMA-Adresse setzen ; CALL BDOS LD A,(LWNR) LD HL,DIRBUF LD E,A ADD A,'A' LD M,A ;LW melden INC HL LD M,'>' ;statt User 0 LD A,(UNR) AND A JR Z,LWX CALL HEXA LD M,A ;sonst User-HEX-Zahl eintragen LWX: INC HL LD M,' ' LD A,(LWNR) LD E,A LD C,2EH ;freien Platz abfragen CALL BDOS INC A JP Z,ERROR1 ;Fehler LD HL,(DMA) ;freie Sektoren SRL H RR L SRL H RR L SRL H RR L ;frei in KByte ;Dez.-Konvertierung: PUSH HL LD HL,DIRBUF+3 EX (SP),HL LD A,'0'-1 AND A ;CY=0 LD DE,100 STAT1: INC A ;Hunderter z{hlen SBC HL,DE JR NC,STAT1 ADD HL,DE CP '0' ;Hunderter? LD B,0 JR Z,STAT2 ;nein INC B EX (SP),HL LD M,A ;Hunderter eintragen INC HL EX (SP),HL STAT2: LD A,'0'-1 AND A ;CY=0 LD DE,10 STAT3: INC A ;Zehner z{hlen SBC HL,DE JR NC,STAT3 ADD HL,DE DEC B JR Z,STAT4 ;Hunderter vorhanden CP '0' JR Z,STAT5 ;kein Zehner STAT4: EX (SP),HL LD M,A ;Zehner eintragen INC HL EX (SP),HL STAT5: LD A,L ADD A,'0' POP DE LD (DE),A ;Einer eintragen INC DE LD HL,TXT2 ;KByte frei LD BC,14 LDIR ;Text dazugeben LD E,LOW (DIRBUF+18) LD HL,TXT3 LD BC,2 LDIR ;CR,LF dahinter JP QUIT ;------- DIR: LD A,3 ;3 Eintr{ge pro Forderung LD (DIR_OK),A LD HL,DIRBUF LD (DIR_AD),HL BIT 3,B ;open? JR Z,DIR2 ;nein ;Vorbereitungen f}r DIR-Lesen: CALL LWRES ;Laufwerk r}cksetzen JR C,DIRER ;BDOS-Fehler LD A,(LWNR) LD C,A LD E,18H ;SELDSK CALL BIOS ;HL= Zeiger auf DPH LD A,H OR L JR NZ,DIR1 LD H,84H ;Falsches Laufwerk DIRER: JP ERROR1 DIR1: LD DE,10 ADD HL,DE LD E,M INC HL LD D,M ;DE=Zeiger auf DPB LD HL,7 ADD HL,DE LD C,M ;Anzahl DIR-Eintr{ge holen INC C SRL C SRL C ;/4 = Anzahl Sektoren LD HL,13 ADD HL,DE LD A,M ;Offset (Anzahl Systemspuren) LD L,A LD H,0 LD (SPUR),HL ;Spur, wo Directory steht LD L,H LD (SECTOR),HL ;Sektor 0 LD HL,MAXSEC LD M,C ;Sektoren f}r DIR INC HL LD M,0 ;NOF JR DIR6 DIR2: LD HL,MAXSEC LD A,(SECTOR) SUB M JR NZ,DIR3 ;nicht letzter Sector LD A,(DIR_NR) AND A JR NZ,DIR7 ;Noch Daten im Puffer LD A,4 LD (STBYTE),A ;Fertig melden JP LOOP ;DIR-Eintrag ausgeben: DIR3: LD A,(DIR_NR) AND A JR NZ,DIR7 ;Puffer noch nicht leer LD HL,MAXSEC LD A,(SECTOR) CP M ;letzter Sector gelesen? JR NZ,DIR6 ;nein LD HL,(DIR_AD) DIR4: LD M,' ' ;Rest mit Space f}llen INC HL LD A,L CP LOW (DIRBUF+36) JR NZ,DIR4 ;f}r jeden der restlichen Eintr{ge LD A,(NOF) AND A JR NZ,DIR5 ;Datei wurde gefunden LD DE,DIRBUF LD HL,TXT4 ;no File LD BC,12 LDIR ;eintragen DIR5: JR DIR8 ;Sector vom Directory einlesen: DIR6: LD BC,DMA LD E,21H ;SETDMA CALL BIOS LD BC,(SPUR) LD E,1BH ;SETTRK CALL BIOS LD BC,(SECTOR) LD E,1EH ;SETSEC CALL BIOS LD E,24H ;READ Sector CALL BIOS LD H,A AND A JP NZ,ERROR1 ;Diskettenfehler LD A,(SECTOR) INC A LD (SECTOR),A ;n{chster SECTOR XOR A LD (DIR_NR),A ;DIR-Pointer ;Ausgabe Directory-Datensatz: DIR7: LD IX,DMA LD A,(DIR_NR) ;0...3 PUSH AF RLCA RLCA RLCA RLCA RLCA ;0,32,64,96 LD D,0 LD E,A ADD IX,DE ;Beginn DIR-Eintrag POP AF INC A AND 3 LD (DIR_NR),A ;f}r n{chsten Eintrag LD A,(UNR) CP (IX) ;richtiger User-Bereich? JR NZ,DIR3 ;nein LD A,(IX+0CH) ;Extend-Nummer AND A JP NZ,DIR3 ;nur Extend 0 PUSH IX LD HL,NOF INC M ;DIR-Eintr{ge z{hlen POP HL INC HL LD DE,(DIR_AD) ;DIR-Datenpuffer LD BC,11 ;L{nge Name+Typ LDIR ;in ]bergabepuffer kopieren EX DE,HL LD M,' ' ;1 Space dazu INC HL LD (DIR_AD),HL LD A,(DIR_OK) DEC A LD (DIR_OK),A ;3 Eintr{ge JP NZ,DIR3 DIR8: LD HL,DIRBUF+36 LD M,CR ;Zeilenende anh{ngen INC HL LD M,LF JP QUIT ;------- ERA: CALL INIFCB ;FCB vorbereiten JP C,ERROR1 CALL LWRES ;Laufwerk r}cksetzen LD C,13H ;Datei l|schen DOS_R: CALL DOSFCB JP Z,ERROR1 ;Fehler Š JP QUIT ;------- REN: BIT 3,B ;open? JR Z,REN2 ;nein CALL INIFCB ;FCB vorbereiten CALL NC,LWRES ;Laufwerk r}cksetzen, wenn kein Fehler LD HL,FCB1 LD DE,BUFFER LD BC,16 ;ersten FCB merken LDIR JP C,ERROR1 ;Fehler setzen! JP QUIT ; REN2: CALL INIFCB ;FCB vorbereiten JP C,ERROR1 LD HL,FCB1 LD DE,FCB2 LD BC,16 LDIR ;zweiter FCB nach FCB2 LD HL,BUFFER LD DE,FCB1 LD C,16 LDIR ;ersten FCB nach FCB1 LD HL,FCB1 LD A,(DE) ;DE=FCB2 CP M ;gleiches Laufwerk? JR Z,REN3 ;ja LD H,84H JP ERROR1 ;falsches Laufwerk! REN3: LD C,17H ;Datei umbenennen JR DOS_R ;------- SETRO: CALL INIFCB ;FCB vorbereiten JP C,ERROR1 LD HL,FCB1+9 SET 7,M ;Attribut RO setzen SETATR: CALL LWRES ;Laufwerk r}cksetzen JP C,ERROR1 ;BDOS-Fehler LD C,1EH ;Dateiattribute setzen JP DOS_R ;------- SETWR: CALL INIFCB ;FCB vorbereiten JP C,ERROR1 LD HL,FCB1+9 RES 7,M ;Attribut RO zur}cksetzen JR SETATR ;------- ;FCB vorbereiten: ;PA: DE FCB-Adresse ; CY=1 Fehler im Dateiname ; BASFCB: LD HL,BASPU LD (BAS_PU),HL ;Pufferpointer Anfangswert ;FCB vorbereiten: INIFCB: XOR A LD (POINT),A ;kein Punkt LD DE,DIRBUF ;Dateiname LD A,(DE) ;erstes Zeichen aus DIRBUF BIT 7,A JR Z,NAM12 ;kein BASIC ;BASIC mit vorangestelltem Dateitypyp: LD B,3 ;3* rotieren BASROT: LD HL,DIRBUF+1 LD A,(DE) ;1. Zeichen von Dateityp AND 7FH PUSH BC LD BC,10 ;zu verschiebender Rest! LDIR LD (DE),A ;-> letztes Zeichen (DE=DIRBUF+10) POP BC LD DE,DIRBUF ;wieder von vorn DJNZ BASROT LD M,' ' ;und als 12. Zeichen ein Space! NAM12: LD A,(DIRBUF+2) CP ':' LD A,(DIRBUF+1) JR NZ,LW1 ;keine USER-Anforderung SUB '0' JR C,USWF ;< '0' (ergibt Fehler!) CP 10 JR C,USWF ;'0' ... '9' SUB 7 ;Korrektur f}r A...F AND 0DFH ;klein -> gro~ USWF: CALL USW ;Userwechsel RET C ;Fehler! LD DE,DIRBUF+3 ;Dateiname 3 Zeichen k}rzer! JR LW2 ;und Laufwerkwechsel LW1: LD A,(DIRBUF+1) CP ':' JR NZ,LW3 ;auch kein LW-Wechsel LD DE,DIRBUF+2 ;Dateiname 2 Zeichen k}rzer! LW2: LD A,(DIRBUF) AND 0DFH ;klein -> gro~ CALL LWW ;LW wechseln CALL ANZ ;neues LW und USER melden RET C ;falscher LW-Code LW3: LD HL,FCB1 LD A,(LWNR) ;aktuelles Laufwerk INC A LD M,A ;eingestelltes Laufwerk! INC HL LD B,8 ;max. L{nge Dateiname NAME1: LD A,(DE) INC DE CP '.' JR NZ,NAM13 ;keine Trennung zu Dateityp NAM11: LD M,' ' INC HL DJNZ NAM11 ;Dateinamensrest mit Space f}llen LD (POINT),A ;Kennung: Punkt erkannt! JR NAME3 ;weiter mit Dateityp NAM13: AND A JR NZ,NAME2 LD A,' ' ;00 -> Space NAME2: LD M,A INC HL DJNZ NAME1 ;8 Zeichen f}r Dateiname NAME3: LD B,3 ;L{nge Dateityp NAME5: LD A,E CP LOW (DIRBUF+13) ;noch im Direktory-Puffer? LD A,' ' JR Z,NAME6 ;nein, Leerstelle erzeugen! LD A,(DE) INC DE CP '.' ;Punkt? JR NZ,NAME4 ;nein LD (POINT),A ;Punkt erkannt JR NAME5 NAME4: AND A JR NZ,NAME6 LD A,' ' ;00 -> Space NAME6: LD M,A INC HL DJNZ NAME5 ;3 Zeichen f}r Dateityp NAME7: LD B,22 NAME8: LD M,0 ;Rest von FCB l|schen INC HL DJNZ NAME8 ;Dateiname kontrollieren: LD DE,FCB1 ;f}r folgende BDOS-Operation LD HL,FCB1+1 LD B,11 NAME9: LD A,M INC HL CP ' ' ;Steuerzeichen enthalten? JR C,NAM10 ;ja CP 7FH ;Codes > 7EH dabei? JR NC,NAM10 ;ja DJNZ NAME9 AND A ;CY=0 RET ;Fehler: NAM10: SCF ;Fehlerkennung LD H,77H ;Fehlernummer "unzul{ssige Dateibezeichnung!" RET ;------- ;Aufruf BDOS f}r Diskettenzugriff: ;PE: C Nr. der BDOS-Funktion ;PA: Z=1 Fehler ; DOSFCB: LD DE,FCB1 ;Standard-FCB CALL BDOS CP 0FFH ;Fehler? RET ;------- ;Aufruf BIOS-Routine: BIOS: LD D,0 LD HL,(1) ;WBOOT ADD HL,DE ;Adresse berechnen JP (HL) ;Ansprung ;------- ;Laufwerk r}cksetzen: ;PA: CY=1 Fehler ; H BDOS-Fehlercode ; LWRES: LD C,0DH ;Diskettensystem r}cksetzen CALL BDOS LD A,(LWNR) LD E,A LD C,0EH ;Laufwerk anw{hlen CALL BDOS ADD A,1 ;0FFH+1 -> CY=1 RET ;------- ;R}ckmeldung Laufwerk und User: ;VR: - ; ANZ: PUSH AF LD A,(LWNR) ADD A,'A' LD (LWANF),A ;LW-Nummer }bergeben LD A,(UNR) LD (UANF),A ;User-Nr. }bergeben POP AF RET ;------- ;USER-Wechsel: ;PE: A USER-Code ;PA: CY=1 bei Fehler ; H Fehlercode ; USW: LD E,A ;Usercode LD H,85H ;Fehler-Nr. AND 0F0H ;User 0...15 zugelassen SCF RET NZ ;A > 0FH LD A,E LD (UNR),A LD C,20H ;User-Bereich setzen CALL BDOS RET ;------- ;Laufwerkwechsel vorbereiten: ;PE: A LW-Code ;PA: CY=1 bei Fehler ; H Fehlercode ;VR: AF,BC,HL ; LWW: LD H,84H ;Fehler f}r falsches Laufwerk SUB 'A' RET C ;< 'A' CP 8 CCF RET C ;> 'H' LD (LWNR),A INC A ;(1=A:), 2=B: ... 8=H: LD (SYSLW),A ;System-LW setzen RET ;------- ;Fehlernummer und -text ausgeben: ;PE: H Fehlernummer ;PA: (ERRTX) Fehlertext im Koppel-RAM ERROR: LD A,H LD (FCODE),A ;Fehlernummer LD HL,ERRTAB LD B,A ERRN1: LD A,M ;Nummer INC HL LD E,M ;low INC HL LD D,M ;high INC HL CP 0FFH JR Z,ERRCU ;Ende der Tabelle CP B JR NZ,ERRN1 ;noch nicht gefunden LD HL,ERRTX JR ERRC0 ERRCU: LD HL,ERRTX LD A,B RRCA RRCA RRCA RRCA CALL HEXA LD M,A ;HEX-Code H-Teil INC HL LD A,B CALL HEXA LD M,A ;HEX-Code L-Teil INC HL ERRC0: EX DE,HL CALL ERRC1 ;eigentlicher Fehlertext DEC DE LD HL,ERREND ;Zeilenende dazu ERRC1: LD A,M CP '*' JR Z,ERRC2 ;Dateiname f}r '*' LDI ;kopieren AND A ;Textende? RET Z JR ERRC1 ERRC2: INC HL ;'*' }bergehen PUSH HL LD A,(FCB1) ;LW-Code ADD A,40H LD (DE),A ;LW-Name INC DE LD A,':' LD (DE),A ;Doppelpunkt INC DE LD HL,FCB1+1 LD B,8 ;8 Zeichen f}r CALL ERRNAM ;Dateiname LD A,'.' LD (DE),A ;Punkt INC DE LD B,3 ;3 Zeichen f}r CALL ERRNAM ;Dateityp POP HL JR ERRC1 ;------- ŠERRNAM: LD A,M INC HL CP 21H ;Zeichen? JR C,ERRC4 ;nein, }bergehen AND 7FH ;Bit 7 (Schreibschutz...) r}cksetzen LD (DE),A ;Dateiname/Typ INC DE ERRC4: DJNZ ERRNAM RET ;------- ;HEX -> ASCII-Konvertierung: HEXA: AND 0FH ADD A,90H DAA ADC A,40H DAA RET ;------- ;Tabelle f}r Adressen der Fehlertexte: ERRTAB: DB 0 ;Nummer DW ERR0 ;Text DB 1 ;Nummer DW ERR1 ;... DB 2 DW ERR2 DB 3 DW ERR3 DB 4 DW ERR4 DB 8 DW ERR8 DB 9 DW ERR9 DB 43H DW ERR43 DB 49H DW ERR49 DB 52H DW ERR52 DB 53H DW ERR53 DB 56H DW ERR56 DB 77H DW ERR77 DB 81H DW ERR81 DB 82H DW ERR2 ;gleicher Text wie Fehler 2! DB 83H DW ERR83 DB 84H DW ERR84 DB 85H DW ERR85 DB 0FFH ;f}r alle sonst DW ERRUN ;auftretenden Fehlernummern ;------- ;Fehlertexte: ; ERR0: DB 'Datei * nicht vorhanden',0 ERR1: DB 'Diskettenfehler allgemein',0 ERR2: DB 'Diskette voll',0 ŠERR3: DB 'Datei * schreibgesch}tzt',0 ERR4: DB 'falsches Diskettenformat',0 ERR8: DB 'Dateibezeichnung bereits vorhanden',0 ERR9: DB 'Dateibezeichnung nicht eindeutig',0 ERR43: DB 'Pr}fsummenfehler (CRC)',0 ERR49: DB 'Indexfehler',0 ERR52: DB 'Laufwerk nicht bereit',0 ERR53: DB 'Diskette schreibgesch}tzt',0 ERR56: DB 'ID-Feld-Fehler (falsches Format?)',0 ERR77: DB 'unzul{ssige Dateibezeichnung',0 ERR81: DB 'Dateiende }berschritten',0 ERR83: DB 'Directory voll',0 ERR84: DB 'Falsches Laufwerk',0 ERR85: DB 'Falscher USER-Bereich',0 ERRUN: DB ': undefinierbarer Systemfehler',0 ERREND: DB ' !',7 TXT3: DB CR,LF,0 ;------- BYTE1: RET ;------- ; TXT4: DB 'Keine Datei.' TXT2: DB ' KByte frei! ' ; ; ;------ MERKPUFFER ------------- ; LWNR: DB 1 ;Laufwerksnummer (B voreingestellt) UNR: DB 0 ;Userbereich (0 voreingestellt) BAS_PU: DW 128 ;Pufferpointer f}r Bytepuffer (BASIC) SPUR: DW 2 ;Spurnummer f}r BIOS-Zugriff (DIR) SECTOR: DW 0 ;Sektornummer f}r BIOS-Zugriff (DIR) DIR_AD: DW 0 ;Stand der Adresse w{hrend DIR DIR_NR: DB 0 ;Nummer des DIR-Eintrages im DMA-Puffer DIR_OK: DB 0 ;Z{hler f}r DIR-Zeile MAXSEC: DB 0 ;max. Sektoren f}r DIR NOF: DB 0 ;Kennung no File POINT: DB 0 ;Kennung, ob Dateityp angegeben ; ;FCB f}r INITIAL.UUU-Datei: INIT: DB 2 ;Laufwerk B: DB 'INITIAL UUU' Š DS 24,0 ;------- ENDADR EQU $ ;Programmende STACK EQU $+32 ;Stack f}r DEP BUFFER EQU STACK ;Merkbereich f}r FCB bei REN BUFFEND EQU BUFFER+16 ;16 Bytes lang IF LOW (BUFFEND) GT 80H BASPU EQU HIGH (BUFFEND)*256 +180H ;Puffer f}r BASIC ELSE BASPU EQU HIGH (BUFFEND)*256 +80H ;Puffer f}r BASIC ENDIF ;------- END