Prepare for C64 port

This commit is contained in:
Pecusx
2023-05-05 11:29:34 +02:00
parent 569cbddfe2
commit be37772b29
3 changed files with 806 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
vic_spr0_x = $D000
vic_spr0_y = $D001
vic_spr1_x = $D002
vic_spr1_y = $D003
vic_spr2_x = $D004
vic_spr2_y = $D005
vic_spr3_x = $D006
vic_spr3_y = $D007
vic_spr4_x = $D008
vic_spr4_y = $D009
vic_spr5_x = $D00A
vic_spr5_y = $D00B
vic_spr6_x = $D00C
vic_spr6_y = $D00D
vic_spr7_x = $D00E
vic_spr7_y = $D00F
vic_spr_hi_x = $D010
vic_cr1 = $D011
vic_raster = $D012
vic_lp_x = $D013
vic_lp_y = $D014
vic_spr_ena = $D015
vic_cr2 = $D016
vic_spr_exp_y = $D017
vic_mem = $D018
vic_irq = $D019
vic_irq_ena = $D01A
vic_spr_dp = $D01B
vic_spr_mcolor = $D01C
vic_spr_exp_x = $D01D
vic_spr_ss_col = $D01E
vic_spr_sd_col = $D01F
vic_border = $D020
vic_bg_color0 = $D021
vic_bg_color1 = $D022
vic_bg_color2 = $D023
vic_bg_color3 = $D024
vic_spr_color1 = $D025
vic_spr_color2 = $D026
vic_spr0_color = $D027
vic_spr1_color = $D028
vic_spr2_color = $D029
vic_spr3_color = $D02A
vic_spr4_color = $D02B
vic_spr5_color = $D02C
vic_spr6_color = $D02D
vic_spr7_color = $D02E
+213
View File
@@ -0,0 +1,213 @@
.macro basic_start(addr)
.word upstartEnd // link address
.word 10 // line num
.byte $9e // sys
?a=0
?b=0
?c=0
?d=0
?e=0
?v = %%addr
ift ?v>=10000
?a=?v/10000
?v=?v-(?a*10000)
eif
ift ?v>=1000
?b=?v/1000
?v=?v-(?b*1000)
eif
ift ?v>=100
?c=?v/100
?v=?v-(?c*100)
eif
ift ?v>=10
?d=?v/10
?v=?v-(?d*10)
eif
?e=?v%10
dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
.byte 0
upstartEnd
.word 0 // empty link signals the end of the program
.endm
//
// Switch bank in VIC-II
//
// Args:
// bank: bank number to switch to. Valid values: 0-3.
//
.macro SwitchVICBank(bank)
//
// The VIC-II chip can only access 16K bytes at a time. In order to
// have it access all of the 64K available, we have to tell it to look
// at one of four banks.
//
// This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2).
//
// +------+-------+----------+-------------------------------------+
// | BITS | BANK | STARTING | VIC-II CHIP RANGE |
// | | | LOCATION | |
// +------+-------+----------+-------------------------------------+
// | 00 | 3 | 49152 | ($C000-$FFFF)* |
// | 01 | 2 | 32768 | ($8000-$BFFF) |
// | 10 | 1 | 16384 | ($4000-$7FFF)* |
// | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) |
// +------+-------+----------+-------------------------------------+
?bits=%11
ift (%%bank==0)
?bits=%11
eli (%%bank==1)
?bits=%10
eli (%%bank==2)
?bits=%01
eli (%%bank==3)
?bits=%00
eif
//
// Set Data Direction for CIA #2, Port A to output
//
lda $dd02
and #%11111100 // Mask the bits we're interested in.
ora #$03 // Set bits 0 and 1.
sta $dd02
//
// Tell VIC-II to switch to bank
//
lda $dd00
and #%11111100
ora #?bits
sta $dd00
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetHiresBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
and #%11101111
sta $d016
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetMulticolorBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
ora #%00010000
sta $d016
.endm
//
// Switch location of screen memory.
//
// Args:
// address: Address relative to current VIC-II bank base address.
// Valid values: $0000-$3c00. Must be a multiple of $0400.
//
.macro SetScreenMemory(address)
//
// The most significant nibble of $D018 selects where the screen is
// located in the current VIC-II bank.
//
// +------------+-----------------------------+
// | | LOCATION* |
// | BITS +---------+-------------------+
// | | DECIMAL | HEX |
// +------------+---------+-------------------+
// | 0000XXXX | 0 | $0000 |
// | 0001XXXX | 1024 | $0400 (DEFAULT) |
// | 0010XXXX | 2048 | $0800 |
// | 0011XXXX | 3072 | $0C00 |
// | 0100XXXX | 4096 | $1000 |
// | 0101XXXX | 5120 | $1400 |
// | 0110XXXX | 6144 | $1800 |
// | 0111XXXX | 7168 | $1C00 |
// | 1000XXXX | 8192 | $2000 |
// | 1001XXXX | 9216 | $2400 |
// | 1010XXXX | 10240 | $2800 |
// | 1011XXXX | 11264 | $2C00 |
// | 1100XXXX | 12288 | $3000 |
// | 1101XXXX | 13312 | $3400 |
// | 1110XXXX | 14336 | $3800 |
// | 1111XXXX | 15360 | $3C00 |
// +------------+---------+-------------------+
//
?bits = (%%address / $0400) << 4
lda $d018
and #%00001111
ora #?bits
sta $d018
.endm
//
// Set location of bitmap.
//
// Args:
// address: Address relative to VIC-II bank address.
// Valid values: $0000 (bitmap at $0000-$1FFF)
// $2000 (bitmap at $2000-$3FFF)
//
.macro SetBitmapAddress(address)
//
// In standard bitmap mode the location of the bitmap area can
// be set to either BANK address + $0000 or BANK address + $2000
//
// By setting bit 3, we can configure which of the locations to use.
//
lda $d018
ift %%address == $0000
and #%11110111
eli %%address == $2000
ora #%00001000
eif
sta $d018
.end