6500 lines
393 KiB
Plaintext
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
|