; FLOPPY makes a literal image of a floppy disk on the ; hard disk, or copies an image back to a floppy. ; ; Copyright [c] Noel Alaska Systems Technology, 1983. VMAJOR = 1. ; version equates VMINOR = 0. VSUB = 0. VEDIT = 6. ; CHANGE EACH EDIT <----------- VWHO = 0. SEARCH SYS ; AMOS librarys SEARCH SYSSYM SEARCH TRM SEARCH MFN ; My library DSECT .=0 ; define impure area STRTIM: BLKL 1 ENDTIM: BLKL 1 DSKDDB: BLKB D.DDB FLPDDB: BLKB D.DDB SWITCH: BLKB 1 EVEN IMPURE = . .=0 PSECT BEGIN: PHDR -1,-1,PH$REE!PH$REU GETIMP IMPURE,A5 ; get memory BYP LIN BEQ 2$ FSPEC DSKDDB(A5),FLP ; spec dsk file BYP LIN BEQ 2$ FSPEC FLPDDB(A5),FLP ; spec to/from BYP LIN BEQ 2$ MOVB #'T,SWITCH(A5) ; presume 'to' CMMW FLPDDB+D.FIL(A5),#[TO ] BNE 1$ CMMW FLPDDB+D.FIL+2(A5),#[ ] JEQ 3$ 1$: MOVB #'F,SWITCH(A5) ; presume 'from' CMMW FLPDDB+D.FIL(A5),#[FRO] BNE 2$ CMMW FLPDDB+D.FIL+2(A5),#[M ] BEQ 3$ 2$: TYPECR TYPECR < .FLOPPY dsk TO flp> TYPECR < or .FLOPPY dsk FROM flp> EXIT 3$: CLEAR FLPDDB(A5),D.DDB ; clean up the DDB FSPEC FLPDDB(A5) ; spec floppy (device/drive only) INIT DSKDDB(A5) ; allocate buffers INIT FLPDDB(A5) CMM FLPDDB+D.DVR(A5),DSKDDB+D.DVR(A5) BNE 4$ TYPECR EXIT 4$: CMM FLPDDB+D.DVR(A5),ZSYDSK BNE OPET TYPECR EXIT OPET: CMPB SWITCH(A5),#'T ; is this 'to' BNE OPEF ; NO LOOKUP DSKDDB(A5) ; lookup file BEQ 1$ ; good if found TYPESP ?File ; else nasty message PFILE DSKDDB(A5) TYPECR < not found or empty.> EXIT 1$: OPENI DSKDDB(A5) BR HDR OPEF: LOOKUP DSKDDB(A5) ; for 'from' op, file BNE 1$ ; will be deleted if it exists DSKDEL DSKDDB(A5) 1$: OPENO DSKDDB(A5) HDR: CRT 255.,0 TYPE VCVT BEGIN+2,OT$TRM TYPE <] - floppy disk image handler> CRT 3,1 TYPE PFILE DSKDDB(A5) CMMB #'T,SWITCH(A5) BEQ 1$ TYPE < will be an image of > BR 2$ 1$: TYPE < will be downloaded onto > 2$: PFILE FLPDDB(A5) CRT 12.,1 TYPE GTIMEI STRTIM(A5) ; save start time BISB #D$ERC!D$BYP,FLPDDB+D.FLG(A5) CLR FLPDDB+D.REC(A5) ; init rec # and buffer index CLR FLPDDB+D.IDX(A5) CMPB SWITCH(A5),#'T ; is this 'TO' operation? JEQ TO ; YES MOV FLPDDB+D.SIZ(A5),FLPDDB+D.IDX(A5) FROM: CTRLC ABORT CALL RIN TSTB FLPDDB+D.ERR(A5) BNE 2$ 1$: FILOTB DSKDDB(A5) BR FROM 2$: CMMB FLPDDB+D.ERR(A5),#D$EIBN BEQ 3$ CRT 16.,1 ERRMSG FLPDDB+D.ERR(A5),OT$LDQ!OT$TRM ; JMP ABORT BR 1$ 3$: CLOSE DSKDDB(A5) CRLF CRT 14.,1 TYPESP GTIMEI ENDTIM(A5) MOV ENDTIM(A5),D1 SUB STRTIM(A5),D1 DCVT 0,OT$TRM TYPECR < seconds elapsed> CRT 24.,1 EXIT TO: CTRLC ABORT FILINB DSKDDB(A5) TST DSKDDB+D.SIZ(A5) BEQ 2$ CALL ROUT TSTB FLPDDB+D.ERR(A5) BEQ TO CRT 16.,1 ERRMSG FLPDDB+D.ERR(A5),OT$LDQ!OT$TRM JMP ABORT 2$: CLR D1 CALL ROUT CMP FLPDDB+D.IDX(A5),#1 BEQ 3$ CRT 16.,1 TYPECR <%Input file did not fill the floppy disk!> 3$: CRLF CRT 14.,1 TYPESP GTIMEI ENDTIM(A5) MOV ENDTIM(A5),D1 SUB STRTIM(A5),D1 DCVT 0,OT$TRM TYPECR < seconds elapsed> CRT 24.,1 EXIT ABORT: CMPB SWITCH(A5),#'T BEQ 1$ CRLF CRT 20.,1 TYPECR <%Erasing output file> CLOSE DSKDDB(A5) DSKDEL DSKDDB(A5) CRT 20.,1 CRT 255.,9. 1$: JOBIDX A0 ; reset ^C waiting BIT #J.CCC,@A0 BEQ 2$ CRLF CRT 20.,1 TYPECR 2$: BIC #J.CCC,@A0 CRLF CRT 24.,1 EXIT ; sequential input for entire disk RIN: CMM FLPDDB+D.IDX(A5),FLPDDB+D.SIZ(A5) BLO RIN2 ; buffer not empty RIN1: READ FLPDDB(A5) ; is empty, read next PUSH D1 CRT 12.,9. MOV FLPDDB+D.REC(A5),D1 DCVT 5,2 POP D1 INC FLPDDB+D.REC(A5) ; advance random record # CLR FLPDDB+D.IDX(A5) RIN2: MOV FLPDDB+D.BUF(A5),A6 ; stack buffer address ADD FLPDDB+D.IDX(A5),A6 ; add offset MOVB @A6,D1 ; get byte and unstack INC FLPDDB+D.IDX(A5) ; incr offset RTN ; sequential output for entire disk ROUT: CMM FLPDDB+D.IDX(A5),FLPDDB+D.SIZ(A5) BLO ROUT1 ; buffer not full WRITE FLPDDB(A5) ; is full, write it INC FLPDDB+D.REC(A5) ; advance random record # SAVE A1,D0,D1 CRT 12.,9. MOV FLPDDB+D.REC(A5),D1 DCVT 5,2 MOV FLPDDB+D.BUF(A5),A1 MOV FLPDDB+D.SIZ(A5),D0 1$: CLRB (A1)+ SOB D0,1$ REST A1,D0,D1 CLR FLPDDB+D.IDX(A5) ROUT1: MOV FLPDDB+D.BUF(A5),A6 ; stack buffer address ADD FLPDDB+D.IDX(A5),A6 ; add offset MOVB D1,@A6 ; stash byte and unstack INC FLPDDB+D.IDX(A5) ; incr offset RTN EVEN END