home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmiSoft / Game / Misc / Skeleton.lha / Skeleton / files / skeleton.asm < prev    next >
Encoding:
Assembly Source File  |  2002-10-24  |  19.1 KB  |  1,094 lines

  1.     PROCESSOR 6502
  2.     INCLUDE    "VCS.H"
  3.  
  4.     INCLUDE "SKELRAM.ASM"
  5.  
  6.     SEG    ROM
  7.     ORG    $1000
  8.  
  9.     DC.B    "Skeleton (c)2002 Eric Ball",0
  10.  
  11. KERN0    STA    WSYNC        ;56-0
  12.     LDA    (MAZE0L),Y    ;-5
  13.     STA    PF0        ;-8
  14.     CPY    BALLTOP        ;-10
  15.     BCC    WAIT0        ;-12/13
  16.     CPY    BALLBOT        ;-14
  17.     BCS    WAIT0        ;-16/17
  18.     LDA    #2        ;-18
  19. WAIT0    STA    ENABL        ;-21
  20.     STX    PF1        ;-24
  21.     STX    PF2        ;-27
  22.     LDA    (MAZE0R),Y    ;-32
  23.     STA    PF0        ;-35
  24.     INY            ;-37
  25.     LDA    WALL        ;-40
  26.     CMP    #1        ;-42
  27.     BEQ    WALL15        ;-44/45
  28.     CPY    #20        ;-46
  29.     BNE    KERN0        ;-48/49
  30.     BEQ    KERN20        ;-51
  31. WALL15    CPY    #15        ;-47
  32.     BCC    KERN0        ;-49/50
  33.     LDX    #$FF        ;-51
  34.     CPY    #20        ;-53
  35.     BNE    KERN0        ;-55/56
  36.  
  37. WALL20    STA    WSYNC        ;44-0
  38.     LDA    #$80        ;-2
  39.     STA    PF0        ;-5
  40.     LDA    #$00        ;-7
  41.     STA    PF1        ;-10
  42.     STA    PF2        ;-13
  43.     LDX    #170-20        ;-15
  44.     JSR    XWALL        ;-21
  45.     DEX            ;48-50
  46.     JMP    KERN170        ;-53
  47.  
  48. KERN20    STA    WSYNC        ;72-0
  49.     TXA            ;-2
  50.     AND    #$0F        ;-4
  51.     ORA    (MAZE1L),Y    ;-9
  52.     STA    PF1        ;-12
  53.     STX    PF2        ;-15
  54.     LDX    #$80        ;-17
  55.     STX    PF0        ;-20
  56.     LDX    #4        ;-22
  57. WAIT20    DEX            ;+2
  58.     BNE    WAIT20        ;+2/3
  59.     AND    #$0F        ;41-43
  60.     ORA    (MAZE1R),Y    ;-48
  61.     STA    PF1        ;-51
  62.     INY            ;-53
  63.     LDA    WALL        ;-56
  64.     CMP    #2        ;-58
  65.     BEQ    WALL35        ;-60/61
  66.     CPY    #40        ;-62
  67.     BNE    KERN20        ;-64/65
  68.     BEQ    KERN40        ;-67
  69. WALL35    CPY    #35        ;61-63
  70.     BCC    KERN20        ;-65/66
  71.     DEX            ;-67
  72.     CPY    #40        ;-69
  73.     BNE    KERN20        ;-71/72
  74.  
  75. WALL40    STA    WSYNC        ;41-0
  76.     LDA    #$10        ;-2
  77.     STA    PF1        ;-5
  78.     LDA    #$00        ;-7
  79.     STA    PF2        ;-10
  80.     LDX    #150-40        ;-12
  81.     JSR    XWALL        ;-18
  82.     DEX            ;48-50
  83.     JMP    KERN150        ;-53
  84.  
  85. KERN40    STA    WSYNC        ;72-0
  86.     LDA    (MAZE2L),Y    ;-5
  87.     STA    PF1        ;-8
  88.     STX    PF2        ;-11
  89.     LDX    #5        ;-13
  90.     CPY    SKELTOP        ;-15
  91.     BCC    WAIT40        ;-17/18
  92.     LDA    (SKEL0),Y    ;-22
  93.     STA    GRP0        ;-24
  94.     LDA    (SKEL1),Y    ;-29
  95.     STA    GRP1        ;-32
  96.     LDX    #2        ;-34
  97. WAIT40    DEX            ;+2
  98.     BNE    WAIT40        ;+2/3
  99.     LDA    (MAZE2R),Y    ;42/43-47/48
  100.     STA    PF1        ;-50/51
  101.     INY            ;-53
  102.     LDA    WALL        ;-56
  103.     CMP    #3        ;-58
  104.     BEQ    WALL55        ;-60/61
  105.     CPY    #60        ;-62
  106.     BNE    KERN40        ;-64/65
  107.     LDA    #$00        ;-66
  108.     BEQ    KERN60        ;-69
  109. WALL55    CPY    #55        ;61-63
  110.     BCC    KERN40        ;-65/66
  111.     DEX            ;-67
  112.     CPY    #60        ;-69
  113.     BNE    KERN40        ;-71/72
  114.  
  115. WALL60    STA    WSYNC        ;41-0
  116.     LDA    #$11        ;-2
  117.     STA    PF1        ;-5
  118.     LDA    #$00        ;-7
  119.     STA    PF2        ;-10
  120.     LDX    #130-60        ;-12
  121.     JSR    XWALL        ;-18
  122.     DEX            ;48-50
  123.     JMP    KERN130        ;-53
  124.  
  125.     ; 18 
  126. PVIEW1    INX            ; center view subroutine
  127.     TYA            ; move forward one step
  128.     CLC
  129.     ADC    PLAYDIR
  130.     CMP    SKELPOS        ; check skeleton position
  131.     BNE    PVIEW2
  132.     STX    SKELDIS        ; save if found
  133. PVIEW2    TAY            ; check for wall
  134.     LDA    LVLMASK
  135.     AND    MAZES,Y        ; BNE done after return
  136.     RTS
  137.  
  138. WAIT60    LDX    #3        ;20-22
  139. WAIT61    DEX            ;+2
  140.     BNE    WAIT61        ;+2/3
  141.     BEQ    KERN61        ;36-39
  142.  
  143. KERN60    STA    WSYNC        ;70-0
  144.     AND    #$F0        ;-2
  145.     ORA    (MAZE3L),Y    ;-7
  146.     STA    PF2        ;-10
  147.     LDX    #$11        ;-12
  148.     STX    PF1        ;-15
  149.     CPY    SKELTOP        ;-17
  150.     BCC    WAIT60        ;-19/20
  151.     TAX            ;-21
  152.     LDA    (SKEL0),Y    ;-26
  153.     STA    GRP0        ;-29
  154.     LDA    (SKEL1),Y    ;-34
  155.     STA    GRP1        ;-37
  156.     TXA            ;-39
  157. KERN61    AND    #$F0        ;39-41
  158.     ORA    (MAZE3R),Y    ;-46
  159.     STA    PF2        ;-49
  160.     INY            ;-51
  161.     LDA    WALL        ;-54
  162.     CMP    #4        ;-56
  163.     BEQ    WALL75        ;-58/59
  164.     CPY    #80        ;-60
  165.     BNE    KERN60        ;-62/63
  166.     BEQ    KERN80        ;-65
  167. WALL75    CPY    #75        ;59-61
  168.     BCC    KERN60        ;-63/64
  169.     LDA    #$FF        ;-65
  170.     CPY    #80        ;-67
  171.     BNE    KERN60        ;-69/70
  172.  
  173. KERN80    STA    WSYNC        ;36-0
  174.     LDA    #$08        ;-2
  175.     STA    PF2        ;-5
  176.     LDX    #110-80        ;-7
  177.     JSR    XWALL        ;-13
  178.     DEX            ;48-50
  179.  
  180. KERN110    STA    WSYNC        ;56-0
  181.     LDA    (MAZE3L),Y    ;-5
  182.     STA    PF2        ;-8
  183.     LDX    #4        ;-10
  184.     CPY    SKELBOT        ;-12
  185.     BCS    WAIT110        ;-14/15
  186.     LDA    (SKEL0),Y    ;-19
  187.     STA    GRP0        ;-22
  188.     LDA    (SKEL1),Y    ;-27
  189.     STA    GRP1        ;-30
  190.     LDX    #1        ;-32
  191. WAIT110    DEX            ;+2
  192.     BPL    WAIT110        ;+2/3
  193.     LDA    (MAZE3R),Y    ;39/41-44/46
  194.     STA    PF2        ;-47/49
  195.     INY            ;-51
  196.     CPY    #130        ;-53
  197.     BNE    KERN110        ;-55/56
  198.  
  199. KERN130    STA    WSYNC        ;64-0
  200.     LDA    (MAZE2L),Y    ;-5
  201.     STA    PF1        ;-8
  202.     STX    PF2        ;-10
  203.     LDX    #4        ;-12
  204.     CPY    SKELBOT        ;-14
  205.     BCS    WAIT130        ;-16/17
  206.     LDA    (SKEL0),Y    ;-21
  207.     STA    GRP0        ;-24
  208.     LDA    (SKEL1),Y    ;-29
  209.     STA    GRP1        ;-32
  210.     LDX    #1        ;-34
  211. WAIT130    DEX            ;+2
  212.     BPL    WAIT130        ;+2/3
  213.     LDA    (MAZE2R),Y    ;41/43-46/48
  214.     STA    PF1        ;-49/51
  215.     INY            ;-53
  216.     CPY    #135        ;-55
  217.     BCC    KERN130        ;-57/58
  218.     LDX    #$00        ;-59
  219.     CPY    #150        ;-61
  220.     BNE    KERN130        ;-63/64
  221.     LDX    #$FF        ;-65
  222.  
  223. KERN150    STA    WSYNC        ;64-0
  224.     LDA    (MAZE1L),Y    ;-5
  225.     STA    PF1        ;-8
  226.     STX    PF2        ;-10
  227.     LDX    #4        ;-12
  228.     CPY    SKELBOT        ;-14
  229.     BCS    WAIT150        ;-16/17
  230.     LDA    (SKEL0),Y    ;-21
  231.     STA    GRP0        ;-24
  232.     LDA    (SKEL1),Y    ;-29
  233.     STA    GRP1        ;-32
  234.     LDX    #1        ;-34
  235. WAIT150    DEX            ;+2
  236.     BPL    WAIT150        ;+2/3
  237.     LDA    (MAZE1R),Y    ;41/43-46/48
  238.     STA    PF1        ;-49/51
  239.     INY            ;-53
  240.     CPY    #155        ;-55
  241.     BCC    KERN150        ;-57/58
  242.     LDX    #$00        ;-59
  243.     CPY    #170        ;-61
  244.     BNE    KERN150        ;-63/64
  245.     LDX    #$FF        ;-65
  246.  
  247. KERN170    STA    WSYNC        ;48-0
  248.     LDA    (MAZE0L),Y    ;-5
  249.     STA    PF0        ;-8
  250.     CPY    BALLTOP        ;-10
  251.     BCC    WAIT170        ;-12/13
  252.     CPY    BALLBOT        ;-14
  253.     BCS    WAIT170        ;-16/17
  254.     LDA    #2        ;-18
  255. WAIT170    STA    ENABL        ;-21
  256.     STX    PF1        ;-24
  257.     STX    PF2        ;-27
  258.     LDA    (MAZE0R),Y    ;-32
  259.     STA    PF0        ;-35
  260.     INY            ;-37
  261.     CPY    #175        ;-39
  262.     BCC    KERN170        ;-41/42
  263.     LDX    #$00        ;-43
  264.     CPY    #190        ;-45
  265.     BNE    KERN170        ;-47/48
  266.  
  267. LAST    LDA    #30*76/64+1
  268.     STA    WSYNC        ;-0
  269.     STA    TIM64T        ;-4
  270.     STX    PF0
  271.  
  272.     LDX    SOUNDEL        ; sound countdown
  273.     BEQ    COLUPA        ; already zero?
  274.     DEX
  275.     BNE    COLUPA        ; zero?
  276.     STX    AUDV0        ; turn off sound
  277.     STX    AUDV1
  278.  
  279. COLUPA    STX    SOUNDEL
  280.     LDA    SKELIFE        ; skeleton still alive?
  281.     BPL    COLUPB
  282.     LDX    FIREDEL
  283.     LDA    SKELDIE,X
  284.     BNE    COLUPC
  285.     BEQ    COLUPC
  286. COLUPB    LDA    FIREDEL        ; fire flash?
  287.     CMP    #55
  288.     BCS    FIRETST
  289.     LDA    MAZECOL        ; set playfield colour
  290.     STA    COLUPF
  291.     LDX    SKELIFE        ; set skeleton color
  292.     LDA    LIFELUM,X
  293. COLUPC    STA    COLUP0
  294.     STA    COLUP1
  295.  
  296. FIRETST    LDA    INPT4        ; fire button
  297.     AND    #$80
  298.     CMP    THISFIR        ; debounce
  299.     BNE    PLAYMOV        ; not the same
  300.     LDX    LASTFIR        ; check last button position
  301.     STA    LASTFIR        ; save current
  302.     BPL    PLAYMOV        ; do nothing if last was down
  303.     ASL            ; check current
  304.     BCS    PLAYMOV        ; do nothing if up
  305.     LDA    FIREDEL        ; check reload delay
  306.     BNE    PLAYMOV        ; do nothing if reloading
  307.     STA    AUDF0        ; BANG!
  308.     STA    AUDF1
  309.     LDA    #8        
  310.     STA    AUDC0
  311.     STA    AUDC1
  312.     STA    AUDV0
  313.     STA    AUDV1
  314.     STA    SOUNDEL
  315.     LDA    SKELDIS        ; is skeleton in view?
  316.     AND    #$03
  317.     BEQ    SETDEL        ; not in view
  318.     LDA    #$00        ; make skeleton turn
  319.     SEC            ; and face plaer
  320.     SBC    PLAYDIR
  321.     STA    SKELNXT
  322.     LDA    RANDOM        ; generate random damage
  323.     AND    #$0F        ; 0-15
  324.     STA    FIREDEL        ; save temp
  325.     LDA    SKELIFE        ; reduce skeleton life
  326.     SEC
  327.     SBC    FIREDEL
  328.     STA    SKELIFE
  329.     LDA    FIREDEL        ; set skeleton colour flash
  330.     ASL
  331.     ASL
  332.     ASL
  333.     ASL
  334.     STA    FIREDEL        ; save msn
  335.     LDX    SKELIFE        ; set luminance
  336.     LDA    LIFELUM,X
  337.     ORA    FIREDEL        ; combine
  338.     STA    COLUP0
  339.     STA    COLUP1
  340. SETDEL    LDA    MAZECOL        ; set playfield colour
  341.     AND    #$0F        ; flash maze too
  342.     STA    COLUPF
  343.     LDA    #60        ; set reload timer = 1 sec
  344.     STA    FIREDEL
  345.     BNE    PLAYMOV
  346.  
  347. PLAYMOV    LDA    SWCHA        ; PLAYER MOVE
  348.     ORA    #$0F
  349.     CMP    THISMOV        ; DEBOUNCE
  350.     BNE    SKELMOV
  351.     LDX    LASTMOV        ; moved last frame?
  352.     CPX    #$FF
  353.     BNE    PMOVEA        ; no
  354.     CMP    #$EF        ; forward?
  355.     BEQ    PMOVEC
  356.     CMP    #$7F        ; turn right?
  357.     BEQ    PMOVEB
  358.     CMP    #$BF        ; turn left?
  359.     BNE    SKELMOV
  360.     STA    LASTMOV        
  361.     LDX    PLAYDIR        ; turn left
  362.     LDA    #$00
  363.     SEC
  364.     SBC    PLAYRIG
  365.     STX    PLAYRIG
  366.     STA    PLAYDIR
  367.     BNE    SKELMOV
  368. PMOVEA    CMP    #$FF        ; return to center?
  369.     BNE    SKELMOV
  370.     STA    LASTMOV        ; centered
  371.     BEQ    SKELMOV
  372. PMOVEB    STA    LASTMOV        ; right turn
  373.     LDX    PLAYRIG
  374.     LDA    #$00
  375.     SEC
  376.     SBC    PLAYDIR
  377.     STX    PLAYDIR
  378.     STA    PLAYRIG
  379.     BNE    SKELMOV
  380. PMOVEC    STA    LASTMOV        ; step forward
  381.     LDA    WALL
  382.     CMP    #1
  383.     BEQ    SKELMOV
  384.     LDA    PLAYPOS
  385.     CLC
  386.     ADC    PLAYDIR
  387.     STA    PLAYPOS
  388.     CMP    SKELPOS
  389.     BNE    SKELMOV
  390.     JMP    GOTYOU
  391.  
  392. SKELMOV    LDA    SKELIFE        ; skeleton still alive?
  393.     BMI    SKELSTP
  394.     DEC    SKELDEL        ; main skeleton movement delay
  395.     BEQ    SKDEL1
  396. SKELSTP    JMP    BOTTOM        ; no movement, skip everything
  397.     
  398. SKDEL1    LDA    SKELSEC        ; decrease rate counter
  399.     SEC
  400.     SBC    SKELPER
  401.     STA    SKELSEC
  402.     BCS    SKDEL2        ; no carry = underflow
  403.     ADC    #60
  404.     STA    SKELSEC
  405.     LDA    SKELMIN
  406.     SEC
  407.     SBC    SKELPER        ; decrease square counter
  408.     STA    SKELMIN
  409.     BCS    SKDEL2        ; no carry = underflow
  410.     ADC    #87
  411.     STA    SKELMIN
  412.     LDA    SKELHRS
  413.     SEC
  414.     SBC    SKELPER        ; decrease cube counter
  415.     STA    SKELHRS
  416.     BCS    SKDEL2        ; no carry = underflow
  417.     ADC    #87
  418.     STA    SKELHRS
  419.     DEC    SKELPER        ; speed up skeleton!
  420. SKDEL2    LDA    SKELPER
  421.     STA    SKELDEL 
  422.  
  423.     LDA    SKELNXT        ; forced move?
  424.     BEQ    SMOVEA        ; nope, start the decision tree
  425.     LDX    #0        ; clear forced move flag
  426.     STX    SKELNXT
  427.     CMP    SKELDIR        ; forced=facing?
  428.     BNE     SKNXT0
  429.     JMP    SMOVE1        ; step forward
  430. SKNXT0    STA    SKELDIR        ; turn and set SKELRIG correctly
  431.     CMP    #1
  432.     BEQ    SKNXT1
  433.     BMI    SKNXT2
  434.     LDA    #-1
  435.     STA    SKELRIG
  436.     BNE    SKELSTP
  437. SKNXT1    LDA    #16
  438.     STA    SKELRIG
  439.     BNE    SKELSTP
  440. SKNXT2    CMP    #-1
  441.     BEQ    SKNXT3
  442.     LDA    #1
  443.     STA    SKELRIG
  444.     BNE    SKELSTP
  445. SKNXT3    LDA    #-16
  446.     STA    SKELRIG
  447.     BNE    SKELSTP
  448. SMOVEA    LDX    #0        ; direction flags
  449.     LDA    SKELPOS        ; can we go forward?
  450.     CLC
  451.     ADC    SKELDIR
  452.     TAY
  453.     LDA    LVLMASK
  454.     AND    MAZES,Y
  455.     BNE    SMOVED        ; can't go forward
  456.     INX            ; forward flag
  457.     LDA    #$01        ; determine facing
  458.     BIT    SKELDIR        ; use bit to test for neg too
  459.     BNE    SMOVEB        ; SKELDIR = +1/-1
  460.     LDA    PLAYPOS        ; check for player in same column
  461.     SEC
  462.     SBC    SKELPOS
  463.     AND    #$0F
  464.     BNE    SMOVED
  465.     JMP    SMOVE1
  466. SMOVEB    BMI    SMOVEC        ; SKELDIR = -1
  467.     LDA    PLAYPOS
  468.     SEC
  469.     SBC    SKELPOS
  470.     AND    #$F0        ; player ahead
  471.     BNE    SMOVED
  472.     JMP    SMOVE1
  473. SMOVEC    LDA    SKELPOS        ; player ahead (behind)
  474.     SEC
  475.     SBC    PLAYPOS
  476.     AND    #$F0        ; player ahead
  477.     BNE    SMOVED
  478.     BEQ    SMOVE1
  479. SMOVED    LDA    SKELPOS        ; can we go right?
  480.     CLC
  481.     ADC    SKELRIG
  482.     TAY
  483.     LDA    LVLMASK
  484.     AND    MAZES,Y
  485.     BNE    SMOVEE
  486.     INX
  487.     INX
  488. SMOVEE    LDA    SKELPOS        ; can we go left?
  489.     SEC
  490.     SBC    SKELRIG
  491.     TAY
  492.     LDA    LVLMASK
  493.     AND    MAZES,Y
  494.     BNE    SMOVEF
  495.     INX
  496.     INX
  497.     INX
  498.     INX
  499. SMOVEF    CPX    #0
  500.     BEQ    SMOVE0        ; no directions, turn around
  501.     DEX    
  502.     BEQ    SMOVE1        ; forward only
  503.     DEX
  504.     BEQ    SMOVE2        ; right only
  505.     DEX
  506.     BEQ    SMOVE3        ; right or forward
  507.     DEX
  508.     BEQ    SMOVE4        ; left only
  509.     DEX
  510.     BEQ    SMOVE5        ; left or forward
  511.     DEX
  512.     BEQ    SMOVE6        ; right or left
  513.     BIT    RANDOM        ; all directions    
  514.     BPL    SMOVE1
  515.     BMI    SMOVE6
  516. SMOVE0    LDA    #$00        ; turn around
  517.     SEC
  518.     SBC    SKELDIR
  519.     STA    SKELDIR
  520.     LDA    #$00
  521.     SEC
  522.     SBC    SKELRIG
  523.     STA    SKELRIG
  524.     JMP    BOTTOM
  525. SMOVE2    LDX    SKELRIG        ; turn right
  526.     LDA    #$00
  527.     SEC
  528.     SBC    SKELDIR
  529.     STX    SKELDIR
  530.     STA    SKELRIG
  531.     STX    SKELNXT        ; force forward
  532.     JMP    BOTTOM
  533. SMOVE3    BIT    RANDOM
  534.     BPL    SMOVE1
  535.     BMI    SMOVE2
  536. SMOVE4    LDX    SKELDIR        ; turn left
  537.     LDA    #$00
  538.     SEC
  539.     SBC    SKELRIG
  540.     STX    SKELRIG
  541.     STA    SKELDIR
  542.     STA    SKELNXT        ; force forward
  543.     JMP    BOTTOM
  544. SMOVE5    BIT    RANDOM
  545.     BPL    SMOVE1
  546.     BMI    SMOVE4
  547. SMOVE6    BIT    RANDOM
  548.     BVC    SMOVE2
  549.     BVS    SMOVE4
  550. SMOVE1    LDA    SKELPOS        ; step forward
  551.     CLC
  552.     ADC    SKELDIR
  553.     STA    SKELPOS
  554.     CMP    PLAYPOS
  555.     BNE    SMOVE7
  556.     JMP    GOTYOU
  557. SMOVE7    LDA    SOUNDEL        ; check for existing sound
  558.     BNE    BOTTOM
  559.     JSR    SKPOSXY        ; calculate distance for sound
  560.     JSR    PDIRXY
  561.     JSR    SKSTEP
  562.     LDA    #1
  563.     STA    AUDC0
  564.     STA    AUDC1
  565.     LDA    RANDOM
  566.     ORA    #30
  567.     STA    AUDF0
  568.     STA    AUDF1
  569.     CPX    #-15
  570.     BPL    AUDX
  571.     LDX    #-15
  572. AUDX    STX    AUDV0        ; left speaker
  573.     CPY    #-15
  574.     BPL    AUDY
  575.     LDY    #-15
  576. AUDY    STY    AUDV1        ; right speaker
  577.     LDA    SKELDEL
  578.     LSR
  579.     STA    SOUNDEL
  580.  
  581. BOTTOM    JSR    DOVSYNC
  582.  
  583. NEWSKEL    LDA    SKELIFE        ; skeleton dead?
  584.     BPL    PVIEW
  585.     LDA    FIREDEL        ; done death flash?
  586.     BNE    PVIEW
  587.     LDX    SKELNUM        ; increment skeleton life
  588.     INX
  589.     STX    SKELNUM
  590.     STX    SKELIFE
  591.     LDX    MAZECOL        ; increment maze luminance
  592.     INX
  593.     TXA
  594.     AND    #$0F
  595.     CMP    #13
  596.     BEQ    NEXTLVL        ; ten down, new level
  597.     STX    MAZECOL
  598.     LDA    #$00
  599.     STA    SKELPOS
  600.     JSR    SKPOSXY        ; figure out restart position
  601. ;    LDA    SKELX
  602.     BPL    NEWSK1
  603.     EOR    #$FF        ; NEG
  604.     CLC
  605.     ADC    #$01
  606. NEWSK1    BIT    SKELY
  607.     BPL    NEWSK2
  608.     SEC
  609.     SBC    SKELY
  610.     BPL    NEWSK3
  611. NEWSK2    CLC
  612.     ADC    SKELY
  613. NEWSK3    CMP    #$07
  614.     BPL    NEWSK4
  615.     LDA    #120
  616.     STA    SKELPOS
  617. NEWSK4    LDX    #LOADDEL-LOADRAM; reset skeleton move timers
  618.     BNE    REINIT
  619. NEXTLVL    TXA            ; increment maze colour
  620.     CLC
  621.     ADC    #$16
  622.     STA    MAZECOL
  623.     LDX    #LOADLVL-LOADRAM
  624.     ASL    LVLMASK
  625.     BNE    REINIT
  626.     JMP    YOUWIN
  627.  
  628. REINIT    LDA    LOADRAM-1,X    ; refresh initial values
  629.     STA    RAMLOAD-1,X
  630.     DEX
  631.     BNE    REINIT
  632.  
  633. PVIEW    LDX    #0        ; center view & skeleton distance
  634.     STX    SKELDIS
  635.     LDY    PLAYPOS
  636.     JSR    PVIEW1
  637.     BNE    PVIEWA
  638.     JSR    PVIEW1
  639.     BNE    PVIEWA
  640.     JSR    PVIEW1
  641.     BNE    PVIEWA
  642.     JSR    PVIEW1
  643.     BNE    PVIEWA
  644.     INX
  645. PVIEWA    STX    WALL        ; save wall distance
  646.     LDA    PLAYPOS        ; right view, step 1
  647.     CLC
  648.     ADC    PLAYRIG
  649.     LDX    #MAZE1R+1    ; save bits here
  650. PVIEWE    JSR    PVIEW3        ; test and save bits
  651.     CPX    #MAZE3R+2
  652.     BNE    PVIEWE
  653.     LDA    PLAYPOS        ; left view, step 1
  654.     SEC            ;
  655.     SBC    PLAYRIG        ;
  656.     LDX    #MAZE1L+1    ; save bits here
  657. PVIEWF    JSR    PVIEW3        ;
  658.     CPX    #MAZE3L+2    ;
  659.     BNE    PVIEWF        ;
  660.     LDX    #MAZE1R+1    ; right view, step 2
  661.     LDY    #MAZE0R        ; 
  662. PVIEWG    JSR    PVIEW4        ; change bits to pointers
  663.     CPY    #MAZE3R+2    ;
  664.     BNE    PVIEWG        ;
  665.     LDX    #MAZE1L+1    ; left view, step 2
  666.     LDY    #MAZE0L        ;
  667. PVIEWH    JSR    PVIEW4        ; change bits to pointers
  668.     CPY    #MAZE3L+2    ;
  669.     BNE    PVIEWH        ;
  670.  
  671.     LDA    SWCHB        ; check difficulty switch
  672.     AND    #$40
  673.     BEQ    DOBALL
  674.     STA    BALLTOP        ; set top & bottom same
  675.     STA    BALLBOT        ; to prevent ball display
  676.     BNE    NOBALL
  677. DOBALL    JSR    SKPOSXY        ; add skeleton direction pointer
  678.     JSR    PDIRXY
  679.     JSR    POSBALL    
  680.  
  681. NOBALL    LDA    SKELDIS        ; skeleton view
  682.     AND    #$03        ; check distance
  683.     BNE    SKPOSA
  684.     STA    SKELBOT        ; force skeleton off
  685.     SBC    #1        ; by reversing top & bottom
  686.     STA    SKELTOP
  687.     JMP    SKVIEW0
  688. SKPOSA    SEC            ; decrement for table access
  689.     SBC    #1
  690.     ASL            ; multiply by 16
  691.     ASL
  692.     ASL
  693.     ASL
  694.     TAY
  695.     LDA    SKTABLE,Y    ; use table to update RAM
  696.     STA    HMCLR
  697.     STA    HMP0
  698.     LDA    SKTABLE+1,Y
  699.     STA    SKELTOP
  700.     LDA    SKTABLE+2,Y
  701.     STA    SKELBOT
  702.     LDA    SKTABLE+3,Y
  703.     STA    NUSIZ0
  704.     STA    NUSIZ1
  705.     LDA    PLAYDIR        ; figure out facing
  706.     CMP    SKELDIR
  707.     BEQ    SKPOSB        ; same dir = back
  708.     CMP    SKELRIG        ; left
  709.     BEQ    SKPOSC
  710.     CLC
  711.     ADC    SKELDIR
  712.     BEQ    SKPOSD        ; inverse = front
  713.     LDA    SKTABLE+8,Y    ; must be right
  714.     STA    SKEL1        ; arm on the right
  715.     LDA    SKTABLE+9,Y
  716.     STA    SKEL1+1
  717.     LDA    SKTABLE+10,Y    ; body on the left
  718.     STA    SKEL0
  719.     LDA    SKTABLE+11,Y
  720.     STA    SKEL0+1
  721.     LDA    #$18        ; mirror both
  722.     BNE    SKVIEW
  723. SKPOSB    LDA    SKTABLE+6,Y    ; back for both
  724.     STA    SKEL0        
  725.     STA    SKEL1        
  726.     LDA    SKTABLE+7,Y    
  727.     STA    SKEL0+1        
  728.     STA    SKEL1+1        
  729.     LDA    #$08        ; left normal, right mirror
  730.     BNE    SKVIEW
  731. SKPOSC    LDA    SKTABLE+8,Y    ; arm on the left
  732.     STA    SKEL0
  733.     LDA    SKTABLE+9,Y
  734.     STA    SKEL0+1
  735.     LDA    SKTABLE+10,Y    ; body on the right
  736.     STA    SKEL1
  737.     LDA    SKTABLE+11,Y
  738.     STA    SKEL1+1
  739.     LDA    #$00        ; no mirror
  740.     BEQ    SKVIEW
  741. SKPOSD    LDA    SKTABLE+4,Y    ; front for both
  742.     STA    SKEL0
  743.     STA    SKEL1
  744.     LDA    SKTABLE+5,Y
  745.     STA    SKEL0+1
  746.     STA    SKEL1+1
  747.     LDA    #$08        ; left normal, right mirror
  748. SKVIEW    STA    WSYNC        ; hmove P0 for size
  749.     STA    HMOVE
  750.     STA    REFP1        ; set reflection registers
  751.     LSR
  752.     STA    REFP0
  753.     STA    WSYNC
  754.     STA    HMOVE
  755.  
  756. SKVIEW0    JSR    WAITIM
  757.  
  758.     LDA    INPT4        ; save button for debounce
  759.     AND    #$80
  760.     STA    THISFIR
  761.     LDX    FIREDEL        ; decrement reload counter
  762.     BEQ    RELOAD
  763.     DEX
  764.     STX    FIREDEL
  765.  
  766. RELOAD    LDA    SWCHA        ; save joystick for debounce
  767.     ORA    #$0F
  768.     STA    THISMOV
  769.  
  770.     LDY    #$00
  771.     LDX    #$00
  772.     JMP    KERN0
  773.  
  774.     ; 46
  775. PDIRXY    LDA    #$01        ; adjust SKELXY for PDIR
  776.     BIT    PLAYDIR
  777.     BEQ    PDIRXY2        ; PLAYDIR = 16 or -16
  778.     BMI    PDIRXY1        ; PLAYDIR = -1
  779.     LDX    SKELX        ; PLAYDIR = 1
  780.     LDY    SKELY
  781.     RTS
  782. PDIRXY1    LDA    SKELX        ; rotate 180
  783.     EOR    #$FF        ; NEG
  784.     TAX
  785.     INX
  786.     LDA    SKELY
  787.     EOR    #$FF        ; NEG
  788.     TAY
  789.     INY
  790.     RTS
  791. PDIRXY2    BMI    PDIRXY3        ; PLAYDIR = -16
  792.     LDX    SKELY        ; PLAYDIR = 16
  793.     LDA    SKELX        ; rotate 90
  794.     EOR    #$FF        ; NEG
  795.     TAY
  796.     INY
  797.     RTS
  798. PDIRXY3    LDA    SKELY        ; rotate -90
  799.     EOR    #$FF        ; NEG
  800.     TAX
  801.     INX
  802.     LDY    SKELX
  803.     RTS
  804.  
  805.     ; 30
  806. PVIEW4    LDA    $00,X        ; right/left step 2 subroutine
  807.     BEQ    PVIEW5        ; open found, check next
  808.     LDA    #>TYPE0        ; closed, show wall
  809.     BNE    PVIEW7
  810. PVIEW5    LDA    $01,X        ; is next open too?
  811.     BEQ    PVIEW6
  812.     LDA    #>TYPE1        ; open, show hole
  813.     BNE    PVIEW7
  814. PVIEW6    LDA    #>TYPE2        ; both open, show Y
  815. PVIEW7    INX            ; next test position
  816.     STA    $0001,Y        ; pointer MSB to RAM
  817.     LDA    #$00
  818.     STA    $0000,Y        ; LSB = 0
  819.     INY            ; next pointer position
  820.     INY
  821.     RTS
  822.  
  823.     ; 59
  824. POSBALL    TXA            ; SKELX/Y into BALLTOP/BOT & RESBL
  825.     BEQ    PBALL1
  826.     BMI    PBALL2
  827.     LDA    #3
  828.     BNE    PBALL3
  829. PBALL1    LDA    #90
  830.     BNE    PBALL3
  831. PBALL2    LDA    #178
  832. PBALL3    STA    BALLTOP
  833.     CLC
  834.     ADC    #9
  835.     STA    BALLBOT
  836.     TYA
  837.     BEQ    PBALL4
  838.     BPL    PBALL5
  839.     LDA    #$60
  840.     LDY    #3
  841.     BNE    PBALL6
  842. PBALL4    LDA    #$40
  843.     LDY    #6
  844.     BNE    PBALL6
  845. PBALL5    LDA    #$20
  846.     LDY    #9
  847. PBALL6    STY    WSYNC        ; -0
  848.     STY    RESBL        ; -3
  849. PBALL0    DEY            ; +2
  850.     STY    RESBL        ; +3
  851.     BNE    PBALL0        ; +2/3
  852.     STA    WSYNC
  853.     STA    HMBL
  854.     STA    HMOVE
  855.     RTS
  856.  
  857.     ; 51
  858. DOVSYNC    JSR    WAITIM
  859.     LDA    #$02
  860.     STA    VSYNC
  861.     JSR    RAND        ; cycle LFSR
  862.     LDA    #$31        ; ball width = 8
  863.     STA    CTRLPF        ; reflect playfield
  864.     STA    WSYNC        ; set initial skeleton position
  865.     LDX    #8        ;-2
  866. SKPOS0    DEX            ;+2
  867.     BNE    SKPOS0        ;+2/3
  868.     STA    RESP0        ;46-49
  869.     LDA    #$60        ; shift left half left
  870.     STA    RESP1
  871.     STA    HMP0
  872.     LDA    #$40        ; center right half (final position)
  873.     STA    HMP1
  874.     STA    WSYNC    
  875.     STA    HMOVE
  876.     LDA    #38*76/64+1
  877.     STA    WSYNC
  878.     STA    TIM64T
  879.     LDA    #$00
  880.     STA    VSYNC
  881.     STA    HMCLR
  882.     RTS
  883.  
  884.     ; 37
  885. XWALL0    STA    WSYNC        ;46-0
  886.     LDA    #0        ;-2
  887.     CPY    BALLTOP        ;-4
  888.     BCC    XWALL1        ;-6/7
  889.     CPY    BALLBOT        ;-8
  890.     BCS    XWALL1        ;-10/11
  891.     LDA    #2        ;-12
  892. XWALL1    STA    ENABL        ;-15
  893. XWALL    CPY    SKELTOP        ;-17
  894.     BCC    XWALL2        ;-19/20
  895.     CPY    SKELBOT        ;-21
  896.     BCS    XWALL2        ;-23/24
  897.     LDA    (SKEL0),Y    ;-28
  898.     STA    GRP0        ;-31
  899.     LDA    (SKEL1),Y    ;-36
  900.     STA    GRP1        ;-39
  901. XWALL2    INY            ;-41
  902.     DEX            ;-43
  903.     BNE    XWALL0        ;-45/46
  904.     RTS            ;-51
  905.  
  906.     ; 38
  907. SKSTEP    STY    SKELY
  908.     TXA
  909.     BMI    SKSTEP1        ; skeleton behind
  910.     EOR    #$FF        ; NEG
  911.     CLC
  912.     ADC    #$01
  913.     BMI    SKSTEP2
  914. SKSTEP1    ASL            ; multiply by 2
  915. SKSTEP2    STA    SKELX
  916.     TYA
  917.     BPL    SKSTEP3        ; skeleton right
  918.     CLC
  919.     ADC    SKELX
  920.     TAX            ; left = X + Y
  921.     CLC
  922.     ADC    SKELY
  923.     TAY            ; right = X + 2Y
  924.     RTS
  925. SKSTEP3    LDA    SKELX
  926.     SEC
  927.     SBC    SKELY
  928.     TAY            ; right = X - Y
  929.     SEC
  930.     SBC    SKELY
  931.     TAX            ; left = X - 2Y
  932.     RTS
  933.  
  934.     ; 36
  935. SKPOSXY    LDA    SKELPOS        ; change SKPOS-PLAYPOS to SKELX+SKELY
  936.     SEC
  937.     SBC    PLAYPOS
  938.     STA    SKELX
  939.     LSR
  940.     LSR
  941.     LSR
  942.     LSR
  943.     BIT    TESTBIT        ; negative?
  944.     BEQ    SKXY2
  945.     ORA    #$F0
  946. SKXY2    STA    SKELY
  947.     LDA    SKELX
  948.     BIT    TESTBIT        ; negative?
  949.     BEQ    SKXY3
  950.     INC    SKELY
  951.     ORA    #$F0
  952.     BMI    SKXY4
  953. SKXY3    AND    #$0F
  954. SKXY4    STA    SKELX
  955.     RTS
  956.  
  957.     ; 36
  958. START    SEI            ; enable interupts
  959.     CLD            ; turn off BCD math
  960.     LDA    #$00        ; clear zero page memory & registers
  961.     LDX    #$44        ; start with the TIA shadow
  962. NULL    STA    0,X
  963.     INX
  964.     BNE    NULL
  965.     STX    TITLEX        ; <TITLEPF = 0
  966.     DEX            ; set stack to bottom of RAM
  967.     TXS
  968.  
  969.     STX    COLUPF        ; set up title screen
  970.     LDA    #<GOT
  971.     STA    TITLEND
  972.     LDY    #11
  973.     STY    TITLEY
  974.     LDA    #31*76/64+1
  975.     STA    TITLBOT
  976.     LDA    #40*76/64+1
  977.     STA    TITLTOP
  978.     JMP    TITLE3
  979.  
  980.     ; 110
  981. TITLE3    LDA    #$02
  982.     STA    VSYNC
  983.     STA    WSYNC
  984.     JSR    RAND        ; cycle LFSR
  985.     STA    WSYNC    
  986.     LDA    TITLTOP
  987.     STA    WSYNC
  988.     STA    TIM64T
  989.     LDA    #$00
  990.     STA    VSYNC
  991.     LDX    TITLEX
  992. TITLE2    JSR    WAITIM
  993. TITLE    STA    WSYNC
  994.     LDA    TITLEPF+1,X    ;-4
  995.     STA    PF1        ;-7
  996.     LDA    TITLEPF+2,X    ;-11
  997.     STA    PF2        ;-14
  998.     LDA    TITLEPF,X    ;-18
  999.     STA    PF0        ;-21
  1000.     ASL            ;-23
  1001.     ASL            ;-25
  1002.     ASL            ;-27
  1003.     ASL            ;-31
  1004.     STA    PF0        ;-34
  1005.     LDA    TITLEPF+3,X    ;-38
  1006.     STA    PF1        ;-41
  1007.     LDA    TITLEPF+4,X    ;-45
  1008.     DEY            ;-47
  1009.     BNE    TITLE0        ;-49/50
  1010.     LDY    TITLEY        ;-52
  1011.     INX            ;-54
  1012.     INX            ;-56
  1013.     INX            ;-58
  1014.     INX            ;-60
  1015.     INX            ;-62
  1016. TITLE0    STA    PF2        ;50/62-53/65
  1017.     CPX    TITLEND        ;-67
  1018.     BNE    TITLE        ;-69/70
  1019.     LDA    TITLBOT        ;-72
  1020.     STA    WSYNC        ;-0
  1021.     STA    TIM64T        ;-4
  1022.     LDA    #0
  1023.     STA    PF0
  1024.     STA    PF1
  1025.     STA    PF2
  1026.     STA    AUDV0
  1027.     STA    AUDV1
  1028.     LDA    SWCHB        ; check reset/select
  1029.     AND    #$03
  1030.     CMP    #$03
  1031.     BEQ    TITLE1
  1032.     JMP    INIT
  1033. TITLE1    JSR    WAITIM
  1034.     BEQ    TITLE3
  1035.  
  1036.     ; 28
  1037. GOTYOU    LDY    #<WIN-5
  1038.     LDX    #<GOT
  1039.     BNE    GOTYOU2
  1040. YOUWIN    LDY    #<SKBODY3
  1041.     LDX    #<YOU
  1042. GOTYOU2    STY    TITLEND
  1043.     STX    TITLEX
  1044.     LDY    #15
  1045.     STY    TITLEY
  1046.     LDA    #42*76/64+1
  1047.     STA    TITLBOT
  1048.     LDA    #51*76/64+1
  1049.     STA    TITLTOP
  1050.     BNE    TITLE1
  1051.  
  1052.     ; 14
  1053. PVIEW3    TAY            ; right/left step 1 subroutine
  1054.     LDA    LVLMASK        ; move bits from ROM to RAM
  1055.     AND    MAZES,Y
  1056.     STA    $00,X
  1057.     INX
  1058.     TYA
  1059.     CLC            ; move forward one step
  1060.     ADC    PLAYDIR
  1061.     RTS
  1062.  
  1063.     ; 13
  1064. INIT    LDX    #LOADEND-LOADRAM
  1065. INITL    LDA    LOADRAM-1,X    ; copy in initial values
  1066.     STA    RAMLOAD-1,X
  1067.     DEX
  1068.     BNE    INITL
  1069.     JMP    LAST
  1070.  
  1071.     ; 12            
  1072. RAND    LDA    RANDOM        ; simple 8 bit LFSR
  1073.     BEQ    XSEED        ;+5/6
  1074.     LSR            ;+7
  1075.     BCC    SRAND        ;+9/10
  1076. XSEED    EOR    #$A9        ;+6/9-8/11
  1077. SRAND    STA    RANDOM        ;+8/10/11-11/14
  1078.     RTS            ;+17/20
  1079.  
  1080.     ; 8
  1081. WAITIM    STA    WSYNC        ;-0
  1082.     LDA    INTIM        ;-4
  1083.     BNE    WAITIM        ; wait for bottom of frame
  1084.     RTS
  1085.  
  1086.     INCLUDE "SKELDATA.ASM"
  1087.  
  1088.     ORG    $1FF8        ; SuperCharger Bankswitch
  1089.     DC.B    "1SL1"
  1090.  
  1091.     ORG    $1FFC        ; end of 4K cart
  1092.     DC.W    START        ; reset vector
  1093.     DC.W    START        ; IRQ vector
  1094.