mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-16 23:20:43 +00:00
232 lines
3.1 KiB
ArmAsm
232 lines
3.1 KiB
ArmAsm
; HGR Rectangle
|
|
|
|
; Note: based on VGI code, but stripped out all the fancy features
|
|
; like dithering
|
|
|
|
|
|
OTHER_MASK = TEMP1
|
|
XRUN = TEMP2
|
|
|
|
;=================================
|
|
; Simple Rectangle
|
|
;=================================
|
|
; VGI_RCOLOR = P0
|
|
; VGI_RX1 = P1
|
|
; VGI_RY1 = P2
|
|
; VGI_RXRUN = P3
|
|
; VGI_RYRUN = P4
|
|
; VGI_RCOLOR2 = P5 ; only for dither
|
|
|
|
;==================================
|
|
; Simple Rectangle
|
|
;==================================
|
|
; assume solid color
|
|
|
|
vgi_simple_rectangle:
|
|
|
|
simple_rectangle_loop:
|
|
|
|
lda VGI_RCOLOR
|
|
|
|
and #$f
|
|
tax
|
|
|
|
lda colortbl,X
|
|
|
|
sta HGR_COLOR
|
|
|
|
; get ROW into (GBASL)
|
|
; fast_hposn shifts color for us too
|
|
|
|
jsr fast_hposn
|
|
|
|
; Y is already the RX1/7
|
|
|
|
|
|
; copy the XRUN
|
|
|
|
lda VGI_RXRUN
|
|
sta XRUN
|
|
|
|
inc XRUN ; needed because we compare with beq/bne
|
|
|
|
; check if narrow corner case where begin and end same block
|
|
; if RX%7 + XRUN < 8
|
|
|
|
ldx VGI_RX1
|
|
lda mod7_table,X
|
|
clc
|
|
adc XRUN
|
|
cmp #8
|
|
bcs not_corner
|
|
|
|
; FIXME: this is wrong, see hgr hlin code
|
|
|
|
corner:
|
|
; left=(RX1 MOD 7) right=(RX1 MOD 7)+XRUN
|
|
; mask is left AND right
|
|
|
|
ldx VGI_RX1
|
|
lda mod7_table,X
|
|
tax
|
|
lda left_masks,X
|
|
sta OTHER_MASK
|
|
|
|
txa
|
|
clc
|
|
adc XRUN
|
|
tax
|
|
lda right_masks,X
|
|
and OTHER_MASK
|
|
sta OTHER_MASK
|
|
|
|
; actual
|
|
|
|
lda (GBASL),Y
|
|
eor HGR_BITS
|
|
|
|
and OTHER_MASK
|
|
|
|
eor (GBASL),Y
|
|
sta (GBASL),Y
|
|
|
|
jmp done_row ; that's all
|
|
|
|
not_corner:
|
|
|
|
; see if not starting on boundary
|
|
ldx VGI_RX1
|
|
lda mod7_table,X
|
|
beq draw_run
|
|
|
|
; handle not full left border
|
|
|
|
tax
|
|
lda (GBASL),Y
|
|
eor HGR_BITS
|
|
and left_masks,X
|
|
eor (GBASL),Y
|
|
sta (GBASL),Y
|
|
|
|
iny ; move to next
|
|
|
|
; adjust RUN length by 7- mod7
|
|
txa ; load mod7
|
|
eor #$ff
|
|
sec
|
|
adc #7
|
|
eor #$ff
|
|
sec
|
|
adc XRUN
|
|
sta XRUN
|
|
|
|
jsr swap_colors
|
|
|
|
; draw common
|
|
draw_run:
|
|
lda XRUN
|
|
cmp #7
|
|
bcc draw_right ; blt
|
|
|
|
lda HGR_BITS ; get color
|
|
sta (GBASL),Y ; store out
|
|
|
|
iny ; move to next block
|
|
|
|
jsr swap_colors
|
|
|
|
lda XRUN ; take 7 off the run
|
|
sec
|
|
sbc #7
|
|
sta XRUN
|
|
|
|
jmp draw_run
|
|
|
|
; draw rightmost
|
|
draw_right:
|
|
|
|
beq done_row
|
|
|
|
; see if not starting on boundary
|
|
ldx XRUN
|
|
tax
|
|
|
|
lda (GBASL),Y
|
|
eor HGR_BITS
|
|
and right_masks,X
|
|
eor (GBASL),Y
|
|
sta (GBASL),Y
|
|
|
|
done_row:
|
|
|
|
inc VGI_RY1
|
|
dec VGI_RYRUN
|
|
; bne simple_rectangle_loop
|
|
beq done_done
|
|
jmp simple_rectangle_loop
|
|
|
|
done_done:
|
|
rts
|
|
|
|
|
|
;==========================
|
|
; swap colors
|
|
;==========================
|
|
swap_colors:
|
|
|
|
lda HGR_BITS ; get color
|
|
|
|
; based on code from the ROM at F47F
|
|
colorshift:
|
|
asl ; shift to fix even/odd
|
|
cmp #$c0
|
|
bpl done_colorshift
|
|
|
|
lda HGR_BITS
|
|
eor #$7f ; invert bottom bits
|
|
sta HGR_BITS
|
|
done_colorshift:
|
|
rts
|
|
|
|
;===========================
|
|
; colortbl
|
|
;===========================
|
|
; lives in ROM at F6F6 but we might have that swapped out
|
|
colortbl:
|
|
; black1, green, purple, white1
|
|
; black2, orange, blue, white2
|
|
.byte $00,$2A,$55,$7F,$80,$aa,$D5,$FF
|
|
|
|
|
|
|
|
;========================
|
|
; fast hposn
|
|
;========================
|
|
; like HPOSN but faster (uses lookup tables)
|
|
; need to set up lookup tables before using
|
|
fast_hposn:
|
|
|
|
lda VGI_RY1
|
|
tax
|
|
lda hposn_low,X
|
|
sta GBASL
|
|
lda hposn_high,X
|
|
sta GBASH
|
|
|
|
lda VGI_RX1
|
|
tax
|
|
ldy div7_table,X
|
|
|
|
tya
|
|
lsr
|
|
|
|
lda HGR_COLOR ; if on odd byte rotate bits
|
|
sta HGR_BITS
|
|
bcc done_hposn
|
|
|
|
jsr colorshift
|
|
|
|
done_hposn:
|
|
rts
|
|
|