Browse code

Allow device memory offsets in assembler

Andrew Alderwick authored on 21/04/2021 12:45:17
Showing 4 changed files
... ...
@@ -2,6 +2,14 @@
2 2
 
3 3
 %RTN { JMP2r }
4 4
 
5
+( devices )
6
+
7
+|10 @Console    [ &pad $8 &char $1 ]
8
+
9
+( variables )
10
+
11
+|0000
12
+
5 13
 ( program )
6 14
 
7 15
 |0100
... ...
@@ -22,6 +30,3 @@ RTN
22 30
 
23 31
 @hello-word [ 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 ]
24 32
 
25
-( devices )
26
-
27
-|ff10 @Console    [ &pad $8 &char $1 ]
... ...
@@ -6,8 +6,17 @@
6 6
 %=>SC/ADDR { .Screen/addr IOW2 }
7 7
 %->SC/COLR { .Screen/color IOW }
8 8
 
9
+( devices )
10
+
11
+|00 @System     [ &vector $2 &pad    $6 &r      $2 &g     $2 &b      $2 ]
12
+|10 @Console    [ &pad    $8 &char   $1 &byte   $1 &short $2 &string $2 ]
13
+|20 @Screen     [ &vector $2 &width  $2 &height $2 &pad   $2 &x      $2 &y $2 &addr $2 &color $1 ]
14
+|40 @Controller [ &vector $2 &button $1 &key    $1 ]
15
+
9 16
 ( variables )
10 17
 
18
+|0000
19
+
11 20
 @slime $1
12 21
 
13 22
 |0100
... ...
@@ -78,9 +87,3 @@ BRK
78 87
 @right_icn   [ 3c7e f7f8 f8f7 7e3c ]
79 88
 @slime_icn   [ 0000 183c 3c18 0000 ]
80 89
 
81
-( devices )
82
-
83
-|ff00 @System     [ &vector $2 &pad    $6 &r      $2 &g     $2 &b      $2 ]
84
-|ff10 @Console    [ &pad    $8 &char   $1 &byte   $1 &short $2 &string $2 ]
85
-|ff20 @Screen     [ &vector $2 &width  $2 &height $2 &pad   $2 &x      $2 &y $2 &addr $2 &color $1 ]
86
-|ff40 @Controller [ &vector $2 &button $1 &key    $1 ]
... ...
@@ -16,6 +16,19 @@
16 16
 
17 17
 %MEMORY { #1000 }
18 18
 
19
+( devices )
20
+
21
+|00 @System     [ &vector $2 &pad    $6 &r      $2 &g     $2 &b      $2 ]
22
+|10 @Console    [ &pad    $8 &char   $1 &byte   $1 &short $2 &string $2 ]
23
+|20 @Screen     [ &vector $2 &width  $2 &height $2 &pad   $2 &x      $2 &y $2 &addr $2 &color $1 ]
24
+|40 @Controller [ &vector $2 &button $1 &key    $1 ]
25
+|60 @Mouse      [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ]
26
+|70 @File       [ &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 ]
27
+
28
+( variables )
29
+
30
+|0000
31
+
19 32
 @loadbtn [ &x $2 &y $2 ]
20 33
 @output [ &x $2 &y $2 ]
21 34
 @pointer [ &x $2 &y $2 ]
... ...
@@ -192,11 +205,3 @@ RTN
192 205
 	0000 0032 4c00 0000 3c42 99a1 a199 423c
193 206
 ]
194 207
 
195
-( devices )
196
-
197
-|ff00 @System     [ &vector $2 &pad    $6 &r      $2 &g     $2 &b      $2 ]
198
-|ff10 @Console    [ &pad    $8 &char   $1 &byte   $1 &short $2 &string $2 ]
199
-|ff20 @Screen     [ &vector $2 &width  $2 &height $2 &pad   $2 &x      $2 &y $2 &addr $2 &color $1 ]
200
-|ff40 @Controller [ &vector $2 &button $1 &key    $1 ]
201
-|ff60 @Mouse      [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ]
202
-|ff70 @File       [ &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 ]
... ...
@@ -286,8 +286,6 @@ pass1(FILE *f)
286 286
 	while(fscanf(f, "%s", w) == 1) {
287 287
 		if(skipblock(w, &ccmnt, '(', ')')) continue;
288 288
 		if(w[0] == '|') {
289
-			if(shex(w + 1) < addr)
290
-				return error("Memory Overwrite", w);
291 289
 			addr = shex(w + 1);
292 290
 		} else if(w[0] == '%') {
293 291
 			if(!makemacro(w + 1, f))
... ...
@@ -322,6 +320,8 @@ pass2(FILE *f)
322 320
 		if(skipblock(w, &ccmnt, '(', ')')) continue;
323 321
 		if(skipblock(w, &ctemplate, '{', '}')) continue;
324 322
 		if(w[0] == '|') {
323
+			if(p.length && shex(w + 1) < p.ptr)
324
+				return error("Memory Overwrite", w);
325 325
 			p.ptr = shex(w + 1);
326 326
 			continue;
327 327
 		} else if(w[0] == '$') {