PAGE 01 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 002 ORG :E859 003 * 004 * 005 * 006 ****************************** 007 * CHECK STATEMENT TERMINATOR * 008 ****************************** 009 * 010 * Get character from line and checks if it is 011 * a correct terminator (':' or car.ret). 012 * 013 * Exit: Z=1: correct terminator. 014 * Z=0: incorrect. 015 * BCDEHL preserved. A corrupted. 016 * 017 E859 CDD2DD TSEOC CALL :DDD2 Get char from line, neglect 018 tab + space 019 E85C FE3A CPI :3A Is it ':' ? 020 E85E C8 RZ 021 E85F FE0D CPI :0D Is it 'CR' ? 022 E861 C9 RET 023 * 024 ********************************** 025 * CHECK IF NEXT CHARACTER IS ',' * 026 ********************************** 027 * 028 * Exit: C updated, AF corrupted, BDEHL preserved. 029 * 030 E862 CD67E8 L3E131 CALL :E867 Check if next char is ',' 031 E865 2C DATA :2C 032 E866 C9 RET 033 * 034 ************************ 035 * CHECK NEXT CHARACTER * 036 ************************ 037 * 038 * Routine finds next valid character in input. If 039 * it is not the character expected: syntax error. 040 * 041 * Entry: C : Points to input. 042 * ASCII-value of character to compare with 043 * on stack. 044 * Exit: If correct: C updated, AF corrupted, 045 * BDEHL preserved. 046 * 047 E867 E3 ECHRI XTHL HL pnts to expected char 048 E868 CDD2DD CALL :DDD2 Get char from line, neglect 049 tab + space 050 E86B BE CMP M Is it expected one ? 051 E86C C20BDA JNZ :DA0B Run 'SYNTAX ERROR' if not 052 E86F 0C INR C Pnts to next input 053 E870 23 INX H ) 054 E871 E3 XTHL ) Update SP 055 E872 C9 RET 056 * 057 ******************************* 058 * ENCODE 'ERASE' - (not used) * 059 ******************************* 060 * 061 * The BASIC command 'ERASE' is cancelled. 062 * 063 E873 1178E6 L3E133 LXI D,:E678 Addr routine encode array PAGE 02 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 064 without arguments 065 E876 C32AE1 JMP :E12A Encode 066 * 067 ****************************** 068 * INPUT FPT NUMBER INTO MACC * 069 ****************************** 070 * 071 * Entry: Z=1: Change sign too. 072 * Exit: C updated, ABDEHL preserved. 073 * CY=0: Error. 074 * 075 E879 CD1EC0 L3E134 CALL :C01E Input FPT number to MACC 076 E87C C0 RNZ Ready if Z=0 077 E87D E7 RST 4 Else change sign MACC 078 E87E 1B DATA :1B 079 E87F C9 RET 080 * 081 ******************************* 082 * STORE QUOTED TEXT INTO EBUF * 083 ******************************* 084 * 085 * Entry: C points to 1st '"'. 086 * 087 E880 0C L3E135 INR C 088 E881 C39CE6 JMP :E69C Store text in EBUF 089 * 090 ******************************** 091 * STORE A HEX NUMBER INTO EBUF * 092 ******************************** 093 * 094 * Entry: C points to '#' of hex number. 095 * 096 E884 0C EHEX INR C 097 E885 C390E5 JMP :E590 Hex nr into EBUF 098 * 099 ********************************** 100 * ENCODE AN INT NUMBER INTO EBUF * 101 ********************************** 102 * 103 E888 CDAFE8 L3E137 CALL :E8AF #14 into EBUF 104 E88B FE23 CPI :23 '#' ? 105 E88D CA99E8 JZ :E899 Then jump 106 E890 CD7BE5 CALL :E57B INT nr into EBUF 107 E893 D2B7E8 L3E139 JNC :E8B7 Evt run 'SYNTAX ERROR' 108 E896 C35CE1 JMP :E15C Quit 109 110 * If hex number: 111 112 E899 CD84E8 L3E138 CALL :E884 Hex nr into EBUF 113 E89C C393E8 JMP :E893 114 * 115 E89F FF DATA :FF 116 E8A0 FF DATA :FF 117 E8A1 FF DATA :FF 118 * 119 ***************** 120 * ENCODE 'DATA' * 121 ***************** 122 * 123 E8A2 7D EDATA MOV A,L 124 E8A3 FE42 CPI :42 125 E8A5 C20BDA JNZ :DA0B Run 'SYNTAX ERROR' if not PAGE 03 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 126 E8A8 C366E3 JMP :E366 Encode text 127 * 128 ******************************** 129 * part of END ENCODING (3E6B5) * 130 ******************************** 131 * 132 E8AB 1C L3E140 INR E 133 E8AC C3C8E6 JMP :E6C8 134 * 135 ********************************* 136 * CODE FOR INT NUMBER INTO EBUF * 137 ********************************* 138 * 139 * Gets also next character to encode. 140 * 141 E8AF 3614 L3E141 MVI M,:14 INT code (#14) in EBUF 142 E8B1 CD18E0 CALL :E018 Update EBUF pointer 143 E8B4 C3D2DD JMP :DDD2 Get char from line, neglect 144 tab + space 145 * 146 ************************************************* 147 * ERROR EXIT OF ENCODE INT NR INTO EBUF (3E888) * 148 ************************************************* 149 * 150 E8B7 2A3201 L3E142 LHLD :0132 Get EFEPT 151 E8BA 11FCFF LXI D,:FFFC 152 E8BD 19 DAD D Set back linepntr 153 E8BE 220001 SHLD :0100 Store start current line 154 E8C1 C30BDA JMP :DA0B Run 'SYNTAX ERROR' 155 * 156 E8C4 FF DATA :FF 157 * 158 ************************************** 159 * ASCII TABLE UPPER CASE (UNSHIFTED) * 160 ************************************** 161 * 162 E8C5 30 KEYTU DATA :30 0 163 E8C6 31 DATA :31 1 164 E8C7 32 DATA :32 2 165 E8C8 33 DATA :33 3 166 E8C9 34 DATA :34 4 167 E8CA 35 DATA :35 5 168 E8CB 36 DATA :36 6 169 E8CC 37 DATA :37 7 170 E8CD 38 DATA :38 8 171 E8CE 39 DATA :39 9 172 E8CF 3A DATA :3A : 173 E8D0 3B DATA :3B ; 174 E8D1 2C DATA :2C , 175 E8D2 2D DATA :2D - 176 E8D3 2E DATA :2E . 177 E8D4 2F DATA :2F / 178 E8D5 0D DATA :0D car ret 179 E8D6 41 DATA :41 A 180 E8D7 42 DATA :42 B 181 E8D8 43 DATA :43 C 182 E8D9 44 DATA :44 D 183 E8DA 45 DATA :45 E 184 E8DB 46 DATA :46 F 185 E8DC 47 DATA :47 G 186 E8DD 48 DATA :48 H 187 E8DE 49 DATA :49 I PAGE 04 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 188 E8DF 4A DATA :4A J 189 E8E0 4B DATA :4B K 190 E8E1 4C DATA :4C L 191 E8E2 4D DATA :4D M 192 E8E3 4E DATA :4E N 193 E8E4 4F DATA :4F O 194 E8E5 50 DATA :50 P 195 E8E6 51 DATA :51 Q 196 E8E7 52 DATA :52 R 197 E8E8 53 DATA :53 S 198 E8E9 54 DATA :54 T 199 E8EA 55 DATA :55 U 200 E8EB 56 DATA :56 V 201 E8EC 57 DATA :57 W 202 E8ED 58 DATA :58 X 203 E8EE 59 DATA :59 Y 204 E8EF 5A DATA :5A Z 205 E8F0 5B DATA :5B [ 206 E8F1 5E DATA :5E ^ 207 E8F2 20 DATA :20 space 208 E8F3 00 DATA :00 (rept) 209 E8F4 08 DATA :08 char del 210 E8F5 10 DATA :10 cursor up 211 E8F6 11 DATA :11 cursor down 212 E8F7 12 DATA :12 cursor left 213 E8F8 13 DATA :13 cursor right 214 E8F9 09 DATA :09 tab 215 E8FA 80 DATA :80 ctrl 216 E8FB 00 DATA :00 (break) 217 E8FC 00 DATA :00 (shift) 218 * 219 ************************************ 220 * ASCII TABLE LOWER CASE (SHIFTED) * 221 ************************************ 222 * 223 E8FD 30 KEYTS DATA :30 0 224 E8FE 21 DATA :21 ! 225 E8FF 22 DATA :22 " 226 E900 23 DATA :23 # 227 E901 24 DATA :24 $ 228 E902 25 DATA :25 % 229 E903 26 DATA :26 & 230 E904 27 DATA :27 ' 231 E905 28 DATA :28 ( 232 E906 29 DATA :29 ) 233 E907 2A DATA :2A * 234 E908 2B DATA :2B + 235 E909 3C DATA :3C < 236 E90A 3D DATA :3D = 237 E90B 3E DATA :3E > 238 E90C 3F DATA :3F ? 239 E90D 0D DATA :0D car ret 240 E90E 61 DATA :61 a 241 E90F 62 DATA :62 b 242 E910 63 DATA :63 c 243 E911 64 DATA :64 d 244 E912 65 DATA :65 e 245 E913 66 DATA :66 f 246 E914 67 DATA :67 g 247 E915 68 DATA :68 h 248 E916 69 DATA :69 i 249 E917 6A DATA :6A j PAGE 05 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 250 E918 6B DATA :6B k 251 E919 6C DATA :6C l 252 E91A 6D DATA :6D m 253 E91B 6E DATA :6E n 254 E91C 6F DATA :6F o 255 E91D 70 DATA :70 p 256 E91E 71 DATA :71 q 257 E91F 72 DATA :72 r 258 E920 73 DATA :73 s 259 E921 74 DATA :74 t 260 E922 75 DATA :75 u 261 E923 76 DATA :76 v 262 E924 77 DATA :77 w 263 E925 78 DATA :78 x 264 E926 79 DATA :79 y 265 E927 7A DATA :7A z 266 E928 5D DATA :5D ] 267 E929 7E DATA :7E ~ 268 E92A 20 DATA :20 space 269 E92B 00 DATA :00 (rept) 270 E92C 08 DATA :08 char del 271 E92D 14 DATA :14 window up 272 E92E 15 DATA :15 window down 273 E92F 16 DATA :16 window left 274 E930 17 DATA :17 window right 275 E931 09 DATA :09 tab 276 E932 80 DATA :80 ctrl 277 E933 00 DATA :00 (break) 278 E934 00 DATA :00 (shift) 279 * 280 ************************************ 281 * GET INPUTS FROM KEYBOARD OR DINC * 282 ************************************ 283 * 284 * Part of RESET (C719). Determines input source 285 * depending on 1st input done. 286 * 287 E935 CDBBD6 L3E143 CALL :D6BB Scan keyb; char in A 288 E938 D8 RC Ready if break pressed 289 E939 C0 RNZ Ready if key input done 290 E93A C3F4EF JMP :EFF4 Else: Get input from DINC 291 * 292 E93D FF DATA :FF 293 E93E FF DATA :FF 294 * 295 ********************************************** 296 * LOAD ASCII VALUE FOR KEY PRESSED IN BUFFER * 297 ********************************************** 298 * 299 * From the key pressed, the offset to the start- 300 * address of the ASCII table is calculated. The 301 * ASCII value for the pressed key is stored in 302 * the circular buffer KLIND. 303 * 304 * Entry: B : Column number. 305 * C : Row number. 306 * Exit: All registers preserved. 307 * 308 E93F F5 INKEY PUSH PSW 309 E940 C5 PUSH B 310 E941 E5 PUSH H 311 E942 3E07 MVI A,:07 ) PAGE 06 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 312 E944 90 SUB B ) 313 E945 87 ADD A ) Calc offset of startaddr 314 E946 87 ADD A ) for key pressed. 315 E947 87 ADD A ) Store it in C 316 E948 81 ADD C ) 317 E949 4F MOV C,A ) 318 E94A 2AA702 LHLD :02A7 Get startaddr ASCII table 319 E94D 0600 MVI B,:00 320 E94F FE11 CPI :11 ) 321 E951 DA5DE9 JC :E95D ) Check if key is a char 322 E954 FE2B CPI :2B ) A-Z 323 E956 D25DE9 JNC :E95D ) 324 E959 3AC302 LDA :02C3 Get shift lock value 325 E95C 47 MOV B,A in B 326 E95D 3AB002 L3E145 LDA :02B0 Get 'shift' byte 327 E960 A8 XRA B Take CTRL into account 328 E961 E640 ANI :40 A=#40 if shift, 00 when not 329 E963 CA6CE9 JZ :E96C Jump if no shift 330 E966 D5 PUSH D 331 E967 113800 LXI D,:0038 Add. offset for lower case 332 table 333 E96A 19 DAD D Startaddr lower case table 334 now in HL 335 E96B D1 POP D 336 E96C 0600 L3E146 MVI B,:00 337 E96E 09 DAD B Add offset to startaddr 338 E96F 7E MOV A,M Get ASCII value from table 339 E970 B7 ORA A Check if Break, Rept, Shift 340 E971 CA8EE9 JZ :E98E Then Pop, ret 341 E974 FE80 CPI :80 Check if CTRL 342 E976 CA92E9 JZ :E992 Then update CTRL flag 343 E979 47 MOV B,A Store ASCII value in B 344 E97A 2ABE02 LHLD :02BE Get addr next pos in KLIND 345 E97D E5 PUSH H Store KLIIN on stack 346 E97E CD9CD6 CALL :D69C Update KLIND pointer 347 E981 3AC002 LDA :02C0 Get lsbyte next output pos 348 of KLIND 349 E984 BD CMP L Compare with KLIIN 350 E985 CA8DE9 JZ :E98D Abort if buffer full 351 E988 22BE02 SHLD :02BE Update KLIIN 352 E98B E3 XTHL Get old KLIIN from stack 353 E98C 70 MOV M,B Store ASCII char in KLIND 354 E98D E1 L3E147 POP H 355 E98E E1 L3E148 POP H 356 E98F C1 POP B 357 E990 F1 POP PSW 358 E991 C9 RET 359 360 * Update CTRL flag: 361 362 E992 3AC302 L3E149 LDA :02C3 Get shiftlock value 363 E995 2F CMA Invert it 364 E996 32C302 STA :02C3 And store it again 365 E999 C38EE9 JMP :E98E Pop, ret 366 * 367 **************** 368 * HEAP REQUEST * 369 **************** 370 * 371 * The routine checks the heap for free areas. Evt. 372 * consecutive free areas are consolidated. If this 373 * procedure finds a free area min. 2 bytes larger PAGE 07 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 374 * than requested, then it is reserved by setting 375 * the length bytes (msb=0). An evt. resting free 376 * area is set with length bytes and msb=1 (this 377 * area must be >= 2 bytes). 378 * The heap contents is never moved to obtain one 379 * large consolidated area of free bytes!! 380 * 381 * Entry: DE: Length requested heap space. 382 * Exit: AFBCDE preserved. 383 * HL: Points to a 2-byte length of the re- 384 * quested gap. If no space available, 385 * it points to an error routine. 386 * 387 E99C F5 HREQ PUSH PSW 388 E99D C5 PUSH B 389 E99E D5 PUSH D 390 E99F 42 MOV B,D ) Reqd length in BC 391 E9A0 4B MOV C,E ) 392 E9A1 2A9B02 LHLD :029B Get startaddr Heap 393 E9A4 56 HRQ10 MOV D,M ) 394 E9A5 23 INX H ) Contents 1st 2 bytes of 395 E9A6 5E MOV E,M ) Heap in DE (length) 396 E9A7 23 INX H ) 397 E9A8 7A MOV A,D 1st byte in A 398 E9A9 E67F ANI :7F Mask bit 'free/used' 399 E9AB BA CMP D 400 E9AC 57 MOV D,A D is length without msb 401 E9AD CA27D2 JZ :D227 If area not free: check if 402 end of heap reached. JMP 403 #E9FA if not 404 405 * If free area found: Check all next heap entries 406 * and accumulate all free areas in succession: 407 408 E9B0 E5 HRQ20 PUSH H Save startaddr area +2 409 E9B1 19 DAD D Begin next area in HL 410 E9B2 7E MOV A,M 411 E9B3 B7 ORA A Check msb of this area 412 E9B4 F2C7E9 JP :E9C7 Jump if area occupied 413 E9B7 23 INX H 414 E9B8 7B MOV A,E 415 E9B9 86 ADD M Add lobyte length next area 416 length previous area 417 E9BA 5F MOV E,A 418 E9BB 7A MOV A,D 419 E9BC 2B DCX H 420 E9BD 8E ADC M Add hibyte length next area 421 length previous area 422 E9BE E67F ANI :7F Skip bit 'free/occupied' 423 E9C0 57 MOV D,A 424 E9C1 13 INX D 425 E9C2 13 INX D Add 2 extra bytes 426 E9C3 E1 POP H Restore start free area +2 427 E9C4 C3B0E9 JMP :E9B0 Check next area 428 429 * Next area is not free: 430 431 E9C7 E1 HRQ30 POP H Restore start free area +2 432 E9C8 E5 PUSH H 433 E9C9 2B DCX H 434 E9CA 73 MOV M,E ) 435 E9CB 2B DCX H ) Store total free length in PAGE 08 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 436 E9CC 7A MOV A,D ) 1st 2 bytes of free area 437 E9CD F680 ORI :80 ) 438 E9CF 77 MOV M,A ) 439 Space available here: HL pnt 440 to start free area +2; DE is 441 size free area; BC size reqd 442 E9D0 7B MOV A,E ) 443 E9D1 91 SUB C ) 444 E9D2 6F MOV L,A ) Calc free length - reqd. 445 E9D3 7A MOV A,D ) length; result in HL 446 E9D4 98 SBB B ) 447 E9D5 67 MOV H,A ) 448 E9D6 FAF9E9 JM :E9F9 Space not sufficient: Leave 449 consolidated area as free 450 E9D9 C2E4E9 JNZ :E9E4 Jump if sufficient space 451 E9DC B5 ORA L 452 E9DD CAF0E9 JZ :E9F0 Jump if just enough 453 E9E0 3D DCR A 454 E9E1 CAF9E9 JZ :E9F9 Not useable if 1 free byte 455 left 456 457 * Set not used part of free area to free: 458 459 E9E4 EB HRQ40 XCHG Addr free area in DE 460 E9E5 1B DCX D 461 E9E6 1B DCX D Reserve 2 bytes for length 462 E9E7 E1 POP H Restore start free area +2 463 E9E8 E5 PUSH H 464 E9E9 09 DAD B Add reqd length to find 465 start of resting free area 466 E9EA 7A MOV A,D 467 E9EB F680 ORI :80 Set free flag 468 E9ED 77 MOV M,A ) 469 E9EE 23 INX H ) Length free area into heap 470 E9EF 73 MOV M,E ) 471 472 * Reserve area for requested entry: 473 474 E9F0 E1 HRQ50 POP H Restore start free area +2 475 E9F1 2B DCX H 476 E9F2 71 MOV M,C ) 477 E9F3 2B DCX H ) Reqd length in 1st 2 bytes 478 E9F4 70 MOV M,B ) 479 E9F5 D1 POP D 480 E9F6 C1 POP B 481 E9F7 F1 POP PSW 482 E9F8 C9 RET 483 484 * Area too small: 485 486 E9F9 E1 HRQ70 POP H Restore start free area 487 E9FA 19 HRQ75 DAD D HL pnts to next area 488 E9FB C3A4E9 JMP :E9A4 Check next area 489 490 E9FE FF DATA :FF 491 E9FF FF DATA :FF 492 * 493 * 494 * 495 * 496 EA00 END PAGE 09 DAI FIRMWARE 3E859-3E9FF V1.0 Rev.1 *************************** * S Y M B O L T A B L E * *************************** ECHRI E867 EDATA E8A2 EHEX E884 HREQ E99C HRQ10 E9A4 HRQ20 E9B0 HRQ30 E9C7 HRQ40 E9E4 HRQ50 E9F0 HRQ70 E9F9 HRQ75 E9FA INKEY E93F KEYTS E8FD KEYTU E8C5 L3E131 E862 L3E133 E873 L3E134 E879 L3E135 E880 L3E137 E888 L3E138 E899 L3E139 E893 L3E140 E8AB L3E141 E8AF L3E142 E8B7 L3E143 E935 L3E145 E95D L3E146 E96C L3E147 E98D L3E148 E98E L3E149 E992 TSEOC E859