PAGE 01 DAI FIRMWARE 3EB26-3EC44 V1.0 Rev.1 002 ORG :EB26 003 * 004 * 005 * 006 ************ 007 * L - LOOK * 008 ************ 009 * 010 EB26 0E03 LOOKK MVI C,:03 Nr datablocks allowed 011 EB28 CD07EB CALL :EB07 Scan keyb, display char, 012 get addresses on stack 013 EB2B 2A5D00 LHLD :005D Get addr next instr 014 EB2E EB XCHG in DE 015 EB2F 79 MOV A,C Get nr of inputs done 016 EB30 FE03 CPI :03 No addr given? 017 EB32 3E00 MVI A,:00 018 EB34 CC56EB CZ :EB56 No addr: Check CR given 019 EB37 C441EB CNZ :EB41 Else: store windows and 020 start program 021 EB3A 325000 STA :0050 Set Look flag 022 EB3D EB XCHG Addr next instr in HL 023 EB3E C335EF JMP :EF35 Init RST 0 024 * 025 * SET LOOK WINDOWS. START LOOK: 026 * 027 * Entry: A=0, C=3 minus number of fields read. 028 * Exit: Input 2 fields: A,C = 0. 029 * Input 3 fields: A,C = FF. DE corrupted. 030 * B preserved, HL corrupted. 031 * 032 EB41 0D L3E178 DCR C 033 EB42 0D DCR C 034 EB43 CA62EA JZ :EA62 Error if only 1 addr given 035 EB46 E1 POP H Get returnaddr from stack 036 EB47 E3 XTHL haddr window in HL 037 EB48 224800 SHLD :0048 Save haddr 038 EB4B E1 POP H Return addr from stack 039 EB4C E3 XTHL laddr window in HL 040 EB4D 224A00 SHLD :004A Save laddr 041 EB50 0C INR C 042 EB51 C8 RZ Ready if only window given 043 044 * If startaddress given: 045 046 EB52 3D DCR A A=FF 047 EB53 E1 POP H Get returnaddr from stack 048 EB54 D1 POP D Get startaddr program in DE 049 EB55 E9 PCHL Return 050 * 051 ****************************** 052 * GO/LOOK: CHECK FOR CAR.RET * 053 ****************************** 054 * 055 * Entry: B: Character to be checked. 056 * Exit: AF corrupted, BCDEHL preserved. 057 * 058 EB56 78 L3E179 MOV A,B Get last char typed in 059 EB57 D60D SUI :0D 060 EB59 C262EA JNZ :EA62 Error if not CR 061 EB5C C9 RET 062 * 063 * PAGE 02 DAI FIRMWARE 3EB26-3EC44 V1.0 Rev.1 064 ********************* 065 * RESTART 0 (RST 0) * 066 ********************* 067 * 068 * The RST 0 function is used to operate 'LOOK'. 069 * Via a timer 1 interrupt, RST 0 is called. 070 * The vectoraddress #EB5D must have been 071 * initialised by a Z2 or Z3 command. 072 * 073 * On entry, HL and PC are on stack (see 0000 074 * -0007). 075 * 076 EB5D F5 L3E180 PUSH PSW 077 EB5E 00 NOP 078 EB5F 3A4700 LDA :0047 Get stored EI/DI 079 EB62 D6FB SUI :FB 080 EB64 CA6CEB JZ :EB6C Jump if EI stored 081 EB67 3E01 MVI A,:01 Else: Set int. mask 082 EB69 32F8FF STA :FFF8 for timer 1 only 083 084 * Save all registers in RAM area: 085 086 EB6C FB L3E181 EI 087 EB6D F1 POP PSW Restore PSW 088 EB6E E1 POP H Restore HL 089 EB6F 225900 SHLD :0059 Save HL 090 EB72 F5 PUSH PSW 091 EB73 C5 PUSH B 092 EB74 D5 PUSH D 093 EB75 E1 POP H 094 EB76 225700 SHLD :0057 Save DE 095 EB79 E1 POP H 096 EB7A 225500 SHLD :0055 Save BC 097 EB7D E1 POP H 098 EB7E 225300 SHLD :0053 Save PSW 099 EB81 E1 POP H 100 EB82 225D00 SHLD :005D Save PC 101 102 * Check if PC points to 004D-4E: 103 104 EB85 11B3FF LXI D,:FFB3 105 EB88 19 DAD D 106 EB89 EB XCHG DE=PC+FFB3 (=PC-004D) 107 EB8A 2A5100 LHLD :0051 Get addr where to continue 108 EB8D 7A MOV A,D 109 EB8E B7 ORA A 110 EB8F C298EB JNZ :EB98 Jump if out of interrupt 111 routine 112 EB92 B3 ORA E 113 EB93 FE04 CPI :04 114 EB95 DA3EEC JC :EC3E Jump if PC = 004D-4E 115 116 * Put returnaddress on stack if current instruction 117 * is a RST or a CALL instruction: 118 119 EB98 06C7 L3E182 MVI B,:C7 120 EB9A 7E MOV A,M Get instr code of next instr 121 EB9B FECD CPI :CD 122 EB9D CAACEB JZ :EBAC Jump if it is a CALL 123 EBA0 A0 ANA B ) Check if it is a RST 124 EBA1 B8 CMP B ) 125 EBA2 CAAEEB JZ :EBAE Then jump PAGE 03 DAI FIRMWARE 3EB26-3EC44 V1.0 Rev.1 126 EBA5 7E MOV A,M Get instr code 127 EBA6 A0 ANA B ) Check if it is a 128 EBA7 FEC4 CPI :C4 ) conditional CALL 129 EBA9 C2B0EB JNZ :EBB0 Jump if not 130 EBAC 23 L3E183 INX H 131 EBAD 23 INX H 132 EBAE 23 L3E184 INX H 133 EBAF E3 XTHL Addr next instr on stack 134 if it was a RST or CALL 135 136 * Check if current instruction is inside window: 137 138 EBB0 210000 L3E185 LXI H,:0000 139 EBB3 39 DAD SP 140 EBB4 225B00 SHLD :005B Save SP 141 EBB7 CDE7ED CALL :EDE7 Exchange bytes in reg. save 142 area 143 EBBA 2A5100 LHLD :0051 Get addr current instr 144 EBBD EB XCHG in DE 145 EBBE 2A4A00 LHLD :004A Get laddr window 146 EBC1 CD45EC CALL :EC45 Compare DE-HL 147 EBC4 FADCEB JM :EBDC Jump if addr outside window 148 EBC7 2A4800 LHLD :0048 Get haddr window 149 EBCA CD45EC CALL :EC45 Compare DE-HL 150 EBCD D2DCEB JNC :EBDC Jump if addr outside window 151 152 * Print registers contents if address inside window: 153 154 EBD0 CD3AED CALL :ED3A Print car.ret 155 EBD3 115100 LXI D,:0051 Startaddr reg. save area 156 EBD6 219CEE LXI H,:EE9C Startaddr symbol table 157 EBD9 CD44EE CALL :EE44 Print reg. contents 158 EBDC CDC2EE L3E186 CALL :EEC2 Scan for Break pressed; 159 evt run Break 160 EBDF 2A5D00 LHLD :005D Get addr next instr 161 162 * Disable UT to trace itself: 163 * Entry from init, RST0. 164 * HL is address where to continu. 165 166 EBE2 3EEA L3E187 MVI A,:EA 167 EBE4 BC CMP H Check if hibyte = EA 168 EBE5 C2EEEB JNZ :EBEE Jump if not 169 EBE8 3E0D MVI A,:0D 170 EBEA BD CMP L Check if lobyte = 0D 171 EBEB CA62EA JZ :EA62 Then go to Error 172 173 * Check if next opcode is RST or EI/DI: 174 175 EBEE F3 L3E188 DI 176 EBEF 225100 SHLD :0051 Save addr current instr 177 EBF2 114C00 LXI D,:004C 178 EBF5 EB XCHG 179 EBF6 225D00 SHLD :005D Set addr next instr = 004C 180 EBF9 EB XCHG 181 EBFA 7E MOV A,M Get opcode of instr 182 EBFB E6C7 ANI :C7 183 EBFD FEC7 CPI :C7 184 EBFF CA33EC JZ :EC33 Jump if RST 185 EC02 3A5F00 LDA :005F Get int. mask 186 EC05 CD3EEF CALL :EF3E Store it in TIC; set A=0 187 EC08 32F9FF STA :FFF9 Reset timer 1 (trap PAGE 04 DAI FIRMWARE 3EB26-3EC44 V1.0 Rev.1 188 immediate) 189 EC0B 7E MOV A,M Get opcode of instr 190 EC0C E6F7 ANI :F7 ) Check if EI or DI 191 EC0E D6F3 SUI :F3 ) 192 EC10 7E MOV A,M Get inst code 193 EC11 EB XCHG HL = #004C 194 EC12 36FB MVI M,:FB Load EI in #004C 195 EC14 0E03 MVI C,:03 3 instr bytes to be loaded 196 into #004D-F 197 EC16 CA2CEC JZ :EC2C Jump if instr is EI/DI 198 199 * Load next instruction into 004D-4F: 200 201 EC19 1A L3E189 LDAX D Get instr code 202 EC1A 23 L3E190 INX H 203 EC1B 77 MOV M,A Store it in #004D-F 204 EC1C 13 INX D 205 EC1D 0D DCR C 206 EC1E C219EC JNZ :EC19 Next byte of instr 207 * 208 * Run LOOK: Register contents: 209 * 210 * If 'normal instr': 004C: EI. 211 * 004D-4F: Next instruction. 212 * 213 * If RST *: 004C-4D: RST */ data **. 214 * 004E: RST 0. 215 * 216 * If EI/DI: 004C: EI. 217 * 004D: NOP. 218 * 004E-50: Next instruction. 219 * This may cause problems, 220 * because 0050 is LOOK init 221 * flag. 222 * 223 EC21 CD30EF CALL :EF30 XRA A; LXI H,#0050 224 EC24 BE CMP M Check look flag 225 EC25 77 MOV M,A Reset flag 226 EC26 CA63EC JZ :EC63 If not Look init: restore 227 CPU reg; cont on (005D/E)= 228 004C 229 EC29 C39CED JMP :ED9C Else: Restore TIC/GICC/ 230 CPU reg/int.mask and 'GO' 231 to (005D/E)=004C 232 233 * If instruction is EI or DI: 234 235 EC2C 324700 L3E191 STA :0047 Store EI/DI instr 236 EC2F AF XRA A 237 EC30 C31AEC JMP :EC1A Load 00 in #004D, next instr 238 in 004E-0050 239 240 * If a RST instruction: 241 242 EC33 EB L3E192 XCHG HL=004C 243 EC34 0E02 MVI C,:02 Only 2-byte instruction 244 EC36 3EC7 MVI A,:C7 245 EC38 324E00 STA :004E Set (004E)=#C7 (=RST0) 246 EC3B C344EF JMP :EF44 RST*/data ** in 004C/D 247 248 * If PC points to 004D-004E: 249 PAGE 05 DAI FIRMWARE 3EB26-3EC44 V1.0 Rev.1 250 EC3E 19 L3E193 DAD D Set HL=0000-0001. This may 251 cause re-entry problems due 252 to stack manipulation 253 EC3F 225D00 SHLD :005D Save addr next instr (pnts 254 to RST0) 255 EC42 C3B0EB JMP :EBB0 256 * 257 * 258 * 259 EC45 END *************************** * S Y M B O L T A B L E * *************************** L3E178 EB41 L3E179 EB56 L3E180 EB5D L3E181 EB6C L3E182 EB98 L3E183 EBAC L3E184 EBAE L3E185 EBB0 L3E186 EBDC L3E187 EBE2 L3E188 EBEE L3E189 EC19 L3E190 EC1A L3E191 EC2C L3E192 EC33 L3E193 EC3E LOOKK EB26