====== NOSTROMO.ASM ====== The AX-2 Nostromo N60 BASIC/Z80 machine code port-in-progress to 6809 assembly ===== CODE ===== This code is an incomplete snapshot of a project in progress. ;********************************************************************* ;* Title: NOSTROMO.ASM ;********************************************************************* ;* Author: ;* R. Allen Murphey ;* ;* License: ;* Copyright (c) 2020-2022 R. Allen Murphey. All Rights Reserved. ;* ;* Description: ;* AX-2 Uchu Yusosen Nostromo / Space Transport Nostromo ;* ;* Documentation: ;* https://exileinparadise.com/tandy_color_computer:nostromo ;* ;* Include Files: ;* See end of listing ;* ;* Assembler: ;* lwasm 1.4+ ;* ;* Revision History: ;* Rev # Date Who Comments ;* ----- ----------- ------ --------------------------------------- ;* 00 2020-2022 RAM Initial port/conversion ;********************************************************************* ;********************************************************************* ;* NEC PC-6001 MEMORY MAP - Z80, AY-3-8910 PSG, N60 BASIC ;********************************************************************* ; C200-C3FF SCREEN MEMORY ; C400-E163 BASIC PROGRAM ; E164- MACHINE CODE ; F300-F7FF RELOCATED MACHINE CODE ; F800/F801 ALIEN POS X Y ; F802/F802 PLAYER POS X Y ; F804/F805 ALIEN MOVE X Y ; F806 - TOTAL ITEMS HELD ; F807-F80A - COUNT OF EACH ITEM HELD ; F80B - PLAYER CAUGHT? 0 = NO 1 = YES ; F80C ; F80D ; F80E ; F80F - PLAYER HIT WALL FLAG FOR SOUND? ;********************************************************************* ;* COCO 1,2,3 MEMORY MAP - 6809, DAC, Super/Extended/Color BASIC ;********************************************************************* ; 0000 - 03FF BASIC VARIABLES ; 0400 - 05FF NOSTROMO SG4 ; 0600 - 1DFF DOS and RAM ; 1E00 - 35FF NOSTROMO RG6 ; 3600 - 36FF NOSTROMO VARIABLES ; 3900 - 55FF NOSTROMO CODE ; 5600 - 61FF DATA FONT ; 6200 - 7EFF RAM ; 7F00 - 7FFF BASIC STACK ; 8000 - DFFF NOSTROMO 256x192x16 ; E000 - FDFF RAM ; FE00 - FEFF COCO3 VECTOR PAGE ; FF00 - FFEF COCO MMIO ; FFF0 - FFFF MPU VECTORS ;********************************************************************* ;* EQUATES ;********************************************************************* RESET: equ $FFFE ; Address of MPU Reset Vector VECCOCO: equ $A027 ; CoCo 1/2 reset vector value VECDRGN: equ $B3B4 ; Dragon32/64 reset vector value VECCOCO3: equ $8C1B ; CoCo3 reset vector value ;********************************************************************* ;* GLOBALS ;********************************************************************* org $3600 ; see memory map above align $0200 ; align on text mode screen sized chunks COLORRAM: rmb 512 ; lets hold an entire fore/back colormap ;********************************************************************* ;* PLATFORM DATA ;********************************************************************* align 2 ; 6809s love 16-bits PLATFORM: rmb 1 ; WHICH PLATFORM ARE WE ON 1,2,3,32,64 VIDDRV: rmb 1 ; WHICH VIDEO DRIVER TO USE AUDDRV: rmb 1 ; WHICH AUDIO DRIVER TO USE INPDRV: rmb 1 ; WHICH INPUT DRIVER TO USE ;********************************************************************* ;* INPUT DRIVER DATA ;********************************************************************* INKEYB: rmb 8 ; STORE PIA VALUES HERE OUTKEY: rmb 56 ; DECODED KEYS GO HERE ;********************************************************************* ;* VIDEO DRIVER DATA ;********************************************************************* VIDRAM: rmb 2 ; START OF VIDEO RAM FOR RENDERER ENDVID: rmb 2 ; END OF VIDEO RAM FOR RENDERER COUNTER: rmb 2 ; 16-BIT COUNTER FONTPTR: rmb 2 ; POINTER TO START OF FONT CHAR BITMAPS SCRNPTR: rmb 2 ; POINTER TO SCREEN RAM LOCATION MAPPTR: rmb 2 ; POINTER INTO THE MAP OF THE SCREEN CLRPTR: rmb 2 ; POINTER TO THE COLOR FG/BG TO DRAW COUNT: rmb 1 ; COUNT OF SCREEN CHARACTER TO DRAW TX: rmb 1 ; TILE X COLUMN TO DRAW ON 0-31 TY: rmb 1 ; TILE Y ROW TO DRAW ON 0-15 PX: rmb 1 ; PIXEL X 0-255 / OFFSET TX * 4 PY: rmb 1 ; PIXEL Y 0-191 ROW TO DRAW ON 0-191 SX: rmb 1 ; SCREEN X SY: rmb 1 ; SCREEN Y ROW: rmb 1 ; CHARACTER BITMAP ROW TO DRAW $00-$0B COLOR: rmb 1 ; COLOR $00-$0F TO DRAW ON COCO3 CLRFORE: rmb 1 ; FOREGROUND COLOR $00-$0F CLRBACK: rmb 1 ; BACKGROUND COLOR $00-$0F INDEXIX rmb 1 ; TEMP VARIABLE FOR LOOPS INDEXIY rmb 1 ; TEMP VARIABLE FOR LOOPS STRPTR: rmb 2 ; address pointer to start of string to show STRLEN: rmb 1 ; fixed string length to type out NEXTSCREEN: ; Next screen offset used in BAS5010 rmb 1 ;********************************************************************* ;* AUDIO DRIVER DATA ;********************************************************************* ; FIXME SHADOW REGISTERS FOR DACS ; FIXME SHADOW REGISTERS FOR PSG ; FIXME SHADOW REGISTERS FOR SSG ; FIXME SHADOW REGISTERS FOR DCSG ;********************************************************************* ;* GAME DATA ;********************************************************************* ALIENX: rmb 1 ; ALIEN CURRENT X 0-31 ALIENY: rmb 1 ; ALIEN CURRENT Y 0-15 ALIENDX: rmb 1 ; ALIEN DIRECTION X -1, 0, +1 ALIENDY: rmb 1 ; ALIEN DIRECTION Y -1, 0, +1 PLAYERX: rmb 1 ; PLAYER X 0-31 PLAYERY: rmb 1 ; PLAYER Y 0-15 PLAYERDX: rmb 1 ; PLAYER DIRECTION X -1, 0, +1 PLAYERDY: rmb 1 ; PLAYER DIRECTION Y -1, 0, +1 CR: rmb 1 ; CR = CREW REMAINING EE: rmb 1 ; FIXME some sort of exit flag PH: rmb 1 ; PH = Player Held? NEC $F806 count of items completed? PH0: rmb 1 ; PH0 = Player Held 0 NEC $F807 count of Diamonds PH1: rmb 1 ; PH1 = Player Held 1 NEC $F808 count of Clubs PH2: rmb 1 ; PH2 = Player Held 2 NEC $F809 count of Hearts PH3: rmb 1 ; PH3 = Player Held 3 NEC $F80A count of Spades PM: rmb 1 ; PM = PLAYER MISSION: gather this many of each item PS0: rmb 1 ; PS0 = Placed in Shuttle 0 Diamonds PS1: rmb 1 ; PS1 = Placed in Shuttle 1 Clubs PS2: rmb 1 ; PS2 = Placed in Shuttle 2 Hearts PS3: rmb 1 ; PS3 = Placed in Shuttle 3 Spades SC: rmb 2 ; SC = SCORE SS: rmb 1 ; SS = SCREEN # to SHOW TL: rmb 2 ; TL = TIME LEFT (in seconds) ; T = TIME ; H = INVOKE HELP HACK CAUGHT: rmb 1 ; CAUGHT = PLAYER CAUGHT FLAG HITWALL: rmb 1 ; HITWALL = PLAYER HIT WALL FLAG KEYPRESS: rmb 1 ; Value of key pressed ;********************************************************************* ;* TABLES AND STRINGS (translated from ASCII to COCO values) ;********************************************************************* ; Strings used in BAS0001-BAS0009 TXTNAME: fcc 'NOSTROMO' ; Copyright 1982 ASCII TXTCOPY: fcb $43,$0F,$10,$19,$12,$09,$07,$08,$14,$60,$71,$79,$78,$72,$60,$41,$53,$43,$49,$49 ; by HIROMI OHBA TXTAUTH: fcb $02,$19,$60,$48,$49,$52,$4F,$4D,$49,$60,$4F,$48,$42,$41 SCREENTABLE: ; Table of Next Screen values for BAS5010 fdb 1,1,3,4,2,1,1,4,2,5,1,1,1,6,1,1,5,1,1,6,0 SCORE: fcc 'SCORE' TIME: fcc 'TIME' CREWLEFT: fcb $60,$F0,$60,$F0,$60,$F0 SPACE: fcb $60 PLAYER: fcb $F0 ALIEN: fcb $40 ;********************************************************************* ;* JUMP TABLE POINTERS ;********************************************************************* IINIT: rmb 2 ; Indirect vector to INIT ICLEAR: rmb 2 ; Indirect vector to CLEAR IDRAWCH: rmb 2 ; Indirect vector to DRAWCH ISCREEN: rmb 2 ; Indirect vector to SCREEN ;********************************************************************* ;* JUMP TABLE ;********************************************************************* org $3900 ; see memory map above INIT: jmp [IINIT] ; Initialize video device CLEAR: jmp [ICLEAR] ; Clear screen DRAWCH: jmp [IDRAWCH] ; Draw character SCREEN: jmp [ISCREEN] ; Draw screen ;********************************************************************* ;* CONFIG - Determine machine type and configuration ;********************************************************************* CONFIG: ; FIXME cheap hack to test screens lda $FF ; POKE 255,screennumber before start cmpa #1 ; $0255 = 1? beq CONFIG10 ; VDG SG4 32x16x9 tile cmpa #2 ; $0255 = 2? beq CONFIG20 ; VDG T1 SG4 32x16x9 tile with lowercase cmpa #3 ; $0255 = 3? beq CONFIG30 ; VDG VGA SG4 32x16x9 tile + custom font cmpa #4 ; $0255 = 4? beq CONFIG40 ; VDG RG6 / PMODE 4 256x192x2 pixel cmpa #5 ; $0255 = 5? beq CONFIG50 ; ACVC / GIME 256x192x16 pixel CONFIG2: ; FIXME start of autodetect and config menus ldx RESET ; Read MPU reset value to detect hardware cmpx #VECCOCO ; Is CoCo1, CoCo2, CoCo2B? beq CONFIG10 ; yes, go configure that cmpx #VECDRGN ; Is Dragon32, 64, Tano? beq CONFIG10 ; yes, go configure that ; FIXME Is CoCo2B beq CONFIG20 ; yes, go configure that ; FIXME Is CoCoVGA? beq CONFIG30 ; yes, go configure that ; FIXME IS RG6? beq CONFIG40 ; yes, go configure that cmpx #VECCOCO3 ; Is CoCo3? beq CONFIG50 ; yes, go configure that CONFIG10: ; CoCo, Dragon jsr SG4 ; Setup SG4 screen bra CONFIGEX ; exit config CONFIG20: ; CoCo2B jsr VDGT1 ; Setup SG4 on T1 bra CONFIGEX ; exit config CONFIG30: ; CoCoVGA jsr VGA ; Setup SG4 on CoCoVGA bra CONFIGEX ; exit config CONFIG40: ; RG6 jsr RG6 ; Setup RG6 on VDG bra CONFIGEX ; exit config CONFIG50: ; ACVC jsr ACVC ; Setup 256x192x16 on ACVC / GIME bra CONFIGEX ; exit configg CONFIGEX: ; Exit the config routine jsr CLEAR ; clear whatever screen we're configured for clr SS ; start "show screen" at zero jsr RNDINIT ; we need to initialize PRNG somewhere ;********************************************************************* ;* COPYRIGHT ;* Display a copyright screen from original REM statements ;* Entry Values ;* None ;* Exit Values ;* None ;* Control Register Modifications ;* A,X,Y ;* Subroutines Called ;* COLOR1,HLINE,VLINE,PRINTAT ;********************************************************************* COPYRIGHT: ; 1 REM************************** ; 2 REM* * ; 3 REM* NOSTROMO * ; 4 REM* * ; 5 REM* Copyright 1982 ASCII * ; 6 REM* * ; 7 REM* by HIROMI OHBA * ; 8 REM* * ; 9 REM************************** ; 12345678901234567890123456 jsr COLOR1 ; Setup white letters on black background BAS0001: ; Draw box top lda #3 ; start drawing at ... sta TX ; ... column 3 sta TY ; ... row 3 lda #29 ; for 29 horizontal characters sta INDEXIX ; working varable for horizontal count ldb #$6A ; '* to draw jsr HLINE ; now go draw horizonal line of * ; Draw box left side ldd #$0304 ; draw vertical line of * at column 3 sta TX ; ... column 3 stb TY ; ... row 4 lda #11 ; for 8 vertical characters sta INDEXIY ; working variable for vertical count ldb #$6A ; '* to draw jsr VLINE ; now go draw vertical line of * ; Draw box right side ldd #$1C04 ; draw vertical line of * at column 29 sta TX ; ... column 29 stb TY ; ... row 4 lda #11 ; for 8 vertical characters sta INDEXIY ; working varable for vertical count ldb #$6A ; '* to draw jsr VLINE ; now go draw vertical line of * ; Draw box bottom ldd #$030B ; start drawing at ... sta TX ; ... column 3 stb TY ; ... row 11 lda #29 ; for 29 horizontal characters sta INDEXIX ; working variable for horizontal count ldb #$6A ; '* to draw jsr HLINE ; now go draw horizontal line of * ; Draw TXTNAME program name message ldd #$0C05 ; start drawing at ... sta TX ; ... column 12 stb TY ; ... row 5 ldx #TXTNAME ; load X with pointer to string stx STRPTR ; ... and store in temp lda #8 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; Draw TXTCOPY copyright message ldd #$0707 ; start drawing at ... sta TX ; ... column 7 stb TY ; ... row 7 ldx #TXTCOPY ; load X with pointer to string stx STRPTR ; ... and store in temp lda #20 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; Draw TXTAUTH author message ldd #$0909 ; start drawing at ... sta TX ; ... column 12 stb TY ; ... row 9 ldx #TXTAUTH ; load X with pointer to string stx STRPTR ; ... and store in temp lda #14 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; TEST CODE jsr INITTMR ; INITIALIZE TIMER ROUTINE lda #1 ; LETS WAIT 5 SECONDS sta SECONDS ; STORE FOR NUMBER OF SECONDS TO WAIT WAIT1: jsr WAITSYNC ; WAIT FOR VSYNC lda SECONDS ; HAS SECONDS COUNTED OUT TO 0? cmpa #0 ; Out of Seconds? bne WAIT1 ; NO, SECONDS WAS > 0 SO WAIT MORE ;jmp BAS1000 ; YES, CARRY ON ;********************************************************************* BAS0010: ; START SETTING UP GAME ;********************************************************************* ; 10 EXEC&HE164 'OVERWRITES LINE 10 WITH 10 REM ASCII FOR SUBSEQUENT RUNS ; 10 REM ASCII ASME164: ; This part moves E180-E67F up to F300-F7FF ; TFR 0xE180,X ;E164 21 80 E1 LD HL,0xE180 ; TFR 0xF300,Y ;E167 11 00 F3 LD DE,0xF300 ; TFR 0x0500,U ;E16A 01 00 05 LD BC,0x0500 ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;E16D ED B0 LDIR ; ; ** FIXME WHAT ARE THESE VECTORS FOR? RESETS? IRQS? ; TFR 0xE164,X ;E16F 21 64 E1 LD HL,0xE164 ; STX 0xFF56 ;E172 22 56 FF LD (0xFF56),HL ; STX 0xFF58 ;E175 22 58 FF LD (0xFF58),HL ; STX 0xFF5A ;E178 22 5A FF LD (0xFF5A),HL ; ; ** This is the start of the code that changes line 10 to REM ASCII - 8E = REM token ; TFR 0x8E,A ;E17B 3E 8E LD A,0x8E ; LBRA 0xE240 ;E17D C3 40 E2 JP 0xE240 ASME240: ; ** Rest of the code that changes line 10 to REM ASCII ; STA 0xC525 ;E240 32 25 C5 LD (0xC525),A ; TFR 0x4120,X ;E243 21 20 41 LD HL,0x4120 ; STX 0xC526 ;E246 22 26 C5 LD (0xC526),HL ; TFR 0x4353,X ;E249 21 53 43 LD HL,0x4353 ; STX 0xC528 ;E24C 22 28 C5 LD (0xC528),HL ; TFR 0x4949,X ;E24F 21 49 49 LD HL,0x4949 ; STX 0xC52A ;E252 22 2A C5 LD (0xC52A),HL ; RTS ;E255 C9 RET BAS0080: ; 80 CLEAR300,&HEFFF 'RESERVE 300 BYTES FOR STRINGS AND SET UPPER LIMIT TO EFFF jsr COLOR1 ; COLOR1 'SET COLOR TO FOREGROUND 1 BACKGROUND NONE COLORSET NOT ; SCREEN 2 'Semigraphics 6 64x48 9-color mode on NEC ; CONSOLE,,0,0 'SCROLL START,LENGTH DISABLED,PNKEYS OFF,KEYCLICK OFF BAS0090: jmp BAS5000 ; 90 GOTO 5000 'PICK WHICH SCREEN TO RUN ;********************************************************************* BAS0100: ; START / INITIALIZATION CODE ;********************************************************************* ; 100 REM **** start ; 110 GOSUB8100:GOSUB8130 jsr BAS8100 ; 8100 SETUP ALIEN AND PLAYER POS jsr BAS8130 ; 8130 SETUP ITEMS HELD TO EMPTY ; TURN ON ALIEN MOVEMENT 3A = OPCODE FOR LD A,(**) ; 120 POKE&HF700,&H3A ; SETUP SCREEN AND SOUND CHIP jsr BAS1000 ; 180 GOSUB 1000 ; SAVE STARTING TIME ; 190 T=TIME ;********************************************************************* BAS0200: ; START MAIN LOOP ;********************************************************************* ; 200 EXEC&HF500:EXEC&HF7D0 ; F500 ALIEN AND PLAYER POSITION CHECK ; F600 PLAYER MOVE HIT ITEMS WALLS READ KEYS? ; F700 ALIEN MOVE AI ; F790 UPDATE PLAYER ; F7B0 ALIEN CAUGHT PLAYER ; F7D0 UPDATE NUMBERS jsr ASMF500 jsr ASMF7D0 jmp BAS0220 ;********************************************************************* ASMF500: ; ALIEN AND PLAYER POSITION UPDATE ;********************************************************************* ; TFR 0x20,B ' ' ;F500 06 20 LD B,0x20 Load a space ; LBSR 0xF790 ;F502 CD 90 F7 CALL 0xF790 Draw it at PLAYERX/Y ldb SPACE ; Blank out the player with an $80 jsr DRWPLR ; DRWPLR is an alias for ASMF790 ;--------------------------------------- ; LDX 0xF800 ;F505 2A 00 F8 LD HL,(0xF800) Copy AlienX into HL ; LDU 0xF802 ;F508 DD 2A 02 LD IX,(0xF802) Temporarily Save PlayerX in IX ; STX 0xF802 ;F50C 22 02 F8 LD (0xF802),HL Now put AlienX in HL into PlayerX ; TFR 0x20,B ' ' ;F50F 06 20 LD B,0x20 Load a space ; LBSR 0xF790 ;F511 CD 90 F7 CALL 0xF790 Draw it at PLAYERX/Y (currently Alien) ldb SPACE ; Blank out the alien with an $80 jsr DRWALN ;--------------------------------------- ; LDX 0xF802 ;F514 2A 02 F8 LD HL,(0xF802) Copy PlayerX into HL ; STX 0xF800 ;F517 22 00 F8 LD (0xF800),HL Restore AlienX from HL ; STU 0xF802 ;F51A DD 22 02 LD (0xF802),IX Restore PlayerX from IX ; LBSR 0xF600 ;F51E CD 00 F6 CALL 0xF600 SUB Player Move jsr ASMF600 ;--------------------------------------- ; TFR 0x84,B 'O' ;F521 06 84 LD B,0x84 Load an 'O' ; LBSR 0xF790 ;F523 CD 90 F7 CALL 0xF790 Draw it at PLAYERX/Y ldb PLAYER ; The player is shown as character O at $F0 jsr DRWPLR ;--------------------------------------- ; LBSR 0xF7B0 ;F526 CD B0 F7 CALL 0xF7B0 SUB: Alien Caught Player? jsr ASMF7B0 ;--------------------------------------- ; LDA 0xF80B ;F529 3A 0B F8 LD A,(0xF80B) Load Player Caught Flag into A ; CMPA #$ 0 ;F52C FE 01 CP 0x01 Was player caught? ; BEQ to RTS address ;F52E C8 RET Z ; LBSR 0xF700 ;F52F CD 00 F7 CALL 0xF700 SUB: Alien Move AI ;jsr ASMF700 ;--------------------------------------- ; LBSR 0xF7B0 ;F532 CD B0 F7 CALL 0xF7B0 SUB: Alien Caught Player? jsr ASMF7B0 ;--------------------------------------- ; LDA 0xF80B ;F535 3A 0B F8 LD A,(0xF80B) Load Player Caught Flag into A ; CMPA #$ 0 ;F538 FE 01 CP 0x01 Was player caught? ; BEQ to RTS address ;F53A C8 RET Z Yes... Return ; LBRA 0xF569 ;F53B 18 2C JR 0xF569 No... ; BMI to RTS address ;F53D F8 RET M Return if Minus? ;--------------------------------------- ; JF53E CMPA #$ 0 ;F53E FE 00 CP 0x00 ; LBEQ 0xF548 ;F540 28 06 JR Z,0xF548 If A=0 jump F548 ; SUBA #$ 0 ;F542 D6 05 SUB 0x05 Subtract 5 (Moving Left?) ; LBCS 0xF554 ;F544 38 0E JR C,0xF554 ; LBRA 0xF53E ;F546 18 F6 JR 0xF53E ;--------------------------------------- ; JF548 LDA 0xF802 ;F548 3A 02 F8 LD A,(0xF802) PlayerX -> A ; TFR A,B ;F54B 47 LD B,A A -> B ; LDA 0xF800 ;F54C 3A 00 F8 LD A,(0xF800) AlienX -> A ; CMPA B_Temp ;F54F B8 CP B Compare PlayerX with AlienX ; LBNE 0xF554 ;F550 20 02 JR NZ,0xF554 Not the same? Jump F554 ; LBRA 0xF567 ;F552 18 13 JR 0xF567 The Same... Jump F567 ;--------------------------------------- ; JF554 LDA 0xF803 ;F554 3A 03 F8 LD A,(0xF803) PlayerY -> A ; JF557 CMPA #$ 0 ;F557 FE 00 CP 0x00 ; LBEQ 0xF560 ;F559 28 05 JR Z,0xF560 ; SUBA #$ 0 ;F55B D6 06 SUB 0x06 Moving Up? ; BCS to RTS address ;F55D D8 RET C Return if Carry Set (Borrow) ; LBRA 0xF557 ;F55E 18 F7 JR 0xF557 Loop Back ;--------------------------------------- ; JF560 LDA 0xF803 ;F560 3A 03 F8 LD A,(0xF803) PlayerY -> A ; TFR A,B ;F563 47 LD B,A A -> B ; LDA 0xF801 ;F564 3A 01 F8 LD A,(0xF801) AlienY -> B ;--------------------------------------- ; JF567 CMPA B_Temp ;F567 B8 CP B Compare AlienY to PlayerY ; BNE to RTS address ;F568 C0 RET NZ Not the same? Return ;--------------------------------------- ; JF569 LDX 0xF800 ;F569 2A 00 F8 LD HL,(0xF800) AlienX -> HL ; LDU 0xF802 ;F56C DD 2A 02 LD IX,(0xF802) PlayerX -> IX ; STX 0xF802 ;F570 22 02 F8 LD (0xF802),HL HL -> PlayerX ; TFR 0x40,B '@' ;F573 06 40 LD B,0x40 '@' '@' -> B ; LBSR 0xF790 ;F575 CD 90 F7 CALL 0xF790 SUB: ldb ALIEN ; The alien is shown with an '@' jsr DRWALN ;--------------------------------------- ; LDX 0xF802 ;F578 2A 02 F8 LD HL,(0xF802) PlayerX -> HL ; STX 0xF800 ;F57B 22 00 F8 LD (0xF800),HL HL -> AlienX ; STU 0xF802 ;F57E DD 22 02 LD (0xF802),IX IX -> PlayerX ; RTS ;F582 C9 RET rts ;********************************************************************* ASMF600: ; PLAYER MOVE HIT ITEMS WALLS READ KEYS? ;********************************************************************* ; TFR 0x00,A ;F600 3E 00 LD A,0x00 Turn off "Hit the Wall" flag ; STA 0xF80F ;F602 32 0F F8 LD (0xF80F),A Store the NOPE hit the wall flag clr HITWALL ; Clear the hit-the-wall flag ;--------------------------------------- ; ORCC #$50 ;F605 F3 DI Disable interrupts ; LDA IO_90_0x90 ;F606 DB 90 IN A,(0x90) Pull input from port 90 - key in? ; ANDCC #$AF ;F608 FB EI Re-enable interrupts clra sta PLAYERDX sta PLAYERDY lda #$FF ; sta KEYPRESS ; set KEYPRESS to -1 jsr KEYSCN ; Strobe and save all of the key columns jsr DECODE ; Decode a key into KEYPRESS ASMF609: ;--------------------------------------- ; CMPA #$ 1 ;F609 FE 1C CP 0x1C Right key pressed? ; LBNE 0xF613 ;F60B 20 06 JR NZ,0xF613 No, go check next ; TFR 0x01,B ;F60D 06 01 LD B,0x01 Set player direction +1X ; TFR 0x00,C ;F60F 0E 00 LD C,0x00 Set player direction +0Y ; LBRA 0xF62E ;F611 18 1B JR 0xF62E Go calculate new pointer to draw in lda KEYPRESS cmpa #KEY_RIGHT ; Right arrow key pressed? bne ASMF613 ; No, go check next key lda #1 sta PLAYERDX bra ASMF62E ASMF613: ;--------------------------------------- ; JF613 CMPA #$ 1 ;F613 FE 1D CP 0x1D Left key pressed? ; LBNE 0xF61D ;F615 20 06 JR NZ,0xF61D No, go check next ; TFR 0xFF,B ;F617 06 FF LD B,0xFF Set player direction -1X ; TFR 0x00,C ;F619 0E 00 LD C,0x00 Set player direction +0Y ; LBRA 0xF62E ;F61B 18 11 JR 0xF62E Go calculate new pointer to draw in lda KEYPRESS cmpa #KEY_LEFT ; Left arrow key pressed? bne ASMF61D ; No, go check next key lda #-1 sta PLAYERDX bra ASMF62E ASMF61D: ;--------------------------------------- ; JF61D CMPA #$ 1 ;F61D FE 1E CP 0x1E Up key pressed? ; LBNE 0xF627 ;F61F 20 06 JR NZ,0xF627 No, go check next ; TFR 0x00,B ;F621 06 00 LD B,0x00 Set player direction +0X ; TFR 0xFF,C ;F623 0E FF LD C,0xFF Set player direction -1Y ; LBRA 0xF62E ;F625 18 07 JR 0xF62E Go calculate new pointer to draw in lda KEYPRESS cmpa #KEY_UP ; Up arrow key pressed? bne ASMF627 ; No, go check next key lda #-1 sta PLAYERDY bra ASMF62E ASMF627: ;--------------------------------------- ; JF627 CMPA #$ 1 ;F627 FE 1F CP 0x1F Down pressed? ; BNE to RTS address ;F629 C0 RET NZ Nope, no keys pressed bail out now ; TFR 0x00,B ;F62A 06 00 LD B,0x00 Set player direction +0X ; TFR 0x01,C ;F62C 0E 01 LD C,0x01 Set player direction +1Y lda KEYPRESS cmpa #KEY_DOWN ; Down arrow key pressed? bne ASMF62E ; No, go check where we ended up lda #1 sta PLAYERDY ASMF62E: ;--------------------------------------- ; JF62E LDA 0xF802 ;F62E 3A 02 F8 LD A,(0xF802) PlayerX -> A ; ADDA ,B ;F631 80 ADD A,B Modify PlayerX by direction from above ; TFR A,D ;F632 57 LD D,A Store in D for now lda PLAYERDX adda PLAYERX sta PLAYERX clr PLAYERDX ;--------------------------------------- ; LDA 0xF803 ;F633 3A 03 F8 LD A,(0xF803) PlayerY -> A ; ADDA ,C ;F636 81 ADD A,C Modify PlayerY by direction from above ; TFR A,E ;F637 5F LD E,A Store in E for now lda PLAYERDY adda PLAYERY sta PLAYERY clr PLAYERDY ;--------------------------------------- ; ADDA ,0x02 ;F638 C6 02 ADD A,0x02 Put 2 in A ; TFR A,L ;F63A 6F LD L,A Put A in L ; TFR 0x00,H ;F63B 26 00 LD H,0x00 Zero out H ; ADD X=X+X ;F63D 29 ADD HL,HL HL=HL+2 ; ADD X=X+X ;F63E 29 ADD HL,HL HL=HL+4 ; ADD X=X+X ;F63F 29 ADD HL,HL HL=HL+8 ; ADD X=X+X ;F640 29 ADD HL,HL HL=HL+16 ; ADD X=X+X ;F641 29 ADD HL,HL HL=HL+32 ; TFR D,A ;F642 7A LD A,D Move temp D back to A ; INCA ;F643 3C INC A A=A+1 ; ADDA ,L ;F644 85 ADD A,L Add L to A ; TFR A,L ;F645 6F LD L,A Store A back in L ; TFR H,A ;F646 7C LD A,H Store H in A ; ADC A,0xC2 - Fix;F647 CE C2 ADC A,0xC2 Add C2 to A ; TFR A,H ;F649 67 LD H,A Put A back in H - done making new pointer ;--------------------------------------- ; LDA ,X ;F64A 7E LD A,(HL) Get character at new pointer in HL ; CMPA #$ 2 ;F64B FE 20 CP 0x20 Is it a space? ; LBNE 0xF658 ;F64D 20 09 JR NZ,0xF658 No, go check what was hit ;--------------------------------------- ASMF64F: ; JF64F TFR D,A ;F64F 7A LD A,D Put temp D back in A ; STA 0xF802 ;F650 32 02 F8 LD (0xF802),A Store A -> PlayerX ; TFR E,A ;F653 7B LD A,E Put temp E back in A ; STA 0xF803 ;F654 32 03 F8 LD (0xF803),A Store A -> PlayerY ; RTS ;F657 C9 RET and done rts ASMF658: ;--------------------------------------- ; JF658 CMPA #$ 8 ;F658 FE 83 CP 0x83 Did you hit a Diamond resource? ; LBNE 0xF66F ;F65A 20 13 JR NZ,0xF66F No, go check next resource ; LDA 0xF806 ;F65C 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F65F FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F661 D0 RET NC Yes, can't pick up more ; INCA ;F662 3C INC A No, increment count of items carried ; STA 0xF806 ;F663 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF807 ;F666 3A 07 F8 LD A,(0xF807) Load count of Diamonds carried ; INCA ;F669 3C INC A Add a Diamond ; STA 0xF807 ;F66A 32 07 F8 LD (0xF807),A Store new count of Diamonds ; LBRA 0xF64F ;F66D 18 E0 JR 0xF64F Jump back to top of loop ;--------------------------------------- ; JF66F CMPA #$ 8 ;F66F FE 82 CP 0x82 Did you hit a Club resource? ; LBNE 0xF686 ;F671 20 13 JR NZ,0xF686 No, go check next resource ; LDA 0xF806 ;F673 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F676 FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F678 D0 RET NC Yes, can't pick up more ; INCA ;F679 3C INC A No, increment count of items carried ; STA 0xF806 ;F67A 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF808 ;F67D 3A 08 F8 LD A,(0xF808) Load count of Clubs carried ; INCA ;F680 3C INC A Add a Club ; STA 0xF808 ;F681 32 08 F8 LD (0xF808),A Store new count of Clubs ; LBRA 0xF64F ;F684 18 C9 JR 0xF64F Jump back to top of loop ;--------------------------------------- ; JF686 CMPA #$ 8 ;F686 FE 81 CP 0x81 Did you hit a Heart resource? ; LBNE 0xF69D ;F688 20 13 JR NZ,0xF69D No, go check next resource ; LDA 0xF806 ;F68A 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F68D FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F68F D0 RET NC Yes, can't pick up more ; INCA ;F690 3C INC A No, increment count of items carried ; STA 0xF806 ;F691 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF809 ;F694 3A 09 F8 LD A,(0xF809) Load count of Hearts carried ; INCA ;F697 3C INC A Add a Heart ; STA 0xF809 ;F698 32 09 F8 LD (0xF809),A Store new count of Hearts ; LBRA 0xF64F ;F69B 18 B2 JR 0xF64F Jump back to top of loop ;--------------------------------------- ; JF69D CMPA #$ 8 ;F69D FE 80 CP 0x80 Did you hit a Spade resource? ; LBNE 0xF6B4 ;F69F 20 13 JR NZ,0xF6B4 No, did you hit a wall? ; LDA 0xF806 ;F6A1 3A 06 F8 LD A,(0xF806) Get current number of items carried ; CMPA #$ 0 ;F6A4 FE 05 CP 0x05 Already carrying 5 items? ; BCC to RTS address ;F6A6 D0 RET NC Yep, just return ; INCA ;F6A7 3C INC A No, pick up next resource ; STA 0xF806 ;F6A8 32 06 F8 LD (0xF806),A Store new total of items carried ; LDA 0xF80A ;F6AB 3A 0A F8 LD A,(0xF80A) Load count of Spades carried ; INCA ;F6AE 3C INC A Add a Spade ; STA 0xF80A ;F6AF 32 0A F8 LD (0xF80A),A Store new count of Spades ; LBRA 0xF64F ;F6B2 18 9B JR 0xF64F Jump back to top of loop ;--------------------------------------- ; JF6B4 LDA 0xF802 ;F6B4 3A 02 F8 LD A,(0xF802) PlayerX -> A ; JF6B7 CMPA #$ 0 ;F6B7 FE 00 CP 0x00 At screen left? ; LBEQ 0xF6CD ;F6B9 28 12 JR Z,0xF6CD Hit the left wall ; SUBA #$ 0 ;F6BB D6 05 SUB 0x05 Check 5 spaces left ; LBCS 0xF6C1 ;F6BD 38 02 JR C,0xF6C1 Woops, had to borrow, we went too far ; LBRA 0xF6B7 ;F6BF 18 F6 JR 0xF6B7 Go back and keep checking left... ;--------------------------------------- ; JF6C1 LDA 0xF803 ;F6C1 3A 03 F8 LD A,(0xF803) PlayerY -> A ; JF6C4 CMPA #$ 0 ;F6C4 FE 00 CP 0x00 At top? ; LBEQ 0xF6CD ;F6C6 28 05 JR Z,0xF6CD ; SUBA #$ 0 ;F6C8 D6 06 SUB 0x06 Check up? ; BCS to RTS address ;F6CA D8 RET C ; LBRA 0xF6C4 ;F6CB 18 F7 JR 0xF6C4 Go back and keep checking ;--------------------------------------- ASMF6CD: ; JF6CD TFR 0x01,A ;F6CD 3E 01 LD A,0x01 Set hit the wall flag ; STA 0xF80F ;F6CF 32 0F F8 LD (0xF80F),A Store hit the wall flag to trigger sound ; LDA ,X ;F6D2 7E LD A,(HL) HL pointer -> A ; CMPA #$ A ;F6D3 FE A5 CP 0xA5 Compare with A5 ; LBNE 0xF6DA ;F6D5 20 03 JR NZ,0xF6DA ; ST0x20 ,X ;F6D7 36 20 LD (HL),0x20 Put a space into HL ; RTS ;F6D9 C9 RET Done - wall knocked down? rts ;--------------------------------------- ASMF6DA: ; JF6DA LDA ,X ;F6DA 7E LD A,(HL) Load type of block at position ; CMPA #$ 1 ;F6DB FE 16 CP 0x16 Is it a ??? ; BCC to RTS address ;F6DD D0 RET NC Yes, just bail ; TFR H,A ;F6DE 7C LD A,H ; SUBA #$ 0 ;F6DF D6 02 SUB 0x02 ; TFR A,H ;F6E1 67 LD H,A ; LDA ,X ;F6E2 7E LD A,(HL) ; CMPA #$ 2 ;F6E3 FE 20 CP 0x20 Is it a space? ; LBNE 0xF6EB ;F6E5 20 04 JR NZ,0xF6EB ; TFR 0x22,A ;F6E7 3E 22 LD A,0x22 Put 22 -> A '"' ; STA ,X ;F6E9 77 LD (HL),A A -> HL ; RTS ;F6EA C9 RET rts ;--------------------------------------- ASMF6EB: ; JF6EB TFR 0x20,A ;F6EB 3E 20 LD A,0x20 Put a space ; STA ,X ;F6ED 77 LD (HL),A Store space into point ; TFR H,A ;F6EE 7C LD A,H H -> A ; ADDA ,0x02 ;F6EF C6 02 ADD A,0x02 Add 2 ; TFR A,H ;F6F1 67 LD H,A Put A -> A ; TFR 0xA5,A ;F6F2 3E A5 LD A,0xA5 A5 -> A ; STA ,X ;F6F4 77 LD (HL),A Put A5 -> A ; RTS ;F6F5 C9 RET rts ;********************************************************************* ASMF700: ; MOVE ALIEN AI MOVALN: ;********************************************************************* ; MOVALN LDA 0xF800 ;F700 3A 00 F8 LD A,(0xF800) A=AlienX ; BF703 CMPA #$ 0 ;F703 FE 00 CP 0x00 If zero... ; LBEQ 0xF70D ;F705 28 06 JR Z,0xF70D ... goto F70D ; SUBA #$ 0 ;F707 D6 05 SUB 0x05 else subtract 5 from X? ; LBCS 0xF71A ;F709 38 0F JR C,0xF71A if you had to borrow... goto F71A ; LBRA 0xF703 ;F70B 18 F6 JR 0xF703 Loop back to F703 ;--------------------------------------- ; BF70D LDA 0xF801 ;F70D 3A 01 F8 LD A,(0xF801) A=AlienY ; BF710 CMPA #$ 0 ;F710 FE 00 CP 0x00 If zero... ; LBEQ 0xF731 ;F712 28 1D JR Z,0xF731 ... goto F731 ; SUBA #$ 0 ;F714 D6 06 SUB 0x06 else subtract 6 from Y? ; LBCS 0xF71A ;F716 38 02 JR C,0xF71A if you had to borrow... goto F71A ; LBRA 0xF710 ;F718 18 F6 JR 0xF710 Loop back to F710 ;--------------------------------------- ASMF71A: ; BF71A LDA 0xF800 ;F71A 3A 00 F8 LD A,(0xF800) A=AlienX ; TFR A,B ;F71D 47 LD B,A Mov A to B register ; LDA 0xF804 ;F71E 3A 04 F8 LD A,(0xF804) Load temp AlienX ; ADDA ,B ;F721 80 ADD A,B Add to AlienX position ; STA 0xF800 ;F722 32 00 F8 LD (0xF800),A Save new AlienX position ; LDA 0xF801 ;F725 3A 01 F8 LD A,(0xF801) A=AliexY ; TFR A,B ;F728 47 LD B,A Move A to B register ; LDA 0xF805 ;F729 3A 05 F8 LD A,(0xF805) Load temp AlienY ; ADDA ,B ;F72C 80 ADD A,B Add to Alien Y Position ; STA 0xF801 ;F72D 32 01 F8 LD (0xF801),A Save new AlienY position ; RTS ;F730 C9 RET Alien move is done - return to BASIC game ;--------------------------------------- ; BF731 LDA 0xF802 ;F731 3A 02 F8 LD A,(0xF802) A=PlayerX ; TFR A,B ;F734 47 LD B,A Move A to B register ; LDA 0xF800 ;F735 3A 00 F8 LD A,(0xF800) A=AlienX ; SUBA ,B ;F738 90 SUB B Subract AlienX from PlayerX ; LBCS 0xF745 ;F739 38 0A JR C,0xF745 If borrow goto F745 ; NEGA ;F73B ED 44 NEG Negate ; TFR A,C ;F73D 4F LD C,A Put difference in temporary spot CReg ; TFR 0xFF,A ;F73E 3E FF LD A,0xFF Set direction to move to -1 ; STA 0xF804 ;F740 32 04 F8 LD (0xF804),A Update X direction to move Alien (LEFT!) ; LBRA 0xF74B ;F743 18 06 JR 0xF74B Goto F74B ;--------------------------------------- ; BF745 TFR A,C ;F745 4F LD C,A A is X distance to player, put in CReg temp ; TFR 0x01,A ;F746 3E 01 LD A,0x01 A=1 ; STA 0xF804 ;F748 32 04 F8 LD (0xF804),A Update X direction to move Alien (RIGHT!) ;--------------------------------------- ; BF74B LDA 0xF803 ;F74B 3A 03 F8 LD A,(0xF803) A=PlayerY ; TFR A,B ;F74E 47 LD B,A Move A to B ; LDA 0xF801 ;F74F 3A 01 F8 LD A,(0xF801) A=AlienY ; SUBA ,B ;F752 90 SUB B Get difference between PlayerY and AlienY ; LBCS 0xF75F ;F753 38 0A JR C,0xF75F If borrow ; NEGA ;F755 ED 44 NEG Flip the Sign ; TFR A,B ;F757 47 LD B,A Now put B in A ; TFR 0xFF,A ;F758 3E FF LD A,0xFF Set A to -1 ; STA 0xF805 ;F75A 32 05 F8 LD (0xF805),A Update Y direction to move Alien (UP!) ; LBRA 0xF765 ;F75D 18 06 JR 0xF765 Goto F765 ;--------------------------------------- ; BF75F TFR A,B ;F75F 47 LD B,A A is Y distance to player, put in BReg ; TFR 0x01,A ;F760 3E 01 LD A,0x01 A=1 ; STA 0xF805 ;F762 32 05 F8 LD (0xF805),A Update Y direction to move Alien (DOWN!) ;--------------------------------------- ; BF765 TFR B,A ;F765 78 LD A,B ; DEC C ;F766 0D DEC C ; DECA ;F767 3D DEC A ; SUBA ,C ;F768 91 SUB C ; LBCS 0xF772 ;F769 38 07 JR C,0xF772 If borrow goto F772 ; TFR 0x00,A ;F76B 3E 00 LD A,0x00 Clear A ; STA 0xF805 ;F76D 32 05 F8 LD (0xF805),A Update Y direction to move Alien (SAME ROW) ; LBRA 0xF71A ;F770 18 A8 JR 0xF71A Go back to top ;--------------------------------------- ; BF772 TFR 0x00,A ;F772 3E 00 LD A,0x00 Clear A ; STA 0xF804 ;F774 32 04 F8 LD (0xF804),A Update X direction to move Alien (SAME COL) ; LBRA 0xF71A ;F777 18 A1 JR 0xF71A Go back to top lbra ASMF71A ;********************************************************************* ASMF790: ; UPDATE PLAYER POINTER TO PLACE TO DRAW ; ALSO USED FOR ALIEN, WALLS, ETC DRWPLR: ;********************************************************************* ; LDA 0xF802 ;F790 3A 02 F8 LD A,(0xF802) PlayerX -> A ; TFR A,D ;F793 57 LD D,A Save A to D ; LDA 0xF803 ;F794 3A 03 F8 LD A,(0xF803) PlayerY -> A ; ADDA ,0x02 ;F797 C6 02 ADD A,0x02 Add 2 to Y ; TFR A,L ;F799 6F LD L,A Save A to L ; TFR 0x00,H ;F79A 26 00 LD H,0x00 Zero out H ; ADD X=X+X ;F79C 29 ADD HL,HL +2 ; ADD X=X+X ;F79D 29 ADD HL,HL +4 ; ADD X=X+X ;F79E 29 ADD HL,HL +8 ; ADD X=X+X ;F79F 29 ADD HL,HL +16 ; ADD X=X+X ;F7A0 29 ADD HL,HL +32 ; TFR D,A ;F7A1 7A LD A,D Pull back PlayerX ; INCA ;F7A2 3C INC A Add an X ; ADDA ,L ;F7A3 85 ADD A,L Now add 32 from L? ; TFR A,L ;F7A4 6F LD L,A Save A to L ; TFR H,A ;F7A5 7C LD A,H Load H into A ; ADC A,0xC2 - Fix;F7A6 CE C2 ADC A,0xC2 Now put in a C2 ; TFR A,H ;F7A8 67 LD H,A Put C2 into H - high part of pointer ; TFR B,A ;F7A9 78 LD A,B Pull B into A - character to show at pointer ; STA ,X ;F7AA 77 LD (HL),A Put character onto screen ; RTS ;F7AB C9 RET ;--------------------------------------- lda PLAYERX sta TX lda PLAYERY sta TY jsr DRAWCH rts ;********************************************************************* DRWALN: ;********************************************************************* lda ALIENX sta TX lda ALIENY sta TY jsr DRAWCH rts ;********************************************************************* ASMF7B0: ; ALIEN CAUGHT PLAYER? ;********************************************************************* ; TFR 0x00,A ;F7B0 3E 00 LD A,0x00 Zero out player caught flag ; STA 0xF80B ;F7B2 32 0B F8 LD (0xF80B),A Store it clr CAUGHT ; Clear out the Player Caught flag ;--------------------------------------- ; LDA 0xF802 ;F7B5 3A 02 F8 LD A,(0xF802) Get PlayerX -> A ; TFR A,B ;F7B8 47 LD B,A Move A -> B ; LDA 0xF800 ;F7B9 3A 00 F8 LD A,(0xF800) Get AlienX -> A ; CMPA B_Temp ;F7BC B8 CP B Same X coordinate? ; BNE to RTS address ;F7BD C0 RET NZ No, not caught so return lda PLAYERX ; Where is the player? cmpa ALIENX ; Compare to Alien ... beq ASMF7BE ; Hmm, X pos are same, check Y rts ; Not caught so return ASMF7BE: ;--------------------------------------- ; LDA 0xF803 ;F7BE 3A 03 F8 LD A,(0xF803) Yes, so now check PlayerY -> A ; TFR A,B ;F7C1 47 LD B,A Move A -> B ; LDA 0xF801 ;F7C2 3A 01 F8 LD A,(0xF801) Get AlienY -> A ; CMPA B_Temp ;F7C5 B8 CP B Same Y coordinate? ; BNE to RTS address ;F7C6 C0 RET NZ No, not caught so return lda PLAYERY ; Where is the player? cmpa ALIENY ; Compare to Alien ... beq ASMF7C7 ; Hmm, Y pos are same too? WE GOTCHA! rts ; Not caught so return ASMF7C7: ;--------------------------------------- ; TFR 0x01,A ;F7C7 3E 01 LD A,0x01 Yes, whoops got caught ; STA 0xF80B ;F7C9 32 0B F8 LD (0xF80B),A Save that caught flag ; RTS ;F7CC C9 RET lda #1 ; YES, Player caught, signal with a 1 sta CAUGHT ; Save that for later rts ; let's go back ;********************************************************************* ASMF7D0: ; UPDATE HELD ITEM COUNTS ON SCREEN ; S=Shuttle H=Held ; F807 DRAWN TO C2BE Diamond S-H ; F808 DRAWN TO C2DE Clubs S-H ; F809 DRAWN TO C2FE Hearts S-H ; F80A DRAWN TO C31E Spades S-H ;********************************************************************* ; TFR 0xC2BE,X ;F7D0 21 BE C2 LD HL,0xC2BE HL pointer to C2BE ; TFR 0xF807,U ;F7D3 DD 21 07 LD IX,0xF807 IX pointer to current item count ; TFR 0x0020,U ;F7D7 01 20 00 LD BC,0x0020 Move a 32 (screen line?) ASMF7DA: ; JF7DA LDA $E ,U ;F7DA DD 7E 00 LD A,(IX+0) Get current item count ; ADDA ,0x30 ;F7DD C6 30 ADD A,0x30 Turn it into ASCII number ; STA ,X ;F7DF 77 LD (HL),A Store it into C2BE pointer ; ADD X=X+U ;F7E0 09 ADD HL,BC Move down a screen line ; TFR L,A ;F7E1 7D LD A,L Get low byte of pointer ; CMPA #$ 3 ;F7E2 FE 3E CP 0x3E Are we looking at 5th line @ C23E ; BEQ to RTS address ;F7E4 C8 RET Z Done rts ; INC U ;F7E5 DD 23 INC IX Add one to count ; LBRA 0xF7DA ;F7E7 18 F1 JR 0xF7DA Loop Back lbra ASMF7DA ;********************************************************************* ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; SOUND MIXER CONTROL/IO ENABLE ; 60 = 00111100 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A OFF ; B2 Tone Enable C OFF ; B1 Tone Enable B ON ; B0 Tone Enable A ON BAS0220: ; 220 SOUND 7,60 ; SOUND WHEN YOU HIT WALL ; SOUND MIXER CONTROL/IO ENABLE ; 55 = 00110111 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A ON ; B2 Tone Enable C OFF ; B1 Tone Enable B OFF ; B0 Tone Enable A OFF ; 230 IF PEEK(&HF80F)=1 THEN SOUND7,55 ; ENVELOPE PERIOD CONTROL FINE TUNE ; 9 = 00001001 ; 240 SOUND 13,9 ; DID THE ALIEN CATCH YOU? ; 250 IF PEEK(&HF80B)=1 THEN GOTO 800 ; DID YOU MAKE IT INTO SHUTTLE? COUNT POINTS ; RESET COUNT OF COMPLETED ITEM TYPES ; SETUP FOR NEXT LEVEL ; 260 IF PEEK(&HF802)=22 THEN GOSUB 600:IF PX=4 THEN PX=0:GOTO 3000 ; TOTAL TIME = CURRENT TIME - START TIME ; TIME LEFT = 300 - INTEGER TOTAL TIME / 1000 ; 270 TT=TIME-T:TL=300-INT(TT/1000) ; IF TIME LEFT < 0 THEN JUMP 400 TIME OVER ; 280 IF TL<0 THEN GOTO 400 ; UPDATE TIME LEFT ON SCREEN ; 290 LOCATE28,11:PRINT RIGHT$(" "+STR$(TL),3) ; LOOP BACK ; 300 GOTO 200 jmp BAS0200 ;********************************************************************* ;* TIMEOVER ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* TIMEOVER: ; 400 REM**** TIME OVER ; PRINT OUT ZEROED TIME ; 410 LOCATE28,11:PRINT" 0"; ; PRINT TIME OVER BANNER ; 415 LOCATE3,8:PRINT" T I M E O V E R" ; SET VOLUME AND NOTE LENGTH ; 420 PLAY"V13L12","V13L12" ; TRANSPOSE DOWN ONE OCTAVE FOR COCO EXT BAS ; PLAY"O5CO4BA+AG+GF+FED+DC+C" ; 430 PLAY"O6CO5BA+AG+GF+FED+DC+C","O6C+CO5BA+AG+GF+FED+DC+" ; SET NOTE LENGTH BACK TO 1/4TH NOTE? ; 440 PLAY"L4","L4" ; DELAY LOOP ; 450 FOR I=1 TO 600:NEXT ; TIME EXPIRED - PLAY AGAIN? SCREEN ; 580 GOTO 9000 ;********************************************************************* ;* POINT - COUNT POINTS WHEN IN SHUTTLE ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* POINT: ; 599 REM ***** point ; DRAW ALIEN ; 600 LOCATEPEEK(&HF800)+1,PEEK(&HF801)+2:PRINT"@"; ; IF HOLDING NO ITEMS RETURN TO MAIN LOOP ; 610 IF PEEK(&HF806)=0 THEN RETURN ; SOUND MADE IT INTO SHUTTLE WITH SUPPLIES ; 615 GOSUB 7300 ; LOOP THRU ITEMS CARRIED ; 620 PX=0:FOR I=0 TO 3 ; HOW MANY OF ITEM 0 TO 3 IS PLAYER HOLDING ; 630 P(I)=PEEK(&HF807+I) ; ZERO OUT THE HELD AMOUNT ; 635 POKE&HF807+I,0 ; ADD THE AMOUNT TO THE PLAYERS SHUTTLE COUNT ; 640 PS(I)=PS(I)+P(I) ; CALCULATE PLACE ON SCREEN TO DRAW UPDATED COUNT ; 650 LOCATE28,5+I ; SETUP DEFAULT "NOT ENOUGH YET" COLOR ; 655 COLOR1 ; IF PLAYER HAS ENOUGH IN SHUTTLE SETUP REVERSE COLOR ; AND MAKE NOTE THEY ARE CLOSER TO VICTORY VIA PX ; 660 IF PS(I)>PM THEN COLOR4:PX=PX+1 ; UPDATE SHUTTLE ITEMS DISPLAY ; 670 PRINTRIGHT$(STR$(PS(I)),1):COLOR1:LOCATE30,5+I:PRINT"0" ; CALCULATE SCORE BASED ON ITEMS RETRIEVED ; FIXME THIS NEEDS CHANGES SO FURTHER ITEMS ARE WORTH MORE ; 680 SC=SC+P(I)*(10+I*5) ; FINISH LOOPING THROUGH HELD ITEMS ; 690 NEXT ; UPDATE SCORE TOTAL ; 700 LOCATE26,2:PRINT RIGHT$(" "+STR$(SC),5) ; ZERO OUT HELD ITEM COUNT ; 710 POKE&HF806,0 ; 730 RETURN ;********************************************************************* ;* JUMP 800 ALIEN CAUGHT YOU ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 800 REM<97><8C> ; 0000c88a 20 0x20 ' ' ; 0000c88b 03 0x03 ; 0000c88c 8e 0x8e ; 0000c88d 97 0x97 ; 0000c88e de 0xde ; 0000c88f 8c 0x8c ; 0000c890 00 0x00 ; TONE GENERATOR C 0 70 ; 810 SOUND 4,70:SOUND 5,0 ; TONE GENERATOR B 0 15 ; 820 SOUND 2,0:SOUND 3,15 ; VOLUME B = 15 VOLUME C = 15 ; 830 SOUND 9,15:SOUND10,15 ; SOUND MIXER CONTROL/IO ENABLE ; 57 = 00111001 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A OFF ; B2 Tone Enable C ON ; B1 Tone Enable B ON ; B0 Tone Enable A OFF ; 840 SOUND 7,57 ; GET SET CURSOR TO ALIEN POSITION ; 845 LOCATEPEEK(&HF800)+1,PEEK(&HF801)+2 ; FLASH ALIEN 8 TIMES ; 850 FOR I=1TO 8 ; DRAW ALIEN IN BLACK ON GREEN ; 855 COLOR4:PRINT"@";CHR$(29); ; TONE GENERATOR B 0 15 ; 860 SOUND 3,15 ; DELAY ; 870 FOR J=0 TO 50:NEXT ; DRAW ALIEN BLACK ON WHITE ; 875 COLOR2:PRINT"@";CHR$(29); ; TONE GENERATOR B 0 13 ; 880 SOUND 3,13 ; DELAY ; 890 FOR J=0 TO 50:NEXT ; END OF FLASHING LOOP ; 895 NEXT ; PLAY ALIEN CAUGHT YOU SONG ; 896 GOSUB 7100 ; LOSE A LIFE ; 900 CR=CR-1 ; OUT OF LIVES? GAME OVER SCREEN ; 910 IF CR=0 THEN GOTO 970 ; CLEAR ALIEN AND PLAYER FROM SCREEN ; 915 COLOR1:PRINT" " ; MOVE TO CREW REMAINING DISPLAY ; 920 LOCATE 26,14 ; SETUP REVERSE VIDEO BLACK ON GREEN ; 925 COLOR 4 ; DRAW UPDATED PLAYERS REMAINING ; 930 FOR I=1 TO 4-CR:PRINT" ";:NEXT ; RESET COLORS TO BLACK ON GREEN ; 935 COLOR 1 ; RESET PLAYER POSITION TO SHUTTLE ; 940 POKE&HF802,22:POKE&HF803,9 ; RESET SOUND CHIP SETTINGS ; 950 GOSUB 1390 ; CLEAR OUT ITEMS HELD ; 955 POKE&HF806,0:POKE&HF807,0:POKE&HF808,0:POKE&HF809,0:POKE&HF80A,0 ; IF DIED IN TIME TRIAL, RE-ENABLE ALIEN MOVE - IF RET, PUT LD A,(**) ; 956 IF PEEK(&HF700)=&HC9 THEN POKE&HF700,&H3A:RETURN ; IF HELP HACK TRUE, RESET SCREEN NUMBER TO PREVIOUS ; RE SETUP SCREEN FROM SCRATCH ; RESET TIME ; 957 IF H=1 THEN SS=SS-1:GOSUB 1000:T=T-100000 ; JUMP BACK TO MAIN LOOP ; 960 GOTO 200 ;********************************************************************* ;* GAME OVER SCREEN ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* GAMEOVER: ; 970 LOCATE3,8:PRINT"G A M E O V E R" ; SOUND MIXER CONTROL/IO ENABLE ; SHUT OFF ALL SOUNDS ; 63 = 00111111 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A OFF ; B2 Tone Enable C OFF ; B1 Tone Enable B OFF ; B0 Tone Enable A OFF ; 975 SOUND 7,63 ; PLAY AGAIN BANNER/PROMPT ; 980 GOTO 9000 ;********************************************************************* ;* SUBROUTINE 1000 SETUP SCREEN AND SOUND CHIP ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ROWTOP: fcb $F8,$F2,$F2,$F9,$60,$F8,$F2,$F2,$F9,$60,$F8,$F2,$F2,$F9,$60,$F8,$F2,$F2,$F9 ROWMID: fcb $F4,$FF,$FF,$F3,$60,$F4,$FE,$FE,$F3,$60,$F4,$FD,$FD,$F3,$60,$F4,$FC,$FC,$F3 ROWBOT: fcb $FA,$F1,$F1,$FB,$60,$FA,$F1,$F1,$FB,$60,$FA,$F1,$F1,$FB,$60,$FA,$F1,$F1,$FB TEMPCHAR: rmb 1 ; A place to hold a single temporary character for screen printing ; FIXME COLOR1 - COLOR4 Setup for CoCo/2/3 CMP/3 RGB/ PAL COLOR1: ; NEC PC6001 COLOR 1 white chars on black background ldd #$040C ; Palette 4 (Buff) Palette C (Black) sta CLRFORE ; Store to Foreground stb CLRBACK ; Store to Background rts COLOR2: ; NEC PC6001 COLOR 2 black chars on white background ldd #$0C04 ; Palette C (Black) Palette 4 (Buff) sta CLRFORE ; Store to Foreground stb CLRBACK ; Store to Background rts COLOR3: ; NEC PC6001 COLOR 3 green chars on black background ldd #$0908 ; Palette 0 (Green) Palette C (Black) sta CLRFORE ; Store to Foreground stb CLRBACK ; Store to Background rts COLOR4: ; NEC PC6001 COLOR 4 black chars on green background ldd #$0809 ; Palette C (Black) Palette 0 (Green) sta CLRFORE ; Store to Foreground stb CLRBACK ; Store to Background rts BAS1000: ; 1000 CLS:PRINT " NOSTROMO "; jsr CLEAR ; CLEAR SCREEN ; PRINT NOSTROMO IN WHITE ON BLACK ldd #$0100 ; start drawing at ... sta TX ; ... column 1 stb TY ; ... row 0 ldx #TXTNAME ; load X with pointer to string stx STRPTR ; ... and store in string pointer lda #8 ; load A with length of string sta STRLEN ; ... and store in string length jsr PRINTAT ; now go print string at BAS1005: ; 1005 SS=SS+1:COLOR4:PRINTSS;:COLOR1:PRINT"-";:COLOR3:PRINTPM+1:COLOR1 inc SS ; SCREEN = SCREEN +1 jsr COLOR4 ; COLOR BLACK ON GREEN ldd #$0A00 ; draw first space to set SS field sta TX ; ... column 10 stb TY ; ... row 0 ldb #$60 ; space jsr DRAWCH ; draw it ldd #$0B00 ; draw second space to set SS field sta TX ; ... column 11 stb TY ; ... row 0 ldb #$60 ; space jsr DRAWCH ; draw it ldd #$0B00 ; start drawing at ... FIXME should be 2 digit for SS display sta TX ; ... column 10 and 11 stb TY ; ... row 0 ldb SS ; SHOW CURRENT SCREEN NUMBER addb #$70 ; convert from value to numeric character to display in CGROM60 font jsr DRAWCH ; now go print character jsr COLOR1 ; COLOR WHITE ON BLACK ldd #$0C00 ; start drawing at ... sta TX ; ... column 12 stb TY ; ... row 0 ldb #$6D ; SHOW DASH jsr DRAWCH ; now go print character jsr COLOR3 ; COLOR GREEN ON BLACK ldd #$0E00 ; start drawing at ... FIXME should be 2 digits for PM display? sta TX ; ... column 14 stb TY ; ... row 0 ldb PM ; SHOW HOW MANY OF EACH ITEM NEEDED incb ; gets us visual PM+1 used in BASIC statement addb #$70 ; convert from value to numeric character to display in CGROM60 font jsr DRAWCH ; now go print characters jsr COLOR1 ; COLOR WHITE ON BLACK ; ZERO OUT PLAYER SHUTTLE ITEM COUNTS BAS1006: ; 1006 FOR I=0 TO 3:PS(I)=0:NEXT clr PS0 ; Player Shuttle 0 = 0 clr PS1 ; Player Shuttle 1 = 0 clr PS2 ; Player Shuttle 2 = 0 clr PS3 ; Player Shuttle Item Count 3 = 0 ; CB06 FDB F2 03 95 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 00 ;0xCB22 BAS1010: ; 1010 PRINT" " ; CB25 FDB FC 03 95 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 00 ;0xCB41 BAS1020: ; 1020 PRINT" " ; CB44 FDB 06 04 95 22 20 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 20 22 00 ; 0xCB70 BAS1030: ; 1030 PRINT" HBBI HBBI HBBI HBBI " ldd #$0203 ; Start printing at Column 2, Row 3 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWTOP ; Get the address of the string of stuff to print - top walls of a cargo area stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String Length jsr PRINTAT ; Setup is done, go print it to screen map to be rendered BAS1035: ; 1035 FOR I=1 TO 3 ; CB81 FDB 10 04 95 22 20 20 14 44 83 83 14 43 20 14 44 82 82 14 43 20 14 44 81 81 14 43 20 14 44 80 80 14 43 20 20 22 00 ; 0xCBA5 BAS1040: ; 1040 PRINT" D..C D..C D..C D..C " ldd #$0204 ; Start printing at Column 2, Row 4 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ldd #$0205 ; Next line at Column 2, Row 5 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ldd #$0206 ; Next line at Column 2, Row 6 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered BAS1045: ; 1045 NEXT ; CBAE FDB 1A 04 95 22 20 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 20 22 00 ; 0xCBDA BAS1050: ; 1050 PRINT" JAAK JAAK JAAK JAAK " ldd #$0207 ; Next line at Column 2, Row 7 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWBOT ; Get address of stuff to print - bottom row of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CBDD FDB F2 03 95 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 00 ;0xCBF9 BAS1055: ; 1055 PRINT" " ; CBFC FDB 06 04 95 22 20 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 14 48 14 42 14 42 14 49 20 20 22 00 ; 0xCC28 BAS1060: ; 1060 PRINT" HBBI HBBI HBBI HBBI " ldd #$0209 ; Next line at Column 2, Row 9 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWTOP ; Get address of stuff to print - top row of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CC2B FDB 10 04 95 22 20 20 14 44 83 83 14 43 20 14 44 82 82 14 43 20 14 44 81 81 14 43 20 14 44 80 80 14 43 20 20 22 00 ; 0xCC51 BAS1070: ; 1070 PRINT" D..C D..C D..C D..C " ldd #$020A ; Next line at Column 2, Row 10 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CC54 FDB 10 04 95 22 20 20 14 44 83 83 14 43 20 14 44 82 82 14 43 20 14 44 81 81 14 43 20 14 44 80 80 14 43 20 20 22 00 ; 0xCC7A BAS1080: ; 1080 PRINT" D..C D..C D..C D..C " ldd #$020B ; Next line at Column 2, Row 11 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CC7D FDB 42 04 95 22 20 20 14 44 83 83 14 43 20 14 44 82 82 14 43 20 14 44 81 81 14 43 20 14 44 80 80 14 43 20 20 20 20 22 00 ; 0xCCA3 BAS1090: ; 1090 PRINT" D..C D..C D..C D..C " ; 2 extra spaces for open shuttle ldd #$020C ; Next line at Column 2, Row 12 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWMID ; Get address of stuff to print - middle rows of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CCA6 FDB 4C 04 95 22 20 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 14 4A 14 41 14 41 14 4B 20 20 22 00 ; 0xCCD2 BAS1100: ; 1100 PRINT" JAAK JAAK JAAK JAAK " ldd #$020D ; Next line at Column 2, Row 13 sta TX ; PRINTAT Column goes in Tile X stb TY ; PRINTAT Row goes in Tile Y ldx #ROWBOT ; Get address of stuff to print - bottom row of cargo areas stx STRPTR ; PRINTAT String start pointer lda #19 ; How many tiles are we printing? sta STRLEN ; PRINTAT String length jsr PRINTAT ; Setup is done, go print it to the screen map to be rendered ; CCD5 FDB 56 04 95 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 00 ;0xCCF1 BAS1110: ; 1110 PRINT" " ; CCF4 FDB 60 04 95 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 00 ;0xCD11 BAS1120: ; 1120 PRINT" "; ;********************************************************************* ;* PLACECARGO - Determine how much cargo is left in each hold ;* loop through 8 cargo holds... far upper left, far lower left ;* then next column over. In each hold are already 6 resources. ;* This routine replaces a random location with a space for empty ;* cargo spot, and two spaces are replaced with unbreakable magenta ;* cargo boxes. The empty and magenta locations may overlap, meaning ;* a cargo hold can have up to 5 resources a magenta box ;* or 4 resources with 2 magenta boxes or a magenta box and a space, ;* or 3 resources with 2 magenta boxes and a space. ;* ;* I/O: Memory only ;* ;* Calling Convention: Fall through from above ;* ;* Returns: updated game map cargo bay contents ;* resources, empty spaces, or unbreakable magenta cargo boxes ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: RND2, RND3, PRINTAT ;* ;* Changes: Everything. ;********************************************************************* bra PLACECARGO ; FIXME skip over data EMPTYCARGO: fcb $60 ; TRS-80 SPACE for empty cargo spot PINKCARGO: fcb $EF ; TRS-80 Semi4 magenta full block PLACECARGO: ; FIXME DOING THIS ALL WRONG BUT GETTING CLOSE ; LOOP THROUGH CARGO HOLDS LEFT TO RIGHT BAS1130: ; 1130 FOR X=3 TO 18 STEP5 ldx #3 ; Use X in the outer loop for where to draw lda #3 ; We'll need it in A to put into the global sta TX ; Store it into TileX (TX) CARGOX: ; OUR CARGO OUTER LOOP COLUMN BY COLUMN ; LOOP THROUGH CARGO HOLDS TOP TO BOTTOM BAS1140: ; 1140 FOR Y=4 TO 10 STEP6 ldy #3 ; We'll use Y in the inner loop for where to draw ldb #3 ; We'll need it in B to put into the global stb TY ; Store it into TileY (TY) CARGOY: ; CARGO INNER LOOP TOP THEN BOTTOM ROW ; PICK A RANDOM CARGO SPOT BAS1150: ; 1150 A=RND(1)*2:B=RND(1)*3 jsr RND2 ; RND 1 of 2 returns 0 or 1 adda TX ; Stay on column or move right 1 sta TX ; Update TileX to draw on jsr RND3 ; RND 1 of 3 returns 0, 1, or 2 addb TY ; Stay on row or drop down 1 or 2 stb TY ; Update TileY to draw on ; BLANK IT OUT BAS1160: ; 1160 LOCATEX+A,Y+B:PRINT" "; ; 0000cd58 3a 0x3a ':' ; 0000cd59 95 0x95 ; 0000cd5a 22 0x22 '"' ; 0000cd5b 20 0x20 ' ' ; 0000cd5c 22 0x22 '"' ; 0000cd5d 3b 0x3b ';' ; 0000cd5e 00 0x00 pshs X ; We're gonna mangle our column holder save it jsr COLOR1 ; white foreground on black background ldx #EMPTYCARGO ; load X with pointer to string stx STRPTR ; ... and store in temp lda #1 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at puls X ; Restored it after use as string pointer TFR X,D ; Move X to D so we can chop out 8 bits stb TX ; FIXME stupid 16-bit to 8-bit thunk TFR Y,D ; Move Y to D so we can chop out 8 bits stb TY ; FIXME stupid 16-bit to 8-bit thunk ; PICK A RANDOM CARGO LOCATION BAS1170: ; 1170 A=INT(RND(1)*2):B=INT(RND(1)*3) jsr RND2 ; RND 1 of 2 returns 0 or 1 adda TX ; Stay on column or move right 1 sta TX ; Update TileX to draw on jsr RND3 ; RND 1 of 3 returns 0, 1, or 2 addb TY ; Stay on row or drop down 1 or 2 stb TY ; Update TileY to draw on ; DRAW A MAGENTA BOX BAS1180: ; 1180 LINE((X+A)*8,(Y+B)*12)-((X+A+1)*8-1,(Y+B+1)*12-1),7,B pshs X ; We're gonna mangle our column holder save it ldd #$060C ; load up magenta on black sta CLRFORE ; setup foreground to magenta stb CLRBACK ; setup background to black ldx #PINKCARGO ; load X with pointer to string stx STRPTR ; ... and store in temp lda #1 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at puls X ; Restored it after use as string pointer TFR X,D ; Move X to D so we can chop out 8 bits stb TX ; FIXME stupid 16-bit to 8-bit thunk TFR Y,D ; Move Y to D so we can chop out 8 bits stb TY ; FIXME stupid 16-bit to 8-bit thunk ; PICK ANOTHER RANDOM CARGO LOCATION BAS1190: ; 1190 A=INT(RND(1)*2):B=INT(RND(1)*3) jsr RND2 ; RND 1 of 2 returns 0 or 1 adda TX ; Stay on column or move right 1 sta TX ; Update TileX to draw on jsr RND3 ; RND 1 of 3 returns 0, 1, or 2 addb TY ; Stay on row or drop down 1 or 2 stb TY ; Update TileY to draw on ; DRAW ANOTHER MAGENTA BOX BAS1200: ; 1200 LINE((X+A)*8,(Y+B)*12)-((X+A+1)*8-1,(Y+B+1)*12-1),7,B pshs X ; We're gonna mangle our column holder save it ldd #$060C ; load up magenta on black sta CLRFORE ; setup foreground to magenta stb CLRBACK ; setup background to black ldx #PINKCARGO ; load X with pointer to string stx STRPTR ; ... and store in temp lda #1 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at puls X ; END LOOPS THROUGH ALL CARGO LOCATIONS BAS1210: ; 1210 NEXT Y:NEXT X cmpy #9 ; done with bottom row? beq NEXTX ; yes move on to next column of cargo leay 6,y ; Y += 6 tfr Y,D stb TY lbra CARGOY ; go back and do next row FIXME bloated NEXTX: cmpx #18 ; In rightmost cargo? beq CARGOXIT ; done with cargo leax 5,x ; X += 5 tfr X,D stb TX lbra CARGOX ; go back and do next column FIXME bloated CARGOXIT: ;********************************************************************* ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; DRAW OUTER WHITE BOX 1-3 BAS1211: ; 1211 LINE(0,12)-(183,191),5,B BAS1212: ; 1212 LINE(4,16)-(179,187),5,B BAS1213: ; 1213 LINE(4,22)-(179,183),5,B jsr COLOR1 ; Setup white letters on black background ; Draw box top ldd #$0001 ; start drawing at ... sta TX ; ... column 0 stb TY ; ... row 1 lda #23 ; for 23 horizontal characters sta INDEXIX ; working varable for horizontal count ldb #$CF ; Semigraphics WHITE full block jsr HLINE ; now go draw horizonal line of * ; Draw box left side ldd #$0001 ; draw vertical line of * at column 3 sta TX ; ... column 3 stb TY ; ... row 4 lda #16 ; for 15 vertical characters sta INDEXIY ; working variable for vertical count ldb #$CF ; Semigraphics WHITE full block jsr VLINE ; now go draw vertical line of * ; Draw box right side ldd #$1601 ; draw vertical line of * at column 3 sta TX ; ... column 3 stb TY ; ... row 4 lda #16 ; for 15 vertical characters sta INDEXIY ; working variable for vertical count ldb #$CF ; Semigraphics WHITE full block jsr VLINE ; now go draw vertical line of * ; Draw box bottom ldd #$000F ; start drawing at ... sta TX ; ... column 0 stb TY ; ... row 15 lda #23 ; for 23 horizontal characters sta INDEXIX ; working varable for horizontal count ldb #$CF ; Semigraphics WHITE full block jsr HLINE ; now go draw horizonal line of * ; DRAW SHUTTLE CUTOUT BAS1214: ; 1214 LINE(183,128)-(198,147),4,B ldd #$030C ; RED on BLACK sta CLRFORE ; set foreground stb CLRBACK ; set background ldd #$160A ; setup row and column sta TX ; ... column 22 stb TY ; ... row 11 ldb #$BF ; Red block jsr DRAWCH ; draw it ldd #$170A ; setup row and column sta TX ; ... column 22 stb TY ; ... row 11 lda #25 ; two hull units wide sta INDEXIX ; working variable for horizontal count ldb #$B3 ; Red block lower half jsr HLINE ; draw it ldd #$180B ; setup row and column sta TX ; ... column 24 stb TY ; ... row 12 ldb #$B5 ; Red block left half jsr DRAWCH ; draw it ldd #$170C ; setup row and column sta TX ; ... column 23 stb TY ; ... row 13 lda #25 ; two hull units wide sta INDEXIX ; working variable for horizontal count ldb #$BC ; Red block upper half jsr HLINE ; draw it ldd #$160C ; setup row and column sta TX ; ... column 22 stb TY ; ... row 13 ldb #$BF ; Red block jsr DRAWCH ; draw it ; OPEN SHUTTLE DOOR BAS1216: ; 1216 LOCATE22,11:PRINT" "; ; 0000ce86 3a 0x3a ':' ; 0000ce87 95 0x95 ; 0000ce88 22 0x22 '"' ; 0000ce89 20 0x20 ' ' ; 0000ce8a 22 0x22 '"' ; 0000ce8b 3b 0x3b ';' ldd #$0C0C ; It's BLAAAAAAAAACK sta CLRFORE ; set foreground color stb CLRBACK ; set background color ldd #$160B ; LOCATE 22,11 sta TX ; ... column 22 stb TY ; ... row 11 ldb #$60 ; space jsr DRAWCH ; draw it ; 1220 COLOR3:LOCATE26,1:PRINT"SCORE"; jsr COLOR3 ; Setup GREEN on BLACK ldd #$1A01 ; LOCATE 26,1 sta TX ; setup column 26 stb TY ; setup row 1 ldx #SCORE ; load X with pointer to string stx STRPTR ; ... and store in temp lda #5 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; 1221 COLOR1:LOCATE26,2:PRINT RIGHT$(" "+STR$(SC),5); ; 83 = Diamond BAS1230: ; 1230 LOCATE26,5:PRINT"" ; 0000cec9 ce 0xce ; 0000ceca 04 0x04 ; 0000cecb a1 0xa1 ; 0000cecc 32 0x32 '2' ; 0000cecd 36 0x36 '6' ; 0000cece 2c 0x2c ',' ; 0000cecf 35 0x35 '5' ; 0000ced0 3a 0x3a ':' ; 0000ced1 95 0x95 ; 0000ced2 22 0x22 '"' ; 0000ced3 83 0x83 ; 0000ced4 22 0x22 '"' ; 0000ced5 00 0x00 jsr COLOR1 ; WHITE on BLACK ldd #$1A05 ; LOCATE 26,5 sta TX ; ... setup column 26 stb TY ; ... setup row 5 ldb #$FF ; diamond FIXME MAKE THIS A DAMN CONSTANT jsr DRAWCH ; draw it ; 82 = Clubs ; 1240 LOCATE26,6:PRINT"" ; 0000ced8 d8 0xd8 ; 0000ced9 04 0x04 ; 0000ceda a1 0xa1 ; 0000cedb 32 0x32 '2' ; 0000cedc 36 0x36 '6' ; 0000cedd 2c 0x2c ',' ; 0000cede 36 0x36 '6' ; 0000cedf 3a 0x3a ':' ; 0000cee0 95 0x95 ; 0000cee1 22 0x22 '"' ; 0000cee2 82 0x82 ; 0000cee3 22 0x22 '"' ; 0000cee4 00 0x00 ldd #$1A06 ; LOCATE 26,6 sta TX ; ... setup column 26 stb TY ; ... setup row 6 ldb #$FE ; clubs FIXME MAKE THIS A DAMN CONSTANT jsr DRAWCH ; draw it ; 81 = Hearts ; 1250 LOCATE26,7:PRINT"" ; 0000cee7 e2 0xe2 ; 0000cee8 04 0x04 ; 0000cee9 a1 0xa1 ; 0000ceea 32 0x32 '2' ; 0000ceeb 36 0x36 '6' ; 0000ceec 2c 0x2c ',' ; 0000ceed 37 0x37 '7' ; 0000ceee 3a 0x3a ':' ; 0000ceef 95 0x95 ; 0000cef0 22 0x22 '"' ; 0000cef1 81 0x81 ; 0000cef2 22 0x22 '"' ; 0000cef3 00 0x00 ldd #$1A07 ; LOCATE 26,7 sta TX ; ... setup column 26 stb TY ; ... setup row 7 ldb #$FD ; hearts FIXME MAKE THIS A DAMN CONSTANT jsr DRAWCH ; draw it ; 80 = Spades ; 1260 LOCATE26,8:PRINT"" ; 0000cef6 ec 0xec ; 0000cef7 04 0x04 ; 0000cef8 a1 0xa1 ; 0000cef9 32 0x32 '2' ; 0000cefa 36 0x36 '6' ; 0000cefb 2c 0x2c ',' ; 0000cefc 38 0x38 '8' ; 0000cefd 3a 0x3a ':' ; 0000cefe 95 0x95 ; 0000ceff 22 0x22 '"' ; 0000cf00 80 0x80 ; 0000cf01 22 0x22 '"' ; 0000cf02 00 0x00 ldd #$1A08 ; LOCATE 26,8 sta TX ; ... setup column 26 stb TY ; ... setup row 8 ldb #$FC ; spades FIXME MAKE THIS A DAMN CONSTANT jsr DRAWCH ; draw it ; LOOP THROUGH FOUR ITEM TYPES ; 1270 FOR I=1 TO 4 ldx #1 ; setup our loop index counter ldd #$1C04 ; setup where to start drawing sta TX ; ... column 28 stb TY ; ... row 4 ; PRINT 0 IN WHITE ON BLACK THEN - IN GREEN ON BLACK THEN 0 IN WHITE ON BLACK BAS1280: ; 1280 LOCATE28,I+4:COLOR1:PRINT"0";:COLOR3:PRINT"-";:COLOR1:PRINT"0" lda #$1C ; reset column to 28 sta TX ; save it to the TileX global inc TY ; in this pass of the loop, increment row jsr COLOR1 ; reset to white on black ldb #$70 ; TRSCII ZERO jsr DRAWCH ; Draw the tile inc TX ; Move right 1 column jsr COLOR3 ; Setup green on black ldb #$6D ; TRSCII DASH jsr DRAWCH ; Draw the tile inc TX ; Move right 1 more column jsr COLOR1 ; Setup white on block ldb #$70 ; TRSCII ZERO jsr DRAWCH ; Draw the tile ; FINISH LOOP I ; 1290 NEXT leax 1,X ; Okay bump the index counter cmpx #5 ; Did we make 4 passes and land at 5? bne BAS1280 ; Nope, keep looping ;********************************************************************* ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; SETUP TIME DISPLAY IN GREEN ON BLOCK BAS1300: ; 1300 LOCATE 28,10:COLOR3:PRINT"TIME" jsr COLOR3 ; Setup GREEN on BLACK ldd #$1C0A ; LOCATE 28,10 sta TX ; setup column 28 stb TY ; setup row 10 ldx #TIME ; load X with pointer to string stx STRPTR ; ... and store in temp lda #4 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; PRINTS STUFF AROUND COUNTDOWN ; 1310 LOCATE26,11:PRINT" " ; 0000cf56 1e 0x1e ; 0000cf57 05 0x05 ; 0000cf58 a1 0xa1 ; 0000cf59 32 0x32 '2' ; 0000cf5a 36 0x36 '6' ; 0000cf5b 2c 0x2c ',' ; 0000cf5c 31 0x31 '1' ; 0000cf5d 31 0x31 '1' ; 0000cf5e 3a 0x3a ':' ; 0000cf5f 95 0x95 ; 0000cf60 22 0x22 '"' ; 0000cf61 91 0x91 ; 0000cf62 e4 0xe4 ; 0000cf63 20 0x20 ' ' ; 0000cf64 20 0x20 ' ' ; 0000cf65 20 0x20 ' ' ; 0000cf66 14 0x14 ; 0000cf67 3c 0x3c '<' ; 0000cf68 22 0x22 '"' ; 0000cf69 00 0x00 ; DRAW YELLOW VERTICAL LINE BAS1320: ; 1320 LINE(200,0)-(200,191),2 BAS1330: ; 1330 LINE(204,0)-(204,191),2 ldd #$010C ; Setup YELLOW on BLACK colors sta CLRFORE stb CLRBACK ldd #$1900 ; draw vertical line at column 25 sta TX ; ... column 25 stb TY ; ... row 0 lda #16 ; for 16 vertical characters sta INDEXIY ; working variable for vertical count ldb #$9F ; Semigraphics green full block jsr VLINE ; now go draw vertical line of * ; DRAW MAGENTA HORIZONTAL LINE BAS1340: ; 1340 LINE(209,110)-(256,110),7 ldd #$060C ; Setup MAGENTA on BLACK colors sta CLRFORE ; setup foreground color stb CLRBACK ; setup background color ldd #$1A09 ; start drawing at ... sta TX ; ... column 26 stb TY ; ... row 9 lda #32 ; for 6 horizontal characters to column 31 sta INDEXIX ; working varable for horizontal count ldb #$EC ; Semigraphics MAGENTA upper half jsr HLINE ; now go draw horizonal line of * ; FIXME Tone A Course value to 2? Here? Ugh. BAS1350: ; 1350 SOUND 1,2 ; DRAW BLUE HORIZONTAL LINE BAS1360: ; 1360 LINE(209,40)-(255,40),3 ldd #$020C ; Setup MAGENTA on BLACK colors sta CLRFORE ; setup foreground color stb CLRBACK ; setup background color ldd #$1A03 ; start drawing at ... sta TX ; ... column 26 stb TY ; ... row 3 lda #32 ; for 6 horizontal characters to column 31 sta INDEXIX ; working varable for horizontal count ldb #$A3 ; Semigraphics BLUE lower half jsr HLINE ; now go draw horizonal line of * ; DRAW GREEN HORIZONTAL LINE BAS1370: ; 1370 LINE(209,151)-(255,151),1 jsr COLOR3 ; GREEN ON BLACK ldd #$1A0C ; start drawing at ... sta TX ; ... column 26 stb TY ; ... row 12 lda #32 ; for 6 horizontal characters to column 31 sta INDEXIX ; working varable for horizontal count ldb #$CC ; Semigraphics WHITE full block jsr HLINE ; now go draw horizonal line of * ; 84 = HOLLOW CIRCLE BAS1380: ; 1380 COLOR4:LOCATE26,14:PRINT" "; ; 0000cff7 64 0x64 'd' ; 0000cff8 05 0x05 ; 0000cff9 9a 0x9a ; 0000cffa 34 0x34 '4' ; 0000cffb 3a 0x3a ':' ; 0000cffc a1 0xa1 ; 0000cffd 32 0x32 '2' ; 0000cffe 36 0x36 '6' ; 0000cfff 2c 0x2c ',' ; 0000d000 31 0x31 '1' ; 0000d001 34 0x34 '4' ; 0000d002 3a 0x3a ':' ; 0000d003 95 0x95 ; 0000d004 22 0x22 '"' ; 0000d005 20 0x20 ' ' ; 0000d006 84 0x84 ; 0000d007 20 0x20 ' ' ; 0000d008 84 0x84 ; 0000d009 20 0x20 ' ' ; 0000d00a 84 0x84 ; 0000d00b 22 0x22 '"' ; 0000d00c 3b 0x3b ';' ; 0000d00d 00 0x00 jsr COLOR4 ; BLACK on GREEN ldd #$1A0E ; LOCATE 26,14 sta TX ; setup column 26 stb TY ; setup row 14 ldx #CREWLEFT ; load X with pointer to string stx STRPTR ; ... and store in temp lda #6 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ; IF YOU STILL HAVE ALL LIVES JUMP TO COLOR/SOUND SETUP BAS1381: ; 1381 IF CR=4 THEN GOTO 1390 lda CR ; Start of check for crew remaining cmpa #4 ; 4 crew remaining? beq BAS1390 ; yes, skip updating lives left ; ERASE MARKERS FOR CREW ALREADY LOST FROM LEFT TO RIGHT BAS1382: ; 1382 LOCATE26,14:FOR I=1 TO 4-CR:PRINT" ";:NEXT ; 0000d024 66 0x66 'f' ; 0000d025 05 0x05 ; 0000d026 a1 0xa1 ; 0000d027 32 0x32 '2' ; 0000d028 36 0x36 '6' ; 0000d029 2c 0x2c ',' ; 0000d02a 31 0x31 '1' ; 0000d02b 34 0x34 '4' ; 0000d02c 3a 0x3a ':' ; 0000d02d 81 0x81 ; 0000d02e 20 0x20 ' ' ; 0000d02f 49 0x49 'I' ; 0000d030 d2 0xd2 ; 0000d031 31 0x31 '1' ; 0000d032 20 0x20 ' ' ; 0000d033 c3 0xc3 ; 0000d034 20 0x20 ' ' ; 0000d035 34 0x34 '4' ; 0000d036 cb 0xcb ; 0000d037 43 0x43 'C' ; 0000d038 52 0x52 'R' ; 0000d039 3a 0x3a ':' ; 0000d03a 95 0x95 ; 0000d03b 22 0x22 '"' ; 0000d03c 20 0x20 ' ' ; 0000d03d 20 0x20 ' ' ; 0000d03e 22 0x22 '"' ; 0000d03f 3b 0x3b ';' ; 0000d040 3a 0x3a ':' ; 0000d041 82 0x82 ; 0000d042 00 0x00 ldd #$1A0E ; LOCATE 26,14 sta TX ; setup column 26 stb TY ; setup row 14 ldx #CREWLEFT ; load X with pointer to string stx STRPTR ; ... and store in temp lda #2 ; load Y with length of string sta STRLEN ; ... and store in temp jsr PRINTAT ; now go print string at ;********************************************************************* ;* SUBROUTINE / JUMP 1390 RESET COLOR AND SOUND CHIP ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS1390: ; 1390 COLOR1 jsr COLOR1 ; WHITE on BLACK BAS1490: ; 1490 SOUND 0,128:SOUND 6,8:SOUND 1,2:SOUND 11,0:SOUND 12,12 ; SOUND 0,128 - CHANNEL A FINE ; SOUND 1,2 - CHANNEL A COARSE ; SOUND 2,16 - CHANNEL B FINE ; SOUND 3,2 - CHANNEL B COARSE ; SOUND 6,8 - NOISE GENERATOR CONTROL - NOISE FREQ COUNTDOWN BY 8 ; SOUND 8,16 - CHANNEL A FULL VOLUME ; SOUND 9,16 - CHANNEL B FULL VOLUME ; SOUND 11,0 - ENVELOPE PERIOD FINE ; SOUND 12,12 - ENVELOPE PERIOD COARSE ;HALT: bra HALT BAS1590: ; 1540 SOUND 8,16:SOUND 2,16:SOUND 3,2:SOUND 9,16:RETURN rts ; return ;********************************************************************* ;* SUBROUTINE 2000 TIME TRIAL ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS2000: ; 2000 REM*** TIME TRIAL ; SETUP SCREEN AND SOUND CHIP ; 2010 GOSUB 1000 ; SETUP ALIEN AND PLAYER AND ITEMS ; 2020 GOSUB8100:GOSUB8130 ; FORCE ALIEN POSITION TO CENTER OF DECK ; 2030 POKE&HF800,10:POKE&HF801,6 ; START THE CLOCK ; 2045 T=TIME ; DISABLE ALIEN MOVE ROUTINE WITH RET ; 2050 POKE&HF700,&HC9 ; F500 ALIEN AND PLAYER POSITION CHECK ; F600 PLAYER MOVE HIT ITEMS WALLS READ KEYS? ; F700 ALIEN MOVE AI ; F790 UPDATE PLAYER ; F7B0 ALIEN CAUGHT PLAYER ; F7D0 UPDATE NUMBERS ; SOUND MIXER CONTROL/IO ENABLE ; 60 = 00111100 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A OFF ; B2 Tone Enable C OFF ; B1 Tone Enable B ON ; B0 Tone Enable A ON ; 2060 EXEC&HF500:EXEC&HF7D0:SOUND 7,60 ;********************************************************************* ;* F500 ALIEN AND PLAYER POSITION CHECK ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; TFR 0x20,B ' ' ;F500 06 20 LD B,0x20 ' ' ; LBSR 0xF790 ;F502 CD 90 F7 CALL 0xF790 ; LDX 0xF800 ;F505 2A 00 F8 LD HL,(0xF800) AlienX -> HL ; LDU 0xF802 ;F508 DD 2A 02 LD IX,(0xF802) PlayerX -> IX ; STX 0xF802 ;F50C 22 02 F8 LD (0xF802),HL HL -> PlayerX ; TFR 0x20,B ' ' ;F50F 06 20 LD B,0x20 ' ' ; LBSR 0xF790 ;F511 CD 90 F7 CALL 0xF790 ; LDX 0xF802 ;F514 2A 02 F8 LD HL,(0xF802) PlayerX -> HL ; STX 0xF800 ;F517 22 00 F8 LD (0xF800),HL HL -> AlienX ; STU 0xF802 ;F51A DD 22 02 LD (0xF802),IX IX -> PlayerX ; LBSR 0xF600 ;F51E CD 00 F6 CALL 0xF600 SUB Player Move ; TFR 0x84,B 'O' player ;F521 06 84 LD B,0x84 'O' player ; LBSR 0xF790 ;F523 CD 90 F7 CALL 0xF790 ; LBSR 0xF7B0 ;F526 CD B0 F7 CALL 0xF7B0 SUB: Alien Caught Player? ; LDA 0xF80B ;F529 3A 0B F8 LD A,(0xF80B) Load Player Caught Flag into A ; CMPA #$ 0 ;F52C FE 01 CP 0x01 Was player caught? ; BEQ to RTS address ;F52E C8 RET Z ; LBSR 0xF700 ;F52F CD 00 F7 CALL 0xF700 SUB: Alien Move AI ; LBSR 0xF7B0 ;F532 CD B0 F7 CALL 0xF7B0 SUB: Alien Caught Player? ; LDA 0xF80B ;F535 3A 0B F8 LD A,(0xF80B) Load Player Caught Flag into A ; CMPA #$ 0 ;F538 FE 01 CP 0x01 Was player caught? ; BEQ to RTS address ;F53A C8 RET Z Yes... Return ; LBRA 0xF569 ;F53B 18 2C JR 0xF569 No... ; BMI to RTS address ;F53D F8 RET M Return if Minus? ; JF53E CMPA #$ 0 ;F53E FE 00 CP 0x00 ; LBEQ 0xF548 ;F540 28 06 JR Z,0xF548 If A=0 jump F548 ; SUBA #$ 0 ;F542 D6 05 SUB 0x05 Subtract 5 (Moving Left?) ; LBCS 0xF554 ;F544 38 0E JR C,0xF554 ; LBRA 0xF53E ;F546 18 F6 JR 0xF53E ; JF548 LDA 0xF802 ;F548 3A 02 F8 LD A,(0xF802) PlayerX -> A ; TFR A,B ;F54B 47 LD B,A A -> B ; LDA 0xF800 ;F54C 3A 00 F8 LD A,(0xF800) AlienX -> A ; CMPA B_Temp ;F54F B8 CP B Compare PlayerX with AlienX ; LBNE 0xF554 ;F550 20 02 JR NZ,0xF554 Not the same? Jump F554 ; LBRA 0xF567 ;F552 18 13 JR 0xF567 The Same... Jump F567 ; JF554 LDA 0xF803 ;F554 3A 03 F8 LD A,(0xF803) PlayerY -> A ; JF557 CMPA #$ 0 ;F557 FE 00 CP 0x00 ; LBEQ 0xF560 ;F559 28 05 JR Z,0xF560 ; SUBA #$ 0 ;F55B D6 06 SUB 0x06 Moving Up? ; BCS to RTS address ;F55D D8 RET C Return if Carry Set (Borrow) ; LBRA 0xF557 ;F55E 18 F7 JR 0xF557 Loop Back ; JF560 LDA 0xF803 ;F560 3A 03 F8 LD A,(0xF803) PlayerY -> A ; TFR A,B ;F563 47 LD B,A A -> B ; LDA 0xF801 ;F564 3A 01 F8 LD A,(0xF801) AlienY -> B ; JF567 CMPA B_Temp ;F567 B8 CP B Compare AlienY to PlayerY ; BNE to RTS address ;F568 C0 RET NZ Not the same? Return ; JF569 LDX 0xF800 ;F569 2A 00 F8 LD HL,(0xF800) AlienX -> HL ; LDU 0xF802 ;F56C DD 2A 02 LD IX,(0xF802) PlayerX -> IX ; STX 0xF802 ;F570 22 02 F8 LD (0xF802),HL HL -> PlayerX ; TFR 0x40,B '@' ;F573 06 40 LD B,0x40 '@' '@' -> B ; LBSR 0xF790 ;F575 CD 90 F7 CALL 0xF790 SUB: ; LDX 0xF802 ;F578 2A 02 F8 LD HL,(0xF802) PlayerX -> HL ; STX 0xF800 ;F57B 22 00 F8 LD (0xF800),HL HL -> AlienX ; STU 0xF802 ;F57E DD 22 02 LD (0xF802),IX IX -> PlayerX ; RTS ;F582 C9 RET ;********************************************************************* ;* F600 PLAYER MOVE HIT ITEMS WALLS READ KEYS? ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; TFR 0x00,A ;F600 3E 00 LD A,0x00 Turn off "Hit the Wall" flag ; STA 0xF80F ;F602 32 0F F8 LD (0xF80F),A Store the NOPE hit the wall flag ; ORCC #$50 ;F605 F3 DI Disable interrupts ; LDA IO_90_0x90 ;F606 DB 90 IN A,(0x90) Pull input from port 90 - key in? ; ANDCC #$AF ;F608 FB EI Re-enable interrupts ; CMPA #$ 1 ;F609 FE 1C CP 0x1C A Key Pressed? ; LBNE 0xF613 ;F60B 20 06 JR NZ,0xF613 No, go check next ; TFR 0x01,B ;F60D 06 01 LD B,0x01 Set Player Dir in one Axis ; TFR 0x00,C ;F60F 0E 00 LD C,0x00 Set Player Dir for other Axis ; LBRA 0xF62E ;F611 18 1B JR 0xF62E ; JF613 CMPA #$ 1 ;F613 FE 1D CP 0x1D A Key Pressed? ; LBNE 0xF61D ;F615 20 06 JR NZ,0xF61D ; TFR 0xFF,B ;F617 06 FF LD B,0xFF ; TFR 0x00,C ;F619 0E 00 LD C,0x00 ; LBRA 0xF62E ;F61B 18 11 JR 0xF62E ; JF61D CMPA #$ 1 ;F61D FE 1E CP 0x1E A Key Pressed? ; LBNE 0xF627 ;F61F 20 06 JR NZ,0xF627 ; TFR 0x00,B ;F621 06 00 LD B,0x00 ; TFR 0xFF,C ;F623 0E FF LD C,0xFF ; LBRA 0xF62E ;F625 18 07 JR 0xF62E ; JF627 CMPA #$ 1 ;F627 FE 1F CP 0x1F A Key Pressed? ; BNE to RTS address ;F629 C0 RET NZ ; TFR 0x00,B ;F62A 06 00 LD B,0x00 ; TFR 0x01,C ;F62C 0E 01 LD C,0x01 ; JF62E LDA 0xF802 ;F62E 3A 02 F8 LD A,(0xF802) PlayerX -> A ; ADDA ,B ;F631 80 ADD A,B ; TFR A,D ;F632 57 LD D,A ; LDA 0xF803 ;F633 3A 03 F8 LD A,(0xF803) PlayerY -> A ; ADDA ,C ;F636 81 ADD A,C ; TFR A,E ;F637 5F LD E,A ; ADDA ,0x02 ;F638 C6 02 ADD A,0x02 ; TFR A,L ;F63A 6F LD L,A ; TFR 0x00,H ;F63B 26 00 LD H,0x00 ; ADD X=X+X ;F63D 29 ADD HL,HL ; ADD X=X+X ;F63E 29 ADD HL,HL ; ADD X=X+X ;F63F 29 ADD HL,HL ; ADD X=X+X ;F640 29 ADD HL,HL ; ADD X=X+X ;F641 29 ADD HL,HL ; TFR D,A ;F642 7A LD A,D ; INCA ;F643 3C INC A ; ADDA ,L ;F644 85 ADD A,L ; TFR A,L ;F645 6F LD L,A ; TFR H,A ;F646 7C LD A,H ; ADC A,0xC2 - Fix;F647 CE C2 ADC A,0xC2 ; TFR A,H ;F649 67 LD H,A ; LDA ,X ;F64A 7E LD A,(HL) ; CMPA #$ 2 ;F64B FE 20 CP 0x20 Is it a space? ; LBNE 0xF658 ;F64D 20 09 JR NZ,0xF658 ; JF64F TFR D,A ;F64F 7A LD A,D ; STA 0xF802 ;F650 32 02 F8 LD (0xF802),A Store PlayerX ; TFR E,A ;F653 7B LD A,E ; STA 0xF803 ;F654 32 03 F8 LD (0xF803),A Store PlayerY ; RTS ;F657 C9 RET ; JF658 CMPA #$ 8 ;F658 FE 83 CP 0x83 Did you hit a Diamond resource? ; LBNE 0xF66F ;F65A 20 13 JR NZ,0xF66F No, go check next resource ; LDA 0xF806 ;F65C 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F65F FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F661 D0 RET NC Yes, can't pick up more ; INCA ;F662 3C INC A No, increment count of items carried ; STA 0xF806 ;F663 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF807 ;F666 3A 07 F8 LD A,(0xF807) Load count of Diamonds carried ; INCA ;F669 3C INC A Add a Diamond ; STA 0xF807 ;F66A 32 07 F8 LD (0xF807),A Store new count of Diamonds ; LBRA 0xF64F ;F66D 18 E0 JR 0xF64F Jump back to top of loop ; JF66F CMPA #$ 8 ;F66F FE 82 CP 0x82 Did you hit a Club resource? ; LBNE 0xF686 ;F671 20 13 JR NZ,0xF686 No, go check next resource ; LDA 0xF806 ;F673 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F676 FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F678 D0 RET NC Yes, can't pick up more ; INCA ;F679 3C INC A No, increment count of items carried ; STA 0xF806 ;F67A 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF808 ;F67D 3A 08 F8 LD A,(0xF808) Load count of Clubs carried ; INCA ;F680 3C INC A Add a Club ; STA 0xF808 ;F681 32 08 F8 LD (0xF808),A Store new count of Clubs ; LBRA 0xF64F ;F684 18 C9 JR 0xF64F Jump back to top of loop ; JF686 CMPA #$ 8 ;F686 FE 81 CP 0x81 Did you hit a Heart resource? ; LBNE 0xF69D ;F688 20 13 JR NZ,0xF69D No, go check next resource ; LDA 0xF806 ;F68A 3A 06 F8 LD A,(0xF806) Yes, get current items carried ; CMPA #$ 0 ;F68D FE 05 CP 0x05 Holding 5 items already? ; BCC to RTS address ;F68F D0 RET NC Yes, can't pick up more ; INCA ;F690 3C INC A No, increment count of items carried ; STA 0xF806 ;F691 32 06 F8 LD (0xF806),A Store new count of items carried ; LDA 0xF809 ;F694 3A 09 F8 LD A,(0xF809) Load count of Hearts carried ; INCA ;F697 3C INC A Add a Heart ; STA 0xF809 ;F698 32 09 F8 LD (0xF809),A Store new count of Hearts ; LBRA 0xF64F ;F69B 18 B2 JR 0xF64F Jump back to top of loop ; JF69D CMPA #$ 8 ;F69D FE 80 CP 0x80 Did you hit a Spade resource? ; LBNE 0xF6B4 ;F69F 20 13 JR NZ,0xF6B4 ; LDA 0xF806 ;F6A1 3A 06 F8 LD A,(0xF806) Get current number of items carried ; CMPA #$ 0 ;F6A4 FE 05 CP 0x05 Already carrying 5 items? ; BCC to RTS address ;F6A6 D0 RET NC Yep, just return ; INCA ;F6A7 3C INC A No, pick up next resource ; STA 0xF806 ;F6A8 32 06 F8 LD (0xF806),A Store new total of items carried ; LDA 0xF80A ;F6AB 3A 0A F8 LD A,(0xF80A) Load count of Spades carried ; INCA ;F6AE 3C INC A Add a Spade ; STA 0xF80A ;F6AF 32 0A F8 LD (0xF80A),A Store new count of Spades ; LBRA 0xF64F ;F6B2 18 9B JR 0xF64F Jump back to top of loop ; JF6B4 LDA 0xF802 ;F6B4 3A 02 F8 LD A,(0xF802) PlayerX -> A ; JF6B7 CMPA #$ 0 ;F6B7 FE 00 CP 0x00 At screen left? ; LBEQ 0xF6CD ;F6B9 28 12 JR Z,0xF6CD Hit the left wall ; SUBA #$ 0 ;F6BB D6 05 SUB 0x05 Check 5 spaces left ; LBCS 0xF6C1 ;F6BD 38 02 JR C,0xF6C1 Woops, had to borrow, we went too far ; LBRA 0xF6B7 ;F6BF 18 F6 JR 0xF6B7 Go back and keep checking left... ; JF6C1 LDA 0xF803 ;F6C1 3A 03 F8 LD A,(0xF803) PlayerY -> A ; JF6C4 CMPA #$ 0 ;F6C4 FE 00 CP 0x00 At top? ; LBEQ 0xF6CD ;F6C6 28 05 JR Z,0xF6CD ; SUBA #$ 0 ;F6C8 D6 06 SUB 0x06 Check up? ; BCS to RTS address ;F6CA D8 RET C ; LBRA 0xF6C4 ;F6CB 18 F7 JR 0xF6C4 Go back and keep checking ; JF6CD TFR 0x01,A ;F6CD 3E 01 LD A,0x01 Set hit the wall flag ; STA 0xF80F ;F6CF 32 0F F8 LD (0xF80F),A Store hit the wall flag to trigger sound ; LDA ,X ;F6D2 7E LD A,(HL) HL pointer -> A ; CMPA #$ A ;F6D3 FE A5 CP 0xA5 Compare with A5 ; LBNE 0xF6DA ;F6D5 20 03 JR NZ,0xF6DA ; ST0x20 ,X ;F6D7 36 20 LD (HL),0x20 Put a space into HL ; RTS ;F6D9 C9 RET Done - wall knocked down? ; JF6DA LDA ,X ;F6DA 7E LD A,(HL) Load type of block at position ; CMPA #$ 1 ;F6DB FE 16 CP 0x16 Is it a ??? ; BCC to RTS address ;F6DD D0 RET NC Yes, just bail ; TFR H,A ;F6DE 7C LD A,H ; SUBA #$ 0 ;F6DF D6 02 SUB 0x02 ; TFR A,H ;F6E1 67 LD H,A ; LDA ,X ;F6E2 7E LD A,(HL) ; CMPA #$ 2 ;F6E3 FE 20 CP 0x20 Is it a space? ; LBNE 0xF6EB ;F6E5 20 04 JR NZ,0xF6EB ; TFR 0x22,A ;F6E7 3E 22 LD A,0x22 Put 22 -> A '"' ; STA ,X ;F6E9 77 LD (HL),A A -> HL ; RTS ;F6EA C9 RET ; JF6EB TFR 0x20,A ;F6EB 3E 20 LD A,0x20 Put a space ; STA ,X ;F6ED 77 LD (HL),A Store space into point ; TFR H,A ;F6EE 7C LD A,H H -> A ; ADDA ,0x02 ;F6EF C6 02 ADD A,0x02 Add 2 ; TFR A,H ;F6F1 67 LD H,A Put A -> A ; TFR 0xA5,A ;F6F2 3E A5 LD A,0xA5 A5 -> A ; STA ,X ;F6F4 77 LD (HL),A Put A5 -> A ; RTS ;F6F5 C9 RET ;********************************************************************* ;* F700 MOVE ALIEN AI ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; MOVALN LDA 0xF800 ;F700 3A 00 F8 LD A,(0xF800) A=AlienX ; BF703 CMPA #$ 0 ;F703 FE 00 CP 0x00 If zero... ; LBEQ 0xF70D ;F705 28 06 JR Z,0xF70D ... goto F70D ; SUBA #$ 0 ;F707 D6 05 SUB 0x05 else subtract 5 from X? ; LBCS 0xF71A ;F709 38 0F JR C,0xF71A if you had to borrow... goto F71A ; LBRA 0xF703 ;F70B 18 F6 JR 0xF703 Loop back to F703 ; ;--------------------------------------------------------------------------------------- ; BF70D LDA 0xF801 ;F70D 3A 01 F8 LD A,(0xF801) A=AlienY ; BF710 CMPA #$ 0 ;F710 FE 00 CP 0x00 If zero... ; LBEQ 0xF731 ;F712 28 1D JR Z,0xF731 ... goto F731 ; SUBA #$ 0 ;F714 D6 06 SUB 0x06 else subtract 6 from Y? ; LBCS 0xF71A ;F716 38 02 JR C,0xF71A if you had to borrow... goto F71A ; LBRA 0xF710 ;F718 18 F6 JR 0xF710 Loop back to F710 ; ;--------------------------------------------------------------------------------------- ; BF71A LDA 0xF800 ;F71A 3A 00 F8 LD A,(0xF800) A=AlienX ; TFR A,B ;F71D 47 LD B,A Mov A to B register ; LDA 0xF804 ;F71E 3A 04 F8 LD A,(0xF804) Load temp AlienX ; ADDA ,B ;F721 80 ADD A,B Add to AlienX position ; STA 0xF800 ;F722 32 00 F8 LD (0xF800),A Save new AlienX position ; LDA 0xF801 ;F725 3A 01 F8 LD A,(0xF801) A=AliexY ; TFR A,B ;F728 47 LD B,A Move A to B register ; LDA 0xF805 ;F729 3A 05 F8 LD A,(0xF805) Load temp AlienY ; ADDA ,B ;F72C 80 ADD A,B Add to Alien Y Position ; STA 0xF801 ;F72D 32 01 F8 LD (0xF801),A Save new AlienY position ; RTS ;F730 C9 RET Alien move is done - return to BASIC game ; ;--------------------------------------------------------------------------------------- ; BF731 LDA 0xF802 ;F731 3A 02 F8 LD A,(0xF802) A=PlayerX ; TFR A,B ;F734 47 LD B,A Move A to B register ; LDA 0xF800 ;F735 3A 00 F8 LD A,(0xF800) A=AlienX ; SUBA ,B ;F738 90 SUB B Subract AlienX frokm PlayerX ; LBCS 0xF745 ;F739 38 0A JR C,0xF745 If borrow goto F745 ; NEGA ;F73B ED 44 NEG Negate ; TFR A,C ;F73D 4F LD C,A Put difference in temporary spot CReg ; TFR 0xFF,A ;F73E 3E FF LD A,0xFF Set direction to move to -1 ; STA 0xF804 ;F740 32 04 F8 LD (0xF804),A Update X direction to move Alien (LEFT!) ; LBRA 0xF74B ;F743 18 06 JR 0xF74B Goto F74B ; BF745 TFR A,C ;F745 4F LD C,A A is X distance to player, put in CReg temp ; TFR 0x01,A ;F746 3E 01 LD A,0x01 A=1 ; STA 0xF804 ;F748 32 04 F8 LD (0xF804),A Update X direction to move Alien (RIGHT!) ; BF74B LDA 0xF803 ;F74B 3A 03 F8 LD A,(0xF803) A=PlayerY ; TFR A,B ;F74E 47 LD B,A Move A to B ; LDA 0xF801 ;F74F 3A 01 F8 LD A,(0xF801) A=AlienY ; SUBA ,B ;F752 90 SUB B Get difference between PlayerY and AlienY ; LBCS 0xF75F ;F753 38 0A JR C,0xF75F If borrow ; NEGA ;F755 ED 44 NEG Flip the Sign ; TFR A,B ;F757 47 LD B,A Now put B in A ; TFR 0xFF,A ;F758 3E FF LD A,0xFF Set A to -1 ; STA 0xF805 ;F75A 32 05 F8 LD (0xF805),A Update Y direction to move Alien (UP!) ; LBRA 0xF765 ;F75D 18 06 JR 0xF765 Goto F765 ; BF75F TFR A,B ;F75F 47 LD B,A A is Y distance to player, put in BReg ; TFR 0x01,A ;F760 3E 01 LD A,0x01 A=1 ; STA 0xF805 ;F762 32 05 F8 LD (0xF805),A Update Y direction to move Alien (DOWN!) ; BF765 TFR B,A ;F765 78 LD A,B ; DEC C ;F766 0D DEC C ; DECA ;F767 3D DEC A ; SUBA ,C ;F768 91 SUB C ; LBCS 0xF772 ;F769 38 07 JR C,0xF772 If borrow goto F772 ; TFR 0x00,A ;F76B 3E 00 LD A,0x00 Clear A ; STA 0xF805 ;F76D 32 05 F8 LD (0xF805),A Update Y direction to move Alien (SAME ROW) ; LBRA 0xF71A ;F770 18 A8 JR 0xF71A Go back to top ; BF772 TFR 0x00,A ;F772 3E 00 LD A,0x00 Clear A ; STA 0xF804 ;F774 32 04 F8 LD (0xF804),A Update X direction to move Alien (SAME COL) ; LBRA 0xF71A ;F777 18 A1 JR 0xF71A Go back to top ;********************************************************************* ;* F790 UPDATE PLAYER CREATE POINTER TO NEW PLACE TO DRAW THING - PLAYER WALL ETC ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; LDA 0xF802 ;F790 3A 02 F8 LD A,(0xF802) PlayerX -> A ; TFR A,D ;F793 57 LD D,A Save A to D ; LDA 0xF803 ;F794 3A 03 F8 LD A,(0xF803) PlayerY -> A ; ADDA ,0x02 ;F797 C6 02 ADD A,0x02 Add 2 to Y ; TFR A,L ;F799 6F LD L,A Save A to L ; TFR 0x00,H ;F79A 26 00 LD H,0x00 Zero out H ; ADD X=X+X ;F79C 29 ADD HL,HL +2 ; ADD X=X+X ;F79D 29 ADD HL,HL +4 ; ADD X=X+X ;F79E 29 ADD HL,HL +8 ; ADD X=X+X ;F79F 29 ADD HL,HL +16 ; ADD X=X+X ;F7A0 29 ADD HL,HL +32 ; TFR D,A ;F7A1 7A LD A,D Pull back PlayerX ; INCA ;F7A2 3C INC A Add an X ; ADDA ,L ;F7A3 85 ADD A,L Now add 32 from L? ; TFR A,L ;F7A4 6F LD L,A Save A to L ; TFR H,A ;F7A5 7C LD A,H Load H into A ; ADC A,0xC2 - Fix;F7A6 CE C2 ADC A,0xC2 Now put in a C2 ; TFR A,H ;F7A8 67 LD H,A Put C2 into H - high part of pointer ; TFR B,A ;F7A9 78 LD A,B Pull B into A - character to show at pointer ; STA ,X ;F7AA 77 LD (HL),A Put character onto screen ; RTS ;F7AB C9 RET ;********************************************************************* ;* F7B0 ALIEN CAUGHT PLAYER? ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; TFR 0x00,A ;F7B0 3E 00 LD A,0x00 Zero out player caught flag ; STA 0xF80B ;F7B2 32 0B F8 LD (0xF80B),A Store it ; LDA 0xF802 ;F7B5 3A 02 F8 LD A,(0xF802) Get PlayerX -> A ; TFR A,B ;F7B8 47 LD B,A Move A -> B ; LDA 0xF800 ;F7B9 3A 00 F8 LD A,(0xF800) Get AlienX -> A ; CMPA B_Temp ;F7BC B8 CP B Same X coordinate? ; BNE to RTS address ;F7BD C0 RET NZ No, not caught so return ; LDA 0xF803 ;F7BE 3A 03 F8 LD A,(0xF803) Yes, so now check PlayerY -> A ; TFR A,B ;F7C1 47 LD B,A Move A -> B ; LDA 0xF801 ;F7C2 3A 01 F8 LD A,(0xF801) Get AlienY -> A ; CMPA B_Temp ;F7C5 B8 CP B Same Y coordinate? ; BNE to RTS address ;F7C6 C0 RET NZ No, not caught so return ; TFR 0x01,A ;F7C7 3E 01 LD A,0x01 Yes, whoops got caught ; STA 0xF80B ;F7C9 32 0B F8 LD (0xF80B),A Save that caught flag ; RTS ;F7CC C9 RET ;********************************************************************* ;* F7D0 UPDATE NUMBERS DIRECT DRAW ON SCREEN ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; TFR 0xC2BE,X ;F7D0 21 BE C2 LD HL,0xC2BE HL pointer to C2BE ; TFR 0xF807,U ;F7D3 DD 21 07 LD IX,0xF807 IX pointer to current item count ; TFR 0x0020,U ;F7D7 01 20 00 LD BC,0x0020 Move a 32 (screen line?) ; JF7DA LDA $E ,U ;F7DA DD 7E 00 LD A,(IX+0) Get current item count ; ADDA ,0x30 ;F7DD C6 30 ADD A,0x30 Turn it into ASCII number ; STA ,X ;F7DF 77 LD (HL),A Store it into C2BE pointer ; ADD X=X+U ;F7E0 09 ADD HL,BC Move down a screen line ; TFR L,A ;F7E1 7D LD A,L Get low byte of pointer ; CMPA #$ 3 ;F7E2 FE 3E CP 0x3E Are we looking at 5th line @ C23E ; BEQ to RTS address ;F7E4 C8 RET Z Done ; INC U ;F7E5 DD 23 INC IX Add one to count ; LBRA 0xF7DA ;F7E7 18 F1 JR 0xF7DA Loop Back ;********************************************************************* ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; SOUND WHEN YOU HIT WALL ; SOUND MIXER CONTROL/IO ENABLE ; 55 = 00110111 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A ON ; B2 Tone Enable C OFF ; B1 Tone Enable B OFF ; B0 Tone Enable A OFF ; 2090 IF PEEK(&HF80F)=1 THEN SOUND7,55 ; ENVELOPE PERIOD CONTROL FINE TUNE ; 9 = 00001001 ; 2100 SOUND 13,9 ; YOU HIT A PARKED ALIEN? OKAY - SUICIDE SUCCESSFULL ; 2110 IF PEEK(&HF80B)=1 THEN GOTO800 ; DID YOU MAKE IT INTO THE SHUTTLE ; RESET COUNT OF COMPLETED ITEM TYPES ; COUNT UP POINTS FOR TIME REMAINING ; 2120 IF PEEK(&HF802)=22 THEN GOSUB 600:IF PX=4 THEN PX=0:GOTO 2500 ; TOTAL TIME = CURRENT TIME - START TIME ; TIME LEFT = INTEGER TOTAL TIME / 1000 ; 2130 TT=TIME-T:TL=100-INT(TT/1000) ; UPDATE TIME LEFT ON SCREEN ; 2140 LOCATE28,11:PRINT RIGHT$(" "+STR$(TL),3) ; IF TIME LEFT < 0 THEN JUMP 2400 SORRY NO BONUS ; 2150 IF TL<0 THEN GOTO 2400 ; LOOP BACK TO CONTINUE TIME TRIAL ; 2160 GOTO 2060 ;********************************************************************* ;* JUMP 2400 TIME TRIAL OVER - OUT OF TIME ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; SOUND MIXER CONTROL/IO ENABLE ; 62 = 00111110 ; B7 IO Port B Input Enable ; B6 IO Port A Input Enable ; B5 Noise Enable C OFF ; B4 Noise Enable B OFF ; B3 Noise Enable A OFF ; B2 Tone Enable C OFF ; B1 Tone Enable B OFF ; B0 Tone Enable A ON ; START TIME OVER DRAW LOOP ; 2400 SOUND7,62:FOR I=1 TO 16 ; POSITION TO DRAW NEXT LETTER ; 2410 LOCATE3+I,8 ; FIND NEXT LETTER IN BANNER ; 2420 PR$=MID$("T I M E O V E R",I,1) ; DRAW NEXT LETTER ; 2425 PRINTPR$:IF PR$=" " THEN GOTO 2435 ; USE LETTER OR SPACE DISPLAYED AS TONE? ; 2430 PLAY"L12V11N"+STR$(-I+50) ; DELAY BETWEEN LETTERS/TONES ; 2435 FOR J=1 TO40:NEXT ; END BANNER LOOP ; 2440 NEXT ; REENABLE ALIEN MOVE ROUTINE - REPLACE RET WITH LD A,(**) ; 2445 POKE&HF700,&H3A ; MOVE TO NEXT LINE ; COLOR REVERSE BLACK ON GREEN ; PRINT NO BONUS ; COLOR WHITE ON BLACK ; 2450 LOCATE7,9:COLOR4:PRINT"SORRY NO BONUS";:COLOR1 ; DELAY THEN RETURN ; 2460 FOR I=1 TO 1000:NEXT:RETURN ;********************************************************************* ;* JUMP 2500 TIME TRIAL SUCCESS COUNT REMAINING POINTS ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 2500 REM********* ; REENABLE ALIEN MOVE - REPLACE RET WITH LD A,(**) ; 2505 POKE&HF700,&H3A ; COUNT FOR EACH TIME LEFT ; 2530 FOR I=0 TO TL ; ADD ONE POINT ; MOVE CURSOR TO SCORE ; UPDATE SCORE ; 2540 SC=SC+1:LOCATE26,2:PRINT RIGHT$(" "+STR$(SC),5) ; MOVE CURSOR TO TIME ; UPDATE TIME COUNTING DOWN ; 2550 LOCATE28,11:PRINT RIGHT$(" "+STR$(TL-I),3) ; RING THE BELL FOR EACH POINT ; 2555 PLAY"L20SO5c" ; TIME LEFT COUNTDOWN LOOP ; 2560 NEXT ; SUBTRACT ONE FROM COUNT OF ITEMS NEEDED ON NEXT? ; 2570 PM=PM-1 ; FALL THROUGH INTO ;********************************************************************* ;* NEXT JUMP 3000 NEXT LEVEL SETUP ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* NEXT: ; 3000 REM**** next ; PLAY LEVEL START MUSIC ; 3050 GOSUB 7200 ; INCREMENT NUMBER OF ITEMS NEEDED ; AND CAP IT AT 6 ; FIXME IS THERE A BUG IN THIS AT HIGH LEVELS? ; 3100 PM=PM+1:IF PM>6 THEN PM=6 ; LOOP THROUGH ITEM CATEGORIES ; 3110 FOR I=0 TO 3 ; SET SHUTTLE AMOUNTS TO EMPTY ; 3120 PS(I)=0 ; END LOOP ; 3130 NEXT ; 3140 RETURN ;********************************************************************* ;* SUBROUTINE DEMO1 ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS4000: DEMO1: ; 4000 REM***** demo1 ; DRAW HALL 1 ; 4010 CLS ; 4020 LINE(0,0)-(72,72),5 ; 4030 LINE(0,192)-(72,116),5 ; 4040 LINE(72,72)-(72,116),5 ; 4050 LINE(144,72)-(216,0),5 ; 4060 LINE(144,116)-(216,192),5 ; 4070 LINE(144,116)-(144,72),5 ; 4080 LINE(72,84)-(144,84),5 ; 4090 LINE(72,108)-(144,108),5 ; PLAY LOW BOOP ; DELAY ; 4100 PLAY"v11l1o3c":FOR I=1 TO 500:NEXT ; DRAW HALL 2 ; 4110 CLS ; 4120 LINE(0,0)-(48,48),5 ; 4130 LINE(0,192)-(48,140),5 ; 4140 LINE(48,48)-(48,140),5 ; 4150 LINE(168,48)-(216,0),5 ; 4160 LINE(168,140)-(216,192),5 ; 4170 LINE(168,140)-(168,48),5 ; 4180 LINE(48,68)-(168,68),5 ; 4190 LINE(48,120)-(168,120),5 ; PLAY LOWER BOOP ; DELAY ; 4200 PLAY"v11l1o2b.":FOR I=1 TO 500:NEXT ; START BUILDING ATSIGN ALIEN DISPLAY ; 4500 A$=CHR$(64)+CHR$(29) ; 4510 B$=A$+CHR$(30) ; 4520 C$=A$+CHR$(31) ; 4530 D$=A$+CHR$(29) ; 4540 E$=A$+CHR$(28) ; 4545 F$=C$+CHR$(29) ; 4550 A$=B$+B$+CHR$(28)+E$+E$+E$+E$+E$+E$+CHR$(31)+C$+C$+C$+C$+F$ ; 4560 A$=A$+D$+D$+D$+D$+D$+D$+CHR$(30)+B$+CHR$(28)+E$+E$+E$+CHR$(31)+E$ ; MOVE TO START DRAWING AT SIGNS WHITE ON BLACK ; 4565 LOCATE9,8 ; LOOP THROUGH ENTIRE STRING TO DRAW 1 AT SIGN AND CURSOR MOVE EACH ; 4570 FOR I=1 TO 78 ; DRAW JUST ONE ; 4580 PRINTMID$(A$,I,1); ; SMALL DELAY BETWEEN EACH ONE ; 4590 FOR J=1 TO 5:NEXT ; FINISH SLOW DRAWING THE ALIEN ; 4600 NEXT ; 4700 SOUND 4,70:SOUND 5,0 ; 4710 SOUND 2,0:SOUND 3,15 ; 4720 SOUND 9,15:SOUND10,15 ; 4730 SOUND 7,57 ; NOW FLASH ALIEN WITH ALTERNATING TONES ; 4750 FOR I=1TO 8 ; 4760 COLOR3:LOCATE9,8:PRINTA$ ; 4770 SOUND 3,15 ; 4780 FOR J=0 TO 50:NEXT ; 4790 COLOR1:LOCATE9,8:PRINTA$ ; 4800 SOUND 3,13 ; DELAY ; 4810 FOR J=0 TO 50:NEXT ; 4820 NEXT:SOUND7,60 ; PLAY FALLING TONES WHILE DRAWING MESSAGE ; 4830 PLAY"l3o6v11d+dc+c" ; LOOP THROUGH MESSAGE ; 4840 FORI=1 TO 12 ; DRAW ITS HERE IN WHITE ON BLACK ONE LETTER AT A TIME ; 4850 LOCATE8,14:PRINTLEFT$(" !",I);:FOR J=1 TO 20:NEXT ; 0000d768 f2 0xf2 ; 0000d769 12 0x12 ; 0000d76a a1 0xa1 ; 0000d76b 38 0x38 '8' ; 0000d76c 2c 0x2c ',' ; 0000d76d 31 0x31 '1' ; 0000d76e 34 0x34 '4' ; 0000d76f 3a 0x3a ':' ; 0000d770 95 0x95 ; 0000d771 ea 0xea ; 0000d772 28 0x28 '(' ; 0000d773 22 0x22 '"' ; 0000d774 eb 0xeb ; 0000d775 8a 0x8a ; 0000d776 8a 0x8a ; 0000d777 20 0x20 ' ' ; 0000d778 b4 0xb4 ; 0000d779 b2 0xb2 ; 0000d77a d8 0xd8 ; 0000d77b b1 0xb1 ; 0000d77c dd 0xdd ; 0000d77d e0 0xe0 ; 0000d77e de 0xde ; 0000d77f 21 0x21 '!' ; 0000d780 22 0x22 '"' ; 0000d781 2c 0x2c ',' ; 0000d782 49 0x49 'I' ; 0000d783 29 0x29 ')' ; 0000d784 3b 0x3b ';' ; 0000d785 3a 0x3a ':' ; 0000d786 81 0x81 ; 0000d787 20 0x20 ' ' ; 0000d788 4a 0x4a 'J' ; 0000d789 d2 0xd2 ; 0000d78a 31 0x31 '1' ; 0000d78b 20 0x20 ' ' ; 0000d78c c3 0xc3 ; 0000d78d 20 0x20 ' ' ; 0000d78e 32 0x32 '2' ; 0000d78f 30 0x30 '0' ; 0000d790 3a 0x3a ':' ; 0000d791 82 0x82 ; 0000d792 00 0x00 ; 4860 NEXT ; GREEN ON BLACK ; 4865 COLOR3 ; DRAW ITS HERE MESSAGE AGAIN THIS TIME IN DIFFERENT COLOR ; 4870 FORI=1 TO 12 ; 4880 LOCATE8,14:PRINTLEFT$(" !",I);:FOR J=1 TO 20:NEXT ; 0000d7b0 10 0x10 ; 0000d7b1 13 0x13 ; 0000d7b2 a1 0xa1 ; 0000d7b3 38 0x38 '8' ; 0000d7b4 2c 0x2c ',' ; 0000d7b5 31 0x31 '1' ; 0000d7b6 34 0x34 '4' ; 0000d7b7 3a 0x3a ':' ; 0000d7b8 95 0x95 ; 0000d7b9 ea 0xea ; 0000d7ba 28 0x28 '(' ; 0000d7bb 22 0x22 '"' ; 0000d7bc eb 0xeb ; 0000d7bd 8a 0x8a ; 0000d7be 8a 0x8a ; 0000d7bf 20 0x20 ' ' ; 0000d7c0 b4 0xb4 ; 0000d7c1 b2 0xb2 ; 0000d7c2 d8 0xd8 ; 0000d7c3 b1 0xb1 ; 0000d7c4 dd 0xdd ; 0000d7c5 e0 0xe0 ; 0000d7c6 de 0xde ; 0000d7c7 21 0x21 '!' ; 0000d7c8 22 0x22 '"' ; 0000d7c9 2c 0x2c ',' ; 0000d7ca 49 0x49 'I' ; 0000d7cb 29 0x29 ')' ; 0000d7cc 3b 0x3b ';' ; 0000d7cd 3a 0x3a ':' ; 0000d7ce 81 0x81 ; 0000d7cf 20 0x20 ' ' ; 0000d7d0 4a 0x4a 'J' ; 0000d7d1 d2 0xd2 ; 0000d7d2 31 0x31 '1' ; 0000d7d3 20 0x20 ' ' ; 0000d7d4 c3 0xc3 ; 0000d7d5 20 0x20 ' ' ; 0000d7d6 32 0x32 '2' ; 0000d7d7 30 0x30 '0' ; 0000d7d8 3a 0x3a ':' ; 0000d7d9 82 0x82 ; 0000d7da 00 0x00 ; FINISH DRAWING LOOP ; 4890 NEXT ; 4900 RETURN ; 4999 END ;********************************************************************* ;* JUMP 5000 PICK WHICH SCREEN TO RUN? ;* SCREENTABLE: ; Table of screen values used in BAS5010 ;* fdb 1,1,3,4,2,1,1,4,2,5,1,1,1,6,1,1,5,1,1,6,0 ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS5000: ; 5000 REM** BAS5005: ; FIXME 5005 POKE&HF5E5,&HE3:PM=1:CR=4:SS=0 clr NEXTSCREEN ; FIXME F5E5 LOADS AS D4 - CHANGED TO E3 lda #1 ; FIXME constants can be made into config variables sta PM ; NUMBER ITEMS PER CATEGORY TO 1 lda #4 ; FIXME constants can be made into config variables sta CR ; 4 CREW REMAINING clr SS ; SHOW SCREEN 0 BAS5006: ; FIXME 5006 GOSUB 6700:EE=0 ; FIXME SETUP F53B TO JR 0xF569 clr EE ; FIXME EE = 0 WHAT IS EE? BAS5010: ; 5010 EXEC&HF5B8 ; ############################################################################ ASMF5B8: ; LDX 0xF5E5 ;F5B8 2A E5 F5 LD HL,(0xF5E5) ; LEAX 1,X ;F5BB 23 INC HL ; TFR L,A ;F5BC 7D LD A,L ; CMPA #$ E ;F5BD FE E4 CP 0xE4 ; LBNE 0xF5C3 ;F5BF 20 02 JR NZ,0xF5C3 ; TFR 0xD0,L ;F5C1 2E D0 LD L,0xD0 ; LDA ,X ;F5C3 7E LD A,(HL) ; STA 0xF5E7 ;F5C4 32 E7 F5 LD (0xF5E7),A ; STX 0xF5E5 ;F5C7 22 E5 F5 LD (0xF5E5),HL ; RTS ;F5CA C9 RET ; ### TABLE OF SCREEN/LEVEL VALUES? ; TFR 0x0301,U ;F5D0 01 01 03 LD BC,0x0301 ; INCB ;F5D3 04 INC B ; STA ,U ;F5D4 02 LD (BC),A ; TFR 0x0401,U ;F5D5 01 01 04 LD BC,0x0401 ; STA ,U ;F5D8 02 LD (BC),A ; DECB ;F5D9 05 DEC B ; TFR 0x0101,U ;F5DA 01 01 01 LD BC,0x0101 ; TFR 0x01,B ;F5DD 06 01 LD B,0x01 ; TFR 0x0105,U ;F5DF 01 05 01 LD BC,0x0105 ; TFR 0x0006,U ;F5E2 01 06 00 LD BC,0x0006 ; BCS > ;F5E5 - ; LBSR 0x01F5 ; ! *** Jump here ;**** D4 F5 01 CALL NC,0x01F5 ldb NEXTSCREEN ; load the value of the offset into the table incb ; move the offset one more cmpb #20 ; did we hit 00 at the end of the table? bne EXIT5010 ; not at the end of the table, use the B we got clrb ; yep, hit end of table, so reset offset to 0 back at start of table EXIT5010: stb NEXTSCREEN ; save our offset to use in B ldx #SCREENTABLE ; load address of table of screens to show in order abx ; now get that table value address read lda ,X ; load table value into accumulator BAS5020: ; 5020 ON PEEK(&HF5E7) GOSUB 100,2000,4000,6000,6500,8800,6000,8800 ; MOVE THROUGH TABLE OF SCREENS AS GAME PROGRESSES? ; F5E7 LOADS AS 01 TO GO TO MAIN GAME LOOP FIRST ; SCREEN 1 - 100 MAIN ; SCREEN 2 - 2000 TIME TRIAL ; SCREEN 3 - 4000 DEMO1 ; SCREEN 4 - 6000 TIME TRIAL ; SCREEN 5 - 6500 GRAPHIC MULTICOLOR ALIEN SITTING STILL ; SCREEN 6 - 8800 GRAPHIC RED ALIEN BOUNCING BACK AND FORTH ; SCREEN 7 - 6000 GRAPHIC MULTICOLOR ALIEN SITTING STILL ; SCREEN 8 - 8800 GRAPHIC RED ALIEN BOUNCING BACK AND FORTH ; FIXME replace this mess with a jump table by offset ; SCREEN 7 AND 8 in GOSUB are never called by number from table cmpa #1 ; is next screen #1? bne CHKSCN2 ; no, go check next jsr BAS0100 ; yes, gosub line 100 - main game screen jmp BAS5025 ; go check EE when done CHKSCN2: cmpa #2 ; is next screen #2? bne CHKSCN3 ; no, go check next jsr BAS2000 ; gosub line 2000 - main time trial screen jmp BAS5025 ; go check EE when done CHKSCN3: cmpa #3 ; is next screen #3? bne CHKSCN4 ; no, go check next jsr BAS4000 ; yes, gosub line 4000 demo 1 jmp BAS5025 ; go check EE when done CHKSCN4: cmpa #4 ; is next screen #4? bne CHKSCN5 ; no, go check next jsr BAS6000 ; yes, gosub line 6000 - time trial intro jmp BAS5025 ; go check EE when done CHKSCN5: cmpa #5 ; is next screen #5? bne CHKSCN6 ; no, go check next jsr BAS6500 ; yes, gosub line 6500 - graphic alien sitting still jmp BAS5025 ; go check EE when done CHKSCN6: cmpa #6 ; is next screen #6? bne CHKSCN7 ; no, go check next jsr BAS8800 ; yes, gosub line 8800 - graphic alien bouncing around jmp BAS5025 ; go check EE when done ; FIXME we should never fall through here CHKSCN7: bra CHKSCN7 ; ERROR - HALT CHKSCN8: bra CHKSCN8 ; ERROR - HALT BAS5025: ; 5025 IF EE=1 THEN GOTO 5000 lda EE ; load EE cmpa #1 ; compare EE to 1 bne BAS5030 ; not equal, go to next line 5030 jmp BAS5000 ; was equal, go to line 5000 BAS5030: ; 5030 GOTO 5010 jmp BAS5010 ;********************************************************************* ;* SUBROUTINE 6000 TIME TRIAL SCREEN ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS6000: ; 6000 CLS:FOR I=0 TO 15:PRINT" "; ; 6001 NEXT ; 6005 LOCATE5,7:PRINT"@ @ @ @ @ @ @ @ @ @" ; 6010 FOR I=1 TO 20 ; 6020 LOCATE5,7:PRINTLEFT$("T I M E T R I A L @",I);:FORJ=1TO50:NEXT ; 6030 NEXT ; 6040 A$="V10L4T120" ; 6050 PLAYA$,A$:A$="O6C16C+16D16D+16" ; 6060 PLAY"O4CC+DD+EF",A$+A$+A$+A$+A$+A$ ; 6070 PLAY"F+GG+AA+B",A$+A$+A$+A$+A$+A$ ; 6075 PLAY"O5CCCC",A$+A$+"CC" ; 6076 FOR I=1 TO 2500:NEXT ; 6080 RETURN ;********************************************************************* ;* SUBROUTINE 6400 PLAY RANDOM NOTES ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 6400 PLAY"s9m5000" ; 6410 A$=MID$("CDEFGAB",RND(1)*7+1,1):PLAYA$+"16":RETURN ;********************************************************************* ;* SUBROUTINE 6500 DRAW GRAPHIC ALIEN SITTING STILL ON SCREEN PLAY NOTES ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS6500: ; 6500 CLS ; BLOCK MOVE F300-F3AF TO C287-C336 ; 6510 POKE&HF4F1,&HC2:POKE&HF4F0,135:EXEC&HF4E0 ; ;############################################################################ ; TFR 0x00B0,U ;F4E0 01 B0 00 LD BC,0x00B0 ; TFR 0xF300,X ;F4E3 21 00 F3 LD HL,0xF300 ; LDY 0xF4F0 ;F4E6 ED 5B F0 LD DE,(0xF4F0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4EA ED B0 LDIR ; RTS ;F4EC C9 RET ; ;############################################################################ ; ADDA ,B ;F4ED 80 ADD A,B ; ADDA ,B ;F4EE 80 ADD A,B ; ADDA ,B ;F4EF 80 ADD A,B ; ASLA ;F4F0 87 ADD A,A ; LBNE 0x8080 ;F4F1 C2 80 80 JP NZ,0x8080 ; 6520 FORI=1 TO 5 ; MODIFY CODE AT F5A8 AND EXECUTE ; FILL SCREEN OR BUFFER WITH &H62 ; 6530 POKE&HF5A8,&H62:EXEC&HF5A4 ; ;############################################################################ ; TFR 0xC000,X ;F5A4 21 00 C0 LD HL,0xC000 ; TFR 0x60,B ;F5A7 06 60 LD B,0x60 ; STB ,X ;F5A9 70 LD (HL),B ; LEAX 1,X ;F5AA 23 INC HL ; TFR H,A ;F5AB 7C LD A,H ; CMPA #$ C ;F5AC FE C2 CP 0xC2 ; BEQ to RTS address ;F5AE C8 RET Z ; LBRA 0xF5A9 ;F5AF 18 F8 JR 0xF5A9 ; PICK RANDOM COLOR? ; 6540 POKE&HF594,INT(RND(1)*4)*&H40:EXEC&HF590:GOSUB6400 ; ;############################################################################ ; TFR 0xC200,X ;F590 21 00 C2 LD HL,0xC200 ; TFR 0x80,B ;F593 06 80 LD B,0x80 ; TFR 0x3F,C ;F595 0E 3F LD C,0x3F ; LDA ,X ;F597 7E LD A,(HL) ; ANDA C ;F598 A1 AND C ; ORA Register - need tweaking B ;F599 B0 OR B ; STA ,X ;F59A 77 LD (HL),A ; LEAX 1,X ;F59B 23 INC HL ; TFR H,A ;F59C 7C LD A,H ; CMPA #$ C ;F59D FE C4 CP 0xC4 ; BEQ to RTS address ;F59F C8 RET Z ; LBRA 0xF597 ;F5A0 18 F5 JR 0xF597 ; 6560 POKE&HF5A8,&H60:EXEC&HF5A4 ; ;############################################################################ ; TFR 0xC000,X ;F5A4 21 00 C0 LD HL,0xC000 ; TFR 0x60,B ;F5A7 06 60 LD B,0x60 ; STB ,X ;F5A9 70 LD (HL),B ; LEAX 1,X ;F5AA 23 INC HL ; TFR H,A ;F5AB 7C LD A,H ; CMPA #$ C ;F5AC FE C2 CP 0xC2 ; BEQ to RTS address ;F5AE C8 RET Z ; LBRA 0xF5A9 ;F5AF 18 F8 JR 0xF5A9 ; 6570 POKE&HF594,INT(RND(1)*4)*&H40:EXEC&HF590:GOSUB6400 ; ;############################################################################ ; TFR 0xC200,X ;F590 21 00 C2 LD HL,0xC200 ; TFR 0x80,B ;F593 06 80 LD B,0x80 ; TFR 0x3F,C ;F595 0E 3F LD C,0x3F ; LDA ,X ;F597 7E LD A,(HL) ; ANDA C ;F598 A1 AND C ; ORA Register - need tweaking B ;F599 B0 OR B ; STA ,X ;F59A 77 LD (HL),A ; LEAX 1,X ;F59B 23 INC HL ; TFR H,A ;F59C 7C LD A,H ; CMPA #$ C ;F59D FE C4 CP 0xC4 ; BEQ to RTS address ;F59F C8 RET Z ; LBRA 0xF597 ;F5A0 18 F5 JR 0xF597 ; FINISH LOOP OF 5 ; 6590 NEXT ; PLAY MELODY AND DELAY ; 6595 PLAY"L12CC+CDCD+CECFCECD+CDCCCCL4":FOR I=1 TO 600:NEXT ; MODIFY CODE AT F500-F582 - MAKE ALIEN INVISIBLE? ; ITEMS NEEDED = 1 ; 6600 POKE&HF53B,&H3A:POKE&HF53C,&H02:PM=1 ; 6610 RETURN ;********************************************************************* ;* SUBROUTINE 6700 - PATCH SCREEN ORDER? ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; SET F53B TO JR 0xF569 ; 6700 POKE&HF53B,&H18:POKE&HF53C,&H2C ; 6710 RETURN ;********************************************************************* ;* SOUND ALIEN CAUGHT YOU SONG ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* SOUND: ; 7000 REM**** sound ; 7100 REM ; 0000db63 bc 0xbc ; 0000db64 1b 0x1b ; 0000db65 8e 0x8e ; 0000db66 eb 0xeb ; 0000db67 94 0x94 ; 0000db68 8a 0x8a ; 0000db69 8a 0x8a ; 0000db6a 00 0x00 ; 7110 A$="L6O3v8a.v9a.v10a.v11a." ; 7120 B$="L6O3v8e.v9f.v10g.v11f. ; 7130 C$="L12O4v8ccev9ddfv10eegv11ffd" ; 7135 POKE&HFB8F,0:POKEFB90,0:H=0:POKE&HFB90,1:POKE&HFB8F,1 ; 7140 PLAYA$,B$,C$ ; 7145 FOR I=1 TO 600:IF INKEY$="h" THEN H=1 ; 7146 NEXT ; 7150 GOTO 1390 ;********************************************************************* ;* NEXT LEVEL MUSIC? ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 7200 REM ***** !!!!!!! ; 0000dc3c 20 0x20 ' ' ; 0000dc3d 1c 0x1c ; 0000dc3e 8e 0x8e ; 0000dc3f 20 0x20 ' ' ; 0000dc40 2a 0x2a '*' ; 0000dc41 2a 0x2a '*' ; 0000dc42 2a 0x2a '*' ; 0000dc43 2a 0x2a '*' ; 0000dc44 2a 0x2a '*' ; 0000dc45 20 0x20 ' ' ; 0000dc46 98 0x98 ; 0000dc47 f8 0xf8 ; 0000dc48 91 0x91 ; 0000dc49 21 0x21 '!' ; 0000dc4a 21 0x21 '!' ; 0000dc4b 21 0x21 '!' ; 0000dc4c 21 0x21 '!' ; 0000dc4d 21 0x21 '!' ; 0000dc4e 21 0x21 '!' ; 0000dc4f 21 0x21 '!' ; 0000dc50 00 0x00 ; 7205 SOUND7,56 ; 7210 A$="L16v9gggeO5cO4bagbO5cdO4fffff" ; 7220 B$="L16fffgbagfddd+d+eeee" ; 7230 C$="L16fffO5dcO4babO5cO4bO5dccccc" ; 7240 E$="v9L2efge":G$="L2gfgc" ; 7250 F$="v9L2O4ccO3fg":H$="L2O4ccO3bg" ; 7260 PLAYA$+B$,E$,F$ ; 7270 PLAYA$+C$,G$,H$ ; DELAY ; 7275 FOR I=1 TO 500:NEXT ; RESET COLOR AND SOUND AND RETURN ; 7280 GOTO 1390 ;********************************************************************* ;* SUBROUTINE 7300 SOUND: MADE IT INTO SHUTTLE WITH SUPPLIES ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 7300 SOUND7,60 ; 7310 A$="L16v11O5cegO6c":B$="L16v11O4gO5ceg" ; 7320 PLAYA$,B$:PLAYA$,B$ ; 7325 FOR I=1 TO 300:NEXT ; JUMP BACK TO SOUND CHIP RESET WHICH RETURNS TO PREVIOUS FUNCTION ; 7330 GOTO 1390 ;********************************************************************* ;* START SUBROUTINE 8100 ;* SETUP ALIEN STARTING POSITIONS F800, F801 ;* SETUP PLAYER STARTING POSITIONS F802, F803 ;* SETUP ALIEN INITIAL MOVE DIRECTION F804, F805 ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 8000 REM **** start BAS8100: ; 8100 POKE&HF800,0:POKE&HF801,0:POKE&HF802,22:POKE&HF803,9:POKE&HF804,1 clr ALIENX ; Clear Alien X position at NEC $F800 clr ALIENY ; Clear Alien Y position at NEC $F801 lda #22 ; Player start X position at NEC $F802 = 22 sta PLAYERX ; Set it up lda #9 ; Player start Y postion at NEC $F803 = 9 sta PLAYERY ; Set it up lda #1 ; Alien start direction X at NEC $F804 = move right sta ALIENDX ; Set it up ; 8110 POKE&HF805,0 clr ALIENDY ; Alien start direction Y at NEC $F805 = do not move up or down rts ; 8120 RETURN ;********************************************************************* ;* SUBROUTINE 8130 EMPTY OUT ITEMS CARRIED F806 to F80A ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS8130: ; 8130 POKE&HF806,0:POKE&HF807,0:POKE&HF808,0:POKE&HF809,0:POKE&HF80A,0 clr PH ; NEC $F806 - TOTAL ITEMS HELD clr PH0 ; NEC $F807-$F80A - COUNT OF EACH ITEM TYPE HELD clr PH1 ; NEC $F807-$F80A - COUNT OF EACH ITEM TYPE HELD clr PH2 ; NEC $F807-$F80A - COUNT OF EACH ITEM TYPE HELD clr PH3 ; NEC $F807-$F80A - COUNT OF EACH ITEM TYPE HELD rts ; 8140 RETURN ;********************************************************************* ;* JUMP 8600 DRAWS RED GRAPHIC ALIEN JUMPING BACK AND FORTH ON SCREEN ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 8600 FORDI=1TO2:POKE&HF4F1,&HC2 ; 8610 FOR I=128 TO 146 STEP 6 ; 8620 POKE &HF4F0,I ; 8630 CLS:EXEC&HF4E0:SOUND13,9 ; ;############################################################################ ; TFR 0x00B0,U ;F4E0 01 B0 00 LD BC,0x00B0 ; TFR 0xF300,X ;F4E3 21 00 F3 LD HL,0xF300 ; LDY 0xF4F0 ;F4E6 ED 5B F0 LD DE,(0xF4F0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4EA ED B0 LDIR ; RTS ;F4EC C9 RET ; ;############################################################################ ; ADDA ,B ;F4ED 80 ADD A,B ; ADDA ,B ;F4EE 80 ADD A,B ; ADDA ,B ;F4EF 80 ADD A,B ; ASLA ;F4F0 87 ADD A,A ; LBNE 0x8080 ;F4F1 C2 80 80 JP NZ,0x8080 ; 8635 FOR J=1 TO 30:NEXT ; 8640 POKE &HF4F0,I-62 ; 8650 CLS:EXEC&HF4E0 ; ;############################################################################ ; TFR 0x00B0,U ;F4E0 01 B0 00 LD BC,0x00B0 ; TFR 0xF300,X ;F4E3 21 00 F3 LD HL,0xF300 ; LDY 0xF4F0 ;F4E6 ED 5B F0 LD DE,(0xF4F0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4EA ED B0 LDIR ; RTS ;F4EC C9 RET ; ;############################################################################ ; ADDA ,B ;F4ED 80 ADD A,B ; ADDA ,B ;F4EE 80 ADD A,B ; ADDA ,B ;F4EF 80 ADD A,B ; ASLA ;F4F0 87 ADD A,A ; LBNE 0x8080 ;F4F1 C2 80 80 JP NZ,0x8080 ; 8655 FOR J=1 TO 30:NEXT ; 8660 POKE &HF4F0,I-60 ; 8670 CLS:EXEC&HF4E0 ; ;############################################################################ ; TFR 0x00B0,U ;F4E0 01 B0 00 LD BC,0x00B0 ; TFR 0xF300,X ;F4E3 21 00 F3 LD HL,0xF300 ; LDY 0xF4F0 ;F4E6 ED 5B F0 LD DE,(0xF4F0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4EA ED B0 LDIR ; RTS ;F4EC C9 RET ; ;############################################################################ ; ADDA ,B ;F4ED 80 ADD A,B ; ADDA ,B ;F4EE 80 ADD A,B ; ADDA ,B ;F4EF 80 ADD A,B ; ASLA ;F4F0 87 ADD A,A ; LBNE 0x8080 ;F4F1 C2 80 80 JP NZ,0x8080 ; 8675 FOR J=1 TO 30:NEXT ; 8680 NEXT ; 8690 POKE&HF4D0,154:CLS:SOUND13,9 ; 8695 EXEC&HF4C0:FORJ=1TO30:NEXT ; ;############################################################################ ; TFR 0x00B0,U ;F4C0 01 B0 00 LD BC,0x00B0 ; TFR 0xF400,X ;F4C3 21 00 F4 LD HL,0xF400 ; LDY 0xF4D0 ;F4C6 ED 5B D0 LD DE,(0xF4D0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4CA ED B0 LDIR ; RTS ;F4CC C9 RET ; ;############################################################################ ; ADDA ,B ;F4CD 80 ADD A,B ; ADDA ,B ;F4CE 80 ADD A,B ; ADDA ,B ;F4CF 80 ADD A,B ; ADDA ,B ;F4D0 80 ADD A,B ; LBNE 0x8080 ;F4D1 C2 80 80 JP NZ,0x8080 ; 8700 POKE&HF4D1,&HC2 ; 8710 FOR I=146 TO 128 STEP-6 ; 8720 POKE &HF4D0,I-60 ; 8730 CLS:EXEC&HF4C0 ; ;############################################################################ ; TFR 0x00B0,U ;F4C0 01 B0 00 LD BC,0x00B0 ; TFR 0xF400,X ;F4C3 21 00 F4 LD HL,0xF400 ; LDY 0xF4D0 ;F4C6 ED 5B D0 LD DE,(0xF4D0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4CA ED B0 LDIR ; RTS ;F4CC C9 RET ; ;############################################################################ ; ADDA ,B ;F4CD 80 ADD A,B ; ADDA ,B ;F4CE 80 ADD A,B ; ADDA ,B ;F4CF 80 ADD A,B ; ADDA ,B ;F4D0 80 ADD A,B ; LBNE 0x8080 ;F4D1 C2 80 80 JP NZ,0x8080 ; 8735 FOR J=1 TO 30:NEXT ; 8740 POKE &HF4D0,I-62 ; 8750 CLS:EXEC&HF4C0 ; ;############################################################################ ; TFR 0x00B0,U ;F4C0 01 B0 00 LD BC,0x00B0 ; TFR 0xF400,X ;F4C3 21 00 F4 LD HL,0xF400 ; LDY 0xF4D0 ;F4C6 ED 5B D0 LD DE,(0xF4D0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4CA ED B0 LDIR ; RTS ;F4CC C9 RET ; ;############################################################################ ; ADDA ,B ;F4CD 80 ADD A,B ; ADDA ,B ;F4CE 80 ADD A,B ; ADDA ,B ;F4CF 80 ADD A,B ; ADDA ,B ;F4D0 80 ADD A,B ; LBNE 0x8080 ;F4D1 C2 80 80 JP NZ,0x8080 ; 8755 FOR J=1 TO 30:NEXT ; 8760 POKE &HF4D0,I:SOUND13,9 ; 8770 CLS:EXEC&HF4C0 ; ;############################################################################ ; TFR 0x00B0,U ;F4C0 01 B0 00 LD BC,0x00B0 ; TFR 0xF400,X ;F4C3 21 00 F4 LD HL,0xF400 ; LDY 0xF4D0 ;F4C6 ED 5B D0 LD DE,(0xF4D0) ; PSHS D *** Check U is an even # ; ! LDD ,X++ ; STD ,Y++ ; LEAU -2,U ; CMPU #$0000 ; BNE < ; PULS D ;F4CA ED B0 LDIR ; RTS ;F4CC C9 RET ; ;############################################################################ ; ADDA ,B ;F4CD 80 ADD A,B ; ADDA ,B ;F4CE 80 ADD A,B ; ADDA ,B ;F4CF 80 ADD A,B ; ADDA ,B ;F4D0 80 ADD A,B ; LBNE 0x8080 ;F4D1 C2 80 80 JP NZ,0x8080 ; 8775 FOR J=1 TO 30:NEXT ; 8780 NEXT:NEXT ; 8799 RETURN ;********************************************************************* ;* SUBROUTINE 8800 SOUND AND GO TO 8600 ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* BAS8800: ; 8800 SOUND7,&H37:SOUND8,16 ; 8810 SOUND 12,20 ; 8820 GOTO 8600 ;********************************************************************* ;* JUMP 9000 PLAY AGAIN BANNER / PROMPT ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; 9000 FOR I=1 TO 1000:NEXT:COLOR3 ; 9010 A$=" ? 'y' 'n' " ; 0000e04d 32 0x32 '2' ; 0000e04e 23 0x23 '#' ; 0000e04f 41 0x41 'A' ; 0000e050 24 0x24 '$' ; 0000e051 d2 0xd2 ; 0000e052 22 0x22 '"' ; 0000e053 f3 0xf3 ; 0000e054 93 0x93 ; 0000e055 92 0x92 ; 0000e056 e1 0xe1 ; 0000e057 e4 0xe4 ; 0000e058 de 0xde ; 0000e059 20 0x20 ' ' ; 0000e05a 91 0x91 ; 0000e05b 9f 0x9f ; 0000e05c eb 0xeb ; 0000e05d de 0xde ; 0000e05e ef 0xef ; 0000e05f 9d 0x9d ; 0000e060 96 0x96 ; 0000e061 3f 0x3f '?' ; 0000e062 20 0x20 ' ' ; 0000e063 91 0x91 ; 0000e064 9f 0x9f ; 0000e065 ec 0xec ; 0000e066 de 0xde ; 0000e067 e5 0xe5 ; 0000e068 f7 0xf7 ; 0000e069 20 0x20 ' ' ; 0000e06a 27 0x27 ''' ; 0000e06b 79 0x79 'y' ; 0000e06c 27 0x27 ''' ; 0000e06d 20 0x20 ' ' ; 0000e06e f4 0xf4 ; 0000e06f f2 0xf2 ; 0000e070 f9 0xf9 ; 0000e071 e5 0xe5 ; 0000e072 f7 0xf7 ; 0000e073 20 0x20 ' ' ; 0000e074 27 0x27 ''' ; 0000e075 6e 0x6e 'n' ; 0000e076 27 0x27 ''' ; 0000e077 20 0x20 ' ' ; 0000e078 86 0x86 ; 0000e079 20 0x20 ' ' ; 0000e07a 95 0x95 ; 0000e07b 9c 0x9c ; 0000e07c e3 0xe3 ; 0000e07d 98 0x98 ; 0000e07e e0 0xe0 ; 0000e07f de 0xde ; 0000e080 9b 0x9b ; 0000e081 92 0x92 ; 0000e082 20 0x20 ' ' ; 0000e083 20 0x20 ' ' ; 0000e084 20 0x20 ' ' ; 0000e085 22 0x22 '"' ; 0000e086 00 0x00 ; 9020 FOR I=1TO50 ; 9030 LOCATE3,8:PRINTMID$(A$+A$,I,18);:FOR J=1 TO 10:NEXT ; 9040 K$=INKEY$:IF K$<>"" THEN GOTO 9070 ; 9050 NEXT ; 9060 GOTO 9020 ; THIS RUN STATEMENT IS WHY LINE 10 GETS OVERWRITTEN ; 9070 IF K$="y"ORK$="Y"ORK$="" THEN I=50:NEXT:EE=1:RUN ; 0000e0e8 6e 0x6e 'n' ; 0000e0e9 23 0x23 '#' ; 0000e0ea 8a 0x8a ; 0000e0eb 20 0x20 ' ' ; 0000e0ec 4b 0x4b 'K' ; 0000e0ed 24 0x24 '$' ; 0000e0ee d2 0xd2 ; 0000e0ef 22 0x22 '"' ; 0000e0f0 79 0x79 'y' ; 0000e0f1 22 0x22 '"' ; 0000e0f2 d0 0xd0 ; 0000e0f3 4b 0x4b 'K' ; 0000e0f4 24 0x24 '$' ; 0000e0f5 d2 0xd2 ; 0000e0f6 22 0x22 '"' ; 0000e0f7 59 0x59 'Y' ; 0000e0f8 22 0x22 '"' ; 0000e0f9 d0 0xd0 ; 0000e0fa 4b 0x4b 'K' ; 0000e0fb 24 0x24 '$' ; 0000e0fc d2 0xd2 ; 0000e0fd 22 0x22 '"' ; 0000e0fe fd 0xfd ; 0000e0ff 22 0x22 '"' ; 0000e100 20 0x20 ' ' ; 0000e101 c7 0xc7 ; 0000e102 20 0x20 ' ' ; 0000e103 49 0x49 'I' ; 0000e104 d2 0xd2 ; 0000e105 35 0x35 '5' ; 0000e106 30 0x30 '0' ; 0000e107 3a 0x3a ':' ; 0000e108 82 0x82 ; 0000e109 3a 0x3a ':' ; 0000e10a 45 0x45 'E' ; 0000e10b 45 0x45 'E' ; 0000e10c d2 0xd2 ; 0000e10d 31 0x31 '1' ; 0000e10e 3a 0x3a ':' ; 0000e10f 89 0x89 ; 0000e110 00 0x00 ; 9080 IF K$="n"ORK$="N"ORK$="" THEN I=50:NEXT:GOTO 9200 ; 0000e113 78 0x78 'x' ; 0000e114 23 0x23 '#' ; 0000e115 8a 0x8a ; 0000e116 20 0x20 ' ' ; 0000e117 4b 0x4b 'K' ; 0000e118 24 0x24 '$' ; 0000e119 d2 0xd2 ; 0000e11a 22 0x22 '"' ; 0000e11b 6e 0x6e 'n' ; 0000e11c 22 0x22 '"' ; 0000e11d d0 0xd0 ; 0000e11e 4b 0x4b 'K' ; 0000e11f 24 0x24 '$' ; 0000e120 d2 0xd2 ; 0000e121 22 0x22 '"' ; 0000e122 4e 0x4e 'N' ; 0000e123 22 0x22 '"' ; 0000e124 d0 0xd0 ; 0000e125 4b 0x4b 'K' ; 0000e126 24 0x24 '$' ; 0000e127 d2 0xd2 ; 0000e128 22 0x22 '"' ; 0000e129 f0 0xf0 ; 0000e12a 22 0x22 '"' ; 0000e12b 20 0x20 ' ' ; 0000e12c c7 0xc7 ; 0000e12d 20 0x20 ' ' ; 0000e12e 49 0x49 'I' ; 0000e12f d2 0xd2 ; 0000e130 35 0x35 '5' ; 0000e131 30 0x30 '0' ; 0000e132 3a 0x3a ':' ; 0000e133 82 0x82 ; 0000e134 3a 0x3a ':' ; 0000e135 88 0x88 ; 0000e136 20 0x20 ' ' ; 0000e137 39 0x39 '9' ; 0000e138 32 0x32 '2' ; 0000e139 30 0x30 '0' ; 0000e13a 30 0x30 '0' ; 0000e13b 00 0x00 ; 9090 NEXT ;********************************************************************* ;* JUMP 9020 GOODBYE SCREEN ;* RoutineName - expanded name or phrase describing purpose ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; GOODBYE SCREEN ; 9200 CLS:LOCATE3,8:COLOR1:PRINT"" ; 0000e144 f0 0xf0 ; 0000e145 23 0x23 '#' ; 0000e146 a0 0xa0 ; 0000e147 3a 0x3a ':' ; 0000e148 a1 0xa1 ; 0000e149 33 0x33 '3' ; 0000e14a 2c 0x2c ',' ; 0000e14b 38 0x38 '8' ; 0000e14c 3a 0x3a ':' ; 0000e14d 9a 0x9a ; 0000e14e 31 0x31 '1' ; 0000e14f 3a 0x3a ':' ; 0000e150 95 0x95 ; 0000e151 22 0x22 '"' ; 0000e152 91 0x91 ; 0000e153 f8 0xf8 ; 0000e154 96 0x96 ; 0000e155 de 0xde ; 0000e156 e4 0xe4 ; 0000e157 93 0x93 ; 0000e158 9a 0x9a ; 0000e159 de 0xde ; 0000e15a 9b 0x9b ; 0000e15b de 0xde ; 0000e15c 92 0x92 ; 0000e15d ef 0xef ; 0000e15e 9c 0x9c ; 0000e15f e0 0xe0 ; 0000e160 22 0x22 '"' ; 0000e161 00 0x00 ;********************************************************************* ; ADDON - ASCII PUBLISHING LOGO FROM AX2 DEMO ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; Draw ASCII logo ; Scroll Publishing onto screen ;********************************************************************* ;* ADDON - NOSTROMO THUMBNAIL FROM AX2 DEMO ;* Brief description ;* ;* I/O: what is expected and produced ;* ;* Calling Convention: how is this called? ;* ;* Returns: ;* ;* Stack Usage: (when needed) structure of stacked data ;* ;* Calls: Info about routines called ;* ;* Changes: registers destroyed. ;********************************************************************* ; Draw Title NOSTROMO ; Draw Outer Green Box ; Draw inner white lines ; Draw left cargo ; Draw right cargo bay ; Draw alien and player ; Write text ; " NOSTROMO : An alien has invaded" ; " your spacecraft! Load the " ; "shuttle with necessities and " ; "jettison. You have no choice. " ;********************************************************************* ;* CREDITS ;* Credit where credit is due ;* Entry Values ;* ;* Exit Values ;* None ;* Control Register Modifications ;* None ;* Subroutines Called ;* None ;********************************************************************* CREDITS: fcc '6809: Terry Ritter, Joel Boney' fcc 'CoCo: Charles Tandy, John Roach, Mark Siegel' fcc 'Assembly: Lance Leventhal, Dennis Bathory-Kitsz, William Barden, Rodnay Zaks' fcc 'BASIC: John G. Kemeny, Thomas E. Kurtz' fcc 'Color BASIC: Bill Gates, Mark Chamberlin, the authors and illustrators of _Getting Started with Color BASIC_' fcc 'DAC Sound: Hal Chamberlin, Clell Dildy, Lester Hands, Simon "Madman" Jonassen' fcc 'Orchestra90/CC: Jon Bokelman, Jim "go4retro" Brain' fcc 'Rainbow Magazine: Lonnie Falk, CoCo Cat' fcc 'CoCoFEST!: the members and officers of the Glenside Color Computer Club, past present and future' fcc 'CoCoSDC: Darren Atkinson, Ed "Zippster" Snider, Richard "Boysontech" Lorbieski, Tim "timbo-tek" Lindner' fcc 'CoCoPSG: Ed "Zippster" Snider' fcc 'GMC: John "Tuxdriver" Linville, Mike "MiRo" Rowen' fcc 'MIDI Maestro: Jim "go4retro" Brain' fcc 'Joysticks: Phill Kraft, Hal Chamberlin' fcc 'Nostromo Design and Programming for CBM PET 2001: Akira Takiguchi' fcc 'Nostromo Design and Programming for NEC PC-6001: Masakuni "Mitsu" Mitsuhashi aka Hiromi Ohba' fcc 'Nostromo cover artwork: Masashi Iwasaki' fcc 'Nostromo publishing and distribtion: ASCII Publishing' fcc 'Youtube Community: Panteryasha, HighRetroGameLord' fcc 'MC-10 Port and Support: Jim Gerrie, James Diffendaffer' fcc 'Z80 Transcodiing and MIDI Converter: Glen Hewlett' fcc 'lwasm: William "Lostwizard" Astle' fcc 'cmoc: Pierre Sarrazin' fcc 'Mocha: Brad Grier' fcc 'asm6809 and Xroar: Ciaran "Sixxie" Anscomb' fcc 'MAME: Tim "timbo-tek" Lindner and the MAME Devs' fcc 'OVCC: Walter "Wally" Zambotti, Jim Rye' fcc 'Toolshed: Tormod Volden, Tim "timbo-tek" Lindner, James Jones, Mark Marlette, Boisy "OS9er" Pitre, Roy Justus' fcc 'Color Max Deluxe: Greg Miller and Erik Gavriluk' fcc 'Drivewire: Mark "Cloud9" Marlette, Boisy "OS9er" Pitre, Michael "Mikey" Furman' fcc 'Random and IRQs: Steve "6809ER" Bjork, Rick Adams' fcc 'Pitfall LFSR: David Crane, Thomas "JTZ" Jentzsch, Sam Trenholme' fcc 'CoCoVGA: Brendan Donahe' fcc 'Digital Joystick Adapters: Robert Lee Hawkins, John Linville, Neil Blanchard, Ed "Zippster" Snider' fcc 'The Community: MrDave6809, Seat Safety Switch, Tom C from Joisy, OGStevieStrow, Sir David Ladd, Lord Curtis Boyle,' fcc 'Mark Overholser, Sloopy Malibu, Nick Marotta Nick Marotta Nick Marotta, Jason "CoCoMan" Reighard,' fcc 'Ken "You Know Who You Are" Reighard, Paul Thayer, Paul Shoemaker, Paul Fiscarelli, Grant Leighty,' fcc 'Allen "os9Al" Huffman, Al Hartman, Ken "CRT" Waters, Sheldon Macdonald, George Jansen' fcc 'And thank YOU for playing and keeping the CoCo going and growing in the 21st century!' APOLOGIES: fcc 'Apologies to anyone I accidentally missed along the way!' DEDICATION: fcc 'For Carrie, Melanie, Robbie, Gizmo, Biscuit, and Butter' INSPIRATION: fcc 'Shout outs to Blue Planet Corporation, The Enigma TNG, Tentura, Carbon Based Lifeforms, and Talk Talk for the music to stay sane doing this!' ;********************************************************************* ;* HLINE ;* Draw Horizontal line of given character ;* Entry Values ;* TX = starting column ;* TY = row ;* INDEXIX = length of line ;* B = character to draw ;* Exit Values ;* None ;* Control Register Modifications ;* None ;* Subroutines Called ;* DRAWCH ;********************************************************************* HLINE: jsr DRAWCH ; draw the character inc TX ; skip one more to the right for next horizontal char lda TX ; get it back in FIXME WASTED CYCLES cmpa INDEXIX ; are we at the right hand border of our line? bne HLINE ; no, go back and keep typing rts ; yep, done, run, go, woo! ;********************************************************************* ;* VLINE ;* Draw vertical line of a given character ;* Entry Values ;* TX = column ;* TY = starting row ;* INDEXIY = length of line ;* B = character to draw ;* Exit Values ;* None ;* Control Register Modifications ;* None ;* Subroutines Called ;* DRAWCH ;********************************************************************* VLINE: jsr DRAWCH ; draw the character inc TY ; drop down one screen / tile line lda TY ; and get that current FIXME WASTED CYCLES cmpa INDEXIY ; did I reach the bottom of the vertical line to draw? bne VLINE ; nope, keep drawing above rts ; yep, run like hell ;********************************************************************* ;* PRINTAT ;* Put a string of a known length at X,Y ;* Entry Values ;* TX = column ;* TY = starting row ;* STRPTR = pointer to start of string ;* STRLEN = length of string ;* Exit Values ;* None ;* Control Register Modifications ;* None ;* Subroutines Called ;* DRAWCH ;********************************************************************* PRINTAT: ldx STRPTR ; put address of string into X for fun clra ; start counting at zero for string length PRINTLOOP: ldb ,X+ ; get the next string char in B, and step X by 1 jsr DRAWCH ; slam that puppy onto the framebuffer inc TX ; move the Tile X to the right 1 space inca ; move one more character into string cmpa STRLEN ; did we hit the end of the string length to draw? bne PRINTLOOP ; go back and print some more rts ; return to sender ;********************************************************************* ;* INCLUDES IN MOSTLY MEMORY MAP ORDER ;********************************************************************* INCLUDE "code-config-v00.asm" ; Detect/Select Config INCLUDE "code-rnd-v00.asm" ; Pseudo Random Numbers for Cargo Placement INCLUDE "code-pia0-v00.asm" ; $FF00 MC6821 Peripheral Interface Adapter 0 INCLUDE "code-keyscn-v01.asm" ; -- Key Scan INCLUDE "code-joy-v00.asm" ; -- Joystick INCLUDE "code-pia1-v00.asm" ; $FF20 Peripheral Interface Adapter 1 INCLUDE "code-onebit-v00.asm" ; -- 1-bit DAC INCLUDE "code-timer-v00.asm" ; -- VSYNC countdown clock ; Audio INCLUDE "code-gmc-v00.asm" ; $FF40-FF41 Games Master Cart INCLUDE "code-dcsg-v00.asm" ; -- TI SN76489AN Dynamic Complex Sound Generator (DCSG) INCLUDE "code-mmmpi-v00.asm" ; $FF50-FF54 MEGAmini Multi-Pak Interface with OPL, 16550s INCLUDE "code-opl3-v00.asm" ; -- Yamaha YMF-262 Operator-L 3 (OPL3) Synthesizer INCLUDE "code-cocopsg-v00.asm" ; $FF5A-FF5F CoCoPSG with RAM, ROM, SSG, Joysticks INCLUDE "code-ssg-v00.asm" ; -- Yamaha YM2149 Software-controlled Sound Generator (SSG) INCLUDE "code-symphony12-v00.asm" ; $FF60-FF63 INCLUDE "code-midi-v00.asm" ; $FF6E-FF6F INCLUDE "code-orch90-v00.asm" ; $FF7A-FF7B INCLUDE "code-ssc-v00.asm" ; $FF7D-FF7E Speech/Sound Cartridge (SSC) INCLUDE "code-psg-v00.asm" ; -- INCLUDE "code-mpi-v00.asm" ; $FF7F Tandy / Mini / MEGAmini Multi-Pak Interface Slot Select ; Video INCLUDE "code-vdgsg4-v00.asm" ; CoCo1/2/Dragon SG4 Semigraphics INCLUDE "code-vdgt1-v00.asm" ; CoCo 2B with MC6847T1 Lowercase VDG INCLUDE "code-vdgvga-v00.asm" ; CoCo1/2 with CoCoVGA INCLUDE "code-vdgrg6-v01.asm" ; CoCo1/2/Dragon RG6 Resolution Graphics (PMODE4) INCLUDE "code-acvc-v00.asm" ; $FF90-FFBF ACVC INCLUDE "code-sam-v00.asm" ; $FFC0-FFDF SAM ; Data align $200 ; Font on 512 byte bound for CoCoVGA INCLUDE "data-cgrom60-v04.asm" ; NEC Font reorg to CoCoASCII ;********************************************************************* ;* End of NOSTROMO.ASM ;********************************************************************* end CONFIG ===== DISCUSSION ===== Please ping me on the [[https://discord.cococtalk.live|Discord]] **#programming** channel if you have questions or comments about this. ===== RTS ===== Return to [[Nostromo]]