Advertisement
Erik557

Untitled

Jul 28th, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;=================================
  2. ; Final Boss - Mario
  3. ;=================================
  4. ; For Morton's Empire
  5. ;=================================
  6.  
  7. print "INIT ",pc
  8.     PHY
  9.     JSR SubHorizPos
  10.     TYA
  11.     STA $157C,x
  12.     LDA #$AF
  13.     STA $1540,x
  14.     PLY
  15. RTL
  16.  
  17. print "MAIN ",pc
  18.     PHB
  19.     PHK
  20.     PLB
  21.     JSR Mario
  22.     PLB
  23. RTL
  24.  
  25. ;========================
  26. ; Main routine
  27. ;========================
  28.  
  29. Mario:
  30.     JSR Graphics
  31.     LDA $14C8,x
  32.     CMP #$08
  33.     BNE .End
  34.     LDA $9D
  35.     BNE .End
  36.  
  37.     LDA $14
  38.     LSR #3
  39.     AND #$03
  40.     ASL
  41.     STA $1602,x
  42.    
  43.     LDA $1588,x
  44.     AND #$04
  45.     BNE .OnGround
  46.     LDA $AA,x
  47.     BMI .OnGround
  48.     LDA #$08
  49.     STA $1602,x
  50. .OnGround
  51.     JSL $81802A
  52.     LDA $C2,x
  53.     ASL
  54.     PHX
  55.     TAX
  56.     JMP (.pointers,x)
  57. .pointers
  58.     dw Start
  59.     dw SelectAttack
  60. .End
  61.     RTS
  62.  
  63. !MaxLeft = $0060
  64. !MaxRight = $0060  
  65.  
  66. Start:
  67.     PLX
  68.     STZ $7B
  69.     STZ $7D
  70.     LDA $1588,x
  71.     AND #$04
  72.     BEQ +
  73.     LDA $163E,x
  74.     BNE +
  75.     STZ $1602,x
  76. +   LDA $1540,x
  77.     BEQ .EndIt
  78.     CMP #$55
  79.     BCS .Return
  80.     CMP #$39
  81.     BCS +
  82.     CMP #$19
  83.     BCC .SpeedSprite
  84.     STZ $157C,x
  85. +   LDA #$0A
  86.     STA $1602,x
  87.     BRA .Return
  88. .SpeedSprite
  89.     LDA #$16
  90.     STA $B6,x
  91.     LDA $14
  92.     LSR
  93.     AND #$01
  94.     BEQ .Return
  95.     LDA $1588,x
  96.     AND #$04
  97.     BEQ .Return
  98.     LDA #$AE
  99.     STA $AA,x
  100.     LDA #$01
  101.     STA $1DFA
  102.     BRA .Return
  103. .EndIt
  104.     LDA $1588,x
  105.     AND #$04
  106.     BEQ .Return
  107.     LDA #$0A
  108.     STA $1DF9
  109.     LDA #$74
  110.     JSR SpawnSprite
  111.     LDA #$7F
  112.     STA $163E,x
  113.  
  114.     LDA #$DB
  115.     STA $B6,x
  116.     LDA #$01
  117.     STA $157C,x
  118.     LDA $14E0,x
  119.     XBA
  120.     LDA $E4,x
  121.     REP #$20
  122.     SBC $94
  123.     ADC.w #!MaxLeft
  124.     CMP.w #!MaxLeft+!MaxRight
  125.     SEP #$20
  126.     BCS .Return
  127.  
  128.     STZ $7B
  129.     LDA $77
  130.     AND #$04
  131.     BEQ .Return
  132.     LDA #$2F
  133.     STA $1540,x
  134.     STA $B6,x
  135.     INC $C2,x
  136. .Return
  137.     RTS
  138. SelectAttack:
  139.     PLX
  140.     STZ $B6,x
  141.     LDA $1540,x
  142.     BNE +
  143.     JSR GenExtra
  144.     LDA #$25
  145.     STA $1540,x
  146.     LDA #$06
  147.     STA $1DFC
  148. +   RTS
  149.    
  150. ;========================
  151. ; Spawn Sprite
  152. ;========================
  153.  
  154. SpawnSprite:
  155.     XBA
  156.     LDA $163E,x
  157.     BNE .EndSpawn
  158.     LDA $186C,x
  159.     BNE .EndSpawn
  160.     JSL $02A9DE
  161.     BMI .EndSpawn
  162.     LDA #$01
  163.     STA $14C8,y
  164.     XBA
  165.     STA $009E,y
  166.     LDA $E4,x
  167.     STA $00E4,y
  168.     LDA $14E0,x
  169.     STA $14E0,y
  170.     LDA $D8,x
  171.     STA $00D8,y
  172.     LDA $14D4,x
  173.     STA $14D4,y
  174.     PHX
  175.     TYX
  176.     JSL $07F7D2
  177.     PLX
  178. .EndSpawn
  179.     RTS
  180.  
  181. ;========================
  182. ; Spawn Extended Sprite
  183. ;========================
  184.    
  185. GenExtra:
  186.     LDY #$07
  187. ExtraLoop:
  188.     LDA $170B,y
  189.     BEQ Extra1
  190.     DEY
  191.     BPL ExtraLoop
  192.     RTS
  193. Extra1:
  194.     STY $00
  195.     LDA #$05
  196.     STA $170B,y
  197.     LDA #$01
  198.     STA $0F5E,y
  199.     LDA #$30
  200.     STA $173D,y
  201.     LDY $157C,x
  202.     LDA FireSpeeds,y
  203.     LDY $00
  204.     STA $1747,y
  205.     LDY $157C,x
  206.     LDA $E4,x
  207.     CLC
  208.     ADC FirePos,y
  209.     LDY $00
  210.     STA $171F,y
  211.     LDA $14E0,x
  212.     ADC #$00
  213.     STA $1733,y
  214.     LDA $D8,x
  215.     CLC
  216.     ADC #$08
  217.     STA $1715,y
  218.     LDA $14D4,x
  219.     ADC #$00
  220.     STA $1729,y
  221.     LDA #$FF
  222.     STA $176F,y
  223.     RTS
  224.    
  225. FirePos:
  226.     db $08,$00
  227. FireSpeeds:
  228.     db $03,$FD
  229.    
  230. ;========================
  231. ; Graphics routine
  232. ;========================
  233.    
  234. Tilemap:
  235.     db $80,$A0                      ; Stand still
  236.     db $80,$82,$80,$A2,$80,$84      ; Walking
  237.     db $86,$A6                      ; Falling
  238.     db $88,$A8                      ; Looking surprised
  239. YDisp:
  240.     db $F0,$00
  241.     db $F0,$00,$F0,$00,$F0,$00
  242.     db $F0,$00
  243.     db $F0,$00
  244. Props:
  245.     db $4F,$0F
  246.    
  247. Graphics:
  248.     JSR GetDrawInfo
  249.    
  250.     LDA $1602,x
  251.     STA $03
  252.     LDA $157C,x
  253.     STA $02
  254.    
  255.     PHX
  256.     LDX #$01
  257. -   PHX
  258.  
  259.     TXA
  260.     CLC : ADC $03
  261.     TAX
  262.    
  263.     LDA $00
  264.     STA $0300,y
  265.    
  266.     LDA $01
  267.     CLC : ADC YDisp,x
  268.     STA $0301,y
  269.    
  270.     LDA Tilemap,x
  271.     STA $0302,y
  272.    
  273.     LDX $02
  274.     LDA Props,x
  275.     STA $0303,y
  276.    
  277.     PLX
  278.     INY #4
  279.     DEX
  280.     BPL -
  281.    
  282.     PLX
  283.     LDY #$02
  284.     LDA #$01
  285.     JSL $81B7B3
  286.     RTS
  287.    
  288. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  289. ; GET_DRAW_INFO
  290. ; This is a helper for the graphics routine.  It sets off screen flags, and sets up
  291. ; variables.  It will return with the following:
  292. ;
  293. ;       Y = index to sprite OAM ($300)
  294. ;       $00 = sprite x position relative to screen boarder
  295. ;       $01 = sprite y position relative to screen boarder  
  296. ;
  297. ; It is adapted from the subroutine at $03B760
  298. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  299.  
  300. SPR_T1:              db $0C,$1C
  301. SPR_T2:              db $01,$02
  302.  
  303. GetDrawInfo:
  304.     STZ $186C,x             ; reset sprite offscreen flag, vertical
  305.     STZ $15A0,x             ; reset sprite offscreen flag, horizontal
  306.     LDA $E4,x               ; \
  307.     CMP $1A                 ;  | set horizontal offscreen if necessary
  308.     LDA $14E0,x             ;  |
  309.     SBC $1B                 ;  |
  310.     BEQ .ON_SCREEN_X        ;  |
  311.     INC $15A0,x             ; /
  312.  
  313. .ON_SCREEN_X
  314.     LDA $14E0,x             ; \
  315.     XBA                     ;  |
  316.     LDA $E4,x               ;  |
  317.     REP #$20                ;  |
  318.     SEC                     ;  |
  319.     SBC $1A                 ;  | mark sprite invalid if far enough off screen
  320.     CLC                     ;  |
  321.     ADC.w #$0040            ;  |
  322.     CMP.w #$0180            ;  |
  323.     SEP #$20                ;  |
  324.     ROL A                   ;  |
  325.     AND #$01                ;  |
  326.     STA $15C4,x             ; /
  327.     BNE .INVALID           ;
  328.    
  329.     LDY #$00                ; \ set up loop:
  330.     LDA $1662,x             ;  |
  331.     AND #$20                ;  | if not smushed (1662 & 0x20), go through loop twice
  332.     BEQ .ON_SCREEN_LOOP     ;  | else, go through loop once
  333.     INY                     ; /
  334. .ON_SCREEN_LOOP
  335.     LDA $D8,x               ; \
  336.     CLC                     ;  | set vertical offscreen if necessary
  337.     ADC SPR_T1,y            ;  |
  338.     PHP                     ;  |
  339.     CMP $1C                 ;  | (vert screen boundry)
  340.     ROL $00                 ;  |
  341.     PLP                     ;  |
  342.     LDA $14D4,x             ;  |
  343.     ADC #$00                ;  |
  344.     LSR $00                 ;  |
  345.     SBC $1D                 ;  |
  346.     BEQ .ON_SCREEN_Y        ;  |
  347.     LDA $186C,x             ;  | (vert offscreen)
  348.     ORA SPR_T2,y            ;  |
  349.     STA $186C,x             ;  |
  350. .ON_SCREEN_Y
  351.     DEY                     ;  |
  352.     BPL .ON_SCREEN_LOOP     ; /
  353.  
  354.     LDY $15EA,x             ; get offset to sprite OAM
  355.     LDA $E4,x               ; \
  356.     SEC                     ;  |
  357.     SBC $1A                 ;  | $00 = sprite x position relative to screen boarder
  358.     STA $00                 ; /
  359.     LDA $D8,x               ; \
  360.     SEC                     ;  |
  361.     SBC $1C                 ;  | $01 = sprite y position relative to screen boarder
  362.     STA $01                 ; /
  363.     RTS  ; return
  364.  
  365. .INVALID
  366.     PLA                     ; \ return from *main gfx routine* subroutine...
  367.     PLA                     ;  |    ...(not just this subroutine)
  368.     RTS                     ; /
  369.  
  370. ;==================
  371. ; Sub_Horiz_Pos
  372. ;==================
  373.    
  374. SubHorizPos:
  375.     LDY #$00
  376.     LDA $94
  377.     SEC
  378.     SBC $E4,x
  379.     STA $0F
  380.     LDA $95
  381.     SBC $14E0,x
  382.     BPL $01
  383.     INY
  384.     RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement