PAGE 01 DAI FIRMWARE 0E016-0E1F4 V1.1 002 ORG :E016 003 * 004 * 005 * 006 ************************** 007 * RUN basiccmd WAIT TIME * 008 ************************** 009 * 010 * Timer 01BE/BF is decremented by clock 011 * interrupt RST7. 012 * 013 E016 CDF8E6 RWTET CALL :E6F8 Get time to wait 014 E019 22BE01 SHLD :01BE Load timer 015 E01C 2ABE01 RWT40 LHLD :01BE Get timer 016 E01F 7C MOV A,H 017 E020 B5 ORA L 018 E021 C8 RZ Abort if (timer)=0 019 E022 CDA5D6 CALL :D6A5 Check keyb for new inputs 020 E025 D21CE0 JNC :E01C Again if no break pressed 021 022 * If suspended: 023 024 E028 C312E0 JMP :E012 Abort, 'command broken in' 025 * 026 *************************************** 027 * RUN basiccmd FOR .. TO .. (STEP ..) * 028 *************************************** 029 * 030 E02B D1 RFOR POP D Kill return addr 031 E02C CD3CE1 CALL :E13C Save old FRAME on stack 032 E02F CD5AE4 CALL :E45A Init variable 033 E032 220401 SHLD :0104 Remember location variable 034 E035 E630 ANI :30 035 E037 D610 SUI :10 Set flags for var.type 036 E039 CD08E8 CALL :E808 Eval TO expr, result in MACC 037 E03C CAA2E0 JZ :E0A2 If INT variable 038 039 * If FPT variable: 040 041 E03F E7 RST 4 Subtract 'FROM' 042 E040 03 DATA :03 043 E041 210601 LXI H,:0106 Get addr. LSTPF 044 E044 3600 MVI M,:00 Default STEP implicit 045 E046 0A LDAX B Get evt. STEP val. from text 046 E047 03 INX B 047 E048 FEFF CPI :FF 048 E04A CA5FE0 JZ :E05F Jump if no STEP 049 050 * If STEP: 051 052 E04D CD18C0 CALL :C018 Save 'to-from' on stack 053 E050 34 INR M Stepflag explicit 054 E051 0B DCX B 055 E052 CD08E8 CALL :E808 Stepvalue in MACC 056 E055 210701 LXI H,:0107 Addr. LSTEP 057 E058 E7 RST 4 Stepvalue in LSTEP 058 E059 0F DATA :0F 059 E05A CD1BC0 CALL :C01B 'to-from' range in MACC 060 E05D E7 RST 4 Find nr of iterations 061 E05E 09 DATA :09 062 E05F E7 RFR10 RST 4 Make it INT 063 E060 48 DATA :48 PAGE 02 DAI FIRMWARE 0E016-0E1F4 V1.1 064 E061 210B01 RFR20 LXI H,:010B Addr. LCOUNT 065 E064 E7 RST 4 Iterations in LCOUNT 066 E065 0F DATA :0F 067 E066 7E MOV A,M 068 E067 B7 ORA A 069 E068 FC9ECB CM :CB9E Clear LCOUNT if loop in 070 wrong direction 071 E06B 60 MOV H,B ) Current pos in start of 072 E06C 69 MOV L,C ) loop in HL 073 E06D 220F01 SHLD :010F Set pointer to start loop 074 075 * Now delete any previous use of the loop: 076 077 E070 011000 LXI B,:0010 Size of 1 'FOR' stackframe 078 E073 2A0401 LHLD :0104 Get current loop variable 079 E076 EB XCHG in DE 080 E077 210000 LXI H,:0000 081 E07A 39 DAD SP Stack start 082 E07B C37FE0 JMP :E07F Into loop 083 084 * Loop: 085 086 E07E 09 RFR30 DAD B Up 1 frame 087 E07F 7E RFR40 MOV A,M 088 E080 23 INX H 089 E081 B6 ORA M 090 E082 CA9FE0 JZ :E09F Jump if top of stack 091 E085 7E MOV A,M 092 E086 2B DCX H 093 E087 BA CMP D Comp top byte variable addr 094 E088 C27EE0 JNZ :E07E Again if not the same 095 E08B 7E MOV A,M 096 E08C 93 SUB E 097 E08D C27EE0 JNZ :E07E Cont if bottombyte different 098 E090 E5 PUSH H Frame bottom to be removed 099 E091 210200 LXI H,:0002 100 E094 39 DAD SP Update stackpointer 101 E095 54 MOV D,H ) DE is bottom of area to be 102 E096 5D MOV E,L ) moved 103 E097 09 DAD B Add 1 frame 104 E098 44 MOV B,H ) Place to move area to 105 E099 4D MOV C,L ) 106 E09A E1 POP H Top area to move 107 E09B CD4FDE CALL :DE4F Remove old frame 108 E09E F9 SPHL New stack position 109 E09F C314E1 RFR50 JMP :E114 Use common mode to re- 110 instate textpointer 111 112 * If INT variable: 113 114 E0A2 E7 RFR70 RST 4 Subtract 'from' 115 E0A3 51 DATA :51 116 E0A4 210601 LXI H,:0106 Get addr. LSTPF 117 E0A7 3680 MVI M,:80 Default step implicit 118 E0A9 0A LDAX B Get evt STEP value 119 E0AA 03 INX B 120 E0AB FEFF CPI :FF 121 E0AD CA61E0 JZ :E061 If no step given 122 123 * If STEP: 124 125 E0B0 CD18C0 CALL :C018 Save 'to-from' on stack PAGE 03 DAI FIRMWARE 0E016-0E1F4 V1.1 126 E0B3 34 INR M Stepflag explicit 127 E0B4 0B DCX B 128 E0B5 CD08E8 CALL :E808 Get stepvalue in MACC 129 E0B8 210701 LXI H,:0107 Addr. stepvalue if explicit 130 E0BB E7 RST 4 Stepvalue in LSTEP 131 E0BC 0F DATA :0F 132 E0BD CD1BC0 CALL :C01B 'to-from' range in MACC 133 E0C0 E7 RST 4 Find nr of iterations 134 E0C1 57 DATA :57 135 E0C2 C361E0 JMP :E061 Handle loop 136 * 137 ************************************** 138 * RUN basiccmd NEXT * 139 ************************************** 140 * 141 E0C5 D1 RNEXI POP D Returnaddr 142 E0C6 CD63E9 CALL :E963 Get varptr in HL 143 E0C9 EB RNX10 XCHG 144 E0CA 2A0401 LHLD :0104 Get current loop variable 145 E0CD 7D MOV A,L 146 E0CE B4 ORA H Loopvariable 0? 147 E0CF CA2EDA JZ :DA2E Then run error 'NEXT 148 WITHOUT FOR' 149 E0D2 CD14DE CALL :DE14 Compare loop and named 150 variable pntrs 151 E0D5 CAEEE0 JZ :E0EE Perform NEXT if identical 152 E0D8 EB XCHG 153 E0D9 221901 SHLD :0119 Store in scratch area 154 E0DC CD67E1 CALL :E167 Re-instate next loopvariable 155 E0DF 2A1901 LHLD :0119 Get it back 156 E0E2 C3C9E0 JMP :E0C9 Try for a match 157 * 158 ********************* 159 * RUN basiccmd NEXT * 160 ********************* 161 * 162 * No variable name is given. 163 * 164 E0E5 D1 RNEXT POP D Returnaddr 165 E0E6 2A0401 LHLD :0104 Get current loop variable 166 E0E9 7D MOV A,L 167 E0EA B4 ORA H Loopvar is 0? 168 E0EB CA2EDA JZ :DA2E Then run error 'NEXT 169 WITHOUT FOR' 170 E0EE 3A0601 RNX20 LDA :0106 Get LSTPF 171 E0F1 B7 ORA A 172 E0F2 FA33E1 JM :E133 Jump if INT loop variable 173 174 * If FPT loop variable: 175 176 E0F5 1F RAR 177 E0F6 DA1DE1 JC :E11D Jump if explicit step 178 E0F9 CD06C0 CALL :C006 Incr. variable in memory 179 E0FC 210E01 RNX30 LXI H,:010E Addr lobyte LCOUNT 180 E0FF 7E RNX40 MOV A,M Get lobyte 181 E100 D601 SUI :01 182 E102 77 MOV M,A Decr it 183 E103 D214E1 JNC :E114 Continu if no overflow 184 E106 2B DCX H Pnts to next byte LCOUNT 185 E107 7D MOV A,L 186 E108 FE0A CPI :0A Hibyte done? 187 E10A C2FFE0 JNZ :E0FF More bytes if not PAGE 04 DAI FIRMWARE 0E016-0E1F4 V1.1 188 189 * Loop finished: 190 191 E10D CD67E1 CALL :E167 Pop frame 192 E110 B7 ORA A No special action 193 E111 C38FC8 JMP :C88F Exit to Basic monitor 194 195 * More time round (entry from 'FOR'): 196 197 E114 2A0F01 RNX50 LHLD :010F Get pntr to start loop 198 E117 44 MOV B,H ) in BC 199 E118 4D MOV C,L ) 200 E119 B7 ORA A No special action 201 E11A C38FC8 JMP :C88F Exit to Basic monitor 202 203 * Explicit step: 204 205 E11D E7 RNX60 RST 4 Get value loopvar in MACC 206 E11E 0C DATA :0C 207 E11F E5 PUSH H 208 E120 210701 LXI H,:0107 Addr. LSTEP 209 E123 D228E1 JNC :E128 If INT 210 E126 E7 RST 4 FPT: add stepvalue 211 E127 00 DATA :00 212 E128 DA2DE1 L0E19 JC :E12D If FPT 213 E12B E7 RST 4 INT: add stepvalue 214 E12C 4E DATA :4E 215 E12D E1 L0E20 POP H 216 E12E E7 RST 4 Store new value in 217 E12F 0F DATA :0F variable 218 E130 C3FCE0 JMP :E0FC Test end of loop 219 220 * If INT loopvariable: 221 222 E133 EA1DE1 RNX70 JPE :E11D Jump if explicit step 223 E136 CD0FC0 CALL :C00F Incr. variable in memory 224 E139 C3FCE0 JMP :E0FC Test end of loop 225 * 226 ************** 227 * PUSH FRAME * 228 ************** 229 * 230 * Several pointers are save on stack during 231 * execution of FOR-NEXT loops. 232 * 233 E13C D1 PUSHF POP D Get addr. where to continue 234 E13D 2A0401 LHLD :0104 Get current loop variable 235 E140 7C MOV A,H 236 E141 B5 ORA L Check if 0 237 E142 CA64E1 JZ :E164 Then abort routine 238 E145 2A0F01 LHLD :010F 239 E148 E5 PUSH H Save pntr to start loop 240 E149 2A1101 LHLD :0111 241 E14C E5 PUSH H Save pntr to start loop line 242 E14D 2A0B01 LHLD :010B 243 E150 E5 PUSH H ) Save loop iteration count 244 E151 2A0D01 LHLD :010D ) (4 bytes) 245 E154 E5 PUSH H 246 E155 2A0701 LHLD :0107 247 E158 E5 PUSH H ) Save step value 248 E159 2A0901 LHLD :0109 ) (4 bytes) 249 E15C E5 PUSH H PAGE 05 DAI FIRMWARE 0E016-0E1F4 V1.1 250 E15D 3A0601 LDA :0106 251 E160 F5 PUSH PSW Save LSTPF 252 E161 2A0401 LHLD :0104 253 E164 E5 PU1 PUSH H Save current loop variable 254 E165 EB XCHG Addr. to continue in HL 255 E166 E9 PCHL Set program counter 256 * 257 ************* 258 * POP FRAME * 259 ************* 260 * 261 * Restores looppointers in RAM. 262 * 263 E167 D1 POPF POP D 264 E168 E1 POP H 265 E169 220401 SHLD :0104 Restore LOPVAR 266 E16C 7C MOV A,H 267 E16D B5 ORA L LOPVAR=0? 268 E16E CA8DE1 JZ :E18D Then abort routine 269 E171 F1 POP PSW 270 E172 320601 STA :0106 Restore LSTPF 271 E175 E1 POP H ) 272 E176 220901 SHLD :0109 ) Restore LSTEP 273 E179 E1 POP H ) (4 bytes) 274 E17A 220701 SHLD :0107 275 E17D E1 POP H ) 276 E17E 220D01 SHLD :010D ) Restore LCOUNT 277 E181 E1 POP H ) (4 bytes) 278 E182 220B01 SHLD :010B 279 E185 E1 POP H 280 E186 221101 SHLD :0111 Restore LOPLN 281 E189 E1 POP H 282 E18A 220F01 SHLD :010F Restore LOPPT 283 E18D D5 PP1 PUSH D 284 E18E C9 RET 285 * 286 ********************************** 287 * RUN basiccmds DATA - REM - IMP * 288 ********************************** 289 * 290 * RREM/RDATA: 291 * Entry: B: Points to length byte of string. 292 * Exit: DEHL preserved. AF corrupted. 293 * RIMP: 294 * No action. 295 * 296 *RREM 297 E18F 0A RDATA LDAX B Get length of string 298 299 * Entry for REXPS: 300 301 E190 03 RRM10 INX B BC points to 1st char 302 E191 81 ADD C 303 E192 4F MOV C,A BC points to end of string 304 E193 D0 RNC 305 E194 04 INR B If overflow: correct B 306 307 * Entry for RUN IMP: 308 309 E195 B7 RIMP ORA A No special action 310 E196 C9 RET 311 PAGE 06 DAI FIRMWARE 0E016-0E1F4 V1.1 312 ********************* 313 * RUN basiccmd LIST * 314 ********************* 315 * 316 * The whole textbuffer contents is listed. 317 * 318 *RLIST 319 E197 3EFF RLIS0 MVI A,:FF Init. mode 0 320 E199 EF RST 5 Change mode 321 E19A 18 DATA :18 322 E19B 3E0C MVI A,:0C 323 E19D EF RST 5 Clear screen 324 E19E 03 DATA :03 325 E19F 2A9F02 RLS05 LHLD :029F Get startaddr. textbuf 326 E1A2 EB XCHG in DE 327 E1A3 2AA102 LHLD :02A1 Get start symtab 328 E1A6 2B DCX H End textbuf in HL 329 E1A7 C3CFE1 JMP :E1CF Perform listing 330 * 331 ********************************** 332 * RUN basiccmd LIST * 333 ********************************** 334 * 335 * Entry: BC points to linenumber. 336 * Exit: BC updated. AFDEHL corrupted. 337 * 338 E1AA CDE7E6 RLIS1 CALL :E6E7 Read linenr and find 339 it in textbuf 340 E1AD 00 NOP 341 E1AE 54 MOV D,H ) Linenr in DE 342 E1AF 5D MOV E,L ) 343 E1B0 DC39DE CC :DE39 If linenr found: calc addr 344 after string in HL 345 E1B3 C3CFE1 JMP :E1CF Perform listing 346 * 347 ***************************** 348 * RUN basiccmd LIST * 349 ***************************** 350 * 351 * Entry: BC points to 1st linenumber. 352 * Exit: BC updated. AFDEHL corrupted. 353 * 354 E1B6 2A9F02 RLIS2 LHLD :029F Get start textbuf 355 E1B9 CDD9E6 CALL :E6D9 Read 1st linenr 356 E1BC C4F6CA CNZ :CAF6 If given: Find it in textbuf 357 E1BF EB XCHG Addr in DE 358 E1C0 2AA102 LHLD :02A1 Get start symtab 359 E1C3 2B DCX H End textbuf in HL 360 E1C4 CDD9E6 CALL :E6D9 Read 1st linenr 361 E1C7 37 STC 362 E1C8 3F CMC 363 E1C9 C4F6CA CNZ :CAF6 If 1st nr found: find 2nd 364 E1CC DC39DE CC :DE39 If found: Calc addr after 365 string in HL 366 367 * Perform listing: 368 369 E1CF C5 RLS10 PUSH B 370 E1D0 42 MOV B,D ) Start listed area in BC 371 E1D1 4B MOV C,E ) 372 E1D2 221B01 SHLD :011B Store end listed area 373 E1D5 EB XCHG also in DE PAGE 07 DAI FIRMWARE 0E016-0E1F4 V1.1 374 E1D6 221901 SHLD :0119 Store start listed area 375 E1D9 60 RLS20 MOV H,B ) Startaddr in HL 376 E1DA 69 MOV L,C ) 377 E1DB CD14DE CALL :DE14 Check if all lines listed 378 E1DE CAF2E1 JZ :E1F2 Abort if ready 379 E1E1 CD73D8 CALL :D873 List curent line if linenr 380 correct 381 E1E4 CDBBD6 CALL :D6BB Scan keyboard 382 E1E7 DAF2E1 JC :E1F2 Break pressed: stop listing 383 E1EA 00 NOP 384 E1EB 00 NOP 385 E1EC C4DAD6 CNZ :D6DA If a key is pressed: 386 Wait for spacebar 387 E1EF D2D9E1 JNC :E1D9 No break: list further 388 389 * If ready: 390 391 E1F2 B7 RLS30 ORA A No special action 392 E1F3 C1 POP B 393 E1F4 C9 RET 394 * 395 * 396 * 401 E1F5 END *************************** * S Y M B O L T A B L E * *************************** L0E19 E128 L0E20 E12D POPF E167 PP1 E18D PU1 E164 PUSHF E13C RDATA E18F RFOR E02B RFR10 E05F RFR20 E061 RFR30 E07E RFR40 E07F RFR50 E09F RFR70 E0A2 RIMP E195 RLIS0 E197 RLIS1 E1AA RLIS2 E1B6 RLIST E197 RLS05 E19F RLS10 E1CF RLS20 E1D9 RLS30 E1F2 RNEXI E0C5 RNEXT E0E5 RNX10 E0C9 RNX20 E0EE RNX30 E0FC RNX40 E0FF RNX50 E114 RNX60 E11D RNX70 E133 RREM E18F RRM10 E190 RWT40 E01C RWTET E016