Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,132 @@
bdos31.exe=entry,
sup,
rtm,
mem,
cio,
misc,
bdos,
proctbl,
ccpldr[nop


View File

@@ -0,0 +1,253 @@
;
; This little segment appears in PCP/M-86 3.x between the BDOS proper
; and the XIOS. I'm assembling it as part of the BDOS, but it may need to
; become a separate file with separate support in DPGEN.
;
; It appears to be a miniature CCP that can be used to run commands and
; set the drive/user containing the CCP. It has only one builtin command
; - USER.
;
include equates.a86
dseg
extrn boot_drive:byte
extrn ccp_user:byte
cseg
public ccpldr
ccpldr: jmp ccpl_main
ccpl_space: mov al, ' '
ccpl_putch: mov dl, al
push cx
mov cl, 2
int 0E0h
pop cx
ret
;
ccpl_crlf: mov al, 0Dh
call ccpl_putch
mov al, 0Ah
jmps ccpl_putch
ccpl_drv_set: mov dl, al
mov cl, 0Eh
int 0E0h
ret
ccpl_getuid: mov dl, 0FFh
ccpl_setuid: mov cl, 20h
int 0E0h
ret
;
ccpl_input: mov dx, offset ccpl_inpbuf
mov cl, 0Ah
int 0E0h
xor bh, bh
mov bl, ccpl_inpbuf+1
mov ccpl_inpbuf+2[bx], bh
mov ccpl_pfcb, offset ccpl_inpbuf+2
ret
;
ccpl_drv_get: mov cl, 19h
int 0E0h
ret
;
ccpl_parse_name:
mov ax, ccpl_pfcb
mov ccpl_filename_0,ax
mov dx, offset ccpl_pfcb
mov cl, 98h
int 0E0h
mov ccpl_pfcb, ax
or ax, ax
jnz ccpl_pn1
mov ccpl_pfcb, offset ccpl_blank
ccpl_pn1: dec ax
ret
;
ccpl_main: mov ds,word ptr .0 ;-> CP/M DSEG
mov ccpl_sp, sp
push ds
pop es
mov dl, 0FEh
mov cl, 2Dh
int 0E0h
ccpl_mainloop: mov sp, ccpl_sp
mov dl, ccp_user
call ccpl_setuid
mov al, boot_drive
call ccpl_drv_set
cld
mov dx, addr_no_ccp
mov cl, 9
int 0E0h
mov al, ccp_user
cmp al, 0Ah
jc bootuserlt9
mov al, '1'
call ccpl_putch
mov al, ccp_user
sub al, 0Ah
bootuserlt9: add al, '0'
call ccpl_putch
mov al, boot_drive
add al, 'A'
call ccpl_putch
mov al, '>'
call ccpl_putch
call ccpl_input
call ccpl_parse_name
jz ccpl_showerr ;Name does not parse
test ccpl_fcb, 0FFh
jz ccpl_1
jmp ccpl_trychain
;
ccpl_1: cmp ccpl_fcb+1, 20h
jz ccpl_mainloop
mov di, addr_user ;Check if the command entered is USER
mov si, offset ccpl_fcb+1
mov cl, [di]
xor ch, ch
inc di
rep cmpsb
jnz ccpl_2
lodsb
cmp al, ' '
jnz ccpl_2
jmp ccpl_setuser
;
ccpl_2: jmp ccpl_trychain
;
ccpl_showerr: call ccpl_crlf ;Echo the first filename then "?"
mov si, ccpl_filename_0
ccpl_skipsp: lodsb
cmp al, 20h
jz ccpl_skipsp
ccpl_showerr2: cmp al, 20h
jz ccpl_showerr3
or al, al
jz ccpl_showerr3
call ccpl_putch
lodsb
jmps ccpl_showerr2
;
ccpl_showerr3: mov al, '?'
call ccpl_putch
call ccpl_crlf
jmp ccpl_mainloop
;
ccpl_parse_num: call ccpl_parse_name
jz ccpl_showerr
mov si, offset ccpl_fcb+1
mov cx, 0Bh
cmp byte ptr [si], ' '
jnz ccpl_pnum_1
mov al, 33
ret
;
ccpl_pnum_1: lodsb
cmp al, ' '
jz ccpl_pnum_next
sub al, '0'
cmp al, 0Ah
jnc ccpl_showerr
xchg al, ch
mov ah, 0Ah
mul ah
add al, ch
cmp al, 16
jnc ccpl_showerr
mov ch, al
dec cl
jnz ccpl_pnum_1
ret
;
ccpl_pnum_next:
cmp al, ' '
jnz ccpl_showerr
lodsb
dec cl
jnz ccpl_pnum_next
mov al, ch
ret
;
ccpl_setuser: call ccpl_parse_num
cmp al, 33
jnz ccpl_setuser2
call ccpl_crlf
call ccpl_getuid
cmp al, 9
jbe ccpl_setuser1
push ax
mov al, '1'
call ccpl_putch
pop ax
sub al, 0Ah
ccpl_setuser1: add al, '0'
call ccpl_putch
jmps ccpl_setuser3
;
ccpl_setuser2: mov dl, al
mov ccp_user, al
call ccpl_setuid
ccpl_setuser3: jmp ccpl_mainloop
;
ccpl_trychain: cmp ccpl_fcb+1, ' '
jnz ccpl_trychain1
mov al, ccpl_fcb
or al, al
jz ccpl_setuser3
dec al
push ax
call ccpl_drv_set
inc al
pop ax
jz ccpl_trychain2
mov boot_drive, al
jmps ccpl_setuser3
;
ccpl_trychain1: cmp ccpl_fcb+9, ' '
jz ccpl_chain
ccpl_trychain2: jmp ccpl_showerr
;
ccpl_chain: call ccpl_crlf
mov dx, offset ccpl_inpbuf+2
mov cl, 1Ah ;F_DMAOFF
int 0E0h
mov dx, ds
mov cl, 33h ;F_DMASEG
int 0E0h
mov cl, 2Fh ;P_CHAIN
int 0E0h
jmp ccpl_showerr
dseg
public ccpldr_ds
public ccpldr_cs
ccpldr_ds dw 0
db 0
ccpldr_cs dw 0
db 0
ccpl_inpbuf db 3Fh
rb 40h
ccpl_blank db 0
ccpl_sp dw 0
ccpl_filename_0 dw 0
ccpl_pfcb dw offset ccpl_inpbuf+2
dw offset ccpl_fcb
rb 12
ccpl_fcb rb 24h
rb 0E6h
;
; I hope this is junk picked up by (eg) something being a couple of paragraphs
; short of a whole sector rather than anything important.
;
db 8Ah, 0FFh, 0
db 83h, 0FFh, 0
db 84h, 0FFh, 0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,144 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cmdio.h"
static byte zeroes[16];
void zero_cmd(cmd_desc *cmdfile)
{
cmdfile->cs = cmdfile->ds = NULL;
cmdfile->cs_base = cmdfile->ds_base = 0;
cmdfile->cs_len = cmdfile->ds_len = 0;
cmdfile->cs_max = cmdfile->ds_max = 0;
}
void free_cmd (cmd_desc *cmdfile)
{
if (cmdfile->ds) free(cmdfile->ds);
if (cmdfile->cs) free(cmdfile->cs);
zero_cmd(cmdfile);
}
char *alloc_cmd(cmd_desc *cmdfile, long cs_len, long ds_len)
{
if (!cs_len || !ds_len) return "cs_len or ds_len is 0.";
cmdfile->cs = malloc(cs_len);
cmdfile->ds = malloc(ds_len);
if (!cmdfile->ds || !cmdfile->cs)
{
free_cmd(cmdfile);
return "Out of memory.";
}
return NULL;
}
char *load_cmd(char *filename, cmd_desc *cmdfile)
{
FILE *fp;
char *boo;
byte cmd_header[128];
fp = fopen(filename, "rb");
if (!fp) return "Failed to open file.";
if (fread(cmd_header, 1, sizeof(cmd_header), fp) < sizeof(cmd_header))
{
fclose(fp);
return "Too short to be a CMD file.";
}
cmdfile->cs_len = peekw(cmd_header, 1);
cmdfile->cs_base = peekw(cmd_header, 3);
cmdfile->cs_max = peekw(cmd_header, 5);
cmdfile->ds_len = peekw(cmd_header, 10);
cmdfile->ds_base = peekw(cmd_header, 12);
cmdfile->ds_max = peekw(cmd_header, 14);
if (!cmdfile->cs_len || !cmdfile->ds_len)
{
fclose(fp);
return "Not a 2-segment CMD file";
}
boo = alloc_cmd(cmdfile, 16 * cmdfile->cs_max, 16 * cmdfile->ds_max);
if (boo)
{
fclose(fp);
return boo;
}
if (fread(cmdfile->cs, 16, cmdfile->cs_len, fp) < cmdfile->cs_len)
{
fclose(fp);
free_cmd(cmdfile);
return "Failed to load code segment.";
}
if (fread(cmdfile->ds, 16, cmdfile->ds_len, fp) < cmdfile->ds_len)
{
fclose(fp);
free_cmd(cmdfile);
return "Failed to load data segment.";
}
fclose(fp);
cmdfile->cs_len *= 16L;
cmdfile->ds_len *= 16L;
cmdfile->cs_max *= 16L;
cmdfile->ds_max *= 16L;
return NULL;
}
void pokew(byte *base, word a, word v)
{
base[a ] = (v) & 0xFF;
base[a+1] = (v >> 8) & 0xFF;
}
word peekw(byte *base, word a)
{
return base[a] | (((word)base[a+1]) << 8);
}
char *save_cmd(char *cmdname, cmd_desc *cmdfile, int absolute)
{
FILE *fp;
word csparas, cmparas;
word dsparas, dmparas;
byte header[128];
csparas = cmdfile->cs_len >> 4;
dsparas = cmdfile->ds_len >> 4;
cmparas = cmdfile->cs_max >> 4;
dmparas = cmdfile->ds_max >> 4;
memset(header, 0, sizeof(header));
header[0] = 1; /* Code segment */
pokew(header, 1, csparas);
if (absolute) pokew(header, 3, cmdfile->cs_base);
pokew(header, 5, cmparas);
header[9] = 2; /* Data segment */
pokew(header, 10, dsparas);
if (absolute) pokew(header, 12, cmdfile->ds_base);
pokew(header, 14, dmparas);
fp = fopen(cmdname, "wb");
if (!fp)
{
return "Cannot open file to write.";
}
if (fwrite(header, 1, 128, fp) < 128 ||
fwrite(cmdfile->cs, 16, csparas, fp) < csparas ||
fwrite(cmdfile->ds, 16, dsparas, fp) < dsparas)
{
fclose(fp);
return "Error writing to CMD file";
}
/* Pack out to a multiple of 128 bytes */
while ((csparas + dsparas) & 7)
{
fwrite(zeroes, 1, 16, fp);
++dsparas;
}
fclose(fp);
return NULL;
}

View File

@@ -0,0 +1,27 @@
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
typedef struct
{
byte *cs;
byte *ds;
word cs_base;
word ds_base;
dword cs_len;
dword ds_len;
dword cs_max;
dword ds_max;
} cmd_desc;
void zero_cmd (cmd_desc *cmdfile);
void free_cmd (cmd_desc *cmdfile);
char *alloc_cmd(cmd_desc *cmdfile, long cs_len, long ds_len);
char *load_cmd(char *filename, cmd_desc *cmdfile);
char *save_cmd(char *filename, cmd_desc *cmdfile, int absolute);
word peekw(byte *base, word a);
void pokew(byte *base, word a, word v);

View File

@@ -0,0 +1,135 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cmdio.h"
cmd_desc dosplus_sys, bdos_cmd, xios_cmd, ccp_cmd, dos_cmd;
int gl_base = 0x60;
void dump_cmd(char *caption, cmd_desc *cmd)
{
printf("%s CS: base=%04x length=%05lx\n",
caption, cmd->cs_base, cmd->cs_len);
printf("%s DS: base=%04x length=%05lx\n",
caption, cmd->ds_base, cmd->ds_len);
}
int main(int argc, char **argv)
{
char *boo;
long o = 0;
long xios_cs, dos_cs, dos_ds, ccp_cs, ccp_ds;
int n;
/* Load the component parts */
for (n = 1; n < argc; n++)
{
if (!strncmp(argv[n], "base=", 5))
{
if (!sscanf(&argv[n][5], "%x", &gl_base))
{
fprintf(stderr, "base= option incorrect.\n");
return 1;
}
}
}
boo = load_cmd("bdos.cmd", &bdos_cmd);
if (boo) { fprintf(stderr, "bdos.cmd: %s\n", boo); return 1; }
boo = load_cmd("xios.cmd", &xios_cmd);
if (boo) { fprintf(stderr, "xios.cmd: %s\n", boo); return 1; }
boo = load_cmd("ccp.cmd", &ccp_cmd);
if (boo) { fprintf(stderr, "ccp.cmd: %s\n", boo); return 1; }
load_cmd("dos.cmd", &dos_cmd);
/* Work out segment sizes */
dosplus_sys.cs_max =
dosplus_sys.cs_len = bdos_cmd.cs_len + xios_cmd.cs_len +
ccp_cmd.cs_len + ccp_cmd.ds_len +
dos_cmd.cs_len + dos_cmd.ds_len;
dosplus_sys.cs_base = gl_base;
dosplus_sys.ds_len = xios_cmd.ds_len;
dosplus_sys.ds_max = xios_cmd.ds_max;
dosplus_sys.ds_base = gl_base + (dosplus_sys.cs_len >> 4);
boo = alloc_cmd(&dosplus_sys, dosplus_sys.cs_len, dosplus_sys.ds_len);
if (boo) { fprintf(stderr, "%s", boo); return 1; }
printf("Code segment at %04x:0000 length 0x%05lx\n",
dosplus_sys.cs_base,
dosplus_sys.cs_len);
printf("Data segment at %04x:0000 length 0x%05lx\n",
dosplus_sys.ds_base,
dosplus_sys.ds_len);
/* OK. Now copy the modules into the SYS file */
memcpy(dosplus_sys.cs + o, bdos_cmd.cs, bdos_cmd.cs_len);
o += bdos_cmd.cs_len;
xios_cs = o;
memcpy(dosplus_sys.cs + o, xios_cmd.cs, xios_cmd.cs_len);
o += xios_cmd.cs_len;
if (dos_cmd.cs_len)
{
dos_cs = o;
memcpy(dosplus_sys.cs + o, dos_cmd.cs, dos_cmd.cs_len);
o += dos_cmd.cs_len;
}
ccp_cs = o;
memcpy(dosplus_sys.cs + o, ccp_cmd.cs, ccp_cmd.cs_len);
o += ccp_cmd.cs_len;
ccp_ds = o;
memcpy(dosplus_sys.cs + o, ccp_cmd.ds, ccp_cmd.ds_len);
o += ccp_cmd.ds_len;
if (dos_cmd.ds_len)
{
dos_ds = o;
memcpy(dosplus_sys.cs + o, dos_cmd.ds, dos_cmd.ds_len);
o += dos_cmd.ds_len;
}
memcpy(dosplus_sys.ds, xios_cmd.ds, xios_cmd.ds_len);
memcpy(dosplus_sys.ds, bdos_cmd.ds, bdos_cmd.ds_len);
/* Set up the pointers to modules correctly */
pokew(dosplus_sys.cs, 6, dosplus_sys.ds_base);
pokew(dosplus_sys.cs, xios_cs + 6, dosplus_sys.ds_base);
if (dos_cmd.ds_len)
{
pokew(dosplus_sys.cs, dos_cs + 6, dosplus_sys.ds_base);
pokew(dosplus_sys.cs, dos_cs + 8, (dos_ds >> 4) + gl_base);
}
pokew(dosplus_sys.cs, ccp_ds , ccp_cmd.cs_len);
pokew(dosplus_sys.cs, ccp_ds + 3, (ccp_cs >> 4) + gl_base);
pokew(dosplus_sys.cs, ccp_ds + 6, ccp_cmd.ds_len);
pokew(dosplus_sys.cs, ccp_ds + 9, (ccp_ds >> 4) + gl_base);
pokew(dosplus_sys.ds, 0x2A, (xios_cs >> 4) + gl_base);
pokew(dosplus_sys.ds, 0x2E, (xios_cs >> 4) + gl_base);
if (dos_cmd.ds_len)
pokew(dosplus_sys.ds, 0x42, (dos_cs >> 4) + gl_base);
else pokew(dosplus_sys.ds, 0x42, 0);
pokew(dosplus_sys.ds, 0x44, (ccp_ds >> 4) + gl_base);
pokew(dosplus_sys.ds, 0x48, ((dosplus_sys.cs_max +
dosplus_sys.ds_max + 0x10 * gl_base) >> 4)
/*+ 0x1000*/);
/* SYS file has been generated. Write it. */
dump_cmd("BDOS ", &bdos_cmd);
dump_cmd("XIOS ", &xios_cmd);
if (dos_cmd.cs_len) dump_cmd("DOS ", &dos_cmd);
dump_cmd("CCP ", &ccp_cmd);
dump_cmd("SYS ", &dosplus_sys);
/* Now start writing the stuff out */
boo = save_cmd("new.sys", &dosplus_sys, 1);
if (boo) fprintf(stderr, "new.sys: %s\n", boo);
free_cmd(&dosplus_sys);
free_cmd(&bdos_cmd);
free_cmd(&xios_cmd);
free_cmd(&ccp_cmd);
free_cmd(&dos_cmd);
return 0;
}

View File

@@ -0,0 +1,525 @@
include equates.a86
include system.a86
dseg
cseg
extrn rtm_sysflag:near
extrn cio_keyboard:near
extrn rtm_timeslice:near
public bdos_start
public bdos_rsx
public bdos_callback
public far_ret_1
public bdos_dseg
jmp bdos_start
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jmp bdos_int_E0
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_dseg dw seg time_slice
; ...
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_start: ; CODE XREF: bdos:0000j
cli
xor ax, ax
mov ds, ax
mov word ptr INT_E0, offset bdos_int_E0
mov word ptr INT_E0+2, cs
mov bx, cs:bdos_dseg
mov ds, bx
mov ax, rlr
mov cl, 4
shr ax, cl
add ax, bx
mov rlr, ax
mov process_table, ax
mov bdos_conowner, ax
mov ss, ax
mov sp, 160h
init_proctab: ; CODE XREF: bdos:0054j
mov es, ax
mov es:word ptr proc_onblock, offset far_ret_1
g003f: ; DATA XREF: P_TERMCPM+16r
mov es:word ptr proc_onblock+2, cs
mov ax, es:proc_nextseg
test ax, ax
jz procs_inited
shr ax, cl
add ax, bx
mov es:proc_nextseg, ax
jmps init_proctab
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
procs_inited: ; CODE XREF: bdos:004Aj
mov es, rlr
mov es:proc_bdos_seg, cs
cld
mov cx, 7
mov bx, offset function_tables + 2 ;Call all init funcs
call_inits: push bx
push cx
call word ptr [bx]
pop cx
pop bx
add bx, 4
loop call_inits
callf dword ptr lp_xios_init
sti
mov al, boot_drive
mov es:proc_drive, al
push es
xor si, si
push ds
mov ds, si
mov word ptr INT_E0, offset bdos_int_E0
mov word ptr INT_E0+2, cs
mov di, offset proc_int0
mov cx, 4
rep movsw
mov cl, 4
add si, cx
rep movsw
mov si, offset INT_E0
mov cl, 4
rep movsw
pop es
pop ds
mov di, offset cpu_vectors
mov si, offset proc_int0
mov cl, 0Ch
rep movsw
xor cx, cx
mov dx, cx
int 0E0h ; used by BASIC while in interpreter
;
entry_init: ret
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_functions db 20h ; DATA XREF: bdos:01F2o
; P_TERMCPM
db 60h ; C_READ
db 61h ; C_WRITE
db 62h ; A_READ
db 63h ; A_WRITE
db 64h ; L_WRITE
db 65h ; C_RAWIO
db 66h ; A_STATIN
db 67h ; A_STATOUT
db 68h ; C_WRITESTR
db 69h ; C_READSTR
db 6Ah ; C_STAT
db 0A1h ; S_BDOSVER
db 0C0h ; DRV_ALLRESET
db 0C1h ; DRV_SET
db 0C2h ; F_OPEN
db 0C3h ; F_CLOSE
db 0C4h ; F_SFIRST
db 0C5h ; F_SNEXT
db 0C6h ; F_DELETE
db 0C7h ; F_READ
db 0C8h ; F_WRITE
db 0C9h ; F_MAKE
db 0CAh ; F_RENAME
db 0A2h ; DRV_LOGINVEC
db 0A3h ; DRV_GET
db 0A4h ; F_DMAOFF
db 0CBh ; DRV_ALLOCVEC
db 0CCh ; DRV_SETRO
db 0A5h ; DRV_ROVEC
db 0CDh ; F_ATTRIB
db 0CEh ; DRV_DPB
db 0A6h ; F_USERNUM
db 0CFh ; F_READRAND
db 0D0h ; F_WRITERAND
db 0D1h ; F_SIZE
db 0D2h ; F_RANDREC
db 0D3h ; DRV_RESET
db 0A0h ; (access drives)
db 0D5h ; DRV_FREE
db 0D6h ; F_WRITEZF
db 0A0h, 0A0h, 0A0h ; MP/M file lock functions
db 0A7h ; F_MULTISEC
db 0A8h ; F_ERRMODE
db 0D9h ; DRV_SPACE
db 0 ; P_CHAIN
db 0DAh ; DRV_FLUSH
db 0A9h ; S_SYSVAR
db 6Bh ; S_BIOS
db 0AAh ; F_DMASEG
db 0ABh ; F_DMAGET
db 40h ; MC_MAX
db 41h ; MC_ABSMAX
db 42h ; MC_ALLOC
db 43h ; MC_ABSALLOC
db 44h ; MC_FREE
db 45h ; MC_ALLFREE
db 1 ; P_LOAD
db 0A0h ; P_RSX
db 0DBh ; Clean up disc
db 0DCh ; F_TRUNCATE
db 0DDh ; DRV_SETLABEL
db 0DEh ; DRV_GETLABEL
db 0DFh ; F_TIMEDATE
db 0E0h ; F_WRITEXFCB
db 0ACh ; T_SET
db 0ADh ; T_GET
db 0E1h ; F_PASSWD
db 0AEh ; S_SERIAL
db 0AFh ; P_CODE
db 6Ch ; C_MODE
db 6Dh ; C_DELIMIT
db 6Eh ; C_WRITEBLK
db 6Fh ; L_WRITEBLK
db 0A0h ; PCP/M direct screen access
db 0A0h ; Unused in all versions
db 0A0h ; GSX
db 0E2h ; Set file timestamp
db 21h ; Wait on system flag
db 0A0h ; Set system flag
db 0A0h ; Create message queue
db 0A0h ; Open message queue
db 0A0h ; Delete message queue
db 0A0h ; Read message queue
db 0A0h ; Conditional read queue
db 0A0h ; Write to message queue
db 0A0h ; Conditional write message queue
db 22h ; P_DELAY
db 23h ; P_DISPATCH
db 20h ; P_TERM
db 0A0h, 0A0h, 0A0h
db 70h ; C_DETACH
db 0A0h, 0A0h, 0A0h, 0A0h
db 2 ; F_PARSE
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_int_E0: ; CODE XREF: bdos:0003j
; DATA XREF: bdos:000Eo ...
push ds
mov ds, cs:bdos_dseg
mov ax, es
mov es, rlr
pop ds
cmp es:proc_incpm, 0
jnz already_in_cpm
mov es:word ptr userStack+2, ss
mov es:word ptr userStack, sp
push es
pop ss
mov sp, offset proc_cpm_stack
already_in_cpm: ; CODE XREF: bdos:0155j
inc es:proc_incpm
sti
cld
mov es:userES, ax
mov es:proc_fx, cl
push si
push di
push bp
callf es:dword ptr proc_bdos_offs
pop bp
pop di
pop si
mov ax, bx
dec es:proc_incpm
jnz still_in_cpm
cli
mov ss, es:word ptr userStack+2
mov sp, es:word ptr userStack
still_in_cpm: ; CODE XREF: bdos:0188j
mov es, es:userES
cmp ax, 0FFFFh
jz check_result
xor cx, cx
check_result: ; CODE XREF: bdos:019Dj
iret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_rsx: ; DATA XREF: proc1:0052o
jmp bdos_rsx_main
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rs 5
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_rsx_main: ; CODE XREF: bdos:01A2j
push es:userDS
mov es:userDS, ds
mov ds, cs:bdos_dseg
callf dword ptr lp_bdos_entry
mov ds, es:userDS
pop es:userDS
far_ret_1: ; DATA XREF: bdos:0038o P_CHAIN+71o
; ...
retf
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_entry: ; CODE XREF: x_dev_waitflag+2u
; x_p_delay+2u
; DATA XREF: ...
jmp bdos_func
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rs 5
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_func: ; CODE XREF: bdos:01C8j
cld
mov al, cl
cmp al, 3Ch
jbe bdos_gotfunc
sub al, 25h
cmp al, 3Dh
jb bdos_badfunc
cmp al, 4Fh
jbe bdos_gotfunc
sub al, 0Fh
cmp al, 50h
jb bdos_badfunc
cmp al, 64h
jbe bdos_gotfunc
bdos_badfunc: ; CODE XREF: bdos:01DBj bdos:01E5j
mov bx, 0FFFFh
mov cx, 2
retf
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bdos_gotfunc: ; CODE XREF: bdos:01D5j bdos:01DFj
; ...
mov bx, offset bdos_functions
xlat cs:byte ptr [bx]
mov cl, al
rol al, 1
rol al, 1
rol al, 1
and al, 7
mov ah, 1Fh
cmp al, 6
jb mask_fxn
mov ah, 3Fh
and al, 6
mask_fxn: ; CODE XREF: bdos:0205j
and cl, ah
entry_bdos: ; DATA XREF: dseg:0010o
call inner_callback
retf
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
inner_callback: ; CODE XREF: bdos:020Dp bdos_callback+8p
mov es:proc_intfunc, cl
mov es:proc_intmod, al
xor ah, ah
mov ch, ah
mov di, ax ; AL = function class
shl di, 1 ; CL = function number within class
shl di, 1
mov si, cx
shl si, 1
jmp function_tables[di]
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
bdos_callback: ; CODE XREF: get_proc_dskdat+Bp
; release+3p ...
test ch, ch
jz callback_00
dec ch
mov al, ch
call inner_callback
jmps bdos_cbk_end
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
callback_00: ; CODE XREF: bdos_callback+2j
callf es:dword ptr proc_bdos_offs
bdos_cbk_end: ; CODE XREF: bdos_callback+Bj
mov ax, bx
retn
extrn sup_main:near
extrn sup_init:near
extrn rtm_main:near
extrn rtm_init:near
extrn mem_main:near
extrn mem_init:near
extrn cio_main:near
extrn cio_init:near
extrn misc_main:near
extrn misc_init:near
extrn bdos_main:near
extrn bdos_init:near
dseg
extrn freemem:byte
extrn proc1:word
extrn dirname_1:word
extrn dirdata_0:word
public function_tables
public bdos_8087_inuse
public rlr
public drl
public pq_disk
public pq_loader
public pq_memmgr
public pq_error
public pq_filesystem
public search_path
public temp_drive
public cpu_vectors
public lp_xios_entry
public lp_dos_module
public lp_sysflag_chg
public lp_kbd_callback
public time_slice
public proc_count
public bdos_conowner
public bdos_sysflags
public ccp_dseg
public cur_x
public max_x
public max_y
public sysvar_131
public sysvar_132
public echo_backspaced
public echo_deleted
public boot_drive
public ccp_user
public bdos_ver
public date_days
public date_secs
public page_mode
function_tables dw offset sup_main ; DATA XREF: inner_callback+Eo
dw offset sup_init
dw offset rtm_main
dw offset rtm_init
dw offset mem_main
dw offset mem_init
dw offset cio_main
dw offset cio_init
dw offset entry_init
dw offset entry_init
off_A15_14 dw offset misc_main
dw offset misc_init
off_A15_18 dw offset bdos_main
off_A15_1A dw offset bdos_init
a080586 db '* 11/16/83 *'
lp_xios_entry dw 3 ; Offset of XIOS entry
seg_A15_2A dw seg lp_xios_entry ; -> XIOS segment
lp_xios_init dw 0 ; Offset of XIOS init function
dw seg lp_xios_entry ; -> XIOS segment
lp_bdos_entry dw offset bdos_entry ; DATA XREF: bdos:01B9r x_dev_waitflag+2r
; ...
dw seg bdos_start
lp_timeslice dw offset rtm_timeslice
dw seg rtm_timeslice
lp_sysflag_chg dw offset rtm_sysflag
dw seg rtm_sysflag
lp_kbd_callback dw offset cio_keyboard
dw seg cio_keyboard
lp_dos_module dw 0,0 ; DATA XREF: bdos:007Dr P_CHAIN+A9r
; ...
ccp_dseg dw 0 ; DATA XREF: mc_temp_untempr
; get_mcb_pars+38r ...
; 0 if no temporary memory blocks allocated
dw seg bdos_start
dw seg freemem
bdos_conowner dw offset proc1 ; DATA XREF: bdos:002Ew bdos_sysflag+Ar
; ...
bdos_sysflags dw SYSFLAGS ; This should get set by GENCPM
rlr dw offset proc1 ; DATA XREF: bdos:001Fr bdos:0028w
; ...
; Current process
process_table dw 0 ; DATA XREF: bdos:002Bw
drl dw 0 ; DATA XREF: P_0207+5r P_0209+7o
; ...
; Processes that have just become
; ready to run
dw 0
proc_count db 1 ; DATA XREF: get_new_process+1Dw
; P_TERMCPM+5Ew ...
bdos_ver dw 1031h ; DATA XREF: S_BDOSVERr
bdos_8087_inuse db 0 ; DATA XREF: call_p_load+10w
; retake_8087+Br ...
search_path db 0, 0FFh, 0FFh, 0FFh
; ...
temp_drive db 0 ; DATA XREF: rsx_find+53o bdos:23AEo
date_days dw 0862h ; DATA XREF: bdos:23B2o bdos:2540o
; ...
date_hours db 12h ; DATA XREF: xios_hook_timer+85w
; xios_int08+5Dr ...
date_mins db 0 ; DATA XREF: xios_hook_timer+7Dw
; xios_int08+4Br ...
date_secs db 0 ; DATA XREF: bdos:2551w bdos:2566r
; ...
cur_x db 0 ; DATA XREF: bdos_char_out+44r
; bdos_char_out+70w ...
max_x db SCR_MAXX ; DATA XREF: input_putchar+12r
; expand_tabs+14r ...
max_y db SCR_MAXY ; DATA XREF: bdos:23A2o
page_mode db 0 ; DATA XREF: bdos:23A6o
echo_backspaced db 0 ; DATA XREF: input_ctlH+9r
echo_deleted db SCR_ECHODEL ; DATA XREF: input_delete+9r
;
; Process queues for single-threaded parts of the system.
;
; Format of process queue:
; DW offset of next queue, 0 for none
; DW segment of process currently in that section, 0 for none
; DW linked list of processes waiting for that section, 0 for none
; DW 0
;
pq_disk dw offset pq_loader ; DATA XREF: get_proc_dskdat+5o
; release_DMAo ...
rw 3
pq_loader dw offset pq_filesystem
rw 3
pq_filesystem dw offset pq_error ; DATA XREF: funcs_F_main+8o
; funcs_F_main+124o ...
rw 3
pq_error dw 8Ah ; DATA XREF: funcs_F_main+136o
; funcs_F_main+1C7o ...
rw 3
pq_memmgr rw 4 ; DATA XREF: funcs_MC+2o funcs_MC+24o
; ...
boot_drive db 0 ; DATA XREF: bdos:006Cr bdos:23CEo
; ...
ccp_user db 0
rb 0FEh
sysvar_131 db 0 ; DATA XREF: copy_to_history+14w
; bdos:1CFFr ...
sysvar_132 rb 100h ; DATA XREF: copy_to_history+Do
; bdos:1CFAo ...
time_slice db 10h ; DATA XREF: delay_dispatch+A2r
; bdos:23DEo
cpu_vectors rw 12
end

View File

@@ -0,0 +1,99 @@
NO equ 0
YES equ NOT NO
dseg
;
; Addresses in the Zero Page
;
INT_E0 equ dword ptr .0380h
;
; Addresses in the XIOS
;
xios_bh_delay equ byte ptr .0F00h ;XIOS header
xios_bh_ticks equ byte ptr .0F01h
xios_bh_gdopen equ byte ptr .0F02h
xios_bh_inint equ byte ptr .0F03h
xios_bh_nextflg equ byte ptr .0F04h
xios_bh_lastflg equ byte ptr .0F05h
xios_bh_intconi equ byte ptr .0F06h
xios_bh_8087 equ byte ptr .0F07h
mem_table equ word ptr .0F56h
msg_cannot_load equ word ptr .1016h
addr_no_ccp equ word ptr .1018h
addr_user equ word ptr .101Ah
addr_cpm_error equ word ptr .101Ch ;Localised messages
addr_bdos_fn equ word ptr .101Eh
addr_file equ word ptr .1020h
addr_writeerr equ word ptr .1022h
addr_rodisk equ word ptr .1024h
addr_rofile equ word ptr .1026h
addr_invaliddrv equ word ptr .1028h
addr_pwderr equ word ptr .102Ah
addr_filexists equ word ptr .102Ch
addr_ambiguous equ word ptr .102Eh
country_info equ word ptr .1030h ;DOS country info
switch_char equ byte ptr .1050h ;DOS switch character
;
; Addresses in the process table
;
proc_nextready equ word ptr .00h ;Link to next ready process
proc_nextseg equ word ptr .02h ;Link to next process in
;numerical order
proc_status equ byte ptr .04h ; 0 => Runnable
; 1 => Waiting on timer
; 2 => Terminated
; 3 => Waiting on flag
proc_pid equ byte ptr .05h
proc_flags equ word ptr .06h ; Bit 0 => killed
; Bit 1 => Using 8087
proc_name equ byte ptr .08h
proc_incpm equ byte ptr .10h
proc_intfunc equ byte ptr .11h
proc_intmod equ byte ptr .12h
proc_indisk equ byte ptr .13h
proc_errcode equ word ptr .14h
proc_conmode equ word ptr .16h
proc_background equ byte ptr .18h
proc_delimiter equ byte ptr .19h
proc_sp equ word ptr .1Ah
proc_ss equ word ptr .1Ch
proc_ax equ word ptr .1Eh
proc_bx equ word ptr .20h
proc_cx equ word ptr .22h
proc_dx equ word ptr .24h
proc_di equ word ptr .26h
proc_si equ word ptr .28h
proc_bp equ word ptr .2Ah
proc_es equ word ptr .2Ch
userDS equ word ptr .2Eh
userES equ word ptr .30h
userStack equ word ptr .32h
proc_drive equ byte ptr .36h
proc_uid equ byte ptr. 37h
proc_dma equ dword ptr .38h
proc_fx equ byte ptr .3Ch
proc_find1st equ dword ptr .3Eh
proc_errmode equ byte ptr .46h
proc_multisec equ byte ptr .47h
proc_passwd equ byte ptr .48h
proc_countdown equ word ptr .50h
proc_bdos_offs equ word ptr .52h
proc_bdos_seg equ word ptr .54h
proc_int0 equ dword ptr .56h
proc_using_drvs equ word ptr .6Eh
proc_onblock equ dword ptr .70h
proc_dirname equ word ptr .74h
proc_cpm_stack equ byte ptr .100h
;
; Addresses in the file redirection structure
;
redir_mode equ byte ptr .0 ; Bit 0: 0=write 1=read
; Bits 1-2: 0=file 1=aux 2=lst
redir_fcb equ byte ptr .1 ; FCB for redirected file
redir_buf_count equ byte ptr .25h ; Count of bytes in current buffer
redir_cwd equ word ptr .26h ; Current directory for redirected file
redir_buf equ byte ptr .28h ; Current record

View File

@@ -0,0 +1,193 @@
/* Convert the Personal CP/M-86 BDOS (compiled as a small-model EXE)
* to CMD.
* Copyright (C) 2003, 2007 John Elliott <jce@seasip.demon.co.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <stdio.h>
#include <string.h>
#define DS_LEN 0xF0 /* Length of data segment (paras) */
int gl_base = 0x60;
/* EXE header (plus first 8 bytes of EXE file) */
unsigned char exe_header[0x208];
/* CMD header */
unsigned char cmd_header[0x80];
/* Read a word from the EXE header */
unsigned short peek(int offset)
{
unsigned short l = exe_header[offset];
unsigned short h = exe_header[offset + 1];
return (h << 8) | l;
}
/* Add a group to the CMD header */
void addgroup(int type, unsigned short paras, unsigned short base,
unsigned short minparas, unsigned short maxparas)
{
static unsigned char *group = cmd_header;
*group++ = type;
*group++ = (paras & 0xFF);
*group++ = (paras >> 8);
*group++ = (base & 0xFF);
*group++ = (base >> 8);
*group++ = (minparas & 0xFF);
*group++ = (minparas >> 8);
*group++ = (maxparas & 0xFF);
*group++ = (maxparas >> 8);
printf("Group %d: len=%04x base=%04x min=%04x max=%04x\n",
type, paras, base, minparas, maxparas);
}
/* Copy bytes from one file to another.
* TODO: Warn if error. */
void mvbytes(FILE *fpexe, FILE *fpcmd, long count)
{
int c;
while (count)
{
c = fgetc(fpexe);
fputc(c, fpcmd);
--count;
}
}
int main(int argc, char **argv)
{
FILE *fpexe, *fpcmd;
unsigned short cseg,dseg,sseg,dstop;
unsigned short dsmin, dsmax, exeparas;
unsigned long exelen, dsbytes;
long pos;
int n;
if (argc < 3)
{
fprintf(stderr, "Syntax: exe2cmd <exefile> <cmdfile>\n");
return 1;
}
for (n = 3; n < argc; n++)
{
if (!strncmp(argv[n], "base=", 5))
{
if (!sscanf(&argv[n][5], "%x", &gl_base))
{
fprintf(stderr, "base= option incorrect.\n");
return 1;
}
}
}
/* Load EXE header, and extract the segment info. This code depends
* on the word at CS:6 being the length of the code segment in
* paragraphs. */
fpexe = fopen(argv[1], "rb");
if (!fpexe)
{
perror(argv[1]);
return 1;
}
if (fread(exe_header, 1, sizeof(exe_header), fpexe) < (int)sizeof(exe_header)
/* Check for CP/M-86 BDOS:
* 32 header paragraphs
* First relocation is at address 6 or less */
|| peek(8) != 32 || peek(32) > 6)
{
fclose(fpexe);
fprintf(stderr, "%s is not a BDOS image\n", argv[1]);
return 1;
}
cseg = 0;
dseg = peek(0x206);
sseg = peek(14);
exelen = 512L * peek(4);
if (peek(2)) exelen -= (512 - peek(2));
exeparas = (exelen + 15) >> 4;
/*
dstop = exeparas - peek(8);
ssparas = dstop - sseg;
dsmin = dstop - dseg + peek(10);
dsmax = dstop - dseg + peek(12);
*/
/* This is CP/M-86, the DSEG is a fixed size */
dsmin = dsmax = DS_LEN;
dstop = dseg + DS_LEN;
printf("EXE length = %04lx\n", exelen);
printf("EXE header len = %04x\n", peek(8));
printf("EXE paras = %04x\n", exeparas);
printf("DS top = %04x\n", dstop);
printf("CS: %04x length %04x\n", cseg, dseg - cseg);
printf("DS: %04x length %04x\n", dseg, dstop - dseg);
/* Now generate CP/M-86 header. */
addgroup(1, dseg - cseg, 0, dseg - cseg, 0);
addgroup(2, dstop - dseg, 0, dsmin, 0);
fpcmd = fopen(argv[2], "wb");
if (fpcmd == NULL)
{
perror(argv[2]);
fclose(fpexe);
return 2;
}
if (fwrite(cmd_header, 1, sizeof(cmd_header), fpcmd) < (int)sizeof(cmd_header)
|| fwrite(exe_header+0x200, 1, 8, fpcmd) < 8)
{
fclose(fpcmd);
fclose(fpexe);
perror(argv[2]);
return 2;
}
/* Write the code segment. The first 8 bytes have been done. */
mvbytes(fpexe, fpcmd, 16L * (dseg - cseg) - 8);
/* Write the data segment. */
dsbytes = 16L * (dstop - dseg);
mvbytes(fpexe, fpcmd, 40);
/* Apply fixups to offsets within the data segment */
for (n = 0; n < 8; n++)
{
unsigned seg;
if (n == 6)
{
mvbytes(fpexe, fpcmd, 4);/* Address of DOS module */
continue;
}
mvbytes(fpexe, fpcmd, 2); /* Offset */
fread(exe_header, 1, 2, fpexe);
seg = peek(0) + gl_base;
fputc(seg & 0xFF, fpcmd);
fputc(seg >> 8, fpcmd);
}
mvbytes(fpexe, fpcmd, dsbytes - 72);
/* Pad the CMD file out to a whole number of records */
pos = ftell(fpcmd);
while (pos & 0x7F)
{
fputc(0, fpcmd);
++pos;
}
fclose(fpcmd);
fclose(fpexe);
return 0;
}

View File

@@ -0,0 +1,38 @@
ZIPFILES= bdos.a86 cmdio.c equates.a86 mem.a86 system.a86 \
serial.a86 cmdio.h exe2cmd.c misc.a86 proctbl.a86 \
xios.cmd ccp.cmd dpgen.c makefile rtm.a86 \
cio.a86 entry.a86 sup.a86 bdos31ex.inp \
ccpldr.a86
OBJECTS=entry.obj sup.obj rtm.obj mem.obj cio.obj misc.obj bdos.obj \
ccpldr.obj proctbl.obj
all: bdos.cmd new.sys
new.sys: bdos.cmd ccp.cmd xios.cmd dpgen.exe
dpgen base=70
bdos31.exe: $(OBJECTS)
linkexe bdos31ex[i
bdos.cmd: bdos31.exe exe2cmd.exe
exe2cmd bdos31.exe bdos.cmd base=70
%.obj: %.a86 equates.a86 system.a86
rasm86 $<
misc.obj: misc.a86 equates.a86 system.a86 serial.a86
dpgen.exe: dpgen.c cmdio.c cmdio.h
pacc -Bl dpgen.c cmdio.c
exe2cmd.exe: exe2cmd.c
pacc -Bs $<
clean:
xdel $(OBJECTS)
xdel bdos.cmd new.sys
zip:
zip bdos31.zip $(ZIPFILES)

View File

@@ -0,0 +1,737 @@
include equates.a86
dseg
extrn pq_memmgr:word
extrn ccp_dseg:word
cseg
extrn bdos_callback:near
public mem_init
public mem_main
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
mem_init: retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
mem_main: push dx
push si
mov bx, offset pq_memmgr
mov cx, 204h
call bdos_callback
inc es:proc_indisk
pop si
pop dx
call cs:mem_functions[si]
jb mc_success
mov bx, 0FFFFh
mc_success: ; CODE XREF: funcs_MC+17j
push bx
push cx
mov cx, 206h
call bdos_callback
mov bx, offset pq_memmgr
mov cx, 205h
call bdos_callback
pop cx
pop bx
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mem_functions dw offset MC_MAX ; DATA XREF: funcs_MC+12o
dw offset MC_ABSMAX
dw offset MC_ALLOC
dw offset MC_ABSALLOC
dw offset MC_FREE
dw offset MC_ALLFREE
dw offset mc_temp_untemp
dw offset mc_cleanprg
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_ABSALLOC: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+36o
call get_mcb_pars
jmp common_alloc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_ABSMAX: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+32o
call get_mcb_pars
mov mcb_len_min, 1
jmp common_alloc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_ALLFREE: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+3Ao
call get_mcb_pars
cmp mcb_ext, 2
jnb mcaf_just_anyle
mov dx, 8
call free_allmem
mcaf_just_anyle: ; CODE XREF: MC_ALLFREE+8j
jmp mc_anyleft
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_ALLOC: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+34o
call get_mcb_pars
mov mcb_segment, 0
jmp common_alloc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_FREE: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+38o
call get_mcb_pars
mov al, mcb_ext
cmp al, 0FFh
jnz free_onemem
mov dx, 8
call free_allmem
jmps free_done
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
free_onemem: ; CODE XREF: MC_FREE+8j
cmp al, 2
jnb free_done
call ml_free
jmps free_done
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jmps free_done
free_done: ; CODE XREF: MC_FREE+10j MC_FREE+14j
; ...
jmp mc_anyleft
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
MC_MAX: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+30o
call get_mcb_pars
mov mcb_segment, 0
mov mcb_len_min, 1
jmp common_alloc
;
; Resets the 'temporary' flag on all temporary allocations,
; making them permanent.
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
mc_temp_untemp: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+3Co
mov bx, ccp_dseg ; Temp blocks exist?
test bx, bx
jnz mctu_temp_found
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mctu_temp_found: ; CODE XREF: mc_temp_untemp+6j
push bx
mov di, offset mem_table-6
mctu_loop: ; CODE XREF: mc_temp_untemp+16j
call ml_next
jnb mctu_done
and byte ptr 5[di], 0FEh
jmps mctu_loop
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mctu_done: ; CODE XREF: mc_temp_untemp+10j
pop bx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
mc_cleanprg: ; CODE XREF: funcs_MC+12u
; DATA XREF: funcs_MC+3Eo
push dx
;
; If bit 2 set in process flags, look for all memory blocks
; with bit 2 set in their flags and set bit 0
;
test es:proc_flags, 4
jz mccp_endlabel
mov di, offset mem_table-6
mccp_label: ; CODE XREF: mc_cleanprg+16j
; mc_cleanprg+1Cj
call ml_next
jnb mccp_endlabel
test byte ptr 5[di], 4
jz mccp_label
or byte ptr 5[di], 1
jmps mccp_label
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mccp_endlabel: ; CODE XREF: mc_cleanprg+8j
; mc_cleanprg+10j
pop dx
cmp dx, 1
jz mccp_type1
xor dx, dx
call free_allmem
jmps mccp_end
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mccp_type1: ; CODE XREF: mc_cleanprg+22j
mov di, offset mem_table-6
mccp_type1_loop: ; CODE XREF: mc_cleanprg+3Aj
; mc_cleanprg+40j
call ml_next
jnb mccp_end
mov al, es:proc_pid
cmp 4[di], al
jnz mccp_type1_loop
mov byte ptr 4[di], 0FDh
jmps mccp_type1_loop
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mccp_end: ; CODE XREF: mc_cleanprg+29j
; mc_cleanprg+31j
xor bx, bx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
get_mcb_pars: ; CODE XREF: MC_ABSALLOCp MC_ABSMAXp
; ...
mov caller_mcb, dx
mov bx, dx
push es
mov es, es:userDS
mov ax, es:[bx]
mov mcb_segment, ax
mov ax, es:2[bx]
mov mcb_len_min, ax
mov mcb_len_max, ax
xor ax, ax
mov cl, es:4[bx]
mov mcb_ext, cl
cmp cl, 2
jnz mcb_ext_range
mov ax, 2 ; Keep memory flag
mcb_ext_range: ; CODE XREF: get_mcb_pars+29j
pop es
mov dx, es:proc_flags
and dx, 0Ch
cmp ccp_dseg, 0 ; Do temporary blocks exist?
jz mcb_noccpdseg
and dx, 0FFFBh
mcb_noccpdseg: ; CODE XREF: get_mcb_pars+3Dj
or ax, dx
mov mcb_keep_flag, al
mov cx, 2Bh ; Bad Parameter
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
common_alloc: ; CODE XREF: MC_ABSALLOC+3j
; MC_ABSMAX+9j ...
cmp mcb_ext, 2 ; Remain after termination?
ja mc_anyleft
call allocate_block
mc_anyleft: ; CODE XREF: MC_ALLFREE+10j
; MC_FREE+1Dj ...
push es
pushf
mov es, es:userDS
mov di, offset mem_table-6
xor dl, dl ; Not available
call ml_find_free
jnb mc_noneleft
inc dl ; Available
mc_noneleft: ; CODE XREF: common_alloc+19j
mov bx, caller_mcb
mov es:4[bx], dl
mov ax, mcb_segment
mov es:[bx], ax
mov ax, mcb_len_max
mov es:2[bx], ax
xor bx, bx
popf
pop es
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
allocate_block: ; CODE XREF: common_alloc+7p
mov cx, 43 ; Bad parameter
mov ax, mcb_len_min
mov bx, mcb_len_max
push ax
or ax, bx
pop ax
jz mcb_param_err
cmp ax, bx
ja mcb_param_err
cmp mcb_segment, 0
jz mcb_not_abs
mcb_abs_retry: ; CODE XREF: allocate_block+36j
mov dx, mcb_segment ; Find the memory list entry
; controlling this segment.
call ml_find_byseg
jnb mcb_param_err ; If failed, segment not in the memory arena.
mov al, 4[di] ; Get the PID of the memory owner
cmp al, 0FEh ; Does the entry contain free memory?
jz mcb_wasfree ; Yes. Allocate in it.
test byte ptr 5[di], 1; Is it owned by a temporary block?
jz mcb_nofree
push ax ; Free all temporary blocks
call free_temp_block
pop ax ; And if that worked, try again
jb mcb_abs_retry
mcb_nofree: ; CODE XREF: allocate_block+2Fj
cmp al, es:proc_pid ; Block is in use. By the current
; process?
jnz mcb_param_err
mov ax, [di] ; Suppose so.
cmp ax, mcb_segment ; Does the passed start address match the
; start of the block?
jnz mcb_param_err
;
; In this case, we're trying to allocate a block
; which was allocated already. Update its
; flags and then leave it.
;
mov al, mcb_keep_flag
or 5[di], al
jmps mcb_allocated
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mcb_wasfree: ; CODE XREF: allocate_block+29j
mov ax, [di] ; Start of block
add ax, 2[di] ; End of block
sub ax, mcb_segment ; Max size to allocate
cmp ax, mcb_len_min ; Is it > min size requested?
jb mcb_param_err
call ml_checksplit
jnb mcb_didntsplit
mov byte ptr 4[si], 0FEh; Mark the new block as free
mov di, si
mcb_didntsplit: ; CODE XREF: allocate_block+61j
jmps mcb_doalloc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mcb_not_avail: ; CODE XREF: allocate_block+96j
mov cx, 3
mcb_param_err: ; CODE XREF: allocate_block+Ej
; allocate_block+12j
; ...
clc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mcb_not_abs: ; CODE XREF: allocate_block+19j
; allocate_block+90j
xor dx, dx
mov di, offset mem_table-6
not_abs_next: ; CODE XREF: allocate_block+89j
call ml_find_free
jnb not_abs_endscan
mov ax, 2[di] ; Length of free block
cmp dx, ax ; Suitable candidate?
jnb not_abs_small
mov dx, ax
mov si, di ; Keep it in mind
not_abs_small: ; CODE XREF: allocate_block+7Fj
cmp ax, mcb_len_max
jb not_abs_next ; Block isn't ideal
jmps mcb_doalloc; Got an ideal block. Use it.
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
not_abs_endscan: ; CODE XREF: allocate_block+78j
call free_temp_block ; Free temp blocks and try again
jb mcb_not_abs
cmp dx, mcb_len_min ; Can we at least get the minimum?
jb mcb_not_avail
mov ax, 2[si] ; OK, make do with the best one we found
mov mcb_len_max, ax
mov di, si
mcb_doalloc: ; CODE XREF: allocate_block+69j
; allocate_block+8Bj
mov ax, [di]
mov mcb_segment, ax
call ml_splittail ; If not all the block was taken,
; mark the remainder as free.
jnb mcb_tookall
mov byte ptr 4[si], 0FEh
mcb_tookall: ; CODE XREF: allocate_block+A8j
mov al, mcb_keep_flag
mov 5[di], al
mov al, es:proc_pid
test mcb_keep_flag, 4
jz mcb_gotowner
mov al, 0FCh ; Owner -4 for blocks that persist
mcb_gotowner: ; CODE XREF: allocate_block+BDj
mov 4[di], al
mcb_allocated: ; CODE XREF: allocate_block+4Dj
mov ax, 2[di]
mov mcb_len_max, ax
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
free_temp_block: ; CODE XREF: allocate_block+32p
; allocate_block+8Dp
mov di, offset mem_table-6
clc
pushf
freetmp_loop: ; CODE XREF: free_temp_block+Ej
; free_temp_block+1Ej
call ml_next
jnb freetmp_done
test byte ptr 5[di], 1; Temporary?
jz freetmp_loop
popf
stc
pushf
push di ; If so, free it
call ml_freeblk
pop di
mov ccp_dseg, 0
jmps freetmp_loop
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
freetmp_done: ; CODE XREF: free_temp_block+8j
popf
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
free_allmem: ; CODE XREF: MC_ALLFREE+Dp
; MC_FREE+Dp ...
mov di, offset mem_table-6
push dx
freeall_loop: ; CODE XREF: free_allmem+10j
; free_allmem+19j ...
call ml_next
jnb allmem_freed
mov al, es:proc_pid
cmp 4[di], al ; Owned by this process?
jnz freeall_loop
pop dx
mov al, 5[di] ; Flags
test al, dl
push dx
jnz freeall_loop
test al, 2
mov byte ptr 4[di], 0FDh
jnz freeall_loop
call ml_freeblk
jmps freeall_loop
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
allmem_freed: ; CODE XREF: free_allmem+7j
pop dx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_free: ; CODE XREF: MC_FREE+16p
mov dx, mcb_segment
call ml_find_byseg ; Find memory list entry for this segment
jnb ml_freefail
cmp byte ptr 4[di], 0FDh
jz ml_canfree ; Owned by ??? shared ???
mov al, es:proc_pid
cmp 4[di], al ; Owned by this process?
jz ml_canfree
mov cx, 20h ; Don't own resource
jmps ml_freefail
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ml_canfree: ; CODE XREF: ml_free+Dj ml_free+16j
cmp dx, [di] ; Block start matches?
jz ml_freeblk
call ml_splitblk ; No. Split block
mov di, si
jb ml_freeblk
ml_freefail: ; CODE XREF: ml_free+7j ml_free+1Bj
clc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_freeblk: ; CODE XREF: free_temp_block+14p
; free_allmem+23p ...
mov ax, 0FEh
mov 4[di], al ; Owner = free
mov byte ptr 5[di], 0; Persist = 0
mov si, di
mov dx, [si]
dec dx ; Who owns the para before the memory
; we're freeing?
push ax
call ml_find_byseg
pop ax
jnb no_coalesce ; Not found
cmp 4[di], al
jnz no_coalesce ; Not free
mov cx, 2[si]
add 2[di], cx ; Merge blocks
mov byte ptr 4[si], 0FFh
mov si, di ; Destroy this block
no_coalesce: ; CODE XREF: ml_freeblk+14j
; ml_freeblk+19j
mov di, si
mov dx, [di]
add dx, 2[di] ; Now try the same with the following
; block.
push ax
call ml_find_byseg
pop ax
jnb no_coalesce2
cmp 4[di], al
jnz no_coalesce2
mov cx, 2[di]
add 2[si], cx
mov byte ptr 4[di], 0FFh
no_coalesce2: ; CODE XREF: ml_freeblk+33j
; ml_freeblk+38j
mov di, si
xor bx, bx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_checksplit: ; CODE XREF: allocate_block+5Ep
mov ax, mcb_segment
mov dx, ax ; DX = first requested para
sub ax, [di] ; AX = paras before allocated area
cmp ax, 1 ; If there are some...
jnb ml_splitblk ; Then split the block
clc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_splittail: ; CODE XREF: allocate_block+A5p
mov dx, mcb_len_max
mov ax, 2[di]
sub ax, dx
cmp ax, 1
jnb ml_dospltail
clc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ml_dospltail: ; CODE XREF: ml_splittail+Cj
add dx, mcb_segment
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_splitblk: ; CODE XREF: ml_free+21p ml_checksplit+Aj
mov cx, 12h
push di
mov di, offset mem_table-6
ml_split1: ; CODE XREF: ml_splitblk+10j
call ml_next
jnb ml_split2
cmp byte ptr 4[di], 0FFh
jnz ml_split1
pop si
xchg si, di
mov [si], dx
mov ax, [di]
add ax, 2[di]
sub ax, dx
mov 2[si], ax
sub dx, [di]
mov 2[di], dx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ml_split2: ; CODE XREF: ml_splitblk+Aj
pop di
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_find_byseg: ; CODE XREF: allocate_block+1Fp
; ml_free+4p ...
mov di, offset mem_table-6
mov cx, 3
mlfbs_loop: ; CODE XREF: ml_find_byseg+Fj
; ml_find_byseg+15j ...
call ml_next
jnb mlfbs_end
cmp byte ptr 4[di], 0FFh
jz mlfbs_loop
mov ax, [di]
cmp ax, dx
ja mlfbs_loop
add ax, 2[di]
cmp dx, ax
jnb mlfbs_loop
mlfbs_end: ; CODE XREF: ml_find_byseg+9j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_find_free: ; CODE XREF: common_alloc+16p
; allocate_block+75p
; ...
call ml_next
jnb no_free_ml
cmp byte ptr 4[di], 0FEh
jnz ml_find_free
stc
no_free_ml: ; CODE XREF: ml_find_free+3j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
ml_next: ; CODE XREF: mc_temp_untemp+Dp
; mc_cleanprg+Dp ...
add di, 6
mov ax, offset msg_cannot_load
cmp di, ax
retn
dseg
mcb_len_min dw 0 ; DATA XREF: MC_ABSMAX+3w MC_MAX+9w
; ...
mcb_len_max dw 0 ; DATA XREF: get_mcb_pars+19w
; common_alloc+2Br ...
mcb_segment dw 0 ; DATA XREF: MC_ALLOC+3w MC_MAX+3w
; ...
mcb_keep_flag db 0 ; DATA XREF: get_mcb_pars+45w
; allocate_block+47r
; ...
caller_mcb dw 0 ; DATA XREF: get_mcb_parsw
; common_alloc+1Dr
mcb_ext db 0 ; DATA XREF: MC_ALLFREE+3r
; MC_FREE+3r ...
end

View File

@@ -0,0 +1,397 @@
include equates.a86
include system.a86
dseg
extrn rlr:word
extrn login_vector:word
extrn readonly_vector:word
extrn date_days:word
extrn date_secs:byte
extrn bdos_8087_inuse:word
extrn cio_flags:word
extrn ccp_dseg:word
extrn sysvar_131:byte
extrn sysvar_132:byte
extrn search_path:byte
extrn proc_count:byte
extrn time_slice:byte
extrn page_mode:byte
extrn temp_drive:byte
extrn max_x:byte
extrn max_y:byte
extrn bdos_ver:word
extrn boot_drive:byte
cseg
public misc_init
public misc_main
db 'COPYRIGHT(C)1983,DIGITAL RESEARCH'
db '(11/16/83)'
sernumber:
include serial.a86
misc_init: ; DATA XREF: dseg:0016o
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
misc_functions dw offset P_RSX_default ; DATA XREF: bdos:2317o
dw offset S_BDOSVER
dw offset DRV_LOGINVEC
dw offset DRV_GET
dw offset F_DMAOFF
dw offset DRV_ROVEC
dw offset F_USERNUM
dw offset F_MULTISEC
dw offset F_ERRMODE
dw offset S_SYSVAR
dw offset F_DMASEG
dw offset F_DMAGET
dw offset T_SET
dw offset T_GET
dw offset S_SERIAL
dw offset P_CODE
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
misc_main: ; DATA XREF: dseg:0014o
jmp cs:misc_functions[si]
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_RSX_default: ; DATA XREF: bdos:22EFo
mov bx, 0FFFFh
mov cx, 2
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
S_BDOSVER: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22F1o
mov bx, bdos_ver
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
S_SYSVAR: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:2301o
mov si, dx ; Caller SCBPB
mov dx, ds ; Our DS
push ds
push es
mov ds, es:userDS ; Caller DS
mov di, offset public_sysvars
xor bx, bx
mov bl, [si]
cmp bl, 6
jb sysvar_valid
sub bl, 80h
jb sysvar_invalid
mov di, offset private_sysvars
cmp bl, 0Eh
jb sysvar_valid
sysvar_invalid: ; CODE XREF: S_SYSVAR+1Aj S_SYSVAR+4Fj
; ...
mov bx, 0FFFFh
jmps s_sysvar_ret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sysvar_valid: ; CODE XREF: S_SYSVAR+15j S_SYSVAR+22j
shl bx, 1
shl bx, 1
mov cx, cs:[bx+di]
test ch, 80h ; Process variable?
jz not_proc_var
mov dx, es
not_proc_var: ; CODE XREF: S_SYSVAR+33j
mov di, cs:2[bx+di]
test byte ptr 1[si], 0FFh
lea si, 2[si]
jnz sysvar_set
xchg si, di
push ds
pop es
mov ds, dx
jmps sysvar_access
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sysvar_set: ; CODE XREF: S_SYSVAR+42j
test ch, 40h ; Read-only?
jnz sysvar_invalid
cmp es:proc_background, 0
jz sysvar_is_fg
test ch, 20h ; Owned by FG process?
jnz sysvar_invalid
sysvar_is_fg: ; CODE XREF: S_SYSVAR+57j
mov es, dx
sysvar_access: ; CODE XREF: S_SYSVAR+4Aj
test ch, 10h ; Volatile?
jz sysvar_nocli
cli
sysvar_nocli: ; CODE XREF: S_SYSVAR+63j
xor ch, ch
rep movsb
sti
xor bx, bx
s_sysvar_ret: ; CODE XREF: S_SYSVAR+27j
pop es
pop ds
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public_sysvars dw 2001h ; DATA XREF: S_SYSVAR+Bo
dw offset max_x
dw 2001h
dw offset max_y
dw 2001h
dw offset page_mode
dw 6001h
dw offset xios_bh_ticks
dw 2001h
dw offset temp_drive
dw 1005h
dw offset date_days
private_sysvars dw 2001h ; DATA XREF: S_SYSVAR+1Co
dw offset xios_bh_8087
dw 0E001h
dw offset proc_pid
dw 801Ah
dw offset proc_drive
dw 2001h
dw offset sysvar_131
dw 20FFh
dw offset sysvar_132
dw 3002h
dw offset ccp_dseg
dw 20FFh
dw offset boot_drive
dw 3004h
dw offset search_path
dw 0E001h
dw offset proc_background
dw 6001h
dw offset proc_count
dw 2001h
dw offset time_slice
dw 6002h ; BUG? this is 2002h in PCP/M 2.04e
dw offset cio_flags
dw 6001h
dw offset bdos_8087_inuse
dw 9004h
dw offset proc_onblock
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
S_SERIAL: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:230Bo
push es
mov es, es:userDS
mov di, dx
mov si, offset sernumber+10
mov cx, 3
db 0F3h, 2Eh ;REP CS:
movsw
pop es
mov bx, cx
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_CODE: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:230Do
inc dx
jz p_code_get
dec dx
mov es:proc_errcode, dx
p_code_get: ; CODE XREF: P_CODE+1j
mov bx, es:proc_errcode
retn
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
DRV_LOGINVEC: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22F3o
mov bx, login_vector
ret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
DRV_GET: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22F5o
mov bl, es:proc_drive
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_DMAOFF: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22F7o
mov es:word ptr proc_dma, dx
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
DRV_ROVEC: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22F9o
mov bx, readonly_vector
ret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_USERNUM: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22FBo
mov al, dl
cmp al, 0FFh
jnz f_setuid
mov bl, es:proc_uid
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
f_setuid: ; CODE XREF: F_USERNUM+4j
and al, 0Fh
mov es:proc_uid, al
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_MULTISEC: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22FDo
xor bx, bx
or dl, dl
jz f_bad_multisec
cmp dl, 81h
jnb f_bad_multisec
mov es:proc_multisec, dl
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
f_bad_multisec: ; CODE XREF: F_MULTISEC+4j
; F_MULTISEC+9j
dec bx
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_ERRMODE: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:22FFo
mov es:proc_errmode, dl
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_DMASEG: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:2303o
mov es:word ptr proc_dma+2, dx
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
F_DMAGET: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:2305o
mov ax, es:word ptr proc_dma+2
mov es:userES, ax
mov bx, es:word ptr proc_dma
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
T_SET: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:2307o
mov si, dx
mov di, offset date_days
pushf
cli
push es
push ds
mov ds, es:userDS
pop es
movsw
movsw
push es
pop ds
pop es
mov date_secs, 0
popf
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
T_GET: ; CODE XREF: bdos:2317u
; DATA XREF: bdos:2309o
mov di, dx
mov si, offset date_days
push es
mov es, es:userDS
pushf
cli
movsw
movsw
mov bl, date_secs
popf
pop es
retn
end

View File

@@ -0,0 +1,45 @@
include equates.a86
cseg
extrn bdos_rsx:near
dseg
public proc1
;
; First process
;
proc1 dw 0
dw offset proc2 ; DATA XREF: bdos:0044r bdos:0050w
rw 2
db 'INIT '
db 0
rw 4
db '$'
rb 45
db 1
rw 5
dw offset bdos_rsx
rb 10Ch
proc2 dw 0
dw proc3
db 2, 1
rb 15Ah
proc3 dw 0
dw proc4
db 2, 2
rb 15Ah
proc4 dw 0
dw 0
db 2, 3
rb 15Ah

View File

@@ -0,0 +1 @@
BDOS 3.1 for PCP/M-86 1.05

View File

@@ -0,0 +1,897 @@
include equates.a86
include system.a86
dseg
extrn rlr:word
extrn drl:word
extrn bdos_conowner:word
extrn lp_sysflag_chg:dword
extrn time_slice:byte
extrn pq_disk:word
extrn lst_owner:byte
extrn aux_owner:byte
extrn bdos_8087_inuse:byte
extrn proc_count:byte
extrn bdos_sysflags:word
cseg
extrn bdos_dseg:word
extrn bdos_callback:near
extrn far_ret_1:near
public rtm_main
public rtm_init
public rtm_timeslice
public rtm_sysflag
rtm_init: ; DATA XREF: dseg:0006o
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtm_main: ; DATA XREF: dseg:0004o
call cs:rtm_functions[si]; 0208, get new process
jb proc_ok
mov bx, 0FFFFh
proc_ok: ; CODE XREF: bdos:0EDFj
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtm_functions dw offset P_TERMCPM ; DATA XREF: bdos:0EDAo
dw offset P_WAITFLAG
dw offset P_DELAY
dw offset P_DISPATCH
dw offset P_0204 ; Enter a process-queue controlled area
dw offset P_0205 ; Leave a process-queue controlled area
dw offset P_0206
dw offset P_0207 ; Check runnable processes
dw offset get_new_process; 0208, get new process
dw offset P_0209 ; Wake a process (DX = process segment)
dw offset P_020A ; Terminate foreground process
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_WAITFLAG: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EE7o
cli
call lookup_flag
jnb pwf_badflag
cmp ax, 0FFFEh
jz pwf_minus2
ja pwf_block
mov cx, 6
clc
jmps pwf_badflag
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pwf_block: ; CODE XREF: P_WAITFLAG+Bj
mov [bx], es ; Process waiting on flag
mov es:proc_status, 3; Make process wait
mov es:proc_countdown, dx
call delay_dispatch
jmps pwf_done
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pwf_minus2: ; CODE XREF: P_WAITFLAG+9j
mov word ptr [bx], 0FFFFh
pwf_done: ; CODE XREF: P_WAITFLAG+23j
stc
pwf_badflag: ; CODE XREF: P_WAITFLAG+4j
; P_WAITFLAG+11j
sti
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
rtm_sysflag: ; CODE XREF: xios_int09+EDu
; DATA XREF: dseg:0038o
cmp dl, 1
jnz bsf_not1
mov xios_bh_delay, 0
mov ax, bdos_conowner
push es
bsf_checktimer: ; CODE XREF: rtm_sysflag+34j
mov es, ax
cmp es:proc_status, 1; Waiting on timer
jnz bsf_nexttimer
mov xios_bh_delay, 0FFh
call is_proc_busy
jb bsf_wakeproc
dec es:proc_countdown
jnz bsf_nexttimer
bsf_wakeproc: ; CODE XREF: rtm_sysflag+20j
mov dx, es
call P_0209 ; Wake a process (DX = process segment)
bsf_nexttimer: ; CODE XREF: rtm_sysflag+16j
; rtm_sysflag+27j
mov ax, es:proc_nextseg
test ax, ax
jnz bsf_checktimer
xor ax, ax
pop es
jmps bsf_done
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bsf_not1: ; CODE XREF: rtm_sysflag+3j
pushf
cli
call lookup_flag
jnb bsf_badflag
cmp ax, 0FFFEh
jz bsf_overrun
ja bsf_nowake
mov word ptr [bx], 0FFFFh
mov dx, ax
call P_0209 ; Wake a process (DX = process segment)
jmps bsf_woken
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bsf_nowake: ; CODE XREF: rtm_sysflag+47j
mov word ptr [bx], 0FFFEh
bsf_woken: ; CODE XREF: rtm_sysflag+52j
xor ax, ax
jmps bsf_popret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bsf_overrun: ; CODE XREF: rtm_sysflag+45j
mov cx, 5
bsf_badflag: ; CODE XREF: rtm_sysflag+40j
mov ax, 0FFFFh
bsf_popret: ; CODE XREF: rtm_sysflag+5Aj
popf
bsf_done: ; CODE XREF: rtm_sysflag+39j
mov bx, ax
retf
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
lookup_flag: ; CODE XREF: P_WAITFLAG+1p
; rtm_sysflag+3Dp
mov cx, 4
cmp dl, xios_bh_lastflg
ja luf_badflag
xor dh, dh
mov bx, bdos_sysflags
add bx, dx
add bx, dx
mov ax, [bx]
stc
luf_badflag: ; CODE XREF: lookup_flag+7j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; 0208, get new process
get_new_process: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EF5o
push ds
mov bx, bdos_conowner
mov cx, 4
gnp_loop: ; CODE XREF: get_new_process+14j
mov ds, bx
cmp proc_status, 2 ; 0 => Runnable
; 1 => waiting on timer
; 2 => terminated
; 3 => waiting on flag
jz gnp_found
add bx, 16h
loop gnp_loop
pop ds
clc
mov cx, 0Ch
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gnp_found: ; CODE XREF: get_new_process+Fj
pop ds
inc proc_count
xor cx, cx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_DELAY: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EE9o
cmp xios_bh_ticks, 0
jnz delay_haveclock
mov cx, 45 ; No tick
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delay_haveclock: ; CODE XREF: P_DELAY+5j
mov tick_wait_proc, es
cli
mov xios_bh_delay, 0FFh; Ask for ticks, because
mov es:proc_status, 1; there's now a process waiting
mov es:proc_countdown, dx
jmp delay_dispatch
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Terminate foreground process
P_020A: ; CODE XREF: bdos:0EDAu P_TERMCPM+4Cp
; DATA XREF: ...
xor bp, bp
jmps proc_doterm
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
proc_term_bg: ; CODE XREF: P_TERMCPM+5Bp
mov bp, 1
proc_doterm: ; CODE XREF: P_020A+2j
push ds
push es
mov di, offset proc_passwd+6; BDOS pointer - 4
lds si, es:4[di]
proc_unhook_rsx: ; CODE XREF: proc_term_bg+29j
; proc_term_bg+58j
mov ax, 4[si]
or ax, 6[si]
jz proc_unhooked
mov byte ptr 18[si], 0FFh
test bp, bp
jnz proc_free_rsx
cmp byte ptr 3[si], 0
jnz proc_free_rsx
push si
pop di
push ds
pop es
lds si, 4[si]
jmps proc_unhook_rsx
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
proc_free_rsx: ; CODE XREF: proc_term_bg+1Aj
; proc_term_bg+20j
mov ax, 20[si]
lds si, 4[si]
mov es:4[di], si
mov es:6[di], ds
push si
push ds
push di
push es
push bp
mov ds, cs:bdos_dseg
mov es, rlr
mov mcb_to_free, ax
mov dx, offset mcb_to_free
mov cx, 39h ; MC_FREE
call bdos_callback
pop bp
pop es
pop di
pop ds
pop si
jmps proc_unhook_rsx
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
proc_unhooked: ; CODE XREF: proc_term_bg+12j
pop es
pop ds
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
kill_process: ; CODE XREF: delay_dispatch+6Aj
; delay_dispatch+128j
mov ax, es
cli
mov ss, ax
mov sp, 100h
sti
mov al, es:proc_pid
cmp aux_owner, al
jnz dont_free_aux
mov aux_owner, 0FFh
dont_free_aux: ; CODE XREF: kill_process+11j
cmp lst_owner, al
jnz dont_free_lst
mov lst_owner, 0FFh
dont_free_lst: ; CODE XREF: kill_process+1Cj
and es:proc_flags, 0FFFEh
mov es:proc_errcode, 0FFFEh
cmp es:proc_fx, 0Ah ; If broken into line input
mov es:proc_fx, 0
jnz dont_reset_disk
mov cx, 0Dh ; Then reset disks
call bdos_callback ; presumably so ^C at command prompt
; does what the user expects.
dont_reset_disk: ; CODE XREF: kill_process+3Dj
call release_queues ; Release all process queues owned by a process
call_termcpm: ; CODE XREF: P_0206+1Bj
xor cx, cx
mov dx, cx
jmp bdos_callback
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_0206: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EF1o
mov tick_wait_proc, es
dec es:proc_indisk
jnz P_0207 ; Check runnable processes
test es:proc_flags, 1
jz P_0207 ; Check runnable processes
and es:proc_flags, 0FFFEh
jmps call_termcpm
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
P_TERMCPM: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EE5o
cli
mov es:word ptr proc_onblock, offset far_ret_1
mov es:word ptr proc_onblock+2, cs
sti
push dx
call release_queues ; Release all process queues owned by a process
mov cx, 723h
call bdos_callback
pop dx
mov cx, 307h
call bdos_callback
cmp es:proc_background, 0
jnz ptc_background
call P_020A ; Kill foreground process
mov cx, 103h ; Bring CCP to foreground
jmp bdos_callback
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptc_background: ; CODE XREF: P_TERMCPM+4Aj
call proc_term_bg ; Terminate background process
dec proc_count
test es:proc_flags, 2; Was using 8087?
jz ptc_not8087
and es:proc_flags, 0FFFDh
mov bdos_8087_inuse, 0
ptc_not8087: ; CODE XREF: P_TERMCPM+69j
mov tick_wait_proc, es
mov es:proc_status, 2; 0 => Runnable
; 1 => waiting on timer
; 2 => terminated
; 3 => waiting on flag
jmp delay_dispatch
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Check runnable processes
P_0207: ; CODE XREF: bdos:0EDAu P_0206+9j
; ...
xor ax, ax
mov tick_wait_proc, ax
cmp drl, ax ; Anything waiting to run?
jnz P_DISPATCH ; If so, give it a go
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Release all process queues owned by a process
release_queues: ; CODE XREF: P_TERMCPM+2Ep
; kill_process+45p
mov bx, offset pq_disk
release_loop: ; CODE XREF: release_queues+Cj
push bx
call P_0205 ; Leave a process-queue controlled area
pop bx
mov bx, [bx]
test bx, bx
jnz release_loop
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Enter a process-queue controlled area
P_0204: ; CODE XREF: bdos:0EDAu
; DATA XREF: bdos:0EEDo
mov ax, es
mov tick_wait_proc, ax
xchg ax, 2[bx] ; Is there already a process waiting?
test ax, ax
jz P_0207 ; Check runnable processes
mov 2[bx], ax ; Yes. Add us to the chain.
lea bx, 4[bx]
call add_to_chain
jmps delay_dispatch
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Leave a process-queue controlled area
P_0205: ; CODE XREF: bdos:0EDAu release_queues+4p
; DATA XREF: ...
mov ax, es
cmp 2[bx], ax
jz pq_leave_1
clc ; Queue isn't owned by this process
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pq_leave_1: ; CODE XREF: P_0205+5j
mov tick_wait_proc, es
push es
push bx
lea bx, 4[bx]
call next_runnable
pop bx
mov 2[bx], es
mov dx, es
pop es
call P_0209 ; Wake a process (DX = process segment)
jmp P_0207 ; Check runnable processes
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
; Wake a process (DX = process segment)
P_0209: ; CODE XREF: bdos:0EDAu rtm_sysflag+2Bp
; ...
test dx, dx
jz wake_none
push es
mov es, dx
mov bx, offset drl
pushf
cli
mov es:proc_status, 0; 0 => Runnable
; 1 => waiting on timer
; 2 => terminated
; 3 => waiting on flag
call add_to_chain
popf
pop es
stc
wake_none: ; CODE XREF: P_0209+2j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
delay_dispatch: ; CODE XREF: P_WAITFLAG+20p
; P_DELAY+20j ...
mov bx, offset delay_cbk
jmps disp_general
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_DISPATCH: ; CODE XREF: bdos:0EDAu P_0207+9j
; DATA XREF: ...
mov bx, offset dispatch_cbk
disp_general: ; CODE XREF: delay_dispatch+3j
mov tick_wait_proc, es
mov cbk_function, bx
pushf
push cs
mov ax, offset dispret
push ax
push ds
jmps dsptch
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dispret: ; DATA XREF: delay_dispatch+12o
xor bx, bx
stc
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtm_timeslice: ; CODE XREF: xios_int09+EDu
; DATA XREF: dseg:0034o
cli
cmp tick_wait_proc, 0
jz twp_is_0
pop ds
iret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
twp_is_0: ; CODE XREF: delay_dispatch+23j
mov tick_wait_proc, 0FFFFh
sti
mov cbk_function, offset dispatch_cbk
dsptch: ; CODE XREF: delay_dispatch+17j
; delay_dispatch+1A1j
sti
mov dsptch_es, es
mov es, rlr
mov es:proc_ax, ax
mov ax, dsptch_es
mov es:proc_es, ax
mov es:proc_ss, ss
mov es:proc_sp, sp
mov ax, ds
cli
mov ss, ax
mov sp, offset dsptch_stack
sti
call check_timeslice
cld
call is_proc_busy
jnb dont_kill
mov tick_wait_proc, 0
jmp kill_process
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dont_kill: ; CODE XREF: delay_dispatch+62j
cmp cbk_function, offset dispatch_cbk
jnz disp_switchproc
xor ax, ax
cmp drl, ax
jnz disp_switchproc
cmp es:proc_nextready, ax
jz j_leave_disp
cmp es:proc_background, 0
jnz disp_switchproc
proc_can_run: ; CODE XREF: delay_dispatch+8Aj
cmp time_to_switch, 0
jz slice_expired
dec time_to_switch
j_leave_disp: ; CODE XREF: delay_dispatch+82j
jmp leave_disp
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
slice_expired: ; CODE XREF: delay_dispatch+99j
mov al, time_slice
mov time_to_switch, al
disp_switchproc: ; CODE XREF: delay_dispatch+73j
; delay_dispatch+7Bj
; ...
mov es:proc_bx, bx
mov es:proc_cx, cx
mov es:proc_dx, dx
mov es:proc_bp, bp
mov es:proc_di, di
mov es:proc_si, si
xor ax, ax
mov ds, ax
mov si, ax
mov di, offset proc_int0
mov dx, 4
mov cx, dx
rep movsw
mov cx, dx
add si, dx
rep movsw
mov si, offset INT_E0
mov cx, dx
rep movsw
xor ax, ax
callf es:dword ptr proc_onblock
mov ds, cs:bdos_dseg
mov bx, offset rlr
call next_runnable
jmp cbk_function
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delay_cbk: ; DATA XREF: delay_dispatcho
jmps check_ready
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dispatch_cbk: ; DATA XREF: delay_dispatch+5o
; delay_dispatch+2Eo
; ...
call add_to_chain
check_ready: ; CODE XREF: delay_dispatch+F9j
; delay_dispatch+10Ej
; ...
mov bx, offset drl
cli
call next_runnable
sti
jnb check_ready1
mov bx, offset rlr
call proc_makeready
jmps check_ready
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
check_ready1: ; CODE XREF: delay_dispatch+106j
call check_timeslice
mov ax, rlr
test ax, ax
jz check_ready
mov es, ax
call is_proc_busy
jnb proc_switchin
cli
mov tick_wait_proc, 0
jmp kill_process
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
proc_switchin: ; CODE XREF: delay_dispatch+11Fj
mov ax, 1
callf es:dword ptr proc_onblock
mov ds, cs:bdos_dseg
mov ds, rlr
mov si, offset proc_int0
xor ax, ax
mov es, ax
mov di, ax
mov dx, 4
mov cx, dx
rep movsw
mov cx, dx
add di, dx
rep movsw
mov di, offset INT_E0
mov cx, dx
rep movsw
push ds
pop es
mov ds, cs:bdos_dseg
mov bx, es:proc_bx
mov cx, es:proc_cx
mov dx, es:proc_dx
mov bp, es:proc_bp
mov di, es:proc_di
mov si, es:proc_si
leave_disp: ; CODE XREF: delay_dispatch+9Fj
cli
mov ss, es:proc_ss
mov sp, es:proc_sp
sti
mov ax, es:proc_ax
mov es, es:proc_es
cli
cmp drl, 0
jz drl_is_empty
mov cbk_function, offset dispatch_cbk
jmp dsptch
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
drl_is_empty: ; CODE XREF: delay_dispatch+199j
mov tick_wait_proc, 0
pop ds
iret
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
proc_makeready: ; CODE XREF: delay_dispatch+10Bp
mov ax, [bx]
mov [bx], es
test ax, ax
jz pmr_1
mov es:proc_nextready, ax
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pmr_1: ; CODE XREF: proc_makeready+6j
mov 2[bx], es
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
add_to_chain: ; CODE XREF: P_0204+12p P_0209+12p
; ...
mov ax, 2[bx]
mov 2[bx], es
test ax, ax
jz added_to_chain
push ds
mov ds, ax
mov proc_nextready, es
pop ds
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
added_to_chain: ; CODE XREF: add_to_chain+8j
mov [bx], es
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
next_runnable: ; CODE XREF: P_0205+12p delay_dispatch+F2p
; ...
mov ax, [bx]
test ax, ax
mov es, ax
jz nxtrun_2
mov ax, es:proc_nextready
mov es:proc_nextready, 0
mov [bx], ax
test ax, ax
jnz nxtrun_1
mov 2[bx], ax
nxtrun_1: ; CODE XREF: next_runnable+17j
stc
nxtrun_2: ; CODE XREF: next_runnable+6j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
is_proc_busy: ; CODE XREF: rtm_sysflag+1Dp
; delay_dispatch+5Fp
; ...
test es:proc_flags, 1
jz proc_notbusy
cmp es:proc_indisk, 1
proc_notbusy: ; CODE XREF: is_proc_busy+7j
retn
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; S u b r o u t i n e
check_timeslice: ; CODE XREF: delay_dispatch+5Bp
; delay_dispatch+110p
dec timeslice
jnz not_expired
push bx
push cx
push dx
mov es, bdos_conowner
cts_process: ; CODE XREF: check_timeslice+39j
test es:proc_flags, 1
jz cts_nextproc
cmp es:proc_indisk, 0
jnz cts_nextproc
cli
cmp es:proc_status, 3; 0 => Runnable
; 1 => waiting on timer
; 2 => terminated
; 3 => waiting on flag
jnz cts_nextproc
mov dx, es:proc_countdown
callf dword ptr lp_sysflag_chg
sti
cts_nextproc: ; CODE XREF: check_timeslice+14j
; check_timeslice+1Cj
; ...
mov ax, es:proc_nextseg
test ax, ax
mov es, ax
jnz cts_process
pop dx
pop cx
pop bx
mov es, rlr
mov timeslice, 1Eh
not_expired: ; CODE XREF: check_timeslice+4j
retn
dseg
mcb_to_free dw 0
dw 0
db 0
time_to_switch db 10h ; DATA XREF: delay_dispatch+94r
; delay_dispatch+9Bw
; ...
timeslice db 1Eh ; DATA XREF: check_timeslicew
; check_timeslice+42w
tick_wait_proc dw 0 ; DATA XREF: P_DELAY+Bw P_TERMCPM+77w
; ...
cbk_function dw 0 ; DATA XREF: delay_dispatch+Cw
; delay_dispatch+2Ew
; ...
dsptch_es dw 0 ; DATA XREF: delay_dispatch+35w
; delay_dispatch+41r
dw 0CCCCh, 0CCCCh, 0CCCCh, 0CCCCh
dw 0CCCCh, 0CCCCh, 0CCCCh, 0CCCCh
dw 0CCCCh, 0CCCCh, 0CCCCh, 0CCCCh
dw 0CCCCh, 0CCCCh, 0CCCCh, 0CCCCh
dsptch_stack db 0 ; DATA XREF: delay_dispatch+57o

View File

@@ -0,0 +1 @@
db '6049-0673-020724'

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
;
; These values would, I think, normally be generated by GENCPM.
;
SYSFLAGS equ 36A0h
;
; Screen dimensions and other trivia
;
SCR_MAXX equ 78
SCR_MAXY equ 22
SCR_ECHODEL equ 0