vic20-xmas-demo/src/main.asm

281 lines
4.7 KiB
NASM

processor 6502
srcPointer = $b5
dstPointer = $b7
dstPointerEnd = $b9
fake_current_byte = $126
count = $128
loading_bar = $130
org $a000
; autostart cartridge magic number
WORD coldstart
WORD coldstart
BYTE #$41, #$30, #$c3, #$c2, #$cd
coldstart SUBROUTINE
cld
sei
jsr $fd8d ; initialize and test RAM
jsr $fd52 ; restore default I/O vectors
jsr $fdf9 ; initialize I/O registers
jsr $e518 ; initialize hardware
cli ; enable interrupts
lda $0288
sta $0294
jsr $e45b ; initialize BASIC vector table
jsr $e3a4 ; initialize BASIC RAM locations
jsr $e404 ; print startup message and initialize memory pointers
ldx #$fb ; value for stack start
txs ; set stack pointer
lda #$76 ; set "READY." pointer
ldy #$c3
jsr $cb1e ; print null terminated string
lda #$80 ; set for control messages only
jsr $ff90 ; control kernal messages
; copy BASIC demo code in BASIC memory
jsr copycode
; set current BASIC line number
lda #$ff
sta $3a
lda #0
sta $3b
; set start of BASIC variables
lda #<($1001 + demo_end - demo_start)
sta $2d
lda #>($1001 + demo_end - demo_start)
sta $2e
lda #$02
jsr clear_color_ram
; print informative message for user
lda #<message
ldy #>message
jsr $cb1e ; print null terminated string
; install fake chrin to hijack custom commands
lda #0
sta fake_current_byte
sei
lda #<fake_chrin
sta $324
lda #>fake_chrin
sta $325
cli
jmp $c483 ; BASIC
; custom hijacked command line
fake_input_line:
BYTE "RUN",#$0d,#0,#0,#0
fake_chrin SUBROUTINE
ldy fake_current_byte
lda fake_input_line,y
iny
sty fake_current_byte
cpy #5
bne .end_fake_chrin
dey
sty fake_current_byte
.end_fake_chrin:
clc
rts
; Put color in A
clear_color_ram SUBROUTINE
ldx #$00
.loop:
sta $9600,x
sta $9700,x
dex
bne .loop
rts
; This routine does a lot of unnecessary things,
; but I added a lot of garbage things to debug it,
; because it did not work as intended.
; In the end, the problem was elsewhere, as usual.
copycode SUBROUTINE
sei
lda #0
sta count
sta count + 1
lda #<demo_start
sta srcPointer
lda #>demo_start
sta srcPointer + 1
lda #$01
sta dstPointer
lda #$10
sta dstPointer + 1
ldy #0
copyloop:
lda (srcPointer),y
sta (dstPointer),y
inc srcPointer
bne .noinc1
inc srcPointer + 1
.noinc1:
inc dstPointer
bne .noinc2
inc dstPointer + 1
.noinc2:
inc count
bne .noinc3
inc count + 1
.noinc3:
; lenght of program to copy
lda count
cmp #<DEMO_LEN
bne copyloop
lda count + 1
cmp #>DEMO_LEN
bne copyloop
cli
.finito:
rts
loading_feedback SUBROUTINE
ldx loading_bar
lda #$79
sta 7988,x
cpx #21
beq .start_button
rts
.start_button:
; print
lda #<start_button_message
ldy #>start_button_message
jsr $cb1e
; use system CHRIN
lda #$e0
sta $324
lda #$f2
sta $325
; wait for SPACE
.chrin:
jsr $ffe4
cmp #$20
bne .chrin
jsr copytree
rts
; draws a Christmas tree shamelessly copied from another demo
copytree SUBROUTINE
; all this is just a memcpy
lda #<tree_start
sta srcPointer
lda #>tree_start
sta srcPointer + 1
lda #$00
sta dstPointer
lda #$1e
sta dstPointer + 1
ldy #0
.loop:
lda (srcPointer),y
sta (dstPointer),y
inc srcPointer
bne .noinc1
inc srcPointer + 1
.noinc1:
inc dstPointer
bne .noinc2
inc dstPointer + 1
.noinc2:
lda srcPointer
cmp #<tree_end
bne .loop
lda srcPointer + 1
cmp #>tree_end
bne .loop
; colors
lda #$08
sta $900f
lda #$05
jsr clear_color_ram
; balls
lda #$02
sta $96a3
sta $96a6
lda #$06
sta $96ce
sta $96d3
lda #$04
sta $96f9
sta $9700
lda #$03
sta $9724
sta $972d
; ì puntale di' monni
; (can't translate)
lda #$07
sta $9678
sta $9679
; gambo
lda #$02
sta $973e
sta $973f
rts
message:
BYTE #$0d,#$0d,"PLEASE WAIT 20 SEC",#$0d,"I'M JUST",#$0d,"AN OLD COMPUTER",#$0d,#0
start_button_message:
BYTE "PRESS SPACE TO START",#$0
; https://www.commodore.ca/manuals/funet/cbm/vic20/demos.basic/unexpanded/Stillenacht.prg
demo_start:
.incbin "build/demo.raw"
demo_end:
DEMO_LEN SET demo_end - demo_start
tree_start:
.incbin "res/tree.bin"
tree_end:
BYTE "THIS DEMO HAS BEEN PATCHED BY GIOMBA FOR HIS COLLEAGUES -- DECEMBER 2022"
ECHO "cartridge usage",.
. = $bff9
jmp loading_feedback
. = $bffc
jmp coldstart
. = $bfff
BYTE #$ff