Checking in the latest broken DMA code.
This commit is contained in:
parent
5b417c2431
commit
acbfe3e19d
9 changed files with 115 additions and 36 deletions
22
examples/cube/sin.c
Normal file
22
examples/cube/sin.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define FIX_PREC 9
|
||||
#define TO_FIX(x) ((int32_t)((x)*(1<<FIX_PREC)))
|
||||
|
||||
#define SIN_SIZE 512
|
||||
#define COS_OFF 128
|
||||
|
||||
|
||||
int main(void) {
|
||||
int i;
|
||||
double v;
|
||||
for(i = 0; i < SIN_SIZE + COS_OFF; ++i) {
|
||||
v = sin(2.0 * M_PI * i / (double)SIN_SIZE);
|
||||
printf("%d, ", TO_FIX( v ));
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -32,11 +32,11 @@ START=0x2000
|
|||
|
||||
echo "__f256_start = ${START};" > ${SETTINGS}
|
||||
|
||||
CLANG="mos-f256k-clang -I${F256}/include -I${F256}/f256lib -Os -fno-inline"
|
||||
CLANG="mos-f256k-clang -I${F256}/include -I${F256}/f256lib -Os"
|
||||
|
||||
${CLANG} -c ${F256}/f256lib/f256.c
|
||||
${CLANG} -c pgztest.c
|
||||
${CLANG} -o pgztest pgztest.o f256.o
|
||||
${CLANG} -o pgztest pgztest.o f256.o
|
||||
|
||||
mv -f pgztest pgztest.bin
|
||||
|
||||
|
|
|
@ -41,20 +41,13 @@ void bitmap(void) {
|
|||
bitmapReset();
|
||||
|
||||
bitmapGetResolution(&mx, &my);
|
||||
mx--;
|
||||
my--;
|
||||
|
||||
for (l=0; l<TEXTCOLORS_COUNT; l++)
|
||||
bitmapDefineColor(l,
|
||||
textColors[l].r,
|
||||
textColors[l].g,
|
||||
textColors[l].b);
|
||||
bitmapDefineColor(l, textColors[l].r, textColors[l].g, textColors[l].b);
|
||||
|
||||
l = 0;
|
||||
while (1) {
|
||||
bitmapSetColor(c++);
|
||||
if (c == TEXTCOLORS_COUNT) c = 0;
|
||||
|
||||
// Abuse all three graphics pages.
|
||||
switch (l) {
|
||||
case 0:
|
||||
bitmapSetPage(1);
|
||||
|
@ -73,10 +66,16 @@ void bitmap(void) {
|
|||
break;
|
||||
}
|
||||
|
||||
x = rndRead() % mx;
|
||||
y = rndRead() % my;
|
||||
x2 = rndRead() % mx;
|
||||
y2 = rndRead() % my;
|
||||
bitmapSetColor(0);
|
||||
bitmapClear();
|
||||
|
||||
bitmapSetColor(c++);
|
||||
if (c == TEXTCOLORS_COUNT) c = 0;
|
||||
|
||||
x = randomRead() % mx;
|
||||
y = randomRead() % my;
|
||||
x2 = randomRead() % mx;
|
||||
y2 = randomRead() % my;
|
||||
|
||||
bitmapLine(x, y, x2, y2);
|
||||
}
|
||||
|
@ -99,8 +98,8 @@ void text(void) {
|
|||
|
||||
int main(void) {
|
||||
f256Init();
|
||||
//text();
|
||||
//bitmap();
|
||||
bitmapReset(); // BOOM!
|
||||
text();
|
||||
bitmap();
|
||||
//bitmapReset(); // BOOM!
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,19 @@ char error;
|
|||
|
||||
|
||||
void bitmapClear(void) {
|
||||
#ifndef BOOM
|
||||
dmaFill(_BITMAP_BASE[_page], _PAGE_SIZE, _color);
|
||||
//dma2dFill(_BITMAP_BASE[_page], _MAX_X, _MAX_Y, _MAX_X, _color);
|
||||
#else
|
||||
uint16_t x;
|
||||
uint16_t y;
|
||||
|
||||
for (y=0; y<_MAX_Y; y++) {
|
||||
for (x=0; x<_MAX_X; x++) {
|
||||
bitmapPutPixel(x, y);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -162,11 +174,9 @@ void bitmapReset(void) {
|
|||
_BITMAP_BASE[1] = _BITMAP_BASE[0] + realSize; // Page 2 = 0x24000
|
||||
_BITMAP_BASE[2] = _BITMAP_BASE[1] + realSize; // Page 3 = 0x38000
|
||||
|
||||
/*
|
||||
print("\nbase0 = "); printInt(_BITMAP_BASE[0]);
|
||||
print("\nbase1 = "); printInt(_BITMAP_BASE[1]);
|
||||
print("\nbase2 = "); printInt(_BITMAP_BASE[2]);
|
||||
*/
|
||||
|
||||
// Set palette to a gradient so there's at least *something*.
|
||||
for (x=0; x<256; x++) bitmapDefineColor(x, x, x, x);
|
||||
|
@ -174,7 +184,7 @@ void bitmapReset(void) {
|
|||
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
|
||||
|
||||
POKE(VKY_LAYER_CTRL_0, 16); // Bitmaps on all layers.
|
||||
POKE(VKY_LAYER_CTRL_1, 1); // Bitmaps on all layers.
|
||||
POKE(VKY_LAYER_CTRL_1, 2); // Bitmaps on all layers.
|
||||
|
||||
// Turn everthing on for setup.
|
||||
POKE(VKY_BM0_CTRL, 1);
|
||||
|
|
|
@ -39,7 +39,27 @@ void dmaFill(uint32_t start, uint32_t length, byte value) {
|
|||
POKE(DMA_FILL_VAL, value);
|
||||
POKEA(DMA_DST_ADDR, start);
|
||||
POKEA(DMA_COUNT, length);
|
||||
POKE(DMA_CTRL, DMA_CTRL_FILL | DMA_CTRL_ENABLE | DMA_CTRL_START);
|
||||
POKE(DMA_CTRL, PEEK(DMA_CTRL) | DMA_CTRL_START);
|
||||
|
||||
dmaWait();
|
||||
|
||||
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
|
||||
}
|
||||
|
||||
|
||||
|
||||
void dma2dFill(uint32_t start, uint16_t width, uint16_t height, uint16_t stride, byte value) {
|
||||
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||||
|
||||
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
|
||||
|
||||
POKE(DMA_CTRL, DMA_CTRL_2D | DMA_CTRL_ENABLE);
|
||||
POKE(DMA_FILL_VAL, value);
|
||||
POKEA(DMA_DST_ADDR, start);
|
||||
POKEW(DMA_WIDTH, width);
|
||||
POKEW(DMA_HEIGHT, height);
|
||||
POKEW(DMA_STRIDE_DST, stride);
|
||||
POKE(DMA_CTRL, PEEK(DMA_CTRL) | DMA_CTRL_START);
|
||||
|
||||
dmaWait();
|
||||
|
||||
|
@ -48,9 +68,13 @@ void dmaFill(uint32_t start, uint32_t length, byte value) {
|
|||
|
||||
|
||||
static void dmaWait(void) {
|
||||
// First, wait for DMA to be complete.
|
||||
while (PEEK(DMA_STATUS) & DMA_STAT_BUSY)
|
||||
// Spin our wheels.
|
||||
;
|
||||
|
||||
POKE(DMA_CTRL, 0);
|
||||
|
||||
// Then wait for a VBL because two DMAs per frame will crash.
|
||||
waitVerticalBlank();
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ extern "C"
|
|||
|
||||
|
||||
void dmaFill(uint32_t start, uint32_t length, byte value);
|
||||
void dma2dFill(uint32_t start, uint16_t width, uint16_t height, uint16_t stride, byte value);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
void f256Init(void) {
|
||||
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||||
|
||||
asm("sei");
|
||||
|
||||
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
|
||||
|
||||
//POKE(VKY_MSTR_CTRL_0, 1); // Enable text.
|
||||
|
@ -53,11 +55,11 @@ void f256Init(void) {
|
|||
// MMU_MEM_BANK_6 is always mapped to I/O.
|
||||
// MMU_MEM_BANK_7 belongs to the MicroKernel.
|
||||
|
||||
rndSeed(0); //***TODO*** Use clock or something.
|
||||
randomSeed(0); //***TODO*** Use clock or something.
|
||||
}
|
||||
|
||||
|
||||
uint16_t rndRead(void) {
|
||||
uint16_t randomRead(void) {
|
||||
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||||
uint16_t result;
|
||||
|
||||
|
@ -72,7 +74,7 @@ uint16_t rndRead(void) {
|
|||
}
|
||||
|
||||
|
||||
void rndSeed(uint16_t seed) {
|
||||
void randomSeed(uint16_t seed) {
|
||||
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||||
|
||||
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
|
||||
|
@ -82,3 +84,20 @@ void rndSeed(uint16_t seed) {
|
|||
|
||||
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
|
||||
}
|
||||
|
||||
|
||||
void waitVerticalBlank(void) {
|
||||
byte mmu = PEEK(MMU_IO_CTRL); // Get current MMU state.
|
||||
|
||||
POKE(MMU_IO_CTRL, MMU_IO_PAGE_0); // Swap I/O page 0 into bank 6.
|
||||
|
||||
//***TODO*** This assumes we're 60hz with graphics enabled.
|
||||
while (PEEKW(RAST_ROW_L) == 482)
|
||||
// Spin our wheels.
|
||||
;
|
||||
while (PEEKW(RAST_ROW_L) != 482)
|
||||
// Spin our wheels.
|
||||
;
|
||||
|
||||
POKE(MMU_IO_CTRL, mmu); // Restore MMU state.
|
||||
}
|
||||
|
|
|
@ -51,6 +51,12 @@ extern "C"
|
|||
typedef unsigned char byte;
|
||||
|
||||
|
||||
// Things not in the Merlin defs.
|
||||
#define TEXT_MATRIX 0xc000 // I/O Page 2
|
||||
#define RAST_ROW_L 0xd01a
|
||||
#define RAST_ROW_H 0xd01b
|
||||
|
||||
|
||||
// Single-byte
|
||||
#define PEEK(addy) ((byte)*(volatile byte *)(addy))
|
||||
#define POKE(addy, value) (*(volatile byte *)(addy) = (value))
|
||||
|
@ -70,12 +76,12 @@ typedef unsigned char byte;
|
|||
#define VECTOR(member) (size_t)(&((struct call *)0xff00)->member)
|
||||
#define EVENT(member) (size_t)(&((struct events *)0)->member)
|
||||
#define CALL(fn) \
|
||||
asm("jsr %[addy] \n" \
|
||||
"stz %[err] \n" \
|
||||
"ror %[err]" \
|
||||
: [err] "+m"(error) \
|
||||
: [addy] "i"(VECTOR(fn)) \
|
||||
: "a", "x", "y", "c", "v");
|
||||
asm("jsr %[addy] \n" \
|
||||
"stz %[err] \n" \
|
||||
"ror %[err]" \
|
||||
: [err] "+m"(error) \
|
||||
: [addy] "i"(VECTOR(fn)) \
|
||||
: "a", "x", "y", "c", "v");
|
||||
|
||||
|
||||
extern struct event_t event; // The event struct is allocated in crt0.
|
||||
|
@ -83,8 +89,9 @@ extern char error;
|
|||
|
||||
|
||||
void f256Init(void);
|
||||
uint16_t rndRead(void);
|
||||
void rndSeed(uint16_t seed);
|
||||
uint16_t randomRead(void);
|
||||
void randomSeed(uint16_t seed);
|
||||
void waitVerticalBlank(void);
|
||||
|
||||
|
||||
#include "text.h"
|
||||
|
|
|
@ -34,9 +34,6 @@ extern "C"
|
|||
#include "f256.h"
|
||||
|
||||
|
||||
#define TEXT_MATRIX 0xc000 // I/O Page 2
|
||||
|
||||
|
||||
// Apple IIgs Colors, because that's how we roll.
|
||||
typedef enum textColorsE {
|
||||
BLACK = 0,
|
||||
|
|
Loading…
Add table
Reference in a new issue