From 7bf4b7723316f36bef3832a63fa858f3f0420476 Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Tue, 19 Dec 2017 08:22:58 -0500 Subject: [PATCH] ia16-elf-gcc port: compile all asm files with -f elf. Because ia16-elf-gcc and the GNU linker do not understand OMF we need to use ELF everywhere. This also means we cannot use "wrt", "seg" and "call/jmp far". Most wrt's are superfluous, and seg and call/jmp far can be replaced by explicit ?GROUP references (to be defined in the linker script). --- kernel/dosidle.asm | 14 +++---- kernel/entry.asm | 24 ++++++------ kernel/int2f.asm | 8 ++-- kernel/io.asm | 22 +++++------ kernel/io.inc | 16 ++++---- kernel/kernel.asm | 38 +++++++++--------- kernel/nls_hc.asm | 14 +++---- kernel/procsupt.asm | 10 ++--- kernel/segs.inc | 96 ++++++++++++++++++++++++++++----------------- kernel/serial.asm | 2 +- mkfiles/gcc.mak | 1 + mkfiles/generic.mak | 2 +- 12 files changed, 137 insertions(+), 110 deletions(-) diff --git a/kernel/dosidle.asm b/kernel/dosidle.asm index f62014e..9c21e63 100644 --- a/kernel/dosidle.asm +++ b/kernel/dosidle.asm @@ -36,15 +36,15 @@ segment HMA_TEXT global _DosIdle_int global _DosIdle_hlt - extern _InDOS:wrt DGROUP - extern _cu_psp:wrt DGROUP - extern _MachineId:wrt DGROUP - extern critical_sp:wrt DGROUP - extern _user_r:wrt DGROUP + extern _InDOS + extern _cu_psp + extern _MachineId + extern critical_sp + extern _user_r ; variables as the following are "part of" module inthndlr.c ; because of the define MAIN before include globals.h there! - extern _HaltCpuWhileIdle:wrt DGROUP - extern _DGROUP_:wrt HMA_TEXT + extern _HaltCpuWhileIdle + extern _DGROUP_ ; _DosIdle_hlt: push ds diff --git a/kernel/entry.asm b/kernel/entry.asm index d881751..3d2b175 100644 --- a/kernel/entry.asm +++ b/kernel/entry.asm @@ -35,20 +35,20 @@ segment HMA_TEXT extern _int21_syscall extern _int21_service extern _int2526_handler - extern _error_tos:wrt DGROUP - extern _char_api_tos:wrt DGROUP - extern _disk_api_tos:wrt DGROUP - extern _user_r:wrt DGROUP - extern _ErrorMode:wrt DGROUP - extern _InDOS:wrt DGROUP - extern _cu_psp:wrt DGROUP - extern _MachineId:wrt DGROUP - extern critical_sp:wrt DGROUP + extern _error_tos + extern _char_api_tos + extern _disk_api_tos + extern _user_r + extern _ErrorMode + extern _InDOS + extern _cu_psp + extern _MachineId + extern critical_sp - extern int21regs_seg:wrt DGROUP - extern int21regs_off:wrt DGROUP + extern int21regs_seg + extern int21regs_off - extern _Int21AX:wrt DGROUP + extern _Int21AX extern _DGROUP_ diff --git a/kernel/int2f.asm b/kernel/int2f.asm index 4f20bd7..90987d5 100644 --- a/kernel/int2f.asm +++ b/kernel/int2f.asm @@ -32,8 +32,8 @@ %include "stacks.inc" segment HMA_TEXT - extern _cu_psp:wrt DGROUP - extern _HaltCpuWhileIdle:wrt DGROUP + extern _cu_psp + extern _HaltCpuWhileIdle extern _syscall_MUX14 extern _DGROUP_ @@ -123,7 +123,7 @@ Int2f?iret: ; DRIVER.SYS calls - now only 0803. DriverSysCal: - extern _Dyn:wrt DGROUP + extern _Dyn cmp al, 3 jne Int2f?iret mov ds, [cs:_DGROUP_] @@ -431,7 +431,7 @@ int2f_restore_ds: ; extern UWORD ASMPASCAL call_nls(UWORD bp, UWORD FAR *buf, ; UWORD subfct, UWORD cp, UWORD cntry, UWORD bufsize); - extern _nlsInfo:wrt DGROUP + extern _nlsInfo global CALL_NLS CALL_NLS: pop es ; ret addr diff --git a/kernel/io.asm b/kernel/io.asm index ee8b30a..216933a 100644 --- a/kernel/io.asm +++ b/kernel/io.asm @@ -31,18 +31,18 @@ %include "segs.inc" %include "stacks.inc" - extern ConTable:wrt LGROUP - extern LptTable:wrt LGROUP - extern ComTable:wrt LGROUP - extern uPrtNo:wrt LGROUP - extern CommonNdRdExit:wrt LGROUP -;!! extern _NumFloppies:wrt DGROUP - extern blk_stk_top:wrt DGROUP - extern clk_stk_top:wrt DGROUP + extern ConTable + extern LptTable + extern ComTable + extern uPrtNo + extern CommonNdRdExit +;!! extern _NumFloppies + extern blk_stk_top + extern clk_stk_top extern _reloc_call_blk_driver extern _reloc_call_clk_driver - extern _TEXT_DGROUP:wrt LGROUP + extern _TEXT_DGROUP ;--------------------------------------------------- ; @@ -501,12 +501,12 @@ GetUnitNum: blk_driver_params: dw blk_stk_top dw _reloc_call_blk_driver - dw seg _reloc_call_blk_driver + dw DGROUP clk_driver_params: dw clk_stk_top dw _reloc_call_clk_driver - dw seg _reloc_call_clk_driver + dw DGROUP ; clock device interrupt clk_entry: diff --git a/kernel/io.inc b/kernel/io.inc index 5ab1984..4323587 100644 --- a/kernel/io.inc +++ b/kernel/io.inc @@ -49,12 +49,12 @@ %define E_FAILURE 12 ; General Failure - extern _IOExit:wrt LGROUP - extern _IOSuccess:wrt LGROUP - extern _IOErrorExit:wrt LGROUP - extern _IOErrCnt:wrt LGROUP - extern _IODone:wrt LGROUP - extern _IOCommandError:wrt LGROUP - extern GetUnitNum:wrt LGROUP - extern _ReqPktPtr:wrt LGROUP + extern _IOExit + extern _IOSuccess + extern _IOErrorExit + extern _IOErrCnt + extern _IODone + extern _IOCommandError + extern GetUnitNum + extern _ReqPktPtr diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 9892844..57b2cec 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -34,7 +34,7 @@ segment PSP - extern _ReqPktPtr:wrt LGROUP + extern _ReqPktPtr STACK_SIZE equ 384/2 ; stack allocated in words @@ -42,7 +42,9 @@ STACK_SIZE equ 384/2 ; stack allocated in words ; KERNEL BEGINS HERE, i.e. this is byte 0 of KERNEL.SYS ;************************************************************ +%ifidn __OUTPUT_FORMAT__, obj ..start: +%endif entry: jmp short realentry @@ -103,8 +105,8 @@ realentry: ; execution continues here pop bx pop ax - jmp far kernel_start -beyond_entry: resb 256-(beyond_entry-entry) + jmp IGROUP:kernel_start +beyond_entry: times 256-(beyond_entry-entry) db 0 ; scratch area for data (DOS_PSP) segment INIT_TEXT @@ -125,31 +127,31 @@ kernel_start: popf pop bx - mov ax,seg init_tos + mov ax,I_GROUP cli mov ss,ax mov sp,init_tos int 12h ; move init text+data to higher memory mov cl,6 shl ax,cl ; convert kb to para - mov dx,15 + init_end wrt INIT_TEXT + mov dx,15 + INITSIZE mov cl,4 shr dx,cl sub ax,dx mov es,ax - mov dx,__INIT_DATA_START wrt INIT_TEXT ; para aligned + mov dx,INITTEXTSIZE ; para aligned shr dx,cl add ax,dx mov ss,ax ; set SS to init data segment sti ; now enable them mov ax,cs - mov dx,__InitTextStart wrt HMA_TEXT ; para aligned + mov dx,__HMATextEnd ; para aligned shr dx,cl %ifdef WATCOM add ax,dx %endif mov ds,ax - mov si,-2 + init_end wrt INIT_TEXT ; word aligned + mov si,-2 + INITSIZE; word aligned lea cx,[si+2] mov di,si shr cx,1 @@ -163,7 +165,7 @@ kernel_start: sub ax,dx mov es,ax ; es = new HMA_TEXT - mov si,-2 + __InitTextStart wrt HMA_TEXT + mov si,-2 + __HMATextEnd lea cx,[si+2] mov di,si shr cx,1 @@ -289,7 +291,7 @@ segment CONST global _nul_strtgy extern GenStrategy _nul_strtgy: - jmp far GenStrategy + jmp LGROUP:GenStrategy ; ; NUL device interrupt @@ -378,7 +380,7 @@ _sfthead dd 0 ; 0004 System File Table head global _clock _clock dd 0 ; 0008 CLOCK$ device global _syscon -_syscon dw _con_dev,seg _con_dev ; 000c console device +_syscon dw _con_dev,LGROUP ; 000c console device global _maxsecsize _maxsecsize dw 512 ; 0010 maximum bytes/sector of any block device dd 0 ; 0012 pointer to buffers info structure @@ -394,8 +396,8 @@ _nblkdev db 0 ; 0020 number of block devices _lastdrive db 0 ; 0021 value of last drive global _nul_dev _nul_dev: ; 0022 device chain root - extern _con_dev:wrt LGROUP - dw _con_dev, seg _con_dev + extern _con_dev + dw _con_dev, LGROUP ; next is con_dev at init time. dw 8004h ; attributes = char device, NUL bit set dw _nul_strtgy @@ -885,9 +887,9 @@ __U4D: LDIVMODU %endif - resb 0xd0 - ($-begin_hma) + times 0xd0 - ($-begin_hma) db 0 ; reserve space for far jump to cp/m routine - resb 5 + times 5 db 0 ;End of HMA segment segment HMA_TEXT_END @@ -899,7 +901,7 @@ __HMATextEnd: ; and c version ; The default stack (_TEXT:0) will overwrite the data area, so I create a dummy ; stack here to ease debugging. -- ror4 -segment _STACK class=STACK stack +segment _STACK class(STACK) nobits stack @@ -1067,7 +1069,7 @@ forceEnableA20retry: ; ok, we have to enable A20 )at least seems so ; - call far _ENABLEA20 + call DGROUP:_ENABLEA20 jmp short forceEnableA20retry @@ -1096,7 +1098,7 @@ _ExecUserDisableA20: je noNeedToDisable NeedToDisable: push ax - call far _DISABLEA20 + call DGROUP:_DISABLEA20 pop ax noNeedToDisable: iret diff --git a/kernel/nls_hc.asm b/kernel/nls_hc.asm index 8dd4b56..f95ccc0 100644 --- a/kernel/nls_hc.asm +++ b/kernel/nls_hc.asm @@ -14,15 +14,15 @@ _nlsPackageHardcoded: DB 000h, 000h, 000h, 000h, 001h, 000h, 0b5h, 001h DB 00fh, 000h, 059h, 000h, 04eh, 000h, 006h, 000h DB 002h - DW ?table2, SEG ?table2 + DW ?table2, DGROUP DB 004h - DW ?table4, SEG ?table4 + DW ?table4, DGROUP DB 005h - DW ?table5, SEG ?table5 + DW ?table5, DGROUP DB 006h - DW ?table6, SEG ?table6 + DW ?table6, DGROUP DB 007h - DW ?table7, SEG ?table7 + DW ?table7, DGROUP GLOBAL _nlsCountryInfoHardcoded _nlsCountryInfoHardcoded: DB 001h @@ -32,8 +32,8 @@ _nlsCntryInfoHardcoded: DB 01ch, 000h, 001h, 000h, 0b5h, 001h, 000h, 000h DB 024h, 000h, 000h, 000h, 000h, 02ch, 000h, 02eh DB 000h, 02dh, 000h, 03ah, 000h, 000h, 002h, 000h -extern _CharMapSrvc:wrt DGROUP - DW _CharMapSrvc, SEG _CharMapSrvc +extern _CharMapSrvc + DW _CharMapSrvc, DGROUP DB 02ch, 000h GLOBAL _hcTablesStart _hcTablesStart: diff --git a/kernel/procsupt.asm b/kernel/procsupt.asm index 60ece37..623caf6 100644 --- a/kernel/procsupt.asm +++ b/kernel/procsupt.asm @@ -31,10 +31,10 @@ %include "segs.inc" - extern _user_r:wrt DGROUP + extern _user_r - extern _break_flg:wrt DGROUP ; break detected flag - extern _int21_handler:wrt DGROUP ; far call system services + extern _break_flg ; break detected flag + extern _int21_handler ; far call system services %include "stacks.inc" @@ -71,7 +71,7 @@ _exec_user: ; POP$ALL extern _ExecUserDisableA20 - jmp far _ExecUserDisableA20 + jmp DGROUP:_ExecUserDisableA20 do_iret: extern _int21_iret jmp _int21_iret @@ -263,7 +263,7 @@ _spawn_int23: ??int23_respawn: pop bp ;; Restore the original register - jmp far _int21_handler + jmp DGROUP:_int21_handler ; ; interrupt enable and disable routines diff --git a/kernel/segs.inc b/kernel/segs.inc index e0a31c3..6dd6583 100644 --- a/kernel/segs.inc +++ b/kernel/segs.inc @@ -43,57 +43,81 @@ CPU XCPU %define WATCOM %endif +%ifidn __OUTPUT_FORMAT__, obj group PGROUP PSP group LGROUP _IRQTEXT _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT group DGROUP _FIXED_DATA _BSS _DATA _DATAEND CONST CONST2 DCONST DYN_DATA %ifdef WATCOM group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END INIT_TEXT_START INIT_TEXT INIT_TEXT_END +%define IGROUP TGROUP group I_GROUP ID_B I_DATA ICONST ICONST2 ID_E IB_B I_BSS IB_E %else group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END group I_GROUP ID_B ID ID_E IC IDATA IB_B IB IB_E %endif +%define class(x) class=x +%define nobits +%define exec +%define INITSIZE init_end wrt INIT_TEXT +%define INITTEXTSIZE __INIT_DATA_START wrt INIT_TEXT -segment PSP class=PSP -segment _IRQTEXT class=LCODE -segment _LOWTEXT class=LCODE -segment _IO_TEXT class=LCODE -segment _IO_FIXED_DATA class=LCODE align=2 -segment _TEXT class=LCODE -segment _FIXED_DATA class=FDATA align=16 -segment _BSS class=BSS align=2 -segment _DATA class=DATA align=2 -segment _DATAEND class=DATA align=1 +%else ; using ELF + +BITS 16 +; groups are defined in the linker script kernel.ld +extern PGROUP +extern DGROUP +extern LGROUP +extern TGROUP +extern IGROUP +extern I_GROUP +%define class(x) +%define stack +extern INITSIZE +%define INITTEXTSIZE __InitTextEnd + +%endif + +segment PSP class(PSP) +segment _IRQTEXT class(LCODE) exec +segment _LOWTEXT class(LCODE) exec +segment _IO_TEXT class(LCODE) exec +segment _IO_FIXED_DATA class(LCODE) align=2 +segment _TEXT class(LCODE) exec +segment _FIXED_DATA class(FDATA) align=16 +segment _BSS class(BSS) align=2 +segment _DATA class(DATA) align=2 +segment _DATAEND class(DATA) align=1 ;for WATCOM -segment CONST class=DATA align=2 -segment CONST2 class=DATA align=2 +segment CONST class(DATA) align=2 +segment CONST2 class(DATA) align=2 ;for MSC -segment DCONST class=DCONST align=2 -segment DYN_DATA class=DYN_DATA -segment HMA_TEXT_START class=CODE align=16 -segment HMA_TEXT class=CODE -segment HMA_TEXT_END class=CODE -segment INIT_TEXT_START class=CODE align=16 -segment INIT_TEXT class=CODE -segment INIT_TEXT_END class=CODE +segment DCONST class(DCONST) align=2 +segment DYN_DATA class(DYN_DATA) +segment HMA_TEXT_START class(CODE) align=16 +segment HMA_TEXT class(CODE) exec +segment HMA_TEXT_END class(CODE) align=16 +segment INIT_TEXT_START class(CODE) align=16 +segment INIT_TEXT class(CODE) exec +segment INIT_TEXT_END class(CODE) align=16 %ifdef WATCOM -segment ID_B class=FAR_DATA align=16 -segment I_DATA class=FAR_DATA align=2 -segment ICONST class=FAR_DATA align=2 -segment ICONST2 class=FAR_DATA align=2 -segment ID_E class=FAR_DATA align=2 -segment IB_B class=FAR_DATA align=2 -segment I_BSS class=FAR_DATA align=2 -segment IB_E class=FAR_DATA align=2 +segment ID_B class(FAR_DATA) align=16 +segment I_DATA class(FAR_DATA) align=2 +segment ICONST class(FAR_DATA) align=2 +segment ICONST2 class(FAR_DATA) align=2 +segment ID_E class(FAR_DATA) align=2 +segment IB_B class(FAR_DATA) align=2 +segment I_BSS class(FAR_DATA) align=2 +segment IB_E class(FAR_DATA) align=2 %else -segment ID_B class=ID align=16 -segment ID class=ID align=2 -segment IDATA class=ID align=2 -segment ID_E class=ID align=2 -segment IC class=IC align=2 -segment IB_B class=IB align=2 -segment IB class=IB align=2 -segment IB_E class=IB align=2 +segment ID_B class(ID) align=16 +segment ID class(ID) align=2 +segment IDATA class(ID) align=2 +segment ID_E class(ID) align=2 +segment IC class(IC) align=2 +segment IB_B class(IB) align=2 nobits +segment IB class(IB) align=2 nobits +segment IB_E class(IB) align=2 nobits %endif diff --git a/kernel/serial.asm b/kernel/serial.asm index d7fb3b6..c574188 100644 --- a/kernel/serial.asm +++ b/kernel/serial.asm @@ -50,7 +50,7 @@ ComTable db 0Ah segment _IO_TEXT - extern CommonNdRdExit:wrt LGROUP + extern CommonNdRdExit ComRead: jcxz ComRd3 diff --git a/mkfiles/gcc.mak b/mkfiles/gcc.mak index 7f09f27..3b5222d 100644 --- a/mkfiles/gcc.mak +++ b/mkfiles/gcc.mak @@ -38,6 +38,7 @@ TARGET=KGC ALLCFLAGS=-I../hdr $(TARGETOPT) $(ALLCFLAGS) -mcmodel=small -fleading-underscore -fno-common -fpack-struct -ffreestanding -fcall-used-es -mrtd -w -Werror INITCFLAGS=$(ALLCFLAGS) -o $@ CFLAGS=$(ALLCFLAGS) -o $@ +NASMFLAGS=$(NASMFLAGS) -f elf -o $@ DIRSEP=/ RM=rm -f diff --git a/mkfiles/generic.mak b/mkfiles/generic.mak index 495ad2f..e0c0487 100644 --- a/mkfiles/generic.mak +++ b/mkfiles/generic.mak @@ -47,7 +47,7 @@ CLC=$(CL) $(CFLAGSC) -I$(INCLUDEPATH) TARGET=$(TARGET)$(XCPU)$(XFAT) .asm.obj : - $(NASM) -D$(COMPILER) $(NASMFLAGS) -f obj $*.asm + $(NASM) -D$(COMPILER) -f obj $(NASMFLAGS) $*.asm # *Implicit Rules* .c.obj :