Skip to content

Commit a96de3c

Browse files
committed
Load program using overlays
1 parent e8f97d2 commit a96de3c

5 files changed

Lines changed: 403 additions & 55 deletions

File tree

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ set(LVGL_SRC
357357

358358
list(APPEND PAWN_SRC
359359
pawn/amx.c
360+
pawn/amxpool.c
360361
)
361362

362363
list(APPEND IMAGE_FILES

src/displayapp/screens/Pawn.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
#include <stdio.h>
33
#include <charconv>
44

5+
extern "C" {
6+
#include "pawn/amxpool.h"
7+
}
8+
9+
#include "program.h"
10+
511
using namespace Pinetime::Applications::Screens;
612

713
#define AMX_ERR_PARAMCOUNT 32
@@ -301,24 +307,51 @@ static cell AMX_NATIVE_CALL F_get_datetime_short_str(AMX* amx, const cell* param
301307
return 0;
302308
}
303309

310+
static int AMXAPI prun_Overlay(AMX* amx, int index) {
311+
AMX_HEADER* hdr;
312+
AMX_OVERLAYINFO* tbl;
313+
314+
hdr = (AMX_HEADER*) amx->base;
315+
tbl = (AMX_OVERLAYINFO*) (amx->base + hdr->overlays) + index;
316+
317+
amx->codesize = tbl->size;
318+
amx->code = (unsigned char*) amx_poolfind(index);
319+
320+
if (amx->code == NULL) {
321+
if ((amx->code = (unsigned char*) amx_poolalloc(tbl->size, index)) == NULL)
322+
return AMX_ERR_OVERLAY;
323+
324+
memcpy(amx->code, program + hdr->cod + tbl->offset, tbl->size);
325+
}
326+
327+
return AMX_ERR_NONE;
328+
}
329+
304330
static int load_program(AMX* amx, const uint8_t* data) {
305331
AMX_HEADER hdr;
306332
memcpy(&hdr, data, sizeof(hdr));
307333

308334
if (hdr.magic != AMX_MAGIC)
309335
return AMX_ERR_FORMAT;
310336

311-
void* memblock = malloc(hdr.stp);
312-
if (memblock == NULL)
313-
return AMX_ERR_MEMORY;
337+
void* header = malloc(hdr.cod);
338+
memcpy(header, data, hdr.cod);
314339

315-
memcpy(memblock, data, hdr.size);
340+
void* datablock = malloc(hdr.stp - hdr.dat); // This block contains data, heap and stack
341+
memcpy(datablock, data + hdr.dat, hdr.hea - hdr.dat);
342+
343+
constexpr int poolsize = 512;
344+
void* overlaypool = malloc(poolsize + 8);
345+
346+
amx_poolinit(overlaypool, poolsize + 8);
316347

317348
memset(amx, 0, sizeof(*amx));
349+
amx->data = (unsigned char*) datablock;
350+
amx->overlay = prun_Overlay;
318351

319-
int result = amx_Init(amx, memblock);
352+
int result = amx_Init(amx, header);
320353
if (result != AMX_ERR_NONE) {
321-
free(memblock);
354+
free(datablock);
322355
amx->base = NULL;
323356
}
324357

@@ -344,8 +377,6 @@ extern "C" const AMX_NATIVE pawn_natives[] = {
344377
F_get_datetime_short_str,
345378
};
346379

347-
#include "program.h"
348-
349380
Pawn::Pawn(Controllers::DateTime& dateTimeController) : dateTimeController(dateTimeController) {
350381
load_program(&amx, program);
351382
(void) program_len;

src/displayapp/screens/program.h

Lines changed: 65 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,71 @@
11
const unsigned char program[] = {
2-
0xbc, 0x02, 0x00, 0x00, 0xe0, 0xf1, 0x0b, 0x0b, 0x04, 0x00, 0x08, 0x00,
3-
0x64, 0x00, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00,
4-
0x84, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
2+
0x94, 0x03, 0x00, 0x00, 0xe0, 0xf1, 0x0b, 0x0b, 0x05, 0x00, 0x08, 0x00,
3+
0x7c, 0x00, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00,
4+
0x5c, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
55
0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
6-
0x4c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
7-
0x08, 0x01, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8-
0x57, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x40, 0x72, 0x65, 0x66, 0x72, 0x65,
6+
0x4c, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
7+
0x01, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8+
0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
9+
0x64, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
10+
0x5c, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x40, 0x72, 0x65, 0x66, 0x72, 0x65,
911
0x73, 0x68, 0x00, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x6a, 0x6d, 0x65, 0x63,
10-
0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
11-
0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
12-
0xfd, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x87, 0x00, 0x08, 0x00,
13-
0x92, 0x00, 0x0c, 0x00, 0x8f, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00,
14-
0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x3c, 0x00,
15-
0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
16-
0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
17-
0x8f, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
18-
0x14, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00,
19-
0x95, 0x00, 0x02, 0x00, 0x99, 0x99, 0x99, 0x00, 0x89, 0x80, 0x00, 0x00,
20-
0x8f, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff,
21-
0x14, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00,
22-
0x70, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
23-
0x87, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00,
24-
0x8f, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x8e, 0x80, 0x00, 0x00,
25-
0x8f, 0x00, 0x04, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff,
26-
0x14, 0x00, 0x00, 0x00, 0x92, 0x00, 0x10, 0x00, 0x8f, 0x00, 0x04, 0x00,
27-
0x70, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
28-
0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x08, 0x00,
29-
0x70, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
30-
0x16, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x04, 0x00, 0x70, 0x00, 0x00, 0x00,
31-
0xf8, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
32-
0x20, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x18, 0x00,
12+
0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13+
0x1e, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
14+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
15+
0xfd, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
16+
0x08, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
17+
0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
18+
0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00,
19+
0x03, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20+
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
21+
0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
22+
0x08, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
23+
0x14, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
24+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x00,
25+
0x89, 0x80, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
26+
0x70, 0x00, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00,
27+
0x71, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28+
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff,
29+
0x08, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
30+
0x71, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31+
0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32+
0x55, 0x00, 0x00, 0x00, 0x8e, 0x80, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
33+
0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff,
34+
0x14, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
35+
0x56, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
36+
0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00,
37+
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38+
0x08, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
39+
0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
40+
0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
41+
0x14, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00,
42+
0x1e, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
3343
0x70, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00,
34-
0x83, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
35-
0xbc, 0x00, 0x00, 0x00, 0x83, 0x00, 0x18, 0x00, 0xa0, 0x00, 0x08, 0x00,
36-
0x18, 0x00, 0x00, 0x00, 0x83, 0x00, 0x18, 0x00, 0xa0, 0x00, 0x0c, 0x00,
37-
0x18, 0x00, 0x00, 0x00, 0x92, 0x00, 0x50, 0x00, 0x8e, 0x00, 0x08, 0x00,
38-
0x92, 0x00, 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
39-
0x14, 0x00, 0x00, 0x00, 0x92, 0x00, 0x30, 0x00, 0x8f, 0x00, 0x04, 0x00,
40-
0x70, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
41-
0x92, 0x00, 0x60, 0x00, 0x92, 0x00, 0x5c, 0x00, 0x70, 0x00, 0x00, 0x00,
42-
0xf0, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x83, 0x00, 0x18, 0x00,
43-
0xa0, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x00, 0x92, 0x00, 0x60, 0x00,
44-
0x83, 0x00, 0x18, 0x00, 0xa0, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
45-
0x92, 0x00, 0x5c, 0x00, 0x92, 0x00, 0x64, 0x00, 0x8e, 0x00, 0x08, 0x00,
46-
0x92, 0x00, 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
47-
0x1c, 0x00, 0x00, 0x00, 0x92, 0x00, 0x30, 0x00, 0x8f, 0x00, 0x08, 0x00,
48-
0x70, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
49-
0x8f, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff,
50-
0x04, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
44+
0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
45+
0x23, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
46+
0x18, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
47+
0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
48+
0x64, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
49+
0x59, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
50+
0x08, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
51+
0x70, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00,
52+
0x59, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
53+
0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff,
54+
0x08, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
55+
0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
56+
0xf0, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
57+
0x18, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
58+
0x18, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
59+
0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
60+
0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00,
61+
0x02, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
62+
0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
63+
0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
64+
0x1c, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
65+
0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
66+
0xf6, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
67+
0x08, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff,
68+
0x04, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00,
5169
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5270
0x00, 0x00, 0x3f, 0x3f, 0x30, 0x3a, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30,
5371
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -59,4 +77,4 @@ const unsigned char program[] = {
5977
0x00, 0x00, 0x00, 0x00, 0x25, 0x20, 0x73, 0x25, 0x73, 0x25, 0x20, 0x64,
6078
0x00, 0x64, 0x25, 0x20
6179
};
62-
unsigned int program_len = 700;
80+
unsigned int program_len = 916;

0 commit comments

Comments
 (0)