1 2 ; LST OFF 3 ORG $0A00 4 5 ******************************** 6 * * 7 * Beautiful Boot (part 2) * 8 * for Pseudo-Disk ][ * 9 * Version 20090129 * 10 * * 11 * (c) Alex Freed & Mini Appler * 12 * & VladiTX & Deckard * 13 * * 14 ******************************** 15 16 * WARNING: assume ROM = BOOT.MMC (ProDOS mode) 17 18 * In: UNIT = DSSS0000 19 * X = DSSS0000 (e.g. $40=slot 4, drive 1) 20 21 *------------------------------- 22 * Device driver parameters 23 *------------------------------- 24 25 P_CMD EQU $42 ; ProDOS command: status, read, write 26 P_UNIT EQU $43 ; DSSS0000 D[0=drive 1,1=drive 2), SSS=slot 27 P_BUFL EQU $44 ; Low address of I/O buffer (Buffer: $1500-$16FF) 28 P_BUFH EQU $45 ; High 29 P_BLKL EQU $46 ; Low block number 30 P_BLKH EQU $47 ; High 31 32 *------------------------------- 33 * Zero page 34 *------------------------------- 35 36 RANDOM_DELAY EQU $00 ; delay (in loops) before moving a star 37 PTRL EQU $01 ; HGR2 screen pointer (low) 38 PTRH EQU $02 ; HGR2 screen pointer (high) 39 COORDX EQU $06 ; X [0,39] on HGR2 screen 40 COORDY EQU $07 ; Y [0,23] on HGR2 screen 41 ENTRY_LO EQU $48 ; Low pointer: pseudodisk I/O vector 42 ENTRY_HI EQU $49 ; High 43 BUFF_LO EQU $FC ; Low pointer: Buffer (names in buffer) 44 BUFF_HI EQU $FD ; High 45 LETTER EQU $FE ; 'A', 'B', ... = file pointer in current page 46 47 *------------------------------- 48 * User ram 49 *------------------------------- 50 51 HGR2_DATAL EQU $087E ; low addresses of each line of the HGR2 screen 52 HGR2_DATAH EQU $093E 53 BUFFER EQU $1500 ; $1500-$16FF : 512 bytes FAT16 sector 54 SIMBOOT EQU $6000 ; PD8.SIMUL: Boot device 55 SIMAVR EQU $6003 ; PD8.SIMUL: AVR command 56 SIMPDD EQU $6006 ; PD8.SIMUL: ProDOS Device Driver 57 58 *------------------------------- 59 * Rom 60 *------------------------------- 61 62 KEY EQU $C000 63 STROBE EQU $C010 64 SPKR EQU $C030 ; speaker 65 TXTCLR EQU $C050 66 MIXCLR EQU $C052 67 HISCR EQU $C055 68 HIRES EQU $C057 69 PD8CMD EQU $C08D ; AVR command 70 INIT EQU $FB2F 71 HOME EQU $FC58 72 SETKBD EQU $FE89 73 SETVID EQU $FE93 74 BELL EQU $FF3A ; bell ring 75 MONZ EQU $FF69 76 77 *------------------------------- 78 * Device command code 79 *------------------------------- 80 81 P_STAT = 0 82 P_READ = 1 83 P_WRITE = 2 84 P_FMT = 3 85 P_CORIG = 8 ; change origin 86 P_ROOTST = $55 ; image_start_sector = puny_root_start 87 P_ZERO = $AA ; image_start_sector = 0 88 89 *------------------------------- 90 * Flags 91 *------------------------------- 92 93 SIMUL = 0 ; 0=PD8 plugged, 1=no PD8 94 95 *------------------------------- 96 * Macros 97 *------------------------------- 98 99 AVR MAC 100 DO SIMUL 101 JSR SIMAVR ; work without pseudodisk 102 ELSE 103 STA PD8CMD,X ; work with pseudodisk 104 FIN 105 <<< 106 107 *------------------------------- 108 * Inits 109 *------------------------------- 110 0A00: 20 89 0B 111 BOOT2 JSR NEW_SCREEN ; init HGR2 screen + display messages 112 113 * New origin = FAT16 114 0A03: A6 43 115 LDX P_UNIT 0A05: A9 08 116 LDA #P_CORIG ; AVR command: change origin 117 AVR 117 DO SIMUL 117 JSR SIMAVR ; work without pseudodisk 117 ELSE 0A07: 9D 8D C0 117 STA PD8CMD,X ; work with pseudodisk 117 FIN 117 <<< 0A0A: A9 55 118 LDA #P_ROOTST ; set to FAT16 directory 119 AVR ; image_start_sector=puny_root_start 119 DO SIMUL 119 JSR SIMAVR ; work without pseudodisk 119 ELSE 0A0C: 9D 8D C0 119 STA PD8CMD,X ; work with pseudodisk 119 FIN 119 <<< 120 121 * Now, fill required inputs for READ request 122 * (ProDOS device driver parameters) 123 0A0F: A9 00 124 BLK0 LDA #$00 ; Low block $0000 0A11: 85 46 125 STA P_BLKL 126 0A13: A9 00 127 NEXT LDA #$00 0A15: 85 47 128 STA P_BLKH ; High block $0000 0A17: 85 44 129 STA P_BUFL ; #BUFFER 0A1E: 85 45 133 STA P_BUFH 0A20: A9 01 134 LDA #P_READ ; ProDOS Read command 0A22: 85 42 135 STA P_CMD 136 0A24: 20 E1 12 137 JSR DO_CALL ; Read dir block (FAT16 partition 1) into BUFFER 0A27: 90 05 138 BCC :1 ; no err 139 0A29: 20 B6 0C 140 JSR FAT16_ERR 0A2C: F0 03 141 BEQ :2 ; always 142 0A2E: 20 DF 0C 143 :1 JSR FAT16_OK ; no err (clear previous msg if any) 144 0A31: AD 00 15 145 :2 LDA BUFFER ; empty block? 0A34: D0 3D 146 BNE DO_DIR ; no 147 0A36: A5 46 148 LDA P_BLKL ; block 0? 0A38: F0 0B 149 BEQ EMPTY_DIR ; yes: the FAT16 dir is empty! 150 0A3A: C6 46 151 DEC P_BLKL ; return to previous block 0A3C: 20 3A FF 152 JSR BELL ; alert 0A3F: 20 89 0B 153 JSR NEW_SCREEN ; refresh screen 0A42: 4C 13 0A 154 JMP NEXT 155 156 *------------------------------- 157 158 EMPTY_DIR 0A45: A9 00 159 LDA #0 ; case: empty FAT16 dir 0A47: 85 06 160 STA COORDX 0A49: A9 14 161 LDA #20 0A4B: 85 07 162 STA COORDY 0A4D: 20 AC 0F 163 JSR DSP_HGR2_STR 0A50: D4 E8 E5 164 ASC "The FAT16 directory is EMPTY!!!"00 0A53: A0 C6 C1 D4 0A57: B1 B6 A0 E4 0A5B: E9 F2 E5 E3 0A5F: F4 EF F2 F9 0A63: A0 E9 F3 A0 0A67: C5 CD D0 D4 0A6B: D9 A1 A1 A1 0A6F: 00 0A70: 4C 1A 0B 165 JMP DO_ANIM ; no key allowed: neverending loop 166 167 *------------------------------- 168 0A73: A9 00 169 DO_DIR LDA #0 0A75: 85 06 170 STA COORDX 0A77: A9 14 171 LDA #20 0A79: 85 07 172 STA COORDY 0A7B: 20 AC 0F 173 JSR DSP_HGR2_STR 0A7E: D5 F3 E5 174 ASC "Use keys A through to select your ware"00 0A81: A0 EB E5 F9 0A85: F3 A0 C1 A0 0A89: F4 E8 F2 EF 0A8D: F5 E7 E8 A0 0A91: A0 A0 F4 EF 0A95: A0 F3 E5 EC 0A99: E5 E3 F4 A0 0A9D: F9 EF F5 F2 0AA1: A0 F7 E1 F2 0AA5: E5 00 175 0AA7: A9 41 176 LDA #'A' ; init first char 0AA9: 85 FE 177 STA LETTER 178 0AAB: A0 15 179 LDY #>BUFFER 0AAD: 84 FD 180 STY BUFF_HI 0AAF: A9 00 181 LDA # end 195 0AC5: A9 00 196 MY_COORDX LDA #0 0AC7: 85 06 197 STA COORDX 0AC9: A5 FE 198 LDA LETTER ; insert letter for file 0ACB: 09 80 199 ORA #%10000000 0ACD: 8D D4 0A 200 STA MY_LETTER 201 0AD0: 20 AC 0F 202 JSR DSP_HGR2_STR ; display letter 0AD3: DB 203 ASC "[" 0AD4: A0 204 MY_LETTER ASC " " 0AD5: DD A0 00 205 ASC "] "00 206 0AD8: A0 00 207 LDY #0 ; display filename 0ADA: B1 FC 208 :1 LDA (BUFF_LO),Y 0ADC: 09 80 209 ORA #%10000000 0ADE: 20 46 0F 210 JSR DSP_HGR2_CHAR 0AE1: C8 211 INY 0AE2: C0 08 212 CPY #8 0AE4: D0 F4 213 BNE :1 214 0AE6: E6 06 215 INC COORDX 216 0AE8: B1 FC 217 :2 LDA (BUFF_LO),Y ; display file extension 0AEA: 09 80 218 ORA #%10000000 0AEC: 20 46 0F 219 JSR DSP_HGR2_CHAR 0AEF: C8 220 INY 0AF0: C0 0B 221 CPY #11 0AF2: D0 F4 222 BNE :2 223 0AF4: E6 FE 224 INC LETTER 0AF6: E6 07 225 INC COORDY 0AF8: A5 FC 226 LDA BUFF_LO ; Set pointer to next name 0AFA: 18 227 CLC 0AFB: 69 20 228 ADC #32 0AFD: 85 FC 229 STA BUFF_LO ; Low 0AFF: 90 BE 230 BCC MORE ; continue 231 232 ; second part of the block (bytes $100 to $1FF) 0B01: E6 FD 233 INC BUFF_HI ; High+1 0B03: A9 17 234 LDA #>BUFFER+$0200 0B05: C5 FD 235 CMP BUFF_HI ; buffer overflow? 0B07: D0 AD 236 BNE MORE2 ; no: continue 237 238 ; yep: stop now and display current page 239 DONE 0B09: C6 FE 240 DEC LETTER 0B0B: A9 13 241 LDA #19 ; display last letter 0B0D: 85 06 242 STA COORDX 0B0F: A9 14 243 LDA #20 0B11: 85 07 244 STA COORDY 0B13: A5 FE 245 LDA LETTER 0B15: 09 80 246 ORA #%10000000 0B17: 20 46 0F 247 JSR DSP_HGR2_CHAR 248 249 250 *------------------------------- 251 * Process animation and wait 252 * for any key 253 *------------------------------- 254 255 DO_ANIM 0B1A: 20 A7 0D 256 JSR INIT_ANIM ; init animation 257 0B1D: 2C 10 C0 258 KEY_PROCESS BIT STROBE 259 0B20: 20 C8 0D 260 JSR ANIMATION ; animation for the 40 columns 261 0B23: AD 00 15 262 LDA BUFFER ; check empty FAT16 dir 0B26: F0 F5 263 BEQ KEY_PROCESS ; yes empty: neverending loop 264 265 ; at least 1 file! 0B28: AD 00 C0 266 LDA KEY ; key pressed? 0B2B: 10 F0 267 BPL KEY_PROCESS ; bad key 268 0B2D: 2C 10 C0 269 BIT STROBE 270 0B30: C9 B1 271 CMP #"1" ; 1=refresh 0B32: D0 06 272 BNE :1 273 0B34: 20 89 0B 274 JSR NEW_SCREEN 0B37: 4C 0F 0A 275 JMP BLK0 ; return to block 0 276 0B3A: C9 AB 277 :1 CMP #"+" ; next page? 0B3C: D0 0E 278 BNE :2 ; no 279 0B3E: A5 FE 280 LDA LETTER ; is current block full of files? 0B40: C9 50 281 CMP #'P' 0B42: D0 D9 282 BNE KEY_PROCESS ; no 283 0B44: E6 46 284 INC P_BLKL ; Next block of dir 0B46: 20 89 0B 285 :4 JSR NEW_SCREEN 0B49: 4C 13 0A 286 JMP NEXT ; display the names of this block 287 0B4C: C9 AD 288 :2 CMP #"-" ; previous page? 0B4E: D0 09 289 BNE :3 ; no 290 0B50: A5 46 291 LDA P_BLKL ; block 0? 0B52: F0 C9 292 BEQ KEY_PROCESS ; yes, don't move 293 0B54: C6 46 294 DEC P_BLKL ; previous dir 0B56: 4C 46 0B 295 JMP :4 296 0B59: 29 7F 297 :3 AND #%01111111 0B5B: C9 41 298 CMP #'A' ; >='A'? 0B5D: 90 BE 299 BCC KEY_PROCESS ; no 300 0B5F: A6 FE 301 LDX LETTER 0B61: E8 302 INX 0B62: 8E 66 0B 303 STX :5+1 304 0B65: C9 00 305 :5 CMP #0 ; select file in current page 325 DO SIMUL 325 JSR SIMAVR ; work without pseudodisk 325 ELSE 0B7F: 9D 8D C0 325 STA PD8CMD,X ; work with pseudodisk 325 FIN 325 <<< 326 ; (last block read) 327 0B82: A9 00 328 LDA #$00 ; exec PR#slot 0B84: 85 48 329 STA ENTRY_LO ; Now points to $Cx00 330 331 DO SIMUL 332 JMP SIMBOOT 333 ELSE 0B86: 4C E1 12 334 JMP DO_CALL ; boot the selected HDV/NIB bin file 335 FIN 336 337 338 *------------------------------- 339 * Init HGR2 screen and display 340 * messages 341 *------------------------------- 342 343 NEW_SCREEN 0B89: 2C 10 C0 344 BIT STROBE 0B8C: 20 13 0D 345 JSR INIT_SCREEN ; clear HGR2 screen and set mode on 346 0B8F: A9 09 347 LDA #9 0B91: 85 06 348 STA COORDX 0B93: A9 01 349 LDA #1 0B95: 85 07 350 STA COORDY 0B97: 20 AC 0F 351 JSR DSP_HGR2_STR 0B9A: C2 E5 E1 352 ASC "Beautiful Boot for PD8"8D00 0B9D: F5 F4 E9 E6 0BA1: F5 EC A0 C2 0BA5: EF EF F4 A0 0BA9: E6 EF F2 A0 0BAD: D0 C4 B8 8D 0BB1: 00 353 0BB2: A9 13 354 LDA #19 0BB4: 85 06 355 STA COORDX 0BB6: 20 AC 0F 356 JSR DSP_HGR2_STR 0BB9: E2 F9 8D 357 ASC "by"8D00 0BBC: 00 358 0BBD: A9 0A 359 LDA #10 0BBF: 85 06 360 STA COORDX 0BC1: 20 AC 0F 361 JSR DSP_HGR2_STR 0BC4: C1 EC E5 362 ASC "Alex Freed / VladiTX"8D00 0BC7: F8 A0 C6 F2 0BCB: E5 E5 E4 A0 0BCF: AF A0 D6 EC 0BD3: E1 E4 E9 D4 0BD7: D8 8D 00 363 0BDA: A9 09 364 LDA #9 0BDC: 85 06 365 STA COORDX 0BDE: 20 AC 0F 366 JSR DSP_HGR2_STR 0BE1: CD E9 EE 367 ASC "Mini Appler / Deckard"00 0BE4: E9 A0 C1 F0 0BE8: F0 EC E5 F2 0BEC: A0 AF A0 C4 0BF0: E5 E3 EB E1 0BF4: F2 E4 00 368 0BF7: A9 01 369 LDA #1 0BF9: 85 06 370 STA COORDX 0BFB: A9 07 371 LDA #7 0BFD: 85 07 372 STA COORDY 0BFF: 20 AC 0F 373 JSR DSP_HGR2_STR 0C02: C6 C1 D4 374 ASC "FAT DIRECTORY:"00 0C05: A0 C4 C9 D2 0C09: C5 C3 D4 CF 0C0D: D2 D9 BA 00 375 0C11: A9 01 376 LDA #1 0C13: 85 06 377 STA COORDX 0C15: A9 12 378 LDA #18 0C17: 85 07 379 STA COORDY 0C19: 20 AC 0F 380 JSR DSP_HGR2_STR 0C1C: D3 E5 EC 381 ASC "Selection: _"00 0C1F: E5 E3 F4 E9 0C23: EF EE BA A0 0C27: DF 00 382 0C29: A9 00 383 LDA #0 0C2B: 85 06 384 STA COORDX 0C2D: A9 16 385 LDA #22 0C2F: 85 07 386 STA COORDY 0C31: 20 AC 0F 387 JSR DSP_HGR2_STR 0C34: DB AD DD 388 ASC "[-] [+] Change block [1] Refresh"00 0C37: A0 DB AB DD 0C3B: A0 C3 E8 E1 0C3F: EE E7 E5 A0 0C43: E2 EC EF E3 0C47: EB A0 A0 A0 0C4B: A0 A0 A0 A0 0C4F: A0 A0 DB B1 0C53: DD A0 D2 E5 0C57: E6 F2 E5 F3 0C5B: E8 00 389 390 * Draw a big red line 391 0C5D: A9 AC 392 LDA #172 ; last line 0C5F: 8D 63 0C 393 STA :3+1 394 0C62: A0 AC 395 :3 LDY #172 0C64: B9 7E 08 396 LDA HGR2_DATAL,Y 0C67: 85 01 397 STA PTRL 0C69: B9 3E 09 398 LDA HGR2_DATAH,Y 0C6C: 85 02 399 STA PTRH 400 0C6E: A2 14 401 LDX #20 ; (even + odd) *20 = 40 bytes (1 line) 0C70: A0 00 402 LDY #0 0C72: A9 AA 403 :4 LDA #$AA ; even 0C74: 91 01 404 STA (PTRL),Y 0C76: C8 405 INY 0C77: A9 D5 406 LDA #$D5 ; odd 0C79: 91 01 407 STA (PTRL),Y 0C7B: C8 408 INY 0C7C: CA 409 DEX 0C7D: D0 F3 410 BNE :4 411 0C7F: CE 63 0C 412 DEC :3+1 ; previous part of the 'big' red line 0C82: AD 63 0C 413 LDA :3+1 0C85: C9 AB 414 CMP #171 0C87: B0 D9 415 BCS :3 416 0C89: 60 417 RTS 418 419 420 *------------------------------- 421 * Display the CAT block number 422 * on HGR2 screen 423 *------------------------------- 424 425 FAT16_BLK 0C8A: A5 47 426 LDA P_BLKH ; high block # 0C8C: 20 03 0D 427 JSR HEXDIGIT 0C8F: 8D B0 0C 428 STA BLKDG1 ; build string 0C92: 8C B1 0C 429 STY BLKDG2 430 0C95: A5 46 431 LDA P_BLKL ; low block # 0C97: 20 03 0D 432 JSR HEXDIGIT 0C9A: 8D B2 0C 433 STA BLKDG3 ; build string 0C9D: 8C B3 0C 434 STY BLKDG4 435 0CA0: A9 1F 436 LDA #31 ; print string (block #) 0CA2: 85 06 437 STA COORDX 0CA4: A9 17 438 LDA #23 0CA6: 85 07 439 STA COORDY 0CA8: 20 AC 0F 440 JSR DSP_HGR2_STR 0CAB: C2 CC CB 441 ASC "BLK:$" 0CAE: BA A4 0CB0: B0 442 BLKDG1 ASC "0" 0CB1: B0 443 BLKDG2 ASC "0" 0CB2: B0 444 BLKDG3 ASC "0" 0CB3: B0 445 BLKDG4 ASC "0" 0CB4: 00 446 DFB 0 0CB5: 60 447 RTS 448 449 450 *------------------------------- 451 * Display FAT16 error 452 *------------------------------- 453 454 FAT16_ERR 0CB6: A9 00 455 LDA #0 0CB8: 85 06 456 STA COORDX 0CBA: A9 17 457 LDA #23 0CBC: 85 07 458 STA COORDY 0CBE: 20 AC 0F 459 JSR DSP_HGR2_STR 0CC1: C5 D2 D2 460 ASC "ERROR: Can't read FAT16"00 0CC4: CF D2 BA A0 0CC8: C3 E1 EE A7 0CCC: F4 A0 F2 E5 0CD0: E1 E4 A0 C6 0CD4: C1 D4 B1 B6 0CD8: 00 461 0CD9: A9 00 462 LDA #0 ; no data (=load empty block) 0CDB: 8D 00 15 463 STA BUFFER 0CDE: 60 464 RTS 465 466 467 *------------------------------- 468 * Display no FAT16 error 469 *------------------------------- 470 471 FAT16_OK 0CDF: A9 00 472 LDA #0 0CE1: 85 06 473 STA COORDX 0CE3: A9 17 474 LDA #23 0CE5: 85 07 475 STA COORDY 0CE7: 20 AC 0F 476 JSR DSP_HGR2_STR 0CEA: A0 A0 A0 477 ASC " "00 0CED: A0 A0 A0 A0 0CF1: A0 A0 A0 A0 0CF5: A0 A0 A0 A0 0CF9: A0 A0 A0 A0 0CFD: A0 A0 A0 A0 0D01: 00 0D02: 60 478 RTS 479 480 481 *------------------------------- 482 * Convert an hexa value into 483 * 2 digits 484 *------------------------------- 485 486 * In : Acc = hex value 487 * Out: Acc = high "digit" 488 * Y = low "digit" 489 0D03: 48 490 HEXDIGIT PHA ; save it 0D04: 29 0F 491 AND #%00001111 0D06: 18 492 CLC 0D07: 69 B0 493 ADC #"0" 0D09: A8 494 TAY ; low 495 0D0A: 68 496 PLA ; restore it 0D0B: 4A 497 LSR 0D0C: 4A 498 LSR 0D0D: 4A 499 LSR 0D0E: 4A 500 LSR 0D0F: 18 501 CLC 0D10: 69 B0 502 ADC #"0" ; high 0D12: 60 503 RTS 504 505 506 *------------------------------- 507 * Init HGR2 screen 508 *------------------------------- 509 510 * Clear HGR2 511 0D13: A9 40 512 INIT_SCREEN LDA #>$4000 ; clear memory space from $4000 to $5FFF 0D15: 8D 1D 0D 513 STA :1+2 0D18: A0 00 514 LDY #0 0D1A: 98 515 :2 TYA ; acc=0 0D1B: 99 00 00 516 :1 STA $0000,Y 0D1E: C8 517 INY 0D1F: D0 FA 518 BNE :1 519 0D21: EE 1D 0D 520 INC :1+2 0D24: AD 1D 0D 521 LDA :1+2 0D27: C9 60 522 CMP #>$6000 0D29: D0 EF 523 BNE :2 524 0D2B: 2C 50 C0 525 BIT TXTCLR ; set HGR2 mode on 0D2E: 2C 57 C0 526 BIT HIRES 0D31: 2C 52 C0 527 BIT MIXCLR 0D34: 2C 55 C0 528 BIT HISCR 529 0D37: 60 530 RTS 531 532 533 *------------------------------- 534 * Clear HGR2 screen + txt msg 535 *------------------------------- 536 537 CLEAR_SCREEN 0D38: A2 5F 538 :1 LDX #95 ; pointer for line (up) 0D3A: BD 7E 08 539 LDA HGR2_DATAL,X 0D3D: 85 01 540 STA PTRL 0D3F: BD 3E 09 541 LDA HGR2_DATAH,X 0D42: 85 02 542 STA PTRH 543 0D44: A0 27 544 LDY #39 ; clear that line (up) 0D46: A9 00 545 LDA #0 0D48: 91 01 546 :4 STA (PTRL),Y 0D4A: 88 547 DEY 0D4B: 10 FB 548 BPL :4 549 0D4D: 8E CE 12 550 STX SOUND2+1 ; for sound routine 0D50: 20 CB 12 551 JSR SOUND 552 0D53: A2 5F 553 :5 LDX #95 ; pointer for line (down) 0D55: BD 7E 08 554 LDA HGR2_DATAL,X 0D58: 85 01 555 STA PTRL 0D5A: BD 3E 09 556 LDA HGR2_DATAH,X 0D5D: 85 02 557 STA PTRH 558 0D5F: A0 27 559 LDY #39 ; clear that line (down) 0D61: A9 00 560 LDA #0 0D63: 91 01 561 :6 STA (PTRL),Y 0D65: 88 562 DEY 0D66: 10 FB 563 BPL :6 564 0D68: 8E CE 12 565 STX SOUND2+1 ; for sound routine 0D6B: 20 CB 12 566 JSR SOUND 567 0D6E: EE 39 0D 568 INC :1+1 ; previous line (up) 0D71: CE 54 0D 569 DEC :5+1 ; next line (down) 0D74: 10 C2 570 BPL :1 ; clear the next 2 line 571 572 * Clear TXT screen and display "wait" message 573 0D76: 20 89 FE 574 JSR SETKBD 0D79: 20 93 FE 575 JSR SETVID 0D7C: 20 2F FB 576 JSR INIT 0D7F: 20 58 FC 577 JSR HOME 578 0D82: A0 00 579 LDY #0 0D84: A2 0A 580 LDX #10 0D86: B9 93 0D 581 :3 LDA MSG_GO,Y 0D89: F0 07 582 BEQ :2 ; terminator 583 0D8B: 9D 28 06 584 STA $0628,X ; write on txt screen 0D8E: E8 585 INX 0D8F: C8 586 INY 0D90: D0 F4 587 BNE :3 588 0D92: 60 589 :2 RTS 590 0D93: D0 D2 C5 591 MSG_GO ASC "PREPARE YOURSELF..."00 0D96: D0 C1 D2 C5 0D9A: A0 D9 CF D5 0D9E: D2 D3 C5 CC 0DA2: C6 AE AE AE 0DA6: 00 592 593 594 *------------------------------- 595 * Init animation 596 *------------------------------- 597 0DA7: A2 27 598 INIT_ANIM LDX #39 ; 40 columns 0DA9: BD 7E 0E 599 :1 LDA STARS_RF_LOOP,X ; copy # of loops from ref table 0DAC: 9D A6 0E 600 STA STARS_WK_LOOP,X ; to work table 601 0DAF: BD F6 0E 602 LDA STARS_POS_Y,X ; line # for this column (where the star 0DB2: A8 603 TAY ; must be written) 0DB3: B9 7E 08 604 LDA HGR2_DATAL,Y ; HGR2 pointer 0DB6: 85 01 605 STA PTRL 0DB8: B9 3E 09 606 LDA HGR2_DATAH,Y 0DBB: 85 02 607 STA PTRH 0DBD: 8A 608 TXA 0DBE: A8 609 TAY 0DBF: B1 01 610 LDA (PTRL),Y ; save the byte of the screen where the star 0DC1: 9D 1E 0F 611 STA BEFORE_STAR,X ; will be written 0DC4: CA 612 DEX ; previous column 0DC5: 10 E2 613 BPL :1 614 0DC7: 60 615 RTS 616 617 618 *------------------------------- 619 * Process the 40 stars 620 *------------------------------- 621 622 * Animation main loop 623 0DC8: A2 27 624 ANIMATION LDX #39 ; columns from right to left 0DCA: BC A6 0E 625 ANIM1 LDY STARS_WK_LOOP,X ; remaining number of loops -1 0DCD: E6 00 626 INC RANDOM_DELAY 0DCF: 88 627 DEY 0DD0: F0 08 628 BEQ ANIM_1_STAR ; time to display it 629 0DD2: 98 630 TYA ; dec number of loops for that star 0DD3: 9D A6 0E 631 STA STARS_WK_LOOP,X 0DD6: CA 632 ANIM2 DEX ; previous column 0DD7: 10 F1 633 BPL ANIM1 ; not finished 634 0DD9: 60 635 RTS 636 637 *------------------------------- 638 * Process one star 639 *------------------------------- 640 0DDA: BD 7E 0E 641 ANIM_1_STAR LDA STARS_RF_LOOP,X ; init byte (work table) for next time 0DDD: 9D A6 0E 642 STA STARS_WK_LOOP,X ; use the byte from the reference table 643 ; (number of loops) 644 0DE0: BC F6 0E 645 LDY STARS_POS_Y,X ; HGR2 pointer for the Y position of the 0DE3: B9 7E 08 646 LDA HGR2_DATAL,Y ; star 0DE6: 85 01 647 STA PTRL 0DE8: B9 3E 09 648 LDA HGR2_DATAH,Y 0DEB: 85 02 649 STA PTRH 650 0DED: 8A 651 TXA 0DEE: A8 652 TAY 0DEF: BD 1E 0F 653 LDA BEFORE_STAR,X ; poke the value which was on the screen 0DF2: 91 01 654 STA (PTRL),Y ; before displaying the star 655 ; = delete the star from the screen 656 0DF4: BC F6 0E 657 LDY STARS_POS_Y,X ; next move of the star 0DF7: C8 658 INY 0DF8: C0 C0 659 CPY #192 ; out of screen? 0DFA: B0 30 660 BCS STAR_AT_TOP ; yes 661 0DFC: 98 662 TYA ; save the new position of the star 0DFD: 9D F6 0E 663 STA STARS_POS_Y,X 0E00: B9 7E 08 664 LDA HGR2_DATAL,Y ; and prepare the pointer for the next 0E03: 85 01 665 STA PTRL ; write 0E05: B9 3E 09 666 LDA HGR2_DATAH,Y 0E08: 85 02 667 STA PTRH 668 0E0A: 8A 669 TXA 0E0B: A8 670 TAY 0E0C: BD F6 0E 671 LDA STARS_POS_Y,X ; is Y position = $1F or $3F or $5F or $7F or 0E0F: 29 1F 672 AND #%00011111 ; $9F or $BF? 0E11: C9 1F 673 CMP #%00011111 0E13: D0 08 674 BNE :1 ; no 675 0E15: BD CE 0E 676 LDA STARS_BYT_VAL,X ; horizontal movement of the star 0E18: 49 18 677 EOR #%00011000 ; + or - 1 bit (switch on/off bits 3 and 4) 0E1A: 9D CE 0E 678 STA STARS_BYT_VAL,X ; save the byte with star inside 679 0E1D: B1 01 680 :1 LDA (PTRL),Y ; save the screen byte before writing the star 0E1F: 9D 1E 0F 681 STA BEFORE_STAR,X 0E22: BD CE 0E 682 LDA STARS_BYT_VAL,X ; merge the star with the background 0E25: 11 01 683 ORA (PTRL),Y 0E27: 91 01 684 STA (PTRL),Y ; and display it 0E29: 4C D6 0D 685 JMP ANIM2 ; return to the animation's main loop 686 687 *------------------------------- 688 * The star is out of the screen 689 * (bottom) 690 * Init the next star which will 691 * appear at the top of the 692 * screen (same column) 693 *------------------------------- 694 0E2C: A9 00 695 STAR_AT_TOP LDA #0 ; the next Y pos of the star 0E2E: 9D F6 0E 696 STA STARS_POS_Y,X 0E31: A8 697 TAY 0E32: B9 7E 08 698 LDA HGR2_DATAL,Y ; get HGR2 pointer 0E35: 85 01 699 STA PTRL 0E37: B9 3E 09 700 LDA HGR2_DATAH,Y 0E3A: 85 02 701 STA PTRH 702 0E3C: 8A 703 TXA 0E3D: A8 704 TAY 0E3E: B1 01 705 LDA (PTRL),Y ; init: save current byte of the HGR2 screen 0E40: 9D 1E 0F 706 STA BEFORE_STAR,X 707 0E43: BD CE 0E 708 LDA STARS_BYT_VAL,X ; merge star and background 0E46: 11 01 709 ORA (PTRL),Y 0E48: 91 01 710 STA (PTRL),Y ; and display it 711 712 * And now set a delay (=speed) for that star 713 * The same value will be used from up to down 714 0E4A: E6 00 715 INC RANDOM_DELAY 0E4C: A5 00 716 LDA RANDOM_DELAY ; use a part of that value 0E4E: 29 1F 717 AND #%00011111 ; avoid a too long delay 0E50: D0 04 718 BNE :1 ; keep that value 719 0E52: A9 0F 720 LDA #15 ; delay=0 not allowed. Set this one 0E54: A0 01 721 LDY #1 722 0E56: 9D A6 0E 723 :1 STA STARS_WK_LOOP,X 0E59: 9D 7E 0E 724 STA STARS_RF_LOOP,X ; replace original reference 725 0E5C: 0A 726 ASL ; the delay is also used for the sound routine 0E5D: 0A 727 ASL 0E5E: 0A 728 ASL 0E5F: 8D 67 0E 729 STA :2+1 0E62: 8A 730 TXA 0E63: 48 731 PHA 732 733 * Sound routine 734 0E64: A0 09 735 LDY #9 0E66: A2 01 736 :2 LDX #1 0E68: CA 737 :3 DEX 0E69: D0 FD 738 BNE :3 739 0E6B: 2C 30 C0 740 BIT SPKR 0E6E: A2 06 741 LDX #6 0E70: CA 742 :4 DEX 0E71: D0 FD 743 BNE :4 744 0E73: 2C 30 C0 745 BIT SPKR 0E76: 88 746 DEY 0E77: D0 ED 747 BNE :2 748 0E79: 68 749 PLA 0E7A: AA 750 TAX 0E7B: 4C D6 0D 751 JMP ANIM2 ; return to animation's main loop 752 753 *------------------------------- 754 * Datas for the stars 755 *------------------------------- 756 757 * Reference table: 758 * Number of main loops before displaying each star 759 * 1st run: display stars from left to right because 760 * of the incremental value (1 to 40) 761 * A new value is produced for each byte when the 762 * corresponding star begins a new cycle (up -> down) 763 0E7E: 01 02 03 764 STARS_RF_LOOP HEX 0102030405060708 0E81: 04 05 06 07 0E85: 08 0E86: 09 0A 0B 765 HEX 090A0B0C0D0E0F10 0E89: 0C 0D 0E 0F 0E8D: 10 0E8E: 11 12 13 766 HEX 1112131415161718 0E91: 14 15 16 17 0E95: 18 0E96: 19 1A 1B 767 HEX 191A1B1C1D1E1F20 0E99: 1C 1D 1E 1F 0E9D: 20 0E9E: 21 22 23 768 HEX 2122232425262728 0EA1: 24 25 26 27 0EA5: 28 769 770 * Work table: 771 * Number of main loops before displaying each star 772 * A copy of the reference table and then DEC byte/star 773 0EA6: 00 00 00 774 STARS_WK_LOOP DS 40,0 0EA9: 00 00 00 00 0EAD: 00 00 00 00 0EB1: 00 00 00 00 0EB5: 00 00 00 00 0EB9: 00 00 00 00 0EBD: 00 00 00 00 0EC1: 00 00 00 00 0EC5: 00 00 00 00 0EC9: 00 00 00 00 0ECD: 00 775 776 * Bytes for the 40 stars displayed on the screen 777 * 1 star for each column. Each byte is "poked" on the 778 * HGR2 screen (and contains 1 star) 779 0ECE: 88 08 10 780 STARS_BYT_VAL HEX 8808101088081088 0ED1: 10 88 08 10 0ED5: 88 0ED6: 08 10 10 781 HEX 0810101008100810 0ED9: 10 08 10 08 0EDD: 10 0EDE: 08 08 10 782 HEX 0808100810101088 0EE1: 08 10 10 10 0EE5: 88 0EE6: 10 08 88 783 HEX 1008881008088808 0EE9: 10 08 08 88 0EED: 08 0EEE: 08 10 88 784 HEX 0810881010081088 0EF1: 10 10 08 10 0EF5: 88 785 786 * 40 * Lines # (for every column) 787 * Current position of each star 788 * The following value are for the init screen 789 0EF6: 14 01 7B 790 STARS_POS_Y HEX 14017B64321EA909 0EF9: 64 32 1E A9 0EFD: 09 0EFE: 81 39 4E 791 HEX 81394EB220BE503C 0F01: B2 20 BE 50 0F05: 3C 0F06: 59 70 26 792 HEX 5970265E03174B3C 0F09: 5E 03 17 4B 0F0D: 3C 0F0E: A5 91 05 793 HEX A59105468C2A765F 0F11: 46 8C 2A 76 0F15: 5F 0F16: 17 3C 84 794 HEX 173C84644335992F 0F19: 64 43 35 99 0F1D: 2F 795 796 * Backup of bytes of the screen before writing the stars 797 0F1E: 00 00 00 798 BEFORE_STAR DS 40,0 0F21: 00 00 00 00 0F25: 00 00 00 00 0F29: 00 00 00 00 0F2D: 00 00 00 00 0F31: 00 00 00 00 0F35: 00 00 00 00 0F39: 00 00 00 00 0F3D: 00 00 00 00 0F41: 00 00 00 00 0F45: 00 799 800 801 *------------------------------- 802 * Display a character on HGR2 803 * screen 804 *------------------------------- 805 806 * In : Acc = "character" 807 0F46: 84 04 808 DSP_HGR2_CHAR STY $04 ; save Y 0F48: 86 05 809 STX $05 ; save X 810 0F4A: A2 00 811 LDX #0 ; init offset (high) for font addr 0F4C: 86 0C 812 STX $0C 813 0F4E: C9 8D 814 CMP #$8D ; return? 0F50: F0 47 815 BEQ :1 ; yes 816 0F52: C9 A0 817 CMP #" " ; first allowed character 0F54: 90 51 818 BCC :2 ; out of range 819 0F56: 38 820 SEC ; [" ","~"] -> [0,94] 0F57: E9 A0 821 SBC #" " 0F59: 0A 822 ASL ; *8 to be on the first byte 0F5A: 26 0C 823 ROL $0C ; and prepare offset (high) 0F5C: 0A 824 ASL 0F5D: 26 0C 825 ROL $0C 0F5F: 0A 826 ASL 0F60: 26 0C 827 ROL $0C 0F62: 69 D3 828 ADC #FONT 0F6B: 8D 85 0F 832 STA :3+2 833 834 * Calc the Y position of the 1st line where to write 835 * the first byte of the character 836 0F6E: A5 07 837 LDA COORDY ; line # *8 0F70: 0A 838 ASL 0F71: 0A 839 ASL 0F72: 0A 840 ASL 0F73: A8 841 TAY 0F74: B9 7E 08 842 LDA HGR2_DATAL,Y 0F77: 85 0A 843 STA $0A 0F79: B9 3E 09 844 LDA HGR2_DATAH,Y 0F7C: 85 0B 845 STA $0B 0F7E: A5 06 846 LDA COORDX 0F80: A8 847 TAY 848 849 * Write the full character 850 0F81: A2 07 851 LDX #7 ; 8 bytes for 1 full character 0F83: BD FF FF 852 :3 LDA $FFFF,X 0F86: 91 0A 853 STA ($0A),Y 0F88: A9 04 854 LDA #>$0400 ; calc position for the byte above 0F8A: 65 0B 855 ADC $0B 0F8C: 85 0B 856 STA $0B 0F8E: CA 857 DEX 0F8F: 10 F2 858 BPL :3 859 860 * Position for the next character of the string 861 0F91: E6 06 862 INC COORDX 0F93: A5 06 863 LDA COORDX 0F95: C9 28 864 CMP #40 ; out of line 0F97: 90 0E 865 BCC :2 ; no 866 0F99: A9 00 867 :1 LDA #0 ; init abscissa 0F9B: 85 06 868 STA COORDX 0F9D: E6 07 869 INC COORDY ; next line 870 0F9F: A5 07 871 LDA COORDY ; out of screen? 0FA1: C9 18 872 CMP #24 0FA3: D0 02 873 BNE :2 874 0FA5: C6 07 875 DEC COORDY ; beginning of the last line (no scroll) 876 0FA7: A6 05 877 :2 LDX $05 ; restore X 0FA9: A4 04 878 LDY $04 ; restore Y 0FAB: 60 879 RTS 880 881 882 *------------------------------- 883 * Print string on HGR2 screen 884 *------------------------------- 885 0FAC: 68 886 DSP_HGR2_STR PLA ; get string addr-1 0FAD: 85 08 887 STA $08 0FAF: 68 888 PLA 0FB0: 85 09 889 STA $09 0FB2: 98 890 TYA ; save Y 0FB3: 48 891 PHA 0FB4: 8A 892 TXA ; save X 0FB5: 48 893 PHA 894 0FB6: A0 00 895 LDY #0 896 0FB8: E6 08 897 :1 INC $08 0FBA: D0 02 898 BNE :2 899 0FBC: E6 09 900 INC $09 0FBE: B1 08 901 :2 LDA ($08),Y 0FC0: F0 06 902 BEQ :3 ; end of string 903 0FC2: 20 46 0F 904 JSR DSP_HGR2_CHAR ; display this character 0FC5: 4C B8 0F 905 JMP :1 ; next char 906 0FC8: 68 907 :3 PLA ; restore X 0FC9: AA 908 TAX 0FCA: 68 909 PLA ; restore Y 0FCB: A8 910 TAY 0FCC: A5 09 911 LDA $09 ; addr of return 0FCE: 48 912 PHA 0FCF: A5 08 913 LDA $08 0FD1: 48 914 PHA 0FD2: 60 915 RTS ; return to sender (and skip string) 916 917 918 *------------------------------- 919 * Datas for the characters 920 *------------------------------- 921 0FD3: 80 80 80 922 FONT HEX 8080808080808080 ; space 0FD6: 80 80 80 80 0FDA: 80 0FDB: 80 87 87 923 HEX 8087878087878787 ; ! 0FDE: 80 87 87 87 0FE2: 87 0FE3: 80 80 80 924 HEX 80808080B6A4B6B6 ; " 0FE6: 80 B6 A4 B6 0FEA: B6 0FEB: 80 9E 9E 925 HEX 809E9EBF9EBF9E9E ; # 0FEE: BF 9E BF 9E 0FF2: 9E 0FF3: 80 8C 9F 926 HEX 808C9FB09E83BE8C ; $ 0FF6: B0 9E 83 BE 0FFA: 8C 0FFB: 80 BB BB 927 HEX 80BBBB868C98B7B7 ; % 0FFE: 86 8C 98 B7 1002: B7 1003: 80 AE 9B 928 HEX 80AE9BBB8F868F86 ; & 1006: BB 8F 86 8F 100A: 86 100B: 80 80 80 929 HEX 808080808C888C8C ; ' 100E: 80 8C 88 8C 1012: 8C 1013: 80 B8 9C 930 HEX 80B89C8E8E8E9CB8 ; ( 1016: 8E 8E 8E 9C 101A: B8 101B: 80 87 8E 931 HEX 80878E9C9C9C8E87 ; ) 101E: 9C 9C 9C 8E 1022: 87 1023: 80 88 AA 932 HEX 8088AA9CBE9CAA88 ; * 1026: 9C BE 9C AA 102A: 88 102B: 80 80 8C 933 HEX 80808C8CBFBF8C8C ; + 102E: 8C BF BF 8C 1032: 8C 1033: 83 86 87 934 HEX 8386878080808080 ; , 1036: 80 80 80 80 103A: 80 103B: 80 80 80 935 HEX 80808080BEBE8080 ; - 103E: 80 BE BE 80 1042: 80 1043: 80 87 87 936 HEX 8087878080808080 ; . 1046: 80 80 80 80 104A: 80 104B: 80 83 87 937 HEX 8083878E9CB8F0E0 ; / 104E: 8E 9C B8 F0 1052: E0 1053: 80 9E B3 938 HEX 809EB3B3B3B3B39E ; 0 1056: B3 B3 B3 B3 105A: 9E 105B: 80 BF 8C 939 HEX 80BF8C8C8C8F8E8C ; 1 105E: 8C 8C 8F 8E 1062: 8C 1063: 80 BF BF 940 HEX 80BFBF8EB8B3BF9E ; 2 1066: 8E B8 B3 BF 106A: 9E 106B: 80 9E BF 941 HEX 809EBFB0BEB0BF9E ; 3 106E: B0 BE B0 BF 1072: 9E 1073: 80 B0 B0 942 HEX 80B0B0BFB3B6BCB8 ; 4 1076: BF B3 B6 BC 107A: B8 107B: 80 9E BF 943 HEX 809EBFB09F83BFBF ; 5 107E: B0 9F 83 BF 1082: BF 1083: 80 9E BF 944 HEX 809EBFB39F83BF9E ; 6 1086: B3 9F 83 BF 108A: 9E 108B: 80 8C 8C 945 HEX 808C8C8C98B0BFBF ; 7 108E: 8C 98 B0 BF 1092: BF 1093: 80 9E BF 946 HEX 809EBFB39EB3BF9E ; 8 1096: B3 9E B3 BF 109A: 9E 109B: 80 9E BF 947 HEX 809EBFB0BEB3BF9E ; 9 109E: B0 BE B3 BF 10A2: 9E 10A3: 80 9C 9C 948 HEX 809C9C80809C9C80 ; : 10A6: 80 80 9C 9C 10AA: 80 10AB: 83 86 87 949 HEX 8386878080878780 ; ; 10AE: 80 80 87 87 10B2: 80 10B3: 80 F0 B8 950 HEX 80F0B89C8E9CB8F0 ; < 10B6: 9C 8E 9C B8 10BA: F0 10BB: 80 80 80 951 HEX 808080BE80BE8080 ; = 10BE: BE 80 BE 80 10C2: 80 10C3: 80 87 8E 952 HEX 80878E9CB89C8E87 ; > 10C6: 9C B8 9C 8E 10CA: 87 10CB: 80 8C 80 953 HEX 808C808C98B3BF9E ; ? 10CE: 8C 98 B3 BF 10D2: 9E 10D3: 80 BE 83 954 HEX 80BE83BBBBB3B39E ; @ 10D6: BB BB B3 B3 10DA: 9E 10DB: 80 B3 B3 955 HEX 80B3B3BFBFB3BF9E ; A 10DE: BF BF B3 BF 10E2: 9E 10E3: 80 9F BF 956 HEX 809FBFB39FB3BF9F ; B 10E6: B3 9F B3 BF 10EA: 9F 10EB: 80 9E BF 957 HEX 809EBFB383B3BF9E ; C 10EE: B3 83 B3 BF 10F2: 9E 10F3: 80 9F BF 958 HEX 809FBFB3B3B3BF9F ; D 10F6: B3 B3 B3 BF 10FA: 9F 10FB: 80 BF BF 959 HEX 80BFBF839F83BFBF ; E 10FE: 83 9F 83 BF 1102: BF 1103: 80 83 83 960 HEX 8083839F9F83BFBF ; F 1106: 9F 9F 83 BF 110A: BF 110B: 80 9E BF 961 HEX 809EBFB3BB83BF9E ; G 110E: B3 BB 83 BF 1112: 9E 1113: 80 B3 B3 962 HEX 80B3B3BFBFB3B3B3 ; H 1116: BF BF B3 B3 111A: B3 111B: 80 BF BF 963 HEX 80BFBF8C8C8CBFBF ; I 111E: 8C 8C 8C BF 1122: BF 1123: 80 9E BF 964 HEX 809EBFB3B0B0B0B0 ; J 1126: B3 B0 B0 B0 112A: B0 112B: 80 B3 BB 965 HEX 80B3BB9F8F9FBBB3 ; K 112E: 9F 8F 9F BB 1132: B3 1133: 80 BF BF 966 HEX 80BFBF8383838383 ; L 1136: 83 83 83 83 113A: 83 113B: 80 B3 B3 967 HEX 80B3B3B3B3B3BFB3 ; M 113E: B3 B3 B3 BF 1142: B3 1143: 80 B3 B3 968 HEX 80B3B3BBBFB7B3B3 ; N 1146: BB BF B7 B3 114A: B3 114B: 80 9E BF 969 HEX 809EBFB3B3B3BF9E ; O 114E: B3 B3 B3 BF 1152: 9E 1153: 80 83 83 970 HEX 8083839FBFB3BF9F ; P 1156: 9F BF B3 BF 115A: 9F 115B: 80 AE 93 971 HEX 80AE93ABA3A3BF9E ; Q 115E: AB A3 A3 BF 1162: 9E 1163: 80 B3 BB 972 HEX 80B3BB9FBFB3BF9F ; R 1166: 9F BF B3 BF 116A: 9F 116B: 80 9E B3 973 HEX 809EB3B09E83B39E ; S 116E: B0 9E 83 B3 1172: 9E 1173: 80 8C 8C 974 HEX 808C8C8C8C8CBFBF ; T 1176: 8C 8C 8C BF 117A: BF 117B: 80 9E BF 975 HEX 809EBFB3B3B3B3B3 ; U 117E: B3 B3 B3 B3 1182: B3 1183: 80 8C 9E 976 HEX 808C9EB3B3B3B3B3 ; V 1186: B3 B3 B3 B3 118A: B3 118B: 80 B3 BF 977 HEX 80B3BFB3B3B3B3B3 ; W 118E: B3 B3 B3 B3 1192: B3 1193: 80 B3 B3 978 HEX 80B3B39E8C9EB3B3 ; X 1196: 9E 8C 9E B3 119A: B3 119B: 80 8C 8C 979 HEX 808C8C8C9EB3B3B3 ; Y 119E: 8C 9E B3 B3 11A2: B3 11A3: 80 BF BF 980 HEX 80BFBF868C98BFBF ; Z 11A6: 86 8C 98 BF 11AA: BF 11AB: 80 BC BC 981 HEX 80BCBC8C8C8CBCBC ; [ 11AE: 8C 8C 8C BC 11B2: BC 11B3: 80 E0 F0 982 HEX 80E0F0B89C8E8783 ; backslash 11B6: B8 9C 8E 87 11BA: 83 11BB: 80 8F 8F 983 HEX 808F8F8C8C8C8F8F ; ] 11BE: 8C 8C 8C 8F 11C2: 8F 11C3: 80 80 80 984 HEX 8080808080BF9E8C ; exp 11C6: 80 80 BF 9E 11CA: 8C 11CB: 80 FF FF 985 HEX 80FFFF8080808080 ; _ 11CE: 80 80 80 80 11D2: 80 11D3: 80 80 80 986 HEX 8080808080988C86 ; 11D6: 80 80 98 8C 11DA: 86 11DB: 80 BE B3 987 HEX 80BEB3BEB09E8080 ; a 11DE: BE B0 9E 80 11E2: 80 11E3: 80 9F B3 988 HEX 809FB3B3B39F8383 ; b 11E6: B3 B3 9F 83 11EA: 83 11EB: 80 9E B3 989 HEX 809EB383B39E8080 ; c 11EE: 83 B3 9E 80 11F2: 80 11F3: 80 BE B3 990 HEX 80BEB3B3B3BEB0B0 ; d 11F6: B3 B3 BE B0 11FA: B0 11FB: 80 9E 83 991 HEX 809E839FB39E8080 ; e 11FE: 9F B3 9E 80 1202: 80 1203: 80 86 86 992 HEX 808686869F86B69C ; f 1206: 86 9F 86 B6 120A: 9C 120B: 9E B0 BE 993 HEX 9EB0BEB3B39E8080 ; g 120E: B3 B3 9E 80 1212: 80 1213: 80 B3 B3 994 HEX 80B3B3B3B39F8383 ; h 1216: B3 B3 9F 83 121A: 83 121B: 80 8C 8C 995 HEX 808C8C8C8C808C80 ; i 121E: 8C 8C 80 8C 1222: 80 1223: 9E B3 B3 996 HEX 9EB3B3B0B0B080B0 ; j 1226: B0 B0 B0 80 122A: B0 122B: 80 B3 9B 997 HEX 80B39B8F9BB38383 ; k 122E: 8F 9B B3 83 1232: 83 1233: 80 9E 8C 998 HEX 809E8C8C8C8C8C8E ; l 1236: 8C 8C 8C 8C 123A: 8E 123B: 80 B3 B3 999 HEX 80B3B3B3BFB38080 : m 123E: B3 BF B3 80 1242: 80 1243: 80 B3 B3 1000 HEX 80B3B3B3B39F8080 ; n 1246: B3 B3 9F 80 124A: 80 124B: 80 9E B3 1001 HEX 809EB3B3B39E8080 ; o 124E: B3 B3 9E 80 1252: 80 1253: 83 83 9F 1002 HEX 83839FB3B39F8080 ; p 1256: B3 B3 9F 80 125A: 80 125B: B0 B0 BE 1003 HEX B0B0BEB3B3BE8080 ; q 125E: B3 B3 BE 80 1262: 80 1263: 80 83 83 1004 HEX 80838383B39F8080 ; r 1266: 83 B3 9F 80 126A: 80 126B: 80 9E B0 1005 HEX 809EB09E839E8080 ; s 126E: 9E 83 9E 80 1272: 80 1273: 80 9C B6 1006 HEX 809CB686869F8686 ; t 1276: 86 86 9F 86 127A: 86 127B: 80 BE B3 1007 HEX 80BEB3B3B3B38080 ; u 127E: B3 B3 B3 80 1282: 80 1283: 80 8C 9E 1008 HEX 808C9EB3B3B38080 ; v 1286: B3 B3 B3 80 128A: 80 128B: 80 B3 BF 1009 HEX 80B3BFB3B3B38080 ; w 128E: B3 B3 B3 80 1292: 80 1293: 80 B3 9E 1010 HEX 80B39E8C9EB38080 ; x 1296: 8C 9E B3 80 129A: 80 129B: 9E B0 BE 1011 HEX 9EB0BEB3B3B38080 ; y 129E: B3 B3 B3 80 12A2: 80 12A3: 80 BF 86 1012 HEX 80BF868C98BF8080 ; z 12A6: 8C 98 BF 80 12AA: 80 12AB: 80 9C 9E 1013 HEX 809C9E8687869E9C ; { 12AE: 86 87 86 9E 12B2: 9C 12B3: 8C 8C 8C 1014 HEX 8C8C8C8C8C8C8C8C ; | 12B6: 8C 8C 8C 8C 12BA: 8C 12BB: 80 8E 9E 1015 HEX 808E9E98B8989E8E ; } 12BE: 98 B8 98 9E 12C2: 8E 12C3: 80 80 80 1016 HEX 808080808098BF86 ; ~ 12C6: 80 80 98 BF 12CA: 86 1017 1018 1019 *------------------------------- 1020 * Play a sound 1021 *------------------------------- 1022 12CB: A0 07 1023 SOUND LDY #7 12CD: A2 00 1024 SOUND2 LDX #0 ; variable value 12CF: CA 1025 :1 DEX 12D0: D0 FD 1026 BNE :1 1027 12D2: 2C 30 C0 1028 BIT SPKR 12D5: A2 08 1029 LDX #8 12D7: CA 1030 :2 DEX 12D8: D0 FD 1031 BNE :2 1032 12DA: 2C 30 C0 1033 BIT SPKR 12DD: 88 1034 DEY 12DE: D0 ED 1035 BNE SOUND2 1036 12E0: 60 1037 RTS 1038 1039 1040 *------------------------------- 1041 * Run Pseudo-Disk ][ ProDOS 1042 * device driver with parameters 1043 *------------------------------- 1044 1045 DO_CALL 1046 DO SIMUL 1047 JMP SIMPDD ; work without pseudodisk 1048 ELSE 12E1: 6C 48 00 1049 JMP (ENTRY_LO) 1050 FIN 12E4: 60 1051 RTS 1052 1053 *------------------------------- 1054 12E5: 00 00 00 1055 DS \,0 12E8: 00 00 00 00 12EC: 00 00 00 00 12F0: 00 00 00 00 12F4: 00 00 00 00 12F8: 00 00 00 00 12FC: 00 00 00 00 1056 1057 DO SIMUL 1058 SAV SD2S.STARFIELD 1059 ELSE 1060 SAV SD2.STARFIELD Object saved as SD2.STARFIELD,A$0A00,L$0900,BIN 1061 FIN --End assembly, 2304 bytes, Errors: 0 Symbol table - alphabetical order: ANIM1 =$0DCA ANIM2 =$0DD6 ANIMATION=$0DC8 ANIM_1_STAR=$0DDA MD AVR =$8000 BEFORE_STAR=$0F1E BELL =$FF3A BLK0 =$0A0F BLKDG1 =$0CB0 BLKDG2 =$0CB1 BLKDG3 =$0CB2 BLKDG4 =$0CB3 ? BOOT2 =$0A00 BUFFER =$1500 BUFF_HI =$FD BUFF_LO =$FC CLEAR_SCREEN=$0D38 COORDX =$06 COORDY =$07 DONE =$0B09 DO_ANIM =$0B1A DO_CALL =$12E1 DO_DIR =$0A73 DSP_HGR2_CHAR=$0F46 DSP_HGR2_STR=$0FAC EMPTY_DIR=$0A45 ? ENTRY_HI=$49 ENTRY_LO=$48 FAT16_BLK=$0C8A FAT16_ERR=$0CB6 FAT16_OK=$0CDF FONT =$0FD3 HEXDIGIT=$0D03 HGR2_DATAH=$093E HGR2_DATAL=$087E HIRES =$C057 HISCR =$C055 HOME =$FC58 INIT =$FB2F INIT_ANIM=$0DA7 INIT_SCREEN=$0D13 KEY =$C000 KEY_PROCESS=$0B1D LETTER =$FE MIXCLR =$C052 ? MONZ =$FF69 MORE =$0ABF MORE2 =$0AB6 MSG_GO =$0D93 MY_COORDX=$0AC5 MY_LETTER=$0AD4 NEW_SCREEN=$0B89 NEXT =$0A13 PD8CMD =$C08D PTRH =$02 PTRL =$01 P_BLKH =$47 P_BLKL =$46 P_BUFH =$45 P_BUFL =$44 P_CMD =$42 P_CORIG =$08 ? P_FMT =$03 P_READ =$01 P_ROOTST=$55 ? P_STAT =$00 P_UNIT =$43 ? P_WRITE =$02 ? P_ZERO =$AA RANDOM_DELAY=$00 SETKBD =$FE89 SETVID =$FE93 ? SIMAVR =$6003 ? SIMBOOT =$6000 ? SIMPDD =$6006 SIMUL =$00 SOUND =$12CB SOUND2 =$12CD SPKR =$C030 STARS_BYT_VAL=$0ECE STARS_POS_Y=$0EF6 STARS_RF_LOOP=$0E7E STARS_WK_LOOP=$0EA6 STAR_AT_TOP=$0E2C STROBE =$C010 TXTCLR =$C050 Symbol table - numerical order: RANDOM_DELAY=$00 ? P_STAT =$00 SIMUL =$00 PTRL =$01 P_READ =$01 PTRH =$02 ? P_WRITE =$02 ? P_FMT =$03 COORDX =$06 COORDY =$07 P_CORIG =$08 P_CMD =$42 P_UNIT =$43 P_BUFL =$44 P_BUFH =$45 P_BLKL =$46 P_BLKH =$47 ENTRY_LO=$48 ? ENTRY_HI=$49 P_ROOTST=$55 ? P_ZERO =$AA BUFF_LO =$FC BUFF_HI =$FD LETTER =$FE HGR2_DATAL=$087E HGR2_DATAH=$093E ? BOOT2 =$0A00 BLK0 =$0A0F NEXT =$0A13 EMPTY_DIR=$0A45 DO_DIR =$0A73 MORE2 =$0AB6 MORE =$0ABF MY_COORDX=$0AC5 MY_LETTER=$0AD4 DONE =$0B09 DO_ANIM =$0B1A KEY_PROCESS=$0B1D NEW_SCREEN=$0B89 FAT16_BLK=$0C8A BLKDG1 =$0CB0 BLKDG2 =$0CB1 BLKDG3 =$0CB2 BLKDG4 =$0CB3 FAT16_ERR=$0CB6 FAT16_OK=$0CDF HEXDIGIT=$0D03 INIT_SCREEN=$0D13 CLEAR_SCREEN=$0D38 MSG_GO =$0D93 INIT_ANIM=$0DA7 ANIMATION=$0DC8 ANIM1 =$0DCA ANIM2 =$0DD6 ANIM_1_STAR=$0DDA STAR_AT_TOP=$0E2C STARS_RF_LOOP=$0E7E STARS_WK_LOOP=$0EA6 STARS_BYT_VAL=$0ECE STARS_POS_Y=$0EF6 BEFORE_STAR=$0F1E DSP_HGR2_CHAR=$0F46 DSP_HGR2_STR=$0FAC FONT =$0FD3 SOUND =$12CB SOUND2 =$12CD DO_CALL =$12E1 BUFFER =$1500 ? SIMBOOT =$6000 ? SIMAVR =$6003 ? SIMPDD =$6006 MD AVR =$8000 KEY =$C000 STROBE =$C010 SPKR =$C030 TXTCLR =$C050 MIXCLR =$C052 HISCR =$C055 HIRES =$C057 PD8CMD =$C08D INIT =$FB2F HOME =$FC58 SETKBD =$FE89 SETVID =$FE93 BELL =$FF3A ? MONZ =$FF69