Browse Source

+ clear the .bss section on startup in the ZX Spectrum RTL

git-svn-id: trunk@45624 -
nickysn 5 years ago
parent
commit
de08108b27
1 changed files with 38 additions and 0 deletions
  1. 38 0
      rtl/zxspectrum/si_prc.pp

+ 38 - 0
rtl/zxspectrum/si_prc.pp

@@ -21,6 +21,8 @@ interface
 
 implementation
 
+{$GOTO ON}
+
 var
   FPC_SAVE_IY: word; external name 'FPC_SAVE_IY';
   fpc_stackarea_start: word; external name '__fpc_stackarea_start';
@@ -30,10 +32,46 @@ procedure PascalMain; external name 'PASCALMAIN';
 
 { this *must* always remain the first procedure with code in this unit }
 procedure _start; assembler; nostackframe; public name 'start';
+label
+  bstart,bend,loop;
 asm
+    { init the stack }
     ld sp, offset fpc_stackarea_end
+
+    { zero the .bss section }
+    ld bc, offset bstart
+    ld hl, offset bend
+    scf
+    ccf
+    sbc hl, bc
+    ld a, 0
+loop:
+    ld (bc), a
+    inc bc
+    dec hl
+    cp a, l
+    jr NZ, loop
+    cp a, h
+    jr NZ, loop
+
+    { save IY (must be done after zeroing the .bss section) }
     ld (FPC_SAVE_IY), iy
+
+    { ready to run the main program }
     jp PASCALMAIN
+
+    { When using the SDCC-SDLDZ80 linker, the first object module defines the
+      order of areas (sections). Since this module contains the startup code,
+      it is loaded first, so we define all the sections we use in the proper
+      order. }
+    area '_DATA'
+    area '_BSS'
+bstart:
+    area '_BSSEND'
+bend:
+    area '_HEAP'
+    area '_STACK'
+    area '_CODE'
 end;
 
 end.