--Refactor of scrolling --Addition of edge math --Tied linking doors to DR Flag --Fixed vanilla linking doors
461 lines
11 KiB
NASM
461 lines
11 KiB
NASM
HorzEdge:
|
|
cpy #$ff : beq +
|
|
jsr DetectWestEdge : ldy #$02 : bra ++
|
|
+ jsr DetectEastEdge
|
|
++ cmp #$ff : beq +
|
|
sta $00 : asl : !add $00 : tax
|
|
cpy #$ff : beq ++
|
|
jsr LoadWestData : bra .main
|
|
++ jsr LoadEastData
|
|
.main
|
|
jsr LoadEdgeRoomHorz
|
|
sec : rts
|
|
+ clc : rts
|
|
|
|
VertEdge:
|
|
cpy #$ff : beq +
|
|
jsr DetectNorthEdge : bra ++
|
|
+ jsr DetectSouthEdge
|
|
++ cmp #$ff : beq +
|
|
sta $00 : asl : !add $00 : tax
|
|
cpy #$ff : beq ++
|
|
jsr LoadNorthData : bra .main
|
|
++ jsr LoadSouthData
|
|
.main
|
|
jsr LoadEdgeRoomVert
|
|
sec : rts
|
|
+ clc : rts
|
|
|
|
LoadEdgeRoomHorz:
|
|
lda $03 : sta $a0
|
|
sty $06
|
|
and.b #$0f : asl a : !sub $23 : !add $06 : sta $02
|
|
ldy #$00 : jsr ShiftVariablesMainDir
|
|
|
|
lda $04 : and #$80 : bne .edge
|
|
lda $04 : sta $01 ; load up flags in $01
|
|
jsr PrepScrollToNormal
|
|
bra .scroll
|
|
|
|
.edge
|
|
lda $04 : and #$10 : beq +
|
|
lda #$01
|
|
+ sta $ee ; layer stuff
|
|
|
|
jsr MathHorz
|
|
|
|
.scroll
|
|
jsr ScrollY
|
|
rts
|
|
|
|
LoadEdgeRoomVert:
|
|
lda $03 : sta $a0
|
|
sty $06
|
|
and.b #$f0 : lsr #3 : !sub $21 : !add $06 : sta $02
|
|
ldy #$01 : jsr ShiftVariablesMainDir
|
|
|
|
lda $04 : and #$80 : bne .edge
|
|
lda $04 : sta $01 ; load up flags in $01
|
|
jsr PrepScrollToNormal
|
|
bra .scroll
|
|
|
|
.edge
|
|
lda $04 : and #$10 : beq +
|
|
lda #$01
|
|
+ sta $ee ; layer stuff
|
|
|
|
jsr MathVert
|
|
lda $03
|
|
|
|
.scroll
|
|
jsr ScrollX
|
|
rts
|
|
|
|
|
|
MathHorz:
|
|
jsr MathStart : lda $20
|
|
jsr MathMid : and #$0040
|
|
jsr MathEnd
|
|
rts
|
|
|
|
MathVert:
|
|
jsr MathStart : lda $22
|
|
jsr MathMid : and #$0020
|
|
jsr MathEnd
|
|
rts
|
|
|
|
MathStart:
|
|
rep #$30
|
|
lda $08 : and #$00ff : sta $00
|
|
rts
|
|
|
|
MathMid:
|
|
and #$01ff : !sub $00 : and #$00ff : sta $00
|
|
; nothing should be bigger than $a0 at this point
|
|
|
|
lda $05 : and #$00f0 : lsr #4 : tax
|
|
lda MultDivInfo, x : and #$00ff : tay
|
|
lda $00 : jsr MultiplyByY : sta $02
|
|
|
|
lda $07 : and #$00ff : jsr MultiplyByY : tax
|
|
|
|
lda $05 : and #$000f : tay
|
|
lda MultDivInfo, y : and #$00ff : tay
|
|
lda $02 : jsr DivideByY : sta $00
|
|
lda $0c : and #$00ff : sta $02
|
|
lda $04
|
|
rts
|
|
|
|
MathEnd:
|
|
beq +
|
|
lda #$0100
|
|
+ !add $02 : !add $00
|
|
sta $04
|
|
sep #$30
|
|
rts
|
|
|
|
|
|
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
|
; $06 is either $ff or $01/02
|
|
; uses $00-$03 and $0e for calculation
|
|
; also set up $ac
|
|
ScrollY: ;change the Y offset variables
|
|
lda $a0 : and.b #$f0 : lsr #3 : sta $0603 : inc : sta $0607
|
|
|
|
lda $05 : bne +
|
|
lda $603 : sta $00 : stz $01 : bra ++
|
|
+ lda $607 : sta $00 : lda #$02 : sta $01
|
|
++ ; $01 now contains 0 or 2 and $00 contains the correct lat
|
|
|
|
stz $0e
|
|
rep #$30
|
|
lda $00 : pha
|
|
|
|
lda $e8 : and #$01ff : sta $02
|
|
lda $04 : jsr LimitYCamera : sta $00
|
|
jsr CheckRoomLayoutY : bcc +
|
|
lda $00 : cmp #$0080 : !bge ++
|
|
cmp #$0010 : !blt .cmpSrll
|
|
lda #$0010 : bra .cmpSrll
|
|
++ cmp #$0100 : !bge .cmpSrll
|
|
lda #$0100
|
|
.cmpSrll sta $00
|
|
|
|
; figures out scroll amt
|
|
+ lda $00 : cmp $02 : bne +
|
|
lda #$0000 : bra .next
|
|
+ !blt +
|
|
!sub $02 : inc $0e : bra .next
|
|
+ lda $02 : !sub $00
|
|
|
|
.next
|
|
sta $ab
|
|
jsr AdjustCameraBoundsY
|
|
|
|
pla : sta $00
|
|
sep #$30
|
|
lda $04 : sta $20
|
|
lda $00 : sta $21 : sta $0601 : sta $0605
|
|
lda $01 : sta $aa
|
|
lda $0e : asl : ora $ac : sta $ac
|
|
lda $e9 : and #$01 : asl #2 : tax : lda $0603, x : sta $e9
|
|
rts
|
|
|
|
LimitYCamera:
|
|
cmp #$006c : !bge +
|
|
lda #$0000 : bra .end
|
|
+ cmp #$017d : !blt +
|
|
lda #$0110 : bra .end
|
|
+ !sub #$006c
|
|
.end rts
|
|
|
|
CheckRoomLayoutY:
|
|
jsr LoadRoomLayout ;switches to 8-bit
|
|
cmp #$00 : beq .lock
|
|
cmp #$07 : beq .free
|
|
cmp #$01 : beq .free
|
|
cmp #$04 : !bge .lock
|
|
cmp #$02 : bne +
|
|
lda $06 : cmp #$ff : beq .lock
|
|
+ cmp #$03 : bne .free
|
|
lda $06 : cmp #$ff : bne .lock
|
|
.free rep #$30 : clc : rts
|
|
.lock rep #$30 : sec : rts
|
|
|
|
LoadRoomLayout:
|
|
lda $a0 : asl : !add $a0 : tax
|
|
lda $1f8001, x : sta $b8
|
|
lda $1f8000, x : sta $b7
|
|
sep #$30
|
|
ldy #$01 : lda [$b7], y : and #$1c : lsr #2
|
|
rts
|
|
|
|
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
|
; uses $00-$03 and $0e for calculation
|
|
; also set up $ac
|
|
ScrollX: ;change the X offset variables
|
|
lda $a0 : and.b #$0f : asl : sta $060b : inc : sta $060f
|
|
|
|
lda $05 : bne +
|
|
lda $60b : sta $00 : stz $01 : bra ++
|
|
+ lda $60f : sta $00 : lda #$01 : sta $01
|
|
++ ; $01 now contains 0 or 1 and $00 contains the correct long
|
|
|
|
stz $0e ; pos/neg indicator
|
|
rep #$30
|
|
lda $00 : pha
|
|
|
|
lda $e2 : and #$01ff : sta $02
|
|
lda $04 : jsr LimitXCamera : sta $00
|
|
jsr CheckRoomLayoutX : bcc +
|
|
lda $00 : cmp #$0080 : !bge ++
|
|
lda #$0000 : bra .cmpSrll
|
|
++ lda #$0100
|
|
.cmpSrll sta $00
|
|
|
|
;figures out scroll amt
|
|
+ lda $00 : cmp $02 : bne +
|
|
lda #$0000 : bra .next
|
|
+ !blt +
|
|
!sub $02 : inc $0e : bra .next
|
|
+ lda $02 : !sub $00
|
|
|
|
.next
|
|
sta $ab : lda $04
|
|
|
|
cmp #$0078 : !bge +
|
|
lda #$007f : bra ++
|
|
+ cmp #$0178 : !blt +
|
|
lda #$017f : bra ++
|
|
+ !add #$0007
|
|
++ sta $061c : inc #2 : sta $061e
|
|
|
|
pla : sta $00
|
|
sep #$30
|
|
lda $04 : sta $22
|
|
lda $00 : sta $23 : sta $0609 : sta $060d
|
|
lda $01 : sta $a9
|
|
lda $0e : asl : ora $ac : sta $ac
|
|
lda $e3 : and #$01 : asl #2 : tax : lda $060b, x : sta $e3
|
|
|
|
rts
|
|
|
|
LimitXCamera:
|
|
cmp #$0080 : !bge +
|
|
lda #$0000 : bra .end
|
|
+ cmp #$0181 : !blt +
|
|
lda #$0180
|
|
+ !sub #$0080
|
|
.end rts
|
|
|
|
CheckRoomLayoutX:
|
|
jsr LoadRoomLayout ;switches to 8-bit
|
|
cmp #$04 : !blt .lock
|
|
cmp #$05 : bne +
|
|
lda $06 : cmp #$ff : beq .lock
|
|
+ cmp #$06 : bne .free
|
|
lda $06 : cmp #$ff : bne .lock
|
|
.free rep #$30 : clc : rts
|
|
.lock rep #$30 : sec : rts
|
|
|
|
AdjustCameraBoundsY:
|
|
jsr CheckRoomLayoutY : bcc .free
|
|
|
|
; layouts that are camera locked (quads only)
|
|
lda $04 : and #$00ff : cmp #$007d : !blt +
|
|
lda #$0088 : bra ++
|
|
+ cmp #$006d : !bge +
|
|
lda #$0078 : bra ++
|
|
+ !add #$000b
|
|
|
|
; I think we no longer need the $02 variable
|
|
++ sta $02 : lda $04 : and #$0100 : !add $02 : bra .setBounds
|
|
|
|
; layouts where the camera is free
|
|
.free lda $04 : cmp #$006c : !bge +
|
|
lda #$0077 : bra .setBounds
|
|
+ cmp #$017c : !blt +
|
|
lda #$0187 : bra .setBounds
|
|
+ !add #$000b
|
|
.setBounds sta $0618 : inc #2 : sta $061a
|
|
rts
|
|
|
|
|
|
; don't need midpoint of edge Link is leaving (formerly in $06 - used by dir indicator)
|
|
; don't need width of edge Link is going to (currently in $0b)
|
|
LoadNorthData:
|
|
lda NorthOpenEdge, x : sta $03 : inx ; target room
|
|
lda NorthEdgeInfo, x : sta $07 ; needed for maths - (divide by 2 anyway)
|
|
lda NorthOpenEdge, x : sta $04 : inx ; bit field
|
|
lda NorthEdgeInfo, x : sta $08 ; needed for maths
|
|
lda NorthOpenEdge, x : sta $05 ; ratio
|
|
lda $04 : jsr LoadSouthMidpoint : inx ; needed now, and for nrml transition
|
|
lda SouthEdgeInfo, x : sta $0b : inx ; probably not needed todo: remove
|
|
lda SouthEdgeInfo, x : sta $0c ; needed for maths
|
|
rts
|
|
|
|
LoadSouthMidpoint:
|
|
and #$0f : sta $00 : asl : !add $00 : tax
|
|
lda SouthEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
|
rts
|
|
|
|
LoadSouthData:
|
|
lda SouthOpenEdge, x : sta $03 : inx
|
|
lda SouthEdgeInfo, x : sta $07
|
|
lda SouthOpenEdge, x : sta $04 : inx
|
|
lda SouthEdgeInfo, x : sta $08
|
|
lda SouthOpenEdge, x : sta $05
|
|
lda $04 : jsr LoadNorthMidpoint : inx
|
|
lda NorthEdgeInfo, x : sta $0b : inx
|
|
lda NorthEdgeInfo, x : sta $0c
|
|
rts
|
|
|
|
LoadNorthMidpoint:
|
|
and #$0f : sta $00 : asl : !add $00 : tax
|
|
lda NorthEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
|
rts
|
|
|
|
LoadWestData:
|
|
lda WestOpenEdge, x : sta $03 : inx
|
|
lda WestEdgeInfo, x : sta $07
|
|
lda WestOpenEdge, x : sta $04 : inx
|
|
lda WestEdgeInfo, x : sta $08
|
|
lda WestOpenEdge, x : sta $05
|
|
lda $04 : jsr LoadEastMidpoint : inx
|
|
lda EastEdgeInfo, x : sta $0b : inx
|
|
lda EastEdgeInfo, x : sta $0c
|
|
rts
|
|
|
|
LoadEastMidpoint:
|
|
and #$0f : sta $00 : asl : !add $00 : tax
|
|
lda EastEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
|
rts
|
|
|
|
LoadEastData:
|
|
lda EastOpenEdge, x : sta $03 : inx
|
|
lda EastEdgeInfo, x : sta $07
|
|
lda EastOpenEdge, x : sta $04 : inx
|
|
lda EastEdgeInfo, x : sta $08
|
|
lda EastOpenEdge, x : sta $05
|
|
lda $04 : jsr LoadWestMidpoint : inx
|
|
lda WestEdgeInfo, x : sta $0b : inx
|
|
lda WestEdgeInfo, x : sta $0c
|
|
|
|
|
|
LoadWestMidpoint:
|
|
and #$0f : sta $00 : asl : !add $00 : tax
|
|
lda WestEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
|
rts
|
|
|
|
|
|
DetectNorthEdge:
|
|
ldx #$ff
|
|
lda $a2
|
|
cmp #$82 : bne +
|
|
lda $22 : cmp #$50 : bcs ++
|
|
ldx #$01 : bra .end
|
|
++ ldx #$00 : bra .end
|
|
+ cmp #$83 : bne +
|
|
ldx #$02 : bra .end
|
|
+ cmp #$84 : bne +
|
|
lda $a9 : beq ++
|
|
lda $22 : cmp #$78 : bcs +++
|
|
ldx #$04 : bra .end
|
|
+++ ldx #$05 : bra .end
|
|
++ lda $22 : cmp #$78 : bcs ++
|
|
ldx #$03 : bra .end
|
|
++ ldx #$04 : bra .end
|
|
+ cmp #$85 : bne +
|
|
ldx #$06 : bra .end
|
|
+ cmp #$db : bne +
|
|
lda $a9 : beq ++
|
|
lda $22 : beq ++
|
|
ldx #$08 : bra .end
|
|
++ ldx #$07 : bra .end
|
|
+ cmp #$dc : bne .end
|
|
lda $a9 : bne ++
|
|
lda $22 : cmp #$b0 : bcs ++
|
|
ldx #$09 : bra .end
|
|
++ ldx #$0a
|
|
.end txa : rts
|
|
|
|
DetectSouthEdge:
|
|
ldx #$ff
|
|
lda $a2
|
|
cmp #$72 : bne +
|
|
lda $22 : cmp #$50 : bcs ++
|
|
ldx #$01 : bra .end
|
|
++ ldx #$00 : bra .end
|
|
+ cmp #$73 : bne +
|
|
ldx #$02 : bra .end
|
|
+ cmp #$74 : bne +
|
|
lda $a9 : beq ++
|
|
lda $22 : cmp #$78 : bcs +++
|
|
ldx #$04 : bra .end
|
|
+++ ldx #$05 : bra .end
|
|
++ lda $22 : cmp #$78 : bcs ++
|
|
ldx #$03 : bra .end
|
|
++ ldx #$04 : bra .end
|
|
+ cmp #$75 : bne +
|
|
ldx #$06 : bra .end
|
|
+ cmp #$cb : bne +
|
|
lda $a9 : beq ++
|
|
lda $22 : beq ++
|
|
ldx #$08 : bra .end
|
|
++ ldx #$07 : bra .end
|
|
+ cmp #$cc : bne .end
|
|
lda $a9 : bne ++
|
|
lda $22 : cmp #$b0 : bcs ++
|
|
ldx #$09 : bra .end
|
|
++ ldx #$0a
|
|
.end txa : rts
|
|
|
|
DetectWestEdge:
|
|
ldx #$ff
|
|
lda $a2
|
|
cmp #$65 : bne +
|
|
ldx #$00 : bra .end
|
|
+ cmp #$74 : bne +
|
|
ldx #$01 : bra .end
|
|
+ cmp #$75 : bne +
|
|
ldx #$02 : bra .end
|
|
+ cmp #$82 : bne +
|
|
lda $aa : beq ++
|
|
ldx #$03 : bra .end
|
|
++ ldx #$04 : bra .end
|
|
+ cmp #$85 : bne +
|
|
ldx #$05 : bra .end
|
|
+ cmp #$cc : bne +
|
|
lda $aa : beq ++
|
|
ldx #$06 : bra .end
|
|
++ ldx #$07 : bra .end
|
|
+ cmp #$dc : bne .end
|
|
ldx #$08
|
|
.end txa : rts
|
|
|
|
DetectEastEdge:
|
|
ldx #$ff
|
|
lda $a2
|
|
cmp #$64 : bne +
|
|
ldx #$00 : bra .end
|
|
+ cmp #$73 : bne +
|
|
ldx #$01 : bra .end
|
|
+ cmp #$74 : bne +
|
|
ldx #$02 : bra .end
|
|
+ cmp #$81 : bne +
|
|
lda $aa : beq ++
|
|
ldx #$04 : bra .end
|
|
++ ldx #$03 : bra .end
|
|
+ cmp #$84 : bne +
|
|
ldx #$05 : bra .end
|
|
+ cmp #$cb : bne +
|
|
lda $aa : beq ++
|
|
ldx #$06 : bra .end
|
|
++ ldx #$07 : bra .end
|
|
+ cmp #$db : bne .end
|
|
ldx #$08
|
|
.end txa : rts
|
|
|
|
|
|
|