10 REM > PrintTo/s
   20 REM Connect user printer to file
   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%