; CASDSK - TRANSFER CASSETTE TO DISK ; 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,22 ;CREATE FILE. LXI D,TFCB CALL FDOS MVI C,15 ;OPEN FILE. LXI D,TFCB CALL FDOS MLOOP: LXI H,TBUFF ;GET ADDRESS OF BUFFER. CALL CTRD ;READ RECORD FROM CASSETTE. JNZ ERROR ;ERROR IF NOT ZERO. MOV A,B ;GET RECORD LENGTH AND ORA A ;CHECK FOR LENGTH 0 (EOF). JZ CLOSE ;IF EOF, CLOSE FILE. MVI C,21 ;WRITE A RECORD ONTO DISK. LXI D,TFCB CALL FDOS JMP MLOOP ;GET THE NEXT ONE. CLOSE: MVI C,16 ;CLOSE FILE. LXI D,TFCB CALL FDOS JMP 0 ;DO A WARM-START. ERROR: LXI D,QERR ;PRINT "TAPE ERROR". MVI C,9 CALL FDOS JMP CLOSE ;CLOSE FILE AND LEAVE. QERR: DB 'TAPE ERROR$' ; CTRD - READ A RECORD FROM CASSETTE. ; CTRD: CALL CASW ;DELAY TO ALLOW LAST CALL CASW ;BYTE TO PASS THROUGH. MVI E,0 ;SET CHECKSUM=0. MVI A,10H ;SET BIT 4=1. OUT CASC ;RESET RECEIVER. CALL CASR ;READ TYPE BYTE. CALL CASR ;READ LENGTH BYTE. MOV B,A ;PUT LENGTH BYTE IN B. RZ ;RETURN IF LENGTH 0. MOV C,A ;PUT LENGTH IN C TOO. CRLOP: CALL CASR ;READ DATA BYTE. MOV M,A ;PUT INTO MEMORY. INX H ;INCREMENT POINTER. DCR C ;DECREMENT COUNTER. JNZ CRLOP ;READ ANOTHER BYTE. MOV C,E ;PUT CHECKSUM IN C. CALL CASR ;READ CHECKSUM. SUB C ;SUBTRACT FROM A. RET ;RETURN FROM CRLOP. ; CASR: IN CASC ;READ CASS. STATUS. ANI 10H ;CHECK BIT 4. JNZ CASR ;WAIT TILL READY. IN CASD ;READ DATA. PUSH PSW ;SAVE REG A. ADD E ;ADD TO CHECKSUM. MOV E,A POP PSW ;RESTORE A. ORA A ;SET FLAGS. RET ;RETURN FROM CASR. ; CASW: PUSH PSW ;SAVE DATA ON STACK. CLOP: IN CASC ;READ STATUS. ANI 20H ;LOOK AT BIT 5. JNZ CLOP ;WAIT UNTIL READY. POP PSW ;RECOVER DATA. OUT CASD ;WRITE A BYTE. RET ;RETURN FROM CASW. CASC: EQU 6EH ;STATUS PORT. CASD: EQU 6FH ;DATA PORT. END