home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
466.lha
/
AztecArp_v1.9
/
Source.LZH
/
rstart.asm
< prev
next >
Wrap
Assembly Source File
|
1990-12-05
|
4KB
|
146 lines
;:ts=8
;
; Initial startup routine for Aztec 'C' and ARP using RESIDENT.
; NB: This should allow access to all Aztec Features, math, etc.
; Could be made smaller if only for CLI, only for Workbench,
; Could be made smaller if only this or that.
;
; Created 02-18-88 by -+=SDB+=- from arpcrt0.s
; Copyright (c) 1988 by Scott Ballantyne, may be freely
; used by Arp Supporters/users.
; Use at your own risk.
;
; NB: References to the ___fromdisk__ long have to be handled carefully,
; since they are somewhat shizophrenic, sometimes referring to copied
; data, sometimes not. Note that they should fine for the C code without
; special handling as long as small model is used.
;
; May 9, 1988: Move OpenLibrary() call into _main() to fix WBench Bug.
; Add AhOhNoARP() callout for better user interface.
;
; 10-Mar-90: Put together from resgeta4.s & arprescrt0.s for
; Aztec 5.0 release.
include "exec/types.i"
include "exec/execbase.i"
include "exec/memory.i"
include "exec/tasks.i"
include "exec/alerts.i"
include "libraries/arpbase.i"
include "exec/execbase.i"
call macro
xref _LVO\1
jsr _LVO\1(a6)
endm
mc68881
entry .begin
public .begin
public _geta4
* If you need more or less stack, change the first number below
* For example, if your program only needs 4000 bytes of stack, the
* line below would read:
* RESIDENT 4000,__H2_end-__H1_org,loaded
*
.begin
RESIDENT 10240,__H2_end-__H1_org,loaded
moveq.l #0,d7 ; flag resident code
move.l a4,a3 ; copy base
add.l #32766,a4 ; bias
bra.s clonedata ; and copy the data segment only
loaded: moveq.l #-1,d7 ; flag not resident (start if from disk)
far data
move.l d7,___fromdisk__ ; needs to be set for _geta4
near data
bsr _geta4
isresident:
lea __H1_end,a1
lea __H2_org,a2
cmp.l a1,a2 ;check if BSS and DATA together
bne normal ; this would actually be an error.
move.w #((__H2_end-__H2_org)/4)-1,d1
bmi normal
move.l #0,d2
loop move.l d2,(a1)+ ;clear out memory
dbra d1,loop
bra.s normal
clonedata:
move.l #((__H1_end-__H1_org)/4)-1,d1
bmi.s normal
far data
lea __H1_end,a1
lea __H2_org,a2
cmp.l a1,a2
beq.s 1$
move.l #500,d0 ; error, must be same hunk, so scram
rts
1$: lea.l __H1_org,a1 ; clone data and bss
near data
0$ move.l (a1)+,(a3)+ ; a3 set to point to base
dbra d1,0$
normal: move.l sp,__savsp ; save stack pointer
move.l (4).w,a6 ; get Exec's library base pointer
move.l a6,_SysBase ; put where we can get it
movem.l d0/a0,-(sp) ; save CLI command parameters
move.w AttnFlags(a6),d0
btst #AFB_68881,d0 ;check for 68881 flag in AttnFlags
beq 1$ ;skip if not
lea 2$,a5
call Supervisor ;do it in supervisor mode
bra 1$
2$ clr.l -(sp)
frestore (sp)+ ;reset the ffp stuff
rte ;and return
1$ jsr __main ;call the startup stuff
addq.l #8,sp ;pop args
rts ;and return
_geta4:
far data
movem.l d0-d1/a0-a1/a6,-(sp) ; max safety here...
tst.l ___fromdisk__
bne.s 1$
move.l (4).w,a6
move.l ThisTask(a6),a0
lea.l TC_MEMENTRY(a0),a0
lea.l PMEM(pc),a1
call FindName
move.l d0,a0
cmp.w #2,pm_Num(a0) ; check for data
bne.s 1$ ; resident, but no data allocated.
move.l pm_Data(a0),a4 ; get data pointer
add.l #32766,a4 ; bias
bra.s 2$
1$ lea.l __H1_org+32766,a4
2$ movem.l (sp)+,d0-d1/a0-a1/a6
rts
PMEM PMEM_NAME
public __main,__H0_org
dseg
public _SysBase,_DOSBase,__savsp,___fromdisk__
public __H1_org,__H1_end,__H2_org,__H2_end
near data
even
___fromdisk__:
dc.l 0 ; default is resident
end