.z80 ; public fcbbas ; fcb macro nr ; ein File-Control-Block db 0 ; Byte count (0-127) dw defdma ; Buffer db 0 ; fcb_&nr: ds 36 ; Platz f}r den FCB endm ; dseg ; fcbnr defl 1 ; fcbbas equ $ ; rept files ; fcb %fcbnr ; fcbnr defl fcbnr+1 ; endm ; db 255 ; letzter FCB cseg ; ;************************************************************************ ;* * ;* Dateibefehle * ;* * ;************************************************************************ ;* * ;* OPEN fcbnr,"dateiname" * ;* |ffnet Datei mit angeg. Namen * ;* OPEN fcbnr * ;* |ffnet Datei, HL zeigt auf Namen. * ;* returns NZ, wenn Fehler aufgetreten * ;* * ;************************************************************************ open macro fcbnr,name ; \ffne Datei (name) local fname_addr,weiter ifnb ; dseg ; fname_addr: db name,0 ; cseg ; endif ; ifnb ; ld hl,fname_addr ; endif ; ld de,fcb_&fcbnr-1 ; call _setfcb## ; bdos open_file,fcb_&fcbnr cp 4 ; jr nc,weiter ; xor a ; Byte count ld (fcb_&fcbnr-4),a ; auf 0 setzen inc a ; File open ld (fcb_&fcbnr-1),a ; weiter: dec a ; jetzt Zero-Flag richtig endm ; ;************************************************************************ ;* * ;* CREATE fcbnr,"filename" * ;* kreiert Datei mit angeg. Namen * ;* CREATE fcbnr * ;* kreiert Datei, HL zeigt auf Namen * ;* * ;************************************************************************ create macro fcbnr,name ; local fname_addr,weiter ifnb ; dseg ; fname_addr: db name,0 ; cseg ; endif ; ifnb ; ld hl,fname_addr ; endif ; ld de,fcb_&fcbnr-1 ; call _setfcb## ; bdos delete_file,fcb_&fcbnr bdos make_file,fcb_&fcbnr cp 4 ; jr nc,weiter ; xor a ; Byte count ld (fcb_&fcbnr-4),a ; auf 0 setzen inc a ; File open ld (fcb_&fcbnr-1),a ; weiter: dec a ; jetzt Zero-Flag richtig endm ; ;************************************************************************ ;* * ;* KILL fcbnr,"filename" * ;* l|scht Datei mit angeg. Namen * ;* KILL fcbnr * ;* l|scht Datei, HL zeigt auf Namen * ;* * ;************************************************************************ kill macro fcbnr,name ; local fname_addr,weiter ifnb ; dseg ; fname_addr: db name,0 ; cseg ; endif ; ifnb ; ld hl,fname_addr ; endif ; ld de,fcb_&fcbnr-1 ; call _setfcb## ; bdos delete_file,fcb_&fcbnr cp 4 ; jr nc,weiter ; xor a ; weiter: or a ; jetzt Zero-Flag richtig endm ; ;************************************************************************ ;* * ;* CLOSE fcbnr * ;* schlie~t Datei fcbnr, falls offen * ;* CLOSE * ;* schlie~t alle Dateien * ;* * ;************************************************************************ close macro fcbnr ; schlie~e Datei oder alle local weiter ; ifnb ; ld de,fcb_&fcbnr-1 ; call _close## ; else ; call _clsal## ; endif ; endm ; ;************************************************************************ ;* * ;* READ fcbnr * ;* liest sequentiell einen * ;* Record ein. * ;* * ;************************************************************************ read macro fcbnr ; ld de,fcb_&fcbnr-1 ; pointet auf Statusbyte call _seqrd## ; endm ; ;************************************************************************ ;* * ;* WRITE fcbnr * ;* schreibt sequentiell einen * ;* Record auf Disk * ;* * ;************************************************************************ write macro fcbnr ; ld de,fcb_&fcbnr-1 ; pointet auf Statusbyte call _seqwr## ; endm ; ;************************************************************************ ;* * ;* READC fcbnr * ;* liest sequentiell ein * ;* Zeichen ein (wird im Akku }bergeben). * ;* * ;************************************************************************ readc macro fcbnr ; ld de,fcb_&fcbnr-1 ; pointet auf Statusbyte call _chrrd## ; endm ; ;************************************************************************ ;* * ;* WRITEC fcbnr * ;* schreibt sequentiell ein * ;* Zeichen (C) auf Disk * ;* * ;************************************************************************ writec macro fcbnr ; ld de,fcb_&fcbnr-1 ; pointet auf Statusbyte call _chrwr## ; endm ; ;************************************************************************ ;* * ;* DMA fcbnr,dmaaddress * ;* setzt DMA-Adresse f}r fcbnr auf * ;* angegebenen Wert, wenn dmaaddress nicht angegeben, * ;* wird sie um 80h erh|ht * ;* * ;************************************************************************ dma macro fcbnr,dmaad ; ifnb ; ld hl,dmaad ; ld (fcb_&fcbnr-3),hl; else ; ld hl,(fcb_&fcbnr-3); ld de,80h ; add hl,de ; ld (fcb_&fcbnr-3),hl; endif ; endm ; ;************************************************************************ ;* * ;* RNDREAD fcbnr,recordnr * ;* liest einen Randomrecord ein * ;* wenn recordnr nicht angegeben, * ;* wird Record HL gelesen * ;* * ;************************************************************************ rndread macro fcbnr,recnr ; ifnb ; ld hl,recnr ; endif ; ld de,fcb_&fcbnr-1 ; call _rndrd## ; endm ; ;************************************************************************ ;* * ;* RNDWRITE fcbnr,recordnr * ;* schreibt einen Randomrecord * ;* wenn recordnr nicht angegeben, * ;* wird Record HL geschrieben * ;* * ;************************************************************************ rndwrite macro fcbnr,recnr ; ifnb ; ld hl,recnr ; endif ; ld de,fcb_&fcbnr-1 ; call _rndwr## ; endm ;