Generate traps procedurally. For some reason they always keep getting pulled

in, though...
This commit is contained in:
David Given 2019-06-11 00:12:00 +02:00
parent ec2ea1feff
commit 48a9c48f56
3 changed files with 53 additions and 120 deletions

View file

@ -11,6 +11,10 @@
.define efdivz, eiund, efund, econv, estack, eheap, eillins, eoddz
.define ecase, ememflt, ebadptr, ebadpc, ebadlae, ebadmon, ebadlin, ebadgto
.define eunimpl
.define EARRAY, ERANGE, ESET, EIOVFL, EFOVFL, EFUNFL, EIDIVZ, EIDIVZ
.define EFDIVZ, EIUND, EFUND, ECONV, ESTACK, EHEAP, EILLINS, EODDZ
.define ECASE, EMEMFLT, EBADPTR, EBADPC, EBADLAE, EBADMON, EBADLIN, EBADGTO
.define EUNIMPL
! Trap routine
! Expects trap number on stack.
@ -45,126 +49,6 @@
EBADGTO = 27
EUNIMPL = 63 ! unimplemented em-instruction called
earray: lxi h,EARRAY
push h
call .trp
ret
erange: lxi h,ERANGE
push h
call .trp
ret
eset: lxi h,ESET
push h
call .trp
ret
eiovfl: lxi h,EIOVFL
push h
call .trp
ret
efovfl: lxi h,EFOVFL
push h
call .trp
ret
efunfl: lxi h,EFUNFL
push h
call .trp
ret
eidivz: lxi h,EIDIVZ
push h
call .trp
ret
efdivz: lxi h,EFDIVZ
push h
call .trp
ret
eiund: lxi h,EIUND
push h
call .trp
ret
efund: lxi h,EFUND
push h
call .trp
ret
econv: lxi h,ECONV
push h
call .trp
ret
estack: lxi h,ESTACK
push h
call .trp
ret
eheap: lxi h,EHEAP
push h
call .trp
ret
eillins:lxi h,EILLINS
push h
call .trp
ret
eoddz: lxi h,EODDZ
push h
call .trp
ret
ecase: lxi h,ECASE
push h
call .trp
ret
ememflt:lxi h,EMEMFLT
push h
call .trp
ret
ebadptr:lxi h,EBADPTR
push h
call .trp
ret
ebadpc: lxi h,EBADPC
push h
call .trp
ret
ebadlae:lxi h,EBADLAE
push h
call .trp
ret
ebadmon:lxi h,EBADMON
push h
call .trp
ret
ebadlin:lxi h,EBADLIN
push h
call .trp
ret
ebadgto:lxi h,EBADGTO
push h
call .trp
ret
eunimpl:lxi h,EUNIMPL
push h
call .trp
ret
.trp:
pop h
xthl

View file

@ -45,6 +45,33 @@ local bdos_calls = {
[40] = "cpm_write_random_filled",
}
local trap_calls = {
"EARRAY",
"ERANGE",
"ESET",
"EIOVFL",
"EFOVFL",
"EFUNFL",
"EIDIVZ",
"EFDIVZ",
"EIUND",
"EFUND",
"ECONV",
"ESTACK",
"EHEAP",
"EILLINS",
"EODDZ",
"ECASE",
"EMEMFLT",
"EBADPTR",
"EBADPC",
"EBADLAE",
"EBADMON",
"EBADLIN",
"EBADGTO",
"EUNIMPL",
}
local generated = {}
for n, name in pairs(bdos_calls) do
generated[#generated+1] = normalrule {
@ -56,6 +83,16 @@ for n, name in pairs(bdos_calls) do
}
}
end
for _, name in pairs(trap_calls) do
generated[#generated+1] = normalrule {
name = name,
ins = { "./make_trap.sh" },
outleaves = { name..".s" },
commands = {
"%{ins[1]} "..name:lower().." "..name.." > %{outs}"
}
}
end
acklibrary {
name = "lib",

12
plat/cpm/libsys/make_trap.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/sh
cat <<EOF
#
#include "asm.h"
.define $1
$1:
lxi h, $2
push h
call .trp
ret
EOF