; DSKCAS - TRANSFER DISK TO CASSETTE ; TARBELL ELECTRONICS ; ORG 100H FDOS: EQU 5 ;DISK SYSTEM ENTRY POINT. TFCB: EQU 5CH ;DEFAULT FILE CONTROL BLOCK. TBUFF: EQU 80H ;DEFAULT BUFFER LOCATION. MVI C,15 ;OPEN FILE. LXI D,TFCB CALL FDOS MLOOP: MVI C,20 ;READ A RECORD FROM DISK. LXI D,TFCB CALL FDOS ORA A ;IF READ NOT OK, JNZ CLOSE ;CLOSE FILE. CALL CTWT ;OTHERWISE, WRITE TO CASSETTE. JMP MLOOP ;AND GET ANOTHER FROM DISK. CLOSE: MVI B,0 ;WRITE END-OF-FILE MARK. CALL EOF MVI C,16 ;CLOSE FILE. LXI D,TFCB CALL FDOS JMP 0 ;DO A WARM START. ; CTWT - WRITE A BLOCK TO CASSETTE. ; CTWT: MVI B,80H ;LENGTH FOR NORMAL RECORD. EOF: LXI H,TBUFF ;GET ADDRESS OF BUFFER. LXI D,187*2 ;GET COUNT FOR 2 SECONDS. DELAY: MVI A,3CH ;WRITE START BYTE. CALL CASW DCX D ;DECREMENT COUNT. MOV A,D ;IF D&E ARE ORA E ;YET ZERO, JNZ DELAY ;KEEP COUNTING DOWN. MVI A,0E6H ;WRITE SYNC BYTE. CALL CASW MVI C,0 ;CLEAR CHECKSUM. MVI A,90H ;WRITE TYPE BYTE. CALL CASW MOV A,B ;WRITE LENGTH BYTE. CALL CASW MOV A,B ;GET LENGTH BYTE. ORA A ;IF IT'S ZERO, RZ ;RETURN FROM CTWT. CTLP: MOV A,M ;WRITE DATA BYTE. CALL CASW INX H ;INCREMENT POINTER. DCR B ;DECREMENT COUNTER. JNZ CTLP ;REPEAT. MOV A,C ;WRITE CHECKSUM. CASW: PUSH PSW ;SAVE DATA ON STACK. CALP: IN CASC ;READ CASSETTE STATUS. ANI 20H ;LOOK AT BIT 5. JNZ CALP ;WAIT UNTIL READY. POP PSW ;RECOVER DATA. OUT CASD ;WRITE A BYTE. ADD C ;ADD TO CHECKSUM. MOV C,A RET ;RETURN FROM CASW. CASC: EQU 6EH ;CASSETTE STATUS PORT. CASD: EQU 6FH ;CASSETTE DATA PORT.