
PAGE 01    DAI FIRMWARE 3EA00-3EB25  V1.1

002                         ORG   :EA00
003                 *
004                 *
005                 *
006                 *  =================
007                 *** UTILITY PACKAGE ***
008                 *  =================
009                 *
010                 **************
011                 * (not used) *
012                 **************
013                 *
014 EA00 E1         L3E158  POP   H
015 EA01 C309EA             JMP   :EA09
016                 *
017                 *********************
018                 * RETURN AFTER 'GO' *
019                 *********************
020                 *
021 EA04 E5         L3E159  PUSH  H         Returnaddr after 'GO'
022 EA05 21DCBA             LXI   H,:BADC   Dummy 'saved PC' to prevent
023                                         continuation 'G' with start
024                                         address
025 EA08 E3                 XTHL            Returnaddr in HL
026 EA09 225900     L3E160  SHLD  :0059     Save HL
027 EA0C E1                 POP   H         in HL: #BADC
028                                         Into initialisation
029                 *
030                 **********************
031                 * INITIALISE UTILITY *
032                 **********************
033                 *
034                 * CPU registers are saved in the utility work
035                 * area. Input from the keyboard is awaited.
036                 *
037                 * The address EA42 is the general return address
038                 * for all Utility commands.
039                 *
040 EA0D 225D00     CALRX   SHLD  :005D     Save PC (next instr)
041 EA10 F5                 PUSH  PSW
042 EA11 E1                 POP   H
043 EA12 225300             SHLD  :0053     Save PSW
044 EA15 210000             LXI   H,:0000
045 EA18 39                 DAD   SP
046 EA19 225B00             SHLD  :005B     Save SP
047 EA1C EB                 XCHG
048 EA1D 225700             SHLD  :0057     Save DE
049 EA20 60                 MOV   H,B
050 EA21 69                 MOV   L,C
051 EA22 225500             SHLD  :0055     Save BC
052 EA25 CDE7ED             CALL  :EDE7     Invert nibbles in CPU
053                                         reg save area
054 EA28 2A5D00             LHLD  :005D     Get addr next instr
055 EA2B 7C                 MOV   A,H
056 EA2C B5                 ORA   L
057 EA2D CA3CEA             JZ    :EA3C     If it is 0000 (entry from
058                                         BASIC)
059                                         Else:
060 EA30 2B                 DCX   H         HL on addr current instr
061 EA31 7E                 MOV   A,M       Get opcode in A
062 EA32 E6C7               ANI   :C7
063 EA34 FEC7               CPI   :C7

PAGE 02    DAI FIRMWARE 3EA00-3EB25  V1.1

064 EA36 C23CEA             JNZ   :EA3C     Jump if instr is a RST
065 EA39 225D00             SHLD  :005D     Save addr next instr
066 EA3C 217DEA     L3E162  LXI   H,:EA7D   Startaddr string table
067 EA3F CD2FED             CALL  :ED2F     Print 'PC UTILITY V3.3'
068                             
069                 * UT command look-up:
070                             
071 EA42 CD3AED     L3E163  CALL  :ED3A     Print car.ret
072 EA45 0E3E               MVI   C,:3E
073 EA47 CDB4EE             CALL  :EEB4     Print '>'
074 EA4A CD06ED             CALL  :ED06     Get keyb input, print char
075 EA4D 2142EA             LXI   H,:EA42   Returnaddr in HL
076 EA50 E5                 PUSH  H         Save it on stack
077 EA51 218DEA             LXI   H,:EA8D   Startaddr table commands
078 EA54 23         L3E164  INX   H
079 EA55 BE                 CMP   M         Compare input with table
080 EA56 DA62EA             JC    :EA62     Error if invalid input
081 EA59 23                 INX   H         )
082 EA5A 5E                 MOV   E,M       ) Get pointer to address
083 EA5B 23                 INX   H         ) of part. routine in DE
084 EA5C 56                 MOV   D,M       )
085 EA5D C254EA             JNZ   :EA54     Check with next command
086 EA60 EB                 XCHG            Startaddr routine in HL
087 EA61 E9                 PCHL            Go to this routine
088                 *
089                 *********
090                 * ERROR *
091                 *********
092                 *
093                 * The only error message in utility is '?'.
094                 *
095                 * Exit: B preserved, AFCDEHL corrupted.
096                 *
097 EA62 CD3AED     ERROR   CALL  :ED3A     Print car.ret
098 EA65 0E3F               MVI   C,:3F
099 EA67 CDB4EE             CALL  :EEB4     Print '?'
100 EA6A 2A5B00     ERRST   LHLD  :005B     Get saved SP
101 EA6D F9                 SPHL            Restore stackpointer
102 EA6E 00                 NOP 
103 EA6F 00                 NOP 
104 EA70 00                 NOP 
105 EA71 C342EA             JMP   :EA42     Start again for new input
106                 *
107                 ********************
108                 * ENTRY FROM BASIC *
109                 ********************
110                 *
111 EA74 225900     RESET   SHLD  :0059     Save HL
112 EA77 210000             LXI   H,:0000   Addr next instr (dummy)
113 EA7A C30DEA             JMP   :EA0D     Init utility
114                 *
115                 *************************
116                 * UTILITY SCREEN HEADER *
117                 *************************
118                 *
119                 * 0C is clear screen; 20 is space.
120                 *
121 EA7D 0C         MSGSO   DATA  :0C
122 EA7E 50                 DATA  :50       P
123 EA7F 43                 DATA  :43       C
124 EA80 20                 DATA  :20
125 EA81 55                 DATA  :55       U

PAGE 03    DAI FIRMWARE 3EA00-3EB25  V1.1

126 EA82 54                 DATA  :54       T
127 EA83 49                 DATA  :49       I
128 EA84 4C                 DATA  :4C       L
129 EA85 49                 DATA  :49       I
130 EA86 54                 DATA  :54       T
131 EA87 59                 DATA  :59       Y
132 EA88 20                 DATA  :20
133 EA89 56                 DATA  :56       V
134 EA8A 33                 DATA  :33       3
135 EA8B 2E                 DATA  :2E       .
136 EA8C 33                 DATA  :33       3
137                 *
138 EA8D 00                 DATA  :00       End table
139                 *
140                 *******************************
141                 * TABLE WITH UTILITY COMMANDS *
142                 *******************************
143                 *
144 EA8E 42         CMDTB   DATA  :42       B
145 EA8F A0C7               DBL   :C7A0     return addr to Basic
146                 *
147 EA91 44                 DATA  :44       D
148 EA92 B3EA               DBL   :EAB3     startaddr Display
149                 *
150 EA94 46                 DATA  :46       F
151 EA95 48ED               DBL   :ED48     startaddr Fill
152                 *
153 EA97 47                 DATA  :47       G
154 EA98 8AED               DBL   :ED8A     startaddr Go
155                 *
156 EA9A 4C                 DATA  :4C       L
157 EA9B 26EB               DBL   :EB26     startaddr Look
158                 *
159 EA9D 4D                 DATA  :4D       M
160 EA9E 83EC               DBL   :EC83     startaddr Move
161                 *
162 EAA0 52                 DATA  :52       R
163 EAA1 0FEF               DBL   :EF0F     startaddr Read
164                 *
165 EAA3 53                 DATA  :53       S
166 EAA4 5CED               DBL   :ED5C     startaddr Substitute
167                 *
168 EAA6 56                 DATA  :56       V
169 EAA7 77ED               DBL   :ED77     startaddr Vector Examine
170                 *
171 EAA9 57                 DATA  :57       W
172 EAAA E4EE               DBL   :EEE4     startaddr Write
173                 *
174 EAAC 58                 DATA  :58       X
175 EAAD 6EED               DBL   :ED6E     startaddr Examine
176                 *
177 EAAF 5A                 DATA  :5A       Z
178 EAB0 BAEC               DBL   :ECBA     startaddr Reset
179                 *
180 EAB2 FF                 DATA  :FF       End table
181                 *
182                 ***************
183                 * D - DISPLAY *
184                 ***************
185                 *
186                 * Displays contents of memory. Two address values
187                 * are required which specify the range of memory

PAGE 04    DAI FIRMWARE 3EA00-3EB25  V1.1

188                 * to be displayed. Break will abort the print out.
189                 *
190                 * Exit: CY=1, All registers corrupted.
191                 *
192 EAB3 0E02       DISPK   MVI   C,:02     Nr of addr inputs required
193 EAB5 CDDEEA             CALL  :EADE     Get laddr and haddr on stack
194 EAB8 0D                 DCR   C
195 EAB9 F262EA             JP    :EA62     Error if only 1 addr given
196 EABC D1                 POP   D         Haddr in DE
197 EABD E1                 POP   H         Laddr in HL
198                             
199                 * Direct call entry:
200                             
201                 *DISL1
202 EABE CD3AED     DISP    CALL  :ED3A     Print car.ret
203 EAC1 CD18ED             CALL  :ED18     Print laddr in ASCII
204 EAC4 CD01ED     DISL2   CALL  :ED01     Print space
205 EAC7 7E                 MOV   A,M       Get contents laddr
206 EAC8 CD1DED             CALL  :ED1D     Print it in ASCII
207 EACB CD80ED             CALL  :ED80     INX H; check if ready
208 EACE D8                 RC              Quit if ready
209 EACF CDC2EE             CALL  :EEC2     Scan for Break pressed,
210                                         abort if pressed.
211 EAD2 7D                 MOV   A,L
212 EAD3 E60F               ANI   :0F       Last instr on line?
213 EAD5 CABEEA             JZ    :EABE     Then car.ret and continue
214 EAD8 C3C4EA             JMP   :EAC4     Next addr
215                 *
216                 **************************
217                 * ADDRESS ARGUMENT INPUT *
218                 **************************
219                 *
220                 * The keyboard is scanned and the inputs are
221                 * evaluated.
222                 * (C) address arguments will be input and put on
223                 * stack (LIFO). On return, C contains the
224                 * difference between number entered and number
225                 * desired. At least one argument is returned.
226                 * Only the last 4 hex characters are used for the
227                 * address value. Arguments are delimited by a
228                 * space. The entry is terminated by CR, ESC, last
229                 * argument or an invalid character (then error
230                 * exit). Escape returns with CY set.
231                 *
232                 * Entry: C: max. nr of datablocks/addresses.
233                 * Exit:  B: Last character typed in (terminator).
234                 *        AFHL corrupted, DE preserved.
235                 *
236 EADB AF         ADALT   XRA   A         A=0
237 EADC B9                 CMP   C         Max nr of inputs reached?
238 EADD C8                 RZ              Then return
239 EADE 210000     ADARG   LXI   H,:0000
240 EAE1 CD06ED     ADACL   CALL  :ED06     Scan keyb, print char
241 EAE4 47                 MOV   B,A       Store char in B
242 EAE5 CD15EB             CALL  :EB15     Convert it to hex
243 EAE8 DAF4EA             JC    :EAF4     If char not 0-F: check if
244                                         delimiter
245 EAEB 29         ADACE   DAD   H         )
246 EAEC 29                 DAD   H         ) Move bits 1 nibble
247 EAED 29                 DAD   H         ) (compose addr from inputs)
248 EAEE 29                 DAD   H         )
249 EAEF 85                 ADD   L         Add hex char to L

PAGE 05    DAI FIRMWARE 3EA00-3EB25  V1.1

250 EAF0 6F                 MOV   L,A       and store it
251 EAF1 C3E1EA             JMP   :EAE1     Next char
252                             
253                 * Check for delimiter/terminator:
254                             
255 EAF4 E3         ADADC   XTHL            Save given addr on stack
256 EAF5 E5                 PUSH  H         Save returnaddr again
257 EAF6 0D                 DCR   C         decr input counter
258 EAF7 78                 MOV   A,B       Get char last input
259 EAF8 FE20               CPI   :20       Space ?
260 EAFA CADBEA             JZ    :EADB     Then get next addr
261 EAFD FE0D               CPI   :0D       Car.ret ?
262 EAFF C8                 RZ              Then ready
263 EB00 FE12               CPI   :12       Escape?
264 EB02 37                 STC             Then CY=1
265 EB03 C8                 RZ              and return
266 EB04 C362EA             JMP   :EA62     Else goto Error
267                             
268                 * As ADARG, but carry return if 1st character is
269                 * not a legal hex digit:
270                             
271 EB07 210000     ADART   LXI   H,:0000   Immediate delimiter
272 EB0A CD06ED             CALL  :ED06     Scan keyb, print char
273 EB0D 47                 MOV   B,A       Store char in B
274 EB0E CD15EB             CALL  :EB15     Convert it to hex
275 EB11 D8                 RC              Return if no hex char
276 EB12 C3EBEA             JMP   :EAEB     Into previous routine
277                 *
278                 * CONVERT NUMBER FROM ASCII TO HEX-VALUE:
279                 *
280                 * Entry: Character in A (bit 7 must be 0).
281                 * Exit:  CY=0: Hex-value in A.
282                 *        CY=1: Input was not 0-F; (A) useless.
283                 *        BCDEHL preserved.
284                 *
285 EB15 D630       ASHEX   SUI   :30
286 EB17 D8                 RC              Error if #00-#2F
287 EB18 FE0A               CPI   :0A
288 EB1A DA24EB             JC    :EB24     O.K. if number 0-9
289 EB1D D607               SUI   :07
290 EB1F FE0A               CPI   :0A
291 EB21 D8                 RC              Error if #3A-#3F
292 EB22 FE10               CPI   :10
293 EB24 3F         ASHCC   CMC             O.K. if 0-9, A-F
294 EB25 C9                 RET 
295                 *
296                 *
297                 *
301 EB26                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
ADACE  EAEB   ADACL  EAE1   ADADC  EAF4   ADALT  EADB   
ADARG  EADE   ADART  EB07   ASHCC  EB24   ASHEX  EB15   
CALRX  EA0D   CMDTB  EA8E   DISL1  EABE   DISL2  EAC4   
DISP   EABE   DISPK  EAB3   ERROR  EA62   ERRST  EA6A   
L3E158 EA00   L3E159 EA04   L3E160 EA09   L3E162 EA3C   
L3E163 EA42   L3E164 EA54   MSGSO  EA7D   RESET  EA74
