|
1 | 1 | import * as Comlink from 'comlink'; |
2 | 2 |
|
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 | +} |
4 | 30 |
|
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 | + }); |
19 | 36 |
|
20 | | - setTimeout(() => { |
| 37 | + const outputs = FS.readdir('/').filter(d => d.endsWith('.p')); |
21 | 38 |
|
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; |
26 | 42 |
|
27 | | -function build() { |
| 43 | + resolve(FS.readFile(pFilePath)); |
28 | 44 | } |
29 | 45 |
|
30 | 46 | Comlink.expose({ |
31 | | - init, |
32 | | - build, |
| 47 | + assemble, |
33 | 48 | }); |
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 | | - `; |
0 commit comments