10
20
30 :
40 DIM mcode% &100
50 load%=&FFFF0A4B
60 :
70 OSFIND=&FFCE:OSBPUT=&FFD4:OSARGS=&FFDA
80 OSWRCH=&FFEE:OSBYTE=&FFF4
90 UPTV=&0222
100 lptr=&A8
110 :
120 FOR P=0 TO 1
130 P%=load%:O%=mcode%
140 [OPT P*3+4
150 .errCantOpen
160 BRK:EQUB 192:EQUS "Can't open file":BRK
170 :
180 .go%
190 LDA UPTV+0:CMP newUPTV+0:BNE Checked
200 LDA UPTV+1:CMP newUPTV+1
210 .Checked
220 PHP :\ Save EQ/NE if UPTV claimed
230 LDX #lptr:LDY #0:LDA #1:JSR OSARGS
240 LDA (lptr),Y:CMP #13:BNE PrintOn :\ *PrintTo <filename>
250 PLP:BNE exit :\ Not claimed
260 \
270 \ Should I do a VDU 3?
280 \ No, because this is selecting a printer, not enabling printout
290 \
300 JSR Close :\ Close file if open
310 LDA #5:LDX oldfx5:JSR OSBYTE :\ Switch to old printer
320 PHP:SEI :\ Disable IRQs
330 LDA oldUPTV+0:STA UPTV+0 :\ Release UPTV
340 LDA oldUPTV+1:STA UPTV+1
350 PLP :\ Restore IRQs
360 .exit
370 RTS
380 :
390 .Close
400 LDY handle:BEQ exit :\ File not open
410 LDA #0:JMP OSFIND :\ Close it
420 :
430 .PrintOn
440 PLP:PHP:BNE OpenFile :\ Not claimed, file not open
450 JSR Close :\ Close file if open
460 .OpenFile
470 LDX lptr+0:LDY lptr+1 :\ XY=>filename
480 LDA #&80:JSR OSFIND :\ Try to open it
490 TAY:BEQ errCantOpen
500 STA handle
510 PLP:BEQ AlreadyClaimed
520 PHP:SEI
530 LDA UPTV+0:STA oldUPTV+0 :\ Claim UPTV
540 LDA UPTV+1:STA oldUPTV+1
550 LDA newUPTV+0:STA UPTV+0
560 LDA newUPTV+1:STA UPTV+1
570 PLP
580 .AlreadyClaimed
590 LDA #5:TAX:JSR OSBYTE :\ Select printer
600 STX oldfx5 :\ Save old printer
610 RTS
620 :
630 \ RESIDENT CODE
640 \ =============
650 \ Print to user printer
660 \ A=action, X=buffer, Y=printer
670 .MyPrinter
680 CPY #5:BNE NotMyPrinter :\ Respond to printer 5
690 CMP #1:BNE NotMyAction :\ Not 'character being printed'
700 LDA #145:JSR OSBYTE :\ Get character from buffer
710 TYA:LDY handle:JSR OSBPUT :\ Write it
720 SEC :\ Printer dormant
730 .NotMyAction
740 RTS
750 .NotMyPrinter
760 JMP (oldUPTV)
770 :
780 .newUPTV:EQUW MyPrinter
790 .oldUPTV:EQUW 0
800 .handle :EQUB 0
810 .oldfx5 :EQUB 0
820 :
830 ]:O%=O%-4:NEXT
840 IF (P%AND&FFFF)>&B00:PRINT"Code overrun":END
850 PRINT "*SAVE PrintTo ";~mcode%;" ";~O%;" ";~go%OR&FFFF0000;" ";~load%