ô WRITTEN 16 JULY 84 ë7:?&FE62=15:?&FE60=15 title$="UVIPROM 1.0" (1author$="(C) 1984 Solidisk, written by T Lee" 2!ô **** DEFINE VARIABLES ***** <(pam=&80:s_n=&B0:s_h=&BA:ex_vec=&0D9F F"break_vec=&0202:basicont=&B1F4 P-tmp=&0C00:holdit=tmp+16:byte_count=tmp+18 Zf_name=tmp+32 d?opb=&FE60:drb=&FE62:pcr=&FE6C:acr=&FE6B:ifr=&FE6D:ier=&FE6E nHwr=&FFE3:vdu=&FFEE:red=129:green=130:yellow=131:blue=132:magenta=133 xAA$="":P%=&C000:I%=0:N%=¤BYT(0):N%=¤WORD(0):N%=¤STRING("AA") ‚ òassemble Œ Ö !-4 –à   ݤBYT(A%) ª ?P%=A% ´ P%=P%+1 ¾=I% ÈݤWORD(A%) Ò?P%=A% ƒ 256:P%?1=A% 256 Ü P%=P%+2 æ=I% ðݤSTRING(A$) ú$P%=A$:P%=P%+©A$+1 =I% #ô**** ROM header program ****** :LDA#&40:JSR&FFCE:BNEbcont "Ýòassemble ,V%=2:ô No listing 6ãI%=0¸V%ˆV%:P%=&8000:[OPTI% @BRK:BRK:BRK JJMPservice T3OPT ¤BYT(&82):OPT ¤BYT(copy -&8001):OPT ¤BYT(1) ^".rom_title OPT ¤STRING(title$) hOPT ¤WORD(13) r.copy OPT ¤STRING(author$) |OPT ¤BYT(0) †H.msg5 OPT ¤STRING("Press if Vcc switch is off."):OPT ¤BYT(0) =.savemsg OPT ¤STRING("SA. 2000 +4000 D9CD 8000") š<.save8k OPT ¤STRING("SA. 2000 +2000 D9CD 8000") ¤?.loadmsg OPT ¤STRING("LO. 2000"):OPT ¤BYT(13) ®.header OPT ¤BYT(yellow) ¸2OPT ¤STRING("ADDRESS BLOWN AS SHOULD BE ")  .wrenable ÌRTS Ö .service à8PHP:PHA:TYA:PHA:TXA:PHA:TSX:LDA&103,X:CMP#9:BEQhelp ê CMP#3:BEQautoboot:JMPcommand ô .autoboot þ JSRboot  .help JSRhelp_instr LDY#9:LDX#&80:JSRprint_it &.end 0PLA:TAX:PLA:TAY:PLA:PLP:RTS :.line_print DPLA:STAs_n:PLA:STAs_n+1 N.lp1 LDY#1 XALDA(s_n),Y:CMP#&EA:BEQlp3:JSRwr:INCs_n:BNElp1:INCs_n+1:BNElp1 b.lp3 lLDAs_n+1:PHA:LDAs_n:PHA:RTS v .print_it €STYs_n:STXs_n+1:LDY#0 Š%LDA(s_n),Y:BEQprint_done:JSR&FFE3 ”,INY:BNEprint_it+6:INCs_n+1:BNEprint_it+6 ž.print_done RTS ¨ .command ²CMP#4:BNEend ¼ CLC:JSR&FFC2:LDA#0 ÆO.first PHA:TAX:LDAlist,X:CMP#&2E:BEQnolist:LDA(&F2),Y:CMPlist,X:BEQnextone Ð'PLA:CLC:ADC#08:BNEfirst:BEQnolist+1 Ú.nolist PLA:JMPend äF.nextone INY:INX:LDA(&F2),Y:€#&5F:BEQendword:CMPlist,X:BEQnextone î)CMP#&0E:BEQgoodword:CMP#&0D:BNEnolist ø<.endword LDAlist,X:CMP#&2E:BEQgoodword:CMP#&0D:BNEnolist 7.goodword STYholdit:LDX#0:PLA:LSR A:LSR A:LSR A:TAY  2 .getadd BEQ nowjump:INX:INX:INX:DEY:BNEgetadd  .nowjump JSRwrenable  QLDAjmptable+1,X:STAbyte_count:LDAjmptable+2,X:STAbyte_count+1:JMP(byte_count) *'\******** SERVICE PROGRAM ********* 4 .jmptable > JMPview H JMPtest R JMPblow \JMPcompare fJMPread_to_disk p .list zOPT ¤STRING("VIEW...") „OPT ¤STRING("TEST...") ŽOPT ¤STRING("BLOW...") ˜OPT ¤STRING("COMP...") ¢OPT ¤STRING("READ...") ¬OPT ¤BYT(0) ¶OPT ¤BYT(13) À!\ **** End of data area ***** Ê.help_instr Ô!LDA(&F2),Y:CMP#13:BEQhelp_msg Þ..h_space LDA(&F2),Y:INY:CMP#&20:BEQh_space è CMP#13:BEQhelp_msg:DEY:LDX#0 ò..h_title LDA(&F2),Y:CMP#&0D:BEQinstruction üCMP#&2E:BEQinstruction "‚rom_title,X:€#&5F:BNEhelp_msg INY:INX:BNEh_title  .help_msg $RTS ..instruction 87LDY#help_text ƒ 256:LDX#help_text 256:JSRprint_it B-LDY#list ƒ 256:LDX#list 256:JSRprint_it L JSR&FFE7 VUJSRline_print:OPT ¤STRING("Refer to user manual for operating instructions."):NOP ` JSR&FFE7 j-LDY#copy ƒ 256:LDX#copy 256:JSRprint_it tPLA:PLA:JMPexit ~ .name ˆLDX#0:LDYholdit ’$LDA(&F2),Y:CMP#&2E:BNEnspace:INY œ-.nspace LDA(&F2),Y:INY:CMP#&20:BEQnspace ¦^.neachlet CMP#&0D:BEQendname:CMP#&20:BEQendname:STAf_name,X:LDA(&F2),Y:INY:INX:BNEneachlet °-.endname LDA#&0D:STAf_name,X:STAf_name+12 ºRTS Ä .exit É JSR&FFE7 Î%PLA:TAX:PLA:TAY:PLA:PLP:LDA#0:RTS ØBRK â .boot ì1LDAtmp:CMP#&52:BEQ P%+5:JMP cb2low:JMPcb2high  .reset  LDY#0:STYdrb  JSRmsg5v LDA#&10:STAier (4LDApcr:„A#&F0:STApcr:LDAdrb:LDAopb:LDAier:LDAifr 2 .res1 < JSRpulse FLDAifr:€#&10:BEQres1:RTS P .cb2low ZLDApcr:€#&DF:STApcr:RTS d .pulse n JSRcb2low x .cb2high ‚LDApcr:„A#&E0:STApcr:RTS Œ"\****** Main routine ********* –\   .screen ªLDA#22:JSRvdu:LDA#7:JSRvdu ´ZLDA#yellow:JSRvdu:JSRline_print:OPT ¤STRING(" to slow, to stop"):NOP ¾ .scr2 ÈILDA#28:JSRvdu:LDA#0:JSRvdu:LDA#&14:JSRvdu:LDA#&25:JSRvdu:LDA#4:JMPvdu Ò .scr1 ÜLDA#22:JSRvdu:LDA#7:JSRvdu æ^LDA#yellow:JSRvdu:JSRline_print:OPT ¤STRING(" key to continue. to stop."):NOP ðJSRscr2:LDA#14:JSRvdu ú!LDA#&20:STAs_h+1:LDY#0:STYs_h RTS  .msg5v -LDY#msg5 ƒ 256:LDX#msg5 256:JMPprint_it " .view , JSRscr1 6<.v1 LDA#15:LDX#1:JSR&FFF4:LDA#&7A:JSR&FFF4:CPX#112:BEQv2 @:JSRmemory:LDA#8:CLC:ADCs_h:STAs_h:BCCv1:INCs_h+1:BNEv1 J.v2 JMPexit T .test ^ JSRreset h LDA#0:STAs_h+1:STAs_h:STAdrb r .l_vfy | JSRcb2low †bLDAopb:PHA:JSRcb2high:PLA:CMP#&FF:BNEfault:INCs_h:BNE P%+4:INCs_h+1:LDAs_h+1:CMP#&40:BNEl_vfy ‹0JSRline_print:OPT ¤STRING("OK"):NOP:JMP exit  .fault šUJSRline_print:OPT ¤BYT(7):OPT ¤STRING("Eprom fails blank test at"):NOP:JSRprintsh ® JMPexit ¸ .compare ÂJSRbfile:JSR reset ÇDECpam:BNE P%+4:DECpam+1 Ì;LDA#&60:STApam+3:LDA#&20:STAs_h+1:LDA#0:STApam+2:STAs_h Ö JSRscreen à.c1 êG LDAs_h:€#7:STAtmp+27:BNEc_byte:LDA#yellow:JSRvdu:LDY#0:JSRprintsh1 ô .c_byte þHJSRcb2low:LDAopb:PHA:JSRcb2high:PLA:PHA:LDY#0:CMP(s_h),Y:BEQpr_green PLDY#2:PLA:PHA:STA(pam+2),Y:DEY:LDAs_h+1:STA(pam+2),Y:DEY:LDAs_h:STA(pam+2),Y ULDA#3:CLC:ADCpam+2:STApam+2:BCC P%+4:INCpam+3:LDApam+3:CMP#&7C:BCC P%+5:PLA:BCSc4 KLDA#red:BNEpr_cont:.pr_green LDA#green:.pr_cont JSRvdu:PLA:JSRprint2hex &LDAtmp+27:CMP#7:BNEc3 0.c2 :QLDAs_h:€#&F8:STAs_h:JSRm1g:LDAs_h:„A#7:STAs_h:LDA&FF:BPLc3:€#&7F:STA&FF:JMPc4 D.c3 NnINCs_h:BNE P%+4:INCs_h+1:LDApam:BNE P%+4:DECpam+1:DECpam:LDApam+1:BNEc_return:LDApam:BNEc4:.c_return JMPc1 X.c4 b)LDApam+2:BNEc5:LDApam+3:CMP#&60:BNEc5 lcJSRline_print:OPT ¤BYT(7):OPT ¤STRING(" Verification completed. No error"):NOP:JSR&FFE7:JMPexit v.c5 € JSRscr1 Š1LDY#31:.c5b LDAheader,Y:STA&7FC1,Y:DEY:BPLc5b ”!LDA#&60:STApam+1:LDY#0:STYpam ž.c6 ¨LDA&FF:BMI c7 ²bJSR&FFE7:LDA#magenta:LDX#2:JSRspce:LDY#0:LDA(pam),Y:STAs_h:INY:LDA(pam),Y:STAs_h+1:JSRprintsh1 ¼kLDX#6:LDA#red:JSRspce:INY:LDA(pam),Y:JSRprint2hex:LDX#6:LDA#green:JSRspce:LDY#0:LDA(s_h),Y:JSRprint2hex ÆaLDA#3:CLC:ADCpam:STApam:LDA#0:ADCpam+1:STApam+1:LDApam+1:CMPpam+3:BCCc6:LDApam:CMPpam+2:BCCc6 Ð.c7 ÚLDA#&0D:JSRwr:LDA#&0A:JSRwr ä JMPexit î .spce ø*JSRvdu:LDA#&20:JSRwr:DEX:BPLspce+3:RTS  .memory  LDA#magenta:JSRvdu -LDAs_h+1:JSRprint2hex:LDAs_h:JSRprint2hex  .m1 *2LDY#0:LDA(s_h),Y:JSRprintsp2:INY:CPY#8:BNEm1+2 4.m1g >LDA#green:JSRvdu:LDY#0 H.m2 RWLDA(s_h),Y:CMP#126:BCC P%+4:LDA#&2E:CMP#&20:BCS P%+4:LDA#&2E:JSRvdu:INY:CPY#8:BNEm2 \RTS f .printsh1 p!LDAs_h+1:SEC:SBC#&20:JMP P%+5 z .printsh „-LDAs_h+1:JSRprint2hex:LDAs_h:JMPprint2hex Ž .printsp2 ˜PHA:LDA#green:JSRvdu:PLA ¢.print2hex ¬PHA:LSR A:LSR A:LSR A:LSR A ¶JSRprint1hex À PLA:€#&0F Ê.print1hex Ô(CMP#10:BCC P%+4:ADC#6:ADC#&30:JMPvdu Þ .bfile èiJSRname:DEX:CPX#11:BCC P%+4:LDX#10:STXtmp:LDX#f_name ƒ 256:LDY#f_name 256:LDA#&40:JSR&FFCE:BNEbcont òYJSRline_print:OPT ¤STRING("File not found"):NOP:LDA#7:JSRvdu:JSR&FFE7:PLA:PLA:JMPexit ü .bcont 1LDX#pam:TAY:LDA#2:JSR&FFDA:LDA#0:TAY:JSR&FFCE DLDY#0:.bl0 LDAloadmsg,Y:STAf_name+12,Y:CMP#&0D:BEQbl1:INY:BNEbl0 l.bl1 LDXtmp:LDAf_name,X:STAf_name+16,X:DEX:BPLbl1+3:LDX#(f_name+12) ƒ 256:LDY#(f_name+12) 256:JSR&FFF7 $RTS . .blow 8 JSRbfile :EJSRline_print:OPT ¤STRING("File length= &"):]:P%=P%-1:[OPT I%:NOP ;1LDA pam+1:JSR print2hex:LDA pam:JSR print2hex "):NOP:NOP V8.blstart JSR get1key:CMP#&0D:BNEblstart:LDA#7:JSRvdu `&LDAacr:€#&DF:STAacr:LDA#&20:STAier jLDA#&FF:STAdrb t!LDA#&20:STAs_h+1:LDY#0:STYs_h ~ JSRscreen ˆ.bl2 ’ LDY#0 œ8LDA(s_h),Y:STAopb:CMP#&FF:BNEblowit:JSRpulse:JMPbl2a ¦ .blowit °WJSRcb2low:LDA#&50:STA&FE68:LDA#&C0:STA&FE69:.wait2 LDAifr:€#&20:BEQwait2:JSRcb2high º .bl2a Ä LDAs_h:€#7:BNEbl2b:JSRmemory Î&LDA&FF:BPLbl2b:€#&7F:STA&FF:JMPbl3 Ø .bl2b âSINCs_h:BNE P%+4:INCs_h+1:LDApam:BNE P%+4:DECpam+1:DECpam:BNEbl2:LDApam+1:BNEbl2 ì.bl3 öLDA#&7C:STAtmp:JSR&FFF4 FJSRline_print:OPT ¤BYT(red):OPT ¤STRING("Programming terminated.") NOP:JSR&FFE7:JSRline_print XOPT ¤BYT(yellow):OPT ¤STRING("Switch off Vpp then press ."):OPT ¤WORD(&0A0D) NOP (LDA#7:JSRvdu 2(JSR get1key:CMP#&0D:BNE P%-5:STA tmp < JMPexit F.read_to_disk P) LDA#&20:STAs_h+1:LDY#0:STYs_h:STYdrb Z JSRreset d.ld1 nJSRcb2low:LDY#0 xR LDAopb:STA(s_h),Y:JSRcb2high:INCs_h:BNE P%+4:INCs_h+1:LDAs_h+1:CMP#&60:BNEld1 ‚&JSRname:DEX:CPX#11:BCC P%+4:LDX#10 ŒLDA&2009:CMP&4009:BNEld2 – .ld8k  ALDY#0:LDAsave8k,Y:STAf_name+12,Y:CMP#&0D:BEQld3:INY:BNEld8k+2 ªF.ld2 LDY#0:LDAsavemsg,Y:STAf_name+12,Y:CMP#&0D:BEQld3:INY:BNEld2+2 ´h.ld3 LDAf_name,X:STAf_name+16,X:DEX:BPLld3:.ld4 LDX#(f_name+12) ƒ 256:LDY#(f_name+12) 256:JSR&FFF7 ¾ JMPexit Ã..get1key LDA#&15:LDX#0:JSR &FFF4:JMP &FFE0 Èo.help_text:OPT ¤STRING("Switch off Vcc (5V) before inserting or removing EPROMs (no LED is brightly lit).") ÒKOPT ¤STRING("Always press the key after power on the UVIPROM.") ÜEOPT ¤STRING("The following commands are available"):OPT ¤BYT(&2E) æOPT ¤WORD(13):]í:á ÿ