// Contents of MBM 22716 EPROM marked G007 Graphics // Start = 2800H // End = 2FFFH // Sorry I have not had time to disassemble this! equ NEW 03C3 equ CLS 0A2A equ ERR_NR 4000 equ FLAGS 4001 equ ERR_SP 4002 equ RAMTOP 4004 equ MODE 4006 equ PPC 4007 equ VERSN 4009 equ E_PPC 400A equ D_FILE 400C equ DF_CC 400E equ VARS 4010 equ DEST 4012 equ E_LINE 4014 equ CH_ADD 4016 equ X_PTR 4018 equ STKBOT 401A equ STKEND 401C equ BERG 401E equ MEM 401F equ DF_SZ 4022 equ S_TOP 4023 equ LAST_K 4025 equ DEBOUNCE 4027 equ MARGIN 4028 equ NXTLIN 4029 equ OLDPPC 402B equ FLAGX 402D equ STRLEN 402E equ T_ADDR 4030 equ SEED 4032 equ FRAMES 4034 equ COORDS 4036 equ PR_CC 4038 equ S_POSN 4039 equ CDFLAG 403B equ PRBUFF 403C equ MEMBOT 407B equ PROGRAM 407D 2800: 2A 23 23 3A 25 23 67 EB 2808: 3A 18 23 3D 92 57 3E 07 2810: A3 6F 26 2D 7E 2A 08 23 2818: 4A 06 00 09 09 CB 3A CB 2820: 1B CB 3A CB 1B CB 3A CB 2828: 1B 19 47 C9 3A 21 23 2A 2830: 27 23 ED 5B 23 23 D9 2A 2838: 25 23 ED 5B 29 23 CB 77 2840: 28 1C CB 7F C0 3A 21 40 2848: F5 06 08 0F FD CB 21 16 2850: 10 F9 EB D9 EB D9 CD 5E 2858: 28 F1 32 21 40 C9 01 DE 2860: FF 3A 18 23 3D 93 ED 52 2868: F2 76 28 01 22 00 7B D5 2870: 19 EB B7 ED 52 D1 E5 63 2878: 5F D9 01 FB 28 7D D9 6F 2880: D9 B7 ED 52 F2 90 28 01 2888: 04 29 2F 19 EB B7 ED 52 2890: ED 43 1A 23 D1 B7 ED 52 2898: 19 30 09 EB 01 F6 28 D9 28A0: 53 5F 7A D9 ED 43 1C 23 28A8: D9 57 D5 D9 C1 3A 21 23 28B0: FE 40 30 02 45 4B 04 0C 28B8: CB 3C 38 02 28 08 CB 1D 28C0: CB 3A CB 1B 18 F2 55 CB 28C8: 3D D9 C5 CD 07 28 D1 3A 28D0: 1F 23 4F FD CB 21 06 38 28D8: 08 3A 1E 23 AE B1 A0 AE 28E0: 77 D9 7D 05 C8 93 30 0A 28E8: 0D C8 82 D9 19 D9 2A 1A 28F0: 23 E9 2A 1C 23 E9 6F D9 28F8: 19 18 D8 6F D9 CB 00 30 2900: D2 2B 18 CF 6F D9 CB 08 2908: 30 C9 23 18 C6 2A A8 0E 2910: E9 CD 0D 29 38 0E 21 00 2918: 00 28 06 ED 42 F8 C8 18 2920: 03 ED 4A F0 E1 C9 CD 11 2928: 29 22 25 23 CD 11 29 E5 2930: CD 02 0C C1 ED 5B 25 23 2938: 28 0C 3D C0 21 9C 0C 22 2940: 30 40 43 C3 B2 0B // The Plot Routine: // A == the plot number N // BC == screen X // DE == screen Y 2946: B7 28 2948: F9 3D D5 C5 F5 CD 1F 2E 2950: F1 D1 C1 FE 81 20 0F ED 2958: 53 30 23 ED 43 32 23 01 2960: 00 00 50 58 3E 0B CB 57 2968: 28 09 2A 29 23 E5 2A 27 2970: 23 18 07 2A 32 23 E5 2A 2978: 30 23 B7 ED 5A D1 E8 22 2980: 23 23 EB B7 ED 4A E8 22 2988: 25 23 5F 3E C0 A4 E0 3E 2990: C0 A2 E0 D9 E5 D5 C5 CD 2998: 9F 29 C1 D1 E1 D9 C9 D9 29A0: 7C B2 37 20 05 3A 18 23 29A8: 3D BD 3A 21 23 1F 32 21 29B0: 23 7B CB 7F 28 04 2A 10 29B8: 23 E9 F5 E6 03 1F 3D 2F 29C0: 67 9F 6F 22 1E 23 E5 CB 29C8: 5B 20 28 3A 20 23 AB E6 29D0: FB 28 0F 21 34 23 7B 07 29D8: 07 07 E6 03 85 6F 7E 32 29E0: 21 40 CD 2C 28 E1 FD CB 29E8: 21 0E 38 26 7C A5 28 22 29F0: 2C 5D E5 3A 21 23 CB 6B 29F8: 20 3D CB 73 20 3E E1 CB 2A00: 7F 20 0F E5 CD 00 28 A6 2A08: 32 17 23 D1 7E B2 AB A0 2A10: AE 77 F1 32 20 23 21 2A 2A18: 23 11 2E 23 01 08 00 CB 2A20: 67 28 11 3A 21 23 E6 C0 2A28: 17 30 02 CB F7 32 21 23 2A30: 2E 26 0E 04 ED B8 C9 21 2A38: FF FF 18 03 2A 0A 23 D9 2A40: E6 E0 C2 AD 0E 21 21 23 2A48: FD 36 21 55 06 03 23 23 2A50: 5E 23 23 56 D5 10 F7 C1 2A58: D1 E1 B7 28 02 44 4D 78 2A60: BC 30 03 C5 E3 C1 7C BA 2A68: 30 01 EB 7A D9 E6 07 3C 2A70: 47 7C CB 05 07 07 07 10 2A78: F9 67 22 38 23 D9 7C B8 2A80: 3E 07 30 03 C5 E3 C1 EB 2A88: F5 79 D9 67 6F 4F 22 1A 2A90: 23 06 FE D9 93 D9 30 04 2A98: 06 00 ED 44 57 D9 7A 90 2AA0: D9 67 BA 30 02 EB 04 6C 2AA8: 2C 5C CB 3B F1 0F 30 09 2AB0: E5 D5 C5 0F D9 38 CD 18 2AB8: CE D9 60 2E 01 C1 D1 E3 2AC0: 2D 20 16 2A 1A 23 79 BC 2AC8: 38 01 67 BD 30 01 6F 22 2AD0: 1A 23 E1 2D 28 E7 E5 18 2AD8: 15 7B 92 38 0A 5F CB 40 2AE0: 28 0C 79 80 4F 18 D9 84 2AE8: 5F 3E 01 B0 81 4F 79 D9 2AF0: FD CB 21 0E 38 CA E3 D5 2AF8: C5 E5 ED 5B 1A 23 47 B9 2B00: 30 02 41 4F ED 43 1A 23 2B08: 79 BB 3C 38 01 7B 6F 7A 2B10: B8 30 02 78 3D 95 3C F5 2B18: CD 07 28 F1 4F EB 21 39 2B20: 23 7E 07 07 07 77 2B CB 2B28: 06 B6 2A 1E 23 AD 2F 6F 2B30: EB 7B AE B2 A0 AE 77 0D 2B38: 20 14 E1 24 CB 7D 28 94 2B40: E1 E1 E1 E1 7C A5 CA 12 2B48: 2A 2C E5 C3 45 2A CB 18 2B50: 30 DF 23 41 79 E6 07 4F 2B58: CB 38 CB 38 CB 38 28 08 2B60: 7B AE B2 AE 77 23 10 F8 2B68: 37 0C 18 CB 2A 13 23 2D 2B70: B5 C2 09 08 25 C2 B8 23 2B78: 3A 21 23 17 D8 00 00 2A 2B80: 28 23 3A 27 23 CB 72 20 2B88: 05 6F C6 08 30 0D 7C D6 2B90: 08 30 04 3A 18 23 3D 32 2B98: 29 23 AF 32 27 23 CB 72 2BA0: C0 CD EF 2E 7D FE F9 38 2BA8: 02 1E 02 2F E6 07 3C 57 2BB0: 7C 3C D9 57 D9 D5 CD 07 2BB8: 28 D9 79 AE D9 EB C1 C5 2BC0: 6F 26 00 29 10 FD EB 06 2BC8: 02 3A 7B 40 AE FD B6 7C 2BD0: A2 AE 0D 28 01 77 53 23 2BD8: 10 EF 0E 20 09 D9 23 15 2BE0: 28 02 10 D6 E1 C3 9A 29 2BE8: ED 57 0F 30 08 AF 32 22 2BF0: 40 3C 32 13 23 CD CF 0A 2BF8: AF 32 13 23 FD 36 22 02 // // 256-byte block patched in to ZX81 BASIC at 0C00 hex // This cleverly alters the language syntax, // adding parameters and/or pointing to new routines. // 2C00: 4F C9 CD A0 0C DA AD 0E 2C08: 0E 01 C8 0E FF C9 FD 46 2C10: 22 0E 21 CD 18 09 CD 9B 2C18: 09 7E 12 FD 34 3A 2A 0C 2C20: 40 23 54 5D ED B1 C3 5D 2C28: 0A THE SYNTAX TABLES i) The offset table There is an offset value for each of the BASIC commands and by adding this offset to the value of the address where it is found, the correct address for the command in the parameter table is obtained. // 2C29: 8B 8D 2D 7F 81 49 75 0C29 8B LPRINT 0CB4 0C2A 8D LLIST 0CBl 0C2B 2D STOP 0C58 0C2C 7F SLOW 0CAB 0C2D 81 FAST 0CAE 0C2E 49 NEW 0C77 0C2F 75 SCROLL 0CA4 // 2C30: 5F 40 42 2B 17 1F 37 52 0C30 5F CONT 0CBF 0C31 40 DIM 0C71 0C32 42 REM 0C74 0C33 2B FOR 0C5E 0C34 17 GOTO 0C4B 0C35 1F GOSUB 0C54 0C36 37 INPUT 0C6D 0C37 52 LOAD 0C89 // 2C38: 45 0F 6D 2B 44 2D 5A 3B 0C38 45 LIST 0C7D 0C39 0F LET 0C48 0C3A 6D PAUSE 0CA7 0C3B 2B NEXT 0C66 0C3C 44 POKE 0C80 0C3D 2D PRINT 0C6A Same as normal ZX81 0C3E 5A PLOT 0C98 0C3F 3B RUN 0C7A // 2C40: 4C 45 0D 52 54 4D 15 6A 0C40 4C SAVE 0C8C 0C41 45 RAND 0C86 0C42 0D IF 0C4F 0C43 52 CLS 0C95 0C44 54 UNPLOT 0C98 This byte is 5A, an offset to 0C9E, in normal ZX81 NB same address as PLOT 0Cd5 4D CLEAR 0C92 0C46 15 RETURN 0C5B 0C47 6A COPY 0CB1 ii) The parameter table. For each of the BASIC commands there are between 3 & 8 entries in the parameter table. The command classes for each of the commands are given, together with the required separators and these are followed by the address of the appropriate routine. // 2C48: 01 14 02 0C48 P-LET 01 CLASS-1 14 '=' 02 CLASS-2 // 244B: 06 00 81 0E 06 0C4B P-GOTO 06 CLASS-6 00 CLASS-0 81 0E GOTO,0EB1 // 2C50: DE 05 AB 0D 0C4F P-IF 06 CLASS-6 DE 'THEN' 05 CLASS-5 AB 0D IF,0DAB // 2c54: 06 00 B5 0E 0C54 P-GOSUB 06 CLASS-6 00 CLASS-0 B5 0E GOSUB,0EB5 // 2C58: 00 DC 0C 0C58 P-STOP 00 CLASS-0 DC 0C STOP,0CDC // 2c5B: 00 D8 0E 0C5B P-RETURN 00 CLASS-0 D8 0E RETURN,0EDB // 2c5e: 04 14 2C60: 06 DF 06 05 B9 0D 0C5E P-FOR 04 CLASS-4 1A '=' 06 CLASS-6 DF 'TO' 06 CLASS-6 05 CLASS-5 B9 0D FOR,0DB9 // 0C66: 04 00 2E 0E 0C66 P-NEXT 04 CLASS-4 00 CLASS-0 2E 0E NEXT,0E2E // 2C6A: 05 E8 2B 0C6A P-PRINT 05 CLASS-5 // CF 0A PRINT,0ACF This is the original routine E8 2B PRINT_007,2BE8 This is the new routine! // 2C6D: 01 00 E9 0E 0C6D P-INPUT 01 CLASS-1 00 CLASS-0 E9 0E INPUT,0EE9 // 2C71: 05 A7 2E 0C71 P-DIM 05 CLASS-5 // 09 14 DIM,1409 Original ZX81 replaced by A7 2E DIM_007,2EA7 new routine // 2c74: 05 6A 0D 0C74P-REM 05 CLASS-5 6A 0D REM,0D6A // 2C77: 00 C3 03 0C77 P-NEW 00 CLASS-0 C3 03 NEW-03C3 // 2C7A: 03 AF 0E 03 30 07 0C7A P-RUN 03 CLASS-3 AF 0E RUN,0EAF 0C7D P-LIST 03 CLASS-3 30 07 LIST,0730 2C80: 06 1A 06 00 92 0E 03 6C 0E 0C80 P-POKE 06 CLASS-6 1A ',' 06 CLASS-6 92 0E POKE,0E92 0C86 P-RAND 03 CLASS-3 6C 0E RAND,0E6C // 2C89: 05 40 03 0C89 P-LOAD 05 CLASS-5 40 03 LOAD,0340 // 2C8C: 05 4D 2F 0C8C P-SAVE 05 CLASS-5 // F6 02 SAVE,02F6 original 4D 2F SAVE_007,2F4D new! // 2CBF: 00 7C 0E 0C8F P-CONT 00 CLASS-0 7C 0E CONT,0E7C // 2C92: 00 B2 0E 0C92 P-CLEAR 00 CLASS-0 // 9A 14 CLEAR,l49A original B2 0E CLEAR,0E B2 new. this points outside the G007 ROM // 2C95: 03 4E 2E 0C95 P-CLS 00 CLASS-0 // 2A 0A CLS,0A2A original 4E 2E CLS_007,2E4E new! // originally the ZX81 does this: // // 0C98 P-PLOT 06 CLASS-6 // 1A ',' // 06 CLASS-6 // 00 CLASS-0 // AF // 0B PLOT/UNP.,0BAF // 0C9E P-UNPLOT 06 CLASS-6 // 1A ',' // 06 CLASS-6 // 00 CLASS-0 // AF // 0B PLOT/UNP.,0BAF // // The G007 saves bytes by having these identical parameter table entries overlapping: // 2C98: 06 1A 06 1A 06 00 26 29 0C98 P-PLOT 06 CLASS-6 1A ',' 06 CLASS-6 1A ',' 06 CLASS-6 00 CLASS-0 26 29 PLOT_UNPLOT_007,2926 new! 2CA0: 2A A8 0E E9 // 2CA4: 00 0E 0C 0CA4 P-SCROLL 00 CLASS-0 0E 0C SCROLL,0C0E // 2CA7: 06 00 AE 2E 0CA7 P-PAUSE 06 CLASS-6 00 CLASS-0 // 32 0F PAUSE,0F32 original AE 2E PAUSE_007,2EAE new! // 2CAB: 03 B2 2E // 0CAB P-SLOW 00 CLASS-0 original // 2B 0F SLOW,0F2B original 0CAB P-SLOW 00 CLASS-3 new! Extra parameter sets graphic mode B2 2E SLOW_007,2EB2 new! // 2CAE: 03 B6 2E // 0CAE P-FAST 00 CLASS-0 original // 23 0F FAST,0F23 original 0CAE P-FAST 03 CLASS-3 new! Extra parameter sets graphic mode B6 2E FAST_007,2EB6 new! // 2CB1: 03 53 2F // 0CB1 P-COPY 00 CLASS-0 // 69 // 08 COPY,0869 original // 53 2F COPY_007,2EB6 new! 0CB1 P-COPY 03 CLASS-3 new! Extra parameter sets graphic mode 53 2F COPY_007,2EB6 new! // 2CB4: 05 CB 0A 0CB4 P-LPRINT 05 CLASS-5 CB 0A LPRINT,0ACB // 2CB7: 03 2C 07 0CB7 P-LLIST 03 CLASS-3 2C 07 LLIST,072C 2CBA: FD 36 01 01 CD 73 2CC0: 0A CD 95 0A 21 00 40 36 2CC8: FF 21 2D 40 CB 6E 28 0E 2CD0: FE E3 7E C2 6F 0D CD A6 2CD8: 0D C8 CF 0C CF 08 DF 06 2CE0: 00 FE 76 C8 4F E7 79 D6 2CE8: E1 38 3B 4F 21 29 0C 09 2CF0: 4E 09 18 03 2A 30 40 7E 2CF8: 23 22 30 40 01 F4 0C C5 // end of patch // bits shifting right within a byte: // 10000000 // 01000000 // 00100000 // 00010000 // 00001000 // 00000100 // 00000010 // 00000001 2D00: 80 40 20 10 08 04 02 01 2D08: CD F7 2B C3 07 02 32 28 2D10: 40 EB 21 0A 00 39 7E 3C 2D18: E6 F0 D6 D0 4F 23 7E D6 2D20: 04 B1 4F 3A 3B 40 07 9F 2D28: A1 20 10 2A 10 40 01 DF 2D30: FF 09 CB FC 22 04 23 3E 2D38: 01 18 0E 2A 0C 40 ED 4B 2D40: 00 23 09 CB FC 22 06 23 2D48: AF 32 19 23 2B 7E EB C9 2D50: 3A 19 23 3D C2 73 2D 3E 2D58: 1E ED 47 ED 6A 2A 04 23 2D60: 01 08 01 3E FE CD B5 02 2D68: 3E 1F ED 47 3A 28 40 D6 2D70: 08 18 04 2B 3A 28 40 4F 2D78: DD E1 FD CB 3B 7E C2 9D 2D80: 02 3E FE 06 01 21 9A 2D 2D88: CD 95 2D 29 00 5F 2A 06 2D90: 23 CB FC DD E9 ED 4F 3E 2D98: DD FB 76 21 00 22 3E 24 2DA0: 36 01 35 28 02 CF 1A 23 2DA8: BC 20 F5 65 11 00 20 01 2DB0: 00 01 ED B0 24 14 04 ED 2DB8: B0 21 F1 07 11 A0 23 01 2DC0: 60 00 ED B0 16 20 21 B4 2DC8: 2F 46 18 04 5E 23 7E 12 2DD0: 23 10 F9 14 CB 52 28 F1 2DD8: C9 // Delete Display File: 2DD9: CD E7 02 21 87 3E CD 2DE0: D8 09 C0 EB 2A 29 40 CB 2DE8: 76 28 04 ED 53 29 40 2A 2DF0: 0C 40 C3 5D 0A CD D9 2D 2DF8: 01 92 19 2A 0C 40 2B CD 2E00: 9E 09 3E 76 12 13 12 23 2E08: 23 36 3E 23 36 87 23 36 2E10: 8D 23 36 19 23 77 23 77 2E18: CD 07 02 3E 01 18 37 // Check & Set Up Display File: 2E1F: 2A 2E20: 65 22 11 D9 BF 19 3A 64 2E28: 22 D6 21 B4 B5 C4 9B 2D 2E30: 2A 0C 40 3E 76 2B 2B BE 2E38: C4 F5 2D 2A 0C 40 ED 5B 2E40: 00 23 19 22 06 23 11 09 2E48: 00 19 22 08 23 C9 CD 02 2E50: 0C C0 // Clear The Screen: 2E52: 3D FA 2A 0A F5 CD 2E58: 1F 2E F1 FE 02 ED 4B 18 2E60: 23 2A 0C 40 30 30 3D 23 2E68: 22 0E 40 2B 2B 2B 1E 00 2E70: 06 10 2B 73 2B 73 2B 77 2E78: 2B 77 10 FA 0D 20 F1 06 2E80: 09 3E 01 2B 73 10 FC 21 2E88: 34 23 06 14 3D 28 F4 21 2E90: 21 18 22 39 40 C9 C0 2B 2E98: 2B 06 20 2B 2B 2B 7E 2F 2EA0: 77 10 FA 0D 20 F3 C9 2A 2EA8: 96 0A 3E 4D 18 35 3E DD 2EB0: 18 2E 3E D6 18 02 3E CE 2EB8: F5 CD 02 0C 06 1E 3D FE 2EC0: 06 30 19 CB 3F 67 28 02 2EC8: 3E 01 F5 9F 6F CB 8C 25 2ED0: 22 7B 40 CD 1F 2E 06 1F 2ED8: F1 32 14 23 78 ED 47 F1 2EE0: 2A 71 0D 85 6F E9 57 3A 2EE8: 39 40 E6 80 C3 6C 2B 7A 2EF0: D1 D9 E5 D5 C5 2A 0C 23 2EF8: 87 30 0B 2A 0E 23 CB 77 2F00: 28 04 2A 15 23 3F EB 6F 2F08: 26 00 9F 4F 3A 7B 40 2F 2F10: FD A6 7C A9 4F 29 29 19 2F18: 06 08 D9 D5 C9 FD 35 39 2F20: 3E 18 90 47 87 87 87 6F 2F28: 3A 18 23 95 D8 3E 21 91 2F30: 4F 26 00 29 09 ED 4B 08 2F38: 23 09 CD EF 2E 01 22 00 2F40: D9 79 AE D9 77 09 D9 23 2F48: 10 F7 C3 9A 29 CD D9 2D 2F50: C3 F6 02 CD 02 0C C0 3D 2F58: FA 69 08 CD 1F 2E CD E7 2F60: 02 3A 18 23 47 2A 08 23 2F68: AF 5F D3 FB 3E 7F DB FE 2F70: 0F D2 86 08 DB FB 87 FA 2F78: AD 2F 30 F0 0E 20 C5 4E 2F80: 06 08 CB 01 1F B3 57 DB 2F88: FB 1F 30 FB 7A D3 FB 10 2F90: F1 23 C1 0D 20 E8 23 23 2F98: 3E 03 B8 38 02 5F 1D DB 2FA0: FB 1F 30 FB 7B D3 FB 10 2FA8: C3 3E 04 D3 FB C3 07 02 2FB0: FB 10 C3 3E 0A 12 A0 13 2FB8: 23 15 A4 16 23 40 C1 60 2FC0: 08 61 2D 75 06 76 23 01 2FC8: 0A 54 02 85 C1 7F 73 80 2FD0: 2D 8D 50 8E 2D E3 C3 E4 2FD8: 0E E5 2D 13 00 75 01 E6 2FE0: 0A 55 0D 1E 0F 1E 16 20 2FE8: 10 07 11 08 18 C0 35 EE 2FF0: 36 55 37 C6 AD E6 AE 2E 2FF8: F2 C3 F3 1D F4 2F ED 00