mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-08-15 02:29:09 +00:00
need to change a bunch to make this work Now load at $4000 as was too big to fit between $1000 and $2000 also turns out our lz4 code was writing past the end, which you notice when you have important code right after the end of HGR1
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
|
|
|
|
|
|
|
|
|