Last Updated or created 2022-07-17
I’ve used a basic program on C64 in the past and a Cartridge machinecode monitor in the past.
I’ve really forgotten how, what i’ve used and what i’ve done with it.
Not nearly as much as my friends at that time.
I started with a Vic-20 and played around with machinecode on a 6502.
I didn’t have a C64 for many years.




I’ve recently started to build a 6502 computer again, and programming on 65xx again (Generic 6502 and C64). (2022)
Below is my setup on linux, to write assembly code, compiling and running the code in a emulator.
I have installed the Acme compiler and Vice as a emulator.
Both can compile/run machinecode for multiple computer emulations. So maybe i can run my old Vic-20 machine code or the few C64 programs i’ve written.
I’ve only made the bash script, the included asm files i copied from someone on the internet. ( Credit lookup )
makeprg bash file:
#!/bin/bash set -x f="" if [ "$2" == "f" ] ; then f="-fullscreen" ; fi if [ ! -f $1.asm ] ; then cp template.asm $1.asm fi vi $1.asm acme --cpu 6510 --format cbm --outfile $1.prg $1.asm if [ ! $? -eq 0 ] ; then exit 1 ; fi c1541 -format foo,id d64 $1.d64 -write $1.prg if [ ! $? -eq 0 ] ; then exit 1 ; fi x64 $f $1.prg
template.asm
!source "basic-boot.asm" +start_at $0900 ; Set background and border to black ldx #$00 stx bgcol stx bocol ; Flicker border and background .loop inc bgcol inc bocol jmp .loop
basic-boot.asm
; A BASIC booter, encodes `10 SYS <address>`. ; Macroified from http://www.pouet.net/topic.php?which=6541 !source "constants.asm" !macro start_at .address { * = basic !byte $0c,$08,$00,$00,$9e !if .address >= 10000 { !byte 48 + ((.address / 10000) % 10) } !if .address >= 1000 { !byte 48 + ((.address / 1000) % 10) } !if .address >= 100 { !byte 48 + ((.address / 100) % 10) } !if .address >= 10 { !byte 48 + ((.address / 10) % 10) } !byte $30 + (.address % 10), $00, $00, $00 * = .address } ; A cooler example is to write ; ; 10 SYS <address>: REM <backspaces>Your comment ; ; When the user types LIST, he will just see ; ; 10 Your comment ; ; but still be able to run it. ; For this, see http://codebase64.org/doku.php?id=base:acme-macro-tu
When running above bash script. it will open the file if it exists, else it will take a template file.
After opening it with vi, and editing it, it starts a the compiler and creates a C64 d64 disk.
This is going to be autorun/started with the VIce emulator.
Appending -f to the bash script will start it in fullscreen mode.
./makeprg myawesomedemo.asm -f
Below it is running without the fullscreen option. but is shows how to start the interactive monitor in vice.
- n – step x instructions
n 100 - m monitor
(C:$103e) m >C:103e cd 12 d0 d0 fb a2 00 bd 5c 10 bc 79 10 88 d0 fd ........\..y.... >C:104e 8d 20 d0 8d 21 d0 e8 e0 1d d0 ec 4c 81 ea 06 00 . ..!......L.... >C:105e 0e 06 0e 0e 03 0e 03 03 01 03 01 01 01 01 03 01 ................ >C:106e 03 03 0e 03 0e 0e 06 0e 00 06 00 07 09 09 09 09 ................ >C:107e 09 09 09 07 09 09 09 09 09 09 09 07 09 09 09 09 ................ >C:108e 09 09 09 07 09 09 09 09 00 00 00 00 ff ff ff ff ................ >C:109e 00 00 00 00 ff ff ff ff 00 00 00 00 ff ff ff ff ................ >C:10ae 00 00 00 00 ff ff ff ff 00 00 00 00 ff ff ff ff ................ >C:10be 00 00 00 00 ff ff ff ff 00 00 00 00 ff ff ff ff ................ (C:$10ce)
- d -assemble
(C:$1041) d 1000 .C:1000 78 SEI .C:1001 A5 00 LDA $00 .C:1003 8A TXA .C:1004 98 TYA .C:1005 8D 20 D0 STA $D020 .C:1008 8D 21 D0 STA $D021 .C:100b A0 7F LDY #$7F .C:100d 8C 0D DC STY $DC0D .C:1010 8C 0D DD STY $DD0D .C:1013 AD 0D DC LDA $DC0D .C:1016 AD 0D DD LDA $DD0D .C:1019 A9 01 LDA #$01 .C:101b 8D 1A D0 STA $D01A .C:101e A9 39 LDA #$39 .C:1020 A2 10 LDX #$10 .C:1022 8D 14 03 STA $0314 .C:1025 8E 15 03 STX $0315
Etc .. see https://vice-emu.sourceforge.io/vice_12.html