Begun design and implementation of kernel VERA interface
This commit is contained in:
parent
15bdde96ad
commit
5032212b94
|
@ -22,7 +22,7 @@ clean:
|
||||||
@$(CC) -c $(CFLAGS) -o $@ $<
|
@$(CC) -c $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
%.o: %.s
|
%.o: %.s
|
||||||
@echo "Assembling $@)..."
|
@echo "Assembling $@..."
|
||||||
@$(AS) $(ASFLAGS) -o $@ $<
|
@$(AS) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
%.d: %.c
|
%.d: %.c
|
||||||
|
|
|
@ -6,18 +6,54 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void vera_init(void);
|
typedef enum {
|
||||||
|
ADDR_INCREMENT_0 = 0,
|
||||||
|
ADDR_INCREMENT_1 = 1,
|
||||||
|
ADDR_INCREMENT_2 = 2,
|
||||||
|
ADDR_INCREMENT_4 = 3,
|
||||||
|
ADDR_INCREMENT_8 = 4,
|
||||||
|
ADDR_INCREMENT_16 = 5,
|
||||||
|
ADDR_INCREMENT_32 = 6,
|
||||||
|
ADDR_INCREMENT_64 = 7,
|
||||||
|
ADDR_INCREMENT_128 = 8,
|
||||||
|
ADDR_INCREMENT_256 = 9,
|
||||||
|
ADDR_INCREMENT_512 = 10,
|
||||||
|
ADDR_INCREMENT_40 = 11,
|
||||||
|
ADDR_INCREMENT_80 = 12,
|
||||||
|
ADDR_INCREMENT_160 = 13,
|
||||||
|
ADDR_INCREMENT_320 = 14,
|
||||||
|
ADDR_INCREMENT_640 = 15
|
||||||
|
} VeraAddressIncrement;
|
||||||
|
|
||||||
uint8_t vera_peek(uint32_t addr);
|
extern void vera_init(void);
|
||||||
|
|
||||||
uint16_t vera_peek16(uint32_t addr);
|
extern void vera_set_data0_address(uint32_t addr);
|
||||||
|
|
||||||
void vera_poke(uint32_t addr, uint8_t value);
|
extern void vera_set_data1_address(uint32_t addr);
|
||||||
|
|
||||||
void vera_poke16(uint32_t addr, uint16_t value);
|
extern uint8_t vera_peek_data0(void);
|
||||||
|
|
||||||
void _vera_set_bgcolor(uint8_t color);
|
extern uint8_t vera_peek_data1(void);
|
||||||
#define vera_set_bgcolor(X) _vera_set_bgcolor((X))
|
|
||||||
#define vera_set_bgcolour(X) _vera_set_bgcolor((X))
|
extern void vera_poke_data0(uint8_t value);
|
||||||
|
|
||||||
|
extern void vera_poke_data1(uint8_t value);
|
||||||
|
|
||||||
|
extern void vera_set_addr0_auto_increment(VeraAddressIncrement value);
|
||||||
|
|
||||||
|
extern void vera_set_addr1_auto_increment(VeraAddressIncrement value);
|
||||||
|
|
||||||
|
extern void vera_set_addr0_decrement(bool state);
|
||||||
|
|
||||||
|
extern void vera_set_addr1_decrement(bool state);
|
||||||
|
|
||||||
|
uint8_t vera_read_byte(uint32_t addr);
|
||||||
|
|
||||||
|
uint16_t vera_read_word(uint32_t addr);
|
||||||
|
|
||||||
|
void vera_write_byte(uint32_t addr, uint8_t value);
|
||||||
|
|
||||||
|
void vera_write_word(uint32_t addr, uint16_t value);
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
|
|
||||||
#ifdef __CALYPSI_ASSEMBLER__
|
#ifdef __CALYPSI_ASSEMBLER__
|
||||||
|
|
||||||
|
#define short_a sep #0b00100000
|
||||||
|
|
||||||
|
#define long_a rep #0b00100000
|
||||||
|
|
||||||
#ifdef __CALYPSI_CODE_MODEL_SMALL__
|
#ifdef __CALYPSI_CODE_MODEL_SMALL__
|
||||||
|
|
||||||
#define libcode code
|
#define libcode code
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
//*****************************************************************************
|
|
||||||
// Sentinel 65X Kernel
|
|
||||||
//
|
|
||||||
// src/drivers/vera.c
|
|
||||||
//*****************************************************************************
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "drivers/vera.h"
|
|
||||||
|
|
||||||
typedef struct vera_s *VERA;
|
|
||||||
|
|
||||||
struct vera_s {
|
|
||||||
uint8_t addr_x_l;
|
|
||||||
uint8_t addr_x_m;
|
|
||||||
uint8_t addr_x_h;
|
|
||||||
union {
|
|
||||||
uint8_t data[2];
|
|
||||||
uint16_t data16;
|
|
||||||
};
|
|
||||||
uint8_t ctrl;
|
|
||||||
uint8_t ien;
|
|
||||||
uint8_t isr;
|
|
||||||
union {
|
|
||||||
uint8_t irq_line_l;
|
|
||||||
uint8_t const scanline_l;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
VERA vera = (VERA)(0x00df00);
|
|
||||||
|
|
||||||
void
|
|
||||||
vera_init(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t
|
|
||||||
vera_peek(uint32_t addr)
|
|
||||||
{
|
|
||||||
(void) addr;
|
|
||||||
|
|
||||||
// Set addrsel to 0
|
|
||||||
uint8_t asel = vera->ctrl;
|
|
||||||
vera->ctrl = asel & 0b11111110;
|
|
||||||
|
|
||||||
// Set address
|
|
||||||
vera->addr_x_l = addr & 0x000000FF;
|
|
||||||
vera->addr_x_m = (addr & 0x0000FF00) >> 8;
|
|
||||||
|
|
||||||
vera->addr_x_h = vera->addr_x_h & 0b11111110;
|
|
||||||
|
|
||||||
vera->addr_x_h = vera->addr_x_h | (addr & ((uint32_t)(1) << 16));
|
|
||||||
|
|
||||||
return vera->data[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
vera_poke(uint32_t addr, uint8_t value)
|
|
||||||
{
|
|
||||||
(void) addr;
|
|
||||||
|
|
||||||
// Set addrsel to 0
|
|
||||||
uint8_t asel = vera->ctrl;
|
|
||||||
vera->ctrl = asel & 0b11111110;
|
|
||||||
|
|
||||||
// Set address
|
|
||||||
vera->addr_x_l = addr & 0x000000FF;
|
|
||||||
vera->addr_x_m = (addr & 0x0000FF00) >> 8;
|
|
||||||
|
|
||||||
vera->addr_x_h = vera->addr_x_h & 0b11111110;
|
|
||||||
|
|
||||||
vera->addr_x_h = vera->addr_x_h | (addr & ((uint32_t)(1) << 16));
|
|
||||||
|
|
||||||
vera->data[0] = value;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_vera_set_bgcolor(uint8_t color)
|
|
||||||
{
|
|
||||||
(void) color;
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -0,0 +1,311 @@
|
||||||
|
;;*****************************************************************************
|
||||||
|
;; Sentinel 65X Kernel
|
||||||
|
;;
|
||||||
|
;; src/drivers/vera.s
|
||||||
|
;;*****************************************************************************
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
.section code
|
||||||
|
|
||||||
|
.public vera_init
|
||||||
|
.public vera_set_data0_address
|
||||||
|
.public vera_set_data1_address
|
||||||
|
.public vera_peek_data0
|
||||||
|
.public vera_peek_data1
|
||||||
|
.public vera_poke_data0
|
||||||
|
.public vera_poke_data1
|
||||||
|
.public vera_set_addr0_auto_increment
|
||||||
|
.public vera_set_addr1_auto_increment
|
||||||
|
.public vera_set_addr0_decrement
|
||||||
|
.public vera_set_addr1_decrement
|
||||||
|
|
||||||
|
.extern _Dp
|
||||||
|
|
||||||
|
vera_init:
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Set the data0 address.
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; _Dp[0-2]: 24-bit VERA address to read
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_data0_address:
|
||||||
|
phb
|
||||||
|
|
||||||
|
short_a
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 0.
|
||||||
|
lda #0b00000001
|
||||||
|
trb 0xDF05
|
||||||
|
|
||||||
|
; Set the low byte of the address
|
||||||
|
lda _Dp+0
|
||||||
|
sta 0xDF00
|
||||||
|
|
||||||
|
; Set the mid byte of the address
|
||||||
|
lda _Dp+1
|
||||||
|
sta 0xDF01
|
||||||
|
|
||||||
|
; Set the high bit of the address
|
||||||
|
lda _Dp+2
|
||||||
|
and #0b00000001
|
||||||
|
|
||||||
|
; If the high bit in A is set, then branch
|
||||||
|
bne d0_high_bit_set
|
||||||
|
; Else clear the lowest bit of ADDR0_H
|
||||||
|
lda #0b00000001
|
||||||
|
trb 0xDF03
|
||||||
|
; And exit
|
||||||
|
bra d0_done
|
||||||
|
|
||||||
|
d0_high_bit_set:
|
||||||
|
; Set the lowest bit of ADDR0_H
|
||||||
|
lda #0b00000001
|
||||||
|
tsb 0xDF03
|
||||||
|
|
||||||
|
d0_done:
|
||||||
|
long_a
|
||||||
|
|
||||||
|
plb
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Set the data1 address.
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; _Dp[0-2]: 24-bit VERA address to read
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_data1_address:
|
||||||
|
phb
|
||||||
|
|
||||||
|
short_a
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 1.
|
||||||
|
lda #0b00000001
|
||||||
|
tsb 0xDF05
|
||||||
|
|
||||||
|
; Set the low byte of the address
|
||||||
|
lda _Dp+0
|
||||||
|
sta 0xDF00
|
||||||
|
|
||||||
|
; Set the mid byte of the address
|
||||||
|
lda _Dp+1
|
||||||
|
sta 0xDF01
|
||||||
|
|
||||||
|
; Set the high bit of the address
|
||||||
|
lda _Dp+2
|
||||||
|
and #0b00000001
|
||||||
|
|
||||||
|
; If the high bit in A is set, then branch
|
||||||
|
bne d1_high_bit_set
|
||||||
|
; Else clear the lowest bit of ADDR1_H
|
||||||
|
lda #0b00000001
|
||||||
|
trb 0xDF03
|
||||||
|
; And exit
|
||||||
|
bra d1_done
|
||||||
|
|
||||||
|
d1_high_bit_set:
|
||||||
|
; Set the lowest bit of ADDR1_H
|
||||||
|
lda #0b00000001
|
||||||
|
tsb 0xDF03
|
||||||
|
|
||||||
|
d1_done:
|
||||||
|
long_a
|
||||||
|
|
||||||
|
plb
|
||||||
|
rts
|
||||||
|
|
||||||
|
vera_peek_data0:
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda 0x00DF03
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
vera_peek_data1:
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda 0x00DF04
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
vera_poke_data0:
|
||||||
|
short_a
|
||||||
|
|
||||||
|
sta 0x00DF03
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
vera_poke_data1:
|
||||||
|
short_a
|
||||||
|
|
||||||
|
sta 0x00DF04
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
; Set the data0 address auto-increment
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; A: Increment value (0-15)
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_addr0_auto_increment:
|
||||||
|
phb
|
||||||
|
short_a
|
||||||
|
pha
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 0.
|
||||||
|
lda #0b00000001
|
||||||
|
trb 0xDF05
|
||||||
|
|
||||||
|
; Clear the high four bits of ADDR0_H
|
||||||
|
lda #0b11110000
|
||||||
|
trb 0xDF02
|
||||||
|
|
||||||
|
pla
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
tsb 0xDF02
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Set the data1 address auto-increment
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; A: Increment value (0-15)
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_addr1_auto_increment:
|
||||||
|
phb
|
||||||
|
short_a
|
||||||
|
pha
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 1.
|
||||||
|
lda #0b00000001
|
||||||
|
tsb 0xDF05
|
||||||
|
|
||||||
|
; Clear the high four bits of ADDR0_H
|
||||||
|
lda #0b11110000
|
||||||
|
trb 0xDF02
|
||||||
|
|
||||||
|
pla
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
tsb 0xDF02
|
||||||
|
|
||||||
|
long_a
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
; If the argument is non-zero, set DECR0, else clear it.
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; A: State (C boolean)
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_addr0_decrement:
|
||||||
|
phb
|
||||||
|
short_a
|
||||||
|
pha
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 0.
|
||||||
|
lda #0b00000001
|
||||||
|
trb 0xDF05
|
||||||
|
|
||||||
|
pla
|
||||||
|
beq vera_set_addr0_decrement_false
|
||||||
|
|
||||||
|
vera_set_addr0_decrement_true:
|
||||||
|
lda #0b00001000
|
||||||
|
tsb 0xDF02
|
||||||
|
bra vera_set_addr0_decrement_done
|
||||||
|
|
||||||
|
vera_set_addr0_decrement_false:
|
||||||
|
lda #0b00001000
|
||||||
|
trb 0xDF02
|
||||||
|
|
||||||
|
vera_set_addr0_decrement_done:
|
||||||
|
long_a
|
||||||
|
plb
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
; If the argument is non-zero, set DECR1, else clear it.
|
||||||
|
;
|
||||||
|
; Arguments:
|
||||||
|
; A: State (C boolean)
|
||||||
|
; Return value:
|
||||||
|
; None
|
||||||
|
;
|
||||||
|
vera_set_addr1_decrement:
|
||||||
|
phb
|
||||||
|
short_a
|
||||||
|
pha
|
||||||
|
|
||||||
|
; Set the data bank to 0
|
||||||
|
lda #0
|
||||||
|
pha
|
||||||
|
plb
|
||||||
|
|
||||||
|
; Set ADDRSEL to 1.
|
||||||
|
lda #0b00000001
|
||||||
|
tsb 0xDF05
|
||||||
|
|
||||||
|
pla
|
||||||
|
beq vera_set_addr1_decrement_false
|
||||||
|
|
||||||
|
vera_set_addr1_decrement_true:
|
||||||
|
lda #0b00001000
|
||||||
|
tsb 0xDF02
|
||||||
|
bra vera_set_addr1_decrement_done
|
||||||
|
|
||||||
|
vera_set_addr1_decrement_false:
|
||||||
|
lda #0b00001000
|
||||||
|
trb 0xDF02
|
||||||
|
|
||||||
|
vera_set_addr1_decrement_done:
|
||||||
|
long_a
|
||||||
|
plb
|
||||||
|
rts
|
|
@ -0,0 +1,51 @@
|
||||||
|
//*****************************************************************************
|
||||||
|
// Sentinel 65X Kernel
|
||||||
|
//
|
||||||
|
// src/drivers/vera2.c
|
||||||
|
//*****************************************************************************
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "drivers/vera.h"
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
vera_read_byte(uint32_t addr)
|
||||||
|
{
|
||||||
|
vera_set_data0_address(addr);
|
||||||
|
vera_set_addr0_auto_increment(ADDR_INCREMENT_0);
|
||||||
|
vera_set_addr0_decrement(false);
|
||||||
|
return vera_peek_data0();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
vera_read_word(uint32_t addr)
|
||||||
|
{
|
||||||
|
vera_set_data0_address(addr);
|
||||||
|
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
||||||
|
vera_set_addr0_decrement(false);
|
||||||
|
uint8_t data_low = vera_peek_data0();
|
||||||
|
uint8_t data_high = vera_peek_data0();
|
||||||
|
return (uint16_t)((data_high << 8) & data_low);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vera_write_byte(uint32_t addr, uint8_t value)
|
||||||
|
{
|
||||||
|
vera_set_data0_address(addr);
|
||||||
|
vera_set_addr0_auto_increment(ADDR_INCREMENT_0);
|
||||||
|
vera_set_addr0_decrement(false);
|
||||||
|
vera_poke_data0(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vera_write_word(uint32_t addr, uint16_t value)
|
||||||
|
{
|
||||||
|
vera_set_data0_address(addr);
|
||||||
|
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
||||||
|
vera_set_addr0_decrement(false);
|
||||||
|
vera_poke_data0((uint8_t)(value & 0x00FF));
|
||||||
|
vera_poke_data0((uint8_t)(value & 0xFF00) >> 8);
|
||||||
|
}
|
Loading…
Reference in New Issue