Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
d0p1 🏳️⚧️ | 7cc3f65a58 |
4
Makefile
4
Makefile
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
# What platform to build for by default?
|
# What platform to build for by default?
|
||||||
|
|
||||||
DEFAULT_PLATFORM ?= pc65oo2
|
DEFAULT_PLATFORM ?= pc86
|
||||||
|
|
||||||
# Where should the ACK put its temporary files?
|
# Where should the ACK put its temporary files?
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ LUA ?= lua
|
||||||
# Which build system to use; use 'ninja' or 'make' (in lower case). Leave
|
# Which build system to use; use 'ninja' or 'make' (in lower case). Leave
|
||||||
# blank to autodetect.
|
# blank to autodetect.
|
||||||
|
|
||||||
BUILDSYSTEM ?= make
|
BUILDSYSTEM ?=
|
||||||
|
|
||||||
# Build flags for ninja.
|
# Build flags for ninja.
|
||||||
|
|
||||||
|
|
22
build.lua
22
build.lua
|
@ -6,10 +6,26 @@ vars.ackcflags = {
|
||||||
}
|
}
|
||||||
vars.ackldflags = {}
|
vars.ackldflags = {}
|
||||||
vars.plats = {
|
vars.plats = {
|
||||||
"pc65oo2",
|
"mintia",
|
||||||
|
"cpm",
|
||||||
|
"linux386",
|
||||||
|
"linux68k",
|
||||||
|
"linuxppc",
|
||||||
|
"linuxmips",
|
||||||
|
"msdos86",
|
||||||
|
"msdos386",
|
||||||
|
"osx386",
|
||||||
|
"osxppc",
|
||||||
|
"pc86",
|
||||||
|
"rpi",
|
||||||
|
"pdpv7",
|
||||||
|
"em22",
|
||||||
}
|
}
|
||||||
vars.plats_with_tests = {
|
vars.plats_with_tests = {
|
||||||
"pc65oo2",
|
"cpm",
|
||||||
|
"linux68k",
|
||||||
|
"linuxppc",
|
||||||
|
"pc86",
|
||||||
}
|
}
|
||||||
|
|
||||||
local is_windows = os.getenv("OS") == "Windows_NT"
|
local is_windows = os.getenv("OS") == "Windows_NT"
|
||||||
|
@ -24,7 +40,7 @@ installable {
|
||||||
map = {
|
map = {
|
||||||
"lang/basic/src+pkg",
|
"lang/basic/src+pkg",
|
||||||
"lang/cem/cemcom.ansi+pkg",
|
"lang/cem/cemcom.ansi+pkg",
|
||||||
--"lang/m2/comp+pkg",
|
"lang/m2/comp+pkg",
|
||||||
"lang/pc/comp+pkg",
|
"lang/pc/comp+pkg",
|
||||||
"lang/b/compiler+pkg",
|
"lang/b/compiler+pkg",
|
||||||
"util/ack+pkg",
|
"util/ack+pkg",
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
# $Revision$
|
|
||||||
var w=4
|
|
||||||
var p=4
|
|
||||||
var s=2
|
|
||||||
var l=4
|
|
||||||
var f=4
|
|
||||||
var d=8
|
|
||||||
var NAME=m65oo2
|
|
||||||
var M=m65oo2
|
|
||||||
var LIB=lib/{M}/tail_
|
|
||||||
var RT=lib/{M}/head_
|
|
||||||
var CPP_F=-D__unix -D__USG
|
|
||||||
var ALIGN=-a0:2 -a1:2 -a2:2 -a3:2
|
|
||||||
var C_LIB={EM}/{LIB}cc.1s {EM}/{LIB}cc.2g
|
|
||||||
var OLD_C_LIB={C_LIB}
|
|
||||||
var MACHOPT_F=-m8
|
|
||||||
name be
|
|
||||||
from .m.g
|
|
||||||
to .s
|
|
||||||
program {EM}/lib.bin/{M}/ncg
|
|
||||||
args <
|
|
||||||
stdout
|
|
||||||
need .e
|
|
||||||
end
|
|
||||||
name as
|
|
||||||
from .s.so
|
|
||||||
to .o
|
|
||||||
program {EM}/lib.bin/{M}/as
|
|
||||||
args - -o > <
|
|
||||||
prep cond
|
|
||||||
end
|
|
||||||
name led
|
|
||||||
from .o.a
|
|
||||||
to .out
|
|
||||||
program {EM}/lib.bin/em_led
|
|
||||||
mapflag -l* LNAME={EM}/{LIB}*
|
|
||||||
mapflag -i SEPID=-b1:0
|
|
||||||
mapflag -ansi C_LIB={EM}/{LIB}ac
|
|
||||||
args {ALIGN} {SEPID?} (.e:{HEAD}={EM}/{RT}em) \
|
|
||||||
({RTS}:.ocm.bas={EM}/{RT}cc) \
|
|
||||||
({RTS}{ANSI?}:.c={EM}/{RT}cc) \
|
|
||||||
({RTS}{ANSI?}:.cansi={EM}/{RT}ac) \
|
|
||||||
({RTS}:.mod={EM}/{RT}m2) \
|
|
||||||
({RTS}:.p={EM}/{RT}pc) \
|
|
||||||
-o > < \
|
|
||||||
(.p:{TAIL}={EM}/{LIB}pc) \
|
|
||||||
(.bas:{TAIL}={EM}/{LIB}bc) \
|
|
||||||
(.mod:{TAIL}={EM}/{LIB}m2) \
|
|
||||||
(.ocm:{TAIL}={EM}/{LIB}ocm) \
|
|
||||||
(.ocm.bas:{TAIL}={OLD_C_LIB}) \
|
|
||||||
(.c:{TAIL}={C_LIB}) \
|
|
||||||
{FLOATS?} \
|
|
||||||
(.e:{TAIL}={EM}/{LIB}em {EM}/{LIB}mon {EM}/lib/{M}/end_em)
|
|
||||||
linker
|
|
||||||
end
|
|
||||||
name cv
|
|
||||||
from .out
|
|
||||||
to .cv
|
|
||||||
program {EM}/lib.bin/{M}/cv
|
|
||||||
args < >
|
|
||||||
outfile a.out
|
|
||||||
end
|
|
|
@ -1,21 +0,0 @@
|
||||||
name "Intel 8086 assembler"
|
|
||||||
dir as
|
|
||||||
end
|
|
||||||
name "Intel 8086 backend"
|
|
||||||
dir ncg
|
|
||||||
end
|
|
||||||
name "Intel 8086 EM library"
|
|
||||||
dir libem
|
|
||||||
end
|
|
||||||
name "Intel 8086 etext,edata,end library"
|
|
||||||
dir libend
|
|
||||||
end
|
|
||||||
name "Intel 8086 floating point library"
|
|
||||||
dir libfp
|
|
||||||
end
|
|
||||||
name "Intel 8086 PC/IX systemcall library"
|
|
||||||
dir libsys
|
|
||||||
end
|
|
||||||
name "Intel 8086 conversion program from ack.out --> PC/IX a.out"
|
|
||||||
dir cv
|
|
||||||
end
|
|
|
@ -1,12 +0,0 @@
|
||||||
bundle {
|
|
||||||
name = "headers",
|
|
||||||
srcs = {
|
|
||||||
"./mach0.c",
|
|
||||||
"./mach1.c",
|
|
||||||
"./mach2.c",
|
|
||||||
"./mach3.c",
|
|
||||||
"./mach4.c",
|
|
||||||
"./mach5.c",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
#define THREE_PASS /* branch and offset optimization */
|
|
||||||
#define LISTING /* enable listing facilities */
|
|
||||||
#define RELOCATION /* generate relocation info */
|
|
||||||
#define DEBUG 0
|
|
||||||
|
|
||||||
#undef ALIGNWORD
|
|
||||||
#define ALIGNWORD 4
|
|
||||||
#undef ALIGNSECT
|
|
||||||
#define ALIGNSECT 4
|
|
|
@ -1,19 +0,0 @@
|
||||||
#define TARGET_SIZE_B 0x0
|
|
||||||
#define TARGET_SIZE_W 0x1
|
|
||||||
#define TARGET_SIZE_L 0x2
|
|
||||||
#define TARGET_SIZE_zext 1 << 2
|
|
||||||
|
|
||||||
#define ADDR_SIZE_B (0x0 << 3)
|
|
||||||
#define ADDR_SIZE_W (0x1 << 3)
|
|
||||||
#define ADDR_SIZE_L (0x2 << 3)
|
|
||||||
|
|
||||||
#define TARGET_SIZE(x) (x & 0x3)
|
|
||||||
#define TARGET_ZEXT(x) (x & 0x4)
|
|
||||||
#define ADDR_SIZE(x) (x >> 3)
|
|
||||||
|
|
||||||
#define FIT8(x) (((x) & ~((int)0xFF)) == 0)
|
|
||||||
#define FIT16(x) (((x) & ~((int)0xFFFF)) == 0)
|
|
||||||
|
|
||||||
void encode_imm(int opc, int sz, expr_t exp);
|
|
||||||
void encode_addr(expr_t exp, int sz);
|
|
||||||
void branch(register int opc,expr_t exp);
|
|
|
@ -1,18 +0,0 @@
|
||||||
|
|
||||||
%token <y_word> SIZE
|
|
||||||
|
|
||||||
%token <y_word> REG_acc
|
|
||||||
%token <y_word> REG_x
|
|
||||||
%token <y_word> REG_y
|
|
||||||
|
|
||||||
%token <y_word> OP_impl
|
|
||||||
%token <y_word> OP_branch
|
|
||||||
%token <y_word> OP_arithm
|
|
||||||
%token <y_word> OP_jump
|
|
||||||
%token <y_word> OP_jsr
|
|
||||||
%token <y_word> OP_rol
|
|
||||||
%token <y_word> OP_bit
|
|
||||||
%token <y_word> OP_cpx
|
|
||||||
%token <y_word> OP_inc
|
|
||||||
%token <y_word> OP_stx
|
|
||||||
%token <y_word> OP_ldx
|
|
|
@ -1,76 +0,0 @@
|
||||||
{0, SIZE, 0x00, ".b"},
|
|
||||||
{0, SIZE, 0x01, ".w"},
|
|
||||||
{0, SIZE, 0x02, ".l"},
|
|
||||||
{0, SIZE, 0x04, ".sb"},
|
|
||||||
{0, SIZE, 0x05, ".sw"},
|
|
||||||
|
|
||||||
{0, REG_acc, 0x00, "a"},
|
|
||||||
{0, REG_x, 0x00, "x"},
|
|
||||||
{0, REG_y, 0x00, "y"},
|
|
||||||
|
|
||||||
{0, OP_impl, 0x00, "brk"},
|
|
||||||
{0, OP_impl, 0x08, "php"},
|
|
||||||
{0, OP_impl, 0x18, "clc"},
|
|
||||||
{0, OP_impl, 0x28, "plp"},
|
|
||||||
{0, OP_impl, 0x38, "sec"},
|
|
||||||
{0, OP_impl, 0x40, "rti"},
|
|
||||||
{0, OP_impl, 0x48, "pha"},
|
|
||||||
{0, OP_impl, 0x58, "cli"},
|
|
||||||
{0, OP_impl, 0x60, "rts"},
|
|
||||||
{0, OP_impl, 0x68, "pla"},
|
|
||||||
{0, OP_impl, 0x78, "sei"},
|
|
||||||
{0, OP_impl, 0x88, "dey"},
|
|
||||||
{0, OP_impl, 0x8A, "txa"},
|
|
||||||
{0, OP_impl, 0x98, "tya"},
|
|
||||||
{0, OP_impl, 0x9A, "txs"},
|
|
||||||
{0, OP_impl, 0xA8, "tay"},
|
|
||||||
{0, OP_impl, 0xAA, "tax"},
|
|
||||||
{0, OP_impl, 0xB8, "clv"},
|
|
||||||
{0, OP_impl, 0xBA, "tsx"},
|
|
||||||
{0, OP_impl, 0xC8, "iny"},
|
|
||||||
{0, OP_impl, 0xCA, "dex"},
|
|
||||||
{0, OP_impl, 0xD8, "cld"},
|
|
||||||
{0, OP_impl, 0xE8, "inx"},
|
|
||||||
{0, OP_impl, 0xEA, "nop"},
|
|
||||||
{0, OP_impl, 0xF8, "sed"},
|
|
||||||
|
|
||||||
{0, OP_branch, 0x10, "bpl"},
|
|
||||||
{0, OP_branch, 0x30, "bmi"},
|
|
||||||
{0, OP_branch, 0x50, "bvc"},
|
|
||||||
{0, OP_branch, 0x70, "bvs"},
|
|
||||||
{0, OP_branch, 0x90, "bcc"},
|
|
||||||
{0, OP_branch, 0xB0, "bcs"},
|
|
||||||
{0, OP_branch, 0xD0, "bne"},
|
|
||||||
{0, OP_branch, 0xF0, "beq"},
|
|
||||||
|
|
||||||
/* XXX: change OP_arithm with smthg more accurate */
|
|
||||||
{0, OP_arithm, 0x00, "ora"},
|
|
||||||
{0, OP_arithm, 0x20, "and"},
|
|
||||||
{0, OP_arithm, 0x40, "eor"},
|
|
||||||
{0, OP_arithm, 0x60, "adc"},
|
|
||||||
{0, OP_arithm, 0x80, "sta"},
|
|
||||||
{0, OP_arithm, 0xA0, "lda"},
|
|
||||||
{0, OP_arithm, 0xC0, "cmp"},
|
|
||||||
{0, OP_arithm, 0xE0, "sbc"},
|
|
||||||
|
|
||||||
{0, OP_jump, 0x4C, "jmp"},
|
|
||||||
{0, OP_jsr, 0x20, "jsr"},
|
|
||||||
|
|
||||||
{0, OP_rol, 0x00, "asl"},
|
|
||||||
{0, OP_rol, 0x20, "rol"},
|
|
||||||
{0, OP_rol, 0x40, "lsr"},
|
|
||||||
{0, OP_rol, 0x60, "ror"},
|
|
||||||
|
|
||||||
{0, OP_bit, 0x2C, "bit"},
|
|
||||||
|
|
||||||
{0, OP_cpx, 0xC0, "cpy"},
|
|
||||||
{0, OP_cpx, 0xE0, "cpx"},
|
|
||||||
|
|
||||||
{0, OP_inc, 0xCE, "dec"},
|
|
||||||
{0, OP_inc, 0xEE, "inc"},
|
|
||||||
|
|
||||||
{0, OP_stx, 0x8C, "sty"},
|
|
||||||
{0, OP_stx, 0x8E, "stx"},
|
|
||||||
|
|
||||||
{0, OP_ldx, 0xA0, "ldy"},
|
|
||||||
{0, OP_ldx, 0xA2, "ldx"},
|
|
|
@ -1,50 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
operation
|
|
||||||
: OP_impl
|
|
||||||
{ emit1($1);}
|
|
||||||
| OP_branch expr
|
|
||||||
{ branch($1, $2);}
|
|
||||||
| OP_arithm SIZE '#' expr
|
|
||||||
{ encode_imm($1+0x9, $2, $4);}
|
|
||||||
| OP_arithm SIZE expr
|
|
||||||
{ emit1($1+0x0D); encode_addr($3, $2);}
|
|
||||||
| OP_arithm SIZE expr ',' REG_x
|
|
||||||
{ emit1($1+0x1D); encode_addr($3, $2);}
|
|
||||||
| OP_arithm SIZE expr ',' REG_y
|
|
||||||
{ emit1($1+0x19); encode_addr($3, $2);}
|
|
||||||
| OP_arithm SIZE '(' expr ',' REG_x ')'
|
|
||||||
{ emit1($1+0x01); encode_addr($4, $2);}
|
|
||||||
| OP_arithm SIZE '(' expr ')' ',' REG_y
|
|
||||||
{ emit1($1+0x11); encode_addr($4, $2);}
|
|
||||||
| OP_jump expr
|
|
||||||
{ emit1($1); encode_addr($2, 0);}
|
|
||||||
| OP_jump '(' expr ')'
|
|
||||||
{ emit1($1+0x20); encode_addr($3, 0);}
|
|
||||||
| OP_jsr expr
|
|
||||||
{ emit1($1); encode_addr($2, 0);}
|
|
||||||
| OP_rol REG_acc
|
|
||||||
{ emit1($1+0x0A);}
|
|
||||||
| OP_rol SIZE expr
|
|
||||||
{ emit1($1+0x0E);encode_addr($3, $2);}
|
|
||||||
| OP_rol SIZE expr ',' REG_x
|
|
||||||
{ emit1($1+0x1E);encode_addr($3, $2);}
|
|
||||||
| OP_bit SIZE expr
|
|
||||||
{ emit1($1);encode_addr($3, $2);}
|
|
||||||
| OP_cpx SIZE '#' expr
|
|
||||||
{ encode_imm($1, $2, $4);}
|
|
||||||
| OP_cpx SIZE expr
|
|
||||||
{ emit1($1+0x0C);encode_addr($3, $2);}
|
|
||||||
| OP_inc SIZE expr
|
|
||||||
{ emit1($1+0x0E);encode_addr($3, $2);}
|
|
||||||
| OP_inc SIZE expr ',' REG_x
|
|
||||||
{ emit1($1+0x1E);encode_addr($3, $2);}
|
|
||||||
| OP_stx SIZE expr
|
|
||||||
{ emit1($1);encode_addr($3, $2);}
|
|
||||||
| OP_ldx SIZE '#' expr
|
|
||||||
{ encode_imm($1, $2, $4);}
|
|
||||||
| OP_ldx SIZE expr
|
|
||||||
{ emit1($1+0x0C);encode_addr($3, $2);}
|
|
||||||
| OP_ldx SIZE expr ',' REG_x
|
|
||||||
{ emit1($1+0x1C);encode_addr($3, $2);}
|
|
||||||
;
|
|
|
@ -1,69 +0,0 @@
|
||||||
|
|
||||||
void
|
|
||||||
encode_imm(int opc, int sz, expr_t exp)
|
|
||||||
{
|
|
||||||
emit1(opc);
|
|
||||||
emit1(sz);
|
|
||||||
switch(TARGET_SIZE(sz))
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
if (!FIT8(exp.val)) serror("bad operand size");
|
|
||||||
emit1(exp.val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
if (!FIT16(exp.val)) serror("bad operand size");
|
|
||||||
emit2(exp.val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
emit4(exp.val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
encode_addr(expr_t exp, int sz)
|
|
||||||
{
|
|
||||||
uint32_t dist;
|
|
||||||
|
|
||||||
dist = exp.val;
|
|
||||||
|
|
||||||
if (FIT8(dist))
|
|
||||||
{
|
|
||||||
emit1(ADDR_SIZE_B | sz);
|
|
||||||
emit1(dist & 0xFF);
|
|
||||||
}
|
|
||||||
else if (FIT16(dist))
|
|
||||||
{
|
|
||||||
emit1(ADDR_SIZE_W | sz);
|
|
||||||
emit2(dist & 0xFFFF);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
emit1(ADDR_SIZE_L | sz);
|
|
||||||
emit4(dist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void branch(register int opc, expr_t exp)
|
|
||||||
{
|
|
||||||
uint32_t dist;
|
|
||||||
|
|
||||||
dist = exp.val - (DOTVAL + 2);
|
|
||||||
if (pass == PASS_2 && dist > 0 && !(exp.typ & S_DOT))
|
|
||||||
dist -= DOTGAIN;
|
|
||||||
if (small(FIT16(dist) && (exp.typ & ~S_DOT) == DOTTYP, 3)) {
|
|
||||||
emit1(opc); emit2(dist & 0xFFFF);
|
|
||||||
} else {
|
|
||||||
emit1(opc^0x20); emit1(0x03); /* Skip over ... */
|
|
||||||
emit1(0x4C); /* ... far jump. */
|
|
||||||
#ifdef RELOCATION
|
|
||||||
newrelo(exp.typ, RELO2);
|
|
||||||
#endif
|
|
||||||
emit2(exp.val);
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,312 +0,0 @@
|
||||||
#include "arg_type.h"
|
|
||||||
#include "as.h"
|
|
||||||
|
|
||||||
static struct t_operand dummy = { IS_REG, AX, 0, 0, 0};
|
|
||||||
struct t_operand saved_op, *AX_oper = &dummy;
|
|
||||||
|
|
||||||
save_op( op)
|
|
||||||
struct t_operand *op;
|
|
||||||
{
|
|
||||||
saved_op.type = op->type;
|
|
||||||
saved_op.reg = op->reg;
|
|
||||||
saved_op.expr = op->expr;
|
|
||||||
saved_op.lab = op->lab;
|
|
||||||
saved_op.off = op->off;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define last( s) ( s + strlen( s) - 1)
|
|
||||||
#define LEFT '('
|
|
||||||
#define RIGHT ')'
|
|
||||||
#define DOLLAR '$'
|
|
||||||
|
|
||||||
block_assemble( instr, nr, first, Last)
|
|
||||||
char **instr;
|
|
||||||
int nr, first, Last;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ( first) {
|
|
||||||
if( strncmp( instr[0], "pop", 3) == 0) {
|
|
||||||
*instr[0] = 'P';
|
|
||||||
*( instr[0]+1) = 'O';
|
|
||||||
*( instr[0]+2) = 'P';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
@clean_push_buf();
|
|
||||||
}
|
|
||||||
if ( Last && strncmp( instr[nr-1], "push", 4) == 0) {
|
|
||||||
*instr[nr-1] = 'P';
|
|
||||||
*( instr[nr-1]+1) = 'U';
|
|
||||||
*( instr[nr-1]+2) = 'S';
|
|
||||||
*( instr[nr-1]+3) = 'H';
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i=0; i<nr; i++)
|
|
||||||
assemble( instr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
process_label( l)
|
|
||||||
char *l;
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
process_mnemonic( m)
|
|
||||||
char *m;
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
process_operand( str, op)
|
|
||||||
char *str;
|
|
||||||
struct t_operand *op;
|
|
||||||
|
|
||||||
/* expr -> IS_DATA en IS_LABEL
|
|
||||||
* reg -> IS_REG en IS_ACCU
|
|
||||||
* (expr) -> IS_ADDR
|
|
||||||
* expr(reg) -> IS_MEM
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
char *ptr, *strchr();
|
|
||||||
|
|
||||||
op->type = UNKNOWN;
|
|
||||||
if ( *last( str) == RIGHT) {
|
|
||||||
ptr = strchr( str, LEFT);
|
|
||||||
*last( str) = '\0';
|
|
||||||
*ptr = '\0';
|
|
||||||
if ( is_reg( ptr+1, op)) {
|
|
||||||
op->type = IS_MEM;
|
|
||||||
op->expr = ( *str == '\0' ? "0" : str);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
set_label( ptr+1, op);
|
|
||||||
op->type = IS_ADDR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if ( is_reg( str, op))
|
|
||||||
op->type = IS_REG;
|
|
||||||
else {
|
|
||||||
if ( contains_label( str))
|
|
||||||
set_label( str, op);
|
|
||||||
else {
|
|
||||||
op->type = IS_DATA;
|
|
||||||
op->expr = str;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int is_reg( str, op)
|
|
||||||
char *str;
|
|
||||||
struct t_operand *op;
|
|
||||||
{
|
|
||||||
if ( strlen( str) != 2)
|
|
||||||
return( 0);
|
|
||||||
|
|
||||||
switch ( *(str+1)) {
|
|
||||||
case 'x' :
|
|
||||||
case 'l' : switch( *str) {
|
|
||||||
case 'a' : op->reg = 0;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'c' : op->reg = 1;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'd' : op->reg = 2;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'b' : op->reg = 3;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
default : return( FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'h' : switch( *str) {
|
|
||||||
case 'a' : op->reg = 4;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'c' : op->reg = 5;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'd' : op->reg = 6;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'b' : op->reg = 7;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
default : return( FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'p' : switch ( *str) {
|
|
||||||
case 's' : op->reg = 4;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'b' : op->reg = 5;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
default : return( FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'i' : switch ( *str) {
|
|
||||||
case 's' : op->reg = 6;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
case 'd' : op->reg = 7;
|
|
||||||
return( TRUE);
|
|
||||||
|
|
||||||
default : return( FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
default : return( FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#define isletter( c) ( isalpha( c) || c == '_')
|
|
||||||
|
|
||||||
int contains_label( str)
|
|
||||||
char *str;
|
|
||||||
{
|
|
||||||
while( !isletter( *str) && *str != '\0')
|
|
||||||
if ( *str == '$')
|
|
||||||
if ( arg_type( str) == STRING)
|
|
||||||
return( TRUE);
|
|
||||||
else
|
|
||||||
str += 2;
|
|
||||||
else
|
|
||||||
str++;
|
|
||||||
|
|
||||||
return( isletter( *str));
|
|
||||||
}
|
|
||||||
|
|
||||||
set_label( str, op)
|
|
||||||
char *str;
|
|
||||||
struct t_operand *op;
|
|
||||||
{
|
|
||||||
char *ptr, *strchr(), *sprint();
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
ptr = strchr( str, '+');
|
|
||||||
|
|
||||||
if ( ptr == 0)
|
|
||||||
op->off = "0";
|
|
||||||
else {
|
|
||||||
*ptr = '\0';
|
|
||||||
op->off = ptr + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isdigit( *str) && ( *(str+1) == 'b' || *(str+1) == 'f') &&
|
|
||||||
*(str+2) == '\0') {
|
|
||||||
*(str+1) = '\0'; /* b of f verwijderen! */
|
|
||||||
op->lab = str;
|
|
||||||
op->type = IS_ILB;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
op->type = IS_LABEL;
|
|
||||||
if ( strchr( str, DOLLAR) != 0)
|
|
||||||
op->lab = str;
|
|
||||||
else
|
|
||||||
/* nood oplossing */
|
|
||||||
op->lab = sprint( buf, "\"%s\"", str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mod_RM( reg, op)
|
|
||||||
int reg;
|
|
||||||
struct t_operand *op;
|
|
||||||
{
|
|
||||||
if ( REG( op))
|
|
||||||
R233( 0x3, reg, op->reg);
|
|
||||||
else if ( ADDR( op)) {
|
|
||||||
R233( 0x0, reg, 0x6);
|
|
||||||
@reloc2( %$(op->lab), %$(op->off), ABSOLUTE);
|
|
||||||
}
|
|
||||||
else if ( strcmp( op->expr, "0") == 0)
|
|
||||||
switch( op->reg) {
|
|
||||||
case SI : R233( 0x0, reg, 0x4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DI : R233( 0x0, reg, 0x5);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BP : R233( 0x1, reg, 0x6); /* Uitzondering! */
|
|
||||||
@text1( 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BX : R233( 0x0, reg, 0x7);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : fprint( STDERR, "Wrong index register %d\n",
|
|
||||||
op->reg);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
@if ( fit_byte( %$(op->expr)))
|
|
||||||
switch( op->reg) {
|
|
||||||
case SI : R233( 0x1, reg, 0x4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DI : R233( 0x1, reg, 0x5);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BP : R233( 0x1, reg, 0x6);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BX : R233( 0x1, reg, 0x7);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : fprint( STDERR, "Wrong index register %d\n",
|
|
||||||
op->reg);
|
|
||||||
}
|
|
||||||
@text1( %$(op->expr));
|
|
||||||
@else
|
|
||||||
switch( op->reg) {
|
|
||||||
case SI : R233( 0x2, reg, 0x4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DI : R233( 0x2, reg, 0x5);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BP : R233( 0x2, reg, 0x6);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BX : R233( 0x2, reg, 0x7);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : fprint( STDERR, "Wrong index register %d\n",
|
|
||||||
op->reg);
|
|
||||||
}
|
|
||||||
@text2( %$(op->expr));
|
|
||||||
@fi
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mov_REG_EADDR( dst, src)
|
|
||||||
struct t_operand *dst, *src;
|
|
||||||
{
|
|
||||||
if ( REG(src) && dst->reg == src->reg)
|
|
||||||
; /* Nothing!! result of push/pop optimization */
|
|
||||||
else {
|
|
||||||
@text1( 0x8b);
|
|
||||||
mod_RM( dst->reg, src);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
R233( a, b, c)
|
|
||||||
int a,b,c;
|
|
||||||
{
|
|
||||||
@text1( %d( (a << 6) | ( b << 3) | c));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
R53( a, b)
|
|
||||||
int a,b;
|
|
||||||
{
|
|
||||||
@text1( %d( (a << 3) | b));
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
#define UNKNOWN 0
|
|
||||||
#define IS_REG 0x1
|
|
||||||
#define IS_ACCU 0x2
|
|
||||||
#define IS_DATA 0x4
|
|
||||||
#define IS_LABEL 0x8
|
|
||||||
#define IS_MEM 0x10
|
|
||||||
#define IS_ADDR 0x20
|
|
||||||
#define IS_ILB 0x40
|
|
||||||
|
|
||||||
#define AX 0
|
|
||||||
#define BX 3
|
|
||||||
#define CL 1
|
|
||||||
#define SP 4
|
|
||||||
#define BP 5
|
|
||||||
#define SI 6
|
|
||||||
#define DI 7
|
|
||||||
|
|
||||||
#define REG( op) ( op->type & IS_REG)
|
|
||||||
#define ACCU( op) ( op->type & IS_REG && op->reg == AX)
|
|
||||||
#define REG_CL( op) ( op->type & IS_REG && op->reg == CL)
|
|
||||||
#define DATA( op) ( op->type & IS_DATA)
|
|
||||||
#define lABEL( op) ( op->type & IS_LABEL)
|
|
||||||
#define ILB( op) ( op->type & IS_ILB)
|
|
||||||
#define MEM( op) ( op->type & IS_MEM)
|
|
||||||
#define ADDR( op) ( op->type & IS_ADDR)
|
|
||||||
#define EADDR( op) ( op->type & ( IS_ADDR | IS_MEM | IS_REG))
|
|
||||||
#define CONST1( op) ( op->type & IS_DATA && strcmp( "1", op->expr) == 0)
|
|
||||||
#define MOVS( op) ( op->type & IS_LABEL&&strcmp("\"movs\"", op->lab) == 0)
|
|
||||||
#define IMMEDIATE( op) ( op->type & ( IS_DATA | IS_LABEL))
|
|
||||||
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
|
|
||||||
struct t_operand {
|
|
||||||
unsigned type;
|
|
||||||
int reg;
|
|
||||||
char *expr, *lab, *off;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct t_operand saved_op, *AX_oper;
|
|
|
@ -1,232 +0,0 @@
|
||||||
adc dst:REG, src:EADDR ==> @text1( 0x13);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
add dst:REG, src:EADDR ==> @text1( 0x3);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:ACCU, src:DATA ==> @text1( 0x5);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
... dst:EADDR, src:DATA ==> @text1( 0x81);
|
|
||||||
mod_RM( 0, dst);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
... dst:ACCU, src:lABEL ==> @text1( 0x5);
|
|
||||||
@reloc2( %$(src->lab), %$(src->off), !PC_REL).
|
|
||||||
|
|
||||||
... dst:EADDR, src:lABEL ==> @text1( 0x81);
|
|
||||||
mod_RM( 0, dst);
|
|
||||||
@reloc2( %$(src->lab), %$(src->off), !PC_REL).
|
|
||||||
|
|
||||||
and dst:REG, src:EADDR ==> @text1( 0x23);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:ACCU, src:DATA ==> @text1( 0x25);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
call dst:lABEL ==> @text1( 0xe8);
|
|
||||||
@reloc2( %$(dst->lab), %$(dst->off), PC_REL).
|
|
||||||
|
|
||||||
... dst:EADDR ==> @text1( 0xff);
|
|
||||||
mod_RM( 2, dst).
|
|
||||||
|
|
||||||
cmp dst:REG, src:EADDR ==> @text1( 0x3b);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:ACCU, src:DATA ==> @text1( 0x3d);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
... dst:EADDR, src:DATA ==> @text1( 0x81);
|
|
||||||
mod_RM(7,dst);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
cwd ==> @text1( 0x99).
|
|
||||||
|
|
||||||
dec dst:REG ==> R53( 9, dst->reg).
|
|
||||||
|
|
||||||
... dst:EADDR ==> @text1( 0xff);
|
|
||||||
mod_RM( 1, dst).
|
|
||||||
|
|
||||||
div divisor:EADDR ==> @text1( 0xf7);
|
|
||||||
mod_RM( 6, divisor).
|
|
||||||
|
|
||||||
idiv divisor:EADDR ==> @text1( 0xf7);
|
|
||||||
mod_RM( 7, divisor).
|
|
||||||
|
|
||||||
inc dst:REG ==> R53( 8, dst->reg).
|
|
||||||
|
|
||||||
... dst:EADDR ==> @text1( 0xff);
|
|
||||||
mod_RM( 0, dst).
|
|
||||||
|
|
||||||
jb dst:ILB ==> @text1( 0x72);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
je dst:ILB ==> @text1( 0x74);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "jne 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
jg dst:ILB ==> @text1( 0x7f);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "jle 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
jge dst:ILB ==> @text1( 0x7d);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "jl 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
jl dst:ILB ==> @text1( 0x7c);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "jge 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
jle dst:ILB ==> @text1( 0x7e);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "jg 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
jmp dst:ILB ==> @text1( 0xeb);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> @text1( 0xe9);
|
|
||||||
@reloc2( %$(dst->lab), %$(dst->off), PC_REL).
|
|
||||||
|
|
||||||
jne dst:ILB ==> @text1( 0x75);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
... dst:lABEL ==> save_op( dst);
|
|
||||||
assemble( "je 9f");
|
|
||||||
jmp_instr( &saved_op);
|
|
||||||
assemble( "9:").
|
|
||||||
|
|
||||||
lea dst:REG, src:EADDR ==> @text1( 0x8d);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
loop dst:ILB ==> @text1( 0xe2);
|
|
||||||
@text1( %dist( dst->lab)).
|
|
||||||
|
|
||||||
mov dst:REG, src:EADDR ==> mov_REG_EADDR( dst, src).
|
|
||||||
|
|
||||||
... dst:REG, src:DATA ==> R53( 0x17, dst->reg);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
... dst:REG, src:lABEL ==> R53( 0x17, dst->reg);
|
|
||||||
@reloc2( %$(src->lab), %$(src->off), !PC_REL).
|
|
||||||
|
|
||||||
... dst:EADDR, src:REG ==> @text1( 0x89);
|
|
||||||
mod_RM( src->reg, dst).
|
|
||||||
|
|
||||||
... dst:EADDR, src:DATA ==> @text1( 0xc7);
|
|
||||||
mod_RM( 0, dst);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
... dst:EADDR, src:lABEL ==> @text1( 0xc7);
|
|
||||||
mod_RM( 0, dst);
|
|
||||||
@reloc2( %$(src->lab), %$(src->off), !PC_REL).
|
|
||||||
|
|
||||||
movb dst:REG, src:EADDR ==> @text1( 0x8a);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:EADDR, src:REG ==> @text1( 0x88);
|
|
||||||
mod_RM( src->reg, dst).
|
|
||||||
|
|
||||||
mul mplier:EADDR ==> @text1( 0xf7);
|
|
||||||
mod_RM( 4, mplier).
|
|
||||||
|
|
||||||
neg dst:EADDR ==> @text1( 0xf7);
|
|
||||||
mod_RM( 3, dst).
|
|
||||||
|
|
||||||
not dst:EADDR ==> @text1( 0xf7);
|
|
||||||
mod_RM( 2, dst).
|
|
||||||
|
|
||||||
or dst:REG, src:EADDR ==> @text1( 0x0b);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
pop dst:REG ==> R53( 0xb, dst->reg).
|
|
||||||
|
|
||||||
... dst:EADDR ==> @text1( 0x8f);
|
|
||||||
mod_RM( 0, dst).
|
|
||||||
|
|
||||||
POP dst ==> @if ( push_waiting)
|
|
||||||
mov_instr( dst, AX_oper);
|
|
||||||
@assign( push_waiting, FALSE).
|
|
||||||
@else
|
|
||||||
pop_instr( dst).
|
|
||||||
@fi.
|
|
||||||
|
|
||||||
push src:REG ==> R53( 0xa, src->reg).
|
|
||||||
|
|
||||||
... src:EADDR ==> @text1( 0xff);
|
|
||||||
mod_RM( 6, src).
|
|
||||||
|
|
||||||
PUSH src ==> mov_instr( AX_oper, src);
|
|
||||||
@assign( push_waiting, TRUE).
|
|
||||||
|
|
||||||
rcr dst:EADDR, src:CONST1 ==> @text1( 0xd1);
|
|
||||||
mod_RM( 3, dst).
|
|
||||||
|
|
||||||
rep ins:MOVS ==> @text1( 0xf3);
|
|
||||||
@text1( 0xa5). /* Wie zet direction flag? */
|
|
||||||
|
|
||||||
ret ==> @text1( 0xc3). /* Altijd NEAR! */
|
|
||||||
|
|
||||||
rol dst:EADDR, src:REG_CL ==> @text1( 0xd3);
|
|
||||||
mod_RM( 0, dst).
|
|
||||||
|
|
||||||
ror dst:EADDR, src:REG_CL ==> @text1( 0xd3);
|
|
||||||
mod_RM( 1, dst).
|
|
||||||
|
|
||||||
sal dst:EADDR, src:REG_CL ==> @text1( 0xd3);
|
|
||||||
mod_RM( 4, dst).
|
|
||||||
|
|
||||||
sar dst:EADDR, src:REG_CL ==> @text1( 0xd3);
|
|
||||||
mod_RM( 7, dst).
|
|
||||||
|
|
||||||
... dst:EADDR, src:CONST1 ==> @text1( 0xd1);
|
|
||||||
mod_RM( 7, dst).
|
|
||||||
|
|
||||||
sbb dst:REG, src:EADDR ==> @text1( 0x1b);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:ACCU, src:DATA ==> @text1( 0x1d);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
shl dst, src ==> sal_instr( dst, src).
|
|
||||||
|
|
||||||
shr dst:EADDR, src:REG_CL ==> @text1( 0xd3);
|
|
||||||
mod_RM( 5, dst).
|
|
||||||
|
|
||||||
... dst:EADDR, src:CONST1 ==> @text1( 0xd1);
|
|
||||||
mod_RM( 5, dst).
|
|
||||||
|
|
||||||
sub dst:REG, src:EADDR ==> @text1( 0x2b);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
... dst:EADDR, src:DATA ==> @text1( 0x81);
|
|
||||||
mod_RM( 5, dst);
|
|
||||||
@text2( %$(src->expr)).
|
|
||||||
|
|
||||||
test dst:REG, src:EADDR ==> @text1( 0x85);
|
|
||||||
mod_RM( dst->reg, src).
|
|
||||||
|
|
||||||
xchg dst:EADDR, src:REG ==> @text1( 0x87);
|
|
||||||
mod_RM( src->reg, dst).
|
|
||||||
|
|
||||||
xor dst:REG, src:EADDR ==> @text1( 0x33);
|
|
||||||
mod_RM( dst->reg, src).
|
|
|
@ -1,27 +0,0 @@
|
||||||
#define CODE_EXPANDER
|
|
||||||
#include <system.h>
|
|
||||||
#include "back.h"
|
|
||||||
#include "mach.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
arg_error( s, arg)
|
|
||||||
char *s;
|
|
||||||
int arg;
|
|
||||||
{
|
|
||||||
fprint( STDERR, "arg_error %s %d\n", s, arg);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int push_waiting = FALSE;
|
|
||||||
|
|
||||||
int fit_byte( val)
|
|
||||||
int val;
|
|
||||||
{
|
|
||||||
return( val >= -128 && val <= 127);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define IEEEFLOAT
|
|
||||||
#define FL_MSL_AT_LOW_ADDRESS 0
|
|
||||||
#define FL_MSW_AT_LOW_ADDRESS 0
|
|
||||||
#define FL_MSB_AT_LOW_ADDRESS 0
|
|
||||||
#include <con_float>
|
|
|
@ -1,30 +0,0 @@
|
||||||
#define BSS_INIT 0
|
|
||||||
|
|
||||||
#define ONE_BYTE int
|
|
||||||
#define TWO_BYTES int
|
|
||||||
#define FOUR_BYTES long
|
|
||||||
|
|
||||||
|
|
||||||
#define EM_WSIZE 2
|
|
||||||
#define EM_PSIZE 2
|
|
||||||
#define EM_BSIZE 4
|
|
||||||
|
|
||||||
|
|
||||||
#define NAME_FMT "_%s"
|
|
||||||
#define DNAM_FMT "_%s"
|
|
||||||
#define DLB_FMT "I_%ld"
|
|
||||||
#define ILB_FMT "I%03d%ld"
|
|
||||||
#define HOL_FMT "hol%d"
|
|
||||||
|
|
||||||
#define GENLAB 'I'
|
|
||||||
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
|
|
||||||
#define clean_push_buf() if(push_waiting){text1(0x50);push_waiting=FALSE;}
|
|
||||||
#define assign( l, r) l = r
|
|
||||||
extern int push_waiting;
|
|
||||||
|
|
||||||
#ifndef DEBUG
|
|
||||||
#define arg_error(s,i)
|
|
||||||
#endif
|
|
|
@ -1,32 +0,0 @@
|
||||||
# $Id$
|
|
||||||
|
|
||||||
#PARAMS do not remove this line!
|
|
||||||
|
|
||||||
MACH = m65oo2
|
|
||||||
OBJ = obj
|
|
||||||
SRC_DIR = $(SRC_HOME)/mach/$(MACH)/ce
|
|
||||||
|
|
||||||
CEG = $(TARGET_HOME)/lib.bin/ceg/util
|
|
||||||
|
|
||||||
all:
|
|
||||||
make -f $(CEG)/make_asobj "OBJ="$(OBJ) "MACH="$(MACH)
|
|
||||||
|
|
||||||
install:
|
|
||||||
make -f $(CEG)/make_asobj "OBJ="$(OBJ) "MACH="$(MACH) install
|
|
||||||
|
|
||||||
cmp:
|
|
||||||
-make -f $(CEG)/make_asobj "OBJ="$(OBJ) "MACH="$(MACH) cmp
|
|
||||||
|
|
||||||
pr:
|
|
||||||
@pr $(SRC_DIR)/proto.make $(SRC_DIR)/EM_table $(SRC_DIR)/mach.h $(SRC_DIR)/mach.c $(SRC_DIR)/as_table $(SRC_DIR)/as.h $(SRC_DIR)/as.c
|
|
||||||
|
|
||||||
opr:
|
|
||||||
make pr | opr
|
|
||||||
|
|
||||||
# total cleanup
|
|
||||||
clean:
|
|
||||||
make -f $(CEG)/make_asobj "OBJ="$(OBJ) clean
|
|
||||||
|
|
||||||
# only remove ce, ceg, and back directories
|
|
||||||
dclean:
|
|
||||||
make -f $(CEG)/make_asobj "OBJ="$(OBJ) dclean
|
|
|
@ -1,322 +0,0 @@
|
||||||
/*
|
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This program converts ack.out format to PC/IX a.out format.
|
|
||||||
* It uses ~em/modules/lib/libobject.a.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* unsigned char: not portable */
|
|
||||||
|
|
||||||
struct exec {
|
|
||||||
char a_magic[2];
|
|
||||||
char a_flags;
|
|
||||||
char a_cpu;
|
|
||||||
char a_hdrlen;
|
|
||||||
char a_unused;
|
|
||||||
unsigned short a_version;
|
|
||||||
long a_text;
|
|
||||||
long a_data;
|
|
||||||
long a_bss;
|
|
||||||
long a_entry;
|
|
||||||
long a_misc;
|
|
||||||
long a_syms;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nlist
|
|
||||||
{ char n_name[8];
|
|
||||||
long n_value;
|
|
||||||
char n_sclass;
|
|
||||||
char n_numaux;
|
|
||||||
unsigned short n_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include <out.h>
|
|
||||||
|
|
||||||
#ifndef NORCSID
|
|
||||||
static char rcs_id[] = "$Id$" ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ENTRY 0x0 /* entry point */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Header and section table of new format object file.
|
|
||||||
*/
|
|
||||||
struct outhead outhead;
|
|
||||||
struct outsect outsect[S_MAX];
|
|
||||||
|
|
||||||
struct exec exec;
|
|
||||||
|
|
||||||
char *output_file;
|
|
||||||
int outputfile_created;
|
|
||||||
FILE *output;
|
|
||||||
|
|
||||||
char *program ;
|
|
||||||
char *chars;
|
|
||||||
char *malloc();
|
|
||||||
|
|
||||||
char flag ;
|
|
||||||
|
|
||||||
/* Output file definitions and such */
|
|
||||||
|
|
||||||
#define TEXTSG 0
|
|
||||||
#define ROMSG 1
|
|
||||||
#define DATASG 2
|
|
||||||
#define BSSSG 3
|
|
||||||
#define LSECT BSSSG+1
|
|
||||||
#define NSECT LSECT+1
|
|
||||||
|
|
||||||
long align(a,b)
|
|
||||||
long a,b;
|
|
||||||
{
|
|
||||||
a += b - 1;
|
|
||||||
return a - a % b;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
follows(pa, pb)
|
|
||||||
register struct outsect *pa, *pb;
|
|
||||||
{
|
|
||||||
/* return 1 if pa follows pb */
|
|
||||||
|
|
||||||
return pa->os_base == align(pb->os_base+pb->os_size, pa->os_lign);
|
|
||||||
}
|
|
||||||
|
|
||||||
main(argc, argv)
|
|
||||||
int argc;
|
|
||||||
char *argv[];
|
|
||||||
{
|
|
||||||
register struct exec *e = &exec;
|
|
||||||
|
|
||||||
output = stdout;
|
|
||||||
program= argv[0] ;
|
|
||||||
if ( argc>1 && argv[1][0]=='-' ) {
|
|
||||||
flag=argv[1][1] ;
|
|
||||||
argc-- ; argv++ ;
|
|
||||||
}
|
|
||||||
switch (argc) {
|
|
||||||
case 1: rd_fdopen(0);
|
|
||||||
break;
|
|
||||||
case 3: if ((output = fopen(argv[2], "wb")) == 0) {
|
|
||||||
fatal("Can't write %s.\n", argv[2]);
|
|
||||||
}
|
|
||||||
output_file = argv[2];
|
|
||||||
outputfile_created = 1;
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case 2:
|
|
||||||
if (! rd_open(argv[1]))
|
|
||||||
fatal("Can't read %s.\n", argv[1]);
|
|
||||||
break;
|
|
||||||
default:fatal("Usage: %s <as object> <dl object>.\n", argv[0]);
|
|
||||||
}
|
|
||||||
rd_ohead(&outhead);
|
|
||||||
if (BADMAGIC(outhead))
|
|
||||||
fatal("Not an ack object file.\n");
|
|
||||||
if (outhead.oh_flags & HF_LINK)
|
|
||||||
fatal("Contains unresolved references.\n");
|
|
||||||
if (outhead.oh_nrelo > 0)
|
|
||||||
fprintf(stderr, "Warning: relocation information present.\n");
|
|
||||||
if ( outhead.oh_nsect!=LSECT && outhead.oh_nsect!=NSECT )
|
|
||||||
fatal("Input file must have %d sections, not %ld\n",
|
|
||||||
NSECT,outhead.oh_nsect) ;
|
|
||||||
rd_sect(outsect, outhead.oh_nsect);
|
|
||||||
/* A few checks */
|
|
||||||
if ( outsect[TEXTSG].os_base != ENTRY)
|
|
||||||
fatal("text must start at %d not at 0x%lx\n", ENTRY,
|
|
||||||
outsect[TEXTSG].os_base) ;
|
|
||||||
if ( outsect[BSSSG].os_flen != 0 )
|
|
||||||
fatal("bss space contains initialized data\n") ;
|
|
||||||
if (! follows(&outsect[BSSSG], &outsect[DATASG]))
|
|
||||||
fatal("bss segment must follow data segment\n") ;
|
|
||||||
if (! follows(&outsect[DATASG], &outsect[ROMSG]))
|
|
||||||
fatal("data segment must follow rom\n") ;
|
|
||||||
|
|
||||||
outsect[ROMSG].os_size = outsect[DATASG].os_base - outsect[ROMSG].os_base;
|
|
||||||
outsect[DATASG].os_size = outsect[BSSSG].os_base - outsect[DATASG].os_base;
|
|
||||||
e->a_magic[0] = 01;
|
|
||||||
e->a_magic[1] = 03;
|
|
||||||
e->a_cpu = 04;
|
|
||||||
e->a_hdrlen = 32;
|
|
||||||
e->a_data = outsect[BSSSG].os_base - outsect[ROMSG].os_base;
|
|
||||||
e->a_bss = outsect[BSSSG].os_size;
|
|
||||||
e->a_entry = outsect[TEXTSG].os_base;
|
|
||||||
e->a_syms = (long) outhead.oh_nname * sizeof (struct nlist);
|
|
||||||
e->a_misc = 0x10000;
|
|
||||||
if ( outsect[ROMSG].os_base == 0x0 ) {
|
|
||||||
/* Separate I/D */
|
|
||||||
e->a_flags = 0x20;
|
|
||||||
outsect[TEXTSG].os_size = e->a_text =
|
|
||||||
align(outsect[TEXTSG].os_size,16L);
|
|
||||||
} else {
|
|
||||||
e->a_flags = 0x10;
|
|
||||||
outsect[TEXTSG].os_size = e->a_text =
|
|
||||||
outsect[ROMSG].os_base - outsect[TEXTSG].os_base;
|
|
||||||
if (! follows(&outsect[ROMSG], &outsect[TEXTSG]))
|
|
||||||
fatal("rom segment must follow text\n") ;
|
|
||||||
}
|
|
||||||
if ( outhead.oh_nsect==NSECT ) {
|
|
||||||
if (! follows(&outsect[LSECT], &outsect[BSSSG]))
|
|
||||||
fatal("end segment must follow bss\n") ;
|
|
||||||
if ( outsect[LSECT].os_size != 0 )
|
|
||||||
fatal("end segment must be empty\n") ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((unsigned) outhead.oh_nchar != outhead.oh_nchar) ||
|
|
||||||
(outhead.oh_nchar != 0 &&
|
|
||||||
(chars = malloc((unsigned)outhead.oh_nchar)) == 0)) {
|
|
||||||
fprintf(stderr, "%s: (warning) No name list generated\n", program);
|
|
||||||
e->a_syms = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Action at last */
|
|
||||||
fwrite((char *) e, 1, 6, output);
|
|
||||||
wr_int2((int) e->a_version);
|
|
||||||
wr_long(e->a_text);
|
|
||||||
wr_long(e->a_data);
|
|
||||||
wr_long(e->a_bss);
|
|
||||||
wr_long(e->a_entry);
|
|
||||||
wr_long(e->a_misc);
|
|
||||||
wr_long(e->a_syms);
|
|
||||||
emits(&outsect[TEXTSG]) ;
|
|
||||||
emits(&outsect[ROMSG]) ;
|
|
||||||
emits(&outsect[DATASG]) ;
|
|
||||||
if (e->a_syms) emit_symtab();
|
|
||||||
fclose(output);
|
|
||||||
if ( outputfile_created ) chmod(argv[2],0755);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
wr_int2(n)
|
|
||||||
int n;
|
|
||||||
{
|
|
||||||
char buf[2];
|
|
||||||
|
|
||||||
buf[0] = n;
|
|
||||||
buf[1] = (n >> 8);
|
|
||||||
fwrite(buf, 1, 2, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
wr_long(l)
|
|
||||||
long l;
|
|
||||||
{
|
|
||||||
char buf[4];
|
|
||||||
|
|
||||||
buf[0] = l;
|
|
||||||
buf[1] = (l >> 8);
|
|
||||||
buf[2] = (l >> 16);
|
|
||||||
buf[3] = (l >> 24);
|
|
||||||
fwrite(buf, 1, 4, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Transfer the emitted byted from one file to another.
|
|
||||||
*/
|
|
||||||
emits(section) struct outsect *section ; {
|
|
||||||
register long n ;
|
|
||||||
register int blk;
|
|
||||||
char buffer[BUFSIZ];
|
|
||||||
|
|
||||||
n= section->os_flen ;
|
|
||||||
rd_outsect(section - outsect);
|
|
||||||
while (n > 0) {
|
|
||||||
blk = n > BUFSIZ ? BUFSIZ : n;
|
|
||||||
rd_emit(buffer, (long) blk);
|
|
||||||
fwrite(buffer, 1, blk, output);
|
|
||||||
n -= blk;
|
|
||||||
}
|
|
||||||
if ((n = section->os_size - section->os_flen) > 0) {
|
|
||||||
for (blk = BUFSIZ - 1; blk >= 0; blk--) {
|
|
||||||
buffer[blk] = 0;
|
|
||||||
}
|
|
||||||
while (n > 0) {
|
|
||||||
blk = n > BUFSIZ ? BUFSIZ : n;
|
|
||||||
fwrite(buffer, 1, blk, output);
|
|
||||||
n -= blk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
emit_symtab()
|
|
||||||
{
|
|
||||||
struct outname ACK_name; /* symbol table entry in ACK format */
|
|
||||||
struct nlist IX_name; /* symbol table entry in PC/IX format */
|
|
||||||
register unsigned short i;
|
|
||||||
|
|
||||||
long l;
|
|
||||||
long off = OFF_CHAR(outhead);
|
|
||||||
int j;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
rd_string(chars,outhead.oh_nchar);
|
|
||||||
for (i = 0; i < outhead.oh_nname; i++) {
|
|
||||||
rd_name(&ACK_name, 1);
|
|
||||||
switch(ACK_name.on_type & S_TYP) {
|
|
||||||
case S_UND:
|
|
||||||
IX_name.n_sclass = 0;
|
|
||||||
break;
|
|
||||||
case S_ABS:
|
|
||||||
IX_name.n_sclass = 01;
|
|
||||||
break;
|
|
||||||
case S_MIN + TEXTSG:
|
|
||||||
IX_name.n_sclass = 02;
|
|
||||||
break;
|
|
||||||
case S_MIN + ROMSG:
|
|
||||||
case S_MIN + DATASG:
|
|
||||||
IX_name.n_sclass = 03;
|
|
||||||
break;
|
|
||||||
case S_MIN + BSSSG:
|
|
||||||
case S_MIN + LSECT:
|
|
||||||
IX_name.n_sclass = 04;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"warning: unknown s_type: %d\n",
|
|
||||||
ACK_name.on_type & S_TYP);
|
|
||||||
}
|
|
||||||
if (ACK_name.on_type & S_EXT) IX_name.n_sclass |= 020;
|
|
||||||
IX_name.n_value = ACK_name.on_valu;
|
|
||||||
if (ACK_name.on_foff == 0) {
|
|
||||||
p = "\0\0";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
l = ACK_name.on_foff - off;
|
|
||||||
if (l < 0 || l >= outhead.oh_nchar) {
|
|
||||||
fatal("bad on_off: %ld\n",l);
|
|
||||||
}
|
|
||||||
p = &chars[l];
|
|
||||||
}
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
IX_name.n_name[j] = *p++;
|
|
||||||
if (*p == '\0') break;
|
|
||||||
}
|
|
||||||
for (j++; j < 8; j++) {
|
|
||||||
IX_name.n_name[j] = 0;
|
|
||||||
}
|
|
||||||
fwrite((char *) &IX_name, 1, 8, output);
|
|
||||||
wr_long(IX_name.n_value);
|
|
||||||
fwrite(&(IX_name.n_sclass), 1, 2, output);
|
|
||||||
wr_int2((int) IX_name.n_type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* VARARGS1 */
|
|
||||||
fatal(s, a1, a2)
|
|
||||||
char *s;
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s: ",program) ;
|
|
||||||
fprintf(stderr, s, a1, a2);
|
|
||||||
if (outputfile_created) {
|
|
||||||
fclose(output);
|
|
||||||
unlink(output_file);
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
rd_fatal()
|
|
||||||
{
|
|
||||||
fatal("read error\n");
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
# $Id$
|
|
||||||
|
|
||||||
#PARAMS do not remove this line!
|
|
||||||
|
|
||||||
OBJLIB=$(TARGET_HOME)/modules/lib/libobject.$(LIBSUF)
|
|
||||||
|
|
||||||
SRC_DIR = $(SRC_HOME)/mach/m65oo2/cv
|
|
||||||
|
|
||||||
all: cv
|
|
||||||
|
|
||||||
cv: cv.$(SUF)
|
|
||||||
$(CC) $(LDOPTIONS) -o cv cv.$(SUF) $(OBJLIB)
|
|
||||||
|
|
||||||
cv.$(SUF): $(SRC_DIR)/cv.c
|
|
||||||
$(CC) $(COPTIONS) -I$(TARGET_HOME)/h -c $(SRC_DIR)/cv.c
|
|
||||||
|
|
||||||
install: all
|
|
||||||
-mkdir $(TARGET_HOME)/lib.bin/m65oo2
|
|
||||||
cp cv $(TARGET_HOME)/lib.bin/m65oo2/cv
|
|
||||||
|
|
||||||
cmp: all
|
|
||||||
-cmp cv $(TARGET_HOME)/lib.bin/m65oo2/cv
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.$(SUF) Out cv
|
|
||||||
|
|
||||||
lint:
|
|
||||||
$(LINT) $(LINTOPTIONS) -I$(TARGET_HOME)/h $(SRC_DIR)/cv.c $(UTIL_HOME)/modules/lib/$(LINTPREF)object.$(LINTSUF)
|
|
||||||
|
|
||||||
pr:
|
|
||||||
@pr $(SRC_DIR)/proto.make $(SRC_DIR)/cv.c
|
|
||||||
|
|
||||||
opr:
|
|
||||||
make pr | opr
|
|
|
@ -1,60 +0,0 @@
|
||||||
libem_s.a
|
|
||||||
adi.s
|
|
||||||
and.s
|
|
||||||
cii.s
|
|
||||||
cms.s
|
|
||||||
cmi4.s
|
|
||||||
cmu4.s
|
|
||||||
com.s
|
|
||||||
csa2.s
|
|
||||||
csb2.s
|
|
||||||
csa4.s
|
|
||||||
csb4.s
|
|
||||||
cuu.s
|
|
||||||
dup.s
|
|
||||||
dvi.s
|
|
||||||
dvi4.s
|
|
||||||
dvu.s
|
|
||||||
dvu4.s
|
|
||||||
exg.s
|
|
||||||
fp8087.s
|
|
||||||
gto.s
|
|
||||||
iaar.s
|
|
||||||
ilar.s
|
|
||||||
inn.s
|
|
||||||
ior.s
|
|
||||||
isar.s
|
|
||||||
lar2.s
|
|
||||||
loi.s
|
|
||||||
mli.s
|
|
||||||
mli4.s
|
|
||||||
mon.s
|
|
||||||
ngi.s
|
|
||||||
nop.s
|
|
||||||
rck.s
|
|
||||||
rmi.s
|
|
||||||
rmi4.s
|
|
||||||
rmu.s
|
|
||||||
rmu4.s
|
|
||||||
rol.s
|
|
||||||
ror.s
|
|
||||||
sar2.s
|
|
||||||
sbi.s
|
|
||||||
set.s
|
|
||||||
sli.s
|
|
||||||
sri.s
|
|
||||||
sti.s
|
|
||||||
strhp.s
|
|
||||||
xor.s
|
|
||||||
error.s
|
|
||||||
unknown.s
|
|
||||||
fat.s
|
|
||||||
trp.s
|
|
||||||
print.s
|
|
||||||
ret6.s
|
|
||||||
ret8.s
|
|
||||||
lfr6.s
|
|
||||||
lfr8.s
|
|
||||||
retarea.s
|
|
||||||
blm.s
|
|
||||||
return.s
|
|
|
@ -1,28 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .adi
|
|
||||||
|
|
||||||
! #bytes in cx , top of stack in ax
|
|
||||||
.sect .text
|
|
||||||
.adi:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp cx,2
|
|
||||||
jne 1f
|
|
||||||
pop cx
|
|
||||||
add ax,cx
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp cx,4
|
|
||||||
jne 9f
|
|
||||||
pop dx
|
|
||||||
pop cx
|
|
||||||
add ax,cx
|
|
||||||
pop cx
|
|
||||||
adc dx,cx
|
|
||||||
push dx
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,20 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .and
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
! save di; it might be a register variable
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.and:
|
|
||||||
pop bx ! return address
|
|
||||||
mov dx,di
|
|
||||||
mov di,sp
|
|
||||||
add di,cx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
pop ax
|
|
||||||
and ax,(di)
|
|
||||||
stos
|
|
||||||
loop 1b
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
|
@ -1,15 +0,0 @@
|
||||||
.sect .text
|
|
||||||
.define .blm
|
|
||||||
|
|
||||||
! cx: count in words
|
|
||||||
.blm:
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,si
|
|
||||||
mov dx,di
|
|
||||||
mov di,2(bx)
|
|
||||||
mov si,4(bx)
|
|
||||||
rep movs
|
|
||||||
mov si,ax
|
|
||||||
mov di,dx
|
|
||||||
ret 4
|
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
for _, plat in ipairs(vars.plats) do
|
|
||||||
acklibrary {
|
|
||||||
name = "lib_"..plat,
|
|
||||||
srcs = {
|
|
||||||
"./adi.s",
|
|
||||||
"./and.s",
|
|
||||||
"./blm.s",
|
|
||||||
"./cii.s",
|
|
||||||
"./cmi4.s",
|
|
||||||
"./cms.s",
|
|
||||||
"./cmu4.s",
|
|
||||||
"./com.s",
|
|
||||||
"./csa2.s",
|
|
||||||
"./csa4.s",
|
|
||||||
"./csb2.s",
|
|
||||||
"./csb4.s",
|
|
||||||
"./cuu.s",
|
|
||||||
"./dup.s",
|
|
||||||
"./dvi4.s",
|
|
||||||
"./dvi.s",
|
|
||||||
"./dvu4.s",
|
|
||||||
"./dvu.s",
|
|
||||||
"./error.s",
|
|
||||||
"./exg.s",
|
|
||||||
"./fat.s",
|
|
||||||
"./fp8087.s",
|
|
||||||
"./gto.s",
|
|
||||||
"./iaar.s",
|
|
||||||
"./ilar.s",
|
|
||||||
"./inn.s",
|
|
||||||
"./ior.s",
|
|
||||||
"./isar.s",
|
|
||||||
"./lar2.s",
|
|
||||||
"./lfr6.s",
|
|
||||||
"./lfr8.s",
|
|
||||||
"./loi.s",
|
|
||||||
"./mli4.s",
|
|
||||||
"./mli.s",
|
|
||||||
"./mon.s",
|
|
||||||
"./ngi.s",
|
|
||||||
"./nop.s",
|
|
||||||
"./print.s",
|
|
||||||
"./rck.s",
|
|
||||||
"./ret6.s",
|
|
||||||
"./ret8.s",
|
|
||||||
"./retarea.s",
|
|
||||||
"./return.s",
|
|
||||||
"./rmi4.s",
|
|
||||||
"./rmi.s",
|
|
||||||
"./rmu4.s",
|
|
||||||
"./rmu.s",
|
|
||||||
"./rol.s",
|
|
||||||
"./ror.s",
|
|
||||||
"./sar2.s",
|
|
||||||
"./sbi.s",
|
|
||||||
"./set.s",
|
|
||||||
"./sli.s",
|
|
||||||
"./sri.s",
|
|
||||||
"./sti.s",
|
|
||||||
"./strhp.s",
|
|
||||||
"./trp.s",
|
|
||||||
"./unknown.s",
|
|
||||||
"./xor.s",
|
|
||||||
},
|
|
||||||
vars = { plat = plat },
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .cii
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.cii:
|
|
||||||
pop bx ! return address
|
|
||||||
! pop cx, dest. size
|
|
||||||
! pop dx, src. size
|
|
||||||
! ax is first word of source
|
|
||||||
cmp dx,1
|
|
||||||
jne 2f
|
|
||||||
cbw
|
|
||||||
mov dx,2
|
|
||||||
2:
|
|
||||||
cmp dx,cx
|
|
||||||
je 8f
|
|
||||||
cmp dx,2
|
|
||||||
je 1f
|
|
||||||
cmp dx,4
|
|
||||||
jne 9f
|
|
||||||
cmp cx,2
|
|
||||||
jne 9f
|
|
||||||
pop dx
|
|
||||||
8:
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp cx,4
|
|
||||||
jne 9f
|
|
||||||
cwd
|
|
||||||
push dx
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
push ax ! push low source
|
|
||||||
.extern EILLINS
|
|
||||||
.extern .fat
|
|
||||||
mov ax,EILLINS
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
|
@ -1,28 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .cmi4
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.cmi4:
|
|
||||||
pop bx ! return address
|
|
||||||
pop cx
|
|
||||||
pop dx
|
|
||||||
pop ax
|
|
||||||
push si
|
|
||||||
mov si,sp
|
|
||||||
xchg bx,2(si)
|
|
||||||
pop si
|
|
||||||
cmp bx,dx
|
|
||||||
jg 1f
|
|
||||||
jl 2f
|
|
||||||
cmp ax,cx
|
|
||||||
ja 1f
|
|
||||||
je 3f
|
|
||||||
2:
|
|
||||||
mov ax,-1
|
|
||||||
ret
|
|
||||||
3:
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
mov ax,1
|
|
||||||
ret
|
|
|
@ -1,23 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .cms
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.sect .text
|
|
||||||
.cms:
|
|
||||||
pop bx ! return address
|
|
||||||
mov dx,sp
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
mov si,dx
|
|
||||||
add dx,cx
|
|
||||||
mov di,dx
|
|
||||||
add dx,cx
|
|
||||||
sar cx,1
|
|
||||||
repe cmps
|
|
||||||
je 1f
|
|
||||||
inc cx
|
|
||||||
1:
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
mov sp,dx
|
|
||||||
jmp bx
|
|
|
@ -1,28 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .cmu4
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.cmu4:
|
|
||||||
pop bx ! return address
|
|
||||||
pop cx
|
|
||||||
pop dx
|
|
||||||
pop ax
|
|
||||||
push si
|
|
||||||
mov si,sp
|
|
||||||
xchg bx,2(si)
|
|
||||||
pop si
|
|
||||||
cmp bx,dx
|
|
||||||
ja 1f
|
|
||||||
jb 2f
|
|
||||||
cmp ax,cx
|
|
||||||
ja 1f
|
|
||||||
je 3f
|
|
||||||
2:
|
|
||||||
mov ax,-1
|
|
||||||
ret
|
|
||||||
3:
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
mov ax,1
|
|
||||||
ret
|
|
|
@ -1,15 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .com
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.sect .text
|
|
||||||
.com:
|
|
||||||
mov bx,sp
|
|
||||||
add bx,2
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
not (bx)
|
|
||||||
inc bx
|
|
||||||
inc bx
|
|
||||||
loop 1b
|
|
||||||
ret
|
|
|
@ -1,27 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .csa2
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.csa2:
|
|
||||||
! bx, descriptor address
|
|
||||||
! ax, index
|
|
||||||
mov dx,(bx) ! default
|
|
||||||
sub ax,2(bx)
|
|
||||||
cmp ax,4(bx)
|
|
||||||
ja 1f
|
|
||||||
sal ax,1
|
|
||||||
add bx,ax
|
|
||||||
mov bx,6(bx)
|
|
||||||
test bx,bx
|
|
||||||
jnz 2f
|
|
||||||
1:
|
|
||||||
mov bx,dx
|
|
||||||
test bx,bx
|
|
||||||
jnz 2f
|
|
||||||
.extern ECASE
|
|
||||||
.extern .fat
|
|
||||||
mov ax,ECASE
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
||||||
2:
|
|
||||||
jmp bx
|
|
|
@ -1,30 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .csa4
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.csa4:
|
|
||||||
! bx, descriptor address
|
|
||||||
! ax, dx: index
|
|
||||||
mov cx,(bx) ! default
|
|
||||||
sub ax,2(bx)
|
|
||||||
! ignore high order word; if non-zero, the
|
|
||||||
! case descriptor would not fit anyway
|
|
||||||
cmp ax,6(bx)
|
|
||||||
ja 1f
|
|
||||||
2:
|
|
||||||
sal ax,1
|
|
||||||
add bx,ax
|
|
||||||
mov bx,10(bx)
|
|
||||||
test bx,bx
|
|
||||||
jnz 2f
|
|
||||||
1:
|
|
||||||
mov bx,cx
|
|
||||||
test bx,bx
|
|
||||||
jnz 2f
|
|
||||||
.extern ECASE
|
|
||||||
.extern .fat
|
|
||||||
mov ax,ECASE
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
||||||
2:
|
|
||||||
jmp bx
|
|
|
@ -1,29 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .csb2
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.csb2:
|
|
||||||
!bx, descriptor address
|
|
||||||
!ax, index
|
|
||||||
mov dx,(bx)
|
|
||||||
mov cx,2(bx)
|
|
||||||
1:
|
|
||||||
add bx,4
|
|
||||||
dec cx
|
|
||||||
jl 4f
|
|
||||||
cmp ax,(bx)
|
|
||||||
jne 1b
|
|
||||||
mov bx,2(bx)
|
|
||||||
2:
|
|
||||||
test bx,bx
|
|
||||||
jnz 3f
|
|
||||||
.extern ECASE
|
|
||||||
.extern .fat
|
|
||||||
mov ax,ECASE
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
||||||
3:
|
|
||||||
jmp bx
|
|
||||||
4:
|
|
||||||
mov bx,dx
|
|
||||||
jmp 2b
|
|
|
@ -1,33 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .csb4
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.csb4:
|
|
||||||
!bx: descriptor address
|
|
||||||
!ax, dx: index
|
|
||||||
push (bx) ! default
|
|
||||||
mov cx,2(bx) ! count (ignore high order word, the descriptor
|
|
||||||
! would not fit anyway)
|
|
||||||
1:
|
|
||||||
add bx,6
|
|
||||||
dec cx
|
|
||||||
jl 4f
|
|
||||||
cmp ax,(bx)
|
|
||||||
jne 1b
|
|
||||||
cmp dx,2(bx)
|
|
||||||
jne 1b
|
|
||||||
pop cx
|
|
||||||
mov bx,4(bx)
|
|
||||||
2:
|
|
||||||
test bx,bx
|
|
||||||
jnz 3f
|
|
||||||
.extern ECASE
|
|
||||||
.extern .fat
|
|
||||||
mov ax,ECASE
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
||||||
3:
|
|
||||||
jmp bx
|
|
||||||
4:
|
|
||||||
pop bx
|
|
||||||
jmp 2b
|
|
|
@ -1,37 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .ciu
|
|
||||||
.define .cui
|
|
||||||
.define .cuu
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.ciu:
|
|
||||||
.cui:
|
|
||||||
.cuu:
|
|
||||||
pop bx ! return address
|
|
||||||
! pop cx, dest. size
|
|
||||||
! pop dx, source size
|
|
||||||
! ax is low word of source
|
|
||||||
cmp dx,cx
|
|
||||||
je 8f
|
|
||||||
cmp dx,2
|
|
||||||
je 1f
|
|
||||||
cmp dx,4
|
|
||||||
jne 9f
|
|
||||||
cmp cx,2
|
|
||||||
jne 9f
|
|
||||||
pop dx
|
|
||||||
8:
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp cx,4
|
|
||||||
jne 9f
|
|
||||||
xor dx,dx
|
|
||||||
push dx
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
push ax ! to help debugging ?
|
|
||||||
.extern EILLINS
|
|
||||||
.extern .fat
|
|
||||||
mov ax,EILLINS
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
|
@ -1,17 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .dup
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.sect .text
|
|
||||||
.dup:
|
|
||||||
pop bx ! return address
|
|
||||||
mov ax,si
|
|
||||||
mov dx,di
|
|
||||||
mov si,sp
|
|
||||||
sub sp,cx
|
|
||||||
mov di,sp
|
|
||||||
sar cx,1
|
|
||||||
rep movs
|
|
||||||
mov si,ax
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
|
@ -1,39 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .dvi
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.sect .text
|
|
||||||
.dvi:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
cwd
|
|
||||||
pop cx
|
|
||||||
idiv cx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop ax
|
|
||||||
pop dx
|
|
||||||
pop si
|
|
||||||
pop di
|
|
||||||
push bx
|
|
||||||
push di
|
|
||||||
push si
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
.extern .dvi4
|
|
||||||
call .dvi4
|
|
||||||
pop bx
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,91 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .dvi4
|
|
||||||
|
|
||||||
yl=6
|
|
||||||
yh=8
|
|
||||||
xl=10
|
|
||||||
xh=12
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.dvi4:
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
mov si,sp ! copy of sp
|
|
||||||
mov bx,yl(si)
|
|
||||||
mov ax,yh(si)
|
|
||||||
cwd
|
|
||||||
mov di,dx
|
|
||||||
cmp dx,ax
|
|
||||||
jne 7f
|
|
||||||
and dx,dx
|
|
||||||
jge 1f
|
|
||||||
neg bx
|
|
||||||
je 7f
|
|
||||||
1:
|
|
||||||
xor dx,dx
|
|
||||||
mov cx,xl(si)
|
|
||||||
mov ax,xh(si)
|
|
||||||
and ax,ax
|
|
||||||
jge 2f
|
|
||||||
neg ax
|
|
||||||
neg cx
|
|
||||||
sbb ax,dx
|
|
||||||
not di
|
|
||||||
2:
|
|
||||||
div bx
|
|
||||||
xchg ax,cx
|
|
||||||
div bx ! cx = high abs(result), ax=low abs(result)
|
|
||||||
9:
|
|
||||||
and di,di
|
|
||||||
jge 1f
|
|
||||||
neg cx
|
|
||||||
neg ax
|
|
||||||
sbb cx,0
|
|
||||||
1:
|
|
||||||
! cx is high order result
|
|
||||||
! ax is low order result
|
|
||||||
mov dx,cx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
ret 8 ! result in ax/dx
|
|
||||||
|
|
||||||
7:
|
|
||||||
push dx ! sign of y
|
|
||||||
mov di,ax
|
|
||||||
xor bx,bx
|
|
||||||
and di,di
|
|
||||||
jge 1f
|
|
||||||
neg di
|
|
||||||
neg yl(si)
|
|
||||||
sbb di,bx
|
|
||||||
1:
|
|
||||||
mov ax,xl(si)
|
|
||||||
mov dx,xh(si)
|
|
||||||
and dx,dx
|
|
||||||
jge 1f
|
|
||||||
neg dx
|
|
||||||
neg ax
|
|
||||||
sbb dx,bx
|
|
||||||
not -2(si)
|
|
||||||
1:
|
|
||||||
mov cx,16
|
|
||||||
1:
|
|
||||||
shl ax,1
|
|
||||||
rcl dx,1
|
|
||||||
rcl bx,1
|
|
||||||
cmp di,bx
|
|
||||||
ja 3f
|
|
||||||
jb 2f
|
|
||||||
cmp yl(si),dx
|
|
||||||
jbe 2f
|
|
||||||
3:
|
|
||||||
loop 1b
|
|
||||||
jmp 1f
|
|
||||||
2:
|
|
||||||
sub dx,yl(si)
|
|
||||||
sbb bx,di
|
|
||||||
inc ax
|
|
||||||
loop 1b
|
|
||||||
1:
|
|
||||||
pop di ! di=sign of result,ax= result
|
|
||||||
jmp 9b
|
|
|
@ -1,39 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .dvu
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.sect .text
|
|
||||||
.dvu:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
xor dx,dx
|
|
||||||
pop cx
|
|
||||||
div cx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop ax
|
|
||||||
pop dx
|
|
||||||
pop si
|
|
||||||
pop di
|
|
||||||
push bx
|
|
||||||
push di
|
|
||||||
push si
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
.extern .dvu4
|
|
||||||
call .dvu4
|
|
||||||
pop bx
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,55 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .dvu4
|
|
||||||
|
|
||||||
yl=6
|
|
||||||
yh=8
|
|
||||||
xl=10
|
|
||||||
xh=12
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.dvu4:
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
mov si,sp ! copy of sp
|
|
||||||
mov bx,yl(si)
|
|
||||||
mov ax,yh(si)
|
|
||||||
or ax,ax
|
|
||||||
jne 7f
|
|
||||||
xor dx,dx
|
|
||||||
mov cx,xl(si)
|
|
||||||
mov ax,xh(si)
|
|
||||||
div bx
|
|
||||||
xchg ax,cx
|
|
||||||
div bx
|
|
||||||
9:
|
|
||||||
! cx is high order result
|
|
||||||
! ax is low order result
|
|
||||||
mov dx,cx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
ret 8 ! result in ax/dx
|
|
||||||
|
|
||||||
7:
|
|
||||||
mov di,ax
|
|
||||||
xor bx,bx
|
|
||||||
mov ax,xl(si)
|
|
||||||
mov dx,xh(si)
|
|
||||||
mov cx,16
|
|
||||||
1:
|
|
||||||
shl ax,1
|
|
||||||
rcl dx,1
|
|
||||||
rcl bx,1
|
|
||||||
cmp di,bx
|
|
||||||
ja 3f
|
|
||||||
jb 2f
|
|
||||||
cmp yl(si),dx
|
|
||||||
jbe 2f
|
|
||||||
3:
|
|
||||||
loop 1b
|
|
||||||
jmp 9b
|
|
||||||
2:
|
|
||||||
sub dx,yl(si)
|
|
||||||
sbb bx,di
|
|
||||||
inc ax
|
|
||||||
loop 1b
|
|
||||||
jmp 9b
|
|
|
@ -1,42 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .error
|
|
||||||
.define .Xtrp
|
|
||||||
|
|
||||||
! ax is trap number
|
|
||||||
! all registers must be saved
|
|
||||||
! because return is possible
|
|
||||||
! May only be called with error no's <16
|
|
||||||
.sect .text
|
|
||||||
.error:
|
|
||||||
push bp
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
push dx
|
|
||||||
push cx
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
mov cx,ax
|
|
||||||
mov bx,1
|
|
||||||
sal bx,cl
|
|
||||||
.extern .ignmask
|
|
||||||
.extern .trp
|
|
||||||
test bx,(.ignmask)
|
|
||||||
jne 2f
|
|
||||||
call .trp
|
|
||||||
2:
|
|
||||||
pop ax
|
|
||||||
pop bx
|
|
||||||
pop cx
|
|
||||||
pop dx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
pop bp
|
|
||||||
ret
|
|
||||||
|
|
||||||
.Xtrp:
|
|
||||||
cmp ax,16
|
|
||||||
jge 1f
|
|
||||||
call .error
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
jmp .trp
|
|
|
@ -1,22 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .exg
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.sect .text
|
|
||||||
.exg:
|
|
||||||
push di
|
|
||||||
mov di,sp
|
|
||||||
add di,4
|
|
||||||
mov bx,di
|
|
||||||
add bx,cx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
mov ax,(bx)
|
|
||||||
xchg ax,(di)
|
|
||||||
mov (bx),ax
|
|
||||||
add di,2
|
|
||||||
add bx,2
|
|
||||||
loop 1b
|
|
||||||
2:
|
|
||||||
pop di
|
|
||||||
ret
|
|
|
@ -1,10 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .fat
|
|
||||||
|
|
||||||
.fat:
|
|
||||||
.extern .trp
|
|
||||||
.extern .stop
|
|
||||||
call .trp
|
|
||||||
call .stop
|
|
||||||
! no return
|
|
|
@ -1,615 +0,0 @@
|
||||||
.define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8
|
|
||||||
.define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8
|
|
||||||
.define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8
|
|
||||||
.define .cmf4, .cmf8
|
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
|
|
||||||
! $Id$
|
|
||||||
|
|
||||||
! Implement interface to floating point package for Intel 8087
|
|
||||||
|
|
||||||
.sect .rom
|
|
||||||
one:
|
|
||||||
.data2 1
|
|
||||||
two:
|
|
||||||
.data2 2
|
|
||||||
bigmin:
|
|
||||||
.data2 0, -32768
|
|
||||||
|
|
||||||
.sect .text
|
|
||||||
.adf4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 2(bx)
|
|
||||||
wait
|
|
||||||
fadds 6(bx)
|
|
||||||
wait
|
|
||||||
fstps 6(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
.adf8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 2(bx)
|
|
||||||
wait
|
|
||||||
faddd 10(bx)
|
|
||||||
wait
|
|
||||||
fstpd 10(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.sbf4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 6(bx)
|
|
||||||
wait
|
|
||||||
fsubs 2(bx)
|
|
||||||
wait
|
|
||||||
fstps 6(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.sbf8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 10(bx)
|
|
||||||
wait
|
|
||||||
fsubd 2(bx)
|
|
||||||
wait
|
|
||||||
fstpd 10(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.mlf4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 2(bx)
|
|
||||||
wait
|
|
||||||
fmuls 6(bx)
|
|
||||||
wait
|
|
||||||
fstps 6(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
.mlf8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 2(bx)
|
|
||||||
wait
|
|
||||||
fmuld 10(bx)
|
|
||||||
wait
|
|
||||||
fstpd 10(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.dvf4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 6(bx)
|
|
||||||
wait
|
|
||||||
fdivs 2(bx)
|
|
||||||
wait
|
|
||||||
fstps 6(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.dvf8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 10(bx)
|
|
||||||
wait
|
|
||||||
fdivd 2(bx)
|
|
||||||
wait
|
|
||||||
fstpd 10(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ngf4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 2(bx)
|
|
||||||
wait
|
|
||||||
fchs
|
|
||||||
wait
|
|
||||||
fstps 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ngf8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 2(bx)
|
|
||||||
wait
|
|
||||||
fchs
|
|
||||||
wait
|
|
||||||
fstpd 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fif4:
|
|
||||||
mov bx,sp
|
|
||||||
push bx ! make room for FP status word
|
|
||||||
wait
|
|
||||||
flds 4(bx)
|
|
||||||
wait
|
|
||||||
fmuls 8(bx) ! multiply
|
|
||||||
wait
|
|
||||||
fld st ! copy result
|
|
||||||
wait
|
|
||||||
ftst ! test sign; handle negative separately
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf ! result of test in condition codes
|
|
||||||
jb 1f
|
|
||||||
frndint ! this one rounds (?)
|
|
||||||
wait
|
|
||||||
fcom st(1) ! compare with original; if <=, then OK
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
jbe 2f
|
|
||||||
fisubs (one) ! else subtract 1
|
|
||||||
wait
|
|
||||||
jmp 2f
|
|
||||||
1: ! here, negative case
|
|
||||||
frndint ! this one rounds (?)
|
|
||||||
wait
|
|
||||||
fcom st(1) ! compare with original; if >=, then OK
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
jae 2f
|
|
||||||
fiadds (one) ! else add 1
|
|
||||||
wait
|
|
||||||
2:
|
|
||||||
fsub st(1),st ! subtract integer part
|
|
||||||
wait
|
|
||||||
mov bx,2(bx)
|
|
||||||
fstps (bx)
|
|
||||||
wait
|
|
||||||
fstps 4(bx)
|
|
||||||
wait
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fif8:
|
|
||||||
mov bx,sp
|
|
||||||
push bx ! make room for FP status word
|
|
||||||
wait
|
|
||||||
fldd 4(bx)
|
|
||||||
wait
|
|
||||||
fmuld 12(bx) ! multiply
|
|
||||||
wait
|
|
||||||
fld st ! and copy result
|
|
||||||
wait
|
|
||||||
ftst ! test sign; handle negative separately
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf ! result of test in condition codes
|
|
||||||
jb 1f
|
|
||||||
frndint ! this one rounds (?)
|
|
||||||
wait
|
|
||||||
fcom st(1) ! compare with original; if <=, then OK
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
jbe 2f
|
|
||||||
fisubs (one) ! else subtract 1
|
|
||||||
wait
|
|
||||||
jmp 2f
|
|
||||||
1: ! here, negative case
|
|
||||||
frndint ! this one rounds (?)
|
|
||||||
wait
|
|
||||||
fcom st(1) ! compare with original; if >=, then OK
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
jae 2f
|
|
||||||
fiadds (one) ! else add 1
|
|
||||||
wait
|
|
||||||
2:
|
|
||||||
fsub st(1),st ! subtract integer part
|
|
||||||
mov bx,2(bx)
|
|
||||||
fstpd (bx)
|
|
||||||
wait
|
|
||||||
fstpd 8(bx)
|
|
||||||
wait
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fef4:
|
|
||||||
! this could be simpler, if only the
|
|
||||||
! fxtract instruction was emulated properly
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,6(bx)
|
|
||||||
and ax,077600
|
|
||||||
je 1f ! zero exponent
|
|
||||||
mov cx,7
|
|
||||||
shr ax,cl
|
|
||||||
sub ax,126
|
|
||||||
mov cx,ax ! exponent in cx
|
|
||||||
mov ax,6(bx)
|
|
||||||
and ax,0100177
|
|
||||||
or ax,0037400 ! load -1 exponent
|
|
||||||
mov dx,4(bx)
|
|
||||||
mov bx,2(bx)
|
|
||||||
mov 4(bx),ax
|
|
||||||
mov 2(bx),dx
|
|
||||||
mov (bx),cx
|
|
||||||
ret
|
|
||||||
1: ! we get here on zero exp
|
|
||||||
mov ax,6(bx)
|
|
||||||
and ax,0177
|
|
||||||
or ax,4(bx)
|
|
||||||
jne 1f ! zero result
|
|
||||||
xor ax,ax
|
|
||||||
mov bx,2(bx)
|
|
||||||
mov (bx),ax
|
|
||||||
mov 2(bx),ax
|
|
||||||
mov 4(bx),ax
|
|
||||||
ret
|
|
||||||
1: ! otherwise unnormalized number
|
|
||||||
mov cx,6(bx)
|
|
||||||
and cx,0100177
|
|
||||||
mov dx,cx
|
|
||||||
and cx,0x8000
|
|
||||||
mov ax,-125
|
|
||||||
2:
|
|
||||||
test dx,0x80
|
|
||||||
jne 1f
|
|
||||||
dec ax
|
|
||||||
shl 4(bx),1
|
|
||||||
rcl dx,1
|
|
||||||
or dx,cx
|
|
||||||
jmp 2b
|
|
||||||
1:
|
|
||||||
mov cx,4(bx)
|
|
||||||
mov bx,2(bx)
|
|
||||||
mov (bx),ax
|
|
||||||
mov 2(bx),cx
|
|
||||||
and dx,0100177
|
|
||||||
or dx,0037400 ! load -1 exponent
|
|
||||||
mov 4(bx),dx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fef8:
|
|
||||||
! this could be simpler, if only the
|
|
||||||
! fxtract instruction was emulated properly
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,10(bx)
|
|
||||||
and ax,077760
|
|
||||||
je 1f ! zero exponent
|
|
||||||
mov cx,4
|
|
||||||
shr ax,cl
|
|
||||||
sub ax,1022
|
|
||||||
mov cx,ax ! exponent in cx
|
|
||||||
mov ax,10(bx)
|
|
||||||
and ax,0100017
|
|
||||||
or ax,0037740 ! load -1 exponent
|
|
||||||
push 8(bx)
|
|
||||||
push 6(bx)
|
|
||||||
push 4(bx)
|
|
||||||
mov bx,2(bx)
|
|
||||||
pop 2(bx)
|
|
||||||
pop 4(bx)
|
|
||||||
pop 6(bx)
|
|
||||||
mov 8(bx),ax
|
|
||||||
mov (bx),cx
|
|
||||||
ret
|
|
||||||
1: ! we get here on zero exp
|
|
||||||
mov ax,10(bx)
|
|
||||||
and ax,017
|
|
||||||
or ax,8(bx)
|
|
||||||
or ax,6(bx)
|
|
||||||
or ax,4(bx)
|
|
||||||
jne 1f ! zero result
|
|
||||||
xor ax,ax
|
|
||||||
mov bx,2(bx)
|
|
||||||
mov (bx),ax
|
|
||||||
mov 2(bx),ax
|
|
||||||
mov 4(bx),ax
|
|
||||||
mov 6(bx),ax
|
|
||||||
mov 8(bx),ax
|
|
||||||
ret
|
|
||||||
1: ! otherwise unnormalized number
|
|
||||||
mov cx,10(bx)
|
|
||||||
and cx,0100017
|
|
||||||
mov dx,cx
|
|
||||||
and cx,0x8000
|
|
||||||
mov ax,-1021
|
|
||||||
2:
|
|
||||||
test dx,0x10
|
|
||||||
jne 1f
|
|
||||||
dec ax
|
|
||||||
shl 4(bx),1
|
|
||||||
rcl 6(bx),1
|
|
||||||
rcl 8(bx),1
|
|
||||||
rcl dx,1
|
|
||||||
or dx,cx
|
|
||||||
jmp 2b
|
|
||||||
1:
|
|
||||||
and dx,0100017
|
|
||||||
or dx,0037740 ! load -1 exponent
|
|
||||||
mov cx,8(bx)
|
|
||||||
push 6(bx)
|
|
||||||
push 4(bx)
|
|
||||||
mov bx,2(bx)
|
|
||||||
mov (bx),ax
|
|
||||||
mov 8(bx),dx
|
|
||||||
mov 6(bx),cx
|
|
||||||
pop 2(bx)
|
|
||||||
pop 4(bx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cif4:
|
|
||||||
mov bx,sp
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
wait
|
|
||||||
filds 4(bx)
|
|
||||||
wait
|
|
||||||
fstps 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fildl 4(bx)
|
|
||||||
wait
|
|
||||||
fstps 4(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cif8:
|
|
||||||
mov bx,sp
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
wait
|
|
||||||
filds 4(bx)
|
|
||||||
wait
|
|
||||||
fstpd 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fildl 4(bx)
|
|
||||||
wait
|
|
||||||
fstpd 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cuf4:
|
|
||||||
mov bx,sp
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
mov ax,4(bx)
|
|
||||||
mov 2(bx),ax
|
|
||||||
mov 4(bx),0
|
|
||||||
wait
|
|
||||||
fildl 2(bx)
|
|
||||||
wait
|
|
||||||
fstps 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fildl 4(bx)
|
|
||||||
wait
|
|
||||||
cmp 6(bx),0
|
|
||||||
jge 1f
|
|
||||||
2:
|
|
||||||
wait
|
|
||||||
fisubl (bigmin)
|
|
||||||
wait
|
|
||||||
fisubl (bigmin)
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fstps 4(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cuf8:
|
|
||||||
mov bx,sp
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
mov 6(bx),0
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fildl 4(bx)
|
|
||||||
wait
|
|
||||||
cmp 6(bx),0
|
|
||||||
jge 1f
|
|
||||||
2:
|
|
||||||
wait
|
|
||||||
fisubl (bigmin)
|
|
||||||
wait
|
|
||||||
fisubl (bigmin)
|
|
||||||
1:
|
|
||||||
wait
|
|
||||||
fstpd 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cfi:
|
|
||||||
mov bx,sp
|
|
||||||
push bx
|
|
||||||
wait
|
|
||||||
fstcw -2(bx)
|
|
||||||
wait
|
|
||||||
mov dx,-2(bx)
|
|
||||||
or -2(bx),0xc00 ! truncating mode
|
|
||||||
wait
|
|
||||||
fldcw -2(bx)
|
|
||||||
pop ax
|
|
||||||
cmp 4(bx),4
|
|
||||||
jne 2f
|
|
||||||
! loc 4 loc ? cfi
|
|
||||||
wait
|
|
||||||
flds 6(bx)
|
|
||||||
wait
|
|
||||||
fistpl 6(bx)
|
|
||||||
wait
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
mov ax,6(bx)
|
|
||||||
1:
|
|
||||||
mov 4(bx),dx
|
|
||||||
wait
|
|
||||||
fldcw 4(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
2:
|
|
||||||
! loc 8 loc ? cfi
|
|
||||||
wait
|
|
||||||
fldd 6(bx)
|
|
||||||
wait
|
|
||||||
fistpl 10(bx)
|
|
||||||
wait
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1b
|
|
||||||
mov ax,10(bx)
|
|
||||||
jmp 1b
|
|
||||||
|
|
||||||
.cfu:
|
|
||||||
mov bx,sp
|
|
||||||
push bx
|
|
||||||
wait
|
|
||||||
fstcw -2(bx)
|
|
||||||
wait
|
|
||||||
mov dx,-2(bx)
|
|
||||||
and -2(bx),0xf3ff
|
|
||||||
or -2(bx),0x400 ! to -infinity
|
|
||||||
wait
|
|
||||||
fldcw -2(bx)
|
|
||||||
wait
|
|
||||||
pop ax
|
|
||||||
cmp 4(bx),4
|
|
||||||
jne 2f
|
|
||||||
! loc 4 loc ? cfu
|
|
||||||
flds 6(bx)
|
|
||||||
wait
|
|
||||||
fabs ! ???
|
|
||||||
wait
|
|
||||||
fiaddl (bigmin)
|
|
||||||
fistpl 6(bx)
|
|
||||||
wait
|
|
||||||
mov ax,8(bx)
|
|
||||||
sub ax,(bigmin+2)
|
|
||||||
mov 8(bx),ax
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1f
|
|
||||||
mov ax,6(bx)
|
|
||||||
1:
|
|
||||||
mov 4(bx),dx
|
|
||||||
wait
|
|
||||||
fldcw 4(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
2:
|
|
||||||
wait
|
|
||||||
! loc 8 loc ? cfu
|
|
||||||
fldd 6(bx)
|
|
||||||
wait
|
|
||||||
fabs ! ???
|
|
||||||
wait
|
|
||||||
fiaddl (bigmin)
|
|
||||||
fistpl 10(bx)
|
|
||||||
wait
|
|
||||||
mov ax,12(bx)
|
|
||||||
sub ax,(bigmin+2)
|
|
||||||
mov 12(bx),ax
|
|
||||||
cmp 2(bx),2
|
|
||||||
jne 1b
|
|
||||||
mov ax,10(bx)
|
|
||||||
jmp 1b
|
|
||||||
|
|
||||||
.cff4:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
fldd 2(bx)
|
|
||||||
wait
|
|
||||||
fstcw 2(bx)
|
|
||||||
wait
|
|
||||||
mov dx,2(bx)
|
|
||||||
and 2(bx),0xf3ff ! set to rounding mode
|
|
||||||
wait
|
|
||||||
fldcw 2(bx)
|
|
||||||
wait
|
|
||||||
fstps 6(bx)
|
|
||||||
mov 2(bx),dx
|
|
||||||
wait
|
|
||||||
fldcw 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cff8:
|
|
||||||
mov bx,sp
|
|
||||||
wait
|
|
||||||
flds 2(bx)
|
|
||||||
wait
|
|
||||||
fstpd 2(bx)
|
|
||||||
wait
|
|
||||||
ret
|
|
||||||
|
|
||||||
.cmf4:
|
|
||||||
mov bx,sp
|
|
||||||
push bx ! room for 8087 status word
|
|
||||||
xor cx,cx
|
|
||||||
wait
|
|
||||||
flds 6(bx)
|
|
||||||
wait
|
|
||||||
flds 2(bx)
|
|
||||||
wait
|
|
||||||
fcompp ! compare and pop operands
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
je 1f
|
|
||||||
jb 2f
|
|
||||||
dec cx
|
|
||||||
jmp 1f
|
|
||||||
2:
|
|
||||||
inc cx
|
|
||||||
1:
|
|
||||||
mov ax,cx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
.cmf8:
|
|
||||||
mov bx,sp
|
|
||||||
push bx ! room for 8087 status word
|
|
||||||
xor cx,cx
|
|
||||||
wait
|
|
||||||
fldd 10(bx)
|
|
||||||
wait
|
|
||||||
fldd 2(bx)
|
|
||||||
wait
|
|
||||||
fcompp ! compare and pop operands
|
|
||||||
wait
|
|
||||||
fstsw -2(bx)
|
|
||||||
wait
|
|
||||||
mov ax,-2(bx)
|
|
||||||
sahf
|
|
||||||
je 1f
|
|
||||||
jb 2f
|
|
||||||
dec cx
|
|
||||||
jmp 1f
|
|
||||||
2:
|
|
||||||
inc cx
|
|
||||||
1:
|
|
||||||
mov ax,cx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .gto
|
|
||||||
|
|
||||||
.gto:
|
|
||||||
mov bp,4(bx)
|
|
||||||
mov sp,2(bx)
|
|
||||||
jmp (bx)
|
|
|
@ -1,18 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .iaar
|
|
||||||
|
|
||||||
.iaar:
|
|
||||||
pop cx
|
|
||||||
pop dx
|
|
||||||
cmp dx,2
|
|
||||||
.extern .unknown
|
|
||||||
jne .unknown
|
|
||||||
pop bx ! descriptor address
|
|
||||||
pop ax ! index
|
|
||||||
sub ax,(bx)
|
|
||||||
mul 4(bx)
|
|
||||||
pop bx ! base address
|
|
||||||
add bx,ax
|
|
||||||
push cx
|
|
||||||
ret
|
|
|
@ -1,15 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .ilar
|
|
||||||
|
|
||||||
.ilar:
|
|
||||||
pop cx
|
|
||||||
pop dx
|
|
||||||
.extern .unknown
|
|
||||||
cmp dx,2
|
|
||||||
jne .unknown
|
|
||||||
pop bx ! descriptor address
|
|
||||||
pop ax ! index
|
|
||||||
push cx
|
|
||||||
.extern .lar2
|
|
||||||
jmp .lar2
|
|
|
@ -1,32 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .inn
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
! bit # in ax
|
|
||||||
.inn:
|
|
||||||
xor dx,dx
|
|
||||||
mov bx,8
|
|
||||||
div bx
|
|
||||||
mov bx,sp
|
|
||||||
add bx,2
|
|
||||||
add bx,ax
|
|
||||||
cmp ax,cx
|
|
||||||
jae 1f
|
|
||||||
movb al,(bx)
|
|
||||||
mov bx,dx
|
|
||||||
testb al,bits(bx)
|
|
||||||
jz 1f
|
|
||||||
mov ax,1
|
|
||||||
jmp 2f
|
|
||||||
1:
|
|
||||||
xor ax,ax
|
|
||||||
2:
|
|
||||||
pop bx
|
|
||||||
add sp,cx
|
|
||||||
! ax is result
|
|
||||||
jmp bx
|
|
||||||
|
|
||||||
.sect .data
|
|
||||||
bits:
|
|
||||||
.data1 1,2,4,8,16,32,64,128
|
|
|
@ -1,18 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .ior
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.ior:
|
|
||||||
pop bx ! return address
|
|
||||||
mov dx,di
|
|
||||||
mov di,sp
|
|
||||||
add di,cx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
pop ax
|
|
||||||
or ax,(di)
|
|
||||||
stos
|
|
||||||
loop 1b
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
|
@ -1,15 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .isar
|
|
||||||
|
|
||||||
.isar:
|
|
||||||
pop cx
|
|
||||||
pop ax
|
|
||||||
cmp ax,2
|
|
||||||
.extern .unknown
|
|
||||||
jne .unknown
|
|
||||||
pop bx ! descriptor address
|
|
||||||
pop ax ! index
|
|
||||||
push cx
|
|
||||||
.extern .sar2
|
|
||||||
jmp .sar2
|
|
|
@ -1,35 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .lar2
|
|
||||||
|
|
||||||
.lar2:
|
|
||||||
! bx, descriptor address
|
|
||||||
! ax, index
|
|
||||||
pop cx
|
|
||||||
pop dx ! base address
|
|
||||||
push cx
|
|
||||||
push si
|
|
||||||
mov si,dx
|
|
||||||
sub ax,(bx)
|
|
||||||
mov cx,4(bx)
|
|
||||||
imul cx
|
|
||||||
add si,ax
|
|
||||||
sar cx,1
|
|
||||||
jnb 1f
|
|
||||||
xorb ah,ah
|
|
||||||
lodsb
|
|
||||||
pop si
|
|
||||||
pop bx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
pop dx ! saved si
|
|
||||||
mov ax,4(bx)
|
|
||||||
pop bx ! return address
|
|
||||||
sub sp,ax
|
|
||||||
mov ax,di ! save di
|
|
||||||
mov di,sp
|
|
||||||
rep movs
|
|
||||||
mov di,ax
|
|
||||||
mov si,dx
|
|
||||||
jmp bx
|
|
|
@ -1,10 +0,0 @@
|
||||||
.sect .text
|
|
||||||
.define .lfr6
|
|
||||||
.extern .retarea
|
|
||||||
|
|
||||||
.lfr6:
|
|
||||||
pop bx
|
|
||||||
push (.retarea+4)
|
|
||||||
push (.retarea+2)
|
|
||||||
push (.retarea)
|
|
||||||
jmp bx
|
|
|
@ -1,11 +0,0 @@
|
||||||
.sect .text
|
|
||||||
.define .lfr8
|
|
||||||
.extern .retarea
|
|
||||||
|
|
||||||
.lfr8:
|
|
||||||
pop bx
|
|
||||||
push (.retarea+6)
|
|
||||||
push (.retarea+4)
|
|
||||||
push (.retarea+2)
|
|
||||||
push (.retarea)
|
|
||||||
jmp bx
|
|
|
@ -1,38 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .loi
|
|
||||||
.define .los
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
! address in bx
|
|
||||||
! save si/di. they might be register variables
|
|
||||||
.los:
|
|
||||||
mov dx,si
|
|
||||||
mov si,bx
|
|
||||||
pop bx
|
|
||||||
mov ax,cx
|
|
||||||
sar cx,1
|
|
||||||
jnb 1f
|
|
||||||
xorb ah,ah
|
|
||||||
lodsb
|
|
||||||
mov si,dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
sub sp,ax
|
|
||||||
jmp 1f
|
|
||||||
|
|
||||||
.loi:
|
|
||||||
! only called with size > 4
|
|
||||||
mov dx,si
|
|
||||||
mov si,bx
|
|
||||||
pop bx
|
|
||||||
sub sp,cx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
mov ax,di
|
|
||||||
mov di,sp
|
|
||||||
rep movs
|
|
||||||
mov si,dx
|
|
||||||
mov di,ax
|
|
||||||
jmp bx
|
|
|
@ -1,42 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .mli
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.mli:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
pop cx
|
|
||||||
mul cx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
push bx
|
|
||||||
mov cx,bx
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,2(bx)
|
|
||||||
mov (bx),ax
|
|
||||||
mov ax,4(bx)
|
|
||||||
mov 2(bx),ax
|
|
||||||
mov ax,6(bx)
|
|
||||||
mov 4(bx),ax
|
|
||||||
mov ax,8(bx)
|
|
||||||
mov 6(bx),ax
|
|
||||||
mov 8(bx),cx
|
|
||||||
pop ax
|
|
||||||
pop dx
|
|
||||||
call .mli4
|
|
||||||
pop bx
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,26 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .mli4
|
|
||||||
|
|
||||||
yl=2
|
|
||||||
yh=4
|
|
||||||
! x * y
|
|
||||||
! xl in ax
|
|
||||||
! xh in dx
|
|
||||||
|
|
||||||
.mli4:
|
|
||||||
mov bx,sp
|
|
||||||
push dx
|
|
||||||
mov cx,ax
|
|
||||||
mul yh(bx) ! xl*yh
|
|
||||||
pop dx
|
|
||||||
push ax
|
|
||||||
mov ax,dx
|
|
||||||
mul yl(bx) ! xh * yl
|
|
||||||
pop dx
|
|
||||||
add dx,ax ! xh*yl+xl*yh
|
|
||||||
mov ax,cx
|
|
||||||
mov cx,dx
|
|
||||||
mul yl(bx) ! xl*yl
|
|
||||||
add dx,cx
|
|
||||||
ret 4
|
|
|
@ -1,7 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .mon
|
|
||||||
|
|
||||||
.mon:
|
|
||||||
.extern .stop
|
|
||||||
call .stop
|
|
|
@ -1,30 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .ngi
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.ngi:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop cx
|
|
||||||
neg cx
|
|
||||||
push cx
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop dx
|
|
||||||
pop ax
|
|
||||||
neg ax
|
|
||||||
neg dx
|
|
||||||
sbb ax,0
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,24 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .nop
|
|
||||||
.extern printd, printc, hol0
|
|
||||||
|
|
||||||
SIO_S = 0xDA
|
|
||||||
SIO_D = 0xD8
|
|
||||||
RXRDY = 0x02
|
|
||||||
|
|
||||||
.nop:
|
|
||||||
mov ax,(hol0)
|
|
||||||
call printd
|
|
||||||
! movb al,' '
|
|
||||||
! call printc
|
|
||||||
! mov ax,sp
|
|
||||||
! call printd
|
|
||||||
!1:
|
|
||||||
! inb SIO_S
|
|
||||||
! andb al,RXRDY
|
|
||||||
! jz 1b
|
|
||||||
! inb SIO_D
|
|
||||||
! call printc
|
|
||||||
movb al,'\n'
|
|
||||||
jmp printc
|
|
|
@ -1,47 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define printc,printd,prints
|
|
||||||
|
|
||||||
! argument in ax
|
|
||||||
! uses bx
|
|
||||||
prints:
|
|
||||||
xchg ax,bx
|
|
||||||
1:
|
|
||||||
movb al,(bx)
|
|
||||||
inc bx
|
|
||||||
testb al,al
|
|
||||||
jz 2f
|
|
||||||
call printc
|
|
||||||
jmp 1b
|
|
||||||
2:
|
|
||||||
ret
|
|
||||||
|
|
||||||
! argument in ax
|
|
||||||
! uses cx and dx
|
|
||||||
printd:
|
|
||||||
xor dx,dx
|
|
||||||
mov cx,10
|
|
||||||
div cx
|
|
||||||
test ax,ax
|
|
||||||
jz 1f
|
|
||||||
push dx
|
|
||||||
call printd
|
|
||||||
pop dx
|
|
||||||
1:
|
|
||||||
xchg ax,dx
|
|
||||||
addb al,'0'
|
|
||||||
|
|
||||||
! argument in ax
|
|
||||||
printc:
|
|
||||||
push ax
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,1
|
|
||||||
push ax
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
call __write
|
|
||||||
pop bx
|
|
||||||
pop bx
|
|
||||||
pop bx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
|
@ -1,20 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rck
|
|
||||||
|
|
||||||
! descriptor address in bx
|
|
||||||
! value in ax, must be left there
|
|
||||||
.rck:
|
|
||||||
cmp ax,(bx)
|
|
||||||
jl 2f
|
|
||||||
cmp ax,2(bx)
|
|
||||||
jg 2f
|
|
||||||
ret
|
|
||||||
2:
|
|
||||||
push ax
|
|
||||||
.extern ERANGE
|
|
||||||
.extern .error
|
|
||||||
mov ax,ERANGE
|
|
||||||
call .error
|
|
||||||
pop ax
|
|
||||||
ret
|
|
|
@ -1,10 +0,0 @@
|
||||||
.sect .text
|
|
||||||
.define .ret6
|
|
||||||
.extern .retarea
|
|
||||||
|
|
||||||
.ret6:
|
|
||||||
pop bx
|
|
||||||
pop (.retarea)
|
|
||||||
pop (.retarea+2)
|
|
||||||
pop (.retarea+4)
|
|
||||||
jmp bx
|
|
|
@ -1,11 +0,0 @@
|
||||||
.sect .text
|
|
||||||
.define .ret8
|
|
||||||
.extern .retarea
|
|
||||||
|
|
||||||
.ret8:
|
|
||||||
pop bx
|
|
||||||
pop (.retarea)
|
|
||||||
pop (.retarea+2)
|
|
||||||
pop (.retarea+4)
|
|
||||||
pop (.retarea+6)
|
|
||||||
jmp bx
|
|
|
@ -1,5 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.define .retarea
|
|
||||||
|
|
||||||
.retarea:
|
|
||||||
.space 8
|
|
|
@ -1,17 +0,0 @@
|
||||||
.define .sdret, .dsret, .sret, .dret, .cret
|
|
||||||
.sect .text
|
|
||||||
|
|
||||||
.dsret:
|
|
||||||
pop di
|
|
||||||
.sret:
|
|
||||||
pop si
|
|
||||||
.cret:
|
|
||||||
mov sp,bp
|
|
||||||
pop bp
|
|
||||||
ret
|
|
||||||
|
|
||||||
.sdret:
|
|
||||||
pop si
|
|
||||||
.dret:
|
|
||||||
pop di
|
|
||||||
jmp .cret
|
|
|
@ -1,39 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rmi
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.rmi:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
cwd
|
|
||||||
pop cx
|
|
||||||
idiv cx
|
|
||||||
push dx
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop ax
|
|
||||||
pop dx
|
|
||||||
pop si
|
|
||||||
pop di
|
|
||||||
push bx
|
|
||||||
push di
|
|
||||||
push si
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
.extern .rmi4
|
|
||||||
call .rmi4
|
|
||||||
pop bx
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,90 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rmi4
|
|
||||||
|
|
||||||
yl=6
|
|
||||||
yh=8
|
|
||||||
xl=10
|
|
||||||
xh=12
|
|
||||||
|
|
||||||
.rmi4:
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
mov si,sp ! copy of sp
|
|
||||||
mov bx,yl(si)
|
|
||||||
mov ax,yh(si)
|
|
||||||
cwd
|
|
||||||
cmp dx,ax
|
|
||||||
jne 7f
|
|
||||||
and dx,dx
|
|
||||||
jge 1f
|
|
||||||
neg bx
|
|
||||||
je 7f
|
|
||||||
1:
|
|
||||||
xor dx,dx
|
|
||||||
mov cx,xl(si)
|
|
||||||
mov ax,xh(si)
|
|
||||||
and ax,ax
|
|
||||||
jge 2f
|
|
||||||
neg ax
|
|
||||||
neg cx
|
|
||||||
sbb ax,dx
|
|
||||||
2:
|
|
||||||
div bx
|
|
||||||
xchg ax,cx
|
|
||||||
div bx ! dx= result(low), 0=result(high)
|
|
||||||
xor bx,bx
|
|
||||||
9:
|
|
||||||
cmp xh(si),0
|
|
||||||
jge 1f
|
|
||||||
neg bx
|
|
||||||
neg dx
|
|
||||||
sbb bx,0
|
|
||||||
1:
|
|
||||||
! bx is high order result
|
|
||||||
! dx is low order result
|
|
||||||
mov ax,dx
|
|
||||||
mov dx,bx ! result in ax/dx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
ret 8
|
|
||||||
|
|
||||||
7:
|
|
||||||
mov di,ax
|
|
||||||
xor bx,bx
|
|
||||||
and di,di
|
|
||||||
jge 1f
|
|
||||||
neg di
|
|
||||||
neg yl(si)
|
|
||||||
sbb di,bx
|
|
||||||
1:
|
|
||||||
mov ax,xl(si)
|
|
||||||
mov dx,xh(si)
|
|
||||||
and dx,dx
|
|
||||||
jge 1f
|
|
||||||
neg dx
|
|
||||||
neg ax
|
|
||||||
sbb dx,bx
|
|
||||||
1:
|
|
||||||
mov cx,16
|
|
||||||
1:
|
|
||||||
shl ax,1
|
|
||||||
rcl dx,1
|
|
||||||
rcl bx,1
|
|
||||||
cmp di,bx
|
|
||||||
ja 3f
|
|
||||||
jb 2f
|
|
||||||
cmp yl(si),dx
|
|
||||||
jbe 2f
|
|
||||||
3:
|
|
||||||
loop 1b
|
|
||||||
! dx=result(low), bx=result(high)
|
|
||||||
jmp 9b
|
|
||||||
2:
|
|
||||||
sub dx,yl(si)
|
|
||||||
sbb bx,di
|
|
||||||
inc ax
|
|
||||||
loop 1b
|
|
||||||
1:
|
|
||||||
! dx=result(low), bx=result(high)
|
|
||||||
jmp 9b
|
|
|
@ -1,39 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rmu
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.rmu:
|
|
||||||
pop bx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
xor dx,dx
|
|
||||||
pop cx
|
|
||||||
idiv cx
|
|
||||||
push dx
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop ax
|
|
||||||
pop dx
|
|
||||||
pop si
|
|
||||||
pop di
|
|
||||||
push bx
|
|
||||||
push di
|
|
||||||
push si
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
.extern .rmu4
|
|
||||||
call .rmu4
|
|
||||||
pop bx
|
|
||||||
push dx
|
|
||||||
push ax
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,62 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rmu4
|
|
||||||
|
|
||||||
yl=6
|
|
||||||
yh=8
|
|
||||||
xl=10
|
|
||||||
xh=12
|
|
||||||
|
|
||||||
.rmu4:
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
mov si,sp ! copy of sp
|
|
||||||
mov bx,yl(si)
|
|
||||||
mov ax,yh(si)
|
|
||||||
or ax,ax
|
|
||||||
jne 7f
|
|
||||||
1:
|
|
||||||
xor dx,dx
|
|
||||||
mov cx,xl(si)
|
|
||||||
mov ax,xh(si)
|
|
||||||
2:
|
|
||||||
div bx
|
|
||||||
xchg ax,cx
|
|
||||||
div bx
|
|
||||||
xor bx,bx
|
|
||||||
9:
|
|
||||||
! bx is high order result
|
|
||||||
! dx is low order result
|
|
||||||
mov ax,dx
|
|
||||||
mov dx,bx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
ret 8 ! result in ax/dx
|
|
||||||
|
|
||||||
7:
|
|
||||||
mov di,ax
|
|
||||||
xor bx,bx
|
|
||||||
mov ax,xl(si)
|
|
||||||
mov dx,xh(si)
|
|
||||||
mov cx,16
|
|
||||||
1:
|
|
||||||
shl ax,1
|
|
||||||
rcl dx,1
|
|
||||||
rcl bx,1
|
|
||||||
cmp di,bx
|
|
||||||
ja 3f
|
|
||||||
jb 2f
|
|
||||||
cmp yl(si),dx
|
|
||||||
jbe 2f
|
|
||||||
3:
|
|
||||||
loop 1b
|
|
||||||
! dx=result(low), bx=result(high)
|
|
||||||
jmp 9b
|
|
||||||
2:
|
|
||||||
sub dx,yl(si)
|
|
||||||
sbb bx,di
|
|
||||||
inc ax
|
|
||||||
loop 1b
|
|
||||||
1:
|
|
||||||
! dx=result(low), bx=result(high)
|
|
||||||
jmp 9b
|
|
|
@ -1,36 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .rol
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.rol:
|
|
||||||
pop dx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
pop cx
|
|
||||||
rol ax,cl
|
|
||||||
push ax
|
|
||||||
jmp dx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop cx
|
|
||||||
jcxz 2f
|
|
||||||
pop ax
|
|
||||||
pop bx
|
|
||||||
3:
|
|
||||||
sal ax,1
|
|
||||||
rcl bx,1
|
|
||||||
adc ax,0
|
|
||||||
loop 3b
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
2:
|
|
||||||
jmp dx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push dx
|
|
||||||
jmp .trp
|
|
|
@ -1,37 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .ror
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.ror:
|
|
||||||
pop dx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
pop cx
|
|
||||||
ror ax,cl
|
|
||||||
push ax
|
|
||||||
jmp dx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop cx
|
|
||||||
jcxz 2f
|
|
||||||
neg cx
|
|
||||||
add cx,32
|
|
||||||
pop ax
|
|
||||||
pop bx
|
|
||||||
3:
|
|
||||||
sar bx,1
|
|
||||||
rcr ax,1
|
|
||||||
loop 3b
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
2:
|
|
||||||
jmp dx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push dx
|
|
||||||
jmp .trp
|
|
|
@ -1,33 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .sar2
|
|
||||||
|
|
||||||
.sar2:
|
|
||||||
! bx, descriptor address
|
|
||||||
! ax, index
|
|
||||||
pop cx
|
|
||||||
pop dx ! base address
|
|
||||||
push cx
|
|
||||||
xchg di,dx ! di = base address, dx is saved di
|
|
||||||
sub ax,(bx)
|
|
||||||
mov cx,4(bx)
|
|
||||||
push dx
|
|
||||||
imul cx
|
|
||||||
pop dx
|
|
||||||
add di,ax
|
|
||||||
sar cx,1
|
|
||||||
jnb 1f
|
|
||||||
pop bx
|
|
||||||
pop ax
|
|
||||||
stosb
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
pop bx
|
|
||||||
mov ax,si
|
|
||||||
mov si,sp
|
|
||||||
rep movs
|
|
||||||
mov sp,si
|
|
||||||
mov si,ax
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
|
@ -1,30 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .sbi
|
|
||||||
|
|
||||||
! #bytes in cx , top of stack in ax
|
|
||||||
.sbi:
|
|
||||||
pop bx ! return subress
|
|
||||||
cmp cx,2
|
|
||||||
jne 1f
|
|
||||||
pop cx
|
|
||||||
sub ax,cx
|
|
||||||
neg ax
|
|
||||||
jmp bx
|
|
||||||
1:
|
|
||||||
cmp cx,4
|
|
||||||
jne 9f
|
|
||||||
pop dx
|
|
||||||
pop cx
|
|
||||||
sub cx,ax
|
|
||||||
mov ax,cx
|
|
||||||
pop cx
|
|
||||||
sbb cx,dx
|
|
||||||
push cx
|
|
||||||
jmp bx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,42 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .set
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
! bit # in ax
|
|
||||||
.set:
|
|
||||||
pop bx ! return address
|
|
||||||
xor dx,dx
|
|
||||||
!ifdef create set
|
|
||||||
sub sp,cx
|
|
||||||
push bx
|
|
||||||
push di
|
|
||||||
mov bx,sp
|
|
||||||
xor di,di
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
mov 4(bx)(di),dx
|
|
||||||
add di,2
|
|
||||||
loop 1b
|
|
||||||
!endif
|
|
||||||
mov bx,8
|
|
||||||
div bx
|
|
||||||
cmp ax,di
|
|
||||||
jae 2f
|
|
||||||
mov di,dx
|
|
||||||
movb dl,bits(di)
|
|
||||||
mov di,sp
|
|
||||||
add di,ax
|
|
||||||
orb 4(di),dl
|
|
||||||
pop di
|
|
||||||
ret
|
|
||||||
2:
|
|
||||||
.extern ESET
|
|
||||||
.extern .trp
|
|
||||||
pop di
|
|
||||||
mov ax,ESET
|
|
||||||
jmp .trp
|
|
||||||
|
|
||||||
.sect .data
|
|
||||||
bits:
|
|
||||||
.data1 1,2,4,8,16,32,64,128
|
|
|
@ -1,35 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .sli
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.sli:
|
|
||||||
pop dx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
pop cx
|
|
||||||
sal ax,cl
|
|
||||||
push ax
|
|
||||||
jmp dx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop cx
|
|
||||||
jcxz 2f
|
|
||||||
pop ax
|
|
||||||
pop bx
|
|
||||||
3:
|
|
||||||
sal ax,1
|
|
||||||
rcl bx,1
|
|
||||||
loop 3b
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
2:
|
|
||||||
jmp dx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push dx
|
|
||||||
jmp .trp
|
|
|
@ -1,35 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .sri
|
|
||||||
|
|
||||||
! #bytes in ax
|
|
||||||
.sri:
|
|
||||||
pop dx ! return address
|
|
||||||
cmp ax,2
|
|
||||||
jne 1f
|
|
||||||
pop ax
|
|
||||||
pop cx
|
|
||||||
sar ax,cl
|
|
||||||
push ax
|
|
||||||
jmp dx
|
|
||||||
1:
|
|
||||||
cmp ax,4
|
|
||||||
jne 9f
|
|
||||||
pop cx
|
|
||||||
jcxz 2f
|
|
||||||
pop ax
|
|
||||||
pop bx
|
|
||||||
3:
|
|
||||||
sar bx,1
|
|
||||||
rcr ax,1
|
|
||||||
loop 3b
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
2:
|
|
||||||
jmp dx
|
|
||||||
9:
|
|
||||||
.extern EODDZ
|
|
||||||
.extern .trp
|
|
||||||
mov ax,EODDZ
|
|
||||||
push dx
|
|
||||||
jmp .trp
|
|
|
@ -1,32 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .sti
|
|
||||||
.define .sts
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
! address in bx
|
|
||||||
! save di/si. they might be register variables
|
|
||||||
.sts:
|
|
||||||
mov dx,di ! save di
|
|
||||||
mov di,bx
|
|
||||||
pop bx
|
|
||||||
sar cx,1
|
|
||||||
jnb 1f
|
|
||||||
pop ax
|
|
||||||
stosb
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
||||||
.sti:
|
|
||||||
! only called with count > 4
|
|
||||||
mov dx,di
|
|
||||||
mov di,bx
|
|
||||||
pop bx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
mov ax,si
|
|
||||||
mov si,sp
|
|
||||||
rep movs
|
|
||||||
mov sp,si
|
|
||||||
mov di,dx
|
|
||||||
mov si,ax
|
|
||||||
jmp bx
|
|
|
@ -1,41 +0,0 @@
|
||||||
! $Source$
|
|
||||||
! $State$
|
|
||||||
! $Revision$
|
|
||||||
|
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .strhp
|
|
||||||
.extern .reghp, .limhp, EHEAP, .trp
|
|
||||||
|
|
||||||
! Updates the heap pointer:
|
|
||||||
!
|
|
||||||
! int .strhp(void* newpointer)
|
|
||||||
!
|
|
||||||
! .reghp is the current heap pointer;
|
|
||||||
! .limhp is the current top of memory.
|
|
||||||
!
|
|
||||||
! If the desired new heap pointer is above the top of memory, then BRK is
|
|
||||||
! called to extend the memory.
|
|
||||||
|
|
||||||
.strhp:
|
|
||||||
pop bx
|
|
||||||
pop ax
|
|
||||||
mov (.reghp),ax
|
|
||||||
cmp ax,(.limhp)
|
|
||||||
jb 1f
|
|
||||||
add ax,02000
|
|
||||||
and ax,~0777
|
|
||||||
push bx
|
|
||||||
push ax
|
|
||||||
call BRK
|
|
||||||
pop cx
|
|
||||||
pop bx
|
|
||||||
cmp ax,-1
|
|
||||||
je 2f
|
|
||||||
1:
|
|
||||||
mov (.limhp),cx
|
|
||||||
jmp bx
|
|
||||||
2:
|
|
||||||
mov ax,EHEAP
|
|
||||||
push bx
|
|
||||||
jmp .trp
|
|
|
@ -1,21 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .trp
|
|
||||||
.define .stop
|
|
||||||
.extern .trppc
|
|
||||||
|
|
||||||
! ax is trap number
|
|
||||||
.trp:
|
|
||||||
xor bx,bx
|
|
||||||
xchg bx,(.trppc)
|
|
||||||
test bx,bx
|
|
||||||
jz 2f
|
|
||||||
push ax
|
|
||||||
call bx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
||||||
2:
|
|
||||||
call .stop
|
|
||||||
|
|
||||||
.stop:
|
|
||||||
jmp EXIT
|
|
|
@ -1,9 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .unknown
|
|
||||||
.extern EILLINS, .fat
|
|
||||||
|
|
||||||
.unknown:
|
|
||||||
mov ax,EILLINS
|
|
||||||
push ax
|
|
||||||
jmp .fat
|
|
|
@ -1,18 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss
|
|
||||||
.sect .text
|
|
||||||
.define .xor
|
|
||||||
|
|
||||||
! #bytes in cx
|
|
||||||
.xor:
|
|
||||||
pop bx ! return address
|
|
||||||
mov dx,di
|
|
||||||
mov di,sp
|
|
||||||
add di,cx
|
|
||||||
sar cx,1
|
|
||||||
1:
|
|
||||||
pop ax
|
|
||||||
xor ax,(di)
|
|
||||||
stos
|
|
||||||
loop 1b
|
|
||||||
mov di,dx
|
|
||||||
jmp bx
|
|
|
@ -1,5 +0,0 @@
|
||||||
end_s.a
|
|
||||||
edata.s
|
|
||||||
em_end.s
|
|
||||||
end.s
|
|
||||||
etext.s
|
|
|
@ -1,76 +0,0 @@
|
||||||
libmon_s.a
|
|
||||||
_alarm.s
|
|
||||||
_sbrk.s
|
|
||||||
_brk.s
|
|
||||||
_close.s
|
|
||||||
_creat.s
|
|
||||||
_dup.s
|
|
||||||
_execl.s
|
|
||||||
_execve.s
|
|
||||||
_fork.s
|
|
||||||
_fstat.s
|
|
||||||
_ftime.s
|
|
||||||
_getpid.s
|
|
||||||
_gtty.s
|
|
||||||
_ioctl.s
|
|
||||||
_kill.s
|
|
||||||
_link.s
|
|
||||||
_lseek.s
|
|
||||||
_open.s
|
|
||||||
_pause.s
|
|
||||||
_pipe.s
|
|
||||||
_read.s
|
|
||||||
_unlink.s
|
|
||||||
_wait.s
|
|
||||||
_write.s
|
|
||||||
exit.s
|
|
||||||
_exit.s
|
|
||||||
abort.s
|
|
||||||
access.s
|
|
||||||
chdir.s
|
|
||||||
chmod.s
|
|
||||||
chown.s
|
|
||||||
cleanup.s
|
|
||||||
close.s
|
|
||||||
creat.s
|
|
||||||
dup.s
|
|
||||||
execl.s
|
|
||||||
execle.s
|
|
||||||
execv.s
|
|
||||||
execve.s
|
|
||||||
time.s
|
|
||||||
exece.s
|
|
||||||
fork.s
|
|
||||||
fstat.s
|
|
||||||
getgid.s
|
|
||||||
getpid.s
|
|
||||||
getuid.s
|
|
||||||
gtty.s
|
|
||||||
stty.s
|
|
||||||
ioctl.s
|
|
||||||
kill.s
|
|
||||||
link.s
|
|
||||||
lseek.s
|
|
||||||
mknod.s
|
|
||||||
mount.s
|
|
||||||
nice.s
|
|
||||||
open.s
|
|
||||||
pipe.s
|
|
||||||
profil.s
|
|
||||||
read.s
|
|
||||||
sbrk.s
|
|
||||||
brk.s
|
|
||||||
setgid.s
|
|
||||||
setuid.s
|
|
||||||
signal.s
|
|
||||||
stat.s
|
|
||||||
sync.s
|
|
||||||
umount.s
|
|
||||||
unlink.s
|
|
||||||
wait.s
|
|
||||||
write.s
|
|
||||||
cerror.s
|
|
||||||
error.s
|
|
||||||
pause.s
|
|
||||||
alarm.s
|
|
||||||
ftime.s
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __alarm
|
|
||||||
.extern __alarm, cerror
|
|
||||||
__alarm: int 0x9b
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9:
|
|
||||||
jmp cerror
|
|
|
@ -1,32 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __brk
|
|
||||||
.define xbrk
|
|
||||||
__brk:
|
|
||||||
mov bx,sp
|
|
||||||
mov ax,2(bx)
|
|
||||||
mov cx,sp
|
|
||||||
sub cx,128
|
|
||||||
jbe 1f
|
|
||||||
mov bx,(.limhp)
|
|
||||||
mov (.limhp),ax
|
|
||||||
sub ax,bx
|
|
||||||
jbe 2f
|
|
||||||
call xbrk
|
|
||||||
2:
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
1:
|
|
||||||
mov ax,0xc
|
|
||||||
jmp cerror
|
|
||||||
xbrk:
|
|
||||||
push di
|
|
||||||
mov di,bx
|
|
||||||
mov cx,ax
|
|
||||||
xor ax,ax
|
|
||||||
shr cx,1
|
|
||||||
repz stos
|
|
||||||
jae 3f
|
|
||||||
stosb
|
|
||||||
3:
|
|
||||||
pop di
|
|
||||||
ret
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __close
|
|
||||||
.extern __close, cerror
|
|
||||||
__close: int 0x86
|
|
||||||
jb 9f
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,7 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __creat
|
|
||||||
.extern __creat, cerror
|
|
||||||
__creat: int 0x88
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
|
|
||||||
.define __dup
|
|
||||||
.extern __dup, cerror
|
|
||||||
__dup: int 0xc9
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,20 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
|
|
||||||
.define __execl
|
|
||||||
.extern __execl, _environ, __execve
|
|
||||||
__execl:
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
push bp
|
|
||||||
mov bp,sp
|
|
||||||
push (_environ)
|
|
||||||
lea ax,10(bp)
|
|
||||||
push ax
|
|
||||||
push 8(bp)
|
|
||||||
call __execve
|
|
||||||
add sp,6
|
|
||||||
mov sp,bp
|
|
||||||
pop bp
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
ret
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __execve
|
|
||||||
.extern __execve, cerror
|
|
||||||
__execve:
|
|
||||||
int 0x8b
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,10 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __exit
|
|
||||||
.sect .text
|
|
||||||
__exit:
|
|
||||||
mov bx,sp
|
|
||||||
xor ax,ax
|
|
||||||
push ax ! unused memory
|
|
||||||
push 2(bx)
|
|
||||||
push ax ! dummy return address
|
|
||||||
int 0x81
|
|
|
@ -1,11 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __fork
|
|
||||||
.extern __fork, cerror
|
|
||||||
__fork: int 0x82
|
|
||||||
jmp 1f
|
|
||||||
jae 2f
|
|
||||||
jmp cerror
|
|
||||||
1:
|
|
||||||
xor ax,ax
|
|
||||||
2:
|
|
||||||
ret
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __fstat
|
|
||||||
.extern __fstat, cerror
|
|
||||||
__fstat: int 0x9c
|
|
||||||
jb 9f
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __ftime
|
|
||||||
.extern __ftime, cerror
|
|
||||||
__ftime: int 0xa3
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9:
|
|
||||||
jmp cerror
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __getpid
|
|
||||||
.extern __getpid, cerror
|
|
||||||
__getpid: int 0x94
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9:
|
|
||||||
jmp cerror
|
|
|
@ -1,15 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __gtty
|
|
||||||
.extern __gtty, __ioctl
|
|
||||||
__gtty:
|
|
||||||
push bp
|
|
||||||
mov bp,sp
|
|
||||||
push 6(bp)
|
|
||||||
mov ax,0x5401
|
|
||||||
push ax
|
|
||||||
push 4(bp)
|
|
||||||
call __ioctl
|
|
||||||
add sp,6
|
|
||||||
mov sp,bp
|
|
||||||
pop bp
|
|
||||||
ret
|
|
|
@ -1,7 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __ioctl
|
|
||||||
.extern __ioctl, cerror
|
|
||||||
__ioctl: int 0xb6
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,8 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __kill
|
|
||||||
.extern __kill, cerror
|
|
||||||
__kill: int 0xa5
|
|
||||||
jb 9f
|
|
||||||
xor ax,ax
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,7 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __link
|
|
||||||
.extern __link, cerror
|
|
||||||
__link: int 0x89
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
|
@ -1,7 +0,0 @@
|
||||||
.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
|
|
||||||
.define __lseek
|
|
||||||
.extern __lseek, cerror
|
|
||||||
__lseek: int 0x93
|
|
||||||
jb 9f
|
|
||||||
ret
|
|
||||||
9: jmp cerror
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue