TITLE CASSETTE SUBSYSTEM FOR SYSTEM MONITOR ; ; ****Donated to the Pascal/Z80 Users Group, July 1980***** ; ; A CASSETTE SUBSYSTEM FOR SYSTEM MONITOR ; IT CONTROLS THE DAJEN/TELETEK UCRI. INCLUDES ; ZAPPLE COMPATABLE {RI} AND {PO} INTERTIE ; ; MODIFIED FOR C-MACRO ASSEMBLER MAY 1979 ; ; ; CONSOLE BASE ADDRESS AND CASSETTE WORK AREA BASE ; ; CBASE IS CONSOLE BASE ADDRESS ; TWBASE IS CASSETTE VARIABLE BASE ; ;CASSETTE PORTS ; IOBASE EQU 060H ;PORT BASE PORTC EQU 0CH+IOBASE ;FILL OUTPUT PORT PORTD EQU 0DH+IOBASE ;STATUS PORT PORTE EQU 0EH+IOBASE ;LEVEL & RELAY PORT PORTF EQU 0FH+IOBASE ;DATA I/O PORT ; ; CONSOLE CALL ADDRESSES ; CCALL1 EQU CBASE+9 CCALL2 EQU CBASE+21H ; ;ENTRIES ; TBASE EQU $ TNTRY0 JP TINIT ;INITIALIZE THE PACKAGE TNTRY1 JP SVASC ;ZAPPLE {PO} WRITE CASSETTE TNTRY2 JP LDASC ;ZAPPLE {RI} READ CASSETTE TNTRY3 JP TWRITE ;SPHINX-DAJEN WRITE CASSETTE TNTRY4 JP TREAD ;SPHINX-DAJEN READ CASSETTE TNTRY5 JP OPENOUT ;CORE OPEN CASSETTE OUT-FILE TNTRY6 JP CTOUT ;CORE WRITE CASSETTE TNTRY7 JP CLOUT ;CORE CLOSE CASSETTE OUT-FILE TNTRY8 JP OPENIN ;CORE OPEN CASSETTE INP-FILE TNTRY9 JP CTINP ;CORE READ CASSETTE TNTRYA JP CLINP ;CORE CLOSE CASSETTE INP-FILE ; ;EXTERNAL CALL VECTORS TO CONSOLE I.0 ; TKEYIN JP CCALL1 ;UNSTROBED KEYBOARD CALL TBFOUT JP CCALL2 ;BUFFOUT MESSAGE CALL ; ;WORK AREA OF CASSETTE PACKAGE ; TWRK DEFW TWBASE ; ; INITIALIZE THE PACKAGE ; TINIT CALL TSETUP LD A,0E6H LD (IY),A CALL TERROR OR A JP TEXIT ; ; SAVE IY REG .. USED IN CASSETTE PACKAGE ; TSETUP EX (SP),IY PUSH IY LD IY,(TWRK) RET ; ; EXIT FORM CASSETTE PACKAGE ; TEXIT POP IY RET ; ; ERROR RETURN ; POPERR POP HL ERROUT LD HL,TMSG1 CALL TBFOUT JR TEXIT ; ; COMPLETE RETURN ; TDONE LD HL,TMSG2 CALL TBFOUT JR TEXIT ; ; CHECKSUM ERROR RETURN ; CKSMER LD HL,TMSG3 CALL TBFOUT JR TEXIT ; ; TEST FOR ESCAPE ; GETOUT CALL TKEYIN CP 1BH JR Z,ESC1 OR A RET ESC1 SCF RET ; ;CORE ROUTINES TO DRIVE THE DAJEN UCRI ; ; ; INPUT A BYTE TO CASSETTE ; CTINP: CALL GETOUT ;CK ESCAPE JR Z,CTI1 ;ESCAPE IN A,(PORTE) AND 10H ;READY? JR NZ,CTINP ;NO IN A,(PORTF);YES GET BYTE OR A RET ;NORMAL RETURN CTI1: SCF ;ESCAPE RETURN RET ; ; OUTPUT A BYTE TO CASSETTE ; CTOUT: PUSH AF ;SAVE BYTE TEMP. CTO1: CALL GETOUT ;ESCAPE? JR Z,CTO2 ;YES IN A,(PORTD) AND 01H ;READY? JR Z,CTO1 ;NO POP AF ;YES, GET BYTE OUT (PORTF),A OR A RET ;NORMAL RETURN CTO2: POP AF SCF RET ;ESCAPE RETURN ; ; DELAY ROUTINES ; DELAY: PUSH HL LD HL,0H DL1: CALL GETOUT JR Z,DL5 DL2: INC H JR Z,DL4 DL3: INC L JR NZ,DL3 JR DL1 DL4: OR A POP HL RET ;NORMAL RETURN DL5: SCF POP HL RET ;ESCAPE RETURN ; DELAY3: CALL DELAY RET C ; DELAY2: CALL DELAY RET C CALL DELAY RET ; ; OPEN CASSETTE INPUT FILE ; LOOK FOR SYNC BYTE THEN RET ; OPENIN CALL TSETUP CALL OPINP JP TEXIT ; OPINP: PUSH HL LD HL,TMSG4 CALL TBFOUT LD A,28H ;START CASSETTE OUT (PORTE),A OPI1: CALL GETOUT ;ESCAPE? JR Z,OPI2 ;YES IN A,(PORTE) AND 40H ;LEVEL OK? JR Z,OPI1 ;NO CALL DELAY ;YES, WAIT A WHILE JR C,OPI3 ;ESCAPE IN A,(PORTE) AND 40H ;LEVEL STILL OK? JR Z,OPINP ;NO, RESTART CALL DELAY ;YES, WAIT SOME MORE JR C,OPI3 ;ESCAPE LD A,(IY);LOAD SYNC BYTE OUT (PORTD),A LD HL,TMSG5 ;NORMAL RETURN CALL TBFOUT OR A JR OPI3 OPI2: SCF ;ESCAPE RETURN OPI3: POP HL RET ; ; OPEN CASSETTE OUTPUT FILE ; OUTPUT A LEADER OF NULLS ; OPENOUT CALL TSETUP CALL OPOUT JP TEXIT ; OPOUT: PUSH HL LD HL,TMSG6 CALL TBFOUT POP HL LD A,28H ;INIT CASSETTE OUT (PORTE),A OUT (PORTD),A CALL DELAY ;OUTPUT SILENT LEADER RET C ;ESCAPE SUB A OUT (PORTC),A CALL DELAY3 ;OUTPUT FILL TONE RET C ;ESCAPE CALL DELAY3 RET C ;ESCAPE CALL DELAY3 RET C ;ESCAPE LD A,3CH ;OUTPUT CLOCK BYTE CALL CTOUT RET C ;ESCAPE LD A,(IY);OUTPUT SYNC BYTE CALL CTOUT RET C ;ESCAPE OR A RET ;NORMAL RETURN ; ; CLOSE CASSETTE INPUT AND OUTPUT FILES ; OUT - OUTPUT A TRAILER OF NULLS ; INP - MOVE ONTO THE TRIAULER ; TURN OFF CASSETTE ALSO ; CLOUT: SUB A ;OUTPUT TRAILER TONE CALL CTOUT RET C ;ESCAPE CALL DELAY RET C OFFCAS: LD A,28H ;OUTPUT SILENT TONE OUT (PORTE),A OUT (PORTD),A CLINP: CALL DELAY ;INP ENTRY RET C ;ESCAPE LD A,38H ;TURN OFF CASSETE OUT (PORTE),A OR A RET ;NORMAL RETURN ; ; ESCAPE RETURN ; TERROR CALL OFFCAS LD A,02H LD (IY+1),A SCF ;SET CARRY FLAG RET ; ; DAJEN OUTPUT TO CASSETTE ROUTINE ; TARBELL COMPATABLE W/CKSUM ; TWRITE CALL TSETUP EX DE,HL LD B,0 CALL OPOUT ;OPEN FILE JP C,ERROUT LD A,E ;SEND STARTING ADDRESS CALL DJCO JP C,ERROUT LD A,D CALL DJCO JP C,ERROUT LD A,H ;SEND NUMBER OF BYTES CALL DJCO JP C,ERROUT LD A,L CALL DJCO JP C,ERROUT DJ1: LD A,(DE) ;SEND A BYTE CALL DJCO JP C,ERROUT INC DE DEC HL SUB A OR H OR L JR NZ,DJ1 LD A,B ;SEND CKSUM CALL DJCO JP C,ERROUT CALL CLOUT ;CLOSE FILE JP C,ERROUT JP TDONE ; ; DAJEN INPUT CASSETTES ROUTINE ; 3 OPTIONS AVAILABLE ; I(CR) STANDARD LOAD ; IBBBB(CR) STD.LD W/BIAS ; IXXXX,YYYY(CR) LOAD SPECIFIC ; WHERE X,Y ARE BEG ; AND END. ADDR. ; TREAD CALL TSETUP OR A JR Z,TRD1 ; ; LOAD SPECIFIC FROM ADDR1 TO ADDR2 ; EX DE,HL CALL OPINP ;OPEN FILE JP C,ERROUT CALL DJ4 ;LOAD IN FILE CALL CLINP ;CLOSE FILE JP C,ERROUT JP TDONE ; ; LOAD ABSOLUTE AS DIRECTED ON TAPE ; WITH A BIAS RESIDING IN REG HL ; TRD1 CALL OPINP ;OPEN FILE JP C,ERROUT LD B,0 ;INITIALIZE CKSUM CALL DJCI ;GET STARTING ADDR JP C,ERROUT LD E,A CALL DJCI JP C,ERROUT LD D,A ADD HL,DE ;ADD ON BIAS EX DE,HL CALL DJCI ;GET NO. OF BYTES JP C,ERROUT LD H,A CALL DJCI JP C,ERROUT LD L,A CALL DJ4 ;LOAD IN FILE CALL CTINP ;GET CKSUM CP B PUSH AF CALL CLINP ;CLOSE FILE JP C,POPERR POP AF JP NZ,CKSMER JP TDONE DJ4: CALL DJCI ;LOAD IN FILE JP C,POPERR LD (DE),A INC DE DEC HL LD A,H OR L JR NZ,DJ4 RET DJCI: CALL CTINP ;GET BYTE RET C PUSH AF CALL DJCK POP AF RET DJCO: CALL CTOUT ;SEND BYTE RET C DJCK ADD A,B LD B,A OR A RET EJECT ; ; CASSETTE ROUTINES FOR ZAPPLE BASIC ; ENTRY THOUGH THE MONITOR ; WRITTEN BY RICHARD LERSETH AUG 15, 1978 ; ; CHECK FOR {FFH} IN PRES AND LAST BYTE ; CKFF: INC A ;PRES FF? LD A,(IY+2) JR Z,CK3 ;YES INC A ;LAST FF? JR Z,CK1 ;YES SUB A ; <> <> INC A RET CK1 INC A ; <> = CK2 SCF ; = = RET CK3 INC A ;LAST FF? JR Z,CK2 ;YES SUB A ; = <> RET ; ; CHECK FOR END OF FILE ; CKEND: LD A,(IY+3) INC A LD (IY+3),A CP 08H JR NZ,CKE1 LD A,(IY+4) OR A JR NZ,CKE1 SCF RET CKE1 SUB A RET ; ; RESET FLAG AND COUNTER ; RESET: SUB A LD (IY+3),A LD (IY+4),A RET ; ; OUTPUT TO CASSETTE ; SVASC CALL TSETUP CALL SAVE JP TEXIT ; SAVE LD A,(IY+1) ;TRANS MODE? OR A JR NZ,SVFORE LD A,C CALL CTOUT JP C,TERROR CALL CKFF LD A,C LD (IY+2),A JR Z,AS1 CALL C,RESET RET AS1 CALL CKEND JR C,SVAFT RET ; SVFORE: LD A,C INC A JP NZ,TERROR CALL OPOUT JP C,TERROR LD A,C LD (IY+2),A CALL CTOUT JP C,TERROR SUB A LD (IY+3),A LD (IY+1),A INC A LD (IY+4),A RET ; SVAFT: CALL CLOUT JP C,TERROR LD A,2 LD (IY+1),A RET ; ; INPUT FROM CASSETTE ; LDASC CALL TSETUP CALL LOAD JP TEXIT ; LOAD LD A,(IY+1) DEC A JR NZ,LDFORE CALL CTINP JP C,TERROR PUSH AF CALL CKFF JR Z,AL1 CALL C,RESET POP AF RET ; AL1 CALL CKEND JR C, LDAFT POP AF RET ; LDFORE: CALL OPINP JP C,TERROR SUB A LD (IY+3),A INC A LD (IY+1),A CALL CTINP JP C,TERROR LD (IY+2),A RET ; LDAFT: CALL CLINP JR NC,LD1 POP AF JP TERROR LD1 POP AF RET ; ;PACKAGE MESSAGES CR DEFL 0DH LF DEFL 0AH EOM DEFL 00H ; TMSG1 DEFB CR,LF,'ESCAPE',EOM TMSG2 DEFB CR,LF,'COMPLETE',EOM TMSG3 DEFB CR,LF,'CHECKSUM ERROR',EOM TMSG4 DEFB CR,LF,'>SEARCHING ',EOM TMSG5 DEFB '* READING',EOM TMSG6 DEFB CR,LF,'>WRITING ',EOM