Guest User

River Raid source code

a guest
Feb 17th, 2018
1,172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; *** R I V E R   R A I D ***
  2. ; Copyright 1982 Activision
  3. ; Designer: Carol Shaw
  4.  
  5. ; Analyzed, labeled and commented
  6. ;  by Thomas Jentzsch (JTZ)
  7. ; Last Update: 13.08.2001 (v0.9)
  8.  
  9. ; Section generation:
  10. ; The river is divided into sections which are generated by random. The random
  11. ; number generator can generate 57337 different sections. Each section is
  12. ; divided into 16 blocks. The last block is the bridge. For each other block a
  13. ; random Id is generated, which defines the shape of the river. The river is
  14. ; randomly generated with or without islands.
  15. ; Each block is 32 lines high and is divided into two parts. Those parts are
  16. ; neccessary for the bridge only, because it is smaller than a whole block.
  17. ;
  18. ; All objects are also randomly generated. There is one object in each block.
  19. ; First the game randomly selects if a fuel tank, an enemy object (ship, plane
  20. ; or helicopter) or a house should be generated. Then a starting x-position is
  21. ; defined and finally the direction (left/right) of the object is set.
  22. ; The ships and helicopters start patroling also randomly.
  23. ;
  24. ; Kernel:
  25. ; The main display is 160 lines tall. Below is the state display (score, fuel,
  26. ; lives and copyright).
  27. ; The kernel displays five or six of the section blocks. When a block leaves
  28. ; the display, it is replaced on the fly by a new generated one.
  29. ; It's basically a two line kernel, which is repeated twelve times. After that,
  30. ; there is code for eight more lines, where the block is iterated and all new
  31. ; parameter are set. (12 * 2 + 8 = 32!)
  32. ; The parameters for each block are:
  33. ; - a pointer to the current playfield pattern
  34. ; - a flag for a bright or dark green playfield
  35. ; - two pointers for the current object, the data is displayed interlaced,
  36. ;   this gives in a single line resolution here
  37. ; - a color pointer for the object
  38. ; - x-positioning values for the object
  39. ; - some flags for the object (size, reflection...)
  40. ; All collisons are checked for each displayed block and only the hardware
  41. ; collision registers are used for that (no software calculations).
  42.  
  43. ; Misc:
  44. ; - There are no score variables, the score is stored and changed directly in
  45. ;   the display pointers!
  46. ; - The are no variables to store the x-positions of the objects, all
  47. ;   calculations are done directly with the position values.
  48. ;   (There aren't any BCD calculations in this code!)
  49. ; - All variables for the players are swapped, when the players change.
  50. ; - The game speeds aren't adjusted for PAL, the PAL game run's about 16% slower.
  51. ;   (This seems to be true for most PAL conversions.)
  52. ; - ...
  53.  
  54.     processor 6502
  55.     include vcs.h
  56.  
  57.  
  58. ;===============================================================================
  59. ; A S S E M B L E R - S W I T C H E S
  60. ;===============================================================================
  61.  
  62. FILL_OPT        = 1             ; fill optimized bytes with NOPs
  63. SCREENSAVER     = 1             ; compile with screensaver code
  64. TRAINER         = 0             ; enable training mode
  65. NTSC            = 1             ; compile for NTSC
  66.  
  67.  
  68. ;===============================================================================
  69. ; C O N S T A N T S
  70. ;===============================================================================
  71.  
  72. ; initial values for the random number generator:
  73. SEED_LO         = $14           ; change "to go, where no one has gone before" :)
  74. SEED_HI         = $A8
  75.  
  76. ; color constants:
  77. BLACK           = $00
  78. GREY            = $06
  79. ORANGE          = $2A
  80.   IF NTSC
  81. YELLOW          = $1C
  82. RED             = $48
  83. BLUE            = $84
  84. CYAN            = $B0
  85. GREEN           = $D2
  86.   ELSE
  87. YELLOW          = $2C
  88. RED             = $68
  89. BLUE            = $B4
  90. CYAN            = $70
  91. GREEN           = $52
  92.   ENDIF
  93. DARK_RED        = RED    - $6
  94. LIGHT_GREEN     = GREEN  + $8
  95. BROWN           = YELLOW - $C
  96. LIGHT_GREY      = GREY   + $6
  97. DARK_BLUE       = BLUE   - $4
  98.  
  99. ; main game constants:
  100. NUM_BLOCKS      = 6             ; max. number of block on screen
  101. SECTION_BLOCKS  = 16            ; number of blocks/stage
  102. BLOCK_PARTS     = 2             ; each block has two parts
  103. BLOCK_SIZE      = 32            ; number of lines/block
  104. NUM_LINES       = 160           ; number of lines in main kernel
  105. MAX_LEVEL       = 48            ; number of difficulty levels
  106.  
  107. DIGIT_H         = 8             ; height of the score digits
  108. JET_Y           = 19            ; fixed y-position for jet
  109. MIN_MISSILE     = JET_Y-6       ; starting position of player missile
  110. MAX_MISSILE     = NUM_LINES+1
  111. MISSILE_SPEED   = 6             ; y-speed of the jet missile
  112. ROAD_HEIGHT     = 13            ; number of lines for road
  113. INTRO_SCROLL    = 48            ; counter for scrolling into new game
  114.  
  115. SWITCH_PAGE_ID  = 9             ; first pattern id with data on different page
  116.  
  117. ; constants for shape-ids:
  118. ID_EXPLOSION0   = 0             ; used for explosion end
  119. ID_EXPLOSION1   = 1
  120. ID_EXPLOSION2   = 2
  121. ID_EXPLOSION3   = 3
  122. ID_PLANE        = 4
  123. ID_HELI0        = 5
  124. ID_HELI1        = 6
  125. ID_SHIP         = 7
  126. ID_BRIDGE       = 8
  127. ID_HOUSE        = 9
  128. ID_FUEL         = 10
  129.  
  130. ; flags for blockLst:
  131. PF1_PAGE_FLAG   = %00000001     ; pattern for PF1 in page $FC or $FD
  132. PF2_PAGE_FLAG   = %00000010     ; pattern for PF1 in page $FC or $FD
  133. PF_COLOR_FLAG   = %00000100     ; bright or dark green PF
  134. PATROL_FLAG     = %00010000     ; enemy is patroling (change directions)
  135. PF_COLLIDE_FLAG = %00100000     ; enemy collided with playfield
  136. ENEMY_MOVE_FLAG = %01000000     ; enemy is moving
  137. PF_ROAD_FLAG    = %10000000     ; display road and bridge
  138.  
  139. ; flags for State1Lst:
  140. DIRECTION_FLAG  = %00001000     ; move direction of object
  141. FINE_MASK       = %11110000     ; mask bits for HMxy
  142. NUSIZ_MASK      = %00000111     ; mask bits for NUSIx
  143.  
  144. ; flags for PF_State:
  145. ISLAND_FLAG     = %10000000     ; island displayed in block
  146. CHANGE_FLAG     = %01000000     ; begin or end of island (JTZ: this interpretation might be wrong)
  147.  
  148. ; joystick bits:
  149. MOVE_RIGHT      = %00001000
  150. MOVE_LEFT       = %00000100
  151. MOVE_DOWN       = %00000010
  152. MOVE_UP         = %00000001
  153.  
  154. ; values for ENAxy:
  155. DISABLE         = %00
  156. ENABLE          = %10           ; value for enabling a missile
  157.  
  158. ; values for NUSIZx:
  159. TWO_COPIES      = %001
  160. THREE_COPIES    = %011
  161. DOUBLE_SIZE     = %101
  162. QUAD_SIZE       = %111
  163.  
  164. ; mask for SWCHB:
  165. BW_MASK         = %1000         ; black and white bit
  166.  
  167.  
  168. ;===============================================================================
  169. ; Z P - V A R I A B L E S
  170. ;===============================================================================
  171.  
  172. gameVariation   = $80           ;               one or two player game
  173. gameDelay       = $81           ;               delay before gameVariation changes
  174. frameCnt        = $82           ;               simple frame counter
  175. random          = $83           ;               8 bit random number (used for: start of ship and helicopter, sound)
  176. joystick        = $84           ;               saved joystick value (?000rldu)
  177.   IF SCREENSAVER
  178. SS_XOR          = $85           ;               change colors in screensaver mode (0/$01..$ff)
  179. SS_Mask         = $86           ;               darker colors in screensaver mode ($ff/$f7)
  180.   ENDIF
  181. dXSpeed         = $87           ;               x-acceleration
  182. prevPF1PatId    = $88           ;               playfield pattern Id of the previous block
  183. PF_State        = $89           ;               io000000
  184. sectionEnd      = $8A           ;               0 = end of section
  185. blockOffset     = $8B           ;               offset into first displayed block
  186. posYLo          = $8C           ;               low value of blockOffset
  187. bridgeExplode   = $8D           ;               counter for bridge explosion
  188.  
  189. ; the next 36 bytes are used to save all variables for six blocks:
  190. ;---------------------------------------
  191. blockLst        = $8E           ; ..$93         flags for block definition
  192. blockLstEnd     = blockLst+NUM_BLOCKS-1
  193. ;---------------------------------------
  194. XPos1Lst        = $94           ; ..$99         coarse value for x-positioning of object
  195. XPos1LstEnd     = XPos1Lst+NUM_BLOCKS-1
  196. ;---------------------------------------
  197. State1Lst       = $9A           ; ..$9F         bit 0..2 = NUSIZ1, bit 3 = REFP1, 4..7 = fine move
  198. State1LstEnd    = State1Lst+NUM_BLOCKS-1
  199. ;---------------------------------------
  200. Shape1IdLst     = $A0           ;.. $A5         ids for object
  201. Shape1IdLstEnd  = Shape1IdLst+NUM_BLOCKS-1
  202. ;---------------------------------------
  203. PF1Lst          = $A6           ; ..$AB         low pointer for PF1 data
  204. PF1LstEnd       = PF1Lst+NUM_BLOCKS-1
  205. ;---------------------------------------
  206. PF2Lst          = $AC           ; ..$B1         low pointer for PF2 data
  207. PF2LstEnd       = PF2Lst+NUM_BLOCKS-1
  208. ;---------------------------------------
  209. ; end of block variables
  210. missileY        = $B2           ;               y-position of player missile
  211. playerX         = $B3           ;               x-position of player jet
  212. speedX          = $B4           ;               x-speed of player jet
  213. speedY          = $B5           ;               y-speed of play jet
  214. blockPart       = $B6           ;               1/2 (used for bridge)
  215. fuelHi          = $B7           ;               high value of fuel (displayed)
  216. fuelLo          = $B8           ;               low value of fuel
  217. sectionBlock    = $B9           ;               number of block in current section (16..1)
  218. shapePtr0       = $BA           ; ..$BB         pointer to the shape for the player jet
  219. PF1PatId        = $BC           ;               playfield pattern Id for the new generated block
  220. ;---------------------------------------
  221. player1State    = $BD           ; ..$C1
  222. level           = player1State  ;               difficulty level for current player (1..48)
  223. randomLoSave    = player1State+1;               saved random generator values for begin of level
  224. randomHiSave    = player1State+2;
  225. livesPtr        = player1State+3; ..$C1
  226. ;---------------------------------------
  227. player2State    = $C2           ; ..$C5
  228. livesPtr2       = player2State+3;               the high pointer is not saved here, because it's const
  229. ;---------------------------------------
  230. gameMode        = $C6           ;               0 = running; -1 = game over; 1..48 = scroll into game
  231. shapePtr1a      = $C7           ; ..$C8
  232. shapePtr1b      = $C9           ; ..$CA
  233. colorPtr        = $CB           ; ..$CC
  234. scorePtr1       = $CD           ; ..$D8         12 bytes for the score display of current player
  235. PF1Ptr          = $D9           ; ..$DA
  236. PF2Ptr          = $DB           ; ..$DC
  237. ;---------------------------------------
  238. scorePtr2       = $DD           ; ..$E7         12 bytes for the score display of other player
  239. ; the constant hi-pointers are temporary used:
  240. blockNum        = scorePtr2+1   ;               current block in kernel
  241. reflect0        = scorePtr2+3   ;               flag for GRP0 (player jet) reflection
  242. hitEnemyIdx     = scorePtr2+5   ;               index of enemy that was hit by missile
  243. PFCrashFlag     = scorePtr2+7   ;               jet crashed into playfield
  244. missileFlag     = scorePtr2+9   ;               $ff means: missile enabled
  245. ;---------------------------------------
  246. collidedEnemy   = $E8           ;               jet collided with enemy (id)
  247. randomLo        = $E9           ;               current number generator values
  248. randomHi        = $EA
  249. randomLoSave2   = $EB           ;               saved number generator values for current player
  250. randomHiSave2   = $EC
  251. temp2           = $ED           ;
  252. roadBlock       = temp2         ;               bit 7 = 1: road in block
  253. PFcolor         = $EE           ;               color of river banks
  254. valleyWidth     = PFcolor       ;               define minimum width of valley in first levels (6/0)
  255. playerColor     = $EF           ;               YELLOW/BLACK
  256. stateBKColor    = $F0           ;               GREY (const!)
  257. statePFColor    = $F1           ;               YELLOW+2 (const!)
  258. temp            = $F2           ;               main temporary variable
  259. diffPF          = temp          ;               difference between to PF pattern ids
  260. zero1           = $f3           ;               always zero!
  261. player          = $F4           ;               0/1
  262. missileX        = $F5           ;               x-position of player missile
  263. zero2           = $F6           ;               always zero!
  264.   IF SCREENSAVER
  265. SS_Delay        = $F7           ;               screensaver delay
  266.   ENDIF
  267. sound0Id        = $F8           ;
  268. sound0Cnt       = $F9
  269. bridgeSound     = $FA           ;               bridge is exploding
  270. missileSound    = $FB           ;               missile fired
  271. temp3           = $FC
  272. blockLine       = temp3         ;               current displayed line of block in kernel
  273. maxId           = temp3
  274. lineNum         = $FD           ;               counter for kernel lines
  275.  
  276.  
  277. ;===============================================================================
  278. ; M A C R O S
  279. ;===============================================================================
  280.  
  281.   MAC FILL_NOP
  282.     IF FILL_OPT
  283.       REPEAT {1}
  284.          NOP
  285.       REPEND
  286.     ENDIF
  287.   ENDM
  288.  
  289.  
  290. ;===============================================================================
  291. ; R O M - C O D E (Part 1)
  292. ;===============================================================================
  293.  
  294.        ORG $F000
  295.  
  296. START:
  297.        SEI                      ; 2
  298.        CLD                      ; 2
  299.        LDX    #0                ; 2
  300. Reset:
  301.        LDA    #0                ; 2
  302. .loopClear:
  303.        STA    $00,X             ; 4
  304.        TXS                      ; 2
  305.        INX                      ; 2
  306.        BNE    .loopClear        ; 2
  307.        JSR    SetScorePtrs      ; 6
  308.        LDA    #>Zero            ; 2
  309.        LDX    #12-1             ; 2
  310.        JSR    SetScorePtr1      ; 6             set high-pointers to $FB
  311.        LDX    #colorPtr+1-PF1Lst; 2             #38
  312.        JSR    GameInit          ; 6
  313.        LDA    random            ; 3
  314.        BNE    MainLoop          ; 2
  315.        INC    random            ; 5
  316.        STA    livesPtr          ; 3             = 0!
  317.        LDA    #<One             ; 2
  318.        STA    scorePtr1+10      ; 3
  319.  
  320. MainLoop:
  321.        LDX    #4                ; 2             offset ball
  322.        LDA    fuelHi            ; 3
  323.        LSR                      ; 2
  324.        LSR                      ; 2
  325.        LSR                      ; 2
  326.        CLC                      ; 2
  327.        ADC    #69               ; 2
  328.        JSR    SetPosX           ; 6             position ball for fuel display
  329.  
  330. ; *** prepare everything for the main kernel: ***
  331. ; set all color registers (and NUSIZ1 = 0)
  332.        INX                      ; 2             x = 5!
  333. .loopSetColors:
  334.        LDA    ColorTab,X        ; 4
  335.   IF SCREENSAVER
  336.        EOR    SS_XOR            ; 3
  337.        AND    SS_Mask           ; 3
  338.   ELSE
  339.        FILL_NOP 4
  340.   ENDIF
  341.        STA    PFcolor,X         ; 4
  342.        STA    NUSIZ1,X          ; 4
  343.        DEX                      ; 2
  344.        BPL    .loopSetColors    ; 2
  345.        TAY                      ; 2             y = 0!
  346.        LDA    scorePtr1+10      ; 3
  347.        CMP    #<Two             ; 2
  348.        BEQ    .skipTwo          ; 2
  349.        LDA    SWCHB             ; 4
  350.        LSR                      ; 2             reset pressed?
  351.        BCC    .skipTwo          ; 2              yes, skip player 2
  352.        LDA    player            ; 3             current player = 2?
  353.        BEQ    .skipTwo          ; 2              no, skip
  354.        STY    playerColor       ; 3              yes, set..
  355.        STY    COLUP0            ; 3              ..and player 2 color = 0
  356. .skipTwo:
  357.  
  358. ; flicker background when bridge explodes:
  359.        LDA    bridgeExplode     ; 3
  360.        BEQ    .skipExplosion    ; 2
  361.        DEC    bridgeExplode     ; 5
  362.        LSR                      ; 2
  363.        BCC    .skipExplosion    ; 2
  364.        LDA    #DARK_RED         ; 2             flicker background red
  365.   IF SCREENSAVER
  366.        AND    SS_Mask           ; 3
  367.   ELSE
  368.        FILL_NOP 2
  369.   ENDIF
  370.        STA    COLUBK            ; 3
  371. .skipExplosion:
  372.  
  373.        INX                      ; 2             x = 0!
  374.        STX    temp              ; 3
  375.        STX    NUSIZ0            ; 3
  376.        LDY    playerX           ; 3
  377.        LDA    reflect0          ; 3
  378.        STA    REFP0             ; 3
  379.        BEQ    .noReflect        ; 2
  380.        INY                      ; 2             adjust x-pos
  381. .noReflect:
  382.        TYA                      ; 2
  383.        JSR    SetPosX           ; 6             x-position player jet
  384.        INX                      ; 2
  385.        STX    CTRLPF            ; 3             reflect playfield
  386.  
  387.        STX    VDELP1            ; 3             enable vertical delay for player 1
  388.  
  389. ; set size, reflect and postion for top enemy object;
  390.        LDY    XPos1Lst +NUM_BLOCKS-1; 3
  391.        LDA    State1Lst+NUM_BLOCKS-1; 3
  392.        STA    NUSIZ1            ; 3
  393.        STA    REFP1             ; 3
  394.        JSR    SetPosX2          ; 6             position top enemy object
  395.  
  396. ; x-position missile:
  397.        INX                      ; 2
  398.        LDA    missileX          ; 3
  399.        JSR    SetPosX           ; 6             position missile
  400.  
  401.        JSR    DoHMove           ; 6
  402.        STY    PF0               ; 3             enable complete PF0 (y=$ff)
  403.  
  404. ; clear collsion variables:
  405.        STY    hitEnemyIdx       ; 3
  406.        STY    PFCrashFlag       ; 3
  407.        STY    missileFlag       ; 3
  408.        STY    collidedEnemy     ; 3
  409.  
  410. ; set variables for top block:
  411.        LDX    #NUM_BLOCKS-1     ; 2
  412.        JSR    SetPFxPtr         ; 6
  413.        LDA    blockOffset       ; 3
  414.        CMP    #3                ; 2             top block just started?
  415.        BCS    .skipDex          ; 2              no, skip
  416.        DEX                      ; 2              yes, start at block 4
  417. .skipDex:
  418.        STX    blockNum          ; 3
  419.        LDY    Shape1IdLst,X     ; 4
  420.        LDX    shapePtr1aTab,Y   ; 4
  421.        STX    shapePtr1a        ; 3
  422.        LDX    shapePtr1bTab,Y   ; 4
  423.        STX    shapePtr1b        ; 3
  424.        LDX    ColorPtrTab,Y     ; 4
  425.        STX    colorPtr          ; 3
  426.        STA    CXCLR             ; 3             clear all collison registers
  427.        STA    HMCLR             ; 3
  428. ; calculate offset into first block:
  429.        TAX                      ; 2
  430.        SEC                      ; 2
  431.        SBC    #1                ; 2
  432.        AND    #$1F              ; 2
  433.        STA    blockLine         ; 3
  434.        LSR    blockLine         ; 5             0..15
  435.        CMP    #26               ; 2
  436.        BCC    lowOffset         ; 2
  437.        SBC    #22               ; 2
  438.        BNE    endOffset         ; 2
  439.  
  440. lowOffset:
  441.        CMP    #4                ; 2
  442.        BCC    endOffset         ; 2
  443.        AND    #%01              ; 2
  444.        ORA    #%10              ; 2
  445. endOffset:
  446.  
  447. ; set entrypoint into kernel:
  448.        TAY                      ; 2
  449.        LDA    JmpHiTab,Y        ; 4
  450.        PHA                      ; 3
  451.        LDA    JmpLoTab,Y        ; 4
  452.        PHA                      ; 3
  453.  
  454. ; prepare graphics for first line of kernel:
  455.        TXA                      ; 2
  456.        LSR                      ; 2
  457.        TAY                      ; 2
  458.        LDA    (shapePtr1a),Y    ; 5
  459.        BCC    .evenLine         ; 2             even blockOffset!
  460.        LDA    (shapePtr1b),Y    ; 5
  461. .evenLine:
  462.        CPX    #26               ; 2             blockoffset >= 26?
  463.        BCS    .noShape          ; 2              yes, skip enemy shape
  464.        CPX    #3                ; 2             blockoffset < 3?
  465.        BCC    .noShape          ; 2              yes, skip enemy shape
  466.        STA    GRP1              ; 3              no, display enemy shape in first row
  467.        LDA    #0                ; 2
  468.        STA    GRP0              ; 3             VDELP1!
  469. .noShape:
  470.        LDA    (PF1Ptr),Y        ; 5
  471.        STA    PF1               ; 3
  472.        LDA    (PF2Ptr),Y        ; 5
  473.        STA    PF2               ; 3
  474.        LDA    (colorPtr),Y      ; 5
  475.   IF SCREENSAVER
  476.        EOR    SS_XOR            ; 3
  477.        AND    SS_Mask           ; 3
  478.   ELSE
  479.        FILL_NOP 4
  480.   ENDIF
  481.        STA    COLUP1            ; 3
  482.        LDX    blockNum          ; 3
  483.        LDA    blockLst,X        ; 4
  484.        STA    roadBlock         ; 3             save road-state
  485.        AND    #PF_COLOR_FLAG    ; 2
  486.        ORA    #GREEN            ; 2
  487.   IF SCREENSAVER
  488.        EOR    SS_XOR            ; 3
  489.        AND    SS_Mask           ; 3
  490.   ELSE
  491.        FILL_NOP 4
  492.   ENDIF
  493.        STA    PFcolor           ; 3
  494.        BIT    blockLstEnd       ; 3             road in first block?
  495.        BPL    .noRoad           ; 2              no, use green color
  496.        CPY    #ROAD_HEIGHT      ; 2             offset inside road?
  497.        BCS    .noRoad           ; 2              no, use green color
  498.        LDA    RoadColorTab,Y    ; 4              yes, use road colors
  499.   IF SCREENSAVER
  500.        EOR    SS_XOR            ; 3
  501.        AND    SS_Mask           ; 3
  502.   ELSE
  503.        FILL_NOP 4
  504.   ENDIF
  505. .noRoad:
  506.        STA    COLUPF            ; 3
  507.        LDY    #NUM_LINES        ; 2
  508.        STY    lineNum           ; 3
  509. .waitTim:
  510.        LDA    INTIM             ; 4
  511.        BNE    .waitTim          ; 2
  512.        STA    WSYNC             ; 3
  513.        STA    HMOVE             ; 3
  514.        STA    VBLANK            ; 3
  515.        RTS                      ; 6             jump into kernel!
  516.  
  517. ; *** main display kernel: ***
  518. DisplayKernel SUBROUTINE
  519.  
  520. ; first some external code to save cycles in the kernel:
  521. JmpPoint2:                      ;12
  522.        INC    lineNum           ; 5
  523.        LDY    blockLine         ; 3
  524.        BPL    enterKernel2      ; 3
  525.  
  526. .skipJet0:
  527.        LDX    zero2             ; 3             load 0 with exactly 3 cylces
  528.        BEQ    .contJet0         ; 3
  529.  
  530. .noRoad:
  531.        LDA    PFcolor           ; 3
  532.        JMP    .contPFColor      ; 3
  533.  
  534. .doJet0a:
  535.        LDA    (shapePtr0),Y     ; 5
  536.        TAX                      ; 2
  537.        LDA    #$00              ; 2
  538. .loopKernel1:                   ;   @19
  539.        BEQ    .contJet0a        ; 2             this jump is taken when comming from .doJet0a
  540.        BNE    .contKernel1      ; 3             this jump is taken when comming from .loopkernel1
  541.  
  542.   IF SCREENSAVER = 0
  543.        FILL_NOP 1
  544.   ENDIF
  545.  
  546. JmpPoint3:                      ;12
  547.        JSR    Wait12            ;12
  548. .contKernel1:
  549.        NOP                      ; 2 @26
  550. ;--------------------------------------
  551. ; even line:
  552. ; - ...
  553. ; - draw player jet
  554. ; - load new P1 shape
  555.  
  556. ; *** here starts the main kernel loop: ***
  557. .loopKernel:                    ;
  558.        CPY    #JET_Y            ; 2             draw player jet?
  559.        BCS    .skipJet0         ; 2              no, skip
  560.        LDA    (shapePtr0),Y     ; 5              yes, load data..
  561.        TAX                      ; 2              ..into x
  562. .contJet0:
  563.        LDY    blockLine         ; 3
  564.        BIT    roadBlock         ; 3             road displayed?
  565.        BPL    .noRoad           ; 2              no, normal PF color
  566.        LDA    RoadColorTab,Y    ; 4              yes, load road colors
  567.   IF SCREENSAVER
  568.        EOR    SS_XOR            ; 3
  569. .contPFColor:
  570.        AND    SS_Mask           ; 3
  571.   ELSE
  572.        FILL_NOP 2
  573. .contPFColor:
  574.        FILL_NOP 1
  575.   ENDIF
  576.        STA.w  temp              ; 4
  577.        LDA    (shapePtr1b),Y    ; 5
  578.        STA    GRP1              ; 3             time doesn't matter (VDELP1!)
  579.        LDA    (PF1Ptr),Y        ; 5
  580.        STA    PF1               ; 3 @75
  581. ;--------------------------------------
  582. ; new line starts here!
  583. ; odd line:
  584. ; - set PF color
  585. ; - set P1 color
  586. ; - change PF
  587.        STA    HMOVE             ; 3
  588.        STX    GRP0              ; 3 @2          this also updates GRP1
  589.        LDA    temp              ; 3
  590.        STA    COLUPF            ; 3 @8
  591.        LDA    (colorPtr),Y      ; 5
  592.   IF SCREENSAVER
  593.        EOR    SS_XOR            ; 3
  594.        AND    SS_Mask           ; 3
  595.   ELSE
  596.        FILL_NOP 4
  597.   ENDIF
  598.        STA    COLUP1            ; 3 @22
  599.        LDA    (PF2Ptr),Y        ; 5
  600.        STA    PF2               ; 3 @30
  601. enterKernel2:
  602.        LDA    (shapePtr1a),Y    ; 5
  603.        STA    GRP1              ; 3             time doesn't matter (VDELP1!)
  604.        LDY    lineNum           ; 3
  605.        DEY                      ; 2
  606.        BEQ    .exitKernel2      ; 2
  607.        CPY    #JET_Y            ; 2
  608.        BCC    .doJet0a          ; 2
  609.        TYA                      ; 2
  610.        SBC    missileY          ; 3
  611.        AND    #$F8              ; 2
  612.        BNE    .skipEnable0      ; 2
  613.        LDA    #ENABLE           ; 2
  614. .skipEnable0:
  615.        LDX    #$00              ; 2
  616. .contJet0a:
  617.        DEY                      ; 2
  618.        STY    lineNum           ; 3
  619.        STA    WSYNC             ; 3
  620. ;--------------------------------------
  621. ; even line:
  622. ; - en-/disable missile
  623. ; - update P0 and P1 graphics
  624. ; - decrease block-line
  625. ; - ...
  626.        STA    HMOVE             ; 3
  627.        STA    ENAM0             ; 3
  628.        STX    GRP0              ; 3 @6          this also updates GRP1
  629.        BEQ    .exitKernel2      ; 2
  630.        DEC    blockLine         ; 5
  631.        BNE    .loopKernel1      ; 2
  632.  
  633. ;*** start of next block (requires eight extra kernel lines): ***
  634. ; new block, line 1
  635. ; - dec block-number
  636. ; - set new  road-state
  637. ; - get new PF color
  638. ;  - set new shape-pointer 1a
  639.        DEC    blockNum          ; 5
  640. JmpPoint1:
  641.        LDX    blockNum          ; 3
  642.        BMI    LF202             ; 2
  643.        LDA    blockLst,X        ; 4             save road-state
  644.        STA    roadBlock         ; 3
  645.        AND    #PF_COLOR_FLAG    ; 2             bright or dark..
  646.        ORA    #GREEN            ; 2             ..green
  647.   IF SCREENSAVER
  648.        EOR    SS_XOR            ; 3
  649.        AND    SS_Mask           ; 3
  650.   ELSE
  651.        FILL_NOP 4
  652.   ENDIF
  653.        STA    PFcolor           ; 3
  654.        LDA    Shape1IdLst,X     ; 4             set
  655.        TAX                      ; 2              shape-pointer
  656.        LDA    shapePtr1aTab,X   ; 4              for the
  657.        STA    shapePtr1a        ; 3              next enemy
  658. LF1CE:
  659.        LDA    #$00              ; 2
  660.        STA    GRP1              ; 3
  661.        CPY    #JET_Y            ; 2
  662.        STA    WSYNC             ; 3
  663. ;--------------------------------------
  664. ; new block, line 2
  665. ; x = shape-id
  666. ;  - set jet
  667. ;  - set PF
  668. ;  - set new shape-pointer 1b
  669. ;  - set new color-pointer
  670.        STA    HMOVE             ; 3
  671.        BCS    .skipJet1         ; 2
  672.        LDA    (shapePtr0),Y     ; 5
  673. .skipJet1:
  674.        STA    GRP0              ; 3
  675.        LDY    #0                ; 2             display last line of playfield pattern
  676.        LDA    (PF1Ptr),Y        ; 5
  677.        STA    PF1               ; 3
  678.        LDA    (PF2Ptr),Y        ; 5
  679.        STA    PF2               ; 3
  680.        LDY    lineNum           ; 3
  681.        DEY                      ; 2
  682. .exitKernel2:
  683.        BEQ    .exitKernel1      ; 2
  684.        LDA    shapePtr1bTab,X   ; 4
  685.        STA    shapePtr1b        ; 3
  686.        LDA    ColorPtrTab,X     ; 4
  687.        STA    colorPtr          ; 3
  688. JmpPoint0:
  689.        CPY    #JET_Y            ; 2
  690.        BCS    .skipJet2         ; 2
  691.        LDA    (shapePtr0),Y     ; 5
  692.        TAX                      ; 2
  693.        LDA    #DISABLE          ; 2
  694.        BEQ    .contJet2         ; 3
  695.  
  696. LF202: INX                      ; 2
  697.        BEQ    LF1CE             ; 2
  698. JmpPoint9:
  699.        NOP                      ; 2
  700.        SEC                      ; 2
  701.        BCS    .enterKernel9     ; 3
  702.  
  703. .skipJet2:
  704.        TYA                      ; 2
  705.        SBC    missileY          ; 3
  706.        AND    #$F8              ; 2
  707.        BNE    .skipEnable1      ; 2
  708.        LDA    #ENABLE           ; 2
  709. .skipEnable1:
  710.        LDX    #$00              ; 2
  711. .contJet2:
  712.        STA    WSYNC             ; 3
  713. ;--------------------------------------
  714. ; new block, line 3
  715. ; - en-/disabvle missile
  716. ; - set jet
  717. ; - set new PF pointers
  718.        STA    HMOVE             ; 3
  719.        STA    ENAM0             ; 3
  720.        STX    GRP0              ; 3
  721.        DEY                      ; 2
  722.        STY    lineNum           ; 3
  723. .exitKernel1:
  724.        BEQ    .exitKernel       ; 2
  725.        LDX    blockNum          ; 3
  726. .enterKernel9:
  727.        JSR    SetPFxPtr         ;50
  728.        LDA    PFcolor           ; 3
  729.        CPY    #JET_Y            ; 2
  730.        NOP                      ; 2 @76
  731. ;--------------------------------------
  732. ; new block, line 4
  733. ; - set new PF color
  734. ; - set PF
  735. ; - load fine movement
  736.        STA    HMOVE             ; 3
  737.        STA    COLUPF            ; 3
  738.        BCS    .skipJet3         ; 2
  739.        LDA    (shapePtr0),Y     ; 5
  740.        STA    GRP0              ; 3
  741. .skipJet3:
  742.        LDY    #SECTION_BLOCKS-1 ; 2
  743.        LDA    (PF1Ptr),Y        ; 5
  744.        STA    PF1               ; 3
  745.        LDA    (PF2Ptr),Y        ; 5
  746.        STA    PF2               ; 3
  747.        DEC    lineNum           ; 5
  748.        BEQ    .exitKernel       ; 2
  749. JmpPoint8:
  750.        LDA    State1Lst,X       ; 4             put fine move-value
  751.        STA    temp              ; 3              into temp
  752.        LDY    lineNum           ; 3
  753.        CPY    #JET_Y            ; 2
  754.        BCC    .skipJet4         ; 2
  755.        TYA                      ; 2
  756.        SBC    missileY          ; 3
  757.        AND    #$F8              ; 2
  758.        BNE    .skipEnable2      ; 2
  759.        LDA    #ENABLE           ; 2
  760. .skipEnable2:
  761.        LDY    #0                ; 2
  762. .contJet4:
  763.        STA    WSYNC             ; 3
  764. ;--------------------------------------
  765. ; new block, line 5
  766. ; - en-/disable missile
  767. ; - set jet
  768. ; - position new shape
  769.        STA    HMOVE             ; 3
  770.        STA    ENAM0             ; 3
  771.        STY    GRP0              ; 3
  772. ; position player 1:
  773.        LDA    XPos1Lst,X        ; 4             load coarse move-value
  774.        BEQ    .posVeryLeft      ; 2
  775.        TAX                      ; 2
  776.        CPX    #7                ; 2
  777.        BCS    .posRight         ; 2
  778. .waitLeft:
  779.        DEX                      ; 2
  780.        BNE    .waitLeft         ; 2
  781.        STA    RESP1             ; 3
  782. .contLeft:
  783.        DEC    lineNum           ; 5
  784.        LDY    lineNum           ; 3
  785.        BNE    .contPos          ; 2
  786. .exitKernel:
  787.        JMP    DisplayState      ; 3             exit the kernel
  788.  
  789. .posVeryLeft:
  790.        NOP                      ; 2
  791.        NOP                      ; 2
  792.        LDA    #$60              ; 2
  793.        STA    RESP1             ; 3
  794.        STA    HMP1              ; 3
  795.        BNE    .contLeft         ; 2
  796.  
  797. .skipJet4:
  798.        LDA    (shapePtr0),Y     ; 5
  799.        TAY                      ; 2
  800.        LDA    #$00              ; 2
  801.        BEQ    .contJet4         ; 2
  802.  
  803. .posRight:
  804.        SBC    #4                ; 2
  805.        TAX                      ; 2
  806.        DEC    lineNum           ; 5
  807.        LDY    lineNum           ; 3
  808.        BEQ    .exitKernel       ; 2
  809. .waitRight:
  810.        DEX                      ; 2
  811.        BPL    .waitRight        ; 2
  812.        STA    RESP1             ; 3
  813. JmpPoint7:
  814. .contPos:
  815.        STA    WSYNC             ; 3
  816. ;--------------------------------------
  817. ; new block, line 6
  818.        STA    HMOVE             ; 3
  819.        CPY    #JET_Y            ; 2
  820.        BCS    .skipJet5         ; 2
  821.        LDA    (shapePtr0),Y     ; 5
  822.        STA    GRP0              ; 3
  823. .skipJet5:
  824.        LDY    #SECTION_BLOCKS-2 ; 2
  825.        LDA    (PF1Ptr),Y        ; 5
  826.        STA    PF1               ; 3
  827.        LDA    (PF2Ptr),Y        ; 5
  828.        STA    PF2               ; 3
  829.        LDY    lineNum           ; 3
  830.        DEY                      ; 2
  831.        BEQ    .exitKernel       ; 2
  832.        LDX    blockNum          ; 3
  833.        LDA    temp              ; 3
  834.        STA    HMP1              ; 3
  835. JmpPoint6:
  836.        LDA    #[BLOCK_SIZE-8]/2 ; 2
  837.        STA    blockLine         ; 3
  838.        TYA                      ; 2
  839.        SEC                      ; 2
  840.        SBC    missileY          ; 3
  841.        AND    #$F8              ; 2
  842.        BNE    .skipEnable3      ; 2
  843.        LDA    #ENABLE           ; 2
  844. .skipEnable3:
  845.        CPY    #JET_Y            ; 2
  846.        STA    WSYNC             ; 3
  847. ;--------------------------------------
  848. ; new block, line 7
  849.        STA    HMOVE             ; 3
  850.        STA    ENAM0             ; 3
  851.        BCS    .skipJet6         ; 2
  852.        LDA    (shapePtr0),Y     ; 5
  853.        STA    GRP0              ; 3
  854. .skipJet6:
  855.        LDA    State1Lst,X       ; 4
  856.        STA    NUSIZ1            ; 3
  857.        STA    REFP1             ; 3
  858.        DEY                      ; 2
  859.        STY    lineNum           ; 3
  860.        BEQ    DisplayState      ; 2
  861.        STA    HMCLR             ; 3
  862.  
  863. ; check collisions:
  864. ; (the collsion check between jet or missile and playfield aren't
  865. ;  really neccessary for each block, but the collison registers
  866. ;  are cleared after each block)
  867.        INX                      ; 2
  868.        BIT    CXM0P-$30         ; 3             player missile hit enemy?
  869.        BPL    .notHit           ; 2
  870.        STX    hitEnemyIdx       ; 3             save block number
  871. .notHit:
  872.   IF TRAINER
  873.        BIT    zero1
  874.   ELSE
  875.        BIT    CXP0FB-$30        ; 3             jet hit PF?
  876.   ENDIF
  877.        BPL    .noPFCrash        ; 2
  878.        STX    PFCrashFlag       ; 3
  879. .noPFCrash:
  880.   IF TRAINER
  881.        BIT    zero1
  882.   ELSE
  883.        BIT    CXM0FB-$30        ; 3             player missile hit PF?
  884.   ENDIF
  885.        BPL    .notHitPF         ; 2
  886.        STX    missileFlag       ; 3
  887. .notHitPF:
  888.   IF TRAINER
  889.        BIT    zero1
  890.   ELSE
  891.        BIT    CXPPMM-$30        ; 3             jet crashed into enemy?
  892.   ENDIF
  893.        BPL    .noCrash          ; 2
  894.        STX    collidedEnemy     ; 3             save block number
  895. .noCrash:
  896.  
  897. .enterKernel5:
  898. ;--------------------------------------
  899. ; new block, line 8
  900.        STA    WSYNC             ; 3
  901.        STA    HMOVE             ; 3
  902.        CPY    #JET_Y            ; 2
  903.        BCS    .skipJet7         ; 2
  904.        LDA    (shapePtr0),Y     ; 5
  905.        STA    GRP0              ; 3
  906. .skipJet7:
  907.        LDY    #SECTION_BLOCKS-3 ; 2
  908.        LDA    (PF1Ptr),Y        ; 5
  909.        STA    PF1               ; 3
  910.        LDA    (PF2Ptr),Y        ; 5
  911.        STA    PF2               ; 3
  912.        LDY    lineNum           ; 3
  913.        DEY                      ; 2
  914.        BEQ    DisplayState      ; 2
  915.        BIT    CXP1FB-$30        ; 3             enemy hit PF?
  916.        BPL    .notEnemyPF       ; 2              no, skip
  917.        LDA    blockLst,X        ; 4
  918.        ORA    #PF_COLLIDE_FLAG  ; 2              yes, set collision flag
  919.        STA    blockLst,X        ; 4
  920. .notEnemyPF:
  921.        STA    CXCLR             ; 3             clear all collison registers
  922.  
  923. .enterKernel4:
  924.        TYA                      ; 2
  925.        SEC                      ; 2
  926.        SBC    missileY          ; 3
  927.        AND    #$F8              ; 2
  928.        BNE    .skipEnable4      ; 2
  929.        LDA    #ENABLE           ; 2
  930. .skipEnable4:
  931.        CPY    #JET_Y            ; 2
  932.        STA    WSYNC             ; 3
  933. ;--------------------------------------
  934. ; new block, line 9 (= begin of even line)
  935.        STA    HMOVE             ; 3
  936.        STA    ENAM0             ; 3
  937.        BCS    .skipJet8         ; 2
  938.        LDA    (shapePtr0),Y     ; 5
  939.        STA    GRP0              ; 3
  940. .contJet8:
  941.        DEY                      ; 2
  942.        STY    lineNum           ; 3
  943.        BEQ    DisplayState      ; 2             exit the kernel
  944.        JMP    .loopKernel       ; 3 @26
  945.  
  946. JmpPoint5:
  947.        LDA    #[BLOCK_SIZE-8]/2 ; 2
  948.        STA    blockLine         ; 3
  949.        BNE    .enterKernel5     ; 3
  950.  
  951. JmpPoint4:
  952.        LDA    #[BLOCK_SIZE-8]/2 ; 2             12
  953.        STA    blockLine         ; 3
  954.        BNE    .enterKernel4     ; 3
  955.  
  956. .skipJet8:                      ;               waste some time
  957.        NOP                      ; 2
  958.        NOP                      ; 2
  959.        BCS    .contJet8         ; 3
  960.  
  961. DisplayState SUBROUTINE
  962. ; finish display kernel:
  963.        STA    WSYNC             ; 3
  964.        STA    HMOVE             ; 3
  965.        LDY    #$00              ; 2
  966.        STY    GRP1              ; 3
  967.        STY    GRP0              ; 3
  968.        LDA    zero1             ; 3             waste one extra cylce (but also wastes a variable!)
  969.        STA    COLUBK            ; 3
  970.        STY    PF0               ; 3
  971.        STY    PF1               ; 3
  972.        STY    PF2               ; 3
  973.        STY    REFP0             ; 3
  974.        STY    REFP1             ; 3
  975.        STY    reflect0          ; 3
  976. ; prepare state display:
  977.        LDA    #$11              ; 2             reflect PF, 2 pixel ball width, also for HMP0!
  978.        STA    RESP0             ; 3
  979.        STA    RESP1             ; 3
  980.        STA    CTRLPF            ; 3
  981.        STA    HMP0              ; 3
  982.        LDA    #$20              ; 2
  983.        STA    HMP1              ; 3
  984.        LDA    playerColor       ; 3
  985.        JSR    SetColPx          ; 6
  986.        LDA    stateBKColor      ; 3
  987.        STA    COLUBK            ; 3
  988.        LDA    #THREE_COPIES     ; 2
  989.        STA    NUSIZ0            ; 3
  990.        STA    NUSIZ1            ; 3
  991.        LDA    statePFColor      ; 3
  992.        STA    COLUPF            ; 3
  993.        LDY    #$07              ; 2
  994.        STY    VDELP0            ; 3
  995.        STY    lineNum           ; 3
  996.        STA    HMCLR             ; 3
  997. ; display score:
  998. .loopScore:
  999.        LDA    (scorePtr1+8),Y   ; 5
  1000.        TAX                      ; 2
  1001.        LDA    (scorePtr1+10),Y  ; 5
  1002.        STA    WSYNC             ; 3
  1003.        STA    HMOVE             ; 3
  1004.        STY    temp2             ; 3
  1005.        STA    temp              ; 3
  1006.        LDA    (scorePtr1),Y     ; 5
  1007.        STA    GRP0              ; 3
  1008.        LDA    (scorePtr1+2),Y   ; 5
  1009.        STA    GRP1              ; 3
  1010.        LDA    (scorePtr1+4),Y   ; 5
  1011.        STA    GRP0              ; 3
  1012.        LDA    (scorePtr1+6),Y   ; 5
  1013.        LDY    temp              ; 3
  1014.        STA    GRP1              ; 3
  1015.        STX    GRP0              ; 3
  1016.        STY    GRP1              ; 3
  1017.        STA    GRP0              ; 3
  1018.        LDY    temp2             ; 3
  1019.        DEY                      ; 2
  1020.        BPL    .loopScore        ; 2
  1021.  
  1022.        LDA    zero1             ; 3             a = 0 (BLACK)
  1023.        JSR    FinishDigits      ; 6             y = 14
  1024. ; display fuel:
  1025. .loopFuel:
  1026.        STY    temp2             ; 3             line counter
  1027.        LDA    FuelTab4,Y        ; 4
  1028.        LDX    FuelTab3,Y        ; 4
  1029.        STA    WSYNC             ; 3
  1030.        STA    HMOVE             ; 3
  1031.        STA    temp              ; 3
  1032.        NOP                      ; 2
  1033.        LDA    #$00              ; 2
  1034.        STA    GRP0              ; 3
  1035.        LDA    ENABLTab,Y        ; 4
  1036.        STA    ENABL             ; 3
  1037.        LDA    FuelTab0,Y        ; 4
  1038.        STA    GRP1              ; 3
  1039.        LDA    FuelTab1,Y        ; 4
  1040.        STA    GRP0              ; 3
  1041.        LDA    FuelTab2,Y        ; 4
  1042.        LDY    temp              ; 3
  1043.        STA    GRP1              ; 3
  1044.        STX    GRP0              ; 3
  1045.        STY    GRP1              ; 3
  1046.        STA    GRP0              ; 3
  1047.        LDY    temp2             ; 3
  1048.        DEY                      ; 2
  1049.        BPL    .loopFuel         ; 2
  1050.  
  1051.        LDA    playerColor       ; 3
  1052.        JSR    FinishDigits      ; 6
  1053.        INY                      ; 2             y=15
  1054.        CLC                      ; 2
  1055.        LDX    gameMode          ; 3
  1056.        INX                      ; 2
  1057.        BNE    .noGame           ; 2
  1058.        LDA    #<Space           ; 2
  1059.        STA    livesPtr          ; 3
  1060.  
  1061. ; animate copyright message:
  1062.        LDA    frameCnt          ; 3
  1063.        LSR                      ; 2
  1064.        LSR                      ; 2
  1065.        LSR                      ; 2
  1066.        CMP    #20               ; 2
  1067.        BCS    .ok               ; 2
  1068.        CMP    #12               ; 2
  1069. .noGame:
  1070.        LDY    #7                ; 2
  1071.        BCC    .ok               ; 2
  1072.        SBC    #4                ; 2
  1073.        TAY                      ; 2
  1074. .ok:
  1075.        STY    temp3             ; 3             copyright scroll offset
  1076. ; display lives and copyright:
  1077. .loopCopyright:
  1078.        LDY    temp3             ; 3
  1079.        LDA    Copyright5,Y      ; 4
  1080.        STA    temp              ; 3
  1081.        STA    WSYNC             ; 3
  1082.        STA    HMOVE             ; 3
  1083.        LDX    Copyright4,Y      ; 4
  1084.        LDA    (livesPtr),Y      ; 5
  1085.        STA    GRP0              ; 3
  1086.        DEC    temp3             ; 5
  1087.        LDA    Copyright1,Y      ; 4
  1088.        STA    GRP1              ; 3
  1089.        LDA    Copyright2,Y      ; 4
  1090.        STA    GRP0              ; 3
  1091.        LDA    Copyright3,Y      ; 4
  1092.        LDY    temp              ; 3
  1093.        STA    GRP1              ; 3
  1094.        STX    GRP0              ; 3
  1095.        STY    GRP1              ; 3
  1096.        STA    GRP0              ; 3
  1097.        DEC    lineNum           ; 5
  1098.        BPL    .loopCopyright    ; 2
  1099.  
  1100.        STA    WSYNC             ; 3
  1101.        STA    HMOVE             ; 3
  1102.        LDX    #$00              ; 2
  1103.        STX    VDELP0            ; 3
  1104.        STX    GRP1              ; 3
  1105.        STX    GRP0              ; 3
  1106.        LDA    blockOffset       ; 3
  1107.        CMP    #BLOCK_SIZE-6     ; 2
  1108.        BCC    .skipInx          ; 2
  1109.        INX                      ; 2
  1110. .skipInx:
  1111.  
  1112. ; check collisions for the last displayed block:
  1113.        BIT    CXM0P-$30         ; 3             player missile hit enemy?
  1114.        BPL    .notHit2          ; 2
  1115.        STX    hitEnemyIdx       ; 3             save block number
  1116. .notHit2:
  1117.   IF TRAINER
  1118.        BIT    zero1
  1119.   ELSE
  1120.        BIT    CXP0FB-$30        ; 3             jet hit PF?
  1121.   ENDIF
  1122.        BPL    .noPFCrash2       ; 2
  1123.        STX    PFCrashFlag       ; 3
  1124. .noPFCrash2:
  1125.        BIT    CXM0FB-$30        ; 3             player missile hit PF?
  1126.        BPL    .notHitPF2        ; 2
  1127.        STX    missileFlag       ; 3
  1128. .notHitPF2:
  1129.  
  1130.   IF NTSC
  1131.        LDA    #29               ; 2
  1132.   ELSE
  1133.        LDA    #58               ; 2
  1134.   ENDIF
  1135.        LDY    #%10000010        ; 2
  1136.        STA    WSYNC             ; 3
  1137.        STA    TIM64T            ; 4
  1138.        STY    VBLANK            ; 3
  1139.  
  1140.        BIT    CXP1FB-$30        ; 3             enemy hit PF?
  1141.        BPL    .notEnemyPF2      ; 2
  1142.        LDA    blockLst,X        ; 4
  1143.        ORA    #PF_COLLIDE_FLAG  ; 2
  1144.        STA    blockLst,X        ; 4
  1145. .notEnemyPF2:
  1146.   IF TRAINER
  1147.        LDA    zero1
  1148.   ELSE
  1149.        BIT    CXPPMM-$30        ; 3             jet crashed into enemy?
  1150.   ENDIF
  1151.        BPL    .noCrash2         ; 2
  1152.        STX    collidedEnemy     ; 3             save block number
  1153. .noCrash2:
  1154.  
  1155. ; *** update framecounter, check for screensaver: ***
  1156.        DEC    frameCnt          ; 5
  1157.        BNE    .skipSS_Delay     ; 2
  1158.        LDX    gameMode          ; 3
  1159.        INX                      ; 2
  1160.        BNE    .skipInit         ; 2
  1161.        JSR    SwapPlayers       ; 6
  1162. .skipInit:
  1163.   IF SCREENSAVER
  1164.        INC    SS_Delay          ; 5
  1165.        BNE    .skipSS_Delay     ; 2
  1166.        SEC                      ; 2
  1167.        ROR    SS_Delay          ; 5
  1168.   ELSE
  1169.        FILL_NOP 4
  1170.   ENDIF
  1171. .skipSS_Delay:
  1172.   IF SCREENSAVER
  1173.        LDY    #$FF              ; 2
  1174.        LDA    SWCHB             ; 4
  1175.        AND    #BW_MASK          ; 2             black and white?
  1176.        BNE    .colorMode        ; 2              no, color mode
  1177.        LDY    #$0F              ; 2              yes, mask out high nibble
  1178. .colorMode:
  1179.        TYA                      ; 2
  1180.        LDY    #$00              ; 2
  1181.        BIT    SS_Delay          ; 3
  1182.        BPL    .noScreenSaver    ; 2
  1183.        AND    #$F7              ; 2
  1184.        LDY    SS_Delay          ; 3
  1185. .noScreenSaver:
  1186.        STY    SS_XOR            ; 3
  1187.        ASL    SS_XOR            ; 5
  1188.        STA    SS_Mask           ; 3
  1189.   ELSE
  1190.        FILL_NOP 28
  1191.   ENDIF
  1192.  
  1193. ; *** randomly start movement of enemies: ***
  1194.        LDA    random            ; 3
  1195.        ASL                      ; 2
  1196.        ASL                      ; 2
  1197.        ASL                      ; 2
  1198.        EOR    random            ; 3
  1199.        ASL                      ; 2
  1200.        ROL    random            ; 5
  1201.        LDA    frameCnt          ; 3
  1202.        AND    #$0F              ; 2             every 16th frame
  1203.        BNE    .skipStartMove    ; 2
  1204.        LDA    random            ; 3
  1205.        AND    #$07              ; 2
  1206.        CMP    #5                ; 2             start one of the first five enemies
  1207.        BCC    .inBound          ; 2
  1208.        SBC    #5                ; 2             doubled chances for the first three enemies
  1209. .inBound:
  1210.        TAX                      ; 2
  1211.        LDA    blockLst,X        ; 4             start
  1212.        ORA    #ENEMY_MOVE_FLAG  ; 2              movement
  1213.        STA    blockLst,X        ; 4              of enemy
  1214. .skipStartMove:
  1215.  
  1216. ;*** animate and move the enemy objects: ***
  1217.        LDX    #NUM_BLOCKS-1     ; 2
  1218. .loopEnemies:
  1219. ; animate some enemies:
  1220.        LDY    Shape1IdLst,X     ; 4
  1221.        CPY    #ID_SHIP          ; 2             don't animate ship, bridge, house and fuel
  1222.        BCS    .skipAnimate      ; 2
  1223.        LDA    #$01              ; 2             every 2nd frame
  1224.        CPY    #ID_PLANE         ; 2             fast animate plane (not done) and helicopter
  1225.        BCS    .fastAnimation    ; 2
  1226.        LDA    #$0F              ; 2             slow animate explosions (every 16th frame)
  1227. .fastAnimation:
  1228.        AND    frameCnt          ; 3
  1229.        BNE    .skipAnimate      ; 2
  1230.        LDA    AnimateIdTab,Y    ; 4
  1231.        STA    Shape1IdLst,X     ; 4
  1232.        TAY                      ; 2
  1233. .skipAnimate:
  1234.  
  1235. ; check for move and direction change:
  1236.        LDA    gameMode          ; 3
  1237.        BNE    .skipMoveEnemy    ; 2
  1238.        LDA    level             ; 3
  1239.        LSR                      ; 2             first level?
  1240.        BEQ    .skipMoveEnemy    ; 2              yes, don't move
  1241.        CPY    #ID_PLANE         ; 2             move plane in same direction every frame
  1242.        BEQ    .xMoveEnemy       ; 2
  1243.        BCC    .skipMoveEnemy    ; 2
  1244.        CPY    #ID_BRIDGE        ; 2             don't move bridge, house and fuel
  1245.        BCS    .skipMoveEnemy    ; 2
  1246.        LDA    frameCnt          ; 3
  1247.        ROR                      ; 2
  1248.        BCS    .skipMoveEnemy    ; 2             move helicopter and ship every 2nd frame
  1249.        LDA    blockLst,X        ; 4
  1250.        ASL                      ; 2             enemy moving?
  1251.        BPL    .skipMoveEnemy    ; 2              no, skip move
  1252.        ASL                      ; 2             enemy collided with PF?
  1253.        BPL    .noPFCollision    ; 2              no, skip
  1254.        ASL                      ; 2             patroling enemy?
  1255.        BMI    .xMoveEnemy       ; 2              no, skip swap direction
  1256.        LDA    State1Lst,X       ; 4             switch
  1257.        EOR    #DIRECTION_FLAG   ; 2              enemy move
  1258.        STA    State1Lst,X       ; 4              direction
  1259.        LDA    blockLst,X        ; 4
  1260.        ORA    #PATROL_FLAG      ; 2             (re)enable patrol mode
  1261.        BNE    .endChangeDir     ; 2
  1262.  
  1263. .noPFCollision:
  1264.        LDA    blockLst,X        ; 4
  1265.        AND    #~PATROL_FLAG     ; 2             disable patrol mode (only temporary)
  1266. .endChangeDir:
  1267.        STA    blockLst,X        ; 4
  1268.  
  1269. ; move enemy one pixel left or right:
  1270. ; (no real position variables, the code is working
  1271. ;  directly  with the positioning values)
  1272. .xMoveEnemy:
  1273.        LDY    XPos1Lst,X        ; 4
  1274.        LDA    State1Lst,X       ; 4
  1275.        LSR                      ; 2
  1276.        LSR                      ; 2
  1277.        LSR                      ; 2
  1278.        LSR                      ; 2
  1279.        EOR    #$07              ; 2
  1280.        BCS    .xMoveLeft        ; 2             moving left!
  1281.        ADC    #1                ; 2
  1282.        CMP    #15               ; 2
  1283.        BCC    .skipRightIny     ; 2
  1284.        SBC    #15               ; 2
  1285.        INY                      ; 2
  1286. .skipRightIny:
  1287.        CPY    #10               ; 2
  1288.        BCC    .contMoveX        ; 2
  1289.        CMP    #10               ; 2             >= 160?
  1290.        BCC    .contMoveX        ; 2              no, continue
  1291.        LDY    #0                ; 2              yes,..
  1292.        TYA                      ; 2              ..move shape (plane)..
  1293.        BEQ    .contMoveX        ; 2              ..to the very left (0)
  1294.  
  1295. .xMoveLeft:
  1296.        SBC    #1                ; 2
  1297.        BCS    .contMoveX2       ; 2
  1298.        ADC    #15               ; 2
  1299.        DEY                      ; 2             < 0?
  1300.        BPL    .contMoveX        ; 2              no, continue
  1301.        LDY    #10               ; 2              yes, move shape (plane)..
  1302.        LDA    #9                ; 2              ..to the very right (159)
  1303. .contMoveX:
  1304.        STY    XPos1Lst,X        ; 4             store coarse value here
  1305. .contMoveX2:
  1306.        EOR    #$07              ; 2
  1307.        JSR    Mult16            ; 6
  1308.        EOR    State1Lst,X       ; 4
  1309.        AND    #FINE_MASK        ; 2             #$F0
  1310.        EOR    State1Lst,X       ; 4
  1311.        STA    State1Lst,X       ; 4             OR fine value into here
  1312. .skipMoveEnemy:
  1313.  
  1314. ; clear PF-collision:
  1315.        LDA    blockLst,X        ; 4
  1316.        AND    #~PF_COLLIDE_FLAG ; 2
  1317.        STA    blockLst,X        ; 4
  1318.        DEX                      ; 2
  1319.        BMI    .exitLoopEnemies  ; 2
  1320.        JMP    .loopEnemies      ; 3
  1321. .exitLoopEnemies:
  1322.  
  1323. ; *** read joystick: ***
  1324.        LDA    SWCHA             ; 4
  1325.        LDX    player            ; 3
  1326.        BEQ    .player1          ; 2
  1327.        JSR    Mult16            ; 6
  1328. .player1:
  1329.        AND    #$F0              ; 2             mask out other player joystick
  1330.        TAX                      ; 2
  1331.        LDY    #4                ; 2
  1332. .loopBits:
  1333.        ROL                      ; 2             roll new 4 bits into joystick
  1334.        ROL    joystick          ; 5              (old 4 bits got into upper nibble!)
  1335.        DEY                      ; 2
  1336.        BNE    .loopBits         ; 2
  1337.  
  1338.        CPX    #$F0              ; 2
  1339.        BNE    .joystickMoved    ; 2
  1340.        LDX    player            ; 3
  1341.        LDA    INPT4-$30,X       ; 4
  1342.        BMI    .noFire           ; 2
  1343. .joystickMoved:
  1344.  
  1345.        LDA    gameMode          ; 3
  1346.        CMP    #INTRO_SCROLL     ; 2
  1347.        BNE    .skipRestart      ; 2
  1348.        LDA    #64               ; 2             restart new game
  1349.        STA    speedY            ; 3
  1350.        STY    gameMode          ; 3             y=0!
  1351. .skipRestart:
  1352.   IF SCREENSAVER
  1353.        STY    SS_Delay          ; 3             y=0!
  1354.   ELSE
  1355.        FILL_NOP 2
  1356.   ENDIF
  1357. .noFire:
  1358.        LDX    gameMode          ; 3
  1359.        BEQ    .checkCollisions  ; 2             game running
  1360.        BMI    .gameOver         ; 2             game is over
  1361.        CPX    #INTRO_SCROLL+1   ; 2             scrolling into new game/life?
  1362.        BCC    .doSoundJmp       ; 2              yes, skip decrease
  1363.        BNE    .startGame        ; 2              no, finished scrolling, start new game
  1364. ; decrease lives:
  1365.        LDA    livesPtr          ; 3
  1366.        BEQ    .finishGame       ; 2             zero!
  1367.        SBC    #DIGIT_H          ; 2
  1368.        BNE    LF5B5             ; 2
  1369.        LDA    #<Space+1         ; 2
  1370. LF5B5: CMP    #<MaxOut          ; 2             score overflow?
  1371.        BNE    LF5BB             ; 2
  1372.        LDA    #<Three           ; 2             reset lives to 3
  1373. LF5BB: STA    livesPtr          ; 3
  1374. .startGame:
  1375.        DEC    gameMode          ; 5             start game
  1376.        BNE    .doSoundJmp       ; 2
  1377.  
  1378. .gameOver:
  1379.        INX                      ; 2
  1380.        BEQ    .doSoundJmp       ; 2
  1381.        DEC    gameMode          ; 5
  1382.        BMI    .doSoundJmp       ; 2
  1383.        STY    shapePtr0         ; 3
  1384.        LDA    livesPtr2         ; 3
  1385.        CMP    #<Copyright0      ; 2             other player still alive?
  1386.        BEQ    .skipSwap         ; 2              no, skip swap
  1387.        JSR    SwapPlayers       ; 6
  1388. .skipSwap:
  1389.        LDA    livesPtr          ; 3
  1390.        CMP    #<Copyright0      ; 2             current player still alive?
  1391.        BNE    .initPlayer       ; 2              yes, continue
  1392. .finishGame:
  1393.        JSR    FinishGame        ; 6
  1394.        BNE    .doSoundJmp       ; 2
  1395.  
  1396. .initPlayer:
  1397.        LDX    #shapePtr0+2-PF1Lst;2             #22
  1398.        JSR    GameInit          ; 6
  1399.        TYA                      ; 2
  1400.        ORA    #PF_ROAD_FLAG     ; 2
  1401.        STA    blockLstEnd       ; 3
  1402.        LDA    randomLoSave      ; 3             load..
  1403.        STA    randomLo          ; 3             ..random variables..
  1404.        LDA    randomHiSave      ; 3             ..with saved..
  1405.        STA    randomHi          ; 3             ..player variables
  1406. .doSoundJmp:
  1407.        JMP    DoSound           ; 3
  1408.  
  1409. .checkCollisions:
  1410.        LDX    collidedEnemy     ; 3             collided with enemy?
  1411.        BMI    .endCollisions    ; 2              no, skip
  1412.        LDA    Shape1IdLst,X     ; 4
  1413.        CMP    #ID_PLANE         ; 2             collided with explosion?
  1414.        BCC    .endCollisions    ; 2              no, skip
  1415.        CMP    #ID_BRIDGE        ; 2             collided with ship, plane or helicopter?
  1416.        BCC    .noBridge         ; 2              yes, do collision
  1417.        BNE    .refuel           ; 2              no, collided with fuel!
  1418.        INC    sectionEnd        ; 5              no, collided with bridge!
  1419. .noBridge:
  1420.        LDY    #$1F              ; 2             load some sound values
  1421.        LDA    #1                ; 2             sound id = 1
  1422.        JSR    LooseJet          ; 6
  1423.        LDX    collidedEnemy     ; 3
  1424.        LDA    #ID_EXPLOSION2    ; 2             start explosion
  1425.        JMP    .contJetExplosion ; 3
  1426.  
  1427. .refuel:
  1428.        LDA    fuelHi            ; 3
  1429.        ADC    #$01              ; 2
  1430.        LDX    #4                ; 2             sound id = 4
  1431.        BCC    .notFull          ; 2
  1432.        LDA    #$FF              ; 2
  1433.        STA    fuelLo            ; 3
  1434.        LDX    #3                ; 2             sound id = 3
  1435. .notFull:
  1436.        STA    fuelHi            ; 3
  1437.        CPX    sound0Id          ; 3
  1438.        BEQ    .endCollisions    ; 2
  1439.        STX    sound0Id          ; 3
  1440.        LDA    #$08              ; 2
  1441.        STA    sound0Cnt         ; 3
  1442.  
  1443. .endCollisions:
  1444.        LDX    PFCrashFlag       ; 3             jet crashed?
  1445.        BMI    .skipCrash        ; 2              no, skip
  1446. .maxedOut:
  1447.        LDY    #$1F              ; 2
  1448.        LDA    #1                ; 2             sound id = 1
  1449. .looseJet:
  1450.        JSR    LooseJet          ; 6
  1451.        BNE    .doSoundJmp       ; 2
  1452.  
  1453. .skipCrash:
  1454.  
  1455. ; decrease fuel:
  1456.        LDA    fuelLo            ; 3
  1457.        SEC                      ; 2
  1458.   IF TRAINER
  1459.        SBC    #0
  1460.   ELSE
  1461.        SBC    #$20              ; 2
  1462.   ENDIF
  1463.        BCS    .skipDecHi        ; 2
  1464.        LDY    fuelHi            ; 3
  1465.        BNE    .fuelOk           ; 2
  1466.        LDA    #2                ; 2             sound id = 2
  1467.        LDY    #$23              ; 2
  1468.        JMP    .looseJet         ; 3             out of fuel!
  1469.  
  1470. .fuelOk:
  1471.        DEC    fuelHi            ; 5
  1472. .skipDecHi:
  1473.        STA    fuelLo            ; 3
  1474.  
  1475. ; *** move jet left or right: ***
  1476.        LDA    joystick          ; 3
  1477.        TAY                      ; 2
  1478.        AND    #MOVE_LEFT|MOVE_RIGHT; 2
  1479.        EOR    #MOVE_LEFT|MOVE_RIGHT; 2
  1480.        BNE    .leftRight        ; 2
  1481.        STA    dXSpeed           ; 3             jet is flying straight
  1482.        STA    speedX            ; 3
  1483.        LDX    #<JetStraight-1   ; 2
  1484.        BNE    .setPtr0          ; 2
  1485.  
  1486. .leftRight:
  1487.        LDA    dXSpeed           ; 3             increase the x speed change
  1488.        CLC                      ; 2
  1489.        ADC    #8                ; 2
  1490.        BCS    .maxChange        ; 2
  1491.        STA    dXSpeed           ; 3
  1492. .maxChange:
  1493.        LDX    #<JetMove-1       ; 2
  1494.        TYA                      ; 2
  1495.        AND    #MOVE_RIGHT       ; 2
  1496.        STA    reflect0          ; 3
  1497.        BEQ    .moveRight        ; 2
  1498.        BCS    .maxChange2       ; 2
  1499.        LDA    speedX            ; 3
  1500.        SEC                      ; 2
  1501.        SBC    dXSpeed           ; 3
  1502.        BCS    .setXSpeed        ; 2
  1503. .maxChange2:
  1504.        DEC    playerX           ; 5
  1505.        BNE    .setXSpeed        ; 2
  1506.  
  1507. .moveRight:
  1508.        BCS    .maxChange3       ; 2
  1509.        LDA    speedX            ; 3
  1510.        BIT    joystick          ; 3             moved right before?
  1511.        BPL    .wasRight         ; 2              yes, skip
  1512.        LDA    #-1               ; 2              bo, move the jet very slowly to the left (JTZ: what's that good for?)
  1513. .wasRight:
  1514.        ADC    dXSpeed           ; 3
  1515.        BCC    .setXSpeed        ; 2
  1516. .maxChange3:
  1517.        INC    playerX           ; 5
  1518. .setXSpeed:
  1519.        STA    speedX            ; 3
  1520. .setPtr0:
  1521.        STX    shapePtr0         ; 3
  1522.  
  1523. ; change jet speed:
  1524.        LDX    speedY            ; 3
  1525.        TYA                      ; 2
  1526.        LSR                      ; 2
  1527.        BCS    .noMoveUp         ; 2
  1528. .incSpeed:
  1529.        TXA                      ; 2
  1530.        ADC    #2                ; 2
  1531.        BCC    .changeSpeed      ; 2
  1532.        BCS    .skipChange       ; 2
  1533.  
  1534. .noMoveUp:
  1535.        LSR                      ; 2
  1536.        BCC    .noMoveDown       ; 2
  1537.        TXA                      ; 2
  1538.        ASL                      ; 2
  1539.        BCC    .incSpeed         ; 2
  1540.        BEQ    .skipChange       ; 2
  1541.  
  1542. .noMoveDown:
  1543.        TXA                      ; 2
  1544.        CMP    #$41              ; 2             minimal speed?
  1545.        BCC    .skipChange       ; 2              yes, skip slow down
  1546.        SBC    #2                ; 2
  1547. .changeSpeed:
  1548.        STA    speedY            ; 3
  1549. .skipChange:
  1550.  
  1551.        LDX    hitEnemyIdx       ; 3             object hit?
  1552.        BMI    .skipCollisions   ; 2              no, skip
  1553.        LDY    Shape1IdLst,X     ; 4
  1554.        CPY    #ID_PLANE         ; 2             enemy objects?
  1555.        BCC    .skipCollisions   ; 2              no, explosions
  1556.        LDA    #ID_EXPLOSION1    ; 2             start explosion animation
  1557. .contJetExplosion:
  1558.        LDY    Shape1IdLst,X     ; 4
  1559.        STA    Shape1IdLst,X     ; 4
  1560.        LDA    #23               ; 2
  1561.        STA    bridgeSound       ; 3
  1562.        CPY    #ID_BRIDGE        ; 2
  1563.        BNE    .skipBridge       ; 2
  1564.        STA    bridgeExplode     ; 3             start bridge explosion
  1565.        LDA    #$E0|TWO_COPIES   ; 2             set fixed position and size (two copies close)
  1566.        STA    State1Lst,X       ; 4
  1567.        LDA    #4                ; 2             coarse positiong value
  1568.        STA    XPos1Lst,X        ; 4
  1569.        INC    sectionEnd        ; 5             new section has been started
  1570. .skipBridge:
  1571.  
  1572. ; increase score:
  1573.        LDX    #8                ; 2             add 10s
  1574.        LDA    ScoreTab,Y        ; 4
  1575.        BPL    .loopSetPtr1      ; 2
  1576.        AND    #$7F              ; 2             add n*100 points
  1577.        LDX    scorePtr1+8       ; 3
  1578.        CPX    #<Space           ; 2
  1579.        BNE    .noSpace          ; 2
  1580.        LDX    #<Zero            ; 2             replace Space..
  1581.        STX    scorePtr1+8       ; 3             ..with Zero
  1582. .noSpace:
  1583.        LDX    #6                ; 2             add 100s
  1584. .loopSetPtr1:
  1585.        PHA                      ; 3
  1586.        CPX    #2                ; 2             life pointer
  1587.        BNE    .notLivePtr       ; 2
  1588. ; check for bonus life:
  1589.        LDA    livesPtr          ; 3
  1590.        CMP    #<Nine            ; 2
  1591.        BEQ    .maxLives         ; 2
  1592.        BCC    .notMax           ; 2
  1593.        LDA    #$FF              ; 2             CF=1!
  1594. .notMax:
  1595.        ADC    #DIGIT_H          ; 2
  1596.        STA    livesPtr          ; 3
  1597. .maxLives:
  1598. .notLivePtr:
  1599.        LDA    scorePtr1,X       ; 4
  1600.        SEC                      ; 2
  1601.        SBC    #<Space           ; 2
  1602.        BNE    .noSpace2         ; 2
  1603.        STA    scorePtr1,X       ; 4             point to '0'
  1604. .noSpace2:
  1605.        PLA                      ; 4
  1606.        CLC                      ; 2
  1607.        ADC    scorePtr1,X       ; 4
  1608.        CMP    #<MaxOut          ; 2
  1609.        BCC    .noMaxOut         ; 2             exit loop
  1610.        SBC    #<MaxOut          ; 2
  1611.        STA    scorePtr1,X       ; 4
  1612.        LDA    #DIGIT_H          ; 2
  1613.        DEX                      ; 2
  1614.        DEX                      ; 2
  1615.        BPL    .loopSetPtr1      ; 2
  1616.  
  1617. ; more than 999990 points, set score to !!!!!!, game over:
  1618.        LDA    #<MaxOut          ; 2
  1619.        LDX    #12-2             ; 2
  1620.        JSR    SetScorePtr1      ; 6
  1621.        LDA    #<Copyright0      ; 2
  1622.        STA    livesPtr          ; 3
  1623.        JMP    .maxedOut         ; 3
  1624.  
  1625. .noMaxOut:
  1626.        STA    scorePtr1,X       ; 4
  1627. .noMissile:
  1628.        LDX    #$B4              ; 2             disable missile
  1629.        BNE    .directMissile    ; 2
  1630. .skipCollisions:
  1631.  
  1632. ; *** move or fire missiles: ***
  1633.        LDA    missileFlag       ; 3
  1634.        BPL    .noMissile        ; 2
  1635.        LDA    missileY          ; 3
  1636.        CMP    #MAX_MISSILE+1    ; 2
  1637.        BCS    .checkFire        ; 2
  1638.        ADC    #MISSILE_SPEED    ; 2             y-move missile
  1639.        TAX                      ; 2
  1640.        LDA    SWCHB             ; 4             read difficulty
  1641.        LDY    player            ; 3
  1642.        BNE    .player1a         ; 2
  1643.        ASL                      ; 2
  1644. .player1a:
  1645.        TAY                      ; 2
  1646.        BPL    .guidedMissile    ; 2
  1647.        BMI    .directMissile    ; 2
  1648.  
  1649. .checkFire:
  1650.        LDX    player            ; 3
  1651.        LDA    INPT4-$30,X       ; 4
  1652.        BMI    .noMissile        ; 2
  1653.        LDX    #$0F              ; 2
  1654.        STX    missileSound      ; 3
  1655.        LDX    #MIN_MISSILE      ; 2
  1656. .guidedMissile:
  1657.        LDA    playerX           ; 3
  1658.        CLC                      ; 2
  1659.        ADC    #$05              ; 2
  1660.        STA    missileX          ; 3
  1661. .directMissile:
  1662.        STX    missileY          ; 3
  1663.  
  1664. ; *** sound routines: ***
  1665. ; TODO: analyze, labels, comments
  1666. DoSound:
  1667. ; start with channel 0:
  1668.        LDY    #$1C              ; 2
  1669.        LDA    sound0Cnt         ; 3
  1670.        LDX    sound0Id          ; 3
  1671.        BEQ    LF789             ; 2
  1672.        DEX                      ; 2
  1673.        BEQ    LF770             ; 2
  1674.        LDY    #$0F              ; 2
  1675.        CPX    #$02              ; 2
  1676.        BCS    LF776             ; 2
  1677.        LDY    #$08              ; 2
  1678. LF770: LSR                      ; 2
  1679.        TAX                      ; 2
  1680.        LDA    #$08              ; 2             white noise
  1681.        BNE    LF77D             ; 2
  1682.  
  1683. LF776: BEQ    LF77A             ; 2
  1684.        LDY    #$1F              ; 2
  1685. LF77A: TAX                      ; 2
  1686.        LDA    #$04              ; 2             high pure tone
  1687. LF77D: DEC    sound0Cnt         ; 5
  1688.        BNE    .setAud0          ; 2
  1689.        PHA                      ; 3
  1690.        LDA    #0                ; 2
  1691.        STA    sound0Id          ; 3             stop sound0
  1692.        PLA                      ; 4
  1693.        BPL    .setAud0          ; 2
  1694.  
  1695. ; low fuel sound:
  1696. LF789: LDA    gameMode          ; 3             game running?
  1697.        BNE    .mute0            ; 2              no, quiet (x=0)
  1698.        LDA    fuelHi            ; 3
  1699.        CMP    #$40              ; 2
  1700.        BCS    .jetSound         ; 2
  1701.        LDY    sound0Cnt         ; 3
  1702.        BNE    .contSound0       ; 2
  1703.        LDY    #$3F              ; 2
  1704. .contSound0:
  1705.        DEY                      ; 2
  1706.        STY    sound0Cnt         ; 3
  1707.        LDX    fuelLo            ; 3
  1708.        STX    temp              ; 3
  1709.        CMP    #$04              ; 2
  1710.        BCS    LF7B0             ; 2
  1711.        ROL    temp              ; 5
  1712.        ROL                      ; 2
  1713.        ROL    temp              ; 5
  1714.        ROL                      ; 2
  1715.        EOR    #$FF              ; 2
  1716.        ADC    #$20              ; 2
  1717.        BNE    .loadAud0         ; 2
  1718.  
  1719. LF7B0: CPY    #$1C              ; 2
  1720.        BCC    .jetSound         ; 2
  1721.        TYA                      ; 2
  1722.        LSR                      ; 2
  1723. .loadAud0:
  1724.        TAY                      ; 2
  1725.        LDA    #$0C              ; 2
  1726.        LDX    #$0F              ; 2
  1727.        BNE    .setAud0          ; 2
  1728.  
  1729. ; make some noise, depending on jet speed:
  1730. .jetSound:
  1731.        LDA    speedY            ; 3             frequency depends on y-speed
  1732.        LSR                      ; 2
  1733.        LSR                      ; 2
  1734.        LSR                      ; 2
  1735.        LSR                      ; 2
  1736.        EOR    #$FF              ; 2
  1737.        SEC                      ; 2
  1738.        ADC    #$1F              ; 2
  1739.        TAY                      ; 2
  1740.        LDA    joystick          ; 3             volume depends on joystick position
  1741.        AND    #MOVE_UP|MOVE_DOWN; 2
  1742.        TAX                      ; 2
  1743.        LDA    VolumeTab,X       ; 4
  1744.        TAX                      ; 2
  1745.        LDA    #$08              ; 2             white noise
  1746. .setAud0:
  1747.        STA    AUDC0             ; 3
  1748.        STY    AUDF0             ; 3
  1749. .mute0:
  1750.        STX    AUDV0             ; 3
  1751.  
  1752. ; continue with channel 1:
  1753. ; (missile fire or bridge explosion)
  1754.        LDA    missileSound      ; 3
  1755.        BEQ    .noMissileSound   ; 2
  1756.        DEC    missileSound      ; 5
  1757.        LDX    bridgeSound       ; 3             bridge exposion has higher priority
  1758.        BNE    .doBridge         ; 2
  1759.        EOR    #$FF              ; 2
  1760.        SEC                      ; 2
  1761.        ADC    #$1C              ; 2
  1762.        LDY    #$0C              ; 2             medium pure tone
  1763.        LDX    #$08              ; 2
  1764.        BNE    .setAud1          ; 2
  1765.  
  1766. .noMissileSound:
  1767.        LDX    bridgeSound       ; 3
  1768.        BEQ    .skipSound1       ; 2
  1769. ; let the bridge explode:
  1770. .doBridge:
  1771.        DEC    bridgeSound       ; 5             countdown volume
  1772.        TXA                      ; 2
  1773.        LSR                      ; 2
  1774.        CLC                      ; 2
  1775.        ADC    #$04              ; 2
  1776.        TAX                      ; 2
  1777.        LDA    random            ; 3             random frequency
  1778.        ORA    #$18              ; 2
  1779.        LDY    #$08              ; 2
  1780. .setAud1:
  1781.        STA    AUDF1             ; 3
  1782.        STY    AUDC1             ; 3
  1783. .skipSound1:
  1784.        STX    AUDV1             ; 3
  1785.  
  1786. ; start next frame:
  1787. .waitTim:
  1788.        LDA    INTIM             ; 4
  1789.        BNE    .waitTim          ; 2
  1790.        LDY    #$82              ; 2
  1791.        STY    WSYNC             ; 3
  1792.        STY    VSYNC             ; 3
  1793.        STY    WSYNC             ; 3
  1794.        STY    WSYNC             ; 3
  1795.        STY    WSYNC             ; 3
  1796.        STA    VSYNC             ; 3
  1797.   IF NTSC
  1798.        LDA    #43               ; 2
  1799.   ELSE
  1800.        LDA    #73               ; 2
  1801.   ENDIF
  1802.        STA    TIM64T            ; 4
  1803.  
  1804. ; *** check switches: ***
  1805.        LDA    SWCHB             ; 4
  1806.        LSR                      ; 2
  1807.        BCS    .noReset          ; 2
  1808.        LDA    gameVariation     ; 3             RESET was pressed
  1809.        STA    player            ; 3
  1810.        LDX    #$F7              ; 2
  1811.        JMP    Reset             ; 3
  1812.  
  1813. .noReset:
  1814.        LSR                      ; 2
  1815.        BCS    .noSelect         ; 2
  1816.        DEC    gameDelay         ; 5             SELECT was pressed
  1817.        BPL    .skipSelect       ; 2
  1818.        LDA    gameVariation     ; 3             toggle game (one or two player)
  1819.        EOR    #$01              ; 2
  1820.        STA    gameVariation     ; 3
  1821.   IF SCREENSAVER
  1822.        STA    SS_Delay          ; 3
  1823.   ELSE
  1824.        FILL_NOP 2
  1825.   ENDIF
  1826.        STA    player            ; 3
  1827.        ASL                      ; 2
  1828.        ASL                      ; 2
  1829.        ASL                      ; 2
  1830.        ADC    #DIGIT_H          ; 2
  1831.        JSR    SetScorePtrs      ; 6
  1832.        JSR    FinishGame        ; 6
  1833.        LDY    #$1E              ; 2
  1834. .noSelect:
  1835.        STY    gameDelay         ; 3
  1836.  
  1837. .skipSelect:
  1838.        LDA    gameMode          ; 3
  1839.        BMI    .mainLoopJmp      ; 2
  1840.        CMP    #INTRO_SCROLL     ; 2             scrolling into game
  1841.        BNE    .setBlockVars     ; 2              no, generate new blocks
  1842.        LDA    #<JetStraight-1   ; 2              yes, set..
  1843.        STA    shapePtr0         ; 3              ..jet data pointer..
  1844. .mainLoopJmp:
  1845.        JMP    MainLoop          ; 3              .. and continue with main loop
  1846.  
  1847. ; check, if a new block is neccessary:
  1848. .setBlockVars:
  1849.        LDA    #3-1              ; 2             add speedY*3 to blockOffset -> max. speed = 3 lines/frame
  1850.        STA    blockNum          ; 3
  1851. .loopNext:
  1852.        DEC    blockNum          ; 5
  1853.        BMI    .mainLoopJmp      ; 2
  1854.        LDA    speedY            ; 3
  1855.        CMP    #$FE              ; 2             maximum speed?
  1856.        BCS    .incOffset        ; 2              yes, increase offset
  1857.        ADC    posYLo            ; 3
  1858.        STA    posYLo            ; 3
  1859.        BCC    .loopNext         ; 2
  1860. .incOffset:
  1861.        INC    blockOffset       ; 5
  1862.        LDA    blockOffset       ; 3
  1863.        CMP    #BLOCK_SIZE       ; 2
  1864.        BCC    .loopNext         ; 2
  1865.  
  1866. ; *** it#s time to create a new block: ***
  1867.        LDX    #0                ; 2
  1868.        STX    blockOffset       ; 3
  1869.        LDY    #NUM_BLOCKS       ; 2
  1870.        STY    temp              ; 3             move 6 blocks
  1871.        LDA    level             ; 3
  1872.        CMP    #5                ; 2             first four levels?
  1873.        BCC    .firstLevels      ; 2              yes, prevent small valley
  1874.        LDY    #0                ; 2              no, allow all widths of valley
  1875. .firstLevels:
  1876.        STY    valleyWidth       ; 3             0 = all widths allowed, 6 = limited widths
  1877.  
  1878. ; first move the other blocks, to make space for the new one:
  1879. .loopBlocks:                    ;
  1880.        LDY    #5                ; 2             move 5 bytes
  1881. .loopMoveBlock:
  1882.        LDA    blockLst+1,X      ; 4
  1883.        STA    blockLst,X        ; 4
  1884.        INX                      ; 2
  1885.        DEY                      ; 2
  1886.        BNE    .loopMoveBlock    ; 2
  1887.        INX                      ; 2             skip one entry
  1888.        DEC    temp              ; 5
  1889.        BNE    .loopBlocks       ; 2
  1890.  
  1891.        STY    State1LstEnd      ; 3             y=0!
  1892.        LDA    blockLstEnd       ; 3             clear variable (except PF_COLOR_FLAG)
  1893.        AND    #PF_COLOR_FLAG    ; 2
  1894.        STA    blockLstEnd       ; 3
  1895.        LDX    PF1PatId          ; 3             copy previous PF pattern id
  1896.        STX    prevPF1PatId      ; 3
  1897.  
  1898.        DEC    blockPart         ; 5             second part of block?
  1899.        BEQ    .nextBlock        ; 2              yes, next block
  1900.        LDX    sectionBlock      ; 3
  1901.        DEX                      ; 2             first part of last block of section?
  1902.        BNE    .notLast          ; 2              no, continue part
  1903.  
  1904. ; the last block of a section has to be a road with bridge:
  1905.        STX    sectionEnd        ; 3              yes, end of current section
  1906.        LDA    level             ; 3
  1907.        LSR                      ; 2             straight current level?
  1908.        LDA    #PF_ROAD_FLAG     ; 2
  1909.        BCS    .isStraight       ; 2              yes, dark green in NEXT level
  1910.        LDA    #PF_ROAD_FLAG|PF_COLOR_FLAG; 2     no, lighter green in NEXT level
  1911. .isStraight:
  1912.        STA    blockLstEnd       ; 3
  1913. .notLast:
  1914.        JSR    NextRandom16      ; 6             new random number for next part of block
  1915.        JMP    .nextBlockPart    ; 3
  1916.  
  1917. ; continue with a 'normal' block:
  1918. .nextBlock:
  1919.        DEC    sectionBlock      ; 5             last block of section?
  1920.        BNE    .contSection      ; 2              no, continue
  1921.        JSR    SaveSection       ; 6              yes, save variables..
  1922.        LDX    #SECTION_BLOCKS   ; 2              ..and got next level
  1923.        STX    sectionBlock      ; 3
  1924. .contSection:
  1925.        JSR    NextRandom16      ; 6             new random number for next block
  1926.        LDX    sectionBlock      ; 3
  1927.        DEX                      ; 2             last block of section?
  1928.        BNE    .notLastBlock     ; 2              no, skip
  1929.        STX    PF_State          ; 3              yes, PF-State = static
  1930.        LDA    #12               ; 2              pattern-id for last block (with bridge)
  1931.        BNE    .setPF1Id         ; 3
  1932.  
  1933. .notLastBlock:
  1934.        LDA    level             ; 3
  1935.        LSR                      ; 2             straight level?
  1936.        LDA    #7                ; 2             pattern-id for straight block
  1937.        BCS    .setPF1Id         ; 2              yes, set
  1938.        LDA    PF_State          ; 3
  1939.        DEX                      ; 2             last but one block of section?
  1940.        BNE    .notLastButOne    ; 2              no, skip
  1941.  
  1942. ; finish island before end of section:
  1943.        CMP    #ISLAND_FLAG|CHANGE_FLAG; 2       both flags set?
  1944.        BEQ    .isSetBoth        ; 2              yes, 11 -> 10 (1. step to finish island)
  1945.        BNE    .clearBoth        ; 3              no, static PF and no island (2. step to finish island)
  1946.  
  1947. ; change PF_State bits 7 & 6:
  1948. ; 00 -> 01/00     static -> changing or static
  1949. ; 01 -> 11        changing ->  island & changing
  1950. ; 10 -> 00        island & static -> static (JTZ: ???)
  1951. ; 11 -> 10/11     island & changing -> island & changing or static
  1952. .notLastButOne:
  1953.        ASL                      ; 2
  1954.        EOR    PF_State          ; 3             CHANGE_FLAG != ISLAND_FLAG?
  1955.        BMI    .updateFlags      ; 2              yes, change flags
  1956.        LDA    randomLo          ; 3             randomly change state?
  1957.        AND    #%00110000        ; 2
  1958.        BNE    .skipFlags        ; 2              no, don't change state (75%)
  1959. .isSetBoth:
  1960.        LDA    PF_State          ; 3
  1961.        AND    #ISLAND_FLAG      ; 2             ISLAND_FLAG set?
  1962.        BNE    .isIsland         ; 2              yes, clear CHANGE_FLAG
  1963.        ORA    #CHANGE_FLAG      ; 2              no, set CHANGE_FLAG
  1964. .isIsland:
  1965.        STA    PF_State          ; 3
  1966.        LDA    #0                ; 2
  1967.        BEQ    .setPF1Id         ; 3
  1968.  
  1969. .updateFlags:
  1970. ; change flags: 01 -> 11, 10 -> 00
  1971.        LDA    #ISLAND_FLAG|CHANGE_FLAG; 2
  1972.        BIT    PF_State          ; 3             CHANGE_FLAG set?
  1973.        BVS    .setBoth          ; 2              yes, set ISLAND_FLAG
  1974. .clearBoth:
  1975.        LDA    #0                ; 2              no, clear both flags
  1976. .setBoth:
  1977.        STA    PF_State          ; 3
  1978. .skipFlags:
  1979.  
  1980. ; create new random PF id:
  1981. ; (JTZ: I'm not 100% sure, that I understand everything completely)
  1982.        LDY    #14               ; 2             y = 14
  1983.        LDA    randomLo          ; 3
  1984.        AND    #$0F              ; 2
  1985.        CMP    #2                ; 2
  1986.        BCS    .minOk            ; 2
  1987.        ADC    #2                ; 2             minimum = 2
  1988. .minOk:                         ;               a = 2..15
  1989.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  1990.        BPL    .skipDey          ; 2              no, skip
  1991.        DEY                      ; 2             y = 13
  1992. .skipDey:
  1993.        LDX    valleyWidth       ; 3             all widths allowed?
  1994.        BEQ    .allWidths        ; 2              yes, skip limit
  1995.        LDY    #8                ; 2             y = 8
  1996. .allWidths:
  1997.        STY    temp              ; 3             save max. allowed id
  1998.        CMP    temp              ; 3             random id < max. id?
  1999.        BCC    .setPF1Id         ; 2              yes, skip
  2000.        LDA    temp              ; 3              no, use max. id
  2001. .setPF1Id:
  2002.        STA    PF1PatId          ; 3             a = 2..8 or 2..13/14
  2003.        LDY    #BLOCK_PARTS      ; 2             reset blockPart
  2004.        STY    blockPart         ; 3
  2005.  
  2006. .nextBlockPart:
  2007.        LDA    prevPF1PatId      ; 3
  2008.        TAX                      ; 2
  2009.        SEC                      ; 2
  2010.        SBC    PF1PatId          ; 3
  2011.        STA    diffPF            ; 3             store the difference between the two blocks
  2012.        BCS    .biggerPrev       ; 2
  2013. ; new id is bigger:
  2014.        INC    diffPF            ; 5
  2015.        CPX    #SWITCH_PAGE_ID-1 ; 2
  2016.        LDX    PF1PatId          ; 3
  2017.        BCS    .prevBigId        ; 2
  2018.        CPX    #SWITCH_PAGE_ID   ; 2
  2019.        BCC    .page1Id          ; 2
  2020.        LDA    #-1               ; 2
  2021.        ADC    prevPF1PatId      ; 3             CF=1! (JTZ: what's that good for?)
  2022.        BPL    .prevId           ; 3
  2023.  
  2024. ; old id is bigger or equal:
  2025. .biggerPrev:
  2026.        BEQ    .equalId          ; 2
  2027.        DEC    diffPF            ; 5             -1
  2028. .equalId:
  2029.        CPX    #SWITCH_PAGE_ID   ; 2
  2030.        BCS    .page0Id          ; 2
  2031. ; not enough space for an island:
  2032. .page1Id:
  2033.        JSR    GetPageFlag       ; 6
  2034.        JSR    LoadPFPattern     ; 6             a = 0/1
  2035.        STA    PF1LstEnd         ; 3
  2036.        LDA    #0                ; 2
  2037.        STA    PF2LstEnd         ; 3
  2038.        BEQ    .contPage1        ; 3
  2039.  
  2040. ; enough space for an island in previous block:
  2041. .page0Id:
  2042.        LDA    PF1PatId          ; 3
  2043.        CMP    #SWITCH_PAGE_ID-1 ; 2
  2044.        BCS    .prevBigId        ; 2
  2045. ; enough space for an island in both blocks:
  2046.        LDA    #14+1             ; 2
  2047.        SBC    PF1PatId          ; 3             CF=0!
  2048.        BCS    .prevId           ; 3             negate id (inverts pattern)
  2049.  
  2050. .prevBigId:
  2051.        LDA    #PF1_PAGE_FLAG|PF2_PAGE_FLAG|PF_COLOR_FLAG; 2
  2052. .prevId:
  2053.        STA    PF1LstEnd         ; 3
  2054.        JSR    GetPageFlag       ; 6
  2055.        SEC                      ; 2
  2056.        ROL                      ; 2
  2057.        JSR    LoadPFPattern     ; 6             a = 1/3
  2058. .contPage1:
  2059.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  2060.        BPL    .skipSwapPF       ; 2              no, don't swap
  2061.        LDA    PF1LstEnd         ; 3
  2062.        LDX    PF2LstEnd         ; 3
  2063.        STA    PF2LstEnd         ; 3
  2064.        STX    PF1LstEnd         ; 3
  2065. .skipSwapPF:
  2066.        BIT    blockLstEnd       ; 3             PF_ROAD_FLAG set?
  2067.        BPL    .skipRoad         ; 2              no, skip
  2068.        LDA    #QUAD_SIZE        ; 2              yes, create road block
  2069.        STA    State1LstEnd      ; 3             quad size bridge
  2070.        LDY    #ID_BRIDGE        ; 2
  2071.        LDA    #63               ; 2             x-position
  2072.        JMP    .endNewShape      ; 3
  2073.  
  2074. .skipRoad:
  2075. ; *** create new objects: ***
  2076.        LDY    #ID_FUEL          ; 2
  2077.        LDA    sectionBlock      ; 3
  2078.        CLC                      ; 2
  2079.        ADC    blockPart         ; 3
  2080.        CMP    #SECTION_BLOCKS+BLOCK_PARTS; 2    no enemies at first part of first block of section
  2081.        BCS    .newHouse         ; 2
  2082. ; create more enemies and less fuel in higher difficulty levels:
  2083.        LDA    #64               ; 2
  2084.        SBC    level             ; 3             1..48 (CF=0!)
  2085.        ASL                      ; 2             a = 124..30
  2086.        CMP    randomHi          ; 3
  2087.        BCC    .newEnemy         ; 2             ~48%..88% -> more enemies, less fuel and houses
  2088.        BIT    randomLo          ; 3
  2089.        BVC    .newFuel          ; 2             ~24%.. 6% -> less fuel
  2090. ; no enemy or fuel, create new house instead:
  2091. .newHouse:
  2092.        DEY                      ; 2             y=ID_HOUSE
  2093.        LDX    PF1PatId          ; 3
  2094.        CPX    prevPF1PatId      ; 3
  2095.        BCC    .currentSmaller   ; 2
  2096.        LDX    prevPF1PatId      ; 3
  2097. .currentSmaller:                ;               x = smaller id
  2098.        LDA    #DOUBLE_SIZE      ; 2             house is double sized
  2099.        STA    State1LstEnd      ; 3
  2100.        LDA    level             ; 3
  2101.        LSR                      ; 2
  2102.        BCC    .notStraight      ; 2
  2103. ; create random x-position for house in straight section:
  2104.        LDA    randomLo          ; 3
  2105.        AND    #$1F              ; 2
  2106.        ADC    #8                ; 2
  2107.        CMP    #25               ; 2             random position fits in left bank?
  2108.        BCC    .setShapeDir      ; 2              yes, ok
  2109.        ADC    #92               ; 2              no, position house on right bank
  2110.        BNE    .setShapeDir      ; 3
  2111.  
  2112. ; position house in non-straight section:
  2113. .notStraight:
  2114.        LDA    ShapePosTab,X     ; 4             x-pos based on PF1 id
  2115.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  2116.        BPL    .setShapeDir      ; 2              no, skip
  2117.        CPX    #0                ; 2             PF id = 0?
  2118.        BEQ    .setShapeDir      ; 2              no, skip
  2119.        LDA    #71               ; 2             fixed position for a house on island
  2120.        BNE    .setShapeDir      ; 3
  2121.  
  2122. ; create new ship, helicopter or plane:
  2123. .newEnemy:
  2124.        LDA    #%111             ; 2
  2125.        LDX    level             ; 3
  2126.        CPX    #3                ; 2             enemy planes start at level three
  2127.        BCS    .withPlanes       ; 2
  2128.        LDA    #%001             ; 2             limit first levels to ship and helicopter
  2129. .withPlanes:
  2130.        AND    randomHi          ; 3             create random enemy object
  2131.        TAX                      ; 2
  2132.        LDY    EnemyIdTab,X      ; 4
  2133. .newFuel:
  2134.        CPY    #ID_SHIP          ; 2
  2135.        BNE    .noShip           ; 2
  2136.        LDA    #DOUBLE_SIZE      ; 2             doublesize
  2137.        STA    State1LstEnd      ; 3
  2138. .noShip:
  2139.        LDA    PF1PatId          ; 3
  2140.        CMP    prevPF1PatId      ; 3             new pat-id = previous pat-id?
  2141.        BNE    .newId            ; 2              no,
  2142. ; position object in straight blocks:
  2143.        STA    maxId             ; 3
  2144.        LDA    level             ; 3
  2145.        LSR                      ; 2
  2146.        BCC    .notStraight2     ; 2
  2147. ; position object in straight section:
  2148.        LDA    #106              ; 2
  2149.        LDX    State1LstEnd      ; 3             ship? (doublesize)
  2150.        BEQ    .isShip           ; 2              yes, position more right
  2151.        LDA    #97               ; 2              no, position more left
  2152. .isShip:
  2153.        SBC    valleyWidth       ; 3             decrease maximum position (-6) in first four levels,
  2154.                                 ;                this avoids positioning near the river bank
  2155.        STA    temp              ; 3             store maximum position
  2156.        LDA    randomLo          ; 3
  2157.        AND    #$3F              ; 2
  2158.        ADC    #45               ; 2
  2159.        ADC    valleyWidth       ; 3             increase random position in first four levels (s.a.)
  2160.        CMP    temp              ; 3             random position < maximum?
  2161.        BCC    .setShapeDir      ; 2              yes, ok
  2162.        LDA    temp              ; 3              no, position = maximum
  2163. .setShapeDir:
  2164. ; make random direction for new shape:
  2165.        BIT    randomLo          ; 3
  2166.        BMI    .invertDirection  ; 2
  2167.        BPL    .endNewShape      ; 3
  2168.  
  2169. .newId:
  2170.        BCS    .currentBigger    ; 2
  2171.        LDA    prevPF1PatId      ; 3
  2172. .currentBigger:
  2173.        STA    maxId             ; 3             maxId cointains max(prevId, newId)
  2174.  
  2175. ; position object in non-straight section:
  2176. .notStraight2:
  2177. ; check, if there is enough space for new object:
  2178.        LDX    #13               ; 2             PF id
  2179.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  2180.        BPL    .contPage12       ; 2              no, skip
  2181.        LDX    #10               ; 2              yes, lower PF id
  2182. .contPage12:
  2183.        CPX    maxId             ; 3
  2184.        BCS    .spaceOk          ; 2
  2185.        TYA                      ; 2
  2186.        SBC    #ID_SHIP-1        ; 2             new enemy is a ship?
  2187.        BNE    .spaceOk          ; 2              no, skip
  2188.        STA    State1LstEnd      ; 3              yes, change..
  2189.        DEY                      ; 2              ..ship into helicopter
  2190. .spaceOk:
  2191.        LDA    maxId             ; 3
  2192.        ASL                      ; 2
  2193.        ASL                      ; 2
  2194.        BEQ    .posSomewhere     ; 2
  2195.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  2196.        BPL    .posSomewhere     ; 2              no, position somewhere
  2197. ; position object outside:
  2198.        EOR    #$FF              ; 2
  2199.        ADC    #81               ; 2
  2200.        BIT    randomLo          ; 3
  2201.        BPL    .skipNeg          ; 2
  2202.        EOR    #$FF              ; 2
  2203.        ADC    #160              ; 2
  2204.        BNE    .contPos          ; 3
  2205.  
  2206. ; position object somewhere:
  2207. .posSomewhere:
  2208.        ADC    #16               ; 2
  2209.        BIT    randomLo          ; 3
  2210.        BMI    .doNeg            ; 2
  2211. .contPos:
  2212.        CLC                      ; 2
  2213.        ADC    #2                ; 2
  2214.        ADC    valleyWidth       ; 3             keep space to river bank in first levels
  2215.        BNE    .endNewShape      ; 3
  2216.  
  2217. .doNeg:
  2218.        EOR    #$FF              ; 2
  2219.        ADC    #160+1            ; 2
  2220. .skipNeg:
  2221.        CPY    #ID_FUEL          ; 2             position fuel 1 pixel more right
  2222.        SBC    #9                ; 2
  2223.        SBC    valleyWidth       ; 3             keep space to river bank in first levels
  2224.        LDX    State1LstEnd      ; 3             double sized object? (ship, house)
  2225.        BEQ    .invertDirection  ; 2              no, skip
  2226.        SBC    #10               ; 2              yes, move 10 pixels left
  2227. .invertDirection:
  2228.        CPY    #ID_FUEL          ; 2             fuel?
  2229.        BEQ    .endNewShape      ; 2              yes, has constant direction
  2230.        PHA                      ; 3
  2231.        LDA    State1LstEnd      ; 3
  2232.        ORA    #DIRECTION_FLAG   ; 2             set direction flag
  2233.        STA    State1LstEnd      ; 3
  2234.        PLA                      ; 4
  2235. .endNewShape:
  2236.        STY    Shape1IdLstEnd    ; 3             save id of new object
  2237.        JSR    CalcPosX          ; 6
  2238.        STY    XPos1LstEnd       ; 3             save coarse x-positioning value
  2239.        ORA    State1LstEnd      ; 3
  2240.        STA    State1LstEnd      ; 3             save fine x-positioning value
  2241.        JMP    .loopNext         ; 3
  2242.  
  2243. ; ****************************** end of main loop ******************************
  2244.  
  2245.  
  2246. GameInit SUBROUTINE
  2247. ; Input: x (= 22/38, number of initialized variables)
  2248. ; initializes some variables for new game:
  2249. .initLoop:
  2250.        LDA    InitTab,X         ; 4
  2251.        STA    PF1Lst,X          ; 4
  2252.        DEX                      ; 2
  2253.        BPL    .initLoop         ; 2
  2254.  
  2255. ; clear some variables for new game:
  2256.        LDA    #0                ; 2
  2257.        LDX    #30               ; 2
  2258. .loopClear:
  2259.        STA    dXSpeed,X         ; 4
  2260.        DEX                      ; 2
  2261.        BPL    .loopClear        ; 2
  2262.  
  2263.        LDX    #NUM_BLOCKS-1     ; 2
  2264.        LDY    #PF1_PAGE_FLAG    ; 2
  2265.        LDA    level             ; 3
  2266.        LSR                      ; 2             straight level?
  2267.        BCC    .loopSet          ; 2              no, skip
  2268.        LDY    #PF1_PAGE_FLAG|PF_COLOR_FLAG; 2    yes, set brighter green in current level
  2269. .loopSet:
  2270.        STY    blockLst,X        ; 4
  2271.        DEX                      ; 2
  2272.        BPL    .loopSet          ; 2
  2273.        RTS                      ; 6
  2274.  
  2275.   IF NTSC
  2276. LoadPFPattern SUBROUTINE
  2277.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  2278.        BPL    .contPage1        ; 2              no, set current page-flag
  2279.        TAY                      ; 2              yes, read new page-flag from table
  2280.        LDA    PageFlagTab,Y     ; 4
  2281. .contPage1:
  2282.        ORA    blockLstEnd       ; 3
  2283.        STA    blockLstEnd       ; 3
  2284.        LDA    BankPtrTab,X      ; 4             load a pattern for the river bank
  2285.        CLC                      ; 2
  2286.        ADC    diffPF            ; 3             adjust with difference between new and prev PF id
  2287.        STA    PF2LstEnd         ; 3
  2288.        RTS                      ; 6
  2289.   ELSE
  2290. FinishDigits SUBROUTINE
  2291.        INY                      ; 2
  2292.        STA    WSYNC             ; 3
  2293.        STA    HMOVE             ; 3
  2294.        STY    GRP1              ; 3
  2295.        STY    GRP0              ; 3
  2296.        STY    GRP1              ; 3
  2297.        LDY    #14               ; 2             load line counter
  2298. SetColPx:
  2299.        STA    COLUP0            ; 3
  2300.        STA    COLUP1            ; 3
  2301. DoHMove:
  2302.        STA    WSYNC             ; 3
  2303.        STA    HMOVE             ; 3
  2304.        RTS                      ; 6
  2305.   ENDIF
  2306.  
  2307. NextRandom16 SUBROUTINE
  2308. ; implements a 16 bit LFSR which generates a new random number:
  2309.        LDA    randomHi          ; 3
  2310.        ASL                      ; 2
  2311.        ASL                      ; 2
  2312.        ASL                      ; 2
  2313.        EOR    randomHi          ; 3
  2314.        ASL                      ; 2
  2315.        ROL    randomLo          ; 5
  2316.        ROL    randomHi          ; 5
  2317. ; (JTZ: randomHi is very random, randomLo is NOT when more than one bit is used,
  2318. ; because: randomLo[x+1] = randomLo[x]*2 + 0/1, but randomLo is used more often,
  2319. ; randomHi only for new enemy and which. This could make the game a bit predictable.)
  2320.        RTS                      ; 6
  2321.  
  2322. SaveSection SUBROUTINE
  2323. ; called at the start of a new section, increases difficulty level
  2324. ;  and saves random variables to be able to restart this section
  2325.        LDX    level             ; 3             limit level to 48
  2326.        CPX    #MAX_LEVEL        ; 2
  2327.        BCC    .notMax           ; 2
  2328.        LDX    #MAX_LEVEL-2      ; 2              go back to 47
  2329. .notMax:
  2330.        LDA    randomLoSave      ; 3
  2331.        STA    randomLoSave2     ; 3
  2332.        LDA    randomHiSave      ; 3
  2333.        STA    randomHiSave2     ; 3
  2334.        LDA    randomLo          ; 3
  2335.        STA    randomLoSave      ; 3
  2336.        LDA    randomHi          ; 3
  2337.        STA    randomHiSave      ; 3
  2338.        INX                      ; 2
  2339.        STX    level             ; 3             1..48
  2340.        RTS                      ; 6
  2341.  
  2342. SetPosX SUBROUTINE
  2343. ; calculates the values and positions objects:
  2344.        JSR    CalcPosX          ; 6
  2345. SetPosX2:
  2346.        STA    HMP0,X            ; 4
  2347.        INY                      ; 2
  2348.        INY                      ; 2
  2349.        INY                      ; 2
  2350.        STA    WSYNC             ; 3
  2351. .waitPos:
  2352.        DEY                      ; 2
  2353.        BPL    .waitPos          ; 2
  2354.        STA    RESP0,X           ; 4
  2355.        RTS                      ; 6
  2356.  
  2357.  
  2358. ;===============================================================================
  2359. ; R O M - T A B L E S (Part 1)
  2360. ;===============================================================================
  2361.  
  2362.        align 256
  2363.  
  2364. Zero:
  2365.        .byte $3C ; |  XXXX  | $FB00
  2366.        .byte $66 ; | XX  XX |
  2367.        .byte $66 ; | XX  XX |
  2368.        .byte $66 ; | XX  XX |
  2369.        .byte $66 ; | XX  XX |
  2370.        .byte $66 ; | XX  XX |
  2371.        .byte $66 ; | XX  XX |
  2372.        .byte $3C ; |  XXXX  |
  2373. One:
  2374.        .byte $3C ; |  XXXX  |
  2375.        .byte $18 ; |   XX   |
  2376.        .byte $18 ; |   XX   |
  2377.        .byte $18 ; |   XX   |
  2378.        .byte $18 ; |   XX   |
  2379.        .byte $18 ; |   XX   |
  2380.        .byte $38 ; |  XXX   |
  2381.        .byte $18 ; |   XX   |
  2382. Two:
  2383.        .byte $7E ; | XXXXXX |
  2384.        .byte $60 ; | XX     |
  2385.        .byte $60 ; | XX     |
  2386.        .byte $3C ; |  XXXX  |
  2387.        .byte $06 ; |     XX |
  2388.        .byte $06 ; |     XX |
  2389.        .byte $46 ; | X   XX |
  2390.        .byte $3C ; |  XXXX  |
  2391. Three:
  2392.        .byte $3C ; |  XXXX  |
  2393.        .byte $46 ; | X   XX |
  2394.        .byte $06 ; |     XX |
  2395.        .byte $0C ; |    XX  |
  2396.        .byte $0C ; |    XX  |
  2397.        .byte $06 ; |     XX |
  2398.        .byte $46 ; | X   XX |
  2399.        .byte $3C ; |  XXXX  |
  2400. Four:
  2401.        .byte $0C ; |    XX  |
  2402.        .byte $0C ; |    XX  |
  2403.        .byte $0C ; |    XX  |
  2404.        .byte $7E ; | XXXXXX |
  2405.        .byte $4C ; | X  XX  |
  2406.        .byte $2C ; |  X XX  |
  2407.        .byte $1C ; |   XXX  |
  2408.        .byte $0C ; |    XX  |
  2409. Five:
  2410.        .byte $7C ; | XXXXX  |
  2411.        .byte $46 ; | X   XX |
  2412.        .byte $06 ; |     XX |
  2413.        .byte $06 ; |     XX |
  2414.        .byte $7C ; | XXXXX  |
  2415.        .byte $60 ; | XX     |
  2416.        .byte $60 ; | XX     |
  2417.        .byte $7E ; | XXXXXX |
  2418. Six:
  2419.        .byte $3C ; |  XXXX  |
  2420.        .byte $66 ; | XX  XX |
  2421.        .byte $66 ; | XX  XX |
  2422.        .byte $66 ; | XX  XX |
  2423.        .byte $7C ; | XXXXX  |
  2424.        .byte $60 ; | XX     |
  2425.        .byte $62 ; | XX   X |
  2426.        .byte $3C ; |  XXXX  |
  2427. Seven:
  2428.        .byte $18 ; |   XX   |
  2429.        .byte $18 ; |   XX   |
  2430.        .byte $18 ; |   XX   |
  2431.        .byte $18 ; |   XX   |
  2432.        .byte $0C ; |    XX  |
  2433.        .byte $06 ; |     XX |
  2434.        .byte $42 ; | X    X |
  2435.        .byte $7E ; | XXXXXX |
  2436. Eight:
  2437.        .byte $3C ; |  XXXX  |
  2438.        .byte $66 ; | XX  XX |
  2439.        .byte $66 ; | XX  XX |
  2440.        .byte $3C ; |  XXXX  |
  2441.        .byte $3C ; |  XXXX  |
  2442.        .byte $66 ; | XX  XX |
  2443.        .byte $66 ; | XX  XX |
  2444.        .byte $3C ; |  XXXX  |
  2445. Nine:
  2446.        .byte $3C ; |  XXXX  |
  2447.        .byte $46 ; | X   XX |
  2448.        .byte $06 ; |     XX |
  2449.        .byte $3E ; |  XXXXX |
  2450.        .byte $66 ; | XX  XX |
  2451.        .byte $66 ; | XX  XX |
  2452.        .byte $66 ; | XX  XX |
  2453.        .byte $3C ; |  XXXX  |
  2454. MaxOut:
  2455.        .byte $18 ; |   XX   |
  2456.        .byte $18 ; |   XX   |
  2457.        .byte $00 ; |        |
  2458.        .byte $18 ; |   XX   |
  2459.        .byte $18 ; |   XX   |
  2460.        .byte $18 ; |   XX   |
  2461.        .byte $18 ; |   XX   |
  2462.        .byte $18 ; |   XX   |
  2463. Space:
  2464.        .byte $00 ; |        |
  2465. Copyright0:
  2466.        .byte $00 ; |        |
  2467.        .byte $00 ; |        |
  2468.        .byte $00 ; |        |
  2469.        .byte $00 ; |        |
  2470.        .byte $00 ; |        |
  2471.        .byte $00 ; |        |
  2472.        .byte $00 ; |        |
  2473.        .byte $00 ; |        |
  2474.        .byte $00 ; |        |
  2475.        .byte $F7 ; |XXXX XXX|
  2476.        .byte $95 ; |X  X X X|
  2477.        .byte $87 ; |X    XXX|
  2478.        .byte $80 ; |X       |
  2479.        .byte $90 ; |X  X    |
  2480.        .byte $F0 ; |XXXX    |
  2481. Copyright1:
  2482.        .byte $00 ; |        |
  2483.        .byte $00 ; |        |
  2484.        .byte $00 ; |        |
  2485.        .byte $00 ; |        |
  2486.        .byte $00 ; |        |
  2487.        .byte $00 ; |        |
  2488.        .byte $00 ; |        |
  2489.        .byte $00 ; |        |
  2490.        .byte $47 ; | X   XXX|
  2491.        .byte $41 ; | X     X|
  2492.        .byte $77 ; | XXX XXX|
  2493.        .byte $55 ; | X X X X|
  2494.        .byte $75 ; | XXX X X|
  2495.        .byte $00 ; |        |
  2496.        .byte $00 ; |        |
  2497.        .byte $00 ; |        |
  2498. Copyright2:
  2499.        .byte $AD ; |X X XX X|
  2500.        .byte $A9 ; |X X X  X|
  2501.        .byte $E9 ; |XXX X  X|
  2502.        .byte $A9 ; |X X X  X|
  2503.        .byte $ED ; |XXX XX X|
  2504.        .byte $41 ; | X     X|
  2505.        .byte $0F ; |    XXXX|
  2506.        .byte $00 ; |        |
  2507.        .byte $03 ; |      XX|
  2508.        .byte $00 ; |        |
  2509.        .byte $4B ; | X  X XX|
  2510.        .byte $4A ; | X  X X |
  2511.        .byte $6B ; | XX X XX|
  2512.        .byte $00 ; |        |
  2513.        .byte $08 ; |    X   |
  2514.        .byte $00 ; |        |
  2515. Copyright3:
  2516.        .byte $50 ; | X X    |
  2517.        .byte $58 ; | X XX   |
  2518.        .byte $5C ; | X XXX  |
  2519.        .byte $56 ; | X X XX |
  2520.        .byte $53 ; | X X  XX|
  2521.        .byte $11 ; |   X   X|
  2522.        .byte $F0 ; |XXXX    |
  2523.        .byte $00 ; |        |
  2524.        .byte $80 ; |X       |
  2525.        .byte $80 ; |X       |
  2526.        .byte $AA ; |X X X X |
  2527.        .byte $AA ; |X X X X |
  2528.        .byte $BA ; |X XXX X |
  2529.        .byte $22 ; |  X   X |
  2530.        .byte $27 ; |  X  XXX|
  2531.        .byte $02 ; |      X |
  2532. Copyright4:
  2533.        .byte $BA ; |X XXX X |
  2534.        .byte $8A ; |X   X X |
  2535.        .byte $BA ; |X XXX X |
  2536.        .byte $A2 ; |X X   X |
  2537.        .byte $3A ; |  XXX X |
  2538.        .byte $80 ; |X       |
  2539.        .byte $FE ; |XXXXXXX |
  2540.        .byte $00 ; |        |
  2541.        .byte $00 ; |        |
  2542.        .byte $00 ; |        |
  2543.        .byte $11 ; |   X   X|
  2544.        .byte $11 ; |   X   X|
  2545.        .byte $17 ; |   X XXX|
  2546.        .byte $15 ; |   X X X|
  2547.        .byte $17 ; |   X XXX|
  2548.        .byte $00 ; |        |
  2549. Copyright5:
  2550.        .byte $E9 ; |XXX X  X|
  2551.        .byte $AB ; |X X X XX|
  2552.        .byte $AF ; |X X XXXX|
  2553.        .byte $AD ; |X X XX X|
  2554.        .byte $E9 ; |XXX X  X|
  2555.        .byte $00 ; |        |
  2556.        .byte $00 ; |        |
  2557.        .byte $00 ; |        |
  2558.        .byte $00 ; |        |
  2559.        .byte $00 ; |        |
  2560.        .byte $77 ; | XXX XXX|
  2561.        .byte $54 ; | X X X  |
  2562.        .byte $77 ; | XXX XXX|
  2563.        .byte $51 ; | X X   X|
  2564.        .byte $77 ; | XXX XXX|
  2565.  
  2566. PageFlagTab:
  2567.        .byte 0, PF2_PAGE_FLAG, PF1_PAGE_FLAG, PF1_PAGE_FLAG|PF2_PAGE_FLAG       ; PF1_PAGE_FLAG unused!
  2568. shapePtr1bTab:
  2569.        .byte <Explosion0-1, <Explosion1B-1, <Explosion2B-1, <Explosion1B-1
  2570.        .byte <PlaneB-1, <Heli0B-1, <Heli1B-1, <ShipB-1, <BridgeB-1, <HouseB-1, <FuelB-1
  2571.  
  2572. ; x-positions of new object:
  2573. ShapePosTab:
  2574.        .byte 143, 141, 7, 10, 132, 13, 128, 18, 124, 22, 120, 26, 116, 30, 112
  2575.  
  2576.  
  2577. ;===============================================================================
  2578. ; R O M - C O D E (Part 2)
  2579. ;===============================================================================
  2580.  
  2581. SetPFxPtr SUBROUTINE
  2582. ; called from kernel, sets pointers for new playfield data:
  2583.        LDA    PF1Lst,X          ; 4
  2584.        STA    PF1Ptr            ; 3
  2585.        LDA    blockLst,X        ; 4
  2586.        AND    #PF1_PAGE_FLAG    ; 2
  2587.        ORA    #>PFPat0          ; 2
  2588.        STA    PF1Ptr+1          ; 3
  2589.  
  2590.        LDA    PF2Lst,X          ; 4
  2591.        STA    PF2Ptr            ; 3
  2592.        LDA    blockLst,X        ; 4
  2593.        LSR                      ; 2
  2594.        AND    #PF2_PAGE_FLAG>>1 ; 2
  2595.        ORA    #>PFPat0          ; 2
  2596.        STA    PF2Ptr+1          ; 3
  2597.        RTS                      ; 6 = 44
  2598.  
  2599.  
  2600. ;===============================================================================
  2601. ; R O M - T A B L E S (Part 2)
  2602. ;===============================================================================
  2603.  
  2604. ; high addresses of entry points into kernel:
  2605. JmpHiTab:
  2606.        .byte >[JmpPoint0-1], >[JmpPoint1-1], >[JmpPoint2-1], >[JmpPoint3-1], >[JmpPoint4-1]
  2607.        .byte >[JmpPoint5-1], >[JmpPoint6-1], >[JmpPoint7-1], >[JmpPoint8-1], >[JmpPoint9-1]
  2608.  
  2609. ; used to animate explosions and helicopter:
  2610. AnimateIdTab:
  2611.        .byte 0                  ;
  2612.        .byte ID_EXPLOSION2      ; start of explosion sequence
  2613.        .byte ID_EXPLOSION3      ;
  2614.        .byte ID_EXPLOSION0      ; end explosion with 0
  2615.        .byte ID_PLANE           ; no animation for plane
  2616.        .byte ID_HELI1           ; switch between..
  2617.        .byte ID_HELI0           ; ..ID_HELI0 and ID_HELI1
  2618.  
  2619. ; these are the patterns, that are used to define the playfield:
  2620. PFPat0:
  2621.        .byte $00 ; |        | $FC00
  2622.        .byte $00 ; |        |
  2623.        .byte $00 ; |        |
  2624.        .byte $00 ; |        |
  2625.        .byte $00 ; |        |
  2626.        .byte $00 ; |        |
  2627.        .byte $00 ; |        |
  2628.        .byte $00 ; |        |
  2629.        .byte $00 ; |        |
  2630.        .byte $00 ; |        |
  2631.        .byte $00 ; |        |
  2632.        .byte $00 ; |        |
  2633.        .byte $00 ; |        |
  2634.        .byte $00 ; |        |
  2635.        .byte $00 ; |        |
  2636.        .byte $00 ; |        |
  2637.        .byte $00 ; |        |
  2638.        .byte $00 ; |        |
  2639.        .byte $00 ; |        |
  2640.        .byte $01 ; |       X|
  2641.        .byte $03 ; |      XX|
  2642.        .byte $07 ; |     XXX|
  2643.        .byte $0F ; |    XXXX|
  2644.        .byte $1F ; |   XXXXX|
  2645. PFPat14:
  2646.        .byte $3F ; |  XXXXXX|
  2647.        .byte $3F ; |  XXXXXX|
  2648.        .byte $3F ; |  XXXXXX|
  2649.        .byte $3F ; |  XXXXXX|
  2650.        .byte $3F ; |  XXXXXX|
  2651.        .byte $3F ; |  XXXXXX|
  2652.        .byte $3F ; |  XXXXXX|
  2653.        .byte $3F ; |  XXXXXX|
  2654.        .byte $3F ; |  XXXXXX|
  2655.        .byte $3F ; |  XXXXXX|
  2656.        .byte $3F ; |  XXXXXX|
  2657.        .byte $3F ; |  XXXXXX|
  2658.        .byte $3F ; |  XXXXXX|
  2659.        .byte $3F ; |  XXXXXX|
  2660.        .byte $3F ; |  XXXXXX|
  2661.        .byte $3F ; |  XXXXXX|
  2662.        .byte $1F ; |   XXXXX|
  2663.        .byte $0F ; |    XXXX|
  2664.        .byte $07 ; |     XXX|
  2665.        .byte $03 ; |      XX|
  2666.        .byte $01 ; |       X|
  2667.        .byte $00 ; |        |
  2668.        .byte $00 ; |        |
  2669.        .byte $00 ; |        |
  2670.        .byte $00 ; |        |
  2671.        .byte $00 ; |        |
  2672.        .byte $00 ; |        |
  2673.        .byte $00 ; |        |
  2674.        .byte $00 ; |        |
  2675.        .byte $01 ; |       X|
  2676.        .byte $03 ; |      XX|
  2677.        .byte $07 ; |     XXX|
  2678.        .byte $0F ; |    XXXX|
  2679. PFPat13:
  2680.        .byte $1F ; |   XXXXX|
  2681.        .byte $1F ; |   XXXXX|
  2682.        .byte $1F ; |   XXXXX|
  2683.        .byte $1F ; |   XXXXX|
  2684.        .byte $1F ; |   XXXXX|
  2685.        .byte $1F ; |   XXXXX|
  2686.        .byte $1F ; |   XXXXX|
  2687.        .byte $1F ; |   XXXXX|
  2688.        .byte $1f ; |   XXXXX|
  2689.        .byte $1F ; |   XXXXX|
  2690.        .byte $1F ; |   XXXXX|
  2691.        .byte $1F ; |   XXXXX|
  2692.        .byte $1F ; |   XXXXX|
  2693.        .byte $1F ; |   XXXXX|
  2694.        .byte $1F ; |   XXXXX|
  2695.        .byte $1F ; |   XXXXX|
  2696.        .byte $0F ; |    XXXX|
  2697.        .byte $07 ; |     XXX|
  2698.        .byte $03 ; |      XX|
  2699.        .byte $01 ; |       X|
  2700.        .byte $00 ; |        |
  2701.        .byte $00 ; |        |
  2702.        .byte $00 ; |        |
  2703.        .byte $00 ; |        |
  2704.        .byte $00 ; |        |
  2705.        .byte $00 ; |        |
  2706.        .byte $00 ; |        |
  2707.        .byte $00 ; |        |
  2708.        .byte $01 ; |       X|
  2709.        .byte $03 ; |      XX|
  2710.        .byte $07 ; |     XXX|
  2711. PFPat12:
  2712.        .byte $0F ; |    XXXX|
  2713.        .byte $0F ; |    XXXX|
  2714.        .byte $0F ; |    XXXX|
  2715.        .byte $0F ; |    XXXX|
  2716.        .byte $0F ; |    XXXX|
  2717.        .byte $0F ; |    XXXX|
  2718.        .byte $0F ; |    XXXX|
  2719.        .byte $0F ; |    XXXX|
  2720.        .byte $0F ; |    XXXX|
  2721.        .byte $0F ; |    XXXX|
  2722.        .byte $0F ; |    XXXX|
  2723.        .byte $0F ; |    XXXX|
  2724.        .byte $0F ; |    XXXX|
  2725.        .byte $0F ; |    XXXX|
  2726.        .byte $0F ; |    XXXX|
  2727.        .byte $0F ; |    XXXX|
  2728.        .byte $07 ; |     XXX|
  2729.        .byte $03 ; |      XX|
  2730.        .byte $01 ; |       X|
  2731.        .byte $00 ; |        |
  2732.        .byte $00 ; |        |
  2733.        .byte $00 ; |        |
  2734.        .byte $00 ; |        |
  2735.        .byte $00 ; |        |
  2736.        .byte $00 ; |        |
  2737.        .byte $00 ; |        |
  2738.        .byte $00 ; |        |
  2739.        .byte $01 ; |       X|
  2740.        .byte $03 ; |      XX|
  2741. PFPat11:
  2742.        .byte $07 ; |     XXX|
  2743.        .byte $07 ; |     XXX|
  2744.        .byte $07 ; |     XXX|
  2745.        .byte $07 ; |     XXX|
  2746.        .byte $07 ; |     XXX|
  2747.        .byte $07 ; |     XXX|
  2748.        .byte $07 ; |     XXX|
  2749.        .byte $07 ; |     XXX|
  2750.        .byte $07 ; |     XXX|
  2751.        .byte $07 ; |     XXX|
  2752.        .byte $07 ; |     XXX|
  2753.        .byte $07 ; |     XXX|
  2754.        .byte $07 ; |     XXX|
  2755.        .byte $07 ; |     XXX|
  2756.        .byte $07 ; |     XXX|
  2757.        .byte $07 ; |     XXX|
  2758.        .byte $03 ; |      XX|
  2759.        .byte $01 ; |       X|
  2760.        .byte $00 ; |        |
  2761.        .byte $00 ; |        |
  2762.        .byte $00 ; |        |
  2763.        .byte $00 ; |        |
  2764.        .byte $00 ; |        |
  2765.        .byte $00 ; |        |
  2766.        .byte $00 ; |        |
  2767.        .byte $00 ; |        |
  2768.        .byte $01 ; |       X|
  2769. PFPat10:
  2770.        .byte $03 ; |      XX|
  2771.        .byte $03 ; |      XX|
  2772.        .byte $03 ; |      XX|
  2773.        .byte $03 ; |      XX|
  2774.        .byte $03 ; |      XX|
  2775.        .byte $03 ; |      XX|
  2776.        .byte $03 ; |      XX|
  2777.        .byte $03 ; |      XX|
  2778.        .byte $03 ; |      XX|
  2779.        .byte $03 ; |      XX|
  2780.        .byte $03 ; |      XX|
  2781.        .byte $03 ; |      XX|
  2782.        .byte $03 ; |      XX|
  2783.        .byte $03 ; |      XX|
  2784.        .byte $03 ; |      XX|
  2785.        .byte $03 ; |      XX|
  2786.        .byte $01 ; |       X|
  2787.        .byte $00 ; |        |
  2788.        .byte $00 ; |        |
  2789.        .byte $00 ; |        |
  2790.        .byte $00 ; |        |
  2791.        .byte $00 ; |        |
  2792.        .byte $00 ; |        |
  2793.        .byte $00 ; |        |
  2794.        .byte $00 ; |        |
  2795. PFPat9:
  2796.        .byte $01 ; |       X|
  2797.        .byte $01 ; |       X|
  2798.        .byte $01 ; |       X|
  2799.        .byte $01 ; |       X|
  2800.        .byte $01 ; |       X|
  2801.        .byte $01 ; |       X|
  2802.        .byte $01 ; |       X|
  2803.        .byte $01 ; |       X|
  2804.        .byte $01 ; |       X|
  2805.        .byte $01 ; |       X|
  2806.        .byte $01 ; |       X|
  2807.        .byte $01 ; |       X|
  2808.        .byte $01 ; |       X|
  2809.        .byte $01 ; |       X|
  2810.        .byte $01 ; |       X|
  2811.        .byte $01 ; |       X|
  2812.        .byte $00 ; |        |
  2813.        .byte $00 ; |        |
  2814.        .byte $00 ; |        |
  2815. JetStraight:
  2816.        .byte $00 ; |        |
  2817.        .byte $00 ; |        |
  2818.        .byte $00 ; |        |
  2819.        .byte $00 ; |        |
  2820.        .byte $00 ; |        |
  2821.        .byte $2A ; |  X X X |
  2822.        .byte $3E ; |  XXXXX |
  2823.        .byte $1C ; |   XXX  |
  2824.        .byte $08 ; |    X   |
  2825.        .byte $49 ; | X  X  X|
  2826.        .byte $6B ; | XX X XX|
  2827.        .byte $7F ; | XXXXXXX|
  2828.        .byte $7F ; | XXXXXXX|
  2829.        .byte $3E ; |  XXXXX |
  2830.        .byte $1C ; |   XXX  |
  2831.        .byte $08 ; |    X   |
  2832.        .byte $08 ; |    X   |
  2833.        .byte $08 ; |    X   |
  2834. JetMove:
  2835.        .byte $00 ; |        |
  2836.        .byte $00 ; |        |
  2837.        .byte $00 ; |        |
  2838.        .byte $00 ; |        |
  2839.        .byte $02 ; |      X |
  2840.        .byte $2E ; |  X XXX |
  2841.        .byte $3C ; |  XXXX  |
  2842.        .byte $18 ; |   XX   |
  2843.        .byte $08 ; |    X   |
  2844.        .byte $0A ; |    X X |
  2845.        .byte $2E ; |  X XXX |
  2846.        .byte $3E ; |  XXXXX |
  2847.        .byte $3E ; |  XXXXX |
  2848.        .byte $3C ; |  XXXX  |
  2849.        .byte $18 ; |   XX   |
  2850.        .byte $08 ; |    X   |
  2851.        .byte $08 ; |    X   |
  2852.        .byte $08 ; |    X   |
  2853. JetExplode:
  2854.        .byte $00 ; |        |
  2855.        .byte $00 ; |        |
  2856.        .byte $00 ; |        |
  2857.        .byte $00 ; |        |
  2858.        .byte $00 ; |        |
  2859.        .byte $02 ; |      X |
  2860.        .byte $08 ; |    X   |
  2861.        .byte $10 ; |   X    |
  2862.        .byte $00 ; |        |
  2863.        .byte $40 ; | X      |
  2864.        .byte $08 ; |    X   |
  2865.        .byte $21 ; |  X    X|
  2866.        .byte $44 ; | X   X  |
  2867.        .byte $10 ; |   X    |
  2868.        .byte $04 ; |     X  |
  2869.        .byte $08 ; |    X   |
  2870.        .byte $00 ; |        |
  2871.  
  2872. ; low pointers to the patterns for the river bank:
  2873. BankPtrTab:                     ; $FCF1
  2874.        .byte <PFPat0, <PFPat1, <PFPat2, <PFPat3, <PFPat4, <PFPat5, <PFPat6, <PFPat7, <PFPat8
  2875. ; last patterns are only used for islands:
  2876.        .byte <PFPat9, <PFPat10, <PFPat11, <PFPat12, <PFPat13, <PFPat14
  2877.  
  2878.        align 256
  2879.  
  2880.        .byte $80 ; |X       | $FD00
  2881.        .byte $C0 ; |XX      |
  2882.        .byte $E0 ; |XXX     |
  2883.        .byte $F0 ; |XXXX    |
  2884.        .byte $F8 ; |XXXXX   |
  2885.        .byte $FC ; |XXXXXX  |
  2886.        .byte $FE ; |XXXXXXX |
  2887. PFPat8:
  2888.        .byte $FF ; |XXXXXXXX|
  2889.        .byte $FF ; |XXXXXXXX|
  2890.        .byte $FF ; |XXXXXXXX|
  2891.        .byte $FF ; |XXXXXXXX|
  2892.        .byte $FF ; |XXXXXXXX|
  2893.        .byte $FF ; |XXXXXXXX|
  2894.        .byte $FF ; |XXXXXXXX|
  2895.        .byte $FF ; |XXXXXXXX|
  2896.        .byte $FF ; |XXXXXXXX|
  2897.        .byte $FF ; |XXXXXXXX|
  2898.        .byte $FF ; |XXXXXXXX|
  2899.        .byte $FF ; |XXXXXXXX|
  2900.        .byte $FF ; |XXXXXXXX|
  2901.        .byte $FF ; |XXXXXXXX|
  2902.        .byte $FF ; |XXXXXXXX|
  2903.        .byte $FF ; |XXXXXXXX|
  2904.        .byte $FE ; |XXXXXXX |
  2905.        .byte $FC ; |XXXXXX  |
  2906.        .byte $F8 ; |XXXXX   |
  2907.        .byte $F0 ; |XXXX    |
  2908.        .byte $E0 ; |XXX     |
  2909.        .byte $C0 ; |XX      |
  2910.        .byte $80 ; |X       |
  2911.        .byte $C0 ; |XX      |
  2912.        .byte $E0 ; |XXX     |
  2913.        .byte $F0 ; |XXXX    |
  2914.        .byte $F8 ; |XXXXX   |
  2915.        .byte $FC ; |XXXXXX  |
  2916. PFPat7:
  2917.        .byte $FE ; |XXXXXXX |
  2918.        .byte $FE ; |XXXXXXX |
  2919.        .byte $FE ; |XXXXXXX |
  2920.        .byte $FE ; |XXXXXXX |
  2921.        .byte $FE ; |XXXXXXX |
  2922.        .byte $FE ; |XXXXXXX |
  2923.        .byte $FE ; |XXXXXXX |
  2924.        .byte $FE ; |XXXXXXX |
  2925.        .byte $FE ; |XXXXXXX |
  2926.        .byte $FE ; |XXXXXXX |
  2927.        .byte $FE ; |XXXXXXX |
  2928.        .byte $FE ; |XXXXXXX |
  2929.        .byte $FE ; |XXXXXXX |
  2930.        .byte $FE ; |XXXXXXX |
  2931.        .byte $FE ; |XXXXXXX |
  2932.        .byte $FE ; |XXXXXXX |
  2933.        .byte $FC ; |XXXXXX  |
  2934.        .byte $F8 ; |XXXXX   |
  2935.        .byte $F0 ; |XXXX    |
  2936.        .byte $E0 ; |XXX     |
  2937.        .byte $C0 ; |XX      |
  2938.        .byte $80 ; |X       |
  2939.        .byte $C0 ; |XX      |
  2940.        .byte $E0 ; |XXX     |
  2941.        .byte $F0 ; |XXXX    |
  2942.        .byte $F8 ; |XXXXX   |
  2943. PFPat6:
  2944.        .byte $FC ; |XXXXXX  |
  2945.        .byte $FC ; |XXXXXX  |
  2946.        .byte $FC ; |XXXXXX  |
  2947.        .byte $FC ; |XXXXXX  |
  2948.        .byte $FC ; |XXXXXX  |
  2949.        .byte $FC ; |XXXXXX  |
  2950.        .byte $FC ; |XXXXXX  |
  2951.        .byte $FC ; |XXXXXX  |
  2952.        .byte $FC ; |XXXXXX  |
  2953.        .byte $FC ; |XXXXXX  |
  2954.        .byte $FC ; |XXXXXX  |
  2955.        .byte $FC ; |XXXXXX  |
  2956.        .byte $FC ; |XXXXXX  |
  2957.        .byte $FC ; |XXXXXX  |
  2958.        .byte $FC ; |XXXXXX  |
  2959.        .byte $FC ; |XXXXXX  |
  2960.        .byte $F8 ; |XXXXX   |
  2961.        .byte $F0 ; |XXXX    |
  2962.        .byte $E0 ; |XXX     |
  2963.        .byte $C0 ; |XX      |
  2964.        .byte $80 ; |X       |
  2965.        .byte $C0 ; |XX      |
  2966.        .byte $E0 ; |XXX     |
  2967.        .byte $F0 ; |XXXX    |
  2968. PFPat5:
  2969.        .byte $F8 ; |XXXXX   |
  2970.        .byte $F8 ; |XXXXX   |
  2971.        .byte $F8 ; |XXXXX   |
  2972.        .byte $F8 ; |XXXXX   |
  2973.        .byte $F8 ; |XXXXX   |
  2974.        .byte $F8 ; |XXXXX   |
  2975.        .byte $F8 ; |XXXXX   |
  2976.        .byte $F8 ; |XXXXX   |
  2977.        .byte $F8 ; |XXXXX   |
  2978.        .byte $F8 ; |XXXXX   |
  2979.        .byte $F8 ; |XXXXX   |
  2980.        .byte $F8 ; |XXXXX   |
  2981.        .byte $F8 ; |XXXXX   |
  2982.        .byte $F8 ; |XXXXX   |
  2983.        .byte $F8 ; |XXXXX   |
  2984.        .byte $F8 ; |XXXXX   |
  2985.        .byte $F0 ; |XXXX    |
  2986.        .byte $E0 ; |XXX     |
  2987.        .byte $C0 ; |XX      |
  2988.        .byte $80 ; |X       |
  2989.        .byte $C0 ; |XX      |
  2990.        .byte $E0 ; |XXX     |
  2991. PFPat4:
  2992.        .byte $F0 ; |XXXX    |
  2993.        .byte $F0 ; |XXXX    |
  2994.        .byte $F0 ; |XXXX    |
  2995.        .byte $F0 ; |XXXX    |
  2996.        .byte $F0 ; |XXXX    |
  2997.        .byte $F0 ; |XXXX    |
  2998.        .byte $F0 ; |XXXX    |
  2999.        .byte $F0 ; |XXXX    |
  3000.        .byte $F0 ; |XXXX    |
  3001.        .byte $F0 ; |XXXX    |
  3002.        .byte $F0 ; |XXXX    |
  3003.        .byte $F0 ; |XXXX    |
  3004.        .byte $F0 ; |XXXX    |
  3005.        .byte $F0 ; |XXXX    |
  3006.        .byte $F0 ; |XXXX    |
  3007.        .byte $F0 ; |XXXX    |
  3008.        .byte $E0 ; |XXX     |
  3009.        .byte $C0 ; |XX      |
  3010.        .byte $80 ; |X       |
  3011.        .byte $C0 ; |XX      |
  3012. PFPat3:
  3013.        .byte $E0 ; |XXX     |
  3014.        .byte $E0 ; |XXX     |
  3015.        .byte $E0 ; |XXX     |
  3016.        .byte $E0 ; |XXX     |
  3017.        .byte $E0 ; |XXX     |
  3018.        .byte $E0 ; |XXX     |
  3019.        .byte $E0 ; |XXX     |
  3020.        .byte $E0 ; |XXX     |
  3021.        .byte $E0 ; |XXX     |
  3022.        .byte $E0 ; |XXX     |
  3023.        .byte $E0 ; |XXX     |
  3024.        .byte $E0 ; |XXX     |
  3025.        .byte $E0 ; |XXX     |
  3026.        .byte $E0 ; |XXX     |
  3027.        .byte $E0 ; |XXX     |
  3028.        .byte $E0 ; |XXX     |
  3029.        .byte $C0 ; |XX      |
  3030.        .byte $80 ; |X       |
  3031. PFPat2:
  3032.        .byte $C0 ; |XX      |
  3033.        .byte $C0 ; |XX      |
  3034.        .byte $C0 ; |XX      |
  3035.        .byte $C0 ; |XX      |
  3036.        .byte $C0 ; |XX      |
  3037.        .byte $C0 ; |XX      |
  3038.        .byte $C0 ; |XX      |
  3039.        .byte $C0 ; |XX      |
  3040.        .byte $C0 ; |XX      |
  3041.        .byte $C0 ; |XX      |
  3042.        .byte $C0 ; |XX      |
  3043.        .byte $C0 ; |XX      |
  3044.        .byte $C0 ; |XX      |
  3045.        .byte $C0 ; |XX      |
  3046.        .byte $C0 ; |XX      |
  3047.        .byte $C0 ; |XX      |
  3048. PFPat1:
  3049.        .byte $80 ; |X       |
  3050.        .byte $80 ; |X       |
  3051.        .byte $80 ; |X       |
  3052.        .byte $80 ; |X       |
  3053.        .byte $80 ; |X       |
  3054.        .byte $80 ; |X       |
  3055.        .byte $80 ; |X       |
  3056.        .byte $80 ; |X       |
  3057.        .byte $80 ; |X       |
  3058.        .byte $80 ; |X       |
  3059.        .byte $80 ; |X       |
  3060.        .byte $80 ; |X       |
  3061.        .byte $80 ; |X       |
  3062.        .byte $80 ; |X       |
  3063.        .byte $80 ; |X       |
  3064.        .byte $80 ; |X       |
  3065.  
  3066. InitTab:        ; $FDB1
  3067.        .ds   6, <PFPat8                         ; PF1Lst
  3068.        .ds   6, <PFPat12                        ; PF2Lst
  3069.        .byte NUM_LINES+20                       ; missileY
  3070.        .byte 76                                 ; playerX
  3071.        .byte 0                                  ; speedX
  3072.        .byte 254                                ; speedY
  3073.        .byte 1                                  ;
  3074.        .byte $FF, $FF                           ; fuelHi, fuelLo
  3075.        .byte 17                                 ; sectionBlock
  3076.        .byte <PFPat0, >PFPat0                   ; shapePtr0             ;22
  3077.        .byte 12                                 ; PF1PatId
  3078.        .byte 1                                  ; level
  3079.        .byte SEED_LO, SEED_HI                   ; randomLoSave, randomHiSave
  3080.        .byte <Space, >Space                     ; livesPtr
  3081.        .byte 1, SEED_LO, SEED_HI, <Space        ; player2State (level, randomLoSave, randomHiSave, livesPtr)
  3082.        .byte $80                                ; gameMode
  3083.        .byte <FuelA, >FuelA                     ; shapePtr1a
  3084.        .byte <FuelB, >FuelB                     ; shapePtr1b
  3085.        .byte <ShipCol-3, >ShipCol               ; colorPtr
  3086.  
  3087.  
  3088. ;===============================================================================
  3089. ; R O M - C O D E (Part 3)
  3090. ;===============================================================================
  3091.  
  3092. CalcPosX SUBROUTINE
  3093. ; calculates values for x-positioning:
  3094. ; Input:
  3095. ; - a = x-position
  3096. ; Return:
  3097. ; - y = coarse value for delay loop
  3098. ; - a = fine value for HMxy
  3099.        TAY                      ; 2
  3100.        INY                      ; 2
  3101.        TYA                      ; 2
  3102.        AND    #$0F              ; 2
  3103.        STA    temp2             ; 3
  3104.        TYA                      ; 2
  3105.        LSR                      ; 2
  3106.        LSR                      ; 2
  3107.        LSR                      ; 2
  3108.        LSR                      ; 2
  3109.        TAY                      ; 2
  3110.        CLC                      ; 2
  3111.        ADC    temp2             ; 3
  3112.        CMP    #$0F              ; 2
  3113.        BCC    .skipIny          ; 2
  3114.        SBC    #$0F              ; 2
  3115.        INY                      ; 2
  3116. .skipIny:
  3117.        EOR    #$07              ; 2
  3118. Mult16:
  3119.        ASL                      ; 2
  3120.        ASL                      ; 2
  3121.        ASL                      ; 2
  3122.        ASL                      ; 2
  3123. Wait12:
  3124.        RTS                      ; 6
  3125.  
  3126.  
  3127. ;===============================================================================
  3128. ; R O M - T A B L E S (Part 3)
  3129. ;===============================================================================
  3130.  
  3131. ; low addresses of entry points into kernel:
  3132. JmpLoTab:
  3133.        .byte <[JmpPoint0-1]
  3134.        .byte <[JmpPoint1-1]
  3135.        .byte <[JmpPoint2-1]
  3136.        .byte <[JmpPoint3-1]
  3137.        .byte <[JmpPoint4-1]
  3138.        .byte <[JmpPoint5-1]
  3139.        .byte <[JmpPoint6-1]
  3140.        .byte <[JmpPoint7-1]
  3141.        .byte <[JmpPoint8-1]
  3142.        .byte <[JmpPoint9-1]
  3143.  
  3144.        align 256
  3145.  
  3146. FuelTab0:
  3147.        .byte $7F ; | XXXXXXX| $FE00
  3148.        .byte $40 ; | X      |
  3149.        .byte $4F ; | X  XXXX|
  3150.        .byte $48 ; | X  X   |
  3151.        .byte $48 ; | X  X   |
  3152.        .byte $4E ; | X  XXX |
  3153.        .byte $48 ; | X  X   |
  3154.        .byte $48 ; | X  X   |
  3155.        .byte $4F ; | X  XXXX|
  3156.        .byte $40 ; | X      |
  3157.        .byte $40 ; | X      |
  3158.        .byte $4C ; | X  XX  |
  3159.        .byte $4C ; | X  XX  |
  3160.        .byte $4C ; | X  XX  |
  3161.        .byte $7F ; | XXXXXXX|
  3162.  
  3163. FuelTab1:
  3164.        .byte $FF ; |XXXXXXXX|
  3165. Explosion0:
  3166.        .byte $00 ; |        |
  3167.        .byte $00 ; |        |
  3168.        .byte $00 ; |        |
  3169.        .byte $00 ; |        |
  3170.        .byte $00 ; |        |
  3171.        .byte $00 ; |        |
  3172.        .byte $00 ; |        |
  3173.        .byte $00 ; |        |
  3174.        .byte $00 ; |        |
  3175.        .byte $00 ; |        |
  3176.        .byte $00 ; |        |
  3177.        .byte $00 ; |        |
  3178.        .byte $00 ; |        |
  3179. FuelTab2:
  3180.        .byte $FF ; |XXXXXXXX|
  3181.        .byte $00 ; |        |
  3182.        .byte $03 ; |      XX|
  3183.        .byte $C2 ; |XX    X |
  3184.        .byte $63 ; | XX   XX|
  3185.        .byte $30 ; |  XX    |
  3186.        .byte $1B ; |   XX XX|
  3187.        .byte $EC ; |XXX XX  |
  3188.        .byte $46 ; | X   XX |
  3189.        .byte $43 ; | X    XX|
  3190.        .byte $C1 ; |XX     X|
  3191.        .byte $48 ; | X  X   |
  3192.        .byte $08 ; |    X   |
  3193.        .byte $08 ; |    X   |
  3194. FuelTab3:
  3195.        .byte $FF ; |XXXXXXXX|
  3196.        .byte $00 ; |        |
  3197.        .byte $80 ; |X       |
  3198.        .byte $00 ; |        |
  3199.        .byte $80 ; |X       |
  3200.        .byte $80 ; |X       |
  3201.        .byte $80 ; |X       |
  3202.        .byte $00 ; |        |
  3203.        .byte $00 ; |        |
  3204.        .byte $00 ; |        |
  3205.        .byte $80 ; |X       |
  3206.        .byte $00 ; |        |
  3207.        .byte $00 ; |        |
  3208.        .byte $00 ; |        |
  3209. FuelTab4:
  3210.        .byte $FF ; |XXXXXXXX|
  3211.        .byte $01 ; |       X|
  3212.        .byte $81 ; |X      X|
  3213.        .byte $81 ; |X      X|
  3214.        .byte $81 ; |X      X|
  3215.        .byte $E1 ; |XXX    X|
  3216.        .byte $81 ; |X      X|
  3217.        .byte $81 ; |X      X|
  3218.        .byte $F1 ; |XXXX   X|
  3219.        .byte $01 ; |       X|
  3220.        .byte $01 ; |       X|
  3221.        .byte $19 ; |   XX  X|
  3222.        .byte $19 ; |   XX  X|
  3223.        .byte $19 ; |   XX  X|
  3224.        .byte $FF ; |XXXXXXXX|
  3225.  
  3226. ; used to en- or disable ball in fuel display:
  3227. ENABLTab:
  3228.        .byte DISABLE
  3229.        .byte ENABLE, ENABLE, ENABLE, ENABLE, ENABLE, ENABLE, ENABLE, ENABLE, ENABLE, ENABLE
  3230.  
  3231. ; the scores to the enemy objects (bit 7 = 0: *10, = 1: *100):
  3232. ScoreTab:
  3233.        .byte 0, 0, 0, 0         ; EXPLOSIONS
  3234.        .byte DIGIT_H * 1 | $80  ; PLANE      100
  3235.        .byte DIGIT_H * 6        ; HELI        60
  3236.        .byte DIGIT_H * 6        ; HELI        60
  3237.        .byte DIGIT_H * 3        ; SHIP        30
  3238.        .byte DIGIT_H * 5 |$80   ; BRIDGE     500
  3239.        .byte 0                  ; HOUSE
  3240.        .byte DIGIT_H * 8        ; FUEL        80
  3241.  
  3242. ; the data is stored for interlaced display:
  3243. FuelA:
  3244.        .byte $FE ; |XXXXXXX |
  3245.        .byte $DE ; |XX XXXX |
  3246.        .byte $DE ; |XX XXXX |
  3247.        .byte $FE ; |XXXXXXX |
  3248.        .byte $DE ; |XX XXXX |
  3249.        .byte $DE ; |XX XXXX |
  3250.        .byte $FE ; |XXXXXXX |
  3251.        .byte $D6 ; |XX X XX |
  3252.        .byte $D6 ; |XX X XX |
  3253.        .byte $DE ; |XX XXXX |
  3254.        .byte $CE ; |XX  XXX |
  3255. FuelB:
  3256.        .byte $C6 ; |XX   XX |
  3257.        .byte $DE ; |XX XXXX |
  3258.        .byte $DE ; |XX XXXX |
  3259.        .byte $C6 ; |XX   XX |
  3260.        .byte $CE ; |XX  XXX |
  3261.        .byte $C6 ; |XX   XX |
  3262.        .byte $C6 ; |XX   XX |
  3263.        .byte $D6 ; |XX X XX |
  3264.  
  3265.        .byte $FE ; |XXXXXXX |
  3266.        .byte $DE ; |XX XXXX |
  3267.        .byte $DE ; |XX XXXX |
  3268.        .byte $7C ; | XXXXX  |
  3269. BridgeA:
  3270.        .byte $42 ; | X    X |
  3271. BridgeB:
  3272.        .byte $FF ; |XXXXXXXX|
  3273.        .byte $FF ; |XXXXXXXX|
  3274.        .byte $FF ; |XXXXXXXX|
  3275.        .byte $FF ; |XXXXXXXX|
  3276.        .byte $FF ; |XXXXXXXX|
  3277.        .byte $FF ; |XXXXXXXX|
  3278.        .byte $FF ; |XXXXXXXX|
  3279.        .byte $FF ; |XXXXXXXX|
  3280.        .byte $FF ; |XXXXXXXX|
  3281.        .byte $FF ; |XXXXXXXX|
  3282.        .byte $42 ; | X    X |
  3283. ShipB:
  3284.        .byte $00 ; |        |
  3285.        .byte $00 ; |        |
  3286.        .byte $00 ; |        |
  3287.        .byte $FC ; |XXXXXX  |
  3288.        .byte $FF ; |XXXXXXXX|
  3289.        .byte $30 ; |  XX    |
  3290.        .byte $10 ; |   X    |
  3291. PlaneA:
  3292.        .byte $00 ; |        |
  3293.        .byte $00 ; |        |
  3294.        .byte $00 ; |        |
  3295.        .byte $00 ; |        |
  3296.        .byte $00 ; |        |
  3297.        .byte $30 ; |  XX    |
  3298.        .byte $4F ; | X  XXXX|
  3299.        .byte $C6 ; |XX   XX |
  3300.        .byte $00 ; |        |
  3301. Heli1B:
  3302.        .byte $00 ; |        |
  3303.        .byte $00 ; |        |
  3304.        .byte $00 ; |        |
  3305.        .byte $0E ; |    XXX |
  3306.        .byte $8E ; |X   XXX |
  3307.        .byte $FF ; |XXXXXXXX|
  3308.        .byte $0E ; |    XXX |
  3309.        .byte $07 ; |     XXX|
  3310. Heli0A:
  3311.        .byte $00 ; |        |
  3312.        .byte $00 ; |        |
  3313.        .byte $00 ; |        |
  3314.        .byte $00 ; |        |
  3315.        .byte $04 ; |     X  |
  3316.        .byte $FF ; |XXXXXXXX|
  3317.        .byte $9F ; |X  XXXXX|
  3318.        .byte $04 ; |     X  |
  3319.        .byte $07 ; |     XXX|
  3320. ShipA:
  3321.        .byte $00 ; |        |
  3322.        .byte $00 ; |        |
  3323.        .byte $00 ; |        |
  3324.        .byte $7C ; | XXXXX  |
  3325.        .byte $FE ; |XXXXXXX |
  3326.        .byte $78 ; | XXXX   |
  3327.        .byte $10 ; |   X    |
  3328. PlaneB:
  3329.        .byte $00 ; |        |
  3330.        .byte $00 ; |        |
  3331.        .byte $00 ; |        |
  3332.        .byte $00 ; |        |
  3333.        .byte $00 ; |        |
  3334.        .byte $38 ; |  XXX   |
  3335.        .byte $FF ; |XXXXXXXX|
  3336.        .byte $80 ; |X       |
  3337. Heli1A:
  3338.        .byte $00 ; |        |
  3339.        .byte $00 ; |        |
  3340.        .byte $00 ; |        |
  3341.        .byte $00 ; |        |
  3342.        .byte $04 ; |     X  |
  3343.        .byte $FF ; |XXXXXXXX|
  3344.        .byte $9F ; |X  XXXXX|
  3345.        .byte $04 ; |     X  |
  3346.        .byte $1C ; |   XXX  |
  3347. Heli0B:
  3348.        .byte $00 ; |        |
  3349.        .byte $00 ; |        |
  3350.        .byte $00 ; |        |
  3351.        .byte $0E ; |    XXX |
  3352.        .byte $8E ; |X   XXX |
  3353.        .byte $FF ; |XXXXXXXX|
  3354.        .byte $0E ; |    XXX |
  3355.        .byte $1C ; |   XXX  |
  3356. Explosion1B:
  3357.        .byte $00 ; |        |
  3358.        .byte $00 ; |        |
  3359.        .byte $00 ; |        |
  3360.        .byte $00 ; |        |
  3361.        .byte $10 ; |   X    |
  3362.        .byte $20 ; |  X     |
  3363.        .byte $40 ; | X      |
  3364.        .byte $10 ; |   X    |
  3365. Explosion1A:
  3366.        .byte $00 ; |        |
  3367.        .byte $00 ; |        |
  3368.        .byte $00 ; |        |
  3369.        .byte $00 ; |        |
  3370.        .byte $04 ; |     X  |
  3371.        .byte $02 ; |      X |
  3372.        .byte $08 ; |    X   |
  3373.        .byte $04 ; |     X  |
  3374.        .byte $00 ; |        |
  3375. Explosion2B:
  3376.        .byte $00 ; |        |
  3377.        .byte $00 ; |        |
  3378.        .byte $00 ; |        |
  3379.        .byte $20 ; |  X     |
  3380.        .byte $02 ; |      X |
  3381.        .byte $41 ; | X     X|
  3382.        .byte $20 ; |  X     |
  3383.        .byte $02 ; |      X |
  3384.        .byte $04 ; |     X  |
  3385. Explosion2A:
  3386.        .byte $00 ; |        |
  3387.        .byte $00 ; |        |
  3388.        .byte $00 ; |        |
  3389.        .byte $04 ; |     X  |
  3390.        .byte $88 ; |X   X   |
  3391.        .byte $10 ; |   X    |
  3392.        .byte $04 ; |     X  |
  3393.        .byte $80 ; |X       |
  3394.        .byte $10 ; |   X    |
  3395.        .byte $00 ; |        |
  3396.        .byte $00 ; |        |
  3397. HouseB:
  3398.        .byte $00 ; |        |
  3399.        .byte $04 ; |     X  |
  3400.        .byte $1F ; |   XXXXX|
  3401.        .byte $0E ; |    XXX |
  3402.        .byte $04 ; |     X  |
  3403.        .byte $04 ; |     X  |
  3404.        .byte $00 ; |        |
  3405.        .byte $AA ; |X X X X |
  3406.        .byte $FE ; |XXXXXXX |
  3407.        .byte $7C ; | XXXXX  |
  3408.        .byte $00 ; |        |
  3409. HouseA:
  3410.        .byte $00 ; |        |
  3411.        .byte $04 ; |     X  |
  3412.        .byte $0E ; |    XXX |
  3413.        .byte $1F ; |   XXXXX|
  3414.        .byte $0E ; |    XXX |
  3415.        .byte $04 ; |     X  |
  3416.        .byte $00 ; |        |
  3417.        .byte $FE ; |XXXXXXX |
  3418.        .byte $AA ; |X X X X |
  3419.        .byte $FE ; |XXXXXXX |
  3420.        .byte $38 ; |  XXX   |
  3421.        .byte $00 ; |        |
  3422.        .byte $00 ; |        |
  3423.        .byte $00 ; |        |
  3424.  
  3425.  
  3426. ;===============================================================================
  3427. ; R O M - C O D E (Part 4)
  3428. ;===============================================================================
  3429.  
  3430. GetPageFlag SUBROUTINE
  3431. ; get bit 0 of the page for the playfield data:
  3432.        TXA                      ;2
  3433.        BEQ    .exit             ;2
  3434.        LDA    #%0               ;2
  3435.        CPX    #SWITCH_PAGE_ID   ;2              PF id < 9
  3436.        BCS    .exit             ;2               no, read data from page $FC
  3437.        LDA    #%1               ;2               yes, read data from page $FD
  3438. .exit:
  3439.        RTS                      ;6
  3440.  
  3441. SetScorePtrs SUBROUTINE
  3442.        STA    scorePtr1+10      ;3
  3443.        STA    scorePtr2+10      ;3
  3444.  
  3445. ; let score-pointers point to 'Space' to avoid leading zeros:
  3446.        LDA    #<Space           ;2
  3447.        LDX    #8                ;2
  3448. .loopScorePtr2:
  3449.        STA    scorePtr2,X       ;4
  3450.        DEX                      ;2
  3451.        DEX                      ;2
  3452.        BPL    .loopScorePtr2    ;2
  3453.  
  3454.        LDX    #8                ;2
  3455. SetScorePtr1:
  3456.        STA    scorePtr1,X       ;4
  3457.        DEX                      ;2
  3458.        DEX                      ;2
  3459.        BPL    SetScorePtr1      ;2
  3460.        RTS                      ;6
  3461.  
  3462.  
  3463. ;===============================================================================
  3464. ; R O M - T A B L E S (Part 4)
  3465. ;===============================================================================
  3466.  
  3467. ColorPtrTab:
  3468.        .byte $49                ; explosion 0   (no extra data for explosion colors)
  3469.        .byte $2A                ; explosion 1
  3470.        .byte $66                ; explosion 2
  3471.        .byte $2A                ; explosion 3
  3472.        .byte <PlaneCol-6        ; plane
  3473.        .byte <HelicopterCol-4   ; helicopter
  3474.        .byte <HelicopterCol-4   ; helicopter
  3475.        .byte <ShipCol-4         ; ship
  3476.        .byte <BridgeCol-1       ; bridge
  3477.        .byte <HouseCol-2        ; house         (one byte shared!)
  3478.        .byte <FuelCol-1         ; fuel          (=$37)
  3479.  
  3480. HouseCol:
  3481.        .byte BROWN, LIGHT_GREEN, LIGHT_GREEN, LIGHT_GREEN, LIGHT_GREEN
  3482.        .byte BLACK, LIGHT_GREY, LIGHT_GREY, BLACK, BLACK
  3483. FuelCol:
  3484.        .byte LIGHT_GREY, LIGHT_GREY, LIGHT_GREY, RED, RED, RED
  3485.        .byte LIGHT_GREY, LIGHT_GREY, LIGHT_GREY, RED, RED, RED
  3486. HelicopterCol:
  3487.        .byte CYAN, CYAN, DARK_BLUE, CYAN, ORANGE, ORANGE
  3488.   IF NTSC
  3489. PlaneCol:
  3490.        .byte $AC, $9C, $8C
  3491. ShipCol:
  3492.        .byte $A8, $32, BLACK, BLACK
  3493. BridgeCol:
  3494.        .byte $20, $14, $12, $14, $12, $18, $12, $14, $12, $14, $20
  3495.   ELSE
  3496. PlaneCol:
  3497.        .byte $BC, $BC, $9C
  3498. ShipCol:
  3499.        .byte $98, $42, BLACK, BLACK
  3500. BridgeCol:
  3501.        .byte $20, $24, $22, $24, $22, $28, $22, $24, $22, $24, $20
  3502.        .byte $B4        ; unused
  3503.   ENDIF
  3504.  
  3505.  
  3506. ;===============================================================================
  3507. ; R O M - C O D E (Part 5)
  3508. ;===============================================================================
  3509.  
  3510. LooseJet SUBROUTINE
  3511. ; called when player looses a life:
  3512.        STY    sound0Cnt         ; 3
  3513.        STA    sound0Id          ; 3
  3514.        LDA    blockLst          ; 3
  3515.        EOR    blockLstEnd       ; 3
  3516.        AND    #PF_COLOR_FLAG    ; 2             dark section?
  3517.        BEQ    .skipRestartLevel ; 2              yes, skip
  3518.        LDA    sectionEnd        ; 3             end of section?
  3519.        BEQ    .isEnd            ; 2              yes, check restart of level
  3520.        BIT    blockLstEnd       ; 3             road in new block?
  3521.        BPL    .skipRestartLevel ; 2              no, skip
  3522.        JSR    SaveSection       ; 6              yes, goto next section
  3523.        BNE    .skipRestartLevel ; 3
  3524.  
  3525. .isEnd:
  3526.        BIT    blockLstEnd       ; 3             PF_ROAD_FLAG set?
  3527.        BMI    .skipRestartLevel ; 2              yes, skip restart level
  3528. ; restart level:
  3529.        LDX    level             ; 3             limit level to 48
  3530.        DEX                      ; 2
  3531.        CPX    #MAX_LEVEL-2      ; 2
  3532.        BNE    .skipLimit        ; 2
  3533.        LDX    #MAX_LEVEL        ; 2
  3534. .skipLimit:
  3535.        STX    level             ; 3
  3536.        LDA    randomLoSave2     ; 3             retrieve saved random values
  3537.        STA    randomLoSave      ; 3
  3538.        LDA    randomHiSave2     ; 3
  3539.        STA    randomHiSave      ; 3
  3540. .skipRestartLevel:
  3541.        LDA    #<JetExplode-1    ; 2
  3542.        STA    shapePtr0         ; 3
  3543. .contFinish:
  3544.        STA    gameMode          ; 3
  3545.        LDA    #NUM_LINES+20     ; 2             disable missile
  3546.        STA    missileY          ; 3
  3547.        RTS                      ; 6
  3548.  
  3549. FinishGame:
  3550. ; called when the the game is not running:
  3551.        LDA    #$FF              ; 2             disable al animations
  3552.        STA    frameCnt          ; 3
  3553.        BNE    .contFinish       ; 3
  3554.  
  3555.   IF NTSC
  3556. FinishDigits SUBROUTINE
  3557.        INY                      ; 2
  3558.        STA    WSYNC             ; 3
  3559.        STA    HMOVE             ; 3
  3560.        STY    GRP1              ; 3
  3561.        STY    GRP0              ; 3
  3562.        STY    GRP1              ; 3
  3563.        LDY    #14               ; 2             load line counter
  3564. SetColPx:
  3565.        STA    COLUP0            ; 3
  3566.        STA    COLUP1            ; 3
  3567. DoHMove:
  3568.        STA    WSYNC             ; 3
  3569.        STA    HMOVE             ; 3
  3570.        RTS                      ; 6
  3571.   ELSE
  3572. LoadPFPattern SUBROUTINE
  3573.        BIT    PF_State          ; 3             ISLAND_FLAG set?
  3574.        BPL    .contPage1        ; 2              no, set current page-flag
  3575.        TAY                      ; 2              yes, read new page-flag from table
  3576.        LDA    PageFlagTab,Y     ; 4
  3577. .contPage1:
  3578.        ORA    blockLstEnd       ; 3
  3579.        STA    blockLstEnd       ; 3
  3580.        LDA    BankPtrTab,X    ; 4
  3581.        CLC                      ; 2
  3582.        ADC    diffPF            ; 3             adjust with difference between new and prev PF id
  3583.        STA    PF2LstEnd         ; 3
  3584.        RTS                      ; 6
  3585.   ENDIF
  3586.  
  3587.  
  3588. ;===============================================================================
  3589. ; R O M - T A B L E S (Part 5)
  3590. ;===============================================================================
  3591.  
  3592. RoadColorTab:
  3593.        .byte $04, $04, $08, $08, $08, $08, YELLOW, $08, $08, $08, $08   ; next two bytes are shared
  3594. VolumeTab:
  3595.        .byte $04, $04                                                   ; next byte ($07) is shared
  3596. EnemyIdTab:
  3597.        .byte ID_SHIP, ID_HELI0, ID_SHIP, ID_HELI0, ID_PLANE, ID_SHIP, ID_HELI0, ID_HELI0
  3598.  
  3599. shapePtr1aTab:
  3600.        .byte <Explosion0-1, <Explosion1A-1, <Explosion2A-1, <Explosion1A-1
  3601.        .byte <PlaneA-1, <Heli0A-1, <Heli1A-1, <ShipA-1, <BridgeA-1, <HouseA-1, <FuelA-1
  3602.  
  3603.  
  3604. ;===============================================================================
  3605. ; R O M - C O D E (Part 6)
  3606. ;===============================================================================
  3607.  
  3608. SwapPlayers SUBROUTINE
  3609. ; swaps player variable blocks in two player game:
  3610.        LDA    gameVariation     ;3              don't swap in one player game
  3611.        BEQ    .skipSwap         ;2
  3612.        EOR    player            ;3              change player
  3613.        STA    player            ;3
  3614.  
  3615.        LDX    #3                ;2
  3616. .loopSwap0:
  3617.        LDA    player1State,X    ;4
  3618.        LDY    player2State,X    ;4
  3619.        STA    player2State,X    ;4
  3620.        STY    player1State,X    ;4
  3621.        DEX                      ;2
  3622.        BPL    .loopSwap0        ;2
  3623.  
  3624.        LDX    #12-2             ;2
  3625. .loopSwap1:
  3626.        LDA    scorePtr1,X       ;4
  3627.        LDY    scorePtr2,X       ;4
  3628.        STA    scorePtr2,X       ;4
  3629.        STY    scorePtr1,X       ;4
  3630.        DEX                      ;2
  3631.        DEX                      ;2
  3632.        BPL    .loopSwap1        ;2
  3633. .skipSwap:
  3634.        RTS                      ;6
  3635.  
  3636.  
  3637. ;===============================================================================
  3638. ; R O M - T A B L E S (Part 6)
  3639. ;===============================================================================
  3640.  
  3641. ColorTab:
  3642.        .byte 0, YELLOW, GREY, YELLOW+2, BLUE
  3643.  
  3644.        .word START
  3645.        .word 0
Add Comment
Please, Sign In to add comment