From 796db2003d0ac0c4c1005da7e9035a1a16e3b74d Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Tue, 22 Oct 2019 23:59:06 +0200 Subject: [PATCH] c64 autoload viewer --- misc/c64viewer/Makefile | 13 ++ misc/c64viewer/README | 31 +++++ misc/c64viewer/picview.asm | 235 +++++++++++++++++++++++++++++++++++++ misc/c64viewer/test.asm | 29 +++++ 4 files changed, 308 insertions(+) create mode 100644 misc/c64viewer/Makefile create mode 100644 misc/c64viewer/README create mode 100644 misc/c64viewer/picview.asm create mode 100644 misc/c64viewer/test.asm diff --git a/misc/c64viewer/Makefile b/misc/c64viewer/Makefile new file mode 100644 index 00000000..f3bafd07 --- /dev/null +++ b/misc/c64viewer/Makefile @@ -0,0 +1,13 @@ +AS=ophis +ASFLAGS=-l $*.lst -m $*.map + +all: picview.prg final.prg c64picview_inc.h + +%.prg: %.asm + $(AS) $(ASFLAGS) -o $@ $< + +final.prg: picview.prg 30.bin 20.bin screen.bin 10.bin bitmap.bin 30.bin color.bin 42.bin 10.bin 00.bin + cat $+ > $@ + +c64picview_inc.h: picview.prg + xxd -i $< | sed 's/^unsigned char/static unsigned char/'| sed '$$ d' > $@ diff --git a/misc/c64viewer/README b/misc/c64viewer/README new file mode 100644 index 00000000..3fa35606 --- /dev/null +++ b/misc/c64viewer/README @@ -0,0 +1,31 @@ +XX format => text/bitmap color/multicolor / extended background mode + +$D020, 15 octets : +BO BORDER +BA BACKGROUND +E1 Extra background color #1 +E2 Extra background color #2 +E3 Extra background color #3 +SE1 sprite extra color #1 +SE2 sprite extra color #2 +S0 sprite #0 +S1 sprite #1 +S2 sprite #2 +S3 sprite #3 +S4 sprite #4 +S5 sprite #5 +S6 sprite #6 +S7 sprite #7 + +TP +T = type + 0 - end of file + 1 - bitmap + 2 - screen ram + 3 - color ram + 4 - border/background etc. +P = packing + 0 - no packing + 1 - RLE packing + 2 - color ram RLE packing + diff --git a/misc/c64viewer/picview.asm b/misc/c64viewer/picview.asm new file mode 100644 index 00000000..2d112b70 --- /dev/null +++ b/misc/c64viewer/picview.asm @@ -0,0 +1,235 @@ +; vim:ts=8 sw=8: +.word $0801 +.org $0801 + .word next, 1911 ; next basic line and line number + .byte $9e,"2061",0 ; SYS2061 +next: .word 0 ; end of basic program + + ; $fb $fc $fd $fe => unused +start: + lda #data + sta $fc + + ; backup border/background/extra/sprite colors + ldx #$10 +colorbak2: + lda $D01F,x + sta $C3EF,x + dex + bne colorbak2 + ; backup COLOR RAM in high RAM +colorbak: + lda $D800,x + sta $C400,x + lda $D900,x + sta $C500,x + lda $DA00,x + sta $C600,x + lda $DB00,x + sta $C700,x + inx + bne colorbak + + ;lda $01 ; processor port + ;pha ; backup + ;and #$F8 + ;ora #$06 ; xxxxx110 : RAM $A000-$BFFF, IO $D000-$DFFF, ROM $E000-$FFFF + ;sta $01 + + jsr readbyte ; read mode byte + pha ; push it +mainloop: + jsr readbyte + pha + and #$0F + tax + lda algoslo,x + sta callalgo+1 + ;lda algoshi,x ; assume all algos are in the same page + ;sta callalgo+2 + pla + and #$F0 + beq display ; 0 => end of file + lsr + lsr + tax + lda addr_sizes-4,x ; destination + sta $fd + lda addr_sizes-3,x + sta $fe + lda addr_sizes-2,x ; size + sta $02 + lda addr_sizes-1,x + tax +callalgo: + jsr longmemcpy ; modified + jmp mainloop + +display: + pla + ; mode byte 0EBM0000 E=Extended Background mode. B=Bitmap Mode. M=Multicolor + ; $30 => Multicolor Bitmap + tax + ora #$1B + sta $d011 ; screen control register #1 + txa + and #$10 + ora #$C8 ; multicolor, 40 columns + sta $d016 ; screen control register #2 + + lda $dd00 + pha ; backup + and #$fc ; 0 => bank #3 $C000-$FFFF + ;ora #$01 ; 1 => bank #2 $8000-$BFFF char ROM at $9000-$9FFF + ;ora #$02 ; 2 => bank #1 $4000-$7FFF + ;ora #$03 ; 3 => bank #0 $0000-$3FFF char ROM at $1000-$1FFF + sta $dd00 ; set VIC BANK + lda $d018 + pha ; backup + lda #$08 ; bitmap +$2000 / screen +$0000 + sta $d018 ; bitmap: $E000 / screen: $C000 + +wait: + jsr $ffe4 ; GETIN + beq wait + + lda #$1B + sta $d011 + lda #$C8 + sta $d016 + pla + sta $d018 + pla + sta $dd00 ; restore VIC BANK + ;pla + ;sta $01 ; restore Processor port + ; Restore border/background/extra/sprite colors + ldx #$10 +colorrestore2: + lda $C3EF,x + sta $D01F,x + dex + bne colorrestore2 + ; restore COLOR RAM +colorrestore: + lda $C400,x + sta $D800,x + lda $C500,x + sta $D900,x + lda $C600,x + sta $DA00,x + lda $C700,x + sta $DB00,x + inx + bne colorrestore + + rts ; return to basic +; ==================================================================== + + ; special color RAM compression (only low nibble matters) + ; high nibble is count +colordepack: + dex +colordepacklp: + jsr readbyte +colordepacklp2: + jsr storebyte + dec $02 + bne + + dex + bpl + + rts +* cld + adc #$10 + bcs colordepacklp + bcc colordepacklp2 + + ; depack packbits RLE stream +rledepack: + jsr readbyte + tax + bmi repeat + ; temp_byte <= 127 => copy (temp_byte + 1) bytes +copy: inx + jsr shrtlp + beq rledepack + +repeat: ; temp_byte > 127 => repeat (257-temp_byte) the next byte + dex + ;bmi + ; 128 => out + ;rts + bpl return +* jsr readbyte2 +repeatlp: + jsr storebyte + inx + bne repeatlp + beq rledepack + + + ; src=$fb/$fc dst=$fd/$fe + ; count= x(high) $02(low) +longmemcpy: +* lda ($fb),y ; copy 256 bytes + sta ($fd),y + iny + bne - + inc $fc + inc $fe + dex + bne - + + ldx $02 + beq return +shrtlp: lda ($fb),y + sta ($fd),y + inc $fb + bne + + inc $fc +* inc $fd + bne + + inc $fe +* dex + bne shrtlp +return: + rts + + ; src=$fb/$fc advance pointer + ; set y=0 +readbyte: + ldy #0 +readbyte2: + lda ($fb),y + inc $fb + bne + + inc $fc +* rts + + ; dst=$fd/$fe advance pointer + ; assumes y=0 +storebyte: + sta ($fd),y + inc $fd + bne + + inc $fe +* rts + + + +; 0, bitmap, screen, color, color regs, xxx, xxx, xxx +addr_sizes: + .word $E000, 8000 ; 1 : bitmap behind KERNAL ROM + .word $C000, 1000 ; 2 : screen ram in upper RAM area + .word $D800, 1000 ; 3 : color ram + .word $D020, 15 ; 4 : border/background/extra/sprite colors +algoslo: + .byte longmemcpy +; .byte >rledepack +; .byte >colordepack +data: diff --git a/misc/c64viewer/test.asm b/misc/c64viewer/test.asm new file mode 100644 index 00000000..ef3c30f9 --- /dev/null +++ b/misc/c64viewer/test.asm @@ -0,0 +1,29 @@ +; vim:ts=8 sw=8: +.word $0801 +.org $0801 + .word next, 1911 ; next basic line and line number + .byte $9e,"2061",0 ; SYS2061 +next: .word 0 ; end of basic program +start: + jsr $e544 + lda #$00 + sta $d020 ; border + sta $d021 ; background + ldx #$00 +loop: + lda text,x + sec + sbc #$40 + sta $0400+40*12,x + inx + cpx #40 + bne loop +wait: + ;jmp wait + ;jsr $ffcf + jsr $ffe4 ; GETIN + beq wait + rts + +text: +.byte " HELLO WORLD "