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