Skip to content

Commit 315e3d0

Browse files
authored
Merge pull request #98 from jtothebell/GraphicsMemLocations
Graphics mem locations
2 parents ef749ed + 349b6d9 commit 315e3d0

File tree

6 files changed

+410
-58
lines changed

6 files changed

+410
-58
lines changed

source/PicoRam.h

+32-13
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ struct drawState_t {
181181

182182
uint8_t lineInvalid;
183183

184+
//hardware extension
184185
uint8_t unknown05f36;
185186
uint8_t unknown05f37;
186187

@@ -196,29 +197,41 @@ struct drawState_t {
196197

197198
struct hwState_t {
198199
//audio hardware mods
200+
//0x5f40
199201
uint8_t half_rate;
202+
//0x5f41
200203
uint8_t reverb;
204+
//0x5f42
201205
uint8_t distort;
206+
//0x5f43
202207
uint8_t lowpass;
203-
208+
//0x5f44..0x5f4b
204209
uint32_t rngState[2];
205-
210+
//0x5f4c..0x5f53
206211
uint8_t buttonStates[8];
207-
208-
uint8_t unknownInputBlock[8];
209-
212+
//0x5f54
213+
uint8_t spriteSheetMemMapping;
214+
//0x5f55
215+
uint8_t screenDataMemMapping;
216+
//0x5f56
217+
uint8_t mapMemMapping;
218+
//0x5f57
219+
uint8_t widthOfTheMap;
220+
//0x5f58..0x5f5b
221+
uint8_t printAttributes[4];
222+
//0x5f5c
210223
uint8_t btnpRepeatDelay;
211-
224+
//0x5f5d
212225
uint8_t btnpRepeatInterval;
213-
226+
//0x5f5e
214227
uint8_t colorBitmask;
215-
228+
//0x5f5f
216229
uint8_t alternatePaletteFlag;
217-
230+
//0x5f60..0x5f6f
218231
uint8_t alternatePaletteMap[16];
219-
232+
//0x5f70..0x5f7f
220233
uint8_t alternatePaletteScreenLineBitfield[16];
221-
234+
//0x5f80..0x5fff
222235
uint8_t gpioPins[128];
223236

224237
};
@@ -230,9 +243,13 @@ struct PicoRam
230243
void Reset() {
231244
memset(data, 0, 0x4300);
232245
//leave general use memory
233-
memset(data + 0x5600, 0, 0x8000 - 0x5600);
246+
memset(data + 0x5600, 0, 0x10000 - 0x5600);
234247
//colorBitmask starts at 255
235248
hwState.colorBitmask = 0xff;
249+
hwState.spriteSheetMemMapping = 0x00;
250+
hwState.screenDataMemMapping = 0x60;
251+
hwState.mapMemMapping = 0x20;
252+
hwState.widthOfTheMap = 128;
236253
}
237254

238255
union
@@ -260,8 +277,10 @@ struct PicoRam
260277
hwState_t hwState;
261278

262279
uint8_t screenBuffer[128 * 64];
280+
281+
uint8_t userData[0x8000];
263282
};
264283

265-
uint8_t data[0x8000];
284+
uint8_t data[0x10000];
266285
};
267286
};

source/graphics.cpp

+64-25
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,15 @@ Graphics::Graphics(std::string fontdata, PicoRam* memory) {
7373

7474

7575
uint8_t* Graphics::GetP8FrameBuffer(){
76-
//TODO: replace with ram's screen buffer
77-
return _memory->screenBuffer;
76+
return _memory->hwState.screenDataMemMapping == 0
77+
? _memory->spriteSheetData
78+
: _memory->screenBuffer;
79+
}
80+
81+
uint8_t* Graphics::GetP8SpriteSheetBuffer(){
82+
return _memory->hwState.spriteSheetMemMapping == 0x60
83+
? _memory->screenBuffer
84+
: _memory->spriteSheetData;
7885
}
7986

8087
uint8_t* Graphics::GetScreenPaletteMap(){
@@ -105,7 +112,7 @@ void Graphics::copySpriteToScreen(
105112

106113
auto &drawState = _memory->drawState;
107114
auto &hwState = _memory->hwState;
108-
auto &screenBuffer = _memory->screenBuffer;
115+
uint8_t *screenBuffer = GetP8FrameBuffer();
109116

110117
const uint8_t writeMask = hwState.colorBitmask & 15;
111118
const uint8_t readMask = hwState.colorBitmask >> 4;
@@ -256,7 +263,7 @@ void Graphics::copyStretchSpriteToScreen(
256263

257264
auto &drawState = _memory->drawState;
258265
auto &hwState = _memory->hwState;
259-
auto &screenBuffer = _memory->screenBuffer;
266+
uint8_t *screenBuffer = GetP8FrameBuffer();
260267

261268
const uint8_t writeMask = hwState.colorBitmask & 15;
262269
const uint8_t readMask = hwState.colorBitmask >> 4;
@@ -529,7 +536,7 @@ void Graphics::_setPixelFromSprite(int x, int y, uint8_t col) {
529536

530537
auto &drawState = _memory->drawState;
531538
auto &hwState = _memory->hwState;
532-
auto &screenBuffer = _memory->screenBuffer;
539+
uint8_t *screenBuffer = GetP8FrameBuffer();
533540

534541
//col = getDrawPalMappedColor(col);
535542
col = drawState.drawPaletteMap[col & 0x0f] & 0x0f;
@@ -555,7 +562,7 @@ void Graphics::_setPixelFromPen(int x, int y) {
555562

556563
auto &drawState = _memory->drawState;
557564
auto &hwState = _memory->hwState;
558-
auto &screenBuffer = _memory->screenBuffer;
565+
uint8_t *screenBuffer = GetP8FrameBuffer();
559566

560567
uint8_t col = drawState.color;
561568

@@ -609,7 +616,7 @@ void Graphics::cls() {
609616
void Graphics::cls(uint8_t color) {
610617
color = color & 15;
611618
uint8_t val = color << 4 | color;
612-
memset(_memory->screenBuffer, val, sizeof(_memory->screenBuffer));
619+
memset(GetP8FrameBuffer(), val, sizeof(_memory->screenBuffer));
613620

614621
_memory->drawState.text_x = 0;
615622
_memory->drawState.text_y = 0;
@@ -638,7 +645,7 @@ uint8_t Graphics::pget(int x, int y){
638645
applyCameraToPoint(&x, &y);
639646

640647
if (isOnScreen(x, y)){
641-
return getPixelNibble(x, y, _memory->screenBuffer);
648+
return getPixelNibble(x, y, GetP8FrameBuffer());
642649
}
643650

644651
return 0;
@@ -744,6 +751,7 @@ void Graphics::_private_h_line(int x1, int x2, int y){
744751
void Graphics::_private_v_line (int y1, int y2, int x){
745752
auto &drawState = _memory->drawState;
746753
auto &hwState = _memory->hwState;
754+
uint8_t * screenBuffer = GetP8FrameBuffer();
747755

748756
if (!(x >= drawState.clip_xb && x < drawState.clip_xe)) {
749757
return;
@@ -776,7 +784,7 @@ void Graphics::_private_v_line (int y1, int y2, int x){
776784
for (int16_t y = miny; y <= maxy; ++y)
777785
{
778786
int pixIdx = COMBINED_IDX(x, y);
779-
auto &data = _memory->screenBuffer[pixIdx];
787+
auto &data = screenBuffer[pixIdx];
780788
data = (data & mask) | nibble;
781789
}
782790
}
@@ -1354,7 +1362,7 @@ void Graphics::spr(
13541362
int spr_y = (n / 16) * 8;
13551363
int16_t spr_w = (int16_t)(w * (fix32)8);
13561364
int16_t spr_h = (int16_t)(h * (fix32)8);
1357-
copySpriteToScreen(_memory->spriteSheetData, x, y, spr_x, spr_y, spr_w, spr_h, flip_x, flip_y);
1365+
copySpriteToScreen(GetP8SpriteSheetBuffer(), x, y, spr_x, spr_y, spr_w, spr_h, flip_x, flip_y);
13581366
}
13591367

13601368
void Graphics::sspr(
@@ -1369,7 +1377,7 @@ void Graphics::sspr(
13691377
bool flip_x = false,
13701378
bool flip_y = false)
13711379
{
1372-
copyStretchSpriteToScreen(_memory->spriteSheetData, sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y);
1380+
copyStretchSpriteToScreen(GetP8SpriteSheetBuffer(), sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y);
13731381
}
13741382

13751383
bool Graphics::fget(uint8_t n, uint8_t f){
@@ -1394,11 +1402,11 @@ void Graphics::fset(uint8_t n, uint8_t v){
13941402
}
13951403

13961404
uint8_t Graphics::sget(uint8_t x, uint8_t y){
1397-
return getPixelNibble(x, y, _memory->spriteSheetData);
1405+
return getPixelNibble(x, y, GetP8SpriteSheetBuffer());
13981406
}
13991407

14001408
void Graphics::sset(uint8_t x, uint8_t y, uint8_t c){
1401-
setPixelNibble(x, y, c, _memory->spriteSheetData);
1409+
setPixelNibble(x, y, c, GetP8SpriteSheetBuffer());
14021410
}
14031411

14041412
std::tuple<int16_t, int16_t> Graphics::camera() {
@@ -1437,30 +1445,61 @@ std::tuple<uint8_t, uint8_t, uint8_t, uint8_t> Graphics::clip(int x, int y, int
14371445
}
14381446

14391447

1440-
//map methods heavily based on tac08 implementation
14411448
uint8_t Graphics::mget(int celx, int cely){
1442-
if (celx < 0 || celx >= 128 || cely < 0 || cely >= 64)
1443-
return 0;
1449+
const bool bigMap = _memory->hwState.mapMemMapping >= 0x80;
1450+
const int mapW = _memory->hwState.widthOfTheMap;
1451+
const int idx = cely * mapW + celx;
14441452

1445-
if (cely < 32) {
1446-
return _memory->mapData[cely * 128 + celx];
1453+
if (idx < 0) {
1454+
return 0;
14471455
}
1448-
else if (cely < 64){
1449-
return _memory->spriteSheetData[cely* 128 + celx];
1456+
1457+
if (bigMap){
1458+
const int mapLocation = _memory->hwState.mapMemMapping << 8;
1459+
const int mapSize = 0x10000 - mapLocation;
1460+
if (idx >= mapSize){
1461+
return 0;
1462+
}
1463+
const int offset = 0x8000 - mapSize;
1464+
return _memory->userData[offset + idx];
1465+
}
1466+
else {
1467+
if (idx < 4096) {
1468+
return _memory->mapData[idx];
1469+
}
1470+
else if (idx < 8192){
1471+
return _memory->spriteSheetData[idx];
1472+
}
14501473
}
14511474

14521475
return 0;
14531476
}
14541477

14551478
void Graphics::mset(int celx, int cely, uint8_t snum){
1456-
if (celx < 0 || celx >= 128 || cely < 0 || cely >= 64)
1479+
const bool bigMap = _memory->hwState.mapMemMapping >= 0x80;
1480+
const int mapW = _memory->hwState.widthOfTheMap;
1481+
const int idx = cely * mapW + celx;
1482+
1483+
if (idx < 0) {
14571484
return;
1485+
}
14581486

1459-
if (cely < 32) {
1460-
_memory->mapData[cely * 128 + celx] = snum;
1487+
if (bigMap){
1488+
const int mapLocation = _memory->hwState.mapMemMapping << 8;
1489+
const int mapSize = 0x10000 - mapLocation;
1490+
if (idx >= mapSize){
1491+
return;
1492+
}
1493+
const int offset = 0x8000 - mapSize;
1494+
_memory->userData[offset + idx] = snum;
14611495
}
1462-
else if (cely < 64){
1463-
_memory->spriteSheetData[cely* 128 + celx] = snum;
1496+
else {
1497+
if (idx < 4096) {
1498+
_memory->mapData[idx] = snum;
1499+
}
1500+
else if (idx < 8192) {
1501+
_memory->spriteSheetData[idx] = snum;
1502+
}
14641503
}
14651504
}
14661505

source/graphics.h

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class Graphics {
9898
Graphics(std::string fontdata, PicoRam* memory);
9999

100100
uint8_t* GetP8FrameBuffer();
101+
uint8_t* GetP8SpriteSheetBuffer();
101102
uint8_t* GetScreenPaletteMap();
102103
Color* GetPaletteColors();
103104

source/vm.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -619,9 +619,10 @@ bool Vm::ExecuteLua(string luaString, string callbackFunction){
619619
return true;
620620
}
621621

622+
const int MemoryUpperBound = 0x10000;
622623

623624
uint8_t Vm::vm_peek(int addr){
624-
if (addr < 0 || addr > 0x8000){
625+
if (addr < 0 || addr > MemoryUpperBound){
625626
return 0;
626627
}
627628

@@ -634,10 +635,10 @@ int16_t Vm::vm_peek2(int addr){
634635
for (int i = 0; i < 2; ++i)
635636
{
636637
/* This code handles partial reads by adding zeroes */
637-
if (addr + i < 0x8000)
638+
if (addr + i < MemoryUpperBound)
638639
bits |= _memory->data[addr + i] << (8 * i);
639-
else if (addr + i >= 0x8000)
640-
bits |= _memory->data[addr + i - 0x8000] << (8 * i);
640+
else if (addr + i >= MemoryUpperBound)
641+
bits |= _memory->data[addr + i - MemoryUpperBound] << (8 * i);
641642
}
642643

643644
return bits;
@@ -650,26 +651,26 @@ fix32 Vm::vm_peek4(int addr){
650651
for (int i = 0; i < 4; ++i)
651652
{
652653
/* This code handles partial reads by adding zeroes */
653-
if (addr + i < 0x8000)
654+
if (addr + i < MemoryUpperBound)
654655
bits |= _memory->data[addr + i] << (8 * i);
655-
else if (addr + i >= 0x8000)
656-
bits |= _memory->data[addr + i - 0x8000] << (8 * i);
656+
else if (addr + i >= MemoryUpperBound)
657+
bits |= _memory->data[addr + i - MemoryUpperBound] << (8 * i);
657658
}
658659

659660
return fix32::frombits(bits);
660661
}
661662

662663
void Vm::vm_poke(int addr, uint8_t value){
663664
//todo: check how pico 8 handles out of bounds
664-
if (addr < 0 || addr > 0x8000){
665+
if (addr < 0 || addr > MemoryUpperBound){
665666
return;
666667
}
667668

668669
_memory->data[addr] = value;
669670
}
670671

671672
void Vm::vm_poke2(int addr, int16_t value){
672-
if (addr < 0 || addr > 0x8000 - 1){
673+
if (addr < 0 || addr > MemoryUpperBound - 1){
673674
return;
674675
}
675676

@@ -679,7 +680,7 @@ void Vm::vm_poke2(int addr, int16_t value){
679680
}
680681

681682
void Vm::vm_poke4(int addr, fix32 value){
682-
if (addr < 0 || addr > 0x8000 - 3){
683+
if (addr < 0 || addr > MemoryUpperBound - 3){
683684
return;
684685
}
685686

0 commit comments

Comments
 (0)