BDOS fileshell routines Alex van der Wal, 15-08-93 ; BDOS fileshell routines for secure file loading and saving ; Version for: Sunrise Magazine Special 4 ; File: EASYBDOS.ASC V2.00 ; By: Alex van der Wal Last update: 15-8-93 ; Alias: Savage '93 (Fuzzy Logic) !! It ain't much if it ain't Dutch !! ; ; Note: ; - The BIOS (PAGE 0) must be active for error handling and text output ; (Stupid) example of fileshell load function ; ORG &HD000 ; LD A,(&HF342) ; Slot & Subslot of main RAM ; CALL FINSTL ; Install the fileshell ; JR C,EIND ; LD HL,DATA ; HL points to address of filename string ; CALL FOPEN ; Open file ; JR C,EIND ;LUS: LD HL,&H8000 ; Startaddress for data to load ; LD DE,&H4000 ; Blocklength ; CALL FBLKRD ; Read file block ; JR C,EIND ; CP "r" ; JR NZ,LUS ;EIND: CALL FRESET ; Reset the fileshell ; RET ; ;DATA: DM "MMU2info","TXT" ENASLT: EQU &H24 PRINTC: EQU &HA2 BDOS: EQU &HF37D F##ERR: EQU &HF323 ; Double pointer address to error routine BLOAD: EQU &HFE ; ID byte van een BLOAD type file VDPBF1: EQU &HF3DF VDPBF2: EQU &HFFE7-8 ORG &HC000 ; Print string PRINTS: LD A,(HL) INC HL AND A RET Z CALL PRINTC JR PRINTS ; Print string with fixed length PRINTF: LD A,(HL) INC HL CALL PRINTC DJNZ PRINTF RET ; Wait until SPACE is pressed WAITSP: CALL &H9F CP " " JR NZ,WAITSP RET ; Print filename. In: HL with filename address PRFLNM: PUSH BC LD B,8 CALL PRINTF LD A,"." CALL PRINTC LD B,3 CALL PRINTF LD A," " CALL PRINTC POP BC RET ; Install BDOS fileshell ; In : A (See BIOS rout 24H) ; A must contain the settings for PAGE 1 (SLOT/SUBSLOT) ; Out: Cy, on error FINSTL: LD (PG1SET),A LD A,(FSTAT) BIT 0,A LD C,0 JP NZ,FERROR SET 0,A LD (FSTAT),A ; Fileshell install executed LD A,255 LD (CURDRV),A LD HL,0 LD (FLELEN),HL LD HL,(BDOS+1) LD (OLDDOS+1),HL LD HL,FBDOS LD (BDOS+1),HL LD HL,(F##ERR) ; Double pointer to error routine LD (_##ERR),HL LD HL,DSERPT ; Pointer address to error routine LD (F##ERR),HL XOR A RET ; Reset BDOS fileshell ; Out: Cy, on error FRESET: LD A,(FSTAT) BIT 0,A LD C,1 JP Z,FERROR RES 0,A LD (FSTAT),A BIT 2,A ; Writing to disc ? CALL NZ,FCLOSE ; then close that file LD HL,(OLDDOS+1) LD (BDOS+1),HL LD HL,(_##ERR) LD (F##ERR),HL XOR A RET ; Open file ; In: HL, filename address ; Out: Cy, on error FOPEN: LD A,(FSTAT) CP &B00000001 LD C,2 JP NZ,FERROR LD DE,FCB+1 LD BC,11 LDIR ; Copy filename to FCB LD HL,FCB1 LD DE,FCB1+1 LD BC,25-1 LD (HL),B LDIR LD C,15 LD DE,FCB CALL BDOS ; Open file AND A JR NZ,FOPN.0 LD HL,&H00 LD (FCB+&H0C),HL ; Current block INC HL LD (FCB+&H0E),HL ; Record length LD HL,(FCB+&H10) ; File length LD (FLELEN),HL ; LD A,(FSTAT) SET 1,A LD (FSTAT),A XOR A RET FOPN.0: LD HL,FCB+1 CALL PRFLNM LD C,3 JP FERROR ; Load fileblock ; In: DE, blocklength ; HL, load address ; Out: Cy, on error ; Out: A , "r", Then file is 100% percent loaded ; FBLKRD: LD A,(FSTAT) CP &B00000011 LD C,2 JP NZ,FERROR PUSH DE EX DE,HL LD C,26 CALL BDOS ; Set DMA address POP DE XOR A LD HL,(FLELEN) ; # of Bytes still to load SBC HL,DE JR C,FBLR.1 LD (FLELEN),HL LD A,H OR L JR NZ,FBLR.2 FBLR.1: ADD HL,DE EX DE,HL LD HL,0 LD (FLELEN),HL LD A,(FSTAT) ; Loading ready after this read action RES 1,A LD (FSTAT),A FBLR.2: EX DE,HL CALL INTOFF LD C,39 LD DE,FCB CALL BDOS CALL INTON AND A JR NZ,FBLR.3 LD A,(FSTAT) BIT 1,A RET NZ LD A,"r" ; Mark succesfully loaded RET FBLR.3: LD HL,FCB+1 CALL PRFLNM LD C,4 JP FERROR ; Create file ; In: HL, filename address ; Out: Cy : High, then an error occured FCREAT: LD A,(FSTAT) CP &B00000001 LD C,2 JP NZ,FERROR LD DE,FCB+1 LD BC,11 LDIR ; Copy filename to FCB LD HL,FCB1 LD DE,FCB1+1 LD BC,25-1 LD (HL),B LDIR LD HL,0 LD (FLELEN),A LD C,22 LD DE,FCB CALL BDOS AND A JR NZ,FCRE.0 LD HL,&H00 LD (FCB+&H0C),HL ; Current block INC HL LD (FCB+&H0E),HL ; Record length LD A,(FSTAT) SET 2,A LD (FSTAT),A XOR A RET FCRE.0: LD HL,FCB+1 CALL PRFLNM LD C,5 JP FERROR ; Write fileblock ; In: DE, Blocklength ; HL, Startaddress ; Out: Cy, on error (File will be closed) FBLKWR: LD A,(FSTAT) CP &B00000101 LD C,2 JP NZ,FERROR PUSH DE EX DE,HL LD C,&H1A CALL BDOS POP HL LD DE,(FLELEN) ; Add length to FLELEN EX DE,HL ADD HL,DE LD (FLELEN),HL EX DE,HL CALL INTOFF LD DE,FCB LD C,38 CALL BDOS CALL INTON AND A RET Z CALL FCLOSE LD HL,FCB+1 CALL PRFLNM LD C,6 JP FERROR ; Close file FCLOSE: LD C,16 LD DE,FCB CALL BDOS ; Close file RET ; CHNDSK Waits for a diskchange, with conformation by the space key ; Request for same drive as current one is ignored !! ; In: A (0, then 'Insert source disk') ; (otherwise, 'Insert destination disk') CHNDSK: LD B,A LD A,(CURDRV) CP 255 JR Z,CHND.2 CP B RET Z CHND.2: LD A,B LD (CURDRV),A LD HL,CHND.A AND A JR Z,CHND.1 LD HL,CHND.B CHND.1: CALL PRINTS ; call beep CALL WAITSP RET INTOFF: PUSH AF LD A,(VDPBF1+1) RES 5,A INTO.0: LD (VDPBF1+1),A DI OUT (&H99),A LD A,128+1 OUT (&H99),A EI POP AF RET INTON: PUSH AF LD A,(VDPBF1+1) SET 5,A JR INTO.0 ; BDOS call routine [system routine] ; In: BDOS parameters ; Out: BDOS parameters FBDOS: PUSH BC PUSH DE PUSH HL PUSH IX PUSH IY LD (SP_SAV),SP CALL OLDDOS ; Call BDOS FDOS.2: POP IY POP IX POP HL POP DE POP BC RET ; BDOS error code [system routine] ; In: nothing ; Out: nothing DSERPT: DW ERRCDE ; Pointer to error code ERRCDE: LD HL,STDERR CALL PRINTS ERRC.0: CALL &H0156 CALL &H9F SET 5,A ; Convert "R" to "r" for example CP "r" JR Z,ERRC.1 CP "a" JR NZ,ERRC.0 LD HL,EOLN ; Abort CALL PRINTS LD A,(PG1SET) LD H,&H40 CALL ENASLT LD SP,(SP_SAV) LD A,1 ; Signal BDOS error back EI JP FDOS.2 ERRC.1: LD HL,EOLN CALL PRINTS LD C,1 ; Retry RET ; Print fileshell error FERROR: LD HL,FERTXT LD A,C CALL PRTERR SCF ; return Cy on error RET PRTERR: AND A JR Z,PRTE.1 LD B,A PRTE.0: LD A,(HL) INC HL AND A JR NZ,PRTE.0 CP 255 JR Z,PRTE.2 DJNZ PRTE.0 PRTE.1: CALL PRINTS LD HL,EOLN CALL PRINTS RET PRTE.2: LD HL,FSYSER CALL PRINTS RET ; BDOS routine variables CHND.A: DM "Insert source disk:",10,13,0 CHND.B: DM "Insert destination disk:",10,13,0 STDERR: DM 10,13,"Drive error !! Press 'r' to retry or 'a' to abort",10,13,0 FERTXT: DM "Fileshell already installed",0 DM "Fileshell not installed",0 DM "Status error",0 DM "not found",0 DM "has a read error",0 DM "cannot be created",0 DM "has a write error",0 FSYSER: DM "Unknown error [SYSTEM ERROR]",0 EOLN: DB 10,13,0 FSTAT: DB 0 ; Fileshell status CURDRV: DB 255 ; Current drivenumber (255=invalid) FLELEN: DW 0 ; Bytes to read / written bytes _##ERR: DW 0 ; Double pointer to error code OLDDOS: DB &HC3,0,0 ; Old BDOS call PG1SET: DB 0 ; PAGE 1 memory settings SP_SAV: DW 0 ; SP save address ; The following addresses must be located outside page 1 (4000H-7fffH) ! FCB: DEFM 0 DEFM "filename" EXT: DEFM "ext" FCB1: DEFS 25 END |