Files
Z8C-Homebrew-Computer/OperatingSystem/cpm/zout/test.lst
Dennis Gunia d18e8e9e69 pushed updates
2024-06-24 09:21:16 +02:00

6500 lines
393 KiB
Plaintext

1: .include "extern_symbols.s" ;include monitor symbols.
**** include/extern_symbols.s ****
1: ;This file is generated by the build script.
2: ;Do not make any changes here!
3:
4: - 00D0 ADDR_RTC equ 0xD0
5: - 017F A_RTS_OFF equ 0x17F
6: - 0188 A_RTS_ON equ 0x188
7: - 0050 BOOT_PHASE0 equ 0x50
8: - 006E BOOT_PHASE1 equ 0x6E
9: - 0077 BOOT_PHASE1_LOOP equ 0x77
10: - 0089 BOOT_PHASE2 equ 0x89
11: - 1915 COMMAND equ 0x1915
12: - 1956 COMMAND_BACKSPACE equ 0x1956
13: - 1883 COMMAND_LUT equ 0x1883
14: - 197C COMMAND_PROCESS equ 0x197C
15: - 19B7 COMMAND_PROCESS_FOUND equ 0x19B7
16: - 197F COMMAND_PROCESS_LOOP equ 0x197F
17: - 1988 COMMAND_PROCESS_LOOP_STR1 equ 0x1988
18: - 199E COMMAND_PROCESS_LOOP_STR2 equ 0x199E
19: - 19A3 COMMAND_PROCESS_NEXT_ENTRY equ 0x19A3
20: - 19A2 COMMAND_PROCESS_NEXT_ENTRYI equ 0x19A2
21: - 19AE COMMAND_PROCESS_NOT_FOUND equ 0x19AE
22: - 1927 COMMAND_READ equ 0x1927
23: - 00A5 CONSOLE_INIT equ 0xA5
24: - 00A5 CONSOLE_INIT_CTC equ 0xA5
25: - 00AD CONSOLE_INIT_SIO equ 0xAD
26: - 00F9 CS_APU_CTRL equ 0xF9
27: - 00F8 CS_APU_DATA equ 0xF8
28: - 0000 CS_BANK equ 0x00
29: - 0004 CS_CTC_0 equ 0x04
30: - 0005 CS_CTC_1 equ 0x05
31: - 0006 CS_CTC_2 equ 0x06
32: - 0007 CS_CTC_3 equ 0x07
33: - 0001 CS_DIP equ 0x01
34: - 0033 CS_PIA_CR equ 0x33
35: - 0030 CS_PIA_PA equ 0x30
36: - 0031 CS_PIA_PB equ 0x31
37: - 0032 CS_PIA_PC equ 0x32
38: - 00F6 CS_PIO_AC equ 0xF6
39: - 00F4 CS_PIO_AD equ 0xF4
40: - 00F7 CS_PIO_BC equ 0xF7
41: - 00F5 CS_PIO_BD equ 0xF5
42: - 0009 CS_SIO_A_C equ 0x09
43: - 0008 CS_SIO_A_D equ 0x08
44: - 000B CS_SIO_B_C equ 0x0B
45: - 000A CS_SIO_B_D equ 0x0A
46: - 01F6 DHEX_TO_BYTE equ 0x1F6
47: - 0212 DHEX_TO_BYTE_FAILED equ 0x212
48: - 19CD ERR_SYNTAX equ 0x19CD
49: - 0D96 EXEC_RST_08 equ 0xD96
50: - 0D9A EXEC_RST_10 equ 0xD9A
51: - 0DA6 EXEC_RST_18 equ 0xDA6
52: - 0216 HEX_TO_BIN equ 0x216
53: - 0224 HEX_TO_BIN_2 equ 0x224
54: - 022B HEX_TO_INVALID_2 equ 0x22B
55: - 00EC IDE_CMD_IDENT equ 0xEC
56: - 0020 IDE_CMD_READSEC equ 0x20
57: - 12FA IDE_DEV_TABLE equ 0x12FA
58: - 0040 IDE_RD equ 0x40
59: - 0016 IDE_REG_ALTSTS equ 0x16
60: - 000F IDE_REG_CMDSTS equ 0x0F
61: - 0008 IDE_REG_DATA equ 0x08
62: - 0017 IDE_REG_DRVADDR equ 0x17
63: - 0009 IDE_REG_ERROR equ 0x09
64: - 000D IDE_REG_HCYL equ 0x0D
65: - 000E IDE_REG_HEAD equ 0x0E
66: - 000B IDE_REG_LBA0 equ 0x0B
67: - 000C IDE_REG_LBA1 equ 0x0C
68: - 000D IDE_REG_LBA2 equ 0x0D
69: - 000E IDE_REG_LBA3 equ 0x0E
70: - 000C IDE_REG_LCYL equ 0x0C
71: - 000A IDE_REG_SECTOR equ 0x0A
72: - 000B IDE_REG_SSECTOR equ 0x0B
73: - 0080 IDE_RST equ 0x80
74: - 0020 IDE_WR equ 0x20
75: - 0001 IIC_CLK equ 0x01
76: - 0002 IIC_DATA equ 0x02
77: - 001B INT_VEC equ 0x1B
78: - 0040 IO_AY0_ADDR equ 0x40
79: - 0041 IO_AY0_DATA equ 0x41
80: - 0042 IO_AY1_ADDR equ 0x42
81: - 0043 IO_AY1_DATA equ 0x43
82: - 0020 IO_REG0 equ 0x20
83: - 0025 IO_RTC_AMPM equ 0x25
84: - 002D IO_RTC_CTR_D equ 0x2D
85: - 002E IO_RTC_CTR_E equ 0x2E
86: - 002F IO_RTC_CTR_F equ 0x2F
87: - 0026 IO_RTC_DAY0 equ 0x26
88: - 0027 IO_RTC_DAY1 equ 0x27
89: - 0024 IO_RTC_HOUR equ 0x24
90: - 0022 IO_RTC_MIN0 equ 0x22
91: - 0023 IO_RTC_MIN1 equ 0x23
92: - 0028 IO_RTC_MON0 equ 0x28
93: - 0029 IO_RTC_MON1 equ 0x29
94: - 0020 IO_RTC_SEC0 equ 0x20
95: - 0021 IO_RTC_SEC1 equ 0x21
96: - 002C IO_RTC_WEEK equ 0x2C
97: - 002B IO_RTC_YEAR1 equ 0x2B
98: - 002A IO_RTC_YERR0 equ 0x2A
99: - 43B8 MEM_FAT_AMOUNT equ 0x43B8
100: - 43BB MEM_FAT_CLUSTERLEN equ 0x43BB
101: - 43BC MEM_FAT_COUNT1 equ 0x43BC
102: - 43DF MEM_FAT_CURDIR equ 0x43DF
103: - 443F MEM_FAT_CURRDIR equ 0x443F
104: - 43C1 MEM_FAT_DATASTART equ 0x43C1
105: - 43CD MEM_FAT_DIRSEC equ 0x43CD
106: - 4445 MEM_FAT_EXEC_COUNT equ 0x4445
107: - 4443 MEM_FAT_EXEC_CURR equ 0x4443
108: - 4447 MEM_FAT_EXEC_START equ 0x4447
109: - 43C9 MEM_FAT_FILEREMAIN equ 0x43C9
110: - 442F MEM_FAT_OF0_ATTRIBUTE equ 0x442F
111: - 4431 MEM_FAT_OF0_CCLUST equ 0x4431
112: - 443B MEM_FAT_OF0_DATREM equ 0x443B
113: - 4437 MEM_FAT_OF0_DATSEC equ 0x4437
114: - 4433 MEM_FAT_OF0_FATSEC equ 0x4433
115: - 43B6 MEM_FAT_RESERVED equ 0x43B6
116: - 43C5 MEM_FAT_ROOTSTART equ 0x43C5
117: - 43B9 MEM_FAT_SECTORS equ 0x43B9
118: - 43CF MEM_FAT_TMPFNAME equ 0x43CF
119: - 43BD MEM_FAT_TMPPOINTER equ 0x43BD
120: - 41B6 MEM_IDE_BUFFER equ 0x41B6
121: - 40CB MEM_IDE_DEVICE equ 0x40CB
122: - 40D5 MEM_IDE_DEV_TABLE equ 0x40D5
123: - 43B6 MEM_IDE_FSBUFFER equ 0x43B6
124: - 40CD MEM_IDE_PARTITION equ 0x40CD
125: - 40D1 MEM_IDE_POINTER equ 0x40D1
126: - 4115 MEM_IDE_SELECTED equ 0x4115
127: - 40CC MEM_IDE_STATUS equ 0x40CC
128: - 4116 MEM_IDE_STRING_0 equ 0x4116
129: - 413E MEM_IDE_STRING_1 equ 0x413E
130: - 4166 MEM_IDE_STRING_2 equ 0x4166
131: - 418E MEM_IDE_STRING_3 equ 0x418E
132: - 0177 MSG_CLEAR equ 0x177
133: - 19C6 NOT_IMPLEMENTED equ 0x19C6
134: - 1A28 OP_CALL equ 0x1A28
135: - 1DF8 OP_CD equ 0x1DF8
136: - 1BBC OP_CLR equ 0x1BBC
137: - 1AA9 OP_DASM equ 0x1AA9
138: - 1DF4 OP_DIR equ 0x1DF4
139: - 1A48 OP_DUMP equ 0x1A48
140: - 1A0F OP_EXEC equ 0x1A0F
141: - 1E15 OP_FSEXEC equ 0x1E15
142: - 1B70 OP_IIC_IN equ 0x1B70
143: - 1B10 OP_IIC_OUT equ 0x1B10
144: - 1AD9 OP_IO_IN equ 0x1AD9
145: - 1AEF OP_IO_OUT equ 0x1AEF
146: - 1DD1 OP_LSDSK equ 0x1DD1
147: - 1BC0 OP_RTIME equ 0x1BC0
148: - 1DD5 OP_SELDSK equ 0x1DD5
149: - 1A78 OP_SET equ 0x1A78
150: - 1D58 OP_STIME equ 0x1D58
151: - 1E4E POST_CHECK_APU equ 0x1E4E
152: - 1E79 POST_CHECK_IDE_30 equ 0x1E79
153: - 1E8C POST_CHECK_IDE_40 equ 0x1E8C
154: - 1E29 POST_CHECK_PIO equ 0x1E29
155: - 1E19 POST_START equ 0x1E19
156: - 1EA6 POST_TEST_RTC equ 0x1EA6
157: - 4110 PRG_RAM_START equ 0x4110
158: - FF00 PRG_RAM_TOP equ 0xFF00
159: - 0191 PRINTINLINE equ 0x191
160: - 4000 PROG_MEM_START equ 0x4000
161: - 0100 PROG_ROM_START equ 0x100
162: - 0000 RST_00 equ 0x00
163: - 0008 RST_08 equ 0x08
164: - 0010 RST_10 equ 0x10
165: - 0018 RST_18 equ 0x18
166: - FFFF STACK_RAM_TOP equ 0xFFFF
167: - 0000 START_ROM equ 0x00
168: - 022D STRCONV_BYTES_TO_HEX equ 0x22D
169: - 023C STRCONV_BYTES_TO_HEX_1 equ 0x23C
170: - 0246 STRCONV_BYTES_TO_HEX_2 equ 0x246
171: - 264F STR_Banner_Start equ 0x264F
172: - 183C STR_PD_HEADER equ 0x183C
173: - 4010 SYS_BUF_START equ 0x4010
174: - 4000 SYS_RAM_START equ 0x4000
175: - 0018 VAR_CONSOLE_BAUD equ 0x18
176: - 000F VAR_CONSOLE_CONF equ 0x0F
177: - 0080 VDP_MEM equ 0x80
178: - 0081 VDP_REG equ 0x81
179: - 19C5 _COMMAND_PROCESS_FOUND equ 0x19C5
180: - 1A47 _OP_CALL equ 0x1A47
181: - 1B55 _OP_IIC_ACK_ERR equ 0x1B55
182: - 1B5C _OP_IIC_ACK_ERR_str equ 0x1B5C
183: - 1BA2 _OP_IIC_IN_LOOP equ 0x1BA2
184: - 1BAF _OP_IIC_IN_LOOP_TEXT equ 0x1BAF
185: - 1B26 _OP_IIC_OUT_LOOP equ 0x1B26
186: - 1B42 _OP_IIC_OUT_SEND equ 0x1B42
187: - 1BC3 _OP_RTIME_NN equ 0x1BC3
188: - 1C7B _OP_RTIME_RD_CMD equ 0x1C7B
189: - 1DE4 _OP_SELDSK_INVALID equ 0x1DE4
190: - 1DFC _OP_SELDSK_INVALID_STR equ 0x1DFC
191: - 1A90 _OP_SET_LOOP equ 0x1A90
192: - 1D1E _OP_STIME_INVALID equ 0x1D1E
193: - 1D35 _OP_STIME_PROMPT equ 0x1D35
194: - 1D4D _OP_STIME_PROMPT_ERR equ 0x1D4D
195: - 1C7C _OP_STIME_STR_DAY equ 0x1C7C
196: - 1CCD _OP_STIME_STR_HOUR equ 0x1CCD
197: - 1CE8 _OP_STIME_STR_MIN equ 0x1CE8
198: - 1C97 _OP_STIME_STR_MON equ 0x1C97
199: - 1D03 _OP_STIME_STR_SEC equ 0x1D03
200: - 1CB2 _OP_STIME_STR_YEAR equ 0x1CB2
201: - 1E6D _POST_CHECK_APU_FAILED equ 0x1E6D
202: - 1E9F _POST_CHECK_IDE_FAILED equ 0x1E9F
203: - 1E42 _POST_CHECK_PIO_FAILED equ 0x1E42
204: - 1EE0 _POST_TEST_RTC_INVALID equ 0x1EE0
205: - 1ED9 _POST_TEST_RTC_NOTFOUND equ 0x1ED9
206: - 19E8 _STR_NOT_FOUND equ 0x19E8
207: - 19D4 _STR_NOT_IMPLEMENTED equ 0x19D4
208: - 19FC _STR_SYNTAX equ 0x19FC
209: - 0DC2 _beep_pause_l1 equ 0xDC2
210: - 2313 _compare_filename_loop equ 0x2313
211: - 2321 _compare_filename_nomatch equ 0x2321
212: - 24C4 _fat_cd_navigate equ 0x24C4
213: - 250A _fat_cd_navigate_end equ 0x250A
214: - 2532 _fat_cd_navigate_errfile equ 0x2532
215: - 2564 _fat_cd_navigate_errfile_str equ 0x2564
216: - 251C _fat_cd_navigate_error equ 0x251C
217: - 253A _fat_cd_navigate_error_str equ 0x253A
218: - 24C9 _fat_cd_navigate_findsec equ 0x24C9
219: - 24F5 _fat_cd_navigate_findsec_skipslash equ 0x24F5
220: - 2480 _fat_cd_navigate_goback_fl equ 0x2480
221: - 252A _fat_cd_navigate_inerror equ 0x252A
222: - 2524 _fat_cd_navigate_inerrorS equ 0x2524
223: - 252B _fat_cd_navigate_inerrore equ 0x252B
224: - 2551 _fat_cd_navigate_inputerr_str equ 0x2551
225: - 24FB _fat_cd_navigate_l2 equ 0x24FB
226: - 262B _fat_exec_notexec equ 0x262B
227: - 2612 _fat_exec_notfound equ 0x2612
228: - 25FA _fat_exec_read_done equ 0x25FA
229: - 25DC _fat_exec_readloop1 equ 0x25DC
230: - 210B _fat_get_root_table_invalid equ 0x210B
231: - 214A _fat_getfatsec_notroot equ 0x214A
232: - 2299 _fat_increment_32 equ 0x2299
233: - 2211 _fat_lfs_loop equ 0x2211
234: - 224B _fat_lfs_loop_compare_end equ 0x224B
235: - 224F _fat_lfs_loop_compare_match equ 0x224F
236: - 2223 _fat_lfs_loop_compare_next_sector equ 0x2223
237: - 22AD _fat_math_add32 equ 0x22AD
238: - 22DE _fat_math_mul32 equ 0x22DE
239: - 22E5 _fat_math_mul32_l equ 0x22E5
240: - 22F2 _fat_math_mul32_noadd equ 0x22F2
241: - 2285 _fat_math_sector_add_16 equ 0x2285
242: - 2401 _fat_print_directory_dir equ 0x2401
243: - 2394 _fat_print_directory_loop equ 0x2394
244: - 245E _fat_print_directory_loop_break equ 0x245E
245: - 23B0 _fat_print_directory_loop_file equ 0x23B0
246: - 242C _fat_print_directory_loop_next equ 0x242C
247: - 2437 _fat_print_directory_loop_next_sector equ 0x2437
248: - 232A _format_filename_fat16_clean equ 0x232A
249: - 2331 _format_filename_fat16_loop equ 0x2331
250: - 2344 _format_filename_fat16_loop_copy equ 0x2344
251: - 233B _format_filename_fat16_loop_skip_8 equ 0x233B
252: - 15AB _ideif_drv_sel_fail equ 0x15AB
253: - 1668 _ideif_drv_sel_fstr0 equ 0x1668
254: - 165F _ideif_drv_sel_pstr equ 0x165F
255: - 1676 _ideif_drv_sel_sstr0 equ 0x1676
256: - 1683 _ideif_drv_sel_syn equ 0x1683
257: - 146E _ideif_init_drive_found equ 0x146E
258: - 1456 _ideif_init_drive_loop equ 0x1456
259: - 1469 _ideif_init_drive_nodrv equ 0x1469
260: - 14D9 _ideif_init_drive_prt_fnd equ 0x14D9
261: - 14C7 _ideif_init_drive_prt_l1 equ 0x14C7
262: - 14D1 _ideif_init_drive_prt_ln equ 0x14D1
263: - 15EB _ideif_prnt_devtable_hdr equ 0x15EB
264: - 1366 _ideif_prnt_devtable_l1 equ 0x1366
265: - 142C _ideif_prnt_devtable_l1_e2 equ 0x142C
266: - 13AB _ideif_prnt_devtable_l1_es equ 0x13AB
267: - 1429 _ideif_prnt_devtable_l1_ms equ 0x1429
268: - 1373 _ideif_prnt_devtable_l1_nxt equ 0x1373
269: - 1399 _ideif_prnt_devtable_l1_s00 equ 0x1399
270: - 139E _ideif_prnt_devtable_l1_s01 equ 0x139E
271: - 13A3 _ideif_prnt_devtable_l1_s02 equ 0x13A3
272: - 13A8 _ideif_prnt_devtable_l1_sFF equ 0x13A8
273: - 1371 _ideif_prnt_devtable_l1_sel equ 0x1371
274: - 164F _ideif_prnt_devtable_master equ 0x164F
275: - 1623 _ideif_prnt_devtable_s00 equ 0x1623
276: - 162E _ideif_prnt_devtable_s01 equ 0x162E
277: - 1639 _ideif_prnt_devtable_s02 equ 0x1639
278: - 1644 _ideif_prnt_devtable_sFF equ 0x1644
279: - 1657 _ideif_prnt_devtable_slave equ 0x1657
280: - 014E _read_bcd_invalid equ 0x14E
281: - 1DCC _shift4 equ 0x1DCC
282: - 0DA9 beep equ 0xDA9
283: - 0DAB beep_loop equ 0xDAB
284: - 0DC1 beep_pause equ 0xDC1
285: - 230F compare_filename equ 0x230F
286: - 09AE dasm_00 equ 0x9AE
287: - 0C9A dasm_01 equ 0xC9A
288: - 0A34 dasm_02 equ 0xA34
289: - 0C6C dasm_03 equ 0xC6C
290: - 0AB1 dasm_08 equ 0xAB1
291: - 0C3F dasm_09 equ 0xC3F
292: - 0A16 dasm_0A equ 0xA16
293: - 0C83 dasm_0B equ 0xC83
294: - 09F6 dasm_10 equ 0x9F6
295: - 0A3F dasm_12 equ 0xA3F
296: - 09B9 dasm_18 equ 0x9B9
297: - 0A20 dasm_1A equ 0xA20
298: - 09D3 dasm_20 equ 0x9D3
299: - 0CE0 dasm_22 equ 0xCE0
300: - 0A79 dasm_27 equ 0xA79
301: - 09CC dasm_28 equ 0x9CC
302: - 0CB1 dasm_2A equ 0xCB1
303: - 0A7D dasm_2F equ 0xA7D
304: - 09C4 dasm_30 equ 0x9C4
305: - 0A4A dasm_32 equ 0xA4A
306: - 0A89 dasm_37 equ 0xA89
307: - 09BD dasm_38 equ 0x9BD
308: - 0A2A dasm_3A equ 0xA2A
309: - 0A85 dasm_3F equ 0xA85
310: - 0A8D dasm_76 equ 0xA8D
311: - 0B0A dasm_80C6 equ 0xB0A
312: - 0AA7 dasm_BE equ 0xAA7
313: - 09B2 dasm_C3 equ 0x9B2
314: - 0B30 dasm_C88E equ 0xB30
315: - 0A02 dasm_C9 equ 0xA02
316: - 09FC dasm_CD equ 0x9FC
317: - 0ABE dasm_D9 equ 0xABE
318: - 09E4 dasm_DD equ 0x9E4
319: - 0CA1 dasm_DD_01 equ 0xCA1
320: - 0C5A dasm_DD_09 equ 0xC5A
321: - 0CF6 dasm_DD_22 equ 0xCF6
322: - 0C71 dasm_DD_23 equ 0xC71
323: - 0CC8 dasm_DD_2A equ 0xCC8
324: - 0C88 dasm_DD_2B equ 0xC88
325: - 0C0A dasm_DD_34 equ 0xC0A
326: - 0C27 dasm_DD_35 equ 0xC27
327: - 0B12 dasm_DD_86 equ 0xB12
328: - 0B38 dasm_DD_8E equ 0xB38
329: - 0B5B dasm_DD_96 equ 0xB5B
330: - 0B7B dasm_DD_9E equ 0xB7B
331: - 0B9C dasm_DD_A6 equ 0xB9C
332: - 0BD3 dasm_DD_AE equ 0xBD3
333: - 0BB8 dasm_DD_B6 equ 0xBB8
334: - 0BEF dasm_DD_BE equ 0xBEF
335: - 0D48 dasm_DD_E1 equ 0xD48
336: - 0ACE dasm_DD_E3 equ 0xACE
337: - 0D32 dasm_DD_E5 equ 0xD32
338: - 0D18 dasm_DD_F9 equ 0xD18
339: - 0D42 dasm_E1 equ 0xD42
340: - 0AC2 dasm_E3 equ 0xAC2
341: - 0D2C dasm_E5 equ 0xD2C
342: - 09DB dasm_E9 equ 0x9DB
343: - 0C51 dasm_ED_42 equ 0xC51
344: - 0CEC dasm_ED_43 equ 0xCEC
345: - 0A81 dasm_ED_44 equ 0xA81
346: - 0A0C dasm_ED_45 equ 0xA0C
347: - 0A98 dasm_ED_46 equ 0xA98
348: - 0C48 dasm_ED_4A equ 0xC48
349: - 0CBD dasm_ED_4B equ 0xCBD
350: - 0A07 dasm_ED_4D equ 0xA07
351: - 0A9D dasm_ED_56 equ 0xA9D
352: - 0AA2 dasm_ED_5E equ 0xAA2
353: - 0AE6 dasm_ED_A0 equ 0xAE6
354: - 0AF8 dasm_ED_A1 equ 0xAF8
355: - 0AEF dasm_ED_A8 equ 0xAEF
356: - 0B01 dasm_ED_A9 equ 0xB01
357: - 0AEA dasm_ED_B0 equ 0xAEA
358: - 0AFC dasm_ED_B1 equ 0xAFC
359: - 0AF3 dasm_ED_B8 equ 0xAF3
360: - 0B05 dasm_ED_B9 equ 0xB05
361: - 0A92 dasm_F3 equ 0xA92
362: - 0D0E dasm_F9 equ 0xD0E
363: - 0A95 dasm_FB equ 0xA95
364: - 09ED dasm_FD equ 0x9ED
365: - 0CA9 dasm_FD_01 equ 0xCA9
366: - 0C63 dasm_FD_09 equ 0xC63
367: - 0D02 dasm_FD_22 equ 0xD02
368: - 0C7A dasm_FD_23 equ 0xC7A
369: - 0CD4 dasm_FD_2A equ 0xCD4
370: - 0C91 dasm_FD_2B equ 0xC91
371: - 0C16 dasm_FD_34 equ 0xC16
372: - 0C33 dasm_FD_35 equ 0xC33
373: - 0B21 dasm_FD_86 equ 0xB21
374: - 0B47 dasm_FD_8E equ 0xB47
375: - 0B67 dasm_FD_96 equ 0xB67
376: - 0B89 dasm_FD_9E equ 0xB89
377: - 0BA8 dasm_FD_A6 equ 0xBA8
378: - 0BDF dasm_FD_AE equ 0xBDF
379: - 0BC3 dasm_FD_B6 equ 0xBC3
380: - 0BFA dasm_FD_BE equ 0xBFA
381: - 0D50 dasm_FD_E1 equ 0xD50
382: - 0ADA dasm_FD_E3 equ 0xADA
383: - 0D3A dasm_FD_E5 equ 0xD3A
384: - 0D22 dasm_FD_F9 equ 0xD22
385: - 0A11 dasm_FF equ 0xA11
386: - 0D58 dasm_UU equ 0xD58
387: - 0D5C dasm_UW equ 0xD5C
388: - 0B97 dasm__AND equ 0xB97
389: - 0BEB dasm__CP equ 0xBEB
390: - 0C22 dasm__DEC equ 0xC22
391: - 0A69 dasm__ED_47 equ 0xA69
392: - 0A71 dasm__ED_4F equ 0xA71
393: - 0A59 dasm__ED_57 equ 0xA59
394: - 0A61 dasm__ED_5F equ 0xA61
395: - 0C05 dasm__INC equ 0xC05
396: - 0A55 dasm__LD equ 0xA55
397: - 0BB4 dasm__OR equ 0xBB4
398: - 0B73 dasm__SBC equ 0xB73
399: - 0B56 dasm__SUB equ 0xB56
400: - 0BCE dasm__XOR equ 0xBCE
401: - 0556 dasm_opcode_table equ 0x556
402: - 0383 dasm_print16hex_addr equ 0x383
403: - 039B dasm_print8hex equ 0x39B
404: - 0D61 dasm_printFlags_table equ 0xD61
405: - 0D71 dasm_printRegister8_table equ 0xD71
406: - 0D91 dasm_printRegister8_table_HL equ 0xD91
407: - 0D79 dasm_printRegisterIX_table equ 0xD79
408: - 0D81 dasm_printRegisterIY_table equ 0xD81
409: - 0D89 dasm_printRegisterSP_table equ 0xD89
410: - 0247 disassemble equ 0x247
411: - 032D disassemble_continue equ 0x32D
412: - 031D disassemble_err equ 0x31D
413: - 024B disassemble_next equ 0x24B
414: - 031A disassemble_print_opcode_params_end equ 0x31A
415: - 02C6 disassemble_print_opcode_params_loop equ 0x2C6
416: - 0288 disassemble_print_opcode_raw equ 0x288
417: - 029C disassemble_print_opcode_raw_fill equ 0x29C
418: - 035F disassemble_table_first_match equ 0x35F
419: - 0379 disassemble_table_found equ 0x379
420: - 037D disassemble_table_notfound equ 0x37D
421: - 033B disassemble_table_seek equ 0x33B
422: - 033F disassemble_table_seek_loop equ 0x33F
423: - 17E1 dump_pretty equ 0x17E1
424: - 180B dump_pretty_ascii equ 0x180B
425: - 1829 dump_pretty_ascii_cont equ 0x1829
426: - 1813 dump_pretty_ascii_loop equ 0x1813
427: - 1824 dump_pretty_ascii_none equ 0x1824
428: - 17FE dump_pretty_col equ 0x17FE
429: - 183B dump_pretty_end equ 0x183B
430: - 182F dump_pretty_nextrow equ 0x182F
431: - 17E9 dump_pretty_row equ 0x17E9
432: - 019F endPrint equ 0x19F
433: - 2460 fat_cd_single equ 0x2460
434: - 2306 fat_copy_lba_pointer equ 0x2306
435: - 257B fat_exec equ 0x257B
436: - 203E fat_get_root_table equ 0x203E
437: - 2133 fat_getfatsec equ 0x2133
438: - 21E4 fat_openfile equ 0x21E4
439: - 21EC fat_openfile_noprepare equ 0x21EC
440: - 234B fat_print_directory equ 0x234B
441: - 21B9 fat_readfilesec equ 0x21B9
442: - 22F7 fat_reset_pointer equ 0x22F7
443: - 2325 format_filename_fat16 equ 0x2325
444: - 0E89 ide_printerror equ 0xE89
445: - 0E15 ide_readsector_256 equ 0xE15
446: - 0E17 ide_readsector_256_waitloop equ 0xE17
447: - 0E3E ide_readsector_512_inv equ 0xE3E
448: - 0E43 ide_readsector_512_inv_waitloop equ 0xE43
449: - 0E73 ide_readsector_timeout equ 0xE73
450: - 0DF7 ide_regread_8 equ 0xDF7
451: - 0DDB ide_regwrite_8 equ 0xDDB
452: - 0DCE ide_reset equ 0xDCE
453: - 0E88 ide_writesector_256 equ 0xE88
454: - 1573 ideif_drv_sel equ 0x1573
455: - 151C ideif_get_drv_pointer equ 0x151C
456: - 1530 ideif_init_all equ 0x1530
457: - 133A ideif_init_devtable equ 0x133A
458: - 144D ideif_init_drive equ 0x144D
459: - 1358 ideif_prnt_devtable equ 0x1358
460: - 16F5 iic_init equ 0x16F5
461: - 1734 iic_read_ack equ 0x1734
462: - 16C6 iic_receive_buffer equ 0x16C6
463: - 16E9 iic_receive_buffer_done equ 0x16E9
464: - 16EF iic_receive_buffer_err equ 0x16EF
465: - 16D7 iic_receive_buffer_loop equ 0x16D7
466: - 17BA iic_receive_byte equ 0x17BA
467: - 17C7 iic_receive_byte_loop equ 0x17C7
468: - 175A iic_send_ack equ 0x175A
469: - 169C iic_send_buffer equ 0x169C
470: - 16BA iic_send_buffer_done equ 0x16BA
471: - 16C0 iic_send_buffer_err equ 0x16C0
472: - 16AC iic_send_buffer_loop equ 0x16AC
473: - 1794 iic_send_byte equ 0x1794
474: - 17A0 iic_send_byte_loop equ 0x17A0
475: - 1713 iic_send_ebit equ 0x1713
476: - 1777 iic_send_nack equ 0x1777
477: - 16FE iic_send_sbit equ 0x16FE
478: - 0044 mon_var_template equ 0x44
479: - 040F mon_var_template_end equ 0x40F
480: - 0194 nxtILC equ 0x194
481: - 03A9 param_01 equ 0x3A9
482: - 03D0 param_02 equ 0x3D0
483: - 03ED param_03 equ 0x3ED
484: - 0425 param_03_done equ 0x425
485: - 040E param_03_neg equ 0x40E
486: - 0429 param_04 equ 0x429
487: - 0439 param_04_i equ 0x439
488: - 043F param_05 equ 0x43F
489: - 044C param_06 equ 0x44C
490: - 0466 param_07 equ 0x466
491: - 0473 param_08 equ 0x473
492: - 0488 param_09 equ 0x488
493: - 048E param_09_0A equ 0x48E
494: - 047F param_0A equ 0x47F
495: - 049D param_10 equ 0x49D
496: - 04AD param_11 equ 0x4AD
497: - 04BC param_11_12 equ 0x4BC
498: - 04DC param_11_12_all equ 0x4DC
499: - 04CF param_11_12_def equ 0x4CF
500: - 04D4 param_11_12_ix equ 0x4D4
501: - 04D9 param_11_12_iy equ 0x4D9
502: - 04B5 param_12 equ 0x4B5
503: - 04ED param_13 equ 0x4ED
504: - 050C param_80 equ 0x50C
505: - 0513 param_80_seek equ 0x513
506: - 0503 param_81 equ 0x503
507: - 0547 param_comma equ 0x547
508: - 0522 param_printRegister equ 0x522
509: - 0540 param_printRegisterA equ 0x540
510: - 0538 param_printRegisterHL equ 0x538
511: - 016A print_16_hex equ 0x16A
512: - 0151 print_32_hex equ 0x151
513: - 010E print_a_hex equ 0x10E
514: - 0120 print_bcd equ 0x120
515: - 00DE print_char equ 0xDE
516: - 00F1 print_clear equ 0xF1
517: - 00F8 print_newLine equ 0xF8
518: - 01A4 print_reg equ 0x1A4
519: - 00E6 print_str equ 0xE6
520: - 00F0 print_str_end equ 0xF0
521: - 187B print_str_fixed equ 0x187B
522: - 0103 print_wait_out equ 0x103
523: - 0138 read_bcd equ 0x138
524: - 0126 read_char equ 0x126
525: - 1543 read_lba_sector equ 0x1543
526: - 15E3 str_dev_done equ 0x15E3
527: - 15CB str_dev_waitready equ 0x15CB
528: - 0EBC str_error_start equ 0xEBC
529: - 0ED9 str_error_start1 equ 0xED9
530: - 0EE2 str_error_start2 equ 0xEE2
531: - 0EEB str_error_time equ 0xEEB
532: - 1F38 str_post_apu equ 0x1F38
533: - 1EE7 str_post_ide_30 equ 0x1EE7
534: - 1F02 str_post_ide_40 equ 0x1F02
535: - 1F6E str_post_nd equ 0x1F6E
536: - 1FA6 str_post_ok equ 0x1FA6
537: - 1F1D str_post_pio equ 0x1F1D
538: - 1F53 str_post_rtc equ 0x1F53
539: - 1F7C str_post_rtc_iv equ 0x1F7C
540: - 400A var_apu_present equ 0x400A
541: - 4000 var_buffer_len equ 0x4000
542: - 411A var_bytes_count equ 0x411A
543: - 4006 var_curserchar equ 0x4006
544: - 4007 var_curserlastaddr equ 0x4007
545: - 4005 var_curseron equ 0x4005
546: - 4004 var_curserstate equ 0x4004
547: - 4002 var_curserx equ 0x4002
548: - 4003 var_cursery equ 0x4003
549: - 402B var_dir equ 0x402B
550: - 40CB var_idebuffer equ 0x40CB
551: - 407B var_input equ 0x407B
552: - 4001 var_last_char equ 0x4001
553: - 4114 var_opcode equ 0x4114
554: - 4116 var_opcode_length equ 0x4116
555: - 4119 var_opcode_pcount equ 0x4119
556: - 4110 var_opcode_start equ 0x4110
557: - 4117 var_opcode_string equ 0x4117
558: - 4112 var_opcode_table equ 0x4112
559: - 4115 var_opcode_x equ 0x4115
560: - 4009 var_pio_present equ 0x4009
561: - 401B var_ps2mem equ 0x401B
562: - 400B var_scratch equ 0x400B
**** test.asm ****
2: - 8000 START_ADDR .EQU 0x8000
3:
4:
5: - 8000 org START_ADDR
6: - 8000 com_header:
7: 0+10 8000 C34080 jp com_prg
8: - 8003 00 db 0x00
9: - 8004 00000000 dw 0x00, 0x00, 0x00 ;always 0
0000
10: - 800A 0080 dw [START_ADDR] ;start addr
11: - 800C 5E9E dw [_eof] ;end of file
12: - 800E 5E1E dw [_eof - START_ADDR] ;length
13: - 8010 ..803F 00 dc 48,0x00
14:
15: - 8040 com_prg:
16: ;shadow rom
17: 10+17 8040 CD9101 call PRINTINLINE
18: - 8043 0A0D5368 db 10,13,"Shadowing ROM @ 0x0000-0x3FFF ...",10,13,0
61646F77
696E6720
524F4D20
40203078
30303030
2D307833
46464620
2E2E2E0A
0D00
19: 27+7 8069 3E01 ld a,0x01 ;set bit1 to switch to ram
20: 34+11 806B D300 out (0x00),a ;store to bank select register
21: 45+10 806D 217B80 ld hl,[prg_start]
22: 55+10 8070 110000 ld de,0
23: 65+10 8073 01E31D ld bc,[prg_end-prg_start]
24: 75+16+5 8076 EDB0 ldir
25: 91+10 8078 C30000 jp 0x0000
26:
27:
28: - 807B prg_start:
29: - 0000 phase 0x0000
30:
31: - 0000 BASRST_00: ;Hardware Restart
32: 101+10 0000 C35A00 jp CSTART
33: - 0003 ..0007 00 defs 5
34: ;org 0x0008
35: - 0008 BASRST_08 ;Print Char
36: 111+10 0008 C32000 jp _BASRST_08
37: - 000B ..000F 00 defs 5
38: ;org 0x0010
39: - 0010 BASRST_10 ;receive char
40: 121+10 0010 C32D00 jp _BASRST_10
41: - 0013 ..0017 00 defs 5
42: ;org 0x0018
43: - 0018 BASRST_18 ;Buffer length
44: 131+10 0018 C34B00 jp _BASRST_18
45: - 001B ..001F 00 defs 5
46: ;org 0x0044
47:
48: - 0020 _BASRST_08:
49: 141+11 0020 D308 out (CS_SIO_A_D),a
50: - 0022 _wait:
51: 152+7 0022 3E01 ld a,1
52: 159+11 0024 D309 out (CS_SIO_A_C),A
53: 170+11 0026 DB09 in A,(CS_SIO_A_C) ;read RRx
54: 181+8 0028 CB47 bit 0,A
55: 189+7+5 002A 28F6 jr z,_wait
56: 196+10 002C C9 ret
57:
58: - 002D _BASRST_10:
59: ;RTS ON
60: 206+7 002D 3E05 ld a,005h ;write into WR0: select WR5
61: 213+11 002F D309 out (CS_SIO_A_C),A
62: 224+7 0031 3EEA ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active
63: 231+11 0033 D309 out (CS_SIO_A_C),A
64: 242+4 0035 00 nop
65: ;read if avail
66: 246+4 0036 AF xor a ; a = 0
67: 250+11 0037 D309 out (CS_SIO_A_C), a ; select reg 0
68: 261+11 0039 DB09 in a, (CS_SIO_A_C) ; read reg 0
69: 272+7 003B E601 and 1 ; mask D0 (recieve char available)
70: ;RTS OFF
71: 279+11 003D F5 push af
72: 290+7 003E 3E05 ld a,005h ;write into WR0: select WR5
73: 297+11 0040 D309 out (CS_SIO_A_C),A
74: 308+7 0042 3E68 ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
75: 315+11 0044 D309 out (CS_SIO_A_C),A
76: 326+10 0046 F1 pop af
77: 336+5+6 0047 C8 ret Z ; return 0 if no char
78: ;read data
79: 341+11 0048 DB08 in a, (CS_SIO_A_D) ; read char if avail
80: 352+10 004A C9 ret ; return
81:
82: - 004B _BASRST_18:
83: 362+7 004B 3E00 ld a,0
84: 369+10 004D C9 ret
85:
86: - 004E BASSTART:
87: .include "basic.s"
**** include/basic.s ****
1: ;==============================================================================
2: ;
3: ; The rework to support MS Basic HLOAD and the Z80 instruction tuning are
4: ; copyright (C) 2020 Phillip Stevens
5: ;
6: ; This Source Code Form is subject to the terms of the Mozilla Public
7: ; License, v. 2.0. If a copy of the MPL was not distributed with this
8: ; file, You can obtain one at http://mozilla.org/MPL/2.0/.
9: ;
10: ; The HLOAD function supports Intel HEX encoded program upload.
11: ; Updates LSTRAM and STRSPC, adds program origin address to USR+1.
12: ; It resets and clears runtime variables.
13: ;
14: ; The RESET function returns to cold start status.
15: ;
16: ; feilipu, August 2020
17: ;
18: ;==============================================================================
19: ;
20: ; The updates to the original BASIC within this file are copyright Grant Searle
21: ;
22: ; You have permission to use this for NON COMMERCIAL USE ONLY
23: ; If you wish to use it elsewhere, please include an acknowledgement to myself.
24: ;
25: ; http://searle.wales/
26: ;
27: ;==============================================================================
28: ;
29: ; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft
30: ; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3
31: ; (May-June 1983) to Vol 3, Issue 3 (May-June 1984)
32: ; Adapted for the freeware Zilog Macro Assembler 2.10 to produce
33: ; the original ROM code (checksum A934H). PA
34: ;
35: ;==============================================================================
36:
37:
38: ; GENERAL EQUATES
39:
40: - 0003 CTRLC .EQU 03H ; Control "C"
41: - 0007 CTRLG .EQU 07H ; Control "G"
42: - 0008 BKSP .EQU 08H ; Back space
43: - 000A LF .EQU 0AH ; Line feed
44: - 000C CS .EQU 0CH ; Clear screen
45: - 000D CR .EQU 0DH ; Carriage return
46: - 000F CTRLO .EQU 0FH ; Control "O"
47: - 0011 CTRLQ .EQU 11H ; Control "Q"
48: - 0012 CTRLR .EQU 12H ; Control "R"
49: - 0013 CTRLS .EQU 13H ; Control "S"
50: - 0015 CTRLU .EQU 15H ; Control "U"
51: - 001B ESC .EQU 1BH ; Escape
52: - 007F DEL .EQU 7FH ; Delete
53:
54: ; BASIC WORK SPACE LOCATIONS
55:
56: - 1DE3 WRKSPC .EQU _WORKSPACE ; <<<< BASIC Work space ** Rx buffer & Tx buffer located from 8080H **
57: - 1DE6 USR .EQU WRKSPC+003H ; "USR (x)" jump
58: - 1DE9 OUTSUB .EQU WRKSPC+006H ; "OUT p,n"
59: - 1DEA OTPORT .EQU WRKSPC+007H ; Port (p)
60: - 1DEC DIVSUP .EQU WRKSPC+009H ; Division support routine
61: - 1DED DIV1 .EQU WRKSPC+00AH ; <- Values
62: - 1DF1 DIV2 .EQU WRKSPC+00EH ; <- to
63: - 1DF5 DIV3 .EQU WRKSPC+012H ; <- be
64: - 1DF8 DIV4 .EQU WRKSPC+015H ; <-inserted
65: - 1DFA SEED .EQU WRKSPC+017H ; Random number seed
66: - 1E1D LSTRND .EQU WRKSPC+03AH ; Last random number
67: - 1E21 INPSUB .EQU WRKSPC+03EH ; #INP (x)" Routine
68: - 1E22 INPORT .EQU WRKSPC+03FH ; PORT (x)
69: - 1E24 NULLS .EQU WRKSPC+041H ; Number of nulls
70: - 1E25 LWIDTH .EQU WRKSPC+042H ; Terminal width
71: - 1E26 COMMAN .EQU WRKSPC+043H ; Width for commas
72: - 1E27 NULFLG .EQU WRKSPC+044H ; Null after input byte flag
73: - 1E28 CTLOFG .EQU WRKSPC+045H ; Control "O" flag
74: - 1E29 LINESC .EQU WRKSPC+046H ; Lines counter
75: - 1E2B LINESN .EQU WRKSPC+048H ; Lines number
76: - 1E2D CHKSUM .EQU WRKSPC+04AH ; Array load/save check sum
77: - 1E2F NMIFLG .EQU WRKSPC+04CH ; Flag for NMI break routine
78: - 1E30 BRKFLG .EQU WRKSPC+04DH ; Break flag
79: - 1E31 RINPUT .EQU WRKSPC+04EH ; Input reflection
80: - 1E34 STRSPC .EQU WRKSPC+051H ; Bottom of string space
81: - 1E36 LINEAT .EQU WRKSPC+053H ; Current line number
82: - 1E38 BASTXT .EQU WRKSPC+055H ; Pointer to start of program
83: - 1E3B BUFFER .EQU WRKSPC+058H ; Input buffer
84: - 1E40 STACK .EQU WRKSPC+05DH ; Initial stack
85: - 1E85 CURPOS .EQU WRKSPC+0A2H ; <<<< Character position on line ** Top of Loader TEMPSTACK **
86: - 1E86 LCRFLG .EQU WRKSPC+0A3H ; Locate/Create flag
87: - 1E87 TYPE .EQU WRKSPC+0A4H ; Data type flag
88: - 1E88 DATFLG .EQU WRKSPC+0A5H ; Literal statement flag
89: - 1E89 LSTRAM .EQU WRKSPC+0A6H ; Last available RAM
90: - 1E8B TMSTPT .EQU WRKSPC+0A8H ; Temporary string pointer
91: - 1E8D TMSTPL .EQU WRKSPC+0AAH ; Temporary string pool
92: - 1E99 TMPSTR .EQU WRKSPC+0B6H ; Temporary string
93: - 1E9D STRBOT .EQU WRKSPC+0BAH ; Bottom of string space
94: - 1E9F CUROPR .EQU WRKSPC+0BCH ; Current operator in EVAL
95: - 1EA1 LOOPST .EQU WRKSPC+0BEH ; First statement of loop
96: - 1EA3 DATLIN .EQU WRKSPC+0C0H ; Line of current DATA item
97: - 1EA5 FORFLG .EQU WRKSPC+0C2H ; "FOR" loop flag
98: - 1EA6 LSTBIN .EQU WRKSPC+0C3H ; Last byte entered
99: - 1EA7 READFG .EQU WRKSPC+0C4H ; Read/Input flag
100: - 1EA8 BRKLIN .EQU WRKSPC+0C5H ; Line of break
101: - 1EAA NXTOPR .EQU WRKSPC+0C7H ; Next operator in EVAL
102: - 1EAC ERRLIN .EQU WRKSPC+0C9H ; Line of error
103: - 1EAE CONTAD .EQU WRKSPC+0CBH ; Where to CONTinue
104: - 1EB0 PROGND .EQU WRKSPC+0CDH ; End of program
105: - 1EB2 VAREND .EQU WRKSPC+0CFH ; End of variables
106: - 1EB4 ARREND .EQU WRKSPC+0D1H ; End of arrays
107: - 1EB6 NXTDAT .EQU WRKSPC+0D3H ; Next data item
108: - 1EB8 FNRGNM .EQU WRKSPC+0D5H ; Name of FN argument
109: - 1EBA FNARG .EQU WRKSPC+0D7H ; FN argument value
110: - 1EBE FPREG .EQU WRKSPC+0DBH ; Floating point register
111: - 1EC1 FPEXP .EQU FPREG+3 ; Floating point exponent
112: - 1EC2 SGNRES .EQU WRKSPC+0DFH ; Sign of result
113: - 1EC3 PBUFF .EQU WRKSPC+0E0H ; Number print buffer
114: - 1ED0 MULVAL .EQU WRKSPC+0EDH ; Multiplier
115: - 1ED3 PROGST .EQU WRKSPC+0F0H ; Start of program text area
116: - 1F37 STLOOK .EQU WRKSPC+154H ; Start of memory test
117:
118: ; BASIC ERROR CODE VALUES
119:
120: - 0000 NF .EQU 00H ; NEXT without FOR
121: - 0002 SN .EQU 02H ; Syntax error
122: - 0004 RG .EQU 04H ; RETURN without GOSUB
123: - 0006 OD .EQU 06H ; Out of DATA
124: - 0008 FC .EQU 08H ; Function call error
125: - 000A OV .EQU 0AH ; Overflow
126: - 000C OM .EQU 0CH ; Out of memory
127: - 000E UL .EQU 0EH ; Undefined line number
128: - 0010 BS .EQU 10H ; Bad subscript
129: - 0012 DD .EQU 12H ; Re-DIMensioned array
130: - 0014 DZ .EQU 14H ; Division by zero (/0)
131: - 0016 ID .EQU 16H ; Illegal direct
132: - 0018 TM .EQU 18H ; Type miss-match
133: - 001A OS .EQU 1AH ; Out of string space
134: - 001C LS .EQU 1CH ; String too long
135: - 001E ST .EQU 1EH ; String formula too complex
136: - 0020 CN .EQU 20H ; Can't CONTinue
137: - 0022 UF .EQU 22H ; UnDEFined FN function
138: - 0024 MO .EQU 24H ; Missing operand
139: - 0026 HX .EQU 26H ; HEX error
140: - 0028 BN .EQU 28H ; BIN error
141:
142: ; .ORG 0250H ; <<<< Modified to allow for ACIA Tx/Rx IM1
143:
144: 379+10 004E C35A00 COLD: JP CSTART ; Jump in for cold start (0x0250)
145: 389+10 0051 C3DD00 WARM: JP WARMST ; Jump in for warm start (0x0253)
146:
147: - 0054 05 .defb 5 ; pad so DEINT is 0x025B, ABPASS is 0x025D
148:
149: - 0055 0109 .WORD DEINT ; 0x025B Get integer -32768 to 32767
150: - 0057 D210 .WORD ABPASS ; 0x025D Return integer in AB
151:
152: 399+5+6 0059 C0 RESET: RET NZ ; Return if any more on line
153: 404+10 005A 21E31D CSTART: LD HL,WRKSPC ; Start of workspace RAM
154: 414+6 005D F9 LD SP,HL ; Set up a temporary stack
155: 420+4 005E AF XOR A ; Clear break flag
156: 424+13 005F 32301E LD (BRKFLG),A
157:
158: 437+10 0062 211E03 INIT: LD HL,INITAB ; Initialise workspace
159: 447+10 0065 015A00 LD BC,INITBE-INITAB+3 ; Bytes to copy
160: 457+10 0068 11E31D LD DE,WRKSPC ; Into workspace RAM
161: 467+16+5 006B EDB0 LDIR ; Copy
162: 483+4 006D EB EX DE,HL ; End of copy destination to HL
163: 487+6 006E F9 LD SP,HL ; Temporary stack
164: 493+17 006F CD2605 CALL CLREG ; Clear registers and stack
165: 510+17 0072 CD190B CALL PRNTCRLF ; Output CRLF
166: 527+13 0075 32841E LD (BUFFER+72+1),A ; Mark end of buffer
167: 540+13 0078 32D31E LD (PROGST),A ; Initialise program area
168: - 007B MSIZE: ;LD HL,MEMMSG ; Point to message
169: ;CALL PRS ; Output "Memory size"
170: ;CALL PROMPT ; Get input with '?'
171: ;CALL GETCHR ; Get next character
172: ;OR A ; Set flags
173: ;JP NZ,TSTMEM ; If number - Test if RAM there
174: 553+10 007B 21371F LD HL,STLOOK ; Point to start of RAM
175: 563+6 007E 23 MLOOP: INC HL ; Next byte
176: 569+4 007F 7C LD A,H ; Above address FFFF ?
177: 573+4 0080 B5 OR L
178: 577+10 0081 CAA200 JP Z,SETTOP ; Yes - 64K RAM
179: 587+7 0084 7E LD A,(HL) ; Get contents
180: 594+4 0085 47 LD B,A ; Save it
181: 598+4 0086 2F CPL ; Flip all bits
182: 602+7 0087 77 LD (HL),A ; Put it back
183: 609+7 0088 BE CP (HL) ; RAM there if same
184: 616+7 0089 70 LD (HL),B ; Restore old contents
185: 623+10 008A CA7E00 JP Z,MLOOP ; If RAM - test next byte
186: 633+10 008D C3A200 JP SETTOP ; Top of RAM found
187:
188: 643+17 0090 CD1B09 TSTMEM: CALL ATOH ; Get high memory into DE
189: 660+4 0093 B7 OR A ; Set flags on last byte
190: 664+10 0094 C2EB03 JP NZ,SNERR ; ?SN Error if bad character
191: 674+4 0097 EB EX DE,HL ; Address into HL
192: 678+6 0098 2B DEC HL ; Back one byte
193: 684+7 0099 3ED9 LD A,11011001B ; Test byte
194: 691+7 009B 46 LD B,(HL) ; Get old contents
195: 698+7 009C 77 LD (HL),A ; Load test byte
196: 705+7 009D BE CP (HL) ; RAM there if same
197: 712+7 009E 70 LD (HL),B ; Restore old contents
198: 719+10 009F C27B00 JP NZ,MSIZE ; Ask again if no RAM
199:
200: 729+6 00A2 2B SETTOP: DEC HL ; Back one byte
201: 735+10 00A3 11361F LD DE,STLOOK-1 ; See if enough RAM
202: 745+4 00A6 7C LD A,H ; Compare DE with HL
203: 749+4 00A7 92 SUB D ; Compare with D
204: 753+7+5 00A8 2002 JR NZ,$+4 ; Different - Exit
205: 760+4 00AA 7D LD A,L ; Get L
206: 764+4 00AB 93 SUB E ; Compare with E
207: 768+10 00AC DA7B00 JP C,MSIZE ; Ask again if not enough RAM
208: 778+10 00AF 11CEFF LD DE,0-50 ; 50 Bytes string space
209: 788+16 00B2 22891E LD (LSTRAM),HL ; Save last available RAM
210: 804+11 00B5 19 ADD HL,DE ; Allocate string space
211: 815+16 00B6 22341E LD (STRSPC),HL ; Save string space
212: 831+17 00B9 CD0105 CALL CLRPTR ; Clear program area
213: 848+16 00BC 2A341E LD HL,(STRSPC) ; Get end of memory
214: 864+10 00BF 11EFFF LD DE,0-17 ; Offset for free bytes
215: 874+11 00C2 19 ADD HL,DE ; Adjust HL
216: 885+10 00C3 11D31E LD DE,PROGST ; Start of program text
217: 895+4 00C6 7D LD A,L ; Get LSB
218: 899+4 00C7 93 SUB E ; Adjust it
219: 903+4 00C8 6F LD L,A ; Re-save
220: 907+4 00C9 7C LD A,H ; Get MSB
221: 911+4 00CA 9A SBC A,D ; Adjust it
222: 915+4 00CB 67 LD H,A ; Re-save
223: 919+11 00CC E5 PUSH HL ; Save bytes free
224: 930+10 00CD 21F500 LD HL,SIGNON ; Sign-on message
225: 940+17 00D0 CD0212 CALL PRS ; Output string
226: 957+10 00D3 E1 POP HL ; Get bytes free back
227: 967+17 00D4 CDCF18 CALL PRNTHL ; Output amount of free memory
228: 984+10 00D7 21E600 LD HL,BFREE ; " Bytes free" message
229: 994+17 00DA CD0212 CALL PRS ; Output string
230:
231: 1011+10 00DD 31401E WARMST: LD SP,STACK ; Temporary stack
232: 1021+17 00E0 CD2605 BRKRET: CALL CLREG ; Clear registers and stack
233: 1038+10 00E3 C33904 JP PRNTOK ; Go to get command line
234:
235: - 00E6 20427974 BFREE: .BYTE " Bytes free",CR,LF,0,0
65732066
7265650D
0A0000
236:
237: - 00F5 5A383020 SIGNON: .BYTE "Z80 BASIC Ver 4.7c",CR,LF
42415349
43205665
7220342E
37630D0A
238: - 0109 436F7079 .BYTE "Copyright ",40,"C",41
72696768
74202843
29
239: - 0116 20313937 .BYTE " 1978 by Microsoft",CR,LF
38206279
204D6963
726F736F
66740D0A
240: - 012A 4D6F6469 .BYTE "Modified for Z8C by Dennis Gunia",CR,LF,0,0
66696564
20666F72
205A3843
20627920
44656E6E
69732047
756E6961
0D0A0000
241:
242: - 014E 4D656D6F MEMMSG: .BYTE "Memory top",0
72792074
6F7000
243:
244: ; FUNCTION ADDRESS TABLE
245:
246: - 0159 4E17 FNCTAB: .WORD SGN
247: - 015B 0418 .WORD INT
248: - 015D 6417 .WORD ABS
249: - 015F E61D .WORD USR
250: - 0161 B010 .WORD FRE
251: - 0163 5E14 .WORD INP
252: - 0165 DE10 .WORD POS
253: - 0167 DC19 .WORD SQR
254: - 0169 D51A .WORD RND
255: - 016B E415 .WORD LOG
256: - 016D 371A .WORD EXP
257: - 016F 631B .WORD COS
258: - 0171 691B .WORD SIN
259: - 0173 CF1B .WORD TAN
260: - 0175 E91B .WORD ATN
261: - 0177 B214 .WORD PEEK
262: - 0179 551C .WORD DEEK
263: - 017B 8B13 .WORD LEN
264: - 017D 8211 .WORD STR
265: - 017F 2514 .WORD VAL
266: - 0181 9A13 .WORD ASC
267: - 0183 AB13 .WORD CHR
268: - 0185 EE1C .WORD HEX
269: - 0187 811D .WORD BIN
270: - 0189 BB13 .WORD LEFT
271: - 018B EB13 .WORD RIGHT
272: - 018D F513 .WORD MID
273:
274: ; RESERVED WORD LIST
275:
276: - 018F C54E44 WORDS: .BYTE 'E'+80H,"ND" ; 80h
277: - 0192 C64F52 .BYTE 'F'+80H,"OR"
278: - 0195 CE455854 .BYTE 'N'+80H,"EXT"
279: - 0199 C4415441 .BYTE 'D'+80H,"ATA"
280: - 019D C94E5055 .BYTE 'I'+80H,"NPUT"
54
281: - 01A2 C4494D .BYTE 'D'+80H,"IM"
282: - 01A5 D2454144 .BYTE 'R'+80H,"EAD"
283: - 01A9 CC4554 .BYTE 'L'+80H,"ET"
284: - 01AC C74F544F .BYTE 'G'+80H,"OTO"
285: - 01B0 D2554E .BYTE 'R'+80H,"UN"
286: - 01B3 C946 .BYTE 'I'+80H,"F"
287: - 01B5 D2455354 .BYTE 'R'+80H,"ESTORE"
4F5245
288: - 01BC C74F5355 .BYTE 'G'+80H,"OSUB"
42
289: - 01C1 D2455455 .BYTE 'R'+80H,"ETURN"
524E
290: - 01C7 D2454D .BYTE 'R'+80H,"EM"
291: - 01CA D3544F50 .BYTE 'S'+80H,"TOP"
292: - 01CE CF5554 .BYTE 'O'+80H,"UT" ; 90h
293: - 01D1 CF4E .BYTE 'O'+80H,"N"
294: - 01D3 CE554C4C .BYTE 'N'+80H,"ULL"
295: - 01D7 D7414954 .BYTE 'W'+80H,"AIT"
296: - 01DB C44546 .BYTE 'D'+80H,"EF"
297: - 01DE D04F4B45 .BYTE 'P'+80H,"OKE"
298: - 01E2 C44F4B45 .BYTE 'D'+80H,"OKE"
299: - 01E6 CC494E45 .BYTE 'L'+80H,"INES"
53
300: - 01EB C34C53 .BYTE 'C'+80H,"LS"
301: - 01EE D7494454 .BYTE 'W'+80H,"IDTH"
48
302: - 01F3 CD4F4E49 .BYTE 'M'+80H,"ONITOR"
544F52
303: - 01FA D2455345 .BYTE 'R'+80H,"ESET"
54
304: - 01FF D052494E .BYTE 'P'+80H,"RINT"
54
305: - 0204 C34F4E54 .BYTE 'C'+80H,"ONT"
306: - 0208 CC495354 .BYTE 'L'+80H,"IST"
307: - 020C C34C4541 .BYTE 'C'+80H,"LEAR"
52
308: - 0211 C84C4F41 .BYTE 'H'+80H,"LOAD" ; A0h
44
309: - 0216 CE4557 .BYTE 'N'+80H,"EW"
310:
311: - 0219 D4414228 .BYTE 'T'+80H,"AB("
312: - 021D D44F .BYTE 'T'+80H,"O"
313: - 021F C64E .BYTE 'F'+80H,"N"
314: - 0221 D3504328 .BYTE 'S'+80H,"PC("
315: - 0225 D448454E .BYTE 'T'+80H,"HEN"
316: - 0229 CE4F54 .BYTE 'N'+80H,"OT"
317: - 022C D3544550 .BYTE 'S'+80H,"TEP"
318:
319: - 0230 AB .BYTE '+'+80H
320: - 0231 AD .BYTE '-'+80H
321: - 0232 AA .BYTE '*'+80H
322: - 0233 AF .BYTE '/'+80H
323: - 0234 DE .BYTE '^'+80H
324: - 0235 C14E44 .BYTE 'A'+80H,"ND"
325: - 0238 CF52 .BYTE 'O'+80H,"R"
326: - 023A BE .BYTE '>'+80H ; B0h
327: - 023B BD .BYTE '='+80H
328: - 023C BC .BYTE '<'+80H
329:
330: - 023D D3474E .BYTE 'S'+80H,"GN"
331: - 0240 C94E54 .BYTE 'I'+80H,"NT"
332: - 0243 C14253 .BYTE 'A'+80H,"BS"
333: - 0246 D55352 .BYTE 'U'+80H,"SR"
334: - 0249 C65245 .BYTE 'F'+80H,"RE"
335: - 024C C94E50 .BYTE 'I'+80H,"NP"
336: - 024F D04F53 .BYTE 'P'+80H,"OS"
337: - 0252 D35152 .BYTE 'S'+80H,"QR"
338: - 0255 D24E44 .BYTE 'R'+80H,"ND"
339: - 0258 CC4F47 .BYTE 'L'+80H,"OG"
340: - 025B C55850 .BYTE 'E'+80H,"XP"
341: - 025E C34F53 .BYTE 'C'+80H,"OS"
342: - 0261 D3494E .BYTE 'S'+80H,"IN"
343: - 0264 D4414E .BYTE 'T'+80H,"AN" ; C0h
344: - 0267 C1544E .BYTE 'A'+80H,"TN"
345: - 026A D045454B .BYTE 'P'+80H,"EEK"
346: - 026E C445454B .BYTE 'D'+80H,"EEK"
347: - 0272 CC454E .BYTE 'L'+80H,"EN"
348: - 0275 D3545224 .BYTE 'S'+80H,"TR$"
349: - 0279 D6414C .BYTE 'V'+80H,"AL"
350: - 027C C15343 .BYTE 'A'+80H,"SC"
351: - 027F C3485224 .BYTE 'C'+80H,"HR$"
352: - 0283 C8455824 .BYTE 'H'+80H,"EX$"
353: - 0287 C2494E24 .BYTE 'B'+80H,"IN$"
354: - 028B CC454654 .BYTE 'L'+80H,"EFT$"
24
355: - 0290 D2494748 .BYTE 'R'+80H,"IGHT$"
5424
356: - 0296 CD494424 .BYTE 'M'+80H,"ID$"
357: - 029A 80 .BYTE 80H ; End of list marker
358:
359: ; KEYWORD ADDRESS TABLE
360:
361: - 029B 9908 WORDTB: .WORD PEND
362: - 029D 8D07 .WORD FOR
363: - 029F 9B0C .WORD NEXT
364: - 02A1 F009 .WORD DATA
365: - 02A3 9A0B .WORD INPUT
366: - 02A5 F00E .WORD DIM
367: - 02A7 C90B .WORD READ
368: - 02A9 070A .WORD LET
369: - 02AB AA09 .WORD GOTO
370: - 02AD 8D09 .WORD RUN
371: - 02AF 970A .WORD IF
372: - 02B1 5E08 .WORD RESTOR
373: - 02B3 9909 .WORD GOSUB
374: - 02B5 CB09 .WORD RETURN
375: - 02B7 F209 .WORD REM
376: - 02B9 9708 .WORD STOP
377: - 02BB 6A14 .WORD POUT
378: - 02BD 790A .WORD ON
379: - 02BF D808 .WORD NULL
380: - 02C1 7014 .WORD WAIT
381: - 02C3 E610 .WORD DEF
382: - 02C5 B914 .WORD POKE
383: - 02C7 601C .WORD DOKE
384: - 02C9 461C .WORD LINES
385: - 02CB 381C .WORD CLS
386: - 02CD 3E1C .WORD WIDTH
387: - 02CF 351C .WORD MONITR
388: - 02D1 5900 .WORD RESET
389: - 02D3 BB0A .WORD PRINT
390: - 02D5 C508 .WORD CONT
391: - 02D7 0407 .WORD LIST
392: - 02D9 4409 .WORD CLEAR
393: - 02DB 771C .WORD HLOAD
394: - 02DD 0005 .WORD NEW
395:
396: ; RESERVED WORD TOKEN VALUES
397:
398: - 0080 ZEND .EQU 080H ; END
399: - 0081 ZFOR .EQU 081H ; FOR
400: - 0083 ZDATA .EQU 083H ; DATA
401: - 0088 ZGOTO .EQU 088H ; GOTO
402: - 008C ZGOSUB .EQU 08CH ; GOSUB
403: - 008E ZREM .EQU 08EH ; REM
404: - 009C ZPRINT .EQU 09CH ; PRINT
405: - 00A1 ZNEW .EQU 0A1H ; NEW
406:
407: - 00A2 ZTAB .EQU 0A2H ; TAB
408: - 00A3 ZTO .EQU 0A3H ; TO
409: - 00A4 ZFN .EQU 0A4H ; FN
410: - 00A5 ZSPC .EQU 0A5H ; SPC
411: - 00A6 ZTHEN .EQU 0A6H ; THEN
412: - 00A7 ZNOT .EQU 0A7H ; NOT
413: - 00A8 ZSTEP .EQU 0A8H ; STEP
414:
415: - 00A9 ZPLUS .EQU 0A9H ; +
416: - 00AA ZMINUS .EQU 0AAH ; -
417: - 00AB ZTIMES .EQU 0ABH ; *
418: - 00AC ZDIV .EQU 0ACH ; /
419: - 00AF ZOR .EQU 0AFH ; OR
420: - 00B0 ZGTR .EQU 0B0H ; >
421: - 00B1 ZEQUAL .EQU 0B1H ; =
422: - 00B2 ZLTH .EQU 0B2H ; <
423: - 00B3 ZSGN .EQU 0B3H ; SGN
424: - 00CB ZLEFT .EQU 0CBH ; LEFT$
425:
426: ; ARITHMETIC PRECEDENCE TABLE
427:
428: - 02DF 79 PRITAB: .BYTE 79H ; Precedence value
429: - 02E0 B618 .WORD PADD ; FPREG = <last> + FPREG
430:
431: - 02E2 79 .BYTE 79H ; Precedence value
432: - 02E3 D714 .WORD PSUB ; FPREG = <last> - FPREG
433:
434: - 02E5 7C .BYTE 7CH ; Precedence value
435: - 02E6 2316 .WORD MULT ; FPREG = <last> * FPREG
436:
437: - 02E8 7C .BYTE 7CH ; Precedence value
438: - 02E9 8E16 .WORD DIV ; FPREG = <last> / FPREG
439:
440: - 02EB 7F .BYTE 7FH ; Precedence value
441: - 02EC ED19 .WORD POWER ; FPREG = <last> ^ FPREG
442:
443: - 02EE 50 .BYTE 50H ; Precedence value
444: - 02EF 440E .WORD PAND ; FPREG = <last> AND FPREG
445:
446: - 02F1 46 .BYTE 46H ; Precedence value
447: - 02F2 430E .WORD POR ; FPREG = <last> OR FPREG
448:
449: ; BASIC ERROR CODE LIST
450:
451: - 02F4 4E46 ERRORS: .BYTE "NF" ; NEXT without FOR
452: - 02F6 534E .BYTE "SN" ; Syntax error
453: - 02F8 5247 .BYTE "RG" ; RETURN without GOSUB
454: - 02FA 4F44 .BYTE "OD" ; Out of DATA
455: - 02FC 4643 .BYTE "FC" ; Illegal function call
456: - 02FE 4F56 .BYTE "OV" ; Overflow error
457: - 0300 4F4D .BYTE "OM" ; Out of memory
458: - 0302 554C .BYTE "UL" ; Undefined line
459: - 0304 4253 .BYTE "BS" ; Bad subscript
460: - 0306 4444 .BYTE "DD" ; Re-DIMensioned array
461: - 0308 2F30 .BYTE "/0" ; Division by zero
462: - 030A 4944 .BYTE "ID" ; Illegal direct
463: - 030C 544D .BYTE "TM" ; Type mis-match
464: - 030E 4F53 .BYTE "OS" ; Out of string space
465: - 0310 4C53 .BYTE "LS" ; String too long
466: - 0312 5354 .BYTE "ST" ; String formula too complex
467: - 0314 434E .BYTE "CN" ; Can't CONTinue
468: - 0316 5546 .BYTE "UF" ; Undefined FN function
469: - 0318 4D4F .BYTE "MO" ; Missing operand
470: - 031A 4858 .BYTE "HX" ; HEX error
471: - 031C 424E .BYTE "BN" ; BIN error
472:
473: ; INITIALISATION TABLE -------------------------------------------------------
474:
475: 1048+10 031E C3DD00 INITAB: JP WARMST ; Warm start jump
476: 1058+10 0321 C31609 JP FCERR ; "USR (X)" jump (Set to Error)
477:
478: 1068+11 0324 D300 OUT (0),A ; "OUT p,n" skeleton
479: 1079+10 0326 C9 RET
480:
481: 1089+7 0327 D600 SUB 0 ; Division support routine
482: 1096+4 0329 6F LD L,A
483: 1100+4 032A 7C LD A,H
484: 1104+7 032B DE00 SBC A,0
485: 1111+4 032D 67 LD H,A
486: 1115+4 032E 78 LD A,B
487: 1119+7 032F DE00 SBC A,0
488: 1126+4 0331 47 LD B,A
489: 1130+7 0332 3E00 LD A,0
490: 1137+10 0334 C9 RET
491:
492: - 0335 000000 .BYTE 0,0,0 ; Random number seed
493: ; table used by RND
494: - 0338 354ACA99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07
495: - 033C 391C7698 .BYTE 039H,01CH,076H,098H ; 1.61291E+07
496: - 0340 2295B398 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07
497: - 0344 0ADD4798 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07
498: - 0348 53D19999 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07
499: - 034C 0A1A9F98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07
500: - 0350 65BCCD98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07
501: - 0354 D6773E98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07
502: - 0358 52C74F80 .BYTE 052H,0C7H,04FH,080H ; Last random number
503:
504: 1147+11 035C DB00 IN A,(0) ; INP (x) skeleton
505: 1158+10 035E C9 RET
506:
507: - 035F 01 .BYTE 1 ; POS (x) number (1)
508: - 0360 FF .BYTE 255 ; Terminal width (255 = no auto CRLF)
509: - 0361 1C .BYTE 28 ; Width for commas (3 columns)
510: - 0362 00 .BYTE 0 ; No nulls after input bytes
511: - 0363 00 .BYTE 0 ; Output enabled (^O off)
512:
513: - 0364 1400 .WORD 20 ; Initial lines counter
514: - 0366 1400 .WORD 20 ; Initial lines number
515: - 0368 0000 .WORD 0 ; Array load/save check sum
516:
517: - 036A 00 .BYTE 0 ; Break not by NMI
518: - 036B 00 .BYTE 0 ; Break flag
519:
520: 1168+10 036C C33906 JP TTYLIN ; Input reflection (set to TTY)
521:
522: - 036F 371F .WORD STLOOK ; Temp string space
523: - 0371 FEFF .WORD -2 ; Current line number (cold)
524: - 0373 D41E .WORD PROGST+1 ; Start of program text
525: - 0375 INITBE:
526: - 0375 03 .defb 3 ; Fill 3 Bytes for copy
527:
528: ; END OF INITIALISATION TABLE ---------------------------------------------------
529:
530: - 0376 20457272 ERRMSG: .BYTE " Error",0
6F7200
531: - 037D 20696E20 INMSG: .BYTE " in ",0
00
532: - 0381 ZERBYT .EQU $-1 ; A zero byte
533: - 0382 4F6B0D0A OKMSG: .BYTE "Ok",CR,LF,0,0
0000
534: - 0388 42726561 BRKMSG: .BYTE "Break",0
6B00
535:
536: 1178+10 038E 210400 BAKSTK: LD HL,4 ; Look for "FOR" block with
537: 1188+11 0391 39 ADD HL,SP ; same index as specified
538: 1199+7 0392 7E LOKFOR: LD A,(HL) ; Get block ID
539: 1206+6 0393 23 INC HL ; Point to index address
540: 1212+7 0394 FE81 CP ZFOR ; Is it a "FOR" token
541: 1219+5+6 0396 C0 RET NZ ; No - exit
542: 1224+7 0397 4E LD C,(HL) ; BC = Address of "FOR" index
543: 1231+6 0398 23 INC HL
544: 1237+7 0399 46 LD B,(HL)
545: 1244+6 039A 23 INC HL ; Point to sign of STEP
546: 1250+11 039B E5 PUSH HL ; Save pointer to sign
547: 1261+4 039C 69 LD L,C ; HL = address of "FOR" index
548: 1265+4 039D 60 LD H,B
549: 1269+4 039E 7A LD A,D ; See if an index was specified
550: 1273+4 039F B3 OR E ; DE = 0 if no index specified
551: 1277+4 03A0 EB EX DE,HL ; Specified index into HL
552: 1281+10 03A1 CAAB03 JP Z,INDFND ; Skip if no index given
553: 1291+4 03A4 EB EX DE,HL ; Index back into DE
554: 1295+4 03A5 7C LD A,H ; Compare index with one given
555: 1299+4 03A6 92 SUB D ; Compare with D
556: 1303+7+5 03A7 2002 JR NZ,$+4 ; Different - Exit
557: 1310+4 03A9 7D LD A,L ; Get L
558: 1314+4 03AA 93 SUB E ; Compare with E
559: 1318+10 03AB 010D00 INDFND: LD BC,16-3 ; Offset to next block
560: 1328+10 03AE E1 POP HL ; Restore pointer to sign
561: 1338+5+6 03AF C8 RET Z ; Return if block found
562: 1343+11 03B0 09 ADD HL,BC ; Point to next block
563: 1354+10 03B1 C39203 JP LOKFOR ; Keep on looking
564:
565: 1364+17 03B4 CDD103 MOVUP: CALL ENFMEM ; See if enough memory
566: 1381+11 03B7 C5 MOVSTR: PUSH BC ; Save end of source
567: 1392+19 03B8 E3 EX (SP),HL ; Swap source and dest" end
568: 1411+10 03B9 C1 POP BC ; Get end of destination
569: 1421+4 03BA 7C MOVLP: LD A,H ; See if list moved
570: 1425+4 03BB 92 SUB D ; Compare with D
571: 1429+7+5 03BC 2002 JR NZ,$+4 ; Different - Exit
572: 1436+4 03BE 7D LD A,L ; Get L
573: 1440+4 03BF 93 SUB E ; Compare with E
574: 1444+7 03C0 7E LD A,(HL) ; Get byte
575: 1451+7 03C1 02 LD (BC),A ; Move it
576: 1458+5+6 03C2 C8 RET Z ; Exit if all done
577: 1463+6 03C3 0B DEC BC ; Next byte to move to
578: 1469+6 03C4 2B DEC HL ; Next byte to move
579: 1475+10 03C5 C3BA03 JP MOVLP ; Loop until all bytes moved
580:
581: 1485+11 03C8 E5 CHKSTK: PUSH HL ; Save code string address
582: 1496+16 03C9 2AB41E LD HL,(ARREND) ; Lowest free memory
583: 1512+7 03CC 0600 LD B,0 ; BC = Number of levels to test
584: 1519+11 03CE 09 ADD HL,BC ; 2 Bytes for each level
585: 1530+11 03CF 09 ADD HL,BC
586: - 03D0 3E .BYTE 3EH ; Skip "PUSH HL"
587: 1541+11 03D1 E5 ENFMEM: PUSH HL ; Save code string address
588: 1552+7 03D2 3ED0 LD A,0D0H ; 48 Bytes minimum RAM
589: 1559+4 03D4 95 SUB L
590: 1563+4 03D5 6F LD L,A
591: 1567+7 03D6 3EFF LD A,0FFH ; 48 Bytes minimum RAM
592: 1574+4 03D8 9C SBC A,H
593: 1578+10 03D9 DAE003 JP C,OMERR ; Not enough - ?OM Error
594: 1588+4 03DC 67 LD H,A
595: 1592+11 03DD 39 ADD HL,SP ; Test if stack is overflowed
596: 1603+10 03DE E1 POP HL ; Restore code string address
597: 1613+5+6 03DF D8 RET C ; Return if enough mmory
598: 1618+7 03E0 1E0C OMERR: LD E,OM ; ?OM Error
599: 1625+10 03E2 C3FF03 JP ERROR
600:
601: 1635+16 03E5 2AA31E DATSNR: LD HL,(DATLIN) ; Get line of current DATA item
602: 1651+16 03E8 22361E LD (LINEAT),HL ; Save as current line
603: 1667+7 03EB 1E02 SNERR: LD E,SN ; ?SN Error
604: - 03ED 01 .BYTE 01H ; Skip "LD E,DZ"
605: 1674+7 03EE 1E14 DZERR: LD E,DZ ; ?/0 Error
606: - 03F0 01 .BYTE 01H ; Skip "LD E,NF"
607: 1681+7 03F1 1E00 NFERR: LD E,NF ; ?NF Error
608: - 03F3 01 .BYTE 01H ; Skip "LD E,DD"
609: 1688+7 03F4 1E12 DDERR: LD E,DD ; ?DD Error
610: - 03F6 01 .BYTE 01H ; Skip "LD E,UF"
611: 1695+7 03F7 1E22 UFERR: LD E,UF ; ?UF Error
612: - 03F9 01 .BYTE 01H ; Skip "LD E,OV
613: 1702+7 03FA 1E0A OVERR: LD E,OV ; ?OV Error
614: - 03FC 01 .BYTE 01H ; Skip "LD E,TM"
615: 1709+7 03FD 1E18 TMERR: LD E,TM ; ?TM Error
616:
617: 1716+17 03FF CD2605 ERROR: CALL CLREG ; Clear registers and stack
618: 1733+13 0402 32281E LD (CTLOFG),A ; Enable output (A is 0)
619: 1746+17 0405 CD0C0B CALL STTLIN ; Start new line
620: 1763+10 0408 21F402 LD HL,ERRORS ; Point to error codes
621: 1773+4 040B 57 LD D,A ; D = 0 (A is 0)
622: 1777+7 040C 3E3F LD A,'?'
623: 1784+17 040E CDC706 CALL OUTC ; Output '?'
624: 1801+11 0411 19 ADD HL,DE ; Offset to correct error code
625: 1812+7 0412 7E LD A,(HL) ; First character
626: 1819+17 0413 CDC706 CALL OUTC ; Output it
627: 1836+17 0416 CD4F08 CALL GETCHR ; Get next character
628: 1853+17 0419 CDC706 CALL OUTC ; Output it
629: 1870+10 041C 217603 LD HL,ERRMSG ; "Error" message
630: 1880+17 041F CD0212 ERRIN: CALL PRS ; Output message
631: 1897+16 0422 2A361E LD HL,(LINEAT) ; Get line of error
632: 1913+10 0425 11FEFF LD DE,-2 ; Cold start error if -2
633: 1923+4 0428 7C LD A,H ; See if cold start error
634: 1927+4 0429 92 SUB D ; Compare with D
635: 1931+7+5 042A 2002 JR NZ,$+4 ; Different - Exit
636: 1938+4 042C 7D LD A,L ; Get L
637: 1942+4 042D 93 SUB E ; Compare with E
638: 1946+10 042E CA5A00 JP Z,CSTART ; Cold start error - Restart
639: 1956+4 0431 7C LD A,H ; Was it a direct error?
640: 1960+4 0432 A5 AND L ; Line = -1 if direct error
641: 1964+4 0433 3C INC A
642: 1968+10+7 0434 C4C718 CALL NZ,LINEIN ; No - output line of error
643: - 0437 3E .BYTE 3EH ; Skip "POP BC"
644: 1978+10 0438 C1 POPNOK: POP BC ; Drop address in input buffer
645:
646: 1988+4 0439 AF PRNTOK: XOR A ; Output "Ok" and get command
647: 1992+13 043A 32281E LD (CTLOFG),A ; Enable output
648: 2005+17 043D CD0C0B CALL STTLIN ; Start new line
649: 2022+10 0440 218203 LD HL,OKMSG ; "Ok" message
650: 2032+17 0443 CD0212 CALL PRS ; Output "Ok"
651: 2049+10 0446 21FFFF GETCMD: LD HL,-1 ; Flag direct mode
652: 2059+16 0449 22361E LD (LINEAT),HL ; Save as current line
653: 2075+17 044C CD311E CALL RINPUT ; Get an input line
654: 2092+10 044F DA4604 JP C,GETCMD ; Get line again if break
655: 2102+17 0452 CD4F08 CALL GETCHR ; Get first character
656: 2119+4 0455 3C INC A ; Test if end of line
657: 2123+4 0456 3D DEC A ; Without affecting Carry
658: 2127+10 0457 CA4604 JP Z,GETCMD ; Nothing entered - Get another
659: 2137+11 045A F5 PUSH AF ; Save Carry status
660: 2148+17 045B CD1B09 CALL ATOH ; Get line number into DE
661: 2165+11 045E D5 PUSH DE ; Save line number
662: 2176+17 045F CD5005 CALL CRUNCH ; Tokenise rest of line
663: 2193+4 0462 47 LD B,A ; Length of tokenised line
664: 2197+10 0463 D1 POP DE ; Restore line number
665: 2207+10 0464 F1 POP AF ; Restore Carry
666: 2217+10 0465 D22F08 JP NC,EXCUTE ; No line number - Direct mode
667: 2227+11 0468 D5 PUSH DE ; Save line number
668: 2238+11 0469 C5 PUSH BC ; Save length of tokenised line
669: 2249+4 046A AF XOR A
670: 2253+13 046B 32A61E LD (LSTBIN),A ; Clear last byte input
671: 2266+17 046E CD4F08 CALL GETCHR ; Get next character
672: 2283+4 0471 B7 OR A ; Set flags
673: 2287+11 0472 F5 PUSH AF ; And save them
674: 2298+17 0473 CDDD04 CALL SRCHLN ; Search for line number in DE
675: 2315+10 0476 DA7F04 JP C,LINFND ; Jump if line found
676: 2325+10 0479 F1 POP AF ; Get status
677: 2335+11 047A F5 PUSH AF ; And re-save
678: 2346+10 047B CAC609 JP Z,ULERR ; Nothing after number - Error
679: 2356+4 047E B7 OR A ; Clear Carry
680: 2360+11 047F C5 LINFND: PUSH BC ; Save address of line in prog
681: 2371+10 0480 D29904 JP NC,INEWLN ; Line not found - Insert new
682: 2381+4 0483 EB EX DE,HL ; Next line address in DE
683: 2385+16 0484 2AB01E LD HL,(PROGND) ; End of program
684: 2401+7 0487 1A SFTPRG: LD A,(DE) ; Shift rest of program down
685: 2408+7 0488 02 LD (BC),A
686: 2415+6 0489 03 INC BC ; Next destination
687: 2421+6 048A 13 INC DE ; Next source
688: 2427+4 048B 7C LD A,H ; All done?
689: 2431+4 048C 92 SUB D ; Compare with D
690: 2435+7+5 048D 2002 JR NZ,$+4 ; Different - Exit
691: 2442+4 048F 7D LD A,L ; Get L
692: 2446+4 0490 93 SUB E ; Compare with E
693: 2450+10 0491 C28704 JP NZ,SFTPRG ; More to do
694: 2460+4 0494 60 LD H,B ; HL - New end of program
695: 2464+4 0495 69 LD L,C
696: 2468+16 0496 22B01E LD (PROGND),HL ; Update end of program
697:
698: 2484+10 0499 D1 INEWLN: POP DE ; Get address of line,
699: 2494+10 049A F1 POP AF ; Get status
700: 2504+10 049B CAC004 JP Z,SETPTR ; No text - Set up pointers
701: 2514+16 049E 2AB01E LD HL,(PROGND) ; Get end of program
702: 2530+19 04A1 E3 EX (SP),HL ; Get length of input line
703: 2549+10 04A2 C1 POP BC ; End of program to BC
704: 2559+11 04A3 09 ADD HL,BC ; Find new end
705: 2570+11 04A4 E5 PUSH HL ; Save new end
706: 2581+17 04A5 CDB403 CALL MOVUP ; Make space for line
707: 2598+10 04A8 E1 POP HL ; Restore new end
708: 2608+16 04A9 22B01E LD (PROGND),HL ; Update end of program pointer
709: 2624+4 04AC EB EX DE,HL ; Get line to move up in HL
710: 2628+7 04AD 74 LD (HL),H ; Save MSB
711: 2635+10 04AE D1 POP DE ; Get new line number
712: 2645+6 04AF 23 INC HL ; Skip pointer
713: 2651+6 04B0 23 INC HL
714: 2657+7 04B1 73 LD (HL),E ; Save LSB of line number
715: 2664+6 04B2 23 INC HL
716: 2670+7 04B3 72 LD (HL),D ; Save MSB of line number
717: 2677+6 04B4 23 INC HL ; To first byte in line
718: 2683+10 04B5 113B1E LD DE,BUFFER ; Copy buffer to program
719: 2693+7 04B8 1A MOVBUF: LD A,(DE) ; Get source
720: 2700+7 04B9 77 LD (HL),A ; Save destinations
721: 2707+6 04BA 23 INC HL ; Next source
722: 2713+6 04BB 13 INC DE ; Next destination
723: 2719+4 04BC B7 OR A ; Done?
724: 2723+10 04BD C2B804 JP NZ,MOVBUF ; No - Repeat
725: 2733+17 04C0 CD0C05 SETPTR: CALL RUNFST ; Set line pointers
726: 2750+6 04C3 23 INC HL ; To LSB of pointer
727: 2756+4 04C4 EB EX DE,HL ; Address to DE
728: 2760+4 04C5 62 PTRLP: LD H,D ; Address to HL
729: 2764+4 04C6 6B LD L,E
730: 2768+7 04C7 7E LD A,(HL) ; Get LSB of pointer
731: 2775+6 04C8 23 INC HL ; To MSB of pointer
732: 2781+7 04C9 B6 OR (HL) ; Compare with MSB pointer
733: 2788+10 04CA CA4604 JP Z,GETCMD ; Get command line if end
734: 2798+6 04CD 23 INC HL ; To LSB of line number
735: 2804+6 04CE 23 INC HL ; Skip line number
736: 2810+6 04CF 23 INC HL ; Point to first byte in line
737: 2816+4 04D0 AF XOR A ; Looking for 00 byte
738: 2820+7 04D1 BE FNDEND: CP (HL) ; Found end of line?
739: 2827+6 04D2 23 INC HL ; Move to next byte
740: 2833+10 04D3 C2D104 JP NZ,FNDEND ; No - Keep looking
741: 2843+4 04D6 EB EX DE,HL ; Next line address to HL
742: 2847+7 04D7 73 LD (HL),E ; Save LSB of pointer
743: 2854+6 04D8 23 INC HL
744: 2860+7 04D9 72 LD (HL),D ; Save MSB of pointer
745: 2867+10 04DA C3C504 JP PTRLP ; Do next line
746:
747: 2877+16 04DD 2A381E SRCHLN: LD HL,(BASTXT) ; Start of program text
748: 2893+4 04E0 44 SRCHLP: LD B,H ; BC = Address to look at
749: 2897+4 04E1 4D LD C,L
750: 2901+7 04E2 7E LD A,(HL) ; Get address of next line
751: 2908+6 04E3 23 INC HL
752: 2914+7 04E4 B6 OR (HL) ; End of program found?
753: 2921+6 04E5 2B DEC HL
754: 2927+5+6 04E6 C8 RET Z ; Yes - Line not found
755: 2932+6 04E7 23 INC HL
756: 2938+6 04E8 23 INC HL
757: 2944+7 04E9 7E LD A,(HL) ; Get LSB of line number
758: 2951+6 04EA 23 INC HL
759: 2957+7 04EB 66 LD H,(HL) ; Get MSB of line number
760: 2964+4 04EC 6F LD L,A
761: 2968+4 04ED 7C LD A,H ; Compare with line in DE
762: 2972+4 04EE 92 SUB D ; Compare with D
763: 2976+7+5 04EF 2002 JR NZ,$+4 ; Different - Exit
764: 2983+4 04F1 7D LD A,L ; Get L
765: 2987+4 04F2 93 SUB E ; Compare with E
766: 2991+4 04F3 60 LD H,B ; HL = Start of this line
767: 2995+4 04F4 69 LD L,C
768: 2999+7 04F5 7E LD A,(HL) ; Get LSB of next line address
769: 3006+6 04F6 23 INC HL
770: 3012+7 04F7 66 LD H,(HL) ; Get MSB of next line address
771: 3019+4 04F8 6F LD L,A ; Next line to HL
772: 3023+4 04F9 3F CCF
773: 3027+5+6 04FA C8 RET Z ; Lines found - Exit
774: 3032+4 04FB 3F CCF
775: 3036+5+6 04FC D0 RET NC ; Line not found,at line after
776: 3041+10 04FD C3E004 JP SRCHLP ; Keep looking
777:
778: 3051+5+6 0500 C0 NEW: RET NZ ; Return if any more on line
779: 3056+16 0501 2A381E CLRPTR: LD HL,(BASTXT) ; Point to start of program
780: 3072+4 0504 AF XOR A ; Set program area to empty
781: 3076+7 0505 77 LD (HL),A ; Save LSB = 00
782: 3083+6 0506 23 INC HL
783: 3089+7 0507 77 LD (HL),A ; Save MSB = 00
784: 3096+6 0508 23 INC HL
785: 3102+16 0509 22B01E LD (PROGND),HL ; Set program end
786:
787: 3118+16 050C 2A381E RUNFST: LD HL,(BASTXT) ; Clear all variables
788: 3134+6 050F 2B DEC HL
789:
790: 3140+16 0510 22A81E INTVAR: LD (BRKLIN),HL ; Initialise RUN variables
791: 3156+16 0513 2A891E LD HL,(LSTRAM) ; Get end of RAM
792: 3172+16 0516 229D1E LD (STRBOT),HL ; Clear string space
793: 3188+4 0519 AF XOR A
794: 3192+17 051A CD5E08 CALL RESTOR ; Reset DATA pointers
795: 3209+16 051D 2AB01E LD HL,(PROGND) ; Get end of program
796: 3225+16 0520 22B21E LD (VAREND),HL ; Clear variables
797: 3241+16 0523 22B41E LD (ARREND),HL ; Clear arrays
798:
799: 3257+10 0526 C1 CLREG: POP BC ; Save return address
800: 3267+16 0527 2A341E LD HL,(STRSPC) ; Get end of working RAM
801: 3283+6 052A F9 LD SP,HL ; Set stack
802: 3289+10 052B 218D1E LD HL,TMSTPL ; Temporary string pool
803: 3299+16 052E 228B1E LD (TMSTPT),HL ; Reset temporary string ptr
804: 3315+4 0531 AF XOR A ; A = 00
805: 3319+4 0532 6F LD L,A ; HL = 0000
806: 3323+4 0533 67 LD H,A
807: 3327+16 0534 22AE1E LD (CONTAD),HL ; No CONTinue
808: 3343+13 0537 32A51E LD (FORFLG),A ; Clear FOR flag
809: 3356+16 053A 22B81E LD (FNRGNM),HL ; Clear FN argument
810: 3372+11 053D E5 PUSH HL ; HL = 0000
811: 3383+11 053E C5 PUSH BC ; Put back return
812: 3394+16 053F 2AA81E DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN
813: 3410+10 0542 C9 RET ; Return to execution driver
814:
815: 3420+7 0543 3E3F PROMPT: LD A,'?' ; '?'
816: 3427+17 0545 CDC706 CALL OUTC ; Output character
817: 3444+7 0548 3E20 LD A,' ' ; Space
818: 3451+17 054A CDC706 CALL OUTC ; Output character
819: 3468+10 054D C3311E JP RINPUT ; Get input line
820:
821: 3478+4 0550 AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER
822: 3482+13 0551 32881E LD (DATFLG),A ; Reset literal flag
823: 3495+7 0554 0E05 LD C,2+3 ; 2 byte number and 3 nulls
824: 3502+10 0556 113B1E LD DE,BUFFER ; Start of input buffer
825: 3512+7 0559 7E CRNCLP: LD A,(HL) ; Get byte
826: 3519+7 055A FE20 CP ' ' ; Is it a space?
827: 3526+10 055C CAD805 JP Z,MOVDIR ; Yes - Copy direct
828: 3536+4 055F 47 LD B,A ; Save character
829: 3540+7 0560 FE22 CP '"' ; Is it a quote?
830: 3547+10 0562 CAF805 JP Z,CPYLIT ; Yes - Copy literal string
831: 3557+4 0565 B7 OR A ; Is it end of buffer?
832: 3561+10 0566 CAFF05 JP Z,ENDBUF ; Yes - End buffer
833: 3571+13 0569 3A881E LD A,(DATFLG) ; Get data type
834: 3584+4 056C B7 OR A ; Literal?
835: 3588+7 056D 7E LD A,(HL) ; Get byte to copy
836: 3595+10 056E C2D805 JP NZ,MOVDIR ; Literal - Copy direct
837: 3605+7 0571 FE3F CP '?' ; Is it '?' short for PRINT
838: 3612+7 0573 3E9C LD A,ZPRINT ; "PRINT" token
839: 3619+10 0575 CAD805 JP Z,MOVDIR ; Yes - replace it
840: 3629+7 0578 7E LD A,(HL) ; Get byte again
841: 3636+7 0579 FE30 CP '0' ; Is it less than '0'
842: 3643+10 057B DA8305 JP C,FNDWRD ; Yes - Look for reserved words
843: 3653+7 057E FE3C CP 60 ; ';'+1 Is it "0123456789:;" ?
844: 3660+10 0580 DAD805 JP C,MOVDIR ; Yes - copy it direct
845: 3670+11 0583 D5 FNDWRD: PUSH DE ; Look for reserved words
846: 3681+10 0584 118E01 LD DE,WORDS-1 ; Point to table
847: 3691+11 0587 C5 PUSH BC ; Save count
848: 3702+10 0588 01D405 LD BC,RETNAD ; Where to return to
849: 3712+11 058B C5 PUSH BC ; Save return address
850: 3723+7 058C 067F LD B,ZEND-1 ; First token value -1
851: 3730+7 058E 7E LD A,(HL) ; Get byte
852: 3737+7 058F FE61 CP 'a' ; Less than 'a' ?
853: 3744+10 0591 DA9C05 JP C,SEARCH ; Yes - search for words
854: 3754+7 0594 FE7B CP 'z'+1 ; Greater than 'z' ?
855: 3761+10 0596 D29C05 JP NC,SEARCH ; Yes - search for words
856: 3771+7 0599 E65F AND 01011111B ; Force upper case
857: 3778+7 059B 77 LD (HL),A ; Replace byte
858: 3785+7 059C 4E SEARCH: LD C,(HL) ; Search for a word
859: 3792+4 059D EB EX DE,HL
860: 3796+6 059E 23 GETNXT: INC HL ; Get next reserved word
861: 3802+7 059F B6 OR (HL) ; Start of word?
862: 3809+10 05A0 F29E05 JP P,GETNXT ; No - move on
863: 3819+4 05A3 04 INC B ; Increment token value
864: 3823+7 05A4 7E LD A,(HL) ; Get byte from table
865: 3830+7 05A5 E67F AND 01111111B ; Strip bit 7
866: 3837+5+6 05A7 C8 RET Z ; Return if end of list
867: 3842+4 05A8 B9 CP C ; Same character as in buffer?
868: 3846+10 05A9 C29E05 JP NZ,GETNXT ; No - get next word
869: 3856+4 05AC EB EX DE,HL
870: 3860+11 05AD E5 PUSH HL ; Save start of word
871:
872: 3871+6 05AE 13 NXTBYT: INC DE ; Look through rest of word
873: 3877+7 05AF 1A LD A,(DE) ; Get byte from table
874: 3884+4 05B0 B7 OR A ; End of word ?
875: 3888+10 05B1 FAD005 JP M,MATCH ; Yes - Match found
876: 3898+4 05B4 4F LD C,A ; Save it
877: 3902+4 05B5 78 LD A,B ; Get token value
878: 3906+7 05B6 FE88 CP ZGOTO ; Is it "GOTO" token ?
879: 3913+10 05B8 C2BF05 JP NZ,NOSPC ; No - Don't allow spaces
880: 3923+17 05BB CD4F08 CALL GETCHR ; Get next character
881: 3940+6 05BE 2B DEC HL ; Cancel increment from GETCHR
882: 3946+6 05BF 23 NOSPC: INC HL ; Next byte
883: 3952+7 05C0 7E LD A,(HL) ; Get byte
884: 3959+7 05C1 FE61 CP 'a' ; Less than 'a' ?
885: 3966+10 05C3 DAC805 JP C,NOCHNG ; Yes - don't change
886: 3976+7 05C6 E65F AND 01011111B ; Make upper case
887: 3983+4 05C8 B9 NOCHNG: CP C ; Same as in buffer ?
888: 3987+10 05C9 CAAE05 JP Z,NXTBYT ; Yes - keep testing
889: 3997+10 05CC E1 POP HL ; Get back start of word
890: 4007+10 05CD C39C05 JP SEARCH ; Look at next word
891:
892: 4017+4 05D0 48 MATCH: LD C,B ; Word found - Save token value
893: 4021+10 05D1 F1 POP AF ; Throw away return
894: 4031+4 05D2 EB EX DE,HL
895: 4035+10 05D3 C9 RET ; Return to "RETNAD"
896: 4045+4 05D4 EB RETNAD: EX DE,HL ; Get address in string
897: 4049+4 05D5 79 LD A,C ; Get token value
898: 4053+10 05D6 C1 POP BC ; Restore buffer length
899: 4063+10 05D7 D1 POP DE ; Get destination address
900: 4073+6 05D8 23 MOVDIR: INC HL ; Next source in buffer
901: 4079+7 05D9 12 LD (DE),A ; Put byte in buffer
902: 4086+6 05DA 13 INC DE ; Move up buffer
903: 4092+4 05DB 0C INC C ; Increment length of buffer
904: 4096+7 05DC D63A SUB ':' ; End of statement?
905: 4103+10 05DE CAE605 JP Z,SETLIT ; Jump if multi-statement line
906: 4113+7 05E1 FE49 CP ZDATA-3AH ; Is it DATA statement ?
907: 4120+10 05E3 C2E905 JP NZ,TSTREM ; No - see if REM
908: 4130+13 05E6 32881E SETLIT: LD (DATFLG),A ; Set literal flag
909: 4143+7 05E9 D654 TSTREM: SUB ZREM-3AH ; Is it REM?
910: 4150+10 05EB C25905 JP NZ,CRNCLP ; No - Leave flag
911: 4160+4 05EE 47 LD B,A ; Copy rest of buffer
912: 4164+7 05EF 7E NXTCHR: LD A,(HL) ; Get byte
913: 4171+4 05F0 B7 OR A ; End of line ?
914: 4175+10 05F1 CAFF05 JP Z,ENDBUF ; Yes - Terminate buffer
915: 4185+4 05F4 B8 CP B ; End of statement ?
916: 4189+10 05F5 CAD805 JP Z,MOVDIR ; Yes - Get next one
917: 4199+6 05F8 23 CPYLIT: INC HL ; Move up source string
918: 4205+7 05F9 12 LD (DE),A ; Save in destination
919: 4212+4 05FA 0C INC C ; Increment length
920: 4216+6 05FB 13 INC DE ; Move up destination
921: 4222+10 05FC C3EF05 JP NXTCHR ; Repeat
922:
923: 4232+10 05FF 213A1E ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer
924: 4242+7 0602 12 LD (DE),A ; Mark end of buffer (A = 00)
925: 4249+6 0603 13 INC DE
926: 4255+7 0604 12 LD (DE),A ; A = 00
927: 4262+6 0605 13 INC DE
928: 4268+7 0606 12 LD (DE),A ; A = 00
929: 4275+10 0607 C9 RET
930:
931: 4285+13 0608 3A271E DODEL: LD A,(NULFLG) ; Get null flag status
932: 4298+4 060B B7 OR A ; Is it zero?
933: 4302+7 060C 3E00 LD A,0 ; Zero A - Leave flags
934: 4309+13 060E 32271E LD (NULFLG),A ; Zero null flag
935: 4322+10 0611 C21C06 JP NZ,ECHDEL ; Set - Echo it
936: 4332+4 0614 05 DEC B ; Decrement length
937: 4336+10 0615 CA311E JP Z,RINPUT ; Get line again if empty
938: 4346+17 0618 CDC706 CALL OUTC ; Output null character
939: - 061B 3E .BYTE 3EH ; Skip "DEC B"
940: 4363+4 061C 05 ECHDEL: DEC B ; Count bytes in buffer
941: 4367+6 061D 2B DEC HL ; Back space buffer
942: 4373+10 061E CA3006 JP Z,OTKLN ; No buffer - Try again
943: 4383+7 0621 7E LD A,(HL) ; Get deleted byte
944: 4390+17 0622 CDC706 CALL OUTC ; Echo it
945: 4407+10 0625 C34206 JP MORINP ; Get more input
946:
947: 4417+4 0628 05 DELCHR: DEC B ; Count bytes in buffer
948: 4421+6 0629 2B DEC HL ; Back space buffer
949: 4427+17 062A CDC706 CALL OUTC ; Output character in A
950: 4444+10 062D C24206 JP NZ,MORINP ; Not end - Get more
951: 4454+17 0630 CDC706 OTKLN: CALL OUTC ; Output character in A
952: 4471+17 0633 CD190B KILIN: CALL PRNTCRLF ; Output CRLF
953: 4488+10 0636 C3311E JP RINPUT ; Get line again
954:
955: 4498+10 0639 213B1E TTYLIN: LD HL,BUFFER ; Get a line by character
956: 4508+7 063C 0601 LD B,1 ; Set buffer as empty
957: 4515+4 063E AF XOR A
958: 4519+13 063F 32271E LD (NULFLG),A ; Clear null flag
959: 4532+17 0642 CDF506 MORINP: CALL CLOTST ; Get character and test ^O
960: 4549+4 0645 4F LD C,A ; Save character in C
961: 4553+7 0646 FE7F CP DEL ; Delete character?
962: 4560+10 0648 CA0806 JP Z,DODEL ; Yes - Process it
963: 4570+13 064B 3A271E LD A,(NULFLG) ; Get null flag
964: 4583+4 064E B7 OR A ; Test null flag status
965: 4587+10 064F CA5B06 JP Z,PROCES ; Reset - Process character
966: 4597+7 0652 3E00 LD A,0 ; Set a null
967: 4604+17 0654 CDC706 CALL OUTC ; Output null
968: 4621+4 0657 AF XOR A ; Clear A
969: 4625+13 0658 32271E LD (NULFLG),A ; Reset null flag
970: 4638+4 065B 79 PROCES: LD A,C ; Get character
971: 4642+7 065C FE07 CP CTRLG ; Bell?
972: 4649+10 065E CA9F06 JP Z,PUTCTL ; Yes - Save it
973: 4659+7 0661 FE03 CP CTRLC ; Is it control "C"?
974: 4666+10+7 0663 CC190B CALL Z,PRNTCRLF ; Yes - Output CRLF
975: 4676+4 0666 37 SCF ; Flag break
976: 4680+5+6 0667 C8 RET Z ; Return if control "C"
977: 4685+7 0668 FE0D CP CR ; Is it enter?
978: 4692+10 066A CA140B JP Z,ENDINP ; Yes - Terminate input
979: 4702+7 066D FE15 CP CTRLU ; Is it control "U"?
980: 4709+10 066F CA3306 JP Z,KILIN ; Yes - Get another line
981: 4719+7 0672 FE40 CP '@' ; Is it "kill line"?
982: 4726+10 0674 CA3006 JP Z,OTKLN ; Yes - Kill line
983: 4736+7 0677 FE5F CP '_' ; Is it delete?
984: 4743+10 0679 CA2806 JP Z,DELCHR ; Yes - Delete character
985: 4753+7 067C FE08 CP BKSP ; Is it backspace?
986: 4760+10 067E CA2806 JP Z,DELCHR ; Yes - Delete character
987: 4770+7 0681 FE12 CP CTRLR ; Is it control "R"?
988: 4777+10 0683 C29A06 JP NZ,PUTBUF ; No - Put in buffer
989: 4787+11 0686 C5 PUSH BC ; Save buffer length
990: 4798+11 0687 D5 PUSH DE ; Save DE
991: 4809+11 0688 E5 PUSH HL ; Save buffer address
992: 4820+10 0689 3600 LD (HL),0 ; Mark end of buffer
993: 4830+17 068B CDEF06 CALL OUTNCR ; Output and do CRLF
994: 4847+10 068E 213B1E LD HL,BUFFER ; Point to buffer start
995: 4857+17 0691 CD0212 CALL PRS ; Output buffer
996: 4874+10 0694 E1 POP HL ; Restore buffer address
997: 4884+10 0695 D1 POP DE ; Restore DE
998: 4894+10 0696 C1 POP BC ; Restore buffer length
999: 4904+10 0697 C34206 JP MORINP ; Get another character
1000:
1001: 4914+7 069A FE20 PUTBUF: CP ' ' ; Is it a control code?
1002: 4921+10 069C DA4206 JP C,MORINP ; Yes - Ignore
1003: 4931+4 069F 78 PUTCTL: LD A,B ; Get number of bytes in buffer
1004: 4935+7 06A0 FE49 CP 72+1 ; Test for line overflow
1005: 4942+7 06A2 3E07 LD A,CTRLG ; Set a bell
1006: 4949+10 06A4 D2B406 JP NC,OUTNBS ; Ring bell if buffer full
1007: 4959+4 06A7 79 LD A,C ; Get character
1008: 4963+7 06A8 71 LD (HL),C ; Save in buffer
1009: 4970+13 06A9 32A61E LD (LSTBIN),A ; Save last input byte
1010: 4983+6 06AC 23 INC HL ; Move up buffer
1011: 4989+4 06AD 04 INC B ; Increment length
1012: 4993+17 06AE CDC706 OUTIT: CALL OUTC ; Output the character entered
1013: 5010+10 06B1 C34206 JP MORINP ; Get another character
1014:
1015: 5020+17 06B4 CDC706 OUTNBS: CALL OUTC ; Output bell and back over it
1016: 5037+7 06B7 3E08 LD A,BKSP ; Set back space
1017: 5044+10 06B9 C3AE06 JP OUTIT ; Output it and get more
1018:
1019: 5054+7 06BC 7E CHKSYN: LD A,(HL) ; Check syntax of character
1020: 5061+19 06BD E3 EX (SP),HL ; Address of test byte
1021: 5080+7 06BE BE CP (HL) ; Same as in code string?
1022: 5087+6 06BF 23 INC HL ; Return address
1023: 5093+19 06C0 E3 EX (SP),HL ; Put it back
1024: 5112+10 06C1 CA4F08 JP Z,GETCHR ; Yes - Get next character
1025: 5122+10 06C4 C3EB03 JP SNERR ; Different - ?SN Error
1026:
1027: 5132+11 06C7 F5 OUTC: PUSH AF ; Save character
1028: 5143+13 06C8 3A281E LD A,(CTLOFG) ; Get control "O" flag
1029: 5156+4 06CB B7 OR A ; Is it set?
1030: 5160+10 06CC C23A12 JP NZ,POPAF ; Yes - don't output
1031: 5170+10 06CF F1 POP AF ; Restore character
1032: 5180+11 06D0 C5 PUSH BC ; Save buffer length
1033: 5191+11 06D1 F5 PUSH AF ; Save character
1034: 5202+7 06D2 FE20 CP ' ' ; Is it a control code?
1035: 5209+10 06D4 DAEB06 JP C,DINPOS ; Yes - Don't INC POS(X)
1036: 5219+13 06D7 3A251E LD A,(LWIDTH) ; Get line width
1037: 5232+4 06DA 47 LD B,A ; To B
1038: 5236+13 06DB 3A851E LD A,(CURPOS) ; Get cursor position
1039: 5249+4 06DE 04 INC B ; Width 255?
1040: 5253+10 06DF CAE706 JP Z,INCLEN ; Yes - No width limit
1041: 5263+4 06E2 05 DEC B ; Restore width
1042: 5267+4 06E3 B8 CP B ; At end of line?
1043: 5271+10+7 06E4 CC190B CALL Z,PRNTCRLF ; Yes - output CRLF
1044: 5281+4 06E7 3C INCLEN: INC A ; Move on one character
1045: 5285+13 06E8 32851E LD (CURPOS),A ; Save new position
1046: 5298+10 06EB F1 DINPOS: POP AF ; Restore character
1047: 5308+10 06EC C1 POP BC ; Restore buffer length
1048: 5318+11 06ED CF RST 08H ; Send it
1049: 5329+10 06EE C9 RET
1050:
1051: 5339+17 06EF CDC706 OUTNCR: CALL OUTC ; Output character in A
1052: 5356+10 06F2 C3190B JP PRNTCRLF ; Output CRLF
1053:
1054: 5366+11 06F5 D7 CLOTST: RST 10H ; Get input character
1055: 5377+7 06F6 E67F AND 01111111B ; Strip bit 7
1056: 5384+7 06F8 FE0F CP CTRLO ; Is it control "O"?
1057: 5391+5+6 06FA C0 RET NZ ; No don't flip flag
1058: 5396+13 06FB 3A281E LD A,(CTLOFG) ; Get flag
1059: 5409+4 06FE 2F CPL ; Flip it
1060: 5413+13 06FF 32281E LD (CTLOFG),A ; Put it back
1061: 5426+4 0702 AF XOR A ; Null character
1062: 5430+10 0703 C9 RET
1063:
1064: 5440+17 0704 CD1B09 LIST: CALL ATOH ; ASCII number to DE
1065: 5457+5+6 0707 C0 RET NZ ; Return if anything extra
1066: 5462+10 0708 C1 POP BC ; Rubbish - Not needed
1067: 5472+17 0709 CDDD04 CALL SRCHLN ; Search for line number in DE
1068: 5489+11 070C C5 PUSH BC ; Save address of line
1069: 5500+17 070D CD5A07 CALL SETLIN ; Set up lines counter
1070: 5517+10 0710 E1 LISTLP: POP HL ; Restore address of line
1071: 5527+7 0711 4E LD C,(HL) ; Get LSB of next line
1072: 5534+6 0712 23 INC HL
1073: 5540+7 0713 46 LD B,(HL) ; Get MSB of next line
1074: 5547+6 0714 23 INC HL
1075: 5553+4 0715 78 LD A,B ; BC = 0 (End of program)?
1076: 5557+4 0716 B1 OR C
1077: 5561+10 0717 CA3904 JP Z,PRNTOK ; Yes - Go to command mode
1078: 5571+17 071A CD6307 CALL COUNT ; Count lines
1079: 5588+17 071D CD7908 CALL TSTBRK ; Test for break key
1080: 5605+11 0720 C5 PUSH BC ; Save address of next line
1081: 5616+17 0721 CD190B CALL PRNTCRLF ; Output CRLF
1082: 5633+7 0724 5E LD E,(HL) ; Get LSB of line number
1083: 5640+6 0725 23 INC HL
1084: 5646+7 0726 56 LD D,(HL) ; Get MSB of line number
1085: 5653+6 0727 23 INC HL
1086: 5659+11 0728 E5 PUSH HL ; Save address of line start
1087: 5670+4 0729 EB EX DE,HL ; Line number to HL
1088: 5674+17 072A CDCF18 CALL PRNTHL ; Output line number in decimal
1089: 5691+7 072D 3E20 LD A,' ' ; Space after line number
1090: 5698+10 072F E1 POP HL ; Restore start of line address
1091: 5708+17 0730 CDC706 LSTLP2: CALL OUTC ; Output character in A
1092: 5725+7 0733 7E LSTLP3: LD A,(HL) ; Get next byte in line
1093: 5732+4 0734 B7 OR A ; End of line?
1094: 5736+6 0735 23 INC HL ; To next byte in line
1095: 5742+10 0736 CA1007 JP Z,LISTLP ; Yes - get next line
1096: 5752+10 0739 F23007 JP P,LSTLP2 ; No token - output it
1097: 5762+7 073C D67F SUB ZEND-1 ; Find and output word
1098: 5769+4 073E 4F LD C,A ; Token offset+1 to C
1099: 5773+10 073F 118F01 LD DE,WORDS ; Reserved word list
1100: 5783+7 0742 1A FNDTOK: LD A,(DE) ; Get character in list
1101: 5790+6 0743 13 INC DE ; Move on to next
1102: 5796+4 0744 B7 OR A ; Is it start of word?
1103: 5800+10 0745 F24207 JP P,FNDTOK ; No - Keep looking for word
1104: 5810+4 0748 0D DEC C ; Count words
1105: 5814+10 0749 C24207 JP NZ,FNDTOK ; Not there - keep looking
1106: 5824+7 074C E67F OUTWRD: AND 01111111B ; Strip bit 7
1107: 5831+17 074E CDC706 CALL OUTC ; Output first character
1108: 5848+7 0751 1A LD A,(DE) ; Get next character
1109: 5855+6 0752 13 INC DE ; Move on to next
1110: 5861+4 0753 B7 OR A ; Is it end of word?
1111: 5865+10 0754 F24C07 JP P,OUTWRD ; No - output the rest
1112: 5875+10 0757 C33307 JP LSTLP3 ; Next byte in line
1113:
1114: 5885+11 075A E5 SETLIN: PUSH HL ; Set up LINES counter
1115: 5896+16 075B 2A2B1E LD HL,(LINESN) ; Get LINES number
1116: 5912+16 075E 22291E LD (LINESC),HL ; Save in LINES counter
1117: 5928+10 0761 E1 POP HL
1118: 5938+10 0762 C9 RET
1119:
1120: 5948+11 0763 E5 COUNT: PUSH HL ; Save code string address
1121: 5959+11 0764 D5 PUSH DE
1122: 5970+16 0765 2A291E LD HL,(LINESC) ; Get LINES counter
1123: 5986+10 0768 11FFFF LD DE,-1
1124: 5996+15 076B ED5A ADC HL,DE ; Decrement
1125: 6011+16 076D 22291E LD (LINESC),HL ; Put it back
1126: 6027+10 0770 D1 POP DE
1127: 6037+10 0771 E1 POP HL ; Restore code string address
1128: 6047+5+6 0772 F0 RET P ; Return if more lines to go
1129: 6052+11 0773 E5 PUSH HL ; Save code string address
1130: 6063+16 0774 2A2B1E LD HL,(LINESN) ; Get LINES number
1131: 6079+16 0777 22291E LD (LINESC),HL ; Reset LINES counter
1132: 6095+11 077A D7 RST 10H ; Get input character
1133: 6106+7 077B FE03 CP CTRLC ; Is it control "C"?
1134: 6113+10 077D CA8407 JP Z,RSLNBK ; Yes - Reset LINES and break
1135: 6123+10 0780 E1 POP HL ; Restore code string address
1136: 6133+10 0781 C36307 JP COUNT ; Keep on counting
1137:
1138: 6143+16 0784 2A2B1E RSLNBK: LD HL,(LINESN) ; Get LINES number
1139: 6159+16 0787 22291E LD (LINESC),HL ; Reset LINES counter
1140: 6175+10 078A C3E000 JP BRKRET ; Go and output "Break"
1141:
1142: 6185+7 078D 3E64 FOR: LD A,64H ; Flag "FOR" assignment
1143: 6192+13 078F 32A51E LD (FORFLG),A ; Save "FOR" flag
1144: 6205+17 0792 CD070A CALL LET ; Set up initial index
1145: 6222+10 0795 C1 POP BC ; Drop RETurn address
1146: 6232+11 0796 E5 PUSH HL ; Save code string address
1147: 6243+17 0797 CDF009 CALL DATA ; Get next statement address
1148: 6260+16 079A 22A11E LD (LOOPST),HL ; Save it for start of loop
1149: 6276+10 079D 210200 LD HL,2 ; Offset for "FOR" block
1150: 6286+11 07A0 39 ADD HL,SP ; Point to it
1151: 6297+17 07A1 CD9203 FORSLP: CALL LOKFOR ; Look for existing "FOR" block
1152: 6314+10 07A4 D1 POP DE ; Get code string address
1153: 6324+10 07A5 C2C107 JP NZ,FORFND ; No nesting found
1154: 6334+11 07A8 09 ADD HL,BC ; Move into "FOR" block
1155: 6345+11 07A9 D5 PUSH DE ; Save code string address
1156: 6356+6 07AA 2B DEC HL
1157: 6362+7 07AB 56 LD D,(HL) ; Get MSB of loop statement
1158: 6369+6 07AC 2B DEC HL
1159: 6375+7 07AD 5E LD E,(HL) ; Get LSB of loop statement
1160: 6382+6 07AE 23 INC HL
1161: 6388+6 07AF 23 INC HL
1162: 6394+11 07B0 E5 PUSH HL ; Save block address
1163: 6405+16 07B1 2AA11E LD HL,(LOOPST) ; Get address of loop statement
1164: 6421+4 07B4 7C LD A,H ; Compare the FOR loops
1165: 6425+4 07B5 92 SUB D ; Compare with D
1166: 6429+10 07B6 C2BB07 JP NZ,$+5 ; Different - Exit
1167: 6439+4 07B9 7D LD A,L ; Get L
1168: 6443+4 07BA 93 SUB E ; Compare with E
1169: 6447+10 07BB E1 POP HL ; Restore block address
1170: 6457+10 07BC C2A107 JP NZ,FORSLP ; Different FORs - Find another
1171: 6467+10 07BF D1 POP DE ; Restore code string address
1172: 6477+6 07C0 F9 LD SP,HL ; Remove all nested loops
1173:
1174: 6483+4 07C1 EB FORFND: EX DE,HL ; Code string address to HL
1175: 6487+7 07C2 0E08 LD C,8
1176: 6494+17 07C4 CDC803 CALL CHKSTK ; Check for 8 levels of stack
1177: 6511+11 07C7 E5 PUSH HL ; Save code string address
1178: 6522+16 07C8 2AA11E LD HL,(LOOPST) ; Get first statement of loop
1179: 6538+19 07CB E3 EX (SP),HL ; Save and restore code string
1180: 6557+11 07CC E5 PUSH HL ; Re-save code string address
1181: 6568+16 07CD 2A361E LD HL,(LINEAT) ; Get current line number
1182: 6584+19 07D0 E3 EX (SP),HL ; Save and restore code string
1183: 6603+17 07D1 CDF90C CALL TSTNUM ; Make sure it's a number
1184: 6620+17 07D4 CDBC06 CALL CHKSYN ; Make sure "TO" is next
1185: - 07D7 A3 .BYTE ZTO ; "TO" token
1186: 6637+17 07D8 CDF60C CALL GETNUM ; Get "TO" expression value
1187: 6654+20 07DB ED5BBE1E LD DE,(FPREG) ; Move "TO" value to BCDE
1188: 6674+20 07DF ED4BC01E LD BC,(FPREG+2)
1189: 6694+11 07E3 C5 PUSH BC ; Save "TO" value in block
1190: 6705+11 07E4 D5 PUSH DE
1191: 6716+10 07E5 010081 LD BC,8100H ; BCDE - 1 (default STEP)
1192: 6726+4 07E8 51 LD D,C ; C=0
1193: 6730+4 07E9 5A LD E,D ; D=0
1194: 6734+7 07EA 7E LD A,(HL) ; Get next byte in code string
1195: 6741+7 07EB FEA8 CP ZSTEP ; See if "STEP" is stated
1196: 6748+7 07ED 3E01 LD A,1 ; Sign of step = 1
1197: 6755+10 07EF C20308 JP NZ,SAVSTP ; No STEP given - Default to 1
1198: 6765+17 07F2 CD4F08 CALL GETCHR ; Jump over "STEP" token
1199: 6782+17 07F5 CDF60C CALL GETNUM ; Get step value
1200: 6799+20 07F8 ED5BBE1E LD DE,(FPREG) ; Move STEP to BCDE
1201: 6819+20 07FC ED4BC01E LD BC,(FPREG+2)
1202: 6839+17 0800 CD3F17 CALL TSTSGN ; Test sign of FPREG
1203: 6856+11 0803 C5 SAVSTP: PUSH BC ; Save the STEP value in block
1204: 6867+11 0804 D5 PUSH DE
1205: 6878+11 0805 F5 PUSH AF ; Save sign of STEP
1206: 6889+6 0806 33 INC SP ; Don't save flags
1207: 6895+11 0807 E5 PUSH HL ; Save code string address
1208: 6906+16 0808 2AA81E LD HL,(BRKLIN) ; Get address of index variable
1209: 6922+19 080B E3 EX (SP),HL ; Save and restore code string
1210: 6941+7 080C 0681 PUTFID: LD B,ZFOR ; "FOR" block marker
1211: 6948+11 080E C5 PUSH BC ; Save it
1212: 6959+6 080F 33 INC SP ; Don't save C
1213:
1214: 6965+17 0810 CD7908 RUNCNT: CALL TSTBRK ; Execution driver - Test break
1215: 6982+16 0813 22A81E LD (BRKLIN),HL ; Save code address for break
1216: 6998+7 0816 7E LD A,(HL) ; Get next byte in code string
1217: 7005+7 0817 FE3A CP ':' ; Multi statement line?
1218: 7012+10 0819 CA2F08 JP Z,EXCUTE ; Yes - Execute it
1219: 7022+4 081C B7 OR A ; End of line?
1220: 7026+10 081D C2EB03 JP NZ,SNERR ; No - Syntax error
1221: 7036+6 0820 23 INC HL ; Point to address of next line
1222: 7042+7 0821 7E LD A,(HL) ; Get LSB of line pointer
1223: 7049+6 0822 23 INC HL
1224: 7055+7 0823 B6 OR (HL) ; Is it zero (End of prog)?
1225: 7062+10 0824 CAA108 JP Z,ENDPRG ; Yes - Terminate execution
1226: 7072+6 0827 23 INC HL ; Point to line number
1227: 7078+7 0828 5E LD E,(HL) ; Get LSB of line number
1228: 7085+6 0829 23 INC HL
1229: 7091+7 082A 56 LD D,(HL) ; Get MSB of line number
1230: 7098+20 082B ED53361E LD (LINEAT),DE ; Save as current line number
1231: 7118+17 082F CD4F08 EXCUTE: CALL GETCHR ; Get key word
1232: 7135+10 0832 111008 LD DE,RUNCNT ; Where to RETurn to
1233: 7145+11 0835 D5 PUSH DE ; Save for RETurn
1234: 7156+5+6 0836 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT
1235: 7161+7 0837 D680 ONJMP: SUB ZEND ; Is it a token?
1236: 7168+10 0839 DA070A JP C,LET ; No - try to assign it
1237: 7178+7 083C FE22 CP ZNEW+1-ZEND ; END to NEW ?
1238: 7185+10 083E D2EB03 JP NC,SNERR ; Not a key word - ?SN Error
1239: 7195+4 0841 07 RLCA ; Double it
1240: 7199+4 0842 4F LD C,A ; BC = Offset into table
1241: 7203+7 0843 0600 LD B,0
1242: 7210+4 0845 EB EX DE,HL ; Save code string address
1243: 7214+10 0846 219B02 LD HL,WORDTB ; Keyword address table
1244: 7224+11 0849 09 ADD HL,BC ; Point to routine address
1245: 7235+7 084A 4E LD C,(HL) ; Get LSB of routine address
1246: 7242+6 084B 23 INC HL
1247: 7248+7 084C 46 LD B,(HL) ; Get MSB of routine address
1248: 7255+11 084D C5 PUSH BC ; Save routine address
1249: 7266+4 084E EB EX DE,HL ; Restore code string address
1250:
1251: 7270+6 084F 23 GETCHR: INC HL ; Point to next character
1252: 7276+7 0850 7E LD A,(HL) ; Get next code string byte
1253: 7283+7 0851 FE3A CP ':' ; Z if ':'
1254: 7290+5+6 0853 D0 RET NC ; NC if > "9"
1255: 7295+7 0854 FE20 CP ' '
1256: 7302+7+5 0856 28F7 JR Z,GETCHR ; Skip over spaces
1257: 7309+7 0858 FE30 CP '0'
1258: 7316+4 085A 3F CCF ; NC if < '0'
1259: 7320+4 085B 3C INC A ; Test for zero - Leave carry
1260: 7324+4 085C 3D DEC A ; Z if Null
1261: 7328+10 085D C9 RET
1262:
1263: 7338+4 085E EB RESTOR: EX DE,HL ; Save code string address
1264: 7342+16 085F 2A381E LD HL,(BASTXT) ; Point to start of program
1265: 7358+10 0862 CA7308 JP Z,RESTNL ; Just RESTORE - reset pointer
1266: 7368+4 0865 EB EX DE,HL ; Restore code string address
1267: 7372+17 0866 CD1B09 CALL ATOH ; Get line number to DE
1268: 7389+11 0869 E5 PUSH HL ; Save code string address
1269: 7400+17 086A CDDD04 CALL SRCHLN ; Search for line number in DE
1270: 7417+4 086D 60 LD H,B ; HL = Address of line
1271: 7421+4 086E 69 LD L,C
1272: 7425+10 086F D1 POP DE ; Restore code string address
1273: 7435+10 0870 D2C609 JP NC,ULERR ; ?UL Error if not found
1274: 7445+6 0873 2B RESTNL: DEC HL ; Byte before DATA statement
1275: 7451+16 0874 22B61E UPDATA: LD (NXTDAT),HL ; Update DATA pointer
1276: 7467+4 0877 EB EX DE,HL ; Restore code string address
1277: 7471+10 0878 C9 RET
1278:
1279:
1280: 7481+11 0879 DF TSTBRK: RST 18H ; Check input status
1281: 7492+4 087A B7 OR A ; Check count Zero
1282: 7496+5+6 087B C8 RET Z ; No key, go back
1283: 7501+11 087C D7 RST 10H ; Get the key into A
1284: 7512+7 087D FE1B CP ESC ; Escape key?
1285: 7519+7+5 087F 2811 JR Z,BRK ; Yes, break
1286: 7526+7 0881 FE03 CP CTRLC ; <Ctrl-C>
1287: 7533+7+5 0883 280D JR Z,BRK ; Yes, break
1288: 7540+7 0885 FE13 CP CTRLS ; Stop scrolling?
1289: 7547+5+6 0887 C0 RET NZ ; Other key, ignore
1290:
1291:
1292: 7552+11 0888 D7 STALL: RST 10H ; Wait for key
1293: 7563+7 0889 FE11 CP CTRLQ ; Resume scrolling?
1294: 7570+5+6 088B C8 RET Z ; Release the chokehold
1295: 7575+7 088C FE03 CP CTRLC ; Second break?
1296: 7582+7+5 088E 2807 JR Z,STOP ; Break during hold exits prog
1297: 7589+12 0890 18F6 JR STALL ; Loop until <Ctrl-Q> or <brk>
1298:
1299: 7601+7 0892 3EFF BRK: LD A,$FF ; Set BRKFLG
1300: 7608+13 0894 32301E LD (BRKFLG),A ; Store it
1301:
1302:
1303: 7621+5+6 0897 C0 STOP: RET NZ ; Exit if anything else
1304: - 0898 F6 .BYTE 0F6H ; Flag "STOP"
1305: 7626+5+6 0899 C0 PEND: RET NZ ; Exit if anything else
1306: 7631+16 089A 22A81E LD (BRKLIN),HL ; Save point of break
1307: - 089D 21 .BYTE 21H ; Skip "OR 11111111B"
1308: 7647+7 089E F6FF INPBRK: OR 11111111B ; Flag "Break" wanted
1309: 7654+10 08A0 C1 POP BC ; Return not needed and more
1310: 7664+16 08A1 2A361E ENDPRG: LD HL,(LINEAT) ; Get current line number
1311: 7680+11 08A4 F5 PUSH AF ; Save STOP / END status
1312: 7691+4 08A5 7D LD A,L ; Is it direct break?
1313: 7695+4 08A6 A4 AND H
1314: 7699+4 08A7 3C INC A ; Line is -1 if direct break
1315: 7703+10 08A8 CAB408 JP Z,NOLIN ; Yes - No line number
1316: 7713+16 08AB 22AC1E LD (ERRLIN),HL ; Save line of break
1317: 7729+16 08AE 2AA81E LD HL,(BRKLIN) ; Get point of break
1318: 7745+16 08B1 22AE1E LD (CONTAD),HL ; Save point to CONTinue
1319: 7761+4 08B4 AF NOLIN: XOR A
1320: 7765+13 08B5 32281E LD (CTLOFG),A ; Enable output
1321: 7778+17 08B8 CD0C0B CALL STTLIN ; Start a new line
1322: 7795+10 08BB F1 POP AF ; Restore STOP / END status
1323: 7805+10 08BC 218803 LD HL,BRKMSG ; "Break" message
1324: 7815+10 08BF C21F04 JP NZ,ERRIN ; "in line" wanted?
1325: 7825+10 08C2 C33904 JP PRNTOK ; Go to command mode
1326:
1327: 7835+16 08C5 2AAE1E CONT: LD HL,(CONTAD) ; Get CONTinue address
1328: 7851+4 08C8 7C LD A,H ; Is it zero?
1329: 7855+4 08C9 B5 OR L
1330: 7859+7 08CA 1E20 LD E,CN ; ?CN Error
1331: 7866+10 08CC CAFF03 JP Z,ERROR ; Yes - output "?CN Error"
1332: 7876+4 08CF EB EX DE,HL ; Save code string address
1333: 7880+16 08D0 2AAC1E LD HL,(ERRLIN) ; Get line of last break
1334: 7896+16 08D3 22361E LD (LINEAT),HL ; Set up current line number
1335: 7912+4 08D6 EB EX DE,HL ; Restore code string address
1336: 7916+10 08D7 C9 RET ; CONTinue where left off
1337:
1338: 7926+17 08D8 CDA114 NULL: CALL GETINT ; Get integer 0-255
1339: 7943+5+6 08DB C0 RET NZ ; Return if bad value
1340: 7948+13 08DC 32241E LD (NULLS),A ; Set nulls number
1341: 7961+10 08DF C9 RET
1342:
1343: 7971+11 08E0 E5 ACCSUM: PUSH HL ; Save address in array
1344: 7982+16 08E1 2A2D1E LD HL,(CHKSUM) ; Get check sum
1345: 7998+7 08E4 0600 LD B,0 ; BC - Value of byte
1346: 8005+4 08E6 4F LD C,A
1347: 8009+11 08E7 09 ADD HL,BC ; Add byte to check sum
1348: 8020+16 08E8 222D1E LD (CHKSUM),HL ; Re-save check sum
1349: 8036+10 08EB E1 POP HL ; Restore address in array
1350: 8046+10 08EC C9 RET
1351:
1352: 8056+7 08ED 7E CHKLTR: LD A,(HL) ; Get byte
1353: 8063+7 08EE FE41 CP 'A' ; < 'a' ?
1354: 8070+5+6 08F0 D8 RET C ; Carry set if not letter
1355: 8075+7 08F1 FE5B CP 'Z'+1 ; > 'z' ?
1356: 8082+4 08F3 3F CCF
1357: 8086+10 08F4 C9 RET ; Carry set if not letter
1358:
1359: 8096+17 08F5 CD4F08 FPSINT: CALL GETCHR ; Get next character
1360: 8113+17 08F8 CDF60C POSINT: CALL GETNUM ; Get integer 0 to 32767
1361: 8130+17 08FB CD3F17 DEPINT: CALL TSTSGN ; Test sign of FPREG
1362: 8147+10 08FE FA1609 JP M,FCERR ; Negative - ?FC Error
1363: 8157+13 0901 3AC11E DEINT: LD A,(FPEXP) ; Get integer value to DE
1364: 8170+7 0904 FE90 CP 80H+16 ; Exponent in range (16 bits)?
1365: 8177+10 0906 DAD417 JP C,FPINT ; Yes - convert it
1366: 8187+10 0909 018090 LD BC,9080H ; BCDE = -32768
1367: 8197+10 090C 110000 LD DE,0000
1368: 8207+11 090F E5 PUSH HL ; Save code string address
1369: 8218+17 0910 CDA717 CALL CMPNUM ; Compare FPREG with BCDE
1370: 8235+10 0913 E1 POP HL ; Restore code string address
1371: 8245+4 0914 51 LD D,C ; MSB to D
1372: 8249+5+6 0915 C8 RET Z ; Return if in range
1373: 8254+7 0916 1E08 FCERR: LD E,FC ; ?FC Error
1374: 8261+10 0918 C3FF03 JP ERROR ; Output error-
1375:
1376: 8271+6 091B 2B ATOH: DEC HL ; ASCII number to DE binary
1377: 8277+10 091C 110000 GETLN: LD DE,0 ; Get number to DE
1378: 8287+17 091F CD4F08 GTLNLP: CALL GETCHR ; Get next character
1379: 8304+5+6 0922 D0 RET NC ; Exit if not a digit
1380: 8309+11 0923 E5 PUSH HL ; Save code string address
1381: 8320+11 0924 F5 PUSH AF ; Save digit
1382: 8331+10 0925 219819 LD HL,65529/10 ; Largest number 65529
1383: 8341+4 0928 7C LD A,H ; Number in range?
1384: 8345+4 0929 92 SUB D ; Compare with D
1385: 8349+10 092A C22F09 JP NZ,$+5 ; Different - Exit
1386: 8359+4 092D 7D LD A,L ; Get L
1387: 8363+4 092E 93 SUB E ; Compare with E
1388: 8367+10 092F DAEB03 JP C,SNERR ; No - ?SN Error
1389: 8377+4 0932 62 LD H,D ; HL = Number
1390: 8381+4 0933 6B LD L,E
1391: 8385+11 0934 19 ADD HL,DE ; Times 2
1392: 8396+11 0935 29 ADD HL,HL ; Times 4
1393: 8407+11 0936 19 ADD HL,DE ; Times 5
1394: 8418+11 0937 29 ADD HL,HL ; Times 10
1395: 8429+10 0938 F1 POP AF ; Restore digit
1396: 8439+7 0939 D630 SUB '0' ; Make it 0 to 9
1397: 8446+4 093B 5F LD E,A ; DE = Value of digit
1398: 8450+7 093C 1600 LD D,0
1399: 8457+11 093E 19 ADD HL,DE ; Add to number
1400: 8468+4 093F EB EX DE,HL ; Number to DE
1401: 8472+10 0940 E1 POP HL ; Restore code string address
1402: 8482+10 0941 C31F09 JP GTLNLP ; Go to next character
1403:
1404: 8492+10 0944 CA1005 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters
1405: 8502+17 0947 CDF808 CALL POSINT ; Get integer 0 to 32767 to DE
1406: 8519+6 094A 2B DEC HL ; Cancel increment
1407: 8525+17 094B CD4F08 CALL GETCHR ; Get next character
1408: 8542+11 094E E5 PUSH HL ; Save code string address
1409: 8553+16 094F 2A891E LD HL,(LSTRAM) ; Get end of RAM
1410: 8569+10 0952 CA6709 JP Z,STORED ; No value given - Use stored
1411: 8579+10 0955 E1 POP HL ; Restore code string address
1412: 8589+17 0956 CDBC06 CALL CHKSYN ; Check for comma
1413: - 0959 2C .BYTE ','
1414: 8606+11 095A D5 PUSH DE ; Save number
1415: 8617+17 095B CDF808 CALL POSINT ; Get integer 0 to 32767
1416: 8634+6 095E 2B DEC HL ; Cancel increment
1417: 8640+17 095F CD4F08 CALL GETCHR ; Get next character
1418: 8657+10 0962 C2EB03 JP NZ,SNERR ; ?SN Error if more on line
1419: 8667+19 0965 E3 EX (SP),HL ; Save code string address
1420: 8686+4 0966 EB EX DE,HL ; Number to DE
1421: 8690+4 0967 7D STORED: LD A,L ; Get LSB of new RAM top
1422: 8694+4 0968 93 SUB E ; Subtract LSB of string space
1423: 8698+4 0969 5F LD E,A ; Save LSB
1424: 8702+4 096A 7C LD A,H ; Get MSB of new RAM top
1425: 8706+4 096B 9A SBC A,D ; Subtract MSB of string space
1426: 8710+4 096C 57 LD D,A ; Save MSB
1427: 8714+10 096D DAE003 JP C,OMERR ; ?OM Error if not enough mem
1428: 8724+11 0970 E5 PUSH HL ; Save RAM top
1429: 8735+16 0971 2AB01E LD HL,(PROGND) ; Get program end
1430: 8751+10 0974 012800 LD BC,40 ; 40 Bytes minimum working RAM
1431: 8761+11 0977 09 ADD HL,BC ; Get lowest address
1432: 8772+4 0978 7C LD A,H ; Enough memory?
1433: 8776+4 0979 92 SUB D ; Compare with D
1434: 8780+7+5 097A 2002 JR NZ,$+4 ; Different - Exit
1435: 8787+4 097C 7D LD A,L ; Get L
1436: 8791+4 097D 93 SUB E ; Compare with E
1437: 8795+10 097E D2E003 JP NC,OMERR ; No - ?OM Error
1438: 8805+4 0981 EB EX DE,HL ; RAM top to HL
1439: 8809+16 0982 22341E LD (STRSPC),HL ; Set new string space
1440: 8825+10 0985 E1 POP HL ; End of memory to use
1441: 8835+16 0986 22891E LD (LSTRAM),HL ; Set new top of RAM
1442: 8851+10 0989 E1 POP HL ; Restore code string address
1443: 8861+10 098A C31005 JP INTVAR ; Initialise variables
1444:
1445: 8871+10 098D CA0C05 RUN: JP Z,RUNFST ; RUN from start if just RUN
1446: 8881+17 0990 CD1005 CALL INTVAR ; Initialise variables
1447: 8898+10 0993 011008 LD BC,RUNCNT ; Execution driver loop
1448: 8908+10 0996 C3A909 JP RUNLIN ; RUN from line number
1449:
1450: 8918+7 0999 0E03 GOSUB: LD C,3 ; 3 Levels of stack needed
1451: 8925+17 099B CDC803 CALL CHKSTK ; Check for 3 levels of stack
1452: 8942+10 099E C1 POP BC ; Get return address
1453: 8952+11 099F E5 PUSH HL ; Save code string for RETURN
1454: 8963+11 09A0 E5 PUSH HL ; And for GOSUB routine
1455: 8974+16 09A1 2A361E LD HL,(LINEAT) ; Get current line
1456: 8990+19 09A4 E3 EX (SP),HL ; Into stack - Code string out
1457: 9009+7 09A5 3E8C LD A,ZGOSUB ; "GOSUB" token
1458: 9016+11 09A7 F5 PUSH AF ; Save token
1459: 9027+6 09A8 33 INC SP ; Don't save flags
1460:
1461: 9033+11 09A9 C5 RUNLIN: PUSH BC ; Save return address
1462: 9044+17 09AA CD1B09 GOTO: CALL ATOH ; ASCII number to DE binary
1463: 9061+17 09AD CDF209 CALL REM ; Get end of line
1464: 9078+11 09B0 E5 PUSH HL ; Save end of line
1465: 9089+16 09B1 2A361E LD HL,(LINEAT) ; Get current line
1466: 9105+4 09B4 7C LD A,H ; Line after current?
1467: 9109+4 09B5 92 SUB D ; Compare with D
1468: 9113+7+5 09B6 2002 JR NZ,$+4 ; Different - Exit
1469: 9120+4 09B8 7D LD A,L ; Get L
1470: 9124+4 09B9 93 SUB E ; Compare with E
1471: 9128+10 09BA E1 POP HL ; Restore end of line
1472: 9138+6 09BB 23 INC HL ; Start of next line
1473: 9144+10+7 09BC DCE004 CALL C,SRCHLP ; Line is after current line
1474: 9154+10+7 09BF D4DD04 CALL NC,SRCHLN ; Line is before current line
1475: 9164+4 09C2 60 LD H,B ; Set up code string address
1476: 9168+4 09C3 69 LD L,C
1477: 9172+6 09C4 2B DEC HL ; Incremented after
1478: 9178+5+6 09C5 D8 RET C ; Line found
1479: 9183+7 09C6 1E0E ULERR: LD E,UL ; ?UL Error
1480: 9190+10 09C8 C3FF03 JP ERROR ; Output error message
1481:
1482: 9200+5+6 09CB C0 RETURN: RET NZ ; Return if not just RETURN
1483: 9205+7 09CC 16FF LD D,-1 ; Flag "GOSUB" search
1484: 9212+17 09CE CD8E03 CALL BAKSTK ; Look "GOSUB" block
1485: 9229+6 09D1 F9 LD SP,HL ; Kill all FORs in subroutine
1486: 9235+7 09D2 FE8C CP ZGOSUB ; Test for "GOSUB" token
1487: 9242+7 09D4 1E04 LD E,RG ; ?RG Error
1488: 9249+10 09D6 C2FF03 JP NZ,ERROR ; Error if no "GOSUB" found
1489: 9259+10 09D9 E1 POP HL ; Get RETURN line number
1490: 9269+16 09DA 22361E LD (LINEAT),HL ; Save as current
1491: 9285+6 09DD 23 INC HL ; Was it from direct statement?
1492: 9291+4 09DE 7C LD A,H
1493: 9295+4 09DF B5 OR L ; Return to line
1494: 9299+10 09E0 C2EA09 JP NZ,RETLIN ; No - Return to line
1495: 9309+13 09E3 3AA61E LD A,(LSTBIN) ; Any INPUT in subroutine?
1496: 9322+4 09E6 B7 OR A ; If so buffer is corrupted
1497: 9326+10 09E7 C23804 JP NZ,POPNOK ; Yes - Go to command mode
1498: 9336+10 09EA 211008 RETLIN: LD HL,RUNCNT ; Execution driver loop
1499: 9346+19 09ED E3 EX (SP),HL ; Into stack - Code string out
1500: - 09EE 3E .BYTE 3EH ; Skip "POP HL"
1501: 9365+10 09EF E1 NXTDTA: POP HL ; Restore code string address
1502:
1503: - 09F0 013A DATA: .BYTE 01H,3AH ; ':' End of statement
1504: 9375+7 09F2 0E00 REM: LD C,0 ; 00 End of statement
1505: 9382+7 09F4 0600 LD B,0
1506: 9389+4 09F6 79 NXTSTL: LD A,C ; Statement and byte
1507: 9393+4 09F7 48 LD C,B
1508: 9397+4 09F8 47 LD B,A ; Statement end byte
1509: 9401+7 09F9 7E NXTSTT: LD A,(HL) ; Get byte
1510: 9408+4 09FA B7 OR A ; End of line?
1511: 9412+5+6 09FB C8 RET Z ; Yes - Exit
1512: 9417+4 09FC B8 CP B ; End of statement?
1513: 9421+5+6 09FD C8 RET Z ; Yes - Exit
1514: 9426+6 09FE 23 INC HL ; Next byte
1515: 9432+7 09FF FE22 CP '"' ; Literal string?
1516: 9439+10 0A01 CAF609 JP Z,NXTSTL ; Yes - Look for another '"'
1517: 9449+10 0A04 C3F909 JP NXTSTT ; Keep looking
1518:
1519: 9459+17 0A07 CDF50E LET: CALL GETVAR ; Get variable name
1520: 9476+17 0A0A CDBC06 CALL CHKSYN ; Make sure "=" follows
1521: - 0A0D B1 .BYTE ZEQUAL ; "=" token
1522: 9493+11 0A0E D5 PUSH DE ; Save address of variable
1523: 9504+13 0A0F 3A871E LD A,(TYPE) ; Get data type
1524: 9517+11 0A12 F5 PUSH AF ; Save type
1525: 9528+17 0A13 CD080D CALL EVAL ; Evaluate expression
1526: 9545+10 0A16 F1 POP AF ; Restore type
1527: 9555+19 0A17 E3 EX (SP),HL ; Save code - Get var addr
1528: 9574+16 0A18 22A81E LD (BRKLIN),HL ; Save address of variable
1529: 9590+4 0A1B 1F RRA ; Adjust type
1530: 9594+17 0A1C CDFB0C CALL CHKTYP ; Check types are the same
1531: 9611+10 0A1F CA690A JP Z,LETNUM ; Numeric - Move value
1532: 9621+11 0A22 E5 LETSTR: PUSH HL ; Save address of string var
1533: 9632+16 0A23 2ABE1E LD HL,(FPREG) ; Pointer to string entry
1534: 9648+11 0A26 E5 PUSH HL ; Save it on stack
1535: 9659+6 0A27 23 INC HL ; Skip over length
1536: 9665+6 0A28 23 INC HL
1537: 9671+7 0A29 5E LD E,(HL) ; LSB of string address
1538: 9678+6 0A2A 23 INC HL
1539: 9684+7 0A2B 56 LD D,(HL) ; MSB of string address
1540: 9691+16 0A2C 2A381E LD HL,(BASTXT) ; Point to start of program
1541: 9707+4 0A2F 7C LD A,H ; Is string before program?
1542: 9711+4 0A30 92 SUB D ; Compare with D
1543: 9715+7+5 0A31 2002 JR NZ,$+4 ; Different - Exit
1544: 9722+4 0A33 7D LD A,L ; Get L
1545: 9726+4 0A34 93 SUB E ; Compare with E
1546: 9730+10 0A35 D2520A JP NC,CRESTR ; Yes - Create string entry
1547: 9740+16 0A38 2A341E LD HL,(STRSPC) ; Point to string space
1548: 9756+4 0A3B 7C LD A,H ; Is string literal in program?
1549: 9760+4 0A3C 92 SUB D ; Compare with D
1550: 9764+7+5 0A3D 2002 JR NZ,$+4 ; Different - Exit
1551: 9771+4 0A3F 7D LD A,L ; Get L
1552: 9775+4 0A40 93 SUB E ; Compare with E
1553: 9779+10 0A41 D1 POP DE ; Restore address of string
1554: 9789+10 0A42 D25A0A JP NC,MVSTPT ; Yes - Set up pointer
1555: 9799+10 0A45 21991E LD HL,TMPSTR ; Temporary string pool
1556: 9809+4 0A48 7C LD A,H ; Is string in temporary pool?
1557: 9813+4 0A49 92 SUB D ; Compare with D
1558: 9817+7+5 0A4A 2002 JR NZ,$+4 ; Different - Exit
1559: 9824+4 0A4C 7D LD A,L ; Get L
1560: 9828+4 0A4D 93 SUB E ; Compare with E
1561: 9832+10 0A4E D25A0A JP NC,MVSTPT ; No - Set up pointer
1562: - 0A51 3E .BYTE 3EH ; Skip "POP DE"
1563: 9842+10 0A52 D1 CRESTR: POP DE ; Restore address of string
1564: 9852+17 0A53 CD7713 CALL BAKTMP ; Back to last tmp-str entry
1565: 9869+4 0A56 EB EX DE,HL ; Address of string entry
1566: 9873+17 0A57 CD9211 CALL SAVSTR ; Save string in string area
1567: 9890+17 0A5A CD7713 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry
1568: 9907+10 0A5D E1 POP HL ; Get string pointer
1569: 9917+4 0A5E EB EX DE,HL ; Move string pointer to var
1570: 9921+16 0A5F EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
1571: 9937+16 0A61 EDA0 LDI
1572: 9953+16 0A63 EDA0 LDI
1573: 9969+16 0A65 EDA0 LDI
1574: 9985+10 0A67 E1 POP HL ; Restore code string address
1575: 9995+10 0A68 C9 RET
1576:
1577:10005+11 0A69 E5 LETNUM: PUSH HL ; Save address of variable
1578:10016+10 0A6A 11BE1E LD DE,FPREG ; Move FPREG to variable
1579:10026+4 0A6D EB EX DE,HL
1580:10030+16 0A6E EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
1581:10046+16 0A70 EDA0 LDI
1582:10062+16 0A72 EDA0 LDI
1583:10078+16 0A74 EDA0 LDI
1584:10094+10 0A76 D1 POP DE ; Restore address of variable
1585:10104+10 0A77 E1 POP HL ; Restore code string address
1586:10114+10 0A78 C9 RET
1587:
1588:10124+17 0A79 CDA114 ON: CALL GETINT ; Get integer 0-255
1589:10141+7 0A7C 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token
1590:10148+4 0A7D 47 LD B,A ; Save in B
1591:10152+7 0A7E FE8C CP ZGOSUB ; "GOSUB" token?
1592:10159+10 0A80 CA880A JP Z,ONGO ; Yes - Find line number
1593:10169+17 0A83 CDBC06 CALL CHKSYN ; Make sure it's "GOTO"
1594: - 0A86 88 .BYTE ZGOTO ; "GOTO" token
1595:10186+6 0A87 2B DEC HL ; Cancel increment
1596:10192+4 0A88 4B ONGO: LD C,E ; Integer of branch value
1597:10196+4 0A89 0D ONGOLP: DEC C ; Count branches
1598:10200+4 0A8A 78 LD A,B ; Get "GOTO" or "GOSUB" token
1599:10204+10 0A8B CA3708 JP Z,ONJMP ; Go to that line if right one
1600:10214+17 0A8E CD1C09 CALL GETLN ; Get line number to DE
1601:10231+7 0A91 FE2C CP ',' ; Another line number?
1602:10238+5+6 0A93 C0 RET NZ ; No - Drop through
1603:10243+10 0A94 C3890A JP ONGOLP ; Yes - loop
1604:
1605:10253+17 0A97 CD080D IF: CALL EVAL ; Evaluate expression
1606:10270+7 0A9A 7E LD A,(HL) ; Get token
1607:10277+7 0A9B FE88 CP ZGOTO ; "GOTO" token?
1608:10284+10 0A9D CAA50A JP Z,IFGO ; Yes - Get line
1609:10294+17 0AA0 CDBC06 CALL CHKSYN ; Make sure it's "THEN"
1610: - 0AA3 A6 .BYTE ZTHEN ; "THEN" token
1611:10311+6 0AA4 2B DEC HL ; Cancel increment
1612:10317+17 0AA5 CDF90C IFGO: CALL TSTNUM ; Make sure it's numeric
1613:10334+17 0AA8 CD3F17 CALL TSTSGN ; Test state of expression
1614:10351+10 0AAB CAF209 JP Z,REM ; False - Drop through
1615:10361+17 0AAE CD4F08 CALL GETCHR ; Get next character
1616:10378+10 0AB1 DAAA09 JP C,GOTO ; Number - GOTO that line
1617:10388+10 0AB4 C33608 JP IFJMP ; Otherwise do statement
1618:
1619:10398+6 0AB7 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs
1620:10404+17 0AB8 CD4F08 CALL GETCHR ; Get next character
1621:10421+10 0ABB CA190B PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT
1622:10431+5+6 0ABE C8 PRNTLP: RET Z ; End of list - Exit
1623:10436+7 0ABF FEA2 CP ZTAB ; "TAB(" token?
1624:10443+10 0AC1 CA4C0B JP Z,DOTAB ; Yes - Do TAB routine
1625:10453+7 0AC4 FEA5 CP ZSPC ; "SPC(" token?
1626:10460+10 0AC6 CA4C0B JP Z,DOTAB ; Yes - Do SPC routine
1627:10470+11 0AC9 E5 PUSH HL ; Save code string address
1628:10481+7 0ACA FE2C CP ',' ; Comma?
1629:10488+10 0ACC CA350B JP Z,DOCOM ; Yes - Move to next zone
1630:10498+7 0ACF FE3B CP 59 ; ';' Semi-colon?
1631:10505+10 0AD1 CA6F0B JP Z,NEXITM ; Do semi-colon routine
1632:10515+10 0AD4 C1 POP BC ; Code string address to BC
1633:10525+17 0AD5 CD080D CALL EVAL ; Evaluate expression
1634:10542+11 0AD8 E5 PUSH HL ; Save code string address
1635:10553+13 0AD9 3A871E LD A,(TYPE) ; Get variable type
1636:10566+4 0ADC B7 OR A ; Is it a string variable?
1637:10570+10 0ADD C2050B JP NZ,PRNTST ; Yes - Output string contents
1638:10580+17 0AE0 CDDA18 CALL NUMASC ; Convert number to text
1639:10597+17 0AE3 CDB611 CALL CRTST ; Create temporary string
1640:10614+10 0AE6 3620 LD (HL),' ' ; Followed by a space
1641:10624+16 0AE8 2ABE1E LD HL,(FPREG) ; Get length of output
1642:10640+11 0AEB 34 INC (HL) ; Plus 1 for the space
1643:10651+16 0AEC 2ABE1E LD HL,(FPREG) ; < Not needed >
1644:10667+13 0AEF 3A251E LD A,(LWIDTH) ; Get width of line
1645:10680+4 0AF2 47 LD B,A ; To B
1646:10684+4 0AF3 04 INC B ; Width 255 (No limit)?
1647:10688+10 0AF4 CA010B JP Z,PRNTNB ; Yes - Output number string
1648:10698+4 0AF7 04 INC B ; Adjust it
1649:10702+13 0AF8 3A851E LD A,(CURPOS) ; Get cursor position
1650:10715+7 0AFB 86 ADD A,(HL) ; Add length of string
1651:10722+4 0AFC 3D DEC A ; Adjust it
1652:10726+4 0AFD B8 CP B ; Will output fit on this line?
1653:10730+10+7 0AFE D4190B CALL NC,PRNTCRLF ; No - CRLF first
1654:10740+17 0B01 CD0512 PRNTNB: CALL PRS1 ; Output string at (HL)
1655:10757+4 0B04 AF XOR A ; Skip CALL by setting 'z' flag
1656:10761+10+7 0B05 C40512 PRNTST: CALL NZ,PRS1 ; Output string at (HL)
1657:10771+10 0B08 E1 POP HL ; Restore code string address
1658:10781+10 0B09 C3B70A JP MRPRNT ; See if more to PRINT
1659:
1660:10791+13 0B0C 3A851E STTLIN: LD A,(CURPOS) ; Make sure on new line
1661:10804+4 0B0F B7 OR A ; Already at start?
1662:10808+5+6 0B10 C8 RET Z ; Yes - Do nothing
1663:10813+10 0B11 C3190B JP PRNTCRLF ; Start a new line
1664:
1665:10823+10 0B14 3600 ENDINP: LD (HL),0 ; Mark end of buffer
1666:10833+10 0B16 213A1E LD HL,BUFFER-1 ; Point to buffer
1667:10843+7 0B19 3E0D PRNTCRLF: LD A,CR ; Load a CR
1668:10850+17 0B1B CDC706 CALL OUTC ; Output character
1669:10867+7 0B1E 3E0A LD A,LF ; Load a LF
1670:10874+17 0B20 CDC706 CALL OUTC ; Output character
1671:10891+4 0B23 AF DONULL: XOR A ; Set to position 0
1672:10895+13 0B24 32851E LD (CURPOS),A ; Store it
1673:10908+13 0B27 3A241E LD A,(NULLS) ; Get number of nulls
1674:10921+4 0B2A 3D NULLP: DEC A ; Count them
1675:10925+5+6 0B2B C8 RET Z ; Return if done
1676:10930+11 0B2C F5 PUSH AF ; Save count
1677:10941+4 0B2D AF XOR A ; Load a null
1678:10945+17 0B2E CDC706 CALL OUTC ; Output it
1679:10962+10 0B31 F1 POP AF ; Restore count
1680:10972+10 0B32 C32A0B JP NULLP ; Keep counting
1681:
1682:10982+13 0B35 3A261E DOCOM: LD A,(COMMAN) ; Get comma width
1683:10995+4 0B38 47 LD B,A ; Save in B
1684:10999+13 0B39 3A851E LD A,(CURPOS) ; Get current position
1685:11012+4 0B3C B8 CP B ; Within the limit?
1686:11016+10+7 0B3D D4190B CALL NC,PRNTCRLF ; No - output CRLF
1687:11026+10 0B40 D26F0B JP NC,NEXITM ; Get next item
1688:11036+7 0B43 D60E ZONELP: SUB 14 ; Next zone of 14 characters
1689:11043+10 0B45 D2430B JP NC,ZONELP ; Repeat if more zones
1690:11053+4 0B48 2F CPL ; Number of spaces to output
1691:11057+10 0B49 C3640B JP ASPCS ; Output them
1692:
1693:11067+11 0B4C F5 DOTAB: PUSH AF ; Save token
1694:11078+17 0B4D CD9E14 CALL FNDNUM ; Evaluate expression
1695:11095+17 0B50 CDBC06 CALL CHKSYN ; Make sure ")" follows
1696: - 0B53 29 .BYTE ")"
1697:11112+6 0B54 2B DEC HL ; Back space on to ")"
1698:11118+10 0B55 F1 POP AF ; Restore token
1699:11128+7 0B56 D6A5 SUB ZSPC ; Was it "SPC(" ?
1700:11135+11 0B58 E5 PUSH HL ; Save code string address
1701:11146+10 0B59 CA5F0B JP Z,DOSPC ; Yes - Do 'E' spaces
1702:11156+13 0B5C 3A851E LD A,(CURPOS) ; Get current position
1703:11169+4 0B5F 2F DOSPC: CPL ; Number of spaces to print to
1704:11173+4 0B60 83 ADD A,E ; Total number to print
1705:11177+10 0B61 D26F0B JP NC,NEXITM ; TAB < Current POS(X)
1706:11187+4 0B64 3C ASPCS: INC A ; Output A spaces
1707:11191+4 0B65 47 LD B,A ; Save number to print
1708:11195+7 0B66 3E20 LD A,' ' ; Space
1709:11202+17 0B68 CDC706 SPCLP: CALL OUTC ; Output character in A
1710:11219+4 0B6B 05 DEC B ; Count them
1711:11223+10 0B6C C2680B JP NZ,SPCLP ; Repeat if more
1712:11233+10 0B6F E1 NEXITM: POP HL ; Restore code string address
1713:11243+17 0B70 CD4F08 CALL GETCHR ; Get next character
1714:11260+10 0B73 C3BE0A JP PRNTLP ; More to print
1715:
1716: - 0B76 3F526564 REDO: .BYTE "?Redo from start",CR,LF,0
6F206672
6F6D2073
74617274
0D0A00
1717:
1718:11270+13 0B89 3AA71E BADINP: LD A,(READFG) ; READ or INPUT?
1719:11283+4 0B8C B7 OR A
1720:11287+10 0B8D C2E503 JP NZ,DATSNR ; READ - ?SN Error
1721:11297+10 0B90 C1 POP BC ; Throw away code string addr
1722:11307+10 0B91 21760B LD HL,REDO ; "Redo from start" message
1723:11317+17 0B94 CD0212 CALL PRS ; Output string
1724:11334+10 0B97 C33F05 JP DOAGN ; Do last INPUT again
1725:
1726:11344+17 0B9A CD6311 INPUT: CALL IDTEST ; Test for illegal direct
1727:11361+7 0B9D 7E LD A,(HL) ; Get character after "INPUT"
1728:11368+7 0B9E FE22 CP '"' ; Is there a prompt string?
1729:11375+7 0BA0 3E00 LD A,0 ; Clear A and leave flags
1730:11382+13 0BA2 32281E LD (CTLOFG),A ; Enable output
1731:11395+10 0BA5 C2B40B JP NZ,NOPMPT ; No prompt - get input
1732:11405+17 0BA8 CDB711 CALL QTSTR ; Get string terminated by '"'
1733:11422+17 0BAB CDBC06 CALL CHKSYN ; Check for ';' after prompt
1734: - 0BAE 3B .BYTE ';'
1735:11439+11 0BAF E5 PUSH HL ; Save code string address
1736:11450+17 0BB0 CD0512 CALL PRS1 ; Output prompt string
1737: - 0BB3 3E .BYTE 3EH ; Skip "PUSH HL"
1738:11467+11 0BB4 E5 NOPMPT: PUSH HL ; Save code string address
1739:11478+17 0BB5 CD4305 CALL PROMPT ; Get input with "? " prompt
1740:11495+10 0BB8 C1 POP BC ; Restore code string address
1741:11505+10 0BB9 DA9E08 JP C,INPBRK ; Break pressed - Exit
1742:11515+6 0BBC 23 INC HL ; Next byte
1743:11521+7 0BBD 7E LD A,(HL) ; Get it
1744:11528+4 0BBE B7 OR A ; End of line?
1745:11532+6 0BBF 2B DEC HL ; Back again
1746:11538+11 0BC0 C5 PUSH BC ; Re-save code string address
1747:11549+10 0BC1 CAEF09 JP Z,NXTDTA ; Yes - Find next DATA stmt
1748:11559+10 0BC4 362C LD (HL),',' ; Store comma as separator
1749:11569+10 0BC6 C3CE0B JP NXTITM ; Get next item
1750:
1751:11579+11 0BC9 E5 READ: PUSH HL ; Save code string address
1752:11590+16 0BCA 2AB61E LD HL,(NXTDAT) ; Next DATA statement
1753: - 0BCD F6 .BYTE 0F6H ; Flag "READ"
1754:11606+4 0BCE AF NXTITM: XOR A ; Flag "INPUT"
1755:11610+13 0BCF 32A71E LD (READFG),A ; Save "READ"/"INPUT" flag
1756:11623+19 0BD2 E3 EX (SP),HL ; Get code str' , Save pointer
1757:11642+10 0BD3 C3DA0B JP GTVLUS ; Get values
1758:
1759:11652+17 0BD6 CDBC06 NEDMOR: CALL CHKSYN ; Check for comma between items
1760: - 0BD9 2C .BYTE ','
1761:11669+17 0BDA CDF50E GTVLUS: CALL GETVAR ; Get variable name
1762:11686+19 0BDD E3 EX (SP),HL ; Save code str" , Get pointer
1763:11705+11 0BDE D5 PUSH DE ; Save variable address
1764:11716+7 0BDF 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte
1765:11723+7 0BE0 FE2C CP ',' ; Comma?
1766:11730+10 0BE2 CA020C JP Z,ANTVLU ; Yes - Get another value
1767:11740+13 0BE5 3AA71E LD A,(READFG) ; Is it READ?
1768:11753+4 0BE8 B7 OR A
1769:11757+10 0BE9 C2780C JP NZ,FDTLP ; Yes - Find next DATA stmt
1770:11767+7 0BEC 3E3F LD A,'?' ; More INPUT needed
1771:11774+17 0BEE CDC706 CALL OUTC ; Output character
1772:11791+17 0BF1 CD4305 CALL PROMPT ; Get INPUT with prompt
1773:11808+10 0BF4 D1 POP DE ; Variable address
1774:11818+10 0BF5 C1 POP BC ; Code string address
1775:11828+10 0BF6 DA9E08 JP C,INPBRK ; Break pressed
1776:11838+6 0BF9 23 INC HL ; Point to next DATA byte
1777:11844+7 0BFA 7E LD A,(HL) ; Get byte
1778:11851+4 0BFB B7 OR A ; Is it zero (No input) ?
1779:11855+6 0BFC 2B DEC HL ; Back space INPUT pointer
1780:11861+11 0BFD C5 PUSH BC ; Save code string address
1781:11872+10 0BFE CAEF09 JP Z,NXTDTA ; Find end of buffer
1782:11882+11 0C01 D5 PUSH DE ; Save variable address
1783:11893+13 0C02 3A871E ANTVLU: LD A,(TYPE) ; Check data type
1784:11906+4 0C05 B7 OR A ; Is it numeric?
1785:11910+10 0C06 CA2C0C JP Z,INPBIN ; Yes - Convert to binary
1786:11920+17 0C09 CD4F08 CALL GETCHR ; Get next character
1787:11937+4 0C0C 57 LD D,A ; Save input character
1788:11941+4 0C0D 47 LD B,A ; Again
1789:11945+7 0C0E FE22 CP '"' ; Start of literal sting?
1790:11952+10 0C10 CA200C JP Z,STRENT ; Yes - Create string entry
1791:11962+13 0C13 3AA71E LD A,(READFG) ; "READ" or "INPUT" ?
1792:11975+4 0C16 B7 OR A
1793:11979+4 0C17 57 LD D,A ; Save 00 if "INPUT"
1794:11983+10 0C18 CA1D0C JP Z,ITMSEP ; "INPUT" - End with 00
1795:11993+7 0C1B 163A LD D,':' ; "DATA" - End with 00 or ':'
1796:12000+7 0C1D 062C ITMSEP: LD B,',' ; Item separator
1797:12007+6 0C1F 2B DEC HL ; Back space for DTSTR
1798:12013+17 0C20 CDBA11 STRENT: CALL DTSTR ; Get string terminated by D
1799:12030+4 0C23 EB EX DE,HL ; String address to DE
1800:12034+10 0C24 21400C LD HL,LTSTND ; Where to go after LETSTR
1801:12044+19 0C27 E3 EX (SP),HL ; Save HL , get input pointer
1802:12063+11 0C28 D5 PUSH DE ; Save address of string
1803:12074+10 0C29 C3220A JP LETSTR ; Assign string to variable
1804:
1805:12084+17 0C2C CD4F08 INPBIN: CALL GETCHR ; Get next character
1806:12101+17 0C2F CD3718 CALL ASCTFP ; Convert ASCII to FP number
1807:12118+19 0C32 E3 EX (SP),HL ; Save input ptr, Get var addr
1808:12137+10 0C33 11BE1E LD DE,FPREG ; Move FPREG to variable
1809:12147+4 0C36 EB EX DE,HL
1810:12151+16 0C37 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
1811:12167+16 0C39 EDA0 LDI
1812:12183+16 0C3B EDA0 LDI
1813:12199+16 0C3D EDA0 LDI
1814:12215+10 0C3F E1 POP HL ; Restore input pointer
1815:12225+6 0C40 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs
1816:12231+17 0C41 CD4F08 CALL GETCHR ; Get next character
1817:12248+10 0C44 CA4C0C JP Z,MORDT ; End of line - More needed?
1818:12258+7 0C47 FE2C CP ',' ; Another value?
1819:12265+10 0C49 C2890B JP NZ,BADINP ; No - Bad input
1820:12275+19 0C4C E3 MORDT: EX (SP),HL ; Get code string address
1821:12294+6 0C4D 2B DEC HL ; DEC 'cos GETCHR INCs
1822:12300+17 0C4E CD4F08 CALL GETCHR ; Get next character
1823:12317+10 0C51 C2D60B JP NZ,NEDMOR ; More needed - Get it
1824:12327+10 0C54 D1 POP DE ; Restore DATA pointer
1825:12337+13 0C55 3AA71E LD A,(READFG) ; "READ" or "INPUT" ?
1826:12350+4 0C58 B7 OR A
1827:12354+4 0C59 EB EX DE,HL ; DATA pointer to HL
1828:12358+10 0C5A C27408 JP NZ,UPDATA ; Update DATA pointer if "READ"
1829:12368+11 0C5D D5 PUSH DE ; Save code string address
1830:12379+7 0C5E B6 OR (HL) ; More input given?
1831:12386+10 0C5F 21670C LD HL,EXTIG ; "?Extra ignored" message
1832:12396+10+7 0C62 C40212 CALL NZ,PRS ; Output string if extra given
1833:12406+10 0C65 E1 POP HL ; Restore code string address
1834:12416+10 0C66 C9 RET
1835:
1836: - 0C67 3F457874 EXTIG: .BYTE "?Extra ignored",CR,LF,0
72612069
676E6F72
65640D0A
00
1837:
1838:12426+17 0C78 CDF009 FDTLP: CALL DATA ; Get next statement
1839:12443+4 0C7B B7 OR A ; End of line?
1840:12447+10 0C7C C2900C JP NZ,FANDT ; No - See if DATA statement
1841:12457+6 0C7F 23 INC HL
1842:12463+7 0C80 7E LD A,(HL) ; End of program?
1843:12470+6 0C81 23 INC HL
1844:12476+7 0C82 B6 OR (HL) ; 00 00 Ends program
1845:12483+7 0C83 1E06 LD E,OD ; ?OD Error
1846:12490+10 0C85 CAFF03 JP Z,ERROR ; Yes - Out of DATA
1847:12500+6 0C88 23 INC HL
1848:12506+7 0C89 5E LD E,(HL) ; LSB of line number
1849:12513+6 0C8A 23 INC HL
1850:12519+7 0C8B 56 LD D,(HL) ; MSB of line number
1851:12526+20 0C8C ED53A31E LD (DATLIN),DE ; Set line of current DATA item
1852:12546+17 0C90 CD4F08 FANDT: CALL GETCHR ; Get next character
1853:12563+7 0C93 FE83 CP ZDATA ; "DATA" token
1854:12570+10 0C95 C2780C JP NZ,FDTLP ; No "DATA" - Keep looking
1855:12580+10 0C98 C3020C JP ANTVLU ; Found - Convert input
1856:
1857:12590+10 0C9B 110000 NEXT: LD DE,0 ; In case no index given
1858:12600+10+7 0C9E C4F50E NEXT1: CALL NZ,GETVAR ; Get index address
1859:12610+16 0CA1 22A81E LD (BRKLIN),HL ; Save code string address
1860:12626+17 0CA4 CD8E03 CALL BAKSTK ; Look for "FOR" block
1861:12643+10 0CA7 C2F103 JP NZ,NFERR ; No "FOR" - ?NF Error
1862:12653+6 0CAA F9 LD SP,HL ; Clear nested loops
1863:12659+11 0CAB D5 PUSH DE ; Save index address
1864:12670+7 0CAC 7E LD A,(HL) ; Get sign of STEP
1865:12677+6 0CAD 23 INC HL
1866:12683+11 0CAE F5 PUSH AF ; Save sign of STEP
1867:12694+11 0CAF D5 PUSH DE ; Save index address
1868:12705+10 0CB0 11BE1E LD DE,FPREG ; Move index value to FPREG
1869:12715+16 0CB3 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
1870:12731+16 0CB5 EDA0 LDI
1871:12747+16 0CB7 EDA0 LDI
1872:12763+16 0CB9 EDA0 LDI
1873:12779+19 0CBB E3 EX (SP),HL ; Save address of TO value
1874:12798+11 0CBC E5 PUSH HL ; Save address of index
1875:12809+17 0CBD CDCD14 CALL ADDPHL ; Add STEP to index value
1876:12826+10 0CC0 D1 POP DE ; Restore address of index
1877:12836+10 0CC1 21BE1E LD HL,FPREG ; Move FPREG to index variable
1878:12846+16 0CC4 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
1879:12862+16 0CC6 EDA0 LDI
1880:12878+16 0CC8 EDA0 LDI
1881:12894+16 0CCA EDA0 LDI
1882:12910+10 0CCC E1 POP HL ; Restore address of TO value
1883:12920+17 0CCD CD8917 CALL LOADFP ; Move TO value to BCDE
1884:12937+11 0CD0 E5 PUSH HL ; Save address of line of FOR
1885:12948+17 0CD1 CDA717 CALL CMPNUM ; Compare index with TO value
1886:12965+10 0CD4 E1 POP HL ; Restore address of line num
1887:12975+10 0CD5 C1 POP BC ; Address of sign of STEP
1888:12985+4 0CD6 90 SUB B ; Compare with expected sign
1889:12989+17 0CD7 CD8917 CALL LOADFP ; BC = Loop stmt,DE = Line num
1890:13006+10 0CDA CAE60C JP Z,KILFOR ; Loop finished - Terminate it
1891:13016+4 0CDD EB EX DE,HL ; Loop statement line number
1892:13020+16 0CDE 22361E LD (LINEAT),HL ; Set loop line number
1893:13036+4 0CE1 69 LD L,C ; Set code string to loop
1894:13040+4 0CE2 60 LD H,B
1895:13044+10 0CE3 C30C08 JP PUTFID ; Put back "FOR" and continue
1896:
1897:13054+6 0CE6 F9 KILFOR: LD SP,HL ; Remove "FOR" block
1898:13060+16 0CE7 2AA81E LD HL,(BRKLIN) ; Code string after "NEXT"
1899:13076+7 0CEA 7E LD A,(HL) ; Get next byte in code string
1900:13083+7 0CEB FE2C CP ',' ; More NEXTs ?
1901:13090+10 0CED C21008 JP NZ,RUNCNT ; No - Do next statement
1902:13100+17 0CF0 CD4F08 CALL GETCHR ; Position to index name
1903:13117+17 0CF3 CD9E0C CALL NEXT1 ; Re-enter NEXT routine
1904: ; < will not RETurn to here , Exit to RUNCNT or Loop >
1905:
1906:13134+17 0CF6 CD080D GETNUM: CALL EVAL ; Get a numeric expression
1907: - 0CF9 F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric)
1908:13151+4 0CFA 37 TSTSTR: SCF ; Set carry (string)
1909:13155+13 0CFB 3A871E CHKTYP: LD A,(TYPE) ; Check types match
1910:13168+4 0CFE 8F ADC A,A ; Expected + actual
1911:13172+4 0CFF B7 OR A ; Clear carry , set parity
1912:13176+5+6 0D00 E8 RET PE ; Even parity - Types match
1913:13181+10 0D01 C3FD03 JP TMERR ; Different types - Error
1914:
1915:13191+17 0D04 CDBC06 OPNPAR: CALL CHKSYN ; Make sure "(" follows
1916: - 0D07 28 .BYTE "("
1917:13208+6 0D08 2B EVAL: DEC HL ; Evaluate expression & save
1918:13214+7 0D09 1600 LD D,0 ; Precedence value
1919:13221+11 0D0B D5 EVAL1: PUSH DE ; Save precedence
1920:13232+7 0D0C 0E01 LD C,1
1921:13239+17 0D0E CDC803 CALL CHKSTK ; Check for 1 level of stack
1922:13256+17 0D11 CD820D CALL OPRND ; Get next expression value
1923:13273+16 0D14 22AA1E EVAL2: LD (NXTOPR),HL ; Save address of next operator
1924:13289+16 0D17 2AAA1E EVAL3: LD HL,(NXTOPR) ; Restore address of next opr
1925:13305+10 0D1A C1 POP BC ; Precedence value and operator
1926:13315+4 0D1B 78 LD A,B ; Get precedence value
1927:13319+7 0D1C FE78 CP 78H ; "AND" or "OR" ?
1928:13326+10+7 0D1E D4F90C CALL NC,TSTNUM ; No - Make sure it's a number
1929:13336+7 0D21 7E LD A,(HL) ; Get next operator / function
1930:13343+7 0D22 1600 LD D,0 ; Clear Last relation
1931:13350+7 0D24 D6B0 RLTLP: SUB ZGTR ; ">" Token
1932:13357+10 0D26 DA400D JP C,FOPRND ; + - * / ^ AND OR - Test it
1933:13367+7 0D29 FE03 CP ZLTH+1-ZGTR ; < = >
1934:13374+10 0D2B D2400D JP NC,FOPRND ; Function - Call it
1935:13384+7 0D2E FE01 CP ZEQUAL-ZGTR ; "="
1936:13391+4 0D30 17 RLA ; <- Test for legal
1937:13395+4 0D31 AA XOR D ; <- combinations of < = >
1938:13399+4 0D32 BA CP D ; <- by combining last token
1939:13403+4 0D33 57 LD D,A ; <- with current one
1940:13407+10 0D34 DAEB03 JP C,SNERR ; Error if "<<' '==" or ">>"
1941:13417+16 0D37 229F1E LD (CUROPR),HL ; Save address of current token
1942:13433+17 0D3A CD4F08 CALL GETCHR ; Get next character
1943:13450+10 0D3D C3240D JP RLTLP ; Treat the two as one
1944:
1945:13460+4 0D40 7A FOPRND: LD A,D ; < = > found ?
1946:13464+4 0D41 B7 OR A
1947:13468+10 0D42 C2700E JP NZ,TSTRED ; Yes - Test for reduction
1948:13478+7 0D45 7E LD A,(HL) ; Get operator token
1949:13485+16 0D46 229F1E LD (CUROPR),HL ; Save operator address
1950:13501+7 0D49 D6A9 SUB ZPLUS ; Operator or function?
1951:13508+5+6 0D4B D8 RET C ; Neither - Exit
1952:13513+7 0D4C FE07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ?
1953:13520+5+6 0D4E D0 RET NC ; No - Exit
1954:13525+4 0D4F 5F LD E,A ; Coded operator
1955:13529+13 0D50 3A871E LD A,(TYPE) ; Get data type
1956:13542+4 0D53 3D DEC A ; FF = numeric , 00 = string
1957:13546+4 0D54 B3 OR E ; Combine with coded operator
1958:13550+4 0D55 7B LD A,E ; Get coded operator
1959:13554+10 0D56 CA0913 JP Z,CONCAT ; String concatenation
1960:13564+4 0D59 07 RLCA ; Times 2
1961:13568+4 0D5A 83 ADD A,E ; Times 3
1962:13572+4 0D5B 5F LD E,A ; To DE (D is 0)
1963:13576+10 0D5C 21DF02 LD HL,PRITAB ; Precedence table
1964:13586+11 0D5F 19 ADD HL,DE ; To the operator concerned
1965:13597+4 0D60 78 LD A,B ; Last operator precedence
1966:13601+7 0D61 56 LD D,(HL) ; Get evaluation precedence
1967:13608+4 0D62 BA CP D ; Compare with eval precedence
1968:13612+5+6 0D63 D0 RET NC ; Exit if higher precedence
1969:13617+6 0D64 23 INC HL ; Point to routine address
1970:13623+17 0D65 CDF90C CALL TSTNUM ; Make sure it's a number
1971:
1972:13640+11 0D68 C5 STKTHS: PUSH BC ; Save last precedence & token
1973:13651+10 0D69 01170D LD BC,EVAL3 ; Where to go on prec' break
1974:13661+11 0D6C C5 PUSH BC ; Save on stack for return
1975:13672+20 0D6D ED4BBE1E LD BC,(FPREG) ; LSB,NLSB of FPREG
1976:13692+11 0D71 C5 PUSH BC ; Stack them
1977:13703+20 0D72 ED4BC01E LD BC,(FPREG+2) ; MSB and exponent of FPREG
1978:13723+11 0D76 C5 PUSH BC ; Stack them
1979:13734+7 0D77 4E LD C,(HL) ; Get LSB of routine address
1980:13741+6 0D78 23 INC HL
1981:13747+7 0D79 46 LD B,(HL) ; Get MSB of routine address
1982:13754+6 0D7A 23 INC HL
1983:13760+11 0D7B C5 PUSH BC ; Save routine address
1984:13771+16 0D7C 2A9F1E LD HL,(CUROPR) ; Address of current operator
1985:13787+10 0D7F C30B0D JP EVAL1 ; Loop until prec' break
1986:
1987:13797+4 0D82 AF OPRND: XOR A ; Get operand routine
1988:13801+13 0D83 32871E LD (TYPE),A ; Set numeric expected
1989:13814+17 0D86 CD4F08 CALL GETCHR ; Get next character
1990:13831+7 0D89 1E24 LD E,MO ; ?MO Error
1991:13838+10 0D8B CAFF03 JP Z,ERROR ; No operand - Error
1992:13848+10 0D8E DA3718 JP C,ASCTFP ; Number - Get value
1993:13858+17 0D91 CDED08 CALL CHKLTR ; See if a letter
1994:13875+10 0D94 D2EA0D JP NC,CONVAR ; Letter - Find variable
1995:13885+7 0D97 FEA9 CP ZPLUS ; '+' Token ?
1996:13892+10 0D99 CA820D JP Z,OPRND ; Yes - Look for operand
1997:13902+7 0D9C FE2E CP '.' ; '.' ?
1998:13909+10 0D9E CA3718 JP Z,ASCTFP ; Yes - Create FP number
1999:13919+7 0DA1 FEAA CP ZMINUS ; '-' Token ?
2000:13926+10 0DA3 CAD90D JP Z,MINUS ; Yes - Do minus
2001:13936+7 0DA6 FE22 CP '"' ; Literal string ?
2002:13943+10 0DA8 CAB711 JP Z,QTSTR ; Get string terminated by '"'
2003:13953+7 0DAB FEA7 CP ZNOT ; "NOT" Token ?
2004:13960+10 0DAD CAD00E JP Z,EVNOT ; Yes - Eval NOT expression
2005:13970+7 0DB0 FEA4 CP ZFN ; "FN" Token ?
2006:13977+10 0DB2 CA1311 JP Z,DOFN ; Yes - Do FN routine
2007:13987+7 0DB5 FE26 CP '&' ; &H = HEX, &B = BINARY
2008:13994+10 0DB7 C2CC0D JP NZ,NOTAMP ; No - Skip to functions
2009:14004+17 0DBA CD4F08 CALL GETCHR ; Get next character
2010:14021+7 0DBD FE48 CP 'H' ; Hex number indicated? [Searle function added]
2011:14028+10 0DBF CA431D JP Z,HEXTFP ; Convert Hex to FPREG
2012:14038+7 0DC2 FE42 CP 'B' ; Binary number indicated? [Searle function added]
2013:14045+10 0DC4 CAB31D JP Z,BINTFP ; Convert Bin to FPREG
2014:14055+7 0DC7 1E02 LD E,SN ; If neither then a ?SN Error
2015:14062+10 0DC9 CAFF03 JP Z,ERROR ;
2016:14072+7 0DCC D6B3 NOTAMP: SUB ZSGN ; Is it a function?
2017:14079+10 0DCE D2FB0D JP NC,FNOFST ; Yes - Evaluate function
2018:14089+17 0DD1 CD040D EVLPAR: CALL OPNPAR ; Evaluate expression in "()"
2019:14106+17 0DD4 CDBC06 CALL CHKSYN ; Make sure ")" follows
2020: - 0DD7 29 .BYTE ")"
2021:14123+10 0DD8 C9 RET
2022:
2023:14133+7 0DD9 167D MINUS: LD D,7DH ; '-' precedence
2024:14140+17 0DDB CD0B0D CALL EVAL1 ; Evaluate until prec' break
2025:14157+16 0DDE 2AAA1E LD HL,(NXTOPR) ; Get next operator address
2026:14173+11 0DE1 E5 PUSH HL ; Save next operator address
2027:14184+17 0DE2 CD6817 CALL INVSGN ; Negate value
2028:14201+17 0DE5 CDF90C RETNUM: CALL TSTNUM ; Make sure it's a number
2029:14218+10 0DE8 E1 POP HL ; Restore next operator address
2030:14228+10 0DE9 C9 RET
2031:
2032:14238+17 0DEA CDF50E CONVAR: CALL GETVAR ; Get variable address to DE
2033:14255+11 0DED E5 FRMEVL: PUSH HL ; Save code string address
2034:14266+4 0DEE EB EX DE,HL ; Variable address to HL
2035:14270+16 0DEF 22BE1E LD (FPREG),HL ; Save address of variable
2036:14286+13 0DF2 3A871E LD A,(TYPE) ; Get type
2037:14299+4 0DF5 B7 OR A ; Numeric?
2038:14303+10+7 0DF6 CC7D17 CALL Z,PHLTFP ; Yes - Move contents to FPREG
2039:14313+10 0DF9 E1 POP HL ; Restore code string address
2040:14323+10 0DFA C9 RET
2041:
2042:14333+7 0DFB 0600 FNOFST: LD B,0 ; Get address of function
2043:14340+4 0DFD 07 RLCA ; Double function offset
2044:14344+4 0DFE 4F LD C,A ; BC = Offset in function table
2045:14348+11 0DFF C5 PUSH BC ; Save adjusted token value
2046:14359+17 0E00 CD4F08 CALL GETCHR ; Get next character
2047:14376+4 0E03 79 LD A,C ; Get adjusted token value
2048:14380+7 0E04 FE2F CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ?
2049:14387+10 0E06 DA220E JP C,FNVAL ; No - Do function
2050:14397+17 0E09 CD040D CALL OPNPAR ; Evaluate expression (X,...
2051:14414+17 0E0C CDBC06 CALL CHKSYN ; Make sure ',' follows
2052: - 0E0F 2C .BYTE ','
2053:14431+17 0E10 CDFA0C CALL TSTSTR ; Make sure it's a string
2054:14448+4 0E13 EB EX DE,HL ; Save code string address
2055:14452+16 0E14 2ABE1E LD HL,(FPREG) ; Get address of string
2056:14468+19 0E17 E3 EX (SP),HL ; Save address of string
2057:14487+11 0E18 E5 PUSH HL ; Save adjusted token value
2058:14498+4 0E19 EB EX DE,HL ; Restore code string address
2059:14502+17 0E1A CDA114 CALL GETINT ; Get integer 0-255
2060:14519+4 0E1D EB EX DE,HL ; Save code string address
2061:14523+19 0E1E E3 EX (SP),HL ; Save integer,HL = adj' token
2062:14542+10 0E1F C32A0E JP GOFUNC ; Jump to string function
2063:
2064:14552+17 0E22 CDD10D FNVAL: CALL EVLPAR ; Evaluate expression
2065:14569+19 0E25 E3 EX (SP),HL ; HL = Adjusted token value
2066:14588+10 0E26 11E50D LD DE,RETNUM ; Return number from function
2067:14598+11 0E29 D5 PUSH DE ; Save on stack
2068:14609+10 0E2A 015901 GOFUNC: LD BC,FNCTAB ; Function routine addresses
2069:14619+11 0E2D 09 ADD HL,BC ; Point to right address
2070:14630+7 0E2E 4E LD C,(HL) ; Get LSB of address
2071:14637+6 0E2F 23 INC HL ;
2072:14643+7 0E30 66 LD H,(HL) ; Get MSB of address
2073:14650+4 0E31 69 LD L,C ; Address to HL
2074:14654+4 0E32 E9 JP (HL) ; Jump to function
2075:
2076:14658+4 0E33 15 SGNEXP: DEC D ; Dee to flag negative exponent
2077:14662+7 0E34 FEAA CP ZMINUS ; '-' token ?
2078:14669+5+6 0E36 C8 RET Z ; Yes - Return
2079:14674+7 0E37 FE2D CP '-' ; '-' ASCII ?
2080:14681+5+6 0E39 C8 RET Z ; Yes - Return
2081:14686+4 0E3A 14 INC D ; Inc to flag positive exponent
2082:14690+7 0E3B FE2B CP '+' ; '+' ASCII ?
2083:14697+5+6 0E3D C8 RET Z ; Yes - Return
2084:14702+7 0E3E FEA9 CP ZPLUS ; '+' token ?
2085:14709+5+6 0E40 C8 RET Z ; Yes - Return
2086:14714+6 0E41 2B DEC HL ; DEC 'cos GETCHR INCs
2087:14720+10 0E42 C9 RET ; Return "NZ"
2088:
2089: - 0E43 F6 POR: .BYTE 0F6H ; Flag "OR"
2090:14730+4 0E44 AF PAND: XOR A ; Flag "AND"
2091:14734+11 0E45 F5 PUSH AF ; Save "AND" / "OR" flag
2092:14745+17 0E46 CDF90C CALL TSTNUM ; Make sure it's a number
2093:14762+17 0E49 CD0109 CALL DEINT ; Get integer -32768 to 32767
2094:14779+10 0E4C F1 POP AF ; Restore "AND" / "OR" flag
2095:14789+4 0E4D EB EX DE,HL ; <- Get last
2096:14793+10 0E4E C1 POP BC ; <- value
2097:14803+19 0E4F E3 EX (SP),HL ; <- from
2098:14822+4 0E50 EB EX DE,HL ; <- stack
2099:14826+20 0E51 ED53BE1E LD (FPREG),DE ; Move last value to FPREG
2100:14846+20 0E55 ED43C01E LD (FPREG+2),BC
2101:14866+11 0E59 F5 PUSH AF ; Save "AND" / "OR" flag
2102:14877+17 0E5A CD0109 CALL DEINT ; Get integer -32768 to 32767
2103:14894+10 0E5D F1 POP AF ; Restore "AND" / "OR" flag
2104:14904+10 0E5E C1 POP BC ; Get value
2105:14914+4 0E5F 79 LD A,C ; Get LSB
2106:14918+10 0E60 21D110 LD HL,ACPASS ; Address of save AC as current
2107:14928+10 0E63 C26B0E JP NZ,POR1 ; Jump if OR
2108:14938+4 0E66 A3 AND E ; "AND" LSBs
2109:14942+4 0E67 4F LD C,A ; Save LSB
2110:14946+4 0E68 78 LD A,B ; Get MBS
2111:14950+4 0E69 A2 AND D ; "AND" MSBs
2112:14954+4 0E6A E9 JP (HL) ; Save AC as current (ACPASS)
2113:
2114:14958+4 0E6B B3 POR1: OR E ; "OR" LSBs
2115:14962+4 0E6C 4F LD C,A ; Save LSB
2116:14966+4 0E6D 78 LD A,B ; Get MSB
2117:14970+4 0E6E B2 OR D ; "OR" MSBs
2118:14974+4 0E6F E9 JP (HL) ; Save AC as current (ACPASS)
2119:
2120:14978+10 0E70 21820E TSTRED: LD HL,CMPLOG ; Logical compare routine
2121:14988+13 0E73 3A871E LD A,(TYPE) ; Get data type
2122:15001+4 0E76 1F RRA ; Carry set = string
2123:15005+4 0E77 7A LD A,D ; Get last precedence value
2124:15009+4 0E78 17 RLA ; Times 2 plus carry
2125:15013+4 0E79 5F LD E,A ; To E
2126:15017+7 0E7A 1664 LD D,64H ; Relational precedence
2127:15024+4 0E7C 78 LD A,B ; Get current precedence
2128:15028+4 0E7D BA CP D ; Compare with last
2129:15032+5+6 0E7E D0 RET NC ; Eval if last was rel' or log'
2130:15037+10 0E7F C3680D JP STKTHS ; Stack this one and get next
2131:
2132: - 0E82 840E CMPLOG: .WORD CMPLG1 ; Compare two values / strings
2133:15047+4 0E84 79 CMPLG1: LD A,C ; Get data type
2134:15051+4 0E85 B7 OR A
2135:15055+4 0E86 1F RRA
2136:15059+10 0E87 C1 POP BC ; Get last expression to BCDE
2137:15069+10 0E88 D1 POP DE
2138:15079+11 0E89 F5 PUSH AF ; Save status
2139:15090+17 0E8A CDFB0C CALL CHKTYP ; Check that types match
2140:15107+10 0E8D 21C60E LD HL,CMPRES ; Result to comparison
2141:15117+11 0E90 E5 PUSH HL ; Save for RETurn
2142:15128+10 0E91 CAA717 JP Z,CMPNUM ; Compare values if numeric
2143:15138+4 0E94 AF XOR A ; Compare two strings
2144:15142+13 0E95 32871E LD (TYPE),A ; Set type to numeric
2145:15155+11 0E98 D5 PUSH DE ; Save string name
2146:15166+17 0E99 CD5613 CALL GSTRCU ; Get current string
2147:15183+7 0E9C 7E LD A,(HL) ; Get length of string
2148:15190+6 0E9D 23 INC HL
2149:15196+6 0E9E 23 INC HL
2150:15202+7 0E9F 4E LD C,(HL) ; Get LSB of address
2151:15209+6 0EA0 23 INC HL
2152:15215+7 0EA1 46 LD B,(HL) ; Get MSB of address
2153:15222+10 0EA2 D1 POP DE ; Restore string name
2154:15232+11 0EA3 C5 PUSH BC ; Save address of string
2155:15243+11 0EA4 F5 PUSH AF ; Save length of string
2156:15254+17 0EA5 CD5A13 CALL GSTRDE ; Get second string
2157:15271+17 0EA8 CD8917 CALL LOADFP ; Get address of second string
2158:15288+10 0EAB F1 POP AF ; Restore length of string 1
2159:15298+4 0EAC 57 LD D,A ; Length to D
2160:15302+10 0EAD E1 POP HL ; Restore address of string 1
2161:15312+4 0EAE 7B CMPSTR: LD A,E ; Bytes of string 2 to do
2162:15316+4 0EAF B2 OR D ; Bytes of string 1 to do
2163:15320+5+6 0EB0 C8 RET Z ; Exit if all bytes compared
2164:15325+4 0EB1 7A LD A,D ; Get bytes of string 1 to do
2165:15329+7 0EB2 D601 SUB 1
2166:15336+5+6 0EB4 D8 RET C ; Exit if end of string 1
2167:15341+4 0EB5 AF XOR A
2168:15345+4 0EB6 BB CP E ; Bytes of string 2 to do
2169:15349+4 0EB7 3C INC A
2170:15353+5+6 0EB8 D0 RET NC ; Exit if end of string 2
2171:15358+4 0EB9 15 DEC D ; Count bytes in string 1
2172:15362+4 0EBA 1D DEC E ; Count bytes in string 2
2173:15366+7 0EBB 0A LD A,(BC) ; Byte in string 2
2174:15373+7 0EBC BE CP (HL) ; Compare to byte in string 1
2175:15380+6 0EBD 23 INC HL ; Move up string 1
2176:15386+6 0EBE 03 INC BC ; Move up string 2
2177:15392+10 0EBF CAAE0E JP Z,CMPSTR ; Same - Try next bytes
2178:15402+4 0EC2 3F CCF ; Flag difference (">" or "<")
2179:15406+10 0EC3 C34A17 JP FLGDIF ; "<" gives -1 , ">" gives +1
2180:
2181:15416+4 0EC6 3C CMPRES: INC A ; Increment current value
2182:15420+4 0EC7 8F ADC A,A ; Double plus carry
2183:15424+10 0EC8 C1 POP BC ; Get other value
2184:15434+4 0EC9 A0 AND B ; Combine them
2185:15438+7 0ECA C6FF ADD A,-1 ; Carry set if different
2186:15445+4 0ECC 9F SBC A,A ; 00 - Equal , FF - Different
2187:15449+10 0ECD C35117 JP FLGREL ; Set current value & continue
2188:
2189:15459+7 0ED0 165A EVNOT: LD D,5AH ; Precedence value for "NOT"
2190:15466+17 0ED2 CD0B0D CALL EVAL1 ; Eval until precedence break
2191:15483+17 0ED5 CDF90C CALL TSTNUM ; Make sure it's a number
2192:15500+17 0ED8 CD0109 CALL DEINT ; Get integer -32768 - 32767
2193:15517+4 0EDB 7B LD A,E ; Get LSB
2194:15521+4 0EDC 2F CPL ; Invert LSB
2195:15525+4 0EDD 4F LD C,A ; Save "NOT" of LSB
2196:15529+4 0EDE 7A LD A,D ; Get MSB
2197:15533+4 0EDF 2F CPL ; Invert MSB
2198:15537+17 0EE0 CDD110 CALL ACPASS ; Save AC as current
2199:15554+10 0EE3 C1 POP BC ; Clean up stack
2200:15564+10 0EE4 C3170D JP EVAL3 ; Continue evaluation
2201:
2202:15574+6 0EE7 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs
2203:15580+17 0EE8 CD4F08 CALL GETCHR ; Get next character
2204:15597+5+6 0EEB C8 RET Z ; End of DIM statement
2205:15602+17 0EEC CDBC06 CALL CHKSYN ; Make sure ',' follows
2206: - 0EEF 2C .BYTE ','
2207:15619+10 0EF0 01E70E DIM: LD BC,DIMRET ; Return to "DIMRET"
2208:15629+11 0EF3 C5 PUSH BC ; Save on stack
2209: - 0EF4 F6 .BYTE 0F6H ; Flag "Create" variable
2210:15640+4 0EF5 AF GETVAR: XOR A ; Find variable address,to DE
2211:15644+13 0EF6 32861E LD (LCRFLG),A ; Set locate / create flag
2212:15657+7 0EF9 46 LD B,(HL) ; Get First byte of name
2213:15664+17 0EFA CDED08 GTFNAM: CALL CHKLTR ; See if a letter
2214:15681+10 0EFD DAEB03 JP C,SNERR ; ?SN Error if not a letter
2215:15691+4 0F00 AF XOR A
2216:15695+4 0F01 4F LD C,A ; Clear second byte of name
2217:15699+13 0F02 32871E LD (TYPE),A ; Set type to numeric
2218:15712+17 0F05 CD4F08 CALL GETCHR ; Get next character
2219:15729+10 0F08 DA110F JP C,SVNAM2 ; Numeric - Save in name
2220:15739+17 0F0B CDED08 CALL CHKLTR ; See if a letter
2221:15756+10 0F0E DA1E0F JP C,CHARTY ; Not a letter - Check type
2222:15766+4 0F11 4F SVNAM2: LD C,A ; Save second byte of name
2223:15770+17 0F12 CD4F08 ENDNAM: CALL GETCHR ; Get next character
2224:15787+10 0F15 DA120F JP C,ENDNAM ; Numeric - Get another
2225:15797+17 0F18 CDED08 CALL CHKLTR ; See if a letter
2226:15814+10 0F1B D2120F JP NC,ENDNAM ; Letter - Get another
2227:15824+7 0F1E D624 CHARTY: SUB '$' ; String variable?
2228:15831+10 0F20 C22D0F JP NZ,NOTSTR ; No - Numeric variable
2229:15841+4 0F23 3C INC A ; A = 1 (string type)
2230:15845+13 0F24 32871E LD (TYPE),A ; Set type to string
2231:15858+4 0F27 0F RRCA ; A = 80H , Flag for string
2232:15862+4 0F28 81 ADD A,C ; 2nd byte of name has bit 7 on
2233:15866+4 0F29 4F LD C,A ; Resave second byte on name
2234:15870+17 0F2A CD4F08 CALL GETCHR ; Get next character
2235:15887+13 0F2D 3AA51E NOTSTR: LD A,(FORFLG) ; Array name needed ?
2236:15900+4 0F30 3D DEC A
2237:15904+10 0F31 CAE80F JP Z,ARLDSV ; Yes - Get array name
2238:15914+10 0F34 F23D0F JP P,NSCFOR ; No array with "FOR" or "FN"
2239:15924+7 0F37 7E LD A,(HL) ; Get byte again
2240:15931+7 0F38 D628 SUB '(' ; Subscripted variable?
2241:15938+10 0F3A CAC00F JP Z,SBSCPT ; Yes - Sort out subscript
2242:
2243:15948+4 0F3D AF NSCFOR: XOR A ; Simple variable
2244:15952+13 0F3E 32A51E LD (FORFLG),A ; Clear "FOR" flag
2245:15965+11 0F41 E5 PUSH HL ; Save code string address
2246:15976+4 0F42 50 LD D,B ; DE = Variable name to find
2247:15980+4 0F43 59 LD E,C
2248:15984+16 0F44 2AB81E LD HL,(FNRGNM) ; FN argument name
2249:16000+4 0F47 7C LD A,H ; Is it the FN argument?
2250:16004+4 0F48 92 SUB D ; Compare with D
2251:16008+10 0F49 C24E0F JP NZ,$+5 ; Different - Exit
2252:16018+4 0F4C 7D LD A,L ; Get L
2253:16022+4 0F4D 93 SUB E ; Compare with E
2254:16026+10 0F4E 11BA1E LD DE,FNARG ; Point to argument value
2255:16036+10 0F51 CA7513 JP Z,POPHRT ; Yes - Return FN argument value
2256:16046+16 0F54 2AB21E LD HL,(VAREND) ; End of variables
2257:16062+4 0F57 EB EX DE,HL ; Address of end of search
2258:16066+16 0F58 2AB01E LD HL,(PROGND) ; Start of variables address
2259:
2260:16082+4 0F5B 7C FNDVAR: LD A,H ; End of variable list table?
2261:16086+4 0F5C 92 SUB D ; Compare with D
2262:16090+10 0F5D C2620F JP NZ,$+5 ; Different - Exit
2263:16100+4 0F60 7D LD A,L ; Get L
2264:16104+4 0F61 93 SUB E ; Compare with E
2265:16108+10 0F62 CA780F JP Z,CFEVAL ; Yes - Called from EVAL?
2266:16118+4 0F65 79 LD A,C ; Get second byte of name
2267:16122+7 0F66 96 SUB (HL) ; Compare with name in list
2268:16129+6 0F67 23 INC HL ; Move on to first byte
2269:16135+10 0F68 C26D0F JP NZ,FNTHR ; Different - Find another
2270:16145+4 0F6B 78 LD A,B ; Get first byte of name
2271:16149+7 0F6C 96 SUB (HL) ; Compare with name in list
2272:16156+6 0F6D 23 FNTHR: INC HL ; Move on to LSB of value
2273:16162+10 0F6E CAB20F JP Z,RETADR ; Found - Return address
2274:16172+6 0F71 23 INC HL ; <- Skip
2275:16178+6 0F72 23 INC HL ; <- over
2276:16184+6 0F73 23 INC HL ; <- F.P.
2277:16190+6 0F74 23 INC HL ; <- value
2278:16196+10 0F75 C35B0F JP FNDVAR ; Keep looking
2279:
2280:16206+10 0F78 E1 CFEVAL: POP HL ; Restore code string address
2281:16216+19 0F79 E3 EX (SP),HL ; Get return address
2282:16235+11 0F7A D5 PUSH DE ; Save address of variable
2283:16246+10 0F7B 11ED0D LD DE,FRMEVL ; Return address in EVAL
2284:16256+4 0F7E 7C LD A,H ; Called from EVAL ?
2285:16260+4 0F7F 92 SUB D ; Compare with D
2286:16264+7+5 0F80 2002 JR NZ,$+4 ; Different - Exit
2287:16271+4 0F82 7D LD A,L ; Get L
2288:16275+4 0F83 93 SUB E ; Compare with E
2289:16279+10 0F84 D1 POP DE ; Restore address of variable
2290:16289+10 0F85 CAB50F JP Z,RETNUL ; Yes - Return null variable
2291:16299+19 0F88 E3 EX (SP),HL ; Put back return
2292:16318+11 0F89 E5 PUSH HL ; Save code string address
2293:16329+11 0F8A C5 PUSH BC ; Save variable name
2294:16340+10 0F8B 010600 LD BC,6 ; 2 byte name plus 4 byte data
2295:16350+16 0F8E 2AB41E LD HL,(ARREND) ; End of arrays
2296:16366+11 0F91 E5 PUSH HL ; Save end of arrays
2297:16377+11 0F92 09 ADD HL,BC ; Move up 6 bytes
2298:16388+10 0F93 C1 POP BC ; Source address in BC
2299:16398+11 0F94 E5 PUSH HL ; Save new end address
2300:16409+17 0F95 CDB403 CALL MOVUP ; Move arrays up
2301:16426+10 0F98 E1 POP HL ; Restore new end address
2302:16436+16 0F99 22B41E LD (ARREND),HL ; Set new end address
2303:16452+4 0F9C 60 LD H,B ; End of variables to HL
2304:16456+4 0F9D 69 LD L,C
2305:16460+16 0F9E 22B21E LD (VAREND),HL ; Set new end address
2306:
2307:16476+6 0FA1 2B ZEROLP: DEC HL ; Back through to zero variable
2308:16482+10 0FA2 3600 LD (HL),0 ; Zero byte in variable
2309:16492+4 0FA4 7C LD A,H ; Done them all?
2310:16496+4 0FA5 92 SUB D ; Compare with D
2311:16500+7+5 0FA6 2002 JR NZ,$+4 ; Different - Exit
2312:16507+4 0FA8 7D LD A,L ; Get L
2313:16511+4 0FA9 93 SUB E ; Compare with E
2314:16515+10 0FAA C2A10F JP NZ,ZEROLP ; No - Keep on going
2315:16525+10 0FAD D1 POP DE ; Get variable name
2316:16535+7 0FAE 73 LD (HL),E ; Store second character
2317:16542+6 0FAF 23 INC HL
2318:16548+7 0FB0 72 LD (HL),D ; Store first character
2319:16555+6 0FB1 23 INC HL
2320:16561+4 0FB2 EB RETADR: EX DE,HL ; Address of variable in DE
2321:16565+10 0FB3 E1 POP HL ; Restore code string address
2322:16575+10 0FB4 C9 RET
2323:
2324:16585+13 0FB5 32C11E RETNUL: LD (FPEXP),A ; Set result to zero
2325:16598+10 0FB8 218103 LD HL,ZERBYT ; Also set a null string
2326:16608+16 0FBB 22BE1E LD (FPREG),HL ; Save for EVAL
2327:16624+10 0FBE E1 POP HL ; Restore code string address
2328:16634+10 0FBF C9 RET
2329:
2330:16644+11 0FC0 E5 SBSCPT: PUSH HL ; Save code string address
2331:16655+16 0FC1 2A861E LD HL,(LCRFLG) ; Locate/Create and Type
2332:16671+19 0FC4 E3 EX (SP),HL ; Save and get code string
2333:16690+4 0FC5 57 LD D,A ; Zero number of dimensions
2334:16694+11 0FC6 D5 SCPTLP: PUSH DE ; Save number of dimensions
2335:16705+11 0FC7 C5 PUSH BC ; Save array name
2336:16716+17 0FC8 CDF508 CALL FPSINT ; Get subscript (0-32767)
2337:16733+10 0FCB C1 POP BC ; Restore array name
2338:16743+10 0FCC F1 POP AF ; Get number of dimensions
2339:16753+4 0FCD EB EX DE,HL
2340:16757+19 0FCE E3 EX (SP),HL ; Save subscript value
2341:16776+11 0FCF E5 PUSH HL ; Save LCRFLG and TYPE
2342:16787+4 0FD0 EB EX DE,HL
2343:16791+4 0FD1 3C INC A ; Count dimensions
2344:16795+4 0FD2 57 LD D,A ; Save in D
2345:16799+7 0FD3 7E LD A,(HL) ; Get next byte in code string
2346:16806+7 0FD4 FE2C CP ',' ; Comma (more to come)?
2347:16813+10 0FD6 CAC60F JP Z,SCPTLP ; Yes - More subscripts
2348:16823+17 0FD9 CDBC06 CALL CHKSYN ; Make sure ")" follows
2349: - 0FDC 29 .BYTE ")"
2350:16840+16 0FDD 22AA1E LD (NXTOPR),HL ; Save code string address
2351:16856+10 0FE0 E1 POP HL ; Get LCRFLG and TYPE
2352:16866+16 0FE1 22861E LD (LCRFLG),HL ; Restore Locate/create & type
2353:16882+7 0FE4 1E00 LD E,0 ; Flag not CSAVE* or CLOAD*
2354:16889+11 0FE6 D5 PUSH DE ; Save number of dimensions (D)
2355: - 0FE7 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF'
2356:
2357:16900+11 0FE8 E5 ARLDSV: PUSH HL ; Save code string address
2358:16911+11 0FE9 F5 PUSH AF ; A = 00 , Flags set = Z,N
2359:16922+16 0FEA 2AB21E LD HL,(VAREND) ; Start of arrays
2360: - 0FED 3E .BYTE 3EH ; Skip "ADD HL,DE"
2361:16938+11 0FEE 19 FNDARY: ADD HL,DE ; Move to next array start
2362:16949+20 0FEF ED5BB41E LD DE,(ARREND) ; End of arrays
2363:16969+4 0FF3 7C LD A,H ; End of arrays found?
2364:16973+4 0FF4 92 SUB D ; Compare with D
2365:16977+10 0FF5 C2FA0F JP NZ,$+5 ; Different - Exit
2366:16987+4 0FF8 7D LD A,L ; Get L
2367:16991+4 0FF9 93 SUB E ; Compare with E
2368:16995+10 0FFA CA2310 JP Z,CREARY ; Yes - Create array
2369:17005+7 0FFD 7E LD A,(HL) ; Get second byte of name
2370:17012+4 0FFE B9 CP C ; Compare with name given
2371:17016+6 0FFF 23 INC HL ; Move on
2372:17022+10 1000 C20510 JP NZ,NXTARY ; Different - Find next array
2373:17032+7 1003 7E LD A,(HL) ; Get first byte of name
2374:17039+4 1004 B8 CP B ; Compare with name given
2375:17043+6 1005 23 NXTARY: INC HL ; Move on
2376:17049+7 1006 5E LD E,(HL) ; Get LSB of next array address
2377:17056+6 1007 23 INC HL
2378:17062+7 1008 56 LD D,(HL) ; Get MSB of next array address
2379:17069+6 1009 23 INC HL
2380:17075+10 100A C2EE0F JP NZ,FNDARY ; Not found - Keep looking
2381:17085+13 100D 3A861E LD A,(LCRFLG) ; Found Locate or Create it?
2382:17098+4 1010 B7 OR A
2383:17102+10 1011 C2F403 JP NZ,DDERR ; Create - ?DD Error
2384:17112+10 1014 F1 POP AF ; Locate - Get number of dim'ns
2385:17122+4 1015 44 LD B,H ; BC Points to array dim'ns
2386:17126+4 1016 4D LD C,L
2387:17130+10 1017 CA7513 JP Z,POPHRT ; Jump if array load/save
2388:17140+7 101A 96 SUB (HL) ; Same number of dimensions?
2389:17147+10 101B CA8410 JP Z,FINDEL ; Yes - Find element
2390:17157+7 101E 1E10 BSERR: LD E,BS ; ?BS Error
2391:17164+10 1020 C3FF03 JP ERROR ; Output error
2392:
2393:17174+10 1023 110400 CREARY: LD DE,4 ; 4 Bytes per entry
2394:17184+10 1026 F1 POP AF ; Array to save or 0 dim'ns?
2395:17194+10 1027 CA1609 JP Z,FCERR ; Yes - ?FC Error
2396:17204+7 102A 71 LD (HL),C ; Save second byte of name
2397:17211+6 102B 23 INC HL
2398:17217+7 102C 70 LD (HL),B ; Save first byte of name
2399:17224+6 102D 23 INC HL
2400:17230+4 102E 4F LD C,A ; Number of dimensions to C
2401:17234+17 102F CDC803 CALL CHKSTK ; Check if enough memory
2402:17251+6 1032 23 INC HL ; Point to number of dimensions
2403:17257+6 1033 23 INC HL
2404:17263+16 1034 229F1E LD (CUROPR),HL ; Save address of pointer
2405:17279+7 1037 71 LD (HL),C ; Set number of dimensions
2406:17286+6 1038 23 INC HL
2407:17292+13 1039 3A861E LD A,(LCRFLG) ; Locate of Create?
2408:17305+4 103C 17 RLA ; Carry set = Create
2409:17309+4 103D 79 LD A,C ; Get number of dimensions
2410:17313+10 103E 010B00 CRARLP: LD BC,10+1 ; Default dimension size 10
2411:17323+10 1041 D24610 JP NC,DEFSIZ ; Locate - Set default size
2412:17333+10 1044 C1 POP BC ; Get specified dimension size
2413:17343+6 1045 03 INC BC ; Include zero element
2414:17349+7 1046 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size
2415:17356+6 1047 23 INC HL
2416:17362+7 1048 70 LD (HL),B ; Save MSB of dimension size
2417:17369+6 1049 23 INC HL
2418:17375+11 104A F5 PUSH AF ; Save num' of dim'ns an status
2419:17386+11 104B E5 PUSH HL ; Save address of dim'n size
2420:17397+17 104C CD1D18 CALL MLDEBC ; Multiply DE by BC to HL
2421:17414+4 104F EB EX DE,HL ; amount of mem needed (to DE)
2422:17418+10 1050 E1 POP HL ; Restore address of dimension
2423:17428+10 1051 F1 POP AF ; Restore number of dimensions
2424:17438+4 1052 3D DEC A ; Count them
2425:17442+10 1053 C23E10 JP NZ,CRARLP ; Do next dimension if more
2426:17452+11 1056 F5 PUSH AF ; Save locate/create flag
2427:17463+4 1057 42 LD B,D ; MSB of memory needed
2428:17467+4 1058 4B LD C,E ; LSB of memory needed
2429:17471+4 1059 EB EX DE,HL
2430:17475+11 105A 19 ADD HL,DE ; Add bytes to array start
2431:17486+10 105B DAE003 JP C,OMERR ; Too big - Error
2432:17496+17 105E CDD103 CALL ENFMEM ; See if enough memory
2433:17513+16 1061 22B41E LD (ARREND),HL ; Save new end of array
2434:
2435:17529+6 1064 2B ZERARY: DEC HL ; Back through array data
2436:17535+10 1065 3600 LD (HL),0 ; Set array element to zero
2437:17545+4 1067 7C LD A,H ; All elements zeroed?
2438:17549+4 1068 92 SUB D ; Compare with D
2439:17553+7+5 1069 2002 JR NZ,$+4 ; Different - Exit
2440:17560+4 106B 7D LD A,L ; Get L
2441:17564+4 106C 93 SUB E ; Compare with E
2442:17568+10 106D C26410 JP NZ,ZERARY ; No - Keep on going
2443:17578+6 1070 03 INC BC ; Number of bytes + 1
2444:17584+4 1071 57 LD D,A ; A=0
2445:17588+16 1072 2A9F1E LD HL,(CUROPR) ; Get address of array
2446:17604+7 1075 5E LD E,(HL) ; Number of dimensions
2447:17611+4 1076 EB EX DE,HL ; To HL
2448:17615+11 1077 29 ADD HL,HL ; Two bytes per dimension size
2449:17626+11 1078 09 ADD HL,BC ; Add number of bytes
2450:17637+4 1079 EB EX DE,HL ; Bytes needed to DE
2451:17641+6 107A 2B DEC HL
2452:17647+6 107B 2B DEC HL
2453:17653+7 107C 73 LD (HL),E ; Save LSB of bytes needed
2454:17660+6 107D 23 INC HL
2455:17666+7 107E 72 LD (HL),D ; Save MSB of bytes needed
2456:17673+6 107F 23 INC HL
2457:17679+10 1080 F1 POP AF ; Locate / Create?
2458:17689+10 1081 DAAC10 JP C,ENDDIM ; A is 0 , End if create
2459:17699+4 1084 47 FINDEL: LD B,A ; Find array element
2460:17703+4 1085 4F LD C,A
2461:17707+7 1086 7E LD A,(HL) ; Number of dimensions
2462:17714+6 1087 23 INC HL
2463: - 1088 16 .BYTE 16H ; Skip "POP HL"
2464:17720+10 1089 E1 FNDELP: POP HL ; Address of next dim' size
2465:17730+7 108A 5E LD E,(HL) ; Get LSB of dim'n size
2466:17737+6 108B 23 INC HL
2467:17743+7 108C 56 LD D,(HL) ; Get MSB of dim'n size
2468:17750+6 108D 23 INC HL
2469:17756+19 108E E3 EX (SP),HL ; Save address - Get index
2470:17775+11 108F F5 PUSH AF ; Save number of dim'ns
2471:17786+4 1090 7C LD A,H ; Dimension too large?
2472:17790+4 1091 92 SUB D ; Compare with D
2473:17794+10 1092 C29710 JP NZ,$+5 ; Different - Exit
2474:17804+4 1095 7D LD A,L ; Get L
2475:17808+4 1096 93 SUB E ; Compare with E
2476:17812+10 1097 D21E10 JP NC,BSERR ; Yes - ?BS Error
2477:17822+11 109A E5 PUSH HL ; Save index
2478:17833+17 109B CD1D18 CALL MLDEBC ; Multiply previous by size
2479:17850+10 109E D1 POP DE ; Index supplied to DE
2480:17860+11 109F 19 ADD HL,DE ; Add index to pointer
2481:17871+10 10A0 F1 POP AF ; Number of dimensions
2482:17881+4 10A1 3D DEC A ; Count them
2483:17885+4 10A2 44 LD B,H ; MSB of pointer
2484:17889+4 10A3 4D LD C,L ; LSB of pointer
2485:17893+10 10A4 C28910 JP NZ,FNDELP ; More - Keep going
2486:17903+11 10A7 29 ADD HL,HL ; 4 Bytes per element
2487:17914+11 10A8 29 ADD HL,HL
2488:17925+10 10A9 C1 POP BC ; Start of array
2489:17935+11 10AA 09 ADD HL,BC ; Point to element
2490:17946+4 10AB EB EX DE,HL ; Address of element to DE
2491:17950+16 10AC 2AAA1E ENDDIM: LD HL,(NXTOPR) ; Got code string address
2492:17966+10 10AF C9 RET
2493:
2494:17976+16 10B0 2AB41E FRE: LD HL,(ARREND) ; Start of free memory
2495:17992+4 10B3 EB EX DE,HL ; To DE
2496:17996+10 10B4 210000 LD HL,0 ; End of free memory
2497:18006+11 10B7 39 ADD HL,SP ; Current stack value
2498:18017+13 10B8 3A871E LD A,(TYPE) ; Dummy argument type
2499:18030+4 10BB B7 OR A
2500:18034+10 10BC CACC10 JP Z,FRENUM ; Numeric - Free variable space
2501:18044+17 10BF CD5613 CALL GSTRCU ; Current string to pool
2502:18061+17 10C2 CD4812 CALL GARBGE ; Garbage collection
2503:18078+16 10C5 2A341E LD HL,(STRSPC) ; Bottom of string space in use
2504:18094+4 10C8 EB EX DE,HL ; To DE
2505:18098+16 10C9 2A9D1E LD HL,(STRBOT) ; Bottom of string space
2506:18114+4 10CC 7D FRENUM: LD A,L ; Get LSB of end
2507:18118+4 10CD 93 SUB E ; Subtract LSB of beginning
2508:18122+4 10CE 4F LD C,A ; Save difference if C
2509:18126+4 10CF 7C LD A,H ; Get MSB of end
2510:18130+4 10D0 9A SBC A,D ; Subtract MSB of beginning
2511:18134+4 10D1 41 ACPASS: LD B,C ; Return integer AC
2512:18138+4 10D2 50 ABPASS: LD D,B ; Return integer AB
2513:18142+7 10D3 1E00 LD E,0
2514:18149+10 10D5 21871E LD HL,TYPE ; Point to type
2515:18159+7 10D8 73 LD (HL),E ; Set type to numeric
2516:18166+7 10D9 0690 LD B,80H+16 ; 16 bit integer
2517:18173+10 10DB C35617 JP RETINT ; Return the integr
2518:
2519:18183+13 10DE 3A851E POS: LD A,(CURPOS) ; Get cursor position
2520:18196+4 10E1 47 PASSA: LD B,A ; Put A into AB
2521:18200+4 10E2 AF XOR A ; Zero A
2522:18204+10 10E3 C3D210 JP ABPASS ; Return integer AB
2523:
2524:18214+17 10E6 CD7111 DEF: CALL CHEKFN ; Get "FN" and name
2525:18231+17 10E9 CD6311 CALL IDTEST ; Test for illegal direct
2526:18248+10 10EC 01F009 LD BC,DATA ; To get next statement
2527:18258+11 10EF C5 PUSH BC ; Save address for RETurn
2528:18269+11 10F0 D5 PUSH DE ; Save address of function ptr
2529:18280+17 10F1 CDBC06 CALL CHKSYN ; Make sure "(" follows
2530: - 10F4 28 .BYTE "("
2531:18297+17 10F5 CDF50E CALL GETVAR ; Get argument variable name
2532:18314+11 10F8 E5 PUSH HL ; Save code string address
2533:18325+4 10F9 EB EX DE,HL ; Argument address to HL
2534:18329+6 10FA 2B DEC HL
2535:18335+7 10FB 56 LD D,(HL) ; Get first byte of arg name
2536:18342+6 10FC 2B DEC HL
2537:18348+7 10FD 5E LD E,(HL) ; Get second byte of arg name
2538:18355+10 10FE E1 POP HL ; Restore code string address
2539:18365+17 10FF CDF90C CALL TSTNUM ; Make sure numeric argument
2540:18382+17 1102 CDBC06 CALL CHKSYN ; Make sure ")" follows
2541: - 1105 29 .BYTE ")"
2542:18399+17 1106 CDBC06 CALL CHKSYN ; Make sure "=" follows
2543: - 1109 B1 .BYTE ZEQUAL ; "=" token
2544:18416+4 110A 44 LD B,H ; Code string address to BC
2545:18420+4 110B 4D LD C,L
2546:18424+19 110C E3 EX (SP),HL ; Save code str , Get FN ptr
2547:18443+7 110D 71 LD (HL),C ; Save LSB of FN code string
2548:18450+6 110E 23 INC HL
2549:18456+7 110F 70 LD (HL),B ; Save MSB of FN code string
2550:18463+10 1110 C3B011 JP SVSTAD ; Save address and do function
2551:
2552:18473+17 1113 CD7111 DOFN: CALL CHEKFN ; Make sure FN follows
2553:18490+11 1116 D5 PUSH DE ; Save function pointer address
2554:18501+17 1117 CDD10D CALL EVLPAR ; Evaluate expression in "()"
2555:18518+17 111A CDF90C CALL TSTNUM ; Make sure numeric result
2556:18535+19 111D E3 EX (SP),HL ; Save code str , Get FN ptr
2557:18554+7 111E 5E LD E,(HL) ; Get LSB of FN code string
2558:18561+6 111F 23 INC HL
2559:18567+7 1120 56 LD D,(HL) ; Get MSB of FN code string
2560:18574+6 1121 23 INC HL
2561:18580+4 1122 7A LD A,D ; And function DEFined?
2562:18584+4 1123 B3 OR E
2563:18588+10 1124 CAF703 JP Z,UFERR ; No - ?UF Error
2564:18598+7 1127 7E LD A,(HL) ; Get LSB of argument address
2565:18605+6 1128 23 INC HL
2566:18611+7 1129 66 LD H,(HL) ; Get MSB of argument address
2567:18618+4 112A 6F LD L,A ; HL = Arg variable address
2568:18622+11 112B E5 PUSH HL ; Save it
2569:18633+16 112C 2AB81E LD HL,(FNRGNM) ; Get old argument name
2570:18649+19 112F E3 EX (SP),HL ; Save old , Get new
2571:18668+16 1130 22B81E LD (FNRGNM),HL ; Set new argument name
2572:18684+16 1133 2ABC1E LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value
2573:18700+11 1136 E5 PUSH HL ; Save it
2574:18711+16 1137 2ABA1E LD HL,(FNARG) ; Get MSB,EXP of old arg value
2575:18727+11 113A E5 PUSH HL ; Save it
2576:18738+11 113B D5 PUSH DE ; Save FN code string address
2577:18749+10 113C 11BA1E LD DE,FNARG ; DE = Value of argument
2578:18759+10 113F 21BE1E LD HL,FPREG ; Move FPREG to argument
2579:18769+16 1142 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
2580:18785+16 1144 EDA0 LDI
2581:18801+16 1146 EDA0 LDI
2582:18817+16 1148 EDA0 LDI
2583:18833+10 114A E1 POP HL ; Get FN code string address
2584:18843+17 114B CDF60C CALL GETNUM ; Get value from function
2585:18860+6 114E 2B DEC HL ; DEC 'cos GETCHR INCs
2586:18866+17 114F CD4F08 CALL GETCHR ; Get next character
2587:18883+10 1152 C2EB03 JP NZ,SNERR ; Bad character in FN - Error
2588:18893+10 1155 E1 POP HL ; Get MSB,EXP of old arg
2589:18903+16 1156 22BA1E LD (FNARG),HL ; Restore it
2590:18919+10 1159 E1 POP HL ; Get LSB,NLSB of old arg
2591:18929+16 115A 22BC1E LD (FNARG+2),HL ; Restore it
2592:18945+10 115D E1 POP HL ; Get name of old arg
2593:18955+16 115E 22B81E LD (FNRGNM),HL ; Restore it
2594:18971+10 1161 E1 POP HL ; Restore code string address
2595:18981+10 1162 C9 RET
2596:
2597:18991+11 1163 E5 IDTEST: PUSH HL ; Save code string address
2598:19002+16 1164 2A361E LD HL,(LINEAT) ; Get current line number
2599:19018+6 1167 23 INC HL ; -1 means direct statement
2600:19024+4 1168 7C LD A,H
2601:19028+4 1169 B5 OR L
2602:19032+10 116A E1 POP HL ; Restore code string address
2603:19042+5+6 116B C0 RET NZ ; Return if in program
2604:19047+7 116C 1E16 LD E,ID ; ?ID Error
2605:19054+10 116E C3FF03 JP ERROR
2606:
2607:19064+17 1171 CDBC06 CHEKFN: CALL CHKSYN ; Make sure FN follows
2608: - 1174 A4 .BYTE ZFN ; "FN" token
2609:19081+7 1175 3E80 LD A,80H
2610:19088+13 1177 32A51E LD (FORFLG),A ; Flag FN name to find
2611:19101+7 117A B6 OR (HL) ; FN name has bit 7 set
2612:19108+4 117B 47 LD B,A ; in first byte of name
2613:19112+17 117C CDFA0E CALL GTFNAM ; Get FN name
2614:19129+10 117F C3F90C JP TSTNUM ; Make sure numeric function
2615:
2616:19139+17 1182 CDF90C STR: CALL TSTNUM ; Make sure it's a number
2617:19156+17 1185 CDDA18 CALL NUMASC ; Turn number into text
2618:19173+17 1188 CDB611 STR1: CALL CRTST ; Create string entry for it
2619:19190+17 118B CD5613 CALL GSTRCU ; Current string to pool
2620:19207+10 118E 01B713 LD BC,TOPOOL ; Save in string pool
2621:19217+11 1191 C5 PUSH BC ; Save address on stack
2622:
2623:19228+7 1192 7E SAVSTR: LD A,(HL) ; Get string length
2624:19235+6 1193 23 INC HL
2625:19241+6 1194 23 INC HL
2626:19247+11 1195 E5 PUSH HL ; Save pointer to string
2627:19258+17 1196 CD1B12 CALL TESTR ; See if enough string space
2628:19275+10 1199 E1 POP HL ; Restore pointer to string
2629:19285+7 119A 4E LD C,(HL) ; Get LSB of address
2630:19292+6 119B 23 INC HL
2631:19298+7 119C 46 LD B,(HL) ; Get MSB of address
2632:19305+17 119D CDAA11 CALL CRTMST ; Create string entry
2633:19322+11 11A0 E5 PUSH HL ; Save pointer to MSB of addr
2634:19333+4 11A1 6F LD L,A ; Length of string
2635:19337+17 11A2 CD4913 CALL TOSTRA ; Move to string area
2636:19354+10 11A5 D1 POP DE ; Restore pointer to MSB
2637:19364+10 11A6 C9 RET
2638:
2639:19374+17 11A7 CD1B12 MKTMST: CALL TESTR ; See if enough string space
2640:19391+10 11AA 21991E CRTMST: LD HL,TMPSTR ; Temporary string
2641:19401+11 11AD E5 PUSH HL ; Save it
2642:19412+7 11AE 77 LD (HL),A ; Save length of string
2643:19419+6 11AF 23 INC HL
2644:19425+6 11B0 23 SVSTAD: INC HL
2645:19431+7 11B1 73 LD (HL),E ; Save LSB of address
2646:19438+6 11B2 23 INC HL
2647:19444+7 11B3 72 LD (HL),D ; Save MSB of address
2648:19451+10 11B4 E1 POP HL ; Restore pointer
2649:19461+10 11B5 C9 RET
2650:
2651:19471+6 11B6 2B CRTST: DEC HL ; DEC - INCed after
2652:19477+7 11B7 0622 QTSTR: LD B,'"' ; Terminating quote
2653:19484+4 11B9 50 LD D,B ; Quote to D
2654:19488+11 11BA E5 DTSTR: PUSH HL ; Save start
2655:19499+7 11BB 0EFF LD C,-1 ; Set counter to -1
2656:19506+6 11BD 23 QTSTLP: INC HL ; Move on
2657:19512+7 11BE 7E LD A,(HL) ; Get byte
2658:19519+4 11BF 0C INC C ; Count bytes
2659:19523+4 11C0 B7 OR A ; End of line?
2660:19527+10 11C1 CACC11 JP Z,CRTSTE ; Yes - Create string entry
2661:19537+4 11C4 BA CP D ; Terminator D found?
2662:19541+10 11C5 CACC11 JP Z,CRTSTE ; Yes - Create string entry
2663:19551+4 11C8 B8 CP B ; Terminator B found?
2664:19555+10 11C9 C2BD11 JP NZ,QTSTLP ; No - Keep looking
2665:19565+7 11CC FE22 CRTSTE: CP '"' ; End with '"'?
2666:19572+10+7 11CE CC4F08 CALL Z,GETCHR ; Yes - Get next character
2667:19582+19 11D1 E3 EX (SP),HL ; Starting quote
2668:19601+6 11D2 23 INC HL ; First byte of string
2669:19607+4 11D3 EB EX DE,HL ; To DE
2670:19611+4 11D4 79 LD A,C ; Get length
2671:19615+17 11D5 CDAA11 CALL CRTMST ; Create string entry
2672:19632+10 11D8 11991E TSTOPL: LD DE,TMPSTR ; Temporary string
2673:19642+16 11DB 2A8B1E LD HL,(TMSTPT) ; Temporary string pool pointer
2674:19658+16 11DE 22BE1E LD (FPREG),HL ; Save address of string ptr
2675:19674+7 11E1 3E01 LD A,1
2676:19681+13 11E3 32871E LD (TYPE),A ; Set type to string
2677:19694+4 11E6 EB EX DE,HL ; Move string to pool
2678:19698+16 11E7 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
2679:19714+16 11E9 EDA0 LDI
2680:19730+16 11EB EDA0 LDI
2681:19746+16 11ED EDA0 LDI
2682:19762+4 11EF EB EX DE,HL ; Swap source destination
2683:19766+4 11F0 7C LD A,H ; Out of string pool?
2684:19770+4 11F1 92 SUB D ; Compare with D
2685:19774+7+5 11F2 2002 JR NZ,$+4 ; Different - Exit
2686:19781+4 11F4 7D LD A,L ; Get L
2687:19785+4 11F5 93 SUB E ; Compare with E
2688:19789+16 11F6 228B1E LD (TMSTPT),HL ; Save new pointer
2689:19805+10 11F9 E1 POP HL ; Restore code string address
2690:19815+7 11FA 7E LD A,(HL) ; Get next code byte
2691:19822+5+6 11FB C0 RET NZ ; Return if pool OK
2692:19827+7 11FC 1E1E LD E,ST ; ?ST Error
2693:19834+10 11FE C3FF03 JP ERROR ; String pool overflow
2694:
2695:19844+6 1201 23 PRNUMS: INC HL ; Skip leading space
2696:19850+17 1202 CDB611 PRS: CALL CRTST ; Create string entry for it
2697:19867+17 1205 CD5613 PRS1: CALL GSTRCU ; Current string to pool
2698:19884+17 1208 CD8917 CALL LOADFP ; Move string block to BCDE
2699:19901+4 120B 1C INC E ; Length + 1
2700:19905+4 120C 1D PRSLP: DEC E ; Count characters
2701:19909+5+6 120D C8 RET Z ; End of string
2702:19914+7 120E 0A LD A,(BC) ; Get byte to output
2703:19921+17 120F CDC706 CALL OUTC ; Output character in A
2704:19938+7 1212 FE0D CP CR ; Return?
2705:19945+10+7 1214 CC230B CALL Z,DONULL ; Yes - Do nulls
2706:19955+6 1217 03 INC BC ; Next byte in string
2707:19961+10 1218 C30C12 JP PRSLP ; More characters to output
2708:
2709:19971+4 121B B7 TESTR: OR A ; Test if enough room
2710: - 121C 0E .BYTE 0EH ; No garbage collection done
2711:19975+10 121D F1 GRBDON: POP AF ; Garbage collection done
2712:19985+11 121E F5 PUSH AF ; Save status
2713:19996+16 121F 2A341E LD HL,(STRSPC) ; Bottom of string space in use
2714:20012+4 1222 EB EX DE,HL ; To DE
2715:20016+16 1223 2A9D1E LD HL,(STRBOT) ; Bottom of string area
2716:20032+4 1226 2F CPL ; Negate length (Top down)
2717:20036+4 1227 4F LD C,A ; -Length to BC
2718:20040+7 1228 06FF LD B,-1 ; BC = -ve length of string
2719:20047+11 122A 09 ADD HL,BC ; Add to bottom of space in use
2720:20058+6 122B 23 INC HL ; Plus one for 2's complement
2721:20064+4 122C 7C LD A,H ; Below string RAM area?
2722:20068+4 122D 92 SUB D ; Compare with D
2723:20072+7+5 122E 2002 JR NZ,$+4 ; Different - Exit
2724:20079+4 1230 7D LD A,L ; Get L
2725:20083+4 1231 93 SUB E ; Compare with E
2726:20087+10 1232 DA3C12 JP C,TESTOS ; Tidy up if not done else err
2727:20097+16 1235 229D1E LD (STRBOT),HL ; Save new bottom of area
2728:20113+6 1238 23 INC HL ; Point to first byte of string
2729:20119+4 1239 EB EX DE,HL ; Address to DE
2730:20123+10 123A F1 POPAF: POP AF ; Throw away status push
2731:20133+10 123B C9 RET
2732:
2733:20143+10 123C F1 TESTOS: POP AF ; Garbage collect been done?
2734:20153+7 123D 1E1A LD E,OS ; ?OS Error
2735:20160+10 123F CAFF03 JP Z,ERROR ; Yes - Not enough string apace
2736:20170+4 1242 BF CP A ; Flag garbage collect done
2737:20174+11 1243 F5 PUSH AF ; Save status
2738:20185+10 1244 011D12 LD BC,GRBDON ; Garbage collection done
2739:20195+11 1247 C5 PUSH BC ; Save for RETurn
2740:20206+16 1248 2A891E GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer
2741:20222+16 124B 229D1E GARBLP: LD (STRBOT),HL ; Reset string pointer
2742:20238+10 124E 210000 LD HL,0
2743:20248+11 1251 E5 PUSH HL ; Flag no string found
2744:20259+16 1252 2A341E LD HL,(STRSPC) ; Get bottom of string space
2745:20275+11 1255 E5 PUSH HL ; Save bottom of string space
2746:20286+10 1256 218D1E LD HL,TMSTPL ; Temporary string pool
2747:20296+20 1259 ED5B8B1E GRBLP: LD DE,(TMSTPT) ; Temporary string pool pointer
2748:20316+4 125D 7C LD A,H ; Temporary string pool done?
2749:20320+4 125E 92 SUB D ; Compare with D
2750:20324+7+5 125F 2002 JR NZ,$+4 ; Different - Exit
2751:20331+4 1261 7D LD A,L ; Get L
2752:20335+4 1262 93 SUB E ; Compare with E
2753:20339+10 1263 015912 LD BC,GRBLP ; Loop until string pool done
2754:20349+10 1266 C2B512 JP NZ,STPOOL ; No - See if in string area
2755:20359+16 1269 2AB01E LD HL,(PROGND) ; Start of simple variables
2756:20375+20 126C ED5BB21E SMPVAR: LD DE,(VAREND) ; End of simple variables
2757:20395+4 1270 7C LD A,H ; All simple strings done?
2758:20399+4 1271 92 SUB D ; Compare with D
2759:20403+7+5 1272 2002 JR NZ,$+4 ; Different - Exit
2760:20410+4 1274 7D LD A,L ; Get L
2761:20414+4 1275 93 SUB E ; Compare with E
2762:20418+10 1276 CA8412 JP Z,ARRLP ; Yes - Do string arrays
2763:20428+7 1279 7E LD A,(HL) ; Get type of variable
2764:20435+6 127A 23 INC HL
2765:20441+6 127B 23 INC HL
2766:20447+4 127C B7 OR A ; "S" flag set if string
2767:20451+17 127D CDB812 CALL STRADD ; See if string in string area
2768:20468+10 1280 C36C12 JP SMPVAR ; Loop until simple ones done
2769:
2770:20478+10 1283 C1 GNXARY: POP BC ; Scrap address of this array
2771:20488+20 1284 ED5BB41E ARRLP: LD DE,(ARREND) ; End of string arrays
2772:20508+4 1288 7C LD A,H ; All string arrays done?
2773:20512+4 1289 92 SUB D ; Compare with D
2774:20516+7+5 128A 2002 JR NZ,$+4 ; Different - Exit
2775:20523+4 128C 7D LD A,L ; Get L
2776:20527+4 128D 93 SUB E ; Compare with E
2777:20531+10 128E CAE412 JP Z,SCNEND ; Yes - Move string if found
2778:20541+17 1291 CD8917 CALL LOADFP ; Get array name to BCDE
2779:20558+4 1294 7B LD A,E ; Get type of array
2780:20562+11 1295 E5 PUSH HL ; Save address of num of dim'ns
2781:20573+11 1296 09 ADD HL,BC ; Start of next array
2782:20584+4 1297 B7 OR A ; Test type of array
2783:20588+10 1298 F28312 JP P,GNXARY ; Numeric array - Ignore it
2784:20598+16 129B 229F1E LD (CUROPR),HL ; Save address of next array
2785:20614+10 129E E1 POP HL ; Get address of num of dim'ns
2786:20624+7 129F 4E LD C,(HL) ; BC = Number of dimensions
2787:20631+7 12A0 0600 LD B,0
2788:20638+11 12A2 09 ADD HL,BC ; Two bytes per dimension size
2789:20649+11 12A3 09 ADD HL,BC
2790:20660+6 12A4 23 INC HL ; Plus one for number of dim'ns
2791:20666+20 12A5 ED5B9F1E GRBARY: LD DE,(CUROPR) ; Get address of next array
2792:20686+4 12A9 7C LD A,H ; Is this array finished?
2793:20690+4 12AA 92 SUB D ; Compare with D
2794:20694+7+5 12AB 2002 JR NZ,$+4 ; Different - Exit
2795:20701+4 12AD 7D LD A,L ; Get L
2796:20705+4 12AE 93 SUB E ; Compare with E
2797:20709+10 12AF CA8412 JP Z,ARRLP ; Yes - Get next one
2798:20719+10 12B2 01A512 LD BC,GRBARY ; Loop until array all done
2799:20729+11 12B5 C5 STPOOL: PUSH BC ; Save return address
2800:20740+7 12B6 F680 OR 80H ; Flag string type
2801:20747+7 12B8 7E STRADD: LD A,(HL) ; Get string length
2802:20754+6 12B9 23 INC HL
2803:20760+6 12BA 23 INC HL
2804:20766+7 12BB 5E LD E,(HL) ; Get LSB of string address
2805:20773+6 12BC 23 INC HL
2806:20779+7 12BD 56 LD D,(HL) ; Get MSB of string address
2807:20786+6 12BE 23 INC HL
2808:20792+5+6 12BF F0 RET P ; Not a string - Return
2809:20797+4 12C0 B7 OR A ; Set flags on string length
2810:20801+5+6 12C1 C8 RET Z ; Null string - Return
2811:20806+4 12C2 44 LD B,H ; Save variable pointer
2812:20810+4 12C3 4D LD C,L
2813:20814+16 12C4 2A9D1E LD HL,(STRBOT) ; Bottom of new area
2814:20830+4 12C7 7C LD A,H ; String been done?
2815:20834+4 12C8 92 SUB D ; Compare with D
2816:20838+7+5 12C9 2002 JR NZ,$+4 ; Different - Exit
2817:20845+4 12CB 7D LD A,L ; Get L
2818:20849+4 12CC 93 SUB E ; Compare with E
2819:20853+4 12CD 60 LD H,B ; Restore variable pointer
2820:20857+4 12CE 69 LD L,C
2821:20861+5+6 12CF D8 RET C ; String done - Ignore
2822:20866+10 12D0 E1 POP HL ; Return address
2823:20876+19 12D1 E3 EX (SP),HL ; Lowest available string area
2824:20895+4 12D2 7C LD A,H ; String within string area?
2825:20899+4 12D3 92 SUB D ; Compare with D
2826:20903+7+5 12D4 2002 JR NZ,$+4 ; Different - Exit
2827:20910+4 12D6 7D LD A,L ; Get L
2828:20914+4 12D7 93 SUB E ; Compare with E
2829:20918+19 12D8 E3 EX (SP),HL ; Lowest available string area
2830:20937+11 12D9 E5 PUSH HL ; Re-save return address
2831:20948+4 12DA 60 LD H,B ; Restore variable pointer
2832:20952+4 12DB 69 LD L,C
2833:20956+5+6 12DC D0 RET NC ; Outside string area - Ignore
2834:20961+10 12DD C1 POP BC ; Get return , Throw 2 away
2835:20971+10 12DE F1 POP AF ;
2836:20981+10 12DF F1 POP AF ;
2837:20991+11 12E0 E5 PUSH HL ; Save variable pointer
2838:21002+11 12E1 D5 PUSH DE ; Save address of current
2839:21013+11 12E2 C5 PUSH BC ; Put back return address
2840:21024+10 12E3 C9 RET ; Go to it
2841:
2842:21034+10 12E4 D1 SCNEND: POP DE ; Addresses of strings
2843:21044+10 12E5 E1 POP HL ;
2844:21054+4 12E6 7D LD A,L ; HL = 0 if no more to do
2845:21058+4 12E7 B4 OR H
2846:21062+5+6 12E8 C8 RET Z ; No more to do - Return
2847:21067+6 12E9 2B DEC HL
2848:21073+7 12EA 46 LD B,(HL) ; MSB of address of string
2849:21080+6 12EB 2B DEC HL
2850:21086+7 12EC 4E LD C,(HL) ; LSB of address of string
2851:21093+11 12ED E5 PUSH HL ; Save variable address
2852:21104+6 12EE 2B DEC HL
2853:21110+6 12EF 2B DEC HL
2854:21116+7 12F0 6E LD L,(HL) ; HL = Length of string
2855:21123+7 12F1 2600 LD H,0
2856:21130+11 12F3 09 ADD HL,BC ; Address of end of string+1
2857:21141+4 12F4 50 LD D,B ; String address to DE
2858:21145+4 12F5 59 LD E,C
2859:21149+6 12F6 2B DEC HL ; Last byte in string
2860:21155+4 12F7 44 LD B,H ; Address to BC
2861:21159+4 12F8 4D LD C,L
2862:21163+16 12F9 2A9D1E LD HL,(STRBOT) ; Current bottom of string area
2863:21179+17 12FC CDB703 CALL MOVSTR ; Move string to new address
2864:21196+10 12FF E1 POP HL ; Restore variable address
2865:21206+7 1300 71 LD (HL),C ; Save new LSB of address
2866:21213+6 1301 23 INC HL
2867:21219+7 1302 70 LD (HL),B ; Save new MSB of address
2868:21226+4 1303 69 LD L,C ; Next string area+1 to HL
2869:21230+4 1304 60 LD H,B
2870:21234+6 1305 2B DEC HL ; Next string area address
2871:21240+10 1306 C34B12 JP GARBLP ; Look for more strings
2872:
2873:21250+11 1309 C5 CONCAT: PUSH BC ; Save prec' opr & code string
2874:21261+11 130A E5 PUSH HL ;
2875:21272+16 130B 2ABE1E LD HL,(FPREG) ; Get first string
2876:21288+19 130E E3 EX (SP),HL ; Save first string
2877:21307+17 130F CD820D CALL OPRND ; Get second string
2878:21324+19 1312 E3 EX (SP),HL ; Restore first string
2879:21343+17 1313 CDFA0C CALL TSTSTR ; Make sure it's a string
2880:21360+7 1316 7E LD A,(HL) ; Get length of second string
2881:21367+11 1317 E5 PUSH HL ; Save first string
2882:21378+16 1318 2ABE1E LD HL,(FPREG) ; Get second string
2883:21394+11 131B E5 PUSH HL ; Save second string
2884:21405+7 131C 86 ADD A,(HL) ; Add length of second string
2885:21412+7 131D 1E1C LD E,LS ; ?LS Error
2886:21419+10 131F DAFF03 JP C,ERROR ; String too long - Error
2887:21429+17 1322 CDA711 CALL MKTMST ; Make temporary string
2888:21446+10 1325 D1 POP DE ; Get second string to DE
2889:21456+17 1326 CD5A13 CALL GSTRDE ; Move to string pool if needed
2890:21473+19 1329 E3 EX (SP),HL ; Get first string
2891:21492+17 132A CD5913 CALL GSTRHL ; Move to string pool if needed
2892:21509+11 132D E5 PUSH HL ; Save first string
2893:21520+16 132E 2A9B1E LD HL,(TMPSTR+2) ; Temporary string address
2894:21536+4 1331 EB EX DE,HL ; To DE
2895:21540+17 1332 CD4013 CALL SSTSA ; First string to string area
2896:21557+17 1335 CD4013 CALL SSTSA ; Second string to string area
2897:21574+10 1338 21140D LD HL,EVAL2 ; Return to evaluation loop
2898:21584+19 133B E3 EX (SP),HL ; Save return,get code string
2899:21603+11 133C E5 PUSH HL ; Save code string address
2900:21614+10 133D C3D811 JP TSTOPL ; To temporary string to pool
2901:
2902:21624+10 1340 E1 SSTSA: POP HL ; Return address
2903:21634+19 1341 E3 EX (SP),HL ; Get string block,save return
2904:21653+7 1342 7E LD A,(HL) ; Get length of string
2905:21660+6 1343 23 INC HL
2906:21666+6 1344 23 INC HL
2907:21672+7 1345 4E LD C,(HL) ; Get LSB of string address
2908:21679+6 1346 23 INC HL
2909:21685+7 1347 46 LD B,(HL) ; Get MSB of string address
2910:21692+4 1348 6F LD L,A ; Length to L
2911:21696+4 1349 2C TOSTRA: INC L ; INC - DECed after
2912:21700+4 134A 2D TSALP: DEC L ; Count bytes moved
2913:21704+5+6 134B C8 RET Z ; End of string - Return
2914:21709+7 134C 0A LD A,(BC) ; Get source
2915:21716+7 134D 12 LD (DE),A ; Save destination
2916:21723+6 134E 03 INC BC ; Next source
2917:21729+6 134F 13 INC DE ; Next destination
2918:21735+10 1350 C34A13 JP TSALP ; Loop until string moved
2919:
2920:21745+17 1353 CDFA0C GETSTR: CALL TSTSTR ; Make sure it's a string
2921:21762+16 1356 2ABE1E GSTRCU: LD HL,(FPREG) ; Get current string
2922:21778+4 1359 EB GSTRHL: EX DE,HL ; Save DE
2923:21782+17 135A CD7713 GSTRDE: CALL BAKTMP ; Was it last tmp-str?
2924:21799+4 135D EB EX DE,HL ; Restore DE
2925:21803+5+6 135E C0 RET NZ ; No - Return
2926:21808+11 135F D5 PUSH DE ; Save string
2927:21819+4 1360 50 LD D,B ; String block address to DE
2928:21823+4 1361 59 LD E,C
2929:21827+6 1362 1B DEC DE ; Point to length
2930:21833+7 1363 4E LD C,(HL) ; Get string length
2931:21840+16 1364 2A9D1E LD HL,(STRBOT) ; Current bottom of string area
2932:21856+4 1367 7C LD A,H ; Last one in string area?
2933:21860+4 1368 92 SUB D ; Compare with D
2934:21864+7+5 1369 2002 JR NZ,$+4 ; Different - Exit
2935:21871+4 136B 7D LD A,L ; Get L
2936:21875+4 136C 93 SUB E ; Compare with E
2937:21879+10 136D C27513 JP NZ,POPHL ; No - Return
2938:21889+4 1370 47 LD B,A ; Clear B (A=0)
2939:21893+11 1371 09 ADD HL,BC ; Remove string from str' area
2940:21904+16 1372 229D1E LD (STRBOT),HL ; Save new bottom of str' area
2941: - 1375 POPHRT: ; Restore address of number
2942:21920+10 1375 E1 POPHL: POP HL ; Restore string
2943:21930+10 1376 C9 RET
2944:
2945:21940+16 1377 2A8B1E BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top
2946:21956+6 137A 2B DEC HL ; Back
2947:21962+7 137B 46 LD B,(HL) ; Get MSB of address
2948:21969+6 137C 2B DEC HL ; Back
2949:21975+7 137D 4E LD C,(HL) ; Get LSB of address
2950:21982+6 137E 2B DEC HL ; Back
2951:21988+6 137F 2B DEC HL ; Back
2952:21994+4 1380 7C LD A,H ; String last in string pool?
2953:21998+4 1381 92 SUB D ; Compare with D
2954:22002+7+5 1382 2002 JR NZ,$+4 ; Different - Exit
2955:22009+4 1384 7D LD A,L ; Get L
2956:22013+4 1385 93 SUB E ; Compare with E
2957:22017+5+6 1386 C0 RET NZ ; Yes - Leave it
2958:22022+16 1387 228B1E LD (TMSTPT),HL ; Save new string pool top
2959:22038+10 138A C9 RET
2960:
2961:22048+10 138B 01E110 LEN: LD BC,PASSA ; To return integer A
2962:22058+11 138E C5 PUSH BC ; Save address
2963:22069+17 138F CD5313 GETLEN: CALL GETSTR ; Get string and its length
2964:22086+4 1392 AF XOR A
2965:22090+4 1393 57 LD D,A ; Clear D
2966:22094+13 1394 32871E LD (TYPE),A ; Set type to numeric
2967:22107+7 1397 7E LD A,(HL) ; Get length of string
2968:22114+4 1398 B7 OR A ; Set status flags
2969:22118+10 1399 C9 RET
2970:
2971:22128+10 139A 01E110 ASC: LD BC,PASSA ; To return integer A
2972:22138+11 139D C5 PUSH BC ; Save address
2973:22149+17 139E CD8F13 GTFLNM: CALL GETLEN ; Get length of string
2974:22166+10 13A1 CA1609 JP Z,FCERR ; Null string - Error
2975:22176+6 13A4 23 INC HL
2976:22182+6 13A5 23 INC HL
2977:22188+7 13A6 5E LD E,(HL) ; Get LSB of address
2978:22195+6 13A7 23 INC HL
2979:22201+7 13A8 56 LD D,(HL) ; Get MSB of address
2980:22208+7 13A9 1A LD A,(DE) ; Get first byte of string
2981:22215+10 13AA C9 RET
2982:
2983:22225+7 13AB 3E01 CHR: LD A,1 ; One character string
2984:22232+17 13AD CDA711 CALL MKTMST ; Make a temporary string
2985:22249+17 13B0 CDA414 CALL MAKINT ; Make it integer A
2986:22266+16 13B3 2A9B1E LD HL,(TMPSTR+2) ; Get address of string
2987:22282+7 13B6 73 LD (HL),E ; Save character
2988:22289+10 13B7 C1 TOPOOL: POP BC ; Clean up stack
2989:22299+10 13B8 C3D811 JP TSTOPL ; Temporary string to pool
2990:
2991:22309+17 13BB CD5414 LEFT: CALL LFRGNM ; Get number and ending ")"
2992:22326+4 13BE AF XOR A ; Start at first byte in string
2993:22330+19 13BF E3 RIGHT1: EX (SP),HL ; Save code string,Get string
2994:22349+4 13C0 4F LD C,A ; Starting position in string
2995:22353+11 13C1 E5 MID1: PUSH HL ; Save string block address
2996:22364+7 13C2 7E LD A,(HL) ; Get length of string
2997:22371+4 13C3 B8 CP B ; Compare with number given
2998:22375+10 13C4 DAC913 JP C,ALLFOL ; All following bytes required
2999:22385+4 13C7 78 LD A,B ; Get new length
3000: - 13C8 11 .BYTE 11H ; Skip "LD C,0"
3001:22389+7 13C9 0E00 ALLFOL: LD C,0 ; First byte of string
3002:22396+11 13CB C5 PUSH BC ; Save position in string
3003:22407+17 13CC CD1B12 CALL TESTR ; See if enough string space
3004:22424+10 13CF C1 POP BC ; Get position in string
3005:22434+10 13D0 E1 POP HL ; Restore string block address
3006:22444+11 13D1 E5 PUSH HL ; And re-save it
3007:22455+6 13D2 23 INC HL
3008:22461+6 13D3 23 INC HL
3009:22467+7 13D4 46 LD B,(HL) ; Get LSB of address
3010:22474+6 13D5 23 INC HL
3011:22480+7 13D6 66 LD H,(HL) ; Get MSB of address
3012:22487+4 13D7 68 LD L,B ; HL = address of string
3013:22491+7 13D8 0600 LD B,0 ; BC = starting address
3014:22498+11 13DA 09 ADD HL,BC ; Point to that byte
3015:22509+4 13DB 44 LD B,H ; BC = source string
3016:22513+4 13DC 4D LD C,L
3017:22517+17 13DD CDAA11 CALL CRTMST ; Create a string entry
3018:22534+4 13E0 6F LD L,A ; Length of new string
3019:22538+17 13E1 CD4913 CALL TOSTRA ; Move string to string area
3020:22555+10 13E4 D1 POP DE ; Clear stack
3021:22565+17 13E5 CD5A13 CALL GSTRDE ; Move to string pool if needed
3022:22582+10 13E8 C3D811 JP TSTOPL ; Temporary string to pool
3023:
3024:22592+17 13EB CD5414 RIGHT: CALL LFRGNM ; Get number and ending ")"
3025:22609+10 13EE D1 POP DE ; Get string length
3026:22619+11 13EF D5 PUSH DE ; And re-save
3027:22630+7 13F0 1A LD A,(DE) ; Get length
3028:22637+4 13F1 90 SUB B ; Move back N bytes
3029:22641+10 13F2 C3BF13 JP RIGHT1 ; Go and get sub-string
3030:
3031:22651+4 13F5 EB MID: EX DE,HL ; Get code string address
3032:22655+7 13F6 7E LD A,(HL) ; Get next byte ',' or ")"
3033:22662+17 13F7 CD5914 CALL MIDNUM ; Get number supplied
3034:22679+4 13FA 04 INC B ; Is it character zero?
3035:22683+4 13FB 05 DEC B
3036:22687+10 13FC CA1609 JP Z,FCERR ; Yes - Error
3037:22697+11 13FF C5 PUSH BC ; Save starting position
3038:22708+7 1400 1EFF LD E,255 ; All of string
3039:22715+7 1402 FE29 CP ')' ; Any length given?
3040:22722+10 1404 CA0E14 JP Z,RSTSTR ; No - Rest of string
3041:22732+17 1407 CDBC06 CALL CHKSYN ; Make sure ',' follows
3042: - 140A 2C .BYTE ','
3043:22749+17 140B CDA114 CALL GETINT ; Get integer 0-255
3044:22766+17 140E CDBC06 RSTSTR: CALL CHKSYN ; Make sure ")" follows
3045: - 1411 29 .BYTE ")"
3046:22783+10 1412 F1 POP AF ; Restore starting position
3047:22793+19 1413 E3 EX (SP),HL ; Get string,8ave code string
3048:22812+10 1414 01C113 LD BC,MID1 ; Continuation of MID$ routine
3049:22822+11 1417 C5 PUSH BC ; Save for return
3050:22833+4 1418 3D DEC A ; Starting position-1
3051:22837+7 1419 BE CP (HL) ; Compare with length
3052:22844+7 141A 0600 LD B,0 ; Zero bytes length
3053:22851+5+6 141C D0 RET NC ; Null string if start past end
3054:22856+4 141D 4F LD C,A ; Save starting position-1
3055:22860+7 141E 7E LD A,(HL) ; Get length of string
3056:22867+4 141F 91 SUB C ; Subtract start
3057:22871+4 1420 BB CP E ; Enough string for it?
3058:22875+4 1421 47 LD B,A ; Save maximum length available
3059:22879+5+6 1422 D8 RET C ; Truncate string if needed
3060:22884+4 1423 43 LD B,E ; Set specified length
3061:22888+10 1424 C9 RET ; Go and create string
3062:
3063:22898+17 1425 CD8F13 VAL: CALL GETLEN ; Get length of string
3064:22915+10 1428 CA4A15 JP Z,RESZER ; Result zero
3065:22925+4 142B 5F LD E,A ; Save length
3066:22929+6 142C 23 INC HL
3067:22935+6 142D 23 INC HL
3068:22941+7 142E 7E LD A,(HL) ; Get LSB of address
3069:22948+6 142F 23 INC HL
3070:22954+7 1430 66 LD H,(HL) ; Get MSB of address
3071:22961+4 1431 6F LD L,A ; HL = String address
3072:22965+11 1432 E5 PUSH HL ; Save string address
3073:22976+11 1433 19 ADD HL,DE
3074:22987+7 1434 46 LD B,(HL) ; Get end of string+1 byte
3075:22994+7 1435 72 LD (HL),D ; Zero it to terminate
3076:23001+19 1436 E3 EX (SP),HL ; Save string end,get start
3077:23020+11 1437 C5 PUSH BC ; Save end+1 byte
3078:23031+7 1438 7E LD A,(HL) ; Get starting byte
3079:23038+7 1439 FE24 CP '$' ; Hex number indicated? [Searle function added]
3080:23045+10 143B C24314 JP NZ,VAL1
3081:23055+17 143E CD431D CALL HEXTFP ; Convert Hex to FPREG
3082:23072+12 1441 180D JR VAL3
3083:23084+7 1443 FE25 VAL1: CP '%' ; Binary number indicated? [Searle function added]
3084:23091+10 1445 C24D14 JP NZ,VAL2
3085:23101+17 1448 CDB31D CALL BINTFP ; Convert Bin to FPREG
3086:23118+12 144B 1803 JR VAL3
3087:23130+17 144D CD3718 VAL2: CALL ASCTFP ; Convert ASCII string to FP
3088:23147+10 1450 C1 VAL3: POP BC ; Restore end+1 byte
3089:23157+10 1451 E1 POP HL ; Restore end+1 address
3090:23167+7 1452 70 LD (HL),B ; Put back original byte
3091:23174+10 1453 C9 RET
3092:
3093:23184+4 1454 EB LFRGNM: EX DE,HL ; Code string address to HL
3094:23188+17 1455 CDBC06 CALL CHKSYN ; Make sure ")" follows
3095: - 1458 29 .BYTE ")"
3096:23205+10 1459 C1 MIDNUM: POP BC ; Get return address
3097:23215+10 145A D1 POP DE ; Get number supplied
3098:23225+11 145B C5 PUSH BC ; Re-save return address
3099:23236+4 145C 43 LD B,E ; Number to B
3100:23240+10 145D C9 RET
3101:
3102:23250+17 145E CDA414 INP: CALL MAKINT ; Make it integer A
3103:23267+13 1461 32221E LD (INPORT),A ; Set input port
3104:23280+17 1464 CD211E CALL INPSUB ; Get input from port
3105:23297+10 1467 C3E110 JP PASSA ; Return integer A
3106:
3107:23307+17 146A CD8E14 POUT: CALL SETIO ; Set up port number
3108:23324+10 146D C3E91D JP OUTSUB ; Output data and return
3109:
3110:23334+17 1470 CD8E14 WAIT: CALL SETIO ; Set up port number
3111:23351+11 1473 F5 PUSH AF ; Save AND mask
3112:23362+7 1474 1E00 LD E,0 ; Assume zero if none given
3113:23369+6 1476 2B DEC HL ; DEC 'cos GETCHR INCs
3114:23375+17 1477 CD4F08 CALL GETCHR ; Get next character
3115:23392+10 147A CA8414 JP Z,NOXOR ; No XOR byte given
3116:23402+17 147D CDBC06 CALL CHKSYN ; Make sure ',' follows
3117: - 1480 2C .BYTE ','
3118:23419+17 1481 CDA114 CALL GETINT ; Get integer 0-255 to XOR with
3119:23436+10 1484 C1 NOXOR: POP BC ; Restore AND mask
3120:23446+17 1485 CD211E WAITLP: CALL INPSUB ; Get input
3121:23463+4 1488 AB XOR E ; Flip selected bits
3122:23467+4 1489 A0 AND B ; Result non-zero?
3123:23471+10 148A CA8514 JP Z,WAITLP ; No = keep waiting
3124:23481+10 148D C9 RET
3125:
3126:23491+17 148E CDA114 SETIO: CALL GETINT ; Get integer 0-255
3127:23508+13 1491 32221E LD (INPORT),A ; Set input port
3128:23521+13 1494 32EA1D LD (OTPORT),A ; Set output port
3129:23534+17 1497 CDBC06 CALL CHKSYN ; Make sure ',' follows
3130: - 149A 2C .BYTE ','
3131:23551+10 149B C3A114 JP GETINT ; Get integer 0-255 and return
3132:
3133:23561+17 149E CD4F08 FNDNUM: CALL GETCHR ; Get next character
3134:23578+17 14A1 CDF60C GETINT: CALL GETNUM ; Get a number from 0 to 255
3135:23595+17 14A4 CDFB08 MAKINT: CALL DEPINT ; Make sure value 0 - 255
3136:23612+4 14A7 7A LD A,D ; Get MSB of number
3137:23616+4 14A8 B7 OR A ; Zero?
3138:23620+10 14A9 C21609 JP NZ,FCERR ; No - Error
3139:23630+6 14AC 2B DEC HL ; DEC 'cos GETCHR INCs
3140:23636+17 14AD CD4F08 CALL GETCHR ; Get next character
3141:23653+4 14B0 7B LD A,E ; Get number to A
3142:23657+10 14B1 C9 RET
3143:
3144:23667+17 14B2 CD0109 PEEK: CALL DEINT ; Get memory address
3145:23684+7 14B5 1A LD A,(DE) ; Get byte in memory
3146:23691+10 14B6 C3E110 JP PASSA ; Return integer A
3147:
3148:23701+17 14B9 CDF60C POKE: CALL GETNUM ; Get memory address
3149:23718+17 14BC CD0109 CALL DEINT ; Get integer -32768 to 3276
3150:23735+11 14BF D5 PUSH DE ; Save memory address
3151:23746+17 14C0 CDBC06 CALL CHKSYN ; Make sure ',' follows
3152: - 14C3 2C .BYTE ','
3153:23763+17 14C4 CDA114 CALL GETINT ; Get integer 0-255
3154:23780+10 14C7 D1 POP DE ; Restore memory address
3155:23790+7 14C8 12 LD (DE),A ; Load it into memory
3156:23797+10 14C9 C9 RET
3157:
3158:23807+10 14CA 21C119 ROUND: LD HL,HALF ; Add 0.5 to FPREG
3159:23817+17 14CD CD8917 ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE
3160:23834+10 14D0 C3DC14 JP FPADD ; Add BCDE to FPREG
3161:
3162:23844+17 14D3 CD8917 SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL
3163: - 14D6 21 .BYTE 21H ; Skip "POP BC" and "POP DE"
3164:23861+10 14D7 C1 PSUB: POP BC ; Get FP number from stack
3165:23871+10 14D8 D1 POP DE
3166:23881+17 14D9 CD6817 SUBCDE: CALL INVSGN ; Negate FPREG
3167:23898+4 14DC 78 FPADD: LD A,B ; Get FP exponent
3168:23902+4 14DD B7 OR A ; Is number zero?
3169:23906+5+6 14DE C8 RET Z ; Yes - Nothing to add
3170:23911+13 14DF 3AC11E LD A,(FPEXP) ; Get exponent of FPREG
3171:23924+4 14E2 B7 OR A ; Is this number zero?
3172:23928+10 14E3 CA7915 JP Z,FPBCDE ; Yes - Move BCDE to FPREG
3173:23938+4 14E6 90 SUB B ; BCDE number larger?
3174:23942+10 14E7 D2FE14 JP NC,NOSWAP ; No - Don't swap them
3175:23952+4 14EA 2F CPL ; Two's complement
3176:23956+4 14EB 3C INC A ; FP exponent
3177:23960+16 14EC 2ABE1E LD HL,(FPREG) ; LSB,NLSB of FPREG
3178:23976+11 14EF E5 PUSH HL ; Stack them
3179:23987+16 14F0 2AC01E LD HL,(FPREG+2) ; MSB and exponent of FPREG
3180:24003+11 14F3 E5 PUSH HL ; Stack them
3181:24014+20 14F4 ED53BE1E LD (FPREG),DE ; Move BCDE to FPREG
3182:24034+20 14F8 ED43C01E LD (FPREG+2),BC
3183:24054+10 14FC C1 POP BC ; Restore number from stack
3184:24064+10 14FD D1 POP DE
3185:24074+7 14FE FE19 NOSWAP: CP 24+1 ; Second number insignificant?
3186:24081+5+6 1500 D0 RET NC ; Yes - First number is result
3187:24086+11 1501 F5 PUSH AF ; Save number of bits to scale
3188:24097+17 1502 CD9217 CALL SIGNS ; Set MSBs & sign of result
3189:24114+4 1505 67 LD H,A ; Save sign of result
3190:24118+10 1506 F1 POP AF ; Restore scaling factor
3191:24128+17 1507 CDAF15 CALL SCALE ; Scale BCDE to same exponent
3192:24145+4 150A B4 OR H ; Result to be positive?
3193:24149+10 150B 21BE1E LD HL,FPREG ; Point to FPREG
3194:24159+10 150E F22415 JP P,MINCDE ; No - Subtract FPREG from CDE
3195:24169+17 1511 CD8F15 CALL PLUCDE ; Add FPREG to CDE
3196:24186+10 1514 D26A15 JP NC,RONDUP ; No overflow - Round it up
3197:24196+6 1517 23 INC HL ; Point to exponent
3198:24202+11 1518 34 INC (HL) ; Increment it
3199:24213+10 1519 CAFA03 JP Z,OVERR ; Number overflowed - Error
3200:24223+7 151C 2E01 LD L,1 ; 1 bit to shift right
3201:24230+17 151E CDC515 CALL SHRT1 ; Shift result right
3202:24247+10 1521 C36A15 JP RONDUP ; Round it up
3203:
3204:24257+4 1524 AF MINCDE: XOR A ; Clear A and carry
3205:24261+4 1525 90 SUB B ; Negate exponent
3206:24265+4 1526 47 LD B,A ; Re-save exponent
3207:24269+7 1527 7E LD A,(HL) ; Get LSB of FPREG
3208:24276+4 1528 9B SBC A, E ; Subtract LSB of BCDE
3209:24280+4 1529 5F LD E,A ; Save LSB of BCDE
3210:24284+6 152A 23 INC HL
3211:24290+7 152B 7E LD A,(HL) ; Get NMSB of FPREG
3212:24297+4 152C 9A SBC A,D ; Subtract NMSB of BCDE
3213:24301+4 152D 57 LD D,A ; Save NMSB of BCDE
3214:24305+6 152E 23 INC HL
3215:24311+7 152F 7E LD A,(HL) ; Get MSB of FPREG
3216:24318+4 1530 99 SBC A,C ; Subtract MSB of BCDE
3217:24322+4 1531 4F LD C,A ; Save MSB of BCDE
3218:24326+10+7 1532 DC9B15 CONPOS: CALL C,COMPL ; Overflow - Make it positive
3219:
3220:24336+4 1535 68 BNORM: LD L,B ; L = Exponent
3221:24340+4 1536 63 LD H,E ; H = LSB
3222:24344+4 1537 AF XOR A
3223:24348+4 1538 47 BNRMLP: LD B,A ; Save bit count
3224:24352+4 1539 79 LD A,C ; Get MSB
3225:24356+4 153A B7 OR A ; Is it zero?
3226:24360+10 153B C25715 JP NZ,PNORM ; No - Do it bit at a time
3227:24370+4 153E 4A LD C,D ; MSB = NMSB
3228:24374+4 153F 54 LD D,H ; NMSB= LSB
3229:24378+4 1540 65 LD H,L ; LSB = VLSB
3230:24382+4 1541 6F LD L,A ; VLSB= 0
3231:24386+4 1542 78 LD A,B ; Get exponent
3232:24390+7 1543 D608 SUB 8 ; Count 8 bits
3233:24397+7 1545 FEE0 CP -24-8 ; Was number zero?
3234:24404+10 1547 C23815 JP NZ,BNRMLP ; No - Keep normalising
3235:24414+4 154A AF RESZER: XOR A ; Result is zero
3236:24418+13 154B 32C11E SAVEXP: LD (FPEXP),A ; Save result as zero
3237:24431+10 154E C9 RET
3238:
3239:24441+4 154F 05 NORMAL: DEC B ; Count bits
3240:24445+11 1550 29 ADD HL,HL ; Shift HL left
3241:24456+4 1551 7A LD A,D ; Get NMSB
3242:24460+4 1552 17 RLA ; Shift left with last bit
3243:24464+4 1553 57 LD D,A ; Save NMSB
3244:24468+4 1554 79 LD A,C ; Get MSB
3245:24472+4 1555 8F ADC A,A ; Shift left with last bit
3246:24476+4 1556 4F LD C,A ; Save MSB
3247:24480+10 1557 F24F15 PNORM: JP P,NORMAL ; Not done - Keep going
3248:24490+4 155A 78 LD A,B ; Number of bits shifted
3249:24494+4 155B 5C LD E,H ; Save HL in EB
3250:24498+4 155C 45 LD B,L
3251:24502+4 155D B7 OR A ; Any shifting done?
3252:24506+10 155E CA6A15 JP Z,RONDUP ; No - Round it up
3253:24516+10 1561 21C11E LD HL,FPEXP ; Point to exponent
3254:24526+7 1564 86 ADD A,(HL) ; Add shifted bits
3255:24533+7 1565 77 LD (HL),A ; Re-save exponent
3256:24540+10 1566 D24A15 JP NC,RESZER ; Underflow - Result is zero
3257:24550+5+6 1569 C8 RET Z ; Result is zero
3258:24555+4 156A 78 RONDUP: LD A,B ; Get VLSB of number
3259:24559+10 156B 21C11E RONDB: LD HL,FPEXP ; Point to exponent
3260:24569+4 156E B7 OR A ; Any rounding?
3261:24573+10+7 156F FC8215 CALL M,FPROND ; Yes - Round number up
3262:24583+7 1572 46 LD B,(HL) ; B = Exponent
3263:24590+6 1573 23 INC HL
3264:24596+7 1574 7E LD A,(HL) ; Get sign of result
3265:24603+7 1575 E680 AND 10000000B ; Only bit 7 needed
3266:24610+4 1577 A9 XOR C ; Set correct sign
3267:24614+4 1578 4F LD C,A ; Save correct sign in number
3268:24618+20 1579 ED53BE1E FPBCDE: LD (FPREG),DE ; Move BCDE to FPREG
3269:24638+20 157D ED43C01E LD (FPREG+2),BC
3270:24658+10 1581 C9 RET
3271:
3272:24668+4 1582 1C FPROND: INC E ; Round LSB
3273:24672+5+6 1583 C0 RET NZ ; Return if ok
3274:24677+4 1584 14 INC D ; Round NMSB
3275:24681+5+6 1585 C0 RET NZ ; Return if ok
3276:24686+4 1586 0C INC C ; Round MSB
3277:24690+5+6 1587 C0 RET NZ ; Return if ok
3278:24695+7 1588 0E80 LD C,80H ; Set normal value
3279:24702+11 158A 34 INC (HL) ; Increment exponent
3280:24713+5+6 158B C0 RET NZ ; Return if ok
3281:24718+10 158C C3FA03 JP OVERR ; Overflow error
3282:
3283:24728+7 158F 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG
3284:24735+4 1590 83 ADD A,E ; Add LSB of BCDE
3285:24739+4 1591 5F LD E,A ; Save LSB of BCDE
3286:24743+6 1592 23 INC HL
3287:24749+7 1593 7E LD A,(HL) ; Get NMSB of FPREG
3288:24756+4 1594 8A ADC A,D ; Add NMSB of BCDE
3289:24760+4 1595 57 LD D,A ; Save NMSB of BCDE
3290:24764+6 1596 23 INC HL
3291:24770+7 1597 7E LD A,(HL) ; Get MSB of FPREG
3292:24777+4 1598 89 ADC A,C ; Add MSB of BCDE
3293:24781+4 1599 4F LD C,A ; Save MSB of BCDE
3294:24785+10 159A C9 RET
3295:
3296:24795+10 159B 21C21E COMPL: LD HL,SGNRES ; Sign of result
3297:24805+7 159E 7E LD A,(HL) ; Get sign of result
3298:24812+4 159F 2F CPL ; Negate it
3299:24816+7 15A0 77 LD (HL),A ; Put it back
3300:24823+4 15A1 AF XOR A
3301:24827+4 15A2 6F LD L,A ; Set L to zero
3302:24831+4 15A3 90 SUB B ; Negate exponent,set carry
3303:24835+4 15A4 47 LD B,A ; Re-save exponent
3304:24839+4 15A5 7D LD A,L ; Load zero
3305:24843+4 15A6 9B SBC A,E ; Negate LSB
3306:24847+4 15A7 5F LD E,A ; Re-save LSB
3307:24851+4 15A8 7D LD A,L ; Load zero
3308:24855+4 15A9 9A SBC A,D ; Negate NMSB
3309:24859+4 15AA 57 LD D,A ; Re-save NMSB
3310:24863+4 15AB 7D LD A,L ; Load zero
3311:24867+4 15AC 99 SBC A,C ; Negate MSB
3312:24871+4 15AD 4F LD C,A ; Re-save MSB
3313:24875+10 15AE C9 RET
3314:
3315:24885+7 15AF 0600 SCALE: LD B,0 ; Clear underflow
3316:24892+7 15B1 D608 SCALLP: SUB 8 ; 8 bits (a whole byte)?
3317:24899+10 15B3 DABE15 JP C,SHRITE ; No - Shift right A bits
3318:24909+4 15B6 43 LD B,E ; <- Shift
3319:24913+4 15B7 5A LD E,D ; <- right
3320:24917+4 15B8 51 LD D,C ; <- eight
3321:24921+7 15B9 0E00 LD C,0 ; <- bits
3322:24928+10 15BB C3B115 JP SCALLP ; More bits to shift
3323:
3324:24938+7 15BE C609 SHRITE: ADD A,8+1 ; Adjust count
3325:24945+4 15C0 6F LD L,A ; Save bits to shift
3326:24949+4 15C1 AF SHRLP: XOR A ; Flag for all done
3327:24953+4 15C2 2D DEC L ; All shifting done?
3328:24957+5+6 15C3 C8 RET Z ; Yes - Return
3329:24962+4 15C4 79 LD A,C ; Get MSB
3330:24966+4 15C5 1F SHRT1: RRA ; Shift it right
3331:24970+4 15C6 4F LD C,A ; Re-save
3332:24974+4 15C7 7A LD A,D ; Get NMSB
3333:24978+4 15C8 1F RRA ; Shift right with last bit
3334:24982+4 15C9 57 LD D,A ; Re-save it
3335:24986+4 15CA 7B LD A,E ; Get LSB
3336:24990+4 15CB 1F RRA ; Shift right with last bit
3337:24994+4 15CC 5F LD E,A ; Re-save it
3338:24998+4 15CD 78 LD A,B ; Get underflow
3339:25002+4 15CE 1F RRA ; Shift right with last bit
3340:25006+4 15CF 47 LD B,A ; Re-save underflow
3341:25010+10 15D0 C3C115 JP SHRLP ; More bits to do
3342:
3343: - 15D3 00000081 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000
3344:
3345: - 15D7 03 LOGTAB: .BYTE 3 ; Table used by LOG
3346: - 15D8 AA561980 .BYTE 0AAH,056H,019H,080H ; 0.59898
3347: - 15DC F1227680 .BYTE 0F1H,022H,076H,080H ; 0.96147
3348: - 15E0 45AA3882 .BYTE 045H,0AAH,038H,082H ; 2.88539
3349:
3350:25020+17 15E4 CD3F17 LOG: CALL TSTSGN ; Test sign of value
3351:25037+4 15E7 B7 OR A
3352:25041+10 15E8 EA1609 JP PE,FCERR ; ?FC Error if <= zero
3353:25051+10 15EB 21C11E LD HL,FPEXP ; Point to exponent
3354:25061+7 15EE 7E LD A,(HL) ; Get exponent
3355:25068+10 15EF 013580 LD BC,8035H ; BCDE = SQR(1/2)
3356:25078+10 15F2 11F304 LD DE,04F3H
3357:25088+4 15F5 90 SUB B ; Scale value to be < 1
3358:25092+11 15F6 F5 PUSH AF ; Save scale factor
3359:25103+7 15F7 70 LD (HL),B ; Save new exponent
3360:25110+11 15F8 D5 PUSH DE ; Save SQR(1/2)
3361:25121+11 15F9 C5 PUSH BC
3362:25132+17 15FA CDDC14 CALL FPADD ; Add SQR(1/2) to value
3363:25149+10 15FD C1 POP BC ; Restore SQR(1/2)
3364:25159+10 15FE D1 POP DE
3365:25169+4 15FF 04 INC B ; Make it SQR(2)
3366:25173+17 1600 CD9016 CALL DVBCDE ; Divide by SQR(2)
3367:25190+10 1603 21D315 LD HL,UNITY ; Point to 1.
3368:25200+17 1606 CDD314 CALL SUBPHL ; Subtract FPREG from 1
3369:25217+10 1609 21D715 LD HL,LOGTAB ; Coefficient table
3370:25227+17 160C CD981A CALL SUMSER ; Evaluate sum of series
3371:25244+10 160F 018080 LD BC,8080H ; BCDE = -0.5
3372:25254+10 1612 110000 LD DE,0000H
3373:25264+17 1615 CDDC14 CALL FPADD ; Subtract 0.5 from FPREG
3374:25281+10 1618 F1 POP AF ; Restore scale factor
3375:25291+17 1619 CDAB18 CALL RSCALE ; Re-scale number
3376:25308+10 161C 013180 MULLN2: LD BC,8031H ; BCDE = Ln(2)
3377:25318+10 161F 111872 LD DE,7218H
3378: - 1622 21 .BYTE 21H ; Skip "POP BC" and "POP DE"
3379:
3380:25328+10 1623 C1 MULT: POP BC ; Get number from stack
3381:25338+10 1624 D1 POP DE
3382:25348+17 1625 CD3F17 FPMULT: CALL TSTSGN ; Test sign of FPREG
3383:25365+5+6 1628 C8 RET Z ; Return zero if zero
3384:25370+7 1629 2E00 LD L,0 ; Flag add exponents
3385:25377+17 162B CDF816 CALL ADDEXP ; Add exponents
3386:25394+4 162E 79 LD A,C ; Get MSB of multiplier
3387:25398+13 162F 32D01E LD (MULVAL),A ; Save MSB of multiplier
3388:25411+4 1632 EB EX DE,HL
3389:25415+16 1633 22D11E LD (MULVAL+1),HL ; Save rest of multiplier
3390:25431+10 1636 010000 LD BC,0 ; Partial product (BCDE) = zero
3391:25441+4 1639 50 LD D,B
3392:25445+4 163A 58 LD E,B
3393:25449+10 163B 213515 LD HL,BNORM ; Address of normalise
3394:25459+11 163E E5 PUSH HL ; Save for return
3395:25470+10 163F 214716 LD HL,MULT8 ; Address of 8 bit multiply
3396:25480+11 1642 E5 PUSH HL ; Save for NMSB,MSB
3397:25491+11 1643 E5 PUSH HL ;
3398:25502+10 1644 21BE1E LD HL,FPREG ; Point to number
3399:25512+7 1647 7E MULT8: LD A,(HL) ; Get LSB of number
3400:25519+6 1648 23 INC HL ; Point to NMSB
3401:25525+4 1649 B7 OR A ; Test LSB
3402:25529+10 164A CA7316 JP Z,BYTSFT ; Zero - shift to next byte
3403:25539+11 164D E5 PUSH HL ; Save address of number
3404:25550+7 164E 2E08 LD L,8 ; 8 bits to multiply by
3405:25557+4 1650 1F MUL8LP: RRA ; Shift LSB right
3406:25561+4 1651 67 LD H,A ; Save LSB
3407:25565+4 1652 79 LD A,C ; Get MSB
3408:25569+10 1653 D26116 JP NC,NOMADD ; Bit was zero - Don't add
3409:25579+11 1656 E5 PUSH HL ; Save LSB and count
3410:25590+16 1657 2AD11E LD HL,(MULVAL+1) ; Get LSB and NMSB
3411:25606+11 165A 19 ADD HL,DE ; Add NMSB and LSB
3412:25617+4 165B EB EX DE,HL ; Leave sum in DE
3413:25621+10 165C E1 POP HL ; Restore MSB and count
3414:25631+13 165D 3AD01E LD A,(MULVAL) ; Get MSB of multiplier
3415:25644+4 1660 89 ADC A,C ; Add MSB
3416:25648+4 1661 1F NOMADD: RRA ; Shift MSB right
3417:25652+4 1662 4F LD C,A ; Re-save MSB
3418:25656+4 1663 7A LD A,D ; Get NMSB
3419:25660+4 1664 1F RRA ; Shift NMSB right
3420:25664+4 1665 57 LD D,A ; Re-save NMSB
3421:25668+4 1666 7B LD A,E ; Get LSB
3422:25672+4 1667 1F RRA ; Shift LSB right
3423:25676+4 1668 5F LD E,A ; Re-save LSB
3424:25680+4 1669 78 LD A,B ; Get VLSB
3425:25684+4 166A 1F RRA ; Shift VLSB right
3426:25688+4 166B 47 LD B,A ; Re-save VLSB
3427:25692+4 166C 2D DEC L ; Count bits multiplied
3428:25696+4 166D 7C LD A,H ; Get LSB of multiplier
3429:25700+10 166E C25016 JP NZ,MUL8LP ; More - Do it
3430:25710+10 1671 E1 POP HL ; Restore address of number
3431:25720+10 1672 C9 RET
3432:
3433:25730+4 1673 43 BYTSFT: LD B,E ; Shift partial product left
3434:25734+4 1674 5A LD E,D
3435:25738+4 1675 51 LD D,C
3436:25742+4 1676 4F LD C,A
3437:25746+10 1677 C9 RET
3438:
3439:25756+16 1678 2ABE1E DIV10: LD HL,(FPREG) ; LSB,NLSB of FPREG
3440:25772+11 167B E5 PUSH HL ; Stack them
3441:25783+16 167C 2AC01E LD HL,(FPREG+2) ; MSB and exponent of FPREG
3442:25799+11 167F E5 PUSH HL ; Stack them
3443:25810+10 1680 012084 LD BC,8420H ; BCDE = 10.
3444:25820+10 1683 110000 LD DE,0000H
3445:25830+20 1686 ED53BE1E LD (FPREG),DE ; Move 10 to FPREG
3446:25850+20 168A ED43C01E LD (FPREG+2),BC
3447:
3448:25870+10 168E C1 DIV: POP BC ; Get number from stack
3449:25880+10 168F D1 POP DE
3450:25890+17 1690 CD3F17 DVBCDE: CALL TSTSGN ; Test sign of FPREG
3451:25907+10 1693 CAEE03 JP Z,DZERR ; Error if division by zero
3452:25917+7 1696 2EFF LD L,-1 ; Flag subtract exponents
3453:25924+17 1698 CDF816 CALL ADDEXP ; Subtract exponents
3454:25941+11 169B 34 INC (HL) ; Add 2 to exponent to adjust
3455:25952+11 169C 34 INC (HL)
3456:25963+6 169D 2B DEC HL ; Point to MSB
3457:25969+7 169E 7E LD A,(HL) ; Get MSB of dividend
3458:25976+13 169F 32F51D LD (DIV3),A ; Save for subtraction
3459:25989+6 16A2 2B DEC HL
3460:25995+7 16A3 7E LD A,(HL) ; Get NMSB of dividend
3461:26002+13 16A4 32F11D LD (DIV2),A ; Save for subtraction
3462:26015+6 16A7 2B DEC HL
3463:26021+7 16A8 7E LD A,(HL) ; Get MSB of dividend
3464:26028+13 16A9 32ED1D LD (DIV1),A ; Save for subtraction
3465:26041+4 16AC 41 LD B,C ; Get MSB
3466:26045+4 16AD EB EX DE,HL ; NMSB,LSB to HL
3467:26049+4 16AE AF XOR A
3468:26053+4 16AF 4F LD C,A ; Clear MSB of quotient
3469:26057+4 16B0 57 LD D,A ; Clear NMSB of quotient
3470:26061+4 16B1 5F LD E,A ; Clear LSB of quotient
3471:26065+13 16B2 32F81D LD (DIV4),A ; Clear overflow count
3472:26078+11 16B5 E5 DIVLP: PUSH HL ; Save divisor
3473:26089+11 16B6 C5 PUSH BC
3474:26100+4 16B7 7D LD A,L ; Get LSB of number
3475:26104+17 16B8 CDEC1D CALL DIVSUP ; Subt' divisor from dividend
3476:26121+7 16BB DE00 SBC A,0 ; Count for overflows
3477:26128+4 16BD 3F CCF
3478:26132+10 16BE D2C816 JP NC,RESDIV ; Restore divisor if borrow
3479:26142+13 16C1 32F81D LD (DIV4),A ; Re-save overflow count
3480:26155+10 16C4 F1 POP AF ; Scrap divisor
3481:26165+10 16C5 F1 POP AF
3482:26175+4 16C6 37 SCF ; Set carry to
3483: - 16C7 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL"
3484:
3485:26179+10 16C8 C1 RESDIV: POP BC ; Restore divisor
3486:26189+10 16C9 E1 POP HL
3487:26199+4 16CA 79 LD A,C ; Get MSB of quotient
3488:26203+4 16CB 3C INC A
3489:26207+4 16CC 3D DEC A
3490:26211+4 16CD 1F RRA ; Bit 0 to bit 7
3491:26215+10 16CE FA6B15 JP M,RONDB ; Done - Normalise result
3492:26225+4 16D1 17 RLA ; Restore carry
3493:26229+4 16D2 7B LD A,E ; Get LSB of quotient
3494:26233+4 16D3 17 RLA ; Double it
3495:26237+4 16D4 5F LD E,A ; Put it back
3496:26241+4 16D5 7A LD A,D ; Get NMSB of quotient
3497:26245+4 16D6 17 RLA ; Double it
3498:26249+4 16D7 57 LD D,A ; Put it back
3499:26253+4 16D8 79 LD A,C ; Get MSB of quotient
3500:26257+4 16D9 17 RLA ; Double it
3501:26261+4 16DA 4F LD C,A ; Put it back
3502:26265+11 16DB 29 ADD HL,HL ; Double NMSB,LSB of divisor
3503:26276+4 16DC 78 LD A,B ; Get MSB of divisor
3504:26280+4 16DD 17 RLA ; Double it
3505:26284+4 16DE 47 LD B,A ; Put it back
3506:26288+13 16DF 3AF81D LD A,(DIV4) ; Get VLSB of quotient
3507:26301+4 16E2 17 RLA ; Double it
3508:26305+13 16E3 32F81D LD (DIV4),A ; Put it back
3509:26318+4 16E6 79 LD A,C ; Get MSB of quotient
3510:26322+4 16E7 B2 OR D ; Merge NMSB
3511:26326+4 16E8 B3 OR E ; Merge LSB
3512:26330+10 16E9 C2B516 JP NZ,DIVLP ; Not done - Keep dividing
3513:26340+11 16EC E5 PUSH HL ; Save divisor
3514:26351+10 16ED 21C11E LD HL,FPEXP ; Point to exponent
3515:26361+11 16F0 35 DEC (HL) ; Divide by 2
3516:26372+10 16F1 E1 POP HL ; Restore divisor
3517:26382+10 16F2 C2B516 JP NZ,DIVLP ; Ok - Keep going
3518:26392+10 16F5 C3FA03 JP OVERR ; Overflow error
3519:
3520:26402+4 16F8 78 ADDEXP: LD A,B ; Get exponent of dividend
3521:26406+4 16F9 B7 OR A ; Test it
3522:26410+10 16FA CA1C17 JP Z,OVTST3 ; Zero - Result zero
3523:26420+4 16FD 7D LD A,L ; Get add/subtract flag
3524:26424+10 16FE 21C11E LD HL,FPEXP ; Point to exponent
3525:26434+7 1701 AE XOR (HL) ; Add or subtract it
3526:26441+4 1702 80 ADD A,B ; Add the other exponent
3527:26445+4 1703 47 LD B,A ; Save new exponent
3528:26449+4 1704 1F RRA ; Test exponent for overflow
3529:26453+4 1705 A8 XOR B
3530:26457+4 1706 78 LD A,B ; Get exponent
3531:26461+10 1707 F21B17 JP P,OVTST2 ; Positive - Test for overflow
3532:26471+7 170A C680 ADD A,80H ; Add excess 128
3533:26478+7 170C 77 LD (HL),A ; Save new exponent
3534:26485+10 170D CA7513 JP Z,POPHRT ; Zero - Result zero
3535:26495+17 1710 CD9217 CALL SIGNS ; Set MSBs and sign of result
3536:26512+7 1713 77 LD (HL),A ; Save new exponent
3537:26519+6 1714 2B DEC HL ; Point to MSB
3538:26525+10 1715 C9 RET
3539:
3540:26535+17 1716 CD3F17 OVTST1: CALL TSTSGN ; Test sign of FPREG
3541:26552+4 1719 2F CPL ; Invert sign
3542:26556+10 171A E1 POP HL ; Clean up stack
3543:26566+4 171B B7 OVTST2: OR A ; Test if new exponent zero
3544:26570+10 171C E1 OVTST3: POP HL ; Clear off return address
3545:26580+10 171D F24A15 JP P,RESZER ; Result zero
3546:26590+10 1720 C3FA03 JP OVERR ; Overflow error
3547:
3548:26600+20 1723 ED5BBE1E MLSP10: LD DE,(FPREG) ; Move FPREG to BCDE
3549:26620+20 1727 ED4BC01E LD BC,(FPREG+2)
3550:26640+4 172B 78 LD A,B ; Get exponent
3551:26644+4 172C B7 OR A ; Is it zero?
3552:26648+5+6 172D C8 RET Z ; Yes - Result is zero
3553:26653+7 172E C602 ADD A,2 ; Multiply by 4
3554:26660+10 1730 DAFA03 JP C,OVERR ; Overflow - ?OV Error
3555:26670+4 1733 47 LD B,A ; Re-save exponent
3556:26674+17 1734 CDDC14 CALL FPADD ; Add BCDE to FPREG (Times 5)
3557:26691+10 1737 21C11E LD HL,FPEXP ; Point to exponent
3558:26701+11 173A 34 INC (HL) ; Double number (Times 10)
3559:26712+5+6 173B C0 RET NZ ; Ok - Return
3560:26717+10 173C C3FA03 JP OVERR ; Overflow error
3561:
3562:26727+13 173F 3AC11E TSTSGN: LD A,(FPEXP) ; Get sign of FPREG
3563:26740+4 1742 B7 OR A
3564:26744+5+6 1743 C8 RET Z ; RETurn if number is zero
3565:26749+13 1744 3AC01E LD A,(FPREG+2) ; Get MSB of FPREG
3566: - 1747 FE .BYTE 0FEH ; Test sign
3567:26762+4 1748 2F RETREL: CPL ; Invert sign
3568:26766+4 1749 17 RLA ; Sign bit to carry
3569:26770+4 174A 9F FLGDIF: SBC A,A ; Carry to all bits of A
3570:26774+5+6 174B C0 RET NZ ; Return -1 if negative
3571:26779+4 174C 3C INC A ; Bump to +1
3572:26783+10 174D C9 RET ; Positive - Return +1
3573:
3574:26793+17 174E CD3F17 SGN: CALL TSTSGN ; Test sign of FPREG
3575:26810+7 1751 0688 FLGREL: LD B,80H+8 ; 8 bit integer in exponent
3576:26817+10 1753 110000 LD DE,0 ; Zero NMSB and LSB
3577:26827+10 1756 21C11E RETINT: LD HL,FPEXP ; Point to exponent
3578:26837+4 1759 4F LD C,A ; CDE = MSB,NMSB and LSB
3579:26841+7 175A 70 LD (HL),B ; Save exponent
3580:26848+7 175B 0600 LD B,0 ; CDE = integer to normalise
3581:26855+6 175D 23 INC HL ; Point to sign of result
3582:26861+10 175E 3680 LD (HL),80H ; Set sign of result
3583:26871+4 1760 17 RLA ; Carry = sign of integer
3584:26875+10 1761 C33215 JP CONPOS ; Set sign of result
3585:
3586:26885+17 1764 CD3F17 ABS: CALL TSTSGN ; Test sign of FPREG
3587:26902+5+6 1767 F0 RET P ; Return if positive
3588:26907+10 1768 21C01E INVSGN: LD HL,FPREG+2 ; Point to MSB
3589:26917+7 176B 7E LD A,(HL) ; Get sign of mantissa
3590:26924+7 176C EE80 XOR 80H ; Invert sign of mantissa
3591:26931+7 176E 77 LD (HL),A ; Re-save sign of mantissa
3592:26938+10 176F C9 RET
3593:
3594:26948+4 1770 EB STAKFP: EX DE,HL ; Save code string address
3595:26952+16 1771 2ABE1E LD HL,(FPREG) ; LSB,NLSB of FPREG
3596:26968+19 1774 E3 EX (SP),HL ; Stack them,get return
3597:26987+11 1775 E5 PUSH HL ; Re-save return
3598:26998+16 1776 2AC01E LD HL,(FPREG+2) ; MSB and exponent of FPREG
3599:27014+19 1779 E3 EX (SP),HL ; Stack them,get return
3600:27033+11 177A E5 PUSH HL ; Re-save return
3601:27044+4 177B EB EX DE,HL ; Restore code string address
3602:27048+10 177C C9 RET
3603:
3604:27058+10 177D 11BE1E PHLTFP: LD DE,FPREG ; Number at HL to FPREG
3605:27068+16 1780 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
3606:27084+16 1782 EDA0 LDI
3607:27100+16 1784 EDA0 LDI
3608:27116+16 1786 EDA0 LDI
3609:27132+10 1788 C9 RET
3610:
3611:27142+7 1789 5E LOADFP: LD E,(HL) ; Get LSB of number
3612:27149+6 178A 23 INC HL
3613:27155+7 178B 56 LD D,(HL) ; Get NMSB of number
3614:27162+6 178C 23 INC HL
3615:27168+7 178D 4E LD C,(HL) ; Get MSB of number
3616:27175+6 178E 23 INC HL
3617:27181+7 178F 46 LD B,(HL) ; Get exponent of number
3618:27188+6 1790 23 INCHL: INC HL ; Used for conditional "INC HL"
3619:27194+10 1791 C9 RET
3620:
3621:27204+10 1792 21C01E SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG
3622:27214+7 1795 7E LD A,(HL) ; Get MSB
3623:27221+4 1796 07 RLCA ; Old sign to carry
3624:27225+4 1797 37 SCF ; Set MSBit
3625:27229+4 1798 1F RRA ; Set MSBit of MSB
3626:27233+7 1799 77 LD (HL),A ; Save new MSB
3627:27240+4 179A 3F CCF ; Complement sign
3628:27244+4 179B 1F RRA ; Old sign to carry
3629:27248+6 179C 23 INC HL
3630:27254+6 179D 23 INC HL
3631:27260+7 179E 77 LD (HL),A ; Set sign of result SGNRES
3632:27267+4 179F 79 LD A,C ; Get MSB
3633:27271+4 17A0 07 RLCA ; Old sign to carry
3634:27275+4 17A1 37 SCF ; Set MSBit
3635:27279+4 17A2 1F RRA ; Set MSBit of MSB
3636:27283+4 17A3 4F LD C,A ; Save MSB
3637:27287+4 17A4 1F RRA
3638:27291+7 17A5 AE XOR (HL) ; New sign of result
3639:27298+10 17A6 C9 RET
3640:
3641:27308+4 17A7 78 CMPNUM: LD A,B ; Get exponent of number
3642:27312+4 17A8 B7 OR A
3643:27316+10 17A9 CA3F17 JP Z,TSTSGN ; Zero - Test sign of FPREG
3644:27326+10 17AC 214817 LD HL,RETREL ; Return relation routine
3645:27336+11 17AF E5 PUSH HL ; Save for return
3646:27347+17 17B0 CD3F17 CALL TSTSGN ; Test sign of FPREG
3647:27364+4 17B3 79 LD A,C ; Get MSB of number
3648:27368+5+6 17B4 C8 RET Z ; FPREG zero - Number's MSB
3649:27373+10 17B5 21C01E LD HL,FPREG+2 ; MSB of FPREG
3650:27383+7 17B8 AE XOR (HL) ; Combine signs
3651:27390+4 17B9 79 LD A,C ; Get MSB of number
3652:27394+5+6 17BA F8 RET M ; Exit if signs different
3653:27399+17 17BB CDC117 CALL CMPFP ; Compare FP numbers
3654:27416+4 17BE 1F RRA ; Get carry to sign
3655:27420+4 17BF A9 XOR C ; Combine with MSB of number
3656:27424+10 17C0 C9 RET
3657:
3658:27434+6 17C1 23 CMPFP: INC HL ; Point to exponent
3659:27440+4 17C2 78 LD A,B ; Get exponent
3660:27444+7 17C3 BE CP (HL) ; Compare exponents
3661:27451+5+6 17C4 C0 RET NZ ; Different
3662:27456+6 17C5 2B DEC HL ; Point to MBS
3663:27462+4 17C6 79 LD A,C ; Get MSB
3664:27466+7 17C7 BE CP (HL) ; Compare MSBs
3665:27473+5+6 17C8 C0 RET NZ ; Different
3666:27478+6 17C9 2B DEC HL ; Point to NMSB
3667:27484+4 17CA 7A LD A,D ; Get NMSB
3668:27488+7 17CB BE CP (HL) ; Compare NMSBs
3669:27495+5+6 17CC C0 RET NZ ; Different
3670:27500+6 17CD 2B DEC HL ; Point to LSB
3671:27506+4 17CE 7B LD A,E ; Get LSB
3672:27510+7 17CF 96 SUB (HL) ; Compare LSBs
3673:27517+5+6 17D0 C0 RET NZ ; Different
3674:27522+10 17D1 E1 POP HL ; Drop RETurn
3675:27532+10 17D2 E1 POP HL ; Drop another RETurn
3676:27542+10 17D3 C9 RET
3677:
3678:27552+4 17D4 47 FPINT: LD B,A ; <- Move
3679:27556+4 17D5 4F LD C,A ; <- exponent
3680:27560+4 17D6 57 LD D,A ; <- to all
3681:27564+4 17D7 5F LD E,A ; <- bits
3682:27568+4 17D8 B7 OR A ; Test exponent
3683:27572+5+6 17D9 C8 RET Z ; Zero - Return zero
3684:27577+11 17DA E5 PUSH HL ; Save pointer to number
3685:27588+20 17DB ED5BBE1E LD DE,(FPREG) ; Move FPREG to BCDE
3686:27608+20 17DF ED4BC01E LD BC,(FPREG+2)
3687:27628+17 17E3 CD9217 CALL SIGNS ; Set MSBs & sign of result
3688:27645+7 17E6 AE XOR (HL) ; Combine with sign of FPREG
3689:27652+4 17E7 67 LD H,A ; Save combined signs
3690:27656+10+7 17E8 FCFD17 CALL M,DCBCDE ; Negative - Decrement BCDE
3691:27666+7 17EB 3E98 LD A,80H+24 ; 24 bits
3692:27673+4 17ED 90 SUB B ; Bits to shift
3693:27677+17 17EE CDAF15 CALL SCALE ; Shift BCDE
3694:27694+4 17F1 7C LD A,H ; Get combined sign
3695:27698+4 17F2 17 RLA ; Sign to carry
3696:27702+10+7 17F3 DC8215 CALL C,FPROND ; Negative - Round number up
3697:27712+7 17F6 0600 LD B,0 ; Zero exponent
3698:27719+10+7 17F8 DC9B15 CALL C,COMPL ; If negative make positive
3699:27729+10 17FB E1 POP HL ; Restore pointer to number
3700:27739+10 17FC C9 RET
3701:
3702:27749+6 17FD 1B DCBCDE: DEC DE ; Decrement BCDE
3703:27755+4 17FE 7A LD A,D ; Test LSBs
3704:27759+4 17FF A3 AND E
3705:27763+4 1800 3C INC A
3706:27767+5+6 1801 C0 RET NZ ; Exit if LSBs not FFFF
3707:27772+6 1802 0B DEC BC ; Decrement MSBs
3708:27778+10 1803 C9 RET
3709:
3710:27788+10 1804 21C11E INT: LD HL,FPEXP ; Point to exponent
3711:27798+7 1807 7E LD A,(HL) ; Get exponent
3712:27805+7 1808 FE98 CP 80H+24 ; Integer accuracy only?
3713:27812+13 180A 3ABE1E LD A,(FPREG) ; Get LSB
3714:27825+5+6 180D D0 RET NC ; Yes - Already integer
3715:27830+7 180E 7E LD A,(HL) ; Get exponent
3716:27837+17 180F CDD417 CALL FPINT ; F.P to integer
3717:27854+10 1812 3698 LD (HL),80H+24 ; Save 24 bit integer
3718:27864+4 1814 7B LD A,E ; Get LSB of number
3719:27868+11 1815 F5 PUSH AF ; Save LSB
3720:27879+4 1816 79 LD A,C ; Get MSB of number
3721:27883+4 1817 17 RLA ; Sign to carry
3722:27887+17 1818 CD3215 CALL CONPOS ; Set sign of result
3723:27904+10 181B F1 POP AF ; Restore LSB of number
3724:27914+10 181C C9 RET
3725:
3726:27924+10 181D 210000 MLDEBC: LD HL,0 ; Clear partial product
3727:27934+4 1820 78 LD A,B ; Test multiplier
3728:27938+4 1821 B1 OR C
3729:27942+5+6 1822 C8 RET Z ; Return zero if zero
3730:27947+4 1823 78 LD A,B
3731:27951+7 1824 0610 LD B,16 ; 16 bits (iterations)
3732:27958+11 1826 29 MLDBLP: ADD HL,HL ; Shift partial product left
3733:27969+10 1827 DA1E10 JP C,BSERR ; ?BS Error if overflow
3734:27979+8 182A CB11 RL C
3735:27987+4 182C 17 RLA
3736:27991+10 182D D23418 JP NC,NOMLAD ; Bit was zero - No add
3737:28001+11 1830 19 ADD HL,DE
3738:28012+10 1831 DA1E10 JP C,BSERR ; ?BS Error if overflow
3739:28022+8+5 1834 10F0 NOMLAD: DJNZ MLDBLP
3740:28030+10 1836 C9 RET
3741:
3742:28040+7 1837 FE2D ASCTFP: CP '-' ; Negative?
3743:28047+11 1839 F5 PUSH AF ; Save it and flags
3744:28058+10 183A CA4318 JP Z,CNVNUM ; Yes - Convert number
3745:28068+7 183D FE2B CP '+' ; Positive?
3746:28075+10 183F CA4318 JP Z,CNVNUM ; Yes - Convert number
3747:28085+6 1842 2B DEC HL ; DEC 'cos GETCHR INCs
3748:28091+17 1843 CD4A15 CNVNUM: CALL RESZER ; Set result to zero
3749:28108+4 1846 47 LD B,A ; Digits after point counter
3750:28112+4 1847 57 LD D,A ; Sign of exponent
3751:28116+4 1848 5F LD E,A ; Exponent of ten
3752:28120+4 1849 2F CPL
3753:28124+4 184A 4F LD C,A ; Before or after point flag
3754:28128+17 184B CD4F08 MANLP: CALL GETCHR ; Get next character
3755:28145+10 184E DA9418 JP C,ADDIG ; Digit - Add to number
3756:28155+7 1851 FE2E CP '.'
3757:28162+10 1853 CA6F18 JP Z,DPOINT ; '.' - Flag point
3758:28172+7 1856 FE45 CP 'E'
3759:28179+10 1858 C27318 JP NZ,CONEXP ; Not 'E' - Scale number
3760:28189+17 185B CD4F08 CALL GETCHR ; Get next character
3761:28206+17 185E CD330E CALL SGNEXP ; Get sign of exponent
3762:28223+17 1861 CD4F08 EXPLP: CALL GETCHR ; Get next character
3763:28240+10 1864 DABB18 JP C,EDIGIT ; Digit - Add to exponent
3764:28250+4 1867 14 INC D ; Is sign negative?
3765:28254+10 1868 C27318 JP NZ,CONEXP ; No - Scale number
3766:28264+4 186B AF XOR A
3767:28268+4 186C 93 SUB E ; Negate exponent
3768:28272+4 186D 5F LD E,A ; And re-save it
3769:28276+4 186E 0C INC C ; Flag end of number
3770:28280+4 186F 0C DPOINT: INC C ; Flag point passed
3771:28284+10 1870 CA4B18 JP Z,MANLP ; Zero - Get another digit
3772:28294+11 1873 E5 CONEXP: PUSH HL ; Save code string address
3773:28305+4 1874 7B LD A,E ; Get exponent
3774:28309+4 1875 90 SUB B ; Subtract digits after point
3775:28313+10+7 1876 F48C18 SCALMI: CALL P,SCALPL ; Positive - Multiply number
3776:28323+10 1879 F28218 JP P,ENDCON ; Positive - All done
3777:28333+11 187C F5 PUSH AF ; Save number of times to /10
3778:28344+17 187D CD7816 CALL DIV10 ; Divide by 10
3779:28361+10 1880 F1 POP AF ; Restore count
3780:28371+4 1881 3C INC A ; Count divides
3781:
3782:28375+10 1882 C27618 ENDCON: JP NZ,SCALMI ; More to do
3783:28385+10 1885 D1 POP DE ; Restore code string address
3784:28395+10 1886 F1 POP AF ; Restore sign of number
3785:28405+10+7 1887 CC6817 CALL Z,INVSGN ; Negative - Negate number
3786:28415+4 188A EB EX DE,HL ; Code string address to HL
3787:28419+10 188B C9 RET
3788:
3789:28429+5+6 188C C8 SCALPL: RET Z ; Exit if no scaling needed
3790:28434+11 188D F5 MULTEN: PUSH AF ; Save count
3791:28445+17 188E CD2317 CALL MLSP10 ; Multiply number by 10
3792:28462+10 1891 F1 POP AF ; Restore count
3793:28472+4 1892 3D DEC A ; Count multiplies
3794:28476+10 1893 C9 RET
3795:
3796:28486+11 1894 D5 ADDIG: PUSH DE ; Save sign of exponent
3797:28497+4 1895 57 LD D,A ; Save digit
3798:28501+4 1896 78 LD A,B ; Get digits after point
3799:28505+4 1897 89 ADC A,C ; Add one if after point
3800:28509+4 1898 47 LD B,A ; Re-save counter
3801:28513+11 1899 C5 PUSH BC ; Save point flags
3802:28524+11 189A E5 PUSH HL ; Save code string address
3803:28535+11 189B D5 PUSH DE ; Save digit
3804:28546+17 189C CD2317 CALL MLSP10 ; Multiply number by 10
3805:28563+10 189F F1 POP AF ; Restore digit
3806:28573+7 18A0 D630 SUB '0' ; Make it absolute
3807:28580+17 18A2 CDAB18 CALL RSCALE ; Re-scale number
3808:28597+10 18A5 E1 POP HL ; Restore code string address
3809:28607+10 18A6 C1 POP BC ; Restore point flags
3810:28617+10 18A7 D1 POP DE ; Restore sign of exponent
3811:28627+10 18A8 C34B18 JP MANLP ; Get another digit
3812:
3813:28637+16 18AB 2ABE1E RSCALE: LD HL,(FPREG) ; LSB,NLSB of FPREG
3814:28653+11 18AE E5 PUSH HL ; Stack them
3815:28664+16 18AF 2AC01E LD HL,(FPREG+2) ; MSB and exponent of FPREG
3816:28680+11 18B2 E5 PUSH HL ; Stack them
3817:28691+17 18B3 CD5117 CALL FLGREL ; Digit to add to FPREG
3818:28708+10 18B6 C1 PADD: POP BC ; Restore number
3819:28718+10 18B7 D1 POP DE
3820:28728+10 18B8 C3DC14 JP FPADD ; Add BCDE to FPREG and return
3821:
3822:28738+4 18BB 7B EDIGIT: LD A,E ; Get digit
3823:28742+4 18BC 07 RLCA ; Times 2
3824:28746+4 18BD 07 RLCA ; Times 4
3825:28750+4 18BE 83 ADD A,E ; Times 5
3826:28754+4 18BF 07 RLCA ; Times 10
3827:28758+7 18C0 86 ADD A,(HL) ; Add next digit
3828:28765+7 18C1 D630 SUB '0' ; Make it absolute
3829:28772+4 18C3 5F LD E,A ; Save new digit
3830:28776+10 18C4 C36118 JP EXPLP ; Look for another digit
3831:
3832:28786+11 18C7 E5 LINEIN: PUSH HL ; Save code string address
3833:28797+10 18C8 217D03 LD HL,INMSG ; Output " in "
3834:28807+17 18CB CD0212 CALL PRS ; Output string at HL
3835:28824+10 18CE E1 POP HL ; Restore code string address
3836:28834+4 18CF EB PRNTHL: EX DE,HL ; Code string address to DE
3837:28838+4 18D0 AF XOR A
3838:28842+7 18D1 0698 LD B,80H+24 ; 24 bits
3839:28849+17 18D3 CD5617 CALL RETINT ; Return the integer
3840:28866+10 18D6 210112 LD HL,PRNUMS ; Print number string
3841:28876+11 18D9 E5 PUSH HL ; Save for return
3842:28887+10 18DA 21C31E NUMASC: LD HL,PBUFF ; Convert number to ASCII
3843:28897+11 18DD E5 PUSH HL ; Save for return
3844:28908+17 18DE CD3F17 CALL TSTSGN ; Test sign of FPREG
3845:28925+10 18E1 3620 LD (HL),' ' ; Space at start
3846:28935+10 18E3 F2E818 JP P,SPCFST ; Positive - Space to start
3847:28945+10 18E6 362D LD (HL),'-' ; '-' sign at start
3848:28955+6 18E8 23 SPCFST: INC HL ; First byte of number
3849:28961+10 18E9 3630 LD (HL),'0' ; '0' if zero
3850:28971+10 18EB CAAC19 JP Z,JSTZER ; Return '0' if zero
3851:28981+11 18EE E5 PUSH HL ; Save buffer address
3852:28992+10+7 18EF FC6817 CALL M,INVSGN ; Negate FPREG if negative
3853:29002+4 18F2 AF XOR A ; Zero A
3854:29006+11 18F3 F5 PUSH AF ; Save it
3855:29017+17 18F4 CDB219 CALL RNGTST ; Test number is in range
3856:29034+10 18F7 014391 SIXDIG: LD BC,9143H ; BCDE - 99999.9
3857:29044+10 18FA 11F84F LD DE,4FF8H
3858:29054+17 18FD CDA717 CALL CMPNUM ; Compare numbers
3859:29071+4 1900 B7 OR A
3860:29075+10 1901 E21519 JP PO,INRNG ; > 99999.9 - Sort it out
3861:29085+10 1904 F1 POP AF ; Restore count
3862:29095+17 1905 CD8D18 CALL MULTEN ; Multiply by ten
3863:29112+11 1908 F5 PUSH AF ; Re-save count
3864:29123+10 1909 C3F718 JP SIXDIG ; Test it again
3865:
3866:29133+17 190C CD7816 GTSIXD: CALL DIV10 ; Divide by 10
3867:29150+10 190F F1 POP AF ; Get count
3868:29160+4 1910 3C INC A ; Count divides
3869:29164+11 1911 F5 PUSH AF ; Re-save count
3870:29175+17 1912 CDB219 CALL RNGTST ; Test number is in range
3871:29192+17 1915 CDCA14 INRNG: CALL ROUND ; Add 0.5 to FPREG
3872:29209+4 1918 3C INC A
3873:29213+17 1919 CDD417 CALL FPINT ; F.P to integer
3874:29230+20 191C ED53BE1E LD (FPREG),DE ; Move BCDE to FPREG
3875:29250+20 1920 ED43C01E LD (FPREG+2),BC
3876:29270+10 1924 010603 LD BC,0306H ; 1E+06 to 1E-03 range
3877:29280+10 1927 F1 POP AF ; Restore count
3878:29290+4 1928 81 ADD A,C ; 6 digits before point
3879:29294+4 1929 3C INC A ; Add one
3880:29298+10 192A FA3619 JP M,MAKNUM ; Do it in 'E' form if < 1E-02
3881:29308+7 192D FE08 CP 6+1+1 ; More than 999999 ?
3882:29315+10 192F D23619 JP NC,MAKNUM ; Yes - Do it in 'E' form
3883:29325+4 1932 3C INC A ; Adjust for exponent
3884:29329+4 1933 47 LD B,A ; Exponent of number
3885:29333+7 1934 3E02 LD A,2 ; Make it zero after
3886:
3887:29340+4 1936 3D MAKNUM: DEC A ; Adjust for digits to do
3888:29344+4 1937 3D DEC A
3889:29348+10 1938 E1 POP HL ; Restore buffer address
3890:29358+11 1939 F5 PUSH AF ; Save count
3891:29369+10 193A 11C519 LD DE,POWERS ; Powers of ten
3892:29379+4 193D 05 DEC B ; Count digits before point
3893:29383+10 193E C24719 JP NZ,DIGTXT ; Not zero - Do number
3894:29393+10 1941 362E LD (HL),'.' ; Save point
3895:29403+6 1943 23 INC HL ; Move on
3896:29409+10 1944 3630 LD (HL),'0' ; Save zero
3897:29419+6 1946 23 INC HL ; Move on
3898:29425+4 1947 05 DIGTXT: DEC B ; Count digits before point
3899:29429+10 1948 362E LD (HL),'.' ; Save point in case
3900:29439+10+7 194A CC9017 CALL Z,INCHL ; Last digit - move on
3901:29449+11 194D C5 PUSH BC ; Save digits before point
3902:29460+11 194E E5 PUSH HL ; Save buffer address
3903:29471+4 194F EB EX DE,HL ; Save powers of ten table
3904:29475+20 1950 ED5BBE1E LD DE,(FPREG) ; Move FPREG to BCDE
3905:29495+20 1954 ED4BC01E LD BC,(FPREG+2)
3906:29515+7 1958 062F LD B,'0'-1 ; ASCII '0' - 1
3907:29522+4 195A 04 TRYAGN: INC B ; Count subtractions
3908:29526+4 195B 7B LD A,E ; Get LSB
3909:29530+7 195C 96 SUB (HL) ; Subtract LSB
3910:29537+4 195D 5F LD E,A ; Save LSB
3911:29541+6 195E 23 INC HL
3912:29547+4 195F 7A LD A,D ; Get NMSB
3913:29551+7 1960 9E SBC A,(HL) ; Subtract NMSB
3914:29558+4 1961 57 LD D,A ; Save NMSB
3915:29562+6 1962 23 INC HL
3916:29568+4 1963 79 LD A,C ; Get MSB
3917:29572+7 1964 9E SBC A,(HL) ; Subtract MSB
3918:29579+4 1965 4F LD C,A ; Save MSB
3919:29583+6 1966 2B DEC HL ; Point back to start
3920:29589+6 1967 2B DEC HL
3921:29595+10 1968 D25A19 JP NC,TRYAGN ; No overflow - Try again
3922:29605+17 196B CD8F15 CALL PLUCDE ; Restore number
3923:29622+6 196E 23 INC HL ; Start of next number
3924:29628+20 196F ED53BE1E LD (FPREG),DE ; Angle to FPREG
3925:29648+20 1973 ED43C01E LD (FPREG+2),BC
3926:29668+4 1977 EB EX DE,HL ; Save point in table
3927:29672+10 1978 E1 POP HL ; Restore buffer address
3928:29682+7 1979 70 LD (HL),B ; Save digit in buffer
3929:29689+6 197A 23 INC HL ; And move on
3930:29695+10 197B C1 POP BC ; Restore digit count
3931:29705+4 197C 0D DEC C ; Count digits
3932:29709+10 197D C24719 JP NZ,DIGTXT ; More - Do them
3933:29719+4 1980 05 DEC B ; Any decimal part?
3934:29723+10 1981 CA9019 JP Z,DOEBIT ; No - Do 'E' bit
3935:29733+6 1984 2B SUPTLZ: DEC HL ; Move back through buffer
3936:29739+7 1985 7E LD A,(HL) ; Get character
3937:29746+7 1986 FE30 CP '0' ; '0' character?
3938:29753+10 1988 CA8419 JP Z,SUPTLZ ; Yes - Look back for more
3939:29763+7 198B FE2E CP '.' ; A decimal point?
3940:29770+10+7 198D C49017 CALL NZ,INCHL ; Move back over digit
3941:
3942:29780+10 1990 F1 DOEBIT: POP AF ; Get 'E' flag
3943:29790+10 1991 CAAF19 JP Z,NOENED ; No 'E' needed - End buffer
3944:29800+10 1994 3645 LD (HL),'E' ; Put 'E' in buffer
3945:29810+6 1996 23 INC HL ; And move on
3946:29816+10 1997 362B LD (HL),'+' ; Put '+' in buffer
3947:29826+10 1999 F2A019 JP P,OUTEXP ; Positive - Output exponent
3948:29836+10 199C 362D LD (HL),'-' ; Put '-' in buffer
3949:29846+4 199E 2F CPL ; Negate exponent
3950:29850+4 199F 3C INC A
3951:29854+7 19A0 062F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1
3952:29861+4 19A2 04 EXPTEN: INC B ; Count subtractions
3953:29865+7 19A3 D60A SUB 10 ; Tens digit
3954:29872+10 19A5 D2A219 JP NC,EXPTEN ; More to do
3955:29882+7 19A8 C63A ADD A,'0'+10 ; Restore and make ASCII
3956:29889+6 19AA 23 INC HL ; Move on
3957:29895+7 19AB 70 LD (HL),B ; Save MSB of exponent
3958:29902+6 19AC 23 JSTZER: INC HL ;
3959:29908+7 19AD 77 LD (HL),A ; Save LSB of exponent
3960:29915+6 19AE 23 INC HL
3961:29921+7 19AF 71 NOENED: LD (HL),C ; Mark end of buffer
3962:29928+10 19B0 E1 POP HL ; Restore code string address
3963:29938+10 19B1 C9 RET
3964:
3965:29948+10 19B2 017494 RNGTST: LD BC,9474H ; BCDE = 999999.
3966:29958+10 19B5 11F723 LD DE,23F7H
3967:29968+17 19B8 CDA717 CALL CMPNUM ; Compare numbers
3968:29985+4 19BB B7 OR A
3969:29989+10 19BC E1 POP HL ; Return address to HL
3970:29999+10 19BD E20C19 JP PO,GTSIXD ; Too big - Divide by ten
3971:30009+4 19C0 E9 JP (HL) ; Otherwise return to caller
3972:
3973: - 19C1 00000080 HALF: .BYTE 00H,00H,00H,80H ; 0.5
3974:
3975: - 19C5 A08601 POWERS: .BYTE 0A0H,086H,001H ; 100000
3976: - 19C8 102700 .BYTE 010H,027H,000H ; 10000
3977: - 19CB E80300 .BYTE 0E8H,003H,000H ; 1000
3978: - 19CE 640000 .BYTE 064H,000H,000H ; 100
3979: - 19D1 0A0000 .BYTE 00AH,000H,000H ; 10
3980: - 19D4 010000 .BYTE 001H,000H,000H ; 1
3981:
3982:30013+10 19D7 216817 NEGAFT: LD HL,INVSGN ; Negate result
3983:30023+19 19DA E3 EX (SP),HL ; To be done after caller
3984:30042+4 19DB E9 JP (HL) ; Return to caller
3985:
3986:30046+17 19DC CD7017 SQR: CALL STAKFP ; Put value on stack
3987:30063+10 19DF 21C119 LD HL,HALF ; Set power to 1/2
3988:30073+10 19E2 11BE1E LD DE,FPREG ; Move 1/2 to FPREG
3989:30083+16 19E5 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
3990:30099+16 19E7 EDA0 LDI
3991:30115+16 19E9 EDA0 LDI
3992:30131+16 19EB EDA0 LDI
3993:
3994:30147+10 19ED C1 POWER: POP BC ; Get base from stack
3995:30157+10 19EE D1 POP DE
3996:30167+17 19EF CD3F17 CALL TSTSGN ; Test sign of power
3997:30184+4 19F2 78 LD A,B ; Get exponent of base
3998:30188+10 19F3 CA371A JP Z,EXP ; Make result 1 if zero
3999:30198+10 19F6 F2FD19 JP P,POWER1 ; Positive base - Ok
4000:30208+4 19F9 B7 OR A ; Zero to negative power?
4001:30212+10 19FA CAEE03 JP Z,DZERR ; Yes - ?/0 Error
4002:30222+4 19FD B7 POWER1: OR A ; Base zero?
4003:30226+10 19FE CA4B15 JP Z,SAVEXP ; Yes - Return zero
4004:30236+11 1A01 D5 PUSH DE ; Save base
4005:30247+11 1A02 C5 PUSH BC
4006:30258+4 1A03 79 LD A,C ; Get MSB of base
4007:30262+7 1A04 F67F OR 01111111B ; Get sign status
4008:30269+20 1A06 ED5BBE1E LD DE,(FPREG) ; Move power to BCDE
4009:30289+20 1A0A ED4BC01E LD BC,(FPREG+2)
4010:30309+10 1A0E F21F1A JP P,POWER2 ; Positive base - Ok
4011:30319+11 1A11 D5 PUSH DE ; Save power
4012:30330+11 1A12 C5 PUSH BC
4013:30341+17 1A13 CD0418 CALL INT ; Get integer of power
4014:30358+10 1A16 C1 POP BC ; Restore power
4015:30368+10 1A17 D1 POP DE
4016:30378+11 1A18 F5 PUSH AF ; MSB of base
4017:30389+17 1A19 CDA717 CALL CMPNUM ; Power an integer?
4018:30406+10 1A1C E1 POP HL ; Restore MSB of base
4019:30416+4 1A1D 7C LD A,H ; but don't affect flags
4020:30420+4 1A1E 1F RRA ; Exponent odd or even?
4021:30424+10 1A1F E1 POWER2: POP HL ; Restore MSB and exponent
4022:30434+16 1A20 22C01E LD (FPREG+2),HL ; Save base in FPREG
4023:30450+10 1A23 E1 POP HL ; LSBs of base
4024:30460+16 1A24 22BE1E LD (FPREG),HL ; Save in FPREG
4025:30476+10+7 1A27 DCD719 CALL C,NEGAFT ; Odd power - Negate result
4026:30486+10+7 1A2A CC6817 CALL Z,INVSGN ; Negative base - Negate it
4027:30496+11 1A2D D5 PUSH DE ; Save power
4028:30507+11 1A2E C5 PUSH BC
4029:30518+17 1A2F CDE415 CALL LOG ; Get LOG of base
4030:30535+10 1A32 C1 POP BC ; Restore power
4031:30545+10 1A33 D1 POP DE
4032:30555+17 1A34 CD2516 CALL FPMULT ; Multiply LOG by power
4033:
4034:30572+17 1A37 CD7017 EXP: CALL STAKFP ; Put value on stack
4035:30589+10 1A3A 013881 LD BC,08138H ; BCDE = 1/Ln(2)
4036:30599+10 1A3D 113BAA LD DE,0AA3BH
4037:30609+17 1A40 CD2516 CALL FPMULT ; Multiply value by 1/LN(2)
4038:30626+13 1A43 3AC11E LD A,(FPEXP) ; Get exponent
4039:30639+7 1A46 FE88 CP 80H+8 ; Is it in range?
4040:30646+10 1A48 D21617 JP NC,OVTST1 ; No - Test for overflow
4041:30656+17 1A4B CD0418 CALL INT ; Get INT of FPREG
4042:30673+7 1A4E C680 ADD A,80H ; For excess 128
4043:30680+7 1A50 C602 ADD A,2 ; Exponent > 126?
4044:30687+10 1A52 DA1617 JP C,OVTST1 ; Yes - Test for overflow
4045:30697+11 1A55 F5 PUSH AF ; Save scaling factor
4046:30708+10 1A56 21D315 LD HL,UNITY ; Point to 1.
4047:30718+17 1A59 CDCD14 CALL ADDPHL ; Add 1 to FPREG
4048:30735+17 1A5C CD1C16 CALL MULLN2 ; Multiply by LN(2)
4049:30752+10 1A5F F1 POP AF ; Restore scaling factor
4050:30762+10 1A60 C1 POP BC ; Restore exponent
4051:30772+10 1A61 D1 POP DE
4052:30782+11 1A62 F5 PUSH AF ; Save scaling factor
4053:30793+17 1A63 CDD914 CALL SUBCDE ; Subtract exponent from FPREG
4054:30810+17 1A66 CD6817 CALL INVSGN ; Negate result
4055:30827+10 1A69 21771A LD HL,EXPTAB ; Coefficient table
4056:30837+17 1A6C CDAC1A CALL SMSER1 ; Sum the series
4057:30854+10 1A6F 110000 LD DE,0 ; Zero LSBs
4058:30864+10 1A72 C1 POP BC ; Scaling factor
4059:30874+4 1A73 4A LD C,D ; Zero MSB
4060:30878+10 1A74 C32516 JP FPMULT ; Scale result to correct value
4061:
4062: - 1A77 08 EXPTAB: .BYTE 8 ; Table used by EXP
4063: - 1A78 402E9474 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040)
4064: - 1A7C 704F2E77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720)
4065: - 1A80 6E02887A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120)
4066: - 1A84 E6A02A7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24)
4067: - 1A88 50AAAA7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6)
4068: - 1A8C FFFF7F7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2)
4069: - 1A90 00008081 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1)
4070: - 1A94 00000081 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1)
4071:
4072:30888+17 1A98 CD7017 SUMSER: CALL STAKFP ; Put FPREG on stack
4073:30905+10 1A9B 112316 LD DE,MULT ; Multiply by "X"
4074:30915+11 1A9E D5 PUSH DE ; To be done after
4075:30926+11 1A9F E5 PUSH HL ; Save address of table
4076:30937+20 1AA0 ED5BBE1E LD DE,(FPREG) ; Move FPREG to BCDE
4077:30957+20 1AA4 ED4BC01E LD BC,(FPREG+2)
4078:30977+17 1AA8 CD2516 CALL FPMULT ; Square the value
4079:30994+10 1AAB E1 POP HL ; Restore address of table
4080:31004+17 1AAC CD7017 SMSER1: CALL STAKFP ; Put value on stack
4081:31021+7 1AAF 7E LD A,(HL) ; Get number of coefficients
4082:31028+6 1AB0 23 INC HL ; Point to start of table
4083:31034+10 1AB1 11BE1E LD DE,FPREG ; Move coefficient to FPREG
4084:31044+16 1AB4 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
4085:31060+16 1AB6 EDA0 LDI
4086:31076+16 1AB8 EDA0 LDI
4087:31092+16 1ABA EDA0 LDI
4088: - 1ABC 06 .BYTE 06H ; Skip "POP AF"
4089:31108+10 1ABD F1 SUMLP: POP AF ; Restore count
4090:31118+10 1ABE C1 POP BC ; Restore number
4091:31128+10 1ABF D1 POP DE
4092:31138+4 1AC0 3D DEC A ; Cont coefficients
4093:31142+5+6 1AC1 C8 RET Z ; All done
4094:31147+11 1AC2 D5 PUSH DE ; Save number
4095:31158+11 1AC3 C5 PUSH BC
4096:31169+11 1AC4 F5 PUSH AF ; Save count
4097:31180+11 1AC5 E5 PUSH HL ; Save address in table
4098:31191+17 1AC6 CD2516 CALL FPMULT ; Multiply FPREG by BCDE
4099:31208+10 1AC9 E1 POP HL ; Restore address in table
4100:31218+17 1ACA CD8917 CALL LOADFP ; Number at HL to BCDE
4101:31235+11 1ACD E5 PUSH HL ; Save address in table
4102:31246+17 1ACE CDDC14 CALL FPADD ; Add coefficient to FPREG
4103:31263+10 1AD1 E1 POP HL ; Restore address in table
4104:31273+10 1AD2 C3BD1A JP SUMLP ; More coefficients
4105:
4106:31283+17 1AD5 CD3F17 RND: CALL TSTSGN ; Test sign of FPREG
4107:31300+10 1AD8 21FC1D LD HL,SEED+2 ; Random number seed
4108:31310+10 1ADB FA4F1B JP M,RESEED ; Negative - Re-seed
4109:31320+10 1ADE 211D1E LD HL,LSTRND ; Last random number
4110:31330+10 1AE1 11BE1E LD DE,FPREG ; Move last RND to FPREG
4111:31340+16 1AE4 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
4112:31356+16 1AE6 EDA0 LDI
4113:31372+16 1AE8 EDA0 LDI
4114:31388+16 1AEA EDA0 LDI
4115:31404+10 1AEC 21FC1D LD HL,SEED+2 ; Random number seed
4116:31414+5+6 1AEF C8 RET Z ; Return if RND(0)
4117:31419+7 1AF0 86 ADD A,(HL) ; Add (SEED)+2)
4118:31426+7 1AF1 E607 AND 00000111B ; 0 to 7
4119:31433+7 1AF3 0600 LD B,0
4120:31440+7 1AF5 77 LD (HL),A ; Re-save seed
4121:31447+6 1AF6 23 INC HL ; Move to coefficient table
4122:31453+4 1AF7 87 ADD A,A ; 4 bytes
4123:31457+4 1AF8 87 ADD A,A ; per entry
4124:31461+4 1AF9 4F LD C,A ; BC = Offset into table
4125:31465+11 1AFA 09 ADD HL,BC ; Point to coefficient
4126:31476+17 1AFB CD8917 CALL LOADFP ; Coefficient to BCDE
4127:31493+17 1AFE CD2516 CALL FPMULT ; Multiply FPREG by coefficient
4128:31510+13 1B01 3AFB1D LD A,(SEED+1) ; Get (SEED+1)
4129:31523+4 1B04 3C INC A ; Add 1
4130:31527+7 1B05 E603 AND 00000011B ; 0 to 3
4131:31534+7 1B07 0600 LD B,0
4132:31541+7 1B09 FE01 CP 1 ; Is it zero?
4133:31548+4 1B0B 88 ADC A,B ; Yes - Make it 1
4134:31552+13 1B0C 32FB1D LD (SEED+1),A ; Re-save seed
4135:31565+10 1B0F 21531B LD HL,RNDTAB-4 ; Addition table
4136:31575+4 1B12 87 ADD A,A ; 4 bytes
4137:31579+4 1B13 87 ADD A,A ; per entry
4138:31583+4 1B14 4F LD C,A ; BC = Offset into table
4139:31587+11 1B15 09 ADD HL,BC ; Point to value
4140:31598+17 1B16 CDCD14 CALL ADDPHL ; Add value to FPREG
4141:31615+20 1B19 ED5BBE1E RND1: LD DE,(FPREG) ; Move FPREG to BCDE
4142:31635+20 1B1D ED4BC01E LD BC,(FPREG+2)
4143:31655+4 1B21 7B LD A,E ; Get LSB
4144:31659+4 1B22 59 LD E,C ; LSB = MSB
4145:31663+7 1B23 EE4F XOR 01001111B ; Fiddle around
4146:31670+4 1B25 4F LD C,A ; New MSB
4147:31674+10 1B26 21C21E LD HL,SGNRES
4148:31684+10 1B29 3680 LD (HL),80H ; Set saved signed bit to positive
4149:31694+6 1B2B 2B DEC HL ; Point to Exponent
4150:31700+7 1B2C 46 LD B,(HL) ; Get Exponent to BCDE
4151:31707+10 1B2D 3680 LD (HL),80H ; Makes Exponent 1
4152:31717+10 1B2F 21FA1D LD HL,SEED ; Random number seed
4153:31727+11 1B32 34 INC (HL) ; Count seed
4154:31738+7 1B33 7E LD A,(HL) ; Get seed
4155:31745+7 1B34 D6AB SUB 171 ; Do it modulo 171
4156:31752+10 1B36 C23D1B JP NZ,RND2 ; Non-zero - Ok
4157:31762+7 1B39 77 LD (HL),A ; Zero seed
4158:31769+4 1B3A 0C INC C ; Fillde about
4159:31773+4 1B3B 15 DEC D ; with the
4160:31777+4 1B3C 1C INC E ; number
4161:31781+17 1B3D CD3515 RND2: CALL BNORM ; Normalise number
4162:31798+10 1B40 111D1E LD DE,LSTRND ; Save random number
4163:31808+10 1B43 21BE1E LD HL,FPREG ; Move FPREG to last and return
4164:31818+16 1B46 EDA0 LDI ; 4 bytes to move (HL++)->(DE++)
4165:31834+16 1B48 EDA0 LDI
4166:31850+16 1B4A EDA0 LDI
4167:31866+16 1B4C EDA0 LDI
4168:31882+10 1B4E C9 RET
4169:
4170:31892+7 1B4F 77 RESEED: LD (HL),A ; Re-seed random numbers
4171:31899+6 1B50 2B DEC HL
4172:31905+7 1B51 77 LD (HL),A
4173:31912+6 1B52 2B DEC HL
4174:31918+7 1B53 77 LD (HL),A
4175:31925+10 1B54 C3191B JP RND1 ; Return RND seed
4176:
4177: - 1B57 68B14668 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND
4178: - 1B5B 99E99269 .BYTE 099H,0E9H,092H,069H
4179: - 1B5F 10D17568 .BYTE 010H,0D1H,075H,068H
4180:
4181:31935+10 1B63 21B21B COS: LD HL,HALFPI ; Point to PI/2
4182:31945+17 1B66 CDCD14 CALL ADDPHL ; Add it to FPREG
4183:31962+17 1B69 CD7017 SIN: CALL STAKFP ; Put angle on stack
4184:31979+10 1B6C 014983 LD BC,8349H ; BCDE = 2 PI
4185:31989+10 1B6F 11DB0F LD DE,0FDBH
4186:31999+20 1B72 ED53BE1E LD (FPREG),DE ; Move 2 PI to FPREG
4187:32019+20 1B76 ED43C01E LD (FPREG+2),BC
4188:32039+10 1B7A C1 POP BC ; Restore angle
4189:32049+10 1B7B D1 POP DE
4190:32059+17 1B7C CD9016 CALL DVBCDE ; Divide angle by 2 PI
4191:32076+17 1B7F CD7017 CALL STAKFP ; Put it on stack
4192:32093+17 1B82 CD0418 CALL INT ; Get INT of result
4193:32110+10 1B85 C1 POP BC ; Restore number
4194:32120+10 1B86 D1 POP DE
4195:32130+17 1B87 CDD914 CALL SUBCDE ; Make it 0 <= value < 1
4196:32147+10 1B8A 21B61B LD HL,QUARTR ; Point to 0.25
4197:32157+17 1B8D CDD314 CALL SUBPHL ; Subtract value from 0.25
4198:32174+17 1B90 CD3F17 CALL TSTSGN ; Test sign of value
4199:32191+4 1B93 37 SCF ; Flag positive
4200:32195+10 1B94 F29E1B JP P,SIN1 ; Positive - Ok
4201:32205+17 1B97 CDCA14 CALL ROUND ; Add 0.5 to value
4202:32222+17 1B9A CD3F17 CALL TSTSGN ; Test sign of value
4203:32239+4 1B9D B7 OR A ; Flag negative
4204:32243+11 1B9E F5 SIN1: PUSH AF ; Save sign
4205:32254+10+7 1B9F F46817 CALL P,INVSGN ; Negate value if positive
4206:32264+10 1BA2 21B61B LD HL,QUARTR ; Point to 0.25
4207:32274+17 1BA5 CDCD14 CALL ADDPHL ; Add 0.25 to value
4208:32291+10 1BA8 F1 POP AF ; Restore sign
4209:32301+10+7 1BA9 D46817 CALL NC,INVSGN ; Negative - Make positive
4210:32311+10 1BAC 21BA1B LD HL,SINTAB ; Coefficient table
4211:32321+10 1BAF C3981A JP SUMSER ; Evaluate sum of series
4212:
4213: - 1BB2 DB0F4981 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2)
4214:
4215: - 1BB6 0000007F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25
4216:
4217: - 1BBA 05 SINTAB: .BYTE 5 ; Table used by SIN
4218: - 1BBB BAD71E86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711
4219: - 1BBF 64269987 .BYTE 064H,026H,099H,087H ;-76.575
4220: - 1BC3 58342387 .BYTE 058H,034H,023H,087H ; 81.602
4221: - 1BC7 E05DA586 .BYTE 0E0H,05DH,0A5H,086H ;-41.342
4222: - 1BCB DA0F4983 .BYTE 0DAH,00FH,049H,083H ; 6.2832
4223:
4224:32331+17 1BCF CD7017 TAN: CALL STAKFP ; Put angle on stack
4225:32348+17 1BD2 CD691B CALL SIN ; Get SIN of angle
4226:32365+10 1BD5 C1 POP BC ; Restore angle
4227:32375+10 1BD6 E1 POP HL
4228:32385+17 1BD7 CD7017 CALL STAKFP ; Save SIN of angle
4229:32402+4 1BDA EB EX DE,HL ; BCDE = Angle
4230:32406+20 1BDB ED53BE1E LD (FPREG),DE ; Angle to FPREG
4231:32426+20 1BDF ED43C01E LD (FPREG+2),BC
4232:32446+17 1BE3 CD631B CALL COS ; Get COS of angle
4233:32463+10 1BE6 C38E16 JP DIV ; TAN = SIN / COS
4234:
4235:32473+17 1BE9 CD3F17 ATN: CALL TSTSGN ; Test sign of value
4236:32490+10+7 1BEC FCD719 CALL M,NEGAFT ; Negate result after if -ve
4237:32500+10+7 1BEF FC6817 CALL M,INVSGN ; Negate value if -ve
4238:32510+13 1BF2 3AC11E LD A,(FPEXP) ; Get exponent
4239:32523+7 1BF5 FE81 CP 81H ; Number less than 1?
4240:32530+10 1BF7 DA061C JP C,ATN1 ; Yes - Get arc tangnt
4241:32540+10 1BFA 010081 LD BC,8100H ; BCDE = 1
4242:32550+4 1BFD 51 LD D,C
4243:32554+4 1BFE 59 LD E,C
4244:32558+17 1BFF CD9016 CALL DVBCDE ; Get reciprocal of number
4245:32575+10 1C02 21D314 LD HL,SUBPHL ; Sub angle from PI/2
4246:32585+11 1C05 E5 PUSH HL ; Save for angle > 1
4247:32596+10 1C06 21101C ATN1: LD HL,ATNTAB ; Coefficient table
4248:32606+17 1C09 CD981A CALL SUMSER ; Evaluate sum of series
4249:32623+10 1C0C 21B21B LD HL,HALFPI ; PI/2 - angle in case > 1
4250:32633+10 1C0F C9 RET ; Number > 1 - Sub from PI/2
4251:
4252: - 1C10 09 ATNTAB: .BYTE 9 ; Table used by ATN
4253: - 1C11 4AD73B78 .BYTE 04AH,0D7H,03BH,078H ; 1/17
4254: - 1C15 026E847B .BYTE 002H,06EH,084H,07BH ;-1/15
4255: - 1C19 FEC12F7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13
4256: - 1C1D 74319A7D .BYTE 074H,031H,09AH,07DH ;-1/11
4257: - 1C21 843D5A7D .BYTE 084H,03DH,05AH,07DH ; 1/9
4258: - 1C25 C87F917E .BYTE 0C8H,07FH,091H,07EH ;-1/7
4259: - 1C29 E4BB4C7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5
4260: - 1C2D 6CAAAA7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3
4261: - 1C31 00000081 .BYTE 000H,000H,000H,081H ; 1/1
4262:
4263:32643+10 1C35 C30000 MONITR: JP $0000 ; Restart (Normally Monitor Start)
4264:
4265:32653+7 1C38 3E0C CLS: LD A,CS ; ASCII Clear screen
4266:32660+11 1C3A CF RST 08H ; Output character
4267:32671+10 1C3B C9 ARET: RET ; A RETurn instruction
4268:32681+14 1C3C ED45 ARETN: RETN ; A RETurN from NMI
4269:
4270:32695+17 1C3E CDA114 WIDTH: CALL GETINT ; Get integer 0-255
4271:32712+4 1C41 7B LD A,E ; Width to A
4272:32716+13 1C42 32251E LD (LWIDTH),A ; Set width
4273:32729+10 1C45 C9 RET
4274:
4275:32739+17 1C46 CDF60C LINES: CALL GETNUM ; Get a number
4276:32756+17 1C49 CD0109 CALL DEINT ; Get integer -32768 to 32767
4277:32773+20 1C4C ED53291E LD (LINESC),DE ; Set lines counter
4278:32793+20 1C50 ED532B1E LD (LINESN),DE ; Set lines number
4279:32813+10 1C54 C9 RET
4280:
4281:32823+17 1C55 CD0109 DEEK: CALL DEINT ; Get integer -32768 to 32767
4282:32840+11 1C58 D5 PUSH DE ; Save number
4283:32851+10 1C59 E1 POP HL ; Number to HL
4284:32861+7 1C5A 46 LD B,(HL) ; Get LSB of contents
4285:32868+6 1C5B 23 INC HL
4286:32874+7 1C5C 7E LD A,(HL) ; Get MSB of contents
4287:32881+10 1C5D C3D210 JP ABPASS ; Return integer AB
4288:
4289:32891+17 1C60 CDF60C DOKE: CALL GETNUM ; Get a number
4290:32908+17 1C63 CD0109 CALL DEINT ; Get integer -32768 to 32767
4291:32925+11 1C66 D5 PUSH DE ; Save address
4292:32936+17 1C67 CDBC06 CALL CHKSYN ; Make sure ',' follows
4293: - 1C6A 2C .BYTE ','
4294:32953+17 1C6B CDF60C CALL GETNUM ; Get a number
4295:32970+17 1C6E CD0109 CALL DEINT ; Get integer -32768 to 32767
4296:32987+19 1C71 E3 EX (SP),HL ; Save value,get address
4297:33006+7 1C72 73 LD (HL),E ; Save LSB of value
4298:33013+6 1C73 23 INC HL
4299:33019+7 1C74 72 LD (HL),D ; Save MSB of value
4300:33026+10 1C75 E1 POP HL ; Restore code string address
4301:33036+10 1C76 C9 RET
4302:
4303: ; Load Intel HEX into program memory.
4304: ; uses : af, bc, de, hl
4305: ; (C) feilipu
4306:
4307: - 1C77 HLOAD:
4308:33046+5+6 1C77 C0 ret NZ ; Return if any more on line
4309:33051+17 1C78 CD961C call HLD_WAIT_COLON ; wait for first colon and address data
4310:33068+6 1C7B 1B dec de ; go one Byte lower
4311:33074+16 1C7C 2A891E ld hl,(LSTRAM) ; get last ram address
4312:33090+4 1C7F AF xor a ; clear carry flag
4313:33094+15 1C80 ED52 sbc hl,de
4314:33109+7+5 1C82 380B jr C,HLD_HIGH_RAM ; if last ram lower leave it, otherwise
4315:33116+20 1C84 ED53891E ld (LSTRAM),de ; store new last ram location
4316:33136+10 1C88 21CEFF ld hl,-50 ; reserve 50 bytes for string space
4317:33146+11 1C8B 19 add hl,de ; allocate string space
4318:33157+16 1C8C 22341E ld (STRSPC),hl ; save string space location
4319: - 1C8F HLD_HIGH_RAM:
4320:33173+6 1C8F 13 inc de
4321:33179+20 1C90 ED53E71D ld (USR+1),de ; store first address as "USR(x)" location
4322:33199+12 1C94 1821 jr HLD_READ_DATA ; now get the first data
4323:
4324: - 1C96 HLD_WAIT_COLON:
4325:33211+11 1C96 D7 rst 10h ; Rx byte in A
4326:33222+7 1C97 FE3A cp ':' ; wait for ':'
4327:33229+7+5 1C99 20FB jr NZ,HLD_WAIT_COLON
4328:33236+7 1C9B 0E00 ld c,0 ; reset C to compute checksum
4329:33243+17 1C9D CDD41C call HLD_READ_BYTE ; read byte count
4330:33260+4 1CA0 47 ld b,a ; store it in B
4331:33264+17 1CA1 CDD41C call HLD_READ_BYTE ; read upper byte of address
4332:33281+4 1CA4 57 ld d,a ; store in D
4333:33285+17 1CA5 CDD41C call HLD_READ_BYTE ; read lower byte of address
4334:33302+4 1CA8 5F ld e,a ; store in E
4335:33306+17 1CA9 CDD41C call HLD_READ_BYTE ; read record type
4336:33323+4 1CAC 3D dec a ; check if record type is 01 (end of file)
4337:33327+7+5 1CAD 281A jr Z,HLD_END_LOAD
4338:33334+4 1CAF 3C inc a ; check if record type is 00 (data)
4339:33338+10 1CB0 C2FD03 jp NZ,TMERR ; if not, type mismatch error
4340:33348+10 1CB3 C9 ret
4341:
4342: - 1CB4 HLD_READ:
4343:33358+17 1CB4 CD961C call HLD_WAIT_COLON ; wait for the next colon and address data
4344: - 1CB7 HLD_READ_DATA:
4345:33375+17 1CB7 CDD41C call HLD_READ_BYTE
4346:33392+7 1CBA 12 ld (de),a ; write the byte at the RAM address
4347:33399+6 1CBB 13 inc de
4348:33405+8+5 1CBC 10F9 djnz HLD_READ_DATA ; if b non zero, loop to get more data
4349:
4350: - 1CBE HLD_READ_CHKSUM:
4351:33413+17 1CBE CDD41C call HLD_READ_BYTE ; read checksum, but we don't need to keep it
4352:33430+4 1CC1 79 ld a,c ; lower byte of C checksum should be 0
4353:33434+4 1CC2 B7 or a
4354:33438+10 1CC3 C27C1D jp NZ,HXERR ; non zero, we have an issue
4355:33448+10 1CC6 C3B41C jp HLD_READ
4356:
4357: - 1CC9 HLD_END_LOAD:
4358:33458+17 1CC9 CDD41C call HLD_READ_BYTE ; read checksum, but we don't need to keep it
4359:33475+4 1CCC 79 ld a,c ; lower byte of C checksum should be 0
4360:33479+4 1CCD B7 or a
4361:33483+10 1CCE C27C1D jp NZ,HXERR ; non zero, we have an issue
4362:33493+10 1CD1 C3E000 jp BRKRET ; return to command line
4363:
4364: - 1CD4 HLD_READ_BYTE: ; returns byte in A, checksum in C
4365:33503+17 1CD4 CDE51C call HLD_READ_NIBBLE ; read the first nibble
4366:33520+4 1CD7 07 rlca ; shift it left by 4 bits
4367:33524+4 1CD8 07 rlca
4368:33528+4 1CD9 07 rlca
4369:33532+4 1CDA 07 rlca
4370:33536+4 1CDB 6F ld l,a ; temporarily store the first nibble in L
4371:33540+17 1CDC CDE51C call HLD_READ_NIBBLE ; get the second (low) nibble
4372:33557+4 1CDF B5 or l ; assemble two nibbles into one byte in A
4373:33561+4 1CE0 6F ld l,a ; put assembled byte back into L
4374:33565+4 1CE1 81 add a,c ; add the byte read to C (for checksum)
4375:33569+4 1CE2 4F ld c,a
4376:33573+4 1CE3 7D ld a,l
4377:33577+10 1CE4 C9 ret ; return the byte read in A (L = char received too)
4378:
4379: - 1CE5 HLD_READ_NIBBLE:
4380:33587+11 1CE5 D7 rst 10h ; Rx byte in A
4381:33598+7 1CE6 D630 sub '0'
4382:33605+7 1CE8 FE0A cp 10
4383:33612+5+6 1CEA D8 ret C ; if A<10 just return
4384:33617+7 1CEB D607 sub 7 ; else subtract 'A'-'0' (17) and add 10
4385:33624+10 1CED C9 ret
4386:
4387: ; HEX$(nn) Convert 16 bit number to Hexadecimal string
4388: ; (C) Searle
4389:
4390:33634+17 1CEE CDF90C HEX: CALL TSTNUM ; Verify it's a number
4391:33651+17 1CF1 CD0109 CALL DEINT ; Get integer -32768 to 32767
4392:33668+11 1CF4 C5 PUSH BC ; Save contents of BC
4393:33679+10 1CF5 21C31E LD HL,PBUFF
4394:33689+4 1CF8 7A LD A,D ; Get high order into A
4395:33693+7 1CF9 FE00 CP $0
4396:33700+7+5 1CFB 280C JR Z,HEX2 ; Skip output if both high digits are zero
4397:33707+17 1CFD CD261D CALL BYT2ASC ; Convert D to ASCII
4398:33724+4 1D00 78 LD A,B
4399:33728+7 1D01 FE30 CP '0'
4400:33735+7+5 1D03 2802 JR Z,HEX1 ; Don't store high digit if zero
4401:33742+7 1D05 70 LD (HL),B ; Store it to PBUFF
4402:33749+6 1D06 23 INC HL ; Next location
4403:33755+7 1D07 71 HEX1: LD (HL),C ; Store C to PBUFF+1
4404:33762+6 1D08 23 INC HL ; Next location
4405:33768+4 1D09 7B HEX2: LD A,E ; Get lower byte
4406:33772+17 1D0A CD261D CALL BYT2ASC ; Convert E to ASCII
4407:33789+4 1D0D 7A LD A,D
4408:33793+7 1D0E FE00 CP $0
4409:33800+7+5 1D10 2005 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte
4410:33807+4 1D12 78 LD A,B
4411:33811+7 1D13 FE30 CP '0' ; If high digit of lower byte is zero then don't print
4412:33818+7+5 1D15 2802 JR Z,HEX4
4413:33825+7 1D17 70 HEX3: LD (HL),B ; to PBUFF+2
4414:33832+6 1D18 23 INC HL ; Next location
4415:33838+7 1D19 71 HEX4: LD (HL),C ; to PBUFF+3
4416:33845+6 1D1A 23 INC HL ; PBUFF+4 to zero
4417:33851+4 1D1B AF XOR A ; Terminating character
4418:33855+7 1D1C 77 LD (HL),A ; Store zero to terminate
4419:33862+6 1D1D 23 INC HL ; Make sure PBUFF is terminated
4420:33868+7 1D1E 77 LD (HL),A ; Store the double zero there
4421:33875+10 1D1F C1 POP BC ; Get BC back
4422:33885+10 1D20 21C31E LD HL,PBUFF ; Reset to start of PBUFF
4423:33895+10 1D23 C38811 JP STR1 ; Convert the PBUFF to a string and return it
4424:
4425:33905+4 1D26 47 BYT2ASC:LD B,A ; Save original value
4426:33909+7 1D27 E60F AND $0F ; Strip off upper nybble
4427:33916+7 1D29 FE0A CP $0A ; 0-9?
4428:33923+7+5 1D2B 3802 JR C,ADD30 ; If A-F, add 7 more
4429:33930+7 1D2D C607 ADD A,$07 ; Bring value up to ASCII A-F
4430:33937+7 1D2F C630 ADD30: ADD A,$30 ; And make ASCII
4431:33944+4 1D31 4F LD C,A ; Save converted char to C
4432:33948+4 1D32 78 LD A,B ; Retrieve original value
4433:33952+4 1D33 0F RRCA ; and Rotate it right
4434:33956+4 1D34 0F RRCA
4435:33960+4 1D35 0F RRCA
4436:33964+4 1D36 0F RRCA
4437:33968+7 1D37 E60F AND $0F ; Mask off upper nybble
4438:33975+7 1D39 FE0A CP $0A ; 0-9? < A hex?
4439:33982+7+5 1D3B 3802 JR C,ADD301 ; Skip Add 7
4440:33989+7 1D3D C607 ADD A,$07 ; Bring it up to ASCII A-F
4441:33996+7 1D3F C630 ADD301: ADD A,$30 ; And make it full ASCII
4442:34003+4 1D41 47 LD B,A ; Store high order byte
4443:34007+10 1D42 C9 RET
4444:
4445: ; Convert "&Hnnnn" to FPREG
4446: ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn"
4447: ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9
4448: ; (C) Searle
4449:
4450:34017+4 1D43 EB HEXTFP: EX DE,HL ; Move code string pointer to DE
4451:34021+10 1D44 210000 LD HL,$0000 ; Zero out the value
4452:34031+17 1D47 CD5C1D CALL GETHEX ; Check the number for valid hex
4453:34048+10 1D4A DA7C1D JP C,HXERR ; First value wasn't hex, HX error
4454:34058+12 1D4D 1805 JR HEXLP1 ; Convert first character
4455:34070+17 1D4F CD5C1D HEXLP: CALL GETHEX ; Get second and addtional characters
4456:34087+7+5 1D52 381F JR C,HEXIT ; Exit if not a hex character
4457:34094+11 1D54 29 HEXLP1: ADD HL,HL ; Rotate 4 bits to the left
4458:34105+11 1D55 29 ADD HL,HL
4459:34116+11 1D56 29 ADD HL,HL
4460:34127+11 1D57 29 ADD HL,HL
4461:34138+4 1D58 B5 OR L ; Add in D0-D3 into L
4462:34142+4 1D59 6F LD L,A ; Save new value
4463:34146+12 1D5A 18F3 JR HEXLP ; And continue until all hex characters are in
4464:
4465:34158+6 1D5C 13 GETHEX: INC DE ; Next location
4466:34164+7 1D5D 1A LD A,(DE) ; Load character at pointer
4467:34171+7 1D5E FE20 CP ' '
4468:34178+10 1D60 CA5C1D JP Z,GETHEX ; Skip spaces
4469:34188+7 1D63 D630 SUB $30 ; Get absolute value
4470:34195+5+6 1D65 D8 RET C ; < "0", error
4471:34200+7 1D66 FE0A CP $0A
4472:34207+7+5 1D68 3805 JR C,NOSUB7 ; Is already in the range 0-9
4473:34214+7 1D6A D607 SUB $07 ; Reduce to A-F
4474:34221+7 1D6C FE0A CP $0A ; Value should be $0A-$0F at this point
4475:34228+5+6 1D6E D8 RET C ; CY set if was : ; < = > ? @
4476:34233+7 1D6F FE10 NOSUB7: CP $10 ; > Greater than "F"?
4477:34240+4 1D71 3F CCF
4478:34244+10 1D72 C9 RET ; CY set if it wasn't valid hex
4479:
4480:34254+4 1D73 EB HEXIT: EX DE,HL ; Value into DE, Code string into HL
4481:34258+4 1D74 7A LD A,D ; Load DE into AC
4482:34262+4 1D75 4B LD C,E ; For prep to
4483:34266+11 1D76 E5 PUSH HL
4484:34277+17 1D77 CDD110 CALL ACPASS ; ACPASS to set AC as integer into FPREG
4485:34294+10 1D7A E1 POP HL
4486:34304+10 1D7B C9 RET
4487:
4488:34314+7 1D7C 1E26 HXERR: LD E,HX ; ?HEX Error
4489:34321+10 1D7E C3FF03 JP ERROR
4490:
4491: ; BIN$(NN) Convert integer to a 1-16 char binary string
4492: ; (C) Searle
4493:
4494:34331+17 1D81 CDF90C BIN: CALL TSTNUM ; Verify it's a number
4495:34348+17 1D84 CD0109 CALL DEINT ; Get integer -32768 to 32767
4496:34365+11 1D87 C5 BIN2: PUSH BC ; Save contents of BC
4497:34376+10 1D88 21C31E LD HL,PBUFF
4498:34386+7 1D8B 0611 LD B,17 ; One higher than max char count
4499: - 1D8D ZEROSUP: ; Suppress leading zeros
4500:34393+4 1D8D 05 DEC B ; Max 16 chars
4501:34397+4 1D8E 78 LD A,B
4502:34401+7 1D8F FE01 CP $01
4503:34408+7+5 1D91 2808 JR Z,BITOUT ; Always output at least one character
4504:34415+8 1D93 CB13 RL E
4505:34423+8 1D95 CB12 RL D
4506:34431+7+5 1D97 30F4 JR NC,ZEROSUP
4507:34438+12 1D99 1804 JR BITOUT2
4508: - 1D9B BITOUT:
4509:34450+8 1D9B CB13 RL E
4510:34458+8 1D9D CB12 RL D ; Top bit now in carry
4511: - 1D9F BITOUT2:
4512:34466+7 1D9F 3E30 LD A,'0' ; Char for '0'
4513:34473+7 1DA1 CE00 ADC A,0 ; If carry set then '0' --> '1'
4514:34480+7 1DA3 77 LD (HL),A
4515:34487+6 1DA4 23 INC HL
4516:34493+4 1DA5 05 DEC B
4517:34497+7+5 1DA6 20F3 JR NZ,BITOUT
4518:34504+4 1DA8 AF XOR A ; Terminating character
4519:34508+7 1DA9 77 LD (HL),A ; Store zero to terminate
4520:34515+6 1DAA 23 INC HL ; Make sure PBUFF is terminated
4521:34521+7 1DAB 77 LD (HL),A ; Store the double zero there
4522:34528+10 1DAC C1 POP BC
4523:34538+10 1DAD 21C31E LD HL,PBUFF
4524:34548+10 1DB0 C38811 JP STR1
4525:
4526: ; Convert "&Bnnnn" to FPREG
4527: ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn"
4528: ; (C) Searle
4529:
4530:34558+4 1DB3 EB BINTFP: EX DE,HL ; Move code string pointer to DE
4531:34562+10 1DB4 210000 LD HL,$0000 ; Zero out the value
4532:34572+17 1DB7 CDD01D CALL CHKBIN ; Check the number for valid bin
4533:34589+10 1DBA DADE1D JP C,BINERR ; First value wasn't bin, HX error
4534:34599+7 1DBD D630 BINIT: SUB '0'
4535:34606+11 1DBF 29 ADD HL,HL ; Rotate HL left
4536:34617+4 1DC0 B5 OR L
4537:34621+4 1DC1 6F LD L,A
4538:34625+17 1DC2 CDD01D CALL CHKBIN ; Get second and addtional characters
4539:34642+7+5 1DC5 30F6 JR NC,BINIT ; Process if a bin character
4540:34649+4 1DC7 EB EX DE,HL ; Value into DE, Code string into HL
4541:34653+4 1DC8 7A LD A,D ; Load DE into AC
4542:34657+4 1DC9 4B LD C,E ; For prep to
4543:34661+11 1DCA E5 PUSH HL
4544:34672+17 1DCB CDD110 CALL ACPASS ; ACPASS to set AC as integer into FPREG
4545:34689+10 1DCE E1 POP HL
4546:34699+10 1DCF C9 RET
4547:
4548: ; Char is in A, NC if char is 0 or 1
4549:
4550:34709+6 1DD0 13 CHKBIN: INC DE
4551:34715+7 1DD1 1A LD A,(DE)
4552:34722+7 1DD2 FE20 CP ' '
4553:34729+10 1DD4 CAD01D JP Z,CHKBIN ; Skip spaces
4554:34739+7 1DD7 FE30 CP '0' ; Set C if < '0'
4555:34746+5+6 1DD9 D8 RET C
4556:34751+7 1DDA FE32 CP '2'
4557:34758+4 1DDC 3F CCF ; Set C if > '1'
4558:34762+10 1DDD C9 RET
4559:
4560:34772+7 1DDE 1E28 BINERR: LD E,BN ; ?BIN Error
4561:34779+10 1DE0 C3FF03 JP ERROR
4562:
4563: - 1DE3 .end
**** test.asm ****
88: - 1DE3 _WORKSPACE:
89:
90: - 9E5E dephase
91: - 9E5E prg_end:
92:
**** test.asm ****
93: - 9E5E _eof:
Statistics:
4 passes
0 jr promotions
1203 symbols
7774 bytes
Symbol Table:
ABPASS 10D2 4306
ABS 1764 5988
ACCSUM 8E0 2272
ACPASS 10D1 4305
ADD30 1D2F 7471
ADD301 1D3F 7487
ADDEXP 16F8 5880
ADDIG 1894 6292
ADDPHL 14CD 5325
ADDR_RTC =D0 208
ALLFOL 13C9 5065
ANTVLU C02 3074
ARET 1C3B 7227
ARETN 1C3C 7228
ARLDSV FE8 4072
ARREND =1EB4 7860
ARRLP 1284 4740
ASC 139A 5018
ASCTFP 1837 6199
ASPCS B64 2916
ATN 1BE9 7145
ATN1 1C06 7174
ATNTAB 1C10 7184
ATOH 91B 2331
A_RTS_OFF = 17F 383
A_RTS_ON = 188 392
BADINP B89 2953
BAKSTK 38E 910
BAKTMP 1377 4983
BASRST_00 00 0
BASRST_08 08 8
BASRST_10 10 16
BASRST_18 18 24
BASSTART 4E 78
BASTXT =1E38 7736
BFREE E6 230
BIN 1D81 7553
BIN2 1D87 7559
BINERR 1DDE 7646
BINIT 1DBD 7613
BINTFP 1DB3 7603
BITOUT 1D9B 7579
BITOUT2 1D9F 7583
BKSP =08 8
BN =28 40
BNORM 1535 5429
BNRMLP 1538 5432
BOOT_PHASE0 =50 80
BOOT_PHASE1 =6E 110
BOOT_PHASE1_LOOP=77 119
BOOT_PHASE2 =89 137
BRK 892 2194
BRKFLG =1E30 7728
BRKLIN =1EA8 7848
BRKMSG 388 904
BRKRET E0 224
BS =10 16
BSERR 101E 4126
BUFFER =1E3B 7739
BYT2ASC 1D26 7462
BYTSFT 1673 5747
CFEVAL F78 3960
CHARTY F1E 3870
CHEKFN 1171 4465
CHKBIN 1DD0 7632
CHKLTR 8ED 2285
CHKSTK 3C8 968
CHKSUM =1E2D 7725
CHKSYN 6BC 1724
CHKTYP CFB 3323
CHR 13AB 5035
CLEAR 944 2372
CLOTST 6F5 1781
CLREG 526 1318
CLRPTR 501 1281
CLS 1C38 7224
CMPFP 17C1 6081
CMPLG1 E84 3716
CMPLOG E82 3714
CMPNUM 17A7 6055
CMPRES EC6 3782
CMPSTR EAE 3758
CN =20 32
CNVNUM 1843 6211
COLD 4E 78
COMMAN =1E26 7718
COMMAND =1915 6421
COMMAND_BACKSPACE=1956 6486
COMMAND_LUT =1883 6275
COMMAND_PROCESS=197C 6524
COMMAND_PROCESS_FOUND=19B7 6583
COMMAND_PROCESS_LOOP=197F 6527
COMMAND_PROCESS_LOOP_STR1=1988 6536
COMMAND_PROCESS_LOOP_STR2=199E 6558
COMMAND_PROCESS_NEXT_ENTRY=19A3 6563
COMMAND_PROCESS_NEXT_ENTRYI=19A2 6562
COMMAND_PROCESS_NOT_FOUND=19AE 6574
COMMAND_READ =1927 6439
COMPL 159B 5531
CONCAT 1309 4873
CONEXP 1873 6259
CONPOS 1532 5426
CONSOLE_INIT =A5 165
CONSOLE_INIT_CTC=A5 165
CONSOLE_INIT_SIO=AD 173
CONT 8C5 2245
CONTAD =1EAE 7854
CONVAR DEA 3562
COS 1B63 7011
COUNT 763 1891
CPYLIT 5F8 1528
CR =0D 13
CRARLP 103E 4158
CREARY 1023 4131
CRESTR A52 2642
CRNCLP 559 1369
CRTMST 11AA 4522
CRTST 11B6 4534
CRTSTE 11CC 4556
CRUNCH 550 1360
CS =0C 12
CSTART 5A 90
CS_APU_CTRL =F9 249
CS_APU_DATA =F8 248
CS_BANK =00 0
CS_CTC_0 =04 4
CS_CTC_1 =05 5
CS_CTC_2 =06 6
CS_CTC_3 =07 7
CS_DIP =01 1
CS_PIA_CR =33 51
CS_PIA_PA =30 48
CS_PIA_PB =31 49
CS_PIA_PC =32 50
CS_PIO_AC =F6 246
CS_PIO_AD =F4 244
CS_PIO_BC =F7 247
CS_PIO_BD =F5 245
CS_SIO_A_C =09 9
CS_SIO_A_D =08 8
CS_SIO_B_C =0B 11
CS_SIO_B_D =0A 10
CTLOFG =1E28 7720
CTRLC =03 3
CTRLG =07 7
CTRLO =0F 15
CTRLQ =11 17
CTRLR =12 18
CTRLS =13 19
CTRLU =15 21
CUROPR =1E9F 7839
CURPOS =1E85 7813
DATA 9F0 2544
DATFLG =1E88 7816
DATLIN =1EA3 7843
DATSNR 3E5 997
DCBCDE 17FD 6141
DD =12 18
DDERR 3F4 1012
DEEK 1C55 7253
DEF 10E6 4326
DEFSIZ 1046 4166
DEINT 901 2305
DEL =7F 127
DELCHR 628 1576
DEPINT 8FB 2299
DHEX_TO_BYTE = 1F6 502
DHEX_TO_BYTE_FAILED= 212 530
DIGTXT 1947 6471
DIM EF0 3824
DIMRET EE7 3815
DINPOS 6EB 1771
DIV 168E 5774
DIV1 =1DED 7661
DIV10 1678 5752
DIV2 =1DF1 7665
DIV3 =1DF5 7669
DIV4 =1DF8 7672
DIVLP 16B5 5813
DIVSUP =1DEC 7660
DOAGN 53F 1343
DOCOM B35 2869
DODEL 608 1544
DOEBIT 1990 6544
DOFN 1113 4371
DOKE 1C60 7264
DONULL B23 2851
DOSPC B5F 2911
DOTAB B4C 2892
DPOINT 186F 6255
DTSTR 11BA 4538
DVBCDE 1690 5776
DZ =14 20
DZERR 3EE 1006
ECHDEL 61C 1564
EDIGIT 18BB 6331
ENDBUF 5FF 1535
ENDCON 1882 6274
ENDDIM 10AC 4268
ENDINP B14 2836
ENDNAM F12 3858
ENDPRG 8A1 2209
ENFMEM 3D1 977
ERRIN 41F 1055
ERRLIN =1EAC 7852
ERRMSG 376 886
ERROR 3FF 1023
ERRORS 2F4 756
ERR_SYNTAX =19CD 6605
ESC =1B 27
EVAL D08 3336
EVAL1 D0B 3339
EVAL2 D14 3348
EVAL3 D17 3351
EVLPAR DD1 3537
EVNOT ED0 3792
EXCUTE 82F 2095
EXEC_RST_08 = D96 3478
EXEC_RST_10 = D9A 3482
EXEC_RST_18 = DA6 3494
EXP 1A37 6711
EXPLP 1861 6241
EXPTAB 1A77 6775
EXPTEN 19A2 6562
EXTIG C67 3175
FANDT C90 3216
FC =08 8
FCERR 916 2326
FDTLP C78 3192
FINDEL 1084 4228
FLGDIF 174A 5962
FLGREL 1751 5969
FNARG =1EBA 7866
FNCTAB 159 345
FNDARY FEE 4078
FNDELP 1089 4233
FNDEND 4D1 1233
FNDNUM 149E 5278
FNDTOK 742 1858
FNDVAR F5B 3931
FNDWRD 583 1411
FNOFST DFB 3579
FNRGNM =1EB8 7864
FNTHR F6D 3949
FNVAL E22 3618
FOPRND D40 3392
FOR 78D 1933
FORFLG =1EA5 7845
FORFND 7C1 1985
FORSLP 7A1 1953
FPADD 14DC 5340
FPBCDE 1579 5497
FPEXP =1EC1 7873
FPINT 17D4 6100
FPMULT 1625 5669
FPREG =1EBE 7870
FPROND 1582 5506
FPSINT 8F5 2293
FRE 10B0 4272
FRENUM 10CC 4300
FRMEVL DED 3565
GARBGE 1248 4680
GARBLP 124B 4683
GETCHR 84F 2127
GETCMD 446 1094
GETHEX 1D5C 7516
GETINT 14A1 5281
GETLEN 138F 5007
GETLN 91C 2332
GETNUM CF6 3318
GETNXT 59E 1438
GETSTR 1353 4947
GETVAR EF5 3829
GNXARY 1283 4739
GOFUNC E2A 3626
GOSUB 999 2457
GOTO 9AA 2474
GRBARY 12A5 4773
GRBDON 121D 4637
GRBLP 1259 4697
GSTRCU 1356 4950
GSTRDE 135A 4954
GSTRHL 1359 4953
GTFLNM 139E 5022
GTFNAM EFA 3834
GTLNLP 91F 2335
GTSIXD 190C 6412
GTVLUS BDA 3034
HALF 19C1 6593
HALFPI 1BB2 7090
HEX 1CEE 7406
HEX1 1D07 7431
HEX2 1D09 7433
HEX3 1D17 7447
HEX4 1D19 7449
HEXIT 1D73 7539
HEXLP 1D4F 7503
HEXLP1 1D54 7508
HEXTFP 1D43 7491
HEX_TO_BIN = 216 534
HEX_TO_BIN_2 = 224 548
HEX_TO_INVALID_2= 22B 555
HLD_END_LOAD 1CC9 7369
HLD_HIGH_RAM 1C8F 7311
HLD_READ 1CB4 7348
HLD_READ_BYTE 1CD4 7380
HLD_READ_CHKSUM 1CBE 7358
HLD_READ_DATA 1CB7 7351
HLD_READ_NIBBLE 1CE5 7397
HLD_WAIT_COLON 1C96 7318
HLOAD 1C77 7287
HX =26 38
HXERR 1D7C 7548
ID =16 22
IDE_CMD_IDENT =EC 236
IDE_CMD_READSEC=20 32
IDE_DEV_TABLE =12FA 4858
IDE_RD =40 64
IDE_REG_ALTSTS =16 22
IDE_REG_CMDSTS =0F 15
IDE_REG_DATA =08 8
IDE_REG_DRVADDR=17 23
IDE_REG_ERROR =09 9
IDE_REG_HCYL =0D 13
IDE_REG_HEAD =0E 14
IDE_REG_LBA0 =0B 11
IDE_REG_LBA1 =0C 12
IDE_REG_LBA2 =0D 13
IDE_REG_LBA3 =0E 14
IDE_REG_LCYL =0C 12
IDE_REG_SECTOR =0A 10
IDE_REG_SSECTOR=0B 11
IDE_RST =80 128
IDE_WR =20 32
IDTEST 1163 4451
IF A97 2711
IFGO AA5 2725
IFJMP 836 2102
IIC_CLK =01 1
IIC_DATA =02 2
INCHL 1790 6032
INCLEN 6E7 1767
INDFND 3AB 939
INEWLN 499 1177
INIT 62 98
INITAB 31E 798
INITBE 375 885
INMSG 37D 893
INP 145E 5214
INPBIN C2C 3116
INPBRK 89E 2206
INPORT =1E22 7714
INPSUB =1E21 7713
INPUT B9A 2970
INRNG 1915 6421
INT 1804 6148
INTVAR 510 1296
INT_VEC =1B 27
INVSGN 1768 5992
IO_AY0_ADDR =40 64
IO_AY0_DATA =41 65
IO_AY1_ADDR =42 66
IO_AY1_DATA =43 67
IO_REG0 =20 32
IO_RTC_AMPM =25 37
IO_RTC_CTR_D =2D 45
IO_RTC_CTR_E =2E 46
IO_RTC_CTR_F =2F 47
IO_RTC_DAY0 =26 38
IO_RTC_DAY1 =27 39
IO_RTC_HOUR =24 36
IO_RTC_MIN0 =22 34
IO_RTC_MIN1 =23 35
IO_RTC_MON0 =28 40
IO_RTC_MON1 =29 41
IO_RTC_SEC0 =20 32
IO_RTC_SEC1 =21 33
IO_RTC_WEEK =2C 44
IO_RTC_YEAR1 =2B 43
IO_RTC_YERR0 =2A 42
ITMSEP C1D 3101
JSTZER 19AC 6572
KILFOR CE6 3302
KILIN 633 1587
LCRFLG =1E86 7814
LEFT 13BB 5051
LEN 138B 5003
LET A07 2567
LETNUM A69 2665
LETSTR A22 2594
LF =0A 10
LFRGNM 1454 5204
LINEAT =1E36 7734
LINEIN 18C7 6343
LINES 1C46 7238
LINESC =1E29 7721
LINESN =1E2B 7723
LINFND 47F 1151
LIST 704 1796
LISTLP 710 1808
LOADFP 1789 6025
LOG 15E4 5604
LOGTAB 15D7 5591
LOKFOR 392 914
LOOPST =1EA1 7841
LS =1C 28
LSTBIN =1EA6 7846
LSTLP2 730 1840
LSTLP3 733 1843
LSTRAM =1E89 7817
LSTRND =1E1D 7709
LTSTND C40 3136
LWIDTH =1E25 7717
MAKINT 14A4 5284
MAKNUM 1936 6454
MANLP 184B 6219
MATCH 5D0 1488
MEMMSG 14E 334
MEM_FAT_AMOUNT =43B8 17336
MEM_FAT_CLUSTERLEN=43BB 17339
MEM_FAT_COUNT1 =43BC 17340
MEM_FAT_CURDIR =43DF 17375
MEM_FAT_CURRDIR=443F 17471
MEM_FAT_DATASTART=43C1 17345
MEM_FAT_DIRSEC =43CD 17357
MEM_FAT_EXEC_COUNT=4445 17477
MEM_FAT_EXEC_CURR=4443 17475
MEM_FAT_EXEC_START=4447 17479
MEM_FAT_FILEREMAIN=43C9 17353
MEM_FAT_OF0_ATTRIBUTE=442F 17455
MEM_FAT_OF0_CCLUST=4431 17457
MEM_FAT_OF0_DATREM=443B 17467
MEM_FAT_OF0_DATSEC=4437 17463
MEM_FAT_OF0_FATSEC=4433 17459
MEM_FAT_RESERVED=43B6 17334
MEM_FAT_ROOTSTART=43C5 17349
MEM_FAT_SECTORS=43B9 17337
MEM_FAT_TMPFNAME=43CF 17359
MEM_FAT_TMPPOINTER=43BD 17341
MEM_IDE_BUFFER =41B6 16822
MEM_IDE_DEVICE =40CB 16587
MEM_IDE_DEV_TABLE=40D5 16597
MEM_IDE_FSBUFFER=43B6 17334
MEM_IDE_PARTITION=40CD 16589
MEM_IDE_POINTER=40D1 16593
MEM_IDE_SELECTED=4115 16661
MEM_IDE_STATUS =40CC 16588
MEM_IDE_STRING_0=4116 16662
MEM_IDE_STRING_1=413E 16702
MEM_IDE_STRING_2=4166 16742
MEM_IDE_STRING_3=418E 16782
MID 13F5 5109
MID1 13C1 5057
MIDNUM 1459 5209
MINCDE 1524 5412
MINUS DD9 3545
MKTMST 11A7 4519
MLDBLP 1826 6182
MLDEBC 181D 6173
MLOOP 7E 126
MLSP10 1723 5923
MO =24 36
MONITR 1C35 7221
MORDT C4C 3148
MORINP 642 1602
MOVBUF 4B8 1208
MOVDIR 5D8 1496
MOVLP 3BA 954
MOVSTR 3B7 951
MOVUP 3B4 948
MRPRNT AB7 2743
MSG_CLEAR = 177 375
MSIZE 7B 123
MUL8LP 1650 5712
MULLN2 161C 5660
MULT 1623 5667
MULT8 1647 5703
MULTEN 188D 6285
MULVAL =1ED0 7888
MVSTPT A5A 2650
NEDMOR BD6 3030
NEGAFT 19D7 6615
NEW 500 1280
NEXITM B6F 2927
NEXT C9B 3227
NEXT1 C9E 3230
NF =00 0
NFERR 3F1 1009
NMIFLG =1E2F 7727
NOCHNG 5C8 1480
NOENED 19AF 6575
NOLIN 8B4 2228
NOMADD 1661 5729
NOMLAD 1834 6196
NOPMPT BB4 2996
NORMAL 154F 5455
NOSPC 5BF 1471
NOSUB7 1D6F 7535
NOSWAP 14FE 5374
NOTAMP DCC 3532
NOTSTR F2D 3885
NOT_IMPLEMENTED=19C6 6598
NOXOR 1484 5252
NSCFOR F3D 3901
NULFLG =1E27 7719
NULL 8D8 2264
NULLP B2A 2858
NULLS =1E24 7716
NUMASC 18DA 6362
NXTARY 1005 4101
NXTBYT 5AE 1454
NXTCHR 5EF 1519
NXTDAT =1EB6 7862
NXTDTA 9EF 2543
NXTITM BCE 3022
NXTOPR =1EAA 7850
NXTSTL 9F6 2550
NXTSTT 9F9 2553
OD =06 6
OKMSG 382 898
OM =0C 12
OMERR 3E0 992
ON A79 2681
ONGO A88 2696
ONGOLP A89 2697
ONJMP 837 2103
OPNPAR D04 3332
OPRND D82 3458
OP_CALL =1A28 6696
OP_CD =1DF8 7672
OP_CLR =1BBC 7100
OP_DASM =1AA9 6825
OP_DIR =1DF4 7668
OP_DUMP =1A48 6728
OP_EXEC =1A0F 6671
OP_FSEXEC =1E15 7701
OP_IIC_IN =1B70 7024
OP_IIC_OUT =1B10 6928
OP_IO_IN =1AD9 6873
OP_IO_OUT =1AEF 6895
OP_LSDSK =1DD1 7633
OP_RTIME =1BC0 7104
OP_SELDSK =1DD5 7637
OP_SET =1A78 6776
OP_STIME =1D58 7512
OS =1A 26
OTKLN 630 1584
OTPORT =1DEA 7658
OUTC 6C7 1735
OUTEXP 19A0 6560
OUTIT 6AE 1710
OUTNBS 6B4 1716
OUTNCR 6EF 1775
OUTSUB =1DE9 7657
OUTWRD 74C 1868
OV =0A 10
OVERR 3FA 1018
OVTST1 1716 5910
OVTST2 171B 5915
OVTST3 171C 5916
PADD 18B6 6326
PAND E44 3652
PASSA 10E1 4321
PBUFF =1EC3 7875
PEEK 14B2 5298
PEND 899 2201
PHLTFP 177D 6013
PLUCDE 158F 5519
PNORM 1557 5463
POKE 14B9 5305
POPAF 123A 4666
POPHL 1375 4981
POPHRT 1375 4981
POPNOK 438 1080
POR E43 3651
POR1 E6B 3691
POS 10DE 4318
POSINT 8F8 2296
POST_CHECK_APU =1E4E 7758
POST_CHECK_IDE_30=1E79 7801
POST_CHECK_IDE_40=1E8C 7820
POST_CHECK_PIO =1E29 7721
POST_START =1E19 7705
POST_TEST_RTC =1EA6 7846
POUT 146A 5226
POWER 19ED 6637
POWER1 19FD 6653
POWER2 1A1F 6687
POWERS 19C5 6597
PRG_RAM_START =4110 16656
PRG_RAM_TOP =FF00 65280
PRINT ABB 2747
PRINTINLINE = 191 401
PRITAB 2DF 735
PRNTCRLF B19 2841
PRNTHL 18CF 6351
PRNTLP ABE 2750
PRNTNB B01 2817
PRNTOK 439 1081
PRNTST B05 2821
PRNUMS 1201 4609
PROCES 65B 1627
PROGND =1EB0 7856
PROGST =1ED3 7891
PROG_MEM_START =4000 16384
PROG_ROM_START = 100 256
PROMPT 543 1347
PRS 1202 4610
PRS1 1205 4613
PRSLP 120C 4620
PSUB 14D7 5335
PTRLP 4C5 1221
PUTBUF 69A 1690
PUTCTL 69F 1695
PUTFID 80C 2060
QTSTLP 11BD 4541
QTSTR 11B7 4535
QUARTR 1BB6 7094
READ BC9 3017
READFG =1EA7 7847
REDO B76 2934
REM 9F2 2546
RESDIV 16C8 5832
RESEED 1B4F 6991
RESET 59 89
RESTNL 873 2163
RESTOR 85E 2142
RESZER 154A 5450
RETADR FB2 4018
RETINT 1756 5974
RETLIN 9EA 2538
RETNAD 5D4 1492
RETNUL FB5 4021
RETNUM DE5 3557
RETREL 1748 5960
RETURN 9CB 2507
RG =04 4
RIGHT 13EB 5099
RIGHT1 13BF 5055
RINPUT =1E31 7729
RLTLP D24 3364
RND 1AD5 6869
RND1 1B19 6937
RND2 1B3D 6973
RNDTAB 1B57 6999
RNGTST 19B2 6578
RONDB 156B 5483
RONDUP 156A 5482
ROUND 14CA 5322
RSCALE 18AB 6315
RSLNBK 784 1924
RSTSTR 140E 5134
RST_00 =00 0
RST_08 =08 8
RST_10 =10 16
RST_18 =18 24
RUN 98D 2445
RUNCNT 810 2064
RUNFST 50C 1292
RUNLIN 9A9 2473
SAVEXP 154B 5451
SAVSTP 803 2051
SAVSTR 1192 4498
SBSCPT FC0 4032
SCALE 15AF 5551
SCALLP 15B1 5553
SCALMI 1876 6262
SCALPL 188C 6284
SCNEND 12E4 4836
SCPTLP FC6 4038
SEARCH 59C 1436
SEED =1DFA 7674
SETIO 148E 5262
SETLIN 75A 1882
SETLIT 5E6 1510
SETPTR 4C0 1216
SETTOP A2 162
SFTPRG 487 1159
SGN 174E 5966
SGNEXP E33 3635
SGNRES =1EC2 7874
SHRITE 15BE 5566
SHRLP 15C1 5569
SHRT1 15C5 5573
SIGNON F5 245
SIGNS 1792 6034
SIN 1B69 7017
SIN1 1B9E 7070
SINTAB 1BBA 7098
SIXDIG 18F7 6391
SMPVAR 126C 4716
SMSER1 1AAC 6828
SN =02 2
SNERR 3EB 1003
SPCFST 18E8 6376
SPCLP B68 2920
SQR 19DC 6620
SRCHLN 4DD 1245
SRCHLP 4E0 1248
SSTSA 1340 4928
ST =1E 30
STACK =1E40 7744
STACK_RAM_TOP =FFFF 65535
STAKFP 1770 6000
STALL 888 2184
START_ADDR =8000 32768
START_ROM =00 0
STKTHS D68 3432
STLOOK =1F37 7991
STOP 897 2199
STORED 967 2407
STPOOL 12B5 4789
STR 1182 4482
STR1 1188 4488
STRADD 12B8 4792
STRBOT =1E9D 7837
STRCONV_BYTES_TO_HEX= 22D 557
STRCONV_BYTES_TO_HEX_1= 23C 572
STRCONV_BYTES_TO_HEX_2= 246 582
STRENT C20 3104
STRSPC =1E34 7732
STR_Banner_Start=264F 9807
STR_PD_HEADER =183C 6204
STTLIN B0C 2828
SUBCDE 14D9 5337
SUBPHL 14D3 5331
SUMLP 1ABD 6845
SUMSER 1A98 6808
SUPTLZ 1984 6532
SVNAM2 F11 3857
SVSTAD 11B0 4528
SYS_BUF_START =4010 16400
SYS_RAM_START =4000 16384
TAN 1BCF 7119
TESTOS 123C 4668
TESTR 121B 4635
TM =18 24
TMERR 3FD 1021
TMPSTR =1E99 7833
TMSTPL =1E8D 7821
TMSTPT =1E8B 7819
TOPOOL 13B7 5047
TOSTRA 1349 4937
TRYAGN 195A 6490
TSALP 134A 4938
TSTBRK 879 2169
TSTMEM 90 144
TSTNUM CF9 3321
TSTOPL 11D8 4568
TSTRED E70 3696
TSTREM 5E9 1513
TSTSGN 173F 5951
TSTSTR CFA 3322
TTYLIN 639 1593
TYPE =1E87 7815
UF =22 34
UFERR 3F7 1015
UL =0E 14
ULERR 9C6 2502
UNITY 15D3 5587
UPDATA 874 2164
USR =1DE6 7654
VAL 1425 5157
VAL1 1443 5187
VAL2 144D 5197
VAL3 1450 5200
VAREND =1EB2 7858
VAR_CONSOLE_BAUD=18 24
VAR_CONSOLE_CONF=0F 15
VDP_MEM =80 128
VDP_REG =81 129
WAIT 1470 5232
WAITLP 1485 5253
WARM 51 81
WARMST DD 221
WIDTH 1C3E 7230
WORDS 18F 399
WORDTB 29B 667
WRKSPC =1DE3 7651
ZDATA =83 131
ZDIV =AC 172
ZEND =80 128
ZEQUAL =B1 177
ZERARY 1064 4196
ZERBYT = 381 897
ZEROLP FA1 4001
ZEROSUP 1D8D 7565
ZFN =A4 164
ZFOR =81 129
ZGOSUB =8C 140
ZGOTO =88 136
ZGTR =B0 176
ZLEFT =CB 203
ZLTH =B2 178
ZMINUS =AA 170
ZNEW =A1 161
ZNOT =A7 167
ZONELP B43 2883
ZOR =AF 175
ZPLUS =A9 169
ZPRINT =9C 156
ZREM =8E 142
ZSGN =B3 179
ZSPC =A5 165
ZSTEP =A8 168
ZTAB =A2 162
ZTHEN =A6 166
ZTIMES =AB 171
ZTO =A3 163
_BASRST_08 20 32
_BASRST_10 2D 45
_BASRST_18 4B 75
_COMMAND_PROCESS_FOUND=19C5 6597
_OP_CALL =1A47 6727
_OP_IIC_ACK_ERR=1B55 6997
_OP_IIC_ACK_ERR_str=1B5C 7004
_OP_IIC_IN_LOOP=1BA2 7074
_OP_IIC_IN_LOOP_TEXT=1BAF 7087
_OP_IIC_OUT_LOOP=1B26 6950
_OP_IIC_OUT_SEND=1B42 6978
_OP_RTIME_NN =1BC3 7107
_OP_RTIME_RD_CMD=1C7B 7291
_OP_SELDSK_INVALID=1DE4 7652
_OP_SELDSK_INVALID_STR=1DFC 7676
_OP_SET_LOOP =1A90 6800
_OP_STIME_INVALID=1D1E 7454
_OP_STIME_PROMPT=1D35 7477
_OP_STIME_PROMPT_ERR=1D4D 7501
_OP_STIME_STR_DAY=1C7C 7292
_OP_STIME_STR_HOUR=1CCD 7373
_OP_STIME_STR_MIN=1CE8 7400
_OP_STIME_STR_MON=1C97 7319
_OP_STIME_STR_SEC=1D03 7427
_OP_STIME_STR_YEAR=1CB2 7346
_POST_CHECK_APU_FAILED=1E6D 7789
_POST_CHECK_IDE_FAILED=1E9F 7839
_POST_CHECK_PIO_FAILED=1E42 7746
_POST_TEST_RTC_INVALID=1EE0 7904
_POST_TEST_RTC_NOTFOUND=1ED9 7897
_STR_NOT_FOUND =19E8 6632
_STR_NOT_IMPLEMENTED=19D4 6612
_STR_SYNTAX =19FC 6652
_WORKSPACE 1DE3 7651
_beep_pause_l1 = DC2 3522
_compare_filename_loop=2313 8979
_compare_filename_nomatch=2321 8993
_eof 9E5E 40542
_fat_cd_navigate=24C4 9412
_fat_cd_navigate_end=250A 9482
_fat_cd_navigate_errfile=2532 9522
_fat_cd_navigate_errfile_str=2564 9572
_fat_cd_navigate_error=251C 9500
_fat_cd_navigate_error_str=253A 9530
_fat_cd_navigate_findsec=24C9 9417
_fat_cd_navigate_findsec_skipslash=24F5 9461
_fat_cd_navigate_goback_fl=2480 9344
_fat_cd_navigate_inerror=252A 9514
_fat_cd_navigate_inerrorS=2524 9508
_fat_cd_navigate_inerrore=252B 9515
_fat_cd_navigate_inputerr_str=2551 9553
_fat_cd_navigate_l2=24FB 9467
_fat_exec_notexec=262B 9771
_fat_exec_notfound=2612 9746
_fat_exec_read_done=25FA 9722
_fat_exec_readloop1=25DC 9692
_fat_get_root_table_invalid=210B 8459
_fat_getfatsec_notroot=214A 8522
_fat_increment_32=2299 8857
_fat_lfs_loop =2211 8721
_fat_lfs_loop_compare_end=224B 8779
_fat_lfs_loop_compare_match=224F 8783
_fat_lfs_loop_compare_next_sector=2223 8739
_fat_math_add32=22AD 8877
_fat_math_mul32=22DE 8926
_fat_math_mul32_l=22E5 8933
_fat_math_mul32_noadd=22F2 8946
_fat_math_sector_add_16=2285 8837
_fat_print_directory_dir=2401 9217
_fat_print_directory_loop=2394 9108
_fat_print_directory_loop_break=245E 9310
_fat_print_directory_loop_file=23B0 9136
_fat_print_directory_loop_next=242C 9260
_fat_print_directory_loop_next_sector=2437 9271
_format_filename_fat16_clean=232A 9002
_format_filename_fat16_loop=2331 9009
_format_filename_fat16_loop_copy=2344 9028
_format_filename_fat16_loop_skip_8=233B 9019
_ideif_drv_sel_fail=15AB 5547
_ideif_drv_sel_fstr0=1668 5736
_ideif_drv_sel_pstr=165F 5727
_ideif_drv_sel_sstr0=1676 5750
_ideif_drv_sel_syn=1683 5763
_ideif_init_drive_found=146E 5230
_ideif_init_drive_loop=1456 5206
_ideif_init_drive_nodrv=1469 5225
_ideif_init_drive_prt_fnd=14D9 5337
_ideif_init_drive_prt_l1=14C7 5319
_ideif_init_drive_prt_ln=14D1 5329
_ideif_prnt_devtable_hdr=15EB 5611
_ideif_prnt_devtable_l1=1366 4966
_ideif_prnt_devtable_l1_e2=142C 5164
_ideif_prnt_devtable_l1_es=13AB 5035
_ideif_prnt_devtable_l1_ms=1429 5161
_ideif_prnt_devtable_l1_nxt=1373 4979
_ideif_prnt_devtable_l1_s00=1399 5017
_ideif_prnt_devtable_l1_s01=139E 5022
_ideif_prnt_devtable_l1_s02=13A3 5027
_ideif_prnt_devtable_l1_sFF=13A8 5032
_ideif_prnt_devtable_l1_sel=1371 4977
_ideif_prnt_devtable_master=164F 5711
_ideif_prnt_devtable_s00=1623 5667
_ideif_prnt_devtable_s01=162E 5678
_ideif_prnt_devtable_s02=1639 5689
_ideif_prnt_devtable_sFF=1644 5700
_ideif_prnt_devtable_slave=1657 5719
_read_bcd_invalid= 14E 334
_shift4 =1DCC 7628
_wait 22 34
beep = DA9 3497
beep_loop = DAB 3499
beep_pause = DC1 3521
com_header 8000 32768
com_prg 8040 32832
compare_filename=230F 8975
dasm_00 = 9AE 2478
dasm_01 = C9A 3226
dasm_02 = A34 2612
dasm_03 = C6C 3180
dasm_08 = AB1 2737
dasm_09 = C3F 3135
dasm_0A = A16 2582
dasm_0B = C83 3203
dasm_10 = 9F6 2550
dasm_12 = A3F 2623
dasm_18 = 9B9 2489
dasm_1A = A20 2592
dasm_20 = 9D3 2515
dasm_22 = CE0 3296
dasm_27 = A79 2681
dasm_28 = 9CC 2508
dasm_2A = CB1 3249
dasm_2F = A7D 2685
dasm_30 = 9C4 2500
dasm_32 = A4A 2634
dasm_37 = A89 2697
dasm_38 = 9BD 2493
dasm_3A = A2A 2602
dasm_3F = A85 2693
dasm_76 = A8D 2701
dasm_80C6 = B0A 2826
dasm_BE = AA7 2727
dasm_C3 = 9B2 2482
dasm_C88E = B30 2864
dasm_C9 = A02 2562
dasm_CD = 9FC 2556
dasm_D9 = ABE 2750
dasm_DD = 9E4 2532
dasm_DD_01 = CA1 3233
dasm_DD_09 = C5A 3162
dasm_DD_22 = CF6 3318
dasm_DD_23 = C71 3185
dasm_DD_2A = CC8 3272
dasm_DD_2B = C88 3208
dasm_DD_34 = C0A 3082
dasm_DD_35 = C27 3111
dasm_DD_86 = B12 2834
dasm_DD_8E = B38 2872
dasm_DD_96 = B5B 2907
dasm_DD_9E = B7B 2939
dasm_DD_A6 = B9C 2972
dasm_DD_AE = BD3 3027
dasm_DD_B6 = BB8 3000
dasm_DD_BE = BEF 3055
dasm_DD_E1 = D48 3400
dasm_DD_E3 = ACE 2766
dasm_DD_E5 = D32 3378
dasm_DD_F9 = D18 3352
dasm_E1 = D42 3394
dasm_E3 = AC2 2754
dasm_E5 = D2C 3372
dasm_E9 = 9DB 2523
dasm_ED_42 = C51 3153
dasm_ED_43 = CEC 3308
dasm_ED_44 = A81 2689
dasm_ED_45 = A0C 2572
dasm_ED_46 = A98 2712
dasm_ED_4A = C48 3144
dasm_ED_4B = CBD 3261
dasm_ED_4D = A07 2567
dasm_ED_56 = A9D 2717
dasm_ED_5E = AA2 2722
dasm_ED_A0 = AE6 2790
dasm_ED_A1 = AF8 2808
dasm_ED_A8 = AEF 2799
dasm_ED_A9 = B01 2817
dasm_ED_B0 = AEA 2794
dasm_ED_B1 = AFC 2812
dasm_ED_B8 = AF3 2803
dasm_ED_B9 = B05 2821
dasm_F3 = A92 2706
dasm_F9 = D0E 3342
dasm_FB = A95 2709
dasm_FD = 9ED 2541
dasm_FD_01 = CA9 3241
dasm_FD_09 = C63 3171
dasm_FD_22 = D02 3330
dasm_FD_23 = C7A 3194
dasm_FD_2A = CD4 3284
dasm_FD_2B = C91 3217
dasm_FD_34 = C16 3094
dasm_FD_35 = C33 3123
dasm_FD_86 = B21 2849
dasm_FD_8E = B47 2887
dasm_FD_96 = B67 2919
dasm_FD_9E = B89 2953
dasm_FD_A6 = BA8 2984
dasm_FD_AE = BDF 3039
dasm_FD_B6 = BC3 3011
dasm_FD_BE = BFA 3066
dasm_FD_E1 = D50 3408
dasm_FD_E3 = ADA 2778
dasm_FD_E5 = D3A 3386
dasm_FD_F9 = D22 3362
dasm_FF = A11 2577
dasm_UU = D58 3416
dasm_UW = D5C 3420
dasm__AND = B97 2967
dasm__CP = BEB 3051
dasm__DEC = C22 3106
dasm__ED_47 = A69 2665
dasm__ED_4F = A71 2673
dasm__ED_57 = A59 2649
dasm__ED_5F = A61 2657
dasm__INC = C05 3077
dasm__LD = A55 2645
dasm__OR = BB4 2996
dasm__SBC = B73 2931
dasm__SUB = B56 2902
dasm__XOR = BCE 3022
dasm_opcode_table= 556 1366
dasm_print16hex_addr= 383 899
dasm_print8hex = 39B 923
dasm_printFlags_table= D61 3425
dasm_printRegister8_table= D71 3441
dasm_printRegister8_table_HL= D91 3473
dasm_printRegisterIX_table= D79 3449
dasm_printRegisterIY_table= D81 3457
dasm_printRegisterSP_table= D89 3465
disassemble = 247 583
disassemble_continue= 32D 813
disassemble_err= 31D 797
disassemble_next= 24B 587
disassemble_print_opcode_params_end= 31A 794
disassemble_print_opcode_params_loop= 2C6 710
disassemble_print_opcode_raw= 288 648
disassemble_print_opcode_raw_fill= 29C 668
disassemble_table_first_match= 35F 863
disassemble_table_found= 379 889
disassemble_table_notfound= 37D 893
disassemble_table_seek= 33B 827
disassemble_table_seek_loop= 33F 831
dump_pretty =17E1 6113
dump_pretty_ascii=180B 6155
dump_pretty_ascii_cont=1829 6185
dump_pretty_ascii_loop=1813 6163
dump_pretty_ascii_none=1824 6180
dump_pretty_col=17FE 6142
dump_pretty_end=183B 6203
dump_pretty_nextrow=182F 6191
dump_pretty_row=17E9 6121
endPrint = 19F 415
fat_cd_single =2460 9312
fat_copy_lba_pointer=2306 8966
fat_exec =257B 9595
fat_get_root_table=203E 8254
fat_getfatsec =2133 8499
fat_openfile =21E4 8676
fat_openfile_noprepare=21EC 8684
fat_print_directory=234B 9035
fat_readfilesec=21B9 8633
fat_reset_pointer=22F7 8951
format_filename_fat16=2325 8997
ide_printerror = E89 3721
ide_readsector_256= E15 3605
ide_readsector_256_waitloop= E17 3607
ide_readsector_512_inv= E3E 3646
ide_readsector_512_inv_waitloop= E43 3651
ide_readsector_timeout= E73 3699
ide_regread_8 = DF7 3575
ide_regwrite_8 = DDB 3547
ide_reset = DCE 3534
ide_writesector_256= E88 3720
ideif_drv_sel =1573 5491
ideif_get_drv_pointer=151C 5404
ideif_init_all =1530 5424
ideif_init_devtable=133A 4922
ideif_init_drive=144D 5197
ideif_prnt_devtable=1358 4952
iic_init =16F5 5877
iic_read_ack =1734 5940
iic_receive_buffer=16C6 5830
iic_receive_buffer_done=16E9 5865
iic_receive_buffer_err=16EF 5871
iic_receive_buffer_loop=16D7 5847
iic_receive_byte=17BA 6074
iic_receive_byte_loop=17C7 6087
iic_send_ack =175A 5978
iic_send_buffer=169C 5788
iic_send_buffer_done=16BA 5818
iic_send_buffer_err=16C0 5824
iic_send_buffer_loop=16AC 5804
iic_send_byte =1794 6036
iic_send_byte_loop=17A0 6048
iic_send_ebit =1713 5907
iic_send_nack =1777 6007
iic_send_sbit =16FE 5886
mon_var_template=44 68
mon_var_template_end= 40F 1039
nxtILC = 194 404
param_01 = 3A9 937
param_02 = 3D0 976
param_03 = 3ED 1005
param_03_done = 425 1061
param_03_neg = 40E 1038
param_04 = 429 1065
param_04_i = 439 1081
param_05 = 43F 1087
param_06 = 44C 1100
param_07 = 466 1126
param_08 = 473 1139
param_09 = 488 1160
param_09_0A = 48E 1166
param_0A = 47F 1151
param_10 = 49D 1181
param_11 = 4AD 1197
param_11_12 = 4BC 1212
param_11_12_all= 4DC 1244
param_11_12_def= 4CF 1231
param_11_12_ix = 4D4 1236
param_11_12_iy = 4D9 1241
param_12 = 4B5 1205
param_13 = 4ED 1261
param_80 = 50C 1292
param_80_seek = 513 1299
param_81 = 503 1283
param_comma = 547 1351
param_printRegister= 522 1314
param_printRegisterA= 540 1344
param_printRegisterHL= 538 1336
prg_end 9E5E 40542
prg_start 807B 32891
print_16_hex = 16A 362
print_32_hex = 151 337
print_a_hex = 10E 270
print_bcd = 120 288
print_char =DE 222
print_clear =F1 241
print_newLine =F8 248
print_reg = 1A4 420
print_str =E6 230
print_str_end =F0 240
print_str_fixed=187B 6267
print_wait_out = 103 259
read_bcd = 138 312
read_char = 126 294
read_lba_sector=1543 5443
str_dev_done =15E3 5603
str_dev_waitready=15CB 5579
str_error_start= EBC 3772
str_error_start1= ED9 3801
str_error_start2= EE2 3810
str_error_time = EEB 3819
str_post_apu =1F38 7992
str_post_ide_30=1EE7 7911
str_post_ide_40=1F02 7938
str_post_nd =1F6E 8046
str_post_ok =1FA6 8102
str_post_pio =1F1D 7965
str_post_rtc =1F53 8019
str_post_rtc_iv=1F7C 8060
var_apu_present=400A 16394
var_buffer_len =4000 16384
var_bytes_count=411A 16666
var_curserchar =4006 16390
var_curserlastaddr=4007 16391
var_curseron =4005 16389
var_curserstate=4004 16388
var_curserx =4002 16386
var_cursery =4003 16387
var_dir =402B 16427
var_idebuffer =40CB 16587
var_input =407B 16507
var_last_char =4001 16385
var_opcode =4114 16660
var_opcode_length=4116 16662
var_opcode_pcount=4119 16665
var_opcode_start=4110 16656
var_opcode_string=4117 16663
var_opcode_table=4112 16658
var_opcode_x =4115 16661
var_pio_present=4009 16393
var_ps2mem =401B 16411
var_scratch =400B 16395