1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-26 12:49:21 +00:00

Improved readability.

This commit is contained in:
jespergravgaard 2021-04-02 09:54:58 +02:00
parent e6d28c8ff4
commit eea4792eca
3 changed files with 72 additions and 35 deletions

View File

@ -17,15 +17,15 @@ char * const MATH_BUSY = 0xd70f;
// $D768-$D76F DIVOUT 64-bit output of MULTINA ÷ MULTINB
// $D768-$D76B DIVOUT FRAC 32-bit output of MULTINA ÷ MULTINB
signed char * const MATH_DIVOUT_FRAC_CHAR0 = 0xd768;
signed int * const MATH_DIVOUT_FRAC_INT0 = 0xd768;
signed int * const MATH_DIVOUT_FRAC_INT1 = 0xd76a;
signed long * const MATH_DIVOUT_FRAC_LONG0 = 0xd768;
signed char volatile * const MATH_DIVOUT_FRAC_CHAR0 = 0xd768;
signed int volatile * const MATH_DIVOUT_FRAC_INT0 = 0xd768;
signed int volatile * const MATH_DIVOUT_FRAC_INT1 = 0xd76a;
signed long volatile * const MATH_DIVOUT_FRAC_LONG0 = 0xd768;
// $D768-$D76F DIVOUT 64-bit output of MULTINA ÷ MULTINB
signed char * const MATH_DIVOUT_WHOLE_CHAR0 = 0xd76c;
signed int * const MATH_DIVOUT_WHOLE_INT0 = 0xd76c;
signed int * const MATH_DIVOUT_WHOLE_INT1 = 0xd76e;
signed long * const MATH_DIVOUT_WHOLE_LONG = 0xd76c;
signed char volatile * const MATH_DIVOUT_WHOLE_CHAR0 = 0xd76c;
signed int volatile * const MATH_DIVOUT_WHOLE_INT0 = 0xd76c;
signed int volatile * const MATH_DIVOUT_WHOLE_INT1 = 0xd76e;
signed long volatile * const MATH_DIVOUT_WHOLE_LONG = 0xd76c;
// $D770-$D773 MULTINA Multiplier input A / Divider numerator (32 bit)
signed char * const MATH_MULTINA_CHAR0 = 0xd770;
@ -46,7 +46,7 @@ signed int * const MATH_MULTINB_INT1 = 0xd776;
signed long * const MATH_MULTINB_LONG = 0xd774;
// $D778-$D77F MULTOUT 64-bit output of MULTINA × MULTINB
signed char * const MATH_MULTOUT_CHAR0 = 0xd778;
signed int * const MATH_MULTOUT_INT0 = 0xd778;
signed long * const MATH_MULTOUT_LONG0 = 0xd778;
signed long * const MATH_MULTOUT_LONG1 = 0xd77c;
signed char volatile * const MATH_MULTOUT_CHAR0 = 0xd778;
signed int volatile * const MATH_MULTOUT_INT0 = 0xd778;
signed long volatile * const MATH_MULTOUT_LONG0 = 0xd778;
signed long volatile * const MATH_MULTOUT_LONG1 = 0xd77c;

View File

@ -306,3 +306,54 @@ struct MEGA65_VICIV {
char DEBUGXY;
};
// $D030 VIC-III Control Register A (ROM banks)
// Bit 20-bit Address 16-bit Address Read-Write
// 0 CRAM2K $1F800 $1FFFF, $D800 $DFFF Y
// $FF80000 $FF807FF
const char VICIII_CRAM2K = 0x01;
// 3 ROM8 $38000 $39FFF $8000 $9FFF N
const char VICIII_ROM8 = 0x08;
// 4 ROMA $3A000 $3BFFF $A000 $BFFF N
const char VICIII_ROMA = 0x10;
// 5 ROMC $2C000 $2CFFF $C000 $CFFF N
const char VICIII_ROMC = 0x20;
// 6 CROM9 $29000 $29FFF $D000 $DFFF N
const char VICIII_CROM9 = 0x40;
// 7 ROME $3E000 $3FFFF $E000 $FFFF N
const char VICIII_ROME = 0x80;
// $D031 VIC-III Control Register B
// 0 INT Enable VIC-III interlaced mode
const char VICIII_INT = 0x01;
// 1 MONO Enable VIC-III MONO video output (not implemented)
const char VICIII_MONO = 0x02;
// 2 H1280 Enable 1280 horizontal pixels (not implemented)
const char VICIII_H1280 = 0x04;
// 3 V400 Enable 400 vertical pixels
const char VICIII_V400 = 0x08;
// 4 BPM Bit-Plane Mode
const char VICIII_BPM = 0x10;
// 5 ATTR Enable extended attributes and 8 bit colour entries
const char VICIII_ATTR = 0x20;
// 6 FAST Enable C65 FAST mode (3 .5MHz)
const char VICIII_FAST = 0x40;
// 7 H640 Enable C64 640 horizontal pixels / 80 column mode
const char VICIII_H640 = 0x80;
// $D054 VIC-IV Control register C
// 0 CHR16 enable 16-bit character numbers (two screen bytes per character)
const char VICIV_CHR16 = 0x01;
// 1 FCLRLO enable full-colour mode for character numbers <=\$FF
const char VICIV_FCLRLO = 0x02;
// 2 FCLRHI enable full-colour mode for character numbers >\$FF
const char VICIV_FCLRHI = 0x04;
// 3 SMTH video output horizontal smoothing enable
const char VICIV_CSMTH = 0x08;
// 4 VIC-IV:SPR640 Sprite H640 enable;
const char VICIV_SPR640 = 0x10;
// 5 VIC-IV:PALEMU video output pal simulation
const char VICIV_PALEMU = 0x20;
// 6 VIC-IV:VFAST C65GS FAST mode (48MHz)
const char VICIV_VFAST = 0x40;
// 7 VIC-IV:ALPHEN Alpha compositor enable
const char VICIV_ALPHEN = 0x80;

View File

@ -1,7 +1,7 @@
// Test hardware line drawing
// Based on https://github.com/MEGA65/mega65-tools/blob/master/src/tests/test_290.c
#pragma target(mega65)
#pragma target(mega65_remote)
#include <mega65.h>
#include <mega65-dma.h>
#include <6502.h>
@ -30,7 +30,7 @@ char line_dma_command[] = {
DMA_OPTION_LINE_MODE, 0, // Line Mode
DMA_OPTION_FORMAT_F018A, // F018A list format
DMA_OPTION_END, // end of options
0, // DMA command
DMA_COMMAND_FILL, // DMA command
0, 0, // Count of bytes to copy/fill
0, 0, // Source address
0, // Source bank
@ -43,8 +43,6 @@ char line_dma_command[] = {
const char LINE_DMA_COMMAND_SLOPE_OFFSET = 5;
// Offset of the DMA line MODE
const char LINE_DMA_COMMAND_MODE_OFFSET = 9;
// Offset of the DMA command
const char LINE_DMA_COMMAND_COMMAND_OFFSET = 12;
// Offset of the DMA count
const char LINE_DMA_COMMAND_COUNT_OFFSET = 13;
// Offset of the DMA source
@ -56,20 +54,18 @@ void main() {
// Avoid interrupts
SEI();
// Map memory to BANK 0 : 0x00XXXX - giving access to I/O
memoryRemap(0x00,0,0);
// Fast CPU, M65 IO
POKE(0, 65);
// Enable MEGA65 features
VICIII->KEY = 0x47;
VICIII->KEY = 0x47;
VICIII->KEY = 0x53;
// No C65 ROMs are mapped
VICIV->CONTROLA = 0;
// Enable 48MHz fast mode
VICIV->CONTROLB |= 0x40;
VICIV->CONTROLC |= 0x40;
VICIV->CONTROLB |= VICIII_FAST;
VICIV->CONTROLC |= VICIV_VFAST;
graphics_mode();
draw_line(160, 100, 0, 199, 1);
@ -88,9 +84,9 @@ const long GRAPHICS = 0x40000;
void graphics_mode(void) {
// 16-bit text mode, full-colour text for high chars
VICIV->CONTROLC = 5;
VICIV->CONTROLC = VICIV_FCLRHI | VICIV_CHR16;
// H320, fast CPU
VICIV->CONTROLB = 0x40;
VICIV->CONTROLB = VICIII_FAST;
// 320x200 per char, 16 pixels wide per char
// = 320/8 x 16 bits = 80 bytes per row
VICIV->CHARSTEP_LO = 80;
@ -177,7 +173,7 @@ void draw_line(int x1, int y1, int x2, int y2, unsigned char colour) {
line_dma_command[LINE_DMA_COMMAND_SLOPE_OFFSET + 2] = >(slope);
// Load DMA dest address with the address of the first pixel
long addr = GRAPHICS + (y1 << 3) + (x1 & 7) + (x1 >> 3) * 64 * 25l;
long addr = GRAPHICS + (x1/8) * 64 * 25 + (y1*8) + (x1&7);
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 0] = <(<(addr));
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 1] = >(<(addr));
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 2] = <(>(addr));
@ -189,20 +185,15 @@ void draw_line(int x1, int y1, int x2, int y2, unsigned char colour) {
line_dma_command[LINE_DMA_COMMAND_COUNT_OFFSET] = <(dy);
line_dma_command[LINE_DMA_COMMAND_COUNT_OFFSET + 1] = >(dy);
// Command is FILL
line_dma_command[LINE_DMA_COMMAND_COMMAND_OFFSET] = DMA_COMMAND_FILL;
// Line mode active, major axis is Y
line_dma_command[LINE_DMA_COMMAND_MODE_OFFSET] = DMA_OPTION_LINE_MODE_ENABLE + DMA_OPTION_LINE_MODE_DIRECTION_Y + (((x2 - x1) < 0) ? DMA_OPTION_LINE_MODE_SLOPE_NEGATIVE : 0x00);
VICIV->BORDER_COLOR = 1;
// Set address of DMA list
DMA->ADDRMB = 0;
DMA->ADDRBANK = 0;
DMA-> ADDRMSB = >line_dma_command;
// Trigger the DMA (with option lists)
DMA-> ETRIG = <line_dma_command;
VICIV->BORDER_COLOR = 0;
}
else {
// X is major axis
@ -236,7 +227,7 @@ void draw_line(int x1, int y1, int x2, int y2, unsigned char colour) {
line_dma_command[LINE_DMA_COMMAND_SLOPE_OFFSET + 2] = >(slope);
// Load DMA dest address with the address of the first pixel
long addr = GRAPHICS + (y1 << 3) + (x1 & 7) + (x1 >> 3) * 64 * 25;
long addr = GRAPHICS + (x1/8) * 64 * 25 + (y1*8) + (x1&7);
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 0] = <(<(addr));
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 1] = >(<(addr));
line_dma_command[LINE_DMA_COMMAND_DEST_OFFSET + 2] = <(>(addr));
@ -248,20 +239,15 @@ void draw_line(int x1, int y1, int x2, int y2, unsigned char colour) {
line_dma_command[LINE_DMA_COMMAND_COUNT_OFFSET] = <(dx);
line_dma_command[LINE_DMA_COMMAND_COUNT_OFFSET + 1] = >(dx);
// Command is FILL
line_dma_command[LINE_DMA_COMMAND_COMMAND_OFFSET] = DMA_COMMAND_FILL;
// Line mode active, major axis is X
line_dma_command[LINE_DMA_COMMAND_MODE_OFFSET] = DMA_OPTION_LINE_MODE_ENABLE + (((y2 - y1) < 0) ? DMA_OPTION_LINE_MODE_SLOPE_NEGATIVE : 0x00);
VICIV->BORDER_COLOR = 1;
// Set address of DMA list
DMA->ADDRMB = 0;
DMA->ADDRBANK = 0;
DMA-> ADDRMSB = >line_dma_command;
// Trigger the DMA (with option lists)
DMA-> ETRIG = <line_dma_command;
VICIV->BORDER_COLOR = 0;
}
}