dos33fsprogs/demos/outline2021/demo/a2_inside.s

429 lines
5.4 KiB
ArmAsm

; Apple II self portrait using Boxes
;================================
; Clear screen and setup graphics
;================================
a2_inside:
jsr SETGR ; set lo-res 40x40 mode
bit PAGE0
bit LORES
bit FULLGR ; make it 40x48
;=============================
; init wires
jsr wires_create_lookup
;=============================
; draw the computer
draw_box_loop:
; get color/Y0
jsr load_byte
tax ; Y0 is in X
tya ; check for end
bmi done_computer
jsr load_byte ; Y1
sta Y1
jsr load_byte ; X0
sta X0
tya
lsr
lsr
sta COLOR
jsr load_byte ; X1
sta H2
tya
and #$C0
ora COLOR
lsr
lsr
lsr
lsr
jsr SETCOL
inner_loop:
;; HLINE Y,H2 at A
;; X left alone, carry set on exit
;; H2 left alone
;; Y and A trashed
ldy X0
txa
jsr HLINE
cpx Y1
inx
bcc inner_loop
bcs draw_box_loop
done_computer:
;====================================
; draw the demo, sierpinski at first
;====================================
; screen is from (11,6) - (20,23)
; so size is 9,17?
lda #200
sta FRAME
; pause a bit at beginning
jsr WAIT
sier_loop:
lda #100 ; Wait a bit, we're too fast
jsr WAIT
inc FRAME ; increment frame
ldx #17 ; YY
sier_yloop:
lda #9 ; XX
sta XX
sier_xloop:
txa ; get YY
clc
adc FRAME ; and add in FRAME
and XX ; and it with XX
bne black
lda FRAME ; color is based on frame
lsr ; only update every 16 lines?
lsr
lsr
lsr
bne not_zero ; but no color 0 (would be all black)
lda #3 ; how about purple instead
not_zero:
.byte $2C ; bit trick
black:
lda #$00
jsr SETCOL ; set top/bottom nibble same color
lda XX ; offset XX to tiny screen
clc
adc #11
tay ; put into Y
txa ; offset YY to tiny screen
clc
adc #6 ; put into A
jsr PLOT ; PLOT AT Y,A
dec XX
bpl sier_xloop
dex
bpl sier_yloop
lda FRAME
bne sier_loop
; rts
;====================================
; draw the demo, wires
;====================================
; screen is from (11,6) - (20,23)
; so size is 9,17?
lda #200
sta FRAME
; pause a bit at beginning
jsr WAIT
a2_wire_loop:
jsr wires_cycle_colors
lda #100 ; Wait a bit, we're too fast
jsr WAIT
inc FRAME ; increment frame
ldx #17 ; YY
a2_wire_yloop:
lda #9 ; XX
sta XX
a2_wire_xloop:
txa
and #$f
asl
asl
asl
asl
ora XX
tay
lda wires_lookup,Y ; load from array ; 4
cmp #11
bcs acolor_notblue ; if < 11, blue
acolor_blue:
lda #$11 ; blue offset
acolor_notblue:
tay
lda wires_colorlookup-11,Y ; lookup color
acolor_notblack:
jsr SETCOL ; set top/bottom nibble same color
lda XX ; offset XX to tiny screen
clc
adc #11
tay ; put into Y
txa ; offset YY to tiny screen
clc
adc #6 ; put into A
jsr PLOT ; PLOT AT Y,A
dec XX
bpl a2_wire_xloop
dex
bpl a2_wire_yloop
lda FRAME
bne a2_wire_loop
;=======================================
; copy to $c00
;=======================================
lda #0
sta DRAW_PAGE
jsr gr_copy_from_current
lda #4
sta DISP_PAGE
;============================
; rotozoom
;============================
; do a (hopefully fast) roto-zoom
; jsr clear_screens
; jsr init_multiply_tables
jsr gr_copy_to_current
jsr page_flip
jsr gr_copy_to_current
;=================================
; main loop
lda #0
sta ANGLE
sta SCALE_F
sta FRAME
lda #1
sta direction
lda #$10
sta scaleaddl
lda #$00
sta scaleaddh
lda #1
sta SCALE_I
rz_main_loop:
jsr rotozoom_c00
jsr page_flip
;wait_for_keypress:
; lda KEYPRESS
; bpl wait_for_keypress
; bit KEYRESET
clc
lda FRAME
adc direction
sta FRAME
cmp #$f8
beq rback_at_zero
cmp #33
beq rat_far_end
bne rdone_reverse
rback_at_zero:
; inc which_image
; lda which_image
; cmp #3
; bne refresh_image
; lda #0
; sta which_image
;refresh_image:
; jsr load_background
rat_far_end:
rts
; change bg color
; lda roto_color_even_smc+1
; clc
; adc #$01
; and #$0f
; sta roto_color_even_smc+1
; lda roto_color_odd_smc+1
; clc
; adc #$10
; and #$f0
; sta roto_color_odd_smc+1
; reverse direction
;; lda direction
; eor #$ff
; clc
; adc #1
; sta direction
; lda scaleaddl
; eor #$ff
; clc
; adc #1
; sta scaleaddl
; lda scaleaddh
; eor #$ff
; adc #0
; sta scaleaddh
rdone_reverse:
clc
lda ANGLE
adc direction
and #$1f
sta ANGLE
clc
lda SCALE_F
adc scaleaddl
sta SCALE_F
lda SCALE_I
adc scaleaddh
sta SCALE_I
jmp rz_main_loop
;direction: .byte $01
;scaleaddl: .byte $10
;scaleaddh: .byte $00
rts
;=========================
; load byte routine
;=========================
load_byte:
inc load_byte_smc+1
bne load_byte_nowrap
inc load_byte_smc+2
load_byte_nowrap:
; so no need to wrap
load_byte_smc:
lda box_data-1
tay
and #$3f
rts
; 4 6 6 6 6
box_data:
.byte $00,$2F,$C0,$E7
.byte $01,$2B,$0A,$9B
.byte $28,$29,$43,$D4
.byte $24,$27,$43,$D6
.byte $20,$23,$45,$D7
.byte $1C,$1F,$48,$D8
.byte $23,$26,$07,$8E
.byte $24,$27,$08,$92
.byte $1F,$1F,$0D,$92
.byte $2A,$2B,$43,$54
.byte $2C,$2D,$46,$53
.byte $2C,$2D,$14,$97
.byte $08,$16,$1C,$9C
.byte $02,$1A,$49,$D8
.byte $04,$18,$0A,$95
.byte $06,$17,$0B,$14
.byte $15,$29,$22,$A2
.byte $13,$28,$22,$A4
.byte $13,$14,$5C,$63
.byte $15,$16,$5B,$61
.byte $17,$2B,$59,$E1
.byte $18,$20,$1A,$20
.byte $22,$2A,$1A,$20
.byte $1C,$1C,$5B,$60
.byte $26,$26,$5B,$60
.byte $1F,$20,$DF,$1F
.byte $29,$2A,$DF,$1F
.byte $19,$1E,$5D,$5E
.byte $23,$28,$5D,$5E
.byte $02,$03,$17,$D7
.byte $FF