dos33fsprogs/mist/octagon_rotation.s
2020-07-11 20:17:16 -04:00

322 lines
4.7 KiB
ArmAsm

;=================================
; clicked on map, rotate the tower
;=================================
rotate_tower:
ldy TOWER_ROTATION
iny
cpy #10
bcc done_rotate_tower
ldy #0
done_rotate_tower:
sty TOWER_ROTATION
jsr change_rotation
rts
handle_tower_rotation:
; draw sprites based on background
; only needs to be done once?
ldy #0
lda #1
sta mask_smc+1
tower_sprite_loop:
lda MARKER_SWITCHES
mask_smc:
and #1
beq skip_sprite
lda map_sprites,Y
sta INL
lda map_sprites+1,Y
sta INH
lda map_sprites_coords,Y
sta XPOS
lda map_sprites_coords+1,Y
sta YPOS
tya
pha
jsr put_sprite_crop
pla
tay
skip_sprite:
asl mask_smc+1
iny
iny
cpy #16
bne tower_sprite_loop
; draw the tower line
jsr draw_tower_line
; draw the blinking_tower
lda FRAMEL
and #$20
beq tower_blink_off
lda #<tower_sprite
sta INL
lda #>tower_sprite
sta INH
lda #29
sta XPOS
lda #18
sta YPOS
jsr put_sprite_crop
tower_blink_off:
rts
draw_tower_line:
; set color
ldy TOWER_ROTATION
; only 4 hint rotations, so only change line color if one of those
ldx line_colors,Y
cpx #$77
beq color_good
lda MARKER_SWITCHES
line_gears:
cpy #ROTATION_GEARS
bne line_dock
and #MARKER_GEARS
beq white_line
bne red_line
line_dock:
cpy #ROTATION_DOCK
bne line_tree
and #MARKER_DOCK
beq white_line
bne red_line
line_tree:
cpy #ROTATION_TREE
bne line_spaceship
and #MARKER_TREE
beq white_line
bne red_line
line_spaceship:
and #MARKER_SPACESHIP
beq white_line
red_line:
ldx #$11
bne color_good
white_line:
ldx #$77
color_good:
stx plot_color+1
; get initial position (29 x 20)
ldy #(29*2)
sty CH
lda #(20*4)
sta CV
tower_line_loop:
; check x bounds
ldy CH
cpy #(8*2)
bcc done_tower_line
cpy #(34*2)
bcs done_tower_line
; check y bounds
lda CV
cmp #(6*4)
bcc done_tower_line
cmp #(40*4)
bcs done_tower_line
jsr plot_point
; update X
lda CH
clc
ldy TOWER_ROTATION
adc xslopes,Y
sta CH
; update Y
lda CV
clc
adc yslopes,Y
sta CV
jmp tower_line_loop
done_tower_line:
rts
; rotations (10)
; for each y increment/decrement, how much X to change
xslopes:
.byte 1 ; (1,0) yslope=0
.byte 1 ; (1,2) yslope=2
.byte $ff ; (-1,4) yslope=4
.byte $ff ; (-1,1) yslope=1
.byte $ff ; (-1,0.5) yslope=0.5
.byte $ff ; (-1,0.2) yslope=0.2
.byte $ff ; (-1,-0.5) yslope=-0.5
.byte $ff ; (-1,-1) yslope=-1
.byte $ff ; (-1,-4) yslope=-4
.byte 1 ; ( 1,-2) yslope=-2
; 6.2 fixed point
yslopes:
.byte $00 ; (1,0) yslope=0 00000.00
.byte $08 ; (1,2) yslope=2 00010.00
.byte $10 ; (-1,4) yslope=4 00100.00
.byte $04 ; (-1,1) yslope=1 00001.00
.byte $02 ; (-1,0.5) yslope=0.5 00000.10
.byte $00 ; (-1,0.2) yslope=0.2 00000.01
.byte $fe ; (-1,-0.5) yslope=-0.5 11111.10
.byte $fc ; (-1,-1) yslope=-1 11111.00
.byte $f0 ; (-1,-4) yslope=-4 11100.00
.byte $f8 ; ( 1,-2) yslope=-2 11110.00
line_colors:
.byte $77,$77,$11,$11,$11
.byte $77,$77,$77,$11,$77
.if 0
; 7.1 fixed point
xslopes:
.byte 2 ; (1,0) 0000001.0
.byte 1 ; (0.5,2) 0000000.1
.byte $ff ; (-0.5,8) 1111111.1
.byte $ff ; (-0.5,1) 1111111.1
.byte $fe ; (-1,1) 1111111.0
.byte $f6 ; (-5,1) 1111011.0 ; 01010 -> 1 011.0
.byte $fe ; (-1,-1) 1111111.0
.byte $ff ; (-0.5,-1) 1111111.1
.byte $ff ; (-0.5,-6) 1111111.1
.byte 1 ; ( 0.5,-2) 0000000.1
; 5.3 fixed point
yslopes:
.byte 0 ; (1,0) 00000.000
.byte 2 ; (0.5,2) 00010.000
.byte 8 ; (-0.5,8) 00000.001
.byte 1 ; (-0.5,1)
.byte 1 ; (-1,1)
* .byte 1 ; (-5,1)
.byte $ff ; (-1,-1)
.byte $ff ; (-0.5,-1)
.byte $fa ; (-0.5,-6)
.byte $fe ; ( 0.5,-2)
.endif
;=======================
; map sprites
;=======================
tower_sprite: ; at 29x16
.byte 2,2
.byte $FA,$FA
.byte $FF,$FF
map_sprites:
.word dock_sprite,gears_sprite,spaceship_sprite,generator_sprite
.word clock_sprite,tree_sprite,pool_sprite,dentist_sprite
map_sprites_coords:
.byte 21,28, 27,30, 27,6, 17,14
.byte 9,20, 17,26, 18,16, 24,22
dock_sprite: ; at 21x28
.byte 5,3
.byte $FA,$FA,$FA,$FA,$FA
.byte $AF,$AF,$AF,$AF,$AF
.byte $AA,$FF,$AA,$AA,$AA
gears_sprite: ; at 27x30
.byte 4,2
.byte $FA,$AF,$FA,$FA
.byte $AA,$AA,$FF,$FF
spaceship_sprite: ; at 27,6
.byte 3,3
.byte $AA,$FF,$AA
.byte $A5,$FF,$AA
.byte $FA,$FF,$FA
generator_sprite: ; at 17x14
.byte 2,2
.byte $FF,$AF
.byte $AF,$AA
clock_sprite: ; at 9x20
.byte 4,2
.byte $FA,$FA,$AA,$AA
.byte $FF,$FF,$AA,$AF
tree_sprite: ; at 17x26
.byte 3,3
.byte $AA,$FA,$AA
.byte $FF,$AA,$FF
.byte $AA,$AF,$AA
pool_sprite: ; at 18x16
.byte 5,4
.byte $AA,$AA,$FA,$AA,$FA
.byte $AF,$AA,$FA,$AA,$AA
.byte $AA,$AA,$FA,$AA,$AF
.byte $AF,$AA,$AA,$AA,$AA
dentist_sprite: ; at 24x22
.byte 4,3
.byte $AA,$FA,$FA,$AA
.byte $FF,$AA,$AA,$FF
.byte $AF,$FA,$FA,$AF
; 10->
; AA04F752 2F4149FE
; AAADCDCD DCDCDCCC
; ** TOWER ROTATION **