/* Included by initialisation functions */ #define IN_INIT_MOD #include "version.h" #include "date.h" #include "time.h" #include "mcb.h" #include "sft.h" #include "fat.h" #include "file.h" #include "cds.h" #include "device.h" #include "kbd.h" #include "error.h" #include "fcb.h" #include "tail.h" #include "process.h" #include "pcb.h" #include "buffer.h" #include "dcb.h" #include "lol.h" #include "init-dat.h" #include "nls.h" #include "kconfig.h" /* MSC places uninitialized data into COMDEF records, that end up in DATA segment. this can't be tolerated in INIT code. please make sure, that ALL data in INIT is initialized !! These guys are marked BSS_INIT to mark that they really should be BSS but can't be because of MS */ #ifdef _MSC_VER #define BSS_INIT(x) = x #else #define BSS_INIT(x) #endif extern struct _KernelConfig InitKernelConfig; /* * Functions in `INIT_TEXT' may need to call functions in `_TEXT'. The entry * calls for the latter functions therefore need to be wrapped up with far * entry points. */ #define printf init_printf #define sprintf init_sprintf #ifndef __WATCOMC__ #define execrh init_execrh #define memcpy init_memcpy #define fmemcpy init_fmemcpy #define fmemset init_fmemset #define fmemcmp init_fmemcmp #define memcmp init_memcmp #define memset init_memset #define strchr init_strchr #define strcpy init_strcpy #define strlen init_strlen #define fstrlen init_fstrlen #endif #define open init_DosOpen /* execrh.asm */ #ifndef __WATCOMC__ WORD ASMPASCAL execrh(request FAR *, struct dhdr FAR *); #endif /* asmsupt.asm */ VOID ASMPASCAL memset( void *s, int ch, size_t n); VOID ASMPASCAL fmemset( void FAR *s, int ch, size_t n); int ASMPASCAL memcmp(const void *m1, const void *m2, size_t n); int ASMPASCAL fmemcmp(const void FAR *m1, const void FAR *m2, size_t n); VOID ASMPASCAL memcpy( void *d, const void *s, size_t n); VOID ASMPASCAL fmemcpy( void FAR *d, const void FAR *s, size_t n); VOID ASMPASCAL strcpy(char *d, const char *s); size_t ASMPASCAL strlen(const char *s); size_t ASMPASCAL fstrlen(const char FAR *s); char * ASMPASCAL strchr(const char *s, int ch); #ifdef __WATCOMC__ /* bx, cx, dx and es not used or clobbered for all asmsupt.asm functions except (f)memchr/(f)strchr (which clobber dx) */ #pragma aux (pascal) pascal_ax modify exact [ax] #pragma aux (pascal_ax) memset #pragma aux (pascal_ax) fmemset #pragma aux (pascal_ax) memcpy #pragma aux (pascal_ax) fmemcpy #pragma aux (pascal_ax) memcmp modify nomemory #pragma aux (pascal_ax) fmemcmp modify nomemory #pragma aux (pascal_ax) strcpy #pragma aux (pascal_ax) strlen modify nomemory #pragma aux (pascal_ax) fstrlen modify nomemory #pragma aux (pascal) strchr modify exact [ax dx] nomemory #endif #undef LINESIZE #define LINESIZE KBD_MAXLENGTH /*inithma.c*/ extern BYTE DosLoadedInHMA; void MoveKernel(unsigned NewKernelSegment); void setvec(unsigned char intno, intvec vector); #ifndef __WATCOMC__ #define getvec init_getvec #endif intvec getvec(unsigned char intno); #define GLOBAL extern #define NAMEMAX MAX_CDSPATH /* Maximum path for CDS */ #define NFILES 16 /* number of files in table */ #define NFCBS 16 /* number of fcbs */ #define NSTACKS 8 /* number of stacks */ #define STACKSIZE 256 /* default stacksize */ #define NLAST 5 /* last drive */ #define NUMBUFF 20 /* Number of track buffers at INIT time */ /* -- must be at least 3 */ #define MAX_HARD_DRIVE 8 #define NDEV 26 /* up to Z: */ #include "config.h" /* config structure */ /* config.c */ extern struct config Config; VOID PreConfig(VOID); VOID PreConfig2(VOID); VOID DoConfig(int pass); VOID PostConfig(VOID); VOID configDone(VOID); VOID FAR * KernelAlloc(size_t nBytes, char type, int mode); void FAR * KernelAllocPara(size_t nPara, char type, char *name, int mode); char *strcat(char * d, const char * s); BYTE * GetStringArg(BYTE * pLine, BYTE * pszString); void DoInstall(void); UWORD GetBiosKey(int timeout); /* diskinit.c */ COUNT dsk_init(VOID); /* int2f.asm */ COUNT ASMPASCAL Umb_Test(void); COUNT ASMPASCAL UMB_get_largest(void FAR * driverAddress, UCOUNT * seg, UCOUNT * size); #ifdef __WATCOMC__ #pragma aux (pascal) UMB_get_largest modify exact [ax bx cx dx] #endif /* inithma.c */ int MoveKernelToHMA(void); VOID FAR * HMAalloc(COUNT bytesToAllocate); /* initoem.c */ unsigned init_oem(void); void movebda(size_t bytes, unsigned new_seg); unsigned ebdasize(void); /* dosidle.asm */ extern void ASM DosIdle_hlt(VOID); /* intr.asm */ /* * Invoke interrupt "nr" with all registers from *rp loaded * into the processor registers (except: SS, SP,& flags) * On return, all processor registers are stored into *rp (including * flags). */ unsigned ASMPASCAL init_call_intr(int nr, iregs * rp); unsigned ASMPASCAL read(int fd, void *buf, unsigned count); int ASMPASCAL open(const char *pathname, int flags); int ASMPASCAL close(int fd); int ASMPASCAL dup2(int oldfd, int newfd); ULONG ASMPASCAL lseek(int fd, long position); seg ASMPASCAL allocmem(UWORD size); void ASMPASCAL init_PSPSet(seg psp_seg); int ASMPASCAL init_DosExec(int mode, exec_blk * ep, char * lp); int ASMPASCAL init_setdrive(int drive); int ASMPASCAL init_switchar(int chr); void ASMPASCAL keycheck(void); void ASMPASCAL set_DTA(void far *dta); #ifdef __WATCOMC__ #pragma aux (pascal) init_call_intr modify exact [ax] #pragma aux (pascal) read modify exact [ax bx cx dx] #pragma aux (pascal) init_DosOpen modify exact [ax bx dx] #pragma aux (pascal) close modify exact [ax bx] #pragma aux (pascal) dup2 modify exact [ax bx cx] #pragma aux (pascal) allocmem modify exact [ax bx] #pragma aux (pascal) init_PSPSet modify exact [ax bx] #pragma aux (pascal) init_DosExec modify exact [ax bx dx es] #pragma aux (pascal) init_setdrive modify exact [ax bx dx] #pragma aux (pascal) init_switchar modify exact [ax bx dx] #pragma aux (pascal) keycheck modify exact [ax] #pragma aux (pascal) set_DTA modify exact [ax bx dx] #endif /* irqstack.asm */ VOID ASMCFUNC init_stacks(VOID FAR * stack_base, COUNT nStacks, WORD stackSize, ...); /* inthndlr.c */ VOID ASMCFUNC FAR int0_handler(void); VOID ASMCFUNC FAR int6_handler(void); VOID ASMCFUNC FAR int19_handler(void); VOID ASMCFUNC FAR empty_handler(void); VOID ASMCFUNC FAR int20_handler(void); VOID ASMCFUNC FAR int21_handler(void); VOID ASMCFUNC FAR int22_handler(void); VOID ASMCFUNC FAR int24_handler(void); VOID ASMCFUNC FAR low_int25_handler(void); VOID ASMCFUNC FAR low_int26_handler(void); VOID ASMCFUNC FAR int27_handler(void); VOID ASMCFUNC FAR int28_handler(void); VOID ASMCFUNC FAR int29_handler(void); VOID ASMCFUNC FAR int2a_handler(void); VOID ASMCFUNC FAR int2f_handler(void); VOID ASMCFUNC FAR cpm_entry(void); #define cpm_entry DOSDATA(cpm_entry) #define int29_handler DOSTEXT(int29_handler) /* kernel.asm */ #ifdef __GNUC__ VOID ASMCFUNC init_call_p_0(struct config FAR *Config, ...) asm("init_call_p_0"); #else VOID ASMCFUNC FAR init_call_p_0(struct config FAR *Config); /* P_0, actually */ #endif /* main.c */ VOID ASMCFUNC FreeDOSmain(void); BOOL init_device(struct dhdr FAR * dhp, char * cmdLine, COUNT mode, char FAR **top); VOID init_fatal(BYTE * err_msg); /* prf.c */ int VA_CDECL init_printf(CONST char * fmt, ...); int VA_CDECL init_sprintf(char * buff, CONST char * fmt, ...); /* procsupt.asm */ VOID ASMCFUNC FAR got_cbreak(void); #define got_cbreak DOSTEXT(got_cbreak) /* initclk.c */ extern void Init_clk_driver(void); extern UWORD HMAFree; /* first byte in HMA not yet used */ extern unsigned CurrentKernelSegment; #ifdef __GNUC__ extern struct _KernelConfig ASM LowKernelConfig; #define LowKernelConfig *(typeof(LowKernelConfig) FAR *)MK_FP(DOS_PSP, &LowKernelConfig) #else extern struct _KernelConfig FAR ASM LowKernelConfig; #endif extern WORD days[2][13]; extern BYTE FAR *lpTop; extern BYTE ASM _ib_start[], ASM _ib_end[], ASM _init_end[]; extern UWORD ram_top; /* How much ram in Kbytes */ extern char singleStep; extern char SkipAllConfig; extern char master_env[128]; extern struct lol FAR *LoL; extern struct dhdr DOSTEXTFAR ASM blk_dev; /* Block device (Disk) driver */ #define blk_dev DOSTEXT(blk_dev) extern struct buffer FAR *DOSFAR firstAvailableBuf; /* first 'available' buffer */ #define firstAvailableBuf DOSDATA(firstAvailableBuf) #ifdef __GNUC__ extern struct lol ASM DATASTART; #else extern struct lol ASM FAR DATASTART; #endif #define DATASTART DOSDATA(DATASTART) extern BYTE DOSFAR ASM _HMATextAvailable; /* first byte of available CODE area */ #ifdef __GNUC__ extern BYTE ASM _HMATextStart[]; /* first byte of HMAable CODE area */ extern BYTE ASM _HMATextEnd[]; #else extern BYTE FAR ASM _HMATextStart[]; /* first byte of HMAable CODE area */ extern BYTE FAR ASM _HMATextEnd[]; #endif extern BYTE DOSFAR ASM break_ena; /* break enabled flag */ #define break_ena DOSDATA(break_ena) extern BYTE DOSFAR ASM _InitTextStart[], /* first available byte of ram */ DOSFAR ASM _InitTextEnd[], DOSFAR ASM ReturnAnyDosVersionExpected, DOSFAR ASM HaltCpuWhileIdle; #define ReturnAnyDosVersionExpected DOSDATA(ReturnAnyDosVersionExpected) #define HaltCpuWhileIdle DOSDATA(HaltCpuWhileIdle) extern BYTE DOSFAR ASM internal_data[]; #define internal_data DOSDATA(internal_data) extern unsigned char DOSTEXTFAR ASM kbdType; #define kbdType DOSTEXT(kbdType) extern struct { char ThisIsAConstantOne; short TableSize; struct CountrySpecificInfo C; } DOSFAR ASM nlsCountryInfoHardcoded; #define nlsCountryInfoHardcoded DOSDATA(nlsCountryInfoHardcoded) #define nlsPackageHardcoded DOSDATA(nlsPackageHardcoded) /* data shared between DSK.C and INITDISK.C */ extern UWORD DOSFAR LBA_WRITE_VERIFY; #define LBA_WRITE_VERIFY DOSDATA(LBA_WRITE_VERIFY) /* original interrupt vectors, at 70:xxxx */ extern struct lowvec { unsigned char intno; intvec isv; } DOSTEXTFAR ASM intvec_table[5]; #define intvec_table DOSTEXT(intvec_table) /* floppy parameter table, at 70:xxxx */ extern unsigned char DOSTEXTFAR ASM int1e_table[0xe]; #define int1e_table DOSTEXT(int1e_table) extern char DOSFAR DiskTransferBuffer[/*MAX_SEC_SIZE*/]; /* in dsk.c */ #define DiskTransferBuffer DOSDATA(DiskTransferBuffer) struct RelocationTable { UBYTE jmpFar; UWORD jmpOffset; UWORD jmpSegment; UBYTE callNear; UWORD callOffset; }; struct RelocatedEntry { UBYTE callNear; UWORD callOffset; UBYTE jmpFar; UWORD jmpOffset; UWORD jmpSegment; }; extern struct RelocationTable DOSFAR ASM _HMARelocationTableStart[], DOSFAR ASM _HMARelocationTableEnd[]; #define _HMARelocationTableStart DOSDATA(_HMARelocationTableStart) #define _HMARelocationTableEnd DOSDATA(_HMARelocationTableEnd) extern void FAR *DOSFAR ASM XMSDriverAddress; #define XMSDriverAddress DOSDATA(XMSDriverAddress) extern VOID ASMPASCAL FAR _EnableA20(VOID); extern VOID ASMPASCAL FAR _DisableA20(VOID); extern void FAR * ASMPASCAL DetectXMSDriver(VOID); extern int ASMPASCAL init_call_XMScall(void FAR * driverAddress, UWORD ax, UWORD dx); #ifdef __WATCOMC__ #pragma aux (pascal) DetectXMSDriver modify exact [ax dx] #pragma aux (pascal) _EnableA20 modify exact [ax] #pragma aux (pascal) _DisableA20 modify exact [ax] #endif #if defined(WATCOM) && 0 ULONG ASMCFUNC FAR MULULUS(ULONG mul1, UWORD mul2); /* MULtiply ULong by UShort */ ULONG ASMCFUNC FAR MULULUL(ULONG mul1, ULONG mul2); /* MULtiply ULong by ULong */ ULONG ASMCFUNC FAR DIVULUS(ULONG mul1, UWORD mul2); /* DIVide ULong by UShort */ ULONG ASMCFUNC FAR DIVMODULUS(ULONG mul1, UWORD mul2, UWORD * rem); /* DIVide ULong by UShort */ #endif