home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol020
/
cass.z80
< prev
next >
Wrap
Text File
|
1984-04-29
|
8KB
|
507 lines
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