├── Atari FAQ ├── Avalanche.asm ├── Bacterion.asm ├── Battle In The B Ring.asm ├── Bonk.asm ├── Bopotron.asm ├── Cosmic Defender.asm ├── Elevator Repairman.asm ├── Fill Er Up II.asm ├── Fill Er Up.asm ├── Firebug.asm ├── Harvey.asm ├── Incoming.asm ├── Livewire.asm ├── Maze War.asm ├── Planetary Defense.asm ├── README.md ├── RaceInSpace.asm ├── Rocks!.asm ├── Roundup.asm ├── Shoot.asm ├── Snowplow Editor.asm ├── Snowplow.asm ├── alien.asm ├── blast.asm ├── scrl19.asm ├── speedski.asm └── tasks.json /Bonk.asm: -------------------------------------------------------------------------------- 1 | ;***************************** 2 | ;* BONK * 3 | ;* Copyright 1984 * 4 | ;* Programmed by James Hague * 5 | ;* Using MAC/65 by OSS Inc. * 6 | ;***************************** 7 | ; 8 | ;HARDWARE REGISTERS 9 | ; 10 | RANDOM = $D20A ;Random #s 11 | GRACTL = $D01D ;Graphic ctrl 12 | AUDC1 = $D201 ;Audio controls 13 | AUDC2 = $D203 14 | AUDC3 = $D205 15 | AUDC4 = $D207 16 | AUDF1 = $D200 ;Audio frequency 17 | AUDF2 = $D202 18 | AUDF3 = $D204 19 | AUDF4 = $D206 20 | AUDCTL = $D208 21 | HPOSP0 = $D000 ;Pl. 0 horiz. 22 | HPOSP1 = $D001 ;Pl. 1 horiz. 23 | P0PF = $D004 ;P0 to PF coll. 24 | P0PL = $D00C ;P0 to PL coll. 25 | HITCLR = $D01E ;Collision clear 26 | CONSOL = $D01F ;Console buttons 27 | PMBASE = $D407 28 | SETVBV = $E45C ;VBLANK vectors 29 | XITVBV = $E462 ;VBLANK exit 30 | SIOINV = $E465 ;Initialize SIO 31 | ; 32 | ;SHADOW REGISTERS 33 | ; 34 | CLOCK = $14 ;Real time clock 35 | ATTRACT = $4D 36 | DMACTL = $022F ;DMA control 37 | SDLSTL = $0230 ;Dlist pointer 38 | GPRIOR = $026F 39 | STICK = $0278 ;Joystick 0 40 | COL0 = $02C4 ;Color regs. 41 | COL1 = $02C5 42 | COL2 = $02C6 43 | COL3 = $02C7 44 | PCOL0 = $02C0 ;Player colors 45 | PCOL1 = $02C1 46 | CHBAS = $02F4 ;Character base 47 | CH = $02FC ;Keyboard buffer 48 | ; 49 | *= $80 50 | ; 51 | ;GAME VARIABLES 52 | ; 53 | SCORE .DS 3 ;Player's score 54 | LEVEL .DS 1 ;Current level 55 | SLEVEL .DS 1 ;Starting level 56 | BLEVEL .DS 1 ;Binary level 57 | BOARD .DS 1 ;Current board 58 | LIVES .DS 1 ;Remaining lives 59 | TIME .DS 2 ;Bonus timer 60 | DIE .DS 1 ;Death flag 61 | P0Y .DS 1 ;Pl0 y position 62 | P0X .DS 1 ;Pl0 x position 63 | GAMCTL .DS 1 ;Game control 64 | ENXPOS .DS 3 ;Enemy X pos. 65 | ENYPOS .DS 3 ;Enemy Y pos. 66 | ENXADD .DS 1 ;Enemy X add 67 | ENYADD .DS 1 ;Enemy Y add 68 | ENBOUN .DS 3 ;En bounce flags 69 | ENDIR .DS 3 ;Enemy direction 70 | BDIST .DS 1 ;Bounce distance 71 | ENAN .DS 1 ;Enemy pointer 72 | PLAN .DS 1 ;Play. pointer 73 | FLASH .DS 1 ;Treas. flasher 74 | FREEZE .DS 2 ;Freeze timers 75 | FTIME .DS 1 ;Freeze time 76 | WAIT .DS 4 ;Time delay 77 | TEMP .DS 2 ;Temp storage 78 | DIR .DS 1 ;Jstick direct. 79 | TOTAL .DS 1 ;Jewels/board 80 | COUNT .DS 1 ;Jewels/taken 81 | BONK .DS 1 ;Bounce sound 82 | DING .DS 1 ;Bell sound 83 | WSND .DS 1 ;Eat wall sound 84 | ENEMY .DS 10 ;Enemy image 85 | PLAYER .DS 8 ;Player image 86 | LO .DS 2 ;General pointer 87 | VLO .DS 2 ;Ditto 88 | POINT .DS 2 ;Play. pointer 89 | ; 90 | ;RESERVED MEMORY 91 | ; 92 | *= $2000 93 | ; 94 | PM .DS $0400 ;Pmbase 95 | PL0 .DS $0100 96 | PL1 .DS $0100 97 | PL2 .DS $0100 98 | PL3 .DS $0100 99 | ; 100 | DISP = $1D00 ;Display area 101 | CHSET = $2000 ;New char set 102 | LOTBL = $2200 ;Plotter table 103 | HITBL = LOTBL+50 104 | ; 105 | *= $2800 ;Program start 106 | ; 107 | ;SET-UP PLOTTER 108 | ; 109 | GAME JSR SIOINV ;Init sounds 110 | LDA # DISP+80 113 | STA LO+1 114 | LDX #2 115 | SEPL LDA LO+1 116 | STA HITBL,X 117 | LDA LO 118 | STA LOTBL,X 119 | CLC 120 | ADC #20 121 | STA LO 122 | BCC SEP2 123 | INC LO+1 124 | SEP2 INX 125 | CPX #24 126 | BNE SEPL 127 | LDA #0 128 | STA SLEVEL 129 | ; 130 | ;REDEFINE CHARSET 131 | ; 132 | TAX ;Move set 133 | MSET LDA $E000,X 134 | STA CHSET,X 135 | LDA $E0FF,X 136 | STA CHSET+$FF,X 137 | INX 138 | BNE MSET 139 | LDA # >CHSET ;Install it 140 | STA CHBAS 141 | LDX #119 ;Redefine set 142 | RDEF LDA CDAT,X 143 | STA CHSET+8,X 144 | DEX 145 | BPL RDEF 146 | LDX #7 147 | RDEF2 LDA CDAT2,X 148 | STA CHSET+216,X 149 | DEX 150 | BPL RDEF2 151 | ; 152 | GO LDA #0 ;Turn off VBI 153 | STA GAMCTL 154 | JSR PMCLR ;No players 155 | JSR QUIET ;No sound 156 | ; 157 | ;TITLE SCREEN 158 | ; 159 | LDA # TDL ;list. 162 | STA SDLSTL+1 163 | LDA #200 ;Set up title 164 | STA COL0 ;colors. 165 | LDA #120 166 | STA COL1 167 | LDA #70 168 | STA COL2 169 | ; 170 | START LDA CONSOL ;Start key 171 | ROR A ;pressed? 172 | BCC ST1 ;Yes! 173 | ; 174 | ;LEVEL SELECTION 175 | ; 176 | ROR A ;Select pressed? 177 | BCS START ;No, skip this. 178 | INC SLEVEL ;Yes, start at 179 | LDA SLEVEL ;next level. 180 | CMP #9 ;Highest level? 181 | BNE Z1 ;No, continue. 182 | LDA #0 ;Yes, reset and 183 | STA SLEVEL ;store it. 184 | Z1 CLC ;Add 1 to start- 185 | ADC #1 ;ing level # 186 | ORA #16 ;Add color 187 | STA TITLE+73 ;and show it 188 | Z2 LDA CONSOL ;Get keys again 189 | CMP #5 ;Key released? 190 | BEQ Z2 ;No, wait for it 191 | BNE START ;Branch always! 192 | ; 193 | ST1 LDA CONSOL 194 | ROR A 195 | BCC ST1 196 | LDA #0 ;Set variables 197 | STA SCORE ;that are set 198 | STA SCORE+1 ;once per game. 199 | STA SCORE+2 200 | STA BOARD 201 | LDA #3 ;3 lives 202 | STA LIVES 203 | LDA SLEVEL ;Set level 204 | STA LEVEL 205 | STA BLEVEL 206 | ; 207 | NEWLEV LDA #0 ;Turn off VBI 208 | STA GAMCTL 209 | LDA LEVEL ;Get BCD level 210 | SED 211 | CLC 212 | ADC #1 ;And raise it 213 | CLD 214 | STA LEVEL ;Then store. 215 | LDX BLEVEL ;Get bin. level 216 | CPX #15 ;Highest level? 217 | BEQ SAMEL ;Yes, keep it. 218 | INC BLEVEL ;No, raise it. 219 | SAMEL LDX BOARD ;Get board # 220 | CPX #3 ;Highest board? 221 | BEQ BRD1 ;Yes, reset 222 | INC BOARD ;and store 223 | BNE SETLEV ;Branch always! 224 | ; 225 | BRD1 LDX #1 ;Reset board # 226 | STX BOARD 227 | LDA LIVES ;And give extra 228 | CMP #9 ;life 229 | BEQ SETLEV 230 | INC LIVES 231 | SETLEV LDX BLEVEL ;Binary level 232 | LDA DEL1-1,X ;Set up delay 233 | STA WAIT 234 | LDA #5 235 | STA WAIT+2 236 | LDA BOUN-1,X ;Get bounces 237 | STA BDIST 238 | LDA FTM-1,X ;Get freeze time 239 | STA FTIME 240 | LDX BOARD ;Board # 241 | LDA TOT-1,X ;Get jewels 242 | STA TOTAL 243 | LDA #
DL 246 | STA SDLSTL+1 247 | ; 248 | NEWLIFE JSR QUIET ;No sound. 249 | LDA #0 ;Zero items 250 | STA GAMCTL ;that must be 251 | STA DIE ;zeroed for each 252 | STA COUNT ;new life 253 | STA DIR 254 | STA HITCLR 255 | STA ENXADD 256 | STA ENYADD 257 | STA WAIT+1 258 | STA WAIT+3 259 | STA TIME+1 260 | STA ENAN ;Reset pointers 261 | STA PLAN 262 | STA FLASH 263 | LDX BLEVEL ;Set timer 264 | LDA TIM-1,X 265 | STA TIME 266 | LDY # VBI 268 | LDA #7 269 | JSR SETVBV 270 | ; 271 | ;DRAW SCREEN 272 | ; 273 | LDA BOARD ;Get board # 274 | ASL A ;Times 2 275 | TAX ;use as index 276 | LDA BDTBL-2,X ;Board lo byte 277 | STA LO 278 | LDA BDTBL-1,X ;Hi byte of it 279 | STA LO+1 280 | LDY #0 ;Draw 1st part 281 | DR1 LDA (LO),Y ;Get screen byte 282 | STA DISP+80,Y ;and show it 283 | INY 284 | CPY #240 285 | BNE DR1 286 | CLC 287 | LDA LO ;point to part 2 288 | ADC #240 289 | STA LO 290 | BCC DR2 291 | INC LO+1 292 | DR2 LDY #0 293 | DR3 LDA (LO),Y ;Get byte 294 | STA DISP+320,Y 295 | INY 296 | CPY #240 297 | BNE DR3 298 | ; 299 | ;INITIALIZE 300 | ; 301 | LDA #104 ;Color 0 is 302 | STA COL0 ;purple 303 | LDA #200 ;Color 1 is 304 | STA COL1 ;green 305 | LDA #0 ;Color 2 is 306 | STA COL2 ;black 307 | LDA #134 ;Color 3 is 308 | STA COL3 ;blue 309 | LDX #39 ;Print score 310 | PS LDA SCL,X ;line 311 | STA DISP,X 312 | LDA #0 313 | STA DISP+40,X 314 | DEX 315 | BPL PS 316 | JSR SHOSC ;Show score 317 | JSR SHOBO ;Show bonus 318 | JSR SHOLI ;Show lives 319 | LDA LEVEL ;Show level 320 | LDY #74 321 | JSR BCD 322 | LDA BOARD ;Set initial 323 | ASL A ;player 324 | ASL A ;positions. 325 | TAX 326 | LDA IX-4,X ;Set player X 327 | STA P0X 328 | LDA IY-4,X ;and Y 329 | STA P0Y 330 | INX 331 | LDY #2 ;Set all enemy 332 | SET LDA IX-4,X ;X 333 | STA ENXPOS,Y 334 | LDA IY-4,X ;Y 335 | STA ENYPOS,Y 336 | LDA #0 337 | STA ENDIR,Y ;Zero enemy 338 | STA ENBOUN,Y ;status 339 | INX 340 | DEY 341 | BPL SET ;Finish up 342 | ; 343 | ;P/M SET UP 344 | ; 345 | JSR PMCLR ;Clear players 346 | LDA # >PM ;Point to PM 347 | STA PMBASE ;area 348 | LDA #2 ;Set gractl 349 | STA GRACTL 350 | LDA #62 ;Set dmactl 351 | STA DMACTL 352 | LDA #1 ;Set priority 353 | STA GPRIOR 354 | LDA #218 ;Set pl0 color 355 | STA PCOL0 356 | LDA #26 ;Set enemy color 357 | STA PCOL1 358 | STA PCOL1+1 359 | STA PCOL1+2 360 | LDA P0X ;Draw player 361 | STA HPOSP0 ;Set x pos. 362 | LDY P0Y ;Get y 363 | LDX #0 364 | PD LDA PDAT,X ;Get player byte 365 | STA PLAYER,X 366 | STA PL0,Y ;And show it 367 | INY 368 | INX 369 | CPX #8 370 | BNE PD 371 | LDX #9 ;Copy enemy data 372 | CD LDA EDAT,X ;from memory to 373 | STA ENEMY,X ;animation table 374 | DEX 375 | BPL CD 376 | JSR DRAWEN ;Draw enemy 377 | LDA #170 ;Introduction 378 | STA AUDC1 379 | LDX #5 380 | IN LDA MUSIC,X 381 | STA AUDF1 382 | LDA #5 383 | JSR DELAY 384 | DEX 385 | BPL IN 386 | JSR QUIET 387 | LDA #40 388 | JSR DELAY 389 | LDA #$FF ;Turn on the 390 | STA GAMCTL ;VBI 391 | ; 392 | ;MAIN LOOP 393 | ; 394 | MAIN JSR ENMOVE ;Move enemy 395 | JSR SHOSC ;Show score 396 | JSR SHOBO ;Show bonus 397 | M1 LDA CONSOL ;Start pressed? 398 | ROR A 399 | BCC M4 ;Yes. 400 | LDA CH 401 | CMP #$21 ;Space bar? 402 | BNE M2 ;No. 403 | LDA #$FF 404 | STA CH ;Reset keycode 405 | EOR GAMCTL ;Flip pause 406 | STA GAMCTL 407 | BNE M2 408 | JSR HUSH ;Peace and... 409 | M2 LDA GAMCTL 410 | BEQ M1 411 | LDA DIE ;Player dead? 412 | BNE M3 ;Yes. 413 | LDA TIME ;Time up? 414 | BEQ M3 415 | LDA COUNT ;Level done? 416 | CMP TOTAL 417 | BNE MAIN 418 | JMP LDONE 419 | M3 JMP KILL ;Auuughh! 420 | M4 JMP GO 421 | ; 422 | ;CLEAR PM 423 | ; 424 | PMCLR LDA #0 425 | TAX 426 | PC STA PL0,X 427 | STA PL1,X 428 | STA PL2,X 429 | STA PL3,X 430 | INX 431 | BNE PC 432 | DE3 RTS 433 | ; 434 | ;SOUND OFF 435 | ; 436 | QUIET LDA #0 ;Turn off sound 437 | STA BONK 438 | STA DING 439 | STA FREEZE 440 | STA WSND 441 | HUSH STA AUDC1 442 | STA AUDC2 443 | STA AUDC3 444 | STA AUDC4 445 | STA AUDCTL 446 | RTS 447 | ; 448 | ;DRAW ENEMY 449 | ; 450 | DRAWEN LDA # PL1 453 | STA POINT+1 454 | LDA #0 455 | STA TEMP 456 | DE1 LDX TEMP 457 | CPX #3 458 | BEQ DE3 459 | LDA ENXPOS,X ;Set x position 460 | STA HPOSP1,X 461 | LDY ENYPOS,X 462 | LDX #0 463 | DE2 LDA ENEMY,X 464 | STA (POINT),Y 465 | INY 466 | INX 467 | CPX #10 468 | BNE DE2 469 | INC TEMP 470 | INC POINT+1 471 | JMP DE1 472 | ; 473 | ;VBI 474 | ; 475 | VBI CLD ;Kill decimal! 476 | LDA GAMCTL ;Do this VBI? 477 | BEQ EXIT ;No! Get out! 478 | JSR PCHK ;Check player 479 | JSR STUFF ;Do work 480 | JSR ANIM ;Animate 481 | JSR PLMOVE ;Move player 482 | JSR SOUND ;Make noise 483 | EXIT STA HITCLR ;Clear all hits 484 | JMP XITVBV ;Go home! 485 | ; 486 | ;MOVE PLAYER 487 | ; 488 | PLMOVE LDX #7 ;1st- erase 489 | LDY P0Y ;player 490 | LDA #0 491 | STA ATTRACT ;Kill attract 492 | ERPL STA PL0,Y 493 | INY 494 | DEX 495 | BPL ERPL 496 | LDX STICK ;2nd- get new 497 | STX DIR ;player position 498 | LDA P0X ;Get x position 499 | CLC ;then add offset 500 | ADC XOFF-5,X ;to old coord 501 | STA P0X ;Save new pos. 502 | STA HPOSP0 ;and show it 503 | LDA P0Y ;Now repeat for 504 | CLC ;y position. 505 | ADC YOFF-5,X 506 | STA P0Y 507 | LDX #7 ;3rd- redraw 508 | TAY 509 | DRPL LDA PLAYER,X 510 | STA PL0,Y 511 | INY 512 | DEX 513 | BPL DRPL 514 | RTS 515 | ; 516 | ;ENEMY HANDLER 517 | ; 518 | ENMOVE LDA FREEZE ;Frozen? 519 | BNE TWX ;Yup, ice cold. 520 | LDA WAIT+1 ;Get 1st timer 521 | BEQ TWO ;If 0, do next. 522 | DEC WAIT+1 ;Decrement 1st 523 | RTS ;And leave. 524 | ; 525 | TWO LDA WAIT ;Reset 1st timer 526 | STA WAIT+1 527 | LDA WAIT+3 ;Get 2nd timer 528 | BEQ MOVE ;If 0, move 'em 529 | DEC WAIT+3 ;Decrement 2nd 530 | TWX RTS 531 | ; 532 | MOVE LDA WAIT+2 ;Reset 2nd 533 | STA WAIT+3 534 | LDX #0 ;Main counter 535 | DOMOR JSR CHECK ;Check enemy 536 | LDA ENBOUN,X ;Bouncing? 537 | BEQ NOB ;No, continue. 538 | DEC ENBOUN,X ;Yes, 539 | JMP OUT ;Do next enemy. 540 | ; 541 | NOB LDA ENXPOS,X ;Get x pos 542 | CMP P0X ;Comp with play 543 | BCC XLES ;Less than? 544 | BNE XMOR ;More than? 545 | LDA #0 ;Equal to, stop 546 | BEQ DOY ;movement. 547 | XMOR LDA #$FF ;More than, move 548 | BNE DOY ;left. 549 | XLES LDA #1 ;Less than, move 550 | DOY STA ENXADD ;right. 551 | LDA ENYPOS,X ;Get y pos 552 | CMP P0Y ;Comp eith play 553 | BCC YLES ;Less than? 554 | BNE YMOR ;More than? 555 | LDA #0 ;Equal to, stop 556 | BEQ FINI ;movement. 557 | YMOR LDA #$FF ;More than, move 558 | BNE FINI ;left. 559 | YLES LDA #1 ;Less than, move 560 | FINI STA ENYADD ;right. 561 | LDY #8 ;Convert to dir 562 | CDIR LDA ENXADD ;Is x direction 563 | CMP ENX,Y ;correct? 564 | BNE AGA ;No, check more. 565 | LDA ENYADD ;Is y direction 566 | CMP ENY,Y ;correct? 567 | BNE AGA ;Nope. 568 | TYA 569 | STA ENDIR,X ;It's correct! 570 | BPL OUT ;Branch always! 571 | ; 572 | AGA DEY ;Continue 573 | BPL CDIR ;searching 574 | OUT LDA ENDIR,X ;Get direction 575 | TAY 576 | LDA ENXPOS,X ;Update x pos 577 | CLC 578 | ADC ENX,Y 579 | STA ENXPOS,X 580 | LDA ENYPOS,X ;Update y 581 | CLC 582 | ADC ENY,Y 583 | STA ENYPOS,X 584 | INX 585 | CPX #3 586 | BNE DOMOR 587 | JMP DRAWEN ;Draw enemy 588 | ; 589 | CHECK LDA ENDIR,X ;Check if the 590 | TAY ;enemy hit 591 | LDA ENXPOS,X ;anything 592 | SEC ;1st, scan on 593 | SBC SCX,Y ;x axis 594 | LSR A 595 | LSR A 596 | LSR A 597 | STA ENXADD 598 | LDA ENYPOS,X ;2nd, scan on 599 | SEC ;y axis 600 | SBC SCY,Y 601 | LSR A 602 | LSR A 603 | LSR A 604 | TAY ;Now, get point 605 | LDA LOTBL,Y 606 | STA LO 607 | LDA HITBL,Y 608 | STA LO+1 609 | LDY ENXADD 610 | LDA (LO),Y 611 | AND #$3F ;Mask off color 612 | BEQ L0 ;Hit anything? 613 | CMP #27 ;Hit diamond? 614 | BEQ L0 ;Yup, forget it 615 | CMP #$0F ;Hit freezer? 616 | BEQ L0 ;Yup, who cares 617 | LDA BDIST ;A hit! Make the 618 | STA ENBOUN,X ;enemy bounce! 619 | LDA #16 ;Set sound 620 | STA AUDF1 621 | LDA #6 622 | STA AUDC1 623 | STA BONK 624 | LDA RANDOM ;Get new direct. 625 | AND #3 626 | TAY 627 | LDA BDIR,Y 628 | STA ENDIR,X 629 | BPL CHECK ;Check it out! 630 | ; 631 | ;CHECK PLAYER 632 | ; 633 | PCHK LDA P0Y ;Get y pos 634 | SEC ;And convert to 635 | SBC #28 ;screen position 636 | LSR A 637 | LSR A 638 | LSR A 639 | TAY ;Get address 640 | LDA LOTBL,Y 641 | STA VLO 642 | LDA HITBL,Y 643 | STA VLO+1 644 | LDA P0X ;Now convert x 645 | SEC 646 | SBC #44 647 | LSR A 648 | LSR A 649 | LSR A 650 | TAY 651 | LDA (VLO),Y ;Get point 652 | AND #$3F ;Mask out color 653 | BEQ L0 ;Nothing there 654 | CMP #$0F ;Hit freezer? 655 | BEQ HITFR ;Yup, handle it 656 | CMP #$1B ;Hit diamond? 657 | BEQ HITDI ;Yup, fix it 658 | LDA (VLO),Y ;Get point 659 | AND #192 ;Get color used 660 | CMP #64 ;Hit weak wall? 661 | BNE L0 ;No, leave. 662 | ; 663 | ;Hit weak wall 664 | ; 665 | LDA #3 ;Set sound 666 | STA WSND 667 | LDA #240 668 | STA AUDF4 669 | LDA #200 670 | STA AUDC4 671 | HITX LDA #0 ;Erase wall 672 | STA (VLO),Y 673 | L0 RTS 674 | ; 675 | ;Hit diamond 676 | ; 677 | HITDI LDA #$70 ;Give points 678 | JSR ADD 679 | LDA #16 ;Set sound 680 | STA DING 681 | LDA #130 682 | STA AUDF2 683 | INC COUNT ;Count it 684 | JMP HITX 685 | ; 686 | ;Hit freezer 687 | ; 688 | HITFR JSR HITX ;Erase freezer 689 | LDA FTIME ;Set freeze time 690 | STA FREEZE 691 | LDA #5 692 | STA FREEZE+1 693 | LDA #166 ;Set sound 694 | STA AUDC3 695 | LDA #$50 ;Give points 696 | ; 697 | ;SCORE ROUTINES 698 | ; 699 | ADD SED ;Add points to 700 | CLC ;score 701 | ADC SCORE 702 | STA SCORE 703 | LDA #0 704 | ADC SCORE+1 705 | STA SCORE+1 706 | LDA #0 707 | ADC SCORE+2 708 | STA SCORE+2 709 | CLD 710 | RTS 711 | ; 712 | SHOBO LDA TIME ;Show bonus 713 | LDY #54 714 | ; 715 | BCD PHA ;Show 1 bcd 716 | SEC 717 | ROR A 718 | LSR A 719 | LSR A 720 | LSR A 721 | STA DISP,Y 722 | INY 723 | PLA 724 | AND #$0F 725 | ORA #$10 726 | STA DISP,Y 727 | RTS 728 | ; 729 | SHOSC LDX #2 ;Show score 730 | LDY #42 731 | SS LDA SCORE,X 732 | JSR BCD 733 | INY 734 | DEX 735 | BPL SS 736 | RTS 737 | ; 738 | SHOLI LDA LIVES ;Show lives 739 | LDY #64 740 | BNE BCD 741 | ; 742 | ;SOUND ROUTINES 743 | ; 744 | SOUND LDY BONK ;Bounce sound? 745 | BEQ T1 ;No 746 | DEY 747 | STY BONK 748 | STY AUDC1 749 | T1 LDY DING ;Bell sound? 750 | BEQ T2 ;No 751 | DEY 752 | STY DING 753 | TYA 754 | ORA #$A0 755 | STA AUDC2 756 | T2 LDA FREEZE ;Freezer sound? 757 | BEQ T3 ;No 758 | LDY FREEZE+1 759 | LDA FSND,Y 760 | STA AUDF3 761 | DEC FREEZE+1 762 | BNE T3 763 | LDA #5 764 | STA FREEZE+1 765 | DEC FREEZE 766 | BNE T3 767 | LDA #0 768 | STA AUDC3 769 | T3 LDA WSND ;Wall sound? 770 | BEQ T4 ;No 771 | DEC WSND 772 | BNE T4 773 | LDA #0 774 | STA AUDC4 775 | T4 RTS 776 | ; 777 | ;FLASH JEWELS 778 | ; 779 | STUFF INC FLASH ;Handle flash 780 | LDA FLASH ;timers. 781 | CMP #20 782 | BNE S1 783 | LDA #0 784 | STA FLASH 785 | LDA #104 786 | CMP COL0 787 | BNE S2 788 | LDA #10 789 | S2 STA COL0 790 | ; 791 | ;HANDLE TIME 792 | ; 793 | S1 INC TIME+1 ;Count down 794 | LDA TIME+1 795 | CMP #60 ;We interrupt 796 | BNE S3 ;this program 797 | LDA #0 ;for an import- 798 | STA TIME+1 ;ant news 799 | LDA TIME ;bulletin: 800 | SED ; HI MOM! 801 | SEC 802 | SBC #1 803 | CLD 804 | STA TIME 805 | S3 LDA P0PL ;Check player 806 | STA DIE ;collisions 807 | LDA P0PF 808 | AND #8 809 | BEQ S4 810 | STA DIE 811 | S4 RTS 812 | ; 813 | ;ANIMATE 814 | ; 815 | ANIM LDA ENAN ;Animate enemy. 816 | CLC ;Hey guys, look! 817 | ADC #10 ;Your names are 818 | CMP #50 ;in print : 819 | BNE A1 ; David Hague 820 | LDA #0 ; Robbie Hague 821 | A1 STA ENAN ; Martin Beck 822 | TAY ; Nathan Zink 823 | LDX #9 ;and everyone's 824 | A2 LDA EDAT,Y ;favorite: 825 | STA ENEMY,X ; A. ZLOTNICK! 826 | INY ;Tron to you! 827 | DEX ;(No you don't 828 | BPL A2 ;get paid) 829 | LDA DIR ;Animate player 830 | CMP #15 ;by storing a 831 | BEQ A3 ;different image 832 | LDA PLAN ;in the player 833 | CLC ;animation table 834 | ADC #8 835 | CMP #64 836 | BNE A4 ;Is this game 837 | A3 LDA #0 ;better than 838 | A4 STA PLAN ;The Electroids? 839 | TAY 840 | LDX #7 841 | A5 LDA PDAT,Y 842 | STA PLAYER,X 843 | INY 844 | DEX 845 | BPL A5 846 | RTS 847 | ; 848 | ;TIME DELAY 849 | ; 850 | DELAY STA TEMP ;Enter with 851 | LDA #0 ;length of pause 852 | STA CLOCK ;(in jiffies) in 853 | D0 LDA CLOCK ;the accumulator 854 | CMP TEMP 855 | BEQ S4 856 | LDA CONSOL 857 | CMP #7 858 | BEQ D0 859 | JMP GO 860 | ; 861 | ;DIE 862 | ; 863 | KILL LDA #0 ;Stop movement 864 | STA GAMCTL 865 | JSR QUIET ;No sound 866 | DEC LIVES ;Take a life 867 | JSR SHOLI ;And show them. 868 | LDA #204 869 | STA AUDC1 870 | LDX #40 ;Kill player 871 | K1 INC P0X ;1st shift 872 | LDA P0X 873 | STA HPOSP0 874 | LDA RANDOM 875 | STA AUDF1 876 | LDA #1 877 | JSR DELAY 878 | DEC P0X ;2nd shift 879 | LDA P0X 880 | STA HPOSP0 881 | LDA RANDOM 882 | STA AUDF1 883 | LDA #1 884 | JSR DELAY 885 | DEX 886 | BPL K1 ;Repeat again. 887 | JSR QUIET 888 | LDA LIVES ;Any lives? 889 | BEQ OVR 890 | JMP NEWLIFE 891 | ; 892 | ;GAME OVER 893 | ; 894 | OVR LDX #9 ;Show GAME OVER 895 | O1 LDA GOVR,X 896 | STA DISP+305,X 897 | DEX 898 | BPL O1 899 | JSR PMCLR 900 | LDA #255 901 | JSR DELAY 902 | JMP GO 903 | ; 904 | ;LEVEL DONE 905 | ; 906 | LDONE LDA #0 ;Stop movement 907 | STA GAMCTL 908 | JSR QUIET ;No sound 909 | C1 LDA TIME ;Give 10 points 910 | SED ;for each second 911 | SEC ;left on the 912 | SBC #1 ;timer. 913 | STA TIME 914 | CLD 915 | JSR SHOBO ;Add points for 916 | LDA #$10 ;time remaining 917 | JSR ADD ;and make bell 918 | JSR SHOSC ;tones by vary- 919 | LDA #50 ;ing the volume 920 | STA AUDF1 ;of voice 1. 921 | LDY #164 922 | C2 STY AUDC1 923 | LDA #1 924 | JSR DELAY 925 | DEY 926 | CPY #160 927 | BNE C2 928 | LDA TIME 929 | BNE C1 930 | JSR QUIET ;Kill noise 931 | JMP NEWLEV ;Start new level 932 | ; 933 | ;CHARACTER DATA 934 | ; 935 | CDAT .BYTE 0,0,255,255,255,255,0 936 | .BYTE 0,60,60,60,60,60,60 937 | .BYTE 60,60,0,0,248,252,252 938 | .BYTE 252,60,60,0,0,31,63,63 939 | .BYTE 63,60,60,60,60,252,252 940 | .BYTE 252,248,0,0,60,60,63 941 | .BYTE 63,63,31,0,0,60,124 942 | .BYTE 252,252,252,252,124,60 943 | .BYTE 60,62,63,63,63,63,62 944 | .BYTE 60,0,0,255,255,255,255 945 | .BYTE 126,60,60,126,255,255 946 | .BYTE 255,255,0,0,0,24,60,60 947 | .BYTE 60,60,60,60,60,60,60 948 | .BYTE 60,60,60,24,0,0,0,252 949 | .BYTE 254,254,252,0,0,0,0,63 950 | .BYTE 127,127,63,0,0,255,129 951 | .BYTE 189,161,185,161,129 952 | .BYTE 255 953 | CDAT2 .BYTE 0,126,255,126,60,24,0 954 | .BYTE 0 955 | ; 956 | ;LEVEL DATA 957 | ; 958 | DEL1 .BYTE 40,37,35,31,29,25 959 | .BYTE 24,23,22,21,20,19,18 960 | .BYTE 17,16 961 | BOUN .BYTE 50,45,40,30,25,25 962 | .BYTE 25,25,25,25,25,25,25 963 | .BYTE 25,25 964 | FTM .BYTE 25,24,23,22,21,20 965 | .BYTE 19,18,17,16,15,14,13 966 | .BYTE 12,11 967 | TOT .BYTE 16,14,26 968 | TIM .BYTE $60,$60,$55,$55,$50 969 | .BYTE $50,$45,$45,$40,$40 970 | .BYTE $40,$40,$40,$40,$40 971 | BDTBL .WORD BD1,BD2,BD3 972 | ; 973 | ;INSTALL DISPLAY LIST 974 | ; 975 | DL .BYTE $70,$70,$70,$42 976 | .WORD DISP 977 | .BYTE 2,$46 978 | .WORD DISP+80 979 | .BYTE 6,6,6,6,6,6,6,6,6,6,6 980 | .BYTE 6,6,6,6,6,6,6,6,6,6 981 | .BYTE $41 982 | .WORD DL 983 | ; 984 | SCL .SBYTE " SCORE: BONUS: " 985 | .SBYTE " LIVES: LEVEL:" 986 | .SBYTE " " 987 | ; 988 | TDL .BYTE $70,$70,$70,$70,$70 989 | .BYTE $70,$70,$70,$70,$47 990 | .WORD TITLE 991 | .BYTE $70,6,$70,7,$70,6 992 | .BYTE $70,6,6,$41 993 | .WORD TDL 994 | ; 995 | TITLE .SBYTE " BoNk " 996 | .SBYTE +$80," COPYRIGH" 997 | .SBYTE +$80,"T 1984 BY: " 998 | .SBYTE " JAMES HAGUE " 999 | .SBYTE " level: 1 " 1000 | .SBYTE +$80," SELEC" 1001 | .SBYTE +$80,"T FOR LEVEL " 1002 | .SBYTE +$80," START TO" 1003 | .SBYTE +$80," BEGIN " 1004 | ; 1005 | IX .BYTE 72,126,126,184 1006 | .BYTE 128,96,152,128 1007 | .BYTE 80,80,146,184 1008 | IY .BYTE 120,72,192,120 1009 | .BYTE 72,96,96,208 1010 | .BYTE 210,168,104,128 1011 | ; 1012 | ; PLAYER, ENEMY, MUSIC DATA 1013 | ; 1014 | PDAT .BYTE 254,214,254,16,124,108 1015 | .BYTE 108,238,254,214,254 1016 | .BYTE 16,124,108,236,14,254 1017 | .BYTE 214,254,16,124,236,12 1018 | .BYTE 14,254,214,254,16,124 1019 | .BYTE 108,236,14,254,214,254 1020 | .BYTE 16,124,108,108,238,254 1021 | .BYTE 214,254,16,124,108,110 1022 | .BYTE 224,254,214,254,16,124 1023 | .BYTE 110,96,224,254,214,254 1024 | .BYTE 16,124,108,110,224 1025 | EDAT .BYTE 0,32,32,63,60,60,252 1026 | .BYTE 4,4,0,0,16,16,60,63 1027 | .BYTE 252,60,8,8,0,0,8,8,60 1028 | .BYTE 252,63,60,16,16,0,0,4 1029 | .BYTE 4,252,60,60,63,32,32,0 1030 | .BYTE 0,129,66,60,60,60,60 1031 | .BYTE 66,129,0 1032 | MUSIC .BYTE 160,0,160,130,140,150 1033 | ; 1034 | ;X,Y OFFSETS + MISC. 1035 | ; 1036 | XOFF .BYTE 1,1,1,0,$FF 1037 | .BYTE $FF,$FF,0,0,0,0 1038 | YOFF .BYTE 1,$FF,0,0 1039 | .BYTE 1,$FF,0,0,1,$FF,0 1040 | ENX .BYTE 0,0,1,1,1,0,$FF,$FF 1041 | .BYTE $FF 1042 | ENY .BYTE 0,$FF,$FF,0,1,1,1,0 1043 | .BYTE $FF 1044 | SCX .BYTE 44,44,42,42,42,44,46 1045 | .BYTE 46,46 1046 | SCY .BYTE 28,30,30,28,26,26,26 1047 | .BYTE 28,30 1048 | BDIR .BYTE 2,4,6,8 1049 | FSND .BYTE 0,200,220,210,230,150 1050 | GOVR .SBYTE "GAME OVER" 1051 | ; 1052 | ;BOARD DATA 1053 | ; 1054 | BD1 .SBYTE +$A0,"DAAAAIAAAAAAAA" 1055 | .SBYTE +$A0,"IAAAACB@" 1056 | .SBYTE ";" 1057 | .SBYTE +$20,"@@B@@@@@@@@B@@" 1058 | .SBYTE ";" 1059 | .SBYTE +$A0,"@BB@@" 1060 | .SBYTE ";" 1061 | .SBYTE +$20,"@B@@@@@@@@B@" 1062 | .SBYTE ";" 1063 | .SBYTE +$A0,"@@BB@@@" 1064 | .SBYTE ";" 1065 | .SBYTE +$20,"B@@@@@@@@B" 1066 | .SBYTE ";" 1067 | .SBYTE +$A0,"@@@BH" 1068 | .SBYTE +$20,"AAAAE@@@@@@@@F" 1069 | .SBYTE +$20,"AAAA" 1070 | .SBYTE +$A0,"GB@@@@@@@@@@@@" 1071 | .SBYTE +$A0,"@@@@@@BB@@@@@@" 1072 | .SBYTE +$A0,"@@@@@@@@@@@@BB" 1073 | .SBYTE +$A0,"@@@@@@DAAAAC@@" 1074 | .SBYTE +$A0,"@@@@BB@@@@DAJA" 1075 | .SBYTE +$A0,"IIAJAC@@@@BHC@" 1076 | .SBYTE +$20,"@@B@" 1077 | .SBYTE ";" 1078 | .SBYTE +$A0,"@BB@@" 1079 | .SBYTE ";" 1080 | .SBYTE +$20,"B@@@" 1081 | .SBYTE +$A0,"DGBB" 1082 | .SBYTE +$20,"@@@B@@O" 1083 | .SBYTE +$A0,"BB@" 1084 | .SBYTE +$20,"O@B@@@" 1085 | .SBYTE +$A0,"BBHE@@" 1086 | .SBYTE +$20,"@B@" 1087 | .SBYTE ";" 1088 | .SBYTE +$A0,"@BB@@" 1089 | .SBYTE ";" 1090 | .SBYTE +$20,"B@@@" 1091 | .SBYTE +$A0,"FGB@@" 1092 | .SBYTE +$A0,"@@FAIAJJAIAE@@" 1093 | .SBYTE +$A0,"@@BB@@@@@@FAAA" 1094 | .SBYTE +$A0,"AE@@@@@@BB@@@@" 1095 | .SBYTE +$A0,"@@@@@@@@@@@@@@" 1096 | .SBYTE +$A0,"BB@@@@@@@@@@@@" 1097 | .SBYTE +$A0,"@@@@@@BB@@@@@@" 1098 | .SBYTE +$A0,"@@@@@@@@@@@@BH" 1099 | .SBYTE +$20,"AAAAC@@@@@@@@D" 1100 | .SBYTE +$20,"AAAA" 1101 | .SBYTE +$A0,"GB@@@" 1102 | .SBYTE ";" 1103 | .SBYTE +$20,"B@@@@@@@@B" 1104 | .SBYTE ";" 1105 | .SBYTE +$A0,"@@@BB@@" 1106 | .SBYTE ";" 1107 | .SBYTE +$20,"@B@@@@@@@@B@" 1108 | .SBYTE ";" 1109 | .SBYTE +$A0,"@@BB@" 1110 | .SBYTE ";" 1111 | .SBYTE +$20,"@@B@@@@@@@@B@@" 1112 | .SBYTE ";" 1113 | .SBYTE +$A0,"@BFAAAAJAAAAAA" 1114 | .SBYTE +$A0,"AAJAAAAE" 1115 | ; 1116 | BD2 .SBYTE +$A0,"DAAAAAAAAAAAA" 1117 | .SBYTE +$A0,"AAAAAACB@" 1118 | .SBYTE ";" 1119 | .SBYTE +$A0,"@@@@@@@@@@@@@@" 1120 | .SBYTE ";" 1121 | .SBYTE +$A0,"@BB@@@@@@@@@@@" 1122 | .SBYTE +$A0,"@@@@@@@" 1123 | .SBYTE +$A0,"BB@@DAAAC@@@@" 1124 | .SBYTE +$A0,"DAAC@@@BB@@B@" 1125 | .SBYTE ";" 1126 | .SBYTE +$20,"@L@@@@L" 1127 | .SBYTE ";" 1128 | .SBYTE +$A0,"@B@@@BB@@B@@@@" 1129 | .SBYTE +$A0,"@@@@@@@B@@@BB" 1130 | .SBYTE +$A0,"@@L@@@@K@@K@@" 1131 | .SBYTE +$A0,"@L@@@BB@@@@@@" 1132 | .SBYTE +$A0,"@B@" 1133 | .SBYTE ";" 1134 | .SBYTE +$A0,"HAM@@@@@BB@@@" 1135 | .SBYTE +$A0,"@@NAG@@" 1136 | .SBYTE +$20,"B" 1137 | .SBYTE +$A0,"@@@@@@@BB@@@@@" 1138 | .SBYTE ";" 1139 | .SBYTE +$20,"@HAAG@" 1140 | .SBYTE ";" 1141 | .SBYTE +$A0,"@@@@@BB@@@@@@@" 1142 | .SBYTE +$20,"B@@" 1143 | .SBYTE +$A0,"HAM@@@@@BB@@@" 1144 | .SBYTE +$A0,"@@NAG" 1145 | .SBYTE ";" 1146 | .SBYTE +$A0,"@B@@@@@@@BB@@@" 1147 | .SBYTE +$A0,"@@@@L@@L@@@@@" 1148 | .SBYTE +$A0,"@@BB@@@" 1149 | .SBYTE ";" 1150 | .SBYTE +$A0,"@@@@@@@@@" 1151 | .SBYTE ";" 1152 | .SBYTE +$A0,"@@@@BB@@@@@@" 1153 | .SBYTE +$20,"K@@@@K@@@@@@" 1154 | .SBYTE +$A0,"BB@@@@@@B@@@@" 1155 | .SBYTE +$A0,"B@@@@@@BB@@@@@" 1156 | .SBYTE ";" 1157 | .SBYTE +$A0,"B@@@@B" 1158 | .SBYTE ";" 1159 | .SBYTE +$A0,"@@@@@BB@@@@NAE" 1160 | .SBYTE +$A0,"@@@@FAM@@@@BB@" 1161 | .SBYTE +$A0,"@@@@@@@@@@@@@@" 1162 | .SBYTE +$A0,"@@@BH" 1163 | .SBYTE +$20,"AC@@@@@@@O@@@" 1164 | .SBYTE +$20,"@@@DA" 1165 | .SBYTE +$A0,"GB" 1166 | .SBYTE ";" 1167 | .SBYTE +$20,"B@@@@@@@@@@@@" 1168 | .SBYTE +$20,"@@B" 1169 | .SBYTE ";" 1170 | .SBYTE +$A0,"BFAJAAAAAAAAA" 1171 | .SBYTE +$A0,"AAAAAJAE" 1172 | ; 1173 | BD3 .SBYTE +$A0,"DAAAAAIAAAAAAI" 1174 | .SBYTE +$A0,"AAAAACB" 1175 | .SBYTE "; ; ;" 1176 | .SBYTE +$20,"B@@@@@@" 1177 | .SBYTE +$A0,"B@" 1178 | .SBYTE "END" 1179 | .SBYTE +$A0,"@BB@" 1180 | .SBYTE "; ;" 1181 | .SBYTE +$20,"@B@@" 1182 | .SBYTE ";" 1183 | .SBYTE +$A0,"@@@HAAAAAGB" 1184 | .SBYTE "; ; ;" 1185 | .SBYTE +$20,"B@@" 1186 | .SBYTE +$A0,"DC@@B@" 1187 | .SBYTE "; ;" 1188 | .SBYTE +$A0,"@BH" 1189 | .SBYTE +$20,"AAAAA" 1190 | .SBYTE +$A0,"G@@B" 1191 | .SBYTE +$20,"B@@" 1192 | .SBYTE +$A0,"B@@" 1193 | .SBYTE ";" 1194 | .SBYTE +$A0,"@@BB@@@@@B@@" 1195 | .SBYTE +$20,"B" 1196 | .SBYTE +$A0,"B@@B@" 1197 | .SBYTE "; ;" 1198 | .SBYTE +$A0,"@BB@@" 1199 | .SBYTE ";" 1200 | .SBYTE +$A0,"@@B@@FE@@B@@" 1201 | .SBYTE ";" 1202 | .SBYTE +$A0,"@@BB@@@@@B@@@@" 1203 | .SBYTE +$20,"@@B@@@@@" 1204 | .SBYTE +$A0,"BB@@K@@B@@@@" 1205 | .SBYTE +$20,"O@B@@@@@" 1206 | .SBYTE +$A0,"BB@@B@" 1207 | .SBYTE ";" 1208 | .SBYTE +$A0,"B@@@@@@" 1209 | .SBYTE +$20,"B@@@@@" 1210 | .SBYTE +$A0,"BB@@B@@B@@DC@@" 1211 | .SBYTE +$A0,"B@@@@@BB@@B@@B" 1212 | .SBYTE +$20,"@@B" 1213 | .SBYTE +$A0,"B@@B" 1214 | .SBYTE "; ;" 1215 | .SBYTE +$A0," BB" 1216 | .SBYTE ";" 1217 | .SBYTE +$A0,"@B@@B@@B" 1218 | .SBYTE +$20,"B@" 1219 | .SBYTE ";" 1220 | .SBYTE +$A0,"H" 1221 | .SBYTE +$20,"M@@@N" 1222 | .SBYTE +$A0,"GB@@L@@B@@FE@" 1223 | .SBYTE +$A0,"@B@@@@@BB@@@@" 1224 | .SBYTE +$A0,"@B@@@@@@B@@@@" 1225 | .SBYTE +$A0,"@BB@@@@@B@@@@" 1226 | .SBYTE +$A0,"@@B@@@@@BB@@@" 1227 | .SBYTE +$A0,"@@HAAA" 1228 | .SBYTE +$20,"C@@" 1229 | .SBYTE +$A0,"H" 1230 | .SBYTE +$20,"AAAAA" 1231 | .SBYTE +$A0,"GH" 1232 | .SBYTE +$20,"AAAAA" 1233 | .SBYTE +$A0,"G@" 1234 | .SBYTE ";" 1235 | .SBYTE +$20,"@B@@B@@@@@" 1236 | .SBYTE +$A0,"BB@@" 1237 | .SBYTE +$20,"O@@B@" 1238 | .SBYTE ";" 1239 | .SBYTE +$20,"@B@@L@@@@@" 1240 | .SBYTE +$A0,"BB@@@@@" 1241 | .SBYTE +$20,"B@" 1242 | .SBYTE ";" 1243 | .SBYTE +$20,"@B@@@@@" 1244 | .SBYTE ";" 1245 | .SBYTE +$A0,"@@BB@@@@@" 1246 | .SBYTE +$20,"B@" 1247 | .SBYTE ";" 1248 | .SBYTE +$20,"@B@@@@@@@@" 1249 | .SBYTE +$A0,"BFAAAAAJAAA" 1250 | .SBYTE +$A0,"JAAAAAAAAE" 1251 | ; 1252 | *= $02E0 1253 | .WORD GAME 1254 | .END 1255 | -------------------------------------------------------------------------------- /Bopotron.asm: -------------------------------------------------------------------------------- 1 | 0100 ; 2 | 0110 ; ************************** 3 | 0120 ; * BOPOTRON * 4 | 0130 ; * by Kyle S. Peacock * 5 | 0140 ; * ANALOG COMPUTING * 6 | 0150 ; ************************** 7 | 0160 ; 8 | 0170 ; ******************* 9 | 0180 ; * ZERO PAGE USAGE * 10 | 0190 ; ******************* 11 | 0200 ; 12 | 0210 PLADR = $CB ;ADDR PLR AREA 13 | 0220 PMSTR = $CD ;ADDR PLR DATA 14 | 0230 SCREEN = $CF ;ADDR OF SCREEN 15 | 0240 ; 16 | 0250 ; *************************** 17 | 0260 ; * HARD/SOFTWARE REGISTERS * 18 | 0270 ; *************************** 19 | 0280 ; 20 | 0290 POKMSK = $10 ;BREAK DISABLE 21 | 0300 SAVMSC = $58 ;SCREEN ADDR. 22 | 0310 STICK = $0278 ;JOYSTICK PORT 23 | 0320 COLOR3 = $02C7 ;COLOR REG. #3 24 | 0330 HPOSP0 = $D000 ;HOR. POS. PLRs 25 | 0340 TRIG0 = $D010 ;JOYSTICK BUTTON 26 | 0350 RANDOM = $D20A ;RANDOM NO. 27 | 0360 IRQEN = $D20E ;BREAK DISABLE 28 | 0370 CHBASE = $D409 ;CHAR SET ADDR 29 | 0380 WSYNC = $D40A ;WAIT FOR SYNC. 30 | 0390 SETVBV = $E45C ;SET VBLANK 31 | 0400 XITVBV = $E462 ;END OF VBLANK 32 | 0410 ; 33 | 0420 ; **************** 34 | 0430 ; * MEMORY USAGE * 35 | 0440 ; **************** 36 | 0450 ; 37 | 0460 *= $0601 38 | 0470 ACTIVATE *= *+1 ;VBLANK ACTIVE 39 | 0480 STARTPT *= *+1 ;PLR Y START 40 | 0490 ENDPT *= *+1 ;PLR Y END 41 | 0500 DATAPT *= *+1 ;DATA POINTER 42 | 0510 XPOS *= *+4 ;PLRs X-COORDS. 43 | 0520 YPOS *= *+4 ;PLRs Y-COORDS. 44 | 0530 STATUS *= *+4 ;PLRs DEATH FLAG 45 | 0540 PNTR *= *+2 ;DATA POINTERS. 46 | 0550 XSPEED *= *+2 ;PLATFORM SPEED 47 | 0560 DELTAX *= *+2 ;PLAT. X-DELTA 48 | 0570 DELTAY *= *+2 ;PLAT. Y-DELTA 49 | 0580 SPEEDS *= *+10 ;PLAT. SPEED 50 | 0590 XSTART *= *+10 ;PLAT. X-START 51 | 0600 YSTART *= *+10 ;PLAT. Y-START 52 | 0610 XEND *= *+10 ;PLAT. X-END 53 | 0620 YEND *= *+10 ;PLAT. Y-END 54 | 0630 CHAR *= *+2 ;STANDING ON #. 55 | 0640 MOVETIME *= *+1 ;MOVEMENT TIMER 56 | 0650 TASKERS *= *+1 ;# OF PLATFORMS 57 | 0660 XHOLD *= *+1 ;X-REG. HOLD 58 | 0670 YHOLD *= *+1 ;Y-REG. HOLD 59 | 0680 SLIP *= *+1 ;ON PLAT. FLAG 60 | 0690 FALLCOUNT *= *+2 ;HOW FAR TO FALL... 61 | 0700 ; 62 | 0710 ; ****************************** 63 | 0720 ; * VERTICAL BLANK INITIALIZER * 64 | 0730 ; ****************************** 65 | 0740 ; 66 | 0750 CLD ;CHILL DECIMAL. 67 | 0760 LDA POKMSK ;DISABLE BREAK 68 | 0770 AND #$7F ;KEY. THE BREAK 69 | 0780 STA POKMSK ;KEY NO LONGER 70 | 0790 STA IRQEN ;WORKS. (SO?!?) 71 | 0800 PLA ;# OF VARIABLES 72 | 0810 PLA ;VBLANK HI/BYTE 73 | 0820 STA XHOLD ;HOLD ON TO IT. 74 | 0830 PLA ;VBLANK LO/BYTE 75 | 0840 STA YHOLD ;HOLD ON TO IT. 76 | 0850 PLA ;PLAYERS HI/BYTE 77 | 0860 STA PLADR+1 ;STORE IT. 78 | 0870 PLA ;PLAYERS LO/BYTE 79 | 0880 STA PLADR ;STORE IT. 80 | 0890 PLA ;PLAYER STRING 81 | 0900 STA PMSTR+1 ;HI/BYTE. 82 | 0910 PLA ;PLAYER STRING 83 | 0920 STA PMSTR ;LO/BYTE. 84 | 0930 LDA #$01 ;STOP OLD VBLANK 85 | 0940 STA ACTIVATE 86 | 0950 LDA PLADR+1 ;HOLD ON TO ADDR 87 | 0960 PHA ;OF PM AREA. 88 | 0970 LDX #$03 ;LOAD X-REG. 89 | 0980 LDY #$00 ;LOAD Y-REG. 90 | 0990 TYA ;LOAD A-REG. 91 | 1000 CLEAR 92 | 1010 STA (PLADR),Y ;CLEAR PMs 93 | 1020 INY ;MOVE TO NEXT. 94 | 1030 BNE CLEAR ;ALL DONE? 95 | 1040 INC PLADR+1 ;MOVE TO NEXT. 96 | 1050 DEX ;ALL DONE? 97 | 1060 BPL CLEAR ;NO. GO BACK! 98 | 1070 LDX #$09 ;SET X FOR CLEAR 99 | 1080 CLEAR2 100 | 1090 STA SPEEDS,X ;CLEAR OLD 101 | 1100 CPX #$04 ;MOTION TIMERS 102 | 1110 BCS CLEAR3 ;& STATUS. PRE- 103 | 1120 STA STATUS,X ;PARE FOR NEW 104 | 1130 CLEAR3 105 | 1140 DEX ;DATA CONTROL 106 | 1150 BPL CLEAR2 ;INFORMATION. 107 | 1160 STA FALLCOUNT 108 | 1170 STA PNTR 109 | 1180 STA XSPEED+0 ;STOP PREVIOUS 110 | 1190 STA XSPEED+1 ;PLATFORMS. 111 | 1200 STX TASKERS ;SOUND OFFICIAL? 112 | 1210 LDA #$05 ;I DIDN'T THINK 113 | 1220 STA PNTR+1 ;SO!!!!!!!! 114 | 1230 PLA ;YES. RESTORE 115 | 1240 STA PLADR+1 ;PM AREA. 116 | 1250 LDX XHOLD ;VBLANK HI/BYTE 117 | 1260 LDY YHOLD ;VBLANK LO/BYTE 118 | 1270 LDA #$07 ;DEF. VBLANK. 119 | 1280 JMP SETVBV ;SET IT UP/BOOGIE... 120 | 1290 ; 121 | 1300 ; ************************** 122 | 1310 ; * DISPLAY LIST INTERRUPT * 123 | 1320 ; ************************** 124 | 1330 ; 125 | 1340 *= $2000 126 | 1350 PHA ;SAVE ACC. 127 | 1360 LDA $0600 ;CHR. HI/BYTE. 128 | 1370 STA WSYNC ;WAIT A WHILE. 129 | 1380 STA CHBASE ;SAVE CHR. SET. 130 | 1390 PLA ;RESTORE ACC. 131 | 1400 RTI ;BOOGIE... 132 | 1410 ; 133 | 1420 ; *********************** 134 | 1430 ; * PLAYER DRAW ROUTINE * 135 | 1440 ; *********************** 136 | 1450 ; 137 | 1460 CLD ;CHILL DECIMAL. 138 | 1470 INC COLOR3 ;CHANGE COLOR. 139 | 1480 LDA ACTIVATE ;VBLANK ACTIVE? 140 | 1490 BEQ FUNCTION ;YES! BRANCH! 141 | 1500 JMP XITVBV ;NO. LATER. 142 | 1510 FUNCTION 143 | 1520 LDA PLADR ;PLR ADDR. LO. 144 | 1530 PHA ;SAVE IT. 145 | 1540 LDA PLADR+1 ;PLR ADDR. HI. 146 | 1550 PHA ;SAVE IT. 147 | 1560 LDY #$00 ;BLANK Y REG. 148 | 1570 LDX #$00 ;BLANK X REG. 149 | 1580 DRAW5 150 | 1590 LDA XPOS,X ;PLR X-POS. 151 | 1600 STA HPOSP0,X ;STORE IT. 152 | 1610 LDA YPOS,X ;PLR Y-POS. 153 | 1620 STA STARTPT ;SAVE IT. 154 | 1630 CLC ;GET PLAYER 155 | 1640 ADC (PMSTR),Y ;LENGTH. ADD 156 | 1650 STA ENDPT ;AND STORE IT. 157 | 1660 INY ;MOVE TO 1st 158 | 1670 STY DATAPT ;DATA BYTE. 159 | 1680 CPX #$00 ;PLAYER #0? 160 | 1690 BEQ PASS0 ;YES. BRANCH. 161 | 1700 LDA PLADR ;INCREMENT 162 | 1710 CLC ;PLAYER ADDR. 163 | 1720 ADC #128 ;FOR DRAWING 164 | 1730 STA PLADR ;NEXT PLAYER. 165 | 1740 LDA PLADR+1 ;ADJUST FOR 166 | 1750 ADC #$00 ;256 BYTE PAGE 167 | 1760 STA PLADR+1 ;WRAP-AROUND. 168 | 1770 PASS0 169 | 1780 LDA STARTPT ;STARTING PT. 170 | 1790 SEC ;SUBTRACT 10 171 | 1800 SBC #10 ;BYTES. 172 | 1810 TAY ;MOVE TO Y-REG. 173 | 1820 LDA #$00 ;CLEAR ACC. 174 | 1830 INSERT1 175 | 1840 STA (PLADR),Y 176 | 1850 INY ;CLEAR OUT 177 | 1860 CPY STARTPT ;TOP & BOTTOM 178 | 1870 BCC INSERT1 ;OF PLATFORM 179 | 1880 LDA ENDPT ;GET ENDPOINT 180 | 1890 CLC ;AND ADD 10 181 | 1900 ADC #10 ;DECIMAL. 182 | 1910 TAY ;MOVE TO Y-REG. 183 | 1920 LDA #$00 ;CLEAR ACC. 184 | 1930 INSERT2 185 | 1940 STA (PLADR),Y ;STORE BLANK 186 | 1950 DEY ;MOVE TO NEXT. 187 | 1960 CPY ENDPT ;AT END? 188 | 1970 BCS INSERT2 ;NO. BLANK MORE. 189 | 1980 PASS1 190 | 1990 LDY STATUS,X ;GET STATUS. 191 | 2000 BPL PASS2 ;IF >=0, BRANCH. 192 | 2010 LDY PNTR-2,X ;GET POINTER. 193 | 2020 LDA YPOS,X ;GET Y-COORD. 194 | 2030 SEC ;SUBTRACT START- 195 | 2040 SBC YSTART,Y ;ING POINT. 196 | 2050 CMP #$0B ;IS IT < 12? 197 | 2060 BCC PASS2 ;YES. BRANCH. 198 | 2070 CMP #245 ;IS IT >= 245? 199 | 2080 BCS PASS2 ;YES. BRANCH. 200 | 2090 LDA #$00 ;NO. CLEAR ACC. 201 | 2100 BEQ PASSX ;BRANCH. 202 | 2110 BACKUP 203 | 2120 BCC DRAW5 ;BRANCH POINT. 204 | 2130 PASS2 205 | 2140 LDY DATAPT ;GET POINTER. 206 | 2150 LDA (PMSTR),Y ;GET PLR DATA. 207 | 2160 PASSX 208 | 2170 LDY STARTPT ;GET START PT. 209 | 2180 STA (PLADR),Y ;PUT IT PLR AREA 210 | 2190 INC STARTPT ;INC. AREA PTR. 211 | 2200 INC DATAPT ;INC. DATA PTR. 212 | 2210 LDA STARTPT ;GET AREA PTR. 213 | 2220 CMP ENDPT ;AT END? 214 | 2230 BNE PASS1 ;NO. BRANCH. 215 | 2240 LDA STATUS,X ;GET STATUS. 216 | 2250 BPL OUT ;IF >=0 BRANCH. 217 | 2260 LDA #$00 ;CLEAR ACC. 218 | 2270 STA STATUS,X ;SAVE STATUS. 219 | 2280 CPX #$02 ;DRAWING BOPOTRON? 220 | 2290 BCC OUT ;YES. BRACH. 221 | 2300 LDY PNTR-2,X ;GET PNTR. 222 | 2310 LDA XSTART,Y ;GET X-START 223 | 2320 STA XPOS,X ;SAVE AS X-COORD 224 | 2330 LDA YSTART,Y ;GET YSTART 225 | 2340 STA YPOS,X ;SAVE AS Y-COORD 226 | 2350 LDA #15 ;PAUSE FOR A 227 | 2360 STA XSPEED-2,X ;WHILE. 228 | 2370 OUT 229 | 2380 LDY DATAPT ;RESTORE Y-REG. 230 | 2390 INX ;MOVE TO NEXT. 231 | 2400 CPX #$04 ;AT END? 232 | 2410 BCC BACKUP ;NO. BRANCH. 233 | 2420 PLA ;RESTORE OLD 234 | 2430 STA PLADR+1 ;PLAYER ADDR. 235 | 2440 PLA ;POINTERS. 236 | 2450 STA PLADR ; 237 | 2460 ; 238 | 2470 ; ************************* 239 | 2480 ; * GIRDER TASKED PLAYERS * 240 | 2490 ; ************************* 241 | 2500 ; 242 | 2510 LDX TASKERS ;# OF PLATFORMS. 243 | 2520 BMI FORWARD ;NONE. BRANCH. 244 | 2530 START 245 | 2540 DEC XSPEED,X ;TIME TO MOVE? 246 | 2550 BNE FORWARD ;NO BRANCH. 247 | 2560 LDA STATUS+2,X ;PLAT ALIVE? 248 | 2570 BEQ SELECT ;YES. BRANCH. 249 | 2580 LDA #$FF ;SET UP FOR NEW 250 | 2590 STA STATUS+2,X ;VECTOR. 251 | 2600 BMI FORWARD ;BRANCH. 252 | 2610 SELECT 253 | 2620 LDY PNTR,X ;GET PNTR. 254 | 2630 LDA SPEEDS,Y ;GET PLAT SPEED 255 | 2640 STA XSPEED,X ;SAVE IT. 256 | 2650 LDA XPOS+2,X ;IS PLATFORM AT 257 | 2660 CMP XEND,Y ;DESTINATION? 258 | 2670 BNE ADDUP ;NO. BRANCH. 259 | 2680 LDA YPOS+2,X ;NOW CHECK 260 | 2690 CMP YEND,Y ;Y-COORDS. 261 | 2700 BNE ADDUP ;NOT THERE. BRANCH. 262 | 2710 LDA #$01 ;CHANGE STATUS 263 | 2720 STA STATUS+2,X ;TO ONE. 264 | 2730 LDA #15 ;PAUSE FOR A 265 | 2740 STA XSPEED,X ;WHILE. 266 | 2750 BPL LOAD0 ;BRANCH. 267 | 2760 BMI LOAD0 ;BRANCH. 268 | 2770 BACKTRACK 269 | 2780 BPL START ;BRANCH POINT. 270 | 2790 FORWARD 271 | 2800 BEQ NEXT ;BRANCH POINT. 272 | 2810 BNE NEXT ;BRANCH POINT. 273 | 2820 LOAD0 274 | 2830 INC PNTR,X ;AT DESTINATION. 275 | 2840 LDA PNTR,X ;TIME TO GET 276 | 2850 CMP #$05 ;NEXT PREPROG- 277 | 2860 BNE LOAD1 ;RAMMED VECTOR. 278 | 2870 LDA #$00 ;BUT DON'T GET 279 | 2880 BEQ LOAD2 ;VECTOR IF IT 280 | 2890 LOAD1 281 | 2900 CMP #10 ;IS NOT VALID. 282 | 2910 BNE LOAD2 ;IF INVALID, 283 | 2920 LDA #$05 ;KEEP SEARCHING 284 | 2930 LOAD2 285 | 2940 STA PNTR,X ;FOR VALID 286 | 2950 TAY ;VECTOR. 287 | 2960 LDA SPEEDS,Y 288 | 2970 BEQ LOAD0 289 | 2980 BPL NEXT 290 | 2990 ADDUP 291 | 3000 LDA XPOS+2,X ;ADD PROPER 292 | 3010 CLC ;DELTA TO PLAT- 293 | 3020 ADC DELTAX,X ;FORM X-COORD. 294 | 3030 STA XPOS+2,X ;SAVE IT. 295 | 3040 LDA YPOS+2,X ;ADD PROPER 296 | 3050 CLC ;DELTA TO PLAT- 297 | 3060 ADC DELTAY,X ;FORM Y-COORD. 298 | 3070 STA YPOS+2,X ;SAVE IT. 299 | 3080 CPX SLIP ;BOPOTRON ON 300 | 3090 BNE NEXT ;THIS PLATFORM? 301 | 3100 LDA XPOS ;YES. ADD 302 | 3110 CLC ;X-DELTA TO BOP- 303 | 3120 ADC DELTAX,X ;OTRON X-COORD 304 | 3130 STA XPOS ;AND SAVE IT. 305 | 3140 STA XPOS+1 306 | 3150 LDA YPOS ;ADD Y-DELTA TO 307 | 3160 CLC ;BOPOTRON 308 | 3170 ADC DELTAY,X ;Y-COORD AND 309 | 3180 STA YPOS ;SAVE IT. 310 | 3190 STA YPOS+1 311 | 3200 NEXT 312 | 3210 DEX ;HANDLE NEXT 313 | 3220 BPL BACKTRACK ;PLATFORM. 314 | 3230 ; 315 | 3240 ; ************************* 316 | 3250 ; * BOPOTRON ON PLATFORM? * 317 | 3260 ; ************************* 318 | 3270 ; 319 | 3280 LDA #$FF ;CLEAR 'ON 320 | 3290 STA SLIP ;PLATFORM' FLAG. 321 | 3300 LDX TASKERS ;# OF PLATFORMS 322 | 3310 BMI DELTASDONE ;NONE. QUIT. 323 | 3320 SLIPTEST 324 | 3330 LDA XPOS ;SUBTRACT BOPO- 325 | 3340 SEC ;TRON X-COORD 326 | 3350 SBC XPOS+2,X ;FROM PLATFORM'S 327 | 3360 BPL NOABS ;IF >=0 BRANCH. 328 | 3370 EOR #$FF ;TAKE ABSOLUTE 329 | 3380 CLC ;VALUE. 330 | 3390 ADC #$01 ; 331 | 3400 NOABS 332 | 3410 CMP #$07 ;IS IT >=7? 333 | 3420 BCS SETDELTAS ;YES. BRANCH. 334 | 3430 LDA YPOS+2,X ;NO. SUBTRACT 335 | 3440 SEC ;BOPOTRON 336 | 3450 SBC YPOS ;Y-COORD. 337 | 3460 CMP #12 ;IS IT = 12? 338 | 3470 BNE DIETEST ;NO. BRANCH. 339 | 3480 STX SLIP ;SET FLAG. 340 | 3490 BNE SETDELTAS ;BRANCH. 341 | 3500 DIETEST 342 | 3510 BCS SETDELTAS ;IS IT < 12? 343 | 3520 LDA #$01 ;YES!!! BOPOTRON 344 | 3530 STA ACTIVATE ;DIES PAINFULLY 345 | 3540 SETDELTAS 346 | 3550 LDA #$00 ;CLEAR OUT OLD 347 | 3560 STA DELTAX,X ;DELTA VALUES. 348 | 3570 STA DELTAY,X ; 349 | 3580 LDY PNTR,X ;GET PNTR. 350 | 3590 LDA XPOS+2,X ;COMPARE DESTIN- 351 | 3600 CMP XEND,Y ;ATION TO ACTUAL 352 | 3610 BCC PLUS1X ;POSITION. 353 | 3620 BEQ NEWDELTA ; 354 | 3630 LDA #$FF ;DELTA IS -1. 355 | 3640 BMI SETDELTAX 356 | 3650 PLUS1X 357 | 3660 LDA #$01 ;DELTA IS +1 358 | 3670 SETDELTAX 359 | 3680 STA DELTAX,X ;SAVE X-DELTA. 360 | 3690 NEWDELTA 361 | 3700 LDA YPOS+2,X ;COMPARE DES- 362 | 3710 CMP YEND,Y ;TINATION TO 363 | 3720 BCC PLUS1Y ;ACTUAL POSITION 364 | 3730 BEQ DELTASDONE 365 | 3740 LDA #$FF ;DELTA IS -1 366 | 3750 BMI SETDELTAY 367 | 3760 PLUS1Y 368 | 3770 LDA #$01 ;DELTA IS +1 369 | 3780 SETDELTAY 370 | 3790 STA DELTAY,X ;SAVE Y-DELTA. 371 | 3800 DELTASDONE 372 | 3810 DEX ;CHECK NEXT 373 | 3820 BPL SLIPTEST ;PLATFORM. 374 | 3830 ; 375 | 3840 ; *************************** 376 | 3850 ; * CHARACTER TRACE ROUTINE * 377 | 3860 ; *************************** 378 | 3870 ; 379 | 3880 PASS3 380 | 3890 LDA SAVMSC ;GET 1st ADDR. 381 | 3900 STA SCREEN ;OF SCREEN 382 | 3910 LDA SAVMSC+1 ;MEMORY & SAVE 383 | 3920 STA SCREEN+1 ;IT. 384 | 3930 LDA YPOS ;BOPOTRON Y. 385 | 3940 SEC ;SUBTRACT SEX 386 | 3950 SBC #$06 ;DECIMAL. 387 | 3960 LSR A ;DIVIDE BY FOUR. 388 | 3970 LSR A 389 | 3980 TAX ;MOVE TO X-REG. 390 | 3990 PASS4 391 | 4000 BEQ PASS5 ;IF =0 BRANCH. 392 | 4010 LDA SCREEN ;GET SCREEN & 393 | 4020 CLC ;ADD ONE LINE. 394 | 4030 ADC #40 ;(40 BYTES) 395 | 4040 STA SCREEN ;SAVE IT. 396 | 4050 LDA SCREEN+1 ;CORRECT FOR 397 | 4060 ADC #$00 ;PAGE WRAP- 398 | 4070 STA SCREEN+1 ;AROUND. 399 | 4080 DEX ;AT BOPOTRON'S 400 | 4090 BPL PASS4 ;Y-COORD? 401 | 4100 PASS5 402 | 4110 LDA XPOS ;YES. GET 403 | 4120 SEC ;X-COORD & SUB- 404 | 4130 SBC #44 ;TRACT 44. 405 | 4140 LSR A ;DIVIDE BY 406 | 4150 LSR A ;FOUR. 407 | 4160 TAY ;MOVE TO Y-REG. 408 | 4170 LDA (SCREEN),Y ;CHARACTER #. 409 | 4180 LDX SLIP ;BOPOTRON ON 410 | 4190 BMI PASS6 ;PLATFORM? 411 | 4200 LDA #$01 ;YES! CHAR=1. 412 | 4210 PASS6 413 | 4220 STA CHAR+1 ;SAVE CHARACTER 414 | 4230 AND #$7F ;REMOVE msb 415 | 4240 STA CHAR ;& SAVE AGAIN. 416 | 4250 LDA YPOS ;IS BOPOTRON Y- 417 | 4260 CMP #27 ;COORD <27 418 | 4270 BCC PASS7 ;YES! BRANCH. 419 | 4280 LDA SCREEN ;CHECK SCREEN 420 | 4290 SEC ;POSITION 2 421 | 4300 SBC #80 ;LINES UP TO SEE 422 | 4310 STA SCREEN ;IF BOPOTRON IS 423 | 4320 LDA SCREEN+1 ;CRASHING HIS 424 | 4330 SBC #$00 ;DOME. 425 | 4340 STA SCREEN+1 ;(80 BYTES) 426 | 4350 LDA (SCREEN),Y ;CHARACTER #. 427 | 4360 CMP #$01 ;IS IT A GIRDER? 428 | 4370 BEQ ZAP ;YES BRANCH. 429 | 4380 CMP #$08 ;IS IT >=8? 430 | 4390 BCS ZAP ;YES BRANCH. 431 | 4400 PASS7 432 | 4410 ; 433 | 4420 ; *************************** 434 | 4430 ; * BOPOTRON MOTION ROUTINE * 435 | 4440 ; *************************** 436 | 4450 ; 437 | 4460 LDA CHAR ;GET CHARACTER # 438 | 4470 BEQ FALL ;IF = 0 BRANCH. 439 | 4480 DEC MOVETIME ;DEC TIMER. 440 | 4490 BMI MOTION ;IF <0 MOVE. 441 | 4500 JMP XITVBV ;ELSE, QUIT. 442 | 4510 MOTION 443 | 4520 PHA ;SAVE ACC. 444 | 4530 LDA #$01 ;RESET TIMER. 445 | 4540 LDX TRIG0 ;IS BUTTON HELD? 446 | 4550 BEQ RESET ;NO. BRANCH. 447 | 4560 ASL A ;YES. MOVE FAST. 448 | 4570 RESET 449 | 4580 STA MOVETIME ;SAVE TIMER. 450 | 4590 PLA ;RESTORE ACC. 451 | 4600 CMP #$02 ;IS CHARACTER <2 452 | 4610 BCC FALLTEST ;IF YES BRANCH. 453 | 4620 CMP #$08 ;IS CHARACTER <8 454 | 4630 BCC CHECK6 ;IF YES BRANCH. 455 | 4640 FALLTEST 456 | 4650 LDA SLIP ;ON PLATFORM? 457 | 4660 BPL CHECK8 ;IF YES BRANCH. 458 | 4670 LDA YPOS ;MODIFY BOPO- 459 | 4680 AND #$01 ;TRON'S Y-COORD 460 | 4690 BNE FALL ;SO HE'S ALWAYS 461 | 4700 LDA YPOS ;ON TOP OF A 462 | 4710 AND #$03 ;GIRDER. 463 | 4720 BNE CHECK8 ; 464 | 4730 FALL 465 | 4740 INC FALLCOUNT ;FALLING... 466 | 4750 LDA #$01 ;ADD ONE TO 467 | 4760 BNE ADDY ;Y-COORD. 468 | 4770 CHECK6 469 | 4780 LDA STICK ;GET JOYSTICK. 470 | 4790 CMP #13 ;PUSHED DOWN? 471 | 4800 BNE CHECK7 ;NO. BRANCH. 472 | 4810 LDA YPOS ;IS Y-COORD AT 473 | 4820 CMP #98 ;LOWER LIMIT? 474 | 4830 BNE FALL ;NO. BRANCH. 475 | 4840 BEQ CHECK8 ;YES. BRANCH. 476 | 4850 CHECK7 477 | 4860 CMP #14 ;PUSHED UP? 478 | 4870 BNE CHECK8 ;NO. BRANCH. 479 | 4880 LDA #$FF ;SET TO MOVE UP. 480 | 4890 ADDY 481 | 4900 CLC ;ADD MOVEMENT 482 | 4910 ADC YPOS ;DELTA TO BOP- 483 | 4920 STA YPOS ;OTRON'S Y-COORD 484 | 4930 STA YPOS+1 ;AND SAVE IT. 485 | 4940 CHECK8 486 | 4950 LDA CHAR ;GET CHARACTER # 487 | 4960 BEQ ALLDONE ;IF =0 QUIT. 488 | 4970 LDA FALLCOUNT ;IS FALLCOUNT 489 | 4980 CMP FALLCOUNT+1 ;OVER LIMIT? 490 | 4990 BCC CHECK9 ;NO. BRANCH. 491 | 5000 ZAP 492 | 5010 LDA #$01 ;STOP VBLANK & 493 | 5020 STA ACTIVATE ;INFORM BASIC. 494 | 5030 CHECK9 495 | 5040 LDA #$00 ;NOT FALLING. 496 | 5050 STA FALLCOUNT ;HALT COUNT. 497 | 5060 LDA STICK ;GET STICK. 498 | 5070 CMP #$07 ;MOVED RIGHT? 499 | 5080 BNE CHECK10 ;NO. BRANCH. 500 | 5090 LDA XPOS ;CHECK FOR END 501 | 5100 CMP #198 ;OF SCREEN OR 502 | 5110 BCS ALLDONE ;OBSTRUCTIONS. 503 | 5120 LDA CHAR ;IF ANY, DO NOT 504 | 5130 CMP #$08 ;ALLOW BOPOTRON 505 | 5140 BEQ ALLDONE ;TO MOVE RIGHT. 506 | 5150 CMP #12 ; 507 | 5160 BEQ ALLDONE ; 508 | 5170 LDA #$01 ;O.K. TO MOVE 509 | 5180 BNE ADDX ;RIGHT. BRANCH. 510 | 5190 CHECK10 511 | 5200 CMP #11 ;PUSHED LEFT? 512 | 5210 BNE ALLDONE ;NO BRANCH. 513 | 5220 LDA XPOS ;CHECK TO SEE IF 514 | 5230 CMP #47 ;BOPOTRON IS AT 515 | 5240 BCC ALLDONE ;SCREEN END OR 516 | 5250 LDA CHAR ;OBSTRUCTED. IF 517 | 5260 CMP #$09 ;SO DO NOT ALLOW 518 | 5270 BEQ ALLDONE ;MOVEMENT TO THE 519 | 5280 CMP #13 ;LEFT. 520 | 5290 BEQ ALLDONE ; 521 | 5300 LDA #$FF ;O.K. TO MOVE LEFT. 522 | 5310 ADDX 523 | 5320 CLC ;ADD RIGHT OR 524 | 5330 ADC XPOS ;LEFT DELTA TO 525 | 5340 STA XPOS ;BOPOTRON'S X- 526 | 5350 STA XPOS+1 ;COORD & SAVE. 527 | 5360 ALLDONE 528 | 5370 JMP XITVBV ;LATE HOME BOY... 529 | 5380 ; 530 | 5390 ; ***************************** 531 | 5400 ; * REDEFINED CHARACTER CHART * 532 | 5410 ; ***************************** 533 | 5420 ; 534 | 5430 ; CHAR # TYPE 535 | 5440 ; 536 | 5450 ; 0 BLANK SPACE 537 | 5460 ; ! 1 GIRDER 538 | 5470 ; " 2 GIRDER & LADDER (left) 539 | 5480 ; # 3 GIRDER & LADDER (middle) 540 | 5490 ; $ 4 GIRDER & LADDER (right) 541 | 5500 ; % 5 LADDER (left) 542 | 5510 ; & 6 LADDER (middle) 543 | 5520 ; ' 7 LADDER (right) 544 | 5530 ; ( 8 BATTERY (bottom left) 545 | 5540 ; ) 9 BATTERY (bottom right) 546 | 5550 ; * 10 BATTERY (top left) 547 | 5560 ; + 11 BATTERY (top right) 548 | 5570 ; , 12 POWER UNIT (bottom left) 549 | 5580 ; - 13 POWER UNIT (bottom right) 550 | 5590 ; . 14 POWER UNIT (top left) 551 | 5600 ; / 15 POWER UNIT (top right) 552 | 5610 ; 0 16 EXIT GIRDER 553 | -------------------------------------------------------------------------------- /Elevator Repairman.asm: -------------------------------------------------------------------------------- 1 | ; +----------------------+ 2 | ; | | 3 | ; | ELEVATOR REPAIRMAN | 4 | ; | | /\ 5 | ; | by Fred Caprilli | /UP\ 6 | ; | | |--| 7 | ; | (c) 1985 | \DN/ 8 | ; | | \/ 9 | ; | Analog Computing | 10 | ; | | 11 | ; +----------------------+ 12 | ; 13 | ; System equates 14 | ; 15 | VDSLST = $0200 16 | SDLSTL = $0230 17 | SDMCTL = $022F 18 | GRACTL = $D01D 19 | NMIEN = $D40E 20 | WSYNC = $D40A 21 | COLBAK = $D01A 22 | CHBASE = $D409 23 | PMBASE = $D407 24 | HSCROL = $D404 25 | VCOUNT = $D40B 26 | HPOSP0 = $D000 27 | HPOSP2 = $D002 28 | HPOSP3 = $D003 29 | COLRP0 = $02C0 30 | COLRP1 = $02C1 31 | COLRP2 = $02C2 32 | COLRP3 = $02C3 33 | SIZEP0 = $D008 34 | SIZEP1 = $D009 35 | SIZEP2 = $D00A 36 | SIZEP3 = $D00B 37 | SIZEM = $D00C 38 | RANDOM = $D20A 39 | SETVBV = $E45C 40 | XITVBV = $E462 41 | CONSOL = $D01F 42 | STICK = $D300 43 | P2PL = $D00E 44 | P3PL = $D00F 45 | M0PL = $D008 46 | M1PL = $D009 47 | M2PL = $D00A 48 | COLPF0 = $D016 49 | HITCLR = $D01E 50 | JIFFY = $14 51 | GPRIOR = $026F 52 | COLOR0 = $02C4 53 | COLOR1 = $02C5 54 | COLOR2 = $02C6 55 | SCOLBK = $02C8 56 | BOOT = $09 57 | COLDST = $0244 58 | DOSINI = $0C 59 | ATRACT = $4D 60 | DRKMSK = $4E 61 | COLRSH = $4F 62 | CHSET = $0600 63 | ; 64 | AUDF0 = $D200 65 | AUDF1 = $D202 66 | AUDC1 = $D203 67 | AUDF2 = $D204 68 | AUDC2 = $D205 69 | AUDF3 = $D206 70 | AUDC3 = $D207 71 | AUDCTL = $D208 72 | SKCTL = $D20F 73 | PACTL = $D302 74 | ; 75 | ; Player / Missile Area 76 | ; 77 | *= $3800 78 | ; 79 | PMAREA .DS $0300 80 | MAREA .DS $0100 81 | P0AREA .DS $0100 82 | P1AREA .DS $0100 83 | P2AREA .DS $0100 84 | P3AREA .DS $0100 85 | ; 86 | ; Page Zero Variables 87 | ; 88 | *= $80 89 | ; 90 | EHT .DS 2 ;P/M ht for elev 91 | EMSK .DS 1 ;msk to clr bits 92 | D1S .DS 2 ;climb fr height 93 | D2S .DS 2 ;same (P3) 94 | D1D .DS 2 ;climb to height 95 | D2D .DS 2 ;same (P3) 96 | DAN1 .DS 2 ;P/M pg. Dan (P2) 97 | DAN2 .DS 2 ;P/M pg. Dan (P3) 98 | ESP .DS 2 ;speed tbl pntr 99 | COFSET .DS 1 ;DLI tbl offset 100 | ESPEED .DS 7 ;elevator speeds 101 | LEVEL .DS 1 ;level no. 102 | FLOOR .DS 1 ;current floor 103 | CLIMBF .DS 1 ;Dan climbing flg 104 | DIEFLAG .DS 1 ;indicates dying 105 | NEWLVL .DS 1 ;flags new level 106 | SCORE .DS 3 ;score in BCD 107 | OVERFLG .DS 1 ;game over status 108 | HITES .DS 7 ;elevator heights 109 | DIR .DS 7 ;elevator dirs 110 | DANHOR .DS 1 ;Dan's hor pos 111 | CLIMBHT .DS 1 ;climb height 112 | DANDIR .DS 1 ;Dan's direction 113 | DANSPD .DS 1 ;Dan's speed 114 | SPDCNT .DS 1 ;speed counter 115 | ELDLAY .DS 1 ;elev # to stall 116 | DLYCNT .DS 1 ;death delay 117 | COLCNT .DS 1 ;color counter 118 | TIME .DS 4 ;time in BCD 119 | BASCNT .DS 1 ;Bass note cntr 120 | BASTIM .DS 1 ;Bass timer 121 | TRBCNT .DS 1 ;Treble counter 122 | TRBTIM .DS 1 ;Treble timer 123 | ; 124 | ; Game starts here 125 | ; 126 | *= $2000 127 | ; 128 | INIT LDA #$3C ;cassette off 129 | STA PACTL ;if necessary 130 | LDA #0 131 | STA COLDST ;Warm start 132 | LDA #1 133 | STA BOOT ;Disk boot OK 134 | LDA # RST 137 | STA DOSINI+1 ;Trap S/RESET 138 | JSR CLRHI ;clear hiscore 139 | RST CLD ;just in case 140 | JSR TITLE ;Title screen 141 | JSR ZERO ;init. variables 142 | JSR SLEVEL 143 | JSR SETUP ;main display 144 | JSR INITIM ;reset timer 145 | ; 146 | ; Mainline (non-VBI) code 147 | ; 148 | MAIN LDA OVERFLG ;Game over? 149 | BEQ MN1 ;No. 150 | LDA #8 ;Yes, so clear 151 | STA CONSOL ;CONSOL and 152 | MN0 LDA CONSOL ;poll START key 153 | EOR #6 ;Is it pressed? 154 | BNE MN0 ;No. 155 | STA OVERFLG ;Yes, zero flag 156 | LDA #7 ;back to 157 | LDY # XITVBV ;routine 159 | JSR SETVBV 160 | JMP RST ;and start at top 161 | MN1 LDA NEWLVL ;Check new level 162 | BEQ MAIN ;Not yet, loop 163 | JSR SLEVEL ;Yes, new level 164 | JMP MAIN ;and loop back 165 | ; 166 | ; End of Mainline code 167 | ; 168 | SETUP LDX #0 169 | STX SDMCTL ;Disable DMA 170 | LDA #$40 171 | STA NMIEN ;Disable DLI 172 | LDA # DLIST ;the game 175 | STA SDLSTL+1 ;display list 176 | LDA # DLI1 179 | STA VDSLST+1 180 | LDY # VBI 182 | LDA #7 ;Deferred 183 | JSR SETVBV 184 | LDA #$3D ;P/M enable, and 185 | STA SDMCTL ;narrow playfield 186 | LDA #$C0 187 | STA NMIEN ;enable DLI's 188 | LDA #$0A ;white 189 | STA COLOR0 ;for stairs 190 | LDA #$00 ;black 191 | STA COLOR1 ;for shafts 192 | STA SCOLBK ;and screen top. 193 | STA BASCNT ;bass notes index 194 | LDA #$CC ;green 195 | STA COLOR2 ;for digits 196 | ; 197 | LDA #$50 ;16-bit ch. 0/1 198 | STA AUDCTL ;8-bit ch. 2,3 199 | LDA #3 200 | STA SKCTL ;reset POKEY 201 | LDA #$AA ;vol.10, dist.10 202 | STA AUDC1 203 | STA AUDC2 204 | STA AUDC3 205 | LDA #$FF 206 | STA TRBTIM ;timer for treble 207 | STA TRBCNT ;treble note cntr 208 | LDA #14 209 | STA BASTIM ;timer for bass 210 | ; 211 | ; Download charset to page 6 212 | ; 213 | LDX #55 ;# of bytes 214 | CDL LDA CSETB,X 215 | STA CHSET,X 216 | DEX 217 | BPL CDL 218 | RTS 219 | ; 220 | ZERO LDA #0 ;zero variables 221 | LDX #OVERFLG-COFSET 222 | Z1 STA COFSET,X 223 | DEX 224 | BPL Z1 225 | LDA #2 ;Dan moves... 226 | STA DANSPD ;every other VBI 227 | LDA #$90 ;ATASCII inv "0" 228 | LDX #5 229 | L1 STA SSCORE,X ;0 score 230 | DEX 231 | BPL L1 232 | STA LEVBYTE ;level 0 233 | LDA #$FF 234 | STA DANDIR ;no initial dir. 235 | LDA #$99 ;digit 9 on 236 | STA MENBYT ;screen - 9 men 237 | LDA # TLINE 240 | STA MSG+1 ;Top shows timer 241 | RTS 242 | ; 243 | CLRHI LDX #5 ;hi to 000000 244 | LDA #$90 245 | CR1 STA HISCORE,X 246 | DEX 247 | BPL CR1 248 | RTS 249 | ; 250 | PMSETUP LDA # >PMAREA 251 | STA PMBASE ;to P/M area 252 | LDA #3 253 | STA GRACTL ;enable P/M DMA 254 | LDA #0 ;clear P/M area 255 | TAY 256 | CLN STA MAREA,Y 257 | STA P0AREA,Y 258 | STA P1AREA,Y 259 | STA P2AREA,Y 260 | STA P3AREA,Y 261 | DEY 262 | BNE CLN 263 | ; 264 | LDY #7 ;8 P/M locs 265 | INITPM LDA ELEPOS,Y ;init P/M 266 | STA HPOSP0,Y ;horizontal pos 267 | DEY ;next P/M 268 | BPL INITPM ;done? No. 269 | LDA #64 270 | STA DANHOR 271 | ; 272 | JSR SETHTS ;elev heights 273 | ; 274 | LDA #$7A ;Set P/M colors 275 | STA COLRP0 276 | LDA #$F8 277 | STA COLRP1 278 | LDA #$48 279 | STA COLRP2 280 | LDA #$90 281 | STA COLRP3 282 | ; 283 | LDA #$3F ;P/M widths 284 | STA SIZEP0 ;quadruple for 285 | STA SIZEP1 ;elevators (P0, 286 | STA SIZEM ;P1,M0-M2) 287 | LDA #0 ;single for 288 | STA SIZEP2 ;Dan 289 | STA SIZEP3 ;(P2,P3) 290 | LDA #$21 291 | STA GPRIOR ;Multicolor PL 292 | LDA # >P2AREA ;Set up zero 293 | STA DAN1+1 ;page pointers 294 | STA D1S+1 295 | STA D1D+1 296 | LDA # >P3AREA 297 | STA DAN2+1 298 | STA D2S+1 299 | STA D2D+1 300 | RTS 301 | ; 302 | ; The Display list interrupt routines 303 | ; 304 | DLI1 PHA ;Save registers 305 | TXA 306 | PHA 307 | LDX # >CHSET ;new charset 308 | LDA #$C2 309 | STA WSYNC 310 | STX CHBASE 311 | EOR COLRSH ;mask attract 312 | AND DRKMSK 313 | STA WSYNC 314 | STA COLBAK ;change color 315 | LDA # >DLI2 316 | STA VDSLST+1 317 | LDA # DLI1 348 | STA VDSLST+1 349 | EX PLA 350 | TAX 351 | PLA ;Restore registers. 352 | RTI 353 | ; 354 | ; The Vertical Blank routine 355 | ; 356 | VBI LDA OVERFLG ;Skip VBI if 357 | BEQ V0 ;game over. 358 | JMP XVB 359 | V0 LDA DIEFLAG ;Dan dying? 360 | BNE DAN ;Yes, skip elevs 361 | ; 362 | ; Check screen heights for elevators 363 | ; and reverse direction if necessary 364 | ; 365 | C3 LDX #6 ;do 7 elevator 366 | C0 LDA HITES,X 367 | CMP #32 ;At top? 368 | BPL C1 ;No. skip 369 | CMP #68 ;Intermediate 370 | BPL C1 371 | LDA #1 ;Going down! 372 | BNE C2A 373 | ; 374 | C1 CMP #159 ;intermediate 375 | BMI C2 376 | CMP #193 ;At bottom? 377 | BMI C2 ;No. no change 378 | LDA #0 ;Yes, going up! 379 | C2A STA DIR,X 380 | C2 DEX ;next elevator 381 | BPL C0 ;done? No. 382 | ; 383 | ; Now set up for movement of elevators 384 | ; 385 | LDX #6 ;do 7 elevators 386 | M1 CPX ELDLAY ;slow it down? 387 | BNE M2 ;No. 388 | LDA DLYCNT ;Yes. 389 | BEQ M2 ;Delay over yet? 390 | DEC DLYCNT ;No. 391 | LDA DLYCNT ;count down one 392 | AND #3 ;and skip a turn 393 | BEQ M5 ;every 1/15 sec. 394 | M2 LDA ELOCS,X ;P/M page 395 | STA EHT+1 396 | LDA HITES,X ;byte loc in page 397 | STA EHT 398 | LDA EMASKS,X ;Get mask 399 | EOR #$FF ;save its inverse 400 | STA EMSK 401 | LDA DIR,X ;0=up, 1=down 402 | BEQ UP 403 | ; 404 | ; Set up for down movement 405 | ; 406 | LDA ESPEED,X ;elevator speed 407 | BEQ D1 408 | INC HITES,X 409 | INC EHT ;double speed 410 | D1 INC HITES,X 411 | INC EHT ;normal speed 412 | JMP M4 413 | ; 414 | ; Set up for up movement 415 | ; 416 | UP LDA ESPEED,X 417 | BEQ U1 418 | DEC HITES,X 419 | DEC EHT ;double speed 420 | U1 DEC HITES,X 421 | DEC EHT ;normal speed 422 | ; 423 | ; Execute the movement 424 | ; 425 | M4 JSR MV ;move the bytes 426 | M5 DEX ;next elevator 427 | BPL M1 ;done? No. 428 | ; 429 | LDA JIFFY ;Stall elevator? 430 | BNE DAN ;(when JIFFY=0) 431 | JSR ELNEW 432 | ; 433 | ; Elevators done. Now, we process 434 | ; Dan the Elevator Repair Man. 435 | ; 436 | DAN LDA CLIMBF ;climbing? 437 | BEQ VB1 ;No. 438 | JSR CLIMB1 ;Yes, move him up 439 | JMP DANEND ;and exit. 440 | VB1 LDA DIEFLAG ;Presently dying? 441 | BEQ VB2 ;No. skip 442 | JSR DEATH ;Yes. keep dying 443 | JMP XVB ;and exit. 444 | VB2 LDY FLOOR 445 | LDA STAIRS,Y ;Has he reached 446 | CMP DANHOR ;the stairs? 447 | BNE VB4 ;No. 448 | CPY #10 ;Top floor? 449 | BMI VB3 ;No, climb stairs 450 | JSR ENDLEV ;Yes, so end it 451 | JMP DANEND ;and exit. 452 | VB3 JSR SCLIMB ;init climbing 453 | JMP DANEND ;and exit. 454 | VB4 JSR HITCHK ;Chk collision 455 | BEQ VB5 ;Dan hit? No. 456 | LDA #120 ;Yes, start 120 457 | STA DIEFLAG ;jiffy death... 458 | BNE DANEND ;and exit 459 | ; 460 | ; If we make it to here, it means our 461 | ; hero is either starting or in the 462 | ; midst of his perilous trek across 463 | ; the screen. 464 | ; 465 | VB5 INC SPDCNT ;Speed counter 466 | LDA SPDCNT 467 | CMP DANSPD ;Time to move? 468 | BMI DANEND ;No, so exit. 469 | LDA #0 470 | STA SPDCNT ;Zero the counter 471 | LDX DANDIR ;Save old dir 472 | JSR JOY ;dir change? 473 | CPX DANDIR 474 | BEQ MOVEDAN ;No, skip 475 | JSR DRAWDAN ;Yes, redraw him 476 | MOVEDAN LDA DANDIR 477 | BMI DANEND ;Wait on joystick 478 | LDY FLOOR 479 | LDA STARTS,Y ;Is Dan at start 480 | CMP DANHOR ;of floor? 481 | BEQ F3 ;Yes, skip next 482 | CLC ;animate feet 483 | LDA DANHT,Y 484 | ADC #15 ;Bottom of Dan 485 | TAY ;for feet. 486 | LDA JIFFY 487 | AND #7 ;Mod 8 counter 488 | CMP #4 ;at 4 jiffies? 489 | BMI F2 490 | LDA #$18 ;"feet in" byte 491 | BNE F3A 492 | F2 LDA #$24 ;"feet out" byte 493 | F3A STA P2AREA,Y 494 | F3 LDA DANDIR 495 | ROR A ;Right or left? 496 | BCC MVRT ;Right (DANDIR=0) 497 | LDA DANHOR ;trying to pass 498 | CMP #$40 ;left edge? 499 | BEQ DANEND ;Yes, stop him 500 | DEC DANHOR ;Dec horizontal 501 | JMP MVLF 502 | MVRT LDA DANHOR ;Trying to pass 503 | CMP #$B8 ;right edge? 504 | BEQ DANEND ;Yes, stop him 505 | INC DANHOR ;No, so move it 506 | MVLF LDA DANHOR ;position shadow 507 | STA HPOSP2 ;and do the 508 | STA HPOSP3 ;horizontal move 509 | ; 510 | DANEND JSR TIMER ;Do the timer 511 | JSR MUSIC ;Do the music 512 | XVB STA HITCLR ;clr collisions 513 | JMP XITVBV ;and finish VBI! 514 | ; 515 | ; Subroutines 516 | ; ----------- 517 | ; 518 | ; Pick an elevator to stall [0-6] 519 | ; 520 | ELNEW LDA RANDOM 521 | AND #7 ;0-7 522 | CMP #7 523 | BEQ ELNEW ;0-6 524 | STA ELDLAY 525 | LDA #$80 526 | STA DLYCNT 527 | RTS 528 | ; 529 | ; Animate the elevators - on entry, 530 | ; (EHT) pointS to the pertinent P/M 531 | ; area, and EMSK contains inverse bit 532 | ; mask, to zero out bits (tops and 533 | ; bottoms of elevators). Elevators 534 | ; are 12 solid lines plus 2 blanks on 535 | ; top and 2 on bottom. 536 | ; 537 | MV LDY #15 ;16 bytes 538 | JSR V2 ;15-14 (bottom) 539 | DEY 540 | V1 LDA (EHT),Y ;lines 13 to 2 541 | AND EMSK ;Clr current bits 542 | ORA EMASKS,X ;set new ones 543 | STA (EHT),Y 544 | DEY 545 | CPY #1 546 | BNE V1 547 | V2 LDA (EHT),Y ;line 1 548 | AND EMSK ;Zero out bits 549 | STA (EHT),Y ;with mask 550 | DEY 551 | LDA (EHT),Y ;line 0 (top) 552 | AND EMSK 553 | STA (EHT),Y 554 | RTS 555 | ; 556 | ; Generate elevator starting heights 557 | ; 558 | SETHTS LDX #6 ;7 elevators 559 | SH1 LDA RANDOM 560 | AND #$3F ;0-63 561 | ASL A ;0-126 even 562 | ADC #40 ;40-166 even 563 | STA HITES,X 564 | DEX 565 | BPL SH1 566 | RTS 567 | ; 568 | ; This subroutine updates the 569 | ; countdown timer, and puts it to 570 | ; the screen 571 | ; 572 | TIMER LDA CLIMBF ;Don't time 573 | BNE TI1 ;if climbing 574 | LDA TIME+2 575 | BNE TI0 576 | LDA TIME+1 577 | AND #$0F 578 | BEQ TI1 ;If 0 don't dec 579 | TI0 SED ;Decimal math 580 | SEC 581 | LDA TIME+3 ;Fractional byte 582 | SBC #17 ;approx. 0.1 sec 583 | STA TIME+3 ;(rolls over 584 | LDA TIME+2 ;every 6 jiffies) 585 | SBC #0 586 | STA TIME+2 587 | LDA TIME+1 588 | SBC #0 589 | STA TIME+1 590 | CLD 591 | ; 592 | LDA TIME+2 ;Take 3-byte (6 593 | AND #$0F ;decimal digit), 594 | ORA #$90 ;take the low 3 595 | STA TLINE+8 ;digits and put 596 | LDA TIME+2 ;to the screen. 597 | LSR A ;move high nybble 598 | LSR A ;for 2nd decimal 599 | LSR A ;digit down to 600 | LSR A ;low nybble 601 | ORA #$90 ;make it ATASCII 602 | STA TLINE+7 ;put to screen 603 | LDA TIME+1 ;we only want low 604 | AND #$0F ;nybble here 605 | STA TIME+1 ;(3 digits total) 606 | ORA #$90 ;make it ATASCII 607 | STA TLINE+6 ;put to screen 608 | LDA #0 609 | STA TIME ;not used 610 | TI1 RTS 611 | ; 612 | ; This subroutine updates the scoring 613 | ; when Dan reaches a new floor 614 | ; 615 | SCORING LDX #3 ;3-byte (6-digit) 616 | SED ;decimal add 617 | CLC 618 | SC1 DEX 619 | LDA SCORE,X 620 | ADC TIME,X 621 | STA SCORE,X 622 | TXA 623 | BNE SC1 624 | CLD 625 | STA TIME ;Zero out timer 626 | STA TIME+1 627 | STA TIME+2 628 | STA TIME+3 629 | LDX #2 630 | LDY #5 631 | SC2 LDA SCORE,X 632 | PHA ;Save it 633 | AND #$0F ;low nybble 634 | ORA #$90 ;make it ATASCII 635 | STA SSCORE,Y ;put on screen 636 | PLA ;use same byte 637 | LSR A ;high nybble 638 | LSR A ;we move it 639 | LSR A ;down to 640 | LSR A ;low nybble 641 | ORA #$90 ;make it ATASCII 642 | DEY 643 | STA SSCORE,Y ;put to screen 644 | DEY 645 | DEX 646 | BPL SC2 647 | RTS 648 | ; 649 | ; This subroutine reads the joystick. 650 | ; 651 | JOY LDA STICK ;Read joystick 652 | AND #8 ;Right? 653 | BEQ JLR ;Yes. 654 | LDA STICK 655 | AND #4 ;No. left? 656 | BNE JE ;No, dir same 657 | LDA #1 ;1 = left 658 | JLR STA DANDIR 659 | JE RTS 660 | ; 661 | ; This subroutine updates the score 662 | ; and sets up the climb. 663 | ; 664 | SCLIMB JSR SCORING ;Update score 665 | LDA #16 ;16 scan lines 666 | STA CLIMBF ;to climb. 667 | LDY FLOOR ;index to screen. 668 | LDA DANHT,Y ;height table 669 | STA CLIMBHT ;start climb here 670 | RTS 671 | ; 672 | ; This subroutine makes Dan climb 1 673 | ; scan line per VBI (if CLIMBF<>0). 674 | ; It continues into the INITIM 675 | ; subroutine. 676 | ; 677 | CLIMB1 LDY #0 678 | LDA CLIMBHT ;Set up zero page 679 | STA D1S ;pointers 680 | STA D2S 681 | DEC CLIMBHT ;destination is 682 | LDA CLIMBHT ;one scan line up 683 | STA D1D 684 | STA D2D 685 | CL1 LDA (D1S),Y ;Move P2 up one. 686 | STA (D1D),Y 687 | LDA (D2S),Y ;Move P3 up one. 688 | STA (D2D),Y 689 | INY 690 | CPY #16 ;All bytes moved? 691 | BMI CL1 ;No. 692 | LDA #0 ;Erase last line 693 | STA (D1D),Y 694 | STA (D2D),Y 695 | DEC CLIMBF 696 | BNE INITIM ;Is climb over? 697 | INC FLOOR ;Yes, new floor. 698 | ; 699 | ; This subroutine sets timer to 250 700 | ; 701 | INITIM LDA #0 ;250 decimal 702 | STA TIME 703 | LDA #2 704 | STA TIME+1 705 | LDA #$50 706 | STA TIME+2 707 | LDA #$92 ;"2" 708 | STA TLINE+6 709 | LDA #$95 ;"5" 710 | STA TLINE+7 711 | LDA #$90 ;"0" 712 | STA TLINE+8 713 | RTS 714 | ; 715 | ; This subroutine sets up a new level, 716 | ; speeds of elevators and Dan, timer, 717 | ; Dan on bottom, increased level no. 718 | ; 719 | SLEVEL LDY LEVEL 720 | CPY #7 ;Level 7 or more? 721 | BMI SL0 ;No. 722 | LDA #1 ;Yes, so we have 723 | STA DANSPD ;superfast Dan. 724 | SL0 CPY #4 ;Level 4 or more? 725 | BMI SL1 ;No. 726 | LDY #4 ;Yes, lev.4 speed 727 | SL1 TYA 728 | ASL A 729 | TAY ;Lev *2 index 730 | LDA LEVSPD,Y ;elev speed tbl 731 | STA ESP ;init 0 page pntr 732 | INY 733 | LDA LEVSPD,Y 734 | STA ESP+1 735 | LDY #6 ;Download elev 736 | SL2 LDA (ESP),Y ;speeds to 737 | STA ESPEED,Y ;zero page tbl 738 | DEY 739 | BPL SL2 740 | JSR PMSETUP ;reset P/M gr 741 | LDA #0 742 | STA FLOOR ;floor 0 743 | JSR SFLOOR 744 | JSR INITIM 745 | LDA LEVEL 746 | ORA #$90 ;make it ATASCII 747 | STA LEVBYTE ;put to screen. 748 | LDA #0 749 | STA NEWLVL ;Turn off flag. 750 | RTS 751 | ; 752 | SFLOOR LDY FLOOR ;find hor. start 753 | LDA STARTS,Y 754 | STA HPOSP2 ;put Dan there. 755 | STA HPOSP3 756 | STA DANHOR 757 | JSR DRAWDAN ;Draw him 758 | LDA #0 759 | STA ATRACT ;defeat attract 760 | LDA #$FF 761 | STA DANDIR ;no initial dir. 762 | RTS 763 | ; 764 | DRAWDAN LDY FLOOR ;index to height 765 | LDA DANHT,Y ;tbl corresponds 766 | STA DAN1 ;to P/M memory 767 | STA DAN2 ;'height' 768 | LDY #15 ;draw 16 bytes 769 | LDA DANDIR 770 | ROR A ;Right or left? 771 | BCS S2 772 | ; 773 | ; Draw Dan facing right 774 | ; 775 | S1 LDA DANRT1,Y ;P2 data 776 | STA (DAN1),Y 777 | LDA DANRT2,Y ;P3 data 778 | STA (DAN2),Y 779 | DEY 780 | BPL S1 781 | RTS 782 | ; 783 | ; Draw Dan facing left 784 | ; 785 | S2 LDA DANLF1,Y ;P2 data 786 | STA (DAN1),Y 787 | LDA DANLF2,Y ;P3 data 788 | STA (DAN2),Y 789 | DEY 790 | BPL S2 791 | RTS 792 | ; 793 | ; Death subroutine - flip-flop Dan 794 | ; for 1 second, then freeze for 1 795 | ; second. If no lives are left, 796 | ; it ends the game. 797 | ; 798 | DEATH LDA #0 799 | STA AUDF0 800 | STA AUDF1 801 | STA AUDF2 ;Silence music 802 | DEC DIEFLAG ;lower counter 803 | LDA DIEFLAG ;Done yet? 804 | BEQ DE2 ;Yes. 805 | CMP #60 ;time for freeze? 806 | BPL DE8 ;No. 807 | LDA #0 ;Yes... 808 | STA AUDF3 ;silence 809 | RTS ;skip flip-flop. 810 | DE8 AND #3 ;No, flip Dan 811 | BNE DE3 ;every 4 jiffies 812 | LDA DANDIR 813 | BEQ DE1 814 | JSR DRAWDAN ;flip left 815 | LDA #0 ;and set up for 816 | STA DANDIR ;right flip 817 | LDA #$20 ;high note 818 | BNE DE0 819 | DE1 JSR DRAWDAN ;flip right 820 | LDA #1 ;and set up for 821 | STA DANDIR ;left flip 822 | LDA #$40 ;low note 823 | DE0 STA AUDF3 824 | RTS 825 | ; 826 | ; Death over 827 | ; 828 | DE2 JSR SFLOOR ;put Dan back 829 | DEC MENBYT ;One less man... 830 | LDA MENBYT ;Any men left? 831 | AND #$0F 832 | BNE DE3 ;Yes, continue. 833 | LDA # OVERLN ;LMS to show 836 | STA MSG+1 ;"GAME OVER" 837 | LDA #1 ;set flag 838 | STA OVERFLG 839 | LDX #0 ;Compare score to 840 | DE4 LDA SSCORE,X ;high score 841 | CMP HISCORE,X ;digit by digit 842 | BMI DE3 ;lt?, no change 843 | BNE DE5 ;gt?, update hi 844 | INX ;next digit 845 | CPX #6 846 | BMI DE4 847 | RTS 848 | DE5 LDX #5 849 | DE6 LDA SSCORE,X ;Move score 850 | STA HISCORE,X ;to high score 851 | DEX 852 | BPL DE6 853 | DE3 RTS 854 | ; 855 | ; This subroutine does collision 856 | ; detection. 857 | ; 858 | HITCHK LDA P2PL ;Did P2 859 | ORA P3PL ;or P3 hit 860 | AND #3 ;elev 0,1,5,6? 861 | BNE ENDCHK ;Yes, Dan's dead. 862 | LDA M0PL ;Did M0 (elev 2) 863 | ORA M1PL ;or M1 (elev 3) 864 | ORA M2PL ;or M2 (elev 4)? 865 | AND #$0C 866 | ENDCHK STA HITCLR ;Clear collision 867 | RTS 868 | ; 869 | ENDLEV JSR SCORING ;update score 870 | INC LEVEL ;on to next level 871 | LDA #1 ;Flag so mainline 872 | STA NEWLVL ;code can set up 873 | RTS ;a new level 874 | ; 875 | ; This subroutine produces the title 876 | ; screen, and waits for START. 877 | ; 878 | TITLE LDA #0 879 | STA SDMCTL ;disable DMA 880 | STA COLOR0 ;black letters 881 | LDA # TDLIST ;for title 884 | STA SDLSTL+1 ;screen 885 | LDA #$3D ;narrow playfield 886 | STA SDMCTL 887 | LDA #$0E ;white letters 888 | STA COLOR1 889 | LDA #4 ;center titles 890 | STA HSCROL 891 | X1 LDA VCOUNT ;rainbow backgrnd 892 | BNE X1 ;wait for line 0 893 | TAY ;and keep track 894 | LDX COLCNT ;colour counter 895 | X2 STA WSYNC ;sync to TV line 896 | STA COLBAK ;store in reg 897 | INX ;inc color # 898 | TXA 899 | AND #$F0 ;but make it 900 | ORA #$08 ;luminance 8 901 | INY 902 | CPY #$F0 ;screen bottom? 903 | BNE X2 ;No. 904 | ; 905 | ; Now increase the starting colour for 906 | ; next TV frame, produces scrolling 907 | ; rainbow effect 908 | ; 909 | INC COLCNT 910 | LDA #8 ;We have some 911 | STA CONSOL ;time left to 912 | LDA CONSOL ;check for START 913 | EOR #6 ;Pushed? 914 | BEQ X3 ;Yes, so exit 915 | STA WSYNC ;keep stuffing 916 | STA COLBAK 917 | BNE X1 ;Infinite loop 918 | X3 RTS ;unless sent here 919 | ; 920 | ; This subroutine plays the music. 921 | ; 922 | MUSIC LDA BASTIM ;New note time? 923 | BPL BN0 ;No. 924 | LDA #14 ;all notes 925 | STA BASTIM ;are 15 jiffies. 926 | INC BASCNT 927 | BN0 LDA BASCNT ;Get the note. 928 | AND #7 ;mod 8 counter 929 | TAY 930 | LDA BASSLO,Y ;Bass is 16-bit 931 | STA AUDF0 ;sound, so stuff 932 | LDA BASSHI,Y ;lo and hi bytes 933 | STA AUDF1 ;in channels 0,1 934 | LDX BASTIM 935 | LDA BASENV,X 936 | STA AUDC1 ;Apply envelope 937 | DEC BASTIM ;dec. duration 938 | ; 939 | ; Melody (Treble) 940 | ; 941 | LDA TRBTIM ;Note timer done? 942 | BPL TN1 ;No. 943 | INC TRBCNT ;Yes - inc cntr 944 | LDY TRBCNT ;Are we at... 945 | CPY #26 ;end of tune? 946 | BMI TN0 ;No. 947 | LDA #$FF ;Yes, reset 948 | STA TRBCNT ;counter 949 | BNE TN2 950 | TN0 LDA TRBDUR,Y ;load the 951 | STA TRBTIM ;duration 952 | TN1 LDY TRBCNT 953 | LDA TREBLE,Y ;Play the note.. 954 | STA AUDF2 955 | DEC TRBTIM ;and dec timer. 956 | TN2 RTS 957 | ; 958 | ; Various Data Tables 959 | ; 960 | ELEPOS .BYTE 72,160,64,64 961 | .BYTE 108,124,140,0 962 | COLORS .BYTE $82,$22,$B2,$42,$12,$52 963 | .BYTE $72,$32,$62,$E4,$06 964 | EMASKS .BYTE $C0,$0C,$03,$0C 965 | .BYTE $30,$C0,$0C 966 | ELOCS .BYTE >P0AREA,>P0AREA 967 | .BYTE >MAREA,>MAREA 968 | .BYTE >MAREA,>P1AREA 969 | .BYTE >P1AREA 970 | STARTS .BYTE $40,$B8,$40,$B8,$40 971 | .BYTE $B8,$40,$B8,$40,$B8,$40 972 | STAIRS .BYTE $B8,$40,$B8,$40,$B8 973 | .BYTE $40,$B8,$40,$B8,$40,$B8 974 | ESPED1 .BYTE 0,0,0,0,0,0,0 975 | ESPED2 .BYTE 0,1,0,0,1,0,0 976 | ESPED3 .BYTE 1,1,0,1,0,1,0 977 | ESPED4 .BYTE 0,1,1,1,1,0,1 978 | ESPED5 .BYTE 1,1,1,1,1,1,1 979 | ; 980 | LEVSPD .WORD ESPED1,ESPED2,ESPED3 981 | .WORD ESPED4,ESPED5 982 | ; 983 | ; Vertical height of tops of floors 984 | ; 985 | DANHT .BYTE $C0,$B0,$A0,$90 986 | .BYTE $80,$70,$60,$50 987 | .BYTE $40,$30,$20 988 | ; 989 | DANLF1 .BYTE $00,$0F,$3F,$1C 990 | .BYTE $34,$7D,$7D,$6F 991 | .BYTE $06,$02,$1E,$3F 992 | .BYTE $3F,$3F,$1E,$0C 993 | DANLF2 .BYTE $00,$0F,$3F,$03 994 | .BYTE $0B,$02,$02,$10 995 | .BYTE $18,$0E,$1E,$3D 996 | .BYTE $39,$39,$1E,$00 997 | DANRT1 .BYTE $00,$78,$7E,$1C 998 | .BYTE $16,$5F,$5F,$7B 999 | .BYTE $30,$20,$3C,$7E 1000 | .BYTE $7E,$7E,$3C,$18 1001 | DANRT2 .BYTE $00,$78,$7E,$60 1002 | .BYTE $68,$20,$20,$04 1003 | .BYTE $0C,$38,$3C,$5E 1004 | .BYTE $4E,$4E,$3C,$00 1005 | ; 1006 | TLINE .SBYTE " " 1007 | .SBYTE +$80,"000" 1008 | .SBYTE " " 1009 | TOPLINE .BYTE 1,$46,0,$46,0,0,$41,0 1010 | .BYTE $41,0,$41,0,$46,0,$46,5 1011 | LLINE .BYTE 3,$46,0,$46,0,0,$41,0 1012 | .BYTE $41,0,$41,0,$46,0,$46,2 1013 | RLINE .BYTE 1,$46,0,$46,0,0,$41,0 1014 | .BYTE $41,0,$41,0,$46,0,$46,4 1015 | INFOLN .SBYTE "SC " 1016 | SSCORE .SBYTE +$80,"000000" 1017 | .SBYTE " MEN " 1018 | MENBYT .SBYTE +$80,"0" 1019 | .SBYTE " HI " 1020 | HISCORE .SBYTE +$80,"000000" 1021 | .SBYTE " LEV " 1022 | LEVBYTE .SBYTE +$80,"0" 1023 | OVERLN .SBYTE " GAME OVER " 1024 | ; 1025 | ; Music Data 1026 | ; 1027 | BASSLO .BYTE $6B,$6B,$96,$6B 1028 | .BYTE $EA,$6B,$03,$64 1029 | BASSHI .BYTE $35,$35,$2F,$35 1030 | .BYTE $2C,$35,$28,$2A 1031 | BASENV .BYTE $A2,$A6,$AA,$A8 1032 | .BYTE $A8,$A8,$A8,$A8 1033 | .BYTE $A8,$A8,$A7,$A5 1034 | .BYTE $A3,$A0,$A0 1035 | TREBLE .BYTE 68,81,0,68,40,57,0,81 1036 | .BYTE 68,60,57,0,57,0,57,0 1037 | .BYTE 57,60,68,81,91,81,108 1038 | .BYTE 96,0,0 1039 | TRBDUR .BYTE 114,34,89,114,19,19,99 1040 | .BYTE 14,14,14,19,0,18,0,18 1041 | .BYTE 0,18,19,19,19,19,19,14 1042 | .BYTE 14,127,80 1043 | ; 1044 | ; The Game Display List 1045 | ; 1046 | DLIST .BYTE $70,$70,$C6 1047 | MSG .WORD TLINE 1048 | .BYTE $C7 1049 | .WORD TOPLINE 1050 | .BYTE $C7 1051 | .WORD LLINE 1052 | .BYTE $C7 1053 | .WORD RLINE 1054 | .BYTE $C7 1055 | .WORD LLINE 1056 | .BYTE $C7 1057 | .WORD RLINE 1058 | .BYTE $C7 1059 | .WORD LLINE 1060 | .BYTE $C7 1061 | .WORD RLINE 1062 | .BYTE $C7 1063 | .WORD LLINE 1064 | .BYTE $C7 1065 | .WORD RLINE 1066 | .BYTE $C7 1067 | .WORD LLINE 1068 | .BYTE $C7 1069 | .WORD RLINE 1070 | .BYTE $10,$46 1071 | .WORD INFOLN 1072 | .BYTE $06,$41 1073 | .WORD DLIST 1074 | ; 1075 | ; Title Screen Display List 1076 | ; 1077 | TDLIST .BYTE $70,$70,$70,$70 1078 | .BYTE $70,$70,$47 1079 | .WORD GAME 1080 | .BYTE $70,$17,$70,$70,$46 1081 | .WORD AUTHOR 1082 | .BYTE $70,$70,$46 1083 | .WORD COPYR 1084 | .BYTE $70,$06,$70,$70,$56 1085 | .WORD INSTR 1086 | .BYTE $70,$70,$41 1087 | .WORD TDLIST 1088 | ; 1089 | GAME .SBYTE " ELEVATOR " 1090 | .SBYTE " REPAIRMAN " 1091 | AUTHOR .SBYTE "BY FRED CAPRILLI" 1092 | COPYR .SBYTE " (C) 1985 " 1093 | .SBYTE "ANALOG COMPUTING" 1094 | INSTR .SBYTE " press" 1095 | .SBYTE " start " 1096 | ; 1097 | ;MODIFIED CHARACTER SET 1098 | ; 1099 | CSETB .BYTE $00,$00,$00,$00 1100 | .BYTE $00,$00,$00,$00 1101 | .BYTE $80,$80,$80,$80 1102 | .BYTE $80,$80,$80,$80 1103 | .BYTE $01,$01,$01,$01 1104 | .BYTE $01,$01,$01,$01 1105 | .BYTE $80,$FF,$80,$FF 1106 | .BYTE $80,$FF,$80,$FF 1107 | .BYTE $01,$FF,$01,$FF 1108 | .BYTE $01,$FF,$01,$FF 1109 | .BYTE $3C,$7E,$7E,$E7 1110 | .BYTE $E7,$FF,$FF,$FF 1111 | .BYTE $08,$08,$08,$08 1112 | .BYTE $08,$08,$08,$08 1113 | ; 1114 | *= $02E0 1115 | ; 1116 | .WORD INIT 1117 | .END 1118 | -------------------------------------------------------------------------------- /Harvey.asm: -------------------------------------------------------------------------------- 1 | ; ====================================== 2 | ; HARVEY WALLBANGER by Charles Bachand 3 | ; ====================================== 4 | 5 | ; ====================================== 6 | ; Copyright (C) 1982 ANALOG Magazine 7 | ; ====================================== 8 | 9 | ; ------------------------ 10 | ; Operating System Equates 11 | ; ------------------------ 12 | 13 | HPOSP0 = $D000 ;player 0 horizontal position 14 | M0PF = $D000 ;missile 0/playfield collision 15 | HPOSP2 = $D002 ;player 2 horizontal position 16 | HPOSP3 = $D003 ;player 3 horizontal position 17 | HPOSM0 = $D004 ;missile 0 horizontal position 18 | P0PF = $D004 ;player 0/playfield collisions 19 | P0PL = $D00C ;player 0 to player collisions 20 | GRP2 = $D00F ;player 2 graphics register 21 | COLBK = $D01A ;background color 22 | GRACTL = $D01D ;graphics control register 23 | HITCLR = $D01E ;collision 'HIT' clear 24 | CONSOL = $D01F ;console switch port 25 | AUDF1 = $D200 ;audio frequency 1 26 | AUDC1 = $D201 ;audio volume 1 27 | AUDF2 = $D202 ;audio frequency 2 28 | AUDC2 = $D203 ;audio volume 2 29 | AUDF3 = $D204 ;audio frequency 3 30 | AUDC3 = $D205 ;audio volume 3 31 | AUDF4 = $D206 ;audio frequency 4 32 | AUDC4 = $D207 ;audio volume 4 33 | RANDOM = $D20A ;random number generator 34 | IRQEN = $D20E ;IRQ interrupt enable 35 | PMBASE = $D407 ;P/M base address 36 | WSYNC = $D40A ;wait for horizontal sync 37 | VCOUNT = $D40B ;scan line counter 38 | SETVBV = $E45C ;set vertical blank vector 39 | XITVBV = $E462 ;vertical blank exit vector 40 | SIOINT = $E465 ;serial I/O initialization 41 | ATRACT = $004D ;atract mode counter 42 | 43 | ; ----------------------- 44 | ; System Shadow Registers 45 | ; ----------------------- 46 | 47 | RTCLOK = $0012 ;system clock 48 | CDTMV1 = $0218 ;system timer 1 49 | CDTMV2 = $021A ;system timer 2 50 | CDTMA1 = $0226 ;system timer 1 vector 51 | CDTMA2 = $0228 ;system timer 2 vector 52 | SDMCTL = $022F ;DMA control 53 | SDLSTL = $0230 ;display list pointer 54 | GPRIOR = $026F ;graphics priority 55 | STICK0 = $0278 ;joystick 1 56 | STRIG0 = $0284 ;trigger 1 57 | PCOLR0 = $02C0 ;player 0 color 58 | PCOLR1 = $02C1 ;player 1 color 59 | PCOLR2 = $02C2 ;player 2 color 60 | PCOLR3 = $02C3 ;player 3 color 61 | COLOR2 = $02C6 ;playfield 2 color 62 | COLOR3 = $02C7 ;playfield 3 color 63 | COLOR4 = $02C8 ;background color 64 | 65 | ; ------------------- 66 | ; Page Zero Variables 67 | ; ------------------- 68 | 69 | ORG $0080 ;area not used by system 70 | 71 | PIC DS 2 ;rabbit image pointer 72 | 73 | ; -------------------------- 74 | ; Player / Missile RAM Space 75 | ; -------------------------- 76 | 77 | ORG $3000 ;out of everyones way 78 | 79 | PM DS $180 ;first area not used 80 | MISL DS $80 ;Missile graphics area 81 | PLR0 DS $80 ;player 0 graphics area 82 | PLR1 DS $80 ;player 1 graphics area 83 | PLR2 DS $80 ;player 2 graphics area 84 | PLR3 DS $80 ;player 3 graphics area 85 | 86 | ; ------------------- 87 | ; Program entry point 88 | ; ------------------- 89 | 90 | JMP HARVEY 91 | 92 | ; ----------------- 93 | ; Game display list 94 | ; ----------------- 95 | 96 | DL DB $70,$70 ;32 blank scan lines 97 | DB $70,$70 98 | DB $47 ;mode 2 line w/LMS bit 99 | DW DISP ;address of game display 100 | DB $07,$07 ;9 more mode 2 lines 101 | DB $07,$07 102 | DB $07,$07 103 | DB $07,$07 104 | DB $07 105 | DB $70,$70 ;skip 16 lines 106 | DB $46 ;mode 1 line w/LMS bit 107 | DW SLINE ;address of score line 108 | DB $41 ;jump on vertical blank 109 | DW DL ;to start of display list 110 | 111 | ; --------------- 112 | ; Score line data 113 | ; --------------- 114 | 115 | SLINE DB 'R'+$A0 116 | DB 'A'+$A0 117 | DB 'B'+$A0 118 | DB 'B'+$A0 119 | DB 'I'+$A0 120 | DB 'T'+$A0 121 | DB 'S'+$A0 122 | DB ':'+$A0 123 | RNUM DB '3'+$A0 ;number of rabbits 124 | DB ' '+$A0 125 | DB 'S'+$A0 126 | DB 'C'+$A0 127 | DB 'O'+$A0 128 | DB 'R'+$A0 129 | DB 'E'+$A0 130 | DB ':'+$A0 131 | SNUM DB '0'+$A0 ;score display 132 | DB '0'+$A0 133 | DB '0'+$A0 134 | DB '0'+$A0 135 | 136 | ; ----------------- 137 | ; Game over message 138 | ; ----------------- 139 | 140 | GOMSG DB 'game' 141 | DB 0,0,'ov' 142 | DB 'er',$80 143 | 144 | PSMSG DB 'pres' 145 | DB 's',0,0,'s' 146 | DB 'tart',$80 147 | 148 | ; ------------------- 149 | ; Initialization Code 150 | ; ------------------- 151 | 152 | HARVEY CLD ;clear decimal flag 153 | JSR SIOINT ;stop cassette 154 | LDA #'3'+$A0;display for '3' 155 | STA RNUM ;3 lives (display) 156 | LDA #3 ;get 3 lives 157 | STA LIVES ;initialize counter 158 | LDA #'0'+$A0;display for '0' 159 | STA SNUM ;store in the four 160 | STA SNUM+1 ;bytes used for the 161 | STA SNUM+2 ;score display 162 | STA SNUM+3 ;area. 163 | MORE LDA #60 ;get 1 second count 164 | STA TIM2ST ;set reset value 165 | STA CDTMV2 ;set system timer #2 166 | JSR CLSCRN ;clear game playfield 167 | LDY #2 ;display 3 numbers (0-2) 168 | INUMS JSR PUTNUM ;put the number on screen 169 | DEY ;decrement number counter 170 | BPL INUMS ;done yet? No. 171 | LDA #DL&$FF ;Yes. low byte DL address 172 | STA SDLSTL ;DL pointer (low) 173 | LDA #DL/256 ;high byte DL address 174 | STA SDLSTL+1;DL pointer (high) 175 | LDA #$04 ;set PF over PLAYER 176 | STA GPRIOR ;graphics priority 177 | LDA #40 ;high wall 178 | STA BYLOC ;starting location 179 | LDA #196 ;low wall 180 | STA BYLOC+1 ;starting location 181 | LDA #60 ;left wall 182 | STA BXLOC ;starting location 183 | STA HPOSP2 ;hardware register 184 | LDA #184 ;right wall 185 | STA BXLOC+1 ;starting location 186 | STA HPOSP3 ;hardware register 187 | LDA #122 ;center screen-4 color clocks 188 | STA HARX ;Harvey's initial X position 189 | LDA #55 ;center P/M-8 bytes 190 | STA HARY ;Harvey's initial Y position 191 | LDA #$2E ;set P/M DMA on bits 192 | STA SDMCTL ;store in DMA control 193 | LDA #3 ;set P/M enable bits on 194 | STA GRACTL ;store in graphics control 195 | LDA #PM/256 ;get high byte of P/M addr 196 | STA PMBASE ;point hardware to it 197 | LDA #$96 ;light blue color 198 | STA COLOR2 ;default color too dark 199 | LDA #$48 ;pink color 200 | STA COLOR3 ;same here 201 | LDA #$18 ;gold color 202 | STA PCOLR0 ;set rabbit color 203 | LDA #$98 ;blue color 204 | STA PCOLR1 ;set missile 1 color 205 | LDA #$34 ;red-orange color 206 | STA PCOLR2 ;left wall color 207 | LDA #$C4 ;green color 208 | STA PCOLR3 ;right wall color 209 | LDA #1 ;initialize trigger flag- 210 | STA STRIGF ;to no shot fired 211 | LDX #VB/256 ;address of VB (MSB) 212 | LDY #VB&$FF ;address of VB (LSB) 213 | LDA #7 ;deferred vertical blank opt 214 | JSR SETVBV ;set deferred Vblank vector 215 | LDA #T1&$FF ;addr of timer 1 routine LSB 216 | STA CDTMA1 ;set timer 1 vector LSB 217 | LDA #T1/256 ;addr of timer 1 routine MSB 218 | STA CDTMA1+1;set timer 1 vector MSB 219 | LDA #T2&$FF ;addr of timer 2 routine LSB 220 | STA CDTMA2 ;set timer 2 vector LSB 221 | LDA #T2/256 ;addr of timer 2 routine MSB 222 | STA CDTMA2+1;set timer 2 vector MSB 223 | LDA #1 ;get 4.25 second count 224 | STA CDTMV1+1;set system timer #1 225 | LDA #0 ;get a zero 226 | STA HITCLR ;reset collision registers 227 | STA DIESW ;rabbit is alive 228 | STA TICTOC ;reset tictoc counter 229 | STA VOL1 ;start with no tictoc sound 230 | STA VOL2 ;start with no shuffle noise 231 | STA IRQEN ;disable all IRQ interrupts 232 | LDX #3 ;set index value to 3 233 | WINCZ STA WINC,X ;zero wall mover counter 234 | STA SHOTX,X ;zero X missile location 235 | STA SHOTY,X ;zero Y missile location 236 | STA SINCX,X ;zero X missile increment 237 | STA SINCY,X ;zero Y missile increment 238 | DEX ;next wall mover counter 239 | BPL WINCZ ;more walls/missiles? Yes. 240 | TAX ;set index to zero 241 | IM01 STA MISL,X ;clear Missile area 242 | STA PLR0,X ;clear Player 0, 1 area 243 | INX ;do next byte 244 | BNE IM01 ;done yet? No. 245 | LDA #$FF ;turn on pixels 246 | IM23 STA PLR2,X ;set Player 2, 3 area 247 | INX ;do next byte 248 | BNE IM23 ;done yet? No. 249 | 250 | ; ------------------------------------------ 251 | ; Main program used to generate the display. 252 | ; Actual game done entirely during display's 253 | ; vertical blank processing routine. 254 | ; ------------------------------------------ 255 | 256 | HBARS INX ;increment wall pointer 257 | TXA ;transfer pointer to Acc 258 | AND #1 ;mask off lowest bit 259 | TAX ;put back in X register 260 | LDA BYLOC,X ;get wall vertical position 261 | LSR A ;divide by 2, odd=carry set 262 | PHP ;save carry flag 263 | VCHECK CMP VCOUNT ;compare with line counter 264 | BNE VCHECK ;not yet! 265 | STA WSYNC ;start at new line 266 | PLP ;get carry flag back 267 | BCC ONELIN ;branch on even line number 268 | STA WSYNC ;wait for next line 269 | ONELIN LDA RANDOM ;random background color 270 | AND #$F6 ;max lum of 6 271 | STA COLBK ;for horizontal walls 272 | LDY #10 ;let's have 10 lines of this 273 | LINES LDA #0 ;get a zero for overlap 274 | STA GRP2,X ;background overlaps player 275 | STA WSYNC ;wait for next line 276 | LDA RANDOM ;random background color 277 | AND #$F6 ;max lum of 6 278 | STA COLBK ;for horizontal walls 279 | DEY ;decrement line counter 280 | BNE LINES ;10 lines done yet? No! 281 | LDA COLOR4 ;get original background 282 | STA COLBK ;store in background 283 | LDA LIVES ;more lives 284 | BEQ HB1 ;No. skip code 285 | LDA DIESW ;a new life? 286 | BPL HB1 ;No. 287 | JMP MORE ;Yes. more lives 288 | HB1 LDA CONSOL ;check for start switch 289 | AND #$01 ;mask off bit 290 | BNE HBARS ;start? No. 291 | JMP HARVEY ;restart game 292 | 293 | ; ----------------------------------------- 294 | ; System timer #1 interrupt handler. 295 | ; Used to speed up walls every 4.25 seconds. 296 | ; ----------------------------------------- 297 | 298 | T1 LDA TIM2ST ;get wall speed 299 | CMP #2 ;must stop at two 300 | BEQ TIM1 ;is it two? Yes. 301 | DEC TIM2ST ;No, then decrement 302 | TIM1 LDA #1 ;get 4.25 second cycle time 303 | STA CDTMV1+1;reset timer #1 304 | RTS ;return 305 | 306 | ; ------------------------------------------- 307 | ; System timer #2 interrupt handler. 308 | ; Used to move walls and initiate wall noise. 309 | ; ------------------------------------------- 310 | 311 | T2 LDA TIM2ST ;get timer #2 value 312 | STA CDTMV2 ;reset timer #2 313 | INC BYLOC ;move top wall down 314 | DEC BYLOC+1 ;move bottom wall up 315 | INC BXLOC ;change left wall location 316 | LDA BXLOC ;get new location 317 | STA HPOSP2 ;change player 2 position 318 | DEC BXLOC+1 ;change right wall location 319 | LDA BXLOC+1 ;get new location 320 | STA HPOSP3 ;change player 3 position 321 | INC TICTOC ;increment TIC-TOC counter 322 | LDA TICTOC ;get counter value 323 | AND #1 ;just need 0 or 1 value 324 | TAX ;use for index 325 | LDA METRO,X ;get sound frequency 326 | STA AUDF1 ;change frequency 327 | LDA #$08 ;get volume value 328 | STA VOL1 ;save in volume counter 329 | RTS ;return 330 | 331 | ; ------------------------------------------- 332 | ; Deferred vertical blank processing routine. 333 | ; Here is where all the actual game playing 334 | ; takes place. This could be quite long. 335 | ; ------------------------------------------- 336 | 337 | VB LDA DIESW ;rabbit dying? 338 | BNE VB0 ;He sure is. 339 | LDA LIVES ;any lives left? 340 | BNE VB0 ;There sure are. 341 | JSR CLSCRN ;clear screen of numbers 342 | LDX #0 ;initialize X with zero 343 | STX AUDC1 ;stop tictoc sound 344 | STX AUDC2 ;stop dying sound 345 | STX AUDC3 ;stop gun noise 346 | STX AUDC4 ;stop number sound 347 | STX CDTMV1 ;shut off the two timers 348 | STX CDTMV1+1;ditto. 349 | STX CDTMV2 ;same here. 350 | GOPRT LDA GOMSG,X ;get a character 351 | BMI PSINIT ;end of scring? Yes. 352 | STA DISP+85,X;put on screen 353 | INX ;increment index 354 | JMP GOPRT ;continue 355 | 356 | PSINIT LDX #0 ;zero the index 357 | PSPRT LDA PSMSG,X ;get another character 358 | BMI VBXIT ;end of string? Yes. 359 | STA DISP+144,X;put on screen 360 | INX ;increment index 361 | JMP PSPRT ;continue 362 | VBXIT JMP VBX ;exit vertical blank 363 | VB0 LDA P0PL ;player/player collisions 364 | STA P0PLT ;store in temp variable 365 | LDA P0PF ;player to PF collisions 366 | STA P0PFT ;store in temp variable 367 | LDA NSOUND ;treasure sound counter 368 | BMI NOSND ;end of sound? Yes. 369 | DEC NSOUND ;decrement volume 370 | LSR A ;divide volume by 2 371 | ORA #$A0 ;add pure tone 372 | STA AUDC4 ;change volume 373 | NOSND LDA VOL1 ;get tictoc volume value 374 | BMI SND2 ;if <0 we produce no sound 375 | DEC VOL1 ;decrement volume value 376 | ORA #$C0 ;mask on the distortion 377 | STA AUDC1 ;generate the tictoc sound 378 | SND2 LDA VOL2 ;get shuffle volume 379 | BMI SND3 ;if <0 we produce no sound 380 | DEC VOL2 ;decrement volume value 381 | ORA #$80 ;mask on the distortion 382 | STA AUDC2 ;generate the shuffle noise 383 | SND3 LDA FREQ3 ;get shot frequency 384 | INC FREQ3 ;increment shot frequency 385 | INC FREQ3 ;do it again 386 | INC FREQ3 ;and one last time 387 | STA AUDF3 ;change frequency (lower) 388 | LDA DIESW ;is rabbit dying 389 | BEQ TMOV1 ;No. continue 390 | INC DIESW ;Yes. 2 second die period 391 | INC PCOLR0 ;change rabbit colors 392 | INC PCOLR0 ;again 393 | LDA PCOLR0 ;get number 394 | ASL A ;*2 395 | ASL A ;*4 396 | ASL A ;*8 397 | STA AUDF2 ;use as frequency 398 | LDA #$88 ;get distortion 399 | STA AUDC2 ;make sound 400 | JMP VBX ;exit vertical blank 401 | 402 | TMOV1 LDA WINC ;check push wall up 403 | BEQ TMOV2 ;push up? No. 404 | DEC WINC ;decrement push up counter 405 | LDA BYLOC ;get top wall location 406 | CMP #28 ;compare with top of screen 407 | BEQ TMOV2 ;at top? Yes. 408 | DEC BYLOC ;move wall up 409 | TMOV2 LDA WINC+1 ;check push wall down 410 | BEQ TMOV3 ;push down? No. 411 | DEC WINC+1 ;decrement push down counter 412 | LDA BYLOC+1 ;get bottom wall location 413 | CMP #204 ;compare bottom of screen 414 | BEQ TMOV3 ;at bottom? Yes. 415 | INC BYLOC+1 ;move wall down 416 | TMOV3 LDA WINC+2 ;check push wall left 417 | BEQ TMOV4 ;push left? No. 418 | DEC WINC+2 ;decrement push left counter 419 | LDA BXLOC ;get left wall position 420 | STA HPOSP2 ;move left wall player 421 | CMP #39 ;check for left wall limit 422 | BEQ TMOV4 ;at limit? Yes. 423 | DEC BXLOC ;move wall left 424 | TMOV4 LDA WINC+3 ;check push wall right 425 | BEQ TMOVX ;push right? No. 426 | DEC WINC+3 ;decrement push right counter 427 | LDA BXLOC+1 ;get right wall position 428 | STA HPOSP3 ;move right wall player 429 | CMP #208 ;check for right wall limit 430 | BEQ TMOVX ;at limit? Yes. 431 | INC BXLOC+1 ;move wall right 432 | TMOVX LDA #0 ;get a zero 433 | STA ATRACT ;poke out atract mode 434 | STA XTEMP ;zero rabbit X increment 435 | STA YTEMP ;zero rabbit Y increment 436 | LDA STICK0 ;get joystick value 437 | CMP #$0F ;at center position? 438 | BEQ CENTER ;Yes. skip code 439 | LDA RTCLOK+2;get real time clock LSB 440 | AND #$07 ;at 1/7.5 second mark? 441 | BNE CENTER ;No. skip code 442 | LDA #$10 ;get shuffle frequency 443 | STA AUDF2 ;set frequency register 444 | LDA #$04 ;get volume value 445 | STA VOL2 ;set shuffle volume 446 | CENTER LDA STICK0 ;get joystick value 447 | SEC ;set carry for subtract 448 | SBC #5 ;values 5-15 only 449 | ASL A ;5-15 now 0,2,4,... 450 | TAX ;use for index 451 | LDA RTCLOK+2;get real time clock LSB 452 | ROR A ;divide by 2 453 | ROR A ;divide by 4 454 | ROR A ;divide by 8 455 | ROR A ;carry set/reset at .13 sec 456 | LDA PK1,X ;get rabbit picture LSB 457 | BCC PICMVL ;other pic at .13 sec? No. 458 | LDA PK2,X ;get alternate picture LSB 459 | PICMVL STA PIC ;store LSB of pic address 460 | LDA PK1+1,X ;get rabbit picture MSB 461 | BCC PICMVH ;other pic at .13 sec? No. 462 | LDA PK2+1,X ;get alternate picture MSB 463 | PICMVH STA PIC+1 ;store MSB of pic address 464 | LDX #3 ;count 3 downto 0 465 | CHKSTK LSR STICK0 ;shift bit into carry 466 | BCS CHKNXT ;correct direction? No. 467 | LDA STBLX,X ;check X movement direction 468 | BEQ CHK0 ;movement allowed? No. 469 | STA XTEMP ;store X movement value 470 | CHK0 LDA STBLY,X ;check Y movement direction 471 | BEQ CHKNXT ;movement allowed? No. 472 | STA YTEMP ;store Y movement value 473 | CHKNXT DEX ;do next stick position 474 | BPL CHKSTK ;done yet? No. 475 | LDA P0PLT ;get player 0 collision 476 | CMP #$0C ;left/right squeze? 477 | BNE NOSQUE ;No. Check indvdual walls 478 | DEC RNUM ;decrement lives display 479 | DEC LIVES ;decrement lines counter 480 | INC DIESW ;the rabbit has died switch 481 | NOSQUE AND #$04 ;check left wall collision 482 | BEQ BMPRT ;hit left wall? No. 483 | INC HARX ;Yes. Move rabbit to right 484 | LDA #0 ;get zero value 485 | STA XTEMP ;stop rabbit X movement 486 | BMPRT LDA P0PLT ;get player 0 collision 487 | AND #$08 ;check right wall collision 488 | BEQ BMPUP ;hit right wall? No. 489 | DEC HARX ;Yes. Move rabbit to left 490 | LDA #0 ;get zero value 491 | STA XTEMP ;stop rabbit X movement 492 | BMPUP CLC ;clear carry for add 493 | LDA BYLOC ;top wall Y location 494 | ADC #4 ;offset by 4 495 | LSR A ;divide by 2 496 | CMP HARY ;compare rabbit Y location 497 | BCC BMPDN ;hit top wall? No. 498 | DEC RNUM ;decrement lives display 499 | DEC LIVES ;decrement lines counter 500 | INC DIESW ;the rabbit has died switch 501 | BMPDN LDA HARY ;get rabbit Y location 502 | ADC #10 ;offset by 10 503 | ASL A ;multiply by 2 504 | CMP BYLOC+1 ;compare bottom wall Y 505 | BCC NOBMP ;hit bottom wall? No. 506 | DEC RNUM ;decrement lives display 507 | DEC LIVES ;decrement lines counter 508 | INC DIESW ;the rabbit has died switch 509 | NOBMP CLC ;clear carry for add 510 | LDA HARX ;get rabbit X position 511 | ADC XTEMP ;add X increment 512 | STA HARX ;save new rabbit X position 513 | STA HPOSP0 ;position rabbit player 0 514 | CLC ;clear carry for add 515 | LDA HARY ;get rabbit Y position 516 | ADC YTEMP ;add Y increment 517 | STA HARY ;save new rabbit Y position 518 | TAX ;use position as index 519 | LDY #0 ;initialize picture counter 520 | MOVHAR LDA (PIC),Y ;get rabbit picture byte 521 | STA PLR0,X ;store in player 0 area 522 | INX ;increment player pointer 523 | INY ;increment picture pointer 524 | CPY #14 ;check for end of picture 525 | BNE MOVHAR ;at end? No. 526 | LDA STRIG0 ;get trigger value 527 | CMP STRIGF ;compare with trigger flag 528 | STA STRIGF ;save new trigger flag 529 | BCS NOFIRE ;shot fired? No. 530 | LDA XTEMP ;rabbit X increment 531 | ORA YTEMP ;OR rabbit Y increment 532 | BNE FIREGN ;rabbit stationary? No. 533 | INC STRIGF ;set trigger flag to 1 534 | BNE NOFIRE ;skip fire routine 535 | FIREGN LDA #$40 ;initialize frequency 536 | STA FREQ3 ;zero audio freq 3 537 | LDA #$04 ;shot volume + distortion 538 | STA AUDC3 ;enable volume 3 539 | INC SHOTS ;increment shot pointer 540 | LDA SHOTS ;get shot pointer 541 | AND #3 ;make it 0-3 only 542 | TAX ;use pointer for index 543 | LDA XTEMP ;get rabbit X increment 544 | ASL A ;make shot twice as fast 545 | STA SINCX,X ;set missile X increment 546 | LDA YTEMP ;get rabbit Y increment 547 | ASL A ;make shot twice as fast 548 | STA SINCY,X ;set missile Y increment 549 | CLC ;clear carry for add 550 | LDA HARX ;get rabbit X position 551 | ADC #3 ;move to center X of rabbit 552 | STA SHOTX,X ;shot initial X position 553 | LDA HARY ;get rabbit Y position 554 | ADC #8 ;its move to center Y of rabbit 555 | STA SHOTY,X ;shot initial Y position 556 | NOFIRE LDA #0 ;zero accumulator 557 | TAX ;zero X index 558 | ERASES STA MISL,X ;zero all missiles 559 | INX ;next missile byte 560 | BPL ERASES ;done? No. 561 | LDX #3 ;count 3 downto 0 562 | PLOTS LDA SINCX,X ;get missile X increment 563 | ORA SINCY,X ;OR missile Y increment 564 | BEQ NOPLOT ;any movement? No. 565 | LDA SHOTY,X ;missile Y position 566 | CLC ;clear carry for add 567 | ADC SINCY,X ;add Y increment 568 | STA SHOTY,X ;store new Y position 569 | TAY ;Y position now index 570 | ASL A ;multiply by 2 571 | ADC #2 ;offset for compare 572 | CMP BYLOC+1 ;compare with bottom wall 573 | BCC HITTP ;hit bottom wall? No. 574 | JSR ZINCXY ;zero missile increments 575 | ADC WINC+1 ;add 8 to wall increment 576 | STA WINC+1 ;new bottom wall increment 577 | JMP PLOTNH ;continue 578 | 579 | HITTP SBC #12 ;offset for bottom side 580 | CMP BYLOC ;compare with top wall 581 | BCS PLOTNH ;hit top wall? No. 582 | JSR ZINCXY ;zero missile increments 583 | ADC WINC ;add 8 to wall increment 584 | STA WINC ;new top wall increment 585 | PLOTNH LDA MISL,Y ;get missile byte 586 | ORA MISMSK,X;OR missile mask 587 | STA MISL,Y ;store new byte 588 | LDA MISL+1,Y;get next missile byte 589 | ORA MISMSK,X;OR missile mask 590 | STA MISL+1,Y;store new next byte 591 | LDA M0PF,X ;missile/playfield collision 592 | LDY #0 ;init Y register 593 | MHPF ROR A ;collision? 594 | BCC MHPF0 ;No. No. No. 595 | JMP MHIT ;Yes. Yes. Yes. 596 | MHPF0 INY ;try next bit 597 | CPY #4 ;any more bits? 598 | BNE MHPF ;Certainly! Yuk. Yuk. 599 | CLC ;clear carry for add 600 | LDA SHOTX,X ;get missile X position 601 | ADC SINCX,X ;add X increment 602 | STA SHOTX,X ;store new X position 603 | STA HPOSM0,X;position missile 604 | CMP BXLOC+1 ;compare missile with wall 605 | BCC HITLF ;hit right wall? No. 606 | JSR ZINCXY ;zero missile increments 607 | ADC WINC+3 ;add 8 to wall increment 608 | STA WINC+3 ;new wall increment 609 | JMP NOPLOT ;continue 610 | 611 | HITLF SBC #6 ;offset for right side 612 | CMP BXLOC ;compare with left wall 613 | BCS NOPLOT ;hit left wall? No. 614 | JSR ZINCXY ;zero missile increments 615 | ADC WINC+2 ;add 8 to wall increment 616 | STA WINC+2 ;new wall increment 617 | NOPLOT DEX ;next missile 618 | BMI NOPL1 ;missiles done? Yes. 619 | JMP PLOTS ;continue loop 620 | 621 | NOPL1 LDX #3 ;set up pointer 622 | LDA #0 ;zero accumulator 623 | CHKMIS ORA SINCX,X ;OR in X increments 624 | ORA SINCY,X ;OR in Y increments 625 | DEX ;decrement pointer 626 | BPL CHKMIS ;at end? No. 627 | CMP #0 ;check shot increments 628 | BNE NOSSND ;any increments? Yes. 629 | STA AUDC3 ;end shot sound 630 | NOSSND LDY #0 ;initialize Y index 631 | MISHIT LSR P0PFT ;shift collision to carry 632 | BCC MH1 ;collision w/number? No. 633 | JSR ERANUM ;erase the number 634 | LDA VTBL,Y ;get value of number 635 | PHA ;save on stack 636 | JSR PUTNUM ;put out a new number 637 | PLA ;get old number 638 | TAY ;use as counter value 639 | BEQ SCX ;was it zero? Yes. 640 | SCORER LDX #3 ;point to score low digit 641 | SC1 INC SNUM,X ;increment digit 642 | LDA SNUM,X ;get digit 643 | CMP #'9'+$A1;past ATASCII '9'+color? 644 | BNE SCY ;No. continue 645 | LDA #'0'+$A0;reset digit 646 | STA SNUM,X ;change score display 647 | DEX ;point to next digit 648 | BPL SC1 ;score rolled over? No. 649 | SCY DEY ;decrement value 650 | BNE SCORER ;scoring done? No. 651 | SCX JMP VBX ;exit routine 652 | 653 | MH1 INY ;check next color digit 654 | CPY #3 ;done 0-2 yet? 655 | BNE MISHIT ;No. continue 656 | VBX STA HITCLR ;clear collision registers 657 | JMP XITVBV ;exit deferred vertical blank 658 | 659 | MHIT TXA ;save X register 660 | PHA ;on stack 661 | JSR ERANUM ;erase number hit and 662 | JSR PUTNUM ;put a new one on screen 663 | PLA ;pull X register 664 | TAX ;from stack 665 | JMP NOPLOT ;continue on 666 | 667 | ; ------------------------- 668 | ; Commonly used subroutines 669 | ; ------------------------- 670 | 671 | ; Clear missile display area 672 | 673 | ZINCXY LDA #0 ;get zero value 674 | STA SINCX,X ;zero missile X increment 675 | STA SINCY,X ;zero missile Y increment 676 | CLC ;clear carry for add 677 | LDA #8 ;get value for add 678 | RTS ;we return to the program 679 | 680 | ; Clear the game playfield 681 | 682 | CLSCRN LDX #200 ;set 0-199 bytes 683 | LDA #0 ;to zero 684 | CL0 STA DISP-1,X;store in display 685 | DEX ;count down 686 | BNE CL0 ;past zero yet? No. 687 | RTS ;return to program 688 | 689 | ; Put random number from 0-9 on screen at 690 | ; a random location 0-199 691 | 692 | PUTNUM LDX RANDOM ;get random number 693 | CPX #200 ;is number < 200? 694 | BCS PUTNUM ;No. try another 695 | LDA DISP,X ;see if space is occupied 696 | BNE PUTNUM ;Yes. try again 697 | PN0 LDA RANDOM ;get another random number 698 | AND #$0F ;limit it to 0-15 699 | CMP #10 ;is number < 10? 700 | BCS PN0 ;No. try another 701 | STA VTBL,Y ;save number 702 | ORA CTBL,Y ;OR with color 703 | STA DISP,X ;put number on screen 704 | TXA ;move screen offset to A 705 | STA ATBL,Y ;save screen offset 706 | RTS ;end of routine 707 | 708 | ; Erase number from screen 709 | 710 | ERANUM LDA #0 ;get zero for blank 711 | LDX ATBL,Y ;get # position on screen 712 | STA DISP,X ;blank number on screen 713 | LDA RANDOM ;get random number 714 | AND #$1F ;mask off high bits 715 | ORA #$10 ;make it $10-$1F 716 | STA AUDF4 ;use as sound frequency 717 | LDA #30 ;initialize- 718 | STA NSOUND ;volume counter 719 | RTS ;end of routine 720 | 721 | ; ---------------------------- 722 | ; Program tables and constants 723 | ; ---------------------------- 724 | 725 | MISMSK DB $03 ;missile 0 mask 726 | DB $0C ;missile 1 mask 727 | DB $30 ;missile 2 mask 728 | DB $C0 ;missile 3 mask 729 | 730 | HARLF1 DB 0,0 ;left view #1 731 | DB $12,$0A 732 | DB $3C,$74 733 | DB $3C,$1C 734 | DB $1E,$3E 735 | DB $3F,$7E 736 | HARLF2 DB 0,0 ;left view #2 737 | DB $0B,$0A 738 | DB $3C,$74 739 | DB $3C,$1C 740 | DB $1E,$3E 741 | DB $3E,$F7 742 | HARRT1 DB 0,0 ;right view #1 743 | DB $48,$50 744 | DB $3C,$2E 745 | DB $3C,$38 746 | DB $78,$7C 747 | DB $FC,$7E 748 | HARRT2 DB 0,0 ;right view #2 749 | DB $D0,$50 750 | DB $3C,$2E 751 | DB $3C,$38 752 | DB $78,$7C 753 | DB $7C,$EF 754 | HARFR1 DB 0,0 ;front view #1 755 | DB $42,$24 756 | DB $3C,$14 757 | DB $3C,$18 758 | DB $3C,$7E 759 | DB $7E,$E7 760 | HARFR2 DB 0,0 ;front view #2 761 | DB $42,$24 762 | DB $3C,$28 763 | DB $3C,$18 764 | DB $3C,$7E 765 | DB $7E,$E7 766 | HARDN1 DB 0,0 ;down view #1 767 | DB $44,$24 768 | DB $3C,$14 769 | DB $3C,$18 770 | DB $3C,$7E 771 | DB $FE,$07 772 | HARDN2 DB 0,0 ;down view #2 773 | DB $22,$24 774 | DB $3C,$28 775 | DB $3C,$18 776 | DB $3C,$7E 777 | DB $7F,$E0 778 | HARUP1 DB 0,0 ;up view #1 779 | DB $44,$24 780 | DB $3C,$3C 781 | DB $3C,$18 782 | DB $3C,$66 783 | DB $FE,$07 784 | HARUP2 DB 0,0 ;up view #2 785 | DB $22,$24 786 | DB $3C,$3C 787 | DB $3C,$18 788 | DB $3C,$66 789 | DB $7F,$E0 790 | DB 0,0 791 | 792 | PK1 DW HARRT1 ;rabbit pictures set 1 793 | DW HARRT1 794 | DW HARRT1 795 | DW 0 796 | DW HARLF1 797 | DW HARLF1 798 | DW HARLF1 799 | DW 0 800 | DW HARDN1 801 | DW HARUP1 802 | DW HARFR1 803 | 804 | PK2 DW HARRT2 ;rabbit pictures set 2 805 | DW HARRT2 806 | DW HARRT2 807 | DW 0 808 | DW HARLF2 809 | DW HARLF2 810 | DW HARLF2 811 | DW 0 812 | DW HARDN2 813 | DW HARUP2 814 | DW HARFR2 815 | 816 | CTBL DB $10,$50 ;color offset table 817 | DB $90 818 | METRO DB 38,41 ;tictoc tones 819 | STBLX DB $01,$FF ;joystick X increments 820 | DB $00,$00 821 | STBLY DB $00,$00 ;joystick Y increments 822 | DB $01,$FF 823 | 824 | ; --------------------- 825 | ; Variable Storage Area 826 | ; --------------------- 827 | 828 | HARX DS 1 ;Harvey's X locatin 829 | HARY DS 1 ;Harvey's Y location 830 | BYLOC DS 2 ;horizontal wall Y locations 831 | BXLOC DS 2 ;vertical wall X locations 832 | VOL1 DS 1 ;tictoc volume 833 | VOL2 DS 1 ;shuffle volume 834 | FREQ3 DS 1 ;shot frequency 835 | NSOUND DS 1 ;pick number up sound 836 | TICTOC DS 1 ;tictoc sound counter 837 | TIM2ST DS 1 ;wall speed timer 838 | WINC DS 4 ;wall mover counters 839 | STRIGF DS 1 ;trigger compare register 840 | XTEMP DS 1 ;temporary variable 841 | YTEMP DS 1 ;temporary variable 842 | P0PLT DS 1 ;player 0 collision shadow 843 | P0PFT DS 1 ;PL to PF collision shadow 844 | VTBL DS 3 ;value of #'s on screen 845 | ATBL DS 3 ;screen offset to #'s 846 | SHOTS DS 1 ;shot enable counter 847 | LIVES DS 1 ;number of lives left 848 | DIESW DS 1 ;rabbit dying switch 849 | SHOTX DS 4 ;missile X location 850 | SHOTY DS 4 ;missile Y location 851 | SINCX DS 4 ;missile X increment 852 | SINCY DS 4 ;missile Y increment 853 | DISP DS 200 ;screen display area 854 | 855 | END HARVEY 856 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Source code to various Analog Magazine games. 2 | 3 | I wanted to have a nice repo of the source to the games I poured over in the pages of ANALOG Magazine. 4 | 5 | Most of the code here was found on KSquiggle’s Atari 8-bit Programming Shrine - Many thanks to Kevin Chase (https://ksquiggle.neocities.org) 6 | 7 | * Avalanche, by Tommy Bennett, from A.N.A.L.O.G. #21 (August 1984) 8 | * Bacterion!, by Kyle Peacock and Tom Hudson, from A.N.A.L.O.G. #20 (July 1984) 9 | * Battle in the B-Ring, by Lew Thomits, Jr., from A.N.A.L.O.G. #19 (June 1984) 10 | * Blast!, by Steven Grimm, from A.N.A.L.O.G. #44 (July 1986) 11 | * Bonk, by James Hague, from A.N.A.L.O.G. #35 (October 1985) 12 | * BOPOTRON by Kyle S. Peacock, from A.N.A.L.O.G. 13 | * Cosmic Defender, by Phill Roey, from A.N.A.L.O.G. #32 (July 1985) 14 | * Elevator Repairman, by Fred Caprilli, from A.N.A.L.O.G. #34 (September 1985) 15 | * Fill ’Er Up, by Tom Hudson, from A.N.A.L.O.G. #10 (March 1983?) 16 | * Fire Bug, by Kyle Peacock and Tom Hudson, from A.N.A.L.O.G. #23 (October 1984) 17 | * Incoming! By Conrad Tatge, From A.N.A.L.O.G. #38 (January 1986) 18 | * Livewire!, by Tom Hudson, from A.N.A.L.O.G. #12 (July 1983) 19 | * Maze War, by Mark Price, from A.N.A.L.O.G. #36 (November 1985) 20 | * Planetary Defense, by Charles Bachand and Tom Hudson, from A.N.A.L.O.G. #17 (March 1984) 21 | * Race in Space, by Charles Bachand, from A.N.A.L.O.G. #24 (November 1984) 22 | * Rocks!, by Douglas Engel, from A.N.A.L.O.G. #54 (May 1987) 23 | * Roundup by Richard Loken, from A.N.A.L.O.G. #13 (September 1983) 24 | * SHOOT, by John H. Palevich, from COMPUTE! #16 (September 1981) 25 | 26 | 27 | -------------------------------------------------------------------------------- /Roundup.asm: -------------------------------------------------------------------------------- 1 | ;------------------------ 2 | ;ROUNDUP by RICHARD LOKEN 3 | ;------------------------ 4 | 5 | ; EQUATES FOR "ROUNDUP" 6 | 7 | DMACTL = $22F 8 | CHBASE = $2F4 9 | POKMSK = 16 10 | RTCLOC = 18 11 | ATRACT = 77 12 | VDSLST = 512 13 | CDTMV2 = 538 14 | CDTMA1 = 552 15 | VVBLKI = 546 16 | SDMCTL = 559 17 | SDLSTL = 560 18 | GPRIOR = 623 19 | STRIG = $284 20 | STRIG0 = 644 21 | PCOLR0 = 704 22 | PCOLR1 = 705 23 | PCOLR2 = 706 24 | PCOLR3 = 707 25 | COLOR0 = 708 26 | COLOR1 = 709 27 | COLOR2 = 710 28 | COLOR3 = 711 29 | COLOR4 = 712 30 | CHBAS = 756 31 | HPOSP0 = $D000 32 | M0PF = $D000 33 | HPOSP1 = $D001 34 | M1PF = $D001 35 | HPOSP2 = $D002 36 | M2PF = $D002 37 | HPOSP3 = $D003 38 | M3PF = $D003 39 | HPOSM0 = $D004 40 | P0PF = $D004 41 | HPOSM1 = $D005 42 | P1PF = $D005 43 | HPOSM2 = $D006 44 | P2PF = $D006 45 | HPOSM3 = $D007 46 | P3PF = $D007 47 | M0PL = $D008 48 | SIZEP0 = $D008 49 | M1PL = $D009 50 | SIZEP1 = $D009 51 | M2PL = $D00A 52 | SIZEP2 = $D00A 53 | M3PL = $D00B 54 | SIZEP3 = $D00B 55 | P0PL = $D00C 56 | SIZEM = $D00C 57 | P1PL = $D00D 58 | P2PL = $D00E 59 | P3PL = $D00F 60 | TRIG0 = $D010 61 | PRIOR = $D01B 62 | GRACTL = $D01D 63 | HITCLR = $D01E 64 | CONSOL = $D01F 65 | AUDF1 = $D200 66 | AUDC1 = $D201 67 | AUDF2 = $D202 68 | AUDC2 = $D203 69 | AUDF3 = $D204 70 | AUDC3 = $D205 71 | AUDF4 = $D206 72 | AUDC4 = $D207 73 | AUDCTL = $D208 74 | STIMER = $D209 75 | RANDOM = $D20A 76 | PORTA = $D300 77 | PACTL = $D302 78 | HSCROL = $D404 79 | PMBASE = $D407 80 | WSYNC = $D40A 81 | VCOUNT = $D40B 82 | NMIEN = $D40E 83 | SETVBV = $E45C 84 | SYSVBV = $E45F 85 | XITVBV = $E462 86 | CGREY = $00 87 | CGOLD = $10 88 | CORANG = $20 89 | CREDOR = $30 90 | CPINK = $40 91 | CPURPL = $50 92 | CPURBL = $60 93 | CBLUE1 = $70 94 | CBLUE2 = $80 95 | CLBLUE = $90 96 | CTURQO = $A0 97 | CGRNBL = $B0 98 | CGREEN = $C0 99 | CYEGRN = $D0 100 | CORGRN = $E0 101 | CLORNG = $F0 102 | 103 | COLBK = $2C8 104 | 105 | MYPMB = $0000 106 | MISSIL = $0300 107 | PL0 = $0400 108 | PL1 = $0500 109 | PL2 = $0600 110 | PL3 = $0700 111 | CHSET = $0800 112 | 113 | ;These memory areas are reserved for 114 | ;the scrolling cow lines. They are 115 | ;aligned on 256-byte boundaries for 116 | ;ease of use. 117 | 118 | COW = $3600 ;3 COWS 119 | COW.A = $3700 ;2 COWS 120 | COW.B = $3800 ;1 COW 121 | ANG = $3900 ;LONE ANGUS 122 | 123 | ORG $2000 124 | 125 | ;the display list interupt stuffs 126 | ;the cow color and fine scrolling 127 | ;data into the hardware 128 | ;also checks herding and lasso 129 | ;collisions - sets flags for 130 | ;other routines to process 131 | 132 | DLI PROC 133 | PHA ; save all registers 134 | TXA 135 | PHA 136 | TYA 137 | PHA 138 | LDX LINECT ; get DLI counter 139 | LDA LNSC1,X ; get fscrol for line 140 | LDY LNCOL1,X ; get line color 141 | STA WSYNC 142 | STA HSCROL ; and stuff them into 143 | STY $D016 ; the hardware 144 | 145 | ; check for hits on cows 146 | 147 | LDA P3PF 148 | BEQ :L3 149 | LDA #1 150 | STA HIT-1,X 151 | BNE :L2 152 | 153 | ; check for herding 154 | 155 | :L3 LDA LMSHI-1,X 156 | CMP #HIGH ANG 157 | BEQ :L2 158 | LDA P0PF ; get the coll. reg. 159 | ORA P2PF 160 | BEQ :L2 ; if zero then no coll. 161 | LDA LFRT-1,X 162 | BEQ :L2 163 | LDA #0 ; yes, a coll. ; change 164 | STA LFRT-1,X ; dir. of prev. ln 165 | INC NUMHRD-1,X 166 | :L2 STA HITCLR ; and clear hit 167 | 168 | ; finish DLI 169 | 170 | INX 171 | CPX #9 ; 8 is too many 172 | BNE :L 173 | LDX #0 174 | :L STX LINECT 175 | PLA 176 | TAY 177 | PLA 178 | TAX 179 | PLA 180 | RTI 181 | COWLFT DB 3 182 | DB 0 183 | NUMHRD DB 0,0,0,0,0,0,0,0 184 | DB 0,0 185 | HIT DB 0,0,0,0,0,0,0,0 186 | 187 | ;program begins and restarts here 188 | 189 | START PROC 190 | LDX #0 ; TRANSFER CHARACTER SET 191 | :L LDA $E000,X 192 | STA CHSET,X 193 | LDA $E100,X 194 | STA CHSET+$FF,X 195 | LDA $E200,X 196 | STA CHSET+$1FF,X 197 | LDA $E300,X 198 | STA CHSET+$2FF,X 199 | INX 200 | BNE :L 201 | LDA #HIGH CHSET ;INSTALL CHAR SET 202 | STA CHBAS 203 | LDX #0 ; ALTER CHARACTER SET 204 | :L1 LDA FNCE,X 205 | STA CHSET+8,X 206 | INX 207 | CPX #$10 208 | BNE :L1 209 | LDX #0 210 | :L2 LDA COW1,X 211 | STA CHSET+$18,X 212 | INX 213 | CPX #$10 214 | BNE :L2 215 | LDX #0 216 | :L5 LDA ANGUS,X 217 | STA CHSET+$28,X 218 | INX 219 | CPX #$10 220 | BNE :L5 221 | LDX #0 ; CLEAR P/M AND COW LINES 222 | TXA 223 | :L3 STA MISSIL,X 224 | STA PL0,X 225 | STA PL1,X 226 | STA PL2,X 227 | STA PL3,X 228 | STA COW,X 229 | STA COW.A,X 230 | STA COW.B,X 231 | STA ANG,X 232 | INX 233 | BNE :L3 234 | 235 | ;now set up the character bytes in the 236 | ;cow lines that represent the cows. 237 | 238 | LDA #3 239 | STA COW+26 240 | STA COW+29 241 | STA COW+32 242 | STA COW.A+29 243 | STA COW.A+32 244 | STA COW.B+32 245 | LDA #4 246 | STA COW+27 247 | STA COW+30 248 | STA COW+33 249 | STA COW.A+30 250 | STA COW.A+33 251 | STA COW.B+33 252 | LDA #5 253 | STA ANG+26 254 | LDA #6 255 | STA ANG+27 256 | JSR INILMS 257 | LDA #LOW DLI ; install DLI 258 | STA VDSLST 259 | LDA #HIGH DLI 260 | STA VDSLST+1 261 | LDA #$C0 ;ENABLE DLI 262 | STA NMIEN 263 | LDA #$3F ; EN.SIN RES + WIDE PF 264 | STA SDMCTL 265 | LDA #3 ; ENABLE P/M 266 | STA GRACTL 267 | LDA #LOW DISPL ; install DISPLIST 268 | STA SDLSTL 269 | LDA #HIGH DISPL 270 | STA SDLSTL+1 271 | LDA #$11 ; $11 for 5th player 272 | STA GPRIOR 273 | LDA #$C6 274 | STA COLOR4 275 | LDA #$D0 ; horse is 276 | STA PCOLR1 277 | STA PCOLR2 278 | LDA #$A ; rider and lasso 279 | STA PCOLR0 280 | STA PCOLR3 281 | STA COLOR3 282 | LDA #$A8 283 | STA COLOR0 284 | LDA #$E4 285 | STA COLOR1 286 | LDA #$16 287 | STA COLOR2 288 | LDA #0 ; rider is narrow 289 | STA SIZEP0 290 | LDA #1 ; horse is medium 291 | STA SIZEP1 292 | STA SIZEP2 293 | LDA #1 ; lasso is MEDIUM 294 | STA SIZEP3 295 | LDA #$FF 296 | STA STIMER 297 | STA SIZEM 298 | LDA #$30 ; enable joystick 299 | STA PACTL 300 | LDA #$F0 301 | STA PORTA 302 | LDA #$34 303 | STA PACTL 304 | LDA #HIGH MYPMB 305 | STA PMBASE 306 | LDA #60 307 | STA HPOSP0 308 | LDA #48 309 | STA HPOSP1 310 | LDA #64 311 | STA HPOSP2 312 | LDA #68 313 | STA HPOSM3 ; lasso hpos 314 | LDA #76 315 | STA HPOSM2 316 | LDA #84 317 | STA HPOSM1 318 | LDA #92 319 | STA HPOSM0 320 | LDA #100 321 | STA HPOSP3 322 | LDA #100 323 | STA VPOSP0 324 | LDA #0 325 | STA $D208 326 | LDA #3 327 | STA $D20F 328 | LDA #100 329 | STA AUDF1 330 | LDA #30 331 | STA AUDF2 332 | LDA #200 333 | STA AUDF4 334 | JSR CWPKLD 335 | JSR CHEKST 336 | JSR INICOL 337 | LDA #0 338 | STA GAMEND 339 | :L10 LDA VCOUNT 340 | CMP #$19 341 | BNE :L10 342 | LDA #LOW VBLANK 343 | STA VVBLKI 344 | LDA #HIGH VBLANK 345 | STA VVBLKI+1 346 | 347 | ;most processor time is spent waiting 348 | ;for the next VBLANK. mnloop handles 349 | ;the stick,lasso, and player image 350 | ;lasso in progress will mask the 351 | ;stick handler 352 | 353 | MNLOOP 354 | PROC 355 | LDA #1 356 | STA VBDONE 357 | :L LDA VBDONE 358 | BNE :L 359 | LDA GAMEND 360 | BEQ :L3 361 | JMP NEWGAM 362 | :L3 LDA LASTAT 363 | BNE :L2 364 | JSR UPDOWN 365 | :L2 JSR ROPEM 366 | JSR CWPKLD 367 | JMP MNLOOP 368 | 369 | ;simple display list with lms and 370 | ;hscrol enable and dli on each line 371 | 372 | DISPL DB $70,$70,$80,$60,$57 373 | LMS1 DW FENCE 374 | DB $80,$50,$57 375 | CW1 DW COW 376 | DB $80,$50,$57 377 | CW2 DW COW 378 | DB $80,$50,$57 379 | CW3 DW COW 380 | DB $80,$50,$57 381 | CW4 DW COW 382 | DB $80,$50,$57 383 | CW5 DW COW 384 | DB $80,$50,$57 385 | CW6 DW COW 386 | DB $80,$50,$57 387 | FN1 DW FENCE 388 | DB $80,$50,$46 389 | SCRLN DW SCORLN 390 | DB $41 391 | DW DISPL 392 | 393 | ;checks for hi score and sets score 394 | ;for end of game score line 395 | 396 | CHKHSC PROC 397 | LDX #0 398 | :L LDA SCORE,X 399 | CMP HSCR,X 400 | BEQ :L1 401 | BCC :L2 402 | BCS :L3 403 | :L1 INX 404 | CPX #6 405 | BNE :L 406 | :L3 LDX #0 407 | :L4 LDA SCORE,X 408 | STA HSCR,X 409 | INX 410 | CPX #6 411 | BNE :L4 412 | :L2 LDX #0 413 | :L5 LDA SCORE,X 414 | STA SCR1,X 415 | INX 416 | CPX #6 417 | BNE :L5 418 | LDA #LOW HSCRL 419 | STA SCRLN 420 | LDA #HIGH HSCRL 421 | STA SCRLN+1 422 | RTS 423 | 424 | HSCRL DB 0,0,0,0,0 425 | SCR1 DB $10,$10,$10,$10,$10,$10 426 | DB 0,0 427 | HSCR DB $10,$10,$10,$10,$10,$10 428 | DB 0,0,0,0,0,0,0,0 429 | 430 | ;reads stick for up/down and sets 431 | ;vposp0 for CWPKLD 432 | 433 | UPDOWN PROC 434 | LDA PORTA 435 | CMP #$F 436 | BEQ :L 437 | LDA #0 438 | STA ATRACT 439 | LDA PORTA 440 | CMP #14 ; GO UP ? 441 | BEQ UP 442 | CMP #13 ; GO DOWN ? 443 | BNE :L 444 | DOWN LDA VPOSP0 445 | CMP #152 446 | BEQ :L 447 | INC VPOSP0 448 | INC VPOSP0 449 | :L RTS 450 | UP LDA VPOSP0 451 | CMP #50 452 | BEQ :L 453 | DEC VPOSP0 454 | DEC VPOSP0 455 | RTS 456 | 457 | ;updates horse + cowboy whether it 458 | ;needs it or not and animates horse 459 | 460 | CWPKLD PROC 461 | DEC HRSCTR 462 | BMI :L 463 | JMP :L1 464 | :L LDA #4 465 | STA HRSCTR 466 | LDX HRSAV 467 | LDA HS,X 468 | STA :L5+1 469 | INX 470 | LDA HS,X 471 | STA :L5+2 472 | INX 473 | LDA HS,X 474 | STA :L6+1 475 | INX 476 | LDA HS,X 477 | STA :L6+2 478 | INX 479 | CPX #12 480 | BNE :L2 481 | LDX #0 482 | :L2 STX HRSAV 483 | :L1 LDY VPOSP0 484 | LDX #0 485 | :L3 LDA COWBOY,X 486 | STA PL0,Y 487 | INY 488 | INX 489 | CPX #35 490 | BNE :L3 491 | LDA VPOSP0 492 | CLC 493 | ADC #17 494 | TAY 495 | LDX #0 496 | :L5 LDA $FFFF,X 497 | STA PL1,Y 498 | :L6 LDA $FFFF,X 499 | STA PL2,Y 500 | INY 501 | INX 502 | CPX #26 503 | BNE :L5 504 | RTS 505 | EPROC 506 | 507 | ;image data for cowboy and horse 508 | 509 | COWBOY DB 0,0,$26,$36,$32,$32 510 | DB $7A,$32,$32,$22,$26,$7C 511 | DB $78,$70,$70,$70,$70,$70 512 | DB $70,$70,$70,$70,$38,$3E 513 | DB $1F,3,3,3,6,$C,4,2,0,0 514 | H1A DB 0,0,0,0,0,$F,$1F,$3F 515 | DB $5F,$5F,$5F,$5F,$5F,$1F 516 | DB $10,$30,$30,$30,$50,$A0 517 | DB $20,$40,0,0,0 518 | H1B DB 0,0,8,$1C,$1C,$FE,$FE 519 | DB $F6,$F2,$F0,$E0,$E0,$E0 520 | DB $E0,$30,$38,$C,4,4,8,8 521 | DB 0,0,0,0 522 | H2A DB 0,0,0,0,0,$F,$1F,$3F 523 | DB $5F,$5F,$5F,$9F,$9F,$1F 524 | DB $18,$18,$18,$28,$28,$28 525 | DB $48,$50,$50,0,0 526 | H2B DB 0,0,8,$1C,$1C,$FE,$FE 527 | DB $F6,$F2,$F2,$E0,$E0,$E0 528 | DB $E0,$20,$20,$20,$20,$50 529 | DB $50,$50,$50,$40,0,0 530 | H3A DB 0,0,0,0,0,$F,$1F,$3F,$5F 531 | DB $5F,$5F,$5F,$5F,$1F,$18,8 532 | DB 8,8,8,8,5,5,4,0,0 533 | H3B DB 0,0,8,$1C,$1C,$FE,$FE 534 | DB $F6,$F2,$F0,$E0,$E0,$E0 535 | DB $E0,$60,$60,$60,$A0,$A0 536 | DB $A0,$20,$40,0,0,0 537 | HRSAV DB 0 538 | HS DW H1A 539 | DW H1B 540 | DW H2A 541 | DW H2B 542 | DW H3A 543 | DW H3B 544 | HRSCTR DB 0 545 | FNCE DB 0,$FF,3,6,$FF,$18,$30,$60 546 | DB 0,$FF,0,0,$FF,0,0,0 547 | COW1 DB 0,0,$F,$1F,$2F,$CC,$A,$A 548 | DB 0,4,$FE,$F0,$F0,$30,$48,8 549 | COW2 DB 0,$80,$4F,$3F,$1F,$1C,$64,6 550 | DB 0,$C,$FE,$F0,$F0,$30,$28,$28 551 | COW3 DB 0,0,$F,$7F,$8F,$C,$14,$14 552 | DB 0,$C,$FE,$F0,$F0,$18,$14,$10 553 | ANGUS DB $20,$70,$1F,$1F,$F,$B,8,8 554 | DB 0,0,$E0,$F0,$E8,$A8,$20,$20 555 | SCORLN DB 0,0,51,35,47,50,37,0 556 | SCORE DB 16,16,16,16,16,16,0 557 | DB 35,47,55,51,0 558 | CWLEFT DB 19,0,0,0 559 | DB 0,0,0,0,0,0,0,0,0,0,0,0 560 | FENCE DB 1,2,1,2,1,2,1,2,1,2 561 | DB 1,2,1,2,1,2,1,2,1,2,1,2 562 | DB 1,2,1,2,1,2,1,2,1,2,1,2 563 | VPOSP0 DB 0 564 | 565 | ;animates cows in character set 566 | 567 | ANIMATE PROC 568 | LDX CHINDX 569 | CPX #$30 570 | BNE :L 571 | LDX #0 572 | :L LDY #0 573 | :L1 LDA COW1,X 574 | STA CHSET+$18,Y 575 | INX 576 | INY 577 | CPY #$10 578 | BNE :L1 579 | STX CHINDX 580 | RTS 581 | CHINDX DB 0,0,0 582 | LINECT DB 0,0,0 583 | LNSC1 DB 0,0,0,0,0,0,0,0,0 584 | LNCOL1 DB 0,0,0,0,0,0,0,0,$C 585 | LN1SP DB 0,6,2,4,4,1,2,0,0,0 586 | LFRT DB 1,1,0,1,0,1,0,1,0,0 587 | SLMS1 DB 0,0,0,0,0,0,0,0 588 | 589 | ;controls speed of character anima- 590 | ;tion and processes fine and coarse 591 | ;scrolling 592 | ;updates three clocks which are used 593 | ;by other routines 594 | 595 | VBLANK PROC 596 | LDA #0 597 | STA VBDONE 598 | INC VBCTR 599 | INC VBCTR1 600 | INC VBCTR2 601 | LDA GAMEND 602 | BEQ :L14 603 | JMP SYSVBV 604 | :L14 LDA SSPEED ; time to animate? 605 | BEQ :L ; yes 606 | DEC SSPEED ; no just count 607 | JMP :L1 608 | :L JSR ANIMATE 609 | LDA SPEED ; reset counter 610 | STA SSPEED 611 | :L1 LDA #0 ; handshake with main 612 | STA VBDONE 613 | LDX #0 ; start scrolling sequence 614 | :L7 CPX #0 615 | BEQ MVFENC 616 | :L11 LDA LFRT,X 617 | BEQ GOLEFT 618 | BPL GORIT 619 | JSR COUNTD 620 | JMP NXLN 621 | GORIT LDA SLN1SP,X 622 | BEQ :L2 623 | DEC SLN1SP,X 624 | JMP NXLN 625 | :L2 LDA LNSC1,X 626 | SBC #1 627 | BMI :L4 628 | STA LNSC1,X 629 | JMP :L8 630 | :L4 LDA #7 631 | STA LNSC1,X 632 | INC SLMS1,X 633 | LDA LN1SP,X 634 | STA SLN1SP,X 635 | JMP NXLN 636 | GOLEFT LDA VBCTR 637 | AND #1 638 | BEQ NXLN 639 | LDA LNSC1,X 640 | ADC #1 641 | CMP #8 642 | BEQ :L6 643 | BCC :L6 644 | STA LNSC1,X 645 | JMP NXLN 646 | :L6 LDA #0 647 | STA LNSC1,X 648 | DEC SLMS1,X 649 | :L8 LDA LN1SP,X 650 | STA SLN1SP,X 651 | NXLN INX 652 | CPX #7 653 | BNE :L11 654 | 655 | ;resolve hardware collisions, check 656 | ;scrolling for events and effect 657 | ;the lms's so the fence and cows 658 | ;move 659 | 660 | JSR CHKHIT 661 | JSR LMSCK ; check for excess 662 | JSR LMSLD 663 | JSR SETSCO 664 | JSR SOUND 665 | JMP SYSVBV 666 | 667 | ;the fence never coarse scrolls 668 | ;16 fine scrolls = two characters 669 | 670 | MVFENC PROC 671 | :L LDA LNSC1,X 672 | SBC #2 673 | BMI :L1 674 | STA LNSC1,X 675 | STA LNSC1+7,X 676 | LDA LN1SP,X 677 | STA SLN1SP,X 678 | JMP NXLN 679 | :L1 LDA #15 680 | STA LNSC1,X 681 | STA LNSC1,X 682 | JMP NXLN 683 | VBCTR DB 0 684 | VBCTR1 DB 0 685 | SLN1SP DB 0,0,0,0,0,0,0,0 686 | VBDONE DB 0 687 | VBCTR2 DB 0 688 | SSPEED DB 0 689 | SPEED DB 6 ; speed of animation 690 | 691 | ;initializes color shadows and 692 | ;loads six groups of cows 693 | 694 | INICOL PROC 695 | LDX #0 696 | LDA #$D8 697 | STA LNCOL1,X 698 | STA LNCOL1+7,X 699 | LDA #$A 700 | STA LNCOL1+8,X 701 | :L INX 702 | JSR NEWCOW 703 | CPX #6 704 | BNE :L 705 | RTS 706 | 707 | ;writes lms work area into the 708 | ;display list 709 | 710 | LMSLD PROC 711 | LDA #0 712 | TAX 713 | TAY 714 | :L LDA SLMS1,X 715 | STA LMS1,Y 716 | LDA LMSHI,X 717 | STA LMS1+1,Y 718 | INY 719 | INY 720 | INY 721 | INY 722 | INY 723 | INX 724 | CPX #8 725 | BNE :L 726 | RTS 727 | 728 | ;takes display list lms from ori- 729 | ;ginal load and shadows them in 730 | ;the SLMS1 array 731 | 732 | INILMS PROC 733 | LDA #0 734 | TAX 735 | TAY 736 | :L LDA LMS1,Y 737 | STA SLMS1,X 738 | INY 739 | INY 740 | INY 741 | INY 742 | INY 743 | INX 744 | CPX #8 745 | BNE :L 746 | RTS 747 | 748 | ;critical routine which prevents 749 | ;scrolling from going beyond limits 750 | ;calculates missed cows,brings 751 | ;herded cows back and checks for 752 | ;end of game 753 | 754 | LMSCK PROC ; check lms for excess 755 | LDX #1 756 | :L JSR HERD 757 | LDA SLMS1,X 758 | BMI :L1 759 | CMP #LOW COW+36 760 | BEQ :L2 761 | :L3 INX 762 | CPX #7 763 | BNE :L 764 | RTS 765 | :L1 766 | LDA #1 767 | STA LFRT,X 768 | LDA #0 769 | STA SLMS1,X 770 | JMP :L3 771 | :L2 LDA #30 772 | STA MISCOW 773 | LDA #$A8 774 | STA AUDC4 775 | LDA LMSHI,X 776 | CMP #HIGH COW+2 777 | BEQ :L4 778 | CMP #HIGH COW+1 779 | BEQ :L5 780 | CMP #HIGH COW 781 | BEQ :L6 782 | CMP #HIGH ANG 783 | BEQ :L4 784 | JMP :L3 785 | :L4 DEC CWLEFT 786 | DEC COWLFT 787 | BEQ :L7 788 | JSR NEWCOW 789 | JMP :L3 790 | :L5 DEC COWLFT 791 | DEC CWLEFT 792 | DEC CWLEFT 793 | DEC COWLFT 794 | BMI :L7 795 | BEQ :L7 796 | JSR NEWCOW 797 | JMP :L3 798 | :L6 DEC COWLFT 799 | DEC CWLEFT 800 | DEC CWLEFT 801 | DEC CWLEFT 802 | DEC COWLFT 803 | DEC COWLFT 804 | BEQ :L7 805 | BMI :L7 806 | JSR NEWCOW 807 | JMP :L3 808 | :L7 LDA #1 809 | STA GAMEND 810 | JMP :L3 811 | GAMEND DB 0 812 | 813 | ;calculates time to return cows 814 | ;after being herded. The number 815 | ;of times the line has been 816 | ;herded shortens the return time 817 | 818 | HERD PROC 819 | LDA LFRT,X 820 | BEQ :L1 821 | RTS 822 | :L1 LDA NUMHRD,X 823 | CMP SLMS1,X 824 | BNE :L2 825 | LDA #1 826 | STA LFRT,X 827 | :L2 RTS 828 | LASSO1 DB 0,0,$80,0,0,0,0,0,0,0 829 | DB 0,0,0,0,0,0,0,0,0,0,0,0 830 | DB 0,0,0,0 831 | 832 | ; second image 833 | 834 | DB 0,0,$80,$40,$40,0,0,0,0,0 835 | DB 0,0,0,0,0,0,0,0,0,0 836 | DB 0,0,0,0,0,0 837 | 838 | ; third image 839 | 840 | DB 0,0,$80,$40,$40,$20,$20,0,0,0 841 | DB 0,0,0,0,0,0,0,0,0,0 842 | DB 0,0,0,0,0,0 843 | 844 | ; fourth image 845 | 846 | DB 0,0,$80,$40,$40,$20,$20,$10,$10 847 | DB 0,0,0,0,0,0,0,0,0,0,0 848 | DB 0,0,0,0,0,0 849 | 850 | ; fifth image 851 | 852 | DB 0,0,$80,$40,$40,$20,$20,$10,$10 853 | DB 8,8,0,0,0,0,0,0,0,0,0 854 | DB 0,0,0,0,0,0 855 | 856 | ; sixth image 857 | 858 | DB 0,0,$80,$40,$40,$20,$20,$10,$10 859 | DB 8,8,4,4,0,0,0,0,0,0,0 860 | DB 0,0,0,0,0,0 861 | 862 | ; seventh image 863 | 864 | DB 0,0,$80,$40,$40,$20,$20,$10,$10 865 | DB 8,8,4,4,2,2,0,0,0,0,0 866 | DB 0,0,0,0,0,0 867 | 868 | ; eigthth image 869 | 870 | DB 0,0,$80,$40,$40,$20,$20,$10,$10 871 | DB 8,8,4,4,2,2,1,1,0,0,0 872 | DB 0,0,0,0,0,0 873 | LASSO2 DB 0,0,0,0,0,0,0,0 874 | DB 0,0,0,0,0,0,$1C,$22,$22,$C1,$81 875 | DB $41,$41,$41,$41,$3C,0,0 876 | 877 | ;throws the lasso,sets flag which 878 | ;disables the stick while lasso is 879 | ;on screen 880 | 881 | ROPEM PROC 882 | LDA #1 ; test for appropriate 883 | BIT LASTAT ; sequence 884 | BMI :L ; initial recall 885 | BVS :L1 ; continue recall 886 | BNE :L2 ; continue shoot 887 | LDA STRIG0 ; none of above so 888 | BEQ :L3 ; check for trigger 889 | :L4 RTS ; not puched so return 890 | :L3 LDA #1 ; he wants to fire so 891 | STA LASTAT ; set status for cont.sht 892 | LDX #0 ; initial index for image 893 | STX LSCTR 894 | :L2 LDA VBCTR ; don't execute every 895 | AND #1 ; time 896 | BEQ :L4 ; not yet so return 897 | LDA #26 ; initialize counter for 898 | STA LSCTR1 ; 26 bytes 899 | LDY VPOSP0 ; initialize index to ms 900 | LDX LSCTR ; 0,26,52,78,104,130,156 901 | :L5 LDA LASSO1,X ; or 182 - do block 902 | STA MISSIL,Y ; move into missile 903 | INX ; next image byte 904 | INY ; next missile image 905 | DEC LSCTR1 ; 26 bytes been moved? 906 | BNE :L5 ; not yet so loop back 907 | SEC ; have we done the eigtht image? 908 | CPX #206 ;a=208 - 206 leaves carry 909 | BCS :L6 ; yes,eigtht image done so 910 | STX LSCTR ; no so store image cnt 911 | RTS ; for next time and return 912 | :L6 LDA #26 ; set up fill for pl3 913 | LDY VPOSP0 ; and same vertical pos 914 | LDX #0 ; initialize ctr for image 915 | :L7 LDA LASSO2,X ; get image byte 916 | STA PL3,Y ; and put in pl3 917 | INY ; next vertical position 918 | INX ; next image byte 919 | CPX #26 ; 26 bytes moved ? 920 | BNE :L7 ; no go do more 921 | LDA #245 ; yes - set delay for recal 922 | STA VBCTR1 923 | LDA #$80 ; and set status for recall 924 | STA LASTAT 925 | RTS 926 | :L LDA VBCTR1 ; check to see if time 927 | BEQ :L8 ; if = 0 then init recall 928 | RTS ; not time yet 929 | :L8 LDA #$40 ; set status for recall 930 | STA LASTAT ; in progress 931 | LDY VPOSP0 ; get vertical index 932 | LDX #27 ; # of bytes to erase from 933 | LDA #0 ; player 3 934 | :L9 STA PL3,Y ; erase player 3 935 | INY 936 | DEX 937 | BNE :L9 ; not done yet 938 | LDA #1 939 | STA LSCTR 940 | RTS 941 | :L1 LDA VBCTR 942 | AND #1 943 | BEQ :L14 944 | RTS 945 | :L14 LDX LSCTR 946 | LDA #$FF 947 | :L11 ASL A 948 | DEX 949 | BNE :L11 950 | STA MSMASK 951 | LDY VPOSP0 952 | LDX #27 953 | :L12 LDA MISSIL,Y 954 | AND MSMASK 955 | STA MISSIL,Y 956 | INY 957 | DEX 958 | BNE :L12 959 | LDA LSCTR 960 | ADC #1 961 | CMP #10 962 | BEQ :L13 963 | STA LSCTR 964 | RTS 965 | :L13 LDA #0 966 | STA LASTAT 967 | RTS 968 | LASTAT DB 0 969 | LSCTR DB 0 970 | LSCTR1 DB 0 971 | MSMASK DB $FF 972 | 973 | ;checks HIT array (set by DLI) for 974 | ;lasso hits and jumps to a routine 975 | ;which removes the cow so to speak 976 | 977 | CHKHIT PROC 978 | LDX #1 979 | :L LDA HIT,X 980 | BNE :L3 981 | INX 982 | CPX #8 983 | BNE :L 984 | RTS 985 | :L3 LDA #0 986 | STA HIT,X 987 | JSR CLCOW 988 | RTS 989 | COWRTH DB 2,5,10,100 990 | COWCOL DB CGREY+10 991 | DB CYEGRN+8 992 | DB CBLUE1+6 993 | DB 0 994 | COWSP DB 2,3,4,0 995 | LMSHI DB HIGH FENCE 996 | DB HIGH COW 997 | DB HIGH COW 998 | DB HIGH COW 999 | DB HIGH COW 1000 | DB HIGH COW 1001 | DB HIGH COW 1002 | DB HIGH FENCE 1003 | COWVAL DB 0,0,0,0,0,0,0,0 1004 | NEWSCO DB 0 1005 | 1006 | ;sets points to be scored by VBLANK 1007 | ;and advances cow sequence 1008 | 1009 | CLCOW PROC 1010 | LDA #0 1011 | STA VBCTR1 1012 | LDA COWVAL,X 1013 | ADC NEWSCO 1014 | STA NEWSCO 1015 | INC LMSHI,X 1016 | LDA LMSHI,X 1017 | CMP #HIGH ANG 1018 | BEQ NEWCOW 1019 | CMP #HIGH ANG+1 1020 | BEQ NEWCOW 1021 | STA LMSHI,X 1022 | RTS 1023 | 1024 | ;initializes various cow tables and 1025 | ;advances sequence of cows 1026 | 1027 | NEWCOW PROC 1028 | LDA WHICHC,X 1029 | TAY 1030 | LDA COWCOL,Y 1031 | STA LNCOL1,X 1032 | LDA COWRTH,Y 1033 | STA COWVAL,X 1034 | LDA COWSP,Y 1035 | STA LN1SP,X 1036 | CPY #3 1037 | BEQ :L1 1038 | LDA #HIGH COW 1039 | STA LMSHI,X 1040 | LDA #0 1041 | STA SLMS1,X 1042 | LDA #1 1043 | STA LFRT,X 1044 | :L2 LDA #0 1045 | STA NUMHRD,X 1046 | INC WHICHC,X 1047 | LDA WHICHC,X 1048 | CMP #4 1049 | BNE :L 1050 | LDA #0 1051 | STA WHICHC,X 1052 | :L RTS 1053 | :L1 LDA #HIGH ANG 1054 | STA LMSHI,X 1055 | LDA #0 1056 | STA SLMS1,X 1057 | LDA #255 1058 | STA LFRT,X 1059 | LDA RANDOM 1060 | STA ANGCNT 1061 | JMP :L2 1062 | ANGCNT DB 0 1063 | 1064 | ;kills time waiting to put angus on 1065 | ;the screen - angcnt set by random 1066 | ;number for a delay of 0 to 3 sec. 1067 | 1068 | COUNTD PROC 1069 | DEC ANGCNT 1070 | BNE :L 1071 | LDA #1 1072 | STA LFRT,X 1073 | :L RTS 1074 | WHICHC DB 0,1,1,0,2,0,1,0 1075 | TWHICH DB 0,1,1,0,2,0,1,0 1076 | 1077 | ;called from VBLANK. scores the 1078 | ;points accumulated in NEWSCO 1079 | 1080 | SETSCO PROC 1081 | LDA NEWSCO 1082 | BNE :L 1083 | RTS 1084 | :L LDA VBCTR 1085 | AND #3 1086 | BEQ :L3 1087 | RTS 1088 | :L3 DEC NEWSCO 1089 | LDY #5 1090 | :L2 LDA SCORE,Y 1091 | CMP #$19 1092 | BEQ :L1 1093 | ADC #1 1094 | STA SCORE,Y 1095 | RTS 1096 | :L1 LDA #$10 1097 | STA SCORE,Y 1098 | DEY 1099 | BPL :L2 1100 | RTS 1101 | 1102 | ;zeroes the score at game start 1103 | 1104 | CLSCOR PROC 1105 | LDA #0 1106 | STA NEWSCO 1107 | LDY #5 1108 | :L LDA #$10 1109 | STA SCORE,Y 1110 | DEY 1111 | BNE :L 1112 | RTS 1113 | 1114 | ;freezes execution until START 1115 | ;key is pressed 1116 | 1117 | CHEKST PROC 1118 | LDA #8 1119 | STA CONSOL 1120 | :L LDA CONSOL 1121 | CMP #6 1122 | BNE :L 1123 | RTS 1124 | 1125 | ;the game is over so look for a new 1126 | ;high score and show the score - high 1127 | ;score line 1128 | ;upon START key reset some arrays 1129 | 1130 | NEWGAM PROC 1131 | JSR CHKHSC 1132 | JSR CHEKST 1133 | LDA #0 1134 | STA LASTAT 1135 | STA LSCTR 1136 | STA LSCTR1 1137 | JSR CLSCOR 1138 | LDA #LOW SCORLN 1139 | STA SCRLN 1140 | LDA #HIGH SCORLN 1141 | STA SCRLN+1 1142 | LDA #3 1143 | STA COWLFT 1144 | LDA #19 1145 | STA CWLEFT 1146 | LDX #0 1147 | :L LDA TWHICH,X 1148 | STA WHICHC,X 1149 | INX 1150 | CPX #8 1151 | BNE :L 1152 | PLA 1153 | PLA 1154 | PLA 1155 | JMP START 1156 | 1157 | ;AUDF1 is point sound 1158 | ;AUDF2 is clippity clop 1159 | ;AUDF4 is missed cow sound 1160 | ;clippity clop is shaped by a 1161 | ;counter which toggles AUDC2 1162 | 1163 | SOUND PROC 1164 | LDA GAMEND 1165 | BEQ :L 1166 | LDA #0 1167 | STA AUDC1 1168 | STA AUDC2 1169 | STA AUDC3 1170 | STA AUDC4 1171 | RTS 1172 | :L LDA PTFLAG 1173 | BEQ :L1 1174 | LDA NEWSCO 1175 | BEQ :L4 1176 | LDA #0 1177 | STA PTFLAG 1178 | LDA #$A8 1179 | STA AUDC1 1180 | JMP :L4 1181 | :L1 LDA VBCTR 1182 | AND #2 1183 | BNE :L4 1184 | LDA #0 1185 | STA AUDC1 1186 | LDA #1 1187 | STA PTFLAG 1188 | :L4 INC CLIPCT 1189 | LDA CLIPCT 1190 | CMP #21 1191 | BNE :L5 1192 | LDA #0 1193 | STA CLIPCT 1194 | :L5 CMP #0 1195 | BEQ :L6 1196 | CMP #3 1197 | BEQ :L7 1198 | CMP #10 1199 | BEQ :L6 1200 | CMP #12 1201 | BEQ :L7 1202 | CMP #15 1203 | BEQ :L6 1204 | CMP #17 1205 | BEQ :L7 1206 | JMP :L8 1207 | :L6 LDA #$84 1208 | STA AUDC2 1209 | JMP :L8 1210 | :L7 LDA #0 1211 | STA AUDC2 1212 | :L8 LDA MISCOW 1213 | BEQ :L9 1214 | DEC MISCOW 1215 | JMP :L10 1216 | :L9 STA AUDC4 1217 | :L10 RTS 1218 | PTFLAG DB 1 1219 | CLIPCT DB 0 1220 | MISCOW DB 0 1221 | 1222 | END START 1223 | -------------------------------------------------------------------------------- /Snowplow Editor.asm: -------------------------------------------------------------------------------- 1 | .OPT NOLIST 2 | ;----------------------- 3 | ; 4 | ;Scrolling Screen Editor 5 | ;for SNOWPLOW! 6 | ; 7 | ;by: Barry Kolbe 8 | ;and Bryan Schappel 9 | ; 10 | ;----------------------- 11 | ; 12 | *= 0 13 | PASS .= PASS+1 14 | .IF PASS=1 15 | .INCLUDE #D:SYSEQU.M65 16 | .ENDIF 17 | ICP = $3F 18 | SCNMEM = $9000 19 | PMB = $8000 20 | MYPMB = $8400 21 | P1MEM = MYPMB+$0100 22 | CHSET = PMB 23 | TXTWIN = $8B00 24 | CHRLN1 = TXTWIN+40 25 | CHRLN2 = TXTWIN 26 | TXLN = TXTWIN+120 27 | STSLN = TXTWIN+80 28 | SC2 = SCNMEM+128 29 | SC3 = SC2+128 30 | SC4 = SC3+128 31 | SC5 = SC4+128 32 | SC6 = SC5+128 33 | SC7 = SC6+128 34 | SC8 = SC7+128 35 | SC9 = SC8+128 36 | SC10 = SC9+128 37 | BCKUP = $7FC0 38 | ; 39 | *= $80 40 | X1 .DS 1 41 | X2 .DS 1 42 | X3 .DS 1 43 | PGT .DS 1 44 | CREG .DS 1 45 | PXP .DS 2 46 | PYP .DS 1 47 | NYP .DS 1 48 | DRX .DS 2 49 | DRY .DS 2 50 | NPTS .DS 1 51 | INITAB 52 | SPRT .DS 1 53 | LRCRS .DS 1 54 | LRSCRL .DS 1 55 | UDSCRL .DS 1 56 | UDCRS .DS 1 57 | XPOS .DS 1 58 | YPOS .DS 1 59 | PCHR .DS 1 60 | CXPOS .DS 1 61 | LRADD .DS 1 62 | UDADD .DS 1 63 | XERXFLG .DS 1 64 | KCHRS .DS 10 65 | DBH .DS 1 66 | DBV .DS 1 67 | YH2 .DS 1 68 | YH3 .DS 1 69 | DLIDX .DS 1 70 | IL .DS 2 71 | JL .DS 2 72 | ; 73 | ;Display List 74 | ; 75 | *= $7F80 76 | DL1 .BYTE $70,$70,$70 77 | .BYTE $45 78 | SL1 .WORD SCNMEM 79 | .BYTE $45 80 | .WORD SC2 81 | .BYTE $45 82 | .WORD SC3 83 | .BYTE $45 84 | .WORD SC4 85 | .BYTE $45 86 | .WORD SC5 87 | .BYTE $45 88 | .WORD SC6 89 | .BYTE $45 90 | .WORD SC7 91 | .BYTE $45 92 | .WORD SC8 93 | .BYTE $45 94 | .WORD SC9 95 | .BYTE $45 96 | .WORD SC10 97 | .BYTE $C4 98 | .WORD TXTWIN 99 | .BYTE $82,$82,$02,$41 100 | .WORD DL1 101 | .OPT LIST 102 | .OPT NOLIST 103 | ; 104 | ;Display List Interrupt 105 | ; 106 | *= $3000 107 | BEGIN JMP STRT 108 | DLI PHA 109 | LDA #$E0 110 | STA CHBASE 111 | LDA #$0A 112 | STA COLPF1 113 | TXA 114 | PHA 115 | LDX DLIDX 116 | LDA DLICL,X 117 | STA COLPF2 118 | LDA #0 119 | STA COLBK 120 | STA WSYNC 121 | INC DLIDX 122 | PLA 123 | TAX 124 | PLA 125 | RTI 126 | ; 127 | ;Start of Program 128 | ; 129 | STRT LDY #50 130 | MDL LDA DL1,Y 131 | STA BCKUP,Y 132 | DEY 133 | BPL MDL 134 | RSTRT JSR CLRSCN 135 | RBEG JSR CLRTXT 136 | JSR SETSTS 137 | JSR PLRMEM 138 | JSR SETPMG 139 | JSR CLRPM 140 | JSR DEFPLR 141 | LDA #6 142 | LDY #VBI 144 | JSR SETVBV 145 | ; 146 | LDA #>DL1 147 | STA SDLSTL+1 148 | LDA #CHSET 201 | STA CHBASE 202 | INY 203 | STY DLIDX 204 | JMP SYSVBV 205 | ; 206 | ;General Move Routine 207 | ; 208 | GENMOV CMP #7 ;right? 209 | BNE TLF 210 | JMP MVRT 211 | ; 212 | ;Timer 213 | ; 214 | TIME JSR DELAY 215 | JSR SHWXY 216 | LDA #0 217 | STA ATRACT 218 | RTS 219 | ; 220 | TLF CMP #11 ;left? 221 | BNE TUP 222 | JMP MVLF 223 | ; 224 | ;Move Up 225 | ; 226 | TUP CMP #14 227 | BNE TDN 228 | UP1 LDA UDCRS 229 | BEQ AA3 ;scrol? 230 | DEC UDCRS 231 | DEC YPOS 232 | LDA NYP 233 | SEC 234 | SBC #16 235 | STA NYP 236 | TU1 JMP UPDN 237 | AA3 LDA UDSCRL 238 | BEQ NOUD 239 | DEC UDSCRL 240 | DEC YPOS 241 | JSR SCRUP 242 | NOUD RTS 243 | ; 244 | ;Move Down 245 | ; 246 | TDN CMP #13 247 | BNE TUR 248 | DN1 LDA UDCRS 249 | CMP #9 250 | BEQ AA4 ;scroll? 251 | INC UDCRS 252 | INC YPOS 253 | LDA NYP 254 | CLC 255 | ADC #16 256 | STA NYP 257 | JMP TU1 258 | AA4 LDA UDSCRL 259 | CMP #9 260 | BEQ NOUD 261 | INC UDSCRL 262 | JSR SCRDN 263 | INC YPOS 264 | RTS 265 | ;Up-Right 266 | TUR CMP #6 267 | BNE TDR 268 | JSR MVRT 269 | JMP UP1 270 | ;Down-Right 271 | TDR CMP #5 272 | BNE TUL 273 | JSR MVRT 274 | JMP DN1 275 | ;Up-Left 276 | TUL CMP #10 277 | BNE TDL 278 | JSR MVLF 279 | JMP UP1 280 | ;Down-Left 281 | TDL CMP #9 282 | BNE NST 283 | JSR MVLF 284 | JSR DN1 285 | NST RTS 286 | ; 287 | ;Move Up and Down 288 | ; 289 | UPDN JSR PLRMEM 290 | JSR ERSPLR 291 | LDA NYP 292 | STA PYP 293 | JMP PUTPLR 294 | ; 295 | ;Erase Player 296 | ; 297 | ERSPLR LDA #0 298 | LDY PYP 299 | LDX #15 300 | EML STA (IL),Y 301 | INY 302 | DEX 303 | BPL EML 304 | RTS 305 | ; 306 | ;Set up Player Memory 307 | ; 308 | PLRMEM LDA #>MYPMB 309 | STA IL+1 310 | LDA #0 311 | STA IL 312 | RTS 313 | ; 314 | ;Move Right 315 | ; 316 | MVRT LDA LRCRS 317 | CMP #39 318 | BNE AA1 319 | LDA #1 320 | STA LRADD 321 | LDA LRSCRL 322 | CMP #88 ;end scrn 323 | BEQ NOLR 324 | INC LRSCRL 325 | INC XPOS 326 | JSR SCRLR 327 | NOLR RTS 328 | AA1 INC LRCRS 329 | INC XPOS 330 | LDA PXP 331 | CLC 332 | ADC #4 333 | STA PXP 334 | MV1 LDA PXP 335 | STA HPOSP0 336 | RTS 337 | ; 338 | ;Move Left 339 | ; 340 | MVLF LDA LRCRS 341 | BEQ AA2 342 | DEC LRCRS 343 | LDA PXP 344 | SEC 345 | SBC #4 346 | STA PXP 347 | DEC XPOS 348 | JMP MV1 349 | AA2 LDA LRSCRL 350 | BEQ NOLR 351 | DEC LRSCRL 352 | DEC XPOS 353 | LDA #$FF 354 | STA LRADD 355 | JMP SCRLR 356 | ; 357 | ;Close IOCB 358 | ; 359 | CLOSE STX X1 360 | LDA #12 361 | STA ICCOM,X 362 | JSR CIOV 363 | LDX X1 364 | RTS 365 | ; 366 | ;Set up PMG 367 | ; 368 | SETPMG LDA #62 369 | STA SDMCTL 370 | LDA #1 371 | STA GPRIOR 372 | LDA #3 373 | STA GRACTL 374 | LDA #>PMB 375 | STA PMBASE 376 | LDA #$6C 377 | STA PCOLR0 378 | LDA #0 379 | STA SIZEP0 380 | STA SIZEP1 381 | RTS 382 | ; 383 | ;Clear P/M area 384 | ; 385 | CLRPM LDA #>MYPMB 386 | STA IL+1 387 | LDA #0 388 | STA IL 389 | CA2 LDY #0 390 | CA1 STA (IL),Y 391 | INY 392 | BNE CA1 393 | RTS 394 | ; 395 | ;Define Players 396 | ; 397 | DEFPLR LDY #$20 398 | STY NYP 399 | STY PYP 400 | JSR PLRMEM 401 | JSR PUTPLR 402 | LDA #$2E 403 | STA HPOSP0 404 | STA PXP 405 | RTS 406 | ; 407 | ;Put Player on screen 408 | ; 409 | PUTPLR LDY PYP 410 | LDX #0 411 | DF1 LDA PL0DEF,X 412 | STA (IL),Y 413 | INX 414 | INY 415 | CPX #16 416 | BNE DF1 417 | RTS 418 | ; 419 | ;Delay Loop 420 | ; 421 | DELAY LDX #0 422 | STX RTCLOK 423 | YLP1 LDX RTCLOK 424 | CPX #4 425 | BNE YLP1 426 | RTS 427 | ; 428 | DLICL .BYTE $92,$42,$04 429 | NBF .BYTE "000 " 430 | A2I .BYTE $40,$00,$20,$60 431 | PL0DEF .BYTE $FF,$C3,$C3,$C3 432 | .BYTE $C3,$C3,$C3,$C3 433 | .BYTE $C3,$C3,$C3,$C3 434 | .BYTE $C3,$C3,$C3,$FF 435 | P1DEF .BYTE $FC,$C6,$C6,$C6 436 | .BYTE $C6,$C6,$C6,$FC 437 | ; 438 | ;Show Char Set 439 | ; 440 | SHWCRS LDX SPRT 441 | INX 442 | TXA 443 | ASL A 444 | ASL A 445 | ASL A 446 | ASL A 447 | ASL A 448 | TAX 449 | DEX 450 | TXA 451 | LDY #31 452 | SH1 STA CHRLN1+4,Y 453 | STA CHRLN2+4,Y 454 | DEX 455 | TXA 456 | DEY 457 | BPL SH1 458 | RTS 459 | ; 460 | ;Init Memory 461 | ; 462 | INIT LDY #25 463 | LDA #0 464 | INILP STA INITAB,Y 465 | DEY 466 | BPL INILP 467 | ;set up 128 468 | LDY #0 469 | TYA 470 | STA M128L 471 | LDA #>SCNMEM 472 | STA M128H 473 | TLP LDA M128L,Y 474 | CLC 475 | ADC #128 476 | STA M128L+1,Y 477 | LDA M128H,Y 478 | ADC #0 479 | STA M128H+1,Y 480 | INY 481 | CPY #33 482 | BNE TLP 483 | JSR OPNKEY 484 | LDA #>CHSET 485 | STA CHBAS 486 | LDA #192 487 | STA NMIEN 488 | LDA #>DLI 489 | STA VDSLST+1 490 | LDA #SL1 507 | STA JL+1 508 | LDA #SCNMEM 571 | STA IL+1 572 | LDA #0 573 | STA IL 574 | LDX #9 ;10 pages 575 | CS1 LDY #$FF 576 | CSLP STA (IL),Y 577 | DEY 578 | CPY #$FF 579 | BNE CSLP 580 | INC IL+1 581 | DEX 582 | BPL CS1 583 | RTS 584 | ; 585 | ;Character Cursor 586 | ; 587 | CHRCRS LDY #$FF ;erase 588 | LDA #0 589 | CR1 INY 590 | STA P1MEM,Y 591 | CPY #$FF 592 | BNE CR1 593 | ;define playr 594 | LDY #200 595 | LDX #0 596 | CR2 LDA P1DEF,X 597 | STA P1MEM,Y 598 | INY 599 | INX 600 | CPX #8 601 | BNE CR2 602 | LDA #ICP 603 | STA HPOSP0+1 604 | STA PXP+1 605 | LDA #$4D 606 | STA PCOLR1 607 | RTS 608 | ; 609 | ;Move Character Cursor 610 | ; 611 | KSELECT LDX #CHRMES 613 | JSR PRINT 614 | MVCRS LDA STICK0 615 | CMP #$0F 616 | BNE BH 617 | JMP CKTRG2 618 | BH CMP #7 ;rt? 619 | BNE ML 620 | LDA CXPOS 621 | CMP #31 622 | BEQ BB 623 | INC CXPOS 624 | LDA PXP+1 625 | CLC 626 | ADC #4 627 | JMP BF 628 | BB LDA #0 629 | STA CXPOS 630 | LDA #ICP 631 | BNE BF 632 | ; 633 | ML CMP #11 ;lef? 634 | BNE MU 635 | LDA CXPOS 636 | BEQ BE 637 | DEC CXPOS 638 | LDA PXP+1 639 | SEC 640 | SBC #4 641 | BF STA PXP+1 642 | STA HPOSP0+1 643 | JMP SLOW 644 | BE LDA #31 645 | STA CXPOS 646 | LDA #187 647 | BNE BF 648 | ;up 649 | MU CMP #14 650 | BNE MD 651 | LDA SPRT 652 | BEQ BC 653 | DEC SPRT 654 | DOC JSR SHWCRS 655 | JMP SLOW 656 | BC LDA #3 657 | STA SPRT 658 | BNE DOC 659 | ; 660 | MD CMP #13 661 | BNE CKTRG2 662 | INC SPRT 663 | LDA SPRT 664 | CMP #4 665 | BNE DOC 666 | LDA #0 667 | STA SPRT 668 | BEQ DOC 669 | ; 670 | CKTRG2 LDA STRIG0 671 | BNE SJ 672 | JSR CLICK 673 | JSR DELAY 674 | CTR LDA STRIG0 675 | BEQ CTR 676 | LDX SPRT 677 | INX 678 | TXA 679 | ASL A 680 | ASL A 681 | ASL A 682 | ASL A 683 | ASL A 684 | CLC 685 | ADC CXPOS 686 | SEC 687 | SBC #32 688 | STA PCHR 689 | JMP DELAY 690 | SLOW JSR DELAY 691 | SJ JMP MVCRS 692 | ; 693 | ;Print Text x=lo,a=hi 694 | ; 695 | PRINT STX IL 696 | STA IL+1 697 | LDY #$FF 698 | MLP INY 699 | LDA (IL),Y 700 | STA TXLN+2,Y 701 | BPL MLP 702 | AND #$7F 703 | STA TXLN+2,Y 704 | RTS 705 | ; 706 | CHRMES .SBYTE "Choose character" 707 | COLMES .SBYTE "Color register 0-4" 708 | DRWMES .SBYTE "Draw mode" 709 | BLKMES .SBYTE "Block fill" 710 | FNTMES .SBYTE "Loading font" 711 | DEFMES .SBYTE "Define block" 712 | STPMES .SBYTE "Copy block" 713 | ; 714 | ;clearline 715 | ; 716 | CLRLN1 LDY #39 717 | LDA #0 718 | CN1 STA TXLN,Y 719 | DEY 720 | BPL CN1 721 | RTS 722 | ; 723 | ;Clear Text Window 724 | ; 725 | CLRTXT LDY #160 726 | LDA #0 727 | CTLP STA TXTWIN,Y 728 | DEY 729 | CPY #$FF 730 | BNE CTLP 731 | RTS 732 | ; 733 | ;colors 734 | ; 735 | COLORS LDX #COLMES 737 | JSR PRINT 738 | CKEY LDA CH 739 | LDX #$FF 740 | CMP #$FF 741 | BEQ CKEY 742 | CMP #$1C ;out 743 | BEQ CA 744 | LDY #4 745 | CMS CMP CLRKEY,Y 746 | BEQ CCC 747 | DEY 748 | BPL CMS 749 | BMI CKEY 750 | CA STX CH 751 | RTS 752 | CCC LDA CLREG,Y ;offset 753 | STA CREG ;save it 754 | JSR CLRLN1 755 | ;Change Register 756 | LDX #REGMES 758 | JSR PRINT 759 | JSR DISREG 760 | LDY CREG 761 | LDA COLOR0,Y 762 | PHA 763 | AND #$F0 764 | STA X2 765 | PLA 766 | AND #$0F 767 | STA X3 768 | CSTK LDA STICK0 769 | CMP #7 ;rt 770 | BNE CLF 771 | LDA X2 772 | CLC 773 | ADC #16 774 | STA X2 775 | JMP SCOLR 776 | CLF CMP #11 777 | BNE CUP 778 | LDA X2 779 | SEC 780 | SBC #16 781 | STA X2 782 | JMP SCOLR 783 | CUP CMP #14 784 | BNE CDN 785 | INC X3 786 | INC X3 787 | LDA X3 788 | AND #$0F 789 | STA X3 790 | JMP SCOLR 791 | CDN CMP #13 792 | BNE CSTG 793 | DEC X3 794 | DEC X3 795 | LDA X3 796 | AND #$0F 797 | STA X3 798 | SCOLR LDA X2 799 | ORA X3 800 | LDY CREG 801 | STA COLOR0,Y 802 | JSR DISREG 803 | JSR DELAY 804 | CSTG LDA STRIG0 805 | BNE CSTK 806 | CC2 LDA STRIG0 807 | BNE CC2 808 | RTS 809 | ; 810 | CLRKEY .BYTE $32,$1F,$1E,$1A,$18 811 | CLREG .BYTE 0,1,2,3,4 812 | ; 813 | ;Show X/Y Position 814 | ; 815 | SHWXY LDA XPOS 816 | LDX #10 817 | JSR RJUST 818 | LDA YPOS 819 | LDX #16 820 | JSR RJUST 821 | ; 822 | ;Show character 823 | ; 824 | LDY YPOS 825 | JSR WHER 826 | LDY XPOS 827 | LDA (JL),Y 828 | STA STSLN+22 829 | ; 830 | NOERM LDY #3 831 | NLP LDA NOM,Y 832 | STA STSLN+31,Y 833 | DEY 834 | BPL NLP 835 | RTS 836 | ; 837 | ;Right justify a number 838 | ; 839 | RJUST STA FR0 840 | LDA #0 841 | STA FR0+1 842 | TXA 843 | PHA 844 | JSR IFP 845 | JSR FASC 846 | LDY #2 847 | LDA #'0 848 | RJ1 STA NBF,Y 849 | DEY 850 | BPL RJ1 851 | LDY #$FF 852 | RJ2 INY 853 | LDA (INBUFF),Y 854 | BPL RJ2 855 | AND #$7F 856 | STA (INBUFF),Y 857 | INY 858 | TYA 859 | EOR #3 860 | AND #3 861 | TAX 862 | LDY #0 863 | RJ3 LDA (INBUFF),Y 864 | STA NBF,X 865 | INY 866 | INX 867 | CPX #3 868 | BNE RJ3 869 | LDY #3 870 | PLA 871 | TAX 872 | RJ4 LDA NBF,Y 873 | AND #$1F 874 | STA STSLN,X 875 | DEX 876 | DEY 877 | BPL RJ4 878 | RTS 879 | ; 880 | ;Set up Status Line 881 | ; 882 | SETSTS LDY #39 883 | LDA #0 884 | STLP STA STSLN,Y 885 | DEY 886 | BPL STLP 887 | LDY #24 888 | STLX LDA SLD,Y 889 | STA STSLN+5,Y 890 | DEY 891 | BPL STLX 892 | JMP SHWXY 893 | SLD .SBYTE "X:000 Y:000 CHAR: " 894 | .SBYTE "Error:" 895 | ; 896 | WHER LDA M128L,Y 897 | STA JL 898 | LDA M128H,Y 899 | STA JL+1 900 | RTS 901 | ; 902 | DRAW LDA #$FF 903 | STA NPTS 904 | LDA #>DRWMES 905 | LDX #BLKMES 979 | LDX #FNTMES 1065 | JSR PRINT 1066 | JSR GTNAME 1067 | BCC FAA 1068 | RTS 1069 | FAA LDX #$10 1070 | JSR CLOSE 1071 | LDA #3 1072 | STA ICCOM,X 1073 | LDA #>FNAME 1074 | STA ICBAH,X 1075 | LDA #CHSET 1088 | STA ICBAH,X 1089 | LDA #0 1090 | STA ICBAL,X 1091 | LDA #4 1092 | STA ICBLH,X 1093 | LDA #0 1094 | STA ICBLL,X 1095 | JSR CIOV 1096 | STY X2 1097 | BMI IOERR 1098 | LDX #$10 1099 | JSR CLOSE 1100 | JMP NOERM 1101 | ; 1102 | IOERR LDX #$10 1103 | JSR CLOSE 1104 | JSR ZFR0 1105 | LDA X2 1106 | LDX #34 1107 | JSR RJUST 1108 | JMP GETKEY 1109 | ; 1110 | ;Open keyboard 1111 | ; 1112 | OPNKEY LDX #$20 1113 | JSR CLOSE 1114 | LDA #3 1115 | STA ICCOM,X 1116 | LDA #>KDEV 1117 | STA ICBAH,X 1118 | LDA #LODMES 1242 | LDX #FNAME 1254 | STA ICBAH,X 1255 | LDA #SCNMEM 1265 | STA ICBAH,X 1266 | LDA #SAVMES 1288 | LDX #QUTMES 1293 | LDX #SYSVBV 1306 | JSR SETVBV 1307 | JMP WARMSV 1308 | NOQ RTS 1309 | ; 1310 | ;Clear Map 1311 | CLRMAP LDA #>SURMES 1312 | LDX #DEFMES 1359 | LDX #STPMES 1411 | LDX #KEYMES 1473 | LDX #PMG ;store address 66 | STA PMBASE ;of PMG area 67 | LDA #0 68 | LDX #3 69 | INIT2 70 | STA SIZEP0,X ;zero sizes, 71 | STA HPOSP0,X ;horizontal 72 | STA XPOSP0,X ;positions 73 | DEX ;for all 74 | BNE INIT2 ;players 75 | ; 76 | ;load alien shape into player 77 | ; 78 | LDA #ALIEN ;page 8 bytes 81 | STA SHAPE+1 82 | CLC 83 | LDA #$04 ;store address 84 | ADC #>PMG ;where player 85 | STA PLYRSTRT+1 ;is to be 86 | LDA #180 ;stored into 87 | STA PLYRSTRT ;page 0 bytes 88 | STA YPOSP0 ;and variable 89 | JSR COPYPLAYER ;store image 90 | ; 91 | ;load car shape into player 1 92 | ;the same way as the alien 93 | ; 94 | LDA #CAR 97 | STA SHAPE+1 98 | CLC 99 | LDA #$05 100 | ADC #>PMG 101 | STA PLYRSTRT+1 102 | LDA #122 103 | STA PLYRSTRT 104 | STA YPOSP0+1 105 | JSR COPYPLAYER 106 | ; 107 | ;set up PMG environment 108 | ; 109 | LDA #30 ;top of alien 110 | STA TOP ;movement area. 111 | LDA #200 ;bottom of alien 112 | STA BOTTOM ;movement area. 113 | LDA #28 ;alien is yellow 114 | STA PCOLR0 115 | LDA #86 ;car is purple 116 | STA PCOLR0+1 117 | LDA #62 ;single-line PMG 118 | STA SDMCTL ;resolution 119 | LDA #1 ;car is double 120 | STA SIZEP0+1 ;wide 121 | LDA #3 ;enable PMG 122 | STA GRACTL 123 | LDA #120 ;alien starts in 124 | STA HPOSP0 ;middle of scree 125 | STA XPOSP0 126 | LDA #1 ;initial direc- 127 | STA DIRECT ;tion is up 128 | ; 129 | ;commence player movement: 130 | ;alien moves only vertically, 131 | ;car moves only horizontally 132 | 133 | ACTION 134 | LDX #15 ;do nothing 135 | JSR DELAY ;for a bit 136 | INC XPOSP0+1 ;move car 1 137 | LDA XPOSP0+1 ;position to 138 | STA HPOSP0+1 ;the right 139 | CLC 140 | LDA #$04 ;store initial 141 | ADC #>PMG ;RAM position 142 | STA PLYRSTRT+1 ;of alien in 143 | LDA YPOSP0 ;page bytes 144 | STA PLYRSTRT 145 | ; 146 | ;logic to figure out if alien is 147 | ;be moved up or down 148 | ; 149 | LDA DIRECT ;current dir 150 | BNE CHKTOP ;up, check top 151 | CHKBOT 152 | LDA YPOSP0 ;is he at the 153 | CMP BOTTOM ;bottom? 154 | BEQ UP ;yes. move up 155 | BNE DOWN ;no. move down 156 | CHKTOP 157 | LDA YPOSP0 ;is he at the 158 | CMP TOP ;top? 159 | BNE UP ;no, move up 160 | DOWN 161 | JSR MOVEDOWN ;move him down 162 | LDA #0 ;current direc- 163 | STA DIRECT ;tion is down 164 | CLC ;keep going 165 | BCC ACTION 166 | UP 167 | JSR MOVEUP ;move him up 168 | LDA #1 ;current direc- 169 | STA DIRECT ;tion is up 170 | CLC ;keep going 171 | BCC ACTION 172 | ;******************************** 173 | ; END OF MAIN PROGRAM 174 | ;******************************** 175 | ; 176 | ; 177 | ;******************************** 178 | ;SUBROUTINES START HERE 179 | ;******************************** 180 | ; 181 | ;open screen in Graphics 3 182 | ; 183 | OPENSCREEN 184 | LDX #$60 185 | LDA #OPEN 186 | STA ICCOM,X 187 | LDA #SCREEN 190 | STA ICBAL+1,X 191 | LDA #12 192 | STA ICAX1,X 193 | LDA #3 194 | STA ICAX2,X 195 | JSR CIOV 196 | RTS 197 | ; 198 | ;copy player from data region 199 | ;to desired PMG location 200 | ; 201 | COPYPLAYER 202 | LDY #0 ;get no. of 203 | LDA (SHAPE),Y ;bytes of 204 | STA NBYTES ;player data 205 | INC NBYTES ;to be moved 206 | LDY #1 207 | PLOOP 208 | LDA (SHAPE),Y ;copy to PMG 209 | STA (PLYRSTRT),Y ;area 210 | INY ;data area 211 | CPY NBYTES ;all bytes yet? 212 | BNE PLOOP ;no, keep going 213 | RTS ;yes, stop 214 | ; 215 | ;do-nothing delay subroutine 216 | ;number in X-register deternines 217 | ;length of delay 218 | ; 219 | DELAY 220 | LDY #0 221 | DELAY2 222 | DEY 223 | BNE DELAY2 224 | DEX 225 | BNE DELAY 226 | RTS 227 | 228 | ;sub. to Move alien shape down 229 | ;one line (up one byte in RAM) 230 | 231 | MOVEDOWN 232 | LDY ALIEN ;get # bytes 233 | LOOPDOWN 234 | LDA (PLYRSTRT),Y ; get a byte 235 | INY ;store one 236 | STA (PLYRSTRT),Y ;byte higher 237 | DEY ;point to 238 | DEY ;lower byte 239 | BPL LOOPDOWN ;go until 240 | INC YPOSP0 ;new Y position 241 | RTS 242 | 243 | ;sub. to Move alien shape up 244 | ;one line (down one byte in RAM) 245 | 246 | MOVEUP 247 | LDA ALIEN ;# bytes to move 248 | STA NBYTES ;is 1 more than 249 | INC NBYTES ;# player bytes 250 | LDY #1 251 | LOOPUP 252 | LDA (PLYRSTRT),Y ;get a byte 253 | DEY ;store 1 254 | STA (PLYRSTRT),Y ;byte lower 255 | INY ;point to 256 | INY ;next one 257 | CPY NBYTES ;done all? 258 | BNE LOOPUP ;no, go on 259 | DEC YPOSP0 ;new Y position 260 | RTS 261 | ; 262 | ;data values needed 263 | ; 264 | SCREEN .text 'S' 265 | ; 266 | ;data for player shapes are 267 | ;stored in unused portion of 268 | ;PMG area 269 | ; 270 | ;*= PMG ; for atasm 271 | .org PMG ;for MADS 272 | ; 273 | ;normal alien 274 | ; 275 | ALIEN 276 | .BYTE 14,60,24,126,189,189 277 | .BYTE 189,189,60,50,36 278 | .BYTE 36,36,102,0 279 | ; 280 | ;car shape 281 | ; 282 | CAR 283 | .BYTE 15,126,195,219,219 284 | .BYTE 91,219,219,219,219 285 | .BYTE 91,219,219,195,126,0 286 | 287 | ; *= $02E0 ; for atasm 288 | ;.org $2e0 ;for MADS 289 | .segment "Launcher" 290 | 291 | .WORD START 292 | 293 | -------------------------------------------------------------------------------- /scrl19.asm: -------------------------------------------------------------------------------- 1 | ;.OPT NOEJECT 2 | ;MAPSCROLL VERSION 1.9 3 | ; 4 | ;This program sets up a map using a special character set. 5 | ;It displays this map in graphics mode 2. 6 | ;Using the joystick, the user can smoothly scroll over the map. 7 | ;This program must be orged on a page boundary. 8 | ;The page number is stored on page 6 by the program; 9 | ;the programmer must modify lines 490,1730,3490, and 4640 10 | ;whenever the program is re-orged. 11 | ; 12 | ;Page zero RAM 13 | ; 14 | ;*=$CB 15 | ORG $CB 16 | DLSTPT .word 0 ;*=*+2 ;Zero page pointer to display list 17 | MAPLO .byte 0 ;*=*+1 ;Used only during initialization 18 | MAPHI .byte 0 ;*=*+1 ;Used only during initialization 19 | ; 20 | VVBLKD=$0224 ;Deferred vertical blank interrupt vector 21 | DLSTLO=$0230 ;Existing OS pointer to display list 22 | DLSTHI=$0231 23 | TXTMSC=$0294 24 | COLOR0=$02C4 25 | COLOR1=$02C5 26 | COLOR2=$02C6 27 | COLOR3=$02C7 28 | COLOR4=$02C8 29 | CHBAS=$02F4 30 | STICK=$0278 ;OS value of joystick port 0 31 | RANDOM=$D20A ;Hardware random number generator 32 | HSCROLL=$D404 ;ANTIC horizontal scroll register 33 | VSCROLL=$D405 ;ANTIC vertical scroll register 34 | NMIEN=$D40E 35 | CHBASE=$D409 ;ANTIC version of CHBAS 36 | SETVBV=$E45C 37 | XITVBV=$E462 38 | ; 39 | ;Page 6 usage 40 | ; 41 | ;*=$0600 42 | ORG $0600 43 | ; 44 | BASE .byte 0 ; *=*+1 ;Saves starting page # of module 45 | OFFLO .byte 0 ;*=*+1 ;How far to offset new LMS value 46 | OFFHI .byte 0 ; *=*+1 47 | XPOSL .byte 0 ; *=*+1 ;Horizontal position of 48 | XPOSH .byte 0 ; *=*+1 ;upper left corner of screen window 49 | YPOSL .byte 0 ; *=*+1 ;Vertical position of 50 | YPOSH .byte 0 ; *=*+1 ;upper left corner of screen window 51 | ;*=$6000 ;Change this to relocate 52 | org $6000 53 | ;First comes 512 bytes of new character set 54 | ;Make sure it's exactly 512 bytes long! 55 | ;Put in zeros if necessary. 56 | ; 57 | ;Each line has one character (8 bytes) 58 | ; 59 | .BYTE $00,$20,$70,$F8,$00,$08,$1C,$3E 60 | .BYTE $00,$08,$1C,$3E,$00,$20,$70,$F8 61 | .BYTE $00,$03,$04,$08,$10,$38,$7C,$FE 62 | .BYTE $00,$00,$08,$1C,$3E,$7F,$00,$00 63 | .BYTE $00,$00,$08,$1C,$3E,$00,$00,$00 64 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 65 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 66 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 67 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 68 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 69 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 70 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 71 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 72 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 73 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 74 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 75 | .BYTE $10,$01,$98,$42,$09,$95,$40,$08 76 | .BYTE $24,$A0,$05,$08,$60,$13,$84,$28 77 | .BYTE $08,$14,$28,$81,$55,$80,$12,$20 78 | .BYTE $08,$20,$94,$09,$32,$88,$22,$08 79 | .BYTE $24,$18,$43,$10,$AC,$81,$10,$0C 80 | .BYTE $24,$28,$40,$96,$41,$B8,$02,$20 81 | .BYTE $08,$A0,$19,$A2,$10,$42,$04,$30 82 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 83 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 84 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 85 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 86 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 87 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 88 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 89 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 90 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 91 | .BYTE $00,$18,$3C,$7E,$7E,$3E,$18,$00 92 | .BYTE $00,$02,$67,$7F,$7F,$3E,$3C,$18 93 | .BYTE $00,$30,$38,$3C,$1E,$0E,$0C,$00 94 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 95 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 96 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 97 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 98 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 99 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 100 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 101 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 102 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 103 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 104 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 105 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 106 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 107 | .BYTE $5A,$00,$5B,$5B,$00,$DA,$40,$02 108 | .BYTE $44,$16,$00,$B4,$B2,$00,$36,$10 109 | .BYTE $69,$00,$4D,$2D,$00,$68,$2D,$00 110 | .BYTE $50,$00,$D3,$5B,$00,$D9,$1B,$00 111 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 112 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 113 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 114 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 115 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 116 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 117 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 118 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 119 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 120 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 121 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 122 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 123 | ;The display list goes here; it is 43 bytes long. 124 | ;For simplicity I reserve 64 bytes for you. 125 | ;ORG *+64 126 | DLIST .DS 64 127 | 128 | ; 129 | ;This next area is reserved for the text window 130 | ;I reserved 192 bytes but only 160 bytes are used 131 | ;org *+192 132 | RSVD .DS 192 133 | ; 134 | ;The map data goes here. 135 | ;I reserve 8 pages (2K) for the map data. 136 | ;To change the size of the map you must change this allocation 137 | ; 138 | ;ORG *+$800 139 | ;.DS $800 140 | MAP .DS $800 141 | ;Next I reserve 1 page for terrain frequencies. 142 | ;The desired frequency of each terrain type is encoded here. 143 | ;This data is only useful for randomly generated maps 144 | ; 145 | .BYTE $30,$30,$02,$30,$30,$00,$00,$00 146 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 147 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 148 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 149 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 150 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 151 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 152 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 153 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 154 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 155 | .BYTE $40,$40,$40,$40,$40,$40,$40,$00 156 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 157 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 158 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 159 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 160 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 161 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 162 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 163 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 164 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 165 | .BYTE $08,$08,$08,$00,$00,$00,$00,$00 166 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 167 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 168 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 169 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 170 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 171 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 172 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 173 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 174 | .BYTE $00,$00,$00,$00,$00,$00,$00,$00 175 | .BYTE $04,$04,$04,$04,$00,$00,$00,$00 176 | .BYTE $00,$00,$00,$00,$00,$00,$FF,$FF 177 | ; 178 | ;This is the beginning of the initialization program 179 | ;JSR here to run this module 180 | ; 181 | 182 | START 183 | LDA #$60 ;Change this operand to relocate program 184 | STA BASE ;Save for future reference 185 | ; 186 | ;Now set up new display list 187 | ; 188 | CLC 189 | ADC #$02 190 | STA DLSTPT+1 191 | LDA #$00 192 | STA DLSTPT 193 | ; 194 | LDY #$00 195 | LDA #$70 ;'Skip 8 lines' opcode 196 | STA (DLSTPT),Y 197 | INY 198 | STA (DLSTPT),Y 199 | INY 200 | STA (DLSTPT),Y ;Start by skipping 24 lines 201 | INY 202 | LDX #$0A ;set up ten display list instructions 203 | LDA #$00 204 | STA OFFLO ;map data stored starting at BASE+$300 205 | LDA #$03 206 | STA OFFHI 207 | MAKEDL LDA #$77 ;Mode 2 line with 208 | STA (DLSTPT),Y ;HSCROLL, VSCROLL, and LMS bits set 209 | INY 210 | LDA OFFLO 211 | STA (DLSTPT),Y ;New LMS low byte 212 | INY 213 | LDA BASE 214 | CLC 215 | ADC OFFHI 216 | STA (DLSTPT),Y ;New LMS high byte 217 | INY 218 | LDA OFFLO 219 | CLC 220 | ADC #$40 ;This operand sets total width of map 221 | STA OFFLO 222 | BCC Y1 223 | INC OFFHI 224 | Y1 DEX 225 | BNE MAKEDL 226 | ; 227 | DEY ;back up three bytes for correction 228 | DEY 229 | DEY 230 | LDA #$57 ;no vertical scrolling for this mode byte 231 | STA (DLSTPT),Y 232 | INY 233 | INY 234 | INY 235 | LDA #$80 ;This generates a display list interrupt 236 | STA (DLSTPT),Y 237 | INY 238 | LDA #$42 239 | STA (DLSTPT),Y 240 | INY 241 | LDA #$40 242 | STA (DLSTPT),Y 243 | INY 244 | LDA BASE 245 | CLC 246 | ADC #$02 247 | STA (DLSTPT),Y 248 | INY 249 | LDA #$02 250 | STA (DLSTPT),Y 251 | INY 252 | STA (DLSTPT),Y 253 | INY 254 | STA (DLSTPT),Y 255 | INY 256 | LDA #$41 257 | STA (DLSTPT),Y 258 | INY 259 | LDA #$00 260 | STA (DLSTPT),Y 261 | INY 262 | LDA BASE 263 | CLC 264 | ADC #$02 265 | STA (DLSTPT),Y 266 | ; 267 | ;Display list is in now. 268 | ;Now turn ANTIC onto it. 269 | ; 270 | LDA #$00 271 | STA DLSTLO 272 | LDA DLSTPT+1 273 | STA DLSTHI 274 | ; 275 | LDA BASE 276 | STA CHBAS ;This turns on new character set 277 | ; 278 | LDA #$11 ;Set up colors 279 | STA COLOR4 280 | LDA #$0C 281 | STA COLOR3 282 | LDA #$C8 283 | STA COLOR1 284 | ; 285 | LDA #$00 ;Set up pointers to map data 286 | STA MAPLO 287 | LDA BASE 288 | CLC 289 | ADC #$03 290 | STA MAPHI 291 | ADC #$08 292 | STA DLSTPT+1 ;Use DLSTPT as a new pointer 293 | ; 294 | ;This section randomly generates a map. 295 | ;It is unnecessary if you use a fixed map. 296 | ; 297 | LDX #$08 298 | LOOP LDY RANDOM 299 | LDA (DLSTPT),Y 300 | BEQ LOOP 301 | CMP RANDOM 302 | BCC LOOP 303 | TYA 304 | LDY #$00 305 | STA (MAPLO),Y 306 | INC MAPLO 307 | BNE LOOP 308 | INC MAPHI 309 | DEX 310 | BNE LOOP 311 | ; 312 | ;Initialize position of map 313 | ; 314 | LDA #$B0 315 | STA XPOSL 316 | LDA #$01 317 | STA XPOSH 318 | LDA #$00 319 | STA YPOSL 320 | STA YPOSH 321 | ; 322 | LDA DLSTLO ;Restore display list pointer 323 | STA DLSTPT 324 | LDA DLSTHI 325 | STA DLSTPT+1 326 | ; 327 | ;Now turn BASIC onto text window 328 | ; 329 | LDA #$40 330 | STA TXTMSC 331 | LDA BASE 332 | CLC 333 | ADC #$02 334 | STA TXTMSC+1 335 | ; 336 | ;Now enable deferred vertical blank interrupt 337 | ; 338 | LDY #$00 339 | LDA BASE 340 | CLC 341 | ADC #$0E 342 | TAX ;Set up for interrupt enabling routine 343 | LDA #$07 344 | JSR SETVBV 345 | LDA #$00 ;This is DLI vector (low byte) 346 | STA $0200 347 | LDA BASE 348 | CLC 349 | ADC #$0F ;This is DLI vector (high byte) 350 | STA $0201 351 | LDA #$C0 352 | STA NMIEN ;Turn interrupts on 353 | 354 | SPIN JMP SPIN 355 | RTS ;Finished 356 | ; 357 | ;From here to $6E00 is expansion area 358 | ;This is the vertical blank interrupt routine 359 | ;It reads the joystick and scrolls the screen 360 | ; 361 | ;*=$6E00 362 | ORG $6E00 363 | LDA #$00 364 | STA OFFLO 365 | STA OFFHI ;zero the offset 366 | LDA STICK ;get joystick reading 367 | PHA ;save it on stack for other bit checks 368 | AND #$04 ;joystick left? 369 | BNE CHKRT ;no, move on 370 | LDA XPOSL ;yes, check for left edge 371 | BNE X1 372 | LDX XPOSH 373 | BEQ CHKUP ;at left edge, move on 374 | X1 SEC ;decrement x-coordinate 375 | SBC #$01 376 | BCS X2 377 | DEC XPOSH 378 | X2 STA XPOSL 379 | AND #$07 380 | STA HSCROLL ;fine scroll 381 | CMP #$07 ;scroll overflow? 382 | BNE CHKUP ;no, move on 383 | INC OFFLO ;yes, mark it for offset 384 | CLV 385 | BVC CHKUP ;no point in checking for joystick right 386 | CHKRT PLA ;get back joystick byte 387 | PHA ;save it again 388 | AND #$08 ;joystick right? 389 | BNE CHKUP ;no, move on 390 | LDA XPOSL 391 | CMP #$B0 392 | BNE X3 393 | LDX XPOSH ;right edge of map? 394 | BNE CHKUP ;yes, move on 395 | X3 CLC ;no, increment x-coordinate 396 | ADC #$01 397 | STA XPOSL 398 | BCC X4 399 | INC XPOSH 400 | X4 AND #$07 401 | STA HSCROLL ;fine scroll 402 | BNE CHKUP ;scroll overflow? if not, move on 403 | DEC OFFLO ;yes, set up offset for character scroll 404 | DEC OFFHI 405 | CHKUP PLA ;joystick up? 406 | LSR 407 | PHA 408 | BCS CHKDN ;no, ramble on 409 | LDA YPOSL ;yes 410 | CMP #$60 411 | BNE X6 412 | LDX YPOSH ;top edge of map? 413 | BNE CHKDN ;yes, shuffle on 414 | X6 CLC ;no, increment y-coordinate 415 | ADC #$01 416 | BCC X7 417 | INC YPOSH 418 | X7 STA YPOSL 419 | AND #$0F 420 | STA VSCROLL ;fine scroll 421 | BNE CHKDN ;scroll overflow? If not, amble on 422 | LDA OFFLO ;yes, set up offset for character scroll 423 | CLC 424 | ADC #$40 425 | STA OFFLO 426 | LDA OFFHI 427 | ADC #$00 428 | STA OFFHI 429 | CHKDN PLA ;joystick down? 430 | LSR 431 | BCS CHGDL ;no, trudge on 432 | LDA YPOSL 433 | BNE X8 434 | LDX YPOSH ;bottom of map? 435 | BEQ CHGDL ;yes, drift on 436 | X8 SEC ;no, decrement y-coordinate 437 | SBC #$01 438 | STA YPOSL 439 | BCS X9 440 | DEC YPOSH 441 | X9 AND #$0F 442 | STA VSCROLL ;fine scroll 443 | CMP #$0F ;scroll overflow? 444 | BNE CHGDL ;no, move on 445 | LDA OFFLO ;yes, mark offset 446 | SEC 447 | SBC #$40 448 | STA OFFLO 449 | LDA OFFHI 450 | SBC #$00 451 | STA OFFHI 452 | ; 453 | ;In this loop we add the offset values to the existing 454 | ;LMS addresses of all display lines. 455 | ;This scrolls the characters. 456 | ; 457 | CHGDL LDY #$04 458 | DLOOP LDA (DLSTPT),Y 459 | CLC 460 | ADC OFFLO 461 | STA (DLSTPT),Y 462 | INY 463 | LDA (DLSTPT),Y 464 | ADC OFFHI 465 | STA (DLSTPT),Y 466 | INY 467 | INY 468 | CPY #$22 469 | BNE DLOOP 470 | JMP XITVBV ;exit vertical blank routine 471 | ; 472 | ;From here to $6F00 is expansion RAM 473 | ; 474 | ; 475 | ;This DLI routine changes the character set for the text window 476 | ; 477 | ;*=$6F00 478 | ORG $6F00 479 | DLISRV PHA 480 | LDA #$E0 481 | STA CHBASE 482 | PLA 483 | RTI 484 | 485 | ORG $02E0 486 | .WORD START 487 | -------------------------------------------------------------------------------- /speedski.asm: -------------------------------------------------------------------------------- 1 | ************************** 2 | * * 3 | * SPEEDSKI * 4 | * * 5 | * By Bill Richardson * 6 | * * 7 | * Copyright (c) 1985 * 8 | * ANALOG Computing * 9 | * * 10 | ************************** 11 | ; 12 | ;OS EQUATES 13 | ;---------- 14 | ; 15 | HPOSP0 = $D000 ;Plr0 horiz pos 16 | HPOSP1 = $D001 ;Plr1 horiz pos 17 | P0PF = $D004 ;Plr0 collision 18 | GRACTL = $D01D ;Graphics ctrl 19 | HITCLR = $D01E ;Collision reg 20 | CONSOL = $D01F ;Consol keys 21 | AUDF1 = $D200 ;Audio Freq 1 22 | AUDC1 = $D201 ;Audio Ctrl 1 23 | AUDF2 = $D202 ;Audio Freq 2 24 | AUDC2 = $D203 ;Audio Ctrl 2 25 | AUDCTL = $D208 ;Main audio ctrl 26 | SKCTL = $D20F ;Serial ctrl 27 | VSCROL = $D405 ;Vert Scroll reg 28 | PMBASE = $D407 ;P/M base addr 29 | SETVBV = $E45C ;Set VBLANK 30 | SYSVBV = $E45F ;Exit VBLANK 31 | ; 32 | ;PAGE ZERO 33 | ;--------- 34 | ; 35 | *= $80 36 | ; 37 | CLOCK .DS 7 ;Special clock 38 | SCROLLED .DS 1 ;# lines scrolled 39 | SCROLFLG .DS 1 ;Scroll done flag 40 | SPEED .DS 1 ;Scrolling speed 41 | XPOS .DS 1 ;Skier's horz pos 42 | YPOS .DS 1 ;Skier's vert pos 43 | IMAGEPTR .DS 2 ;Image pntr 44 | TIMES .DS 1 ;Course scrl cnt 45 | TIMESFLG .DS 1 ;End course flg 46 | VOLUME .DS 1 ;Volume of sounds 47 | ; 48 | ;SHADOW REGISTERS, ETC. 49 | ;---------------------- 50 | ; 51 | ATRACT = 77 ;Attract mode flg 52 | SAVMSC = 88 ;Scrn memory pntr 53 | SDMCTL = $022F ;DMA enable 54 | SDLSTL = $0230 ;Disp List pntr 55 | GPRIOR = $026F ;Priority reg 56 | STICK0 = $0278 ;Joystick 0 57 | STRIG0 = $0284 ;Stick trigger 0 58 | PCOLR0 = $02C0 ;Player 0 color 59 | PCOLR1 = $02C1 ;Player 1 color 60 | COLOR0 = $02C4 ;Playfld Color 0 61 | CHBAS = $02F4 ;CH Base addr 62 | CH = $02FC ;Last Key pressed 63 | ; 64 | *= $3000 65 | ; 66 | SCRN1 .DS 480 ;1st screen 67 | SCRN2 .DS 480 ;2nd screen 68 | SCRN3 .DS 480 ;3rd screen 69 | SCRN4 .DS 480 ;4th screen 70 | SCRN5 .DS 480 ;5th screen 71 | SCRN6 .DS 240 ;6th screen 72 | SCRLFIN .DS 240 ;End scrl adr 73 | ; 74 | *= $0400 75 | ; 76 | PMSTART .DS $0200 ;P/M area 77 | PLR0 .DS $80 ;Player0 78 | PLR1 .DS $80 ;Player1 79 | ; 80 | ;CHARACTER SET 81 | ;------------- 82 | ; 83 | *= $2000 84 | ; 85 | CHSET .BYTE 0,0,0,0,0,0,0,0,128,128 86 | .BYTE 128,170,130,170,0,170 87 | .BYTE 0,0,0,8,8,10,0,170 88 | .BYTE 0,0,0,32,32,160,32,160 89 | .BYTE 21,16,16,21,16,16,21,0 90 | .BYTE 65,17,17,80,16,16,64,0 91 | .BYTE 80,16,80,0,64,64,64,0 92 | .BYTE 64,64,64,64,64,64,64,0 93 | .BYTE 64,64,64,64,64,64,64,0 94 | .BYTE 0,84,65,65,85,68,65,65 95 | .BYTE 0,16,0,17,17,17,17,17 96 | .BYTE 0,0,0,81,17,81,17,81 97 | .BYTE 0,1,1,81,1,1,1,81 98 | .BYTE 0,0,0,81,16,17,17,17 99 | .BYTE 0,0,24,24,0,24,24,0,0,0 100 | .BYTE 0,0,0,24,24,0,126,103 101 | .BYTE 103,103,103,103,127,63 102 | .BYTE 28,60,124,28,28,28,127 103 | .BYTE 127,126,103,7,127,112 104 | .BYTE 115,115,127,126,103,7 105 | .BYTE 63,7,103,127,63,6,15,27 106 | .BYTE 51,127,127,7,15,126,96 107 | .BYTE 126,103,7,103,127,63 108 | .BYTE 126,103,96,126,103,103 109 | .BYTE 127,63,126,103,7,14,28 110 | .BYTE 28,28,28,126,103,103 111 | .BYTE 127,103,103,127,63,126 112 | .BYTE 103,103,127,7,103,127 113 | .BYTE 63,0,0,0,0,0,0,0,1 114 | .BYTE 1,1,5,21,21,85,85,85 115 | .BYTE 0,64,64,80,64,80,84,84 116 | .BYTE 0,0,0,1,5,1,0,0 117 | .BYTE 5,21,21,85,85,85,0,0 118 | .BYTE 85,85,85,85,85,85,63,63 119 | .BYTE 85,85,85,85,85,85,0,0 120 | .BYTE 0,0,64,80,84,85,0,0 121 | .BYTE 0,0,15,60,0,252,15,0 122 | .BYTE 192,192,192,252,204,207 123 | .BYTE 192,207,0,0,0,0,0,192,0 124 | .BYTE 192,0,0,15,60,48,0,0,0 125 | .BYTE 252,207,195,192,192,192 126 | .BYTE 192,192,0,0,192,0,0,0,0 127 | .BYTE 0,0,0,0,0,0,0,0,2,0,0,2 128 | .BYTE 2,10,42,170,170,32,168 129 | .BYTE 168,170,170,170,170,170 130 | .BYTE 0,0,0,0,0,128,160,160 131 | .BYTE 0,0,0,0,0,2,0,0,2,10,10 132 | .BYTE 42,170,170,0,0,170,170 133 | .BYTE 170,170,170,170,3,3,170 134 | .BYTE 170,170,170,170,170,252 135 | .BYTE 252,168,170,170,170,170 136 | .BYTE 170,0,0,0,0,128,160,168 137 | .BYTE 170,0,0,0,0,0,0,0,0,1,5 138 | .BYTE 0,0,1,5,21,85,85,85 139 | .BYTE 20,85,85,85,85,85,85,85 140 | .BYTE 0,0,80,84,85,85,85,85 141 | .BYTE 0,0,0,0,0,80,84,85 142 | .BYTE 0,0,1,5,0,0,0,0 143 | .BYTE 21,85,85,85,0,0,0,0,85 144 | .BYTE 85,85,85,0,0,0,0,85,85 145 | .BYTE 85,85,255,255,255,255 146 | .BYTE 85,85,85,85,192,192,192 147 | .BYTE 192,85,85,85,85,0,0,0,0 148 | .BYTE 64,80,84,85,0,0,0,0 149 | .BYTE 0,0,0,64,0,0,0,0,2,10 150 | .BYTE 10,10,42,42,42,42,0,128 151 | .BYTE 160,160,160,168,168,168 152 | .BYTE 0,2,2,2,0,0,0,0,170,170 153 | .BYTE 170,170,170,3,3,3,168 154 | .BYTE 170,170,170,170,192,192 155 | .BYTE 192,0,0,0,0,128,0,0,0 156 | .BYTE 1,5,5,5,21,21,21,21 157 | .BYTE 0,64,80,80,80,84,84,84 158 | .BYTE 0,1,1,1,0,0,0,0,85,85 159 | .BYTE 85,85,85,3,3,3,84,85,85 160 | .BYTE 85,85,192,192,192 161 | .BYTE 0,0,0,0,64,0,0,0 162 | .BYTE 0,0,0,252,15,0,63,0,48 163 | .BYTE 48,60,60,255,63,252,63 164 | .BYTE 0,0,0,240,0,252,0,240 165 | .BYTE 240,60,15,0,0,0,0,0,60 166 | .BYTE 60,255,60,63,60,60,60 167 | .BYTE 12,192,192,0,0,0,0,0 168 | .BYTE 0,0,0,0,192,240,255,255 169 | .BYTE 0,0,0,0,0,0,0,192 170 | .BYTE 0,0,0,0,0,0,0,0 171 | .BYTE 0,0,0,0,0,0,0,3,0,0,0 172 | .BYTE 0,3,15,255,255,192,192 173 | .BYTE 192,192,192,192,192,192 174 | .BYTE 3,3,3,3,3,3,3,3,42,37 175 | .BYTE 38,38,38,38,37,42,170 176 | .BYTE 85,170,0,0,170,85,170 177 | .BYTE 160,96,160,0,0,160,96 178 | .BYTE 96,0,0,0,0,0,170,149 179 | .BYTE 154,0,0,0,0,0,168,88 180 | .BYTE 152,0,0,0,0,0,170,149 181 | .BYTE 154,0,0,0,0,0,138,137 182 | .BYTE 137,0,0,0,0,0,168,88 183 | .BYTE 168,0,0,0,0,0,42,37,42 184 | .BYTE 2,2,2,2,2,170,85,170,96 185 | .BYTE 96,96,96,96,96,96,160 186 | .BYTE 152,154,149,154,152,152 187 | .BYTE 152,168,152,152,88,168 188 | .BYTE 0,0,0,0,152,154,150,154 189 | .BYTE 152,154,149,170,9,9,9,9 190 | .BYTE 9,137,137,138,128,160 191 | .BYTE 96,160,128,168,88,168 192 | .BYTE 0,0,0,0,0,170,149,154 193 | .BYTE 0,0,0,0,0,128,160,104 194 | .BYTE 42,37,38,38,38,38,37,42 195 | .BYTE 170,85,170,0,0,170,85 196 | .BYTE 170,160,96,160,0,0,162 197 | .BYTE 98,98,0,0,0,0,0,162,98 198 | .BYTE 98,0,0,0,0,0,162,98,98 199 | .BYTE 0,0,0,0,0,170,86,154 200 | .BYTE 154,152,152,152,154,154 201 | .BYTE 149,170,152,152,152,152 202 | .BYTE 152,104,160,128,0,0,0,0 203 | .BYTE 0,42,37,42,2,2,2,2,2 204 | .BYTE 170,85,170,98,98,98,98 205 | .BYTE 98,98,98,162,105,102,90 206 | .BYTE 102,105,106,98,162,160 207 | .BYTE 128,0,128,160,98,98,162 208 | .BYTE 152,152,152,152,152,154 209 | .BYTE 86,170,0,0,0,17,65,1,1 210 | .BYTE 1,0,16,16,81,17,17,16 211 | .BYTE 81,0,0,0,84,0,84,4,84 212 | .BYTE 0,0,0,84,68,68,68,84 213 | .BYTE 0,0,0,64,84,68,68,68 214 | .BYTE 0,0,0,0,0,0,0,0 215 | .BYTE 0,0,0,0,0,0,0,0 216 | .BYTE 0,0,0,0,0,0,0,0 217 | ; 218 | ;MESSAGES 219 | ;-------- 220 | ; 221 | GAMELOGO .BYTE 88,89,90,91,92,93,94,95 222 | .BYTE 104,105,106,107,108,109 223 | .BYTE 110,111,96,97,98,99,100 224 | .BYTE 101,102,103,112,113,114 225 | .BYTE 115,116,117,118,119 226 | MYNAME .BYTE 1,2,3,0,4,5,6,7,8,0,9 227 | .BYTE 10,12,13,11,120,121,122 228 | .BYTE 123,124 229 | ; 230 | ;DISPLAY LIST 231 | ;------------ 232 | ; 233 | DLIST .BYTE $70,$70,$44 234 | .WORD $00 235 | .BYTE $04,$00,$04,$65 236 | .WORD $4000 237 | .BYTE $25,$25,$25,$25 238 | .BYTE $25,$25,$25,$25 239 | .BYTE $25,$25,$05,$41 240 | .WORD DLIST 241 | ; 242 | ;P/M SHAPES 243 | ;---------- 244 | ; 245 | IM1 .BYTE 12,0,24,0,24,24 246 | .BYTE 60,0,124,0,48,136 247 | .BYTE 56,68,36,2,72,0 248 | .BYTE 72,34,0,68,0,136 249 | IM2 .BYTE 0,0,12,0,24,0 250 | .BYTE 24,24,60,0,24,36 251 | .BYTE 60,66,60,0,36,0 252 | .BYTE 36,0,0,36,0,36 253 | IM3 .BYTE 48,0,24,0,24,24 254 | .BYTE 60,0,62,0,12,17 255 | .BYTE 28,34,36,64,18,0 256 | .BYTE 18,68,0,34,0,17 257 | IM4 .BYTE 4,0,25,2,25,28 258 | .BYTE 254,0,185,0,120,128 259 | .BYTE 56,128,40,0,64,20 260 | .BYTE 76,34,65,0,0,0 261 | IM5 .BYTE 16,0,24,0,128,96 262 | .BYTE 88,24,58,4,45,2 263 | .BYTE 28,0,26,0,34,0 264 | .BYTE 66,129,0,66,0,4 265 | ; 266 | ;Initial screen colors 267 | ;--------------------- 268 | ; 269 | COLTBL .BYTE 184,180,20,52,14 270 | ; 271 | ;Copy screens 272 | ;------------ 273 | ; 274 | PRGSTART LDX #0 275 | COPY1 LDA SCRNBASE,X 276 | STA SCRN1,X 277 | STA SCRN4,X 278 | LDA SCRNBASE+480,X 279 | STA SCRN2,X 280 | STA SCRN5,X 281 | LDA SCRNBASE+960,X 282 | STA SCRN3,X 283 | STA SCRN6,X 284 | INX 285 | BNE COPY1 286 | COPY2 LDA SCRNBASE+256,X 287 | STA SCRN1+256,X 288 | STA SCRN4+256,X 289 | LDA SCRNBASE+736,X 290 | STA SCRN2+256,X 291 | STA SCRN5+256,X 292 | LDA SCRNBASE+1216,X 293 | STA SCRN3+256,X 294 | STA SCRN6+256,X 295 | INX 296 | CPX #224 297 | BNE COPY2 298 | LDA #0 299 | TAX 300 | CLEAR1 STA SCRN6+480,X ;Clr bottom 301 | INX ;of scrolling 302 | BNE CLEAR1 ;screen memory 303 | LDA SAVMSC 304 | STA DLIST+3 ;Set DLIST 305 | LDA SAVMSC+1 ;pointer to 306 | STA DLIST+4 ;screen memory 307 | LDA #0 ;Clear 308 | LDY #120 ;top 309 | CLEARSCR STA (SAVMSC),Y ;of 310 | DEY ;screen 311 | BPL CLEARSCR 312 | LDX #4 313 | COLORSCR LDA COLTBL,X ;color tbl 314 | STA COLOR0,X 315 | DEX 316 | BPL COLORSCR 317 | LDA # DLIST ;find custom 320 | STA SDLSTL+1 ;Display List 321 | LDY #27 ;This routine 322 | LDX #15 ;puts the top 16 323 | I1 LDA GAMELOGO,X ;characters of 324 | STA (SAVMSC),Y ;"SPEEDSKI" 325 | DEY ;logo on the 326 | DEX ;screen 327 | BPL I1 328 | LDY #67 ;Puts 329 | LDX #31 ;the last 330 | I2 LDA GAMELOGO,X 331 | STA (SAVMSC),Y ;16 characters 332 | DEY ;of logo on 333 | DEX ;the screen 334 | CPX #15 335 | BNE I2 336 | LDA # >CHSET ;Give computer 337 | STA CHBAS ;adr of new CHSET 338 | LDA #0 ;Initialize 339 | STA AUDCTL ;POKEY 340 | LDA #3 ;sound 341 | STA SKCTL ;chip 342 | LDA #2 ;Enable 343 | STA GRACTL ;P/M graphics 344 | LDA # >PMSTART ;Tell where PM 345 | STA PMBASE ;graphics are 346 | JSR ERASE ;Clear P/M memory 347 | LDA #40 ;Multi-color plrs 348 | STA GPRIOR ;Set P/M priority 349 | LDA #152 ;light blue 350 | STA PCOLR0 351 | LDA #118 ;blue 352 | STA PCOLR1 353 | LDA #46 ;Double line 354 | STA SDMCTL ;resolution plrs 355 | LDY #110 356 | LDX #19 ;This routine 357 | I3 LDA MYNAME,X ;puts the 358 | STA (SAVMSC),Y ;author's name 359 | DEY ;on the 3rd line 360 | DEX ;of the screen 361 | BPL I3 362 | ; 363 | ;EVERY TIME INITIALIZATION 364 | ;------------------------- 365 | ; 366 | INIT LDA # SCRN1 ;screen 369 | STA DLIST+10 370 | LDA #0 ;Reset # scan 371 | STA SCROLLED ;lines scrolled 372 | STA TIMESFLG ;and TIMESFLG 373 | STA TIMES ;+ course scroll 374 | STA SCROLFLG ;Do scrolling 375 | LDA #1 ;Set scroll speed 376 | STA SPEED ;to slow 377 | LDA #0 ;Set 378 | LDX #6 ;clock 379 | I4 STA CLOCK,X ;to 380 | DEX ;0:00.00 381 | BPL I4 382 | STX CLOCK+2 ;"." character 383 | STX CH ;Reset last key 384 | DEX 385 | STX CLOCK+5 ;":" character 386 | LDA #120 ;Set horizontal 387 | STA XPOS ;pos of skier 388 | LDA #36 ;Set vertical 389 | STA YPOS ;pos of skier 390 | ; 391 | ;BEGIN GAME 392 | ;---------- 393 | ; 394 | WAITLOOP LDA CONSOL 395 | ROR A ;START Pressed? 396 | BCC LETSGO ;Yes! start game 397 | LDA STRIG0 ;Trigger pressed? 398 | BNE WAITLOOP ;No, wait 399 | LETSGO JSR CLEAR3RD ;Clr 3rd line 400 | LDA #6 ;Chg ANTIC 4 line 401 | STA DLIST+7 ;to GR.1 line 402 | STA ATRACT ;Reset Attract 403 | JSR SCROLLIT ;Start VBLANK 404 | ; 405 | ;INTRODUCTION 406 | ;------------ 407 | ; 408 | LDA XPOS ;Position the 409 | STA HPOSP0 ;skier 410 | STA HPOSP1 ;horizontally 411 | INTRO JSR ERASE ;Erase skier 412 | LDA # IM2 ;to 415 | STA IMAGEPTR+1 ;draw 416 | JSR DRAW ;Go draw skiers 417 | INC YPOS ;Move down screen 418 | LDA YPOS ;See if skier has 419 | CMP #72 ;reached middle 420 | BEQ MAINLOOP ;of screen? Yes. 421 | LDA YPOS ;Vert position 422 | LSR A ;/2 423 | LSR A ;/4 424 | LSR A ;/8 425 | STA AUDF1 ;Set frequency, 426 | STA AUDC1 ;vol, distortion 427 | LDX #10 ;HI byte and LO 428 | LDY #0 ;byte of delay 429 | JSR DELAY ;Slow down action 430 | JMP INTRO ;Do it again 431 | ; 432 | ;THE MAIN LOOP 433 | ;------------- 434 | ; 435 | MAINLOOP STA HITCLR ;Clr Collision 436 | LDA STICK0 ;Read joystick 437 | CMP #5 ;Down and right? 438 | BEQ MP2A ;Go draw skier 439 | CMP #6 ;Up and right? 440 | BEQ MP2 441 | CMP #7 442 | BNE MP3 443 | MP2 DEC SPEED 444 | MP2A JMP RIGHT 445 | ; 446 | MP3 CMP #9 ;Down and left? 447 | BEQ MP5A 448 | CMP #10 ;Up and left? 449 | BEQ MP5 450 | CMP #11 ;Left? 451 | BNE MP6 452 | MP5 DEC SPEED 453 | MP5A JMP LEFT 454 | ; 455 | MP6 CMP #13 ;Down? 456 | BNE MP7 457 | INC SPEED 458 | JMP STRAIGHT 459 | ; 460 | MP7 CMP #14 ;Up? 461 | BNE MP8 462 | DEC SPEED 463 | JSR TESTSPD 464 | DEC SPEED 465 | MP8 JMP STRAIGHT 466 | ; 467 | CONTINUE LDA XPOS ;Horizontal pos 468 | STA HPOSP0 ;Position Plr0 469 | STA HPOSP1 ;Position Plr1 470 | LDA CH ;Last key pressed 471 | CMP #255 472 | BEQ MP9 ;No key pressed 473 | JSR PAUSE ;Activate pause 474 | MP9 LDA CONSOL 475 | CMP #6 ;START pressed? 476 | BNE MP10 ;No. 477 | JMP INIT ;Start over 478 | ; 479 | MP10 LDA P0PF ;Check collision 480 | BEQ MP11 ;Nobody crashed 481 | JSR CRASH ;Crash occured 482 | MP11 LDX #12 483 | LDY #0 484 | JSR DELAY ;Slow the action 485 | LDA SCROLFLG ;scrolling? 486 | BEQ MP12 ;Yes. continue 487 | JMP ENDGAME 488 | ; 489 | MP12 JSR TESTX ;Skier's X coord 490 | JMP MAINLOOP ;Loop back 491 | ; 492 | ;Delay subroutine 493 | ;---------------- 494 | ; 495 | DELAY DEY 496 | BNE DELAY 497 | DEX 498 | BNE DELAY 499 | RTS 500 | ; 501 | ;Erase players 0 & 1 502 | ;------------------- 503 | ; 504 | ERASE LDA #0 505 | TAX 506 | MP13 STA PLR0,X ;Erase Plr0 507 | STA PLR1,X ;Erase Plr1 508 | DEX 509 | BNE MP13 510 | RTS 511 | ; 512 | ;Start scrolling & clock 513 | ;----------------------- 514 | ; 515 | SCROLLIT LDX # >VBI 516 | LDY # SYSVBV 523 | LDY # IM3 ;skier 550 | STA IMAGEPTR+1 551 | LDA #6 552 | BNE LEFT1 553 | ; 554 | ;Set skier to left 555 | ;----------------- 556 | ; 557 | LEFT JSR TESTSPD 558 | DEC XPOS 559 | LDA # IM1 ;skier 562 | STA IMAGEPTR+1 563 | LDA #4 564 | LEFT1 STA AUDF1 565 | LDA #12 566 | LEFT2 STA AUDC1 567 | JSR DRAW 568 | JMP CONTINUE 569 | ; 570 | ;Set skier to straight 571 | ;--------------------- 572 | ; 573 | STRAIGHT JSR TESTSPD 574 | LDA # IM2 ;skier 577 | STA IMAGEPTR+1 578 | LDA #2 579 | STA AUDF1 580 | LDA #8 581 | BNE LEFT2 582 | ; 583 | ;Test scrolling speed 584 | ;-------------------- 585 | ; 586 | TESTSPD LDA SPEED 587 | CMP #65 ;Is it > maximum? 588 | BNE MP14 ;No 589 | DEC SPEED ;Make maximum 590 | RTS 591 | MP14 LDA SPEED ;Speed < minimum? 592 | BNE MP15 ;No. 593 | INC SPEED ;Make minimum 594 | MP15 RTS 595 | ; 596 | ;Pause subroutine 597 | ;---------------- 598 | ; 599 | PAUSE JSR HALT ;Stop scrolling 600 | LDA #255 ;Reset last 601 | STA CH ;key pressed 602 | MP16 LDA CONSOL ;Wait for OPTION 603 | CMP #3 ;to be 604 | BNE MP16 ;pressed 605 | JMP SCROLLIT 606 | ; 607 | ;Gameover 608 | ;-------- 609 | ; 610 | ENDGAME JSR HALT ;Stop scrolling 611 | LDA #121 ;note C 612 | STA AUDF1 613 | LDA #166 ;with pure tone 614 | STA AUDC1 ;and some volume 615 | LDX #0 ;hold the tone 616 | LDY #0 ;for a while 617 | JSR DELAY 618 | LDA #96 ;note E 619 | STA AUDF1 620 | LDA #121 ;note C 621 | STA AUDF2 622 | LDA #170 ;with pure tone 623 | STA AUDC1 ;and more volume 624 | STA AUDC2 625 | LDX #128 ;Hold tone half 626 | JSR DELAY ;as long 627 | LDA #81 ;note G 628 | STA AUDF1 629 | LDA #96 ;note E 630 | STA AUDF2 631 | LDA #172 ;more volume 632 | STA AUDC1 633 | STA AUDC2 634 | LDX #192 ;Hold tone 635 | JSR DELAY 636 | LDA #60 ;note C 637 | STA AUDF1 638 | LDA #81 ;note G 639 | STA AUDF2 640 | LDA #174 ;more volume 641 | STA AUDC1 642 | STA AUDC2 643 | JSR DELAY ;Hold note twice 644 | JSR DELAY ;as long as 1st 645 | LDA #0 646 | STA AUDC1 ;Turn off 647 | STA AUDC2 ;sound 648 | MP17 LDA CONSOL ;See if START 649 | ROR A ;pressed 650 | BCC MP18 651 | LDA STRIG0 ;If trig pressed 652 | BNE MP17 ;start game over 653 | MP18 JMP INIT 654 | ; 655 | ;Crash! 656 | ;------ 657 | ; 658 | CRASH LDA #1 ;Stop 659 | STA SCROLFLG ;scrolling 660 | LDA #15 ;Set volume 661 | STA VOLUME ;to loud 662 | MP19 LDA #255 663 | STA AUDF1 664 | SBC VOLUME ;255-VOLUME 665 | STA AUDF2 ;for Freq 2 666 | LDA VOLUME ;dist 0+VOLUME 667 | STA AUDC1 ;for Ctrl 1 668 | ADC #192 ;Dist 12+VOLUME 669 | STA AUDC2 ;for Ctrl 2 670 | DEC VOLUME ;Reduce volumn 671 | LDX #20 672 | JSR DELAY 673 | LDA VOLUME ;See if VOLUME=0 674 | BNE MP19 675 | LDA # IM4 ;skier 678 | STA IMAGEPTR+1 ;image 679 | JSR DRAW 680 | LDX #30 681 | JSR DELAY 682 | LDA # IM5 ;skier 685 | STA IMAGEPTR+1 ;image 686 | JSR DRAW 687 | JSR DELAY 688 | JSR DELAY 689 | JSR DELAY 690 | LDA #0 ;Enable 691 | STA SCROLFLG ;scroll again 692 | LDA # IM2 ;up 695 | STA IMAGEPTR+1 ;again 696 | LDA #1 ;Reset speed 697 | STA SPEED ;to slow 698 | JMP DRAW 699 | ; 700 | ;Clear screen's 3rd line 701 | ;----------------------- 702 | ; 703 | CLEAR3RD LDA #0 704 | LDY #120 705 | MP20 STA (SAVMSC),Y 706 | DEY 707 | CPY #79 708 | BNE MP20 709 | RTS 710 | ; 711 | ;Test skier's X position 712 | ;----------------------- 713 | ; 714 | TESTX LDA XPOS 715 | CMP #47 716 | BNE MP21 717 | INC XPOS 718 | RTS 719 | ; 720 | MP21 CMP #196 721 | BNE MP22 722 | DEC XPOS 723 | MP22 RTS 724 | ; 725 | ;VERTICAL BLANK INTERRUPT 726 | ;------------------------ 727 | ; 728 | VBI LDA SCROLFLG ;If not 0 do 729 | BNE VBICLOCK ;not scroll 730 | ; 731 | ;Calculate scroll speed 732 | ;---------------------- 733 | ; 734 | LDA SPEED ;Current speed 735 | LSR A ;/2 736 | LSR A ;/4 737 | LSR A ;/8 738 | LSR A ;/16 If not zero 739 | BNE VB1 ;do fine scroll 740 | LDX #1 ;If 0 make it 1 741 | BNE SCROLLON 742 | ; 743 | VB1 TAX 744 | ; 745 | ;Perform fine scroll 746 | ;------------------- 747 | ; 748 | SCROLLON INC SCROLLED ;lines scrolled 749 | LDA SCROLLED 750 | STA VSCROL ;put in vscrol 751 | CMP #16 ;reached limit? 752 | BEQ COARSE ;coarse scroll 753 | DEX ;No. Scroll until 754 | BNE SCROLLON ;X=0 755 | BEQ VBICLOCK ;Handle clock 756 | ; 757 | ;Do a coarse scroll 758 | ;------------------ 759 | ; 760 | COARSE LDA #0 ;Reset the fine 761 | STA VSCROL ;scroll reg and # 762 | STA SCROLLED ;lines scrolled 763 | LDA DLIST+9 ;DLIST's LO byte 764 | CLC 765 | ADC #40 ;Add 40 (1 line) 766 | STA DLIST+9 ;New LO byte 767 | BCC COMPEND ;Over 256? No. 768 | INC DLIST+10 ;Inc HI byte 769 | ; 770 | ;Check on scrolling limit 771 | ;------------------------ 772 | ; 773 | COMPEND LDA TIMESFLG 774 | BNE COMPDONE ;check scrolling 775 | LDA DLIST+10 ;DLIST HI byte 776 | CMP # >SCRN4 ;Reached end? 777 | BNE VBICLOCK ;No, skip this 778 | LDA DLIST+9 ;Examine LO byte 779 | CMP # SCRN1 ;Yes! 782 | STA DLIST+10 ;Flip back to 783 | LDA # SCRLFIN ;Reached? 798 | BNE VBICLOCK ;No 799 | LDA DLIST+9 ;DLIST LO byte 800 | CMP #