PAGE 01 DAI FIRMWARE 2EA0B-2EBF3 V1.1 002 ORG :EA0B 003 * 004 * 005 * 006 ************** 007 * FILL BLOCK * 008 ************** 009 * 010 * Fills a rectangular block of whole fields with 011 * one colour. 012 * 013 * Entry: HL: Address bottom left corner. 014 * DE: Y,X-counts of size of block (E in 015 * fields). 016 * FCOLR: Colour info. 017 * Exit: BCDEHL preserved. AF corrupted. 018 * 019 EA0B C5 FILBK PUSH B 020 EA0C D5 PUSH D 021 EA0D E5 PUSH H 022 EA0E 3AC200 LDA :00C2 ) Get details for colour 023 EA11 4F MOV C,A ) required in BC 024 EA12 3AC300 LDA :00C3 ) 025 EA15 47 MOV B,A ) 026 EA16 1C INR E Count range up by 1 027 EA17 D5 FBK10 PUSH D 028 EA18 E5 PUSH H 029 EA19 3AC100 FBK20 LDA :00C1 Get animate flag 030 EA1C B7 ORA A 031 EA1D C246EA JNZ :EA46 Jump if set 032 EA20 3A9D00 LDA :009D Get current screen mode 033 EA23 1F RAR 034 EA24 1F RAR 035 EA25 70 MOV M,B Colour details in screen RAM 036 EA26 2B DCX H 037 EA27 D23EEA JNC :EA3E Jump if 16-colour mode 038 039 * If 4-colour mode: 040 041 EA2A 71 MOV M,C Colour details in screen RAM 042 * 043 EA2B 2B FBK30 DCX H 044 EA2C 1D DCR E 045 EA2D C219EA JNZ :EA19 Loop to do all fields 046 EA30 E1 POP H HL pnts to left of rectangle 047 EA31 D1 POP D Get Y-size count 048 EA32 15 DCR D 049 EA33 14 INR D 050 EA34 CA53EA JZ :EA53 Abort if ready 051 EA37 15 DCR D Update Y-count 052 EA38 CDC1EA CALL :EAC1 Update pntr to next line 053 EA3B C317EA JMP :EA17 Next line 054 055 * If 16-colour mode: 056 057 EA3E 7E FBK40 MOV A,M Get data from screen RAM 058 EA3F E60F ANI :0F Lonibble only (old BG) 059 EA41 B1 ORA C Add details 060 EA42 77 MOV M,A Preserve old background 061 EA43 C32BEA JMP :EA2B 062 063 * If animate: PAGE 02 DAI FIRMWARE 2EA0B-2EBF3 V1.1 064 065 EA46 E5 FBK50 PUSH H 066 EA47 05 DCR B 067 EA48 04 INR B 068 EA49 C24DEA JNZ :EA4D 069 EA4C 2B DCX H 070 EA4D 71 FBK60 MOV M,C Change whole field 071 EA4E E1 POP H 072 EA4F 2B DCX H 073 EA50 C32BEA JMP :EA2B Next field 074 * 075 EA53 E1 FBK90 POP H 076 EA54 D1 POP D 077 EA55 C1 POP B 078 EA56 C9 RET 079 * 080 ************** 081 * FILL STRIP * 082 ************** 083 * 084 * Fills a vertical strip on the screen with one 085 * colour. 086 * 087 * Entry: HL: Points to bottom field of strip. 088 * B: Mask bits to change. 089 * D: Height -1 of strip. 090 * Exit: AF corrupted. BCDEHL preserved. 091 * 092 EA57 C5 FILST PUSH B 093 EA58 D5 PUSH D 094 EA59 E5 PUSH H 095 EA5A 3A9D00 LDA :009D Get current screen mode 096 EA5D 1F RAR 097 EA5E 1F RAR 098 EA5F D2A9EA JNC :EAA9 Jump if 16-colour mode 099 100 * If 4-colour mode: 101 102 EA62 D5 PUSH D 103 EA63 EB XCHG 104 EA64 2AC200 LHLD :00C2 Get details for colour reqd 105 EA67 3AC100 LDA :00C1 Get animate flag 106 EA6A B7 ORA A 107 EA6B C291EA JNZ :EA91 Jump if set 108 EA6E 78 MOV A,B ) 109 EA6F A4 ANA H ) 110 EA70 4F MOV C,A ) Mask for bits to be update 111 EA71 78 MOV A,B ) 112 EA72 A5 ANA L ) 113 EA73 6F MOV L,A ) 114 EA74 78 MOV A,B 115 EA75 2F CMA Bits to be preserved 116 EA76 47 MOV B,A 117 EA77 67 MOV H,A 118 EA78 EB FST05 XCHG 119 EA79 78 FST10 MOV A,B 120 EA7A A6 ANA M Pick up old colours 121 EA7B B1 ORA C 122 EA7C 77 MOV M,A Update top bits 123 EA7D 2B DCX H 124 EA7E 7A MOV A,D 125 EA7F A6 ANA M PAGE 03 DAI FIRMWARE 2EA0B-2EBF3 V1.1 126 EA80 B3 ORA E 127 EA81 77 MOV M,A Update bottom bits 128 EA82 23 INX H 129 EA83 E3 XTHL 130 EA84 7C MOV A,H 131 EA85 25 DCR H 132 EA86 B7 ORA A 133 EA87 CABCEA JZ :EABC Jump if ready 134 EA8A E3 XTHL 135 EA8B CDC1EA CALL :EAC1 Update pointer 136 EA8E C379EA JMP :EA79 Next line 137 138 * If animate: 139 140 EA91 E5 FST15 PUSH H Preserve colour details 141 EA92 78 MOV A,B 142 EA93 A5 ANA L 143 EA94 4F MOV C,A Bits to be set in C 144 EA95 78 MOV A,B 145 EA96 2F CMA 146 EA97 B5 ORA L 147 EA98 47 MOV B,A To be set 148 EA99 2E00 MVI L,:00 149 EA9B 26FF MVI H,:FF For other byte 150 EA9D F1 POP PSW Get colour details 151 EA9E B7 ORA A 152 EA9F C2A6EA JNZ :EAA6 153 EAA2 C5 PUSH B 154 EAA3 E5 PUSH H 155 EAA4 C1 POP B 156 EAA5 E1 POP H 157 EAA6 C378EA FST18 JMP :EA78 158 159 * If 16-colour mode: 160 161 EAA9 3AC200 FST20 LDA :00C2 Get 1 byte of details colour 162 required 163 EAAC 4F MOV C,A Set colour as reqd 164 EAAD CDDEE8 FST30 CALL :E8DE Update 165 EAB0 7A MOV A,D 166 EAB1 15 DCR D 167 EAB2 B7 ORA A 168 EAB3 CABDEA JZ :EABD 169 EAB6 CDC1EA CALL :EAC1 Next line 170 EAB9 C3ADEA JMP :EAAD Next field 171 172 * If ready: 173 174 EABC E1 FST90 POP H 175 EABD E1 FST91 POP H 176 EABE D1 POP D 177 EABF C1 POP B 178 EAC0 C9 RET 179 * 180 ************************** 181 * MOVE AND CHECK POINTER * 182 ************************** 183 * 184 * DADCK: Moves a pointer 1 line up screen and 185 * offsets to alternate area if necessary. 186 * PTRCK: Checks a memory pointer and moves it 187 * into or out of the archive area if PAGE 04 DAI FIRMWARE 2EA0B-2EBF3 V1.1 188 * necessary. 189 * 190 * Exit: HL: New pointer. 191 * 192 EAC1 3A9800 DADCK LDA :0098 Get nr bytes/line 193 EAC4 CD01E7 CALL :E701 Add 1 line length 194 EAC7 C5 PTRCK PUSH B 195 EAC8 D5 PUSH D 196 EAC9 EB XCHG 197 EACA 2A8800 LHLD :0088 Get addr after end graphics 198 area 199 EACD CDFBE6 CALL :E6FB Compare HL-DE 200 EAD0 2A8400 LHLD :0084 Get bottom archive area 201 EAD3 44 MOV B,H ) in BC 202 EAD4 4D MOV C,L ) 203 EAD5 2A8200 LHLD :0082 Get top visible area 204 EAD8 D2E5EA JNC :EAE5 Jump if pntr is below 205 visible screen 206 EADB CDFBE6 CALL :E6FB Compare HL-DE 207 EADE DA0FD8 JC :D80F Jump if pntr is off top 208 visible screen 209 EAE1 EB PCK10 XCHG 210 EAE2 D1 PCK15 POP D 211 EAE3 C1 POP B 212 EAE4 C9 RET 213 214 * If pntr is below visible screen: 215 216 EAE5 E5 PCK20 PUSH H ) 217 EAE6 C5 PUSH B ) Swop BC and HL 218 EAE7 E1 POP H ) 219 EAE8 C1 POP B ) 220 EAE9 CDFBE6 CALL :E6FB Compare HL-DE 221 EAEC DAE1EA JC :EAE1 Jump if within archive area 222 EAEF EB PCK30 XCHG 223 EAF0 CDF2E6 CALL :E6F2 Subtract nearest boundary 224 EAF3 09 DAD B Add other 225 EAF4 C3E2EA JMP :EAE2 226 * 227 *************************** 228 * FILL A RECTANGULAR AREA * 229 *************************** 230 * 231 * Entry: DE: Width. 232 * B : Height. 233 * C : Offset. 234 * HL: Address. 235 * Exit: All registers preserved. 236 * 237 EAF7 F5 FILRT PUSH PSW 238 EAF8 C5 PUSH B 239 EAF9 D5 PUSH D 240 EAFA E5 PUSH H 241 EAFB E5 PUSH H 242 EAFC 79 MOV A,C 243 EAFD 83 ADD E 244 EAFE 67 MOV H,A H = C + E 245 EAFF 3E00 MVI A,:00 246 EB01 8A ADC D 247 EB02 50 MOV D,B 248 EB03 1F RAR 249 EB04 7C MOV A,H PAGE 05 DAI FIRMWARE 2EA0B-2EBF3 V1.1 250 EB05 DA0DEB JC :EB0D 251 EB08 FE08 CPI :08 252 EB0A DA40EB JC :EB40 If > 8: Fill only one strip 253 EB0D 1F L2E152 RAR 254 EB0E 0F RRC 255 EB0F E67E ANI :7E 256 EB11 E3 XTHL 257 EB12 F5 PUSH PSW 258 EB13 0F RRC 259 EB14 D602 SUI :02 260 EB16 5F MOV E,A 261 EB17 2B DCX H 262 EB18 2B DCX H 263 EB19 D40BEA CNC :EA0B Fill block 264 EB1C 23 INX H 265 EB1D 23 INX H 266 EB1E 79 MOV A,C 267 EB1F D609 SUI :09 268 EB21 2F CMA 269 EB22 47 MOV B,A 270 EB23 CDE1EB CALL :EBE1 Set mask for bits 271 EB26 CD57EA CALL :EA57 Fill strip 272 EB29 F1 POP PSW 273 EB2A 2F CMA 274 EB2B 4F MOV C,A 275 EB2C 06FF MVI B,:FF 276 EB2E 03 INX B 277 EB2F 09 DAD B 278 EB30 F1 POP PSW 279 EB31 E607 ANI :07 280 EB33 3C INR A 281 EB34 47 MOV B,A 282 EB35 0E00 MVI C,:00 283 EB37 CDE1EB L2E153 CALL :EBE1 Set mask for bits 284 EB3A CD57EA CALL :EA57 Fill strip 285 EB3D C338E1 JMP :E138 Popall, ret 286 287 * If < 1 field: 288 289 EB40 43 L2E154 MOV B,E 290 EB41 04 INR B 291 EB42 E1 POP H 292 EB43 C337EB JMP :EB37 Fill a strip only 293 * 294 ************************* 295 * CALCULATE HL = A * HL * 296 ************************* 297 * 298 * Exit: AFBCDE preserved. 299 * 300 EB46 F5 HLMUL PUSH PSW 301 EB47 D5 PUSH D 302 EB48 EB XCHG Original HL in DE 303 EB49 210000 LXI H,:0000 Init result 304 EB4C B7 L2E156 ORA A 305 EB4D CA5DEB JZ :EB5D Abort if ready 306 EB50 1F RAR ) 307 EB51 F5 PUSH PSW ) 308 EB52 D256EB JNC :EB56 ) Calc HL = A * HL 309 EB55 19 DAD D ) 310 EB56 EB L2E157 XCHG ) 311 EB57 29 DAD H ) PAGE 06 DAI FIRMWARE 2EA0B-2EBF3 V1.1 312 EB58 EB XCHG ) 313 EB59 F1 POP PSW ) 314 EB5A C34CEB JMP :EB4C Cont multiplication 315 EB5D D1 L2E158 POP D 316 EB5E F1 POP PSW 317 EB5F C9 RET 318 * 319 ************************* 320 * CALCULATE HL = HL / A * 321 ************************* 322 * 323 * Exit: AFBCDE preserved. 324 * 325 EB60 F5 HLDIV PUSH PSW 326 EB61 B7 ORA A 327 EB62 CA78EB JZ :EB78 Abort if A=0 328 EB65 C5 PUSH B 329 EB66 D5 PUSH D 330 EB67 01FFFF LXI B,:FFFF 331 EB6A 2F CMA 332 EB6B 5F MOV E,A 333 EB6C 16FF MVI D,:FF 334 EB6E 13 INX D 335 EB6F 19 L2E160 DAD D 336 EB70 03 INX B 337 EB71 DA6FEB JC :EB6F 338 EB74 69 MOV L,C ) Result in HL 339 EB75 60 MOV H,B ) 340 EB76 D1 POP D 341 EB77 C1 POP B 342 EB78 F1 L2E161 POP PSW 343 EB79 C9 RET 344 * 345 ********************************************* 346 * CHECK IF SUFFICIENT ROOM FOR GRAPHIC MODE * 347 ********************************************* 348 * 349 * Exit: CY=1: Insufficient room for mode. 350 * CY=0: O.K. 351 * ABCDEHL preserved. 352 * 353 EB7A C5 TPOSN PUSH B 354 EB7B F5 PUSH PSW 355 EB7C D5 PUSH D 356 EB7D 3A9D00 LDA :009D Get current screen mode 357 EB80 C601 ADI :01 358 EB82 DA96EB JC :EB96 If mode 0: Abort CY=1 359 EB85 EB XCHG 360 EB86 2A9400 LHLD :0094 Get nr of hor. blobs 361 EB89 2B DCX H minus 1 362 EB8A CDFBE6 CALL :E6FB Compare HL-DE 363 EB8D EB XCHG 364 EB8E DA96EB JC :EB96 Abort CY=1 if insufficient 365 room 366 EB91 3A9600 LDA :0096 Get nr of graphics lines 367 EB94 3D DCR A minus 1 368 EB95 B9 CMP C Set flags on difference 369 EB96 D1 L2E163 POP D 370 EB97 C1 POP B 371 EB98 78 MOV A,B 372 EB99 C1 POP B 373 EB9A C9 RET PAGE 07 DAI FIRMWARE 2EA0B-2EBF3 V1.1 374 * 375 *********************************** 376 * FIND COLOUR IN COLORG REGISTERS * 377 *********************************** 378 * 379 * Entry: C: Requested colour. 380 * Exit: CY=1: 'Serialnr' of colour in A. 381 * CY=0: Colour not available. 382 * BCDEHL preserved. 383 * 384 EB9B C5 STR164 PUSH B 385 EB9C E5 PUSH H 386 EB9D 219E00 LXI H,:009E Addr 1st colour byte graph 387 EBA0 0603 MVI B,:03 Total 4 colour data 388 EBA2 7E L2E165 MOV A,M Get colour 389 EBA3 E60F ANI :0F Colour nibble only 390 EBA5 B9 CMP C Ident to reqd one ? 391 EBA6 CAB2EB JZ :EBB2 Then colour found 392 EBA9 23 INX H Pnts to next one 393 EBAA 05 DCR B 394 EBAB F2A2EB JP :EBA2 Get next colour 395 EBAE B7 ORA A CY=0 396 EBAF E1 L2E166 POP H 397 EBB0 C1 POP B 398 EBB1 C9 RET 399 400 * If colour found: 401 402 EBB2 3E03 L2E167 MVI A,:03 403 EBB4 90 SUB B Colour 'nr' in A 404 EBB5 37 STC 405 EBB6 C3AFEB JMP :EBAF Quit, CY=1 406 * 407 ********************** 408 * GET MEMORY POINTER * 409 ********************** 410 * 411 EBB9 D5 SMEMMK PUSH D 412 EBBA F5 PUSH PSW 413 EBBB 78 MOV A,B 414 EBBC 0F RRC 415 EBBD 79 MOV A,C 416 EBBE 1F RAR 417 EBBF 1F RAR 418 EBC0 E67E ANI :7E 419 EBC2 C604 ADI :04 420 EBC4 5F MOV E,A 421 EBC5 1600 MVI D,:00 422 EBC7 E1 POP H 423 EBC8 E5 PUSH H 424 EBC9 6C MOV L,H Entry A in L 425 EBCA 2600 MVI H,:00 426 EBCC 23 INX H +1 427 EBCD 3A9800 LDA :0098 Get nr bytes/line 428 EBD0 CD46EB CALL :EB46 Calc HL=A*HL 429 EBD3 CDF2E6 CALL :E6F2 HL=HL-DE 430 EBD6 EB XCHG Result in DE 431 EBD7 2A8800 LHLD :0088 Get addr after end graph 432 area 433 EBDA 19 DAD D Add offset 434 EBDB CDC7EA CALL :EAC7 Check and move pntr 435 EBDE F1 POP PSW PAGE 08 DAI FIRMWARE 2EA0B-2EBF3 V1.1 436 EBDF D1 POP D 437 EBE0 C9 RET 438 * 439 ********************* 440 * SET MASK FOR BITS * 441 ********************* 442 * 443 * Entry: B and C are data for mask. 444 * Exit: B: Result. 445 * AFCDEHL preserved. 446 * 447 EBE1 F5 SMKMSK PUSH PSW 448 EBE2 C5 PUSH B 449 EBE3 AF XRA A A=0 450 EBE4 37 L2E170 STC CY=1 451 EBE5 1F RAR 452 EBE6 05 DCR B 453 EBE7 C2E4EB JNZ :EBE4 RAR (B) times 454 EBEA 1F L2E171 RAR 455 EBEB 0D DCR C 456 EBEC F2EAEB JP :EBEA RAR until C <= 7F 457 EBEF 17 RAL 458 EBF0 C1 POP B 459 EBF1 47 MOV B,A Result in B 460 EBF2 F1 POP PSW 461 EBF3 C9 RET 462 * 463 * 464 * 465 EBF4 END *************************** * S Y M B O L T A B L E * *************************** DADCK EAC1 FBK10 EA17 FBK20 EA19 FBK30 EA2B FBK40 EA3E FBK50 EA46 FBK60 EA4D FBK90 EA53 FILBK EA0B FILRT EAF7 FILST EA57 FST05 EA78 FST10 EA79 FST15 EA91 FST18 EAA6 FST20 EAA9 FST30 EAAD FST90 EABC FST91 EABD HLDIV EB60 HLMUL EB46 L2E152 EB0D L2E153 EB37 L2E154 EB40 L2E156 EB4C L2E157 EB56 L2E158 EB5D L2E160 EB6F L2E161 EB78 L2E163 EB96 L2E165 EBA2 L2E166 EBAF L2E167 EBB2 L2E170 EBE4 L2E171 EBEA PCK10 EAE1 PCK15 EAE2 PCK20 EAE5 PCK30 EAEF PTRCK EAC7 SMEMMK EBB9 SMKMSK EBE1 STR164 EB9B TPOSN EB7A