PAGE 01 DAI FIRMWARE 2EBF4-2EDF5 V1.1 002 ORG :EBF4 003 * 004 * 005 * 006 * ===================== 007 *** SCREEN EDITOR PACKAGE *** 008 * ===================== 009 * 010 * 011 ********************* 012 * INITIALISE EDITOR * 013 ********************* 014 * 015 * Sets up a mode 0 screen, clears 00A8-00AD,00AF. 016 * Prints text from 00A2 onwards; cursor at top left. 017 * 018 * Exit: HL: Cursor position (top left). 019 * AF corrupted. BCDE preserved. 020 * 021 EBF4 3EFF EINIT MVI A,:FF Init mode 0 022 EBF6 CDD9E3 CALL :E3D9 Change to mode 0 023 EBF9 3E0C MVI A,:0C 024 EBFB CD02E1 CALL :E102 Clear screen 025 EBFE 210000 LXI H,:0000 ) 026 EC01 22A900 SHLD :00A9 ) 027 EC04 22AC00 SHLD :00AC ) 028 EC07 7C MOV A,H ) Clear edit pointers 029 EC08 32A800 STA :00A8 ) 030 EC0B 32AB00 STA :00AB ) 031 EC0E 32AF00 STA :00AF ) 032 EC11 2A7200 LHLD :0072 Get cursor pos addr 033 EC14 CD6BE3 CALL :E36B Delete cursor 034 EC17 CD3AEF CALL :EF3A Print full screen from 035 start of edit buffer 036 EC1A CD30E3 CALL :E330 Put cursor on screen 037 EC1D C9 RET 038 * 039 ************* 040 * OBEY EDIT * 041 ************* 042 * 043 * A given character is inserted in the buffer, 044 * except: #08 deletes a character 045 * #10 moves cursor up 046 * #11 moves cursor down 047 * #12 moves cursor left 048 * #13 moves cursor right 049 * #14 moves window up 050 * #15 moves window down 051 * #16 moves window left 052 * #17 moves window right 053 * 054 * Entry: A: Character given. 055 * Exit: CY=1: If done. 056 * CY=0: Not done. 057 * ABCDEHL + rest of F preserved. 058 * 059 EC1E FE08 EOBEY CPI :08 060 EC20 CACCEF JZ :EFCC Delete character 061 EC23 FE10 CPI :10 062 EC25 DA4BEF JC :EF4B Insert character 063 EC28 CA88ED JZ :ED88 Cursor up PAGE 02 DAI FIRMWARE 2EBF4-2EDF5 V1.1 064 EC2B FE12 CPI :12 065 EC2D DAABED JC :EDAB Cursor down 066 EC30 CAD3ED JZ :EDD3 Cursor left 067 EC33 FE14 CPI :14 068 EC35 DAF6ED JC :EDF6 Cursor right 069 EC38 CA4BEC JZ :EC4B Window up 070 EC3B FE16 CPI :16 071 EC3D DAB3EC JC :ECB3 Window down 072 EC40 CA50ED JZ :ED50 Window left 073 EC43 FE17 CPI :17 074 EC45 CAF8EC JZ :ECF8 Window right 075 EC48 C34BEF JMP :EF4B Insert character 076 * 077 ************* 078 * WINDOW UP * 079 ************* 080 * 081 * Moves window up one line. 082 * 083 * Exit: All registers preserved. 084 * CY=0: Window unchanged. 085 * CY=1: Window changed. 086 * 087 EC4B D5 EWUP PUSH D 088 EC4C E5 PUSH H 089 EC4D F5 PUSH PSW 090 EC4E 2AA900 LHLD :00A9 Get offset of top of window 091 EC51 7C MOV A,H 092 EC52 B5 ORA L 093 EC53 CADAEC JZ :ECDA Window unchanged if 094 offset = 0; CY=0 095 EC56 AF XRA A 096 EC57 32AF00 STA :00AF Clear cursor pos in buffer 097 EC5A 3AAC00 LDA :00AC Get Y-offset cursor in 098 in document 099 EC5D 95 SUB L Minus offset top of window 100 EC5E FE17 CPI :17 Nr of lines in window -1 101 EC60 CC88ED CZ :ED88 Cursor up if at 102 bottom of window 103 EC63 2A7200 LHLD :0072 Get cursor pos addr 104 EC66 E5 PUSH H 105 EC67 CD6BE3 CALL :E36B Delete cursor 106 EC6A CD74EC CALL :EC74 Move window, correct pntrs 107 EC6D E1 POP H 108 EC6E 117AFF L2E172 LXI D,:FF7A Length one line 109 EC71 C3D5EC JMP :ECD5 Put cursor on next line, 110 quit with CY=1 111 * 112 * SCROLL EDIT DISPLAY DOWN ONE LINE: 113 * 114 * Exit: BC preserved. AFDEHL corrupted. 115 * 116 EC74 C5 L2E173 PUSH B 117 EC75 018600 LXI B,:0086 Length one screen line 118 EC78 CD86EC CALL :EC86 Move window up in text 119 1 line 120 EC7B D5 PUSH D 121 EC7C 2AA900 LHLD :00A9 Get offset of top of window 122 EC7F 2B DCX H -1 123 EC80 22A900 SHLD :00A9 And preserve it 124 EC83 C3EFEC JMP :ECEF Print new line of text at 125 window bottom PAGE 03 DAI FIRMWARE 2EBF4-2EDF5 V1.1 126 * 127 *********************** 128 * MOVE WINDOW IN TEXT * 129 *********************** 130 * 131 * Moves window up or left. 132 * 133 * Entry: BC: Offset (#86 for 1 line, #02 for 134 * 1 position). 135 * Exit: All registers corrupted. 136 * 137 EC86 2A8C00 L2E174 LHLD :008C Get addr after end char area 138 EC89 54 MOV D,H ) in DE 139 EC8A 5D MOV E,L ) 140 EC8B 09 DAD B Add offset 141 EC8C EB XCHG HL: end char area; 142 DE: end char area + offset 143 * Move full screen: 144 145 EC8D 010600 L2E175 LXI B,:0006 3 not used locations 146 at line end 147 EC90 09 DAD B ) 148 EC91 EB XCHG ) Add it to both HL and DE 149 EC92 09 DAD B ) and exchange DE and HL 150 EC93 EB XCHG ) 151 EC94 063C MVI B,:3C 60 char/line visible 152 153 * Move one line: 154 155 EC96 23 L2E176 INX H 156 EC97 23 INX H New destination pntr 157 EC98 13 INX D 158 EC99 13 INX D New origin pntr 159 EC9A 1A LDAX D Get one char 160 EC9B 77 MOV M,A Move it to new screen loc 161 EC9C 05 DCR B char count -1 162 EC9D C296EC JNZ :EC96 Next char if not ready 163 * 164 ECA0 010800 LXI B,:0008 4 not-useable pos at line 165 boundary 166 ECA3 09 DAD B HL pnts to end previous line 167 (destination) 168 ECA4 E5 PUSH H 169 ECA5 2A8A00 LHLD :008A Get addr start char area 170 ECA8 EB XCHG in DE 171 ECA9 09 DAD B Update origin too 172 ECAA CDFBE6 CALL :E6FB Compare HL-DE 173 ECAD EB XCHG New origin in DE 174 ECAE E1 POP H Destination in HL 175 ECAF DA8DEC JC :EC8D Evt another line 176 ECB2 C9 RET 177 * 178 *************** 179 * WINDOW DOWN * 180 *************** 181 * 182 * Moves window down one line. 183 * 184 * Exit: ABCDEHL preserved. 185 * CY=0: Window unchanged. 186 * CY=1: Window changed. 187 * PAGE 04 DAI FIRMWARE 2EBF4-2EDF5 V1.1 188 ECB3 D5 EWDN PUSH D 189 ECB4 E5 PUSH H 190 ECB5 F5 PUSH PSW 191 * 192 *************** 193 * WINDOW DOWN * 194 *************** 195 * 196 * A bug which let the cursor disappear sometimes is 197 * removed. 198 * 199 ECB6 2AA900 LHLD :00A9 ] Get offset top of window 200 from start buffer 201 ECB9 EB XCHG ] in DE 202 ECBA CD6BD2 CALL :D26B ] 203 ECBD FCABED CM :EDAB Then cursor down 204 ECC0 D2DAEC JNC :ECDA Quit with CY=0 if 205 window unchanged 206 ECC3 AF XRA A 207 ECC4 32AF00 STA :00AF Clear cursor pos in buffer 208 ECC7 2A7200 LHLD :0072 Get cursor pos addr 209 ECCA E5 PUSH H 210 ECCB CD6BE3 CALL :E36B Delete cursor 211 ECCE CDDFEC CALL :ECDF Scroll edit display up 212 one line 213 ECD1 E1 POP H 214 ECD2 118600 L2E177 LXI D,:0086 Length one screen line 215 ECD5 19 L2E178 DAD D One line further 216 ECD6 CD30E3 L2E179 CALL :E330 Put new cursor on screen 217 ECD9 37 STC Exit CY=1 if cursor moved 218 ECDA E1 L2E180 POP H 219 ECDB 7C MOV A,H 220 ECDC E1 POP H 221 ECDD D1 POP D 222 ECDE C9 RET 223 * 224 * SCROLL EDIT DISPLAY UP ONE LINE: 225 * 226 * Exit: BC preserved. AFDEHL corrupted. 227 * 228 ECDF C5 L2E181 PUSH B 229 ECE0 CDCBE1 CALL :E1CB Scroll window up 1 line 230 ECE3 E5 PUSH H 231 ECE4 2AA900 LHLD :00A9 Get offset of top of window 232 ECE7 23 INX H +1 233 ECE8 22A900 SHLD :00A9 Preserve it 234 ECEB 111700 LXI D,:0017 Nr of lines for window 235 ECEE 19 DAD D HL pnts to new line at 236 window bottom 237 ECEF CD1CEE L2E182 CALL :EE1C Skip lines 238 ECF2 D1 POP D 239 ECF3 CDC0EE CALL :EEC0 Print new line of text 240 ECF6 C1 POP B 241 ECF7 C9 RET 242 * 243 **************** 244 * WINDOW RIGHT * 245 **************** 246 * 247 * Moves window right one position. 248 * 249 * Exit: ABCDEHL preserved. PAGE 05 DAI FIRMWARE 2EBF4-2EDF5 V1.1 250 * CY=0: Window unchanged. 251 * CY=1: Window changed. 252 * 253 ECF8 D5 EWRT PUSH D 254 ECF9 E5 PUSH H 255 ECFA F5 PUSH PSW 256 ECFB 3AA800 LDA :00A8 Get offset of left side 257 of window 258 ECFE FEC4 CPI :C4 256-60 ? 259 ED00 CADAEC JZ :ECDA Abort if window at right end 260 of text 261 ED03 6F MOV L,A Offset in L 262 ED04 3AAB00 LDA :00AB Get X-offset cursor in 263 document 264 ED07 BD CMP L Cursor at left side of 265 window ? 266 ED08 CCF6ED CZ :EDF6 Then move cursor right 267 ED0B 2A7200 LHLD :0072 Get cursor pos addr 268 ED0E E5 PUSH H 269 ED0F CD6BE3 CALL :E36B Delete cursor 270 ED12 CD1BED CALL :ED1B Scroll display left 1 pos 271 ED15 E1 POP H 272 ED16 23 L2E184 INX H 273 ED17 23 INX H 274 ED18 C3D6EC JMP :ECD6 Put cursor on screen; 275 quit with CY=1 276 * 277 * SCROLL EDIT DISPAY LEFT ONE POSITION: 278 * 279 * Exit: BC preserved, AFDEHL corrupted. 280 * 281 ED1B C5 L2E185 PUSH B 282 ED1C 01FEFF LXI B,:FFFE -2 283 ED1F CDCEE1 CALL :E1CE Scroll window 284 ED22 3AA800 LDA :00A8 Get offset of left side 285 of window 286 ED25 3C INR A +1 287 ED26 32A800 STA :00A8 Preserve it 288 ED29 C63B ADI :3B +60 (offset right side 289 of window) 290 ED2B 1182FF LXI D,:FF82 -7E 291 ED2E 47 L2E186 MOV B,A Offset right side of 292 window in B 293 ED2F 0E18 MVI C,:18 Nr of lines in window 294 ED31 2A8A00 LHLD :008A Get pntr to start char area 295 ED34 19 DAD D Pos 60th char on screen 296 ED35 EB XCHG in DE 297 ED36 2AA900 LHLD :00A9 Get offset of top of window 298 ED39 CD1CEE CALL :EE1C Skip lines 299 300 * Put newly visible 60th character on screen: 301 302 ED3C CD7BEE L2E187 CALL :EE7B Skip to Bth pos on line 303 ED3F 12 STAX D Next visible char in window 304 ED40 CD38EE CALL :EE38 Next line 305 ED43 E5 PUSH H 306 ED44 217AFF LXI H,:FF7A -86 (length one line) 307 ED47 19 DAD D Pnts to 60th char on 308 next line 309 ED48 EB XCHG 310 ED49 E1 POP H 311 ED4A 0D DCR C Update line count PAGE 06 DAI FIRMWARE 2EBF4-2EDF5 V1.1 312 ED4B C23CED L2E188 JNZ :ED3C Scroll next line if not 313 ready 314 ED4E C1 POP B 315 ED4F C9 RET 316 * 317 *************** 318 * WINDOW LEFT * 319 *************** 320 * 321 * Moves window left one position. 322 * 323 * Exit: ABCDEHL preserved. 324 * CY=0: Window unchanged. 325 * CY=1: Window changed. 326 * 327 ED50 D5 EWLF PUSH D 328 ED51 E5 PUSH H 329 ED52 F5 PUSH PSW 330 ED53 3AA800 LDA :00A8 Get offset of left side 331 of window 332 ED56 B7 ORA A 333 ED57 CADAEC JZ :ECDA Abort if offset = 0 334 ED5A 6F MOV L,A Offset in L 335 ED5B 3AAB00 LDA :00AB Get X-offset of cursor 336 in document 337 ED5E 95 SUB L 338 ED5F FE3B CPI :3B Cursor at right side of 339 window ? 340 ED61 CCD3ED CZ :EDD3 Then cursor left 341 ED64 2A7200 LHLD :0072 Get cursor pos addr 342 ED67 E5 PUSH H 343 ED68 CD6BE3 CALL :E36B Delete cursor 344 ED6B CD74ED CALL :ED74 Move window, correct pntrs 345 ED6E E1 POP H 346 ED6F 2B L2E189 DCX H 347 ED70 2B DCX H New cursor pos 348 ED71 C3D6EC JMP :ECD6 Put cursor on screen; 349 quit with CY=1 350 * 351 * SCROLL EDIT DISPLAY RIGHT ONE POSITION: 352 * 353 * Exit: BC preserved; AFDEHL corrupted. 354 * 355 ED74 C5 L2E190 PUSH B 356 ED75 010200 LXI B,:0002 357 ED78 CD86EC CALL :EC86 Move window in text 358 ED7B 3AA800 LDA :00A8 Get offset of left side 359 of window 360 ED7E 3D DCR A -1 361 ED7F 32A800 STA :00A8 Preserve it 362 ED82 11F8FF LXI D,:FFF8 Gives in ED2E 1st pos 363 on 1st screen line 364 ED85 C32EED JMP :ED2E Scroll display left 365 * 366 ************* 367 * CURSOR UP * 368 ************* 369 * 370 * Moves cursor up one position. 371 * 372 * Exit: ABCDEHL preserved. 373 * CY=0: Cursor not moved. PAGE 07 DAI FIRMWARE 2EBF4-2EDF5 V1.1 374 * CY=1: Cursor moved. 375 * 376 ED88 D5 ECUP PUSH D 377 ED89 E5 PUSH H 378 ED8A F5 PUSH PSW 379 ED8B 2AAC00 LHLD :00AC Get Y-offset cursor in 380 document 381 ED8E 7C MOV A,H 382 ED8F B5 ORA L 383 ED90 CADAEC JZ :ECDA Quit if cursor at top 384 left; CY=0 385 ED93 AF XRA A 386 ED94 32AF00 STA :00AF Clear cursor pos in buffer 387 ED97 3AA900 LDA :00A9 Get offset of top of window 388 ED9A BD CMP L Cursor at top of window ? 389 ED9B CC4BEC CZ :EC4B Then window up 390 ED9E 2B DCX H 391 ED9F 22AC00 SHLD :00AC Store Y-offset cursor in 392 document 393 EDA2 2A7200 LHLD :0072 Get cursor pos addr 394 EDA5 CD6BE3 CALL :E36B Delete cursor 395 EDA8 C3D2EC JMP :ECD2 Put cursor on new pos; 396 quit with CY=1 397 * 398 *************** 399 * CURSOR DOWN * 400 *************** 401 * 402 * Moves cursor down one position. 403 * 404 * Exit: ABCDEHL preserved. 405 * CY=0: Cursor not moved. 406 * CY=1: Cursor moved. 407 * 408 EDAB D5 ECDN PUSH D 409 EDAC E5 PUSH H 410 EDAD F5 PUSH PSW 411 EDAE 2AAC00 LHLD :00AC Get Y-offset cursor in 412 in document 413 EDB1 23 INX H +1 414 EDB2 E5 PUSH H Preserve it 415 EDB3 CD1CEE CALL :EE1C Skip lines 416 EDB6 E1 POP H 417 EDB7 D2DAEC JNC :ECDA No move if cursor at last 418 line of text; CY=0 419 EDBA AF XRA A 420 EDBB 32AF00 STA :00AF Clear cursor pos in buffer 421 EDBE 3AA900 LDA :00A9 Get offset of top of window 422 EDC1 C618 ADI :18 24 lines in window 423 EDC3 BD CMP L Cursor at window bottom ? 424 EDC4 CCB3EC CZ :ECB3 Then window down 425 EDC7 22AC00 SHLD :00AC Store Y-offset cursor in 426 document 427 EDCA 2A7200 LHLD :0072 Get cursor pos addr 428 EDCD CD6BE3 CALL :E36B Delete cursor 429 EDD0 C36EEC JMP :EC6E Put cursor on new pos; 430 quit with CY=1 431 * 432 *************** 433 * CURSOR LEFT * 434 *************** 435 * PAGE 08 DAI FIRMWARE 2EBF4-2EDF5 V1.1 436 * Moves cursor left one position. 437 * 438 * Exit: ABCDEHL preserved. 439 * CY=0: Cursor not moved. 440 * CY=1: Cursor moved. 441 * 442 EDD3 D5 ECLF PUSH D 443 EDD4 E5 PUSH H 444 EDD5 F5 PUSH PSW 445 EDD6 3AA800 LDA :00A8 Get offset of left side 446 of window 447 EDD9 6F MOV L,A in L 448 EDDA 3AAB00 LDA :00AB Get X-offset cursor in 449 document 450 EDDD B7 ORA A 451 EDDE CADAEC JZ :ECDA Abort if X-offset = 0 452 EDE1 BD CMP L Cursor at left side of 453 window ? 454 EDE2 CC50ED CZ :ED50 Then window left 455 EDE5 3D DCR A X-offset -1 456 EDE6 32AB00 STA :00AB Preserve it 457 EDE9 AF XRA A 458 EDEA 32AF00 STA :00AF Clear cursor pos in buffer 459 EDED 2A7200 LHLD :0072 Get cursor pos addr 460 EDF0 CD6BE3 CALL :E36B Delete cursor 461 EDF3 C316ED JMP :ED16 Put cursor on new pos; 462 quit with CY=1 463 * 464 * 465 * 466 EDF6 END *************************** * S Y M B O L T A B L E * *************************** ECDN EDAB ECLF EDD3 ECUP ED88 EINIT EBF4 EOBEY EC1E EWDN ECB3 EWLF ED50 EWRT ECF8 EWUP EC4B L2E172 EC6E L2E173 EC74 L2E174 EC86 L2E175 EC8D L2E176 EC96 L2E177 ECD2 L2E178 ECD5 L2E179 ECD6 L2E180 ECDA L2E181 ECDF L2E182 ECEF L2E184 ED16 L2E185 ED1B L2E186 ED2E L2E187 ED3C L2E188 ED4B L2E189 ED6F L2E190 ED74