DeSmet C88 v2.4
This commit is contained in:
parent
15a91f0338
commit
665e4e64a5
BIN
DeSmet C88 v24/ASM88.EXE
Normal file
BIN
DeSmet C88 v24/ASM88.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/BIND.EXE
Normal file
BIN
DeSmet C88 v24/BIND.EXE
Normal file
Binary file not shown.
159
DeSmet C88 v24/BUF128.A
Normal file
159
DeSmet C88 v24/BUF128.A
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
;
|
||||||
|
; buf128: a 128 character type-ahead buffer for the IBM-PC
|
||||||
|
;
|
||||||
|
; This program works by intercepting the calls to the BIOS
|
||||||
|
; interrupt routines at 9 for the keystroke interrupts and
|
||||||
|
; 16H for the program requests
|
||||||
|
; Everything is kept in CS.
|
||||||
|
;
|
||||||
|
; Caution: buf128 must be linked with the -A option, e.g.
|
||||||
|
; BIND B:BUF128 -A
|
||||||
|
|
||||||
|
cseg
|
||||||
|
public main_,key_int,request,buffer,head,tail
|
||||||
|
|
||||||
|
KEYINT: equ 24H ; int 9 vector offset
|
||||||
|
REQINT: equ 58H ; int 16H vector offset
|
||||||
|
B_HEAD: equ 1AH ; offset to BUFFER_HEAD
|
||||||
|
B_TAIL: equ 1CH ; offset to BUFFER_TAIL
|
||||||
|
KB_FLAG: equ 17H ; offset to KB_FLAG
|
||||||
|
|
||||||
|
main_: jmp init_code
|
||||||
|
;
|
||||||
|
buffer: dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
|
||||||
|
head: dw buffer
|
||||||
|
tail: dw buffer
|
||||||
|
|
||||||
|
;
|
||||||
|
; the keystroke interrupt routine. Interrcept the key interrupt, run
|
||||||
|
; it through the standard key input routine, and remove it from the buffer.
|
||||||
|
;
|
||||||
|
|
||||||
|
key_int:
|
||||||
|
cli
|
||||||
|
pushf ; simulate an interrupt
|
||||||
|
;
|
||||||
|
; long call to F000:E987
|
||||||
|
;
|
||||||
|
db 9AH
|
||||||
|
dw 0E987H
|
||||||
|
dw 0F000H
|
||||||
|
;
|
||||||
|
push bx
|
||||||
|
push es
|
||||||
|
mov bx,40H ; BIOS data segment
|
||||||
|
mov es,bx
|
||||||
|
mov bx, es:[B_HEAD] ; pointer to datum
|
||||||
|
cmp bx, es:[B_TAIL] ; test for character
|
||||||
|
je k_esbx
|
||||||
|
mov es:[B_TAIL], bx ; clear the buffer
|
||||||
|
mov bx, es:[bx]
|
||||||
|
push si
|
||||||
|
mov si, cs:tail
|
||||||
|
push si ; save tail value
|
||||||
|
add si,2 ; test for full
|
||||||
|
cmp si, offset buffer+256
|
||||||
|
jb k_over1
|
||||||
|
mov si, offset buffer
|
||||||
|
k_over1:
|
||||||
|
cmp si, cs:head
|
||||||
|
pop si
|
||||||
|
je k_siesbx ; jump if buffer full
|
||||||
|
mov cs:[si], bx ; store the character
|
||||||
|
add si,2
|
||||||
|
cmp si, offset buffer+256
|
||||||
|
jb k_over2
|
||||||
|
mov si, offset buffer
|
||||||
|
k_over2:
|
||||||
|
mov cs:tail, si
|
||||||
|
k_siesbx:
|
||||||
|
pop si
|
||||||
|
k_esbx:
|
||||||
|
pop es ; no character, return
|
||||||
|
pop bx
|
||||||
|
iret
|
||||||
|
|
||||||
|
;
|
||||||
|
; The request interrupt routine.
|
||||||
|
;
|
||||||
|
; simulate the BIOS routine
|
||||||
|
; ah = 0 read next char
|
||||||
|
; ah = 1 set Z flag on character status, ZF=1 if no char
|
||||||
|
; ZF=0 and AX = char if char ready
|
||||||
|
; ah = 2 shift status
|
||||||
|
|
||||||
|
|
||||||
|
request:
|
||||||
|
sti
|
||||||
|
or ah,ah
|
||||||
|
jz do_read
|
||||||
|
dec ah
|
||||||
|
jz do_stat
|
||||||
|
dec ah
|
||||||
|
jz do_shift
|
||||||
|
iret
|
||||||
|
|
||||||
|
do_read: ; return the next character
|
||||||
|
sti
|
||||||
|
nop
|
||||||
|
cli
|
||||||
|
mov ax,cs:head
|
||||||
|
cmp ax,cs:tail
|
||||||
|
je do_read ; loop until a character
|
||||||
|
push bx
|
||||||
|
mov bx,ax
|
||||||
|
mov ax, cs:[bx] ; ax gets the character
|
||||||
|
add bx,2
|
||||||
|
cmp bx, offset buffer+256
|
||||||
|
jb r_over
|
||||||
|
mov bx, offset buffer
|
||||||
|
r_over:
|
||||||
|
cmp bx, cs:tail
|
||||||
|
mov cs:head, bx ; new head
|
||||||
|
pop bx
|
||||||
|
iret
|
||||||
|
|
||||||
|
do_stat: ; return key status
|
||||||
|
cli
|
||||||
|
push bx
|
||||||
|
mov bx,cs:head
|
||||||
|
cmp bx,cs:tail
|
||||||
|
mov ax,cs:[bx]
|
||||||
|
pop bx
|
||||||
|
sti
|
||||||
|
lret 2 ; throw out the flags
|
||||||
|
|
||||||
|
do_shift:
|
||||||
|
push es
|
||||||
|
mov ax,40H ; BIOS data segment
|
||||||
|
mov es,ax
|
||||||
|
mov al, es:[KB_FLAG]
|
||||||
|
pop es
|
||||||
|
iret
|
||||||
|
|
||||||
|
init_code: cli ; turn off interrupts for now
|
||||||
|
mov ax,0
|
||||||
|
mov es,ax ; segment base for vectors
|
||||||
|
mov es:[KEYINT], offset key_int
|
||||||
|
mov es:[KEYINT+2], cs
|
||||||
|
mov es:[REQINT], offset request
|
||||||
|
mov es:[REQINT+2], cs
|
||||||
|
mov cs:head, offset buffer
|
||||||
|
mov cs:tail, offset buffer
|
||||||
|
sti
|
||||||
|
mov ds:byte[1], 27H ; change PCB terminate to resident
|
||||||
|
push ds
|
||||||
|
mov dx,0
|
||||||
|
push dx
|
||||||
|
mov dx, offset init_code+100H
|
||||||
|
lret ; long return to the int 27H
|
||||||
|
end
|
||||||
|
|
BIN
DeSmet C88 v24/BUF128.EXE
Normal file
BIN
DeSmet C88 v24/BUF128.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/BUGS!.EXE
Normal file
BIN
DeSmet C88 v24/BUGS!.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/C88.EXE
Normal file
BIN
DeSmet C88 v24/C88.EXE
Normal file
Binary file not shown.
231
DeSmet C88 v24/CB.C
Normal file
231
DeSmet C88 v24/CB.C
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
/* CBCHECK.C -- Dumb Curley Brace Checker for C Programs
|
||||||
|
Usage: A>cbcheck program
|
||||||
|
|
||||||
|
This program really checks indentation. It ignores
|
||||||
|
#include and #define and has a lot of other
|
||||||
|
limitations. If it does not work for your style
|
||||||
|
of programs, change it. */
|
||||||
|
|
||||||
|
#define TAB 9
|
||||||
|
#define LF 10
|
||||||
|
#define CR 13
|
||||||
|
#define CONTZ 26
|
||||||
|
|
||||||
|
char *nextin,*line_start,lastch,switch_level;
|
||||||
|
int indentat[10],line,numcb;
|
||||||
|
|
||||||
|
|
||||||
|
main(argc,argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[]; {
|
||||||
|
int ch;
|
||||||
|
char col;
|
||||||
|
|
||||||
|
if (argc < 2) error("no file name","");
|
||||||
|
read_file(argv[1]);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
line_start=nextin;
|
||||||
|
line++;
|
||||||
|
col=countcol();
|
||||||
|
if (index("{}/#\r\n",*nextin) == 0 && (lastch == '{' || lastch == ';')
|
||||||
|
&& col != indentat[numcb] && switch_level == 0) {
|
||||||
|
if (indentat[numcb]) lerror("questionable indent");
|
||||||
|
indentat[numcb]=col;
|
||||||
|
}
|
||||||
|
if (skipl() == -1) break;
|
||||||
|
}
|
||||||
|
printf("%d lines",line);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* READ_FILE -- open the input file and read. */
|
||||||
|
|
||||||
|
read_file(fil)
|
||||||
|
char *fil; {
|
||||||
|
int i,filenum;
|
||||||
|
unsigned max,numin;
|
||||||
|
char filename[65];
|
||||||
|
|
||||||
|
/* get the file name. default is .C */
|
||||||
|
|
||||||
|
strcpy(filename,fil);
|
||||||
|
i=0;
|
||||||
|
while (filename[i] && filename[i] != '.') i++;
|
||||||
|
if (filename[i] == 0) strcat(filename,".C");
|
||||||
|
|
||||||
|
/* open the filename */
|
||||||
|
|
||||||
|
if ((filenum=open(filename,0)) == -1) error("cannot open",filename);
|
||||||
|
|
||||||
|
/* read file in */
|
||||||
|
|
||||||
|
nextin=_memory(); /* first free memory */
|
||||||
|
max=_showsp()-nextin-1000; /* size of memory */
|
||||||
|
if ((numin=read(filenum,nextin,max)) == -1)
|
||||||
|
error("cannot read",filename);
|
||||||
|
if (numin == max) error("file too big","");
|
||||||
|
nextin[numin]=CONTZ; /* plant a control Z for EOF */
|
||||||
|
close(filenum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* COUNTCOL -- count indentation */
|
||||||
|
|
||||||
|
countcol() {
|
||||||
|
int col;
|
||||||
|
|
||||||
|
col=0;
|
||||||
|
while (*nextin == ' ' || *nextin == TAB) {
|
||||||
|
if (*nextin == ' ') col++; else col+=4;
|
||||||
|
nextin++;
|
||||||
|
}
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* SKIPL -- skip the rest of the line. take care of comments etc. */
|
||||||
|
|
||||||
|
skipl() {
|
||||||
|
|
||||||
|
lastch=0;
|
||||||
|
while (*nextin != LF) {
|
||||||
|
if (*nextin != CR) lastch=*nextin;
|
||||||
|
|
||||||
|
switch (*nextin++) {
|
||||||
|
|
||||||
|
/* control Z means EOF */
|
||||||
|
case CONTZ: return -1;
|
||||||
|
|
||||||
|
/* " means string */
|
||||||
|
case '"': while (*nextin != '"') {
|
||||||
|
if (*nextin == '\\') {
|
||||||
|
nextin++;
|
||||||
|
if (*nextin == CR) {
|
||||||
|
nextin++;
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*nextin == LF || *nextin == CONTZ) {
|
||||||
|
lerror("missing \"");
|
||||||
|
nextin--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* ' means character constant */
|
||||||
|
case '\'': skip_char();
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* / may mean comment */
|
||||||
|
case '/': if (*nextin == '*') {
|
||||||
|
while (*++nextin != '*' || *++nextin != '/') {
|
||||||
|
if (*nextin == LF) line++;
|
||||||
|
if (*nextin == '/' && *(nextin+1) == '*')
|
||||||
|
lerror("comments may be nested");
|
||||||
|
if (*nextin == CONTZ) {
|
||||||
|
lerror("missing */");
|
||||||
|
nextin--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* a switch statement adds extra indentation */
|
||||||
|
case 's': if ((*(nextin-2) == ' ' || *(nextin-2) == TAB)
|
||||||
|
&& *nextin == 'w' && *++nextin == 'i' &&
|
||||||
|
*++nextin == 't' && *++nextin == 'c' &&
|
||||||
|
*++nextin == 'h' && (*++nextin == '(' ||
|
||||||
|
*nextin == ' ')) {
|
||||||
|
if (switch_level == 0) switch_level=numcb;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* { adds to curley brace count */
|
||||||
|
case '{': numcb++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* } subtracts form curley brace count */
|
||||||
|
case '}': if (numcb) {
|
||||||
|
numcb--;
|
||||||
|
if (switch_level == numcb) switch_level=0;
|
||||||
|
}
|
||||||
|
else lerror("too many '}'s");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
return *nextin == CONTZ ? -1: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* SKIP_CHAR -- skip a character constant. */
|
||||||
|
|
||||||
|
skip_char() {
|
||||||
|
|
||||||
|
while (*nextin != '\'') {
|
||||||
|
if (*nextin == '\\') nextin++;
|
||||||
|
if (*nextin == LF || *nextin == CONTZ) {
|
||||||
|
lerror("missing '");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
}
|
||||||
|
nextin++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* LERROR -- print an line error */
|
||||||
|
|
||||||
|
lerror(str)
|
||||||
|
char *str; {
|
||||||
|
char *ptr,col;
|
||||||
|
|
||||||
|
printf("%5d ",line);
|
||||||
|
col=0;
|
||||||
|
do {
|
||||||
|
if (*line_start != TAB) {
|
||||||
|
putchar(*line_start);
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
else do {
|
||||||
|
putchar(' ');
|
||||||
|
}
|
||||||
|
while (++col % 4);
|
||||||
|
}
|
||||||
|
while (*line_start != CONTZ && *line_start++ != LF);
|
||||||
|
puts("error: ");
|
||||||
|
puts(str);
|
||||||
|
puts("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ERROR -- print an error and bail out */
|
||||||
|
|
||||||
|
error(stra,strb)
|
||||||
|
char *stra,*strb; {
|
||||||
|
|
||||||
|
puts("error: ");
|
||||||
|
puts(stra);
|
||||||
|
puts(" ");
|
||||||
|
puts(strb);
|
||||||
|
exit(2);
|
||||||
|
}
|
BIN
DeSmet C88 v24/CLIST.EXE
Normal file
BIN
DeSmet C88 v24/CLIST.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/COMPARE.EXE
Normal file
BIN
DeSmet C88 v24/COMPARE.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/COMPARE.O
Normal file
BIN
DeSmet C88 v24/COMPARE.O
Normal file
Binary file not shown.
677
DeSmet C88 v24/CONFIG.C
Normal file
677
DeSmet C88 v24/CONFIG.C
Normal file
@ -0,0 +1,677 @@
|
|||||||
|
/* CONFIG.C -- Configuration file for SEE editor. */
|
||||||
|
|
||||||
|
/* This routine must be modified to match your terminal. If you have a
|
||||||
|
supported terminal, you need only set the appropriate define to 1
|
||||||
|
and the others to 0. The supported terminals are: */
|
||||||
|
|
||||||
|
#define ANSI 1 /* DEC Rainbow 100. OK for other ANSI terminals also. */
|
||||||
|
#define H1500 0 /* Hazeltine 1500. */
|
||||||
|
#define VT52 0 /* DEC VT-52 compatable. */
|
||||||
|
#define Z100 0 /* Zenith Z-100 by Daniel Herteg, Jr. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
After modifying this routine, it must be compiled and linked to form
|
||||||
|
a new SEE and D88. Assuming that the C compiler is on drive A: and
|
||||||
|
that CONFIG.C and the other header and object files are on drive B:,
|
||||||
|
the commands required are:
|
||||||
|
|
||||||
|
A>c88 b:config
|
||||||
|
A>bind b:see b:config
|
||||||
|
A>bind b:d88 b:d88rest b:config
|
||||||
|
or, if under CP/M
|
||||||
|
A>bind b:cpmd88 b:d88rest b:config -s1000 -h -od88
|
||||||
|
|
||||||
|
B:SEE.EXE/CMD is the new version of SEE.
|
||||||
|
B:D88.EXE/CMD is the new version of D88.
|
||||||
|
|
||||||
|
A CP/M bind of SEE will report _PCB_ unresolved. This is OK.
|
||||||
|
|
||||||
|
The bind of D88 will report the three externals FLIPINIT_, SCR_SAVE_
|
||||||
|
and SCR_REST_ as unresolved. This is OK, but the screen flipping feature
|
||||||
|
of D88 will be dissabled. If you can read your screen and want the
|
||||||
|
screen flip feature, modify FLIP.A for your terminal and add b:flip
|
||||||
|
to the bind list for D88.
|
||||||
|
|
||||||
|
If your system is rom compatable with the IBM PC (Sanyo etc.),
|
||||||
|
assemble pcio.a instead of modifying config.c. Pcio.a is on disk 2.
|
||||||
|
A>asm88 b:pcio
|
||||||
|
Use pcio in the bind list instead of config.
|
||||||
|
|
||||||
|
The source compare program cannot be configured with config.c as
|
||||||
|
it needs the partial scroll routines found in pcio.a. If you cannot
|
||||||
|
use pcio.a, the following routines must be added to config.c to configure
|
||||||
|
compare.
|
||||||
|
SCR_SCRUP_ Scroll the screen up. The window is scrolled up nline lines.
|
||||||
|
A zero nline will clear the window. Top left of the screen in 0,0.
|
||||||
|
Usage: scr_scrup(nline,fromrow,fromcol,torow,tocol);
|
||||||
|
SCR_SCRDN_ scroll the screen down. the window is scrolled down nline lines.
|
||||||
|
A zero nline will clear the window. Top left of the screen in 0,0.
|
||||||
|
Usage: scr_scrdn(nline,fromrow,fromcol,torow,tocol);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
note that ci() and co() are used instead of getchar() and putchar().
|
||||||
|
the former will not cancel if the user inadvertantly hits control c. */
|
||||||
|
|
||||||
|
/* control key translations. these are the codes that D88 and SEE expect. */
|
||||||
|
#define up_char 30
|
||||||
|
#define down_char 31
|
||||||
|
#define left_char 29
|
||||||
|
#define right_char 28
|
||||||
|
#define bol_char 200
|
||||||
|
#define eol_char 201
|
||||||
|
#define pageup_char 202
|
||||||
|
#define pagedown_char 203
|
||||||
|
#define bof_char 204
|
||||||
|
#define eof_char 205
|
||||||
|
#define Ins_char 206
|
||||||
|
#define Del_char 207
|
||||||
|
#define NextWord_char 208
|
||||||
|
#define PrevWord_char 209
|
||||||
|
|
||||||
|
/* Macro Keys */
|
||||||
|
|
||||||
|
#define F1 210
|
||||||
|
#define F2 211
|
||||||
|
#define F3 212
|
||||||
|
#define F4 213
|
||||||
|
#define F5 214
|
||||||
|
#define F6 215
|
||||||
|
#define F7 216
|
||||||
|
#define F8 217
|
||||||
|
#define F9 218
|
||||||
|
#define F10 219
|
||||||
|
|
||||||
|
#define RUBOUT 0x7f
|
||||||
|
#define BS 8
|
||||||
|
#define ESC 0x1B
|
||||||
|
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
int scr_cols=80; /* number of screen columns */
|
||||||
|
int scr_rows=24; /* number of screen rows */
|
||||||
|
char scr_scrolldown=FALSE; /* FALSE if screen can be scrolled up. If true
|
||||||
|
scr_scdn() will not be called. */
|
||||||
|
char scr_scrollup=FALSE; /* TRUE if up scrolling (scr_scup()) causes the
|
||||||
|
top lines to be overwritten by the next lines.
|
||||||
|
This is only false for terminals that
|
||||||
|
support partial scrolling, i.e. have
|
||||||
|
delete line functions. */
|
||||||
|
char scr_window_top=2; /* Top line of scroll window. Must default to 2
|
||||||
|
for SEE. */
|
||||||
|
char scr_attr=7; /* default screen attributes. */
|
||||||
|
char see_mode; /* true if in Insert or eXchange mode */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* A N S I */
|
||||||
|
|
||||||
|
#if ANSI
|
||||||
|
/* ANSI Configuration for SEE editor.
|
||||||
|
|
||||||
|
This is the ANSI version of the configuration file for SEE. It was
|
||||||
|
written for the DEC Rainbow and may have to be changed for other
|
||||||
|
terminals claiming ANSI compatability. The keys used are:
|
||||||
|
|
||||||
|
<arrow> move the cursor.
|
||||||
|
Do used as terminator instead of ESCAPE.
|
||||||
|
PF1 jump to start of line.
|
||||||
|
PF2 jump to end of line.
|
||||||
|
PF3 jump to start of file.
|
||||||
|
PF4 jump to end of file.
|
||||||
|
Insert Enter insert mode (like I) or flip between
|
||||||
|
insert and exchange mode.
|
||||||
|
Remove delete character under the cursor.
|
||||||
|
<= delete previuos character.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* hidig and lowdig are used to convert binary 0 to 79 to ascii 1 to 80 */
|
||||||
|
|
||||||
|
char hidig[]={
|
||||||
|
0,0,0,0,0,0,0,0,0,1,
|
||||||
|
1,1,1,1,1,1,1,1,1,2,
|
||||||
|
2,2,2,2,2,2,2,2,2,3,
|
||||||
|
3,3,3,3,3,3,3,3,3,4,
|
||||||
|
4,4,4,4,4,4,4,4,4,5,
|
||||||
|
5,5,5,5,5,5,5,5,5,6,
|
||||||
|
6,6,6,6,6,6,6,6,6,7,
|
||||||
|
7,7,7,7,7,7,7,7,7,8};
|
||||||
|
|
||||||
|
char lowdig[]={
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0,
|
||||||
|
1,2,3,4,5,6,7,8,9,0};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define SCR_ROWCOL "\\e[%c%c;%c%cH", hidig[row]+'0', lowdig[row]+'0', hidig[col]+'0', lowdig[col]+'0'
|
||||||
|
#define SCR_CLR "\\e[2J"
|
||||||
|
#define SCR_CLRL "\\e[K"
|
||||||
|
#define SCR_CLS "\\e[J"
|
||||||
|
#define SCR_SCUP "\\e[M"
|
||||||
|
#define SCR_SCDN "\\e[L"
|
||||||
|
|
||||||
|
/* SCR_CI -- Input a character and translate function keys. */
|
||||||
|
|
||||||
|
scr_ci() {
|
||||||
|
char chr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((chr=ci()) == ESC) { /* ESCAPE starts special keys */
|
||||||
|
|
||||||
|
/* ESC O starts the PF keys */
|
||||||
|
if ((chr=ci()) == 'O') {
|
||||||
|
switch (chr=ci()) {
|
||||||
|
case 'P': chr=bol_char; /* PF1 key */
|
||||||
|
break;
|
||||||
|
case 'Q': chr=eol_char; /* PF2 key */
|
||||||
|
break;
|
||||||
|
case 'R': chr=bof_char; /* PF3 key */
|
||||||
|
break;
|
||||||
|
case 'S': chr=eof_char; /* PF4 key */
|
||||||
|
}
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chr == '[') {
|
||||||
|
switch (chr=ci()) {
|
||||||
|
case 'A': chr=up_char;
|
||||||
|
break;
|
||||||
|
case 'B': chr=down_char;
|
||||||
|
break;
|
||||||
|
case 'C': chr=right_char;
|
||||||
|
break;
|
||||||
|
case 'D': chr=left_char;
|
||||||
|
break;
|
||||||
|
case '2': if ((chr=ci()) == '9') {
|
||||||
|
chr=ESC; /* use Do for ESC */
|
||||||
|
ci(); /* eat the tilde */
|
||||||
|
}
|
||||||
|
else chr=Ins_char;
|
||||||
|
break;
|
||||||
|
case '3': chr=Del_char;
|
||||||
|
ci();
|
||||||
|
break;
|
||||||
|
case '5': chr=pageup_char;
|
||||||
|
ci();
|
||||||
|
break;
|
||||||
|
case '6': chr=pagedown_char;
|
||||||
|
ci();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (chr == RUBOUT) chr=BS; /* make rubout into a BS */
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* H A Z E L T I N E 1 5 0 0 */
|
||||||
|
|
||||||
|
#if H1500
|
||||||
|
|
||||||
|
/* H1500 Configuration for SEE editor. */
|
||||||
|
|
||||||
|
#define SCR_ROWCOL "\176\21%c%c", col, row
|
||||||
|
#define SCR_CLR "\176\34"
|
||||||
|
#define SCR_CLRL "\176\17"
|
||||||
|
#define SCR_CLS "\176\30"
|
||||||
|
#define SCR_SCUP "\176\23"
|
||||||
|
#define SCR_SCDN "\176\32"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* The Hazeltine 1500 has neither cursor movement keys nor function keys.
|
||||||
|
Consequently, control keys must be used. The choice of key for a
|
||||||
|
particular function is a matter of preference. */
|
||||||
|
|
||||||
|
/* keyxlat defines the key codes that can be used at any time. */
|
||||||
|
|
||||||
|
struct {char inkey,means; } keyxlat[]={
|
||||||
|
{15,up_char}, /* control O means up */
|
||||||
|
{16,down_char}, /* control P means down */
|
||||||
|
{11,left_char}, /* control K means left */
|
||||||
|
{12,right_char}, /* control L means right */
|
||||||
|
{26,bol_char}, /* control Z means go to beginning of line */
|
||||||
|
{24,eol_char}, /* control X means go to end of line */
|
||||||
|
{17,pageup_char}, /* control Q means page up */
|
||||||
|
{1,pagedown_char}, /* control A means page down */
|
||||||
|
{23,bof_char}, /* control W means go to top of file */
|
||||||
|
{19,eof_char}, /* control S means go to end of file */
|
||||||
|
/* no insert char as I will enter insert */
|
||||||
|
{4,Del_char}, /* control D for delete a char */
|
||||||
|
{0,0}}; /* no next or previous word */
|
||||||
|
|
||||||
|
/* cmdxlat defines alternate command codes that can be used when SEE
|
||||||
|
is not in insert or exchange mode. */
|
||||||
|
|
||||||
|
struct {char inkey,means; } cmdxlat[]={
|
||||||
|
{'@',up_char}, /* @ means up */
|
||||||
|
{';',down_char}, /* ; means down */
|
||||||
|
{',',left_char}, /* , means left */
|
||||||
|
{'.',right_char}, /* . means right */
|
||||||
|
{':',bol_char}, /* : means go to beginning of line */
|
||||||
|
{']',eol_char}, /* ] means go to end of line */
|
||||||
|
{'[',pageup_char}, /* [ means page up */
|
||||||
|
{'_',pagedown_char},/* _ means page down */
|
||||||
|
{0,0}};
|
||||||
|
|
||||||
|
extern char see_mode; /* true is in insert or exchange mode */
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CI -- Input a character and translate function keys. */
|
||||||
|
|
||||||
|
scr_ci() {
|
||||||
|
char chr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
chr=ci(); /* get next character */
|
||||||
|
for (i=0; keyxlat[i].inkey; i++)
|
||||||
|
if (chr == keyxlat[i].inkey) {
|
||||||
|
chr=keyxlat[i].means;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!see_mode) { /* if not in exchange or insert mode, accept alternate
|
||||||
|
command codes. */
|
||||||
|
|
||||||
|
for (i=0; cmdxlat[i].inkey; i++)
|
||||||
|
if (chr == cmdxlat[i].inkey) {
|
||||||
|
chr=cmdxlat[i].means;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* V T 5 2 */
|
||||||
|
|
||||||
|
#if VT52
|
||||||
|
/* VT52 Configuration for SEE editor.
|
||||||
|
|
||||||
|
This is the CP/M-86 VT52 version of the configuration file for SEE.
|
||||||
|
|
||||||
|
The input control characters are:
|
||||||
|
|
||||||
|
^E = up
|
||||||
|
^X = down
|
||||||
|
^S = left
|
||||||
|
^D = right
|
||||||
|
^Q = go to beginning of line
|
||||||
|
^Z = go to end of line
|
||||||
|
^R = page up
|
||||||
|
^C = page down
|
||||||
|
^T = go to top of file
|
||||||
|
^B = go to end of file
|
||||||
|
^V = Insert/Xchg Toggle
|
||||||
|
^G = delete a char
|
||||||
|
^A = prev word
|
||||||
|
^F = next word
|
||||||
|
|
||||||
|
The alternate command codes that can be used when SEE is not in
|
||||||
|
insert or exchange mode are:
|
||||||
|
|
||||||
|
@ = up
|
||||||
|
; = down
|
||||||
|
, = left
|
||||||
|
. = right
|
||||||
|
: = go to beginning of line
|
||||||
|
] = go to end of line
|
||||||
|
[ = page up
|
||||||
|
_ = page down
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SCR_ROWCOL "\\eY%c%c", row + 0x20, col + 0x20
|
||||||
|
#define SCR_CLR "\\eE"
|
||||||
|
#define SCR_CLRL "\\eK"
|
||||||
|
#define SCR_CLS "\\eJ"
|
||||||
|
#define SCR_SCUP "\\eM"
|
||||||
|
#define SCR_SCDN "\\eL"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct {char inkey,means; } keyxlat[]={
|
||||||
|
{05,up_char}, /* ^E = up */
|
||||||
|
{24,down_char}, /* ^X = down */
|
||||||
|
{19,left_char}, /* ^S = left */
|
||||||
|
{04,right_char}, /* ^D = right */
|
||||||
|
{17,bol_char}, /* ^Q = go to beginning of line */
|
||||||
|
{26,eol_char}, /* ^Z = go to end of line */
|
||||||
|
{18,pageup_char}, /* ^R = page up */
|
||||||
|
{03,pagedown_char}, /* ^C = page down */
|
||||||
|
{20,bof_char}, /* ^T = go to top of file */
|
||||||
|
{02,eof_char}, /* ^B = go to end of file */
|
||||||
|
{22,Ins_char}, /* ^V = Insert/Xchg Toggle */
|
||||||
|
{07,Del_char}, /* ^G = delete a char */
|
||||||
|
{01,NextWord_char}, /* ^A = prev word */
|
||||||
|
{06,PrevWord_char}, /* ^F = next word */
|
||||||
|
{0,0}};
|
||||||
|
|
||||||
|
/* cmdxlat defines alternate command codes that can be used when SEE
|
||||||
|
is not in insert or exchange mode. */
|
||||||
|
|
||||||
|
struct {char inkey,means; } cmdxlat[]={
|
||||||
|
{'@',up_char}, /* @ = up */
|
||||||
|
{';',down_char}, /* ; = down */
|
||||||
|
{',',left_char}, /* , = left */
|
||||||
|
{'.',right_char}, /* . = right */
|
||||||
|
{':',bol_char}, /* : = go to beginning of line */
|
||||||
|
{']',eol_char}, /* ] = go to end of line */
|
||||||
|
{'[',pageup_char}, /* [ = page up */
|
||||||
|
{'_',pagedown_char},/* _ = page down */
|
||||||
|
{0,0}};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CI -- Input a character and translate function keys. */
|
||||||
|
|
||||||
|
scr_ci() {
|
||||||
|
char chr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
chr=ci(); /* get next character */
|
||||||
|
for (i=0; keyxlat[i].inkey; i++)
|
||||||
|
if (chr == keyxlat[i].inkey) {
|
||||||
|
chr=keyxlat[i].means;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!see_mode) { /* if not in exchange or insert mode, accept alternate
|
||||||
|
command codes. */
|
||||||
|
|
||||||
|
for (i=0; cmdxlat[i].inkey; i++)
|
||||||
|
if (chr == cmdxlat[i].inkey) {
|
||||||
|
chr=cmdxlat[i].means;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------- ZENITH Z-100 ------------------------- */
|
||||||
|
|
||||||
|
#if Z100
|
||||||
|
/* Z100 Configuration for SEE editor.
|
||||||
|
|
||||||
|
|
||||||
|
The input control characters are:
|
||||||
|
|
||||||
|
Keypad 8 = up
|
||||||
|
Keypad 2 = down
|
||||||
|
Keypad 4 = left
|
||||||
|
Keypad 6 = right
|
||||||
|
Keypad 7 = go to beginning of line
|
||||||
|
Keypad 1 = go to end of line
|
||||||
|
Keypad 9 = page up
|
||||||
|
Keypad 6 = page down
|
||||||
|
Shift Keypad 7 = go to top of file
|
||||||
|
Shift Keypad 1 = go to end of file
|
||||||
|
Keypad 0 = Insert/Xchg Toggle
|
||||||
|
Keypad . = delete a char
|
||||||
|
Shift Keypad 4 = prev word
|
||||||
|
Shift Keypad 6 = next word
|
||||||
|
Up Arrow = up
|
||||||
|
Down Arrow = down
|
||||||
|
Left Arrow = left
|
||||||
|
Right Arrow = right
|
||||||
|
DELETE Key = delete a char
|
||||||
|
I CHR Key = Insert/Xchg Toggle
|
||||||
|
HOME Key = go to beginning of line
|
||||||
|
ENTER Key = ESCAPE
|
||||||
|
F1 - F10 = Macro Keys
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: No alternate command codes are used.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SCR_CLR "\\eE"
|
||||||
|
#define SCR_CLRL "\\eK"
|
||||||
|
#define SCR_CLS "\\eJ"
|
||||||
|
#define SCR_CURSOFF "\\ex5"
|
||||||
|
#define SCR_CURSON "\\ey5"
|
||||||
|
#define SCR_ROWCOL "\\eY%c%c", row + 0x20, col + 0x20
|
||||||
|
#define SCR_SCDN "\\eL"
|
||||||
|
#define SCR_SCUP "\\eM"
|
||||||
|
#define SCR_SETUP1 "\\ey?"
|
||||||
|
#define SCR_SETUP2 "\\ey@"
|
||||||
|
#define SCR_SETUP3 "\\ey1"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct {char inkey,means; } keyxlat[]={
|
||||||
|
{0xB8,up_char}, /* Keypad 8 = up */
|
||||||
|
{0xB2,down_char}, /* Keypad 2 = down */
|
||||||
|
{0xB4,left_char}, /* Keypad 4 = left */
|
||||||
|
{0xB6,right_char}, /* Keypad 6 = right */
|
||||||
|
{0xB7,bol_char}, /* Keypad 7 = go to beginning of line */
|
||||||
|
{0xB1,eol_char}, /* Keypad 1 = go to end of line */
|
||||||
|
{0xB9,pageup_char}, /* Keypad 9 = page up */
|
||||||
|
{0xB3,pagedown_char}, /* Keypad 3 = page down */
|
||||||
|
{0xF7,bof_char}, /* Shift Keypad 7 = go to top of file */
|
||||||
|
{0xF1,eof_char}, /* Shift Keypad 1 = go to end of file */
|
||||||
|
{0xB0,Ins_char}, /* Keypad 0 = Insert/Xchg Toggle */
|
||||||
|
{0xAE,Del_char}, /* Keypad . = delete a char */
|
||||||
|
{0xF6,NextWord_char}, /* Shift Keypad 6 = next word */
|
||||||
|
{0xF4,PrevWord_char}, /* Shift Keypad 4 = prev word */
|
||||||
|
{0xA5,up_char}, /* Up Arrow = up */
|
||||||
|
{0xA6,down_char}, /* Down Arrow = down */
|
||||||
|
{0xA8,left_char}, /* Left Arrow = left */
|
||||||
|
{0xA7,right_char}, /* Right Arrow = right */
|
||||||
|
{0xA3,Ins_char}, /* I CHR Key = Insert/Xchg Toggle */
|
||||||
|
{0x7F,Del_char}, /* DELETE Key = delete a char */
|
||||||
|
{0x8D,ESC}, /* ENTER Key = ESCAPE */
|
||||||
|
{0xA9,bol_char}, /* HOME Key = go to beginning of line */
|
||||||
|
{0x97,F1}, /* F1 = Macro # 1 */
|
||||||
|
{0x98,F2}, /* F2 = Macro # 2 */
|
||||||
|
{0x99,F3}, /* F3 = Macro # 3 */
|
||||||
|
{0x9A,F4}, /* F4 = Macro # 4 */
|
||||||
|
{0x9B,F5}, /* F5 = Macro # 5 */
|
||||||
|
{0x9C,F6}, /* F6 = Macro # 6 */
|
||||||
|
{0x9D,F7}, /* F7 = Macro # 7 */
|
||||||
|
{0x9E,F8}, /* F8 = Macro # 8 */
|
||||||
|
{0x9F,F9}, /* F9 = Macro # 9 */
|
||||||
|
{0xA0,F10}, /* F10 = Macro # 10 */
|
||||||
|
{0,0}};
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CI -- Input a character and translate function keys. */
|
||||||
|
|
||||||
|
scr_ci()
|
||||||
|
{
|
||||||
|
char chr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
chr=ci(); /* get next character */
|
||||||
|
for (i=0; keyxlat[i].inkey; i++)
|
||||||
|
if (chr == keyxlat[i].inkey)
|
||||||
|
chr = keyxlat[i].means;
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CURSOFF -- Turn Cursor Off */
|
||||||
|
|
||||||
|
scr_cursoff() {
|
||||||
|
|
||||||
|
scr_putf(SCR_CURSOFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CURSON -- Turn Cursor On */
|
||||||
|
|
||||||
|
scr_curson() {
|
||||||
|
|
||||||
|
scr_putf(SCR_CURSON);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*SCR_ROWCOL -- Move cursor to selected position. The top left corner of
|
||||||
|
the screen is (0,0) */
|
||||||
|
|
||||||
|
scr_rowcol(row,col)
|
||||||
|
char row,col; {
|
||||||
|
|
||||||
|
scr_putf(SCR_ROWCOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CLR -- Clear screen. */
|
||||||
|
|
||||||
|
scr_clr() {
|
||||||
|
|
||||||
|
scr_putf(SCR_CLR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CLRL -- Clear rest of line. */
|
||||||
|
|
||||||
|
scr_clrl() {
|
||||||
|
|
||||||
|
scr_putf(SCR_CLRL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CLS -- Clear rest of screen. */
|
||||||
|
|
||||||
|
scr_cls() {
|
||||||
|
|
||||||
|
scr_putf(SCR_CLS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_SCUP -- Scroll the screen up.
|
||||||
|
if scr_scrollup is true, the top two lines of the
|
||||||
|
screen must be preserved. */
|
||||||
|
|
||||||
|
|
||||||
|
scr_scup() {
|
||||||
|
|
||||||
|
scr_rowcol(scr_window_top,0); /* go to start of window */
|
||||||
|
scr_putf(SCR_SCUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_SCDN -- Scroll the screen down.
|
||||||
|
If scr_scrolldown is true, this routine is not called. */
|
||||||
|
|
||||||
|
scr_scdn() {
|
||||||
|
|
||||||
|
scr_rowcol(2,0); /* go to start of third line. */
|
||||||
|
scr_putf(SCR_SCDN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_CO -- Output a character. */
|
||||||
|
|
||||||
|
scr_co(chr)
|
||||||
|
char chr; {
|
||||||
|
|
||||||
|
co(chr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SCR_CSTS -- return a non-zero value if key ready. */
|
||||||
|
|
||||||
|
scr_csts() {
|
||||||
|
|
||||||
|
if (csts()) return scr_ci();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_SETUP -- called first to do any required initilization. */
|
||||||
|
|
||||||
|
scr_setup() {
|
||||||
|
|
||||||
|
#if Z100
|
||||||
|
|
||||||
|
scr_putf(SCR_SETUP1);
|
||||||
|
scr_putf(SCR_SETUP2);
|
||||||
|
scr_putf(SCR_SETUP3);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_TERM -- called last to do any required termination. */
|
||||||
|
|
||||||
|
scr_term() { ; }
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_MARK -- mark the current character fot the block and delete
|
||||||
|
command.
|
||||||
|
usage: scr_mark(current char); */
|
||||||
|
|
||||||
|
scr_mark(chr)
|
||||||
|
char chr; {
|
||||||
|
scr_co('X');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_SET_CURSOR -- set physical cursor to logical cursor. does
|
||||||
|
nothing on a normal character but must reset
|
||||||
|
physical cursor on a memory mapped terminal
|
||||||
|
like the PC. */
|
||||||
|
|
||||||
|
scr_set_cursor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* SCR_PUTF -- write a formatted string to the display
|
||||||
|
*
|
||||||
|
* In general scr_putf(cp, cv) outputs the char's pointed to
|
||||||
|
* by cp, with the following exceptions:
|
||||||
|
*
|
||||||
|
* "\e" is translated to ESC
|
||||||
|
*
|
||||||
|
* "%c" selects the next char value, cv, a la printf().
|
||||||
|
*
|
||||||
|
* Thus scr_putf("\\eY%c;%cH", row + 32, col + 32);
|
||||||
|
* will write 'ESC','Y','!',';','4','H'
|
||||||
|
* for row == 1 amd col == 20
|
||||||
|
*
|
||||||
|
* Note that if the string ends with a '\' or a '%', the
|
||||||
|
* routine will continue outputing until it finds a NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
static scr_putf(cp, cv)
|
||||||
|
char *cp;
|
||||||
|
int cv;
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
int *cvp;
|
||||||
|
|
||||||
|
cvp = &cv;
|
||||||
|
while(*cp)
|
||||||
|
switch(c = *cp++)
|
||||||
|
{
|
||||||
|
case '\\': co((c = *cp++) == 'e' ? ESC : c);
|
||||||
|
break;
|
||||||
|
case '%': co((c = *cp++) == 'c' ? *cvp++ : c);
|
||||||
|
break;
|
||||||
|
default: co(c);
|
||||||
|
}
|
||||||
|
}
|
BIN
DeSmet C88 v24/CSTDIO.S
Normal file
BIN
DeSmet C88 v24/CSTDIO.S
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/CSTDIO7.S
Normal file
BIN
DeSmet C88 v24/CSTDIO7.S
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/D88.EXE
Normal file
BIN
DeSmet C88 v24/D88.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/D88.O
Normal file
BIN
DeSmet C88 v24/D88.O
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/D88REST.O
Normal file
BIN
DeSmet C88 v24/D88REST.O
Normal file
Binary file not shown.
89
DeSmet C88 v24/DUMP.C
Normal file
89
DeSmet C88 v24/DUMP.C
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/* dump.c core style dump of a file */
|
||||||
|
|
||||||
|
/* usage: A>DUMP B:BLIP.O */
|
||||||
|
|
||||||
|
|
||||||
|
char buffer[4096];
|
||||||
|
|
||||||
|
main(argc,argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[]; {
|
||||||
|
unsigned i,numin,tot,file;
|
||||||
|
char *cfrom;
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
|
puts("Missing Filename\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
tot=0;
|
||||||
|
if ((file=open(argv[1],0)) == -1) {
|
||||||
|
puts("Cannot Open ");
|
||||||
|
puts(argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read and dump 4k at a time */
|
||||||
|
|
||||||
|
do {
|
||||||
|
numin=read(file,buffer,4096);
|
||||||
|
if (numin == -1) {
|
||||||
|
puts("Cannot Read ");
|
||||||
|
puts(argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
cfrom=0;
|
||||||
|
while (cfrom < numin) {
|
||||||
|
|
||||||
|
/* print the offset in hex */
|
||||||
|
|
||||||
|
ohw(cfrom+tot);
|
||||||
|
putchar(' ');
|
||||||
|
|
||||||
|
/* print 16 bytes in hex */
|
||||||
|
|
||||||
|
for (i=0; i < 16; i++) {
|
||||||
|
putchar(' ');
|
||||||
|
ohb(buffer[cfrom++]);
|
||||||
|
}
|
||||||
|
cfrom-=16;
|
||||||
|
puts(" *");
|
||||||
|
|
||||||
|
/* print the bytes in ascii */
|
||||||
|
|
||||||
|
for (i=0; i < 16; i++) {
|
||||||
|
putchar((buffer[cfrom] >= ' ' && buffer[cfrom] < 0x7f)
|
||||||
|
? buffer[cfrom]: '.');
|
||||||
|
cfrom++;
|
||||||
|
}
|
||||||
|
puts("*\n");
|
||||||
|
}
|
||||||
|
tot+=numin;
|
||||||
|
}
|
||||||
|
while (numin == 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print a word in hex */
|
||||||
|
|
||||||
|
ohw(wrd)
|
||||||
|
unsigned wrd; {
|
||||||
|
ohb(wrd>>8);
|
||||||
|
ohb(wrd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print a byte in hex */
|
||||||
|
|
||||||
|
ohb(byt)
|
||||||
|
char byt; {
|
||||||
|
onib(byt>>4);
|
||||||
|
onib(byt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print a nibble as a hex character */
|
||||||
|
|
||||||
|
onib(nib)
|
||||||
|
char nib; {
|
||||||
|
|
||||||
|
nib&=15;
|
||||||
|
putchar((nib >= 10) ? nib-10+'A': nib+'0');
|
||||||
|
}
|
||||||
|
|
BIN
DeSmet C88 v24/DUMP.EXE
Normal file
BIN
DeSmet C88 v24/DUMP.EXE
Normal file
Binary file not shown.
35
DeSmet C88 v24/E.C
Normal file
35
DeSmet C88 v24/E.C
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef MWC
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DIGITS_TO_FIND 200 /*9009*/
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
int N = DIGITS_TO_FIND;
|
||||||
|
int x = 0;
|
||||||
|
int a[ DIGITS_TO_FIND ];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = N - 1; n > 0; --n) {
|
||||||
|
a[n] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[1] = 2, a[0] = 0;
|
||||||
|
while (N > 9) {
|
||||||
|
n = N--;
|
||||||
|
while (--n) {
|
||||||
|
a[n] = x % n;
|
||||||
|
|
||||||
|
x = 10 * a[n-1] + x/n;
|
||||||
|
}
|
||||||
|
printf("%d", x);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf( "\ndone\n" );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
DeSmet C88 v24/EXEC.O
Normal file
BIN
DeSmet C88 v24/EXEC.O
Normal file
Binary file not shown.
139
DeSmet C88 v24/FLIP.A
Normal file
139
DeSmet C88 v24/FLIP.A
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
; FLIP.A -- code to flip the screen. This version for the PC.
|
||||||
|
|
||||||
|
VIDEO equ 10h
|
||||||
|
|
||||||
|
dseg
|
||||||
|
public flipok_
|
||||||
|
flipok_ db 1 ;flag to say flip is supported
|
||||||
|
|
||||||
|
screen_save dw 0
|
||||||
|
screen_at dw 0
|
||||||
|
screen_len dw 0
|
||||||
|
curmode db 0
|
||||||
|
curpage db 0
|
||||||
|
curloc dw 0
|
||||||
|
addr_6845 dw 3D4H
|
||||||
|
|
||||||
|
|
||||||
|
cseg
|
||||||
|
public scr_clr_
|
||||||
|
|
||||||
|
; FLIPINIT -- initilize for flipping the screen.
|
||||||
|
; paragraphs needed for screen image = flipinit();
|
||||||
|
|
||||||
|
public flipinit_
|
||||||
|
flipinit_:
|
||||||
|
push bp
|
||||||
|
mov screen_save,ds
|
||||||
|
mov ah,15
|
||||||
|
int VIDEO
|
||||||
|
cmp al,7 ;monocrome ?
|
||||||
|
jz monoinit
|
||||||
|
mov screen_at,0b800h ;16k screen at b800
|
||||||
|
mov screen_len,1024*8
|
||||||
|
mov ax,1024 ;paragraphs needed to save
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
monoinit:
|
||||||
|
mov addr_6845,03b4h ;base of 6845
|
||||||
|
mov screen_at,0b000h ;4k screen at b000
|
||||||
|
mov screen_len,1024*2
|
||||||
|
mov ax,256 ;paras needed to save
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SAVE -- save the screen. use screen_at.
|
||||||
|
|
||||||
|
public scr_save_
|
||||||
|
scr_save_:
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov ah,15
|
||||||
|
int VIDEO
|
||||||
|
mov curmode,al
|
||||||
|
mov curpage,bh
|
||||||
|
mov ah,3
|
||||||
|
int VIDEO
|
||||||
|
mov curloc,dx
|
||||||
|
|
||||||
|
call disable_video
|
||||||
|
push ds
|
||||||
|
mov es,screen_save ;save the screen
|
||||||
|
mov cx,screen_len
|
||||||
|
mov ds,screen_at ;from here
|
||||||
|
xor si,si
|
||||||
|
mov di,si
|
||||||
|
cld
|
||||||
|
rep movsw
|
||||||
|
pop ds
|
||||||
|
call enable_video
|
||||||
|
mov al,curmode
|
||||||
|
cmp al,7 ;dont set monocrome mode
|
||||||
|
jz clear_only
|
||||||
|
cmp al,3
|
||||||
|
jz clear_only
|
||||||
|
mov ah,0
|
||||||
|
mov al,3
|
||||||
|
int VIDEO
|
||||||
|
jmp saved
|
||||||
|
clear_only:
|
||||||
|
call scr_clr_
|
||||||
|
saved: pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_REST -- restore the screen. use screen_at.
|
||||||
|
|
||||||
|
public scr_rest_
|
||||||
|
scr_rest_:
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov al,curmode
|
||||||
|
cmp al,7
|
||||||
|
jz dorest
|
||||||
|
mov ah,0
|
||||||
|
int VIDEO ;restore the mode
|
||||||
|
dorest:
|
||||||
|
call disable_video
|
||||||
|
push ds
|
||||||
|
mov es,screen_at ;restore the screen
|
||||||
|
mov cx,screen_len
|
||||||
|
mov ds,screen_save ;to here
|
||||||
|
xor si,si
|
||||||
|
mov di,si
|
||||||
|
cld
|
||||||
|
rep movsw
|
||||||
|
pop ds
|
||||||
|
call enable_video
|
||||||
|
mov ah,5
|
||||||
|
mov al,curpage
|
||||||
|
int VIDEO
|
||||||
|
mov ah,2
|
||||||
|
mov bh,curpage
|
||||||
|
mov dx,curloc
|
||||||
|
int VIDEO
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
disable_video: ; turn the screen refresh off
|
||||||
|
mov dx,addr_6845
|
||||||
|
add dx,4
|
||||||
|
mov al,25H
|
||||||
|
out dx,al ; disable video
|
||||||
|
ret
|
||||||
|
|
||||||
|
enable_video: ; set crt mode
|
||||||
|
mov dx,addr_6845
|
||||||
|
add dx,4
|
||||||
|
mov bx,40H
|
||||||
|
mov es,bx
|
||||||
|
mov al,es:[65H] ; crt_mode_set
|
||||||
|
out dx,al ; restore video
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
BIN
DeSmet C88 v24/FLIP.O
Normal file
BIN
DeSmet C88 v24/FLIP.O
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/GEN.EXE
Normal file
BIN
DeSmet C88 v24/GEN.EXE
Normal file
Binary file not shown.
72
DeSmet C88 v24/LATER.C
Normal file
72
DeSmet C88 v24/LATER.C
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* LATER.C -- Exit with a 1 if any file has a higher create
|
||||||
|
date than the last or if the last file does not exist.
|
||||||
|
A 2 is returned if any other files do not exist.
|
||||||
|
Later only works on MS-DOS V2.0.
|
||||||
|
|
||||||
|
A>LATER FILE1.C FILE1.O
|
||||||
|
Later will set completion code to 1 if FILE1.C was
|
||||||
|
created after FILE1.O.
|
||||||
|
|
||||||
|
A>LATER FILE1.C FILE1.H FILE1.O
|
||||||
|
Later will set completion code to 1 if FILE1.C or
|
||||||
|
FILE1.H was created after FILE1.O. */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main(argc,argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[]; {
|
||||||
|
|
||||||
|
unsigned ifile,ofile,i;
|
||||||
|
long odate,dateof();
|
||||||
|
|
||||||
|
puts("LATER V1.0 ");
|
||||||
|
|
||||||
|
if (argc < 3 ) {
|
||||||
|
puts("need two or more arguments");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ofile=open(argv[argc-1],0)) == -1)
|
||||||
|
exit(1); /* the last file does not exist */
|
||||||
|
|
||||||
|
odate=dateof(ofile);
|
||||||
|
close(ofile);
|
||||||
|
|
||||||
|
/* for each file see if it is later than the last one */
|
||||||
|
|
||||||
|
for (i=1; i < argc-1; i++) {
|
||||||
|
if ((ifile=open(argv[i],0)) == -1) {
|
||||||
|
puts(argv[i]);
|
||||||
|
puts(" does not exist");
|
||||||
|
exit(2); /* an early file does not exist */
|
||||||
|
}
|
||||||
|
if (dateof(ifile) > odate) exit(1); /* found a later file */
|
||||||
|
close(ifile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* none of the files are later. set completion code of zero */
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* return a long encoding the date and time of a file */
|
||||||
|
|
||||||
|
long dateof(fil)
|
||||||
|
int fil; {
|
||||||
|
static long ret_dt;
|
||||||
|
|
||||||
|
#asm
|
||||||
|
mov bx,[bp+4] ;file handle is here. only argument.
|
||||||
|
and bx,0ffh ;low byte of file id is MS-DOS handle.
|
||||||
|
mov al,0 ;code to retrieve date and time.
|
||||||
|
mov ah,57h ;dos code for get file date and time.
|
||||||
|
int 21h ;call dos.
|
||||||
|
mov word dateof_ret_dt_+2,dx;store date in high word of ret_dt.
|
||||||
|
mov word dateof_ret_dt_,cx ;store time in low word of ret_dt.
|
||||||
|
;note: "dateof_" is added to name
|
||||||
|
;because ret_dt is static.
|
||||||
|
#
|
||||||
|
return ret_dt;
|
||||||
|
}
|
BIN
DeSmet C88 v24/LIB88.EXE
Normal file
BIN
DeSmet C88 v24/LIB88.EXE
Normal file
Binary file not shown.
253
DeSmet C88 v24/LIFE.C
Normal file
253
DeSmet C88 v24/LIFE.C
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
/* LIFE.C The much implemented game of Life invented by John Conway
|
||||||
|
|
||||||
|
This version was written to illustrate the use of the C88
|
||||||
|
screen and keyboard interface. Use C option for color display.
|
||||||
|
|
||||||
|
To generate:
|
||||||
|
A>C88 B:LIFE
|
||||||
|
A>ASM88 B:PCIO
|
||||||
|
A>BIND B:LIFE B:PCIO */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
global constant and data declarations
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ROWS 24
|
||||||
|
#define COLS 80
|
||||||
|
|
||||||
|
/* control key translations */
|
||||||
|
#define up_char 30
|
||||||
|
#define down_char 31
|
||||||
|
#define left_char 29
|
||||||
|
#define right_char 28
|
||||||
|
#define bol_char 200
|
||||||
|
#define eol_char 201
|
||||||
|
#define pageup_char 202
|
||||||
|
#define pagedown_char 203
|
||||||
|
#define bof_char 204
|
||||||
|
#define eof_char 205
|
||||||
|
#define Ins_char 206
|
||||||
|
#define Del_char 207
|
||||||
|
#define NextWord_char 208
|
||||||
|
#define PrevWord_char 209
|
||||||
|
|
||||||
|
/* function keys */
|
||||||
|
#define M1 210
|
||||||
|
#define M2 211
|
||||||
|
#define M3 212
|
||||||
|
#define M4 213
|
||||||
|
#define M5 214
|
||||||
|
#define M6 215
|
||||||
|
#define M7 216
|
||||||
|
#define M8 217
|
||||||
|
#define M9 218
|
||||||
|
#define M10 219
|
||||||
|
|
||||||
|
|
||||||
|
char world[ROWS][COLS],create_mode=1,quit_flag;
|
||||||
|
int population,generation,crow,ccol;
|
||||||
|
char color_opt,color;
|
||||||
|
|
||||||
|
main(argc,argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[]; {
|
||||||
|
|
||||||
|
if (argc > 1 && toupper(*argv[1]) == 'C') color_opt=1;
|
||||||
|
scr_setup();
|
||||||
|
scr_clr();
|
||||||
|
instruct();
|
||||||
|
setup();
|
||||||
|
|
||||||
|
do {
|
||||||
|
generation++;
|
||||||
|
cycle();
|
||||||
|
screen();
|
||||||
|
}
|
||||||
|
while (population && !quit_flag);
|
||||||
|
scr_rowcol(ROWS,10);
|
||||||
|
if (population == 0)
|
||||||
|
puts("Nobody left, sorry about that. ");
|
||||||
|
else puts("bye ");
|
||||||
|
scr_curson();
|
||||||
|
}
|
||||||
|
|
||||||
|
instruct() { /* print instructions */
|
||||||
|
|
||||||
|
puts(" The game of Life by John Conway\n\n");
|
||||||
|
puts(" Use LIFE C with color monitor.\n");
|
||||||
|
puts(" If started with a number, a random pattern starts the game.\n\n");
|
||||||
|
puts(" Otherwise, move the cursor with the four arrow keys to create life.\n\n");
|
||||||
|
puts(" DEL changes cursor movement to mean that cells are deleted\n\n");
|
||||||
|
puts(" INS flips back to create mode.\n\n");
|
||||||
|
puts(" The '+' key will toggle the game on or off.\n\n");
|
||||||
|
puts(" Hit ESC to bail out.\n\n");
|
||||||
|
puts(" Enter starting number of cells or hit CR ");
|
||||||
|
}
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
int rnumber;
|
||||||
|
int i,row,col,seed,rnum;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
rnumber=0;
|
||||||
|
while (1) {
|
||||||
|
while ((ch=scr_csts()) == 0) seed++;
|
||||||
|
if (ch < '0' || ch > '9') break;
|
||||||
|
scr_co(ch);
|
||||||
|
rnumber*=10;
|
||||||
|
rnumber+=ch-'0';
|
||||||
|
}
|
||||||
|
scr_cursoff();
|
||||||
|
scr_clr();
|
||||||
|
scr_rowcol(ROWS,20); /* print population message */
|
||||||
|
puts("Generation 0 Population 0");
|
||||||
|
|
||||||
|
srand(seed); /* initilize random number generator */
|
||||||
|
|
||||||
|
for (i=0; i < rnumber; i++) {
|
||||||
|
rnum=rand();
|
||||||
|
row=rnum%ROWS;
|
||||||
|
col=(rnum/ROWS)%COLS;
|
||||||
|
world[row][col]='X'; /* put in a cell */
|
||||||
|
scr_rowcol(row,col);
|
||||||
|
if (color_opt) scr_aputs("\2",++color | 0X80);
|
||||||
|
else scr_co(2);
|
||||||
|
}
|
||||||
|
if (rnumber == 0) create(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
screen() { /* update the screen and set world back to x's */
|
||||||
|
int row,col;
|
||||||
|
char cell;
|
||||||
|
|
||||||
|
population=0;
|
||||||
|
for (row=0; row < ROWS; row++) {
|
||||||
|
for (col=0; col < COLS; col++) {
|
||||||
|
cell=world[row][col];
|
||||||
|
/* stay alive if 3 neighbors, born if next to 2 or 3 */
|
||||||
|
|
||||||
|
if (cell && (cell == 3 || cell == 'X'+2 || cell == 'X'+3)) {
|
||||||
|
population++;
|
||||||
|
if (cell < 'X') {
|
||||||
|
scr_rowcol(row,col);
|
||||||
|
if (color_opt) scr_aputs("\2",++color | 0X80);
|
||||||
|
else scr_co(2);
|
||||||
|
}
|
||||||
|
cell='X';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (cell >= 'X') {
|
||||||
|
scr_rowcol(row,col);
|
||||||
|
scr_co(' ');
|
||||||
|
}
|
||||||
|
cell=0;
|
||||||
|
}
|
||||||
|
world[row][col]=cell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scr_rowcol(ROWS,31);
|
||||||
|
printf("%4d",generation);
|
||||||
|
scr_rowcol(ROWS,51);
|
||||||
|
printf("%4d",population);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
create(suspend) /* see if need to create or kill cells */
|
||||||
|
char suspend; {
|
||||||
|
char ch,wait;
|
||||||
|
|
||||||
|
while ((ch=scr_csts()) || suspend) {
|
||||||
|
switch (ch) {
|
||||||
|
case up_char: crow=crow ? crow-1: ROWS-1;
|
||||||
|
break;
|
||||||
|
case down_char: crow=crow == ROWS-1 ? 0: crow+1;
|
||||||
|
break;
|
||||||
|
case left_char: ccol=ccol ? ccol-1: COLS-1;
|
||||||
|
break;
|
||||||
|
case right_char:ccol=ccol == COLS-1 ? 0: ccol+1;
|
||||||
|
break;
|
||||||
|
case bol_char: ccol=0;
|
||||||
|
break;
|
||||||
|
case eol_char: ccol=COLS-1;
|
||||||
|
break;
|
||||||
|
case '+': suspend=!suspend;
|
||||||
|
continue;
|
||||||
|
case Ins_char: create_mode=1;
|
||||||
|
continue;
|
||||||
|
case Del_char: create_mode=0;
|
||||||
|
continue;
|
||||||
|
case 0x1b: quit_flag=1; /* flag for stop */
|
||||||
|
return;
|
||||||
|
default: continue;
|
||||||
|
}
|
||||||
|
world[crow][ccol]= create_mode ? 'X': 0;
|
||||||
|
scr_rowcol(crow,ccol);
|
||||||
|
if (create_mode) {
|
||||||
|
if (color_opt) scr_aputs("\2",++color | 0X80);
|
||||||
|
else scr_co(2);
|
||||||
|
population++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wait=30;
|
||||||
|
while (wait--) {
|
||||||
|
if (color_opt) scr_aputs("\1",++color | 0X80);
|
||||||
|
else scr_co(1);
|
||||||
|
scr_rowcol(crow,ccol);
|
||||||
|
}
|
||||||
|
scr_co(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cycle() { /* cycle to the next generation */
|
||||||
|
int row,col;
|
||||||
|
|
||||||
|
create(0);
|
||||||
|
/* take care of left and right column first */
|
||||||
|
for (row=0; row < ROWS; row++) {
|
||||||
|
if (world[row][0] >= 'X') add8(row,0);
|
||||||
|
if (world[row][COLS-1] >= 'X') add8(row,COLS-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* take care of top and bottom line */
|
||||||
|
for (col=1; col < COLS-1;col++) {
|
||||||
|
if (world[0][col] >= 'X') add8(0,col);
|
||||||
|
if (world[ROWS-1][col] >= 'X') add8(ROWS-1,col);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in the box, ignoring border conditions */
|
||||||
|
for (row=1; row < ROWS-1; row++) {
|
||||||
|
for (col=1; col < COLS-1; col++) {
|
||||||
|
if (world[row][col] >= 'X' ) {
|
||||||
|
world[row-1][col-1]++;
|
||||||
|
world[row-1][col]++;
|
||||||
|
world[row-1][col+1]++;
|
||||||
|
world[row][col-1]++;
|
||||||
|
world[row][col+1]++;
|
||||||
|
world[row+1][col-1]++;
|
||||||
|
world[row+1][col]++;
|
||||||
|
world[row+1][col+1]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
add8(row,col)
|
||||||
|
int row,col; {
|
||||||
|
int rrow,ccol,rr,cc;
|
||||||
|
|
||||||
|
for (rr=row-1; rr <= row+1; rr++) {
|
||||||
|
for (cc=col-1; cc <= col+1; cc++) {
|
||||||
|
rrow=rr != -1 ? rr : ROWS-1;
|
||||||
|
ccol=cc != -1 ? cc : COLS-1;
|
||||||
|
if (rrow >= ROWS) rrow=0;
|
||||||
|
if (ccol >= COLS) ccol=0;
|
||||||
|
world[rrow][ccol]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
world[row][col]--;
|
||||||
|
}
|
||||||
|
|
BIN
DeSmet C88 v24/LIFE.EXE
Normal file
BIN
DeSmet C88 v24/LIFE.EXE
Normal file
Binary file not shown.
7
DeSmet C88 v24/MATH.H
Normal file
7
DeSmet C88 v24/MATH.H
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
extern int errno;
|
||||||
|
#define EDOM 33
|
||||||
|
#define ERANGE 34
|
||||||
|
|
||||||
|
extern int errno;extern double sqrt(), sin(), cos(), tan(), cot(), asin(), acos(), atan(), atan2();
|
||||||
|
extern double exp(), exp10(), log(), log10(), pow(), fabs(), frand();
|
||||||
|
extern double floor(), ceil(), ldexp(), frexp(), modf();
|
122
DeSmet C88 v24/MM.C
Normal file
122
DeSmet C88 v24/MM.C
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/* BYTE magazine October 1982. Jerry Pournelle. */
|
||||||
|
/* ported to C by David Lee */
|
||||||
|
/* various bugs not found because dimensions are square fixed by David Lee */
|
||||||
|
/* expected result: 4.65880E+05 */
|
||||||
|
/* normal version runs in 13 seconds on the original PC and 8.9 seconds with the "f/fast" versions */
|
||||||
|
|
||||||
|
#define LINT_ARGS
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define l 20 /* rows in A and resulting matrix C */
|
||||||
|
#define m 20 /* columns in A and rows in B (must be identical) */
|
||||||
|
#define n 20 /* columns in B and resulting matrix C */
|
||||||
|
|
||||||
|
#define ftype float
|
||||||
|
|
||||||
|
ftype Summ;
|
||||||
|
ftype A[ l ] [ m ];
|
||||||
|
ftype B[ m ] [ n ];
|
||||||
|
ftype C[ l ] [ n ];
|
||||||
|
|
||||||
|
void filla()
|
||||||
|
{
|
||||||
|
register int i, j;
|
||||||
|
for ( i = 0; i < l; i++ )
|
||||||
|
for ( j = 0; j < m; j++ )
|
||||||
|
A[ i ][ j ] = i + j + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillb()
|
||||||
|
{
|
||||||
|
register int i, j;
|
||||||
|
for ( i = 0; i < m; i++ )
|
||||||
|
for ( j = 0; j < n; j++ )
|
||||||
|
B[ i ][ j ] = (ftype) ( ( i + j + 2 ) / ( j + 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillc()
|
||||||
|
{
|
||||||
|
register int i, j;
|
||||||
|
for ( i = 0; i < l; i++ )
|
||||||
|
for ( j = 0; j < n; j++ )
|
||||||
|
C[ i ][ j ] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffillc()
|
||||||
|
{
|
||||||
|
ftype * p = (ftype *) C;
|
||||||
|
ftype * pend = ( (ftype *) C ) + ( l * n );
|
||||||
|
|
||||||
|
while ( p < pend )
|
||||||
|
*p++ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matmult()
|
||||||
|
{
|
||||||
|
register int i, j, k;
|
||||||
|
for ( i = 0; i < l; i++ )
|
||||||
|
for ( j = 0; j < n; j++ )
|
||||||
|
for ( k = 0; k < m; k++ )
|
||||||
|
C[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
void fmatmult()
|
||||||
|
{
|
||||||
|
static int i, j, k;
|
||||||
|
static ftype * pC, * pA, * pAI, * pBJ, *pCI;
|
||||||
|
|
||||||
|
for ( i = 0; i < l; i++ )
|
||||||
|
{
|
||||||
|
pAI = (ftype *) & ( A[ i ][ 0 ] );
|
||||||
|
pCI = (ftype *) & ( C[ i ][ 0 ] );
|
||||||
|
|
||||||
|
for ( j = 0; j < n; j++ )
|
||||||
|
{
|
||||||
|
pC = (ftype *) & pCI[ j ];
|
||||||
|
pA = pAI;
|
||||||
|
pBJ = & ( B[ 0 ][ j ] );
|
||||||
|
|
||||||
|
for ( k = 0; k < m; k++ )
|
||||||
|
{
|
||||||
|
*pC += pA[ k ] * ( *pBJ );
|
||||||
|
pBJ += m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void summit()
|
||||||
|
{
|
||||||
|
register int i, j;
|
||||||
|
for ( i = 0; i < l; i++ )
|
||||||
|
for ( j = 0; j < n; j++ )
|
||||||
|
Summ += C[ i ][ j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
void fsummit()
|
||||||
|
{
|
||||||
|
ftype * p = (ftype *) C;
|
||||||
|
ftype * pend = ( (ftype *) C ) + ( l * n );
|
||||||
|
|
||||||
|
while ( p < pend )
|
||||||
|
Summ += *p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( argc, argv ) int argc; char * argv[];
|
||||||
|
{
|
||||||
|
Summ = 0;
|
||||||
|
|
||||||
|
filla();
|
||||||
|
fillb();
|
||||||
|
ffillc();
|
||||||
|
|
||||||
|
fmatmult();
|
||||||
|
fsummit();
|
||||||
|
|
||||||
|
printf( "summ is : %f\n", Summ );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/MSDOS.BAT
Normal file
3
DeSmet C88 v24/MSDOS.BAT
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
c88 config
|
||||||
|
bind see config
|
||||||
|
bind d88 d88rest config
|
575
DeSmet C88 v24/PCIO.A
Normal file
575
DeSmet C88 v24/PCIO.A
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
; PCIO.A -- Screen and keyboard interface routines for the PC
|
||||||
|
|
||||||
|
|
||||||
|
dseg
|
||||||
|
; In this implementation, all special and function keys are translated
|
||||||
|
; to the following values.
|
||||||
|
|
||||||
|
;/* control key translations */
|
||||||
|
up_char equ 30
|
||||||
|
down_char equ 31
|
||||||
|
left_char equ 29
|
||||||
|
right_char equ 28
|
||||||
|
bol_char equ 200
|
||||||
|
eol_char equ 201
|
||||||
|
pageup_char equ 202
|
||||||
|
pagedown_char equ 203
|
||||||
|
bof_char equ 204
|
||||||
|
eof_char equ 205
|
||||||
|
Ins_char equ 206
|
||||||
|
Del_char equ 207
|
||||||
|
NextWord_char equ 208
|
||||||
|
PrevWord_char equ 209
|
||||||
|
|
||||||
|
M1 equ 210
|
||||||
|
M2 equ 211
|
||||||
|
M3 equ 212
|
||||||
|
M4 equ 213
|
||||||
|
M5 equ 214
|
||||||
|
M6 equ 215
|
||||||
|
M7 equ 216
|
||||||
|
M8 equ 217
|
||||||
|
M9 equ 218
|
||||||
|
M10 equ 219
|
||||||
|
; the table that is used to make the translation
|
||||||
|
|
||||||
|
convert:
|
||||||
|
db 72, up_char
|
||||||
|
db 80, down_char
|
||||||
|
db 75, left_char
|
||||||
|
db 77, right_char
|
||||||
|
db 71, bol_char
|
||||||
|
db 79, eol_char
|
||||||
|
db 73, pageup_char
|
||||||
|
db 81, pagedown_char
|
||||||
|
db 77H, bof_char
|
||||||
|
db 75H, eof_char
|
||||||
|
db 82, Ins_char
|
||||||
|
db 83, Del_char
|
||||||
|
db 115, PrevWord_char
|
||||||
|
db 116, NextWord_char
|
||||||
|
db 59, M1
|
||||||
|
db 60, M2
|
||||||
|
db 61, M3
|
||||||
|
db 62, M4
|
||||||
|
db 63, M5
|
||||||
|
db 64, M6
|
||||||
|
db 65, M7
|
||||||
|
db 66, M8
|
||||||
|
db 67, M9
|
||||||
|
db 68, M10
|
||||||
|
db 0, 255 ; illegal character
|
||||||
|
|
||||||
|
; equates for bios interface.
|
||||||
|
|
||||||
|
; the interrupt and codes for the screen interface interrupt.
|
||||||
|
|
||||||
|
video equ 10h ;interrupt for dealing with screen
|
||||||
|
|
||||||
|
mode equ 0 ;code for setting new screen mode
|
||||||
|
curtype equ 1 ;code for setting new cursor type
|
||||||
|
setcur equ 2 ;code for addressing cursor
|
||||||
|
readcur equ 3 ;code for reading cursor location
|
||||||
|
readlp equ 4 ;code for reading light pen position
|
||||||
|
setpage equ 5 ;code to select active page
|
||||||
|
scrollup equ 6 ;code to scroll screen up
|
||||||
|
scrolldn equ 7 ;code to scroll screen nown
|
||||||
|
readch equ 8 ;code to read a character from screen
|
||||||
|
writeach equ 9 ;code to write char and attributes
|
||||||
|
writech equ 10 ;code to write character only
|
||||||
|
setpal equ 11 ;code to set new setpal or border
|
||||||
|
wdot equ 12 ;code to write a dot
|
||||||
|
rdot equ 13 ;code to read a dot
|
||||||
|
wtty equ 14 ;code to write as if teletype
|
||||||
|
state equ 15 ;code to find current screen status
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; the interrupt and codes for the keyboard interface.
|
||||||
|
|
||||||
|
keyboard equ 16h ;interrupt 16 to deal with keyboard
|
||||||
|
|
||||||
|
cicode equ 0 ;code for reading a character
|
||||||
|
cstscode equ 1 ;code for keyboard status
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; caution: must change column number if 40 column mode
|
||||||
|
|
||||||
|
crt_cols equ 80
|
||||||
|
|
||||||
|
; variables available to a C88 program
|
||||||
|
|
||||||
|
public scr_cols_, scr_rows_, scr_scrollup_, scr_scrolldown_
|
||||||
|
public scr_mode_,scr_page_,scr_attr_,scr_window_top_
|
||||||
|
|
||||||
|
scr_cols_: dw crt_cols ;current number of columns
|
||||||
|
|
||||||
|
; note- make 25 for ms-dos and 24 for cp/m as cp/m steals the bottom
|
||||||
|
; line.
|
||||||
|
scr_rows_: dw 25 ;current number of rows
|
||||||
|
scr_mode_ db 0 ;current screen mode
|
||||||
|
scr_page_ db 0 ;current page
|
||||||
|
scr_attr_ db 7 ;current attributes for screen
|
||||||
|
;7 is white letters on black
|
||||||
|
scr_window_top_ db 2 ;first line to scroll
|
||||||
|
|
||||||
|
; variables needed by SEE. Not used here.
|
||||||
|
scr_scrollup_: db 0 ;zero if scrollup leaves top line alone
|
||||||
|
scr_scrolldown_:db 0 ;zero if scroll down supported
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cseg
|
||||||
|
|
||||||
|
; SCR_SETUP_ scr_setup must be called before any use of any
|
||||||
|
; other routine unless the starting mode is 80X25
|
||||||
|
; character mode (3,4 or 7). Must be called for monocrome
|
||||||
|
; (mode 7) for scr_curson to set a proper cursor.
|
||||||
|
|
||||||
|
; Usage: scr_setup();
|
||||||
|
|
||||||
|
public scr_setup_
|
||||||
|
scr_setup_: push bp
|
||||||
|
mov ah,state ;get current state
|
||||||
|
int video
|
||||||
|
mov scr_mode_,al ;current mode
|
||||||
|
mov cl,ah ;make cols a word
|
||||||
|
mov ch,0
|
||||||
|
mov scr_cols_,cx ;40 or 80 columns
|
||||||
|
mov scr_page_,bh
|
||||||
|
mov scr_attr_,7 ;set to white chars on black
|
||||||
|
cmp al,4 ;see if a character mode
|
||||||
|
jc got_attr
|
||||||
|
cmp al,7 ;7 is for graphics mode
|
||||||
|
jz got_attr
|
||||||
|
mov scr_attr_,0 ;attribute is zero in graphics
|
||||||
|
got_attr: mov ah,0 ;return int containing mode
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_TERM_ do any required termination.
|
||||||
|
|
||||||
|
; Usage: scr_term();
|
||||||
|
|
||||||
|
public scr_term_
|
||||||
|
scr_term_:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SETMODE_ set a new screen mode
|
||||||
|
|
||||||
|
; Usage: scr_setmode(new mode);
|
||||||
|
|
||||||
|
public scr_setmode_
|
||||||
|
scr_setmode_: push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov al,[bp+4] ; new mode value
|
||||||
|
mov ah,mode
|
||||||
|
int video ; set new mode
|
||||||
|
call scr_setup_ ;remember new values
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_ROWCOL_ sets cursor at any location.
|
||||||
|
|
||||||
|
; Usage: scr_rowcol(new row, new column);
|
||||||
|
|
||||||
|
public scr_rowcol_
|
||||||
|
scr_rowcol_: ; move cursor to x,y
|
||||||
|
push bp ; save from bios
|
||||||
|
mov bp,sp
|
||||||
|
mov dx,[bp+6] ; column
|
||||||
|
mov ax,[bp+4] ; row
|
||||||
|
mov dh,al
|
||||||
|
mov bh,scr_page_ ; force page zero
|
||||||
|
mov ah,setcur ; set cursor location
|
||||||
|
int video ; call bios
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CLR_ clear entire screen
|
||||||
|
|
||||||
|
; Usage: scr_clr();
|
||||||
|
|
||||||
|
public scr_clr_
|
||||||
|
scr_clr_: ; clear screen
|
||||||
|
|
||||||
|
|
||||||
|
push bp ;save from video call
|
||||||
|
mov al,0 ;ask for a clear window
|
||||||
|
xor cx,cx ;start at 0,0
|
||||||
|
mov dh,byte scr_rows_;last line
|
||||||
|
dec dh
|
||||||
|
mov dl,byte scr_cols_ ;clear entire width
|
||||||
|
dec dl ;last column is width-1
|
||||||
|
mov bh,scr_attr_ ;attributes for new blanks
|
||||||
|
mov ah,scrollup ;ask for a scrollup to clear
|
||||||
|
int video ;do the clear
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CLRL_ clear rest of line.
|
||||||
|
|
||||||
|
; Usage: scr_clrl();
|
||||||
|
|
||||||
|
public scr_clrl_
|
||||||
|
scr_clrl_: ; clear rest of line
|
||||||
|
push bp
|
||||||
|
mov bh,scr_page_
|
||||||
|
mov ah,readcur ;see where we are
|
||||||
|
int video
|
||||||
|
mov cl,byte scr_cols_ ;calc how many chars left in line
|
||||||
|
sub cl,dl ;number left
|
||||||
|
mov ch,0 ;number of blanks needed
|
||||||
|
mov al,' ' ;write blanks
|
||||||
|
mov bl,scr_attr_ ;normal attributes
|
||||||
|
mov bh,scr_page_ ;page number
|
||||||
|
mov ah,writeach ;write the blanks
|
||||||
|
int video
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CLS_ clear rest of screen.
|
||||||
|
|
||||||
|
; Usage: scr_cls();
|
||||||
|
|
||||||
|
public scr_cls_
|
||||||
|
scr_cls_: ; clear rest of screen
|
||||||
|
push bp
|
||||||
|
call scr_clrl_ ;clear rest of line
|
||||||
|
mov ah,readcur ;see where we are
|
||||||
|
mov bh,scr_page_
|
||||||
|
int video
|
||||||
|
mov al,0 ;ask for a clear window
|
||||||
|
mov ch,dh ;current row
|
||||||
|
inc ch ;+1
|
||||||
|
cmp ch,byte scr_rows_;see if in last line
|
||||||
|
jz cleared ;all done
|
||||||
|
mov cl,0 ;first column
|
||||||
|
mov dh,byte scr_rows_;24 is the last line
|
||||||
|
dec dh
|
||||||
|
mov dl,byte scr_cols_ ;clear entire width
|
||||||
|
dec dl ;last column is width-1
|
||||||
|
mov bh,scr_attr_ ;attributes for new blanks
|
||||||
|
mov ah,scrollup ;ask for a scrollup to clear
|
||||||
|
int video ;do the clear
|
||||||
|
cleared: pop bp
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SCUP_ scroll text up leaving top lines alone.
|
||||||
|
|
||||||
|
; Usage: scr_scup();
|
||||||
|
|
||||||
|
public scr_scup_
|
||||||
|
scr_scup_: ; scroll last line, screen from line
|
||||||
|
; scr_windor_top to end
|
||||||
|
mov ax,scr_cols_ ;need last column of screen
|
||||||
|
dec ax
|
||||||
|
push ax
|
||||||
|
mov ax,scr_rows_ ;scroll through last line
|
||||||
|
dec ax
|
||||||
|
push ax
|
||||||
|
xor ax,ax ;from column 0
|
||||||
|
push ax
|
||||||
|
mov al,scr_window_top_;leave top line alone
|
||||||
|
push ax
|
||||||
|
mov al,1
|
||||||
|
push ax ;scroll by 1
|
||||||
|
call scr_scrup_ ;do the scroll
|
||||||
|
add sp,10 ;clear arge
|
||||||
|
ret
|
||||||
|
|
||||||
|
; SCR_SCRUP_ Scroll the screen up. The window is scrolled
|
||||||
|
; up nline lines. A zero nline will clear the
|
||||||
|
; window. Top left of the screen in 0,0.
|
||||||
|
|
||||||
|
; Usage: scr_scrup(nline,fromrow,fromcol,torow,tocol);
|
||||||
|
|
||||||
|
public scr_scrup_
|
||||||
|
scr_scrup_: push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov al,[bp+4] ;number of lines
|
||||||
|
mov ch,[bp+6] ;starting row
|
||||||
|
mov cl,[bp+8] ;starting column
|
||||||
|
mov dh,[bp+10] ;ending row
|
||||||
|
mov dl,[bp+12] ;ending column
|
||||||
|
mov bh,scr_attr_ ;current attribute
|
||||||
|
mov ah,scrollup
|
||||||
|
int video ;do the scroll
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SCDN_ scroll all but the top lines down one.
|
||||||
|
|
||||||
|
; Usage: scr_scdn();
|
||||||
|
|
||||||
|
public scr_scdn_
|
||||||
|
scr_scdn_:
|
||||||
|
mov ax,scr_cols_ ;need last column of screen
|
||||||
|
dec ax
|
||||||
|
push ax
|
||||||
|
mov ax,scr_rows_ ;scroll through last line
|
||||||
|
dec ax
|
||||||
|
push ax
|
||||||
|
xor ax,ax ;from column 0
|
||||||
|
push ax
|
||||||
|
mov al,scr_window_top_;leave top lines alone
|
||||||
|
push ax
|
||||||
|
mov al,1
|
||||||
|
push ax ;scroll by 1
|
||||||
|
call scr_scrdn_ ;do the scroll
|
||||||
|
add sp,10 ;clear arge
|
||||||
|
ret
|
||||||
|
|
||||||
|
; SCR_SCRDN_ scroll the screen down. the window is scrolled
|
||||||
|
; down nline lines. A zero nline will clear the
|
||||||
|
; window. Top left of the screen in 0,0.
|
||||||
|
|
||||||
|
; Usage: scr_scrdn(nline,fromrow,fromcol,torow,tocol);
|
||||||
|
|
||||||
|
public scr_scrdn_
|
||||||
|
scr_scrdn_: push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov al,[bp+4] ;number of lines
|
||||||
|
mov ch,[bp+6] ;starting row
|
||||||
|
mov cl,[bp+8] ;starting column
|
||||||
|
mov dh,[bp+10] ;ending row
|
||||||
|
mov dl,[bp+12] ;ending column
|
||||||
|
mov bh,scr_attr_ ;current attribute
|
||||||
|
mov ah,scrolldn
|
||||||
|
int video ;do the scroll
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CO_ write a character to the screen. this
|
||||||
|
; routine increments the cursor position
|
||||||
|
; after writing. normal C88 puts and printf
|
||||||
|
; statements can also be used to write to the
|
||||||
|
; screen.
|
||||||
|
|
||||||
|
; Usage: scr_co_(character);
|
||||||
|
|
||||||
|
public scr_co_
|
||||||
|
scr_co_: ; standard console output
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov al,[bp+4] ;character to write
|
||||||
|
mov bh,scr_page_
|
||||||
|
mov ah,wtty ;use tty write routine
|
||||||
|
int video
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CI_ keyboard input. function and soft keys are
|
||||||
|
; translated. see equates for values.
|
||||||
|
|
||||||
|
; Usage: character = scr_ci();
|
||||||
|
|
||||||
|
public scr_ci_
|
||||||
|
scr_ci_: ;return the next character
|
||||||
|
; translate if necessary
|
||||||
|
push bp
|
||||||
|
mov ah,cicode ;ask for a keyboard character
|
||||||
|
int keyboard
|
||||||
|
cmp al,0
|
||||||
|
jne not_special
|
||||||
|
mov bx, offset convert ; convert special key
|
||||||
|
ci_loop:
|
||||||
|
cmp byte[bx],0
|
||||||
|
jz got_it
|
||||||
|
cmp ah, byte[bx]
|
||||||
|
je got_it
|
||||||
|
add bx,2
|
||||||
|
jmp ci_loop
|
||||||
|
got_it: inc bx
|
||||||
|
mov al,[bx]
|
||||||
|
mov ah,0
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
not_special: mov ah,0
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CSTS_ return character if any available. otherwise
|
||||||
|
; return zero.
|
||||||
|
|
||||||
|
; Usage: character = scr_csts();
|
||||||
|
|
||||||
|
public scr_csts_
|
||||||
|
scr_csts_: ;return coded character if any available
|
||||||
|
push bp
|
||||||
|
mov ah,cstscode
|
||||||
|
int keyboard
|
||||||
|
mov ax,0
|
||||||
|
jz csts_over
|
||||||
|
call scr_ci_ ;get the coded character
|
||||||
|
csts_over: pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SET_CURSOR_ does nothing. needed by SEE.
|
||||||
|
|
||||||
|
|
||||||
|
public scr_set_cursor_
|
||||||
|
scr_set_cursor_: ; set the visible cursor to the
|
||||||
|
; current position
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_SINP_ screen input (read character from the screen).
|
||||||
|
|
||||||
|
; Usage: character = scr_sinp();
|
||||||
|
|
||||||
|
public scr_sinp_
|
||||||
|
scr_sinp_:
|
||||||
|
push bp ;save the registers
|
||||||
|
mov bh,scr_page_
|
||||||
|
mov ah,readch ;code to read a character
|
||||||
|
int video ;al is letter, ah=attributes
|
||||||
|
or al,al ;zero returned instead of blank in
|
||||||
|
;graphics mode
|
||||||
|
jnz ret_ch
|
||||||
|
mov al,' '
|
||||||
|
ret_ch: mov ah,0 ;kill the attributes
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CURSOFF_ turn cursor off.
|
||||||
|
|
||||||
|
; Usage: scr_cursoff();
|
||||||
|
|
||||||
|
public scr_cursoff_
|
||||||
|
scr_cursoff_:
|
||||||
|
push bp ;save registers
|
||||||
|
cmp scr_mode_,4 ;see if graphics
|
||||||
|
jc text_coff
|
||||||
|
cmp scr_mode_,7
|
||||||
|
jnz no_cur
|
||||||
|
text_coff:
|
||||||
|
mov cx,0f00h ;should turn cursor off
|
||||||
|
new_cur: mov ah,curtype ;set a new cursor type
|
||||||
|
int video
|
||||||
|
no_cur: pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_CURSON_ turn cursor back on.
|
||||||
|
|
||||||
|
; Usage: scr_curson();
|
||||||
|
|
||||||
|
public scr_curson_
|
||||||
|
scr_curson_:
|
||||||
|
push bp
|
||||||
|
mov cx,0c0dh ;assume monocrome
|
||||||
|
cmp scr_mode_,7 ;true is mono
|
||||||
|
jz new_cur ;set it
|
||||||
|
mov cx,0607h ;assume color card in text mode
|
||||||
|
cmp scr_mode_,4 ;color text is 0 to 3
|
||||||
|
jc new_cur
|
||||||
|
pop bp ;do nothing if in graphics mode
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_MARK -- mark the current character on the screen.
|
||||||
|
; Used to delimit block areas in SEE. Just write
|
||||||
|
; an X or something if reverse video is not available.
|
||||||
|
; Usage: scr_mark(current character);
|
||||||
|
|
||||||
|
public scr_mark_
|
||||||
|
scr_mark_: ; mark the passed char,
|
||||||
|
; cursor does not advance
|
||||||
|
push bp
|
||||||
|
mov al,219 ;just write a block character
|
||||||
|
mov bl,scr_attr_ ;normal attributes
|
||||||
|
mov cx,1 ; one character
|
||||||
|
mov bh,scr_page_ ;page number
|
||||||
|
mov ah,writeach ;write char and attr
|
||||||
|
int video ;write character and attributes
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; the following routine is not used by either SEE or D88.
|
||||||
|
|
||||||
|
|
||||||
|
; SCR_APUTS_ write a string and attributes to the screen.
|
||||||
|
; the cursor is moved normally
|
||||||
|
|
||||||
|
; Usage: acr_aputs("Print This",attribute);
|
||||||
|
; attribute is BRGBIRGB
|
||||||
|
; | | | |
|
||||||
|
; | | | color for letter. 7 is white
|
||||||
|
; | | intensity for letter
|
||||||
|
; | color for background. 0 is black
|
||||||
|
; blinking
|
||||||
|
|
||||||
|
public scr_aputs_
|
||||||
|
scr_aputs_:
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
mov ah,readcur ;see where we are
|
||||||
|
int video ;dx is cursor location, bh is page
|
||||||
|
mov si,[bp+4] ;string pointer
|
||||||
|
mov cx,1 ;number of characters to write
|
||||||
|
mov bl,[bp+6] ;attribute
|
||||||
|
naputs: cld
|
||||||
|
lodsb ;next character to write
|
||||||
|
or al,al ;zero at end
|
||||||
|
jz eaputs
|
||||||
|
cmp al,10 ;look for LF
|
||||||
|
jnz normal_ap
|
||||||
|
ap_scroll: mov bp,sp ;reset pointer to next char
|
||||||
|
mov [bp+4],si
|
||||||
|
mov al,13 ;use tty output to scroll screen
|
||||||
|
mov ah,wtty
|
||||||
|
int video ;write cr,lf
|
||||||
|
mov ah,wtty
|
||||||
|
mov al,10
|
||||||
|
int video
|
||||||
|
pop bp
|
||||||
|
jmp scr_aputs_ ;start over
|
||||||
|
normal_ap:
|
||||||
|
mov bh,scr_page_ ;page number
|
||||||
|
mov ah,writeach ;write char and attr
|
||||||
|
int video ;write character and attributes
|
||||||
|
inc dl ;next column
|
||||||
|
cmp dl,crt_cols ;see if wrapping around
|
||||||
|
jc set_loc
|
||||||
|
mov dl,0 ;at start of column
|
||||||
|
inc dh ;at next row
|
||||||
|
cmp dh,byte scr_rows_;see if need a scroll
|
||||||
|
jc set_loc
|
||||||
|
jmp ap_scroll ;do a scroll up
|
||||||
|
set_loc: mov ah,setcur ;move the cursor
|
||||||
|
int video
|
||||||
|
jmp naputs
|
||||||
|
eaputs: pop bp
|
||||||
|
ret
|
||||||
|
|
BIN
DeSmet C88 v24/PROFEND.EXE
Normal file
BIN
DeSmet C88 v24/PROFEND.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/PROFILE.EXE
Normal file
BIN
DeSmet C88 v24/PROFILE.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/PROFSTAR.EXE
Normal file
BIN
DeSmet C88 v24/PROFSTAR.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/RAM.COM
Normal file
BIN
DeSmet C88 v24/RAM.COM
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/SEE.EXE
Normal file
BIN
DeSmet C88 v24/SEE.EXE
Normal file
Binary file not shown.
BIN
DeSmet C88 v24/SEE.O
Normal file
BIN
DeSmet C88 v24/SEE.O
Normal file
Binary file not shown.
35
DeSmet C88 v24/SIEVE.C
Normal file
35
DeSmet C88 v24/SIEVE.C
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* sieve.c */
|
||||||
|
|
||||||
|
/* Eratosthenes Sieve Prime Number Program in C from Byte Jan 1983
|
||||||
|
to compare the speed. */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
#define SIZE 8190
|
||||||
|
typedef int bool;
|
||||||
|
|
||||||
|
char flags[SIZE+1];
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i,k;
|
||||||
|
int prime,count,iter;
|
||||||
|
|
||||||
|
for (iter = 1; iter <= 10; iter++) { /* do program 10 times */
|
||||||
|
count = 0; /* initialize prime counter */
|
||||||
|
for (i = 0; i <= SIZE; i++) /* set all flags TRUE */
|
||||||
|
flags[i] = TRUE;
|
||||||
|
for (i = 0; i <= SIZE; i++) {
|
||||||
|
if (flags[i]) { /* found a prime */
|
||||||
|
prime = i + i + 3; /* twice index + 3 */
|
||||||
|
for (k = i + prime; k <= SIZE; k += prime)
|
||||||
|
flags[k] = FALSE; /* kill all multiples */
|
||||||
|
count++; /* primes found */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%d primes.\n",count); /*primes found in 10th pass */
|
||||||
|
return 0;
|
||||||
|
}
|
18
DeSmet C88 v24/STDIO.H
Normal file
18
DeSmet C88 v24/STDIO.H
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/* STDIO.H Include file for C88 input/output. */
|
||||||
|
|
||||||
|
/* a 'FILE' is simply an integer is this implimentation */
|
||||||
|
|
||||||
|
typedef int FILE;
|
||||||
|
|
||||||
|
/* Standard input, standard output and standard error. */
|
||||||
|
|
||||||
|
#define stdin 0
|
||||||
|
#define stdout 1
|
||||||
|
#define stderr 2
|
||||||
|
|
||||||
|
#define NULL 0
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
#define EOF (-1)
|
||||||
|
#define ERR (-1)
|
||||||
|
|
169
DeSmet C88 v24/TM.C
Normal file
169
DeSmet C88 v24/TM.C
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef AZTEC86
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HISOFTC
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef INTELC
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WATCOM
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <process.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef powerc
|
||||||
|
#define allocs 50
|
||||||
|
#else
|
||||||
|
#ifdef HISOFTC
|
||||||
|
#define allocs 66 /* not enough RAM with hisoft to go higher */
|
||||||
|
#else
|
||||||
|
/* most c runtimes work up to 69, but use 66 to have a consistent benchmark */
|
||||||
|
#define allocs 66
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int logging = 1;
|
||||||
|
|
||||||
|
char * memset_x( p, v, c ) char * p; int v; int c;
|
||||||
|
{
|
||||||
|
unsigned char * pc = (unsigned char *) p;
|
||||||
|
unsigned char val = (unsigned char) ( v & 0xff );
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ( 0 == p )
|
||||||
|
{
|
||||||
|
printf( "request to memset a null pointer\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( logging )
|
||||||
|
#ifdef CPMTIME
|
||||||
|
printf( " memset p %u, v %d, val %x, c %d\n", p, v, val, c );
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifdef HISOFTC
|
||||||
|
printf( " memset p %u, v %d, val %x, c %d\n", p, v, val, c );
|
||||||
|
#else
|
||||||
|
printf( " memset p %p, v %d, val %x, c %d\n", p, v, val, c );
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for ( i = 0; i < c; i++ )
|
||||||
|
*pc++ = val;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void chkmem( p, v, c ) char * p; int v; int c;
|
||||||
|
{
|
||||||
|
unsigned char * pc = (unsigned char *) p;
|
||||||
|
unsigned char val = (unsigned char) ( v & 0xff );
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ( 0 == p )
|
||||||
|
{
|
||||||
|
printf( "request to chkmem a null pointer\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; i < c; i++ )
|
||||||
|
{
|
||||||
|
if ( *pc != val )
|
||||||
|
{
|
||||||
|
#ifdef CPMTIME
|
||||||
|
printf( "memory isn't as expected! p %u, v %d, c %d, *pc %d\n",p, v, c, *pc );
|
||||||
|
#else
|
||||||
|
printf( "memory isn't as expected! p %p, v %d, c %d, *pc %d\n",p, v, c, *pc );
|
||||||
|
#endif
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
pc++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( argc, argv ) int argc; char * argv[];
|
||||||
|
{
|
||||||
|
int i, cb, c_cb, j;
|
||||||
|
char * pc;
|
||||||
|
char * ap[ allocs ];
|
||||||
|
|
||||||
|
logging = ( argc > 1 );
|
||||||
|
pc = argv[ 0 ]; /* evade compiler warning */
|
||||||
|
|
||||||
|
for ( j = 0; j < 10; j++ )
|
||||||
|
{
|
||||||
|
if ( logging )
|
||||||
|
printf( "in alloc mode\n" );
|
||||||
|
|
||||||
|
for ( i = 0; i < allocs; i++ )
|
||||||
|
{
|
||||||
|
cb = 8 + ( i * 10 );
|
||||||
|
c_cb = cb + 5;
|
||||||
|
if ( logging )
|
||||||
|
printf( " i, cb: %d %d\n", i, cb );
|
||||||
|
|
||||||
|
pc = (char *) calloc( c_cb, 1 );
|
||||||
|
chkmem( pc, 0, c_cb );
|
||||||
|
memset_x( pc, 0xcc, c_cb );
|
||||||
|
|
||||||
|
ap[ i ] = (char *) malloc( cb );
|
||||||
|
memset_x( ap[ i ], 0xaa, cb );
|
||||||
|
|
||||||
|
chkmem( pc, 0xcc, c_cb );
|
||||||
|
free( pc );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( logging )
|
||||||
|
printf( "in free mode, even first\n" );
|
||||||
|
|
||||||
|
for ( i = 0; i < allocs; i += 2 )
|
||||||
|
{
|
||||||
|
cb = 8 + ( i * 10 );
|
||||||
|
c_cb = cb + 3;
|
||||||
|
if ( logging )
|
||||||
|
printf( " i, cb: %d %d\n", i, cb );
|
||||||
|
|
||||||
|
pc = (char *) calloc( c_cb, 1 );
|
||||||
|
chkmem( pc, 0, c_cb );
|
||||||
|
memset_x( pc, 0xcc, c_cb );
|
||||||
|
|
||||||
|
chkmem( ap[ i ], 0xaa, cb );
|
||||||
|
memset_x( ap[ i ], 0xff, cb );
|
||||||
|
free( ap[ i ] );
|
||||||
|
|
||||||
|
chkmem( pc, 0xcc, c_cb );
|
||||||
|
free( pc );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( logging )
|
||||||
|
printf( "in free mode, now odd\n" );
|
||||||
|
|
||||||
|
for ( i = 1; i < allocs; i += 2 )
|
||||||
|
{
|
||||||
|
cb = 8 + ( i * 10 );
|
||||||
|
c_cb = cb + 7;
|
||||||
|
if ( logging )
|
||||||
|
printf( " i, cb: %d %d\n", i, cb );
|
||||||
|
|
||||||
|
pc = (char *) calloc( c_cb, 1 );
|
||||||
|
chkmem( pc, 0, c_cb );
|
||||||
|
memset_x( pc, 0xcc, c_cb );
|
||||||
|
|
||||||
|
chkmem( ap[ i ], 0xaa, cb );
|
||||||
|
memset_x( ap[ i ], 0xff, cb );
|
||||||
|
free( ap[ i ] );
|
||||||
|
|
||||||
|
chkmem( pc, 0xcc, c_cb );
|
||||||
|
free( pc );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf( "success\n" );
|
||||||
|
return 0;
|
||||||
|
}
|
527
DeSmet C88 v24/TTT.C
Normal file
527
DeSmet C88 v24/TTT.C
Normal file
@ -0,0 +1,527 @@
|
|||||||
|
/*
|
||||||
|
This version builds with old compilers including:
|
||||||
|
Aztec C 1.06 for 8080 & Z80 on CP/M.
|
||||||
|
Microsoft C Compiler V1.04 for 8086 on DOS. (This is Lattice C)
|
||||||
|
Microsoft C Compiler V2.03 for 8086 on DOS. (Still Lattice C)
|
||||||
|
Microsoft C Compiler V3.00 for 8086 on DOS.
|
||||||
|
QuickC 1.0
|
||||||
|
Turbo C 2.0
|
||||||
|
The syntax is old and reminds me of 7th grade summer vacation.
|
||||||
|
Much of this code is awkward to satisfy the lowest common denominator of many compilers.
|
||||||
|
unsigned long isn't supported in many older compilers, so long is used instead.
|
||||||
|
Early DOS and CP/M require register variabes to be int, not char or other types.
|
||||||
|
The perf improvement of using register-int instead of stack-char is worth it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LINT_ARGS
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef DOSTIME
|
||||||
|
#include <time.h>
|
||||||
|
#include <dos.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
|
||||||
|
/* Function Pointers are the fastest implementation for almost every compiler */
|
||||||
|
#define UseFunPointers 1
|
||||||
|
#define UseWinner2 2
|
||||||
|
#define UseLookForWinner 3
|
||||||
|
#define WinMethod UseFunPointers
|
||||||
|
|
||||||
|
#define ABPrune true /* alpha beta pruning */
|
||||||
|
#define WinLosePrune true /* stop early on win/lose */
|
||||||
|
#define ScoreWin 6
|
||||||
|
#define ScoreTie 5
|
||||||
|
#define ScoreLose 4
|
||||||
|
#define ScoreMax 9
|
||||||
|
#define ScoreMin 2
|
||||||
|
#define DefaultIterations 10
|
||||||
|
|
||||||
|
#define PieceX 1
|
||||||
|
#define PieceO 2
|
||||||
|
#define PieceBlank 0
|
||||||
|
|
||||||
|
typedef char ttype; /* 8-bit and 16-bit cpus do best with char aside from register in locals */
|
||||||
|
|
||||||
|
int g_Iterations = DefaultIterations;
|
||||||
|
ttype g_board[ 9 ];
|
||||||
|
|
||||||
|
#if WinMethod == UseFunPointers
|
||||||
|
|
||||||
|
ttype pos0func()
|
||||||
|
{
|
||||||
|
/* using "register int" instead of "ttype" for x is faster on 8086 and Z80 */
|
||||||
|
register int x = g_board[0];
|
||||||
|
|
||||||
|
if ( ( x == g_board[1] && x == g_board[2] ) ||
|
||||||
|
( x == g_board[3] && x == g_board[6] ) ||
|
||||||
|
( x == g_board[4] && x == g_board[8] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos1func()
|
||||||
|
{
|
||||||
|
register int x = g_board[1];
|
||||||
|
|
||||||
|
if ( ( x == g_board[0] && x == g_board[2] ) ||
|
||||||
|
( x == g_board[4] && x == g_board[7] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos2func()
|
||||||
|
{
|
||||||
|
register int x = g_board[2];
|
||||||
|
|
||||||
|
if ( ( x == g_board[0] && x == g_board[1] ) ||
|
||||||
|
( x == g_board[5] && x == g_board[8] ) ||
|
||||||
|
( x == g_board[4] && x == g_board[6] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos3func()
|
||||||
|
{
|
||||||
|
register int x = g_board[3];
|
||||||
|
|
||||||
|
if ( ( x == g_board[4] && x == g_board[5] ) ||
|
||||||
|
( x == g_board[0] && x == g_board[6] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos4func()
|
||||||
|
{
|
||||||
|
register int x = g_board[4];
|
||||||
|
|
||||||
|
if ( ( x == g_board[0] && x == g_board[8] ) ||
|
||||||
|
( x == g_board[2] && x == g_board[6] ) ||
|
||||||
|
( x == g_board[1] && x == g_board[7] ) ||
|
||||||
|
( x == g_board[3] && x == g_board[5] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos5func()
|
||||||
|
{
|
||||||
|
register int x = g_board[5];
|
||||||
|
|
||||||
|
if ( ( x == g_board[3] && x == g_board[4] ) ||
|
||||||
|
( x == g_board[2] && x == g_board[8] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos6func()
|
||||||
|
{
|
||||||
|
register int x = g_board[6];
|
||||||
|
|
||||||
|
if ( ( x == g_board[7] && x == g_board[8] ) ||
|
||||||
|
( x == g_board[0] && x == g_board[3] ) ||
|
||||||
|
( x == g_board[4] && x == g_board[2] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos7func()
|
||||||
|
{
|
||||||
|
register int x = g_board[7];
|
||||||
|
|
||||||
|
if ( ( x == g_board[6] && x == g_board[8] ) ||
|
||||||
|
( x == g_board[1] && x == g_board[4] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttype pos8func()
|
||||||
|
{
|
||||||
|
register int x = g_board[8];
|
||||||
|
|
||||||
|
if ( ( x == g_board[6] && x == g_board[7] ) ||
|
||||||
|
( x == g_board[2] && x == g_board[5] ) ||
|
||||||
|
( x == g_board[0] && x == g_board[4] ) )
|
||||||
|
return x;
|
||||||
|
return PieceBlank;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef ttype pfunc_t();
|
||||||
|
|
||||||
|
pfunc_t * winner_functions[9] =
|
||||||
|
{
|
||||||
|
pos0func,
|
||||||
|
pos1func,
|
||||||
|
pos2func,
|
||||||
|
pos3func,
|
||||||
|
pos4func,
|
||||||
|
pos5func,
|
||||||
|
pos6func,
|
||||||
|
pos7func,
|
||||||
|
pos8func
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WinMethod == UseWinner2
|
||||||
|
|
||||||
|
ttype winner2( move ) ttype move;
|
||||||
|
{
|
||||||
|
register int x; /* faster than ttype x on the stack */
|
||||||
|
|
||||||
|
switch( move ) /* msc v3 from 1985 generates a jump table! */
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
x = g_board[ 0 ];
|
||||||
|
if ( ( ( x == g_board[1] ) && ( x == g_board[2] ) ) ||
|
||||||
|
( ( x == g_board[3] ) && ( x == g_board[6] ) ) ||
|
||||||
|
( ( x == g_board[4] ) && ( x == g_board[8] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
x = g_board[ 1 ];
|
||||||
|
if ( ( ( x == g_board[0] ) && ( x == g_board[2] ) ) ||
|
||||||
|
( ( x == g_board[4] ) && ( x == g_board[7] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
x = g_board[ 2 ];
|
||||||
|
if ( ( ( x == g_board[0] ) && ( x == g_board[1] ) ) ||
|
||||||
|
( ( x == g_board[5] ) && ( x == g_board[8] ) ) ||
|
||||||
|
( ( x == g_board[4] ) && ( x == g_board[6] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
x = g_board[ 3 ];
|
||||||
|
if ( ( ( x == g_board[4] ) && ( x == g_board[5] ) ) ||
|
||||||
|
( ( x == g_board[0] ) && ( x == g_board[6] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
x = g_board[ 4 ];
|
||||||
|
if ( ( ( x == g_board[0] ) && ( x == g_board[8] ) ) ||
|
||||||
|
( ( x == g_board[2] ) && ( x == g_board[6] ) ) ||
|
||||||
|
( ( x == g_board[1] ) && ( x == g_board[7] ) ) ||
|
||||||
|
( ( x == g_board[3] ) && ( x == g_board[5] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
x = g_board[ 5 ];
|
||||||
|
if ( ( ( x == g_board[3] ) && ( x == g_board[4] ) ) ||
|
||||||
|
( ( x == g_board[2] ) && ( x == g_board[8] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
x = g_board[ 6 ];
|
||||||
|
if ( ( ( x == g_board[7] ) && ( x == g_board[8] ) ) ||
|
||||||
|
( ( x == g_board[0] ) && ( x == g_board[3] ) ) ||
|
||||||
|
( ( x == g_board[4] ) && ( x == g_board[2] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
x = g_board[ 7 ];
|
||||||
|
if ( ( ( x == g_board[6] ) && ( x == g_board[8] ) ) ||
|
||||||
|
( ( x == g_board[1] ) && ( x == g_board[4] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
x = g_board[ 8 ];
|
||||||
|
if ( ( ( x == g_board[6] ) && ( x == g_board[7] ) ) ||
|
||||||
|
( ( x == g_board[2] ) && ( x == g_board[5] ) ) ||
|
||||||
|
( ( x == g_board[0] ) && ( x == g_board[4] ) ) )
|
||||||
|
return x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PieceBlank;
|
||||||
|
} /*winner2*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WinMethod == UseLookForWinner
|
||||||
|
|
||||||
|
ttype LookForWinner()
|
||||||
|
{
|
||||||
|
register int p = g_board[0]; /* faster as register int than ttype on 8086 and Z80 */
|
||||||
|
if ( PieceBlank != p )
|
||||||
|
{
|
||||||
|
if ( p == g_board[1] && p == g_board[2] )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
if ( p == g_board[3] && p == g_board[6] )
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = g_board[3];
|
||||||
|
if ( PieceBlank != p && p == g_board[4] && p == g_board[5] )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
p = g_board[6];
|
||||||
|
if ( PieceBlank != p && p == g_board[7] && p == g_board[8] )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
p = g_board[1];
|
||||||
|
if ( PieceBlank != p && p == g_board[4] && p == g_board[7] )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
p = g_board[2];
|
||||||
|
if ( PieceBlank != p && p == g_board[5] && p == g_board[8] )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
p = g_board[4];
|
||||||
|
if ( PieceBlank != p )
|
||||||
|
{
|
||||||
|
if ( ( p == g_board[0] ) && ( p == g_board[8] ) )
|
||||||
|
return p;
|
||||||
|
|
||||||
|
if ( ( p == g_board[2] ) && ( p == g_board[6] ) )
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PieceBlank;
|
||||||
|
} /*LookForWinner*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int g_IMoves = 0;
|
||||||
|
|
||||||
|
ttype MinMax( alpha, beta, depth, move ) ttype alpha; ttype beta; ttype depth; ttype move;
|
||||||
|
{
|
||||||
|
ttype pieceMove, score; /* better perf with char than int. out of registers so use stack */
|
||||||
|
register int p, value; /* better perf with these as an int on Z80, 8080, and 8086 */
|
||||||
|
|
||||||
|
g_IMoves++;
|
||||||
|
|
||||||
|
if ( depth >= 4 )
|
||||||
|
{
|
||||||
|
#if WinMethod == UseFunPointers
|
||||||
|
p = ( * winner_functions[ move ] )();
|
||||||
|
#endif
|
||||||
|
#if WinMethod == UseWinner2
|
||||||
|
p = winner2( move );
|
||||||
|
#endif
|
||||||
|
#if WinMethod == UseLookForWinner
|
||||||
|
p = LookForWinner();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( PieceBlank != p )
|
||||||
|
{
|
||||||
|
if ( PieceX == p )
|
||||||
|
return ScoreWin;
|
||||||
|
|
||||||
|
return ScoreLose;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 8 == depth )
|
||||||
|
return ScoreTie;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( depth & 1 )
|
||||||
|
{
|
||||||
|
value = ScoreMin;
|
||||||
|
pieceMove = PieceX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = ScoreMax;
|
||||||
|
pieceMove = PieceO;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( p = 0; p < 9; p++ )
|
||||||
|
{
|
||||||
|
if ( PieceBlank == g_board[ p ] )
|
||||||
|
{
|
||||||
|
g_board[p] = pieceMove;
|
||||||
|
score = MinMax( alpha, beta, depth + 1, p );
|
||||||
|
g_board[p] = PieceBlank;
|
||||||
|
|
||||||
|
if ( depth & 1 )
|
||||||
|
{
|
||||||
|
#if WinLosePrune /* #if statements must be in first column for MS C 1.0 */
|
||||||
|
if ( ScoreWin == score )
|
||||||
|
return ScoreWin;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( score > value )
|
||||||
|
{
|
||||||
|
value = score;
|
||||||
|
|
||||||
|
#if ABPrune
|
||||||
|
if ( value >= beta )
|
||||||
|
return value;
|
||||||
|
if ( value > alpha )
|
||||||
|
alpha = value;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if WinLosePrune
|
||||||
|
if ( ScoreLose == score )
|
||||||
|
return ScoreLose;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( score < value )
|
||||||
|
{
|
||||||
|
value = score;
|
||||||
|
|
||||||
|
#if ABPrune
|
||||||
|
if ( value <= alpha )
|
||||||
|
return value;
|
||||||
|
if ( value < beta )
|
||||||
|
beta = value;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
} /*MinMax*/
|
||||||
|
|
||||||
|
long g_Moves = 0;
|
||||||
|
|
||||||
|
int FindSolution( position ) ttype position;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < 9; i++ )
|
||||||
|
g_board[ i ] = PieceBlank;
|
||||||
|
|
||||||
|
g_board[ position ] = PieceX;
|
||||||
|
|
||||||
|
for ( i = 0; i < g_Iterations; i++ )
|
||||||
|
{
|
||||||
|
g_IMoves = 0;
|
||||||
|
MinMax( ScoreMin, ScoreMax, 0, position );
|
||||||
|
g_Moves += g_IMoves; /* do the 4-byte long addition once per loop to save work */
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} /*FindSolution*/
|
||||||
|
|
||||||
|
#ifdef CPMTIME
|
||||||
|
|
||||||
|
struct CPMTimeValue
|
||||||
|
{
|
||||||
|
int h, m, s, l;
|
||||||
|
};
|
||||||
|
|
||||||
|
void print_time_now()
|
||||||
|
{
|
||||||
|
/* This CP/M BDOS call of 105 is only implemented in NTVCM -- it's not a standard CP/M 2.2 call */
|
||||||
|
|
||||||
|
struct CPMTimeValue t;
|
||||||
|
t.h = t.m = t.s = t.l = 0;
|
||||||
|
|
||||||
|
bdos( 105, &t );
|
||||||
|
printf( "current time: %02d:%02d:%02d.%02d\n", t.h, t.m, t.s, t.l );
|
||||||
|
} /*print_time_now*/
|
||||||
|
|
||||||
|
long get_ms()
|
||||||
|
{
|
||||||
|
/* This CP/M BDOS call of 105 is only implemented in NTVCM -- it's not a standard CP/M 2.2 call */
|
||||||
|
|
||||||
|
long h, m, s, l;
|
||||||
|
struct CPMTimeValue t;
|
||||||
|
t.h = t.m = t.s = t.l = 0;
|
||||||
|
|
||||||
|
bdos( 105, &t );
|
||||||
|
h = t.h;
|
||||||
|
m = t.m;
|
||||||
|
s = t.s;
|
||||||
|
l = t.l;
|
||||||
|
|
||||||
|
return h * 3600000 + m * 60000 + s * 1000 + l * 10;
|
||||||
|
} /*get_ms*/
|
||||||
|
|
||||||
|
#else /* no elif with old compilers */
|
||||||
|
|
||||||
|
#ifdef DOSTIME
|
||||||
|
|
||||||
|
void print_time_now()
|
||||||
|
{
|
||||||
|
/* Make a DOS interrupt call to get the time */
|
||||||
|
|
||||||
|
union REGS wrIn, wrOut;
|
||||||
|
|
||||||
|
wrIn.h.ah = 0x2c;
|
||||||
|
intdos( &wrIn, &wrOut );
|
||||||
|
printf( "current time: %02d:%02d:%02d.%02d\n", wrOut.h.ch, wrOut.h.cl, wrOut.h.dh, wrOut.h.dl );
|
||||||
|
fflush( stdout );
|
||||||
|
} /*print_time_now*/
|
||||||
|
|
||||||
|
long get_ms()
|
||||||
|
{
|
||||||
|
/* this function takes about 3 milliseconds on the original IBM PC */
|
||||||
|
|
||||||
|
long h, m, s, l;
|
||||||
|
union REGS wrIn, wrOut;
|
||||||
|
|
||||||
|
wrIn.h.ah = 0x2c;
|
||||||
|
intdos( &wrIn, &wrOut );
|
||||||
|
|
||||||
|
h = wrOut.h.ch;
|
||||||
|
m = wrOut.h.cl;
|
||||||
|
s = wrOut.h.dh;
|
||||||
|
l = wrOut.h.dl;
|
||||||
|
|
||||||
|
return h * 3600000 + m * 60000 + s * 1000 + l * 10;
|
||||||
|
} /*get_ms*/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* must do this on actual CP/M machines */
|
||||||
|
|
||||||
|
int print_time_now() { return 0; }
|
||||||
|
long get_ms() { return 0; }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main( argc, argv ) int argc; char * argv[];
|
||||||
|
{
|
||||||
|
long start_time, end_time;
|
||||||
|
|
||||||
|
if ( 2 == argc )
|
||||||
|
sscanf( argv[ 1 ], "%d", &g_Iterations ); /* no atoi in MS C 1.0 */
|
||||||
|
|
||||||
|
start_time = get_ms();
|
||||||
|
|
||||||
|
FindSolution( 0 );
|
||||||
|
FindSolution( 1 );
|
||||||
|
FindSolution( 4 );
|
||||||
|
|
||||||
|
end_time = get_ms();
|
||||||
|
|
||||||
|
printf( "runtime in ms: %ld\n", end_time - start_time );
|
||||||
|
printf( "move count: %ld\n", g_Moves ); /* 6493 * g_Iterations */
|
||||||
|
printf( "iteration count: %d\n", g_Iterations );
|
||||||
|
printf( "method: %s\n",
|
||||||
|
( WinMethod == UseFunPointers ) ? "function pointers" :
|
||||||
|
( WinMethod == UseWinner2 ) ? "winner2" :
|
||||||
|
( WinMethod == UseLookForWinner ) ? "look for winner" :
|
||||||
|
"invalid method" );
|
||||||
|
return 0;
|
||||||
|
} /*main*/
|
||||||
|
|
BIN
DeSmet C88 v24/c88_251.pdf
Normal file
BIN
DeSmet C88 v24/c88_251.pdf
Normal file
Binary file not shown.
3
DeSmet C88 v24/errno.h
Normal file
3
DeSmet C88 v24/errno.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/fcntl.h
Normal file
3
DeSmet C88 v24/fcntl.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/io.h
Normal file
3
DeSmet C88 v24/io.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/m.bat
Normal file
3
DeSmet C88 v24/m.bat
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
rem -nDESMETC doesn't work in this version of c88
|
||||||
|
ntvdm c88 %1
|
||||||
|
ntvdm bind %1 other
|
3
DeSmet C88 v24/setjmp.h
Normal file
3
DeSmet C88 v24/setjmp.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/stdarg.h
Normal file
3
DeSmet C88 v24/stdarg.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/stdlib.h
Normal file
3
DeSmet C88 v24/stdlib.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/string.h
Normal file
3
DeSmet C88 v24/string.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
3
DeSmet C88 v24/time.h
Normal file
3
DeSmet C88 v24/time.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* david lee made this */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user