C64 code re-learning stuff

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

Running a little demo in retrodebugger (missing the sid music in the recording)

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.

Part of the program see $1000 of start of SID music


Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
!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 02 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! "
!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! "
!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!    "
Spread the love

Leave a Reply

Your email address will not be published. Required fields are marked *