Skip to content

Commit 4ae12b4

Browse files
author
kirjavascript
committed
fully working ASL, partial p2bin
1 parent dc966ef commit 4ae12b4

File tree

5 files changed

+227
-193
lines changed

5 files changed

+227
-193
lines changed

app/components/file/error.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@ import { Item } from '#ui';
33

44
function ErrorMsg({ error }) {
55
return (
6-
!!error &&
7-
<div className="menu-item">
8-
<Item color="red">{error.name}: {error.message}</Item>
9-
</div>
6+
!!error && (
7+
<div className="menu-item">
8+
<Item color="red">
9+
{error.name}:{' '}
10+
{error.message
11+
.split('\n')
12+
.reduce((acc, cur, i) => [...acc, <br key={i} />, cur])}
13+
<br />
14+
</Item>
15+
</div>
16+
)
1017
);
1118
}
1219

app/formats/asm/asl-worker.js

Lines changed: 38 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -1,188 +1,48 @@
11
import * as Comlink from 'comlink';
22

3-
// __flex2__done__
3+
const endStr = '__flex2__done__';
4+
5+
const errorList = [];
6+
7+
function assemble(code, { messages, filename }) {
8+
return new Promise((resolve, reject) => {
9+
self.Module = {
10+
locateFile: url => `../wasm/${url}`,
11+
arguments: ['-q', '-xx', '-L', filename],
12+
print: (text) => {
13+
if (text === endStr) return handleResult(resolve, reject);
14+
console.log('asl: ' + text);
15+
},
16+
printErr: (text) => {
17+
errorList.push(text);
18+
},
19+
onAbort: console.error,
20+
preInit: () => {
21+
FS.writeFile('as.msg', messages.asmsg);
22+
FS.writeFile('cmdarg.msg', messages.cmdargmsg);
23+
FS.writeFile('ioerrs.msg', messages.ioerrsmsg);
24+
FS.writeFile(filename, code);
25+
},
26+
};
27+
importScripts('../wasm/asl.js');
28+
});
29+
}
430

5-
function init(code, { asmsg, ioerrsmsg, cmdargmsg }) {
6-
self.Module = {
7-
locateFile: url => `../wasm/${url}`,
8-
arguments: ['-q', '-xx', '-L', 'code.asm'],
9-
print: (text) => console.log('stdout: ' + text),
10-
printErr: (text) => console.error('stderr: ' + text),
11-
preInit: () => {
12-
FS.writeFile('as.msg', asmsg);
13-
FS.writeFile('cmdarg.msg', cmdargmsg);
14-
FS.writeFile('ioerrs.msg', ioerrsmsg);
15-
FS.writeFile('code.asm', prelude + code);
16-
},
17-
};
18-
importScripts('../wasm/asl.js');
31+
function handleResult(resolve, reject) {
32+
if (errorList.length) return reject({
33+
name: 'ASError',
34+
message: '\n\n' + errorList.join('\n')
35+
});
1936

20-
setTimeout(() => {
37+
const outputs = FS.readdir('/').filter(d => d.endsWith('.p'));
2138

22-
console.log(self.Module.FS.readdir('/'));
23-
console.log(self.Module);
24-
}, 1000);
25-
}
39+
if (!outputs.length) return reject(new Error('cannot find .p'));
40+
41+
const [pFilePath] = outputs;
2642

27-
function build() {
43+
resolve(FS.readFile(pFilePath));
2844
}
2945

3046
Comlink.expose({
31-
init,
32-
build,
47+
assemble,
3348
});
34-
35-
const prelude = `SonicMappingsVer := 2
36-
37-
; macro to declare a mappings table (taken from Sonic 2 Hg disassembly)
38-
mappingsTable macro {INTLABEL}
39-
__LABEL__ label *
40-
.current_mappings_table := __LABEL__
41-
endm
42-
43-
; macro to declare an entry in a mappings table (taken from Sonic 2 Hg disassembly)
44-
mappingsTableEntry macro ptr
45-
dc.ATTRIBUTE ptr-.current_mappings_table
46-
endm
47-
48-
spriteHeader macro {INTLABEL}
49-
__LABEL__ label *
50-
if SonicMappingsVer=1
51-
dc.b ((__LABEL___End - __LABEL___Begin) / 5)
52-
elseif SonicMappingsVer=2
53-
dc.w ((__LABEL___End - __LABEL___Begin) / 8)
54-
else
55-
dc.w ((__LABEL___End - __LABEL___Begin) / 6)
56-
endif
57-
__LABEL___Begin label *
58-
endm
59-
60-
spritePiece macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri
61-
if SonicMappingsVer=1
62-
dc.b ypos
63-
dc.b (((width-1)&3)<<2)|((height-1)&3)
64-
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
65-
dc.b tile&$FF
66-
dc.b xpos
67-
elseif SonicMappingsVer=2
68-
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
69-
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
70-
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|((tile>>1)&$7FF)
71-
dc.w xpos
72-
else
73-
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
74-
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
75-
dc.w xpos
76-
endif
77-
endm
78-
79-
spritePiece2P macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri,tile2,xflip2,yflip2,pal2,pri2
80-
if SonicMappingsVer=1
81-
dc.b ypos
82-
dc.b (((width-1)&3)<<2)|((height-1)&3)
83-
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
84-
dc.b tile&$FF
85-
dc.b xpos
86-
elseif SonicMappingsVer=2
87-
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
88-
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
89-
dc.w ((pri2&1)<<15)|((pal2&3)<<13)|((yflip2&1)<<12)|((xflip2&1)<<11)|(tile2&$7FF)
90-
dc.w xpos
91-
else
92-
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
93-
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
94-
dc.w xpos
95-
endif
96-
endm
97-
98-
dplcHeader macro {INTLABEL}
99-
__LABEL__ label *
100-
if SonicDplcVer=1
101-
dc.b ((__LABEL___End - __LABEL___Begin) / 2)
102-
elseif SonicDplcVer=3
103-
dc.w (((__LABEL___End - __LABEL___Begin) / 2)-1)
104-
else
105-
dc.w ((__LABEL___End - __LABEL___Begin) / 2)
106-
endif
107-
__LABEL___Begin label *
108-
endm
109-
110-
dplcEntry macro tiles,offset
111-
if SonicDplcVer=3
112-
dc.w ((offset&$FFF)<<4)|((tiles-1)&$F)
113-
elseif SonicDplcVer=4
114-
dc.w (((tiles-1)&$F)<<12)|((offset&$FFF)<<4)
115-
else
116-
dc.w (((tiles-1)&$F)<<12)|(offset&$FFF)
117-
endif
118-
endm
119-
120-
even macro
121-
if (*)&1
122-
paddingSoFar set paddingSoFar+1
123-
dc.b 0 ;ds.b 1
124-
endif
125-
endm
126-
127-
cpu 68000
128-
129-
Map_hud_a: mappingsTable
130-
mappingsTableEntry.w Map_hud_a_0008
131-
mappingsTableEntry.w Map_hud_a_005A
132-
mappingsTableEntry.w Map_hud_a_00AC
133-
mappingsTableEntry.w Map_hud_a_00FE
134-
135-
Map_hud_a_0008: spriteHeader
136-
spritePiece 0, -$80, 4, 2, 0, 0, 0, 1, 0
137-
spritePiece $20, -$80, 4, 2, $18, 0, 0, 1, 0
138-
spritePiece $40, -$80, 4, 2, $20, 0, 0, 1, 0
139-
spritePiece 0, -$70, 4, 2, $10, 0, 0, 1, 0
140-
spritePiece $28, -$70, 4, 2, $28, 0, 0, 1, 0
141-
spritePiece 0, -$60, 4, 2, 8, 0, 0, 1, 0
142-
spritePiece $20, -$60, 1, 2, 0, 0, 0, 1, 0
143-
spritePiece $30, -$60, 3, 2, $30, 0, 0, 1, 0
144-
spritePiece 0, $40, 2, 2, $10A, 0, 0, 0, 0
145-
spritePiece $10, $40, 4, 2, $10E, 0, 0, 1, 0
146-
Map_hud_a_0008_End
147-
148-
Map_hud_a_005A: spriteHeader
149-
spritePiece 0, -$80, 4, 2, 0, 0, 0, 1, 0
150-
spritePiece $20, -$80, 4, 2, $18, 0, 0, 1, 0
151-
spritePiece $40, -$80, 4, 2, $20, 0, 0, 1, 0
152-
spritePiece 0, -$70, 4, 2, $10, 0, 0, 1, 0
153-
spritePiece $28, -$70, 4, 2, $28, 0, 0, 1, 0
154-
spritePiece 0, -$60, 4, 2, 8, 0, 0, 0, 0
155-
spritePiece $20, -$60, 1, 2, 0, 0, 0, 0, 0
156-
spritePiece $30, -$60, 3, 2, $30, 0, 0, 1, 0
157-
spritePiece 0, $40, 2, 2, $10A, 0, 0, 0, 0
158-
spritePiece $10, $40, 4, 2, $10E, 0, 0, 1, 0
159-
Map_hud_a_005A_End
160-
161-
Map_hud_a_00AC: spriteHeader
162-
spritePiece 0, -$80, 4, 2, 0, 0, 0, 1, 0
163-
spritePiece $20, -$80, 4, 2, $18, 0, 0, 1, 0
164-
spritePiece $40, -$80, 4, 2, $20, 0, 0, 1, 0
165-
spritePiece 0, -$70, 4, 2, $10, 0, 0, 0, 0
166-
spritePiece $28, -$70, 4, 2, $28, 0, 0, 1, 0
167-
spritePiece 0, -$60, 4, 2, 8, 0, 0, 1, 0
168-
spritePiece $20, -$60, 1, 2, 0, 0, 0, 1, 0
169-
spritePiece $30, -$60, 3, 2, $30, 0, 0, 1, 0
170-
spritePiece 0, $40, 2, 2, $10A, 0, 0, 0, 0
171-
spritePiece $10, $40, 4, 2, $10E, 0, 0, 1, 0
172-
Map_hud_a_00AC_End
173-
174-
Map_hud_a_00FE: spriteHeader
175-
spritePiece 0, -$80, 4, 2, 0, 0, 0, 1, 0
176-
spritePiece $20, -$80, 4, 2, $18, 0, 0, 1, 0
177-
spritePiece $40, -$80, 4, 2, $20, 0, 0, 1, 0
178-
spritePiece 0, -$70, 4, 2, $10, 0, 0, 0, 0
179-
spritePiece $28, -$70, 4, 2, $28, 0, 0, 1, 0
180-
spritePiece 0, -$60, 4, 2, 8, 0, 0, 0, 0
181-
spritePiece $20, -$60, 1, 2, 0, 0, 0, 0, 0
182-
spritePiece $30, -$60, 3, 2, $30, 0, 0, 1, 0
183-
spritePiece 0, $40, 2, 2, $10A, 0, 0, 0, 0
184-
spritePiece $10, $40, 4, 2, $10E, 0, 0, 1, 0
185-
Map_hud_a_00FE_End
186-
187-
even
188-
`;

app/formats/asm/index.js

Lines changed: 128 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,135 @@ import * as Comlink from 'comlink';
33
import asmsg from './messages/as.msg';
44
import ioerrsmsg from './messages/ioerrs.msg';
55
import cmdargmsg from './messages/cmdarg.msg';
6+
import p2binmsg from './messages/p2bin.msg';
67

7-
export async function assemble(code) {
8-
const worker = new Worker('bundles/asl-worker.js')
9-
const asl = Comlink.wrap(worker);
8+
const messages = {
9+
asmsg,
10+
ioerrsmsg,
11+
cmdargmsg,
12+
};
1013

11-
console.time('asd');
12-
await asl.init(code, {
13-
asmsg,
14-
ioerrsmsg,
15-
cmdargmsg,
14+
export async function assemble(
15+
code,
16+
{ filename } = {
17+
filename: 'code.asm',
18+
},
19+
) {
20+
console.time('assemble');
21+
22+
const aslWorker = new Worker('bundles/asl-worker.js');
23+
const asl = Comlink.wrap(aslWorker);
24+
25+
const pFile = await asl.assemble(prelude + code, { messages, filename });
26+
aslWorker.terminate();
27+
28+
console.log(pFile);
29+
30+
const p2binWorker = new Worker('bundles/p2bin-worker.js');
31+
const p2bin = Comlink.wrap(p2binWorker);
32+
const bin = await p2bin.binary(pFile, {
33+
messages: { p2binmsg },
1634
});
17-
console.timeEnd('asd');
18-
await asl.build();
19-
// worker.terminate();
35+
p2binWorker.terminate();
36+
37+
console.log(bin);
38+
39+
console.timeEnd('assemble');
40+
41+
return bin;
2042
}
43+
44+
const prelude = `SonicMappingsVer := 2
45+
46+
; macro to declare a mappings table (taken from Sonic 2 Hg disassembly)
47+
mappingsTable macro {INTLABEL}
48+
__LABEL__ label *
49+
.current_mappings_table := __LABEL__
50+
endm
51+
52+
; macro to declare an entry in a mappings table (taken from Sonic 2 Hg disassembly)
53+
mappingsTableEntry macro ptr
54+
dc.ATTRIBUTE ptr-.current_mappings_table
55+
endm
56+
57+
spriteHeader macro {INTLABEL}
58+
__LABEL__ label *
59+
if SonicMappingsVer=1
60+
dc.b ((__LABEL___End - __LABEL___Begin) / 5)
61+
elseif SonicMappingsVer=2
62+
dc.w ((__LABEL___End - __LABEL___Begin) / 8)
63+
else
64+
dc.w ((__LABEL___End - __LABEL___Begin) / 6)
65+
endif
66+
__LABEL___Begin label *
67+
endm
68+
69+
spritePiece macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri
70+
if SonicMappingsVer=1
71+
dc.b ypos
72+
dc.b (((width-1)&3)<<2)|((height-1)&3)
73+
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
74+
dc.b tile&$FF
75+
dc.b xpos
76+
elseif SonicMappingsVer=2
77+
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
78+
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
79+
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|((tile>>1)&$7FF)
80+
dc.w xpos
81+
else
82+
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
83+
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
84+
dc.w xpos
85+
endif
86+
endm
87+
88+
spritePiece2P macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri,tile2,xflip2,yflip2,pal2,pri2
89+
if SonicMappingsVer=1
90+
dc.b ypos
91+
dc.b (((width-1)&3)<<2)|((height-1)&3)
92+
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
93+
dc.b tile&$FF
94+
dc.b xpos
95+
elseif SonicMappingsVer=2
96+
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
97+
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
98+
dc.w ((pri2&1)<<15)|((pal2&3)<<13)|((yflip2&1)<<12)|((xflip2&1)<<11)|(tile2&$7FF)
99+
dc.w xpos
100+
else
101+
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
102+
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
103+
dc.w xpos
104+
endif
105+
endm
106+
107+
dplcHeader macro {INTLABEL}
108+
__LABEL__ label *
109+
if SonicDplcVer=1
110+
dc.b ((__LABEL___End - __LABEL___Begin) / 2)
111+
elseif SonicDplcVer=3
112+
dc.w (((__LABEL___End - __LABEL___Begin) / 2)-1)
113+
else
114+
dc.w ((__LABEL___End - __LABEL___Begin) / 2)
115+
endif
116+
__LABEL___Begin label *
117+
endm
118+
119+
dplcEntry macro tiles,offset
120+
if SonicDplcVer=3
121+
dc.w ((offset&$FFF)<<4)|((tiles-1)&$F)
122+
elseif SonicDplcVer=4
123+
dc.w (((tiles-1)&$F)<<12)|((offset&$FFF)<<4)
124+
else
125+
dc.w (((tiles-1)&$F)<<12)|(offset&$FFF)
126+
endif
127+
endm
128+
129+
even macro
130+
if (*)&1
131+
paddingSoFar set paddingSoFar+1
132+
dc.b 0 ;ds.b 1
133+
endif
134+
endm
135+
136+
cpu 68000
137+
`;

0 commit comments

Comments
 (0)