;Parallax Game DOS ;~~~~~~~~~~~~~~~~~ ;(c)1992 Simon Cooke ORG &4000 DUMP 1,0 DI CALL set.black LD HL,loader.pal CALL movecolours CALL copy.message CALL fadein wait.nb: IN A,(224) BIT 0,A JP NZ,wait.nb LD A,3 OUT (224),A LD B,20 DJNZ $ wait.nb2: IN A,(224) BIT 0,A JP NZ,wait.nb2 JP hero DEFM "HERE, USED TO BE SOME ENTROPY DEMOS - AND " DEFM "YOU CAN STILL GET TO THEM IF YOU POKE THE " DEFM "JUMP JUST ABOVE WITH 16607... COOKIE!" hero: LD SP,&8000 ;set.stack LD B,200 frame.w1: IN A,(&F9) BIT 3,A JR NZ,frame.w1 LD A,&7F ;symbol IN A,(&FE) RRA RRA JP C,not.pressed LD A,&F7 ;escape IN A,(&F9) BIT 5,A JP NZ,not.pressed LD A,&FF ;cntrl IN A,(&FE) RRA JP C,not.pressed LD A,&FE ;shift IN A,(&FE) RRA JP C,not.pressed LD A,&BF ;shift IN A,(&F9) RLCA JP C,not.pressed ;edit JP pressie not.pressed: DJNZ frame.w1 JP pressie demo.menu: CALL set.black LD HL,loader.pal CALL movecolours LD A,26 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 LD BC,&0101 LD DE,&A005 LD (track.reg+1),DE LD DE,10838 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI LD A,C OR A JP Z,entro1 CP 1 JP Z,entro2 JP hotbutter entro1: CALL set.black LD HL,loader.pal CALL movecolours LD A,24 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 LD BC,&0101 LD DE,&A602 LD (track.reg+1),DE LD DE,8500 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL 32768 entro2: CALL set.black LD HL,loader.pal CALL movecolours LD A,59 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 LD BC,&0103 LD DE,&AB02 LD (track.reg+1),DE LD DE,11863 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL 32768 hotbutter: CALL set.black LD HL,loader.pal CALL movecolours LD A,31 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 LD BC,&0101 LD DE,&B702 LD (track.reg+1),DE LD DE,16333 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL 32768 ;Game loader bit ;~~~~~~~~~~~~~~~ pressie: title.screen: LD HL,32768 LD BC,&0E00 LD DE,&0301 LD (track.reg+1),DE LD DE,7946 CALL decomp.loader CALL fadeout LD A,14 OUT (&FB),A LD HL,&E000 CALL movecolours LD A,110 OUT (&FC),A CALL fadein JP intro game.over: LD A,14 OUT (&FC),A CALL set.counteroff CALL set.black LD HL,32768 LD BC,&0E00 LD DE,&1E02 LD (track.reg+1),DE LD DE,5045 CALL decomp.loader LD A,14 OUT (&FB),A LD HL,&9B00 CALL movecolours CALL fadein intro: CALL set.counteroff LD HL,32768 LD BC,&0102 LD DE,&0405 LD (track.reg+1),DE LD DE,11689 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI level1: CALL set.black LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.1 LD HL,32768 ;data1.dat LD BC,&0A00 LD DE,&1F02 LD (track.reg+1),DE LD DE,5435 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.1 CALL check.dead level2: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.2 LD HL,32768 ;data2.dat LD BC,&0A00 LD DE,&2003 LD (track.reg+1),DE LD DE,5628 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.2 CALL check.dead level3: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.3 LD HL,32768 ;data3.dat LD BC,&0A00 LD DE,&2104 LD (track.reg+1),DE LD DE,5277 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.3 CALL check.dead level4: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.1 LD HL,32768 ;data4.dat LD BC,&0A00 LD DE,&2205 LD (track.reg+1),DE LD DE,5664 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.4 CALL check.dead level5: LD HL,loader.pal CALL movecolours LD A,59 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.2 LD HL,32768 ;data5.dat LD BC,&0A00 LD DE,&2401 LD (track.reg+1),DE LD DE,5016 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.5 CALL check.dead level6: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.3 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2501 LD (track.reg+1),DE LD DE,5735 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.6 CALL check.dead level7: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.1 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2602 LD (track.reg+1),DE LD DE,5872 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.7 CALL check.dead level8: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.2 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2703 LD (track.reg+1),DE LD DE,5556 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.8 CALL check.dead level9: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.3 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2804 LD (track.reg+1),DE LD DE,5417 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.1 CALL check.dead CALL guardian.2 CALL check.dead level10: LD HL,loader.pal CALL movecolours LD A,59 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.1 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2905 LD (track.reg+1),DE LD DE,5085 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.3 CALL check.dead CALL guardian.4 CALL check.dead CALL guardian.5 CALL check.dead level11: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.2 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2A05 LD (track.reg+1),DE LD DE,5766 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL guardian.6 CALL check.dead CALL guardian.7 CALL check.dead CALL guardian.8 CALL check.dead level12: LD HL,loader.pal CALL movecolours LD A,60 LD (sectors+1),A CALL load.message CALL fadein CALL game.code CALL bank.3 LD HL,32768 ;data6.dat LD BC,&0A00 LD DE,&2C01 LD (track.reg+1),DE LD DE,5418 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI CALL check.dead CALL end.of.game CALL check.dead finished.game: LD A,14 OUT (&FC),A LD BC,&10F8 black2: DEFB &ED,&71 DJNZ black2 LD HL,32768 LD BC,&0E00 LD DE,&A001 LD (track.reg+1),DE LD DE,3659 CALL decomp.loader LD A,14 OUT (&FB),A LD HL,&9B00 CALL movecolours CALL fadein wait.keyp: XOR A IN A,(&F9) CPL AND %11100000 LD E,A XOR A IN A,(&FE) CPL AND %00011111 OR E JP Z,wait.keyp JP intro game.code: LD HL,32768 LD BC,&0102 LD DE,&0D04 LD (track.reg+1),DE LD DE,8451 CALL decomp.loader RET bank.1: LD HL,40960 LD BC,&0500 LD DE,&1505 LD (track.reg+1),DE LD DE,14163 CALL decomp.loader RET bank.2: LD HL,40960 LD BC,&0500 LD DE,&1804 LD (track.reg+1),DE LD DE,13571 CALL decomp.loader RET bank.3: LD HL,40960 LD BC,&0500 LD DE,&1B03 LD (track.reg+1),DE LD DE,13947 CALL decomp.loader RET check.dead: LD A,12 OUT (&FB),A LD A,(32768+30) OR A JP NZ,not.over POP HL JP game.over not.over: XOR A LD (32768+30),A RET guardian.1: CALL set.black LD HL,loader.pal CALL movecolours LD A,52 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0103 LD DE,&2D02 LD (track.reg+1),DE LD DE,4725 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.2: CALL set.black LD HL,loader.pal CALL movecolours LD A,34 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&3705 LD (track.reg+1),DE LD DE,2758 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.3: CALL set.black LD HL,loader.pal CALL movecolours LD A,35 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&3E05 LD (track.reg+1),DE LD DE,3364 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.4: CALL set.black LD HL,loader.pal CALL movecolours LD A,35 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&4601 LD (track.reg+1),DE LD DE,4029 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.5: CALL set.black LD HL,loader.pal CALL movecolours LD A,36 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&4D02 LD (track.reg+1),DE LD DE,4268 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.6: CALL set.black LD HL,loader.pal CALL movecolours LD A,36 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&8204 LD (track.reg+1),DE LD DE,4416 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.7: CALL set.black LD HL,loader.pal CALL movecolours LD A,35 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&8A01 LD (track.reg+1),DE LD DE,4048 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET guardian.8: CALL set.black LD HL,loader.pal CALL movecolours LD A,34 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&9102 LD (track.reg+1),DE LD DE,2697 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET end.of.game: CALL set.black LD HL,loader.pal CALL movecolours LD A,38 LD (sectors+1),A CALL load.message CALL fadein LD HL,32768 ;data1.dat LD BC,&0102 LD DE,&9802 LD (track.reg+1),DE LD DE,6442 CALL decomp.loader CALL fadeout LD A,1 OUT (&FB),A CALL &8000 DI RET ;*** *** *** *** *** *** *** *** fadeout: LD HL,palette LD DE,temppalette LD BC,16 LDIR LD B,8 fadeout1: LD C,16 LD HL,temppalette fadeout2: LD A,(HL) CALL dropdown LD (HL),A INC HL DEC C JP NZ,fadeout2 EXX LD B,5 fadeoutfly: IN A,(&F9) BIT 3,A JP NZ,fadeoutfly DJNZ fadeoutfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DJNZ fadeout1 RET fadein: LD B,9 LD D,8 fadein1: LD C,16 LD HL,palette EXX LD HL,temppalette EXX fadein2: PUSH DE LD A,(HL) INC D DEC D JP Z,nofadein fadein3: PUSH DE CALL dropdown POP DE DEC D JP NZ,fadein3 nofadein: INC HL EXX LD (HL),A INC HL EXX POP DE DEC C JP NZ,fadein2 EXX LD B,5 fadeinfly: IN A,(&F9) BIT 3,A JP NZ,fadeinfly DJNZ fadeinfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DEC D DJNZ fadein1 RET dropdown: OR A RET Z XOR 8 BIT 3,A RET Z dropblue: LD D,A AND 17 JP NZ,nextdown1 LD A,D JP dropred nextdown1: AND 1 JP Z,drophighblue LD A,D AND 126 JP dropred drophighblue: LD A,D AND 111 OR 1 dropred: LD D,A AND 34 JP NZ,nextdown2 LD A,D JP dropgreen nextdown2: AND 2 JP Z,drophighred LD A,D AND 125 JP dropgreen drophighred: LD A,D AND 127-32 OR 2 dropgreen: LD D,A AND 68 JP NZ,nextdown3 LD A,D RET nextdown3: AND 4 JP Z,drophighgreen LD A,D AND 123 RET drophighgreen: LD A,D AND 63 OR 4 RET movecolours: LD DE,palette LD BC,16 LDIR RET palette: DEFS 16 temppalette: DEFS 16 ;*** *** *** *** *** *** *** *** ;Decompression loading routine ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ decomp.loader: DI PUSH BC PUSH DE LD E,28 XOR A LD BC,511 sound.clear: OUT (C),E DEC B OUT (C),A INC B DEC E JP NZ,sound.clear OUT (C),E DEC B OUT (C),A INC B POP DE wait.nb3: IN A,(224) BIT 0,A JP NZ,wait.nb3 LD A,3 OUT (224),A LD B,20 DJNZ $ wait.nb4: IN A,(224) BIT 0,A JP NZ,wait.nb4 POP BC IN A,(&FB) PUSH AF PUSH HL LD HL,0 LD (bufferd.len+1),HL LD HL,buffer LD (bufferd.addr+1),HL POP HL XOR A LD (drun+1),A LD (dunr+1),A LD (dloop+1),A LD (dlpc+1),A LD A,B OUT (&FB),A decomp.loop: LD A,D OR E OR C JR NZ,dunr POP AF OUT (&FB),A RET dunr: LD A,0 OR A JR Z,drun DEC A LD (dunr+1),A CALL get.compactd LD (HL),A CALL inc.hl JR decomp.loop drun: LD A,0 OR A JR Z,new.run LD (dloop+1),A XOR A LD (drun+1),A CALL get.compactd LD (dlpc+1),A dloop: LD A,0 dlpc: LD (HL),0 CALL inc.hl DEC A JR NZ,dlpc JR decomp.loop new.run: CALL get.compactd BIT 7,A JR NZ,hi.run INC A LD (dunr+1),A JR decomp.loop hi.run: AND 127 INC A LD (drun+1),A JR decomp.loop inc.hl: PUSH AF INC HL LD A,H CP &C0 JR C,hl.overf LD H,&80 INC B LD A,B AND 31 LD B,A OUT (&FB),A hl.overf: POP AF RET dec.de: DEC DE BIT 7,D JR Z,de.overf LD D,&3F DEC C de.overf: RET get.compactd: CALL dec.de PUSH HL PUSH BC bufferd.addr: LD HL,buffer bufferd.len: LD BC,0 LD A,B OR C JR NZ,dbuff CALL grab.buffer LD HL,buffer LD (bufferd.addr+1),HL LD BC,1024 LD (bufferd.len+1),BC dbuff: DEC BC LD (bufferd.len+1),BC LD A,(HL) INC HL LD (bufferd.addr+1),HL POP BC POP HL RET ;Replace this with a disc reader routine for E-DOS grab.buffer: PUSH HL PUSH DE PUSH AF PUSH BC enable.count: LD A,0 OR A JP Z,track.reg IN A,(&FB) PUSH AF LD A,12 OUT (&FB),A sectors: LD E,&00 LD A,E DEC A LD (sectors+1),A LD HL,counter.text CALL conv.ascii LD HL,counter.text LD DE,&8B7C LD (char.addr+1),DE CALL put.text.line POP AF OUT (&FB),A track.reg: LD DE,&0000 LD A,E OUT (226),A LD B,5 error.loop: CALL get.track ;includes rewriting of this ;routine to read the right ;disc side... IN A,(225) PUSH AF PUSH BC LD HL,buffer LD B,20 LD A,&80 OUT (225),A port2: LD C,&E3 LD A,128 port1: OUT (224),A DJNZ $ JR read.data read.dat: INI read.data: IN A,(224) BIT 1,A JR NZ,read.dat BIT 0,A JR NZ,read.data AND %00011100 JR Z,okay.read POP BC POP AF OUT (225),A BIT 1,A JR Z,okay.dokey LD A,3 OUT (224),A PUSH BC LD B,20 DJNZ $ POP BC okay.dokey: DJNZ error.loop JP disc.read.err okay.read: LD DE,(track.reg+1) POP BC POP AF OUT (225),A INC E LD A,E CP 6 JR NZ,not.overff LD E,1 INC D LD A,D CP 4 JR NZ,not.overf INC E JR not.overff not.overf: CP 82 JR NZ,not.overff LD D,128 not.overff: LD (track.reg+1),DE POP BC POP AF POP DE POP HL RET buffer: DEFS 1024 get.track: PUSH DE BIT 7,D JR Z,side.1 LD A,&E7 LD (port2+1),A LD A,&E4 LD (port1+1),A LD (read.data+1),A JR reset.bit side.1: LD A,&E3 LD (port2+1),A LD A,&E0 LD (port1+1),A LD (read.data+1),A reset.bit: RES 7,D gettr2: IN A,(224) BIT 0,A JP NZ,gettr2 tr: IN A,(225) CP D JP Z,exit.track LD A,%01111011 JP NC,stepout LD A,%01011011 stepout: OUT (224),A LD B,20 DJNZ $ JP gettr2 exit.track: POP DE RET disc.read.err: LD A,14+96 OUT (&FC),A LD HL,&8000 LD DE,&8001 LD BC,&5FFF LD (HL),L LDIR LD E,34 err.looper: LD B,50 frame.loop: IN A,(&F9) BIT 3,A JR NZ,frame.loop DJNZ frame.loop LD A,E XOR 32 LD BC,&00F8 OUT (C),A LD E,A JP err.looper ;*************DOS MESSAGE SYSTEM******************* font: MDAT "dos.fnt" mark.lines: IN A,(&FB) PUSH AF LD A,13 OUT (&FB),A LD HL,&8000 LD DE,&8001 LD BC,&5FFF LD (HL),L LDIR LD HL,&AB40 LD DE,&AB41 LD BC,32 LD (HL),%00010000 LDIR LD BC,32 LD (HL),%01000111 LDIR LD BC,32 LD (HL),%01000110 LDIR LD BC,32 LD (HL),%01000101 LDIR LD BC,32 LD (HL),%01000100 LDIR LD BC,32 LD (HL),%01000011 LDIR LD BC,32 LD (HL),%01000010 LDIR LD BC,32 LD (HL),%01000001 LDIR LD BC,32 LD (HL),%01000111 LDIR LD BC,31 LD (HL),%00010000 LDIR POP AF OUT (&FB),A RET loader.pal: DEFB 0,0,34,0,0,0,0,0,0,112,120,127,127,120 DEFB 112,0 load.message: LD A,13+32 OUT (&FC),A CALL mark.lines LD HL,load.text.1 LD DE,&8B60 LD (char.addr+1),DE CALL put.text.line CALL set.counter.on IN A,(&FB) PUSH AF LD A,12 OUT (&FB),A LD A,(sectors+1) LD E,A LD HL,counter.text CALL conv.ascii LD HL,counter.text LD DE,&8B7C LD (char.addr+1),DE CALL put.text.line POP AF OUT (&FB),A RET copy.message: LD A,13+32 OUT (&FC),A CALL mark.lines LD HL,load.text.2 LD DE,&8B60 LD (char.addr+1),DE CALL put.text.line RET ; -------------------------------- load.text.1: DEFM " LOADING AND DECOMPACTING - 000 " DEFB 255 load.text.2: DEFM " PARALLAX 1992 FRED PUBLISHING " DEFB 255 counter.text: DEFM "000" DEFB 255 put.text.line: LD A,(HL) INC HL CP 255 RET Z PUSH HL CALL text LD A,(char.addr+1) INC A LD (char.addr+1),A POP HL JR put.text.line text: PUSH BC PUSH DE LD L,A LD H,0 IN A,(&FB) PUSH AF LD A,13 OUT (&FB),A ADD HL,HL ADD HL,HL ADD HL,HL LD DE,font-256 ADD HL,DE char.addr: LD DE,&0000 EX DE,HL LD BC,32 LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) INC DE LD (HL),A ADD HL,BC LD A,(DE) LD (HL),A POP AF OUT (&FB),A POP DE POP BC RET set.counter.on: LD A,1 LD (enable.count+1),A RET set.counteroff: XOR A LD (enable.count+1),A RET set.black: PUSH BC LD BC,&10F8 black1: DEFB &ED,&71 DJNZ black1 POP BC RET conv.ascii: hundreds: LD (HL),"0" LD A,E CP 100 JR C,tens CP 200 JR C,onehun SUB 200 LD E,A LD (HL),"2" JR tens onehun: LD (HL),"1" SUB 100 LD E,A tens: INC HL LD (HL),"0" LD A,E CP 10 JR C,units CP 20 JR C,t1 CP 30 JR C,t2 CP 40 JR C,t3 CP 50 JR C,t4 CP 60 JR C,t5 CP 70 JR C,t6 CP 80 JR C,t7 CP 90 JR C,t8 SUB 90 LD E,A LD (HL),"9" JR units t1: SUB 10 LD E,A LD (HL),"1" JR units t2: SUB 20 LD E,A LD (HL),"2" JR units t3: SUB 30 LD E,A LD (HL),"3" JR units t4: SUB 40 LD E,A LD (HL),"4" JR units t5: SUB 50 LD E,A LD (HL),"5" JR units t6: SUB 60 LD E,A LD (HL),"6" JR units t7: SUB 70 LD E,A LD (HL),"7" JR units t8: SUB 80 LD E,A LD (HL),"8" units: INC HL LD A,E ADD A,48 LD (HL),A RET