This commit is contained in:
Brooke Vibber 2022-11-26 08:48:01 -08:00
parent cb2898f6a6
commit ce7e051504
2 changed files with 81 additions and 18 deletions

View file

@ -663,7 +663,7 @@ function genAssembly(width, height, nbits, lines) {
let palette1 = new Uint8Array(height); let palette1 = new Uint8Array(height);
let palette2 = new Uint8Array(height); let palette2 = new Uint8Array(height);
let palette3 = new Uint8Array(height); let palette3 = new Uint8Array(height);
let framebuffer = new Uint8Array(stride * height); let bitmap = new Uint8Array(stride * height);
for (let y = 0; y < height; y++) { for (let y = 0; y < height; y++) {
palette1[y] = lines[y].palette[1]; palette1[y] = lines[y].palette[1];
palette2[y] = lines[y].palette[2]; palette2[y] = lines[y].palette[2];
@ -672,7 +672,7 @@ function genAssembly(width, height, nbits, lines) {
width, width,
nbits, nbits,
lines[y].output, lines[y].output,
framebuffer.subarray(y * stride, (y + 1) * stride) bitmap.subarray(y * stride, (y + 1) * stride)
); );
} }
@ -680,7 +680,7 @@ function genAssembly(width, height, nbits, lines) {
.export palette1 .export palette1
.export palette2 .export palette2
.export palette3 .export palette3
.export framebuffer .export bitmap
palette1: palette1:
${byte2byte(palette1)} ${byte2byte(palette1)}
@ -691,8 +691,8 @@ ${byte2byte(palette2)}
palette3: palette3:
${byte2byte(palette3)} ${byte2byte(palette3)}
framebuffer: bitmap:
${byte2byte(framebuffer)} ${byte2byte(bitmap)}
`; `;
} }

View file

@ -12,29 +12,41 @@ WSYNC = $D40A
VCOUNT = $D40B VCOUNT = $D40B
NMIEN = $D40E NMIEN = $D40E
framebuffer = $a000
framebuffer2 = $b000
temp1l = $80
temp1h = $81
temp1 = temp1l
temp2l = $82
temp2h = $83
temp2 = temp2l
height = 192
bytes_per_line = 40
pages_per_frame = 32
.data .data
.import palette1 .import palette1
.import palette2 .import palette2
.import palette3 .import palette3
.import framebuffer .import bitmap
displaylist: displaylist:
; @fixme resolve the line counts ; @fixme resolve the line counts
.repeat 3 .repeat 3
.byte $70 ; 8 blank lines .byte $70 ; 8 blank lines
.endrep .endrep
; Note the framebuffer cannot cross a 4KiB boundary
; so this is split in half
; ANTIC mode e (160px 2bpp, 1 scan line per line) ; ANTIC mode e (160px 2bpp, 1 scan line per line)
.byte $4e .byte $4e
.addr framebuffer .addr framebuffer
.repeat 95 .repeat height / 2 - 1
.byte $0e .byte $0e
.endrep .endrep
.byte $4e .byte $4e
.addr framebuffer + 96*40 .addr framebuffer2
.repeat 95 .repeat height / 2 - 1
.byte $0e .byte $0e
.endrep .endrep
.byte $41 ; jump and blank .byte $41 ; jump and blank
@ -46,19 +58,35 @@ displaylist:
.export start .export start
.proc start .proc start
; Copy the bitmap into our framebuffer
lda #.lobyte(bitmap)
sta temp1l
lda #.hibyte(bitmap)
sta temp1h
lda #.lobyte(framebuffer)
sta temp2h
lda #.hibyte(framebuffer)
sta temp2h
jsr copy_half_frame
; Second half of bitmap has to be separately aligned
lda #.lobyte(framebuffer2)
sta temp2h
lda #.hibyte(framebuffer2)
sta temp2h
jsr copy_half_frame
; Disable display DMA ; Disable display DMA
lda #$00 lda #$00
sta SDMCTL sta SDMCTL
; Set up the display list ; Set up the display list
lda #.lobyte(displaylist) lda #.lobyte(displaylist)
sta SDLSTL sta SDLSTL
lda #.hibyte(displaylist) lda #.hibyte(displaylist)
sta SDLSTH sta SDLSTH
; Turn off interrupts except reset button
;lda #$20
;sta NMIEN
; Manually wait for first scan line ; Manually wait for first scan line
wait_vblank: wait_vblank:
lda VCOUNT lda VCOUNT
@ -97,14 +125,49 @@ each_scanline:
pla pla
tay tay
iny iny
cpy #192 cpy height
bne each_scanline bne each_scanline
jmp wait_start jmp wait_start
.endproc .endproc
; Loop through scan lines updating the palette ; temp1 contains source address
.proc update_palette ; temp2 contains dest address
; clobbers a/x/y
; incremepts temp1 and temp2 to the end of their regions
.proc copy_half_frame
ldx #0
copy_loop_lines:
ldy #00
copy_loop_bytes:
lda (temp1),y
sta (temp2),y
iny
cpy #bytes_per_line
bne copy_loop_bytes
clc
lda temp1l
adc #bytes_per_line
sta temp1l
lda temp1h
adc #00
sta temp1h
clc
lda temp2l
adc #bytes_per_line
sta temp2l
lda temp2h
adc #00
sta temp2h
inx
cpx #(height / 2)
bne copy_loop_lines
rts rts
.endproc .endproc