Experimentally use rst 1 to optimise frame variable loads. Reduces Star Trek
from 43892 to 43205 bytes.
This commit is contained in:
parent
08b92153a0
commit
5ac280026e
29
mach/i80/libem/rst.s
Normal file
29
mach/i80/libem/rst.s
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#
|
||||||
|
.sect .text
|
||||||
|
.sect .rom
|
||||||
|
.sect .data
|
||||||
|
.sect .bss
|
||||||
|
.sect .text
|
||||||
|
|
||||||
|
.define .rst_init
|
||||||
|
.rst_init:
|
||||||
|
mvi a, 0xc3 ! jmp <a16>
|
||||||
|
sta 0x08
|
||||||
|
lxi h, rst1
|
||||||
|
shld 0x09
|
||||||
|
ret
|
||||||
|
|
||||||
|
! de = [bc+const2] (remember bc is the frame pointer)
|
||||||
|
rst1:
|
||||||
|
pop h
|
||||||
|
mov e, m
|
||||||
|
inx h
|
||||||
|
mov d, m
|
||||||
|
inx h
|
||||||
|
push h
|
||||||
|
xchg ! hl = offset
|
||||||
|
dad b
|
||||||
|
mov e, m
|
||||||
|
inx h
|
||||||
|
mov d, m
|
||||||
|
ret
|
|
@ -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 kills a:cc 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,24 @@ pat loc yields {const2,$1}
|
||||||
pat ldc yields {const2,highw($1)}
|
pat ldc yields {const2,highw($1)}
|
||||||
{const2,loww($1)}
|
{const2,loww($1)}
|
||||||
|
|
||||||
pat lol
|
#ifdef USE_I80_RSTS
|
||||||
uses hlreg={const2,$1}, dereg
|
pat lol
|
||||||
gen dad lb
|
kills hlreg
|
||||||
mov e,{m}
|
uses hlreg, dereg
|
||||||
inx hl
|
gen
|
||||||
mov d,{m} yields de
|
rst {const1, 1}
|
||||||
|
data2 {const2, $1}
|
||||||
|
yields de
|
||||||
|
#else
|
||||||
|
pat lol
|
||||||
|
uses hlreg={const2, $1}, dereg
|
||||||
|
gen
|
||||||
|
dad lb
|
||||||
|
mov e,{m}
|
||||||
|
inx hl
|
||||||
|
mov d,{m}
|
||||||
|
yields de
|
||||||
|
#endif
|
||||||
|
|
||||||
pat loe
|
pat loe
|
||||||
uses hlreg
|
uses hlreg
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue