dos33fsprogs/fireworks/hgr.s

505 lines
7.8 KiB
ArmAsm
Raw Normal View History

HGR_SHAPE = $1A
HGR_SHAPE_H = $1B
HGR_BITS = $1C
HGR_COUNT = $1D
HMASK = $30
DSCTMP = $9D
HGR_DX = $D0
HGR_DX_H = $D1
HGR_DY = $D2
HGR_QUADRANT = $D3
HGR_E = $D4
HGR_E_H = $D5
HGR_X = $E0
HGR_X_H = $E1
HGR_Y = $E2
;HGR_COLOR = $E4
HGR_HORIZ = $E5
HGR_PAGE = $E6
TXTCLR = $C050
MIXSET = $C053
LOWSCR = $C054
MIXCLR = $C052
HISCR = $C055
.align $100
2018-09-10 05:09:58 +00:00
;==========================
; HGR2
;==========================
hgr2:
; F3D8
bit HISCR ; BIT SW.HISCR Use PAGE2 ($C055)
bit MIXCLR ; BIT SW.MIXCLR
lda #$40 ; HIRES Page 2 at $4000
bne sethpg
2018-09-10 05:09:58 +00:00
;==========================
; HGR
;==========================
hgr:
; F3E2
lda #$20 ; HIRES Page 1 at $2000
bit LOWSCR ; BIT SW.LOWSCR Use PAGE1 ($C054)
bit MIXSET ; BIT SW.MIXSET (Mixed text)
sethpg:
; F3EA
sta HGR_PAGE
lda HIRES
lda TXTCLR
hclr:
lda #0 ; black background
sta HGR_BITS
bkgnd:
; F3F6
lda HGR_PAGE
sta HGR_SHAPE+1
ldy #0
sty HGR_SHAPE
bkgnd_loop:
lda HGR_BITS
sta (HGR_SHAPE),y
jsr color_shift
iny
bne bkgnd_loop
inc HGR_SHAPE+1
lda HGR_SHAPE+1
and #$1f ; see if $40 or $60
bne bkgnd_loop
rts
2018-09-09 19:54:53 +00:00
msktbl: .byte $81,$82,$84,$88,$90,$A0,$C0 ; original
2018-09-09 20:56:27 +00:00
;====================================================
; HPOSN
; time = 9 + 61 + 31 + 22 + 42 + 22 + 23 = 210
hposn:
; F411: move values into expected zp locations
2018-09-09 03:53:20 +00:00
sta HGR_Y ; 3
stx HGR_X ; 3
sty HGR_X+1 ; 3
2018-09-09 19:54:53 +00:00
;===========
; 9
; calc y-position addr. no lookup table?
2018-09-09 03:53:20 +00:00
pha ; 3
and #$C0 ; 2
sta GBASL ; 3
lsr ; 2
lsr ; 2
ora GBASL ; 3
sta GBASL ; 3
pla ; 4
sta GBASH ; 3
asl ; 2
asl ; 2
asl ; 2
rol GBASH ; 5
asl ; 2
rol GBASH ; 5
asl ; 2
ror GBASL ; 5
lda GBASH ; 3
and #$1f ; 2
ora HGR_PAGE ; 3
sta GBASH ; 3
;============
2018-09-09 19:54:53 +00:00
; 61
; F438
2018-09-09 19:54:53 +00:00
; divide/mod 16-bit x poisition by 7
; incoming, X=(y,x)
; outgoing y=q, a=r
; Divide by 7 (From December '84 Apple Assembly Line)
2018-09-09 20:10:07 +00:00
txa ; 2
clc ; 2
sta HGR_HORIZ ; 3
lsr ; 2
lsr ; 2
lsr ; 2
adc HGR_HORIZ ; 3
ror ; 2
lsr ; 2
lsr ; 2
adc HGR_HORIZ ; 3
ror ; 2
lsr ; 2
lsr ; 2
2018-09-09 19:54:53 +00:00
; x/7 is in A
2018-09-09 20:10:07 +00:00
;============
; 31
2018-09-09 19:54:53 +00:00
; calculate remainder
2018-09-09 20:10:07 +00:00
clc ; 2
sta HGR_HORIZ ; 3
asl ; 2
adc HGR_HORIZ ; 3
asl ; 2
adc HGR_HORIZ ; 3
2018-09-09 19:54:53 +00:00
; HGR_HORIZ=x/7, A=HGR_HORIZ*7
; calculate remainder by X-(Q*7)
2018-09-09 20:10:07 +00:00
sec ; 2
eor #$ff ; 2
adc HGR_X ; 3
; A = remainder ;===========
; 22
cpy #0 ; 2
beq done_mod_nop_23 ; 3
2018-09-09 19:54:53 +00:00
theres_high:
2018-09-09 20:56:27 +00:00
; -1
clc ; 2
adc #4 ; make remainder match ; 2
pha ; 3
lda HGR_HORIZ ; 3
adc #36 ; 2
sta HGR_HORIZ ; 3
pla ; 4
;====
2018-09-09 19:54:53 +00:00
2018-09-09 20:56:27 +00:00
cmp #7 ; 2
bcc done_mod_nop14 ; blt ; 3
; -1
sec ; 2
sbc #7 ; 2
inc HGR_HORIZ ; 5
jmp done_mod ; 3
;===========================
; Y=HIGH,NOR = 23+5 = 28 (14)
; Y=HIGH,R = 23+16 = 42
; Y=LOW = 5 + 37(14+23)= 42
2018-09-09 20:56:27 +00:00
done_mod_nop_23:
inc HGR_HORIZ,X ; (nop) ; 6
dec HGR_HORIZ,X ; (nop) ; 6
ldy HGR_HORIZ ; (nop) ; 3
ldy HGR_HORIZ ; (nop) ; 3
ldy HGR_HORIZ ; (nop) ; 3
nop ; 2
2018-09-09 20:56:27 +00:00
done_mod_nop14:
inc HGR_HORIZ,X ; (nop) ; 6
dec HGR_HORIZ,X ; (nop) ; 6
nop ; 2
2018-09-09 19:54:53 +00:00
done_mod:
ldy HGR_HORIZ ; 3
2018-09-09 03:53:20 +00:00
tax ; 2
2018-09-09 20:10:07 +00:00
lda msktbl,x ; 4+
2018-09-09 03:53:20 +00:00
sta HMASK ; 3
tya ; 2
lsr ; 2
lda HGR_COLOR ; 3
sta HGR_BITS ; 3
2018-09-09 20:56:27 +00:00
;===========
; 22
2018-09-09 20:56:27 +00:00
2018-09-09 03:53:20 +00:00
bcs color_shift ; 3
2018-09-09 20:56:27 +00:00
; cs = 3+20
2018-09-09 03:53:20 +00:00
;-1
2018-09-09 20:56:27 +00:00
; need 23 = 2+6+X = 15
inc HMASK,X ; nop ; 6
dec HMASK,X ; nop ; 6
lda HMASK ; nop ; 3
rts ; 6
;===========
; 23
;=====================================
; HPLOT0
2018-09-10 05:09:58 +00:00
;=====================================
; point in (YX),A
; 244 cycles
hplot0:
; F457
jsr hposn ; 6+210
2018-09-09 03:53:20 +00:00
lda HGR_BITS ; 3
eor (GBASL),y ; 5+
2018-09-09 03:53:20 +00:00
and HMASK ; 3
eor (GBASL),y ; 5+
sta (GBASL),y ; 6
2018-09-09 03:53:20 +00:00
rts ; 6
2018-09-09 20:56:27 +00:00
;============
; 244
move_left_or_right:
; F465
bpl move_right
2018-09-10 05:09:58 +00:00
lda HMASK ; 3
lsr ; 2
bcs lr_2
2018-09-10 05:09:58 +00:00
eor #$c0 ; 2
lr_1:
2018-09-10 05:09:58 +00:00
sta HMASK ; 3
rts ; 6
lr_2:
dey
bpl lr_3
ldy #39
lr_3:
lda #$c0
lr_4:
sta HMASK
sty HGR_HORIZ
lda HGR_BITS
2018-09-09 20:10:07 +00:00
;===================================
2018-09-10 05:09:58 +00:00
; COLOR_SHIFT
;===================================
2018-09-09 20:10:07 +00:00
; positive = 7+(7)+6 = 20
; negative = 7+ 7 +6 = 20
color_shift: ; F47E
2018-09-09 03:53:20 +00:00
asl ; 2
cmp #$c0 ; 2
2018-09-09 03:53:20 +00:00
bpl done_color_shift ; 3
; -1
lda HGR_BITS ; 3
eor #$7f ; 2
sta HGR_BITS ; 3
2018-09-09 20:10:07 +00:00
rts ; 6
done_color_shift:
2018-09-09 20:10:07 +00:00
lda HGR_BITS ; nop ; 3
nop ; 2
nop ; 2
2018-09-09 03:53:20 +00:00
rts ; 6
2018-09-10 05:09:58 +00:00
;==============================================================
move_right:
lda HMASK
asl
eor #$80
bmi lr_1
lda #$81
iny
cpy #40
bcc lr_4
ldy #0
bcs lr_4
con_1c: .byte $1c
con_03: .byte $03
con_04: .byte $04
move_up_or_down:
; F4D3
bmi move_down
clc
lda GBASH
bit con_1c ; CON.1C
bne mu_5
asl GBASL
bcs mu_3
bit con_03 ; CON.03
beq mu_1
adc #$1f
sec
bcs mu_4
; F4Eb
mu_1:
adc #$23
2018-09-09 03:53:20 +00:00
pha ; 3
lda GBASL
adc #$b0
bcs mu_2
adc #$f0
; f4f6
mu_2:
sta GBASL
pla
bcs mu_4
mu_3:
adc #$1f
mu_4:
ror GBASL
mu_5:
adc #$fc
ud_1:
sta GBASH
rts
; f505
move_down:
lda GBASH
adc #$4
bit con_1c
bne ud_1
asl GBASL
bcc md_2
adc #$e0
clc
bit con_04
beq md_3;
lda GBASL
adc #$50
eor #$f0
beq md_1
eor #$f0
md_1:
sta GBASL
lda HGR_PAGE
bcc md_3
md_2:
adc #$e0
md_3:
ror GBASL
bcc ud_1
2018-09-10 05:09:58 +00:00
;===================================
; HGLIN
;===================================
; cycles = 22+
hglin:
2018-09-10 05:09:58 +00:00
; F53A: calc quadrant
2018-09-09 03:53:20 +00:00
pha ; 3
2018-09-10 05:09:58 +00:00
sec ; 2
sbc HGR_X ; 3
2018-09-09 03:53:20 +00:00
pha ; 3
2018-09-10 05:09:58 +00:00
txa ; 2
sbc HGR_X+1 ; 3
sta HGR_QUADRANT ; 3
;===========
; 22
; F544
bcs hglin_1
2018-09-10 05:09:58 +00:00
pla ; 4
eor #$ff ; 2
adc #1 ; 2
2018-09-09 03:53:20 +00:00
pha ; 3
2018-09-10 05:09:58 +00:00
lda #0 ; 2
sbc HGR_QUADRANT ; 3
; F550
hglin_1:
2018-09-10 05:09:58 +00:00
sta HGR_DX+1 ; 3
sta HGR_E+1 ; 3
pla ; 4
sta HGR_DX ; 3
sta HGR_E ; 3
pla ; 4
sta HGR_X ; 3
stx HGR_X+1 ; 3
tya ; 2
clc ; 2
sbc HGR_Y ; 3
bcc hglin_2 ; 3
eor #$ff ; 2
adc #$fe ; 2
hglin_2:
; F568
2018-09-10 05:09:58 +00:00
sta HGR_DY ; 3
sty HGR_Y ; 3
ror HGR_QUADRANT
2018-09-10 05:09:58 +00:00
sec ; 2
sbc HGR_DX ; 3
tax ; 2
lda #$ff ; 3
sbc HGR_DX+1 ; 3
sta HGR_COUNT ; 3
ldy HGR_HORIZ ; 3
bcs movex2 ; always? ; 3
; f57c
movex:
2018-09-10 05:09:58 +00:00
asl ; 2
jsr move_left_or_right ; 6+?
sec ; 2
; f581
movex2:
2018-09-10 05:09:58 +00:00
lda HGR_E ; 3
adc HGR_DY ; 3
sta HGR_E ; 3
lda HGR_E+1 ; 3
sbc #0 ; 2
movex2_1:
2018-09-10 05:09:58 +00:00
sta HGR_E+1 ; 3
lda (GBASL),y
2018-09-10 05:09:58 +00:00
eor HGR_BITS ; 3
and HMASK ; 3
eor (GBASL),y
sta (GBASL),y
2018-09-10 05:09:58 +00:00
inx ; 2
bne movex2_2
2018-09-10 05:09:58 +00:00
inc HGR_COUNT
beq rts22
; F59e
movex2_2:
2018-09-10 05:09:58 +00:00
lda HGR_QUADRANT ; 3
bcs movex
2018-09-10 05:09:58 +00:00
jsr move_up_or_down ; 6+
clc ; 2
lda HGR_E ; 3
adc HGR_DX ; 3
sta HGR_E ; 3
lda HGR_E+1 ; 3
adc HGR_DX+1 ; 3
bvc movex2_1 ; 3
2018-09-10 05:09:58 +00:00
;===============================
; HPLOT_TO
;===============================
;
; cycles = 10 + 6 + X + 6
hplot_to:
2018-09-10 05:09:58 +00:00
; F712: put vars in right location
sty DSCTMP ; 3
tay ; 2
txa ; 2
ldx DSCTMP ; 3
;============
; 10
jsr hglin ;6+?
rts22:
2018-09-10 05:09:58 +00:00
rts ; 6
2018-09-10 05:09:58 +00:00
;=============================
; HCOLOR_EQUALS
;=============================
; Color in X
2018-09-10 05:09:58 +00:00
; 13 cycles
hcolor_equals:
; F6E9
; TODO: mask to be less than 8
2018-09-10 05:09:58 +00:00
lda colortbl,x ; 4+
sta HGR_COLOR ; 3
rts ; 6
colortbl:
.byte $00,$2A,$55,$7F,$80,$AA,$D5,$FF