mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
404 lines
6.0 KiB
404 lines
6.0 KiB
r.c
|
|
/* Copyright (C) 1984 by Manx Software Systems */
|
|
#include <stdio.h>
|
|
|
|
main(argc, argv)
|
|
char **argv;
|
|
{
|
|
register int (*func)();
|
|
int (*prgload())();
|
|
|
|
if (argc < 2) {
|
|
fprintf(stderr, "usage: r progname args ...\n");
|
|
exit(4);
|
|
}
|
|
++argv;
|
|
if ((func = prgload(*argv)) == 0) {
|
|
fprintf(stderr, "Cannot load program\n");
|
|
exit(4);
|
|
}
|
|
(*func)(argc-1, argv);
|
|
}
|
|
|
|
#define OVMAGIC 0xf1
|
|
|
|
struct header {
|
|
int magic;
|
|
unsigned ovaddr;
|
|
unsigned ovsize;
|
|
unsigned ovbss;
|
|
int (*ovbgn)();
|
|
};
|
|
|
|
static int (*prgload(argv0))()
|
|
char *argv0;
|
|
{
|
|
int fd;
|
|
char *topmem, *ovend, *sbrk();
|
|
unsigned size;
|
|
struct header header;
|
|
char name[20];
|
|
|
|
strcpy(name, argv0);
|
|
strcat(name, ".ovr");
|
|
if ((fd = open(name, 0)) < 0)
|
|
return 0;
|
|
if (read(fd, &header, sizeof header) < 0)
|
|
return 0;
|
|
/* check magic number on overlay file */
|
|
if (header.magic != OVMAGIC || header.ovsize == 0)
|
|
return 0;
|
|
|
|
topmem = sbrk(0);
|
|
ovend = header.ovaddr + header.ovsize + header.ovbss;
|
|
if (topmem < ovend) {
|
|
if (sbrk(ovend - topmem) == (char *)-1)
|
|
return 0;
|
|
}
|
|
if (read(fd, header.ovaddr, header.ovsize) < header.ovsize)
|
|
return 0;
|
|
close(fd);
|
|
return header.ovbgn;
|
|
}
|
|
crbegin.asm
|
|
; Copyright (C) 1983 by Manx Software Systems
|
|
; :ts=8
|
|
public .ovbgn
|
|
extrn main_
|
|
extrn _Uorg_, _Uend_
|
|
bss saveret,2
|
|
.ovbgn:
|
|
lxi h,_Uorg_
|
|
lxi b,_Uend_-_Uorg_
|
|
mvi e,0
|
|
clrbss:
|
|
mov m,e
|
|
inx h
|
|
dcx b
|
|
mov a,c
|
|
ora b
|
|
jnz clrbss
|
|
;
|
|
pop h
|
|
shld saveret
|
|
call main_
|
|
lhld saveret ;get return addr
|
|
pchl ;return to caller
|
|
end .ovbgn
|
|
rext.asm
|
|
extrn .begin
|
|
extrn execv_
|
|
extrn execl_
|
|
extrn agetc_
|
|
extrn aputc_
|
|
extrn atoi_
|
|
extrn atol_
|
|
extrn calloc_
|
|
extrn Croot_
|
|
extrn fdopen_
|
|
extrn fgets_
|
|
extrn fopen_
|
|
extrn freopen_
|
|
extrn format_
|
|
extrn fprintf_
|
|
extrn fputs_
|
|
extrn fread_
|
|
extrn fscanf_
|
|
extrn fseek_
|
|
extrn ftell_
|
|
extrn fwrite_
|
|
extrn getchar_
|
|
extrn gets_
|
|
extrn getw_
|
|
extrn ioctl_
|
|
extrn isatty_
|
|
extrn lseek_
|
|
extrn realloc_
|
|
extrn malloc_
|
|
extrn free_
|
|
extrn creat_
|
|
extrn open_
|
|
extrn close_
|
|
extrn posit_
|
|
extrn printf_
|
|
extrn fclose_
|
|
extrn putchar_
|
|
extrn puterr_
|
|
extrn puts_
|
|
extrn putw_
|
|
extrn qsort_
|
|
extrn rename_
|
|
extrn scanfmt_
|
|
extrn scanf_
|
|
extrn setbuf_
|
|
extrn sprintf_
|
|
extrn sscanf_
|
|
extrn ungetc_
|
|
extrn unlink_
|
|
extrn bios_
|
|
extrn index_
|
|
extrn movmem_
|
|
extrn rindex_
|
|
extrn sbrk_
|
|
extrn rsvstk_
|
|
extrn setjmp_
|
|
extrn setmem_
|
|
extrn strcat_
|
|
extrn strncat_
|
|
extrn strcmp_
|
|
extrn strncmp_
|
|
extrn strcpy_
|
|
extrn strlen_
|
|
extrn strncpy_
|
|
extrn swapmem_
|
|
extrn toupper_
|
|
extrn tolower_
|
|
extrn getusr_
|
|
extrn setusr_
|
|
extrn rstusr_
|
|
extrn .dv,.ud
|
|
extrn .ml
|
|
mrext.asm
|
|
extrn .begin
|
|
extrn atof_
|
|
extrn frexp_, ldexp_, modf_
|
|
extrn ftoa_
|
|
extrn asin_
|
|
extrn acos_
|
|
extrn arcsine_
|
|
extrn atan2_
|
|
extrn atan_
|
|
extrn exp_
|
|
extrn floor_
|
|
extrn ceil_
|
|
extrn log10_
|
|
extrn log_
|
|
extrn pow_
|
|
extrn ran_
|
|
extrn randl_
|
|
extrn cos_
|
|
extrn sin_
|
|
extrn sinh_
|
|
extrn cosh_
|
|
extrn sqrt_
|
|
extrn cotan_
|
|
extrn tan_
|
|
extrn tanh_
|
|
|
|
extrn execv_
|
|
extrn execl_
|
|
extrn agetc_
|
|
extrn aputc_
|
|
extrn atoi_
|
|
extrn atol_
|
|
extrn calloc_
|
|
extrn Croot_
|
|
extrn fdopen_
|
|
extrn fgets_
|
|
extrn fopen_
|
|
extrn freopen_
|
|
extrn format_
|
|
extrn fprintf_
|
|
extrn fputs_
|
|
extrn fread_
|
|
extrn fscanf_
|
|
extrn fseek_
|
|
extrn ftell_
|
|
extrn fwrite_
|
|
extrn getchar_
|
|
extrn gets_
|
|
extrn getw_
|
|
extrn ioctl_
|
|
extrn isatty_
|
|
extrn lseek_
|
|
extrn realloc_
|
|
extrn malloc_
|
|
extrn free_
|
|
extrn creat_
|
|
extrn open_
|
|
extrn close_
|
|
extrn posit_
|
|
extrn printf_
|
|
extrn fclose_
|
|
extrn putchar_
|
|
extrn puts_
|
|
extrn putw_
|
|
extrn qsort_
|
|
extrn rename_
|
|
extrn scanfmt_
|
|
extrn scanf_
|
|
extrn setbuf_
|
|
extrn sprintf_
|
|
extrn sscanf_
|
|
extrn ungetc_
|
|
extrn unlink_
|
|
extrn bios_
|
|
extrn index_
|
|
extrn movmem_
|
|
extrn rindex_
|
|
extrn sbrk_
|
|
extrn rsvstk_
|
|
extrn setjmp_
|
|
extrn setmem_
|
|
extrn strcat_
|
|
extrn strncat_
|
|
extrn strcmp_
|
|
extrn strncmp_
|
|
extrn strcpy_
|
|
extrn strlen_
|
|
extrn strncpy_
|
|
extrn swapmem_
|
|
extrn toupper_
|
|
extrn tolower_
|
|
extrn getusr_
|
|
extrn setusr_
|
|
extrn rstusr_
|
|
extrn .dv,.ud
|
|
extrn .ml
|
|
ovloader.c
|
|
/* Copyright (C) 1983, 1984 by Manx Software Systems */
|
|
|
|
#define OVMAGIC 0xf1
|
|
|
|
struct header {
|
|
int magic;
|
|
unsigned ovaddr;
|
|
unsigned ovsize;
|
|
unsigned ovbss;
|
|
int (*ovbgn)();
|
|
};
|
|
|
|
static char *ovname;
|
|
|
|
#asm
|
|
public ovloader
|
|
ovloader:
|
|
lxi h,2
|
|
dad sp
|
|
mov e,m
|
|
inx h
|
|
mov d,m
|
|
xchg
|
|
shld ovname_
|
|
;
|
|
call _ovld_
|
|
pchl
|
|
#endasm
|
|
|
|
static
|
|
_ovld()
|
|
{
|
|
int fd, flag;
|
|
auto struct header hdr;
|
|
extern char *_mbot;
|
|
auto char filename[64];
|
|
|
|
flag = 0;
|
|
strcpy(filename, ovname);
|
|
for (;;) {
|
|
strcat(filename, ".ovr");
|
|
if ((fd = open(filename, 0)) >= 0)
|
|
break;
|
|
if (flag++)
|
|
loadabort(10);
|
|
strcpy(filename, "a:");
|
|
strcat(filename, ovname);
|
|
}
|
|
|
|
if (read(fd, &hdr, sizeof hdr) != sizeof hdr)
|
|
loadabort(20);
|
|
|
|
/* check magic number on overlay file */
|
|
if (hdr.magic != OVMAGIC)
|
|
loadabort(30);
|
|
|
|
if (_mbot < hdr.ovaddr+hdr.ovsize+hdr.ovbss)
|
|
loadabort(40);
|
|
|
|
if (read(fd, hdr.ovaddr, hdr.ovsize) < hdr.ovsize)
|
|
loadabort(50);
|
|
close(fd);
|
|
return hdr.ovbgn;
|
|
}
|
|
|
|
static
|
|
loadabort(code)
|
|
{
|
|
char buffer[80];
|
|
|
|
sprintf(buffer, "Error %d loading overlay: %s$", code, ovname);
|
|
bdos(9, buffer);
|
|
exit(10);
|
|
}
|
|
ovbgn.asm
|
|
; Copyright (C) 1983, 1984 by Manx Software Systems
|
|
; :ts=8
|
|
public .ovbgn, ovexit_
|
|
extrn ovmain_
|
|
extrn _Uorg_, _Uend_
|
|
bss ovstkpt,2
|
|
bss saveret,2
|
|
bss bcsave,2
|
|
bss ixsave,2
|
|
bss iysave,2
|
|
;
|
|
.ovbgn:
|
|
lxi h,_Uorg_
|
|
lxi b,_Uend_-_Uorg_
|
|
mvi e,0
|
|
clrbss:
|
|
mov m,e
|
|
inx h
|
|
dcx b
|
|
mov a,c
|
|
ora b
|
|
jnz clrbss
|
|
;
|
|
mov h,b
|
|
mov l,c
|
|
shld bcsave
|
|
xra a
|
|
adi 3
|
|
jpe savedone
|
|
db 221
|
|
shld ixsave
|
|
db 253
|
|
shld iysave
|
|
savedone:
|
|
pop h
|
|
shld saveret
|
|
pop d
|
|
lxi h,0
|
|
dad sp
|
|
shld ovstkpt ;save stack pointer for ovexit
|
|
call ovmain_
|
|
xchg ;save return value
|
|
ovret:
|
|
lhld saveret ;get return addr
|
|
push h ;place dummy overlay name ptr on stack
|
|
push h ;place return addr on stack
|
|
xchg ;restore return value to hl
|
|
ret ;return to caller
|
|
;
|
|
ovexit_:
|
|
lhld bcsave
|
|
mov b,h
|
|
mov c,l
|
|
xra a
|
|
adi 3
|
|
jpe restdone
|
|
db 221
|
|
lhld ixsave
|
|
db 253
|
|
lhld iysave
|
|
restdone:
|
|
lxi h,2 ;get return value
|
|
dad sp
|
|
mov e,m
|
|
inx h
|
|
mov d,m
|
|
lhld ovstkpt ;restore original stack pointer
|
|
sphl
|
|
jmp ovret
|
|
end .ovbgn
|
|
|