10 REM > PatchVP
   20 REM 20-Dec-1998 v1.00 JGH: Initial version
   30 :
   40 IFLOMEM+&4100>HIMEM:MODE&87
   50 ONERRORREPORT:PROCCloseAll:PRINT:END
   60 PRINT"Patch View Professional for Y2K Reading"'
   70 DIM ctrl% 30,name% 30,mem% &4100:X%=ctrl%:Y%=X%DIV256
   80 PROCPatchVP:PROCPatchVPCoPro:END
   90 :
  100 DEFPROCPatchVP
  110 INPUT"Filename of ViewProfB rom image: "rom$:IFrom$="":ENDPROC
  120 OSCLI"Load "+rom$+" "+STR$~mem%
  130 IFmem%!12<>&00625057 OR mem%!16<>&00302E32:PRINT"Only works for ViewPb 2.0":ENDPROC
  140 INPUT"Filename to save rom image: "save$:IFsave$="":ENDPROC
  150 mem%?&1259=&F7:mem%?&125A=&BF
  160 mem%!&3FF7=&ADFFF120:mem%!&3FFB=&1B4C060D:mem%?&3FFF=&80
  170 mem%!&001B=&0AB038C9:mem%!&001F=&0C8D30A9:mem%!&0023=&8D32A906
  180 mem%!&0026=&60060B8D
  190 OSCLI"Save "+save$+" "+STR$~mem%+"+4000 0 FFFBBC00"
  200 ENDPROC
  210 :
  220 REM Code patched in:
  230 P%=&9258:[JSR &BFF7:]
  240 P%=&BFF7:[JSR &FFF1:LDA &060D:JMP &801B:]
  250 P%=&801B:[CMP #ASC"8":BCS P%+12:LDA #ASC"0":STA &060C:LDA #ASC"2":STA &060B:RTS:]
  260 :
  270 DEFPROCPatchVPCoPro
  280 INPUT"Filename of VP2nd6502 file: "file$:IFfile$="":ENDPROC
  290 in%=OPENUP(file$):PROCRdBytes(in%,mem%,&4000,0)
  300 IFmem%!&10<>&6C616E6F OR mem%!&14<>&302E3220:PRINT"Only works for ViewProfessional 2.0":CLOSE#in%:in%=0:ENDPROC
  310 INPUT"Filename to save ViewProfessional file: "save$:IFsave$="":CLOSE#in%:in%=0:ENDPROC
  320 out%=OPENOUT(save$):IFout%=0:PRINT"Can't open "save$:CLOSE#in%:in%=0:ENDPROC
  330 mem%!&1B=&ADFFF120:mem%!&1F=&38C9060D:mem%!&23=&30A90AB0
  340 mem%!&27=&A9060C8D:mem%!&2B=&060B8D32:mem%?&2F=&60
  350 PROCWrBytes(out%,mem%,&4000,0)
  360 PROCRdBytes(in%,mem%,&4057,&4000)
  370 mem%?&094A=&1B:mem%?&094B=&40
  380 PROCWrBytes(out%,mem%,&4057,&4000)
  390 PROCCloseAll:X%!2=&4000:A%=FNfile(save$,2):X%!6=&4000:A%=FNfile(save$,3)
  400 ENDPROC
  410 :
  420 DEFPROCCloseAll
  430 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  440 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  450 ENDPROC
  460 :
  470 DEFPROCRdBytes(in%,addr%,num%,ptr%):PTR#in%=ptr%
  480 ?X%=in%:X%!1=addr%:X%!5=num%:X%!9=ptr%:A%=4:CALL&FFD1:ENDPROC
  490 DEFPROCWrBytes(out%,addr%,num%,ptr%):PTR#out%=ptr%
  500 ?X%=out%:X%!1=addr%:X%!5=num%:X%!9=ptr%:A%=2:CALL&FFD1:ENDPROC
  510 DEFFNfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF