mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
Upload
Digital Research
This commit is contained in:
11055
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/bdos.a86
Normal file
11055
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/bdos.a86
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,132 @@
|
||||
bdos33.exe=entry,
|
||||
sup,
|
||||
rtm,
|
||||
mem,
|
||||
cio,
|
||||
misc,
|
||||
bdos,
|
||||
proctbl,
|
||||
ccpldr[nop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
@@ -0,0 +1,254 @@
|
||||
;
|
||||
; This little segment appears in Apricot PCP/M-86 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 40h
|
||||
;
|
||||
; 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 0Ch, 3Ch, 5Ah, 76h, 0Ah, 3Ch, 61h, 72h
|
||||
db 04h, 3Ch, 7Ah, 76h, 02h, 0F9h, 0C3h, 0F8h
|
||||
db 0C3h, 0B1h, 31h, 0C6h, 06h, 0B5h, 02h, 00h
|
||||
db 0BAh, 0B4h, 02h, 0CDh, 0E0h, 0BBh, 0B6h, 02h
|
1616
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/cio.a86
Normal file
1616
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/cio.a86
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,540 @@
|
||||
|
||||
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 sysvar_144
|
||||
; ...
|
||||
;<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
|
||||
push dx
|
||||
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
|
||||
|
||||
pop dx
|
||||
callf dword ptr lp_xios_init
|
||||
sti
|
||||
mov al, boot_drive
|
||||
mov es:proc_drive, al
|
||||
mov sysvar_144, 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 0E4h ; INT13h helper
|
||||
db 4 ; 76h
|
||||
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, 51h
|
||||
jbe bdos_gotfunc
|
||||
sub al, 0Dh
|
||||
cmp al, 52h
|
||||
jb bdos_badfunc
|
||||
cmp al, 66h
|
||||
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 sysvar_142
|
||||
public sysvar_143
|
||||
public sysvar_144
|
||||
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 '[06-Feb-85] '
|
||||
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 1033h ; DATA XREF: S_BDOSVERr
|
||||
bdos_8087_inuse db 0 ; DATA XREF: call_p_load+10w
|
||||
; retake_8087+Br ...
|
||||
search_path db 0, 10h, 0FFh, 0FFh
|
||||
; ...
|
||||
temp_drive db 0 ; DATA XREF: rsx_find+53o bdos:23AEo
|
||||
date_days dw 0A22h ; 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 7
|
||||
db 1,2
|
||||
rb 0F5h
|
||||
sysvar_142 rb 20h
|
||||
db 0
|
||||
sysvar_143 db 0, 20h, 0
|
||||
sysvar_144 db 0 ; DATA XREF: bdos:0073w bdos:23F6o
|
||||
; ...
|
||||
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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
}
|
@@ -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 bdos33ex.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=F08
|
||||
|
||||
bdos33.exe: $(OBJECTS)
|
||||
linkexe bdos33ex[i
|
||||
|
||||
bdos.cmd: bdos33.exe exe2cmd.exe
|
||||
exe2cmd bdos33.exe bdos.cmd base=F08
|
||||
|
||||
%.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 bdos33.zip $(ZIPFILES)
|
@@ -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
|
||||
|
@@ -0,0 +1,451 @@
|
||||
|
||||
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 sysvar_142:byte
|
||||
extrn sysvar_143:byte
|
||||
extrn sysvar_144: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
|
||||
|
||||
extrn cwd_for_drive:near
|
||||
|
||||
db 'COPYRIGHT(C)1983,DIGITAL RESEARCH'
|
||||
db '(06-FEB-85)'
|
||||
|
||||
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, 10h
|
||||
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
|
||||
dw 02021h
|
||||
dw offset sysvar_142
|
||||
dw 02003h
|
||||
dw offset sysvar_143
|
||||
|
||||
;<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
|
||||
|
||||
nop_iret:
|
||||
nop
|
||||
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
|
||||
; Copy bits for floating drives from their hosts
|
||||
|
||||
ret_drv_vector: ; CODE XREF: DRV_LOGINVEC+4j
|
||||
; DRV_ROVEC+4j
|
||||
mov cx, 3
|
||||
|
||||
rdv_float: ; CODE XREF: ret_drv_vector+23j
|
||||
push cx
|
||||
add cl, 0Ch
|
||||
mov al, cl
|
||||
mov dx, 1
|
||||
shl dx, cl
|
||||
mov cl, 0FFh
|
||||
push bx
|
||||
call cwd_for_drive
|
||||
pop bx
|
||||
mov cl, al ; Get the host drive
|
||||
mov ax, 1
|
||||
shl ax, cl
|
||||
test bx, ax ; Is the corresponding bit set for it?
|
||||
jz rdv_nofloat
|
||||
or bx, dx
|
||||
|
||||
rdv_nofloat: ; CODE XREF: ret_drv_vector+1Ej
|
||||
pop cx
|
||||
loop rdv_float
|
||||
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
|
||||
call ret_drv_vector ; Copy bits for floating drives from their hosts
|
||||
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
|
||||
jmp ret_drv_vector ; Copy bits for floating drives from their hosts
|
||||
|
||||
|
||||
|
||||
;<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
|
||||
push cs
|
||||
call nop_iret
|
||||
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
|
||||
push cs
|
||||
call nop_iret
|
||||
pop es
|
||||
retn
|
||||
|
||||
end
|
||||
|
@@ -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
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1 @@
|
||||
BDOS 3.3 for Apricot PCP/M-86 3.1
|
@@ -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
|
||||
|
@@ -0,0 +1 @@
|
||||
db 'XXXX-0000-654321'
|
1989
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/sup.a86
Normal file
1989
CPM OPERATING SYSTEMS/CPM.Z80.DE/PERSONAL/PCPM-86/BDOS 3.3/sup.a86
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,12 @@
|
||||
;
|
||||
; These values would, I think, normally be generated by GENCPM.
|
||||
;
|
||||
SYSFLAGS equ 65B0h
|
||||
|
||||
;
|
||||
; Screen dimensions and other trivia
|
||||
;
|
||||
SCR_MAXX equ 79
|
||||
SCR_MAXY equ 24
|
||||
SCR_ECHODEL equ 0
|
||||
|
Binary file not shown.
Reference in New Issue
Block a user