From 1d1ba3ed3bf0b0b31e34601b7f40201589887537 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Wed, 16 Mar 2016 16:28:32 +0100
Subject: [PATCH] Adjusted constructors.
The constructors are _NOT_ allowed anymore to access the BSS. Rather they must use the DATA segment or the INIT segment. The latter isn't cleared at any point so the constructors may use it to expose values to the main program. However they must make sure to always write the values as they are not pre-initialized.
---
cfg/atmos.cfg | 11 +++++----
cfg/geos-apple.cfg | 1 +
cfg/geos-cbm.cfg | 1 +
libsrc/apple2/dosdetect.s | 4 ++--
libsrc/apple2/extra/iobuf-0800.s | 2 +-
libsrc/apple2/get_ostype.s | 2 +-
libsrc/apple2/mainargs.s | 8 +++----
libsrc/atari/dosdetect.s | 4 ++--
libsrc/atari/getargs.s | 10 ++------
libsrc/atmos/capslock.s | 2 +-
libsrc/atmos/mainargs.s | 34 +++++++++++++++-------------
libsrc/atmos/read.s | 3 +--
libsrc/c128/cgetc.s | 8 +++----
libsrc/common/_environ.s | 8 +++----
libsrc/geos-common/conio/_scrsize.s | 2 +-
libsrc/geos-common/system/mainargs.s | 4 ++--
16 files changed, 49 insertions(+), 55 deletions(-)
diff --git a/cfg/atmos.cfg b/cfg/atmos.cfg
index e5a574f0a..bb79a1e8a 100644
--- a/cfg/atmos.cfg
+++ b/cfg/atmos.cfg
@@ -8,10 +8,10 @@ SYMBOLS {
__RAMEND__: type = weak, value = $9800 + $1C00 * __GRAB__;
}
MEMORY {
- ZP: file = "", define = yes, start = $00E2, size = $001A;
- TAPEHDR: file = %O, type = ro, start = $0000, size = $001F;
- BASHEAD: file = %O, define = yes, start = $0501, size = $000D;
- MAIN: file = %O, define = yes, start = __BASHEAD_LAST__, size = __RAMEND__ - __RAM_START__ - __STACKSIZE__;
+ ZP: file = "", define = yes, start = $00E2, size = $001A;
+ TAPEHDR: file = %O, type = ro, start = $0000, size = $001F;
+ BASHEAD: file = %O, define = yes, start = $0501, size = $000D;
+ MAIN: file = %O, define = yes, start = __BASHEAD_LAST__, size = __RAMEND__ - __MAIN_START__ - __STACKSIZE__;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp;
@@ -21,8 +21,9 @@ SEGMENTS {
LOWCODE: load = MAIN, type = ro, optional = yes;
CODE: load = MAIN, type = ro;
RODATA: load = MAIN, type = ro;
- ONCE: load = MAIN, type = ro, define = yes, optional = yes;
+ ONCE: load = MAIN, type = ro, optional = yes;
DATA: load = MAIN, type = rw;
+ INIT: load = MAIN, type = rw, optional = yes;
ZPSAVE1: load = MAIN, type = rw, define = yes; # ZPSAVE1, ZPSAVE2 must be together
ZPSAVE2: load = MAIN, type = bss; # see "libsrc/atmos/crt0.s"
BSS: load = MAIN, type = bss, define = yes;
diff --git a/cfg/geos-apple.cfg b/cfg/geos-apple.cfg
index 9fc7024e1..b39cf1ebe 100644
--- a/cfg/geos-apple.cfg
+++ b/cfg/geos-apple.cfg
@@ -44,6 +44,7 @@ SEGMENTS {
CODE: type = ro, run = VLIR0, load = CVT;
RODATA: type = ro, run = VLIR0, load = CVT;
DATA: type = rw, run = VLIR0, load = CVT;
+ INIT: type = bss, load = VLIR0, optional = yes;
BSS: type = bss, load = VLIR0, define = yes;
VLIRIDX1: type = ro, load = CVT, align = $200, optional = yes;
OVERLAY1: type = ro, run = VLIR1, load = CVT, align_load = $200, optional = yes;
diff --git a/cfg/geos-cbm.cfg b/cfg/geos-cbm.cfg
index f9bea76a0..0269dbacb 100644
--- a/cfg/geos-cbm.cfg
+++ b/cfg/geos-cbm.cfg
@@ -41,6 +41,7 @@ SEGMENTS {
CODE: type = ro, run = VLIR0, load = CVT;
RODATA: type = ro, run = VLIR0, load = CVT;
DATA: type = rw, run = VLIR0, load = CVT;
+ INIT: type = bss, load = VLIR0, optional = yes;
BSS: type = bss, load = VLIR0, define = yes;
OVERLAY1: type = ro, run = VLIR1, load = CVT, align_load = $FE, optional = yes;
OVERLAY2: type = ro, run = VLIR2, load = CVT, align_load = $FE, optional = yes;
diff --git a/libsrc/apple2/dosdetect.s b/libsrc/apple2/dosdetect.s
index cedb1f3e3..46fbb5484 100644
--- a/libsrc/apple2/dosdetect.s
+++ b/libsrc/apple2/dosdetect.s
@@ -43,6 +43,6 @@ initdostype:
: sta __dos_type
done: rts
- .bss
+ .data
-__dos_type: .res 1
+__dos_type: .byte $00
diff --git a/libsrc/apple2/extra/iobuf-0800.s b/libsrc/apple2/extra/iobuf-0800.s
index 2e5d1927e..0ad7a751f 100644
--- a/libsrc/apple2/extra/iobuf-0800.s
+++ b/libsrc/apple2/extra/iobuf-0800.s
@@ -90,6 +90,6 @@ iobuf_free:
; ------------------------------------------------------------------------
- .bss
+ .data
table: .res MAX_FDS
diff --git a/libsrc/apple2/get_ostype.s b/libsrc/apple2/get_ostype.s
index cff6af9a3..b54e38d63 100644
--- a/libsrc/apple2/get_ostype.s
+++ b/libsrc/apple2/get_ostype.s
@@ -65,6 +65,6 @@ _get_ostype:
ldx #$00
rts
- .bss
+ .segment "INIT"
ostype: .res 1
diff --git a/libsrc/apple2/mainargs.s b/libsrc/apple2/mainargs.s
index e3db8bb10..de2f385f1 100644
--- a/libsrc/apple2/mainargs.s
+++ b/libsrc/apple2/mainargs.s
@@ -83,6 +83,7 @@ initmainargs:
; destroyed.
ldy #$00
+ sty buffer + BUF_LEN - 1
: lda BASIC_BUF,x
sta buffer,y
inx
@@ -166,14 +167,13 @@ done: lda #$0000
adc #>args
sta argv+1,y
@@ -99,7 +99,7 @@ argloop:lda BASIC_BUF,x
; A contains the terminating character. To make the argument a valid C string,
; replace the terminating character by a zero.
- lda #$00
+ lda #0
sta args-1,x
; Check if the maximum number of command line arguments is reached. If not,
@@ -120,14 +120,16 @@ done: lda #,0
+; , 0
; or
; , , , 0
; the 2nd case is when using DeskTop user drags an icon of a file and drops it
@@ -71,7 +71,7 @@ argv:
.word dataDiskName ; dataDiskName
.word $0000 ; last one must be NULL
-.bss
+.segment "INIT"
argv0:
.res 17 ; Program name
--
2.39.5