X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libsrc%2Fatari%2Fcrt0.s;h=95e5cac0e82d5dfb09341e5b3527a1605e8dfb14;hb=eab19873f3497658af7bf68c3519815811e7e096;hp=92fea420aff709fe9c7c2e1fdfe195c2e77766ac;hpb=6f05785aa93489470e71e6f021e4da62ac76c6c9;p=cc65 diff --git a/libsrc/atari/crt0.s b/libsrc/atari/crt0.s index 92fea420a..95e5cac0e 100644 --- a/libsrc/atari/crt0.s +++ b/libsrc/atari/crt0.s @@ -10,36 +10,17 @@ ; .export _exit + .constructor initsp,26 + .import getargs, argc, argv - .import __hinit, initconio, zerobss, pushax, doatexit + .import initlib, donelib + .import zerobss, pushax .import _main,__filetab,getfd .import __CODE_LOAD__, __BSS_LOAD__ - .import __graphmode_used + .include "zeropage.inc" .include "atari.inc" - -; ------------------------------------------------------------------------ -; Define and export the ZP variables for the runtime - - .exportzp sp, sreg, regsave - .exportzp ptr1, ptr2, ptr3, ptr4 - .exportzp tmp1, tmp2, tmp3, tmp4 - .exportzp fntemp, regbank, zpspace - -sp = $D2 ; (2bytes) stack pointer -sreg = $D4 ; (2bytes) secondary register/high 16 bit for longs -regsave = $D6 ; (4bytes) slot to save/restore (E)AX into -ptr1 = $DA ; (2bytes) -ptr2 = $DC ; (2bytes) -ptr3 = $DE ; (2bytes) -ptr4 = $E0 ; (2bytes) -tmp1 = $E2 ; (1byte) -tmp2 = $E3 ; (1byte) -tmp3 = $E4 ; (1byte) -tmp4 = $E5 ; (1byte) -fntemp = $E6 ; (2bytes) pointer to file name -regbank = $E8 ; (6bytes) 6 byte register bank -zpspace = $EE - sp ; Zero page space allocated + .include "_file.inc" ; ------------------------------------------------------------------------ ; EXE header @@ -48,12 +29,12 @@ zpspace = $EE - sp ; Zero page space allocated .word $FFFF .word __CODE_LOAD__ .word __BSS_LOAD__ - 1 - .code - .reloc ; ------------------------------------------------------------------------ ; Actual code +.code + rts ; fix for SpartaDOS / OS/A+ ; they first call the entry point from AUTOSTRT and ; then the load addess (this rts here). @@ -63,10 +44,10 @@ zpspace = $EE - sp ; Zero page space allocated ; Save the zero page locations we need - ldy #zpspace-1 -L1: lda sp,y - sta zpsave,y - dey + ldx #zpspace-1 +L1: lda sp,x + sta zpsave,x + dex bpl L1 ; Clear the BSS data @@ -78,20 +59,22 @@ L1: lda sp,y tsx stx spsave -; report memory usage and initialize stack pointer +; report memory usage lda APPMHI - sta appmsav + sta appmsav ; remember old APPMHI value lda APPMHI+1 sta appmsav+1 - jsr getmemtop ; adjust for graphics mode to use - - sta sp - sta APPMHI - stx sp+1 ; Set argument stack ptr + lda MEMTOP + sta APPMHI ; initialize our APPMHI value + ldx MEMTOP+1 stx APPMHI+1 - + +; Call module constructors + + jsr initlib + ; set left margin to 0 lda LMARGN @@ -104,15 +87,9 @@ L1: lda sp,y ldx SHFLOK stx old_shflok sta SHFLOK - -; Initialize the heap - - jsr __hinit ; Initialize conio stuff - jsr initconio - lda #$FF sta CH @@ -120,13 +97,13 @@ L1: lda sp,y lda #0 jsr getfd - sta __filetab ; setup stdin + sta __filetab + (0 * _FILE_size) ; setup stdin lda #0 jsr getfd - sta __filetab + 2 ; setup stdout + sta __filetab + (1 * _FILE_size) ; setup stdout lda #0 jsr getfd - sta __filetab + 4 ; setup stderr + sta __filetab + (2 * _FILE_size) ; setup stderr ; Pass command line if present @@ -134,20 +111,22 @@ L1: lda sp,y lda argc ldx argc+1 - jsr pushax ; argc + jsr pushax ; argc lda #argv - jsr pushax ; argv + jsr pushax ; argv + + ldy #4 ; Argument size + jsr _main ; call the users code - ldy #4 ; Argument size - jsr _main ; call the users code +; Call module destructors. This is also the _exit entry. -; fall thru to exit... +_exit: jsr donelib ; Run module destructors -_exit: jsr doatexit ; call exit functions +; Restore system stuff ldx spsave - txs ; Restore stack pointer + txs ; Restore stack pointer ; restore left margin @@ -160,7 +139,7 @@ _exit: jsr doatexit ; call exit functions sta SHFLOK ; restore APPMHI - + lda appmsav sta APPMHI lda appmsav+1 @@ -168,10 +147,10 @@ _exit: jsr doatexit ; call exit functions ; Copy back the zero page stuff - ldy #zpspace-1 -L2: lda zpsave,y - sta sp,y - dey + ldx #zpspace-1 +L2: lda zpsave,x + sta sp,x + dex bpl L2 ; Back to DOS @@ -180,89 +159,19 @@ L2: lda zpsave,y ; *** end of main startup code +; setup sp -; calc. upper memory limit to use - -.proc getmemtop - - ldy __graphmode_used - beq ignore ; mode 0 doesn't need adjustment - cpy #32 - bcs ignore ; invalid value - - tya - asl a - tay - lda MEMTOP - sec - sbc grmemusage,y - pha - lda MEMTOP+1 - sbc grmemusage+1,y - tax - pla - rts - -ignore: lda MEMTOP - ldx MEMTOP+1 +initsp: + lda APPMHI + sta sp + lda APPMHI+1 + sta sp+1 rts -.endproc - .data zpsave: .res zpspace -; memory usage of the different graphics modes (0-31) -; values < 0 of "bytes needed" are mappped to 0 -; bytes needed ; mode ; val. of MEMTOP -grmemusage: - .word 0 ; 0 ; 39967 - .word 0 ;-318 ; 1 ; 40285 - .word 0 ;-568 ; 2 ; 40535 - .word 0 ;-558 ; 3 ; 40525 - .word 0 ;-298 ; 4 ; 40265 - .word 182 ; 5 ; 39785 - .word 1182 ; 6 ; 38785 - .word 3198 ; 7 ; 36769 - .word 7120 ; 8 ; 32847 - .word 7146 ; 9 ; 32821 - .word 7146 ; 10 ; 32821 - .word 7146 ; 11 ; 32821 - .word 162 ; 12 ; 39805 - .word 0 ;-328 ; 13 ; 40295 - .word 3278 ; 14 ; 36689 - .word 7120 ; 15 ; 32847 - .word 0 ; 16 ; 39967 - .word 0 ;-320 ; 17 ; 40287 - .word 0 ;-572 ; 18 ; 40539 - .word 0 ;-560 ; 19 ; 40527 - .word 0 ;-296 ; 20 ; 40263 - .word 184 ; 21 ; 39783 - .word 1192 ; 22 ; 38775 - .word 3208 ; 23 ; 36759 - .word 7146 ; 24 ; 32821 - .word 7146 ; 25 ; 32821 - .word 7146 ; 26 ; 32821 - .word 7146 ; 27 ; 32821 - .word 160 ; 28 ; 39807 - .word 0 ;-332 ; 29 ; 40299 - .word 3304 ; 30 ; 36663 - .word 7146 ; 31 ; 32821 - -; the program used to get these values (Atari BASIC): -; 100 FILE=0 -; 110 IF FILE=1 THEN OPEN #1,8,0,"D:FREEMEM.OUT" -; 120 IF FILE<>1 THEN OPEN #1,8,0,"E:" -; 200 DIM G(32) -; 210 FOR I=0 TO 32:GRAPHICS I:GOSUB 1000:G(I)=VAL:NEXT I -; 220 GRAPHICS 0 -; 230 FOR I=0 TO 31:PRINT #1;I;":",G(I);" - ";G(0)-G(I):NEXT I -; 240 CLOSE #1 -; 999 END -; 1000 VAL=PEEK(741)+256*PEEK(742) -; 1010 RETURN - .bss spsave: .res 1