Implemented file vectors in nasu/noodle

This commit is contained in:
neauoire 2021-04-13 12:29:36 -07:00
parent 56a3a993f4
commit f3e58adc03
7 changed files with 45 additions and 34 deletions

View File

@ -32,7 +32,7 @@ else
fi
echo "Assembling.."
./bin/assembler projects/examples/dev.file.usm bin/boot.rom
./bin/assembler projects/software/noodle.usm bin/boot.rom
echo "Running.."
if [ "${2}" = '--cli' ];

View File

@ -8,7 +8,7 @@
|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
|0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 }
|0170 ;File { pad 8 name 2 length 2 load 2 save 2 }
|0170 ;File { vector 2 pad 6 name 2 length 2 load 2 save 2 }
( program )
@ -16,22 +16,29 @@
( theme ) #ac52 =System.r #a362 =System.g #b253 =System.b
( vectors ) ,on-mouse =Mouse.vector
( vectors ) ,on-transfer =File.vector
( load )
#0000 #0000 #0100 #0100 #2c ,pict_large ,draw-picture JSR2
( load ) ,filepath =File.name #4000 =File.length ,img =File.load
( draw ) #0080 #0020 #0100 #0100 #41 ,img ,draw-chr JSR2
#0128 #0010 #0080 #0080 #2e ,pict_medium ,draw-picture JSR2
#0020 #00d0 #0020 #0020 #25 ,pict_small ,draw-picture JSR2
#0010 #0010 #0020 #0010 #25 ,dvd_icn ,draw-picture JSR2
( load ) ,filepath =File.name #4000 =File.length ,img =File.load
BRK
@on-mouse
@on-transfer ( -> )
( draw ) #0080 #0020 #0100 #0100 #41 ,img ,draw-chr JSR2
BRK
@on-mouse ( -> )
( clear last cursor )
,clear_icn =Screen.addr

View File

@ -45,6 +45,7 @@
( theme ) #e0fc =System.r #30cc =System.g #30ac =System.b
( vectors ) ,on-button =Controller.vector
( vectors ) ,on-mouse =Mouse.vector
( vectors ) ,on-transfer =File.vector
~Screen.width 2/ #008a SUB2 =bankview.x
~Screen.height 2/ #003f SUB2 =bankview.y
@ -61,7 +62,13 @@
BRK
@on-button
@on-transfer ( -> )
,redraw JSR2
BRK
@on-button ( -> )
~Controller.button
DUP #10 EQU ^$no-ctrl-up JNZ
@ -83,7 +90,7 @@ BRK
BRK
@on-mouse
@on-mouse ( -> )
~Mouse.state #00 EQU ,$click-end JNZ2

View File

@ -68,6 +68,7 @@
( vectors ) ,on-screen =Screen.vector
( vectors ) ,on-button =Controller.vector
( vectors ) ,on-mouse =Mouse.vector
( vectors ) ,on-transfer =File.vector
~theme.r0 =System.r ~theme.g0 =System.g ~theme.b0 =System.b
@ -79,7 +80,6 @@
( load file )
,untitled_txt ,path.name ,strcpy JSR2
,path.name ,load-file JSR2
( setup panes )
#0010 =toolpane.x1 #0010 =toolpane.y1 ~toolpane.x1 #0028 ADD2 =toolpane.x2 ~toolpane.y1 #0008 ADD2 =toolpane.y2
@ -91,9 +91,19 @@
,center JSR2
,clear JSR2
( load default file )
,path.name ,load-file JSR2
BRK
@on-screen ( -- )
@on-transfer ( -> )
,draw-canvas JSR2
( release ) #00 =Mouse.state
BRK
@on-screen ( -> )
~document.edit #01 NEQ ^$no-edit JNZ
#0008 =Screen.x
@ -108,7 +118,7 @@ BRK
BRK
@on-mouse
@on-mouse ( -> )
,draw-cursor JSR2

View File

@ -218,15 +218,15 @@ file_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
{
Uint8 *m = u->ram.dat;
char *name = (char *)&m[(m[ptr + 8] << 8) + m[ptr + 8 + 1]];
Uint16 length = (m[ptr + 8 + 2] << 8) + m[ptr + 8 + 3];
Uint16 offset = (m[ptr + 2] << 8) + m[ptr + 3];
Uint16 length = mempeek16(u, ptr + 8 + 2);
Uint16 offset = mempeek16(u, ptr + 2);
if(b0 == 0x0d) {
Uint16 addr = (m[ptr + 8 + 4] << 8) + b1;
FILE *f = fopen(name, "r");
if(f && fseek(f, offset, SEEK_SET) != -1 && fread(&m[addr], length, 1, f)) {
fclose(f);
printf("Loaded %d bytes, at %04x from %s\n", length, addr, name);
evaluxn(u, devfile->vector);
evaluxn(u, mempeek16(u, devfile->addr));
}
} else if(b0 == 0x0f) {
Uint16 addr = (m[ptr + 8 + 6] << 8) + b1;
@ -234,7 +234,7 @@ file_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
if(f && fseek(f, offset, SEEK_SET) != -1 && fwrite(&m[addr], length, 1, f)) {
fclose(f);
printf("Saved %d bytes, at %04x from %s\n", length, addr, name);
evaluxn(u, devfile->vector);
evaluxn(u, mempeek16(u, devfile->addr));
}
}
return b1;
@ -293,9 +293,8 @@ datetime_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
Uint8
system_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
{
Uint8 *m = u->ram.dat;
m[PAGE_DEVICE + b0] = b1;
getcolors(&ppu, &m[PAGE_DEVICE + 0x0008]);
u->ram.dat[ptr + b0] = b1;
getcolors(&ppu, &u->ram.dat[ptr + 0x0008]);
reqdraw = 1;
(void)ptr;
return b1;
@ -315,7 +314,7 @@ ppnil(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
int
start(Uxn *u)
{
inituxn(u, 0x0200);
evaluxn(u, 0x0200);
redraw(ppu.output, u);
while(1) {
SDL_Event event;
@ -333,14 +332,14 @@ start(Uxn *u)
case SDL_KEYDOWN:
case SDL_KEYUP:
doctrl(u, &event, event.type == SDL_KEYDOWN);
evaluxn(u, devctrl->vector);
evaluxn(u, mempeek16(u, devctrl->addr));
u->ram.dat[devctrl->addr + 3] = 0;
break;
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEMOTION:
domouse(u, &event);
evaluxn(u, devmouse->vector);
evaluxn(u, mempeek16(u, devmouse->addr));
break;
case SDL_WINDOWEVENT:
if(event.window.event == SDL_WINDOWEVENT_EXPOSED)
@ -348,7 +347,7 @@ start(Uxn *u)
break;
}
}
evaluxn(u, devscreen->vector);
evaluxn(u, mempeek16(u, devscreen->addr));
SDL_UnlockAudioDevice(audio_id);
if(reqdraw)
redraw(ppu.output, u);

View File

@ -151,17 +151,6 @@ evaluxn(Uxn *u, Uint16 vec)
return 1;
}
int
inituxn(Uxn *u, Uint16 vec)
{
Uint8 i = 0;
if(!evaluxn(u, vec))
return 0;
for(i = 0; i < 0x10; ++i)
u->dev[i].vector = mempeek16(u, u->dev[i].addr);
return 1;
}
int
bootuxn(Uxn *u)
{

View File

@ -32,7 +32,7 @@ typedef struct {
struct Uxn;
typedef struct Device {
Uint16 addr, vector;
Uint16 addr;
Uint8 (*poke)(struct Uxn *, Uint16, Uint8, Uint8);
} Device;
@ -44,7 +44,6 @@ typedef struct Uxn {
int loaduxn(Uxn *c, char *filepath);
int bootuxn(Uxn *c);
int inituxn(Uxn *u, Uint16 vec);
int evaluxn(Uxn *u, Uint16 vec);
void mempoke16(Uxn *u, Uint16 a, Uint16 b);
Uint16 mempeek16(Uxn *u, Uint16 a);