build: add Open Watcom build support

This commit is contained in:
Mario Fetka
2026-05-22 11:44:05 +02:00
parent b16fc3a64b
commit 82b0f918dd
18 changed files with 499 additions and 160 deletions

View File

@@ -1,65 +1,117 @@
#################################
# Project
##############
# DOS utilities for mars-nwe.
#
# Default mode: install a prebuilt net.exe from this source tree. This keeps the
# normal mars-nwe build independent from Open Watcom.
#
# Maintainer mode: configure with -DMARS_NWE_BUILD_DOSUTILS=ON to rebuild
# net.exe with Open Watcom v2 on Linux.
#################################
# Dependencies
##############
#################################
# Compiler Switches
##############
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/include
${CMAKE_BINARY_DIR}/include
set(MARS_DOSUTILS_NET_EXE
"${CMAKE_CURRENT_SOURCE_DIR}/net.exe"
CACHE FILEPATH "Prebuilt DOS net.exe used for installation when MARS_NWE_BUILD_DOSUTILS is OFF"
)
if (CMAKE_SYSTEM_NAME MATCHES Linux)
add_definitions(
-DLINUX -D_GNU_SOURCE -Dsignal=__sysv_signal
)
endif (CMAKE_SYSTEM_NAME MATCHES Linux)
set(MARS_DOSUTILS_PUBLIC_TOOLS
net
login
profile
spawn
passwd
path
pathins
pathdel
map
mapdel
logout
capture
endcap
)
add_definitions(
-D_VERS_H_=\"${VERSION_MAJOR}\"
-D_VERS_L_=\"${VERSION_MINOR}\"
-D_VERS_P_=\"${VERSION_PATCH}\"
# Do not install slist.exe yet: func_slist() is empty and SLIST is disabled in net.c.
# Do not install tests/debug by default either; they are developer-only helpers.
if(MARS_NWE_BUILD_DOSUTILS)
find_package(OpenWatcom REQUIRED)
set(DOSUTILS_C_SOURCES
net.c
tools.c
netcall.c
ncpcall.c
login.c
map.c
nwcrypt.c
nwdebug.c
nwtests.c
capture.c
)
#################################
# Source Files
##############
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"${OPENWATCOM_WASM}"
-q
-zq
-fo="${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
"${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.asm"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.asm"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
VERBATIM
)
#add_executable( net logon.c ... )
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"${OPENWATCOM_WCL}"
-q
-zq
-bt=dos
-ml
-0
-k32768
-fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe"
${DOSUTILS_C_SOURCES}
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
DEPENDS
${DOSUTILS_C_SOURCES}
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
net.h
kern.h
nwcrypt.h
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
VERBATIM
)
#################################
# Linking
##############
add_custom_target(dosutils_net ALL
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
)
#################################
# Install Files
##############
set(MARS_DOSUTILS_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")
else()
if(NOT EXISTS "${MARS_DOSUTILS_NET_EXE}")
message(FATAL_ERROR
"Prebuilt DOS utility missing: ${MARS_DOSUTILS_NET_EXE}. "
"Either commit net.exe into dosutils or configure with "
"-DMARS_NWE_BUILD_DOSUTILS=ON and Open Watcom installed."
)
endif()
endif()
# install the system utils
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME login.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME profile.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME spawn.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME passwd.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME path.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME pathins.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME pathdel.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME map.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME mapdel.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME logout.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME slist.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME capture.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public RENAME endcap.exe)
# and the minimal login utils
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login RENAME login.exe)
install(FILES net.exe DESTINATION ${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login RENAME map.exe)
foreach(tool IN LISTS MARS_DOSUTILS_PUBLIC_TOOLS)
if(tool STREQUAL "net")
install(FILES "${MARS_DOSUTILS_NET_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public")
else()
install(FILES "${MARS_DOSUTILS_NET_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
RENAME "${tool}.exe")
endif()
endforeach()
install(FILES "${MARS_DOSUTILS_NET_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
RENAME login.exe)
install(FILES "${MARS_DOSUTILS_NET_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
RENAME map.exe)

0
kern.asm Executable file → Normal file
View File

24
kern.h Executable file → Normal file
View File

@@ -1,12 +1,12 @@
/* kern.h Assembler Routinen 20-Nov-93 */
extern int IPXinit(void);
extern int IPXopen_socket(UI sock, int live);
extern void IPXclose_socket(UI sock);
extern int IPXlisten(ECB *ecb);
extern void asm_esr_routine(void);
extern void esr_routine(ECB *ecb);
extern void xmemmove(void *ziel, void *quelle, UI anz);
extern int Net_Call(UI func, void *req, void *repl);
/* kern.h Assembler Routinen 20-Nov-93 */
extern int IPXinit(void);
extern int IPXopen_socket(UI sock, int live);
extern void IPXclose_socket(UI sock);
extern int IPXlisten(ECB *ecb);
extern void asm_esr_routine(void);
extern void esr_routine(ECB *ecb);
extern void xmemmove(void *ziel, void *quelle, UI anz);
extern int Net_Call(UI func, void *req, void *repl);

216
kern_wasm.asm Normal file
View File

@@ -0,0 +1,216 @@
; kern_wasm.asm
;
; Open Watcom WASM/MASM-syntax port of the old TASM IDEAL kern.asm.
; Intended for 16-bit DOS large memory model builds on Linux with Open Watcom v2.
;
; Keep kern.asm as the historical TASM source and use this file for the
; reproducible Open Watcom build.
.286
.model large
.data
enterIPX dd 0
.code
public IPXinit_
public IPXopen_socket_
public IPXclose_socket_
public IPXlisten_
public xmemmove_
public Net_Call_
IPXinit_ proc far
push bp
mov bp, sp
push ds
push si
push di
mov ax, 7A00h
int 2Fh
cmp al, 0FFh
jne ipxinit_done
mov cx, @data
mov ds, cx
mov word ptr enterIPX, di
mov ax, es
mov word ptr enterIPX+2, ax
mov al, 1
ipxinit_done:
mov ah, 0
pop di
pop si
pop ds
pop bp
ret
IPXinit_ endp
xmemmove_ proc far
push bp
mov bp, sp
; far procedure stack layout, large model:
; [bp+0] old bp
; [bp+2] return offset
; [bp+4] return segment
; [bp+6] z offset
; [bp+8] z segment
; [bp+10] q offset
; [bp+12] q segment
; [bp+14] nmbr
cli
mov cx, [bp+14]
or cx, cx
jz xmem_done
push ds
push si
push di
pushf
lds si, dword ptr [bp+10]
les di, dword ptr [bp+6]
cmp di, si
jl xmem_forward
std
dec cx
add di, cx
add si, cx
inc cx
jmp xmem_copy
xmem_forward:
cld
xmem_copy:
rep movsb
popf
pop di
pop si
pop ds
xmem_done:
pop bp
sti
ret
xmemmove_ endp
IPXopen_socket_ proc far
push bp
mov bp, sp
push ds
push si
push di
; int IPXopen_socket(UI sock, int live)
mov ax, [bp+8] ; live
mov dx, [bp+6] ; sock
mov bx, @data
mov ds, bx
mov bx, 0
call dword ptr enterIPX
cmp al, 0FFh
jne ipxopen_not_already
mov ax, -1 ; socket already open
jmp ipxopen_done
ipxopen_not_already:
cmp al, 0FEh
jne ipxopen_ok
mov ax, -2 ; socket table full
jmp ipxopen_done
ipxopen_ok:
mov ax, dx
ipxopen_done:
pop di
pop si
pop ds
pop bp
ret
IPXopen_socket_ endp
IPXclose_socket_ proc far
push bp
mov bp, sp
push ds
push si
push di
; void IPXclose_socket(UI sock)
mov dx, [bp+6]
mov bx, @data
mov ds, bx
mov bx, 1
call dword ptr enterIPX
pop di
pop si
pop ds
pop bp
ret
IPXclose_socket_ endp
IPXlisten_ proc far
push bp
mov bp, sp
push ds
push si
push di
; int IPXlisten(ECB *ecb)
les si, dword ptr [bp+6]
mov bx, @data
mov ds, bx
mov bx, 4
call dword ptr enterIPX
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
IPXlisten_ endp
Net_Call_ proc far
push bp
mov bp, sp
; int Net_Call(UI func, void *req, void *repl)
; [bp+6] func
; [bp+8] req offset
; [bp+10] req segment
; [bp+12] repl offset
; [bp+14] repl segment
mov ax, [bp+6]
push ds
push si
push di
pushf
lds si, dword ptr [bp+8]
les di, dword ptr [bp+12]
int 21h
popf
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
Net_Call_ endp
end

8
login.c Executable file → Normal file
View File

@@ -391,9 +391,17 @@ int func_exec(int argc, char *argv[], int mode)
xfree(buff);
if (nargv != NULL) {
if (!mode)
#ifdef __WATCOMC__
spawnvp(P_WAIT, buf, (const char * const *)nargv);
#else
spawnvp(P_WAIT, buf, nargv);
#endif
else
#ifdef __WATCOMC__
execvp(buf, (const char * const *)nargv);
#else
execvp(buf, nargv);
#endif
}
xfree(buf);
}

0
makefile.bcc Executable file → Normal file
View File

0
map.c Executable file → Normal file
View File

0
ncpcall.c Executable file → Normal file
View File

0
net.c Executable file → Normal file
View File

18
net.h Executable file → Normal file
View File

@@ -15,6 +15,9 @@
#include <dos.h>
#include <process.h>
#include <stdarg.h>
#ifdef __WATCOMC__
#include <direct.h>
#endif
typedef unsigned int UI;
typedef unsigned int uint;
@@ -135,6 +138,12 @@ extern void leb(uint8 *s);
extern char *getglobenv(char *option);
extern int putglobenv(char *option);
#ifdef __WATCOMC__
/* Borland C compatibility wrappers implemented in tools.c. */
extern int getcurdir(int drive, char *directory);
extern void setdisk(int drive);
#endif
/* NETCALLS */
#define DRIVE_ADD 1
#define DRIVE_INSERT 2
@@ -159,6 +168,12 @@ extern int neterrno;
alloc_dir_handle(0x13, (dhandle), (path), (drive), (rights))
extern int ipx_init(void);
extern int logout(void);
extern int redir_device_drive(int devicetyp, uint8 *devname, uint8 *remotename);
extern int list_redir(int index, int *devicetyp, uint8 *devname, uint8 *remotename);
extern int get_drive_info(uint8 drivenumber, uint8 *connid,
uint8 *dhandle, uint8 *statusflags);
extern int get_fs_name(int connid, char *name);
extern int alloc_dir_handle(int func, int dhandle, char *path,
int driveletter, uint8 *effrights);
@@ -179,11 +194,13 @@ extern int ncp_16_02(int dirhandle,
uint32 *creattime,
uint32 *owner_id);
extern int ncp_14_46(uint32 *obj_id);
extern int ncp_17_02(int module, int debuglevel);
extern int ncp_17_14(uint8 *objname, uint16 objtyp, uint8 *password);
extern int ncp_17_17(uint8 *key);
extern int ncp_17_18(uint8 *cryptkey, uint8 *objname, uint16 objtyp);
extern uint32 ncp_17_35(uint8 *objname, uint16 objtyp);
extern int ncp_17_36(uint32 obj_id, uint8 *objname, uint16 *objtyp);
extern int ncp_17_40(uint8 *objname, uint16 objtyp, uint8 *password,
uint8 *newpassword);
@@ -193,6 +210,7 @@ extern int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp,
/* map.c */
extern int func_map (int argc, char *argv[], int mode);
extern int func_path (int argc, char *argv[], int mode);
extern void remove_nwpathes(void);
/* login.c */
extern int func_login (int argc, char *argv[], int mode);

0
netcall.c Executable file → Normal file
View File

0
nwcrypt.c Executable file → Normal file
View File

0
nwcrypt.h Executable file → Normal file
View File

0
nwdebug.c Executable file → Normal file
View File

0
nwtests.c Executable file → Normal file
View File

0
slist.c Executable file → Normal file
View File

190
teste.c Executable file → Normal file
View File

@@ -1,95 +1,95 @@
int main()
{
char *fn="F.$LN";
char *string="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz";
int result;
struct stat stbuff;
long offset;
char buff[1024];
char readbuff[500];
int j;
int fd=creatnew(fn, S_IREAD |S_IWRITE);
if (fd > -1) {
printf("Konnte Date erzeugen\n");
close(fd);
} else {
printf("Konnte Datei nicht erzeugen\n");
}
fd = open(fn, O_RDWR|O_CREAT|O_TRUNC|O_DENYNONE, 0666);
memset(buff, 0, sizeof(buff) );
strcpy(buff, string);
write(fd, buff, strlen(buff));
close(fd);
_chmod(fn, 1, _chmod(fn, 0) | 0x80 );
stat(fn, &stbuff);
printf("Filesize <20>ber stat =%ld\n", stbuff.st_size);
fd = open(fn, O_RDWR | O_BINARY |O_DENYNONE);
offset = lseek(fd, 0L, SEEK_END);
printf("Filesize <20>ber lseek =%ld\n", offset);
write(fd, buff, strlen(buff));
lseek(fd, 0L, SEEK_SET);
for (j=0; j < strlen(buff)*2; j++){
read(fd, readbuff, 1);
printf("BUFF = %c\n", readbuff[0]);
}
lseek(fd, 1L, SEEK_SET);
for (j = 0; j < 20; j++){
write(fd, buff+j, 1);
}
for (j=0; j <60; j++){
lseek(fd, (long) j, SEEK_SET);
read(fd, readbuff, 2);
printf("BUFF = %c, %c \n", readbuff[0], readbuff[1]);
}
lseek(fd, 10L, SEEK_SET);
read(fd, buff, 1);
printf("BUFF[10] = %c\n", buff[0]);
result=lock(fd, 100L, 1L);
printf("lock result = %d\n", result);
result=unlock(fd, 100L, 1L);
printf("unlock result = %d\n", result);
close(fd);
fd = open(fn, O_BINARY|O_RDWR|O_CREAT|O_TRUNC|O_DENYNONE, 0666);
if (fd > -1) {
int bufflen;
strcpy(buff, "d:..\\marlib\\c0l.obj+");
strcat(buff, "\r\n");
strcat(buff, "x");
strcat(buff, "\r\n");
strcat(buff, "x");
strcat(buff, "\r\n");
strcat(buff, "/c/x");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\EMU.LIB+");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\mathl.lib+");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\cl.lib");
bufflen=strlen(buff);
printf("bufflen = %d, buff=%s\n", bufflen, buff);
write(fd, buff, bufflen);
close(fd);
fd = open(fn, O_TEXT|O_RDONLY);
if (fd > -1) {
char *p=readbuff;
int anz = 0;
memset(readbuff, 0, sizeof(readbuff) );
while (read(fd, p, 1) == 1){
anz++;
p++;
}
printf("read = %d, buff=%s\n", anz, readbuff);
close(fd);
}
}
/*
result = detach(1);
printf("Detach result=0x%x", result);
*/
return(0);
}
int main()
{
char *fn="F.$LN";
char *string="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz";
int result;
struct stat stbuff;
long offset;
char buff[1024];
char readbuff[500];
int j;
int fd=creatnew(fn, S_IREAD |S_IWRITE);
if (fd > -1) {
printf("Konnte Date erzeugen\n");
close(fd);
} else {
printf("Konnte Datei nicht erzeugen\n");
}
fd = open(fn, O_RDWR|O_CREAT|O_TRUNC|O_DENYNONE, 0666);
memset(buff, 0, sizeof(buff) );
strcpy(buff, string);
write(fd, buff, strlen(buff));
close(fd);
_chmod(fn, 1, _chmod(fn, 0) | 0x80 );
stat(fn, &stbuff);
printf("Filesize <20>ber stat =%ld\n", stbuff.st_size);
fd = open(fn, O_RDWR | O_BINARY |O_DENYNONE);
offset = lseek(fd, 0L, SEEK_END);
printf("Filesize <20>ber lseek =%ld\n", offset);
write(fd, buff, strlen(buff));
lseek(fd, 0L, SEEK_SET);
for (j=0; j < strlen(buff)*2; j++){
read(fd, readbuff, 1);
printf("BUFF = %c\n", readbuff[0]);
}
lseek(fd, 1L, SEEK_SET);
for (j = 0; j < 20; j++){
write(fd, buff+j, 1);
}
for (j=0; j <60; j++){
lseek(fd, (long) j, SEEK_SET);
read(fd, readbuff, 2);
printf("BUFF = %c, %c \n", readbuff[0], readbuff[1]);
}
lseek(fd, 10L, SEEK_SET);
read(fd, buff, 1);
printf("BUFF[10] = %c\n", buff[0]);
result=lock(fd, 100L, 1L);
printf("lock result = %d\n", result);
result=unlock(fd, 100L, 1L);
printf("unlock result = %d\n", result);
close(fd);
fd = open(fn, O_BINARY|O_RDWR|O_CREAT|O_TRUNC|O_DENYNONE, 0666);
if (fd > -1) {
int bufflen;
strcpy(buff, "d:..\\marlib\\c0l.obj+");
strcat(buff, "\r\n");
strcat(buff, "x");
strcat(buff, "\r\n");
strcat(buff, "x");
strcat(buff, "\r\n");
strcat(buff, "/c/x");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\EMU.LIB+");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\mathl.lib+");
strcat(buff, "\r\n");
strcat(buff, "d:..\\marlib\\cl.lib");
bufflen=strlen(buff);
printf("bufflen = %d, buff=%s\n", bufflen, buff);
write(fd, buff, bufflen);
close(fd);
fd = open(fn, O_TEXT|O_RDONLY);
if (fd > -1) {
char *p=readbuff;
int anz = 0;
memset(readbuff, 0, sizeof(readbuff) );
while (read(fd, p, 1) == 1){
anz++;
p++;
}
printf("read = %d, buff=%s\n", anz, readbuff);
close(fd);
}
}
/*
result = detach(1);
printf("Detach result=0x%x", result);
*/
return(0);
}

45
tools.c Executable file → Normal file
View File

@@ -5,21 +5,66 @@
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
****************************************************************/
#ifdef __WATCOMC__
/*
* Borland C compatibility wrappers used by the historical mars-nwe DOS tools.
* Open Watcom does not provide getcurdir()/setdisk() under these Borland names.
*/
int getcurdir(int drive, char *directory)
{
REGS regs;
SREGS sregs;
regs.h.ah = 0x47; /* DOS: get current directory */
regs.h.dl = (unsigned char)drive; /* 0=current, 1=A:, 2=B:, ... */
sregs.ds = FP_SEG(directory);
regs.x.si = FP_OFF(directory);
intdosx(&regs, &regs, &sregs);
return(regs.x.cflag ? -1 : 0);
}
void setdisk(int drive)
{
REGS regs;
regs.h.ah = 0x0e; /* DOS: select default drive */
regs.h.dl = (unsigned char)drive; /* 0=A:, 1=B:, ... */
intdos(&regs, &regs);
}
#endif
int key_pressed(void)
{
#ifdef __WATCOMC__
/*
* Open Watcom's WORDREGS does not expose x.flags. The old Borland
* code checked the BIOS INT 16h ZF bit after AH=01h. Open Watcom's
* bios.h provides _bios_keybrd(), which wraps the same BIOS keyboard
* service and returns 0 when no key is waiting.
*/
return(_bios_keybrd(_KEYBRD_READY) != 0);
#else
REGS regsin, regsout;
regsin.h.ah = 0x01; /* read key-press */
int86(0x16, &regsin, &regsout);
return((regsout.x.flags & 0x40) ? 0 : 1); /* zeroflag != 0 */
#endif
}
void clear_kb(void)
{
#ifdef __WATCOMC__
while (key_pressed()) {
(void)_bios_keybrd(_KEYBRD_READ);
}
#else
REGS regsin, regsout;
while (key_pressed()) { /* zeroflag != 0 */
regsin.h.ah = 0x00; /* read key-press */
int86(0x16, &regsin, &regsout);
}
#endif
}
int ask_user(char *p, ...)