123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #
- # $Id$
- # This file is part of the Free Pascal run time library.
- # Copyright (c) 1993,97 by the Free Pascal development team.
- #
- # See the file COPYING.FPC, included in this distribution,
- # for details about the copyright.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- #
- # **********************************************************************
- #///*
- #//** 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 _start
- _start:
- .globl start
- start:
- # the first instruction must be movl %eax,
- # because that is the way GO32V2 makes the difference between V1 and V2 coff format
- 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
- # /* set the right size */
- movl $40,U_SYSTEM_GO32_INFO_BLOCK
- 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
- #/* I need a value for the stack bottom, */
- #/* but I don't know how to get it from go32 */
- #/* I suppose the stack is 4Ko long, is this true ? */
- movl %esp,%eax
- subl $0x4000,%eax
- movl %eax,__stkbottom
- movw U_SYSTEM_GO32_INFO_BLOCK+26,%ax
- movw %ax,_core_selector
- movl U_SYSTEM_GO32_INFO_BLOCK+28,%eax
- movl %eax,U_SYSTEM_STUB_INFO
- 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,_environ
- 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
- .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 _environ
- _environ:
- .long 0
- .globl ___pid
- ___pid:
- .long 42
- .globl ___transfer_buffer
- ___transfer_buffer:
- .long 0
- .globl _ScreenPrimary
- _ScreenPrimary:
- .long 0
- .globl _ScreenSecondary
- _ScreenSecondary:
- .long 0
- .globl __hard_master
- .globl __hard_slave
- .globl __core_select
- __hard_master:
- .byte 0
- __hard_slave:
- .byte 0
- __core_select:
- .short 0
- .globl __stkbottom
- __stkbottom:
- .long 0
- # .globl U_SYSTEM_GO32_INFO_BLOCK
- # U_SYSTEM_GO32_INFO_BLOCK:
- # .long __go32_end - U_SYSTEM_GO32_INFO_BLOCK #//* size */
- # .long 0 #//* offs 4 linear_address_of_primary_screen; */
- # .long 0 #//* offs 8 linear_address_of_secondary_screen; */
- # .long 0 #//* offs 12 linear_address_of_transfer_buffer; */
- # .long 0 #//* offs 16 size_of_transfer_buffer; >= 4k */
- # .long 0 #//* offs 20 pid; */
- # .byte 0 #//* offs 24 u_char master_interrupt_controller_base; */
- # .byte 0 #//* offs 25 u_char slave_interrupt_controller_base; */
- # .word 0 #//* offs 26 u_short selector_for_linear_memory; */
- # .long 0 #//* offs 28 u_long linear_address_of_stub_info_structure; */
- # .long 0 #//* offs 32 u_long linear_address_of_original_psp; */
- # .word 0 #//* offs 36 u_short run_mode; */
- # .word 0 #//* offs 38 u_short run_mode_info; */
- #__go32_end:
|