mirror of
https://github.com/KarolS/millfork.git
synced 2024-12-25 21:29:25 +00:00
133 lines
2.8 KiB
Plaintext
133 lines
2.8 KiB
Plaintext
|
|
||
|
#if VERA_VERSION != 9
|
||
|
#error Unsupported VERA_VERSION
|
||
|
#endif
|
||
|
|
||
|
|
||
|
const int24 VERA_PALETTE = $1FA00
|
||
|
const int24 VERA_SPRITES = $1FC00
|
||
|
|
||
|
volatile byte vera_addr_lo @ $9f20
|
||
|
volatile byte vera_addr_mi @ $9f21
|
||
|
volatile byte vera_addr_hi @ $9f22
|
||
|
volatile int24 vera_addr @ $9f20
|
||
|
volatile byte vera_data0 @ $9f23
|
||
|
volatile byte vera_data1 @ $9f24
|
||
|
volatile byte vera_ctrl @ $9f25
|
||
|
volatile byte vera_ien @ $9f26
|
||
|
volatile byte vera_isr @ $9f27
|
||
|
volatile byte vera_irqline @ $9f28
|
||
|
volatile byte vera_dc_video_hstart @ $9f29
|
||
|
volatile byte vera_dc_hscale_hstop @ $9f29
|
||
|
volatile byte vera_dc_vscale_vstart @ $9f2b
|
||
|
volatile byte vera_dc_border_vstop @ $9f2c
|
||
|
|
||
|
struct vera_layer_setup {
|
||
|
byte config
|
||
|
byte map_base
|
||
|
byte tile_base
|
||
|
word hscroll
|
||
|
word vscroll
|
||
|
}
|
||
|
|
||
|
volatile vera_layer_setup vera_layer0 @$9F2D
|
||
|
volatile vera_layer_setup vera_layer1 @$9F34
|
||
|
|
||
|
|
||
|
|
||
|
inline void vera_poke(int24 address, byte value) {
|
||
|
vera_ctrl = 0
|
||
|
vera_addr = address
|
||
|
vera_data0 = value
|
||
|
}
|
||
|
|
||
|
inline byte vera_peek(int24 address) {
|
||
|
vera_ctrl = 0
|
||
|
vera_addr = address
|
||
|
return vera_data0
|
||
|
}
|
||
|
|
||
|
inline void vera_fill(int24 address, byte value, word size) {
|
||
|
word i
|
||
|
vera_addr_lo = address.b0
|
||
|
vera_addr_mi = address.b1
|
||
|
vera_addr_hi = address.b2 | $10
|
||
|
vera_ctrl = 0
|
||
|
for i,0,paralleluntil,size {
|
||
|
vera_data0 = value
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void vera_upload_large(int24 address, pointer source, word size) {
|
||
|
word i
|
||
|
vera_ctrl = 0
|
||
|
vera_addr_lo = address.b0
|
||
|
vera_addr_mi = address.b1
|
||
|
vera_addr_hi = address.b2 | $10
|
||
|
for i,0,paralleluntil,size {
|
||
|
vera_data0 = source[i]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void vera_upload(int24 address, pointer source, byte size) {
|
||
|
vera_ctrl = 0
|
||
|
vera_addr_lo = address.b0
|
||
|
vera_addr_mi = address.b1
|
||
|
vera_addr_hi = address.b2 | $10
|
||
|
asm {
|
||
|
? ldy #0
|
||
|
__vera_upload_loop:
|
||
|
? lda (source),y
|
||
|
! sta vera_data0
|
||
|
? iny
|
||
|
? cpy size
|
||
|
? bne __vera_upload_loop
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void vera_reset() {
|
||
|
vera_ctrl = $80
|
||
|
vera_ctrl = 0
|
||
|
}
|
||
|
|
||
|
struct vera_sprite_data {
|
||
|
word address
|
||
|
word x
|
||
|
word y
|
||
|
byte ctrl0
|
||
|
byte ctrl1
|
||
|
}
|
||
|
|
||
|
void vera_upload_sprite(byte sprite_id, pointer.vera_sprite_data source) {
|
||
|
vera_ctrl = 0
|
||
|
vera_addr_lo = sprite_id << 3
|
||
|
vera_addr_mi = (sprite_id >> 5) | VERA_SPRITES.b1
|
||
|
vera_addr_hi = VERA_SPRITES.b2 | $10
|
||
|
asm {
|
||
|
? ldy #0
|
||
|
__vera_upload_sprite_loop:
|
||
|
? lda (source),y
|
||
|
! sta vera_data0
|
||
|
? iny
|
||
|
? cpy #sizeof(vera_sprite_data)
|
||
|
? bne __vera_upload_sprite_loop
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void vera_set_sprites_enable(bool enabled) {
|
||
|
vera_ctrl = 0
|
||
|
if enabled {
|
||
|
vera_dc_video_hstart |= $40
|
||
|
} else {
|
||
|
vera_dc_video_hstart &= $ff ^ $40
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void vera_set_border(byte color) {
|
||
|
vera_ctrl = 0
|
||
|
vera_dc_border_vstop = color
|
||
|
}
|
||
|
|
||
|
alias set_border = vera_set_border
|
||
|
|