Инструменты пользователя

Инструменты сайта


msx:basic_intermediate_code:basic_intermediate_code

MSX BASIC — Промежуточный код

Для хранения программ MSX BASIC в ОЗУ и компактной записи программ используется перевод лексем языка в внутренние коды. В этом виде программа хранится в таблице PIT (Program Instruction Table).

Формат упакованного файла

Структура файла на примере:

1 PRINT ABS(5)
FF
▲─
│
Начало файла

Строка 1
│
▼──────────────────────────────────
0D 80 01 00 91 20 FF 86 28 16 29 00
▲──── ▲──── ▲─────────────────── ▲─
│     │     │                    │
│     │     Операторы            Конец строки
│     │
│     Номер строки 
│
Внутренний номер сроки


Строка 2

…

Строка N


00 00
▲────
│
Конец файла

Внутренний номер строки, и номер строки это 2 байта в обратном порядке: младший, старший.

Числа (переменные)

Название, тип Префикс Длина
(байт)
Пример Примечание
значение байты
Номер строки в операторах перехода0x0E 2 520 0E 08 022 байта в обратном порядке:
младший, старший
Восьмеричное число0x0B 2 &O100B 08 00
Шестнадцатеричное число0x0C 2 &H2A00C A0 02
Целое число 256–32767 (%)0x1C 2 1000 1C E8 03
Целое число 10–255 (%)0x0F 1 110F 0B

Десятичная число одинарной точности

Десятичная число одинарной точности (6 цифр) (!)

  • Префикс: 0x1D
  • Длина (байт): 4
  • В первом байте значение второго полубайта — положение десятичной точки

Примеры:

Значение Байты
.1234561D 40 12 34 56
1.234561D 41 12 34 56
12.34561D 42 12 34 56
123.4561D 43 12 34 56
1234.561D 44 12 34 56
12345.61D 45 12 34 56
123456!1D 46 12 34 56

Десятичная число двойной точности

Десятичная число двойной точности (14 цифр) (#)

  • Префикс: 0x1F
  • Длина (байт): 8
  • Если значение второго байта меньше 0x4F, то значение его второго полубайта — положение десятичной точки, иначе это порядок числа для экспоненциальной записи.

Примеры:

Значение Байты
.12345678901234#1F 40 12 34 56 78 90 12 34
1.2345678901234#1F 41 12 34 56 78 90 12 34
12.345678901234#1F 42 12 34 56 78 90 12 34
123.45678901234#1F 43 12 34 56 78 90 12 34
1234.5678901234#1F 44 12 34 56 78 90 12 34
12345.678901234#1F 45 12 34 56 78 90 12 34
123456.78901234#1F 46 12 34 56 78 90 12 34
1234567.8901234#1F 47 12 34 56 78 90 12 34
12345678.901234#1F 48 12 34 56 78 90 12 34
123456789.01234#1F 49 12 34 56 78 90 12 34
1234567890.1234#1F 4A 12 34 56 78 90 12 34
12345678901.234#1F 4B 12 34 56 78 90 12 34
123456789012.34#1F 4C 12 34 56 78 90 12 34
1234567890123.4#1F 4D 12 34 56 78 90 12 34
12345678901234#1F 4E 12 34 56 78 90 12 34

Экспоненциальная запись

Порядок числа = Значение второго байта - 65

Примеры:

Значение Байты
1.2345678901235E+141F 4F 12 34 56 78 90 12 35
1.2345678901235E+151F 50 12 34 56 78 90 12 35
1.2345678901235E+161F 51 12 34 56 78 90 12 35
1.2345678901235E+171F 52 12 34 56 78 90 12 35
1.2345678901235E+181F 53 12 34 56 78 90 12 35

Обычный текст

Название Префикс
Кавычки (")0x22
Комментарий (REM)0x8F
Комментарий (')0x3A8FE6

Внутренние коды служебных слов

Варианты:

Без префикса

Слово / символ Код(ы)
AND0xF6
ATTR$0xE9
AUTO0xA9
BASE0xC9
BEEP0xC0
BLOAD0xCF
BSAVE0xD0
CALL0xCA
CIRCLE0xBC
CLEAR0x92
CLOAD0x9B
CLOSE0xB4
CLS0x9F
CMD0xD7
COLOR0xBD
CONT0x99
COPY0xD6
CRSLIN0xE8
CSAVE0x9A
DATA0x84
DEF0x97
DEFDBL0xAE
DEFINT0xAC
DEFSNG0xAD
DEFSTR0xAB
DELETE0xA8
DIM0x86
DRAW0xBE
DSKI$0xEA
DSKO$0xD1
END0x81
ERASE0xA5
ERL0xE1
Слово / символ Код(ы)
ERR0xE2
ERROR0xA6
EQU0xF9
FIELD0xB1
FILES0xB7
FN0xDE
FOR0x82
GET0xB2
GOSUB0x8D
GOTO0x89
INKEY$0xEC
INPUT0x85
INSTR0xE5
IMP0xFA
IPL0xD5
IF0x8B
KEY0xCC
KILL0xD4
LET0x88
LINE0xAF
LIST0x93
LFILES0xBB
LLIST0x9E
LOAD0xB5
LOCATE0xD8
LPRINT0x9D
LSET0xB8
MAX0xCD
MERGE0xB6
MOD0xFB
MOTOR0xCE
NAME0xD3
NEW0x94
Слово / символ Код(ы)
NEXT0x83
NOT0xE0
OFF0xEB
ON0x95
OPEN0xB0
OR0xF7
OUT0x9C
PAINT0xBF
PLAY0xC1
POINT0xED
POKE0x98
PRESET0xC3
PRINT0x91
PSET0xC2
PUT0xB3
READ0x87
RENUM0xAA
REM0x8F
RESTORE0x8C
RESUME0xA7
RETURN0x8E
RSET0xB9
RUN0x8A
SCREEN0xC5
SET0xD2
SAVE0xBA
SPC0xDF
SPRITE0xC7
SOUND0xC4
STEP0xDC
STOP0x90
STRING$0xE3
SWAP0xA4
Слово / символ Код(ы)
TAB0xDB
THEN0xDA
TIME0xCB
TO0xD9
TRON0xA2
TROFF0xA3
USING0xE4
USR0xDD
VARPTR0xE7
VDP0xC8
VPOKE0xC6
WAIT0x96
WIDTH0xA0
XOR0xF8
00x11
10x12
20x13
30x14
40x15
50x16
60x17
70x18
80x19
90x1A
>0xEE
=0xEF
<0xF0
+0xF1
-0xF2
*0xF3
/0xF4
^ 0xF5
\0xFC

0xFF

Слово / символ Код(ы)
ABS0xFF86
ASC0xFF95
ATN0xFF8E
BIN$0xFF9D
CDBL0xFFA0
CINT0xFF9E
CHR$0xFF96
COS0xFF8C
CSNG0xFF9F
CVD0xFFAA
CVI0xFFA8
CVS0xFFA9
Слово / символ Код(ы)
DSKF0xFFA6
EOF0xFFAB
EXP0xFF8B
FIX0xFFA1
FPOS0xFFA7
FRE0xFF8F
HEX$0xFF9B
INP0xFF90
INT0xFF85
LEN0xFF92
LEFT$0xFF81
LOC0xFFAC
Слово / символ Код(ы)
LOG0xFF8A
LOF0xFFAD
LPOS0xFF9C
MID$0xFF83
MKD$0xFFB0
MKI$0xFFAE
MKS$0xFFAF
OCT$0xFF9A
PAD0xFFA5
PDL0xFFA4
PEEK0xFF97
POS0xFF91
Слово / символ Код(ы)
RIGHT$0xFF82
RND0xFF88
SGN0xFF84
SIN0xFF89
SPACE$0xFF99
SQR0xFF87
STICK0xFFA2
STRIG0xFFA3
STR$0xFF93
TAN0xFF8D
VAL0xFF94
VPEEK0xFF98

0x3A

Слово / символ Код(ы)
ELSE0x3AA1
'0x3A8FE6

Скрипты

code-to-text.py

Скрипт работает в Python 2 и 3

code-to-text.py

Читает файл в бинарном формате и сохраняет его содержимое в текстовом формате

Параметры:

  1. Исходный файл в бинарном формате
  2. Выходной файл в текстовом формате

Пример запуска:

./code-to-text.py file.bas file_a.bas

Тесты

Запуск скрипта с тестовым файлом:

./code-to-text.py code.bas code.txt

Сравнение файлов:

diff code.txt code_a.bas
code.basТестовый файл в бинарном формате, создан командой:
save "code.bas"
code_a.basТестовый файл в текстовом формате, создан командой:
save "code_a.bas",a

Ссылки

msx/basic_intermediate_code/basic_intermediate_code.txt · Последние изменения: 2023-06-12 00:27 — GreyWolf