PAGE 01 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 002 ORG :E407 003 * 004 * 005 * 006 **************************** 007 * SET UP SCREEN FOR MODE 0 * 008 **************************** 009 * 010 * Sets up a mode 0 screen, whatever the current mode 011 * is. If already a character area exists, it is 012 * moved to the top of the new screen. 013 * 014 * Entry: None. 015 * Exit: All registers corrupted. 016 * CY=0: OK. 017 * CY=1: No room. 018 * 019 E407 37 SSM0 STC CY=1 020 E408 F5 PUSH PSW 021 E409 2130E0 LXI H,:E030 Startaddr mode 0 table 022 E40C CD45E5 CALL :E545 Load pointers with parameter 023 E40F DA3CE4 JC :E43C If no room available 024 E412 117C00 LXI D,:007C Addr text colour table 025 E415 D5 PUSH D Save addr 026 E416 2A8000 LHLD :0080 Get 1st byte screen RAM 027 E419 0606 MVI B,:06 028 E41B CDFCE5 CALL :E5FC Set up header 029 E41E 3A9D00 LDA :009D Get old screen mode 030 E421 FE10 CPI :10 During initialisation ? 031 E423 CA2DE4 JZ :E42D Then jump 032 E426 1F RAR Split screen ? 033 E427 D22DE4 JNC :E42D Jump if not 034 E42A CD35E6 CALL :E635 If split mode: move old 035 text, cursor, etc 036 E42D EB SS010 XCHG Addr after header in DE 037 E42E 2A8C00 LHLD :008C Get addr end char area 038 E431 EB XCHG 039 E432 CDFDE1 CALL :E1FD Blank char area 040 E435 D487E6 CNC :E687 Set cursor at begin 1st line 041 042 * Entry from SSMG: 043 044 E438 D1 SS015 POP D 045 E439 F1 POP PSW 046 E43A 3F CMC CY=0 047 E43B C9 RET 048 049 * If no room available: 050 * Entry from SSMG, SSM, SSMA: 051 052 E43C F1 SS020 POP PSW CY=1 053 E43D C9 RET 054 * 055 ********************************** 056 * SET UP SCREEN FOR GRAPHIC MODE * 057 ********************************** 058 * 059 * Entry: A: Screen mode (split if odd). 060 * Exit: CY=0: O.K.: 061 * Split mode: DE: Addr text colours. 062 * All graphic mode: DE: Addr graph colours. 063 * AF preserved. BCHL corrupted. PAGE 02 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 064 * CY=1: Insufficient room. 065 * 066 E43E 37 SSMG STC 067 E43F F5 PUSH PSW 068 E440 57 MOV D,A Screen mode in D 069 E441 E601 ANI :01 Z=1 if full colour mode 070 E443 7A MOV A,D 071 E444 1F RAR Disable split mode bit in A 072 E445 C4B6E4 CNZ :E4B6 If split mode: set up screen 073 E448 CC5FE4 CZ :E45F If full colour mode: idem 074 E44B DA3CE4 JC :E43C Abort if no room 075 E44E F1 POP PSW Get mode code 076 E44F F5 PUSH PSW 077 E450 D5 PUSH D 078 E451 119E00 LXI D,:009E Addr COLORG table 079 E454 2A8000 LHLD :0080 Get addr 1st byte screen RAM 080 E457 0606 MVI B,:06 Depth each blanking line 081 in header -1 082 E459 CDFCE5 CALL :E5FC Set up header with COLORG 083 colours 084 E45C C338E4 JMP :E438 Quit, all OK 085 * 086 * SET UP A FULL GRAPHIC SCREEN: 087 * 088 * Sets up a screen RAM for an all-graphics mode. 089 * 090 * Entry: A: Mode code /2. 091 * D: Mode code. 092 * Exit: CY=0: O.K.: 093 * DE points to table graphic colours. 094 * AF preserved. BCHL corrupted. 095 * CY=1: Insufficient space. 096 * 097 E45F 37 SSM STC 098 E460 F5 PUSH PSW 099 E461 219AE5 LXI H,:E59A Addr table vectors full 100 graphic mode 101 E464 CD39E5 CALL :E539 Set up screen mode 102 E467 DA3CE4 JC :E43C Jump if no room 103 E46A 3A9D00 LDA :009D Get current screen mode 104 E46D 92 SUB D ) Check if change split 105 E46E 3D DCR A ) to all graphics 106 E46F CA00D7 JZ :D700 Then check if sufficient 107 RAM available and change 108 mode 109 E472 CD6BE3 CALL :E36B Delete cursor 110 E475 3A9600 LDA :0096 Get nr of graphics lines 111 E478 4F MOV C,A in C 112 E479 2A8200 LHLD :0082 Get addr top graph area 113 E47C CDADE5 CALL :E5AD Blank whole screen 114 E47F 119E00 SSM10 LXI D,:009E Addr COLORG table 115 E482 F1 POP PSW 116 E483 3F CMC CY=0: O.K. 117 E484 C9 RET 118 119 * Change from split to all-graphic mode: 120 121 E485 D20FD7 SSM21 JNC :D70F Set up screen mode 122 E488 CD6BE3 CALL :E36B Delete cursor 123 E48B 2A8800 LHLD :0088 Get addr temp save area 124 E48E 44 MOV B,H ) in BC 125 E48F 4D MOV C,L ) PAGE 03 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 126 E490 C5 PUSH B Save it on stack 127 E491 2A9200 LHLD :0092 Get startaddr archive 128 area 129 E494 EB XCHG in DE 130 E495 2A8C00 LHLD :008C Get addr end archive area 131 E498 CDC2E6 CALL :E6C2 Move archive area into 132 temp save area 133 E49B 2A8600 LHLD :0086 Get addr top of rolled area 134 E49E 44 MOV B,H ) in BC 135 E49F 4D MOV C,L ) 136 E4A0 2A8200 LHLD :0082 Get addr top old graphics 137 E4A3 EB XCHG in DE 138 E4A4 2A9900 LHLD :0099 Get end old screen 139 E4A7 CDC2E6 CALL :E6C2 Move lower part screen 140 downwards 141 E4AA 42 MOV B,D ) BC is addr where to put 142 E4AB 4B MOV C,E ) archive area 143 E4AC D1 POP D Get startaddr temp save area 144 E4AD 2A9000 LHLD :0090 Get end temp save area 145 E4B0 CDC2E6 CALL :E6C2 Move temp save area to 146 top of screen 147 E4B3 C37FE4 JMP :E47F Quit 148 * 149 * SET UP SCREEN FOR SPLIT MODE: 150 * 151 * Sets up a split screen for a given mode in the 152 * lower RAM. 153 * 154 * Entry: A: Mode code /2. 155 * D: Mode code. 156 * Exit: CY=0: O.K.: 157 * DE: Address text colour table. 158 * AF preserved, BCHL corrupted. 159 * CY=1: Insufficient space. 160 * 161 E4B6 37 SSMA STC 162 E4B7 F5 PUSH PSW 163 E4B8 21A0E5 LXI H,:E5A0 Startaddr table vectors 164 split modes 165 E4BB CD39E5 CALL :E539 Set up screen mode 166 E4BE DA3CE4 JC :E43C Abort if insufficient space 167 E4C1 3A9D00 LDA :009D Get old screen mode 168 E4C4 92 SUB D ) Check if change from 169 E4C5 3C INR A ) all-graph to split 170 E4C6 F5 PUSH PSW Preserve flags 171 E4C7 D5 PUSH D and new mode code 172 E4C8 C2F9E4 JNZ :E4F9 If not splitting old mode: 173 clear graph and moved areas 174 E4CB CD06D7 CALL :D706 Check suff RAM available; 175 prepare full graphic mode 176 E4CE 00 NOP 177 E4CF D20DD7 JNC :D70D Set up current mode if 178 not O.K. 179 E4D2 2A9200 LHLD :0092 Get start temp save area 180 E4D5 44 MOV B,H ) in BC 181 E4D6 4D MOV C,L ) 182 E4D7 2A8200 LHLD :0082 Get addr after header 183 E4DA EB XCHG in DE 184 E4DB 2A8600 LHLD :0086 Get addr top of screen 185 E4DE CDC2E6 CALL :E6C2 Move top of screen into 186 temp save area 187 E4E1 42 MOV B,D ) BC is addr top of screen PAGE 04 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 188 E4E2 4B MOV C,E ) 189 E4E3 EB XCHG Addr top rolled up area 190 E4E4 2A9900 LHLD :0099 Get previous end of graphics 191 E4E7 CDC2E6 CALL :E6C2 Move lower part of screen 192 E4EA 2A8E00 LHLD :008E Get final place for archive 193 code 194 E4ED 44 MOV B,H ) in BC 195 E4EE 4D MOV C,L ) 196 E4EF 2A9200 LHLD :0092 Get addr start temp. save 197 area 198 E4F2 EB XCHG in DE 199 E4F3 2A9000 LHLD :0090 Get addr end split mode 200 E4F6 CDC2E6 CALL :E6C2 Move temp save area into 201 archive area 202 E4F9 2A8A00 SMA10 LHLD :008A Get start addr char area 203 E4FC EB XCHG in DE 204 E4FD 2A8C00 LHLD :008C Get addr end char area 205 E500 3A9D00 LDA :009D Get current screen mode 206 E503 1F RAR Check mode 207 E504 0E04 MVI C,:04 Nr of char lines in A-mode 208 E506 EB XCHG 209 E507 D4FDE1 CNC :E1FD Blank char area 210 E50A D487E6 CNC :E687 Cursor on begin of line 211 E50D DC35E6 CC :E635 Find old text and move it 212 E510 D1 POP D 213 E511 2A8200 LHLD :0082 Get addr after header 214 E514 3A9700 LDA :0097 Get nr saved graphics lines 215 E517 4F MOV C,A in C 216 E518 3A9600 LDA :0096 Get nr of graphics lines 217 E51B 91 SUB C minus saved ones 218 E51C 4F MOV C,A stored in C 219 E51D F1 POP PSW 220 E51E C4ADE5 CNZ :E5AD Blank visible graph area 221 E521 2A8E00 LHLD :008E Get addr end of screen 222 E524 3A9700 LDA :0097 Get nr saved graphics lines 223 E527 4F MOV C,A in C 224 E528 C4ADE5 CNZ :E5AD Blank saved graph area 225 E52B 117C00 LXI D,:007C Addr text colour table 226 E52E 0600 MVI B,:00 Middle as narrow as possible 227 E530 2A8800 LHLD :0088 Get addr middle area 228 E533 F1 POP PSW Get mode code 229 E534 CDFCE5 CALL :E5FC Set up middle area 230 (blanking) 231 E537 3F CMC 232 E538 C9 RET 233 * 234 * SET UP SCREEN FOR MODE: 235 * 236 * Selects the right table according to the mode 237 * number and sets the screen variables. 238 * 239 * Entry: A: Mode code /2. 240 * HL: Points to screen parameter vectors 241 * for each pair of modes. 242 * Exit: CY=0: O.K.: 243 * AFHL corrupted, BCDE preserved. 244 * CY=1: Insufficient space. 245 * 246 E539 E60E TABP ANI :0E Bits 1,2,3 only 247 E53B CD01E7 CALL :E701 Add offset to start table 248 E53E 00 NOP 249 E53F 00 NOP PAGE 05 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 250 E540 00 NOP 251 E541 7E MOV A,M ) 252 E542 23 INX H ) Get addr from table in HL 253 E543 66 MOV H,M ) 254 E544 6F MOV L,A ) 255 * 256 * LOAD POINTERS WITH SCREEN PARAMETERS: 257 * 258 * Set up vector area 0084-0098 with variables 259 * describing the current state of the screen 260 * in the current mode. 261 * 262 E545 37 VARS STC 263 E546 F5 PUSH PSW 264 E547 C5 PUSH B 265 E548 D5 PUSH D 266 E549 E5 PUSH H 267 E54A E5 PUSH H 268 E54B E5 PUSH H 269 E54C 2A8000 LHLD :0080 Get addr 1st byte screen RAM 270 E54F 44 MOV B,H in BC 271 E550 4D MOV C,L 272 E551 E1 POP H Get startaddr table 273 E552 79 MOV A,C ) 274 E553 96 SUB M ) 275 E554 5F MOV E,A ) Calc end area used in new 276 E555 23 INX H ) mode. Store it in DE. 277 E556 78 MOV A,B ) 278 E557 9E SBB M ) 279 E558 57 MOV D,A ) 280 E559 210000 LXI H,:0000 281 E55C DA60E5 JC :E560 Jump if insufficient space 282 E55F EB XCHG 283 E560 37 VRS05 STC 284 E561 CDA6E5 CALL :E5A6 Make room for new mode 285 E564 D296E5 JNC :E596 Jump if no room available 286 E567 2A8800 LHLD :0088 Get old addr after end 287 graphics area 288 E56A 229900 SHLD :0099 and save it 289 E56D 2A8A00 LHLD :008A Get old startaddr char area 290 E570 229B00 SHLD :009B and save it 291 292 * Set up area 0084-0093: 293 294 E573 118400 LXI D,:0084 Start of variables which 295 need offsets 296 E576 2E08 MVI L,:08 Nr of pointers to be set 297 E578 E3 VRS10 XTHL Get addr screen parameters 298 E579 79 MOV A,C 299 E57A 96 SUB M Calc lobyte 300 E57B 12 STAX D And store it in pointer 301 E57C 23 INX H Next byte 302 E57D 13 INX D 303 E57E 78 MOV A,B 304 E57F 9E SBB M Calc hibyte 305 E580 12 STAX D And store it in pointer 306 E581 23 INX H 307 E582 13 INX D 308 E583 E3 XTHL 309 E584 2D DCR L Decr counter 310 E585 C278E5 JNZ :E578 Next parameter 311 PAGE 06 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 312 * Set up area 0094-0098: 313 314 E588 E1 POP H Get addr 1st parameter 315 E589 0605 MVI B,:05 Nr unadjusted constant bytes 316 E58B 7E VRS20 MOV A,M Get parameter 317 E58C 12 STAX D and store it in pointer 318 E58D 23 INX H 319 E58E 13 INX D 320 E58F 05 DCR B Decr counter 321 E590 C28BE5 JNZ :E58B Next parameter 322 E593 C32EE1 JMP :E12E Popall, CY=0, ret 323 324 * If no room available: 325 326 E596 E1 VRS30 POP H 327 E597 C338E1 JMP :E138 Popall (CY=1), ret 328 * 329 * VECTORS TO TABLES SCREEN PARAMETERS: 330 * 331 * The startaddresses of the tables with para- 332 * meters for the graphic modes are given. 333 * 334 E59A 45E0 TABM DBL :E045 mode 1/2 335 E59C 6FE0 DBL :E06F mode 3/4 336 E59E 99E0 DBL :E099 mode 5/6 337 * 338 E5A0 5AE0 TABMA DBL :E05A mode 1A/2A 339 E5A2 84E0 DBL :E084 mode 3A/4A 340 E5A4 AEE0 DBL :E0AE mode 5A/6A 341 * 342 ************************************* 343 * PERFORM MEMORY MANAGEMENT ROUTINE * 344 ************************************* 345 * 346 * Entry: HL points to last free byte in RAM. 347 * 348 E5A6 23 SMKRM INX H 349 E5A7 E5 PUSH H 350 E5A8 2AC400 LHLD :00C4 Get addr mem.management 351 routine 352 E5AB E3 XTHL Put it on stack 353 E5AC C9 RET Perform this routine and 354 return afterwards to origin. 355 returnaddress. 356 * 357 ********************************* 358 * SET UP AN EMPTY GRAPHICS AREA * 359 ********************************* 360 * 361 * Initialises an area of the screen into graphic 362 * state and blanks it. In 16-colour modes, all 363 * pixels are set 'on'. The foreground colour is 364 * the first COLORG colour, the background is black. 365 * 366 * Entry: D: Mode code. 367 * C: Number of graphic lines (1-256). 368 * HL: Start of area. 369 * Exit: All registers preserved. 370 * 371 E5AD F5 SGINIT PUSH PSW 372 E5AE C5 PUSH B 373 E5AF D5 PUSH D PAGE 07 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 374 E5B0 E5 PUSH H 375 E5B1 7A MOV A,D Mode in A 376 E5B2 E5 PUSH H 377 E5B3 110000 LXI D,:0000 8 blobs 1st graph colour 378 E5B6 2E00 MVI L,:00 Control byte: graph, low 379 def, 4-colour 380 E5B8 1F RAR 381 E5B9 1F RAR 382 E5BA DACBE5 JC :E5CB Jump if 4-colour mode 383 384 * 16-colour mode only: 385 386 E5BD F5 PUSH PSW 387 E5BE 3A9E00 LDA :009E Get 1st colour 388 E5C1 87 ADD A ) 389 E5C2 87 ADD A ) Move lonibble into 390 E5C3 87 ADD A ) hinibble 391 E5C4 87 ADD A ) 392 E5C5 57 MOV D,A Result in D 393 E5C6 1EFF MVI E,:FF 8 blobs foreground 394 E5C8 F1 POP PSW 395 E5C9 2E80 MVI L,:80 Control byte: graph, low 396 def, 16-colour 397 E5CB 1F SGI10 RAR 398 E5CC DADEE5 JC :E5DE Jump if mode 3/4 399 400 * Mode 1/2 and 5/6 only: 401 402 E5CF 1F RAR 403 E5D0 260B MVI H,:0B Low def fields/line 404 E5D2 3E03 MVI A,:03 Low def bit mask 405 E5D4 D2E2E5 JNC :E5E2 Jump if mode 1/2 406 407 * Mode 5/6 only: 408 409 E5D7 262C MVI H,:2C Super def fields/line 410 E5D9 3E20 MVI A,:20 Super def bit mask 411 E5DB C3E2E5 JMP :E5E2 412 413 * Mode 3/4 only: 414 415 E5DE 2616 SGI20 MVI H,:16 High def fields/line 416 E5E0 3E11 MVI A,:11 High def bit mask 417 * 418 E5E2 B5 SGI30 ORA L Add def bits to get mode 419 code 420 E5E3 47 MOV B,A 421 E5E4 7C MOV A,H Line length in A 422 E5E5 E1 POP H Get top of area 423 E5E6 F5 SGI50 PUSH PSW Save line length 424 E5E7 70 MOV M,B Load line control byte 425 E5E8 2B DCX H 426 E5E9 3640 MVI M,:40 Null line colour byte 427 E5EB 2B DCX H 428 E5EC 73 SGI60 MOV M,E ) Load screen data locations 429 E5ED 2B DCX H ) with 1 blank field 430 E5EE 72 MOV M,D ) 431 E5EF 2B DCX H 432 E5F0 3D DCR A Next screen location 433 E5F1 C2ECE5 JNZ :E5EC Jump if line not ready 434 E5F4 F1 POP PSW Restore nr of locations in A 435 E5F5 0D DCR C Next screen line PAGE 08 DAI FIRMWARE 2E407-2E5FB V1.0 Rev.1 436 E5F6 C2E6E5 JNZ :E5E6 Jump if not ready 437 E5F9 C338E1 JMP :E138 Popall, ret 438 * 439 * 440 * 441 E5FC END *************************** * S Y M B O L T A B L E * *************************** SGI10 E5CB SGI20 E5DE SGI30 E5E2 SGI50 E5E6 SGI60 E5EC SGINIT E5AD SMA10 E4F9 SMKRM E5A6 SS010 E42D SS015 E438 SS020 E43C SSM E45F SSM0 E407 SSM10 E47F SSM21 E485 SSMA E4B6 SSMG E43E TABM E59A TABMA E5A0 TABP E539 VARS E545 VRS05 E560 VRS10 E578 VRS20 E58B VRS30 E596