WORKS
This commit is contained in:
parent
cb2898f6a6
commit
ce7e051504
2 changed files with 81 additions and 18 deletions
|
@ -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)}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
89
dither4.s
89
dither4.s
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue