* Copies files from disk 0 to 1 in compact format * BSLIMIT EQU 0FFFH blocksize limit BSLI1 EQU 'FF' BSLI2 EQU 'FH' ASCII of above BUFFLEN EQU 5B00H buffer length CR EQU 13 MODE EQU 0 * XEQ START ORG 100H COPY NPTDEFS * START EQU $ LXI SP,0CBFFH SOLOS stack LXI H,MSG1 CALL MOUT GOAHD CALL CONIN CPI MODE JZ FINISH CPI CR JNZ GOAHD * LHLD SYSGLO set GLLOW to 7800H LXI D,GLLOW DAD D HL points to GLLOW MVI M,0 INX H MVI M,78H * CALL SETERM trap level 1 errors LXI D,FNAME file name LXI H,0 static buffer CALL SYS DB OPEOP open directory JMP ERROR STA FLNBR save file number LXI B,16*100H get 16*100H bytes LXI D,DBUFF point to buffer CALL SYS read block DB RBLOP JMP ERROR LDA FLNBR CALL SYS close directory DB CLOOP JMP ERROR LXI H,DBUFF init HL MVI C,16 16 blocks in directory PUSH H NEXT EQU $ MOV B,M get number of files in block in B MOV A,B ORA A JZ NEXTBLK zero files INX H point to first file INX H NEXTF EQU $ CALL CONTST JZ CONT CALL CONIN CPI MODE JZ FINISH CONT EQU $ PUSH B PUSH D PUSH H MVI C,8 move filename to F0NAME LXI D,F0NAME MOVED MOV A,M STAX D INX H INX D DCR C JNZ MOVED XRA A STAX D eon CALL COPYF copy file POP H POP D POP B MOV A,L ADI 21 point to next file MOV L,A DCR B count down JNZ NEXTF NEXTBLK EQU $ POP H LXI D,100H DAD D next block PUSH H DCR C JNZ NEXT POP H done * LXI H,MSG3 CALL MOUT FINISH EQU $ CALL SYS return DB RETOP * * Copy files from /0 to /1. * A new file of the same type, etc. will be * created if non-existent. * COPYF EQU $ LXI D,F0NAME point to filename of /0 LXI H,F1NAME point to filename area MOVE1 LDAX D move chars MOV M,A ORA A JZ MOVE2 end of filename INX H INX D JMP MOVE1 * MOVE2 MVI M,'/' put /1 on filename INX H MVI M,'1' INX H MVI M,0 * OPENF EQU $ * Get file info before opening LXI D,F0NAME point to /0 filename LXI H,F0INFO point to info buffer CALL SYS get info DB INFOP JMP ERROR LHLD F0BKS * Check if blocksize too large ;XRA A ;STA TOLGFG zero too large flag LXI D,-BSLIMIT-1 blocksize limit DAD D MOV A,H ORA A JP TOLARG too large * LDA F0TYPE move file info CPI 255 device file? CZ DEVFL STA F1TYPE LHLD F0BKS SHLD F1BKS * LXI D,F1TYPE point to block CALL SYS DB CREOP create file JMP EXISTS already exists? LXI H,0 static buffer LXI D,F1NAME CALL SYS DB OPEOP open /1 file JMP ERROR STA FNBR1 save file number LDA F1TYPE CPI 254 a device file? CZ DEVF1 change orig type LXI H,0 static buffer LXI D,F0NAME CALL SYS DB OPEOP open /0 file JMP ERROR STA FNBR0 save file number ;LDA TOLGFG ;ORA A ;CNZ TOLGDISP display too large * MOVEBL LXI B,BUFFLEN LXI D,BUFF LDA FNBR0 CALL SYS DB RBLOP read /0 JMP CKEOF eof? LXI B,BUFFLEN LXI D,BUFF LDA FNBR1 CALL SYS DB WBLOP JMP ERROR JMP MOVEBL * CKEOF CPI EREOF eof? JNZ ERROR no MOV A,B find # bytes transferred CMA MOV B,A MOV A,C CMA MOV C,A INX B two's complement LXI H,BUFFLEN DAD B MOV B,H # bytes to BC MOV C,L LXI D,BUFF LDA FNBR1 CALL SYS write last buffer DB WBLOP JMP ERROR CALL SYS write eof to /1 DB EOFOP JMP ERROR LXI H,F0NAME print message CALL MOUT LXI H,MSG2 CALL MOUT * LDA F1TYPE CPI 254 working with device files? CZ DEVF2 change both to device files * LDA F0ATR MOV H,A LXI D,F1NAME CALL SYS restore attributes DB CHAOP JMP ERROR * CLOSALL EQU $ close files LDA FNBR1 CALL SYS DB CLOOP JMP ERROR CLOS0 EQU $ close only /0 file LDA FNBR0 CALL SYS DB CLOOP JMP ERROR RET * MOUT MOV A,M get char ORA A set flags RZ CALL CONOUT INX H JMP MOUT * SETERM LHLD SYSGLO LXI D,GLERM DAD D MVI M,-1 trap level 1 errors INX H MVI M,-1 RET * ERROR STA ERCODE MVI A,84H LXI H,F0NAME CALL UTIL DB UXOP JMP ABORT DB -1 ERCODE DB -1 ABORT MVI A,-1 Close all files CALL SYS DB CAOP JMP ABRT1 ABRT1 EQU $ CALL SYS DB RETOP * TOLARG EQU $ ;LXI H,TOLGFG ;INR M set too large flag ;LXI H,BSLIMIT ;SHLD F0BKS ;RET * TOLGDISP EQU $ LXI H,F0NAME CALL MOUT LXI H,TOLMSG CALL MOUT RET * EXISTS EQU $ CPI ERAEX exists? JNZ ERROR LXI H,F0NAME CALL MOUT LXI H,EXIMSG CALL MOUT RET * DEVFL EQU $ LXI H,F0NAME CALL MOUT LXI H,DEVMSG CALL MOUT MVI A,254 pseudo device file type RET * DEVF1 EQU $ change file 0 type LXI D,F0NAME MVI H,254 CALL SYS DB CHTOP CALL ERROR RET * DEVF2 EQU $ change both file to device type LXI D,F0NAME MVI H,255 CALL SYS DB CHTOP CALL ERROR LXI D,F1NAME MVI H,255 CALL SYS DB CHTOP CALL ERROR RET * * Storage TOLGFG DB 0 FNAME ASC 'DIRECTRY/0' FLNBR DB 0 * F0INFO DS 11 F0TYPE DS 1 F0BKS DS 2 F0ATR DS 1 F0NAME DS 8 F0OVFL DS 12 make 20 bytes F1TYPE DS 1 F1BKS DS 2 F1ATR DB 0 no attributes for create F1NAME DS 10 DB 0 LASTCHR DB 0 FNBR0 DS 1 FNBR1 DS 1 * TOLMSG ASC ' blocksize to large. Not copied.' *DDB BSLI1 *DDB BSLI2 CRLOC DB CR,0 EXIMSG EQU $ ASC ' already exists' DB CR,0 DEVMSG ASC ' is a device file' DB CR,0 MSG1 ASC ' Disk reorganize - C/R to continue; MODE to abort' DB CR ASC ' At least 2000H bytes of system buffer must' ASC ' be available.' DB CR,0 MSG2 EQU $ ASC ' copied to disk 1' DB CR,0 MSG3 ASC ' Reorganization Complete' DB CR,0 * BOTTOM EQU $ MSBOTT EQU