
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
