ys2-intro/shared/vic.inc

235 lines
8.4 KiB
PHP
Raw Normal View History

2025-11-13 11:07:39 -05:00
; MOS6567/MOS6569
.ifndef _VIC_INC_
_VIC_INC_ = 1
.include "cia.inc"
CYCLES_PER_LINE_PAL = 63
CYCLES_PER_LINE_NTSC = 64
DISPLAY_LINES_PAL = 312
DISPLAY_LINES_NTSC = 263
VSYNC_LINE_PAL = 0
VSYNC_LINE_NTSC = 20
SCREEN_COLUMNS = 40
SCREEN_ROWS = 25
SCREEN_SIZE = SCREEN_COLUMNS * SCREEN_ROWS
BITMAP_BACKGROUND = 0
BITMAP_SIZE = SCREEN_SIZE * 8
.define MAKE_HIRES_COLOURS(one_bits, zero_bits) (((zero_bits) << 4) | (one_bits))
SPRITE_WIDTH = 24
SPRITE_POINTERS = $03f8
.define MAKE_SPRITE_POINTER(address) (.lobyte((address) >> 6))
VIC2_IDLE_PATTERN = $3fff
VIC2_BASE = $d000
CHARSET_ADDR_UPPERGRAPHIC = $d000
CHARSET_ADDR_UPPERLOWER = $d800
ROM_CHARSET_UPGFX = CHARSET_ADDR_UPPERGRAPHIC
ROM_CHARSET_UPLOW = CHARSET_ADDR_UPPERLOWER
VIC2_COLOURRAM = $d800
COLOUR_BLACK = $00
COLOUR_WHITE = $01
COLOUR_RED = $02
COLOUR_CYAN = $03
COLOUR_VIOLET = $04
COLOUR_PURPLE = COLOUR_VIOLET
COLOUR_LILAC = COLOUR_VIOLET
COLOUR_GREEN = $05
COLOUR_BLUE = $06
COLOUR_YELLOW = $07
COLOUR_ORANGE = $08
COLOUR_BROWN = $09
COLOUR_LIGHTRED = $0a
COLOUR_DARKGREY = $0b
COLOUR_MEDIUMGREY = $0c
COLOUR_LIGHTGREEN = $0d
COLOUR_LIGHTBLUE = $0e
COLOUR_LIGHTGREY = $0f
SPRITE_0 = %00000001
SPRITE_1 = %00000010
SPRITE_2 = %00000100
SPRITE_3 = %00001000
SPRITE_4 = %00010000
SPRITE_5 = %00100000
SPRITE_6 = %01000000
SPRITE_7 = %10000000
SPRITE0_X = VIC2_BASE + $00; Sprite 0, x-coordinate bits 0-7
SPRITE0_Y = VIC2_BASE + $01; Sprite 0, y-coordinate
SPRITE1_X = VIC2_BASE + $02; Sprite 1, x-coordinate bits 0-7
SPRITE1_Y = VIC2_BASE + $03; Sprite 1, y-coordinate
SPRITE2_X = VIC2_BASE + $04; Sprite 2, x-coordinate bits 0-7
SPRITE2_Y = VIC2_BASE + $05; Sprite 2, y-coordinate
SPRITE3_X = VIC2_BASE + $06; Sprite 3, x-coordinate bits 0-7
SPRITE3_Y = VIC2_BASE + $07; Sprite 3, y-coordinate
SPRITE4_X = VIC2_BASE + $08; Sprite 4, x-coordinate bits 0-7
SPRITE4_Y = VIC2_BASE + $09; Sprite 4, y-coordinate
SPRITE5_X = VIC2_BASE + $0a; Sprite 5, x-coordinate bits 0-7
SPRITE5_Y = VIC2_BASE + $0b; Sprite 5, y-coordinate
SPRITE6_X = VIC2_BASE + $0c; Sprite 6, x-coordinate bits 0-7
SPRITE6_Y = VIC2_BASE + $0d; Sprite 6, y-coordinate
SPRITE7_X = VIC2_BASE + $0e; Sprite 7, x-coordinate bits 0-7
SPRITE7_Y = VIC2_BASE + $0f; Sprite 7, y-coordinate
SPRITES_X_MSB = VIC2_BASE + $10; Sprites 0-7, x-coordinates bit 8
VIC2_CTRL1 = VIC2_BASE + $11; Control register 1
SCROLLY_0 = %00000000
SCROLLY_1 = %00000001
SCROLLY_2 = %00000010
SCROLLY_3 = %00000011
SCROLLY_4 = %00000100
SCROLLY_5 = %00000101
SCROLLY_6 = %00000110
SCROLLY_7 = %00000111
SCROLLY_MASK = %00000111
LINES_24 = %00000000
LINES_25 = %00001000
DISPLAY_ENABLE = %00010000
DISPLAY_DISABLE = %00000000
BITMAP_MODE = %00100000
TEXT_MODE = %00000000
EBCM_MODE = %01000000
RASTERLINE_BIT8 = %10000000
RASTERLINE_BIT8_SHIFT = 7
RASTERLINE_MSB = %10000000
RASTERLINE_MSB_SHIFT = 7
VIC2_RASTERLINE = VIC2_BASE + $12; Current raster line, raster IRQ trigger line
RASTERLINE = VIC2_RASTERLINE
MAX_RASTERLINE_PAL = $0137
MAX_RASTERLINE_NTSC = $0105
VIC2_STROBE_X = VIC2_BASE + $13; Light pen x-position
VIC2_STROBE_Y = VIC2_BASE + $14; Light pen y-position
VIC2_SPR_ENABLE = VIC2_BASE + $15; Enabled sprites
VIC2_CTRL2 = VIC2_BASE + $16; Control register 2
SCROLLX_0 = %00000000
SCROLLX_1 = %00000001
SCROLLX_2 = %00000010
SCROLLX_3 = %00000011
SCROLLX_4 = %00000100
SCROLLX_5 = %00000101
SCROLLX_6 = %00000110
SCROLLX_7 = %00000111
SCROLLX_MASK = %00000111
COLUMNS_38 = %00000000
COLUMNS_40 = %00001000
SINGLECOLOUR_MODE = %00000000
MULTICOLOUR_MODE = %00010000
VIC2_SPR_EXPANDY = VIC2_BASE + $17; y-expanded sprites
VIC2_ADDR = VIC2_BASE + $18; Character set and bitmap locations
SCREEN_MASK = %11110000
CHARSET_UPPERGRAPHIC = %00000100; $d000
CHARSET_UPPERLOWER = %00000110; $d800
CHARSET_MASK = %00001110
BITMAP_MASK = %00001000
.define VIC2_MAKE_ADDR(screen, charset_or_bitmap) .lobyte(((screen & $3fff) >> 6) | ((charset_or_bitmap & $3fff) >> 10))
VIC2_IRR = VIC2_BASE + $19; Interrupt Request Register
RASTER_IRQ = %00000001
SPR_BGR_COLL_IRQ = %00000010
SPR_SPR_COLL_IRQ = %00000100
LIGHTPEN_IRQ = %00001000
IRQ_FLAG = %10000000
VIC2_IMR = VIC2_BASE + $1a; Interrupt Mask Register
NO_INTERRUPTS = %00000000
;RASTER_IRQ = %00000001
;SPR_BGR_COLL_IRQ = %00000010
;SPR_SPR_COLL_IRQ = %00000100
;LIGHTPEN_IRQ = %00001000
VIC2_BG_PRIORITY = VIC2_BASE + $1b; Sprite-to-background priority
VIC2_SPR_MCOLOUR = VIC2_BASE + $1c; Sprites multicolour enabled
VIC2_SPR_EXPANDX = VIC2_BASE + $1d; Sprites x-expansion
VIC2_SPR_COLL = VIC2_BASE + $1e; Sprite-to-sprite collision
VIC2_SPR_BG_COLL = VIC2_BASE + $1f; Sprite-to-background collision
VIC2_BORDERCOLOUR = VIC2_BASE + $20; Overscan colour
BORDERCOLOUR = VIC2_BORDERCOLOUR
VIC2_BGCOLOUR = VIC2_BASE + $21; Background colour
BGCOLOUR = VIC2_BGCOLOUR
VIC2_BGCOLOUR0 = VIC2_BGCOLOUR; Background colour 0
VIC2_BGCOLOUR1 = VIC2_BASE + $22; Background colour 1
VIC2_MULTICOLOUR0 = VIC2_BGCOLOUR1; Multicolour 1
VIC2_BGCOLOUR2 = VIC2_BASE + $23; Background colour 2
VIC2_MULTICOLOUR1 = VIC2_BGCOLOUR2; Multicolour 2
VIC2_BGCOLOUR3 = VIC2_BASE + $24; Background colour 3
VIC2_SPR_MCOLOUR0 = VIC2_BASE + $25; Sprite multicolour 0
VIC2_SPR_MCOLOUR1 = VIC2_BASE + $26; Sprite multicolour 1
VIC2_SPR0_COLOUR = VIC2_BASE + $27; Sprite colour 0
VIC2_SPR1_COLOUR = VIC2_BASE + $28; Sprite colour 1
VIC2_SPR2_COLOUR = VIC2_BASE + $29; Sprite colour 2
VIC2_SPR3_COLOUR = VIC2_BASE + $2a; Sprite colour 3
VIC2_SPR4_COLOUR = VIC2_BASE + $2b; Sprite colour 4
VIC2_SPR5_COLOUR = VIC2_BASE + $2c; Sprite colour 5
VIC2_SPR6_COLOUR = VIC2_BASE + $2d; Sprite colour 6
VIC2_SPR7_COLOUR = VIC2_BASE + $2e; Sprite colour 7
VIC2_C128_EXT_KB = VIC2_BASE + $2f; Expanded keyboard matrix line
C128_EXT_KB = VIC2_C128_EXT_KB
VIC2_C128_CLOCK = VIC2_BASE + $30; Extended clock control
C128_CLOCK = VIC2_C128_CLOCK
C128_TWO_MHZ = %00000001
C128_INC_LINECNTR = %00000010
; c = 0: NTSC, c = 1: PAL
.macro WAIT_VBL
.scope
.local loop
lda #VSYNC_LINE_NTSC
bcc loop
lda #VSYNC_LINE_PAL
loop: cmp VIC2_RASTERLINE
bne loop
bit VIC2_CTRL1
bmi loop
cmp VIC2_RASTERLINE
bne loop
.endscope
.endmacro
.macro DISPLAY_HIRES_BITMAP bitmap, screen
WAIT_VBL
lda #BITMAP_MODE | DISPLAY_ENABLE | LINES_25 | SCROLLY_3
sta VIC2_CTRL1
lda #SINGLECOLOUR_MODE | COLUMNS_40 | SCROLLX_0
sta VIC2_CTRL2
lda #VIC2_MAKE_ADDR(screen, bitmap)
sta VIC2_ADDR
lda CIA2_PRA
and #.lobyte(~VIC2_BANK_MASK)
ora #VIC2_MAKE_BANK(bitmap)
sta CIA2_PRA
.endmacro
.endif; !_VIC_INC_