PAGE 01 DAI FIRMWARE 2E7FC-2EA0A V1.1 002 ORG :E7FC 003 * 004 * 005 * 006 ************************** 007 * MOVE POINTER UP / DOWN * 008 ************************** 009 * 010 * Subroutine of SDRAW (2E71B). 011 * Takes a pointer to screen and moves it up or 012 * down the screen a number of lines. The move 013 * direction depends on DIRN1 (00BF). 014 * 015 * Entry: HL: Pointer. 016 * B: Number of lines. 017 * Exit: HL: updated. 018 * AFBCDE preserved. 019 * 020 E7FC F5 UPDTP PUSH PSW 021 E7FD D5 PUSH D 022 E7FE E5 PUSH H 023 E7FF 3A9800 LDA :0098 Get number bytes/line 024 E802 6F MOV L,A ) Store it in HL 025 E803 2600 MVI H,:00 ) 026 E805 78 MOV A,B Get nr of lines 027 E806 CD46EB CALL :EB46 Calc total length in HL 028 E809 3ABF00 LDA :00BF Get Y-direction 029 E80C B7 ORA A Test if up or down 030 E80D C406E7 CNZ :E706 If down: Calc 2-compl of HL 031 E810 D1 POP D 032 E811 19 DAD D Update pntr 033 E812 CDC7EA CALL :EAC7 Into or out archive area 034 E815 D1 POP D 035 E816 F1 POP PSW 036 E817 C9 RET 037 * 038 ***************************************** 039 * FILL A RECTANGULAR AREA ON THE SCREEN * 040 ***************************************** 041 * 042 * Fills an arbitrary rectangle with a given colour. 043 * 044 * The middle of the rectangle is filled first, then 045 * the left and then the right edge vertical strips. 046 * The coordinates are given inclusively. 047 * The rectangle is filled in the same order, which 048 * ever order the parameters are given in. 049 * 050 * Entry: B,DE: Y,X coordinate of one corner. 051 * C,HL: Idem of the opposite corner. 052 * A: Colour. 053 * Exit: ABCDEHL preserved. 054 * CY=0: OK. 055 * CY=1: A contains error code. 056 * 057 E818 B7 SFILL ORA A 058 E819 F5 PUSH PSW 059 E81A C5 PUSH B 060 E81B D5 PUSH D 061 E81C E5 PUSH H 062 E81D CD3AE8 FIL10 CALL :E83A Check arguments, get colour 063 E820 57 MOV D,A Get Y-coord left corner PAGE 02 DAI FIRMWARE 2E7FC-2EA0A V1.1 064 E821 3ABF00 LDA :00BF ) Check if Y invert 065 E824 B7 ORA A ) 066 E825 7A MOV A,D 067 E826 CA2AE8 JZ :E82A Jump if no Y-inversion 068 E829 93 SUB E Y-pos bottom left 069 E82A E5 FIL20 PUSH H Save X-size 070 E82B CDB9EB CALL :EBB9 Get memory address 071 E82E 79 MOV A,C 072 E82F E607 ANI :07 073 E831 4F MOV C,A Offset in C 074 E832 43 MOV B,E Height in B 075 E833 D1 POP D Width in DE 076 E834 CDF7EA CALL :EAF7 Fill block 077 E837 C338E1 JMP :E138 Popall, ret 078 * 079 ******************************* 080 * CHECK ARGUMENTS, GET COLOUR * 081 ******************************* 082 * 083 * Checks the arguments given to a entry point and 084 * sets up the colour variables. Swops order of two 085 * points given if necessary. 086 * 087 * Entry: ABCDEHL: See SFILL. 088 * All registers and a returnaddr on stack. 089 * Exit: CY=0: O.K.: 090 * A,BC: Set to left corner. 091 * DE,HL: Set to Y,X lengths of line. 092 * DIRN1: <>0 if Y-direction negative. 093 * CY=1: Error report: 094 * A=1: Off screen. 095 * A=2: Colour not available. 096 * 097 E83A CDC3E9 ARGCHK CALL :E9C3 Set up colour variables 098 E83D DA75E8 JC :E875 Jump if colour not av. 099 E840 CD7AEB CALL :EB7A Check if room available 100 E843 DA7FE8 JC :E87F Jump if not 101 E846 C5 PUSH B 102 E847 48 MOV C,B Y-coord one point in C 103 E848 EB XCHG 104 E849 CD7AEB CALL :EB7A Check if room available 105 E84C EB XCHG 106 E84D C1 POP B 107 E84E DA7FE8 JC :E87F Jump if not 108 E851 CDFBE6 CALL :E6FB Compare HL-DE 109 E854 D25DE8 JNC :E85D Right most point to C,HL 110 111 * Swop Y-coord.: 112 113 E857 EB XCHG 114 E858 F5 PUSH PSW 115 E859 78 MOV A,B ) 116 E85A 41 MOV B,C ) Swop 2 points 117 E85B 4F MOV C,A ) 118 E85C F1 POP PSW 119 * 120 E85D CDF2E6 ARC10 CALL :E6F2 Calc horizontal length 121 E860 D5 PUSH D Save X-pos left corner 122 E861 79 MOV A,C 123 E862 90 SUB B 124 E863 1600 MVI D,:00 Clear Y-invert flag 125 E865 D26BE8 JNC :E86B Jump if end above start PAGE 03 DAI FIRMWARE 2E7FC-2EA0A V1.1 126 E868 2F CMA 127 E869 3C INR A 128 E86A 15 DCR D 129 * 130 E86B 5F ARC20 MOV E,A Get vertical length 131 E86C 7A MOV A,D 132 E86D 32BF00 STA :00BF Set Y-invert flag 133 E870 1600 MVI D,:00 134 E872 78 MOV A,B Get Y-pos left corner 135 E873 C1 POP B Get X-pos left corner 136 E874 C9 RET 137 138 * If colour error: 139 140 E875 3E02 ARC90 MVI A,:02 Error colour not available 141 E877 E1 ARC98 POP H 142 E878 E1 POP H 143 E879 D1 POP D 144 E87A C1 POP B 145 E87B 33 INX SP 146 E87C 33 INX SP 147 E87D 37 STC Return error 148 E87E C9 RET 149 150 * If off screen error: 151 152 E87F 3E01 ARC99 MVI A,:01 Error off screen 153 E881 C377E8 JMP :E877 Abort 154 * 155 ******************************************* 156 * ASK COLOUR OF A POINT ON THE SCREEN AND * 157 * ASK SIZE OF THE GRAPHICS SCREEN * 158 ******************************************* 159 * 160 * Aks the colour of a given point on the screen 161 * and the size of the graphics area of the screen. 162 * 163 * Entry: C,HL: Y,X coordinate of the dot required. 164 * Exit: CY=0: O.K.: 165 * A: Colour at requested point. 166 * B,DE: Max. coordinates of the 167 * graphics area. 168 * CHL preserved. 169 * CY=1: A: Error code. 170 * BCDEHL preserved. 171 * 172 E884 E5 SSCRN PUSH H 173 E885 C5 PUSH B 174 E886 CD7AEB CALL :EB7A Check if room available 175 E889 DAD8E8 JC :E8D8 Jump if not 176 E88C 7D MOV A,L 177 E88D E607 ANI :07 178 E88F F5 PUSH PSW Remember field offset 179 E890 79 MOV A,C ) 180 E891 44 MOV B,H ) Coord in A,B,C 181 E892 4D MOV C,L ) 182 E893 CDB9EB CALL :EBB9 Get address of point 183 E896 3A9D00 LDA :009D Get current screen mode 184 E899 1F RAR 185 E89A 1F RAR 186 E89B DAB8E8 JC :E8B8 Jump if 4-colour mode 187 PAGE 04 DAI FIRMWARE 2E7FC-2EA0A V1.1 188 * If 16-colour mode: 189 190 E89E CDF6E8 CALL :E8F6 Colours to buffer 191 E8A1 21A300 LXI H,:00A3 Addr SCXBUF 192 E8A4 F1 POP PSW 193 E8A5 CD01E7 CALL :E701 Calc addr in buffer 194 E8A8 7E MOV A,M Get colour for reqd blob 195 E8A9 2A9600 SSC10 LHLD :0096 Get nr of graphics lines 196 E8AC 45 MOV B,L 197 E8AD 05 DCR B lobyte -1 in B 198 E8AE 2A9400 LHLD :0094 Get nr of hor. blobs 199 E8B1 2B DCX H -1 200 E8B2 EB XCHG in DE 201 E8B3 E1 POP H 202 E8B4 4D MOV C,L Y-coord in C 203 E8B5 E1 POP H X-coord in HL 204 E8B6 B7 ORA A CY=0 205 E8B7 C9 RET 206 207 * If 4-colour mode: 208 209 E8B8 56 SSC30 MOV D,M ) 210 E8B9 2B DCX H ) Get screen data of 211 E8BA 5E MOV E,M ) point in DE 212 E8BB F1 POP PSW 213 E8BC 4F MOV C,A Field offset in C 214 E8BD 0601 MVI B,:01 215 E8BF CDE1EB CALL :EBE1 Set mask for bits 216 E8C2 219E00 LXI H,:009E Pntr to COLORG colours 217 E8C5 78 MOV A,B 218 E8C6 A2 ANA D Test top bit result 219 E8C7 CACCE8 JZ :E8CC Skip if 0 220 E8CA 23 INX H 221 E8CB 23 INX H 222 E8CC 78 SSC40 MOV A,B 223 E8CD A3 ANA E Test bottom bit result 224 E8CE CAD2E8 JZ :E8D2 Skip if 0 225 E8D1 23 INX H 226 E8D2 7E SSC50 MOV A,M Get result from table 227 E8D3 E60F ANI :0F Colour bits only 228 E8D5 C3A9E8 JMP :E8A9 229 230 * If off screen: 231 232 E8D8 E1 SSC99 POP H 233 E8D9 C1 POP B 234 E8DA 3E01 MVI A,:01 Error 'off screen' 235 E8DC 37 STC 236 E8DD C9 RET 237 * 238 ****************** 239 * UPDATE A FIELD * 240 ****************** 241 * 242 * Given a mask of bits to be changed, a colour to 243 * set them to and a memory address where the field 244 * starts. This routine reads, updates and replaces 245 * a field. 246 * 247 * Entry: HL: Memory address of start of field. 248 * B: Mask of bits to be changed. 249 * C: Colour to change to (hinibble). PAGE 05 DAI FIRMWARE 2E7FC-2EA0A V1.1 250 * Exit: All registers preserved. 251 * 252 E8DE F5 SUPDTE PUSH PSW 253 E8DF C5 PUSH B 254 E8E0 D5 PUSH D 255 E8E1 E5 PUSH H 256 E8E2 79 MOV A,C ) 257 E8E3 0F RRC ) 258 E8E4 0F RRC ) Move hinibble C into 259 E8E5 0F RRC ) lonibble 260 E8E6 0F RRC ) 261 E8E7 4F MOV C,A ) 262 E8E8 C5 PUSH B 263 E8E9 CDF6E8 CALL :E8F6 Get current state of screen 264 E8EC C1 POP B 265 E8ED CDB2E9 CALL :E9B2 Change as required 266 E8F0 E1 POP H 267 E8F1 E5 PUSH H 268 E8F2 C3BAC6 JMP :C6BA Set up screen bits for 269 mode 1 270 * 271 E8F5 FF DATA :FF 272 * 273 ********************************** 274 * LOAD BUFFER SCXBUF FROM SCREEN * 275 ********************************** 276 * 277 * Takes 2 bytes of screen info in 16-colour mode 278 * and places them in SCXBUF (00A3-AB) in 'standard 279 * form'. 280 * 281 * Entry: HL: Points to 1st byte of info on screen. 282 * Exit: All registers corrupted. 283 * 284 E8F6 23 SSFM INX H 285 E8F7 7E MOV A,M Get previous colour byte 286 E8F8 E60F ANI :0F Background only 287 E8FA 4F MOV C,A Previous background in C 288 E8FB 2B DCX H 289 E8FC 56 MOV D,M Select byte in D 290 E8FD 2B DCX H 291 E8FE 5E MOV E,M Colour byte in E 292 E8FF 2B DCX H 293 E900 E5 PUSH H Save pntr to next field 294 select byte 295 E901 7B MOV A,E Colour byte in A 296 E902 E6F0 ANI :F0 ) 297 E904 0F RRC ) Foreground colour 298 E905 0F RRC ) in lonibble 299 E906 0F RRC ) 300 E907 0F RRC ) 301 E908 47 MOV B,A Foreground colour in B 302 E909 21A300 LXI H,:00A3 Addr SCXBUF 303 E90C 7A MOV A,D Get bit mask 304 E90D 1608 MVI D,:08 8 bytes to set 305 E90F 07 SSF10 RLC 306 E910 71 MOV M,C Set background 307 E911 D21EE9 JNC :E91E Jump if background 308 E914 70 MOV M,B Else: set foreground 309 E915 F5 PUSH PSW 310 E916 7B MOV A,E Get colour byte 311 E917 E60F ANI :0F Background colour only PAGE 06 DAI FIRMWARE 2E7FC-2EA0A V1.1 312 E919 4F MOV C,A Background is current BG 313 E91A 32AC00 STA :00AC Store it as colour carried 314 out to next field 315 E91D F1 POP PSW 316 E91E 23 SSF20 INX H Next pos in SCXBUF 317 E91F 15 DCR D Count -1 318 E920 C20FE9 JNZ :E90F Loop if more bits 319 E923 C1 POP B Get pntr to next field 320 select byte 321 E924 36FF MVI M,:FF Flag no carry out in SBGOU 322 E926 0A LDAX B Get next select byte 323 E927 34 SSF30 INR M Set 'carry out' flag 324 E928 07 RLC 325 E929 D227E9 JNC :E927 Loop counting carry out 326 E92C C9 RET 327 * 328 ********************************* 329 * SET UP SCREEN BITS FOR MODE 1 * 330 ********************************* 331 * 332 * Takes the 8 blobs represented in standard form 333 * in SCXBUF, and tries to represent them in a way 334 * which the screen requires for mode 1. 335 * Up to 2 colours is easy. 3 require to attempt 336 * to carry in the 1st colour from the previous 337 * byte. 338 * 339 * Entry: HL: Points to 1st of the 2 screen bytes. 340 * Exit: Screen will be updated as well as 341 * possible. 342 * All registers preserved. 343 * 344 *SBF00 345 E92D 23 SBFM INX H 346 E92E 7E MOV A,M 347 E92F F680 ORI :80 348 E931 5F MOV E,A Prev background in E 349 E932 1600 MVI D,:00 Init bit map 350 E934 21A300 LXI H,:00A3 Addr SCXBUF 351 E937 00 NOP 352 E938 00 NOP 353 E939 3AAB00 SBF05 LDA :00AB Get flag for colour carried 354 out 355 E93C B7 ORA A 356 E93D CA45E9 JZ :E945 Jump if no carry out 357 E940 3AAC00 LDA :00AC Get colour carried out 358 E943 F680 ORI :80 Set msb=1 359 E945 4F SBF10 MOV C,A Background colour in C 360 E946 7E MOV A,M 361 E947 23 INX H 362 E948 47 MOV B,A Set 1st blob as FG colour 363 E949 7A MOV A,D ) 364 E94A 37 STC ) 1 bit in right end bit 365 E94B 17 RAL ) mask 366 E94C 57 MOV D,A ) 367 E94D 7E SBF30 MOV A,M 368 E94E 23 INX H 369 E94F B8 CMP B Is next blob FG colour ? 370 E950 37 STC 371 E951 CA61E9 JZ :E961 Jump if true 372 E954 F680 ORI :80 373 E956 B9 CMP C Test if same as BG ? PAGE 07 DAI FIRMWARE 2E7FC-2EA0A V1.1 374 E957 CA60E9 JZ :E960 Jump if true 375 E95A 0D DCR C 376 E95B 0C INR C 377 E95C FA86E9 JM :E986 No luck if BG used already 378 E95F 4F MOV C,A Else set it to BG 379 E960 B7 SBF40 ORA A 380 E961 7A SBF45 MOV A,D ) 381 E962 17 RAL ) New bit in bottom of mask 382 E963 57 MOV D,A ) 383 E964 7D SBF50 MOV A,L 384 E965 FEAB CPI :AB End of buffer reached ? 385 E967 C24DE9 JNZ :E94D Loop until all set up 386 E96A E1 POP H 387 E96B E5 PUSH H 388 E96C 23 INX H 389 E96D 7B MOV A,E 390 E96E E60F ANI :0F 391 E970 5F MOV E,A Only lonibble of E 392 E971 7E MOV A,M 393 E972 E6F0 ANI :F0 Only hinibble of M 394 E974 B3 ORA E 395 E975 77 MOV M,A Add both nibbles together 396 E976 2B DCX H 397 E977 78 MOV A,B 398 E978 87 ADD A 399 E979 87 ADD A 400 E97A 87 ADD A 401 E97B 87 ADD A FG colour to top bits 402 E97C 47 MOV B,A 403 E97D 79 MOV A,C 404 E97E E60F ANI :0F Low nibble only 405 E980 B0 ORA B 406 E981 72 MOV M,D Bit map from D 407 E982 2B DCX H 408 E983 77 MOV M,A Colours from E 409 E984 E1 SBF90 POP H 410 E985 C9 RET 411 412 * 3 colours needed: 413 414 E986 7B SBF80 MOV A,E 415 E987 B7 ORA A 416 E988 F284E9 JP :E984 Jump if tried BG carried in 417 E98B E60F ANI :0F Previous BG 418 E98D B8 CMP B Test against 1st blob colour 419 E98E E1 POP H 420 E98F E5 PUSH H 421 E990 23 INX H 422 E991 23 INX H 423 E992 7E MOV A,M Get bit map 424 E993 37 SBF83 STC 425 E994 17 RAL 426 E995 D293E9 JNC :E993 Ignore leading BG 427 E998 CAA1E9 JZ :E9A1 Jump if colour matches 428 anyway 429 E99B 3C INR A 430 E99C C284E9 JNZ :E984 No good if BG used 431 432 * Background not in use: 433 434 E99F 58 MOV E,B Set previous BG 435 E9A0 00 NOP PAGE 08 DAI FIRMWARE 2E7FC-2EA0A V1.1 436 E9A1 21A300 SBF85 LXI H,:00A3 Addr SCXBUF 437 E9A4 1600 MVI D,:00 Init D 438 E9A6 00 NOP 439 E9A7 4A MOV C,D and C (BG free) 440 E9A8 7E SBF88 MOV A,M Get byte from SCXBUF 441 E9A9 B8 CMP B 442 E9AA C239E9 JNZ :E939 Jump if blob not old BG 443 colour 444 E9AD 00 NOP 445 E9AE 23 INX H 446 E9AF C3A8E9 JMP :E9A8 Next blob 447 * 448 ************************ 449 * UPDATE BUFFER SCXBUF * 450 ************************ 451 * 452 * Takes a set of 'update instructions' in BC and 453 * sets various bytes in SCXBUF accordingly. 454 * 455 * Entry: BC: Instructions. 456 * Exit: All registers corrupted. 457 * 458 E9B2 21A300 SUDCH LXI H,:00A3 Addr SCXBUF 459 E9B5 78 MOV A,B Mask in A 460 E9B6 0608 MVI B,:08 8 byte to be done 461 E9B8 07 SUD10 RLC Bit from mask into CY 462 E9B9 D2BDE9 JNC :E9BD Jump if bit = 0 463 E9BC 71 MOV M,C Else: C into SCXBUF 464 E9BD 23 SUD20 INX H 465 E9BE 05 DCR B 466 E9BF C2B8E9 JNZ :E9B8 Next byte if not ready 467 E9C2 C9 RET 468 * 469 *************************** 470 * SET UP COLOUR VARIABLES * 471 *************************** 472 * 473 * Entry: A: Colour. 474 * Exit: CY=1: Colour not available. 475 * CY=0: O.K.: ABCDEHL preserved. 476 * 477 E9C3 B7 COLSU ORA A 478 E9C4 F5 PUSH PSW 479 E9C5 C5 PUSH B 480 E9C6 4F MOV C,A Colour in C 481 E9C7 AF XRA A 482 E9C8 32C100 STA :00C1 Reset animate flag 483 E9CB 3A9D00 LDA :009D Get current screen mode 484 E9CE 1F RAR 485 E9CF 1F RAR 486 E9D0 D2FDE9 JNC :E9FD Jump if 16-colour 487 488 * If 4-colour: 489 490 E9D3 79 MOV A,C Get colour 491 E9D4 FE10 CPI :10 492 E9D6 DAE1E9 JC :E9E1 Jump if < 16 493 E9D9 CD86D8 CALL :D886 Check if >= 20. Set 00C1 494 for 4-colour animate if not 495 E9DC E603 CSU04 ANI :03 496 E9DE C3E7E9 JMP :E9E7 Bottom 3 bits only 497 E9E1 CD9BEB CSU05 CALL :EB9B Find colour in COLORG reg PAGE 09 DAI FIRMWARE 2E7FC-2EA0A V1.1 498 (2 bit code) 499 E9E4 D207EA JNC :EA07 Jump if colour not av. 500 E9E7 0600 CSU08 MVI B,:00 501 E9E9 FE02 CPI :02 502 E9EB DAEFE9 JC :E9EF Jump if top bit 0 503 E9EE 05 DCR B Set 00/FF on top bit 504 E9EF E601 CSU10 ANI :01 505 E9F1 2F CMA 506 E9F2 3C INR A Set 00/FF on bottom bit 507 E9F3 32C200 CSU30 STA :00C2 ) 508 E9F6 78 MOV A,B ) Store details for colour 509 E9F7 32C300 STA :00C3 ) reqd 510 E9FA C1 POP B 511 E9FB F1 POP PSW 512 E9FC C9 RET 513 514 * If 16-colour: 515 516 E9FD 79 CSU40 MOV A,C Get colour 517 E9FE 87 ADD A ) 518 E9FF 87 ADD A ) SHL 8 519 EA00 87 ADD A ) 520 EA01 87 ADD A ) 521 EA02 06FF MVI B,:FF 522 EA04 C3F3E9 JMP :E9F3 Store details for colour 523 reqd 524 525 * If colour not found: 526 527 EA07 C1 CSU99 POP B 528 EA08 F1 POP PSW 529 EA09 3F CMC Quit; 'colour not available' 530 EA0A C9 RET 531 * 532 * 533 * 537 EA0B END *************************** * S Y M B O L T A B L E * *************************** ARC10 E85D ARC20 E86B ARC90 E875 ARC98 E877 ARC99 E87F ARGCHK E83A COLSU E9C3 CSU04 E9DC CSU05 E9E1 CSU08 E9E7 CSU10 E9EF CSU30 E9F3 CSU40 E9FD CSU99 EA07 FIL10 E81D FIL20 E82A SBF00 E92D SBF05 E939 SBF10 E945 SBF30 E94D SBF40 E960 SBF45 E961 SBF50 E964 SBF80 E986 SBF83 E993 SBF85 E9A1 SBF88 E9A8 SBF90 E984 SBFM E92D SFILL E818 SSC10 E8A9 SSC30 E8B8 SSC40 E8CC SSC50 E8D2 SSC99 E8D8 SSCRN E884 SSF10 E90F SSF20 E91E SSF30 E927 SSFM E8F6 SUD10 E9B8 SUD20 E9BD SUDCH E9B2 SUPDTE E8DE UPDTP E7FC