;----------------------------------------------- ; Diskettenerweiterung Disk-BASIC ; Stand: 25.05.1989 / Dr.Busch ;----------------------------------------------- GLOBAL BBDOSX ;----------------------------------------------- ; externals aus BASIC und ROM-BIOS ;----------------------------------------------- external ADTDE external AUSGE external AUZN external BYTAE1 external BYTAE2 external BYTAE3 external CHR2 external CLOSE1 external CLOSEA external CURSRD external DATNA external DIM1 external ERALOP external ERBFNA external ERBFNR external ERFC external ERFIOV external ERINPE external ERNTFO external ERNTOP external ERRO external ERRO3 external ERSN external ERTM external FCBAD external FCBBE5 external FN7 external GERDS external HAUZN external INIBA external INIT2 external INTPA2 external KOM7 external LSTRE1 external LSTRES external MOERR0 external OPEN4 external OUTZK external PTNEW external REN10 external RUNMOD external SNAL1 external TCHAR0 external TSTZK external TYPTS0 external WLAZK1 external ZKUP18 external ZKUP2 external NLDIRT external AC1HLT external HLAC1T external CINT1 external POS1 external POS2 external LINP14 external INTDE2 ;----------------------------------------------- ; externals aus ROM-BIOS ;----------------------------------------------- LREB equ 0Ch CHARO equ 18h L3CALL equ 1Ch CPREG equ 20h BANKUM equ 24h L2CALL equ 30h JIBCDE equ 59h JOBCDE equ 5Ch SSCR0 equ 6Ch JBREAK equ 0BDh JKEYOF equ 0CCh JLTXTM equ 0D2h DBAABF equ 138h DTMABF equ 141h JL1CAL equ 159h REZEMU equ 2Dh WRZEMU equ 177h REMASK equ 198h external CURSS external CURSRD external INKEY RDRIPU OUTASC PRTOUT external PRSTA ;----------------------------------------------- ; externals aus ROM-BDOS ;----------------------------------------------- external BFLINI external BICOP external FORMA0 external SELDSK external HOME external SETTRK external SETSEC external BSETDMA external SECTRAN external READ external WRITE ;----------------------------------------------- defm 'AB' ;Kennzeichen defw DSKINI ;Adr. Initialisierung defw CALLUP ;Eintritt CALL defw 0 ;Eintritt Aufruf Zusatzgeraete defw 0 ;RAM-Reservierung defw 0 defw 0 defw 0 ;--------------------------------------------------- DCHARO ld a,(hl) and a ret z rst CHARO inc hl jr DCHARO ; DSKINI di ;Initialisierung I ld a,1 ;dse-ton ein out (70h),a ld a,(HLPBNK) and a ret m ;disk-ROM nicht da ! ; ld a,6 call DTMABF ;direkte Tastenabfrage di rrca jr c,DSKIN1 ;bit 0,a ? (kein shift) ld a,7 ;nein (shift) rst CHARO ;BEEP ld a,0FFh ;disk-ROM aus ld (HLPBNK),a xor a ;RBASIC ld (BSKENN),a ret ; Initialisierung disk-ROM DSKIN1 ld hl,LREUP ld de,ARAMDS ;Anfang disk-RAM and a sbc hl,de call nc,MEMNEU ;Speichergrenzen neu ret c ;reicht nicht ld hl,(EOFRM1) ld (EOFRAM),hl push hl inc hl ld (SYSANF),hl ;Anfang Systembereich ld hl,LREUP-ARAMDS ld bc,ARAMDS DSKIN4 xor a ;disk-RAM initialisieren ld (bc),a inc bc dec hl ld a,l or h jr nz,DSKIN4 ld (AUTOZN),hl ;= 0 ld a,6 call DTMABF ;dir. Tastenabfrage and 2 ;2 /CTRL, 0 CTRL ld (TAST),a ld a,7 rst CHARO ;BEEP ld hl,XNEW1A ld de,XNEW1 ;Initialisierung II initialisieren ld bc,5 ldir call BANK? ld (XNEW1+1),a ;richtige Bank eintragen pop de jr DSKINA XNEW1A rst L2CALL defb 0 defw DINIT ret ; DSKINA ld a,(TAST) and a call BFLINI ;Treiberinitialisierung ld hl,HLPBNK ;Init II durch inc (hl) ret ;--------------------------------------------------------- DINIT ld hl,XNEW1 ;Initialisierung II ld b,5 ;Aufruf aus Anlauf RBASIC DINIT1 ld (hl),0C9h inc hl ;Initialisierung loeschen djnz DINIT1 ld hl,HLPBNK xor a cp (hl) ld (hl),a ;HLPBNK loesch (Init I,II durch) ret p ;kein Init I, zurueck call BANK? ld (AKTBNK),a call DBAABF ;dir. Bankabfrage and 0Ch ;page 1 ld b,a ld a,(SLCTRL) and 0F3h or b ld (SLCTRL),a ;akt. slot eintragen ld a,0Dh ;Ende LINBUF setzen ld (LINBUF+13Ch),a ld a,(TAST) and a call INITBB ;BDOS initialisieren call BIOSLI ;BIOS Sprungleiste init. ld c,13 ;reset disk call BBDOS ld (RESDOK),a call PATCHI ;patches initialisieren ld c,0 ld sp,0C200h ; ld hl,SCPSYS ;SCPX5105.SYS da (Systemdisk) ? call FILDA? jr nz,DSKBAS ;nein ; call INSCPX ;Initialisierung SCPX ; DSKBAS LD A,1 ;Kennz. Disk-BASIC ld (BSKENN),a ld hl,AUTEXB ;AUTOEXEC.BAS da ? call FILDA? push af ld hl,RAUTEX ;Kommando laden ld de,EDIBUF+0Ah ld bc,17 ldir pop af jr z,DSKBA1 ;ja xor a ;nein ld (EDIBUF+0Dh),a ;Kommando loeschen DSKBA1 ld sp,0C200h ld hl,(ANFRAM) xor a ld (hl),a inc hl ld (PSTBEG),hl ld (hl),a inc hl ld (hl),a inc hl ld (SVARPT),hl ld hl,0FFFFh ld (ACTZN),hl ld a,(MAXFIL) call MXFIUP ld h,b ld l,c call MEMNEU ld sp,(STDPTR) ld ix,INIBA call JL1CAL ;Meldung RBASIC call OUZKSP ;Meldung Disk RBASIC ; defb 0Dh defb 0Ah defm 'RBASIC Disk Version 2.00' defb 0Dh defb 0Ah defb 0 ; ld hl,KOM7 push hl ld hl,EDIBUF+9 push hl ld hl,EDIBUF+40h push hl ld (hl),0E1h ;pop hl inc hl ld (hl),0C9h ;ret ld h,40h ;page address jp BANKUM ;ret --> KOM7, hl=Kommando ; SCPSYS defm 'SCPX5105SYS' AUTEXB defm 'AUTOEXECBAS' RAUTEX defm 'RUN"AUTOEXEC.BAS' defb 0 ; FILDA? ld a,(RESDOK) ;reset disk durch ? and a jr z,FILDA0 ;ja (RESDOK=0) inc a ; (oder 0FFh) ret nz ;nein (RESDOK=0FEh) FILDA0 xor a ld de,EDIBUF+1Bh ;fcb erstellen push de ;file name hl-> ld b,24h ;fcb-Laenge FILDA1 ld (de),a inc de djnz FILDA1 pop de push de inc de ld bc,11 ldir ;file name laden pop de ;fcb adr. ld c,15 ;open file call BBDOSX and 0FCh ;Fehler ? ret ; MXFIUP inc a ld c,a ld de,0A4h ;Laenge bdos-fcb ld h,d ld l,d ld b,d call MLT16 ld hl,(EOFRAM) and a sbc hl,bc ld (ADFCB0),hl ret ; ;---------------------------------------------- GERDSX inc sp inc sp jp GERDS ;------------------------------- PATCHI ld hl,GERDSX ;Initialisierung patches ld de,XGERDS ld bc,5 ;zuerst XGERDS ldir ld hl,PATCHT ;Adresstabelle PATCH1 ld e,(hl) inc hl ld d,(hl) inc hl ld a,e or d ret z ;fertig ex de,hl ld (hl),0F7h ;rst L2CALL inc hl ld a,(AKTBNK) ld (hl),a ;Bank inc hl ex de,hl ldi ;Adresse ldi ld a,0C9h ;ret ld (de),a jr PATCH1 ;-> weiter ; PATCHT defw XNAME defw NAME defw XKILL defw KILL defw XCOPY defw COPY defw XLSET defw LSET defw XRSET defw RSET defw XFIELD defw FIELD defw XMKI defw MKI defw XMKS defw MKS defw XMKD defw MKD defw XCVI defw CVI defw XCVS defw CVS defw XCVD defw CVD defw XZUGDS defw ZUGDS defw XOPDS defw OPDS defw XOPERW defw OPERW defw XCLODS defw CLODS defw XBLOAD defw DBLOAD defw XBSAVE defw DBSAVE defw XFILSA defw FILSA defw XFILLO defw FILLO defw XFILES defw FILES defw XFILGE defw FILGE defw XFILLS defw FILLS defw XZMODS defw ZMODS defw XLOC defw LOC defw XLOF defw LOF defw XEOF defw EOF defw XLINPD defw LINPD defw XFILDS defw FILDS defw XGERST defw GERST defw XERR2 defw ERR2 defw XRESET defw RESET defw XMXFIL defw MXFIL defw XCLEAR defw CLEARD defw JPBDOS defw BBDOS defw 0 ;---------------------------------------------------- BIOSLI ld hl,BIODSL ;BIOS-DSK-Sprungleiste ld de,BIORSL ;Sprungleiste im RAM ld bc,63 ;21 BIOS-Rufe ldir ret ; BIODSL jp ERFC ;CBOOT jp ERFC ;WBOOT jp INKEY ;CONST jp RDRIPU ;CONIN jp OUTASC ;CONOUT jp PRTOUT ;LIST jp ERFC ;PUNCH jp ERFC ;READER jp HOME jp SELDSK jp SETTRK jp SETSEC jp BSETDMA jp READ jp WRITE jp PRSTA ;LISTST jp SECTRAN jp ERFC ;CONOST jp ERFC ;AUXIST jp ERFC ;AUXOST jp ERFC ;DEVTBL ;---------------------------------------------------- MEMNEU ld a,l or h ret z xor a sub l ld l,a ld a,0 sbc a,h ld h,a ld c,l ld b,h add hl,sp ;hl = sp - hl ccf ret c ld de,(ANFRAM) sbc hl,de ret c ld a,h cp 2 ret c push bc ld hl,0 add hl,sp ld e,l ld d,h add hl,bc push hl ld hl,(STDPTR) and a sbc hl,de ld c,l ld b,h inc bc pop hl ld sp,hl ex de,hl ldir pop bc ld hl,(EOFRAM) add hl,bc ld (EOFRM1),hl ld de,0FDD4h ;-2*(114h+2), BASIC-fcb + Adr. add hl,de ld (ATBFCB),hl ex de,hl ld hl,(RAMTOP) add hl,bc ld (RAMTOP),hl ld hl,(ACTDMA) add hl,bc ld (ACTDMA),hl ld hl,(STDPTR) add hl,bc ld (STDPTR),hl dec hl dec hl ld (HELPSP),hl ld l,e ld h,d inc hl inc hl inc hl inc hl ld a,(MAXFIL) ;Anzahl fcb's inc a MEMNE2 ex de,hl ld (hl),e ;ATBFCB fuellen inc hl ld (hl),d inc hl ex de,hl ;fcb's initialisieren ld bc,7 ld (hl),b add hl,bc ld (hl),b ld bc,10Dh add hl,bc dec a jr nz,MEMNE2 ret ; OUZKSP ex (sp),hl call STROUT ex (sp),hl ret ; STROUT ld a,(hl) inc hl and a ret z call ICONOUT jr STROUT ; BANK? call DBAABF rrca rrca and 3 ret ; CALLUP ld a,(XZUGDS) cp 0C9h scf ret z push hl call BANK? ld hl,AKTBNK cp (hl) jr nz,CALLU5 ld hl,CALLTB CALLU1 ld de,NACALL CALLU2 ld a,(de) cp (hl) inc de inc hl jr nz,CALLU4 and a jr nz,CALLU2 ld a,(hl) inc hl ld h,(hl) ld l,a ex (sp),hl call DTCHAR scf ccf ret CALLU3 inc hl ld a,(hl) CALLU4 and a jr nz,CALLU3 inc hl inc hl inc hl ld a,(hl) and a jr nz,CALLU1 CALLU5 pop hl scf ret ; CALLTB defm 'FORMAT' defb 0 defw FORMAT defm 'BICOP' defb 0 defw BICOP defb 0 ; FORMAT push hl call z,FORMA0 pop hl and a ret ; LDDSK ld a,d ;Geraetekennzeichen LDDSK1 dec a ret p ;expliz. Diskdrive ld a,(DEFDRV) ;default ret ; MXFIL call MXFIUP ;bdos-fcb's anlegen ld (EOFRM1),hl ;Oberkante BASIC-fcb's ret ; CLEARD ld bc,-442 ;notwendiger Platz je ret ;bdos- + BASIC-fcb ; SUFCB push hl ;FCB-Adresse suchen push de push bc call LDDSK ld c,a ld hl,(ATBFCB) ld a,(MAXFIL) SUFCB1 push af ld e,(hl) inc hl ld d,(hl) inc hl push hl ex de,hl ld a,(hl) ;mode and a ;file offen ? jr z,SUFCB4 ;nein inc hl inc hl inc hl inc hl ld a,(hl) ;Geraet cp 17 ;=Disk ? jr nc,SUFCB4 ;nein dec hl dec hl ld d,(hl) dec hl ld e,(hl) ld a,(de) ;byte 0 bdos-fcb call LDDSK1 cp c jr nz,SUFCB4 inc de ld hl,AUTSTL ld b,11 SUFCB2 ld a,(de) ;Namen vergleichen and 7Fh cp 3Fh jr z,SUFCB3 cp (hl) jr nz,SUFCB4 SUFCB3 inc de inc hl djnz SUFCB2 pop hl pop hl jr END2 ;fertig, file gefunden SUFCB4 pop hl pop af dec a jp p,SUFCB1 ;nicht gefunden, weiter jr END2 ; SUCHF push hl push de push bc ld a,d ;Geraet ld (EDIBUF+0Ah),a call NAUML call SUCHF1 ;set dma, search first jr END2 ; SUCHF1 ld de,EDIBUF+54h ld c,26 ;set dma address call BBDOSX ld de,EDIBUF+0Ah ;fcb address xor a ld (EDIBUF+16h),a ld c,17 ;search for first call BBDOSX cp 0FFh ;Fehler ? ret ; NAUML ld de,EDIBUF+0Bh ;Namen umladen in Hilfs-fcb NAUML1 ld hl,AUTSTL ld bc,11 ldir ret ; STACKM push hl ;Stackmanipulation fuer push de ;nachfolgende Disk-Zugriffe push bc push af ld hl,16 add hl,sp push ix pop bc ld (hl),c inc hl ld (hl),b ld hl,10 add hl,sp ex de,hl jr STAKM4 STAKM2 push iy pop bc STAKM3 ld c,(hl) ld a,(de) ld (hl),a ld a,c ld (de),a inc hl inc de djnz STAKM3 STAKM4 ld hl,18 add hl,sp ld a,e sub l ld a,d sbc a,h jr c,STAKM2 END1 pop af END2 pop bc pop de pop hl ret ; ZUGDS ld ix,LWRUP+6 ;Disk-Zugriff ld iy,200h call STACKM pop hl ld a,(hl) ;modus and a ret ; OPDS ld bc,80h ;Auswertung fuer LEN=... ld (RECLEN),bc ;Standard merken call DTCHAR ;Anweisungsende ? ld a,e ;File-Nr. ret z ;ja push af push hl ld hl,12 add hl,sp ld a,(hl) cp 4 ;mode = random ? jp nz,ERDSN ;nein inc hl ld a,(hl) ;Geraet = Disk ? cp 17 jp nc,ERDSN ;nein pop hl call DCPSTX defb 0FFh ;Funktion call DCPSTX defb 92h ;LEN call DCPSTX defb 0EFh ;= ld ix,INTPA2 call JL1CAL ;integer par. dec de inc d dec d ;<100h ? jp nz,ERDFC inc de ;i.O. ld (RECLEN),de pop af ret ; OPERW ret nc ;OPEN fuer Diskette ld ix,LWRUP+6 ld iy,400h call STACKM call NACOF4 ;unzulaessige Zeichen ? call SUFCB ;file auf anderen fcbs offen ? jp z,ERDALO ;ja ld (ACTFCB),hl ld a,e cp 4 ;random ? jr z,OPERW1 ld bc,80h ;Standard fuer sequentielle files ld (RECLEN),bc OPERW1 pop af push af ;file nr push hl ;fcb address push de ;d=Geraet, e=mode ld e,a ;file nr ld a,(MAXFIL) cp e jp c,ERDBFN ; ld bc,0A4h ;Laenge bdos-fcb ld d,b ld hl,(ADFCB0) call MLT16 xor a ld hl,12 ;extent=0 add hl,bc ld (hl),a pop de pop hl inc hl ;Laden BASIC-fcb mit Zeiger ld (hl),c ;auf bdos fcb inc hl ld (hl),b inc hl ld (hl),a ;last byte = 0 inc hl ld (hl),d ;Geraet = 0 inc hl inc hl ld (hl),a ;Fuellstand dma = 0 call SUCHF ;search for first push bc push de ld a,d ld (bc),a ld e,c ld d,b inc de call NAUML1 ;Dateinamen eintragen pop de pop bc ld a,e jr nz,OPERW3 ;file schon da ? and 86h ;nein -> INPUT oder APPEND ? jp z,ERDFNF ; ja -> file not found ; OPERW2 push de ;fuer OUTPUT und SAVE push bc ;und RANDOM, wenn noch nicht da push af ;z - file schon da, nz - nicht da ld e,c ld d,b call INIFCB pop af ;file schon da ? jr nz,OPERW8 ;nein push de ld c,19 ;delete file call BBDOSX pop de cp 0FFh ;Fehler ? jp z,ERWPRT ;write protected OPERW8 ld c,22 ;make file call BBDOSX inc a jp z,ERTOOM ;too many files OPERW7 pop hl pop de ld hl,(ACTFCB) ld (hl),e ;mode eintragen END3 pop af pop hl ret OPERW3 cp 8 ;file schon da jr z,OPERW5 ;-> APPEND cp 2 jr z,OPERW2 ;-> OUTPUT cp 80h jr z,OPERW2 ;-> SAVE push de ;INPUT und random, wenn schon da push bc ld e,c ld d,b call INIFCB ld c,15 ;open file call BBDOSX pop hl pop de ld hl,(ACTFCB) ld (hl),e ld a,e cp 4 ;random ? jr z,END3 ;ja, fertig push hl ;nein, erstes Zeichen lesen ld hl,HLPERR xor a cp (hl) ld (hl),a pop hl jr nz,END3 ld bc,6 ;read/write-Zeiger in dma-Bereich add hl,bc push hl call ZEILES ;Zeichen lesen pop hl dec hl dec hl dec hl ld (hl),a ;last byte cp 0FFh ;Programm-Datei ? jr nz,END3 ;nein inc hl ;ja inc hl inc hl inc hl ld (hl),80h OPERW4 jr END3 OPERW5 push bc ;fuer APPEND ld e,c ld d,b call INIFCB ld c,15 ;open file call BBDOSX ld hl,(ACTFCB) ld (hl),1 ;auf INPUT schalten ld bc,6 add hl,bc ld (hl),080h ;dma-Bereich leer ld hl,(ACTFCB) OPERW6 push hl call ZEILES ;Zeichen lesen aus file pop hl jr nc,OPERW6 ;bis Ende ld (hl),2 ;umschalten auf OUTPUT ld bc,6 add hl,bc ld a,(hl) sub 80h cpl ld (hl),a ;read/write pointer ld bc,103h add hl,bc ld c,(hl) inc hl ld b,(hl) dec bc ;basic loc dec ld (hl),b dec hl ld (hl),c call ACTBDO ld bc,20h add hl,bc dec (hl) ;bdos cr dec pop hl jr OPERW4 ; MLT16 ld a,b ;bc:=bc*de+hl ld b,11h jr MLT163 MLT161 jr nc,MLT162 add hl,de MLT162 rr h rr l MLT163 rra rr c djnz MLT161 ld b,a ret ; INIFCB ld h,d ld l,e ld bc,0Ch ;hl: Anfang bdos fcb add hl,bc ;Loeschen ab extent ld c,84h ;bis Ende dma-Bereich INIFC1 ld (hl),b inc hl dec c jr nz,INIFC1 ld hl,(ACTFCB) ;hl: BASIC-fcb ld bc,5 add hl,bc ld (hl),80h ;rec len bdos inc hl ld (hl),b ;read/write pointer = 0 ld bc,103h add hl,bc ;rrn BASIC (loc) push hl ld b,11 xor a INIFC2 ld (hl),a inc hl djnz INIFC2 pop hl inc hl inc hl ld bc,(RECLEN) ;user set record size ld (hl),c ;bei random, sonst 80h inc hl ld (hl),b ret ; ZMODS ld ix,LWRUP+6 ;1 byte fuer INPUT#, LINE INPUT# ld iy,600h call STACKM call ZEILES ;byte lesen einschl. record jp END2 ;fertig ; ZEILE call ZEILS ;Zeichen lesen ld (hl),0 ;last byte loeschen ret ; ZEILES call ZEILS ;Zeichen lesen mit Test ret c ;auf EOF (1Ah) cp 1Ah scf ccf ret nz scf ret ; ZEILS ld hl,(ACTFCB) ;BASIC-fcb Zeichen lesen ld a,(hl) ;mode cp 1 ;= INPUT ? jp nz,ERBMOD ;bad file mode inc hl inc hl inc hl ;last byte push hl ld a,(hl) and a ;schon was gelesen ? jr nz,ZEILS1 ;ja, EOF-Test inc hl inc hl ZEILS6 inc hl ;Lesezeiger ld a,(hl) or a jr z,ZEILS2 ;dma-Bereich leer -> record lesen dec hl ;Zeichen lesen ld a,(hl) ;rec len inc hl sub (hl) ;Lesezeiger dec (hl) ld c,a ld b,0 ;bc: neuser Lesezeiger call ACTBDO ;hl: akt. bdos fcb ld de,24h ;Anfang dma bereich add hl,de add hl,bc ;Zeichen aus dma-Bereich ld a,(hl) ;lesen ZEILS1 ld b,a sub 1Ah ;EOF-Test sub 1 ;EOF-CY=1, <>EOF-CY=0 ld a,b ;Zeichen pop hl ;last byte ld (hl),0 ;fuer <>EOF ret nc ld (hl),a ;fuer EOF ccf ret ZEILS2 call RECLES jr z,ZEILS6 ;Zeichen lesen ld a,1Ah ;EOF bei Fehler scf pop hl ld (hl),a ret ; RECLES ld hl,(ACTFCB) ;BASIC fcb ld bc,109h ;BASIC rrn add hl,bc ; =+1 ld c,(hl) inc hl ld b,(hl) inc bc ld (HL),b dec hl ld (hl),c call ACTBDO ;bdos fcb push hl ld bc,24h add hl,bc ;akt. dma-Adresse push hl ld c,80h ;loeschen ZEILS3 ld (hl),0 inc hl dec c jr nz,ZEILS3 pop de ld c,26 ;set dma address call BBDOSX pop de push de ld c,20 ;sequential read call BBDOSX pop de and a ;Fehler? push af ld hl,21h ;bdos rrn add hl,de inc (hl) ; =+1 jr nz,ZEILS4 inc hl inc (hl) jr nz,ZEILS4 inc hl inc (hl) ZEILS4 pop af ld a,0 ld hl,(ACTFCB) ;Lesezeiger ld bc,6 add hl,bc jr nz,ZEILS5 ;bei Fehler ld a,80h ZEILS5 ld (hl),a ;0 bei Fehler, sonst 80h dec hl ld (hl),80h ;rec len ret ; ACTBDO ld hl,(ACTFCB) ACTBDP inc hl ld a,(hl) inc hl ld h,(hl) ld l,a ;hl: bdos fcb ret ; LINPD push hl push de ld hl,0Ah add hl,sp ld de,LINP14 ld (hl),e inc hl ld (hl),d pop de pop hl inc hl inc hl inc hl ld (hl),c ;Zeichen in last byte eintragen ret ; FILLS ld ix,LWRUP+6 ;von PRINT# ld iy,800h call STACKM ld a,(hl) cp 2 ;OUTPUT ? jp nz,ERBMOD ;nein -> bad file mode pop af push af call ZEINTR ;byte eintragen, u.U. rec aus jp END1 ;fertig ; ZEINTR ld hl,(ACTFCB) push hl ld bc,6 ;write pointer add hl,bc ld e,a inc (hl) ld a,(hl) cp 80h ;record voll ? push af ;merken ld c,a push bc call ACTBDO ld bc,23h ;hl: dma-Bereich add hl,bc pop bc add hl,bc ;Zeichenadr. in dma-Ber. ld (hl),e ;Zeichen eintragen pop af pop hl ;BASIC fcb ret nz ;record nicht voll ; RECAUS push hl ;voll, ausgeben ld bc,6 add hl,bc ld (hl),0 ;write pointer = 0 call ACTBDO ;bdos fcb push hl ld bc,24h add hl,bc ;dma-Bereich ex de,hl ld c,26 ;set dma address call BBDOSX pop de push de ld c,21 ;sequential write call BBDOSX pop de push de push af ld hl,21h ;bdos rrn = +1 add hl,de inc (hl) jr nz,RECAU1 inc hl inc (hl) jr nz,RECAU1 inc hl inc (hl) RECAU1 pop af and a jr z,RECAU2 pop de ;bdos fcb xor a pop hl ;BASIC fcb ld (hl),a ld c,16 ;close file call BBDOSX jp ERFULL ;disk full RECAU2 pop hl ;bdos fcb pop hl ;BASIC fcb push hl ld de,109h add hl,de ;BASIC rrn ld e,(hl) ; =+1 inc hl ld d,(hl) inc de ld (hl),d dec hl ld (hl),e pop hl ;BASIC fcb and a ret ; CLODS ld ix,LWRUP+6 ;CLOSE fuer Disk ld iy,400h call STACKM pop hl ld a,(hl) and 82h ;OUTPUT, SAVE ? jr z,CLODS1 ;nein xor a push hl ld hl,HLPERR cp (hl) ld (hl),a pop hl jr nz,CLODS1 ld a,1Ah call ZEINTR ;EOF eintragen fuer OUTPUT call nz,RECAUS ;rec ausgeben CLODS1 push hl inc hl ld e,(hl) inc hl ld d,(hl) ld c,16 ;close file call BBDOSX pop hl push hl ld de,7 add hl,de ld (hl),d ld l,d ld h,d ld (ACTFCB),hl ;loeschen pop hl inc (hl) dec (hl) ld (hl),d ;mode loeschen pop hl ret ; FILSA call STCKM ;Stackmanipul. push hl ld ix,REN10 ;Zeiger bereinigen call JL1CAL ld a,0FFh ;Kennzeichen Programm call ZEINTR ;Zeichen eintragen in record ld hl,(SVARPT) ex de,hl ld hl,(PSTBEG) FILSA2 rst CPREG ;Anfang - Ende ? jr z,FILSA1 ;fertig -> CLOSE ld a,(hl) ;Zeichen holen inc hl push hl push de call ZEINTR ;Zeichen eintragen in record pop de pop hl jr FILSA2 FILSA1 xor a ld (LMAFL),a pop hl ld ix,CLOSE1 jp JL1CAL ; FILLO ld ix,FCBBE5 ;LOAD interner Code ld iy,200h call STACKM pop af jp z,ERBMOD ;bad file mode ld hl,(ACTFCB) ;BASIC fcb push hl call ZEILES ;Zeichen lesen 0FFh inc a ;interner Code? jp nz,ERBMOD ;nein -> bad file mode ld hl,(PSTBEG) ;Anfang FILLO1 ex de,hl ld hl,(STDPTR) ;Adr. Stack ld bc,0FF6Dh ;-93h add hl,bc rst CPREG ex de,hl ;Zeiger in BASIC Programm jp c,ERDMO ;out of memory ex (sp),hl ;BASIC fcb, (Zeiger) push hl ;(BASIC fcb), (Zeiger) call ZEILE ;Zeichen lesen pop hl ex (sp),hl ;Zeiger, (BASIC fcb) jr c,FILLO2 ;fileende gefunden (kein weiterer rec) ld (hl),a ;Zeichen eintragen inc hl ;Zeiger weiterstellen jr FILLO1 ;weiter FILLO2 ld ix,PTNEW ;Folgezeiger call JL1CAL ;neu stellen inc hl ld (SVARPT),hl ld (DVARPT),hl ld (FSLPTR),hl ld ix,CLOSEA call JL1CAL pop hl ld a,(AUTSTL) and a ret z ;ohne Autostart xor a ld (LMAFL),a ld hl,FILLOT ;5 byte RUN anhaengen ld de,EDIBUF+0Ah ld bc,5 push de ldir pop hl ld ix,RUNMOD jp JL1CAL FILLOT defb ':' defb 08Ah ;RUN token defb 0 defb 0 defb 0 ; SAVHL push hl ;hl -> record ld a,l call ZEINTR pop hl ld a,h call ZEINTR ret ; DBSAVE ret nc call STCKM ;SAVE Maschinencode push de call KADTDE ;Anfangsadresse ld (STADR),de push de call KADTDE ;Endadresse ld (LADBSA),de ex (sp),hl ex de,hl rst CPREG jp c,ERDFC ;Anf>End -> ill. function call ex de,hl ex (sp),hl call DTCHAR scf ;RAM jr z,DBSAV2 ;Anweisungsende call DCPSTX ;es kommt noch was defb ',' cp 'Z' jp z,DBSAVG cp 'S' ;aus Bildspeicher ? jr nz,DBSAV1 ;nein call DTCHA0 and a ;screen jr DBSAV2 ;ja, ohne Startadr. DBSAV1 call ADTDEX ;Startadresse ld (STADR),de scf DBSAV2 pop bc jr nc,DBSAV3 ;-> screen inc b ;Anfangsadr. < 8000h ? dec b jp p,ERDFC ;ja -> ill. function call DBSAV3 pop de push hl push bc push af xor a ;file #0 ld e,2 ;OPEN FOR OUTPUT ld ix,OPEN4 call JL1CAL pop af push af ld a,0FEh ;MC jr c,DBSAVD ld a,0FDh ;Screen DBSAVD call ZEINTR ;eintragen pop af pop hl push hl push af call SAVHL ;Anfangsadr ld hl,(LADBSA) call SAVHL ;Endadr ld hl,(STADR) call SAVHL ;Startadr eintragen pop af pop de ld hl,(LADBSA) ;Endadr jr nc,DBSAV4 ;Screen DBSAV5 ld a,(de) ;Zeichen holen push de push hl call ZEINTR ;und ausgeben pop hl pop de rst CPREG jr z,DBSAV6 jr c,DBSAV6 inc de jr DBSAV5 DBSAV6 xor a ld ix,CLOSE1 ;CLOSE call JL1CAL jp END4 ; DBSAV4 push hl call CURSRD ;Kursoradr lesen ld (HARI5),hl ;retten call KRAUS pop hl ld de,(STADR) and a sbc hl,de inc hl ld (LADBSA),hl ;Laenge gesamt call BLSIZE ;Blockgroesse bestimmen push hl ld de,(LADBSA) ld a,d or e jr nz,DBSA11 scf push af jr DBSA10 DBSAV7 push hl ;Laenge rec DBSA11 ld de,(LADBSA) ;Restlaenge gesamt rst CPREG push af ld c,e ld b,d jr nc,DBSAVC jr z,DBSAVC DBSA10 ld c,l ;bc: Anzahl ld b,h DBSAVC ld hl,(STADR) ;Anfang push hl add hl,bc ld (STADR),hl ;neuer Anfang pop hl ;Anfang ld de,(HIADR) call JIBCDE ;Lesen von VDP,bc mal nach de pop af jr nc,DBSAV8 pop hl push hl call DBSAVA ld hl,(LADBSA) ;Laenge gesamt pop de ;Laenge rec and a sbc hl,de ;- Anzahl ld (LADBSA),hl ex de,hl jr DBSAV7 ;weiter DBSAV8 pop hl ;Rest ausgeben ld hl,(LADBSA) call DBSAVA ld hl,(HARI5) ;Kursoradr reg. call CURSS call KREIN DBSAVJ jr DBSAV6 ;fertig, CLOSE DBSAVA ld b,l ;80 bytes sla b ;oder weniger von SCREEN-Puffer ld hl,(HIADR) ;ausgeben DBSAVB ld a,(hl) push bc push hl call ZEINTR ;in file pop hl inc hl pop bc djnz DBSAVB ret ; DBSAVG call DTCHA0 ;BSAVE Zeichengenerator pop bc ;Anfangsadr. ld a,b and a jp nz,ERDFC ;Anfang > 255 -> ill.f.call pop de push hl push bc ;Anfangsadr. xor a ;file #0 ld e,2 ;OPEN FOR OUTPUT ld ix,OPEN4 call JL1CAL ld a,0FCh ;ZG call ZEINTR pop hl call SAVHL ;Anfang ld hl,(LADBSA) call SAVHL ;Ende ld hl,(STADR) call SAVHL ;Start ld hl,(LADBSA) ;letzte Zeichennummer ld de,(STADR) ;erste Zeichennummer in e and a sbc hl,de inc hl ;Zeichenanzahl (max 256) ld c,e ;Zeichennr. in c DBSAVH ld a,h or l jr z,DBSAVJ ;fertig push hl ;Anzahl push bc ;Nr. ld a,c call REZEMU ld b,8 ld hl,ZEIPUF DBSAVI ld a,(hl) push hl push bc call ZEINTR pop bc pop hl inc hl djnz DBSAVI pop bc pop hl dec hl ;Anzahl-=1 inc c ;naechstes Zeichen jr DBSAVH ; DBLOAD ret nc call STCKM ;BLOAD MC push de xor a ld (AUTOST),a ld c,a ld b,a call DTCHAR ;Anweisungsende ? jr z,DBLOA3 ;ja call DCPSTX ;nein defb ',' cp 'R' ;Autostart ? jr z,DBLOA1 ;ja cp 'S' ;nein, in Bildspeicher ? jr z,DBLOA1 ;ja cp 'Z' ;nein, in ZG ? jr nz,DBLOA2 ;nein DBLOA1 ld (AUTOST),a call DTCHA0 jr z,DBLOA3 ;Anweisungsende call DCPSTX defb ',' DBLOA2 call ADTDEX ;Verschiebung ld b,d ld c,e DBLOA3 pop de push hl push bc ld a,0FFh ld (HLPERR),a xor a ld e,1 ;OPEN FOR INPUT ld ix,OPEN4 call JL1CAL call ZEILE pop bc ;Verschiebung push af ;file type call LSHLBC ;2 byte lesen, + Verschiebung push hl call LSHLBC ;das 3 x push hl call LSHLBC ld (STADR),hl ;Startadr pop hl ;Endadr pop bc ;Anfadr and a sbc hl,bc inc hl ;Laenge ld (HIADR),hl ld a,(AUTOST) cp 'S' jp z,DBLOA6 ;S -> in screen cp 'Z' jp z,DBLOAG ;Z -> in ZG DBLOA4 pop af ;file type cp 0FEh ;MC RAM jp nz,ERBMOD DBLOAE ld a,h ;Laenge = 0 ? or l jr z,DBLOA5 ;ja, fertig push hl ;Laenge push bc ;Adresse call ZEILE ;Zeichen aus file in a pop bc pop hl ld (bc),a ;in Speicher dec hl inc bc jr DBLOAE DBLOA5 ld ix,AUSGE ;Endebehandlung call JL1CAL xor a ld ix,CLOSE1 ;file 0 close call JL1CAL ld hl,DBLOAB push hl ld a,(AUTOST) ;Autostart? and a ret z ;nein ld hl,(STADR) ;ja push hl ret DBLOAB pop hl ret ; DBLOA6 call CURSRD ;Kursor retten ld (HARI5),hl call KRAUS call REMASK ;Schreibmaske ruecksetzen pop af ;file type cp 0FDh jp nz,ERBMOD ld hl,(HIADR) ld (LADBSA),hl call BLSIZE ;(HIADR)=Pufferad, hl=Laenge DBLOA7 push hl ld de,(LADBSA) ;Laenge in screen rst CPREG push af ld c,e ld b,d jr nc,DBLOAC jr z,DBLOAC ld c,l ld b,h ;Anzahl words in bc DBLOAC ld hl,(STADR) ;Anfang push hl add hl,bc ld (STADR),hl ;Anfang' pop de ;Anfang ld hl,(HIADR) call DBLOA9 ;Lesen aus file in Puffer ex de,hl call JOBCDE ;Schreiben in VDP, bc mal pop af ;weiter? jr nc,DBLOA8 ;nein ld hl,(LADBSA) pop de and a sbc hl,de ld (LADBSA),hl ex de,hl jr DBLOA7 DBLOA8 ld hl,(HARI5) ;Kursor reg. call CURSS call KREIN pop bc DBLOAH xor a ld (AUTOST),a jr DBLOA5 DBLOA9 push bc ;Anzahl (words) push de ;Ziel in screen push hl ;Quelle in Puffer ld b,c sla b ;*2 (bytes) ld hl,(HIADR) DBLOAA push bc push hl call ZEILE ;Zeichen lesen aus file pop hl ld (hl),a ;eintragen in Puffer inc hl pop bc djnz DBLOAA pop hl ;Puffer gefuellt pop de ;Register reg. pop bc ret ; DBLOAG pop af ;file type cp 0FCh ;ZG ? jp nz,ERBMOD DBLOAJ ld a,h ;hl - Anzahl or l ;(b)c - erste Zeichennummer jr z,DBLOAH ;fertig push hl ;Restanzahl push bc ;Zeichen-Nr. ld b,8 ;8 bytes pro Zeichen ld hl,ZEIPUF ;Pufferadr. DBLOAI push hl push bc call ZEILE pop bc pop hl ld (hl),a inc hl djnz DBLOAI pop bc ;Zeichen-Nr. push bc ld hl,ZEIPUF ;Pufferadr. call WRZEMU pop bc inc c ;naechstes Zeichen pop hl ;Anzahl dec hl ;-1 jr DBLOAJ ; LSHLBC push bc ;2 byte aus file, + bc call ZEILE ;(Adresse + Verschiebung) push af call ZEILE ld h,a pop af ld l,a pop bc add hl,bc ret ; KADTDE call DCPSTX defb ',' ADTDEX ld ix,ADTDE jp JL1CAL ; KAUS defb 1Bh ;ESC defm 'x5' defb 0 KEIN defb 1Bh defm 'y5' defb 0 KRAUS push hl ld hl,KAUS KRAUS1 call STROUT pop hl ret KREIN push hl ld hl,KEIN jr KRAUS1 ; FILGE ld ix,LWRUP+6 ;GET und PUT ld iy,400h call STACKM ;Stackmanipul ld a,(hl) cp 4 ;random ? jp nz,ERBMOD ;bad file mode pop bc pop af ld (HPUGE),a ;PUT/GET push bc ld bc,10Fh ;BASIC rrn add hl,bc ld e,(hl) inc hl ld d,(hl) inc de ;rrn = +1 ex (sp),hl ;(fcb+110h), Zeiger call DTCHAR jr z,FILGE1 ;Anweisungsende call DCPSTX defb ',' ld ix,INTDE2 ;rec nr uebernehmen call JL1CAL FILGE1 ex (sp),hl ;fcb+110h, (Zeiger) bit 7,d ;< 32768 ? jp nz,ERDFC ;ill. function call ld a,e or d jp z,ERDFC ;=0 -> dto. dec hl ;BASIC random rrn ld (hl),e ;eintragen inc hl ld (hl),d dec de ;rrn-1 inc hl inc hl xor a ld (hl),a inc hl ld (hl),a ld bc,-8 add hl,bc ;user set record size ld a,(hl) inc hl ld h,(hl) ld l,a ex de,hl push de ;rec size push hl ;rec nr ld hl,80h rst CPREG ;rec size = 80h ? pop hl jr nz,FILGE2 ld de,0 jr FILGE9 ;fuer rec size = 80h FILGE2 ld b,d ;<> 80h ld c,e ld a,10h ex de,hl ld hl,0 push hl FILGE3 add hl,hl ex (sp),hl jr nc,FILGE4 add hl,hl inc hl jr FILGE5 FILGE4 add hl,hl FILGE5 ex (sp),hl ex de,hl add hl,hl ex de,hl jr nc,FILGE7 add hl,bc ex (sp),hl jr nc,FILGE6 inc hl FILGE6 ex (sp),hl FILGE7 dec a jr nz,FILGE3 ld a,l and 7Fh ld e,a ld d,0 pop bc ld a,l ld l,h ld h,c add hl,hl jp c,ERDFC ;ill. function call rla jr nc,FILGE8 inc hl FILGE8 ld a,b or a jp nz,ERDFC ;ill. function call FILGE9 ld (HRECNU),hl ;rec nr retten ld bc,(ACTFCB) ld hl,9 ;Anfang FIELD-Bereich add hl,bc ld (HFIELD),hl FILGEA call ACTBDO ;Anfang dma-Bereich ld bc,24h add hl,bc add hl,de ;rec size' ld (HDMAB),hl ld hl,80h ld a,l sub e ld l,a ld a,h sbc a,d ld h,a pop de push de ;rec size rst CPREG jr c,FILGEB ld h,d ld l,e FILGEB ld a,(HPUGE) or a ;PUT oder GET ? jr z,FILGEE ;GET ld de,80h ;PUT rst CPREG jr nc,FILGEC push hl call FILGEG pop hl FILGEC push bc ld b,h ld c,l ld hl,(HDMAB) ex de,hl ld hl,(HFIELD) call FILGEJ ;umladen bc * ld (HFIELD),hl ld d,b ld e,c pop bc call FILGEF FILGED pop hl ld a,l sub e ld l,a ld a,h sbc a,d ld h,a or l ld de,0 push hl ld hl,(HRECNU) inc hl ld (HRECNU),hl jr nz,FILGEA pop hl jp END4 ; FILGEE push hl ;GET call FILGEG pop hl push bc ld b,h ld c,l ld hl,(HFIELD) ex de,hl ld hl,(HDMAB) call FILGEJ ;umladen ex de,hl ld (HFIELD),hl ld d,b ld e,c pop bc jr FILGED FILGEF defb 0F6h ;a<>0 : Schreiben (or 0AFh) FILGEG xor a ;a=0 : Lesen ld (HFLAG),a push bc push de push hl ld hl,(HRECNU) ex de,hl ld hl,(ACTFCB) ld b,h ld c,l ld hl,10Dh ;? add hl,bc push hl ld a,(hl) inc hl ld h,(hl) ld l,a inc de rst CPREG pop hl ld (hl),e inc hl ld (hl),d jr nz,FILGEH ld a,(HFLAG) or a jr z,FILGEI FILGEH ld hl,FILGEI push hl push bc push hl ld hl,10Ah ;LOC input/output add hl,bc jr SATZLS FILGEI pop hl pop de pop bc ret FILGEJ push bc ;bc mal (hl) -> (de) FILGEK ld a,(hl) ld (de),a inc hl inc de dec bc ld a,b or c jr nz,FILGEK pop bc ret ; SATZLS dec de ;rrn = -1 dec hl ;Adr r0 ld (hl),e ;rrn eintragen inc hl ld (hl),d ld hl,(ACTFCB) ld bc,5 add hl,bc ld (hl),80h ;Satzlaenge = 80h inc hl ld (hl),0 ;Lese/Schreibzeiger = 0 pop hl ex (sp),hl ld b,h ld c,l push hl call ACTBDO push hl pop bc ld hl,0Ch ;extent-Adr add hl,bc ld a,e rla ld a,d rla ld d,(hl) cp d ;im gleichen extent ? jr z,SATZL3 ;ja push de ;rrn push af ;neuer extent push hl ;extent-Adr push bc ;bdos fcb ld hl,ADFCB0 ;Standard dma fcb0 ld bc,24h add hl,bc ex de,hl ld c,26 ;set dma address call BBDOSX pop de push de ld c,16 ;close file call BBDOSX pop de ;bdos fcb pop hl ;extent-Adr pop af ;neuer ? ld (hl),a push de ld c,15 ;open file push de call BBDOSX pop de inc a ;schon da ? jr nz,SATZL2 ;ja, i.O. ld c,22 ;nein, neuen aufmachen call BBDOSX ;mit create file inc a ;Fehler ? jp z,ERTOOM ;too many files SATZL2 pop bc ;bdos fcb pop de ;rrn SATZL3 ld hl,20h add hl,bc ld a,e and 7Fh ;cr = rrn mod 80 ld (hl),a pop hl ;BASIC fcb ld a,(HFLAG) or a jr nz,SATZL5 ;fuer PUT call RECLES ;fuer Lesen pop hl ret ;Lesen fertig SATZL5 ld hl,20h ;PUT add hl,bc ld a,(hl) ;cr cp 7Fh ld de,EDIBUF+10 push af ;cr ? ld hl,24h add hl,bc ;BASIC dma push de push hl call z,SATZL6 ld hl,(ACTFCB) call RECAUS pop de pop hl pop af call z,SATZL6 ;u.U. rueckladen pop hl ret ;fertig SATZL6 push bc ;umladen 80h bytes ld b,80h SATZL7 ld a,(hl) inc hl ld (de),a inc de djnz SATZL7 pop bc ret ; FIELD call STCKM ;Stackmani FIELD cp '#' call z,DTCHA0 ld ix,BYTAE2 call JL1CAL jp z,ERDSN ;syntax error push hl ld ix,FCBAD call JL1CAL ld e,l ld d,h ;de: BASIC fcb jp z,ERDNOP ;file not open jp c,ERDFC ;ill function call ld a,(hl) cp 4 ;random ? jp nz,ERBMOD ;nein -> bad file mode ld bc,10Bh add hl,bc ld c,(hl) inc hl ld b,(hl) ;user set record size ld (EDIBUF+0Ah),bc ld hl,0 ;FIELD-Zwischensumme ld (EDIBUF+0Ch),hl ld bc,9 ;Anfang FIELD-Bereich pop hl ;Zeiger FIELD1 ex de,hl add hl,bc ex de,hl ;de: Adr Var in FIELD-Bereich ld a,(hl) cp ',' ret nz ;Ende push de ld ix,BYTAE1 ;Laenge in a call JL1CAL push af call DCPSTX defb 'A' ;AS call DCPSTX defb 'S' ld ix,DIM1 call JL1CAL ld ix,TYPTS0 call JL1CAL jp nz,ERDTM ;<>3 -> type mismatch pop af ex (sp),hl push de push hl ld hl,(EDIBUF+0Ch) ;FIELD-Zwischensumme ld c,a ld b,0 add hl,bc ;+ Laenge ld (EDIBUF+0Ch),hl ex de,hl ld hl,(EDIBUF+0Ah) ;user set record size rst CPREG jp c,ERDFOV ;field overflow pop de pop hl ld (hl),c ;Laenge und Adr inc hl ;der Var eintragen ld (hl),e inc hl ld (hl),d ld b,0 pop hl jr FIELD1 ; RSET defb 0F6h ;or 37h RSET LSET scf ; LSET call STCKM push af ld ix,DIM1 call JL1CAL ld ix,TYPTS0 call JL1CAL jp nz,ERDTM ;type mismatch push de ld ix,SNAL1 call JL1CAL pop bc ex (sp),hl push hl push bc ld ix,ZKUP2 call JL1CAL ld b,(hl) ex (sp),hl ld a,(hl) ld c,a push bc push hl push af inc hl ld e,(hl) inc hl ld d,(hl) or a jr z,RLSET5 ld hl,(ACTDMA) dec hl rst CPREG jr c,RLSET2 ld hl,(SVARPT) rst CPREG jr c,RLSET2 ld e,c ld d,0 ld hl,(STDPTR) add hl,de ex de,hl ld hl,(SWAPTR) rst CPREG jr c,RLSET9 pop af RLSET1 ld a,c ld ix,TSTZK ;noch Platz fuer Zk ? call JL1CAL pop hl pop bc ex (sp),hl push de push bc ld ix,ZKUP2 call JL1CAL pop bc pop de ex (sp),hl push bc push hl inc hl push af ld (hl),e inc hl ld (hl),d RLSET2 pop af pop hl inc hl ld e,(hl) inc hl ld d,(hl) pop bc pop hl inc hl ld a,(hl) inc hl ld h,(hl) ld l,a ld a,c cp b jr nc,RLSET3 ld b,a RLSET3 sub b ld c,a pop af call nc,RLSET7 inc b RLSET4 dec b jr z,RLSET6 ld a,(hl) ld (de),a inc hl inc de jr RLSET4 RLSET5 pop bc pop bc pop bc pop bc pop bc RLSET6 call c,RLSET7 pop hl ret RLSET7 ld a,' ' ;Leerzeichen auffuellen inc c RLSET8 dec c ret z ld (de),a inc de jr RLSET8 RLSET9 pop af pop hl pop bc ex (sp),hl ex de,hl jr nz,RLSETA push bc ld a,b ld ix,WLAZK1 call JL1CAL ld de,LENZK ld hl,(PDENBU) ld (AC1INT),hl ld a,3 ld (TYP),a call NLDIRT ld de,SWAPTR rst CPREG ld (PDENBU),hl jp z,ERDFTC ;string formula too complex pop bc RLSETA ex (sp),hl push bc push hl jp RLSET1 ; MKI ld a,2 ;MKI$ defb 1 MKS ld a,4 ;MKS$ defb 1 MKD ld a,8 ;MKD$ call STCKM push af ld ix,FN7 call JL1CAL pop af ld ix,WLAZK1 call JL1CAL ld hl,(ADRZK) call AC1HLT ld ix,CHR2 jp JL1CAL ; CVI ld a,1 ;CVI defb 1 CVS ld a,3 ;CVS defb 1 CVD ld a,7 ;CVD call STCKM push af ld ix,ZKUP2 call JL1CAL pop af cp (hl) jp nc,ERDFC ;ill function call inc a inc hl ld c,(hl) inc hl ld h,(hl) ld l,c ld (TYP),a jp HLAC1T ; EOF call STCKM ;EOF push hl ld (ACTFCB),hl call ZEILES ld hl,0 jr nc,EOF1 dec hl EOF1 push af call CINT1 pop af ;last byte pop hl inc hl inc hl inc hl ld (hl),a ;eintragen ld hl,0 ld (ACTFCB),hl ret ; FILES call STCKM ;FILES ld d,0 jr z,FILES1 call NACOFI push hl ;Dateinamen auswerten jr FILES2 FILES1 push hl call AUFNA1 ;auffuellen mit 11x'?' FILES2 call NAMUML ;Namen umladen ld a,(PTORSC) and a push af call SUCHF1 ;set dma, search first jp z,ERDFNF ;file not found push af ld ix,LSTRES call JL1CAL pop af FILES3 and 3 add a,a add a,a add a,a add a,a add a,a ld c,a ld b,0 ld hl,EDIBUF+84 add hl,bc inc hl ;user Kennzeichen ausblenden ld b,11 FILES4 ld a,(hl) and 7Fh ;bit 7 wegblenden inc hl rst CHARO ld a,b cp 4 jr nz,FILES6 ld a,(hl) cp 20h jr z,FILES5 ld a,2Eh FILES5 rst CHARO FILES6 djnz FILES4 call JBREAK ;STOP ? pop af push af ld a,(SPLAST) ld b,a ld a,(CRSSPI) jr z,FILES7 ld b,70 ;max. Zeilenlaenge Drucker ld a,(LPTPOS) FILES7 and a jr z,FILES9 add a,12 cp b jr nc,FILES8 ld a,20h rst CHARO scf ;NC vom Drucker unterdr. FILES8 ld ix,LSTRE1 call nc,JL1CAL FILES9 ld de,EDIBUF+0Ah xor a ld (EDIBUF+16h),a ld c,18 ;search next call BBDOSX cp 0FFh jr nz,FILES3 pop af ; ld hl,FILESY call DCHARO ;Neue Zeile ld c,31 ;DPB-Adresse call BBDOSX inc hl inc hl inc hl ld a,(hl) ;3/DPB - BLM inc a ld (BLGROS),a inc hl inc hl ;5,6/DPB - DSM ld e,(hl) inc hl ld d,(hl) inc de push de ;blocks/disk ld c,27 ;ALV-Adresse call BBDOSX ;hl: Adr. ALV pop de ;de: blocks/disk push de ld ix,0 ;ix: kumul.Blckanz. srl d rr e srl d rr e srl d rr e ;de: Laenge ALV in bytes FILESA ld a,(hl) ;ALV auswerten ld bc,800h ;b=8, c=0 FILESE rla jr c,FILESD inc c FILESD djnz FILESE add ix,bc inc hl ;naechste Adr. ALV dec de ld a,d or e ;fertig ? jr nz,FILESA ;nein pop de ld a,e and 7 jr z,FILESG ld b,a ld c,0 ld a,(hl) FILESH rla jr c,FILESI inc c FILESI djnz FILESH add ix,bc FILESG push ix ;ix: Anzahl freier blocks ld a,(BLGROS) ;records/block srl a srl a srl a srl a ;2^a k/block pop hl FILESF and a jr z,FILESC add hl,hl srl a jr FILESF FILESC ld ix,HAUZN call JL1CAL ld hl,FILESX call DCHARO ; END4 pop hl ld ix,AUSGE jp JL1CAL ; FILESX defm ' KBytes free' FILESY defb 0Dh defb 0Ah defb 0 ; KILL call STCKM call NACOF2 ;Namen call DTCHAR ret nz call SUFCB ;fcb suchen jp z,ERDFNF ;file not found call NAMUML push hl ld de,EDIBUF+0Ah ;Adr Name ld c,19 ;delete file call BBDOSX inc a jp z,ERWPRT ;write protected pop hl ret ; RESET call STCKM ret nz push hl ld ix,CLOSEA ;alle files schliessen call JL1CAL ld c,25 ;Abfrage Bezugs-LW call BBDOSX push af ;LW merken ld c,13 ;Disksytem ruecksetzen call BBDOSX pop af ld e,a ld c,14 ;altes LW einstellen call BBDOSX pop hl ret ; NAME call STCKM call NACOF2 ;old name call SUFCB ;fcb suchen jp z,ERSTIO ;file still open call NAMUML ;name umladen push hl call SUCHF1 ;set dma, search first jp z,ERDFNF ;file not found pop hl call DCPSTX defb 'A' call DCPSTX defb 'S' ;'AS' ? call NACOF2 ;new name ld a,d ld (EDIBUF+1Ah),a push hl push af ld de,EDIBUF+1Ah ;fcb-Adr new name xor a ld (EDIBUF+26h),a ld c,17 ;search first call BBDOSX cp 0FFh ;Fehler? jp nz,ERALEX pop af ld hl,(EDIBUF+0Ah) and a jr z,NAME1 cp l ;Laufwerke gleich ? jp nz,ERRENA ;nein -> rename across disk NAME1 ld de,EDIBUF+1Bh call NAUML1 ;name laden ld de,EDIBUF+0Ah ld c,23 ;rename file call BBDOSX pop hl ret ; NAMUML call LDDSK ;Umladen Namen inc a ld (EDIBUF+0Ah),a push hl push de call NAUML pop de pop hl ret ; DSKNAM ld ix,DATNA ;Dateinamen auswerten jp JL1CAL ; NACOFI call DSKNAM ;Dateinamen von FILES push hl ;auswerten und auffuellen ld hl,AUTSTL ld b,11 NACOF1 ld a,(hl) inc hl cp 20h jr nz,NACOF3 djnz NACOF1 call AUFNA1 jr NACOF3 NACOF2 call DSKNAM ;von KILL, NAME push hl NACOF3 ld hl,AUTSTL ld b,8 call AUFNAM ld b,3 call AUFNAM pop hl defb 0F6h ;or .. ('?' erlaubt) NACOF4 scf ;von OPEN, COPY ('?' verboten) push de push hl ld de,AUTSTL push de ld b,11 NACOF5 push bc ld a,(de) ld b,a push af cp 80h ;Zeichen > 7Fh ? jr nc,NAMT3 ;ja -> Fehler cp 'a' jr c,NACOF7 ;< 61h, unveraendert cp '{' jr nc,NACOF7 ;>= 7Bh, unveraendert and 5Fh ld b,a ld (de),a NACOF7 pop af ld a,b ld hl,NACOFT ;Zeichentabelle ld bc,13 ;Laenge Tab jr c,NACOF6 dec bc NACOF6 cpir jr z,NAMT3 ;verbotenes Zeichen ? pop bc ;nein inc de djnz NACOF5 pop hl call NAMT pop hl pop de ret NACOFT defb '.' ;verbotene Zeichen defb '"' defb '/' defb '\' defb '[' defb ']' defb ':' defb '+' defb '=' defb ';' defb ',' defb '*' defb '?' ; NAMT ld a,20h cp (hl) jr z,NAMT3 ;name leer -> bad file name ld b,7 ;Rest kann leer sein call NAMT1 ld b,3 ;Typ auch NAMT1 inc hl cp (hl) jr z,NAMT2 djnz NAMT1 ret NAMT2 dec b ret z inc hl cp (hl) jr z,NAMT2 NAMT3 jp ERDBNA ;bad file name ; AUFNAM ld a,(hl) ;* auffuellen cp '*' jr z,AUFNA2 inc hl djnz AUFNAM ret AUFNA1 ld hl,AUTSTL ld b,11 AUFNA2 ld (hl),'?' inc hl djnz AUFNA2 ret ; LOC defb 0F6h ;or 0AFh LOF xor a call STCKM push af ld ix,BYTAE3 ;bytepar call JL1CAL ld ix,FCBAD ;fcb Adresse bestimmen call JL1CAL jp c,ERDFC ;ill function call jp z,ERDNOP ;file not open ld b,a ;mode pop af jr z,LOF1 ;-> LOF ld a,b ;LOC cp 4 ;random ? ld bc,10Ah ;nein, sequ location jr nz,LOC1 ld bc,110h ;ja, BASIC rrn LOC1 add hl,bc ld a,(hl) dec hl ld l,(hl) ld ix,POS2 LOC2 jp JL1CAL LOF1 call ACTBDP ;bdos fcb ld bc,0Fh ;rc add hl,bc ld a,(hl) ld ix,POS1 jr LOC2 ; BLSIZE ld hl,(ACTFCB) ;Pufferadr, Laenge fuer BSAVE/ ld de,80h ;BLOAD,S add hl,de ld (HIADR),hl ;FIELD-Bereich ld hl,40h ;40h words = 80h bytes ret ; ERBINT ld e,3Ch ;internal error defb 1 ERBMOD ld e,3Dh ;bad file mode defb 1 ERBDNA ld e,3Eh ;bad drive name defb 1 ERBIN2 ld e,3Fh ;internal error defb 1 ERSTIO ld e,40h ;file still open defb 1 ERALEX ld e,41h ;file already exists defb 1 ERFULL ld e,42h ;disk full defb 1 ERTOOM ld e,43h ;too many files defb 1 ERWPRT ld e,44h ;file write protected defb 1 ERIO ld e,45h ;disk I/O error defb 1 EROFFL ld e,46h ;disk offline defb 1 ERRENA ld e,47h ;rename across disk ld bc,0 xor a ld (LMAFL),a ld (HLPERR),a push de ld ix,CLOSE1 ;alle files schliessen call JL1CAL pop de ld ix,ERRO ;Fehlerausschrift jp JL1CAL ; ERR2 ld a,e ;Fehlermeldungen von disk cp 3Ch ret c ;< 3C cp 48h ret nc ;> 47 sub 3Bh ld b,a ld hl,ERRTAB ;Tabelle Fehlermeldungen ERR21 ld a,(hl) and a inc hl jr nz,ERR21 djnz ERR21 dec hl ld de,EDIBUF+0A6h push de ld bc,16h ldir ld e,1 pop hl ret ERRTAB defb 0 defm 'Internal error' ;3C 60 defb 0 defm 'Bad file mode' ;3D 61 defb 0 defm 'Bad drive name' ;3E 62 defb 0 defm 'Internal error' ;3F 63 defb 0 defm 'File still open' ;40 64 defb 0 defm 'File already exists' ;41 65 defb 0 defm 'Disk full' ;42 66 defb 0 defm 'Too many files' ;43 67 defb 0 defm 'File write protected' ;44 68 defb 0 defm 'Disk I/O error' ;45 69 defb 0 defm 'Disk offline' ;46 70 defb 0 defm 'Rename across disk' ;47 71 defb 0 ; DCPSTX call DTCHAR ;CPSTX ex (sp),hl cp (hl) jr nz,ERDSN inc hl ex (sp),hl inc hl DTCHAR dec hl DTCHA0 ld ix,TCHAR0 ;TCHAR0 jr LONGJP ERDFTC ld ix,ZKUP18 ;string formula too complex jr LONGJP ERDTM ld ix,ERTM ;type mismatch jr LONGJP ERDMO ld ix,MOERR0 ;out of memory jr LONGJP ERDNOP ld ix,ERNTOP ;file not open jr LONGJP ERDPAE ld ix,ERINPE ;input past end jr LONGJP ERDFOV ld ix,ERFIOV ;field overflow jr LONGJP ERDALO ld ix,ERALOP ;file already open jr LONGJP ERDBFN ld ix,ERBFNR ;bad file number jr LONGJP ERDBNA ld ix,ERBFNA ;bad file name jr LONGJP ERDFNF ld ix,ERNTFO ;file not found jr LONGJP ERDFC ld ix,ERFC ;illegal function call jr LONGJP ERDSN ld ix,ERSN ;syntax error LONGJP jp JL1CAL ; FILDS ld a,e ;FILDS cp 2 ret c ;Laenge Namen < 2 ld a,(hl) cp ':' jr z,ERDBNA ;bad file name inc hl ld a,(hl) cp ':' dec hl ret nz ;kein disk Name call STCKM ld a,(hl) ;disk Name and 0DFh ;-> Grossbuchstabe sub 40h ;A -> 1 usw. cp 17 ;LW zulaessig? jp nc,ERBDNA ;nein push af push hl push de ld e,a dec e ;gefordertes LW push de ld c,25 ;Abfrage aktuelles LW call BBDOSX pop de ;gef. LW push af ;akt. LW ld c,14 ;Auswahl LW call BBDOSX inc a ;Fehler ? jp z,ERBDNA pop af ;akt. LW ld e,a ld c,14 call BBDOSX pop de pop hl pop af inc hl inc hl dec e dec e push de inc e pop de ret ; GERST ld a,0 ;Standardgeraet = 0 ret ; STCKM push hl ;Stackmanipulation fuer push de push af ;Rueckkehr von Disk ld hl,14 add hl,sp ld de,LCAUP-1 ld (hl),e inc hl ld (hl),d pop af pop de pop hl ret ; BBDOSX ld a,(RESDOK) ;reset disk ok ? cp 0FEh ;schwerer Fehler? jr nz,BBDOSY ;nein push bc ;ja -> nachholen push de ld c,13 ;reset disk call BBDOS ld (RESDOK),a ;ok ? cp 0FEh ;immer noch? jp z,EROFFL ;nein -> disk offline pop de pop bc BBDOSY call BBDOS cp 0FEh ;schwerer Fehler ld (RESDOK),a jp z,ERIO push af xor a ld (RESDOK),a pop af ret ;--------------------------------------------------------- *I 7/BICCOPY.S ;========================================================= ÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª