;PAGE	69

;	.PAGE
;	.TITLE	'CASSET HANDLER 3/12 (DK1:CASCV)'
CBUFH	=	CASBUF/256
CBUFL	=	(-256)*CBUFH+CASBUF
SRSTA	=	$40		;SIO READ STATUS
SWSTA	=	$80		;SIO WRITE STATUS
;MOTRGO =	$34
;MOTRST =	$3C
;
;
DTA	=	$FC		;DATA RECORD TYPE BYTE
DT1	=	$FA		;LAST DATA RECORD
EOT	=	$FE		;END OF TAPE
HDR	=	$FB		;HEADER
TONE1	=	2		;CHANGE TO RECORD MODE TONE
TONE2	=	1		;PRESS PLAY TONE
;
;
;
	.ORG	CASETV
	.WORD	OPENC-1,CLOSEC-1,GBYTE-1,PBYTE-1,STATU-1,SPECIAL-1

	JMP	INIT
	.BYTE	0		;ROM FILLER BYTE
;
;
;
; USED IN MONITP FOR CASSETTE BOOT
;
	.ORG	RBLOKV
	JMP	RBLOK
;
	.ORG	CSOPIV
	JMP	OPINP
;
;
	.ORG	CASORG
;
;
; INIT ROUTINE
;
INIT:	LDA	#$CC
	STA	CBAUDL
	LDA	#$05
	STA	CBAUDH		;SET CASSETTE BAUD RATE TO 600
SPECIAL:			;THATS ALL FOLKS
	RTS
 

;PAGE	70

;	.PAGE
;
; OPEN FUNCTION - WITH NO TIMING ADJUST
;
OPENC:	LDA	ICAX2Z		;GET AX2
	STA	FTYPE		;SAVE IT FOR FUTURE REFERENCE
	LDA	ICAX1Z
	AND	#$0C		;IN AND OUT BITS
	CMP	#$04
	BEQ	OPINP
	CMP	#$08		;SEE IF OPEN FOR OUTPUT
	BEQ	OPOUT
	RTS			;IF ALREADY OPEN, RETURN LEAVING STATUS=$84
OPINP:	LDA	#0
	STA	WMODE		;SET READ MODE
	STA	FEOF		;NO EOF YET
SFH:	LDA	#TONE2		;TONE FOR PRESS PLAY
	JSR	BEEP		;GO BEEP
	BMI	OPNRTN		;IF ERROR DURING BEEP
	LDA	#MOTRGO
	STA	PACTL		;TURN MOTOR ON
	.IF	PALFLG
	LDY	#$E0
	LDX	#1
	.ENDIF
	.IF	PALFLG-1
	LDY	#$40		;5-31-79 9 SEC READ LEADER
	LDX	#2
	.ENDIF
	LDA	#3
	STA	CDTMF3
	JSR	SETVBV		;SET UP BLANK TIMER
WAITTM: LDA	CDTMF3
	BNE	WAITTM		;WAIT FOR MOTOR TO COME UP TO SPEED
	LDA	#$80		;NEXT BYTE=NO BYTES IN BUFFER
	STA	BPTR
	STA	BLIM
	JMP	OPOK		;OPEN OK
;
; OPEN FOR OUTPUT
;
PBRK:	LDY	#BRKABT		;BREAK KEY ABORT STATUS
	DEC	BRKKEY		;RESET BREAK KEY
OPNRTN: LDA	#0		;CLEAR WRITE MODE FLAG
	STA	WMODE
	RTS			;AND EXIT.
;
OPOUT:	LDA	#$80
	STA	WMODE		;SET WRITE MODE
	LDA	#TONE1		;TELL USER TO TURN ON RECORD MODE
	JSR	BEEP
	BMI	OPNRTN		;IF ERROR DURING BEEP
	LDA	#$CC		;SET BAUD RATE
	STA	AUDF3		;WHICH SEEMS TO BE NESSECARY
 

;PAGE	71

	LDA	#$05		;FOR SOME OBSCURE REASON
	STA	AUDF4
	LDA	#$60
	STA	DDEVIC
	JSR	SENDEV		;TELL POKEY TO WRITE MARKS
	LDA	#MOTRGO		;WRITE 5 SEC BLANK TAPE
	STA	PACTL
	LDA	#3
	.IF	PALFLG
	LDX	#$3
	LDY	#$C0
	.ENDIF
	.IF	PALFLG-1
	LDX	#4		;5/30/79 20 SEC LEADER
	LDY	#$80
	.ENDIF
	JSR	SETVBV
	LDA	#$FF
	STA	CDTMF3
WDLR:	LDA	BRKKEY
	BEQ	PBRK		;IF BREAK DURING WRITE LEADER
	LDA	CDTMF3
	BNE	WDLR
	LDA	#0		;INIT BUFFER POINTER
	STA	BPTR
OPOK:	LDY	#SUCCES
	RTS
 

;PAGE	72

;	.PAGE
;
; GET BYTE
;
GBYTE:	LDA	FEOF		;IF AT EOF ALREADY
	BMI	ISEOF		;RETURN EOF STATUS
	LDX	BPTR		;BUFFER POINTER
	CPX	BLIM		;IF END OF BUFFER
	BEQ	RBLOK		;READ ANOTHER BLOCK
	LDA	CASBUF+3,X	;GET NEXT BYTE
	INC	BPTR		;BUMP POINTER
	LDY	#SUCCES		;OK STATUS
GBX:	RTS
RBLOK:	LDA	#'R'		;READ OPCODE
	JSR	SIOSB		;SIO ON SYS BUF
	TYA
	BMI	GBX		;IF SIO ERRORS, RETURN
	LDA	#0
	STA	BPTR		;RESET POINTER
	LDX	#$80		;DEFAULT # BYTES
	LDA	CASBUF+2
	CMP	#EOT
	BEQ	ATEOF		;IF HEADER, GO READ AGAIN
	CMP	#DT1		;IF LAST DATA REC
	BNE	NLR
	LDX	CASBUF+130	;LAST DATA RECORD, GET # BYTES
NLR:	STX	BLIM
	JMP	GBYTE		;GET NEXT BYTE
ATEOF:	DEC	FEOF		;SET FEOF
ISEOF:	LDY	#EOFERR		;ENDFILE STATUS
	RTS
 

;PAGE	73

;	.PAGE
;
; PUT BYTE TO BUFFER
;
PBYTE:	LDX	BPTR		;BUFFER POINTER
	STA	CASBUF+3,X	;STORE CHAR AWAY
	INC	BPTR		;BUMP POINTER
	LDY	#SUCCES		;OK STATUS
	CPX	#127		;IF BUFFER FULL
	BEQ	*+3
	RTS
; WRITE OUT THE BUFFER
	LDA	#DTA		;RECORD TYPE = DATA
	JSR	WSIOSB		;DO WRITE ON SYSTEM BUFFER
	LDA	#0
	STA	BPTR		;RESET BUFFER POINTER
	RTS			;EXIT.
 

;PAGE	74
;	.PAGE
;
; STATUS - RETURN STATUS INFO THRU DVSTAT
;
STATU:	LDY	#SUCCES
	RTS
 
;PAGE	75
;	.PAGE
;
; CLOSE
;
CLOSEC: LDA	WMODE		;SEE IF WRITING
	BMI	CLWRT		;GO CLOSE FOR WRITE
; CLOSE FOR READ - FLAG CLOSED
	LDY	#SUCCES		;SUCCESSFULL
FCAX:	LDA	#MOTRST		;STOP THE MOTOR IN CASE WAS SHORT IRG MODE
	STA	PACTL
	RTS
CLWRT:	LDX	BPTR		;BUFFER POINTER
	BEQ	WTLR		;IF NO DATA BYTES IN BUFFER, NO DT1 REC
	STX	CASBUF+130	;WRITE TO LAST RECORD
	LDA	#DT1		;REC TYPE
	JSR	WSIOSB		;WRITE OUT USER BUFFER
	BMI	FCAX		;GO IF ERROR
WTLR:	LDX	#127		;ZERO BUFFER
	LDA	#0
ZTBUF:	STA	CASBUF+3,X
	DEX
	BPL	ZTBUF
	LDA	#EOT		;WRITE EOT RECORD
	JSR	WSIOSB
	JMP	FCAX		;FLAG CLOSED AND EXIT
 

;PAGE	76

;	.PAGE
;
; SUBROUTINES
;
; BEEP - GENERATE TONE ON KEYBOARD SPEAKER
; ON ENTRY A= FREQ
;
BEEP:	STA	FREQ
BEEP1:	LDA	RTCLOK+2	;CURRENT CLOCK
	CLC
	.IF	PALFLG
	ADC	#25
	.ENDIF
	.IF	PALFLG-1
	ADC	#30		;1 SEC TONE
	.ENDIF
	TAX
WFL:	LDA	#$FF
	STA	CONSOL		;TURN ON SPEAKER
	LDA	#0
	LDY	#$F0
	DEY
	BNE	*-1
	STA	CONSOL		;TURN OFF SPEAKER
	LDY	#$F0
	DEY
	BNE	*-1
	CPX	RTCLOK+2	;SEE IF 1 SEC IS UP YET
	BNE	WFL
	DEC	FREQ		;COUNT BEEPS
	BEQ	WFAK		;IF ALL DONE GO WAIT FOR KEY
	TXA
	CLC
	.IF	PALFLG
	ADC	#8
	.ENDIF
	.IF	PALFLG-1
	ADC	#10
	.ENDIF
	TAX
	CPX	RTCLOK+2
	BNE	*-2
	BEQ	BEEP1		;UNCOND GO BEEP AGAIN
WFAK:	JSR	WFAK1		;USE SIMULATED "JMP (KGETCH)"
	TYA
	RTS
WFAK1:	LDA	KEYBDV+5
	PHA
	LDA	KEYBDV+4	;SIMULATE "JMP (KGETCH)"
	PHA
	RTS
;
; SIOSB - CALL SIO ON SYSTEM BUFFER
;
 

;PAGE	77

SIOSB:	STA	DCOMND		;SAVE COMMAND
	LDA	#0
	STA	DBYTHI		;SET BUFFER LENGTH
	LDA	#131
	STA	DBYTLO
	LDA	#CBUFH
	STA	DBUFHI		;SET BUFFER ADDRESS
	LDA	#CBUFL
	STA	DBUFLO
CSIO:	LDA	#$60		;CASSET PSEUDO DEVICE
	STA	DDEVIC
	LDA	#0
	STA	DUNIT
	LDA	#35		;DEVICE TIMEOUT (5/30/79)
	STA	DTIMLO
	LDA	DCOMND		;GET COMMAND BACK
	LDY	#SRSTA		;SIO READ STATUS COMMAND
	CMP	#'R'
	BEQ	*+4
	LDY	#SWSTA		;SIO WRITE STATUS COMMAND
	STY	DSTATS		;SET STATUS FOR SIO
	LDA	FTYPE
	STA	DAUX2		;INDICATE IF SHORT IRG MODE
	JSR	SIOV		;GO CALL SIO
	RTS

;
; WSIOSB WRITE SIO SYSTEM BUFFER
;
WSIOSB: STA	CASBUF+2	;STORE TYPE BYTE
	LDA	#$55
	STA	CASBUF+0
	STA	CASBUF+1
	LDA	#'W' ;WRITE
	JSR	SIOSB		;CALL SIO ON SYSTEM BUFFER
	RTS			;AND RETURN 		KH!!!

CRNTP6	=*
	.ORG	$14
CASSPR: .BYTE	MONORG-CRNTP6 ;^GCASCV IS TOO LONG
 

