| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * INITEXE.A - standard program startup code *
- * *
- * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- module initexe
- section
- segment ENTERCODE(CODE,28H)
- segment INITCODE(CODE,28H)
- segment CODE(none,28H);
- segment SIG_TEXT(CODE,68H)
- segment EMU_TEXT(EMU_CODE,28H)
- segment PROC_TEXT(CODE,68H)
- segment MP_CODE(MP_CODE,68H)
- segment _TEXT(CODE,28H)
- segment _INIT(INIT_CODE,28H)
- segment _FAR_DATA(FAR_DATA,28H)
- segment FAR_BSS(FAR_BSS,28H)
- segment CONST(CONST,28H)
- segment _CONST(DATA,28H)
- segment _DATA(DATA,28H)
- segment BSS_START(BSS,28H)
- segment _BSS(BSS,28H)
- segment BSS_END(BSS,28H)
- segment STACK(STACK,74H)
- section
- segment ENTERCODE(CODE,28H)
- segment INITCODE(CODE,28H)
- segment _TEXT(CODE,28H)
- segment CODE(none,28H);
- segment _INIT(INIT_CODE,28H)
- segment _FAR_DATA(FAR_DATA,28H)
- segment EMU_STATE(DATA,28H)
- reserved:
- dw 0,0,0,0,0,0,0,0
- segment EMU_TEXT(EMU_CODE,28H)
- segment CONST(CONST,28H)
- segment _CONST(DATA,28H)
- segment _DATA(DATA,28H)
- segment BSS_START(BSS,28H)
- segment _BSS(BSS,28H)
- segment BSS_END(BSS,28H)
- segment STACK(STACK,74H)
- segment NEAR_STACK(BSS, 28H)
- segment NEAR_HEAP(BSS, 28H)
- group DGROUP(EMU_STATE,CONST,_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
- select _DATA
- SSisDS = 8
- HeapSize = 6
- StackSize = 4
- InitRec: dw 0, 0, 0, _INIT
- select BSS_START
- public __bss_start:
- public _edata: db 0
- select BSS_END
- public __bss_end:
- public _end:
- select _TEXT
- text_dummy : org 6
- select ENTERCODE
- extrn __startup
- extrn _x_main
- extrn _x_initx
- extrn __initx
- extrn __heap_size
- extrn _x_bss_end
- extrn _x_bss_start
- extrn __near_stack_start
- extrn __x_near_stack_start
- extrn __InitLink
- push ds (* Save PSP Segment (DOS) *)
- mov dx, seg __initx
- mov ds, dx
- mov cx, [__initx]
- mov si, [__initx][2] (* si:cx = __initx *)
- push [__initx][StackSize]
- push ax
- push bx
- mov ax, [__initx][HeapSize]
- dec ax
- mov dx, seg _x_main
- mov ds, dx
- mov [_x_initx], cx (* _x_initx = __initx *)
- mov [_x_initx][2], si
- mov [__heap_size], ax
- mov word [__x_near_stack_start], __near_stack_start
- mov ax, cs:[main_ptr]
- mov word [_x_main][0], ax (* _x_main = main_ptr *)
- mov ax, cs:[main_ptr][2]
- mov word [_x_main][2], ax
- mov bx, InitRec
- mov ax, _DATA
- call far __InitLink (* Initialize @InitChain *)
- pop bx
- pop ax
- mov word [_x_bss_end], __bss_end (* _x_bss_end = __bss_end *)
- mov word [_x_bss_start], __bss_start (* _x_bss_start = __bss_start *)
- mov dx, seg __initx
- mov ds, dx
- mov cl, [__initx][SSisDS]
- sub ch, ch
- pop si (* si = [__initx][StackSize] *)
- pop ds (* Restore PSP Segment (DOS) *)
- jmp far __startup
- (*
- ax = initial ax value
- bx = initial bx value
- cx = SSisDS (in cl)
- dx = seg __initx
- si = StackSize
- ds = initial ds value
- es = _DATA (set in __InitLink)
- *)
- dw EMU_STATE
- dw CONST
- dw _CONST
- dw _DATA
- dw BSS_START
- dw _BSS
- dw BSS_END (* establishs order ! *)
- dw NEAR_STACK
- dw NEAR_HEAP
- dw text_dummy
- dw reserved
- dw 0
- extrn _main
- main_ptr: dd _main
- end *
|