09       .OPT NO LIST
10 ;  SAVE #D1:CASSETTE.M65
20 ;
30 ;
40 ;  LOAD #D1:PRINTER.M65
50 ;
51       .PAGE "Cassette Handler"
52 ;  *= $FCD8
60        LIST  
80       .LOCAL 
99 ; Most comments from 800 source
064728 CIN JMP CLICK Cassette init
064731 INITCAS LDA #$CC routine
064733   STA CBAUDL  followed by
064736   LDA #5      cassette i/o
064738   STA CBAUDH  routines
064741 SPECIAL.C RTS 
064742 OPEN.C LDA ICAX2Z
064744   STA FTYPE
064746   LDA ICAX1Z
064748   AND #$0C
064750   CMP #4
064752   BEQ DOCOPENI
064754   CMP #8
064756   BEQ DOCOPENO
064758   RTS         If already open leave status at 132
064759 DOCOPENI LDA #0
064761   STA WMODE   Set read mode
064764   STA FEOF    No eof yet
064766   LDA #1      Tone for press play
064768   JSR ?BEEP
064771   BMI ?OPNRTN If err during beep
064773 MOTORON LDA #$34 Turn motor on
064775   STA PACTL
064778   LDX PALNTS
064780   LDY ?65171,X Set leader time
064783   LDA ?65169,X
064786   TAX 
064787   LDA #3
064789   STA CDTMF3
064792   JSR SETVBV  Set vblank timer
064795 ?WAITTM LDA CDTMF3
064798   BNE ?WAITTM Wait for motor to come up to speed
064800   LDA #$80    Number bytes in buffer
064802   STA BPTR
064804   STA BLIM
064807   JMP ?OPOK
064810 ?PBRK LDY #$80 Break abort
064812   DEC BRKKEY  Reset key
064814 ?OPNRTN LDA #0 Clear write mode flag
064816   STA WMODE
064819   RTS 
064820 DOCOPENO LDA #$80
064822   STA WMODE   set write mode
064825   LDA #2      Record tone
064827   JSR ?BEEP
064830   BMI ?OPNRTN Error in beep
064832   LDA #$CC    Set baud rate
064834   STA AUDF3
064837   LDA #5
064839   STA AUDF4
064842   LDA #$60
064844   STA DDEVIC
064847   JSR SENDEV  Tell pokey to write marks
064850   LDA #$34    Write 5" blank tape
064852   STA PACTL
064855   LDX PALNTS
064857   LDY ?65167,X Times for leader
064860   LDA ?65165,X
064863   TAX 
064864   LDA #3
064866   JSR SETVBV
064869   LDA #$FF
064871   STA CDTMF3
064874 ?WDLR LDA BRKKEY
064876   BEQ ?PBRK   If break during leader
064878   LDA CDTMF3
064881   BNE ?WDLR
064883   LDA #0      Init buffer pointer
064885   STA BPTR
064887 ?OPOK LDY #1
064889   RTS 
064890 GET.C LDA FEOF If eof
064892   BMI ?ISEOF  return status
064894   LDX BPTR    Buffer pointer
064896   CPX BLIM    If end of buffer
064899   BEQ CREADBLK read another block
064901   LDA CASBUF+3,X Get next byte
064904   INC BPTR    bump pointer
064906   LDY #1      status ok
064908 ?GBX RTS 
064909 CREADBLK LDA #'R
064911   JSR ?SIOSB
064914   TYA 
064915   BMI ?GBX    exit on err
064917   LDA #0      Reset pointer
064919   STA BPTR
064921   LDX #$80    Default bytes
064923   LDA CASBUF+2
064926   CMP #$FE    If header
064928   BEQ ?ATEOF  go read again
064930   CMP #$FA    If last data record
064932   BNE ?NLR
064934   LDX CASBUF+130 Last record get # bytes
064937 ?NLR STX BLIM
064940   JMP GET.C   Get next byte
064943 ?ATEOF DEC FEOF Set flag
064945 ?ISEOF LDY #136 End of file
064947   RTS 
064948 PUT.C LDX BPTR Pointer
064950   STA CASBUF+3,X store character
064953   INC BPTR    Bump index
064955   LDY #1      Status ok
064957   CPX #127    If buffer full
064959   BEQ ?WRTBF  go write it
064961   RTS 
064962 ?WRTBF LDA #$FC Record type=data
064964   JSR ?WSIOSB
064967   LDA #0      Reset pointer
064969   STA BPTR
064971   RTS 
064972 STATUS.C LDY #1
064974   RTS 
064975 CLOSE.C LDA WMODE If writing
064978   BMI ?CLWRT  go close for write
064980   LDY #1      Success
064982 ?FCAX LDA #$3C Stop motor in
064984   STA PACTL   case short irg mode
064987   RTS 
064988 ?CLWRT LDX BPTR If no data
064990   BEQ ?WTLR   no dt1 rec
064992   STX CASBUF+130 Write to
064995   LDA #$FA    last record record type
064997   JSR ?WSIOSB Write out buffer
065000   BMI ?FCAX   go if error
065002 ?WTLR LDX #127
065004   LDA #0      Clear buffer
065006 ?ZTBUF STA CASBUF+3,X
065009   DEX 
065010   BPL ?ZTBUF
065012   LDA #$FE    Write wot record
065014   JSR ?WSIOSB
065017   JMP ?FCAX   Flag closed and exit
065020 ?BEEP STA FREQ
065022 ?BEEP1 LDA RTCLOK+2
065024   CLC 
065025   LDX PALNTS
065027   ADC ?65173,X
065030   TAX 
065031 ?WFL LDA #$FF
065033   STA CONSOL  Beep on
065036   LDA #0
065038   LDY #$F0
065040 ?BWAIT DEY 
065041   BNE ?BWAIT
065043   STA CONSOL  Beep off
065046   LDY #$F0
065048 ?BWAIT2 DEY 
065049   BNE ?BWAIT2
065051   CPX RTCLOK+2 One " yet?
065053   BNE ?WFL    no
065055   DEC FREQ    Count beeps
065057   BEQ ?WFAK   til done
065059   TXA 
065060   CLC 
065061   LDX PALNTS
065063   ADC ?65175,X
065066   TAX 
065067 ?BWAIT3 CPX RTCLOK+2
065069   BNE ?BWAIT3
065071   BEQ ?BEEP1
065073 ?WFAK JSR ?WFAK1
065076   TYA         Wait for a key
065077   RTS 
065078 ?WFAK1 LDA KEYBDV+5
065081   PHA 
065082   LDA KEYBDV+4
065085   PHA 
065086   RTS 
065087 ?SIOSB STA DCOMND
065090   LDA #0
065092   STA DBYTHI
065095   LDA #131
065097   STA DBYTLO
065100   LDA # >CASBUF
065102   STA DBUFHI
065105   LDA # <CASBUF
065107   STA DBUFLO
065110   LDA #$60
065112   STA DDEVIC
065115   LDA #0
065117   STA DUNIT
065120   LDA #35
065122   STA DTIMLO
065125   LDA DCOMND
065128   LDY #$40
065130   CMP #'R
065132   BEQ ?SETSTA
065134   LDY #$80
065136 ?SETSTA STY DSTATS
065139   LDA FTYPE
065141   STA DAUX2   Indicate irg mode
065144   JSR SIOV
065147   RTS 
065148 ?WSIOSB STA CASBUF+2 Store type
065151   LDA #$55
065153   STA CASBUF
065156   STA CASBUF+1
065159   LDA #'W
065161   JSR ?SIOSB
065164   RTS 
065165 ?65165 .BYTE 4,3 NTSC/PAL
065167 ?65167 .BYTE 128,192 Values
065169 ?65169 .BYTE 2,1 for beep
065171 ?65171 .BYTE 64,224 and
065173 ?65173 .BYTE 30,25 leader
065175 ?65175 .BYTE 10,8
