|
@@ -11,9 +11,9 @@
|
|
|
* ss:sp our stack (ss to be freed)
|
|
|
* <others> All unspecified registers have unspecified values in them.
|
|
|
\*****************************************************************************/
|
|
|
-/* modified by Pierre Muller to become the prt0.s for FPK Pascal */
|
|
|
+/* modified by Pierre Muller to become the prt0.s for FPC Pascal */
|
|
|
|
|
|
- .file "v2prt0.s"
|
|
|
+ .file "v2prt0.as"
|
|
|
|
|
|
/* #include "stubinfo.h" */
|
|
|
STUBINFO = 0
|
|
@@ -43,26 +43,19 @@
|
|
|
.comm ___djgpp_selector_limit, 4
|
|
|
.comm ___djgpp_stack_limit, 4
|
|
|
.lcomm sel_buf, 8
|
|
|
+
|
|
|
/* ___djgpp_ds_alias defined in go32/exceptn.s */
|
|
|
/* inserted at the end of this file */
|
|
|
/* we use a local copy that will be copied to exceptn.s */
|
|
|
- .globl ___v2prt0_ds_alias
|
|
|
+ .globl ___v2prt0_ds_alias
|
|
|
___v2prt0_ds_alias:
|
|
|
- .long 0
|
|
|
-/* .comm ___djgpp_ds_alias, 4 must be in locked code */
|
|
|
-/* undef MULTIBLOCK */
|
|
|
-/* MULTIBLOCK = 0 does not work */
|
|
|
-/* Win95 sometimes gives a block at an address lower than the base
|
|
|
-address of _djgpp => big troubles
|
|
|
- That is why I removed the multiblocks
|
|
|
- Pierre Muller */
|
|
|
- .data
|
|
|
+ .long 0
|
|
|
+
|
|
|
+.data
|
|
|
|
|
|
-/* .ifdef MULTIBLOCK needed anyhow */
|
|
|
___djgpp_memory_handle_pointer:
|
|
|
.long ___djgpp_memory_handle_list+8 /* Next free, first for stub */
|
|
|
.comm ___djgpp_memory_handle_list, 2048 /* Enough for 256 handles */
|
|
|
-/* .endif */
|
|
|
|
|
|
sbrk16_first_byte:
|
|
|
.include "sbrk16.ah"
|
|
@@ -82,31 +75,17 @@ exit16_last_byte:
|
|
|
/* hook_387_emulator:
|
|
|
.long ___emu387_load_hook */
|
|
|
|
|
|
-/* this pulls in the ident string, generated in .. */
|
|
|
-/* .long ___libc_ident_string */
|
|
|
-
|
|
|
/* this is for when main comes from a library */
|
|
|
.long _main
|
|
|
|
|
|
- .text
|
|
|
+
|
|
|
+.text
|
|
|
|
|
|
.globl start
|
|
|
start:
|
|
|
-
|
|
|
pushl %ds /* set %es same as %ds */
|
|
|
popl %es /* push/pop 4 bytes shorter than ax */
|
|
|
|
|
|
-.if 0 /* we do this in the stub now */
|
|
|
- movl $edata, %edi /* set all BSS bytes to zero */
|
|
|
- movl $end, %ecx
|
|
|
- subl %edi, %ecx
|
|
|
- xorl %eax, %eax /* Zero fill value */
|
|
|
- shrl $2, %ecx /* div 4 Longwords not bytes */
|
|
|
- cld
|
|
|
- rep
|
|
|
- stosl
|
|
|
-.endif
|
|
|
-
|
|
|
/* Enable NULL pointer protection if DPMI supports it */
|
|
|
testb $0x1, __crt0_startup_flags+1 /* include/crt0.h */
|
|
|
jnz 1f
|
|
@@ -129,6 +108,7 @@ start:
|
|
|
jnc ds_alias_ok
|
|
|
movb $0x4c, %ah
|
|
|
int $0x21
|
|
|
+
|
|
|
ds_alias_ok:
|
|
|
movw %ax, ___v2prt0_ds_alias
|
|
|
movl %eax, %ebx
|
|
@@ -157,10 +137,6 @@ ds_alias_ok:
|
|
|
jz 2f
|
|
|
andb $0x7f, __crt0_startup_flags /* clear it if failure */
|
|
|
2:
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- testb $0x8, __crt0_startup_flags+1 /* include/crt0.h */
|
|
|
- jz 8f
|
|
|
-.endif
|
|
|
/* Allocate some DOS memory and copy our sbrk helper into it. */
|
|
|
movl $sbrk16_first_byte, %esi
|
|
|
movzwl 8(%esi), %ebx
|
|
@@ -170,6 +146,7 @@ ds_alias_ok:
|
|
|
jnc dos_alloc_ok
|
|
|
movb $0x4c, %ah
|
|
|
int $0x21
|
|
|
+
|
|
|
dos_alloc_ok:
|
|
|
movw %cs, 2(%esi)
|
|
|
/* store API information */
|
|
@@ -208,21 +185,6 @@ dos_alloc_ok:
|
|
|
movw $0x000c, %ax /* set descriptor */
|
|
|
movl $sel_buf, %edi
|
|
|
int $0x31
|
|
|
-.ifdef MULTIBLOCK
|
|
|
-8: movl $___djgpp_memory_handle_list+8, %edi
|
|
|
- movl %edi, ___djgpp_memory_handle_pointer
|
|
|
- xorl %eax, %eax
|
|
|
-9: cmpl %eax, (%edi)
|
|
|
- je 10f
|
|
|
- mov %eax, (%edi)
|
|
|
- addl $4, %edi
|
|
|
- jmp 9b
|
|
|
-10: movw %cs, %bx
|
|
|
- movw $0x0006,%ax
|
|
|
- int $0x31
|
|
|
- movl %edx,___djgpp_base_address
|
|
|
- movw %cx,___djgpp_base_address+2
|
|
|
-.endif /* MULTIBLOCK */
|
|
|
|
|
|
/* Initialize the brk/sbrk variables */
|
|
|
|
|
@@ -279,25 +241,6 @@ use_stubinfo_stack_size:
|
|
|
movl %eax,__stkbottom /* for stack checks */
|
|
|
movl %eax,U_SYSTEM_STACKBOTTOM
|
|
|
|
|
|
-.ifdef LOCK_BOTTOM_STACK
|
|
|
-/* test lock one page at bottom of stack to be sure that there is */
|
|
|
-/* not stack overflow, as the minimal size is 128 ko 4ko less is not much !! */
|
|
|
- testb $0x1, __crt0_startup_flags+1 /* include/crt0.h */
|
|
|
- jnz 101f /* just to be sure it is not used */
|
|
|
- movl %eax, %ebx /* Offset __djgpp_stack_limit in mem block */
|
|
|
- addl $0xfff,%ebx
|
|
|
- andl $0xfffff000,%ebx /* page align it */
|
|
|
- movw $0x507, %ax
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- movl ___djgpp_memory_handle_pointer-8, %esi /* last memory block */
|
|
|
-.else /* not MULTIBLOCK */
|
|
|
- movl ___djgpp_memory_handle_list, %esi /* last memory block */
|
|
|
-.endif
|
|
|
- movl $1, %ecx /* Set one page */
|
|
|
- movl $zero, %edx
|
|
|
- int $0x31 /* Make first stack page page uncommitted */
|
|
|
-101:
|
|
|
-.endif /* LOCK_BOTTOM_STACK */
|
|
|
movl ___djgpp_stack_limit,%eax /* Bottom of stack */
|
|
|
addl __stklen, %eax
|
|
|
movw %ds, %dx /* set stack */
|
|
@@ -305,27 +248,6 @@ use_stubinfo_stack_size:
|
|
|
movl %eax, %esp
|
|
|
|
|
|
xorl %ebp, %ebp
|
|
|
-.if 0 /* done in crt1.c */
|
|
|
- .byte 0x64 /* fs: */ /* set up _go32_info_block structure */
|
|
|
- movzwl STUBINFO_MINKEEP, %eax
|
|
|
- movl %eax, U_SYSTEM_GO32_INFO_BLOCK+16 /* .size_of_transfer_buffer */
|
|
|
- .byte 0x64 /* fs: */
|
|
|
- movzwl STUBINFO_DS_SEGMENT, %eax
|
|
|
- shll $4, %eax
|
|
|
- movl %eax, U_SYSTEM_GO32_INFO_BLOCK+12 /* .linear_address_of_transfer_buffer */
|
|
|
- xorl %eax, %eax
|
|
|
- movl $1, %ecx
|
|
|
- int $0x31
|
|
|
- jc no_selector
|
|
|
- movw %ax, U_SYSTEM_GO32_INFO_BLOCK+26 /* .selector_for_linear_memory */
|
|
|
- movl %eax, %ebx
|
|
|
- movl $8, %eax
|
|
|
- movl $0x0f, %ecx
|
|
|
- movw $0xffff, %dx
|
|
|
- int $0x31 /* Set limit 1Mb */
|
|
|
-no_selector:
|
|
|
-.endif
|
|
|
-
|
|
|
call ___prt1_startup /* run program */
|
|
|
jmp exit
|
|
|
|
|
@@ -363,10 +285,6 @@ exit:
|
|
|
cli /* Just in case they didn't unhook ints */
|
|
|
FREESEL U_SYSTEM_GO32_INFO_BLOCK+26 /* selector for linear memory */
|
|
|
FREESEL ___v2prt0_ds_alias /* DS alias for rmcb exceptions */
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- testb $0x8, __crt0_startup_flags+1 /* include/crt0.h */
|
|
|
- jz 9f
|
|
|
-.endif
|
|
|
FREESEL sbrk16_api_seg /* sbrk cs */
|
|
|
movw sbrk16_first_byte+6,%dx /* selector for allocated DOS mem */
|
|
|
movw $0x101, %ax
|
|
@@ -390,17 +308,6 @@ exit:
|
|
|
movw %ax,%ss
|
|
|
movl $0x400,%esp /* Transfer buffer >= 1024 bytes */
|
|
|
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- movl ___djgpp_memory_handle_pointer, %ebx
|
|
|
- jmp 7f
|
|
|
-6: subl $8, %ebx
|
|
|
- movl (%ebx), %edi
|
|
|
- movw 2(%ebx), %si
|
|
|
- movw $0x502, %ax
|
|
|
- int $0x31
|
|
|
-7: cmpl $___djgpp_memory_handle_list+8, %ebx
|
|
|
- jne 6b
|
|
|
-.endif /* MULTIBLOCK */
|
|
|
xorl %ebp, %ebp /* V1.10 bug fix */
|
|
|
movl ___djgpp_memory_handle_list, %edi
|
|
|
movl ___djgpp_memory_handle_list+2, %esi /* Skip word prefixes */
|
|
@@ -436,14 +343,6 @@ lock_memory:
|
|
|
13: ret $4 /* Pop the argument */
|
|
|
|
|
|
|
|
|
-.if 0
|
|
|
-brk_hook_ret:
|
|
|
- ret
|
|
|
- .globl ___sbrk_brk_hook
|
|
|
-___sbrk_brk_hook:
|
|
|
- .long brk_hook_ret
|
|
|
-.endif
|
|
|
-
|
|
|
.global ___sbrk
|
|
|
.align 2
|
|
|
___sbrk:
|
|
@@ -451,7 +350,7 @@ ___sbrk:
|
|
|
movl 4(%esp), %ecx /* Increment size */
|
|
|
addl %ecx, %eax
|
|
|
jnc brk_common
|
|
|
- /* Carry is only set if a negative increment or wrap happens. Negative
|
|
|
+ /* Carry is only set if a negative increment or wrap happens. Negative
|
|
|
increment is semi-OK, wrap (only for multiple zone sbrk) isn't. */
|
|
|
test $0x80000000, %ecx /* Clears carry */
|
|
|
jnz brk_common
|
|
@@ -477,10 +376,6 @@ brk_common:
|
|
|
cmpl __what_size_dpmi_thinks_we_are, %eax /* don't bother shrinking */
|
|
|
jbe brk_nochange
|
|
|
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- testb $0x8, __crt0_startup_flags+1 /* include/crt0.h */
|
|
|
- jz 10f
|
|
|
-.endif
|
|
|
addl $0x0000ffff, %eax /* round up to 64K block */
|
|
|
andl $0xffff0000, %eax
|
|
|
push %eax /* size - save for later */
|
|
@@ -521,54 +416,6 @@ brk_common:
|
|
|
call lock_memory
|
|
|
|
|
|
decl %edx /* limit now, not size */
|
|
|
-.ifdef MULTIBLOCK
|
|
|
- jmp 5f
|
|
|
-/* Current allocation not large enough, get another block */
|
|
|
-10: movl %ecx, %eax /* Add amt */
|
|
|
- pushl %eax /* Save orig */
|
|
|
- addl $0x0000ffff, %eax /* round up to 64K block */
|
|
|
- andl $0xffff0000, %eax
|
|
|
- movl %eax, %edx /* Save size */
|
|
|
- movl %eax, %ecx
|
|
|
- movl %eax, %ebx
|
|
|
- shrl $16, %ebx /* BX:CX size */
|
|
|
- movw $0x501,%ax
|
|
|
- int $0x31
|
|
|
- popl %eax /* Orig size */
|
|
|
- jc brk_error
|
|
|
-
|
|
|
- pushl %edx /* Size */
|
|
|
- call lock_memory
|
|
|
-
|
|
|
- pushw %bx
|
|
|
- pushw %cx
|
|
|
- popl %ecx /* Linear address */
|
|
|
- /* What if the new base address is lower than __djgpp_base_address !!! */
|
|
|
- subl ___djgpp_base_address, %ecx /* New dpmi size */
|
|
|
- cmpl %ecx, __what_size_dpmi_thinks_we_are /* Back to back ? */
|
|
|
- je 4f
|
|
|
- movl %ecx, __what_size_dpmi_thinks_we_are
|
|
|
- movl %ecx, __what_we_return_to_app_as_old_size
|
|
|
-4:
|
|
|
- movl __what_we_return_to_app_as_old_size, %ebx /* Base for new block */
|
|
|
- addl %ebx, %eax /* Final address */
|
|
|
- movl %eax, __what_size_app_thinks_it_is
|
|
|
-/* Note - save adjusted memory base and memory handle SI:DI here */
|
|
|
- movl ___djgpp_memory_handle_pointer, %ebx
|
|
|
- movl %edi, (%ebx)
|
|
|
- movw %si, 2(%ebx)
|
|
|
- movl %ecx, 4(%ebx)
|
|
|
- addl $8, %ebx
|
|
|
- cmpl $___djgpp_memory_handle_list+2040, %ebx /* At end? */
|
|
|
- je 11f
|
|
|
- movl %ebx, ___djgpp_memory_handle_pointer /* Only if not at end */
|
|
|
-11:
|
|
|
- addl %ecx, %edx /* Final address */
|
|
|
- decl %edx /* Limit to end */
|
|
|
-/* If we get a block at a lower address we must skip the limit change */
|
|
|
- cmpl ___djgpp_selector_limit, %edx
|
|
|
- jbe 12f
|
|
|
-.endif
|
|
|
5: movl %edx, ___djgpp_selector_limit
|
|
|
orw $0x0fff, %dx /* low bits set */
|
|
|
movw $0x0008, %ax /* reset CS limit */
|
|
@@ -615,14 +462,6 @@ no_deadbeef:
|
|
|
no_fill_sbrk_memory:
|
|
|
movl %edx, __what_size_dpmi_thinks_we_are
|
|
|
|
|
|
-.if 0 /* No purpose */
|
|
|
- pushl ___djgpp_memory_handle_list
|
|
|
- pushl ___djgpp_base_address
|
|
|
- movl ___sbrk_brk_hook, %eax
|
|
|
- call %eax
|
|
|
- addl $8, %esp
|
|
|
-.endif
|
|
|
-
|
|
|
brk_nochange: /* successful return */
|
|
|
movl __what_we_return_to_app_as_old_size, %eax
|
|
|
jmp brk_return
|
|
@@ -638,14 +477,6 @@ brk_return:
|
|
|
popl %esi
|
|
|
ret
|
|
|
|
|
|
- .globl __crt0_init_mcount
|
|
|
-__crt0_init_mcount:
|
|
|
-.ifdef IN_GCRT0
|
|
|
- jmp __mcount_init
|
|
|
-.else
|
|
|
- ret
|
|
|
-.endif
|
|
|
-
|
|
|
/* From here on this are parts of crt1.c converted to assembler
|
|
|
and without any call to libc, so that it works without anything else
|
|
|
additions made by Pierre Muller*/
|
|
@@ -675,7 +506,7 @@ additions made by Pierre Muller*/
|
|
|
/* .globl ___dpmi_allocate_ldt_descriptors */
|
|
|
/* using pascal convention => not usabel by C code */
|
|
|
___dpmi_allocate_ldt_descriptors:
|
|
|
- pushl %ebp; movl %esp,%ebp
|
|
|
+ pushl %ebp; movl %esp,%ebp
|
|
|
|
|
|
movl 8(%ebp), %ecx
|
|
|
movl $0x0000, %eax
|
|
@@ -802,7 +633,6 @@ _setup_screens:
|
|
|
movw %dx, %gs
|
|
|
.byte 0x65
|
|
|
movw (%ecx),%ax
|
|
|
-
|
|
|
/NO_APP
|
|
|
cmpw $64896,%ax
|
|
|
jne .L26
|
|
@@ -830,6 +660,7 @@ _setup_screens:
|
|
|
movl $720896,U_SYSTEM_GO32_INFO_BLOCK+8
|
|
|
leave
|
|
|
ret
|
|
|
+
|
|
|
.align 2
|
|
|
.globl _setup_go32_info_block
|
|
|
_setup_go32_info_block:
|
|
@@ -866,7 +697,7 @@ _setup_go32_info_block:
|
|
|
call copy_to_c_go32_info_block
|
|
|
leave
|
|
|
ret
|
|
|
-
|
|
|
+
|
|
|
copy_to_c_go32_info_block:
|
|
|
leal U_SYSTEM_GO32_INFO_BLOCK,%esi
|
|
|
leal __go32_info_block,%edi
|
|
@@ -874,18 +705,19 @@ copy_to_c_go32_info_block:
|
|
|
rep
|
|
|
movsl
|
|
|
ret
|
|
|
+
|
|
|
.data
|
|
|
-/* __go32_info_block for C programs */
|
|
|
+ /* fpu codeword */
|
|
|
+___fpucw:
|
|
|
+ .long 0x1332
|
|
|
+ /* __go32_info_block for C programs */
|
|
|
.align 2
|
|
|
.globl __go32_info_block
|
|
|
.comm __go32_info_block,40
|
|
|
- .globl ___PROXY
|
|
|
-___PROXY:
|
|
|
- .ascii " !proxy\0"
|
|
|
- .globl ___PROXY_LEN
|
|
|
- .align 2
|
|
|
-___PROXY_LEN:
|
|
|
- .long 7
|
|
|
+
|
|
|
+/*
|
|
|
+ -- prt1_startup --
|
|
|
+*/
|
|
|
.text
|
|
|
.align 2
|
|
|
.globl ___prt1_startup
|
|
@@ -898,42 +730,24 @@ ___prt1_startup:
|
|
|
call _setup_core_selector
|
|
|
call _setup_screens
|
|
|
call _setup_go32_info_block
|
|
|
-/* call ___djgpp_exception_setup
|
|
|
- call _setup_ENVPment */
|
|
|
incl ___environ_changed
|
|
|
-/* pushl $0
|
|
|
- call __use_lfn
|
|
|
- addl $4,%esp
|
|
|
- call ___crt0_setup_arguments
|
|
|
- movl ___crt0_argv,%eax
|
|
|
- testl %eax,%eax
|
|
|
- je .L55
|
|
|
- movl (%eax),%ebx
|
|
|
- jmp .L56
|
|
|
- .align 2,0x90
|
|
|
-.L55:
|
|
|
- movl U_SYSTEM_DOS_ARGV0,%ebx
|
|
|
-.L56:
|
|
|
- pushl %ebx
|
|
|
- call ___crt0_load_ENVPment_file
|
|
|
- pushl $0
|
|
|
- call __use_lfn
|
|
|
- pushl %ebx
|
|
|
- call __npxsetup
|
|
|
- call __crt0_init_mcount
|
|
|
- call ___main */
|
|
|
- pushl U_SYSTEM_ENVP
|
|
|
- pushl ___crt0_argv
|
|
|
- pushl ___crt0_argc
|
|
|
- call _pascal_start
|
|
|
- pushl %eax
|
|
|
+
|
|
|
+ finit /* initialize fpu */
|
|
|
+ fwait
|
|
|
+ fldcw ___fpucw
|
|
|
+
|
|
|
+ pushl U_SYSTEM_ENVP
|
|
|
+ pushl ___crt0_argv
|
|
|
+ pushl ___crt0_argc
|
|
|
+ call _pascal_start
|
|
|
+ pushl %eax
|
|
|
/* call _exit changed to */
|
|
|
- call exit
|
|
|
+ call exit
|
|
|
.align 2,0x90
|
|
|
/* .comm U_SYSTEM_DOS_ARGV0,4 */
|
|
|
-.comm ___dos_argv0,4
|
|
|
-.comm ___crt0_argc,4
|
|
|
-.comm ___crt0_argv,4
|
|
|
+ .comm ___dos_argv0,4
|
|
|
+ .comm ___crt0_argc,4
|
|
|
+ .comm ___crt0_argv,4
|
|
|
.globl ___environ_changed
|
|
|
___environ_changed:
|
|
|
.long 0
|
|
@@ -949,165 +763,6 @@ _swap_out:
|
|
|
.global _v2prt0_exceptions_on
|
|
|
_v2prt0_exceptions_on:
|
|
|
.long 0
|
|
|
-/*.comm __crt0_startup_flags,4
|
|
|
- .comm U_SYSTEM_ENVP,4 */
|
|
|
-
|
|
|
-.ifdef test_go32v1
|
|
|
-#
|
|
|
-# Called as start(argc, argv, envp)
|
|
|
-#
|
|
|
-# gs:edx points to prog_info structure. All other registers are OBSOLETE
|
|
|
-# but included for backwards compatibility
|
|
|
-#
|
|
|
-
|
|
|
- .text
|
|
|
- .globl old_start
|
|
|
-old_start:
|
|
|
- popl %ebx
|
|
|
- popl %eax
|
|
|
- movl %eax,__hard_master
|
|
|
- movl %esi,___pid
|
|
|
- movl %edi,___transfer_buffer
|
|
|
- movl %ebx,_ScreenPrimary
|
|
|
- movl %ebp,_ScreenSecondary
|
|
|
-
|
|
|
- cmpl $0, %edx
|
|
|
- je Lcopy_none
|
|
|
- movw %gs,%cx
|
|
|
- movw %ds,%ax
|
|
|
- cmpw %cx,%ax
|
|
|
- je Lcopy_none
|
|
|
-
|
|
|
- movl %gs:(%edx), %ecx
|
|
|
- cmpl U_SYSTEM_GO32_INFO_BLOCK, %ecx
|
|
|
- jbe Lcopy_less
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK, %ecx
|
|
|
-Lcopy_less:
|
|
|
- movl $U_SYSTEM_GO32_INFO_BLOCK, %edi
|
|
|
- addl $3, %ecx
|
|
|
- andl $0xfffffffc, %ecx
|
|
|
- movl %ecx, (%edi)
|
|
|
- addl $4, %edi
|
|
|
- addl $4, %edx
|
|
|
- subl $4, %ecx
|
|
|
-Lcopy_more:
|
|
|
- movl %gs:(%edx), %eax
|
|
|
- movl %eax, (%edi)
|
|
|
- addl $4, %edx
|
|
|
- addl $4, %edi
|
|
|
- subl $4, %ecx
|
|
|
- jnz Lcopy_more
|
|
|
-
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK+4, %eax
|
|
|
- movl %eax, _ScreenPrimary
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK+8, %eax
|
|
|
- movl %eax, _ScreenSecondary
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK+12, %eax
|
|
|
- movl %eax, ___transfer_buffer
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK+20, %eax
|
|
|
- movl %eax, ___pid
|
|
|
- movl U_SYSTEM_GO32_INFO_BLOCK+24, %eax
|
|
|
- movl %eax, __hard_master
|
|
|
-
|
|
|
- jmp Lcopy_done
|
|
|
-
|
|
|
-Lcopy_none:
|
|
|
- movl %ebx,U_SYSTEM_GO32_INFO_BLOCK+4
|
|
|
- movl %ebp,U_SYSTEM_GO32_INFO_BLOCK+8
|
|
|
- movl %edi,U_SYSTEM_GO32_INFO_BLOCK+12
|
|
|
- movl $4096,U_SYSTEM_GO32_INFO_BLOCK+16
|
|
|
- movl %esi,U_SYSTEM_GO32_INFO_BLOCK+20
|
|
|
- movl %eax,U_SYSTEM_GO32_INFO_BLOCK+24
|
|
|
- movl $28, U_SYSTEM_GO32_INFO_BLOCK
|
|
|
-Lcopy_done:
|
|
|
-
|
|
|
- movw U_SYSTEM_GO32_INFO_BLOCK+36,%ax
|
|
|
- movw %ax,_run_mode
|
|
|
- cmpw $4,%ax
|
|
|
- jne CanOnlyRunDPMI
|
|
|
- call Correct_tbaddress
|
|
|
-LtbaddressOK:
|
|
|
- movw U_SYSTEM_GO32_INFO_BLOCK+26,%ax
|
|
|
- movw %ax,_core_selector
|
|
|
- /* core selector in %fs */
|
|
|
- movw %ax,%fs
|
|
|
- xorl %esi,%esi
|
|
|
- xorl %edi,%edi
|
|
|
- xorl %ebp,%ebp
|
|
|
- xorl %ebx,%ebx
|
|
|
-
|
|
|
- movl %esp,%ebx
|
|
|
- movl $0x0,%ebp
|
|
|
- movl %esp,%ebx
|
|
|
- movl 8(%ebx),%eax
|
|
|
- movl %eax,U_SYSTEM_ENVP
|
|
|
- movl 4(%ebx),%eax
|
|
|
- movl %eax,_args
|
|
|
- movl (%ebx),%eax
|
|
|
- movl %eax,_argc
|
|
|
-
|
|
|
- call PASCALMAIN
|
|
|
-
|
|
|
-
|
|
|
-exit_again:
|
|
|
- movl $0x4c00,%eax
|
|
|
- int $0x21
|
|
|
- jmp exit_again
|
|
|
-
|
|
|
- ret
|
|
|
-
|
|
|
-Correct_tbaddress:
|
|
|
- movl ___transfer_buffer,%eax
|
|
|
- addl $1,%eax
|
|
|
- andl $0xFFFFF,%eax
|
|
|
- movl %eax,___transfer_buffer
|
|
|
- movl %eax,U_SYSTEM_GO32_INFO_BLOCK+12
|
|
|
- ret
|
|
|
-CanOnlyRunDPMI:
|
|
|
- movl $0x4c01,%eax
|
|
|
- int $0x21
|
|
|
- jmp exit_again
|
|
|
-
|
|
|
- .ascii "Can only run in DPMI "
|
|
|
-
|
|
|
-/* .data
|
|
|
- .globl _argc
|
|
|
-_argc:
|
|
|
- .long 0
|
|
|
- .globl _args
|
|
|
-_args:
|
|
|
- .long 0
|
|
|
- .globl _run_mode
|
|
|
-_run_mode:
|
|
|
- .word 0
|
|
|
- .globl _core_selector
|
|
|
-_core_selector:
|
|
|
- .word 0
|
|
|
- .globl _ENVP
|
|
|
-_ENVP:
|
|
|
- .long 0 */
|
|
|
-
|
|
|
- .globl ___pid
|
|
|
-___pid:
|
|
|
- .long 42
|
|
|
-
|
|
|
- .globl ___transfer_buffer
|
|
|
-___transfer_buffer:
|
|
|
- .long 0
|
|
|
-
|
|
|
- .globl _ScreenSecondary
|
|
|
-_ScreenSecondary:
|
|
|
- .long 0
|
|
|
-
|
|
|
- .globl __hard_master
|
|
|
- .globl __hard_slave
|
|
|
- .globl __core_select
|
|
|
-__hard_master:
|
|
|
- .byte 0
|
|
|
-__hard_slave:
|
|
|
- .byte 0
|
|
|
-
|
|
|
-.endif /* test_go32v1 */
|
|
|
|
|
|
/* this was the prt0.s from the go32v1 version */
|
|
|
//
|
|
@@ -1167,7 +822,7 @@ _environ:
|
|
|
/* in assembler */
|
|
|
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
|
|
|
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
|
|
-/* adapted to assembler for FPK by Pierre Muller */
|
|
|
+/* adapted to assembler for FPC by Pierre Muller */
|
|
|
|
|
|
/* Global variables */
|
|
|
|
|
@@ -1193,7 +848,10 @@ __dos_ds:
|
|
|
|
|
|
/*
|
|
|
$Log$
|
|
|
- Revision 1.3 1998-08-19 10:56:35 pierre
|
|
|
+ Revision 1.4 1998-10-14 21:28:45 peter
|
|
|
+ * initialize fpu so sigfpe is finally generated for fpu errors
|
|
|
+
|
|
|
+ Revision 1.3 1998/08/19 10:56:35 pierre
|
|
|
+ added some special code for C interface
|
|
|
to avoid loading of crt1.o or dpmiexcp.o from the libc.a
|
|
|
|
|
@@ -1201,6 +859,5 @@ __dos_ds:
|
|
|
* go32v1, go32v2 recompiles with the new objects
|
|
|
* remake3 works again with go32v2
|
|
|
- removed some "optimizes" from daniel which were wrong
|
|
|
-
|
|
|
*/
|
|
|
|