;----------------------------------------------------------------------- ; ; Orton ZX79 computer software ; ; (c) K Orton 2019 ; ; Inspired by NIBL BASIC ; ;----------------------------------------------------------------------- ; ROM paging: ; ; Page Z80 address ROM address ; start end start end ; 0 0000 01FF 0000 01FF ; 1 0800 09FF 0200 03FF ; 2 1000 11FF 0400 05FF ; 3 1800 19FF 0600 07FF ; 4 2000 21FF 0800 09FF ; 5 2800 29FF 0A00 0BFF ; 6 3000 31FF 0C00 0DFF ; 7 3800 39FF 0E00 0FFF ; ; A utility rommap.exe performs this mapping on Intel hex file ; Z80 code confined to ranges in 'Z80 address' columns ; On-board RAM usage: ; ; Start End Size Use ; ; 0000 03D7 984 System memory #1 ; 03D8 0474 157 Video generation code ; 0475 04FF 139 System memory #2 ; 0500 07FF 768 Screen memory (24*32) ; AFIXS .EQU 83D8H-3AH ; Address fix: code in system memory AFIXV .EQU 0C3D8H-3AH ; Address fix: code in video RAM ; BASIC line structure ; ; Byte Use ; 0 low / Line number ; 1 high / ; 2 size=n ; 3 / Line text ; .. / ; n-2 / ; n-1 EOLCHR ; ; End of program indicated by two bytes of 0FFH ; BASIC environment ; ; IX points to program text ; IY points to evaluation stack ; 26 variables at top of System memory #1 ; These occupy 32 words with 6 word 'holes' VARS .EQU 8398H ; ABC-DE-FGHIJKL-MNO-PQR-STUVWXY-Z SPSAVE .EQU VARS+6 SCNCOD .EQU VARS+12 PRVCOD .EQU VARS+13 CHRPOS .EQU VARS+28 SHIFT .EQU VARS+29 TEMP .EQU VARS+36 LINENO .EQU VARS+44 HOLE6 .EQU VARS+60 ; Constants PROGST .EQU 8000H ; Program memory start PROGMX .EQU VARS ; Program maximum EVASTK .EQU 8475H ; Evaluation stack SYSSTK .EQU 8500H ; System stack SCRNST .EQU 8500H ; Screen memory start LINE23 .EQU 87C0H ; Penultimate line LINE24 .EQU 87E0H ; Last line DLTESC .EQU 7 ; Delete key scan code SHFTSC .EQU 2 ; Shift key scan code RTRNSC .EQU 13 ; Return key scan code SPCCHR .EQU 78H ; Space character CURCHR .EQU 0B4H ; Cursor character - '*' EOLCHR .EQU 0FDH ; End of line 'char' LINOHD .EQU 4 ; Line overhead ; Error codes BRKERR .EQU 0 ; Break SNTERR .EQU 1 ; Syntax error VALERR .EQU 2 ; Value error SIZERR .EQU 3 ; Size error QOTERR .EQU 4 ; End quote error MODERR .EQU 5 ; Mode error CHRERR .EQU 6 ; Unexpected character LNFERR .EQU 7 ; Line not found RETERR .EQU 8 ; RETURN without GOSUB NXTERR .EQU 9 ; NEXT without FOR DBZERR .EQU 10 ; Divide by zero ; Evaluation stack frame identifiers NULFRM .EQU 0 ; No frame SUBFRM .EQU 1 ; GOSUB frame FORFRM .EQU 2 ; FOR frame ; GOSUB frame ; ; IY-1: SUBFRM ; IY-2: hi / Text pointer ; IY-3: lo / ; IY-4: hi / Line number ; IY-5: lo / ; ; FOR frame ; ; IY-1: FORFRM ; IY-2: hi / Text pointer ; IY-3: lo / ; IY-4: hi / Line number ; IY-5: lo / ; IY-6: hi / Step size ; IY-7: lo / ; IY-8: hi / End value ; IY-9: lo / ; IY-10: hi / Start/current value ; IY-11: lo / ; IY-12: hi / Variable address ; IY-13: lo / ;----------------------------------------------------------------------- ; ; PAGE 0 ; ;----------------------------------------------------------------------- ; Reset .ORG 0 IM 1 ; Simple interrupts LD SP,SYSSTK ; Stack in sys mem #2 CALL CPYVGC ; Copy video generation code ; Clear the screen LD HL,SCRNST LD C,24 CLS1: LD B,30 CLS2: LD (HL),SPCCHR ; 30 space codes INC HL DJNZ CLS2 LD (HL),0FDH ; JP (IY) instruction INC HL LD (HL),0E9H INC HL DEC C JR NZ,CLS1 LD A,0 ; No chars LD (CHRPOS),A LD A,CURCHR ; Put cursor LD (LINE24),A ; Clear program LD HL,0FFFFH ; Lay down end of program LD (PROGST),HL JP START .ORG 38H CCF ; Interrupt - toggle RET ; carry flag (27~) ; Video generation code ; ; B contains video memory pixel address low (init 0) ; C contains video memory pixel row spacing high (8) ; DE contains video memory pixel row spacing (800H) ; HL points to line pulse generation code (VGC3+AFIXV) ; IX points to video memory char row (init 0CD00H) ; IY points to (VGC7+AFIXS) ; SP contains offset to next char row (0C820H) ; ; Alternate registers messed up by pixel generation code ; ; Following code runs in video RAM VGC0: DJNZ VGC0 ; Cassette pulse JP VGC16+AFIXS VGC1: JP $+3+AFIXV ; Frame pulse = 90~ JP $+3+AFIXV JP $+3+AFIXV JP $+3+AFIXV JP $+3+AFIXV JP $+3+AFIXV JP $+3+AFIXV JP $+3+AFIXV JP VGC14+AFIXS VGC2: LD A,B ; Line sync pulse = 14~ JP VGC11+AFIXS VGC3: LD A,B JP NC,VGC8+AFIXS JP VGC4+AFIXS ; A10 border here ; Following code runs in system RAM VGC4: ADD IX,SP ; To next char row LD (TEMP),IX ; Get next refresh address LD A,(TEMP+1) ADD A,-8 LD I,A CP 0C8H ; All char rows done? JR Z,VGC9 LD A,(TEMP) ; No - get refresh address LD B,A ; low LD A,3 ; Kill time LD A,3 LD A,3 LD A,3 VGC5: DEC A JR NZ,VGC5 SCF ; Keep going CCF JP VGC3+AFIXV VGC7: EXX ; Get back real registers ADD IX,DE ; To next pixel row JP (HL) ; Generate line sync VGC8: LD R,A ; Set refresh address low LD A,I ; Set refresh address high ADD A,C LD I,A EXX ; Get expendable registers JP (IX) ; Generate pixel row VGC9: LD A,0 ; Back to ROM code LD I,A JP GETC2 VGC10: LD A,0C0H ; Isolated line pulse LD I,A JP VGC2+AFIXV VGC11: LD A,0 LD I,A RET VGC12: LD (TEMP),IX ; Start - prepare I register LD A,(TEMP+1) ADD A,-8 LD I,A SCF CCF JP VGC3+AFIXV VGC13: LD A,0C0H ; Frame pulses LD I,A JP VGC1+AFIXV VGC14: DEC B JP NZ,VGC1+AFIXV LD A,0 LD I,A RET VGC15: LD A,0C0H ; Cassette pulse LD I,A JP VGC0+AFIXV VGC16: LD A,0 LD I,A RET VGSIZE .EQU $-VGC0 ; Total size of code ; Copy video generation code CPYVGC: LD BC,VGSIZE LD DE,VGC0+AFIXS LD HL,VGC0 LDIR RET ; Keyboard look-up table KBDTBL: .BYTE 000H,000H,000H,040H,054H,061H ; sh A Q 1 .BYTE 053H,000H,05FH,057H,05BH,062H ; P del Z S W 2 .BYTE 060H,000H,05CH,044H,045H,063H ; 0 ret X D E 3 .BYTE 051H,078H,042H,047H,055H,064H ; O spc C F R 4 .BYTE 06BH,04DH,05AH,048H,058H,065H ; 9 L V G T 5 .BYTE 04AH,04FH,041H,049H,05DH,067H ; I M B H Y 6 .BYTE 06AH,04CH,050H,04BH,059H,068H ; 8 K N J U 7 ; Shifted: .BYTE 000H,000H,000H,040H,054H,061H ; sh A Q 1 .BYTE 0B7H,000H,05FH,057H,05BH,06CH ; = del Z S W " .BYTE 0B1H,000H,05CH,044H,045H,063H ; ) ret X D E 3 .BYTE 0B3H,078H,042H,047H,055H,06DH ; + spc C F R $ .BYTE 0B0H,07BH,05AH,048H,058H,065H ; ( ; V G T 5 .BYTE 0B2H,0B5H,079H,07FH,05DH,067H ; - / < . Y 6 .BYTE 0B4H,06FH,07AH,07CH,059H,068H ; * : > , U 7 ; Get character ; Scan code returned in SCNCOD GETCH: LD (SPSAVE),SP ; Save SP LD A,0 ; Ignore keys LD (PRVCOD),A ; already down GETC1: LD BC,8 LD DE,800H LD HL,VGC3+AFIXV LD IX,0CD00H LD IY,VGC7+AFIXS LD SP,0C820H JP VGC12+AFIXS GETC2: LD SP,(SPSAVE) ; Recover SP NOP NOP NOP CALL VGC10+AFIXS ; (pulse) LD B,3 LD B,3 LD B,3 GETC3: DJNZ GETC3 NOP LD BC,3FH ; Prepare for keyboard LD A,80H ; scan LD (SCNCOD),A LD HL,20DFH LD DE,1FE0H GETC4: NOP NOP NOP NOP GETC5: CALL VGC10+AFIXS ; (42 pulses) LD A,L ; Set refresh address AND C LD I,A LD A,H LD R,A SCF ; See if /INT asserted EI NOP DI JR NC,GETC6 LD A,B ; No - key down LD (SCNCOD),A ; Save scan code LD A,0 NOP NOP GETC6: INC B ; To next key SRA L ; Walk column bit JR C,GETC4 ; New row? ADD HL,DE ; Yes JP NC,GETC5 ; All keys scanned? CALL VGC10+AFIXS ; (pulse) LD C,6 LD A,R GETC7: LD B,7 GETC8: DJNZ GETC8 NOP NOP NOP NOP CALL VGC10+AFIXS ; (6 pulses) DEC C JR NZ,GETC7 LD B,7 GETC9: DJNZ GETC9 LD B,5 LD B,5 LD B,5 CALL VGC13+AFIXS ; (frame pulses) LD B,2 LD B,2 GETC10: DJNZ GETC10 CALL VGC10+AFIXS ; (pulse) LD C,65 LD A,R GETC11: LD B,7 GETC12: DJNZ GETC12 NOP NOP NOP NOP CALL VGC10+AFIXS ; (65 pulses) DEC C JR NZ,GETC11 LD BC,(SCNCOD) ; New key closure? LD A,C CPL AND B RET M ; Yes - outa here LD A,C ; For next time LD (PRVCOD),A LD B,4 GETC13: DJNZ GETC13 INC HL CALL VGC10+AFIXS ; (pulse) LD A,R NOP JP GETC1 #IF $>0200H Page0trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 1 ; ;----------------------------------------------------------------------- .ORG 0800H ; Character to digit table C2DTBL: .BYTE 0 ; 60: 0 .BYTE 1 ; 61: 1 .BYTE 2 ; 62: 2 .BYTE 3 ; 63: 3 .BYTE 4 ; 64: 4 .BYTE 5 ; 65: 5 .BYTE 0 ; 66: - .BYTE 6 ; 67: 6 .BYTE 7 ; 68: 7 .BYTE 0 ; 69: - .BYTE 8 ; 6A: 8 .BYTE 9 ; 6B; 9 ; Digit to character table D2CTBL: .BYTE 60H ; 0: 60 .BYTE 61H ; 1: 61 .BYTE 62H ; 2: 62 .BYTE 63H ; 3: 63 .BYTE 64H ; 4: 64 .BYTE 65H ; 5: 65 .BYTE 67H ; 6: 67 .BYTE 68H ; 7: 68 .BYTE 6AH ; 8: 6A .BYTE 6BH ; 9: 6B ; Get line GETLIN: LD A,0 LD (SHIFT),A ; Clear shift state GETL1: CALL GETCH LD A,(SCNCOD) CP DLTESC ; Delete key? JR NZ,GETL2 LD A,(CHRPOS) ; Yes - any chars? OR A JR Z,GETL1 DEC A ; Yes - decrement LD (CHRPOS),A ADD A,LINE24&00FFH ; Make pointer LD L,A LD H,LINE24>>8 LD BC,CURCHR<<8+SPCCHR LD (HL),B ; New cursor INC HL LD (HL),C ; Blank old cursor JR GETL1 GETL2: CP SHFTSC ; Shift key? JR NZ,GETL3 LD A,(SHIFT) ; Yes - adjust XOR 42 LD (SHIFT),A JR GETL1 GETL3: CP RTRNSC ; Return key? JR Z,NEWLIN LD A,(SCNCOD) ; Look up char LD B,A LD A,(SHIFT) ADD A,B LD C,A LD B,0 LD HL,KBDTBL ADD HL,BC LD A,(HL) OR A ; Printable? JR Z,GETL1 LD D,A LD A,0 ; Yes - cancel shift LD (SHIFT),A LD A,(CHRPOS) ; Increment char count INC A LD (CHRPOS),A DEC A ADD A,LINE24&00FFH ; Form pointer LD L,A LD H,LINE24>>8 LD (HL),D ; Put char INC HL LD A,(HL) ; Full line? CP EOLCHR JR Z,SCROLL LD A,CURCHR ; No - put new cursor LD (HL),A JR GETL1 ; Get a new line NEWLIN: LD A,(CHRPOS) ; Blank cursor ADD A,LINE24&00FFH LD L,A LD H,LINE24>>8 LD A,SPCCHR LD (HL),A ; Drop through to... ; Scroll lines ; Does NOT blank cursor if present SCROLL: LD BC,23*32 ; Copy lines up LD DE,SCRNST LD HL,SCRNST+32 LDIR LD A,SPCCHR ; Blank last line LD B,30 SCRL1: LD (DE),A INC DE DJNZ SCRL1 LD A,0 ; No chars now LD (CHRPOS),A LD A,CURCHR ; Put new cursor LD (LINE24),A RET ; Put character ; Character expected in D ; Scrolls if line filled PUTCH: LD A,(CHRPOS) ; Increment char count INC A LD (CHRPOS),A DEC A ADD A,LINE24&00FFH ; Form pointer LD L,A LD H,LINE24>>8 LD (HL),D ; Put char INC HL LD A,(HL) ; Full line? CP EOLCHR JR Z,SCROLL LD A,CURCHR ; No - put new cursor LD (HL),A RET ; Skip leading spaces ; Expects IX to point to text SKPSPC: LD A,(IX+0) ; Space? CP SPCCHR RET NZ ; No INC IX ; Yes - skip JR SKPSPC ; Test for number in text ; Expects IX to point to text ; Does not look for leading + or - ; Returns CY=1 if number found ; Returns number in HL TSTNUM: CALL SKPSPC ; Skip spaces LD HL,0 ; Prepare for digits LD A,(IX+0) ; Digits in char range SUB 6CH ; 60H..6BH RET NC ADD A,12 RET NC TSTN1: PUSH AF INC IX LD B,H ; Multiply number by 10 LD C,L ADD HL,BC ; (2x) JR C,TSTN3 LD A,B SLA C RLA JR C,TSTN3 SLA C RLA JR C,TSTN3 SLA C RLA JR C,TSTN3 LD B,A ADD HL,BC ; (+8x) JR C,TSTN3 POP AF ADD A,C2DTBL&00FFH ; Map char to digit LD C,A LD B,C2DTBL>>8 LD A,(BC) LD C,A ; Add in new digit LD B,0 ADD HL,BC JR C,TSTN3 LD A,(IX+0) ; Look for further digits SUB 6CH JR NC,TSTN2 ADD A,12 JR C,TSTN1 TSTN2: BIT 7,H ; Too big for signed number? JR NZ,TSTN3 SCF ; Return success RET TSTN3: LD L,VALERR JP ERROR ; Print number ; Number expected in HL ; Uses BC, DE, IX PRNUM: LD A,0 ; Borrowed for lead zero LD (SHIFT),A ; flag BIT 7,H ; Negative? JR Z,PRN1 LD B,H ; Yes - negate LD C,L LD HL,0 SCF CCF SBC HL,BC PRN1: LD D,0B2H ; Print minus sign if req. PUSH HL CALL NZ,PUTCH POP HL LD IX,PRN6 ; Pointer to column weights PRN2: LD C,(IX+0) ; Get next column weight INC IX LD B,(IX+0) INC IX BIT 7,B ; Done? JR Z,PRN5 LD E,D2CTBL&00FFH ; This is slow but printing PRN3: ADD HL,BC ; is not critical JR NC,PRN4 INC E JR PRN3 PRN4: SBC HL,BC LD D,D2CTBL>>8 LD A,(DE) LD D,A LD A,(SHIFT) ; Leading zero? OR D LD (SHIFT),A AND 0FH JR Z,PRN2 PUSH HL CALL PUTCH POP HL JR PRN2 PRN5: LD A,(SHIFT) ; Anything printed at all? AND 0FH RET NZ LD D,60H ; No - print one zero JP PUTCH PRN6: .WORD -10000 ; Column weights .WORD -1000 .WORD -100 .WORD -10 .WORD -1 .WORD 0 ; Print string ; String pointed to by HL ; String terminated by EOLCHR PRSTR: LD A,(HL) ; Keep printing until CP EOLCHR ; EOLCHR reached RET Z LD D,A PUSH HL CALL PUTCH POP HL INC HL JR PRSTR ; Find line in program ; Line number expected in HL ; Returns with IY pointing at line ; Returns Z=1 if exact match found FNDLIN: LD IY,PROGST FNDL1: LD C,(IY+0) LD B,(IY+1) SCF CCF SBC HL,BC ; Found it? RET C RET Z ADD HL,BC ; No - keep looking LD C,(IY+2) LD B,0 ADD IY,BC JR FNDL1 ; Delete line in program ; Expects IY to point to line ; Uses HL, DE, BC, IX DELLIN: PUSH IY POP DE ; Xfer destination LD C,(IY+2) ; Skip to next line LD B,0 ADD IY,BC PUSH IY POP HL ; Xfer source LD IX,0 DELLN1: BIT 7,(IY+1) ; Size remainder of JR NZ,DELLN2 ; program LD C,(IY+2) ADD IY,BC ADD IX,BC JR DELLN1 DELLN2: PUSH IX POP BC ; Xfer size LD A,B ; Don't copy if zero OR C ; size (=64k!) JR Z,DELLN3 LDIR DELLN3: LD A,0FFH ; New program end LD (DE),A INC DE LD (DE),A RET ; Test for key word in text ; Expects IX to point to text ; Expects null terminated compare string to follow call ; Skips string in text if found ; Returns Z=1 if string found TSTKWD: CALL SKPSPC POP HL ; Return address -> HL PUSH IX ; Save text pointer TSTK1: LD A,(HL) ; Compare chars INC HL OR A ; All chars compared? JR Z,TSTK3 CP (IX+0) INC IX JR Z,TSTK1 POP IX ; Fail - recover text TSTK2: LD A,(HL) ; pointer and skip string INC HL OR A JR NZ,TSTK2 OR 1 JP (HL) TSTK3: INC SP ; Match - delete saved pointer INC SP JP (HL) ; Check run mode CHKMOD: LD A,(LINENO) ; Forbidden if zero line number LD B,A LD A,(LINENO+1) OR B LD L,MODERR JP Z,ERROR RET #IF $>0A00H Page1trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 2 ; ;----------------------------------------------------------------------- .ORG 1000H ; BASIC start START: LD HL,BANNER CALL PRSTR CALL NEWLIN CALL NEWLIN JR MAIN BANNER: .BYTE 5FH,5CH,68H,6BH,SPCCHR,41H,40H,57H,4AH,42H,EOLCHR ; Main program SYNTAX: LD L,SNTERR ; Global syntax error ERROR: LD SP,SYSSTK CALL REPERR MAIN: LD SP,SYSSTK LD HL,0 ; Direct mode is line zero LD (LINENO),HL CALL GETLIN ; Get line from user LD IX,LINE23 ; Parse CALL TSTNUM ; Begin with number? JP NC,MAIN8 LD A,H ; Yes - zero? OR L JP Z,MAIN14 ; If so, protest! CALL SKPSPC ; Skip to text, if any PUSH IX ; Save text start LD BC,1 ; Size following text MAIN1: LD A,(IX+0) CP EOLCHR JR Z,MAIN3 CP SPCCHR JR Z,MAIN2 LD B,C MAIN2: INC C INC IX JR MAIN1 MAIN3: POP IX ; Text length now in B LD A,B LD (SHIFT),A ; Save text length OR A ; Any text? JR NZ,MAIN4 CALL FNDLIN ; No - does line exist? JR NZ,MAIN CALL DELLIN ; Yes - delete it JR MAIN MAIN4: PUSH IX ; Some text: PUSH HL ; Save text pointer, CALL FNDLIN ; line number PUSH IY ; Save insertion pointer CALL Z,DELLIN ; Delete existing line if POP IY ; exact match PUSH IY ; Make space for new line LD IX,0 ; Size remainder of prog MAIN5: BIT 7,(IY+1) JR NZ,MAIN6 LD C,(IY+2) LD B,0 ADD IY,BC ADD IX,BC JR MAIN5 MAIN6: PUSH IY POP DE ; Xfer source LD A,(SHIFT) ; Get move distance ADD A,LINOHD LD C,A LD B,0 LD HL,0 ADD HL,DE ADD HL,BC ; Xfer destination PUSH IX POP BC ; Xfer size EX DE,HL ; Swap source/dest LD IX,1-PROGMX ; Check there's room ADD IX,DE JP C,MAIN15 LD A,0FFH ; New program end LD (DE),A INC DE LD (DE),A DEC DE DEC DE DEC HL LD A,B OR C ; Zero size? JR Z,MAIN7 LDDR MAIN7: POP HL ; Insert new line: POP DE LD (HL),E ; Line number INC HL LD (HL),D INC HL LD A,(SHIFT) ; Record size ADD A,LINOHD LD (HL),A INC HL POP DE EX DE,HL ; Xfer source/destination SUB LINOHD LD C,A LD B,0 ; Xfer size LDIR LD A,EOLCHR ; Terminating EOLCHR LD (DE),A JP MAIN MAIN8: CALL TSTKWD .BYTE 4DH,4AH,57H,58H,0 ; LIST? JR NZ,MAIN11 CALL TSTNUM ; Yes - line number? LD IY,PROGST LD A,22 JR NC,MAIN9 ; If not - list from start CALL FNDLIN LD A,22 MAIN9: PUSH AF BIT 7,(IY+1) ; List JR NZ,MAIN10 LD L,(IY+0) LD H,(IY+1) PUSH IY CALL PRNUM LD D,SPCCHR CALL PUTCH POP HL PUSH HL LD BC,3 ADD HL,BC CALL PRSTR CALL NEWLIN POP IY LD C,(IY+2) LD B,0 ADD IY,BC POP AF DEC A ; Stop at 22 lines JR NZ,MAIN9 PUSH AF MAIN10: POP AF CALL NEWLIN JP MAIN MAIN11: CALL TSTKWD .BYTE 57H,40H,5AH,45H,0 ; SAVE? JR NZ,MAIN12 CALL SAVE JP MAIN MAIN12: CALL TSTKWD .BYTE 4DH,51H,40H,44H,0 ; LOAD? JR NZ,MAIN13 CALL LOAD JP MAIN MAIN13: CALL TSTKWD .BYTE 50H,45H,5BH,0 ; NEW? JP NZ,MN13A LD A,0FFH ; Yes - clear program LD (PROGST),A LD (PROGST+1),A JP MAIN MN13A: CALL TSTKWD ; RUN? .BYTE 55H,59H,50H,0 JR NZ,MN13x LD HL,(PROGST) ; Check for program LD A,H AND L CP 0FFH JP Z,MAIN JP RUNPRG MN13x: LD IY,EVASTK+1 ; See if statement LD A,NULFRM LD (IY-1),A CALL STTMNT JP MAIN MAIN14: LD L,VALERR JP ERROR MAIN15: LD L,SIZERR JP ERROR ; SAVE command SAVE: CALL IBDEL ; Some silence CALL IBDEL CALL IBDEL LD D,5FH ; Header - 'ZX' CALL SNDCAS LD D,5CH CALL SNDCAS LD IY,PROGST ; IY points to program LD D,(IY+0) ; Send first byte INC IY CALL SNDCAS SAVE1: LD D,(IY+0) ; Subsequent bytes INC IY CALL SNDCAS LD A,(IY-1) ; Program end sent? AND (IY-2) CP 0FFH JR NZ,SAVE1 CALL IBDEL RET ; LOAD command ; Uses IY LOAD: CALL RCVCAS ; Wait for header CP 5FH JR NZ,LOAD CALL RCVCAS CP 5CH JR NZ,LOAD LD IY,PROGST ; Get first byte CALL RCVCAS LD (IY+0),A INC IY LOAD1: CALL RCVCAS ; ...and subsequent LD (IY+0),A INC IY LD A,(IY-1) ; End of program? AND (IY-2) CP 0FFH JR NZ,LOAD1 RET ; Cassette inter-bit delay (approx. 1.3msec) ; Uses B IBDEL: LD B,161 IBDEL1: DJNZ IBDEL1 LD B,161 IBDEL2: DJNZ IBDEL2 RET #IF $>1200H Page2trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 3 ; ;----------------------------------------------------------------------- .ORG 1800H ; Send byte to cassette ; Byte expected in D SNDCAS: LD C,8 ; 8 bits to send SNDC1: SRL D ; Next bit LD E,9 ; 0: 4 cycles JR C,SNDC2 ; 1: 9 cycles LD E,4 SNDC2: LD B,37 CALL VGC15+AFIXS LD B,30 SNDC3: DJNZ SNDC3 DEC E JR NZ,SNDC2 CALL IBDEL DEC C JR NZ,SNDC1 RET ; Receive byte from cassette ; Byte returned in A, C RCVCAS: LD A,2FH ; (to check for break) LD I,A RCVC1: LD DE,828H ; 8 bits to get RCVC2: LD A,80H ; Break? LD R,A SCF EI NOP DI JR C,RCVC11 LD A,0 ; No - bit arrived? LD R,A SCF EI NOP DI JR C,RCVC3 DEC E ; Restart byte if JR Z,RCVC1 ; waiting too long NOP JR RCVC2 RCVC3: SCF ; Check again EI NOP DI JR NC,RCVC1 LD B,218 ; Wait 6 pulse periods RCVC4: DJNZ RCVC4 LD B,218 RCVC5: DJNZ RCVC5 SRL C ; New bit LD E,12 ; Test for pulses RCVC6: LD A,0 ; several times LD R,A SCF EI NOP DI JR NC,RCVC7 SET 7,C RCVC7: DEC E JR NZ,RCVC6 BIT 7,C ; bit=1? JR Z,RCVC10 LD B,187 ; Yes - skip all pulses RCVC8: DJNZ RCVC8 LD B,187 RCVC9: DJNZ RCVC9 RCVC10: DEC D ; All bits received? JR NZ,RCVC2 LD A,C ; Yes - return RET RCVC11: LD HL,0FFFFH ; Break - erase program LD (PROGST),HL LD L,BRKERR JP ERROR ; Check for break (space key) CHKBRK: LD A,2FH LD I,A LD A,80H LD R,A SCF EI NOP DI JR C,CHKBR1 RET CHKBR1: LD L,BRKERR JP ERROR ; Test for variable in text ; Expects IX to point to text ; Expects IY to point to evaluation stack ; Returns CY=1 if variable found ; Pushes variable address on evaluation stack if found TSTVAR CALL SKPSPC BIT 5,(IX+0) ; A-Z? JR NZ,TSTV1 BIT 5,(IX+1) ; Ensure not key word JR Z,TSTV1 INC IX ; Is variable - skip LD A,(IX-1) ; and push address SLA A AND 7EH ADD A,VARS&00FFH LD (IY+0),A INC IY LD A,0 ADC A,VARS>>8 LD (IY+0),A INC IY SCF RET TSTV1: SCF CCF RET ; Parse expression EXPRSN: CALL TSTKWD ; Unary '-'? .BYTE 0B2H,0 JR NZ,EXPR1 CALL TERM LD A,(IY-2) ; Yes - negate CPL LD L,A LD A,(IY-1) CPL LD H,A INC HL LD (IY-2),L LD (IY-1),H JR EXPR2 EXPR1: CALL TSTKWD ; Skip unary '+' .BYTE 0B3H,0 CALL TERM EXPR2: CALL TSTKWD ; Binary '-'? .BYTE 0B2H,0 JR NZ,EXPR3 CALL TERM LD A,(IY-4) SUB (IY-2) LD (IY-4),A LD A,(IY-3) SBC A,(IY-1) LD (IY-3),A DEC IY DEC IY JR EXPR2 EXPR3: CALL TSTKWD ; Binary '+'? .BYTE 0B3H,0 JR NZ,EXPR4 CALL TERM LD A,(IY-4) ADD A,(IY-2) LD (IY-4),A LD A,(IY-3) ADC A,(IY-1) LD (IY-3),A DEC IY DEC IY JR EXPR2 EXPR4: CALL TSTKWD ; 'OR'? .BYTE 51H,55H,0 RET NZ CALL TERM LD A,(IY-4) OR (IY-2) LD (IY-4),A LD A,(IY-3) OR (IY-1) LD (IY-3),A DEC IY DEC IY JR EXPR2 ; Parse factor FACTOR: CALL TSTVAR ; Variable? JR NC,FCTR1 LD L,(IY-2) ; Yes - do indirection LD H,(IY-1) LD A,(HL) LD (IY-2),A INC HL LD A,(HL) LD (IY-1),A RET FCTR1: CALL TSTNUM ; Number? JR NC,FCTR2 LD (IY+0),L LD (IY+1),H INC IY INC IY RET FCTR2: CALL TSTKWD ; '('? .BYTE 0B0H,0 JR NZ,FCTR3 CALL RELEXP CALL TSTKWD ; Must be ')' next .BYTE 0B1H,0 JP NZ,SYNTAX RET FCTR3: CALL TSTKWD ; 'MEM'? .BYTE 4FH,45H,4FH,0 JR NZ,FCTR4 CALL TSTKWD ; Must be '(' next .BYTE 0B0H,0 JP NZ,SYNTAX CALL FACTOR CALL TSTKWD ; Must be ')' next .BYTE 0B1H,0 JP NZ,SYNTAX LD L,(IY-2) ; Do indirection LD H,(IY-1) LD A,(HL) LD (IY-2),A LD A,0 LD (IY-1),A RET FCTR4: CALL TSTKWD ; 'NOT'? .BYTE 50H,51H,58H,0 JR NZ,FCTR5 CALL FACTOR LD A,(IY-2) ; Complement CPL LD (IY-2),A LD A,(IY-1) CPL LD (IY-1),A RET FCTR5: CALL TSTKWD ; 'TOP'? .BYTE 58H,51H,53H,0 JP NZ,SYNTAX PUSH IX ; Find top of program LD IX,PROGST+2 FCTR6: LD A,(IX-2) AND (IX-1) CP 0FFH JR Z,FCTR7 LD C,(IX+0) LD B,0 ADD IX,BC JR FCTR6 FCTR7: PUSH IX POP HL POP IX LD (IY+0),L LD (IY+1),H INC IY INC IY RET #IF $>1A00H Page3trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 4 ; ;----------------------------------------------------------------------- .ORG 2000H ; Parse relational expression RELEXP: CALL EXPRSN CALL TSTKWD ; '='? .BYTE 0B7H,0 JR NZ,REXP1 CALL EXPRSN CALL REXP8 JP Z,REXP9 JP REXP10 REXP1: CALL TSTKWD ; '<='? .BYTE 79H,0B7H,0 JR NZ,REXP2 CALL EXPRSN CALL REXP7 JP M,REXP1A SBC HL,DE JP NC,REXP9 JP REXP10 REXP1A: BIT 7,D JP Z,REXP10 JP REXP9 REXP2: CALL TSTKWD ; '>='? .BYTE 7AH,0B7H,0 JR NZ,REXP3 CALL EXPRSN CALL REXP6 JP M,REXP2A SBC HL,DE JP NC,REXP9 JP REXP10 REXP2A: BIT 7,D JP Z,REXP10 JP REXP9 REXP3: CALL TSTKWD ; '<>'? .BYTE 79H,7AH,0 JR NZ,REXP4 CALL EXPRSN CALL REXP8 JR Z,REXP10 JR REXP9 REXP4: CALL TSTKWD ; '<'? .BYTE 79H,0 JR NZ,REXP5 CALL EXPRSN CALL REXP6 JP M,REXP4A SBC HL,DE JR NC,REXP10 JR REXP9 REXP4A: BIT 7,D JR Z,REXP9 JR REXP10 REXP5: CALL TSTKWD ; '>'? .BYTE 7AH,0 RET NZ CALL EXPRSN CALL REXP7 JP M,REXP5A SBC HL,DE JR NC,REXP10 JR REXP9 REXP5A: BIT 7,D JR Z,REXP9 JR REXP10 REXP6: LD L,(IY-4) LD H,(IY-3) LD E,(IY-2) LD D,(IY-1) LD A,H XOR D RET REXP7: LD E,(IY-4) LD D,(IY-3) LD L,(IY-2) LD H,(IY-1) LD A,H XOR D RET REXP8: LD A,(IY-4) XOR (IY-2) LD B,A LD A,(IY-3) XOR (IY-1) OR B RET REXP9: DEC IY ; Return true DEC IY LD A,0FFH LD (IY-2),A LD (IY-1),A RET REXP10: DEC IY ; Return false DEC IY LD A,0 LD (IY-2),A LD (IY-1),A RET ; Parse term TERM: CALL FACTOR TERM1: CALL TSTKWD ; '*'? .BYTE 0B4H,0 JR NZ,TERM2 CALL FACTOR LD A,(IY-3) OR A JP M,TERM1B LD B,A LD C,(IY-4) LD A,(IY-1) OR A JP M,TERM1A LD D,A LD E,(IY-2) CALL MLTPLY JP TERM4 TERM1A: CPL LD D,A LD A,(IY-2) CPL LD E,A INC DE CALL MLTPLY JP TERM5 TERM1B: CPL LD B,A LD A,(IY-4) CPL LD C,A INC BC LD A,(IY-1) OR A JP M,TERM1C LD D,A LD E,(IY-2) CALL MLTPLY JP TERM5 TERM1C: CPL LD D,A LD A,(IY-2) CPL LD E,A INC DE CALL MLTPLY JR TERM4 TERM2: CALL TSTKWD ; '/'? .BYTE 0B5H,0 JR NZ,TERM3 CALL FACTOR LD A,(IY-3) OR A JP M,TERM2B LD B,A LD C,(IY-4) LD A,(IY-1) OR A JP M,TERM2A LD D,A LD E,(IY-2) CALL DIVIDE JR TERM6 TERM2A: CPL LD D,A LD A,(IY-2) CPL LD E,A INC DE CALL DIVIDE JR TERM7 TERM2B: CPL LD B,A LD A,(IY-4) CPL LD C,A INC BC LD A,(IY-1) OR A JP M,TERM2C LD D,A LD E,(IY-2) CALL DIVIDE JR TERM7 TERM2C: CPL LD D,A LD A,(IY-2) CPL LD E,A INC DE CALL DIVIDE JR TERM6 TERM3: CALL TSTKWD ; 'AND'? .BYTE 40H,50H,44H,0 RET NZ CALL FACTOR LD A,(IY-4) AND (IY-2) LD (IY-4),A LD A,(IY-3) AND (IY-1) LD (IY-3),A DEC IY DEC IY JP TERM1 TERM4: LD (IY-4),L LD (IY-3),H DEC IY DEC IY JP TERM1 TERM5: DEC HL LD A,L CPL LD (IY-4),A LD A,H CPL LD (IY-3),A DEC IY DEC IY JP TERM1 TERM6: LD (IY-4),C LD (IY-3),B DEC IY DEC IY JP TERM1 TERM7: DEC BC LD A,C CPL LD (IY-4),A LD A,B CPL LD (IY-3),A DEC IY DEC IY JP TERM1 #IF $>2200H Page4trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 5 ; ;----------------------------------------------------------------------- .ORG 2800H ; Execute statement ; Expects IX to point to text ; Expects IY to point to evaluation stack STTMNT: CALL TSTKWD ; Skip 'LET' if present .BYTE 4DH,45H,58H,0 PUSH AF ; (note if 'LET' found) CALL TSTVAR ; Variable: JR NC,SMNT1 CALL TSTKWD ; '=' must follow .BYTE 0B7H,0 JP NZ,SYNTAX CALL RELEXP POP AF LD L,(IY-4) ; Assign variable LD H,(IY-3) LD A,(IY-2) LD (HL),A INC HL LD A,(IY-1) LD (HL),A LD BC,-4 ADD IY,BC RET SMNT1: CALL TSTKWD ; '$'? .BYTE 6DH,0 JR NZ,SMNT2 CALL FACTOR CALL TSTKWD ; '=' must follow .BYTE 0B7H,0 JP NZ,SYNTAX CALL TSTKWD ; Another '$'? .BYTE 6DH,0 JR NZ,SMNT1B CALL FACTOR POP AF LD L,(IY-4) ; String to string assign LD H,(IY-3) LD E,(IY-2) LD D,(IY-1) SMNT1A: LD A,(DE) LD (HL),A INC HL INC DE CP EOLCHR JR NZ,SMNT1A LD BC,-4 ADD IY,BC RET SMNT1B: CALL TSTKWD ; '"'? .BYTE 6CH,0 JP NZ,SYNTAX POP AF LD L,(IY-2) ; Text to string assign LD H,(IY-1) SMNT1C: LD A,(IX+0) INC IX CP 6CH ; Ending '"'? JR Z,SMNT1D CP EOLCHR ; Trouble JP Z,SMNTy LD (HL),A INC HL JR SMNT1C SMNT1D: LD A,EOLCHR LD (HL),A DEC IY DEC IY RET SMNT2: CALL TSTKWD ; 'MEM': .BYTE 4FH,45H,4FH,0 JR NZ,SMNT3 CALL TSTKWD ; '(' must follow .BYTE 0B0H,0 JP NZ,SYNTAX CALL RELEXP CALL TSTKWD ; Must have ')' .BYTE 0B1H,0 JP NZ,SYNTAX CALL TSTKWD ; '=' must follow .BYTE 0B7H,0 JP NZ,SYNTAX CALL RELEXP POP AF LD L,(IY-4) ; Assign memory LD H,(IY-3) LD A,(IY-2) LD (HL),A LD BC,-4 ADD IY,BC RET SMNT3: POP AF ; Syntax error if we get to JP Z,SYNTAX ; here and there was a 'LET' CALL TSTKWD ; 'IF': .BYTE 4AH,47H,0 JR NZ,SMNT4 CALL CHKMOD CALL RELEXP CALL TSTKWD ; Skip 'THEN' .BYTE 58H,49H,45H,50H,0 LD A,(IY-2) ; Test condition OR (IY-1) DEC IY DEC IY JP NZ,STTMNT RET SMNT4: CALL TSTKWD ; 'FOR': .BYTE 47H,51H,55H,0 JR NZ,SMNT6 CALL CHKMOD CALL TSTVAR ; Must be variable JP NC,SYNTAX CALL TSTKWD ; '=' must follow .BYTE 0B7H,0 JP NZ,SYNTAX CALL RELEXP CALL TSTKWD ; 'TO' must be next .BYTE 58H,51H,0 JP NZ,SYNTAX CALL RELEXP CALL TSTKWD ; 'STEP'? .BYTE 57H,58H,45H,53H,0 JR NZ,SMNT5 CALL RELEXP JR SMNT5A SMNT5: INC IY INC IY LD BC,1 ; Step defaults to 1 LD (IY-2),C LD (IY-1),B SMNT5A: LD BC,5 ADD IY,BC LD HL,(LINENO) ; Line number LD (IY-5),L LD (IY-4),H PUSH IX ; Text pointer POP HL LD (IY-3),L LD (IY-2),H LD A,FORFRM ; Push FOR frame marker LD (IY-1),A LD L,(IY-13) ; Initialise variable LD H,(IY-12) LD E,(IY-11) LD D,(IY-10) LD (HL),E INC HL LD (HL),D RET SMNT6: CALL TSTKWD ; 'NEXT': .BYTE 50H,45H,5CH,58H,0 JP NZ,SMNT7 CALL CHKMOD CALL TSTVAR ; Skip variable DEC IY DEC IY JP NC,SYNTAX LD A,(IY-1) ; Correct frame? CP FORFRM LD L,NXTERR JP NZ,ERROR LD L,(IY-11) ; Get current value LD H,(IY-10) LD C,(IY-7) ; Get step LD B,(IY-6) ADD HL,BC ; Add step LD (IY-11),L ; Update LD (IY-10),H LD E,(IY-9) ; Get end LD D,(IY-8) BIT 7,B JR NZ,SMNT6B LD A,H ; Ascending: XOR D ; Compare signs JP M,SMNT6A EX DE,HL ; Same: compare values SBC HL,DE JR NC,SMNT6D JR SMNT6E SMNT6A: BIT 7,D ; Different signs: JR Z,SMNT6D ; Continue if end JR SMNT6E ; is +ve SMNT6B: LD A,H ; Similarly for XOR D ; descending JP M,SMNT6C SBC HL,DE JR NC,SMNT6D JR SMNT6E SMNT6C: BIT 7,D JR Z,SMNT6E SMNT6D: LD L,(IY-13) ; Update variable LD H,(IY-12) LD E,(IY-11) LD D,(IY-10) LD (HL),E INC HL LD (HL),D LD L,(IY-5) ; Get line number LD H,(IY-4) LD (LINENO),HL LD L,(IY-3) ; Get text pointer LD H,(IY-2) PUSH HL POP IX RET SMNT6E: LD BC,-13 ; Ending FOR loop ADD IY,BC RET #IF $>2A00H Page5trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 6 ; ;----------------------------------------------------------------------- .ORG 3000H SMNT7: CALL TSTKWD ; 'GOTO': .BYTE 48H,51H,58H,51H,0 JR NZ,SMNT8 CALL CHKMOD CALL RELEXP LD L,(IY-2) ; Get target line number LD H,(IY-1) DEC IY DEC IY PUSH IY ; Save eval stack pointer PUSH HL ; Save target line number CALL FNDLIN LD L,LNFERR JP NZ,ERROR ; Must be exact match POP HL ; Set new line number LD (LINENO),HL PUSH IY ; Get new text pointer POP IX LD BC,3 ADD IX,BC POP IY ; Recover eval stack POP HL JP RUNBAK ; Unstructured return SMNT8: CALL TSTKWD ; 'GOSUB': .BYTE 48H,51H,57H,59H,41H,0 JR NZ,SMNT9 CALL CHKMOD CALL RELEXP LD L,(IY-2) ; Get target line number LD H,(IY-1) LD BC,3 ADD IY,BC ; Create stack frame: LD BC,(LINENO) LD (IY-5),C ; Current line number LD (IY-4),B PUSH IX POP BC LD (IY-3),C ; Current text pointer LD (IY-2),B LD A,SUBFRM LD (IY-1),A ; GOSUB marker PUSH IY ; Save eval stack pointer PUSH HL ; Save target line number CALL FNDLIN LD L,LNFERR JP NZ,ERROR ; Must be exact match POP HL ; Set new line number LD (LINENO),HL PUSH IY ; Get new text pointer POP IX LD BC,3 ADD IX,BC POP IY ; Recover eval stack POP HL JP RUNBAK ; Unstructured return SMNT9: CALL TSTKWD ; 'RETURN': .BYTE 55H,45H,58H,59H,55H,50H,0 JR NZ,SMNT10 CALL CHKMOD LD A,(IY-1) ; Correct stack frame? CP SUBFRM LD L,RETERR JP NZ,ERROR LD L,(IY-5) ; Recover line number LD H,(IY-4) LD (LINENO),HL LD L,(IY-3) ; Recover text pointer LD H,(IY-2) PUSH HL POP IX LD BC,-5 ADD IY,BC RET SMNT10: CALL TSTKWD ; 'PRINT': .BYTE 53H,55H,4AH,50H,58H,0 JR NZ,SMNT15 SMNT11: CALL TSTKWD ; '$'? .BYTE 6DH,0 JR NZ,SMNT12 CALL FACTOR LD L,(IY-2) ; Print memory string LD H,(IY-1) CALL PRSTR DEC IY DEC IY JR SMNT14 SMNT12: CALL TSTKWD ; '"'? .BYTE 6CH,0 JR NZ,SMNT13 SMT12A: LD A,(IX+0) ; Print text string INC IX CP 6CH ; Ending '"'? JP Z,SMNT14 CP EOLCHR ; Trouble JP Z,SMNTy LD D,A CALL PUTCH JR SMT12A SMNT13: CALL RELEXP ; Value? LD L,(IY-2) ; Yes - print LD H,(IY-1) PUSH IX CALL PRNUM POP IX DEC IY DEC IY SMNT14: CALL TSTKWD ; ','? .BYTE 7CH,0 JR Z,SMNT11 CALL NEWLIN RET SMNT15: CALL TSTKWD ; 'INPUT': .BYTE 4AH,50H,53H,59H,58H,0 JR NZ,SMNT16 CALL CHKMOD CALL TSTKWD ; '$'? .BYTE 6DH,0 JR NZ,SMT15F CALL FACTOR ; Input string PUSH IX PUSH IY CALL GETLIN POP IY LD IX,LINE23 ; Size input text LD BC,1 SMT15A: LD A,(IX+0) CP EOLCHR JR Z,SMT15C CP SPCCHR JR Z,SMT15B LD B,C SMT15B: INC C INC IX JR SMT15A SMT15C: LD IX,LINE23 ; Copy text LD L,(IY-2) LD H,(IY-1) DEC IY DEC IY LD A,B ; Check for empty OR A ; string JR Z,SMT15E SMT15D: LD A,(IX+0) LD (HL),A INC IX INC HL DJNZ SMT15D SMT15E: LD A,EOLCHR LD (HL),A POP IX RET SMT15F: CALL TSTVAR ; Must be variable JP NC,SYNTAX PUSH IX PUSH IY CALL GETLIN POP IY LD IX,LINE23 ; Parse input CALL RELEXP POP IX LD L,(IY-4) ; Assign variable LD H,(IY-3) LD A,(IY-2) LD (HL),A INC HL LD A,(IY-1) LD (HL),A LD BC,-4 ADD IY,BC RET SMNT16: CALL TSTKWD ; 'REM': .BYTE 55H,45H,4FH,0 JR NZ,SMNT17 CALL CHKMOD SMT16A: LD A,(IX+0) ; Skip rest of line INC IX CP EOLCHR JR NZ,SMT16A DEC IX RET SMNT17: CALL TSTKWD ; 'END': .BYTE 45H,50H,44H,0 JP NZ,SYNTAX LD L,BRKERR JP ERROR SMNTy: LD L,QOTERR ; End quote error JP ERROR ; Multiply ; Unsigned values expected in BC, DE ; Unsigned product BC*DE returned in HL MLTPLY: LD HL,0 LD A,16 MLT1: SLA L RL H RL E RL D JR NC,MLT2 ADD HL,BC JR NC,MLT2 INC DE MLT2: DEC A JR NZ,MLT1 RET #IF $>3200H Page6trouble #ENDIF ;----------------------------------------------------------------------- ; ; PAGE 7 ; ;----------------------------------------------------------------------- .ORG 3800H ; Divide ; Unsigned values expected in BC, DE ; Unsigned quotient BC/DE returned in BC DIVIDE: LD A,D ; Divide by zero? OR E LD L,DBZERR JP Z,ERROR LD HL,0 LD A,16 DIV1: SCF RL C RL B RL L RL H SBC HL,DE JR NC,DIV2 ADD HL,DE DEC C DIV2: DEC A JR NZ,DIV1 RET ; Run program ; Assumes a program present RUNPRG: LD HL,(PROGST) ; Run from start LD (LINENO),HL LD IX,PROGST+3 LD IY,EVASTK+1 LD A,NULFRM LD (IY-1),A RUNBAK: CALL CHKBRK CALL STTMNT CALL TONEXT JR RUNBAK ; Move to next statement TONEXT: CALL SKPSPC ; Skip spaces LD A,(IX+0) INC IX CP 6FH ; ':'? RET Z CP EOLCHR ; Line end? LD L,CHRERR JP NZ,ERROR LD A,(IX+0) ; Yes - program end? AND (IX+1) CP 0FFH JP Z,MAIN ; Yes - quiet end LD L,(IX+0) ; Get new line number LD H,(IX+1) LD (LINENO),HL LD BC,3 ; Align text pointer ADD IX,BC RET ; Report error ; Error number expected in L REPERR: SLA L SLA L LD H,0 LD DE,ERRTBL ; Find error chars ADD HL,DE PUSH HL CALL NEWLIN CALL NEWLIN POP HL LD B,4 REPE1: LD D,(HL) INC HL PUSH HL PUSH BC CALL PUTCH POP BC POP HL DJNZ REPE1 LD HL,ERRSTR CALL PRSTR LD HL,(LINENO) ; Running? LD A,H OR L JR Z,REPE2 LD HL,INSTR CALL PRSTR LD HL,(LINENO) CALL PRNUM REPE2: CALL NEWLIN RET ; Error codes ERRTBL: .BYTE 41H,55H,4CH,78H ; Break .BYTE 57H,50H,58H,5CH ; Syntax error .BYTE 5AH,40H,4DH,59H ; Value error .BYTE 40H,55H,45H,40H ; Size error .BYTE 45H,50H,44H,6CH ; End quote error .BYTE 57H,58H,4FH,58H ; Mode error .BYTE 42H,49H,40H,55H ; Unexpected character .BYTE 50H,51H,48H,51H ; Line not found .BYTE 55H,58H,55H,50H ; RETURN without GOSUB .BYTE 50H,45H,5CH,58H ; NEXT without FOR .BYTE 44H,4AH,5AH,60H ; Divide by zero ERRSTR: .BYTE SPCCHR,45H,55H,55H,51H,55H,EOLCHR INSTR: .BYTE SPCCHR,4AH,50H,SPCCHR,EOLCHR #IF $>3A00H Page7trouble #ENDIF ;----------------------------------------------------------------------- ; ; Font tables ; ;----------------------------------------------------------------------- .ORG 8000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 07CH,07EH,078H,000H,03EH,0FEH,000H,0FEH .BYTE 078H,082H,07CH,040H,042H,002H,000H,082H .BYTE 086H,07CH,000H,07EH,07CH,07EH,000H,07CH .BYTE 0FEH,082H,082H,082H,084H,082H,000H,0FEH .BYTE 038H,030H,07CH,07CH,030H,0FEH,000H,07CH .BYTE 0FEH,000H,07CH,07CH,028H,010H,000H,000H .BYTE 020H,008H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,040H,022H,002H,000H,0C6H .BYTE 08AH,082H,000H,082H,082H,082H,000H,002H .BYTE 010H,082H,082H,082H,048H,044H,000H,040H .BYTE 044H,028H,082H,082H,028H,002H,000H,002H .BYTE 080H,000H,082H,082H,028H,07CH,000H,000H .BYTE 010H,010H,000H,010H,054H,040H,000H,000H .BYTE 000H,020H,008H,010H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 082H,07EH,002H,000H,082H,03EH,000H,03EH .BYTE 002H,0FEH,010H,040H,01EH,002H,000H,0AAH .BYTE 092H,082H,000H,082H,082H,082H,000H,07CH .BYTE 010H,082H,082H,082H,030H,038H,000H,020H .BYTE 082H,020H,080H,060H,024H,07EH,000H,07EH .BYTE 040H,000H,07CH,082H,000H,012H,000H,010H .BYTE 010H,010H,000H,010H,038H,020H,000H,07CH .BYTE 000H,010H,010H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 0FEH,082H,002H,000H,082H,002H,000H,002H .BYTE 0E2H,082H,010H,042H,022H,002H,000H,092H .BYTE 0A2H,082H,000H,07EH,092H,07EH,000H,080H .BYTE 010H,082H,044H,092H,030H,010H,000H,010H .BYTE 082H,020H,07CH,080H,022H,080H,000H,082H .BYTE 020H,000H,082H,0FCH,000H,07CH,000H,000H .BYTE 010H,010H,07CH,07CH,010H,010H,000H,000H .BYTE 000H,008H,020H,000H,000H,000H,000H,000H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,082H,084H,000H,042H,002H,000H,002H .BYTE 084H,082H,010H,044H,042H,002H,000H,082H .BYTE 0C2H,082H,000H,002H,0A2H,022H,000H,082H .BYTE 010H,082H,028H,0AAH,048H,010H,000H,008H .BYTE 044H,020H,002H,082H,0FEH,082H,000H,082H .BYTE 010H,000H,082H,080H,000H,090H,000H,000H .BYTE 010H,010H,000H,010H,038H,008H,000H,07CH .BYTE 000H,010H,010H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 082H,07EH,078H,000H,03EH,0FEH,000H,002H .BYTE 078H,082H,07CH,038H,082H,0FEH,000H,082H .BYTE 082H,07CH,000H,002H,07CH,042H,000H,07CH .BYTE 010H,07CH,010H,044H,084H,010H,000H,0FEH .BYTE 038H,078H,0FEH,07CH,020H,07CH,000H,07CH .BYTE 010H,000H,07CH,07CH,000H,07CH,000H,010H .BYTE 020H,008H,000H,010H,054H,004H,000H,000H .BYTE 000H,020H,008H,010H,010H,000H,000H,030H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,000H,000H,010H,000H,000H .BYTE 000H,000H,000H,000H,000H,000H,000H,000H .BYTE 000H,000H,000H,008H,008H,000H,000H,000H .END