PAGE 01 DAI FIRMWARE 2EBF4-2EDF5 V1.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.1 188 ECB3 D5 EWDN PUSH D 189 ECB4 E5 PUSH H 190 ECB5 F5 PUSH PSW 191 ECB6 2AAC00 LHLD :00AC Get Y-offset cursor in 192 document 193 ECB9 3AA900 LDA :00A9 Get offset of top of window 194 ECBC BD CMP L Cursor at top of screen ? 195 ECBD CCABED CZ :EDAB Then cursor down 196 ECC0 D2DAEC JNC :ECDA Quit with CY=0 if 197 window unchanged 198 ECC3 AF XRA A 199 ECC4 32AF00 STA :00AF Clear cursor pos in buffer 200 ECC7 2A7200 LHLD :0072 Get cursor pos addr 201 ECCA E5 PUSH H 202 ECCB CD6BE3 CALL :E36B Delete cursor 203 ECCE CDDFEC CALL :ECDF Scroll edit display up 204 one line 205 ECD1 E1 POP H 206 ECD2 118600 L2E177 LXI D,:0086 Length one screen line 207 ECD5 19 L2E178 DAD D One line further 208 ECD6 CD30E3 L2E179 CALL :E330 Put new cursor on screen 209 ECD9 37 STC Exit CY=1 if cursor moved 210 ECDA E1 L2E180 POP H 211 ECDB 7C MOV A,H 212 ECDC E1 POP H 213 ECDD D1 POP D 214 ECDE C9 RET 215 * 216 * SCROLL EDIT DISPLAY UP ONE LINE: 217 * 218 * Exit: BC preserved. AFDEHL corrupted. 219 * 220 ECDF C5 L2E181 PUSH B 221 ECE0 CDCBE1 CALL :E1CB Scroll window up 1 line 222 ECE3 E5 PUSH H 223 ECE4 2AA900 LHLD :00A9 Get offset of top of window 224 ECE7 23 INX H +1 225 ECE8 22A900 SHLD :00A9 Preserve it 226 ECEB 111700 LXI D,:0017 Nr of lines for window 227 ECEE 19 DAD D HL pnts to new line at 228 window bottom 229 ECEF CD1CEE L2E182 CALL :EE1C Skip lines 230 ECF2 D1 POP D 231 ECF3 CDC0EE CALL :EEC0 Print new line of text 232 ECF6 C1 POP B 233 ECF7 C9 RET 234 * 235 **************** 236 * WINDOW RIGHT * 237 **************** 238 * 239 * Moves window right one position. 240 * 241 * Exit: ABCDEHL preserved. 242 * CY=0: Window unchanged. 243 * CY=1: Window changed. 244 * 245 ECF8 D5 EWRT PUSH D 246 ECF9 E5 PUSH H 247 ECFA F5 PUSH PSW 248 ECFB 3AA800 LDA :00A8 Get offset of left side 249 of window PAGE 05 DAI FIRMWARE 2EBF4-2EDF5 V1.0 Rev.1 250 ECFE FEC4 CPI :C4 256-60 ? 251 ED00 CADAEC JZ :ECDA Abort if window at right end 252 of text 253 ED03 6F MOV L,A Offset in L 254 ED04 3AAB00 LDA :00AB Get X-offset cursor in 255 document 256 ED07 BD CMP L Cursor at left side of 257 window ? 258 ED08 CCF6ED CZ :EDF6 Then move cursor right 259 ED0B 2A7200 LHLD :0072 Get cursor pos addr 260 ED0E E5 PUSH H 261 ED0F CD6BE3 CALL :E36B Delete cursor 262 ED12 CD1BED CALL :ED1B Scroll display left 1 pos 263 ED15 E1 POP H 264 ED16 23 L2E184 INX H 265 ED17 23 INX H 266 ED18 C3D6EC JMP :ECD6 Put cursor on screen; 267 quit with CY=1 268 * 269 * SCROLL EDIT DISPAY LEFT ONE POSITION: 270 * 271 * Exit: BC preserved, AFDEHL corrupted. 272 * 273 ED1B C5 L2E185 PUSH B 274 ED1C 01FEFF LXI B,:FFFE -2 275 ED1F CDCEE1 CALL :E1CE Scroll window 276 ED22 3AA800 LDA :00A8 Get offset of left side 277 of window 278 ED25 3C INR A +1 279 ED26 32A800 STA :00A8 Preserve it 280 ED29 C63B ADI :3B +60 (offset right side 281 of window) 282 ED2B 1182FF LXI D,:FF82 -7E 283 ED2E 47 L2E186 MOV B,A Offset right side of 284 window in B 285 ED2F 0E18 MVI C,:18 Nr of lines in window 286 ED31 2A8A00 LHLD :008A Get pntr to start char area 287 ED34 19 DAD D Pos 60th char on screen 288 ED35 EB XCHG in DE 289 ED36 2AA900 LHLD :00A9 Get offset of top of window 290 ED39 CD1CEE CALL :EE1C Skip lines 291 292 * Put newly visible 60th character on screen: 293 294 ED3C CD7BEE L2E187 CALL :EE7B Skip to Bth pos on line 295 ED3F 12 STAX D Next visible char in window 296 ED40 CD38EE CALL :EE38 Next line 297 ED43 E5 PUSH H 298 ED44 217AFF LXI H,:FF7A -86 (length one line) 299 ED47 19 DAD D Pnts to 60th char on 300 next line 301 ED48 EB XCHG 302 ED49 E1 POP H 303 ED4A 0D DCR C Update line count 304 ED4B C23CED L2E188 JNZ :ED3C Scroll next line if not 305 ready 306 ED4E C1 POP B 307 ED4F C9 RET 308 * 309 *************** 310 * WINDOW LEFT * 311 *************** PAGE 06 DAI FIRMWARE 2EBF4-2EDF5 V1.0 Rev.1 312 * 313 * Moves window left one position. 314 * 315 * Exit: ABCDEHL preserved. 316 * CY=0: Window unchanged. 317 * CY=1: Window changed. 318 * 319 ED50 D5 EWLF PUSH D 320 ED51 E5 PUSH H 321 ED52 F5 PUSH PSW 322 ED53 3AA800 LDA :00A8 Get offset of left side 323 of window 324 ED56 B7 ORA A 325 ED57 CADAEC JZ :ECDA Abort if offset = 0 326 ED5A 6F MOV L,A Offset in L 327 ED5B 3AAB00 LDA :00AB Get X-offset of cursor 328 in document 329 ED5E 95 SUB L 330 ED5F FE3B CPI :3B Cursor at right side of 331 window ? 332 ED61 CCD3ED CZ :EDD3 Then cursor left 333 ED64 2A7200 LHLD :0072 Get cursor pos addr 334 ED67 E5 PUSH H 335 ED68 CD6BE3 CALL :E36B Delete cursor 336 ED6B CD74ED CALL :ED74 Move window, correct pntrs 337 ED6E E1 POP H 338 ED6F 2B L2E189 DCX H 339 ED70 2B DCX H New cursor pos 340 ED71 C3D6EC JMP :ECD6 Put cursor on screen; 341 quit with CY=1 342 * 343 * SCROLL EDIT DISPLAY RIGHT ONE POSITION: 344 * 345 * Exit: BC preserved; AFDEHL corrupted. 346 * 347 ED74 C5 L2E190 PUSH B 348 ED75 010200 LXI B,:0002 349 ED78 CD86EC CALL :EC86 Move window in text 350 ED7B 3AA800 LDA :00A8 Get offset of left side 351 of window 352 ED7E 3D DCR A -1 353 ED7F 32A800 STA :00A8 Preserve it 354 ED82 11F8FF LXI D,:FFF8 Gives in ED2E 1st pos 355 on 1st screen line 356 ED85 C32EED JMP :ED2E Scroll display left 357 * 358 ************* 359 * CURSOR UP * 360 ************* 361 * 362 * Moves cursor up one position. 363 * 364 * Exit: ABCDEHL preserved. 365 * CY=0: Cursor not moved. 366 * CY=1: Cursor moved. 367 * 368 ED88 D5 ECUP PUSH D 369 ED89 E5 PUSH H 370 ED8A F5 PUSH PSW 371 ED8B 2AAC00 LHLD :00AC Get Y-offset cursor in 372 document 373 ED8E 7C MOV A,H PAGE 07 DAI FIRMWARE 2EBF4-2EDF5 V1.0 Rev.1 374 ED8F B5 ORA L 375 ED90 CADAEC JZ :ECDA Quit if cursor at top 376 left; CY=0 377 ED93 AF XRA A 378 ED94 32AF00 STA :00AF Clear cursor pos in buffer 379 ED97 3AA900 LDA :00A9 Get offset of top of window 380 ED9A BD CMP L Cursor at top of window ? 381 ED9B CC4BEC CZ :EC4B Then window up 382 ED9E 2B DCX H 383 ED9F 22AC00 SHLD :00AC Store Y-offset cursor in 384 document 385 EDA2 2A7200 LHLD :0072 Get cursor pos addr 386 EDA5 CD6BE3 CALL :E36B Delete cursor 387 EDA8 C3D2EC JMP :ECD2 Put cursor on new pos; 388 quit with CY=1 389 * 390 *************** 391 * CURSOR DOWN * 392 *************** 393 * 394 * Moves cursor down one position. 395 * 396 * Exit: ABCDEHL preserved. 397 * CY=0: Cursor not moved. 398 * CY=1: Cursor moved. 399 * 400 EDAB D5 ECDN PUSH D 401 EDAC E5 PUSH H 402 EDAD F5 PUSH PSW 403 EDAE 2AAC00 LHLD :00AC Get Y-offset cursor in 404 in document 405 EDB1 23 INX H +1 406 EDB2 E5 PUSH H Preserve it 407 EDB3 CD1CEE CALL :EE1C Skip lines 408 EDB6 E1 POP H 409 EDB7 D2DAEC JNC :ECDA No move if cursor at last 410 line of text; CY=0 411 EDBA AF XRA A 412 EDBB 32AF00 STA :00AF Clear cursor pos in buffer 413 EDBE 3AA900 LDA :00A9 Get offset of top of window 414 EDC1 C618 ADI :18 24 lines in window 415 EDC3 BD CMP L Cursor at window bottom ? 416 EDC4 CCB3EC CZ :ECB3 Then window down 417 EDC7 22AC00 SHLD :00AC Store Y-offset cursor in 418 document 419 EDCA 2A7200 LHLD :0072 Get cursor pos addr 420 EDCD CD6BE3 CALL :E36B Delete cursor 421 EDD0 C36EEC JMP :EC6E Put cursor on new pos; 422 quit with CY=1 423 * 424 *************** 425 * CURSOR LEFT * 426 *************** 427 * 428 * Moves cursor left one position. 429 * 430 * Exit: ABCDEHL preserved. 431 * CY=0: Cursor not moved. 432 * CY=1: Cursor moved. 433 * 434 EDD3 D5 ECLF PUSH D 435 EDD4 E5 PUSH H PAGE 08 DAI FIRMWARE 2EBF4-2EDF5 V1.0 Rev.1 436 EDD5 F5 PUSH PSW 437 EDD6 3AA800 LDA :00A8 Get offset of left side 438 of window 439 EDD9 6F MOV L,A in L 440 EDDA 3AAB00 LDA :00AB Get X-offset cursor in 441 document 442 EDDD B7 ORA A 443 EDDE CADAEC JZ :ECDA Abort if X-offset = 0 444 EDE1 BD CMP L Cursor at left side of 445 window ? 446 EDE2 CC50ED CZ :ED50 Then window left 447 EDE5 3D DCR A X-offset -1 448 EDE6 32AB00 STA :00AB Preserve it 449 EDE9 AF XRA A 450 EDEA 32AF00 STA :00AF Clear cursor pos in buffer 451 EDED 2A7200 LHLD :0072 Get cursor pos addr 452 EDF0 CD6BE3 CALL :E36B Delete cursor 453 EDF3 C316ED JMP :ED16 Put cursor on new pos; 454 quit with CY=1 455 * 456 * 457 * 458 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