
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
