Merge pull request #145 from davidgiven/dtrg-arraysizes
Experimentally use rst 1 to optimise frame variable loads.
This commit is contained in:
commit
996188d20a
|
@ -21,8 +21,8 @@
|
||||||
.probyte:
|
.probyte:
|
||||||
pop h
|
pop h
|
||||||
push b
|
push b
|
||||||
mvi e, 0xff
|
mvi d, 0xff
|
||||||
mov d, m
|
mov e, m
|
||||||
inx h
|
inx h
|
||||||
jmp .pron
|
jmp .pron
|
||||||
|
|
||||||
|
|
54
mach/i80/libem/rst.s
Normal file
54
mach/i80/libem/rst.s
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
.define .rst_init
|
||||||
|
.rst_init:
|
||||||
|
mvi a, 0xc3 ! jmp <a16>
|
||||||
|
sta 0x08
|
||||||
|
sta 0x10
|
||||||
|
lxi h, rst1
|
||||||
|
shld 0x09
|
||||||
|
lxi h, rst2
|
||||||
|
shld 0x11
|
||||||
|
ret
|
||||||
|
|
||||||
|
! de = [bc+const1] (remember bc is the frame pointer)
|
||||||
|
rst1:
|
||||||
|
pop h
|
||||||
|
mov a, m
|
||||||
|
inx h
|
||||||
|
push h
|
||||||
|
|
||||||
|
mov l, a
|
||||||
|
ral
|
||||||
|
sbb a
|
||||||
|
mov h, a
|
||||||
|
|
||||||
|
dad b
|
||||||
|
mov e, m
|
||||||
|
inx h
|
||||||
|
mov d, m
|
||||||
|
ret
|
||||||
|
|
||||||
|
! [bc+const1] = de (remember bc is the frame pointer)
|
||||||
|
rst2:
|
||||||
|
pop h
|
||||||
|
mov a, m
|
||||||
|
inx h
|
||||||
|
push h
|
||||||
|
|
||||||
|
mov l, a
|
||||||
|
ral
|
||||||
|
sbb a
|
||||||
|
mov h, a
|
||||||
|
|
||||||
|
dad b
|
||||||
|
mov m, e
|
||||||
|
inx h
|
||||||
|
mov m, d
|
||||||
|
ret
|
||||||
|
|
|
@ -4,18 +4,13 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NORCSID
|
|
||||||
static char rcsid[] = "$Id$";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* machine dependent back end routines for the Intel 8080.
|
* machine dependent back end routines for the Intel 8080.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h> /* atol */
|
#include <stdlib.h> /* atol */
|
||||||
|
|
||||||
void con_part(sz, w) register sz;
|
void con_part(int sz, word w)
|
||||||
word w;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
while (part_size % sz)
|
while (part_size % sz)
|
||||||
|
|
|
@ -82,6 +82,8 @@ INSTRUCTIONS
|
||||||
/* cpo label:ro cost(3,14). */
|
/* cpo label:ro cost(3,14). */
|
||||||
/* cz label:ro cost(3,14). */
|
/* cz label:ro cost(3,14). */
|
||||||
/* daa kills a:cc cost(1, 4). */
|
/* daa kills a:cc cost(1, 4). */
|
||||||
|
data1 ".data1" const1:ro.
|
||||||
|
data2 ".data2" const2:ro.
|
||||||
dad b_d_h_sp:ro kills hl:cc cost(1,10).
|
dad b_d_h_sp:ro kills hl:cc cost(1,10).
|
||||||
dcr reg+lbreg:rw:cc cost(1, 5).
|
dcr reg+lbreg:rw:cc cost(1, 5).
|
||||||
dcr m:rw:cc cost(1, 7).
|
dcr m:rw:cc cost(1, 7).
|
||||||
|
@ -129,7 +131,7 @@ INSTRUCTIONS
|
||||||
/* rpe cost(1, 8). */
|
/* rpe cost(1, 8). */
|
||||||
/* rpo cost(1, 8). */
|
/* rpo cost(1, 8). */
|
||||||
rrc kills a:cc cost(1, 4).
|
rrc kills a:cc cost(1, 4).
|
||||||
/* rst const1:ro cost(1,11). */
|
rst const1:ro cost(1,11).
|
||||||
/* rz cost(1, 8). */
|
/* rz cost(1, 8). */
|
||||||
sbb reg1:ro kills a:cc cost(1, 4).
|
sbb reg1:ro kills a:cc cost(1, 4).
|
||||||
/* sbi const1:ro kills a:cc cost(2, 7). */
|
/* sbi const1:ro kills a:cc cost(2, 7). */
|
||||||
|
@ -241,12 +243,23 @@ pat loc yields {const2,$1}
|
||||||
pat ldc yields {const2,highw($1)}
|
pat ldc yields {const2,highw($1)}
|
||||||
{const2,loww($1)}
|
{const2,loww($1)}
|
||||||
|
|
||||||
|
#ifdef USE_I80_RSTS
|
||||||
|
pat lol sfit($1, 8)
|
||||||
|
uses hlreg, areg, dereg
|
||||||
|
gen
|
||||||
|
rst {const1, 1}
|
||||||
|
data1 {const1, $1}
|
||||||
|
yields de
|
||||||
|
#endif
|
||||||
|
|
||||||
pat lol
|
pat lol
|
||||||
uses hlreg={const2,$1}, dereg
|
uses hlreg={const2, $1}, dereg
|
||||||
gen dad lb
|
gen
|
||||||
mov e,{m}
|
dad lb
|
||||||
inx hl
|
mov e,{m}
|
||||||
mov d,{m} yields de
|
inx hl
|
||||||
|
mov d,{m}
|
||||||
|
yields de
|
||||||
|
|
||||||
pat loe
|
pat loe
|
||||||
uses hlreg
|
uses hlreg
|
||||||
|
@ -446,13 +459,23 @@ uses hl_or_de={label,$1} yields %a
|
||||||
pat stl lol $1==$2
|
pat stl lol $1==$2
|
||||||
with dereg yields de de leaving stl $1
|
with dereg yields de de leaving stl $1
|
||||||
|
|
||||||
|
#ifdef USE_I80_RSTS
|
||||||
|
pat stl sfit($1, 8)
|
||||||
|
with dereg
|
||||||
|
uses hlreg, areg
|
||||||
|
gen
|
||||||
|
rst {const1, 2}
|
||||||
|
data1 {const1, $1}
|
||||||
|
#endif
|
||||||
|
|
||||||
pat stl
|
pat stl
|
||||||
with dereg
|
with dereg
|
||||||
uses hlreg={const2,$1}
|
uses hlreg={const2, $1}
|
||||||
gen dad lb
|
gen
|
||||||
mov {m},e
|
dad lb
|
||||||
inx hl
|
mov {m}, e
|
||||||
mov {m},d
|
inx hl
|
||||||
|
mov {m}, d
|
||||||
|
|
||||||
pat ste loe $1==$2
|
pat ste loe $1==$2
|
||||||
with hlreg yields hl hl leaving ste $1
|
with hlreg yields hl hl leaving ste $1
|
||||||
|
|
|
@ -34,7 +34,7 @@ int nstab=0;
|
||||||
|
|
||||||
static void chkstr(string, char *);
|
static void chkstr(string, char *);
|
||||||
|
|
||||||
string myalloc(size) {
|
string myalloc(int size) {
|
||||||
string p;
|
string p;
|
||||||
|
|
||||||
p = (string) calloc((unsigned)size, 1);
|
p = (string) calloc((unsigned)size, 1);
|
||||||
|
|
|
@ -44,6 +44,7 @@ void in_init(char *);
|
||||||
void in_start(void);
|
void in_start(void);
|
||||||
void fillemlines(void);
|
void fillemlines(void);
|
||||||
void swtxt(void);
|
void swtxt(void);
|
||||||
|
void dopseudo(void);
|
||||||
/* gencode.c */
|
/* gencode.c */
|
||||||
void out_init(char *);
|
void out_init(char *);
|
||||||
void out_finish(void);
|
void out_finish(void);
|
||||||
|
|
|
@ -48,6 +48,12 @@ begtext:
|
||||||
|
|
||||||
lxi sp, stack + STACKSIZE
|
lxi sp, stack + STACKSIZE
|
||||||
|
|
||||||
|
! Initialise the rsts (if desired).
|
||||||
|
|
||||||
|
#ifdef USE_I80_RSTS
|
||||||
|
call .rst_init
|
||||||
|
#endif
|
||||||
|
|
||||||
! C-ify the command line at 0x0080.
|
! C-ify the command line at 0x0080.
|
||||||
|
|
||||||
lxi h, 0x0080
|
lxi h, 0x0080
|
||||||
|
|
|
@ -4,7 +4,10 @@ include("lang/build.lua")
|
||||||
ackfile {
|
ackfile {
|
||||||
name = "boot",
|
name = "boot",
|
||||||
srcs = { "./boot.s" },
|
srcs = { "./boot.s" },
|
||||||
vars = { plat = "cpm" }
|
vars = {
|
||||||
|
plat = "cpm",
|
||||||
|
["+ackcflags"] = "-DUSE_I80_RSTS",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
build_plat_libs {
|
build_plat_libs {
|
||||||
|
|
|
@ -8,6 +8,9 @@ build_as {
|
||||||
build_ncg {
|
build_ncg {
|
||||||
name = "ncg",
|
name = "ncg",
|
||||||
arch = "i80",
|
arch = "i80",
|
||||||
|
vars = {
|
||||||
|
["+cflags"] = "-DUSE_I80_RSTS"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
build_top {
|
build_top {
|
||||||
|
|
|
@ -343,24 +343,36 @@ static struct insn insns[0x100] =
|
||||||
|
|
||||||
uint16_t i8080_disassemble(char* buffer, size_t bufsiz, uint16_t pc)
|
uint16_t i8080_disassemble(char* buffer, size_t bufsiz, uint16_t pc)
|
||||||
{
|
{
|
||||||
uint8_t opcode = i8080_read(pc++);
|
uint8_t opcode = i8080_read(pc);
|
||||||
|
uint8_t p1 = i8080_read(pc+1);
|
||||||
|
uint8_t p2 = i8080_read(pc+2);
|
||||||
struct insn* insn = &insns[opcode];
|
struct insn* insn = &insns[opcode];
|
||||||
uint16_t value = 0;
|
uint16_t value = 0;
|
||||||
|
const char* left = "";
|
||||||
|
|
||||||
|
snprintf(buffer, bufsiz, "%04x : ", pc);
|
||||||
|
pc++;
|
||||||
|
|
||||||
switch (insn->operand)
|
switch (insn->operand)
|
||||||
{
|
{
|
||||||
case NOTHING:
|
case NOTHING:
|
||||||
|
left = "%02x : ";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONST8:
|
case CONST8:
|
||||||
value = i8080_read(pc++);
|
left = "%02x %02x : ";
|
||||||
|
value = p1;
|
||||||
|
pc++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONST16:
|
case CONST16:
|
||||||
value = i8080_read(pc++);
|
left = "%02x %02x %02x : ";
|
||||||
value |= i8080_read(pc++) << 8;
|
value = p1 | (p2<<8);
|
||||||
|
pc += 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buffer, bufsiz, insn->name, value);
|
snprintf(buffer + 7, bufsiz - 7, left, opcode, p1, p2);
|
||||||
|
snprintf(buffer + 18, bufsiz - 18, insn->name, value);
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@ static bool tracing = false;
|
||||||
static bool singlestepping = true;
|
static bool singlestepping = true;
|
||||||
static bool bdosbreak = false;
|
static bool bdosbreak = false;
|
||||||
|
|
||||||
|
static const char* delimiters = " \t\n\r";
|
||||||
|
|
||||||
uint8_t i8080_read(uint16_t addr)
|
uint8_t i8080_read(uint16_t addr)
|
||||||
{
|
{
|
||||||
return ram[addr];
|
return ram[addr];
|
||||||
|
@ -65,13 +67,13 @@ void showregs(void)
|
||||||
int tstates;
|
int tstates;
|
||||||
uint16_t pc = i8080_read_reg16(PC);
|
uint16_t pc = i8080_read_reg16(PC);
|
||||||
i8080_disassemble(buffer, sizeof(buffer), pc);
|
i8080_disassemble(buffer, sizeof(buffer), pc);
|
||||||
printf("%04x : %s\n", pc, buffer);
|
puts(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_register(void)
|
static void cmd_register(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
char* w2 = strtok(NULL, " ");
|
char* w2 = strtok(NULL, delimiters);
|
||||||
|
|
||||||
if (w1 && w2)
|
if (w1 && w2)
|
||||||
{
|
{
|
||||||
|
@ -102,7 +104,7 @@ static void cmd_register(void)
|
||||||
|
|
||||||
static void cmd_break(void)
|
static void cmd_break(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
{
|
{
|
||||||
uint16_t breakpc = strtoul(w1, NULL, 16);
|
uint16_t breakpc = strtoul(w1, NULL, 16);
|
||||||
|
@ -128,7 +130,7 @@ static void cmd_break(void)
|
||||||
|
|
||||||
static void cmd_watch(void)
|
static void cmd_watch(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
{
|
{
|
||||||
uint16_t watchaddr = strtoul(w1, NULL, 16);
|
uint16_t watchaddr = strtoul(w1, NULL, 16);
|
||||||
|
@ -158,7 +160,7 @@ static void cmd_watch(void)
|
||||||
|
|
||||||
static void cmd_delete_breakpoint(void)
|
static void cmd_delete_breakpoint(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
{
|
{
|
||||||
uint16_t breakpc = strtoul(w1, NULL, 16);
|
uint16_t breakpc = strtoul(w1, NULL, 16);
|
||||||
|
@ -176,7 +178,7 @@ static void cmd_delete_breakpoint(void)
|
||||||
|
|
||||||
static void cmd_delete_watchpoint(void)
|
static void cmd_delete_watchpoint(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
{
|
{
|
||||||
uint16_t address = strtoul(w1, NULL, 16);
|
uint16_t address = strtoul(w1, NULL, 16);
|
||||||
|
@ -195,8 +197,8 @@ static void cmd_delete_watchpoint(void)
|
||||||
|
|
||||||
static void cmd_memory(void)
|
static void cmd_memory(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
char* w2 = strtok(NULL, " ");
|
char* w2 = strtok(NULL, delimiters);
|
||||||
|
|
||||||
if (!w2)
|
if (!w2)
|
||||||
w2 = "100";
|
w2 = "100";
|
||||||
|
@ -241,9 +243,30 @@ static void cmd_memory(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cmd_unassemble(void)
|
||||||
|
{
|
||||||
|
char* w1 = strtok(NULL, delimiters);
|
||||||
|
char* w2 = strtok(NULL, delimiters);
|
||||||
|
uint16_t startaddr = i8080_read_reg16(PC);
|
||||||
|
uint16_t endaddr;
|
||||||
|
|
||||||
|
if (w1)
|
||||||
|
startaddr = strtoul(w1, NULL, 16);
|
||||||
|
endaddr = startaddr + 0x20;
|
||||||
|
if (w2)
|
||||||
|
endaddr = startaddr + strtoul(w2, NULL, 16);
|
||||||
|
|
||||||
|
while (startaddr < endaddr)
|
||||||
|
{
|
||||||
|
char buffer[80];
|
||||||
|
startaddr = i8080_disassemble(buffer, sizeof(buffer), startaddr);
|
||||||
|
puts(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void cmd_bdos(void)
|
static void cmd_bdos(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
bdosbreak = !!strtoul(w1, NULL, 16);
|
bdosbreak = !!strtoul(w1, NULL, 16);
|
||||||
else
|
else
|
||||||
|
@ -252,7 +275,7 @@ static void cmd_bdos(void)
|
||||||
|
|
||||||
static void cmd_tracing(void)
|
static void cmd_tracing(void)
|
||||||
{
|
{
|
||||||
char* w1 = strtok(NULL, " ");
|
char* w1 = strtok(NULL, delimiters);
|
||||||
if (w1)
|
if (w1)
|
||||||
tracing = !!strtoul(w1, NULL, 16);
|
tracing = !!strtoul(w1, NULL, 16);
|
||||||
else
|
else
|
||||||
|
@ -270,10 +293,11 @@ static void cmd_help(void)
|
||||||
" w <addr> set watchpoint\n"
|
" w <addr> set watchpoint\n"
|
||||||
" dw <addr> delete watchpoint\n"
|
" dw <addr> delete watchpoint\n"
|
||||||
" m <addr> <len> show memory\n"
|
" m <addr> <len> show memory\n"
|
||||||
|
" u <addr> <len> unassemble memory\n"
|
||||||
" s single step\n"
|
" s single step\n"
|
||||||
" g continue\n"
|
" g continue\n"
|
||||||
" bdos 0|1 enable break on bdos entry\n"
|
" bdos 0|1 enable break on bdos entry\n"
|
||||||
" trace 0|1 enable tracing\n"
|
" tracing 0|1 enable tracing\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +313,7 @@ static void debug(void)
|
||||||
if (!fgets(cmdline, sizeof(cmdline), stdin))
|
if (!fgets(cmdline, sizeof(cmdline), stdin))
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
||||||
char* token = strtok(cmdline, " \n\r\t");
|
char* token = strtok(cmdline, delimiters);
|
||||||
if (token != NULL)
|
if (token != NULL)
|
||||||
{
|
{
|
||||||
if (strcmp(token, "?") == 0)
|
if (strcmp(token, "?") == 0)
|
||||||
|
@ -306,6 +330,8 @@ static void debug(void)
|
||||||
cmd_delete_watchpoint();
|
cmd_delete_watchpoint();
|
||||||
else if (strcmp(token, "m") == 0)
|
else if (strcmp(token, "m") == 0)
|
||||||
cmd_memory();
|
cmd_memory();
|
||||||
|
else if (strcmp(token, "u") == 0)
|
||||||
|
cmd_unassemble();
|
||||||
else if (strcmp(token, "s") == 0)
|
else if (strcmp(token, "s") == 0)
|
||||||
{
|
{
|
||||||
singlestepping = true;
|
singlestepping = true;
|
||||||
|
|
|
@ -31,13 +31,25 @@ int brk(void* newend)
|
||||||
void* sbrk(int increment)
|
void* sbrk(int increment)
|
||||||
{
|
{
|
||||||
char* old;
|
char* old;
|
||||||
|
char* new;
|
||||||
|
|
||||||
if (increment == 0)
|
if (increment == 0)
|
||||||
return current;
|
return current;
|
||||||
|
|
||||||
old = current;
|
old = current;
|
||||||
if (brk(old + increment) < 0)
|
new = old + increment;
|
||||||
return OUT_OF_MEMORY;
|
|
||||||
|
if ((increment > 0) && (new <= old))
|
||||||
|
goto out_of_memory;
|
||||||
|
else if ((increment < 0) && (new >= old))
|
||||||
|
goto out_of_memory;
|
||||||
|
|
||||||
|
if (brk(new) < 0)
|
||||||
|
goto out_of_memory;
|
||||||
|
|
||||||
return old;
|
return old;
|
||||||
|
|
||||||
|
out_of_memory:
|
||||||
|
errno = ENOMEM;
|
||||||
|
return OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue