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)›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)›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›