Browse code

Implemented a basic binary file write

neauoire authored on 05/03/2021 04:15:01
Showing 2 changed files
... ...
@@ -64,7 +64,7 @@ SDL_Texture *gTexture;
64 64
 Uint32 *pixels;
65 65
 
66 66
 Screen screen;
67
-Device *devconsole, *devscreen, *devmouse, *devkey, *devsprite, *devctrl, *devsystem;
67
+Device *devscreen, *devmouse, *devkey, *devctrl;
68 68
 
69 69
 #pragma mark - Helpers
70 70
 
... ...
@@ -380,6 +380,24 @@ sprite_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1)
380 380
 	return b1;
381 381
 }
382 382
 
383
+Uint8
384
+file_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1)
385
+{
386
+	FILE *f;
387
+	ptr += 8;
388
+	if(b0 == 0x0d) {
389
+		char *name = &m[(m[ptr] << 8) + m[ptr + 1]];
390
+		Uint16 length = (m[ptr + 2] << 8) + m[ptr + 3];
391
+		Uint16 addr = (m[ptr + 4] << 8) + b1;
392
+		f = fopen(name, "w");
393
+		if(!fwrite(&m[addr], length, 1, f))
394
+			return error("Save", "Failure");
395
+		fclose(f);
396
+		printf("Exported %s[%d bytes]\n", name, length);
397
+	}
398
+	return b1;
399
+}
400
+
383 401
 Uint8
384 402
 system_poke(Uint8 *m, Uint16 ptr, Uint8 b0, Uint8 b1)
385 403
 {
... ...
@@ -449,15 +467,22 @@ main(int argc, char **argv)
449 467
 	if(!init())
450 468
 		return error("Init", "Failed");
451 469
 
452
-	devconsole = portuxn(&u, "console", ppnil, console_poke);
470
+	portuxn(&u, "console", ppnil, console_poke);
453 471
 	devscreen = portuxn(&u, "screen", ppnil, screen_poke);
454
-	devsprite = portuxn(&u, "sprite", ppnil, sprite_poke);
472
+	portuxn(&u, "sprite", ppnil, sprite_poke);
455 473
 	devctrl = portuxn(&u, "controller", ppnil, ppnil);
456 474
 	devkey = portuxn(&u, "key", ppnil, ppnil);
457 475
 	devmouse = portuxn(&u, "mouse", ppnil, ppnil);
458
-
459
-	u.devices = 15; /* pad to last device */
460
-	devsystem = portuxn(&u, "system", ppnil, system_poke);
476
+	portuxn(&u, "file", ppnil, file_poke);
477
+	portuxn(&u, "empty", ppnil, ppnil);
478
+	portuxn(&u, "empty", ppnil, ppnil);
479
+	portuxn(&u, "empty", ppnil, ppnil);
480
+	portuxn(&u, "empty", ppnil, ppnil);
481
+	portuxn(&u, "empty", ppnil, ppnil);
482
+	portuxn(&u, "empty", ppnil, ppnil);
483
+	portuxn(&u, "empty", ppnil, ppnil);
484
+	portuxn(&u, "empty", ppnil, ppnil);
485
+	portuxn(&u, "system", ppnil, system_poke);
461 486
 
462 487
 	/* Write screen size to dev/screen */
463 488
 	u.ram.dat[devscreen->addr + 0] = (HOR * 8 >> 8) & 0xff;
... ...
@@ -3,7 +3,8 @@
3 3
 &Screen     { width 2 height 2 pad 4 x 2 y 2 color 1 }
4 4
 &Sprite     { pad 8 x 2 y 2 addr 2 color 1 }
5 5
 &Controller { buttons 1 }
6
-&Mouse      { x 2 y 2 state 1 chord 1 }
6
+&Mouse      { x 2 y 2 state 1 chord 1 change 1 }
7
+&File       { pad 8 name 2 length 2 binary 2 }
7 8
 
8 9
 &Rect2d  { x1 2 y1 2 x2 2 y2 2 }
9 10
 &Point2d { x 2 y 2 }
... ...
@@ -37,7 +38,7 @@
37 38
 BRK
38 39
 
39 40
 @FRAME 
40
-	
41
+
41 42
 	( keyboard controls )
42 43
 
43 44
 	,no-ctrl ~dev/ctrl.buttons #00 EQU JMP? POP2
... ...
@@ -67,11 +68,21 @@ BRK
67 68
 
68 69
 		,no-toolbar-click ~dev/mouse.y ~bankview.y #0010 SUB2 SUB2 #0008 DIV2 #0000 NEQ2 JMP? POP2
69 70
 			,no-toolbar-click ~dev/mouse.x ~bankview.x SUB2 #0008 DIV2 #000c LTH2 JMP? POP2
70
-			,no-toolbar-click ~dev/mouse.x ~bankview.x SUB2 #0008 DIV2 #000e GTH2 JMP? POP2
71
-			~mouse.x ~bankview.x SUB2 #0008 DIV2 #000c SUB2 SWP POP =bankview.mode
71
+			,no-toolbar-click ~dev/mouse.x ~bankview.x SUB2 #0008 DIV2 #000f GTH2 JMP? POP2
72
+			~mouse.x ~bankview.x SUB2 #0008 DIV2 #000d SUB2 SWP POP =bankview.mode
73
+			( release ) #00 =dev/mouse.state
72 74
 			,redraw JSR ,click-end JMP
73 75
 		@no-toolbar-click
74 76
 
77
+		( save button )
78
+
79
+		,no-save-click ~dev/mouse.y ~bankview.y #0010 SUB2 SUB2 #0008 DIV2 #0000 NEQ2 JMP? POP2
80
+			,no-save-click ~dev/mouse.x ~tileview.x SUB2 #0008 DIV2 #000f NEQU2 JMP? POP2
81
+			( save ) ,save_name =dev/file.name #0800 =dev/file.length ~bankview.addr =dev/file.binary
82
+			( release ) #00 =dev/mouse.state
83
+			,redraw JSR ,click-end JMP
84
+		@no-save-click
85
+
75 86
 		( bankview )
76 87
 
77 88
 		~dev/mouse.x ~bankview.x GTH2 ~dev/mouse.x ~bankview.x #0080 ADD2 LTH2 #0101 EQU2
... ...
@@ -108,13 +119,15 @@ BRK
108 119
 			~dev/mouse.y ~bankview.y SUB2 #0008 DIV2 #0008 MUL2 #0010 MUL2 ADD2
109 120
 			~bankview.addr ADD2 =tileview.addr
110 121
 			,redraw JSR ,click-end JMP
122
+
111 123
 		@no-bank-click
112 124
 
113 125
 		( tileview )
114 126
 
115 127
 		~dev/mouse.x ~tileview.x GTH2 ~dev/mouse.x ~tileview.x #0080 ADD2 LTH2 #0101 EQU2
116 128
 		~dev/mouse.y ~tileview.y GTH2 ~dev/mouse.y ~tileview.y #0080 ADD2 LTH2 #0101 EQU2
117
-		#0101 NEQ2 ,click-end ROT JMP? POP2
129
+		#0101 NEQ2 ,no-tile-click ROT JMP? POP2
130
+
118 131
 			~dev/mouse.x ~tileview.x SUB2 #0008 DIV2 #0008 MUL2 #0040 DIV2 
119 132
 			~dev/mouse.y ~tileview.y SUB2 #0008 DIV2 #0008 MUL2 #0040 DIV2 #0002 MUL2 ADD2 
120 133
 			#0008 MUL2
... ...
@@ -125,13 +138,15 @@ BRK
125 138
 			( mask ) #01 #07 ~pos.x #0008 DIV2 SWP POP SUB ROL 
126 139
 			XOR
127 140
 			( save ) ~addr ~pos.y #0008 DIV2 ADD2 STR
128
-		,redraw JSR
141
+			,redraw JSR
142
+
143
+		@no-tile-click
129 144
 
130 145
 	@click-end
131 146
 
132 147
 	,draw-cursor JSR
133 148
 
134
-BRK 
149
+BRK
135 150
 
136 151
 @redraw
137 152
 	
... ...
@@ -152,7 +167,7 @@ RTS
152 167
 
153 168
 	( toolbar )
154 169
 
155
-	~bankview.x #0060 ADD2 =dev/sprite.x
170
+	~bankview.x #0068 ADD2 =dev/sprite.x
156 171
 	~bankview.y #0010 SUB2 =dev/sprite.y
157 172
 	,tool_selector =dev/sprite.addr
158 173
 	#01 ~bankview.mode #00 EQU ADD =dev/sprite.color
... ...
@@ -165,6 +180,10 @@ RTS
165 180
 	,tool_eraser =dev/sprite.addr
166 181
 	#01 ~bankview.mode #02 EQU ADD =dev/sprite.color
167 182
 
183
+	~tileview.x #0078 ADD2 =dev/sprite.x
184
+	,save_icn =dev/sprite.addr
185
+	#01 =dev/sprite.color
186
+
168 187
 	( guides )
169 188
 
170 189
 	#00 =i ,font_hex =dev/sprite.addr
... ...
@@ -375,9 +394,10 @@ RTS
375 394
 @tool_selector [ 80c0 e0f0 f8e0 1000 ]
376 395
 @tool_hand     [ 4040 4070 f8f8 f870 ]
377 396
 @tool_eraser   [ 2050 b87c 3e1c 0800 ]
378
-
379
-@blank_icn   [ 0000 0000 0000 0000 ]
380
-@cell1_icn   [ 7cfe fefe fefe 7c00 ]
397
+@blank_icn     [ 0000 0000 0000 0000 ]
398
+@cell1_icn     [ 7cfe fefe fefe 7c00 ]
399
+@save_icn      [ fe82 8282 848e f400 ]
400
+@save_name     [ nasu_export.chr 00 ]
381 401
 
382 402
 @font_hex ( 0-F ) 
383 403
 [
... ...
@@ -566,6 +586,7 @@ RTS
566 586
 |FF20 ;dev/sprite Sprite
567 587
 |FF30 ;dev/ctrl   Controller
568 588
 |FF50 ;dev/mouse  Mouse
589
+|FF60 ;dev/file   File
569 590
 
570 591
 |FFF0 .RESET .FRAME .ERROR ( vectors )
571 592
 |FFF8 [ 35ac c03c afac ] ( palette )
572 593
\ No newline at end of file