From eea4792eca1b0ff3bd6a8894cbd117cee320d68f Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Fri, 2 Apr 2021 09:54:58 +0200 Subject: [PATCH] Improved readability. --- src/main/kc/include/mega65-math.h | 24 +++++------ src/main/kc/include/mega65-viciv.h | 51 +++++++++++++++++++++++ src/test/kc/examples/mega65/linedrawing.c | 32 ++++---------- 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/main/kc/include/mega65-math.h b/src/main/kc/include/mega65-math.h index 163ef2f8f..5abfad3e3 100644 --- a/src/main/kc/include/mega65-math.h +++ b/src/main/kc/include/mega65-math.h @@ -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; \ No newline at end of file +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; \ No newline at end of file diff --git a/src/main/kc/include/mega65-viciv.h b/src/main/kc/include/mega65-viciv.h index 8d2d82095..59307ad12 100644 --- a/src/main/kc/include/mega65-viciv.h +++ b/src/main/kc/include/mega65-viciv.h @@ -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; diff --git a/src/test/kc/examples/mega65/linedrawing.c b/src/test/kc/examples/mega65/linedrawing.c index bbed75526..f7da76cea 100644 --- a/src/test/kc/examples/mega65/linedrawing.c +++ b/src/test/kc/examples/mega65/linedrawing.c @@ -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 #include #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 = 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 = BORDER_COLOR = 0; } } \ No newline at end of file