Skip to content

Commit 17abfdb

Browse files
authored
Merge pull request #262 from michalsc/RC3
Emu68 RC3
2 parents 4b83868 + c9c03d5 commit 17abfdb

File tree

10 files changed

+1068
-210
lines changed

10 files changed

+1068
-210
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.14.0)
22
project(Emu68 VERSION 1.0.0)
3-
set(PROJECT_VERSION 1.0.0-blitwait)
3+
set(PROJECT_VERSION 1.0.0-rc.3)
44

55
include(cmake/verstring.cmake)
66
include(cmake/firmware_download.cmake)
@@ -159,6 +159,7 @@ if (${VARIANT} IN_LIST SUPPORTED_VARIANTS)
159159
src/boards/sdcard.c
160160
src/boards/68040.c
161161
src/boards/emmc.c
162+
src/boards/unicam.c
162163
)
163164
else()
164165
message(FATAL_ERROR "PiStorm variants are supported on raspi targets, only.")

include/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
#define EMU68_WEAK_CFLUSH_SLOW 0
4747
#define EMU68_PC_REG_HISTORY 0
48+
#define EMU68_CCR_SCAN_DEPTH 20
4849

4950
#ifdef PISTORM
5051

src/aarch64/start.c

Lines changed: 106 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,10 @@ int enable_cache = 0;
304304
int limit_2g = 0;
305305
int chip_slowdown;
306306
int dbf_slowdown;
307+
int emu68_icnt = EMU68_M68K_INSN_DEPTH;
308+
int emu68_ccrd = EMU68_CCR_SCAN_DEPTH;
309+
int emu68_irng = EMU68_BRANCH_INLINE_DISTANCE;
310+
307311
#ifdef PISTORM
308312
static int blitwait;
309313
#endif
@@ -581,7 +585,7 @@ void boot(void *dtree)
581585
use_2slot = 0;
582586
}
583587
#endif
584-
if (find_token(prop->op_value, "chip_slowdown"))
588+
if (find_token(prop->op_value, "chip_slowdown") || find_token(prop->op_value, "SC"))
585589
{
586590
chip_slowdown = 1;
587591
}
@@ -611,7 +615,29 @@ void boot(void *dtree)
611615
cs_dist = cs;
612616
}
613617

614-
if (find_token(prop->op_value, "dbf_slowdown"))
618+
if ((tok = find_token(prop->op_value, "SCS=")))
619+
{
620+
uint32_t cs = 0;
621+
622+
for (int i=0; i < 4; i++)
623+
{
624+
if (tok[4 + i] < '0' || tok[4 + i] > '9')
625+
break;
626+
627+
cs = cs * 10 + tok[4 + i] - '0';
628+
}
629+
630+
if (cs == 0) cs = 1;
631+
632+
if (cs > 8) {
633+
cs = 8;
634+
}
635+
636+
cs_dist = cs;
637+
}
638+
639+
640+
if (find_token(prop->op_value, "dbf_slowdown") || find_token(prop->op_value, "DBF"))
615641
{
616642
dbf_slowdown = 1;
617643
}
@@ -620,7 +646,81 @@ void boot(void *dtree)
620646
dbf_slowdown = 0;
621647
}
622648

623-
blitwait = !!find_token(prop->op_value, "blitwait");
649+
blitwait = !(!find_token(prop->op_value, "blitwait") && !find_token(prop->op_value, "BW"));
650+
651+
if ((tok = find_token(prop->op_value, "ICNT=")))
652+
{
653+
uint32_t val = 0;
654+
const char *c = &tok[5];
655+
656+
for (int i=0; i < 4; i++)
657+
{
658+
if (c[i] < '0' || c[i] > '9')
659+
break;
660+
661+
val = val * 10 + c[i] - '0';
662+
}
663+
664+
if (val == 0) val = 1;
665+
if (val > 256) val = 256;
666+
667+
emu68_icnt = val;
668+
}
669+
670+
if ((tok = find_token(prop->op_value, "CCRD=")))
671+
{
672+
uint32_t val = 0;
673+
const char *c = &tok[5];
674+
675+
for (int i=0; i < 4; i++)
676+
{
677+
if (c[i] < '0' || c[i] > '9')
678+
break;
679+
680+
val = val * 10 + c[i] - '0';
681+
}
682+
683+
if (val > 31) val = 31;
684+
685+
emu68_ccrd = val;
686+
}
687+
688+
if ((tok = find_token(prop->op_value, "IRNG=")))
689+
{
690+
uint32_t val = 0;
691+
const char *c = &tok[5];
692+
693+
for (int i=0; i < 7; i++)
694+
{
695+
if (c[i] < '0' || c[i] > '9')
696+
break;
697+
698+
val = val * 10 + c[i] - '0';
699+
}
700+
701+
if (val > 65535) val = 65535;
702+
703+
emu68_irng = val;
704+
}
705+
706+
if ((tok = find_token(prop->op_value, "ICNT=")))
707+
{
708+
uint32_t val = 0;
709+
const char *c = &tok[5];
710+
711+
for (int i=0; i < 4; i++)
712+
{
713+
if (c[i] < '0' || c[i] > '9')
714+
break;
715+
716+
val = val * 10 + c[i] - '0';
717+
}
718+
719+
if (val == 0) val = 1;
720+
if (val > 256) val = 256;
721+
722+
emu68_icnt = val;
723+
}
624724

625725
if ((tok = find_token(prop->op_value, "buptest=")))
626726
{
@@ -1999,12 +2099,12 @@ void M68K_StartEmu(void *addr, void *fdt)
19992099
__m68k.JIT_UNIT_COUNT = 0;
20002100
__m68k.JIT_SOFTFLUSH_THRESH = EMU68_WEAK_CFLUSH_LIMIT;
20012101
__m68k.JIT_CONTROL = EMU68_WEAK_CFLUSH ? JCCF_SOFT : 0;
2002-
__m68k.JIT_CONTROL |= (EMU68_M68K_INSN_DEPTH & JCCB_INSN_DEPTH_MASK) << JCCB_INSN_DEPTH;
2003-
__m68k.JIT_CONTROL |= (EMU68_BRANCH_INLINE_DISTANCE & JCCB_INLINE_RANGE_MASK) << JCCB_INLINE_RANGE;
2102+
__m68k.JIT_CONTROL |= (emu68_icnt & JCCB_INSN_DEPTH_MASK) << JCCB_INSN_DEPTH;
2103+
__m68k.JIT_CONTROL |= (emu68_irng & JCCB_INLINE_RANGE_MASK) << JCCB_INLINE_RANGE;
20042104
__m68k.JIT_CONTROL |= (EMU68_MAX_LOOP_COUNT & JCCB_LOOP_COUNT_MASK) << JCCB_LOOP_COUNT;
20052105
__m68k.JIT_CONTROL2 = chip_slowdown ? JC2F_CHIP_SLOWDOWN : 0;
20062106
__m68k.JIT_CONTROL2 |= dbf_slowdown ? JC2F_DBF_SLOWDOWN : 0;
2007-
__m68k.JIT_CONTROL2 |= (20 << JC2B_CCR_SCAN_DEPTH);
2107+
__m68k.JIT_CONTROL2 |= (emu68_ccrd << JC2B_CCR_SCAN_DEPTH);
20082108
__m68k.JIT_CONTROL2 |= ((cs_dist - 1) << JC2B_CHIP_SLOWDOWN_RATIO);
20092109
__m68k.JIT_CONTROL2 |= blitwait ? JC2F_BLITWAIT : 0;
20102110

src/aarch64/vectors.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,14 @@ int SYSWriteValToAddr(uint64_t value, uint64_t value2, int size, uint64_t far)
326326
{
327327
D(kprintf("[JIT:SYS] SYSWriteValToAddr(0x%x, %d, %p)\n", value, size, far));
328328

329+
/*
330+
Allow single wrap around the address space. This provides mirror areas for
331+
simplified aarch64 pointer arithmetic
332+
*/
333+
if ((far >> 32) == 1 || (far >> 32) == 0xffffffff) {
334+
far &= 0xffffffff;
335+
}
336+
329337
if (far == INTENA) {
330338
if (value & 0x8000) {
331339
INT_shadow.INTENA |= value & 0x7fff;
@@ -355,14 +363,6 @@ int SYSWriteValToAddr(uint64_t value, uint64_t value2, int size, uint64_t far)
355363
}
356364
}
357365

358-
/*
359-
Allow single wrap around the address space. This provides mirror areas for
360-
simplified aarch64 pointer arithmetic
361-
*/
362-
if ((far >> 32) == 1 || (far >> 32) == 0xffffffff) {
363-
far &= 0xffffffff;
364-
}
365-
366366
if (far == 0xdeadbeef && size == 1) {
367367
kprintf("%c", value);
368368
return 1;
@@ -372,6 +372,10 @@ int SYSWriteValToAddr(uint64_t value, uint64_t value2, int size, uint64_t far)
372372
kprintf("Z3 write access with far %08x, size %d, value %08x\n", far, size, value);
373373
}
374374

375+
if (far >= 0x1000000) {
376+
return 1; // Unmapped Z3 address
377+
}
378+
375379
if (far == CIAAPRA && size == 1) {
376380
if ((value & 1) != overlay) {
377381
kprintf("[JIT:SYS] OVL bit changing to %d\n", value & 1);
@@ -479,6 +483,13 @@ int SYSReadValFromAddr(uint64_t *value, uint64_t *value2, int size, uint64_t far
479483
far &= 0xffffffff;
480484
}
481485

486+
if (far >= 0x1000000) {
487+
// Unmapped Z3 address
488+
*value = ~0ULL;
489+
if (size == 16)
490+
*value2 = ~0ULL;
491+
return 1;
492+
}
482493

483494
if ((far >= 0xc00000 && far <= 0xc7ffff) && block_c0)
484495
{

src/boards/devicetree.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ void build_fdt()
127127
struct fdt_header *fdt_orig = dt_fdt_base();
128128
struct fdt_header fdt = *fdt_orig;
129129

130-
data = tlsf_malloc(tlsf, 4096);
131-
allocated_len = 4096;
130+
data = tlsf_malloc(tlsf, 262144);
131+
allocated_len = 262144;
132132
data_len = 0;
133133
strings_len = 0;
134134
strings = NULL;

0 commit comments

Comments
 (0)