; RAMDISK PROGRAM BY J.G.HARSTON ; ============================== ; VERSION 1.00, 16 JUNE 1986, 5:50PM ; ; EXECUTED WITH: ; RAND USR FS: ; SEED EQU #5C76 EXPT_1 EQU #1C82 FIND_2 EQU #1E99 STKTOA EQU #1E94 USE_ZER EQU #1CE6 ERR_SP EQU #5C3D PROG EQU #5C53 E_LINE EQU #5C59 VARS EQU #5C4B CHADD EQU #5C5D EXPT_EX EQU #1C8C STK_FCH EQU #2BF1 CHANS EQU #5C4F STRM_0 EQU 23574 DISKBEG EQU #8000 ; Start of ramdisk OPT_NO EQU #800A ; Disk option CYCLE EQU #800B ; Disk cycle number DISKEND EQU #800E ; Pointer to end of ramdisk PR_MSG EQU #0C0A RECLAIM EQU #19E5 MKROOM EQU #1655 NEWPPC EQU 23618 NSPPC EQU 10 X_PTR EQU 23647 TOP EQU #F6 SAVEMAX EQU 65 ORG 63000 FS RST #18 CP 13 JR Z,FS_END CP #3A JR Z,FS_1 RST 8 DEFB 11 FS_1 INC (IY+13) LD (FS_SP),SP LD HL,(CHADD) PUSH HL RST #20 LD HL,FS EX (SP),HL PUSH HL CALL TAB_CHK POP HL JR NC,NOT_CMD PUSH HL RST #20 POP HL EX DE,HL LD B,0 JP (HL) NOT_CMD LD (CHADD),HL ; Not one of my commands DEC (IY+13) ; Restore CHADD, NSPPC POP HL ; Balance stack FS_END LD BC,(SEED) ; Makes RAND USR FS a null operation RET ; TAB_CHK LD B,A LD HL,COM_TAB T_CH_2 LD A,(HL) INC HL CP B JR Z,T_FND CP 0 RET Z INC HL INC HL JR T_CH_2 T_FND LD E,(HL) INC HL LD D,(HL) SCF RET COM_TAB DEFB 248 DEFW SAVE DEFB 239 DEFW LOAD DEFB 214 DEFW VERIFY DEFB 213 DEFW MERGE DEFB 210 DEFW ERASE DEFB 207 DEFW CAT DEFB 208 DEFW FORMAT DEFB 209 DEFW MOVE DEFB 245 DEFW PRINT DEFB 240 DEFW LST DEFB 234 DEFW REM DEFB 247 DEFW RUN DEFB 211 DEFW OPEN DEFB 212 DEFW CLOSE DEFB 238 DEFW INPUT DEFB 0 ; ; ; FORMAT "name" - Format ramdisk FORMAT CALL GET_NAME ; Get name PUSH IX POP HL ; HL points to name LD DE,#8000 ; Copy name to start of disk INC HL LD BC,10 LDIR LD HL,#8010 ; Empty disk ends at #8010 LD (DISKEND),HL ; Set end of disk LD (HL),255 ; Set end of disk marker LD HL,0 LD (OPT_NO),HL ; Set option to zero RET ; OP_CHN LD A,2 JP #1601 ; Print catalogue header CAT_HDR CALL OP_CHN ; Open 'S' LD HL,#8000 CALL PR_NAME ; Print disk name LD A,"(" RST #10 LD A,(CYCLE) EX AF,AF' SCF EX AF,AF' CALL PR_DEC ; Print cycle number LD A,")" RST #10 LD A,13 RST #10 LD A,(DISKEND+1) ; Get high byte of DISKEND LD B,A LD A,TOP ; Get top of ramdisk SUB B ; Free space SRL A SRL A ; Free space in K EX AF,AF' AND A EX AF,AF' CALL PR_DEC ; Print free space LD A,8 CALL PR_TEXT ; Print 'K free' LD A,(OPT_NO) AND 7 PUSH AF ADD A,48 RST #10 ; Print option LD A,32 RST #10 LD A,"(" RST #10 POP AF CALL PR_TEXT ; Print option string LD A,9 CALL PR_TEXT RET ; ; CAT - Print disk catalogue CAT CALL CAT_HDR ; Print catalogue header LD HL,#8010 ; Point to start of disk CAT_LP LD A,(HL) ; Get file type CP 255 ; 255=end of disk JR Z,CAT_END ; No more files INC HL ; Point to filename LD A,6 RST #10 ; Print comma to next field CALL PR_NAME ; Print filename PUSH HL LD DE,6 ADD HL,DE ; Point to file flags BIT 7,(HL) ; Is file locked? JR Z,CAT_1 LD A,"L" ; Print 'L' for locked RST #10 CAT_1 POP HL CALL NXT_NAME ; Find next file JR CAT_LP ; Loop for all files CAT_END LD A,13 ; Print a final RST #10 RET ; Find next file, HL=>file length NXT_NAME LD E,(HL) ; Get file length INC HL LD D,(HL) ADD HL,DE ; Step past file data LD DE,8 ADD HL,DE ; Step past file header RET GET_NAME CALL EXPT_EX LD BC,20 RST #30 ; Get 20 bytes of workspace PUSH DE POP IX LD B,11 LD A,32 GET_1 LD (DE),A ; Fill filename with spaces INC DE DJNZ GET_1 LD (IX+1),255 ; Set NULL name CALL STK_FCH ; Get string LD HL,#FFF6 ; Check length <=10 DEC BC ADD HL,BC INC BC JR NC,GET_2 RST 8 DEFB 14 ; Bad filename GET_2 PUSH IX POP HL INC HL EX DE,HL LDIR ; Copy name to workspace RET ; Look for a filename FND_NAME LD HL,#8010 ; Point to start of disk LD (LAST),HL PUSH IX POP DE INC DE FND_LP LD A,(HL) ; Get filetype INC HL ; Point to filename CP 255 JR Z,FND_END ; No more files LD B,10 ; Check ten characters LD (LAST),HL PUSH HL PUSH DE FND_L2 LD A,(DE) ; Get filename CALL ADJUST ; Ensure upper case LD C,A LD A,(HL) ; Get name from disk CALL ADJUST ; Ensure upper case CP C JR Z,SAME ; They match, check whole name JR NC,INSERT ; disk>file, insert here POP DE ; disknext entry AND A SBC HL,DE INC HL PUSH HL LD HL,(DISKEND) ; Update end of disk AND A SBC HL,BC LD (DISKEND),HL POP BC ; BC=length to remove POP HL ; HL=>next entry POP DE ; DE=>this entry LDIR ; Compact disk to remove entry JP INC_C ; Update cycles and exit ; ; PRINT "name" - Print information on a file PRINT CALL OP_CHN ; Open channel 'S' CALL GET_NAME ; Get a string CALL FND_NAME ; Look for file INC HL ; Point to filename JR NC,PR_INFO ; File found, print info XOR A JP ERROR ; File not found PR_INFO PUSH HL ; Save address of filename CALL PR_NAME ; Print filename EX (SP),HL ; Get address filename back DEC HL ; Point to filetype LD A,(HL) CALL P_HEX1 ; Print filetype POP HL ; Get address of file addresses LD E,(HL) INC HL LD D,(HL) CALL PR_HEX ; Print file length INC HL LD E,(HL) INC HL LD D,(HL) CALL PR_HEX ; Print file start INC HL LD E,(HL) INC HL LD D,(HL) CALL PR_HEX ; Print file extra INC HL LD A,32 ; Prepare to print space BIT 7,(HL) ; Check Locked flag JR Z,PR_I2 LD A,"L" ; Print 'L' if locked PR_I2 RST #10 LD A,13 ; Final RST #10 LD DE,6 AND A SBC HL,DE ; Point back to file length RET ; PR_HEX LD A,D ; Print DE in hex CALL P_HEX2 LD A,E P_HEX1 CALL P_HEX2 LD A,32 RST #10 RET P_HEX2 PUSH AF ; Print A in hex SRL A SRL A SRL A SRL A CALL P_HEX3 POP AF P_HEX3 AND 15 ADD A,48 CP ":" JR C,P_HEX4 ADD A,7 P_HEX4 RST #10 RET PR_DEC PUSH BC ; Print B in decimal LD C,100 CALL P_DEC1 LD C,10 CALL P_DEC1 ADD A,48 RST #10 POP BC RET P_DEC1 LD B,0 P_DEC2 SUB C JR C,P_DEC3 INC B JR P_DEC2 P_DEC3 ADD A,C PUSH AF LD A,B AND A JR Z,P_DEC5 P_DEC4 ADD A,48 RST #10 POP AF EX AF,AF' SCF EX AF,AF' RET P_DEC5 EX AF,AF' JR NC,P_DEC6 EX AF,AF' JR P_DEC4 P_DEC6 EX AF,AF' POP AF RET ERROR PUSH AF ; Report an error LD A,(O_3) ; Get option 3 CP 2 JR NZ,ERR_2 LD SP,(FS_SP) ; If equals 2, just exit RET ERR_2 CP 1 JR NZ,ERR_3 CALL OP_CHN ; Option3=1, print error POP AF ; and exit LD SP,(FS_SP) JR ERR_6 ERR_3 POP AF ; Option3=0, report error LD SP,(ERR_SP) ; Repeat main ROM error routine LD HL,#1349 EX (SP),HL PUSH AF XOR A CALL #1601 RES 2,(IY+1) LD HL,0 LD (IY+55),H LD (IY+38),H LD (23563),HL CALL #16B0 CALL #0D6E SET 5,(IY+2) POP AF ERR_6 LD DE,ERR_M JP PR_MSG ERR_M DEFB 128 DEFM "File not foun" DEFB "d"+128 DEFM "File exist" DEFB "s"+128 DEFM "File locke" DEFB "d"+128 DEFM "MERGE erro" DEFB "r"+128 DEFM "CODE erro" DEFB "r"+128 DEFM "Disk ful" DEFB "l"+128 DEFM "Files ope" DEFB "n"+128 DEFM "Wrong file typ" DEFB "e"+128 FLAG DEFB 0 ; b7=files open LAST DEFW 0 S_FLAG DEFB 0 ; save/load/verify/merge O_1 DEFB 0 ; display messages O_2 DEFB 0 ; b7=lock saved files, b0=don't overwrite O_3 DEFB 0 ; errors reported, printed, ignored FS_SP DEFW 0 INC_C PUSH HL ; Increment cycle number LD HL,CYCLE INC (HL) POP HL RET ; MERGE INC B ; B=3 - MERGE VERIFY INC B ; B=2 - VERIFY LOAD INC B ; B=1 - LOAD SAVE LD A,B ; B=0 - SAVE LD (S_FLAG),A CALL O_CHK CALL GET_NAME ; Get string LD A,(O_2) AND 128 LD (IX+17),A ; Set 'L'ocked flag from option 2 RST #18 ; Repeat tape code CP 175 JR Z,SA_CODE CP 170 JR Z,SA_SCRN CP 228 JP Z,SA_DATA CP 202 JR NZ,TYPE_0 RST #20 CALL EXPT_1 CALL FIND_2 LD (IX+13),C LD (IX+14),B JR TYPE0 TYPE_0 LD (IX+14),255 TYPE0 LD (IX+0),0 LD HL,(E_LINE) LD DE,(PROG) SCF SBC HL,DE LD (IX+11),L LD (IX+12),H LD HL,(VARS) SBC HL,DE LD (IX+15),L LD (IX+16),H EX DE,HL JP SA_ALL SA_SCRN RST #20 LD (IX+11),0 LD (IX+12),#1B LD HL,#4000 LD (IX+13),L LD (IX+14),H JR TYPE_3 SA_CODE RST #20 CALL ST_END JR NZ,CODE_1 CALL USE_ZER JR CODE_2 CODE_1 CALL EXPT_1 RST #18 CP "," JR Z,CODE_3 CODE_2 CALL USE_ZER JR CODE_4 ST_END CP 13 RET Z CP ":" RET CODE_3 RST #20 CALL EXPT_1 CODE_4 CALL FIND_2 LD (IX+11),C LD (IX+12),B CALL FIND_2 LD (IX+13),C LD (IX+14),B LD H,B LD L,C TYPE_3 LD (IX+0),3 JP SA_ALL SA_DATA RST 8 DEFB 11 SA_ALL CALL MESSAGE LD A,(S_FLAG) CP 1 JR C,SAVER JR Z,LOADER RET SAVER PUSH HL ; Save data LD C,(IX+11) LD B,(IX+12) LD A,B OR C JR NZ,SAVE_1 SA_ERR LD A,4 JP ERROR SAVE_1 LD A,B CP SAVEMAX JR NC,SA_ERR LD DE,20 LD HL,(DISKEND) ADD HL,DE ADD HL,BC LD A,H CP TOP JR C,SAVE_2 LD A,5 JP ERROR SAVE_2 EX DE,HL PUSH DE PUSH BC CALL FND_NAME POP BC POP DE JR C,SAVE_3 LD A,(O_2) AND 1 JR NZ,SA_DEL INC A JP ERROR SA_DEL PUSH HL PUSH DE CALL ERA_S POP DE POP HL SAVE_3 PUSH BC PUSH HL LD HL,20 ADD HL,BC PUSH HL POP BC LD HL,(DISKEND) LD (DISKEND),DE PUSH HL POP DE POP BC PUSH BC AND A SBC HL,BC INC HL PUSH HL POP BC LD HL,(DISKEND) EX DE,HL LDDR POP DE PUSH IX POP HL LD BC,20 LDIR POP BC POP HL LDIR JP INC_C ; LOADER PUSH HL ; Load data CALL FND_NAME JR NC,LOAD_2 XOR A JP ERROR ; File not found LOAD_2 LD A,(HL) CP (IX+0) JR Z,LOAD_3 LD A,7 JP ERROR LOAD_3 LD DE,11 ADD HL,DE LD C,(HL) INC HL LD B,(HL) EX (SP),HL LD A,H OR L JR NZ,LOAD_4 POP HL INC HL LD E,(HL) INC HL LD D,(HL) PUSH DE DEC HL DEC HL EX (SP),HL LOAD_4 EX (SP),HL LD DE,8 ADD HL,DE LD A,(IX+0) AND A JR Z,LD_PROG LOAD_5 POP DE LDIR RET LD_PROG PUSH HL PUSH BC LD HL,(E_LINE) LD DE,(PROG) DEC HL LD (X_PTR),IX POP BC PUSH BC PUSH BC CALL RECLAIM POP BC CALL MKROOM LD IX,(X_PTR) INC HL LD C,(IX+15) LD B,(IX+16) ADD HL,BC LD (VARS),HL LD H,(IX+14) CP 255 JR Z,LOAD_6 LD L,(IX+13) LD (NEWPPC),HL LD (IY+NSPPC),0 LOAD_6 POP BC POP HL JR LOAD_5 ; MESSAGE PUSH HL ; Print status message LD A,(O_1) AND A JR Z,MESS_2 CALL OP_CHN PUSH IX POP HL INC HL CALL PR_INFO MESS_2 POP HL RET ; ; REM - extra commands ; REM (C) - Display copyright information ; REM A - Set file access REM RST #18 CP 127 JR Z,C_RIGHT AND #DF CP "A" JR Z,ACCESS REM_2 EX DE,HL JP NOT_CMD C_RIGHT PUSH DE ; Print copyright message CALL OP_CHN LD A,10 CALL PR_TEXT POP DE JR REM_2 ; INPUT opt,num - Set disk options INPUT CALL EXPT_1 RST #18 CP "," JR Z,OPT_2 CALL USE_ZER JR OPT_3 OPT_2 RST #20 CALL EXPT_1 OPT_3 CALL STKTOA PUSH AF CALL STKTOA POP BC CP 4 JR Z,OPT_4 RET NC AND A JR Z,OPT0 LD E,A LD D,0 LD HL,O_1-1 ADD HL,DE ; Point to options LD (HL),B RET OPT_4 LD A,B ; Set disk option LD (OPT_NO),A JP INC_C OPT0 XOR A ; Clear all options LD (O_1),A LD (O_2),A LD (O_3),A RET ACCESS RST #20 CALL GET_NAME ; Get a string CALL FND_NAME ; Look for entry JR NC,ACC_2 ; File found, jump to continue XOR A JP ERROR ; File not found ACC_2 PUSH HL RST #18 ; Get current character AND #DF CP "L" JR NZ,ACC_3 ; Not 'L', jump to unlock file RST #20 ; Move past 'L' LD A,128 ; Set b7=1 for locked JR ACC_4 ACC_3 XOR A ; Set b7=0 for unlocked ACC_4 LD DE,17 POP HL ADD HL,DE ; Point to locked flag LD B,A LD A,127 AND (HL) ; Get b6-b0 from flag OR B ; Copy 'L' into b7 LD (HL),A ; Store back into flag JP REM_2 ; Exit RUN RET ; Not yet OPEN RET ; Not yet CLOSE RET ; Not yet