mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-27 17:29:49 +00:00
404 lines
7.7 KiB
ArmAsm
404 lines
7.7 KiB
ArmAsm
; C64 Opener
|
|
; all good demos start with the C64 boot screen, right?
|
|
|
|
; Apple II has a lot of trouble making clear text with bluish background
|
|
; would be a lot clearer if I used black and white
|
|
|
|
TOP = $F0
|
|
BOTTOM = $F1
|
|
|
|
c64_opener:
|
|
;===================
|
|
; init vars
|
|
;===================
|
|
lda #0
|
|
sta TOP
|
|
sta BOTTOM
|
|
|
|
;===================
|
|
; set graphics mode
|
|
;===================
|
|
|
|
bit PAGE0 ; first graphics page
|
|
bit FULLGR ; full screen graphics
|
|
bit HIRES ; hires mode !!!
|
|
bit SET_GR ; graphics mode
|
|
|
|
lda #<c64
|
|
sta LZ4_SRC
|
|
lda #>c64
|
|
sta LZ4_SRC+1
|
|
|
|
lda #<(c64_end-8) ; skip checksum at end
|
|
sta LZ4_END
|
|
lda #>(c64_end-8) ; skip checksum at end
|
|
sta LZ4_END+1
|
|
|
|
|
|
|
|
lda #<$2000
|
|
sta LZ4_DST
|
|
lda #>$2000
|
|
sta LZ4_DST+1
|
|
|
|
jsr lz4_decode
|
|
|
|
|
|
jsr wait_until_keypress
|
|
|
|
;==============================
|
|
; setup graphics for vapor lock
|
|
;==============================
|
|
|
|
jsr vapor_lock ; 6
|
|
|
|
bit PAGE0 ; first graphics page ; 4
|
|
bit FULLGR ; full screen graphics ; 4
|
|
bit HIRES ; hires mode !!! ; 4
|
|
bit SET_GR ; graphics mode ; 4
|
|
|
|
; vapor lock returns with us at beginning of hsync in line
|
|
; 114 (7410 cycles), so with 5070 + 4550 lines to go (9620)
|
|
; - 16 = 9604, -3 for jmp = 9601
|
|
|
|
; Try X=18 Y=100 cycles=9601
|
|
|
|
ldy #100 ; 2
|
|
loopcoA:ldx #18 ; 2
|
|
loopcoB:dex ; 2
|
|
bne loopcoB ; 2nt/3
|
|
dey ; 2
|
|
bne loopcoA ; 2nt/3
|
|
|
|
beq c64_split
|
|
;.align $100
|
|
|
|
|
|
;================================================
|
|
; c64_split
|
|
;================================================
|
|
; We want to:
|
|
; Wait 3s, just flashing cursor@1Hz
|
|
; Then slowly open to text page0
|
|
; Count to 480?
|
|
; Width = 0 - 40, 10 steps
|
|
|
|
c64_split:
|
|
|
|
|
|
;=========================
|
|
; Top third
|
|
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnNnNnNnTtttGgggNnNnNnNnNnNnNnNn 16= 4W
|
|
|
|
|
|
|
|
ldx #64 ; 2
|
|
jmp c64_loop_1_five_in ; 3
|
|
c64_loop_1:
|
|
lda $0 ; 3
|
|
nop ; 2
|
|
c64_loop_1_five_in:
|
|
lda $0 ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
;=============
|
|
; 25
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
;============
|
|
; 16
|
|
|
|
bit SET_TEXT ; 4
|
|
bit SET_GR ; 4
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
;============
|
|
; 16
|
|
c64_loop_1_end:
|
|
dex ; 2
|
|
bne c64_loop_1 ; 3
|
|
;============
|
|
; 5
|
|
|
|
|
|
|
|
|
|
;=========================
|
|
; Middle third
|
|
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnNnNnTtttNnNnNnNnNnGgggNnNnNnNnLll 11=14W
|
|
|
|
|
|
; 5-1=4
|
|
ldx #64 ; 2
|
|
jmp c64_loop_2_four_in ; 3
|
|
|
|
c64_loop_2:
|
|
nop ; 2
|
|
nop ; 2
|
|
c64_loop_2_four_in:
|
|
nop ; 2
|
|
lda $0 ; 3
|
|
lda $0 ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
lda $0
|
|
;=============
|
|
; 20
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
bit SET_TEXT ; 4
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
|
|
bit SET_GR ; 4
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
lda $0
|
|
|
|
c64_loop_2_end:
|
|
dex ; 2
|
|
bne c64_loop_2 ; 3
|
|
;============
|
|
; 5
|
|
|
|
|
|
;=========================
|
|
; Bottom third
|
|
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnTtttNnNnNnNnNnNnNnNnNnNnNnNnNnNnGgggNn 2=32W
|
|
|
|
; 5-1=4
|
|
ldx #64 ; 2
|
|
jmp c64_loop_3_four_in ; 3
|
|
|
|
c64_loop_3:
|
|
nop ; 2
|
|
nop ; 2
|
|
c64_loop_3_four_in:
|
|
nop ; 2
|
|
lda $0 ; 3
|
|
lda $0 ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
;=============
|
|
; 20
|
|
|
|
nop ; 2
|
|
bit SET_TEXT ; 4
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
;============
|
|
; 16
|
|
|
|
|
|
|
|
|
|
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
nop ; 2
|
|
bit SET_GR ; 4
|
|
nop ; 2
|
|
;============
|
|
; 16
|
|
c64_loop_3_end:
|
|
dex ; 2
|
|
bne c64_loop_3 ; 3
|
|
;============
|
|
; 5
|
|
|
|
; -1
|
|
|
|
|
|
;======================================================
|
|
; We have 4550 cycles in the vblank, use them wisely
|
|
;======================================================
|
|
; do_nothing should be 4550
|
|
; -10 keyboard handling
|
|
; +1 leftover from main screen
|
|
; -15
|
|
; -12
|
|
; -46
|
|
; = 4468
|
|
|
|
|
|
; run the 2Hz counter, overflow at 30 60Hz frames
|
|
clc ; 2
|
|
lda BOTTOM ; 3
|
|
adc #1 ; 2
|
|
sta BOTTOM ; 3
|
|
cmp #30 ; 2
|
|
bne not_thirty ; 3
|
|
;===========
|
|
; 15
|
|
thirty:
|
|
; -1
|
|
lda #0 ; 2
|
|
sta BOTTOM ; 3
|
|
inc TOP ; 5
|
|
jmp done_thirty ; 3
|
|
;===========
|
|
; 12
|
|
|
|
not_thirty:
|
|
lda TOP ; 3
|
|
lda TOP ; 3
|
|
lda TOP ; 3
|
|
lda TOP ; 3
|
|
;===========
|
|
; 12
|
|
|
|
done_thirty:
|
|
; handle the cursor
|
|
; FIXME: not aligned well. Do we care?
|
|
|
|
lda TOP ; 3
|
|
and #$1 ; 2
|
|
beq cursor_off ; 3
|
|
;============
|
|
; 8
|
|
cursor_on:
|
|
; -1
|
|
; it's lSB first
|
|
; blue is 6
|
|
; 1 1111110
|
|
lda #$fE ; blue ; 2
|
|
sta $3300 ; 52 ; 4
|
|
sta $3B00 ; 54 ; 4
|
|
sta $2380 ; 56 ; 4
|
|
sta $2B80 ; 58 ; 4
|
|
; purple is 2
|
|
; 0 1111110
|
|
lda #$7E ; purple ; 2
|
|
sta $3700 ; 53 ; 4
|
|
sta $3F00 ; 55 ; 4
|
|
sta $2780 ; 57 ; 4
|
|
sta $2F80 ; 59 ; 4
|
|
|
|
jmp cursor_done ; 3
|
|
;============
|
|
; 38
|
|
cursor_off:
|
|
; blue is 6
|
|
; 1 1010101
|
|
lda #$d5 ; blue ; 2
|
|
sta $3300 ; 52 ; 4
|
|
sta $3B00 ; 54 ; 4
|
|
sta $2380 ; 56 ; 4
|
|
sta $2B80 ; 58 ; 4
|
|
; purple is 2
|
|
; 0 1010101
|
|
lda #$55 ; purple ; 2
|
|
sta $3700 ; 53 ; 4
|
|
sta $3F00 ; 55 ; 4
|
|
sta $2780 ; 57 ; 4
|
|
sta $2F80 ; 59 ; 4
|
|
nop ; 2
|
|
;============
|
|
; 38
|
|
|
|
|
|
cursor_done:
|
|
|
|
; Try X=17 Y=49 cycles=4460 R8
|
|
nop
|
|
lda $0
|
|
lda $0
|
|
|
|
ldy #49 ; 2
|
|
loopcoE:ldx #17 ; 2
|
|
loopcoF:dex ; 2
|
|
bne loopcoF ; 2nt/3
|
|
dey ; 2
|
|
bne loopcoE ; 2nt/3
|
|
|
|
|
|
lda KEYPRESS ; 4
|
|
bpl no_c64_keypress ; 3
|
|
jmp done_c64
|
|
no_c64_keypress:
|
|
|
|
jmp c64_split ; 3
|
|
|
|
done_c64:
|
|
rts ; 6
|
|
|
|
|
|
|
|
|
|
;===================
|
|
; graphics
|
|
;===================
|
|
c64:
|
|
.incbin "c64.img.lz4",11
|
|
c64_end:
|
|
|
|
|
|
;=========================================================
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNn Nothing
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnNnNnNnTtttGgggNnNnNnNnNnNnNnNn 16= 4W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnNnNnNnNnTtttNnGgggNnNnNnNnNnNnLll 15= 6W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnNnNnTtttNnNnGgggNnNnNnNnNnNnNn 14= 8W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnNnNnNnTtttNnNnNnGgggNnNnNnNnNnLll 13=10W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnNnTtttNnNnNnNnGgggNnNnNnNnNnNn 12=12W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnNnNnTtttNnNnNnNnNnGgggNnNnNnNnLll 11=14W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnNnTtttNnNnNnNnNnNnGgggNnNnNnNnNn 10=16W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnNnTtttNnNnNnNnNnNnNnGgggNnNnNnLll 9=18W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnNnTtttNnNnNnNnNnNnNnNnGgggNnNnNnNn 8=20W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnNnTtttNnNnNnNnNnNnNnNnNnGgggNnNnLll 7=22W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnNnTtttNnNnNnNnNnNnNnNnNnNnGgggNnNnNn 6=24W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnNnTtttNnNnNnNnNnNnNnNnNnNnNnGgggNnLll 5=26W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnNnTtttNnNnNnNnNnNnNnNnNnNnNnNnGgggNnNn 4=28W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnLl lNnTtttNnNnNnNnNnNnNnNnNnNnNnNnNnGgggLll 3=30W
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn NnTtttNnNnNnNnNnNnNnNnNnNnNnNnNnNnGgggNn 2=32W
|
|
|
|
; nLllDdBbbNnNnNnNnNnNnLllN nTtttNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnGgggN NOPE
|
|
; DdBbbNnNnNnNnNnNnNnNnNnNn TtttNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnNnGggg 0=36W
|
|
|
|
|
|
|
|
|