Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 1 D0:SFBOOT.ASM ;**************************************************************************** 1 ;** ** 2 ;** SmartFiler version 27D -- BOOT block ** 3 ;** ** 4 ;**************************************************************************** 5 6 ;disassembly and comments (c) 2000 by Richard F. Drushel 5 August 2000 7 8 ;**************************************************************************** 9 ; 10 ; SmartFiler 27D boot block 11 ; SFBOOT -> Source re-created by Z80DIS 2.2 12 ; Z80DIS was written by Kenneth Gielow 13 ; Palo Alto, CA 14 ; 15 ;**************************************************************************** 16 17 .Z80 18 19 ;**************************************************************************** 20 21 ;VRAM immediates 22 23 0000 I.0000 EQU 0000H ; ----I 24 017F I$017F EQU 017FH ; ----I 25 0204 I$0204 EQU 0204H ; ----I 26 037F I$037F EQU 037FH ; ----I 27 0400 I$0400 EQU 0400H ; ----I 28 3FFF I$3FFF EQU 3FFFH ; ----I 29 30 ;other miscellany 31 32 0000 BLOCK_1_ADDR EQU 0000H 33 8400 BLOCK_2_ADDR EQU 8400H 34 0100 PROG_START EQU 0100H 35 0000 ZERO EQU 0000H 36 005C TRADET$ EQU 5CH ;trademark symbol T 37 005D TRADEM$ EQU 5DH ;trademark symbol M 38 005E COPY$ EQU 5EH ;copyright symbol (C) 39 005F REG$ EQU 5FH ;registered symbol (R) 40 41 ;blocks to read 42 43 0001 BLOCK_1 EQU 0001H ;directory 44 0002 BLOCK_2 EQU 0002H ;file1 45 0005 BLOCK_5 EQU 0005H ;file2 46 47 ;OS-7 equates 48 49 080B PUTFRAME EQU 080BH ;internal OS-7 entry point, not jump table!!! 50 51 1F7F LOAD_ASCII EQU 1F7FH 52 1F82 FILL_VRAM EQU 1F82H 53 1F85 MODE_1 EQU 1F85H 54 1FD9 WRITE_REGISTER EQU 1FD9H 55 1FDF WRITE_VRAM EQU 1FDFH 56 73C3 VDP_MODE_WORD EQU 73C3H Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 2 D0:SFBOOT.ASM 57 58 ;EOS equates 59 60 FC69 _RD_1_BLOCK EQU 0FC69H 61 FCA2 _START_RD_1_BLOCK EQU 0FCA2H 62 63 ;**************************************************************************** 64 ;** ** 65 ;** code begins here ** 66 ;** ** 67 ;**************************************************************************** 68 69 C800 COLD_BOOT_ADDR EQU 0C800H 70 71 C800 ORG COLD_BOOT_ADDR 72 73 C800 COLD_BOOT: 74 C800 78 LD A,B ;get boot device number 75 C801 32 37CB LD (BOOT_DEVICE),A ;save it 76 C804 31 00C8 LD SP,COLD_BOOT ;set up stack 77 C807 CD 5CC8 CALL C$C85C ;draw initial boot screen 78 ; 79 ;Load boot graphics code and data (LOGOS) 80 ;This is *evil* because it doesn't use the directory! It assumes that 81 ;the file occupies certain blocks. 82 83 C80A 21 0084 LD HL,BLOCK_2_ADDR ;load address for LOGOS 84 C80D 11 0200 LD DE,BLOCK_2 ;start block of LOGOS 85 C810 06 03 LD B,03H ;length of LOGOS 86 C812 CD 1ACB CALL LOAD_BLOCKS ;load LOGOS 87 ; 88 ;Start to read first block of SmartFiler (SMART_FILER) 89 ;This is so that the tape can be spinning while the graphics are being 90 ;displayed. 91 ;Again, it bypasses the directory and assumes that it starts at a certain 92 ;block and has a certain length. 93 94 C815 3A 37CB LD A,(BOOT_DEVICE) ;drive to read 95 C818 21 0001 LD HL,PROG_START ;load address for SMART_FILER 96 C81B 11 0500 LD DE,BLOCK_5 ;block loword 97 C81E 01 0000 LD BC,ZERO ;block hiword 98 C821 CD A2FC CALL _START_RD_1_BLOCK ;read it 99 ; 100 ;Show the boot graphics screen. 101 102 C824 CD 0084 CALL BLOCK_2_ADDR ;run LOGOS to load SmartFiler graphic 103 ; 104 ;Load the rest of SmartFiler, assuming a certain start block and length. 105 106 C827 21 0001 LD HL,PROG_START ;load address for SMART_FILER 107 C82A 11 0500 LD DE,BLOCK_5 ;start block of SMART_FILER 108 C82D 06 1E LD B,1EH ;length of SMART_FILER 109 C82F CD 1ACB CALL LOAD_BLOCKS ;load SMART_FILER 110 ; 111 ;This reads the directory block. 112 ;How nice that it assumes it is only one block long... 113 ;Why does it do this? It will overwrite the first block of SMART_FILER! Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 3 D0:SFBOOT.ASM 114 115 ;The answer is evil: a quirk of ADAMnet is that it takes *2* reads of 116 ;a block device to actually cause the data to be transferred into Z80 RAM. 117 ;The first call makes the device read the data, but it doesn't get into 118 ;Z80 RAM until the second consecutive call. So, the *effect* of a single 119 ;call to _START_READ_1_BLOCK for block 1 is to just rewind the tape (if 120 ;you're booting from data pack)--a major time savings for later. The trap 121 ;for emulators is that, if they don't correctly emulate the read-twice 122 ;behavior, they will cause the program to crash. 123 124 C832 3A 37CB LD A,(BOOT_DEVICE) ;drive to read 125 C835 21 0000 LD HL,BLOCK_1_ADDR ;load address 126 C838 11 0100 LD DE,BLOCK_1 ;block loword 127 C83B 01 0000 LD BC,ZERO ;block hiword 128 C83E CD A2FC CALL _START_RD_1_BLOCK ;read it 129 130 ;Clumsy write to VDP register 1. 131 132 C841 2A C373 LD HL,(VDP_MODE_WORD) ;get current value 133 C844 E5 PUSH HL ;save it; why? 134 ;When we (below) call WRITE_REGISTER, 135 ;VDP_MODE_WORD will get changed. But now 136 ;we have a program sitting at the site of 137 ;OS-7's VDP_MODE_WORD (73C3H), and this 138 ;will scramble program code. So, save the 139 ;RAM contents, call WRITE_REGISTER, then 140 ;restore them. 141 ;Note: the smarter thing to do might have 142 ;been to call the EOS version of 143 ;WRITE_REGISTER at 0FD1DH *after* 144 ;restoring the 32K RAM/32K RAM memory 145 ;map; the location the of EOS's 146 ;VDP_MODE_WORD is at 0FD61H, which is in 147 ;EOS global RAM and not a threat to user 148 ;program RAM. 149 C845 0E 00 LD C,00H 150 C847 06 01 LD B,01H ; 1 151 C849 CD D91F CALL WRITE_REGISTER ;write C to VDP register B (OS-7 version) 152 ; 153 C84C E1 POP HL 154 C84D 22 C373 LD (VDP_MODE_WORD),HL ;restore program RAM contents. 155 156 ;Restore standard memory configuration. 157 158 C850 01 7F01 LD BC,I$017F 159 C853 ED 41 OUT (C),B ;bank switch to 32K RAM/32K RAM 160 161 ;Run SMART_FILER. 162 163 C855 3A 37CB LD A,(BOOT_DEVICE) ;get drive 164 C858 47 LD B,A ;into B 165 C859 C3 0001 JP PROG_START ;and begin SmartFiler 166 ; 167 ; ----------------- 168 ; 169 ; Subroutine __________________________ 170 ; Inputs ________________________ Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 4 D0:SFBOOT.ASM 171 ; Outputs ________________________ 172 ; 173 C85C C$C85C: 174 C85C 01 7F03 LD BC,I$037F 175 C85F ED 41 OUT (C),B 176 C861 CD EDC8 CALL C$C8ED ;bank switch to OS7-24 K RAM/32K RAM 177 ; 178 C864 21 0000 LD HL,I.0000 179 C867 11 FF3F LD DE,I$3FFF 180 C86A AF XOR A 181 C86B CD 821F CALL FILL_VRAM ;wipe VRAM 182 ; 183 C86E CD 851F CALL MODE_1 184 ; 185 C871 CD 7F1F CALL LOAD_ASCII 186 ; 187 C874 DD 21 F4C9 LD IX,I$C9F4 188 C878 CD B3C8 CALL C.C8B3 189 ; 190 C87B DD 21 DAC9 LD IX,I$C9DA 191 C87F CD B3C8 CALL C.C8B3 192 ; 193 C882 21 00C9 LD HL,I$C900 194 C885 11 0402 LD DE,I$0204 195 C888 CD ABC8 CALL C$C8AB 196 ; 197 C88B 21 7FC9 LD HL,BOOT_TEXT 198 C88E CD 95C8 CALL C.C895 199 ; 200 C891 CD F9C8 CALL C$C8F9 201 ; 202 C894 C9 RET 203 ; 204 ; ----------------- 205 ; 206 ; Subroutine __________________________ 207 ; Inputs ________________________ 208 ; Outputs ________________________ 209 ; 210 C895 C.C895: 211 C895 7E LD A,(HL) 212 C896 3C INC A 213 C897 C8 RET Z 214 ; 215 C898 56 LD D,(HL) 216 C899 23 INC HL 217 C89A 5E LD E,(HL) 218 C89B 23 INC HL 219 C89C 4E LD C,(HL) 220 C89D 23 INC HL 221 C89E E5 PUSH HL 222 C89F 06 00 LD B,00H 223 C8A1 09 ADD HL,BC 224 C8A2 E3 EX (SP),HL 225 C8A3 06 01 LD B,01H ; 1 226 C8A5 CD 0B08 CALL PUTFRAME ;internal OS-7 ref!!! 227 ; Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 5 D0:SFBOOT.ASM 228 C8A8 E1 POP HL 229 C8A9 18 EA JR C.C895 230 ; 231 ; ----------------- 232 ; 233 ; Subroutine __________________________ 234 ; Inputs ________________________ 235 ; Outputs ________________________ 236 ; 237 C8AB C$C8AB: 238 C8AB 46 LD B,(HL) 239 C8AC 23 INC HL 240 C8AD 4E LD C,(HL) 241 C8AE 23 INC HL 242 C8AF CD 0B08 CALL PUTFRAME ;internal OS-7 ref!!! 243 ; 244 C8B2 C9 RET 245 ; 246 ; ----------------- 247 ; 248 ; Subroutine __________________________ 249 ; Inputs ________________________ 250 ; Outputs ________________________ 251 ; 252 C8B3 C.C8B3: 253 C8B3 DD 66 01 LD H,(IX+1) 254 C8B6 DD 6E 00 LD L,(IX) 255 C8B9 DD 56 03 LD D,(IX+3) 256 C8BC DD 5E 02 LD E,(IX+2) 257 C8BF DD 46 05 LD B,(IX+5) 258 C8C2 DD 4E 04 LD C,(IX+4) 259 C8C5 C5 PUSH BC 260 C8C6 E5 PUSH HL 261 C8C7 D5 PUSH DE 262 C8C8 0C INC C 263 C8C9 0D DEC C 264 C8CA 28 05 JR Z,J$C8D1 265 ; 266 C8CC 06 00 LD B,00H 267 C8CE CD DF1F CALL WRITE_VRAM 268 ; 269 C8D1 J$C8D1: 270 C8D1 D1 POP DE 271 C8D2 E1 POP HL 272 C8D3 C1 POP BC 273 C8D4 04 INC B 274 C8D5 05 DEC B 275 C8D6 C8 RET Z 276 ; 277 C8D7 C5 PUSH BC 278 C8D8 06 00 LD B,00H 279 C8DA 09 ADD HL,BC 280 C8DB EB EX DE,HL 281 C8DC 09 ADD HL,BC 282 C8DD EB EX DE,HL 283 C8DE C1 POP BC 284 C8DF 0E 00 LD C,00H Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 6 D0:SFBOOT.ASM 285 C8E1 CD DF1F CALL WRITE_VRAM 286 ; 287 C8E4 C9 RET 288 ; 289 ; ----------------- 290 291 ;Orphaned code? 292 293 C8E5 ?.C8E5: 294 C8E5 0E 01 LD C,01H ; 1 295 C8E7 06 07 LD B,07H ; 7 296 C8E9 CD D91F CALL WRITE_REGISTER ;write 01H to VDP register 7 297 ; 298 C8EC C9 RET 299 ; 300 ; ----------------- 301 ; 302 ; Subroutine __________________________ 303 ; Inputs ________________________ 304 ; Outputs ________________________ 305 ; 306 C8ED C$C8ED: 307 C8ED 3A C473 LD A,(VDP_MODE_WORD+1) ;saved VDP register 1 value 308 C8F0 CB AF RES 5,A ;clear bit 5 309 C8F2 J$C8F2: 310 C8F2 4F LD C,A ;into C so we can write it 311 C8F3 06 01 LD B,01H ; 1 312 C8F5 CD D91F CALL WRITE_REGISTER ;update VDP register 1 313 ; 314 C8F8 C9 RET 315 ; 316 ; ----------------- 317 ; 318 ; Subroutine __________________________ 319 ; Inputs ________________________ 320 ; Outputs ________________________ 321 ; 322 C8F9 C$C8F9: 323 C8F9 3A C473 LD A,(VDP_MODE_WORD+1) ;saved VDP register 1 value 324 C8FC CB F7 SET 6,A ;set bit 6 325 C8FE 18 F2 JR J$C8F2 ;write it back 326 ; 327 ; ----------------- 328 C900 I$C900: 329 C900 05 19 DEFB 5,25 ;number of data units, length of each data unit 330 ; 331 C902 00 61 63 63 DEFB 00H,61H,63H,63H,64H 332 C906 64 333 C907 00 61 63 63 DEFB 00H,61H,63H,63H,63H 334 C90B 63 335 C90C 6E 00 61 63 DEFB 6EH,00H,61H,63H,63H 336 C910 63 337 C911 64 00 61 63 DEFB 64H,00H,61H,63H,64H 338 C915 64 339 C916 00 7A 63 7E DEFB 00H,7AH,63H,7EH,7FH 340 C91A 7F 341 ; Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 7 D0:SFBOOT.ASM 342 C91B 00 62 60 66 DEFB 00H,62H,60H,66H,65H 343 C91F 65 344 C920 00 62 60 6F DEFB 00H,62H,60H,6FH,70H 345 C924 70 346 C925 60 00 62 60 DEFB 60H,00H,62H,60H,66H 347 C929 66 348 C92A 65 00 62 60 DEFB 65H,00H,62H,60H,65H 349 C92E 65 350 C92F 00 6A 60 00 DEFB 00H,6AH,60H,00H,00H 351 C933 00 352 ; 353 C934 00 69 67 68 DEFB 00H,69H,67H,68H,60H 354 C938 60 355 C939 7C 00 60 71 DEFB 7CH,00H,60H,71H,72H 356 C93D 72 357 C93E 60 00 69 67 DEFB 60H,00H,69H,67H,68H 358 C942 68 359 C943 60 7C 00 60 DEFB 60H,7CH,00H,60H,60H 360 C947 60 361 C948 79 60 60 00 DEFB 79H,60H,60H,00H,00H 362 C94C 00 363 ; 364 C94D 00 6A 60 60 DEFB 00H,6AH,60H,60H,60H 365 C951 60 366 C952 65 00 60 73 DEFB 65H,00H,60H,73H,74H 367 C956 74 368 C957 60 00 6A 60 DEFB 60H,00H,6AH,60H,60H 369 C95B 60 370 C95C 60 65 00 60 DEFB 60H,65H,00H,60H,75H 371 C960 75 372 C961 60 77 60 00 DEFB 60H,77H,60H,00H,00H 373 C965 00 374 ; 375 C966 69 60 6B 6C DEFB 69H,60H,6BH,6CH,6DH 376 C96A 6D 377 C96B 60 7C 60 60 DEFB 60H,7CH,60H,60H,60H 378 C96F 60 379 C970 7D 69 60 6B DEFB 7DH,69H,60H,6BH,6CH 380 C974 6C 381 C975 6D 60 7C 60 DEFB 6DH,60H,7CH,60H,76H 382 C979 76 383 C97A 60 78 60 00 DEFB 60H,78H,60H,00H,00H 384 C97E 00 385 386 C97F BOOT_TEXT: 387 ;row, column, length of string, string data 388 C97F 09 0E 03 54 DEFB 9,14,3,"THE" 389 C983 48 45 390 C985 0A 0A 0D 43 DEFB 10,10,13,"COLECOVISION",REG$ 391 C989 4F 4C 45 43 392 C98D 4F 56 49 53 393 C991 49 4F 4E 5F 394 C995 0B 05 16 46 DEFB 11,5,22,"FAMILY COMPUTER SYSTEM" 395 C999 41 4D 49 4C 396 C99D 59 20 43 4F 397 C9A1 4D 50 55 54 398 C9A5 45 52 20 53 Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 8 D0:SFBOOT.ASM 399 C9A9 59 53 54 45 400 C9AD 4D 401 C9AE 0D 0C 08 50 DEFB 13,12,8,"PRESENTS" 402 C9B2 52 45 53 45 403 C9B6 4E 54 53 404 C9B9 0F 0A 0D 53 DEFB 15,10,13,"SMART FILER",TRADET$,TRADEM$ 405 C9BD 4D 41 52 54 406 C9C1 20 46 49 4C 407 C9C5 45 52 5C 5D 408 C9C9 11 0A 0D 5E DEFB 17,10,13,COPY$," 1984 COLECO" 409 C9CD 20 31 39 38 410 C9D1 34 20 43 4F 411 C9D5 4C 45 43 4F 412 C9D9 FF DEFB 0FFH ;end of data 413 414 C9DA I$C9DA: 415 C9DA E0C9 DEFW I$C9E0 ;RAM source address 416 C9DC 0020 DEFW 2000H ;VRAM destination address 417 C9DE 1400 DEFW 20 ;count 418 C9E0 I$C9E0: 419 C9E0 50 50 50 50 DEFB 50H,50H,50H,50H 420 C9E4 F0 F0 F0 F0 DEFB 0F0H,0F0H,0F0H,0F0H 421 C9E8 F0 F0 F0 F0 DEFB 0F0H,0F0H,0F0H,0F0H 422 C9EC 50 50 50 50 DEFB 50H,50H,50H,50H 423 C9F0 50 50 50 50 DEFB 50H,50H,50H,50H 424 425 C9F4 I$C9F4: 426 C9F4 FAC9 DEFW I$C9FA ;RAM source address 427 C9F6 E002 DEFW 02E0H ;VRAM destination address 428 C9F8 2001 DEFW 288 ;count 429 C9FA I$C9FA: 430 C9FA FA 23 22 22 DEFB 0FAH,23H,22H,22H,00H,00H,00H,00H 431 C9FE 00 00 00 00 432 CA02 20 60 A0 20 DEFB 20H,60H,0A0H,20H,00H,00H,00H,00H 433 CA06 00 00 00 00 434 CA0A 7C 82 BA A2 DEFB 7CH,82H,0BAH,0A2H,0BAH,82H,7CH,00H 435 CA0E BA 82 7C 00 436 CA12 3C 42 B9 A5 DEFB 3CH,42H,0B9H,0A5H,0B9H,0ADH,42H,3CH 437 CA16 B9 AD 42 3C 438 CA1A FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH 439 CA1E FF FF FF FF 440 CA22 00 00 00 00 DEFB 00H,00H,00H,00H,0FH,0FH,1FH,1FH 441 CA26 0F 0F 1F 1F 442 CA2A 3F 3F 7F 7F DEFB 3FH,3FH,7FH,7FH,01H,00H,00H,00H 443 CA2E 01 00 00 00 444 CA32 00 00 00 00 DEFB 00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH 445 CA36 FF FF FF FF 446 CA3A 00 00 00 00 DEFB 00H,00H,00H,00H,0C0H,0C0H,0E0H,0E0H 447 CA3E C0 C0 E0 E0 448 CA42 F0 F0 F8 F8 DEFB 0F0H,0F0H,0F8H,0F8H,0FCH,0FCH,0FEH,0FEH 449 CA46 FC FC FE FE 450 CA4A FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0CFH,0CFH,87H,87H 451 CA4E CF CF 87 87 452 CA52 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FCH,0FCH 453 CA56 FE FE FC FC 454 CA5A 87 03 03 03 DEFB 87H,03H,03H,03H,01H,01H,00H,00H 455 CA5E 01 01 00 00 Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 9 D0:SFBOOT.ASM 456 CA62 00 00 01 01 DEFB 00H,00H,01H,01H,03H,03H,07H,07H 457 CA66 03 03 07 07 458 CA6A 0F 0F 1F 1F DEFB 0FH,0FH,1FH,1FH,3FH,3FH,7FH,7FH 459 CA6E 3F 3F 7F 7F 460 CA72 FF FF C0 C0 DEFB 0FFH,0FFH,0C0H,0C0H,80H,80H,00H,00H 461 CA76 80 80 00 00 462 CA7A FF FF 00 00 DEFB 0FFH,0FFH,00H,00H,00H,00H,00H,00H 463 CA7E 00 00 00 00 464 CA82 FF FF 03 03 DEFB 0FFH,0FFH,03H,03H,01H,01H,00H,00H 465 CA86 01 01 00 00 466 CA8A 00 00 00 00 DEFB 00H,00H,00H,00H,0F0H,0FCH,0FEH,0FEH 467 CA8E F0 FC FE FE 468 CA92 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,80H,80H,80H 469 CA96 FF 80 80 80 470 CA9A FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,03H,01H,01H 471 CA9E FF 03 01 01 472 CAA2 80 80 80 80 DEFB 80H,80H,80H,80H,80H,80H,80H,80H 473 CAA6 80 80 80 80 474 CAAA 01 01 01 01 DEFB 01H,01H,01H,01H,01H,01H,01H,01H 475 CAAE 01 01 01 01 476 CAB2 80 80 80 80 DEFB 80H,80H,80H,80H,80H,80H,80H,0FFH 477 CAB6 80 80 80 FF 478 CABA 01 01 01 01 DEFB 01H,01H,01H,01H,01H,01H,03H,0FFH 479 CABE 01 01 03 FF 480 CAC2 7F 7F 3F 3F DEFB 7FH,7FH,3FH,3FH,1FH,1FH,0FH,0FH 481 CAC6 1F 1F 0F 0F 482 CACA 07 07 03 03 DEFB 07H,07H,03H,03H,01H,01H,00H,00H 483 CACE 01 01 00 00 484 CAD2 FE FE FC FC DEFB 0FEH,0FEH,0FCH,0FCH,0F8H,0F8H,0F0H,0F0H 485 CAD6 F8 F8 F0 F0 486 CADA E0 E0 C0 C0 DEFB 0E0H,0E0H,0C0H,0C0H,80H,80H,00H,00H 487 CADE 80 80 00 00 488 CAE2 00 00 81 81 DEFB 00H,00H,81H,81H,0C3H,0C3H,0E7H,0E7H 489 CAE6 C3 C3 E7 E7 490 CAEA 00 00 00 00 DEFB 00H,00H,00H,00H,03H,03H,07H,07H 491 CAEE 03 03 07 07 492 CAF2 F3 55 51 51 DEFB 0F3H,55H,51H,51H,00H,00H,00H,00H 493 CAF6 00 00 00 00 494 CAFA 00 00 80 80 DEFB 00H,00H,80H,80H,0C0H,0C0H,0E0H,0E0H 495 CAFE C0 C0 E0 E0 496 CB02 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FCH,0F0H 497 CB06 FE FE FC F0 498 CB0A FA 23 22 22 DEFB 0FAH,23H,22H,22H,00H,00H,00H,00H 499 CB0E 00 00 00 00 500 CB12 20 60 A0 20 DEFB 20H,60H,0A0H,20H,00H,00H,00H,00H 501 CB16 00 00 00 00 502 ; ----------------- 503 504 ;Load a contiguous series of blocks. On entry, B=number of blocks, 505 ;HL=load address, DE=loword of start block (hiword is forced to 0) and 506 ;(BOOT_DEVICE)=device to load from. On exit, the blocks are loaded. 507 508 ;Note 1: if there is an error, the routine hangs forever! There is 509 ;no bailout to SmartWriter! 510 511 ;Note 2: this code is short-sighted because it assumes that the hiword 512 ;of the block is zero. This is bad for large hard drives. Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 10 D0:SFBOOT.ASM 513 514 CB1A LOAD_BLOCKS: 515 CB1A C5 PUSH BC ;save block counter (in B) 516 CB1B J.CB1B: 517 CB1B 3A 37CB LD A,(BOOT_DEVICE) ;get drive 518 CB1E 01 0000 LD BC,ZERO ;force hiword of block to zero 519 CB21 D5 PUSH DE 520 CB22 E5 PUSH HL 521 CB23 CD 69FC CALL _RD_1_BLOCK ;read it 522 ; 523 CB26 E1 POP HL 524 CB27 D1 POP DE 525 CB28 30 F1 JR NC,J.CB1B ;not ready, retry 526 ; 527 CB2A FE 80 CP 80H ;done, but was there an error? 528 CB2C 20 ED JR NZ,J.CB1B ;yes, so retry 529 ; 530 CB2E 01 0004 LD BC,I$0400 ;length of one block 531 CB31 09 ADD HL,BC ;offset to next address 532 CB32 13 INC DE ;point to next block 533 CB33 C1 POP BC ;restore block counter (in B) 534 CB34 10 E4 DJNZ LOAD_BLOCKS ;keep going until no more blocks 535 ; 536 CB36 C9 RET 537 ; 538 ; ----------------- 539 CB37 BOOT_DEVICE: 540 CB37 20 DEFB 20H ;where we save our boot device # 541 542 ; ----------------- 543 ;seems to be unused 544 545 CB38 20 20 20 20 DEFB " " 546 CB3C 20 20 20 20 547 CB40 20 20 20 20 548 CB44 20 20 20 20 549 CB48 20 20 20 20 550 CB4C 20 20 20 20 551 CB50 20 20 20 20 552 CB54 20 20 553 CB56 42 59 20 53 DEFB "BY SIERRA ON-LINE " 554 CB5A 49 45 52 52 555 CB5E 41 20 4F 4E 556 CB62 2D 4C 49 4E 557 CB66 45 20 20 20 558 CB6A 20 20 20 20 559 CB6E 3E 41 5D 55 DEFB 3EH,41H,5DH,55H,59H,55H,41H,3EH 560 CB72 59 55 41 3E 561 CB76 40 20 20 50 DEFB "@ PROGRAMMED BY DON MCGLAUFLIN@@" 562 CB7A 52 4F 47 52 563 CB7E 41 4D 4D 45 564 CB82 44 20 42 59 565 CB86 20 44 4F 4E 566 CB8A 20 4D 43 47 567 CB8E 4C 41 55 46 568 CB92 4C 49 4E 40 569 CB96 40 Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 11 D0:SFBOOT.ASM 570 CB97 40 20 20 20 DEFB "@ ",1DH,"1984 SIERRA ON-LINE, INC.@" 571 CB9B 1D 31 39 38 572 CB9F 34 20 53 49 573 CBA3 45 52 52 41 574 CBA7 20 4F 4E 2D 575 CBAB 4C 49 4E 45 576 CBAF 2C 20 49 4E 577 CBB3 43 2E 40 578 CBB6 40 20 50 4C DEFB "@ PLEASE WAIT WHILE LOADING GAME@@" 579 CBBA 45 41 53 45 580 CBBE 20 57 41 49 581 CBC2 54 20 57 48 582 CBC6 49 4C 45 20 583 CBCA 4C 4F 41 44 584 CBCE 49 4E 47 20 585 CBD2 47 41 4D 45 586 CBD6 40 40 587 588 CBD8 00 FF FF FF DEFB 00H,0FFH,0FFH,0FFH,00H,00H,00H,00H 589 CBDC 00 00 00 00 590 CBE0 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H 591 CBE4 00 00 00 00 592 CBE8 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H 593 CBEC 00 00 00 00 594 CBF0 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H 595 CBF4 00 00 00 00 596 CBF8 FF FF FF FF DEFB 0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H 597 CBFC 00 00 00 00 598 ; ----------------- 599 600 END 0 Error(s) Detected. 1024 Absolute Bytes. 46 Symbols Detected. Z80ASM+ SuperFast Relocating Macro Assembler í80ASM+ 1.14 Page 12 Value Symbol Defined Referenced: C8E5 ?.C8E5 293 0001 BLOCK_1 43 126 0000 BLOCK_1_ADDR 32 125 0002 BLOCK_2 44 84 8400 BLOCK_2_ADDR 33 83 102 0005 BLOCK_5 45 96 107 CB37 BOOT_DEVICE 539 75 94 124 163 517 C97F BOOT_TEXT 386 197 C85C C$C85C 173 77 C8AB C$C8AB 237 195 C8ED C$C8ED 306 176 C8F9 C$C8F9 322 200 C895 C.C895 210 198 229 C8B3 C.C8B3 252 188 191 C800 COLD_BOOT 73 76 C800 COLD_BOOT_ADDR 69 71 005E COPY$ 38 408 1F82 FILL_VRAM 52 181 017F I$017F 24 158 0204 I$0204 25 194 037F I$037F 26 174 0400 I$0400 27 530 3FFF I$3FFF 28 179 C900 I$C900 328 193 C9DA I$C9DA 414 190 C9E0 I$C9E0 418 415 C9F4 I$C9F4 425 187 C9FA I$C9FA 429 426 0000 I.0000 23 178 C8D1 J$C8D1 269 264 C8F2 J$C8F2 309 325 CB1B J.CB1B 516 525 528 1F7F LOAD_ASCII 51 185 CB1A LOAD_BLOCKS 514 86 109 534 1F85 MODE_1 53 183 0100 PROG_START 34 95 106 165 080B PUTFRAME 49 226 242 005F REG$ 39 393 005D TRADEM$ 37 407 005C TRADET$ 36 407 73C3 VDP_MODE_WORD 56 132 154 307 323 1FD9 WRITE_REGISTER 54 151 296 312 1FDF WRITE_VRAM 55 267 285 0000 ZERO 35 97 127 518 FC69 _RD_1_BLOCK 60 521 FCA2 _START_RD_1_BLOCK 61 98 128 C8E5 ?.C8E5 0001 BLOCK_1 0000 BLOCK_1_ADDR 0002 BLOCK_2 8400 BLOCK_2_ADDR 0005 BLOCK_5 CB37 BOOT_DEVICE C97F BOOT_TEXT C85C C$C85C C8AB C$C8AB C8ED C$C8ED C8F9 C$C8F9 C895 C.C895 C8B3 C.C8B3 C800 COLD_BOOT C800 COLD_BOOT_ADDR 005E COPY$ 1F82 FILL_VRAM 017F I$017F 0204 I$0204 037F I$037F 0400 I$0400 3FFF I$3FFF C900 I$C900 C9DA I$C9DA C9E0 I$C9E0 C9F4 I$C9F4 C9FA I$C9FA 0000 I.0000 C8D1 J$C8D1 C8F2 J$C8F2 CB1B J.CB1B 1F7F LOAD_ASCII CB1A LOAD_BLOCKS 1F85 MODE_1 0100 PROG_START 080B PUTFRAME 005F REG$ 005D TRADEM$ 005C TRADET$ 73C3 VDP_MODE_WORD 1FD9 WRITE_REGISTER 1FDF WRITE_VRAM 0000 ZERO FC69 _RD_1_BLOCK FCA2 _START_RD_1_BLOCK