
PAGE 01    DAI FIRMWARE C437-C613  V1.0  Rev.1

002                         ORG   :C437
003                 *
004                 *
005                 *
006                 ************************
007                 * FPT NUMBER CONSTANTS *
008                 ************************
009                 *
010                 * For the first 7 numbers, the 1st byte is the
011                 * power of 10 for division.
012                 *
013 C437 00         LC234   DATA  :00
014 C438 02                 DATA  :02       FPT (2^1)/10^0
015 C439 80                 DATA  :80
016 C43A 00                 DATA  :00
017 C43B 00                 DATA  :00
018                 *
019 C43C 00                 DATA  :00
020 C43D 03                 DATA  :03       FPT (2^2)/10^0
021 C43E 80                 DATA  :80
022 C43F 00                 DATA  :00
023 C440 00                 DATA  :00
024                 *
025 C441 01                 DATA  :01
026 C442 01                 DATA  :01       FPT (2^4)/10^1
027 C443 CC                 DATA  :CC
028 C444 CC                 DATA  :CC
029 C445 CD                 DATA  :CD
030                 *
031 C446 02                 DATA  :02
032 C447 02                 DATA  :02       FPT (2^8)/10^2
033 C448 A3                 DATA  :A3
034 C449 D7                 DATA  :D7
035 C44A 0A                 DATA  :0A
036                 *
037 C44B 04                 DATA  :04
038 C44C 03                 DATA  :03       FPT (2^16)/10^4
039 C44D D1                 DATA  :D1
040 C44E B7                 DATA  :B7
041 C44F 17                 DATA  :17
042                 *
043 C450 09                 DATA  :09
044 C451 03                 DATA  :03       FPT (2^32)/10^9
045 C452 89                 DATA  :89
046 C453 70                 DATA  :70
047 C454 5F                 DATA  :5F
048                 *
049 C455 13                 DATA  :13
050 C456 01                 DATA  :01       FPT (2^64)/10^19
051 C457 EC                 DATA  :EC
052 C458 1E                 DATA  :1E
053 C459 4A                 DATA  :4A
054                 *
055 C45A 7D         LC238   DATA  :7D       FPT (0.1)
056 C45B CC                 DATA  :CC
057 C45C CC                 DATA  :CC
058 C45D CD                 DATA  :CD
059                 *
060 C45E 00         FP0     DATA  :00       FPT (0)
061 C45F 00                 DATA  :00
062 C460 00                 DATA  :00
063 C461 00                 DATA  :00

PAGE 02    DAI FIRMWARE C437-C613  V1.0  Rev.1

064                 *
065 C462 01         FP1     DATA  :01       FPT (1)
066 C463 80                 DATA  :80
067 C464 00                 DATA  :00
068 C465 00                 DATA  :00
069                 *
070 C466 02         FP2     DATA  :02       FPT (2)
071 C467 80                 DATA  :80
072 C468 00                 DATA  :00
073 C469 00                 DATA  :00
074                 *
075 C46A 02         FP3     DATA  :02       FPT (3)
076 C46B C0                 DATA  :C0
077 C46C 00                 DATA  :00
078 C46D 00                 DATA  :00
079                 *
080 C46E 03         FP4     DATA  :03       FPT (4)
081 C46F 80                 DATA  :80
082 C470 00                 DATA  :00
083 C471 00                 DATA  :00
084                 *
085 C472 03         FP5     DATA  :03       FPT (5)
086 C473 A0                 DATA  :A0
087 C474 00                 DATA  :00
088 C475 00                 DATA  :00
089                 *
090 C476 03         FP6     DATA  :03       FPT (6)
091 C477 C0                 DATA  :C0
092 C478 00                 DATA  :00
093 C479 00                 DATA  :00
094                 *
095 C47A 03         FP7     DATA  :03       FPT (7)
096 C47B E0                 DATA  :E0
097 C47C 00                 DATA  :00
098 C47D 00                 DATA  :00
099                 *
100 C47E 04         FP8     DATA  :04       FPT (8)
101 C47F 80                 DATA  :80
102 C480 00                 DATA  :00
103 C481 00                 DATA  :00
104                 *
105 C482 04         FP9     DATA  :04       FPT (9)
106 C483 90                 DATA  :90
107 C484 00                 DATA  :00
108 C485 00                 DATA  :00
109                 *
110                 *********************************
111                 * PRETTIES UP FPT OR INT NUMBER *
112                 *********************************
113                 *
114                 * Entry: B:     Fix/float flag: (0=fix, 1=float).
115                 *        A:     Nr. of useable digits in string in
116                 *               00E4-F0 (not counting additional
117                 *               digit for rounding).
118                 *        00F1:  Nr. of digits before '.' (exponent).
119                 *        00E4:  Sign '+' or '-'.
120                 *        00E5:  Decimal point.
121                 *        E6-F0: Digits.
122                 * Exit:  All registers preserved.
123                 *        00E3:  Length of string.
124                 *        E4-F0: Output string.
125                 *

PAGE 03    DAI FIRMWARE C437-C613  V1.0  Rev.1

126                 * Format: Sign in 00E4 is blank or '-'.
127                 *         If exponent is 0:
128                 *               real case: '0.digits'
129                 *               int. case: no final '.'
130                 *               real case if INT: '.0'
131                 *         If exponent < -1:  E-format
132                 *         If exponent too large: E-format
133                 *         In E-format no '.0'
134                 *
135 C486 F5         PRTY    PUSH  PSW
136 C487 C5                 PUSH  B
137 C488 D5                 PUSH  D
138 C489 E5                 PUSH  H
139 C48A 21E600             LXI   H,:00E6   Startaddr digits
140 C48D 4F                 MOV   C,A       Save nr. useable digits
141 C48E C5                 PUSH  B
142 C48F 0600               MVI   B,:00
143 C491 09                 DAD   B         HL pnt to last useable digit
144 C492 7E                 MOV   A,M       Get last digit
145 C493 FE35               CPI   :35       Check for rounding
146 C495 DAAFC4             JC    :C4AF     If <5
147 C498 2B         LC91    DCX   H
148 C499 7E                 MOV   A,M       Get digit before
149 C49A FE39               CPI   :39
150 C49C CAA3C4             JZ    :C4A3     If it is 9
151 C49F 34                 INR   M         Rounding upwards
152 C4A0 C3AFC4             JMP   :C4AF     Abort rounding
153 C4A3 3630       LC92    MVI   M,:30     Make digit before 0
154 C4A5 0D                 DCR   C         Decr. nr of digits
155 C4A6 C298C4             JNZ   :C498     Cont. check for rounding
156 C4A9 3631               MVI   M,:31     Make nr=1 if all digits 9
157 C4AB 21F100             LXI   H,:00F1
158 C4AE 34                 INR   M         Incr nr of digits before '.'
159 C4AF C1         LC93    POP   B
160 C4B0 0C                 INR   C         Incr. nr useable digits
161 C4B1 3AF100             LDA   :00F1     Get nr of digits before '.'
162 C4B4 B7                 ORA   A
163 C4B5 CAD8C4             JZ    :C4D8     If 0
164 C4B8 FAE1C4             JM    :C4E1     If too many digits
165 C4BB 80                 ADD   B         Add fix/float flag
166 C4BC B9                 CMP   C
167 C4BD D2E1C4             JNC   :C4E1     If too many digits
168 C4C0 CD9CC6             CALL  :C69C     Restore A, insert '.'
169                                         after number string
170 C4C3 79         LC94    MOV   A,C       Length string in A
171 C4C4 CD4BC5             CALL  :C54B     Calc nr of digits for output
172 C4C7 3C         LC95    INR   A         Add 1
173 C4C8 21E300             LXI   H,:00E3
174 C4CB 77                 MOV   M,A       String length in outbuf
175 C4CC 23                 INX   H
176 C4CD 7E                 MOV   A,M       Get sign
177 C4CE FE2B               CPI   :2B       '+' ?
178 C4D0 C2D5C4             JNZ   :C4D5     Then abort
179 C4D3 3620               MVI   M,:20     Replace '+' by blank
180 C4D5 C34DC1     LC96    JMP   :C14D     Popall, ret
181                             
182                 * If format '0.digits':
183                             
184 C4D8 CD1AC5     LC97    CALL  :C51A     Move string right 1 pos.
185 C4DB 3630               MVI   M,:30     Insert 0 in 00E5
186 C4DD 0C                 INR   C         Update nr of digits
187 C4DE C3C3C4             JMP   :C4C3     Update string

PAGE 04    DAI FIRMWARE C437-C613  V1.0  Rev.1

188                             
189                 * If too many digits:
190                             
191 C4E1 3E01       LC98    MVI   A,:01
192 C4E3 CD31C5             CALL  :C531     Move string left 1 pos,
193                                         insert '.' after string
194 C4E6 79                 MOV   A,C       Get nr of digits
195 C4E7 0600               MVI   B,:00
196 C4E9 CD4BC5             CALL  :C54B     Calc nr of digits for output
197 C4EC 47                 MOV   B,A       in B
198 C4ED 3AF100             LDA   :00F1     Get nr of digits before '.'
199 C4F0 3D                 DCR   A         Minus 1
200 C4F1 3645               MVI   M,:45     'E' in buf after last digit
201 C4F3 23                 INX   H
202 C4F4 04                 INR   B         Incr. nr of digits
203 C4F5 B7                 ORA   A         Flags on exponent
204 C4F6 F2FFC4             JP    :C4FF     If exp. positive
205                             
206                 * If exponent negative:
207                             
208 C4F9 362D               MVI   M,:2D     Store '-' in buffer
209 C4FB 23                 INX   H
210 C4FC 04                 INR   B         Incr nr of digits
211 C4FD 2F                 CMA 
212 C4FE 3C                 INR   A         2-compl of exponent
213                             
214                 * Exponent to buffer:
215                             
216 C4FF 110A2F     LC99    LXI   D,:2F0A
217 C502 93         LC100   SUB   E         Exp.-10 (unit value)
218 C503 14                 INR   D         ASCII-count 10's-value
219 C504 D202C5             JNC   :C502     If rest exp. still >10
220 C507 C63A               ADI   :3A       Convert rest to Ascii
221 C509 5F                 MOV   E,A       in E
222 C50A 7A                 MOV   A,D       Get 10's value
223 C50B FE30               CPI   :30
224 C50D CA13C5             JZ    :C513     If exp. <10
225 C510 77                 MOV   M,A       10's value exp. in buf
226 C511 23                 INX   H
227 C512 04                 INR   B         Incr nr of digits
228 C513 73         LC101   MOV   M,E       Unit value exp. in buf
229 C514 23                 INX   H
230 C515 04                 INR   B         Incr nr of digits
231 C516 78                 MOV   A,B       into A
232 C517 C3C7C4             JMP   :C4C7     Prepare string for output
233                 *
234                 * MOVE STRING IN OUTPUTBUFFER RIGHT 1 POS.:
235                 *
236                 * The contents of 00E5-EF is moved up one
237                 * position to 00E6-F0.
238                 *
239                 * Entry: No conditions.
240                 * Exit:  ABCDEF preserved.
241                 *        HL points to 00E5.
242                 *
243 C51A F5         LC102   PUSH  PSW
244 C51B C5                 PUSH  B
245 C51C D5                 PUSH  D
246 C51D 21F000             LXI   H,:00F0   Highest destination address.
247 C520 54                 MOV   D,H
248 C521 5D                 MOV   E,L
249 C522 1B                 DCX   D         Highest source address.

PAGE 05    DAI FIRMWARE C437-C613  V1.0  Rev.1

250 C523 060B               MVI   B,:0B     Number of bytes.
251 C525 1A         LC103   LDAX  D         Get byte
252 C526 77                 MOV   M,A       and move it.
253 C527 1B                 DCX   D
254 C528 2B                 DCX   H
255 C529 05                 DCR   B
256 C52A C225C5             JNZ   :C525     Next byte if not ready
257 C52D D1                 POP   D
258 C52E C1                 POP   B
259 C52F F1                 POP   PSW
260 C530 C9                 RET 
261                 *
262                 * MOVE STRING IN OUTPUTBUFFER LEFT 1 POS.:
263                 *
264                 * The string, beginning on 00E6, is moved one
265                 * memory location downwards. A '.' is inserted
266                 * after the string.
267                 *
268                 * Entry: A: number of bytes to be transferred.
269                 * Exit:  All registers preserved.
270                 *
271 C531 F5         LC104   PUSH  PSW
272 C532 C5                 PUSH  B
273 C533 D5                 PUSH  D
274 C534 E5                 PUSH  H
275 C535 47                 MOV   B,A       Store number of bytes
276 C536 21E500             LXI   H,:00E5   Lowest destination address
277 C539 11E600             LXI   D,:00E6   Lowest source address
278 C53C 1A         LC105   LDAX  D         Get byte
279 C53D 77                 MOV   M,A       and move it
280 C53E 13                 INX   D
281 C53F 23                 INX   H
282 C540 05                 DCR   B
283 C541 C23CC5             JNZ   :C53C     Next byte if not ready
284 C544 362E               MVI   M,:2E     Insert '.' after string
285 C546 E1                 POP   H
286 C547 D1                 POP   D
287 C548 C1                 POP   B
288 C549 F1                 POP   PSW
289 C54A C9                 RET 
290                 *
291                 * CALCULATE NUMBER OF DIGITS FOR OUTPUT:
292                 *
293                 * Entry: Total nr of string digits in A and C.
294                 *        B: Flag for INT (0) or FPT (1).
295                 *        Digits in 00E4 to 00E4 + A.
296                 * Exit:  A:  Nr of bytes for output:
297                 *                  INT: excl. trailing '.0'
298                 *                  FPT: incl. trailing '.0'
299                 *        HL: If last non-zero byte is not '.':
300                 *            points after last byte.
301                 *            Else: INT: points to '.'
302                 *                  FPT: after '.0'
303                 *
304 C54B C5         LC106   PUSH  B
305 C54C D5                 PUSH  D
306 C54D 21E400             LXI   H,:00E4   Startaddr string
307 C550 5F                 MOV   E,A       Total nr of digits in E
308 C551 1600               MVI   D,:00
309 C553 19                 DAD   D         Calc end of string
310 C554 7E         LC107   MOV   A,M       Get digit
311 C555 FE30               CPI   :30

PAGE 06    DAI FIRMWARE C437-C613  V1.0  Rev.1

312 C557 C25FC5             JNZ   :C55F     If non-zero
313 C55A 2B                 DCX   H         Points to previous digit
314 C55B 0D                 DCR   C         Decr nr of digits
315 C55C C354C5             JMP   :C554     Again till non-zero found
316                             
317                 * If non-zero digit found:
318                             
319 C55F FE2E       LC108   CPI   :2E       '.' ?
320 C561 23                 INX   H
321 C562 C26FC5             JNZ   :C56F     Abort if not
322 C565 2B                 DCX   H         Pnts after last non-zero,
323                                         non-'.' digit
324 C566 0D                 DCR   C         Excl. '.'
325 C567 05                 DCR   B
326 C568 C26FC5             JNZ   :C56F     If INT case
327 C56B 23                 INX   H         ) If FPT case: pnts
328 C56C 23                 INX   H         ) after '.0'
329 C56D 0C                 INR   C
330 C56E 0C                 INR   C         Incl. '.0'
331 C56F 79         LC109   MOV   A,C       Nr of digits for output
332 C570 D1                 POP   D
333 C571 C1                 POP   B
334 C572 C9                 RET 
335                 *
336                 ********************************
337                 * INPUT INTEGER NUMBER TO MACC *
338                 ********************************
339                 *
340                 * Read string of digits from line and convert
341                 * it to binary in MACC.
342                 *
343                 * Entry: BC points to input character.
344                 * Exit:  BC points after INT number.
345                 *        ADEHL preserved.
346                 *        CY=1: there were digits.
347                 *        CY=0: No digits.
348                 *
349 C573 37         ICB     STC 
350 C574 F5                 PUSH  PSW
351 C575 D5                 PUSH  D
352 C576 E5                 PUSH  H
353 C577 CD98C5             CALL  :C598     Clear MACC and 00E3-E6.
354 C57A CD73C0     LC110   CALL  :C073     Get digit from line
355 C57D D630               SUI   :30       Convert ASCII to binary
356 C57F DA90C5             JC    :C590     )
357 C582 FE0A               CPI   :0A       ) Abort if no number
358 C584 D290C5             JNC   :C590     )
359 C587 2110C6             LXI   H,:C610   Addr INT(10)
360 C58A CDA5C5             CALL  :C5A5     MACC=MACC*10 + digit
361 C58D C37AC5             JMP   :C57A     Next digit
362 C590 15         LC111   DCR   D
363 C591 14                 INR   D
364 C592 C2A2C2             JNZ   :C2A2     If digits: Pop, ret
365 C595 C3A9C2             JMP   :C2A9     If no digits: CY=0, Pop, ret
366                 *
367                 * CLEAR MACC AND 00E3-00E6:
368                 *
369                 * Both MACC and registers 00E3-E6 are loaded
370                 * with the value of FPT (0).
371                 *
372                 * Exit: ABCE preserved. D=0.
373                 *

PAGE 07    DAI FIRMWARE C437-C613  V1.0  Rev.1

374 C598 215EC4     LC112   LXI   H,:C45E   Addr. FPT(0)
375 C59B E7                 RST   4         Copy FPT(0) to MACC
376 C59C 0C                 DATA  :0C
377 C59D 21E300             LXI   H,:00E3
378 C5A0 E7                 RST   4         Copy FPT(0) to 00E3-E6
379 C5A1 0F                 DATA  :0F
380 C5A2 1600               MVI   D,:00     Clear D
381 C5A4 C9                 RET 
382                 *
383                 * MACC = MACC*10 + DIGIT FROM LINE:
384                 *
385                 * Entry: HL: points to INT (10).
386                 *        A:  digit to be added.
387                 *
388 C5A5 E7         LC113   RST   4         MACC=MACC*10 (INT)
389 C5A6 54                 DATA  :54
390 C5A7 0C         LC114   INR   C
391 C5A8 15                 DCR   D
392 C5A9 32E600             STA   :00E6     Digit in lobyte E3-E6
393 C5AC 21E300             LXI   H,:00E3
394 C5AF E7                 RST   4         Add (E3-E6) to MACC (INT)
395 C5B0 4E                 DATA  :4E
396 C5B1 C9                 RET 
397                 *
398                 *************************************
399                 * CONVERT INTEGER NUMBER FOR OUTPUT *
400                 *************************************
401                 *
402                 * Places ASCII string from INT MACC contents in
403                 * output buffer 00E4-F0.
404                 * 00E4 is sign, 00E5 is '.', 00E6-F0 is value,
405                 * 00F1 is nr of digits.
406                 *
407                 * Exit: A: Number of digits.
408                 *       BCDEHL preserved.
409                 *
410 C5B2 C5         IBC     PUSH  B
411 C5B3 D5                 PUSH  D
412 C5B4 E5                 PUSH  H
413 C5B5 CD1EC2             CALL  :C21E     Save MACC to TOS
414 C5B8 CDE0C5             CALL  :C5E0     Abs.value of MACC in reg
415                                         A,B,C,D; Prepare 00E4-E6
416 C5BB CD1EC2     LC115   CALL  :C21E     Save MACC to TOS
417 C5BE 2110C6             LXI   H,:C610   Addr INT(10)
418 C5C1 E7                 RST   4         MACC = remainder MACC/10
419 C5C2 5A                 DATA  :5A
420 C5C3 E7                 RST   4         Copy MACC to reg A,B,C,D
421 C5C4 15                 DATA  :15
422 C5C5 7A                 MOV   A,D       Lobyte in A
423 C5C6 CDFAC5             CALL  :C5FA     Digit into 00E5-F0
424 C5C9 CD34C2             CALL  :C234     Retrieve MACC from TOS
425 C5CC E7                 RST   4         MACC = MACC/10 (INT)
426 C5CD 57                 DATA  :57
427 C5CE E7                 RST   4         Copy MACC to reg A,B,C,D
428 C5CF 15                 DATA  :15
429 C5D0 B0                 ORA   B
430 C5D1 B1                 ORA   C
431 C5D2 B2                 ORA   D
432 C5D3 C2BBC5             JNZ   :C5BB     Again if <>0
433 C5D6 CD06C6             CALL  :C606     '.' in 00E5; length in 00F1
434 C5D9 CD34C2             CALL  :C234     Retrieve MACC from TOS
435 C5DC E1                 POP   H

PAGE 08    DAI FIRMWARE C437-C613  V1.0  Rev.1

436 C5DD D1                 POP   D
437 C5DE C1                 POP   B
438 C5DF C9                 RET 
439                 *
440                 * PREPARE 00E4-E6:
441                 *
442                 * 00E4-E6 is set to +00 or -00, depending on sign
443                 * of contents MACC. In the MACC remains the absolute
444                 * value. The registers A,B,C,D contain the original
445                 * contents of the MACC.
446                 *
447                 * Exit: E=0. HL preserved. AFBCD corrupted.
448                 *
449 C5E0 E5         LC116   PUSH  H
450 C5E1 21E400             LXI   H,:00E4
451 C5E4 E7                 RST   4         Copy MACC to reg A,B,C,D
452 C5E5 15                 DATA  :15
453 C5E6 B7                 ORA   A         Set flags on sign
454 C5E7 362B               MVI   M,:2B     '+' in 00E4
455 C5E9 F2F0C5             JP    :C5F0     Jump if nr is positive
456 C5EC 362D               MVI   M,:2D     Else '-' in 00E4
457 C5EE E7                 RST   4         and make contents MACC pos.
458 C5EF 60                 DATA  :60
459 C5F0 23         LC117   INX   H
460 C5F1 3630               MVI   M,:30     0 in 00E5
461 C5F3 23                 INX   H
462 C5F4 3630               MVI   M,:30     0 in 00E6
463 C5F6 1E00               MVI   E,:00     Digit count is 0
464 C5F8 E1                 POP   H
465 C5F9 C9                 RET 
466                 *
467                 * STORE DIGIT IN OUTPUT BUFFER 00E5-00F0:
468                 *
469                 * Entry: Digit in A.
470                 * Exit:  Digit in 00E5-F0 as most sign. digit.
471                 *        E:  Count of digit in buffer.
472                 *        BCDHL preserved. AF corrupted.
473                 *
474 C5FA E5         LC118   PUSH  H
475 C5FB F5                 PUSH  PSW
476 C5FC CD1AC5             CALL  :C51A     Move contents buffer right
477 C5FF F1                 POP   PSW
478 C600 C630               ADI   :30       Make digit ASCII
479 C602 77                 MOV   M,A       Digit in 00E5 inserted.
480 C603 1C                 INR   E         Update digit count.
481 C604 E1                 POP   H
482 C605 C9                 RET 
483                 *
484                 * ADD A '.' TO A DIGIT STRING IN OUTPUTBUFFER:
485                 *
486                 * A '.' is placed at the beginning of a digit
487                 * string in the output buffer. The length of the
488                 * string is stored in 00F1.
489                 *
490                 * Entry: E:  Digit count.
491                 *        HL: Points to 00E5.
492                 * Exit:  A:  Count.
493                 *        BCDEHL preserved.
494                 *
495 C606 CD1AC5     LC119   CALL  :C51A     Move contents outbuf right
496                                         one position
497 C609 362E               MVI   M,:2E     '.' at begin of string

PAGE 09    DAI FIRMWARE C437-C613  V1.0  Rev.1

498 C60B 7B                 MOV   A,E       Get digit count
499 C60C 32F100             STA   :00F1     Store it in buffer
500 C60F C9                 RET 
501                 *
502                 * DATA:
503                 *
504 C610 00         I10     DATA  :00       INT (10)
505 C611 00                 DATA  :00
506 C612 00                 DATA  :00
507 C613 0A                 DATA  :0A
508                 *
509                 *
510                 *
511 C614                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
FP0    C45E   FP1    C462   FP2    C466   FP3    C46A   
FP4    C46E   FP5    C472   FP6    C476   FP7    C47A   
FP8    C47E   FP9    C482   I10    C610   IBC    C5B2   
ICB    C573   LC100  C502   LC101  C513   LC102  C51A   
LC103  C525   LC104  C531   LC105  C53C   LC106  C54B   
LC107  C554   LC108  C55F   LC109  C56F   LC110  C57A   
LC111  C590   LC112  C598   LC113  C5A5   LC114  C5A7   
LC115  C5BB   LC116  C5E0   LC117  C5F0   LC118  C5FA   
LC119  C606   LC234  C437   LC238  C45A   LC91   C498   
LC92   C4A3   LC93   C4AF   LC94   C4C3   LC95   C4C7   
LC96   C4D5   LC97   C4D8   LC98   C4E1   LC99   C4FF   
PRTY   C486
