09       .OPT NO LIST
10 ;  SAVE #D1:PRINTER.M65
20 ;
30 ;
40 ;  LOAD #D1:ROMTEST.M65
50 ;
60 ; labels localized 14 Oct 94
66 ;
70 ;  *= $FE99
80       .PAGE "Printer Handler"
81        LIST  
90       .LOCAL 
065177 PIN LDA #30   Printer init
065179   STA PTIMOT  Set time for
065182   RTS         status call
065183 ?ADRSTT .WORD DVSTAT
065185 ?ADRPRT .WORD PRNBUF
065187 STATUS.P LDA #4 Buffer len and
065189   STA PBUFSZ  adr for status
065192   LDX ?ADRSTT ; (ldx #<dvstat)
065195   LDY ?ADRSTT+1 ;(ldy #>dvstat)
065198   LDA #'S
065200   STA DCOMND  In DAux1 causes
065203   STA DAUX1   sideways (at820)
065206   JSR ?SETDCB
065209   JSR SIOV    Execute status
065212   BMI NOFUNC.P Exit if bad
065214   JSR ?SETTIM else set timeout
065217 NOFUNC.P RTS 
065218 OPEN.P JSR STATUS.P Open Prtr
065221   LDA #0      Check status and
065223   STA PBPNT   reset buffer ptr
065226   RTS 
065227 PUT.P PHA     Put Byte: Save
065228   LDA ICDNO,X on stack and
065231   STA ICDNOZ  set device num
065233   JSR ?BUFLEN Do buffer length
065236   LDX PBPNT   Set index
065239   PLA         Recover byte
065240   STA PRNBUF,X Add to buffer
065243   INX         Bump index and,
065244   CPX PBUFSZ  if at maximum,
065247   BEQ ?PRTBUF print it out.
065249   STX PBPNT   Else save index
065252   CMP #155    Was byte a CR?
065254   BEQ ?GOTCR  If so pad buffer
065256   LDY #1      Else just return
065258   RTS         for next byte.                ---  Exit, line incomplete
065259 ?GOTCR LDA #32 Pad with spaces
065261 ?PADLOOP STA PRNBUF,X Pad out
065264   INX         printer buffer
065265   CPX PBUFSZ  with character
065268   BNE ?PADLOOP in accumulator.
065270 ?PRTBUF LDA #0 Reset index for
065272   STA PBPNT   next call.
065275   LDX ?ADRPRT ; (ldx #<prnbuf)
065278   LDY ?ADRPRT+1 ;(ldy #>prnbuf)
065281   JSR ?SETDCB Reset DCB, prt
065284   JMP SIOV    line and exit
065287 CLOSE.P JSR ?BUFLEN Close P:              --------  If buffer is not
065290   LDA #155    empty, pad with
065292   LDX PBPNT   CR's, then print
065295   BNE ?PADLOOP and exit via Sio
065297   LDY #1      Else just exit
065299   RTS 
065300 ?SETDCB STX DBUFLO Set up DCB
065303   STY DBUFHI  Buffer address
065306   LDA #$40    Sio device = P1:
065308   STA DDEVIC  (if P2: then $4F)
065311   LDA ICDNOZ  Cio device as
065313   STA DUNIT   set by caller.
065316   LDA #$80    Flag Sio output
065318   LDX DCOMND
065321   CPX #'S     except on Status
065323   BNE ?SETDIR
065325   LDA #$40    which is input.
065327 ?SETDIR STA DSTATS
065330   LDA PBUFSZ  Finish up DCB
065333   STA DBYTLO
065336   LDA #0
065338   STA DBYTHI
065341   LDA PTIMOT
065344   STA DTIMLO
065347   RTS 
065348 ?SETTIM LDA DVSTAT+2 Get time-
065351   STA PTIMOT  out from Status
065354   RTS 
065355 ?BUFLEN LDY #'W Command in Y
065357   LDA ICAX2Z  Check Icax2
065359 ?NORM? CMP #'N Normal width?
065361   BNE ?WIDE?
065363   LDX #40     Yes, line len 40
065365   BNE ?SETLEN Go always
065367 ?WIDE? CMP #'D Double width?
065369   BNE ?SIDE?
065371   LDX #20     Yes, line len 20
065373   BNE ?SETLEN
065375 ?SIDE? CMP #'S at820 sideways?
065377   BNE ?DEFLT
065379   LDX #29     Yes, line len 29
065381 ?SETLEN STX PBUFSZ
065384   STY DCOMND
065387   STA DAUX1   Icax2->Daux1
065390   RTS 
065391 ?DEFLT LDA #'N Make it normal
065393   BNE ?NORM?  Go always
