| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * INITESYS.A - embedded system startup *
- * *
- * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- (* Skeleton startup for embedded systems :-
- Project should include initesys and corertl. Functions may also be imported
- from language standard libraries.
- *)
- include "corelib.inc"
- module initesys
- (* This is an example startup file for a minimal run-time system for modula2,
- Pascal or C *)
- section
- segment ENTERCODE(BOOTCODE,28H)
- segment INITCODE(CODE,28H)
- segment MP_CODE(MP_CODE,68H)
- segment _TEXT(CODE,28H)
- segment _INITN(INITN,28H)
- segment _INIT(INIT,28H)
- segment _FAR_DATA(FAR_DATA,28H)
- segment FAR_BSS(FAR_BSS,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)
- select _TEXT
- public _exit : (* This procedure must be defined in case the main procedure *)
- (* returns *)
- code = frame
- (*%F RegParam *)
- push bp
- mov bp, sp
- mov al, [bp][code]
- (*%E *)
- mov ah, 4CH
- int 21H
- db 'TopSpeed RTL (C) JPI 1989'
- section
- segment _TEXT(CODE,28H)
- public Standard$HALT:
- mov ax,4C00H
- int 21H
- section
- segment ENTERCODE(BOOTCODE,28H)
- segment INITCODE(CODE,28H)
- segment _TEXT(CODE,28H)
- segment _INITN(INITN,28H)
- segment _INIT(INIT,28H)
- segment _FAR_DATA(FAR_DATA,28H)
- segment EMU_STATE(DATA,28H)
- reserved:
- dw 0,0,0,0,0,0,0,0
- 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)
- (*%F NearPtr *)
- group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END)
- (*%E *)
- (*%T NearPtr *)
- group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END,STACK)
- (*%E *)
- select _DATA
- SSisDS = 8
- HeapSize = 6
- StackSize = 4
- select BSS_START
- public __bss_start:
- public _edata:
- select BSS_END
- public __bss_end:
- public _end:
- select ENTERCODE
- (* The Program Entry Point *)
- extrn __entry_point
- jmp far __entry_point
- select _TEXT
- extrn _main
- extrn _exit
- extrn __FloatInit
- extrn __initm
- extrn _x_main
- extrn __stk_base
- extrn __farstack
- public __entry_point :
- mov ax, STACK (* This stack initialization is only *)
- mov ss, ax (* a default. You should set up ss:sp *)
- mov sp, 1000H
- (* Interrupt controllers and or other *)
- (* system hardware should be initialized *)
- (* here if used for embedded systems *)
- (* The following must be done to *)
- (* initialise the modula2 init code and *)
- (* some system variables *)
- mov ax, seg _x_main
- mov ds, ax
- mov word [_x_main][0], _main
- mov word [_x_main][2], seg _main
- (*%F NearPtr *)
- mov word [__stk_base], 256 (* sets lower limit for stack pointer *)
- mov word [__farstack], 1 (* indicates stack has own segment *)
- (*%E *)
- (*%T NearPtr *)
- mov word [__stk_base], __bss_end+256
- mov word [__farstack], 0
- (*%E *)
- (*call far __FloatInit *) (* call Floating point initialisation here *)
- (* For Modula2, Pascal .... *)
- jmp far __initm (* This will execute initialisation code *)
- (* call main module *)
- (* For C ....
- (*%F sameCS *)
- call far _main
- (*%E *)
- (*%T sameCS *)
- call _main
- (*%E *)
- (*%F RegParam *)
- push ax
- (*%E *)
- (*%F sameCS *)
- call far _exit
- (*%E *)
- (*%T sameCS *)
- call _exit
- (*%E *)
- *)
- dw EMU_STATE
- dw _CONST
- dw _DATA
- dw BSS_START
- dw _BSS
- dw BSS_END (* establishs order ! *)
- (*%T NearPtr *)
- dw STACK
- (*%E *)
- dw reserved
- dw 0
- end *
|