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¢