CR EQU 0DH LF EQU 0AH CRTS EQU 0F7H CRTD EQU 0F6H TTYS EQU 0F5H TTYD EQU 0F4H ; OPCPL EQU 4 DSTS EQU 78H DTYPE EQU 79H RSTS EQU 7BH LOWW EQU 79H HI EQU 7AH DSKRST EQU 7FH ; OPEN EQU 0 CLOSE EQU 1 READ EQU 3 WRITE EQU 4 EXIT EQU 9 ERROR EQU 12 ; TRDY EQU 00000001B RRDY EQU 00000010B ; EXTRN ISIS EXTRN CO EXTRN CI ; CSEG ; BEGIN: LXI SP,STCKA+4 MVI A,35H OUT CRTS ; GETFN: MVI C,READ LXI D,RBLK CALL ISIS LDA STATUS ORA A JNZ ERR ; LXI H,BUFFER LXI D,FILENM MVI C,128 MOVEIT: MOV A,M INX H STAX D INX D MOV A,M CPI 20H JZ ZERO CPI CR JZ ZERO DCR C JZ ZERO JMP MOVEIT ; ZERO: MVI A,0 STAX D ; LXI H,TRKMSG CALL PRNTMSG LXI H,FILENM CALL PRNTMSG LXI H,OKMSG CALL PRNTMSG ; CALL CI CPI 'Y' JNZ ERR LXI H,PROCMSG CALL PRNTMSG OUT DSKRST ; ANYTHING OUTPUT TO 7FH RESETS DD FDC ; DTRHI: MVI A,35H ; SETS DTR HIGH OUT CRTS JMP WRTCMD ; DTRLO: IN CRTS ANI 4 JZ DTRLO ; WAIT FOR TX EMPTY LXI D,1000H DTRLO0: ; GIVE THE USB A LITTLE TIME DCR E JNZ DTRLO0 DCR D JNZ DTRLO0 ; MVI A,37H ; TOGGLE DTR AND USB SD0 LOW OUT CRTS MVI A,35H ; RETURN THEM TO HIGH OUT CRTS RET ; TIME TO WRAP IT UP ; WRTCMD: LXI H,WRTWRD ; SEND COMMAND TO USB CALL CRTOUT LXI H,FILENM+1 ; GIVE IT FILENAME CALL CRTOUT LXI H,BINMSG ; USE THE B SWITCH FOR BINARY CALL CRTOUT MVI C,CR ; CR LAUNCH COMMAND CALL CRTO JMP TRKBYTRK ; NOW USB WANTS THE DATA ; WRTWRD: DB '$WRITE ',0 BINMSG: DB ' B',0 ; CRTOUT: MOV A,M ORA A RZ MOV C,A CALL CRTO INX H JMP CRTOUT ; CRTIN: CALL CRTI MOV M,A CPI CR RZ INX H JMP CRTIN ; CRTI: IN CRTS ANI RRDY JZ CRTI IN CRTD ANI 7FH RET ; CRTO: IN CRTS ANI TRDY JZ CRTO MOV A,C OUT CRTD RET ; TRKBYTRK: MVI A,0 ; BEGIN WITH TRACK 0 STA TRACK ; ; BEGIN LOOP TO READ A TRACK FROM DISK, WRITE THE TRACK TO USB ; TBT0: CALL SAYTRKN ; PRINTS THE TRACK#, BUT ESCAPES ; TO DONE0 IF WE ARE ALREADY DONE ; LXI H,TRKBUFF SHLD IOPB5 ; MAKE SURE IOPB HAS RIGHT BUFF ADDR LXI H,IOPB ; LAUNCH THE FDC TO READ THE TRACK MOV A,L OUT LOWW MOV A,H OUT HI ; TBT1: ; WAIT FOR DISK TO COMPLETE IN 078H ; READ STATUS FOR INTERRUPT PENDING ANI 4 JZ TBT1 IN DTYPE ; RESULT TYPE MUST ONLY BE READ AFTER BIT2 ; IN STATUS GOES TRUE, THEN MUST READ RSLT BYTE TOO ANI 2 JZ TYPE00 IN DTYPE ; IT WAS TYPE 10 ANI 80H ; DRV 1 MUST BE RDY JZ ERR JMP OK TYPE00: ; RESULT TYPE WAS 00 IN 07BH ; RESULT BYTE ORA A ; NOT 00000000B MEAN ERROR JNZ ERR OK: LXI H,TRKBUFF ; TBT2: ; EXPORT THE 6656 BYTES IN TRKBUFF MOV C,M ; TO THE USB CALL CRTO INX H ; BUMP BUFF PTR LXI D,BUFFTOP MOV A,E CMP L JNZ TBT2 MOV A,D CMP H JNZ TBT2 ; DONE WITH THIS TRACK? LDA TRACK ; IF SO BUMP THE TRACK NUMBER INR A STA TRACK JMP TBT0 ; LOOP FOR NEXT TRACK ; TRKNUM: DB '00010203040506070809' DB '10111213141516171819' DB '20212223242526272829' DB '30313233343536373839' DB '40414243444546474849' DB '50515253545556575859' DB '60616263646566676869' DB '70717273747576??????' ; TRKMSG: DB 'COPYING DISK-1 TRACK-BY-TRACK TO USB',0 ; CPYMSG: DB 'COPYING ALL OF DISK-1 IMAGE TO USB AS ',0 OKMSG: DB ', OK? Y/N',CR,LF,0 PROCMSG: DB 'PROCEEDING NOW...',CR,LF,0 ; TRKPTR: DW TRKNUM ; SAYTRKN: MVI C,CR ; WRITE OVER THE LAST UPDATE CALL CO LDA TRACK ADD A ; DOUBLE IT LXI H,TRKNUM ; INDEX INTO ASCII TABLE MOV E,A MVI D,0 DAD D MOV C,M MVI A,'?' ; REACHED THE END? CMP C JZ DONE0 ; ABORT IF ? SEEN CALL CO INX H MOV C,M CALL CO INX H SHLD TRKPTR ; POINT TO NEXT ASCII PAIR RET ; PRNTMSG: MOV C,M CALL CO INX H MOV A,M ORA A JNZ PRNTMSG RET ; DONEMSG: DB CR,LF,'DONE',CR,LF,0 ; DONE: MVI C,CLOSE LXI D,CBLK CALL ISIS DONE0: CALL DTRLO LXI H,DONEMSG CALL PRNTMSG ; MVI C,EXIT LXI D,XBLK CALL ISIS ERR: MVI C,ERROR LXI D,EBLK CALL ISIS JMP DONE0 ; DSEG OBLK: DW WAFT DW BUFFER DW 2 DW 0 DW STATUS ; CBLK: CAFT: DS 2 DW STATUS ; RBLK: OAFT: RAFT: DW 1 DW BUFFER DW 128 DW ACTUAL DW STATUS ; ACTUAL: DS 2 ; WBLK: WAFT: DS 2 DW BUFFER WCNT: DS 2 DW STATUS ; XBLK: DW STATUS EBLK: STATUS: DS 2 DW STATUS ; BUFFER: DB 'NEW.IMG',0 DS 120 ; FILENM: DS 128 ; FIRSTNM: DS 2 DIGITS: DS 1 BYTECNT: DS 2 ; RESPONSE: DS 128 ; IOPB: DB 0 ; INTERRUPTS ON DB 14H DB 52 TRACK: DB 0 DB 1 IOPB5: DW TRKBUFF ; DS 128 ; TRKBUFF: DS 6656 ; BUFFTOP: ; STCKA: DS 4 ; END BEGIN ;