Last Updated or created 2024-05-08
Re-learning the little I knew (I never had a c64 as a kid).
Back to basics, welll machine code I mean.
Programming a little demo using acme.
Split screen bitmap and text mode plus sid music
Some useful commands
; Dump prg with offset 0x800 per byte and skip 00 00 lines
xxd -o 0x800 -g1 icecrew.prg | uniq -f10
; Write symbol list
acme -l icecrew.sym icecrew.asm
; png to kla (koala picture)
retropixels icecrew.png -o icecrew.kla
; relocate a sid address
sidreloc -r org.sid new.sid
Below code has some flaws:
Many empty gaps, creating a large file.
Exomizer could fix this, but better memory management should be the better solution.
The Koala file has many 0 bytes, the logo is small but the file is created for a full screen image.
!cpu 6502 !to "icecrew1.prg",cbm ; Standard basic sys runner basic_address = $0801 ; sid addresses ; address moved using ; sidreloc -r Lameness_Since_1991.sid lame.sid ; addresses found using ;sidplay2 -v lame.sid ;+------------------------------------------------------+ ;| SIDPLAY - Music Player and C64 SID Chip Emulator | ;| Sidplay V2.0.9, Libsidplay V2.1.1 | ;+------------------------------------------------------+ ;| Title : Lameness Since 1991 | ;| Author : Peter Siekmann (Devilock) | ;| Released : 2017 Oxyron | ;+------------------------------------------------------+ ;| File format : PlaySID one-file format (PSID) | ;| Filename(s) : lame.sid | ;| Condition : No errors | ;| Playlist : 1/1 (tune 1/1[1]) | ;| Song Speed : 50 Hz VBI (PAL) | ;| Song Length : UNKNOWN | ;+------------------------------------------------------+ ;| Addresses : DRIVER = $1C00-$1CFF, INIT = $0FFF | ;| : LOAD = $0FFF-$1B25, PLAY = $1003 | ;| SID Details : Filter = Yes, Model = 8580 | ;| Environment : Real C64 | ;+------------------------------------------------------+ ; sid_address = $0fff sid_play = $1003 sid_init = $0fff ; Character char_address = $3800 screen_mem = $4400 ; Koala address bitmap_address = $6000 bitmap_data = $7f40 bitmap_color = $8328 bitmap_bgcolor = $8710 program_address = $c000 color_mem = $d800 reg_d011 = $D011 ; VIC register ;Bit 7 (weight 128) is the most significant bit of the VIC's nine-bit raster register (see address 53266). ;Bit 6 controls extended color mode ;Bit 5 selects either the text screen ("0") or high resolution graphics ("1"). ;Bit 4 controls whether the screen area is visible or not. ;Bit 3 selects 25 (when set to "1") or 24 (when set to "0") visible character lines on the text screen. ;Bit 0–2 is used for vertical pixel-by-pixel scrolling of the text or high resolution graphics. ; Rom routine to clear screen ( slow ! ) ; Better to do this yourself clear_screen = $e544 * = sid_address !bin "lame.sid",,$7c+2 ; standard charset * = char_address !bin "charset.chr" ; drawn with gimp converted using retropixel ; retropixels icecrew.png -o icecrew.kla * = bitmap_address !bin "icecrew.kla",,$02 ; sys 49152 * = basic_address !byte $0d,$08,$dc,$07,$9e,$20,$34,$39,$31,$35,$32,$00,$00,$00 * = program_address sei ; init lda #$00 tax tay jsr sid_init jsr clear_screen jsr load_bitmap jsr init_text ldy #$7f sty $dc0d sty $dd0d lda $dc0d lda $dd0d lda #$01 sta $d01a lda reg_d011 and #$7f sta reg_d011 ; move interrupt vector to bitmap lda #<interruptbitmap ldx #>interruptbitmap sta $314 ; Low Address part IRQ vector stx $315 ; High Address part IQR vector ldy #$1b sty reg_d011 lda #$7f sta $dc0d lda #$01 sta $d01a ; trigger interrupt at rasterline 0 lda #$00 sta $d012 cli jmp * interruptbitmap inc $d019 ; trigger interrupt at rasterline 128 lda #$80 sta $d012 lda #<interrupttxt ldx #>interrupttxt sta $314 stx $315 jsr bitmap_mode jmp $ea81 interrupttxt ; ack IRQ inc $d019 ; IRQ at line 0 lda #$00 sta $d012 lda #<interruptbitmap ldx #>interruptbitmap sta $314 stx $315 jsr text_mode jsr sid_play jmp $ea81 bitmap_mode ; bitmap graphics multicolor lda #$3b sta reg_d011 lda #$18 sta $d016 ; switch to video bank 2 ($4000-$7FFF) lda $dd00 and #$fc ora #$02 sta $dd00 lda #$18 sta $d018 rts text_mode ; set text mode hires lda #$1b sta reg_d011 lda #$08 sta $d016 ; switch to video bank 1 ($0000-$3FFF) lda $dd00 and #$fc ora #$03 sta $dd00 ; set charset location ; 7 * 2048 = $3800, set in bits 1-3 of $d018 lda $d018 ora #$0e sta $d018 rts load_bitmap lda bitmap_bgcolor sta $d020 sta $d021 ldx #$00 copy_bmp ; screen memory lda bitmap_data,x sta screen_mem,x lda bitmap_data+256,x sta screen_mem+256,x lda bitmap_data+512,x sta screen_mem+512,x lda bitmap_data+768,x sta screen_mem+768,x ; color memory lda bitmap_color,x sta color_mem,x lda bitmap_color+256,x sta color_mem+256,x lda bitmap_color+512,x sta color_mem+512,x lda bitmap_color+768,x sta color_mem+768,x inx bne copy_bmp rts init_text ldx #$00 copy_txt lda text1,x sta $0400+520,x lda text2,x sta $0400+640,x lda text3,x sta $0400+640+120,x lda #$06 sta color_mem+520,x lda #$0e sta color_mem+640,x lda #$0e sta color_mem+640+120,x inx cpx #$28 bne copy_txt rts text1 !scr " back to oldskool demos in 2024 " text2 !scr " greetings to bigred & tyrone & edk " text3 !scr " a lot to relearn - keep coding! "