Quote:
Вопрос о "магии" CLOAD-а (катсти, а по какому он адресу?)
операторы и функции бейсика
(содержимое ОЗУ в моей версии ПЗУ)
Code:
ROM:0040 unk_40: .db 0C3h
ROM:0041 ptr_basic_???: .dw loc_4F9
ROM:0043 ptr_funcs_tab: .dw func_SGN ; SGN
ROM:0045 .dw func_INT ; INT
ROM:0047 .dw func_ABS ; ABS
ROM:0049 ptr_func_usr: .dw oper_do_FC_error ; USR
ROM:004B .dw func_FRE ; FRE
ROM:004D .dw func_INP ; INP
ROM:004F .dw func_POS ; POS
ROM:0051 .dw func_SQR ; SQR
ROM:0053 .dw func_RND ; RND
ROM:0055 .dw func_LOG ; LOG
ROM:0057 .dw func_EXP ; EXP
ROM:0059 .dw func_COS ; COS
ROM:005B .dw func_SIN ; SIN
ROM:005D .dw func_TAN ; TAN
ROM:005F .dw func_ATN ; ATN
ROM:0061 .dw func_PEEK ; PEEK
ROM:0063 .dw func_LEN ; LEN
ROM:0065 .dw func_STR$ ; STR$
ROM:0067 .dw func_VAL ; VAL
ROM:0069 .dw func_ASC ; ASC
ROM:006B .dw func_CHR$ ; CHR$
ROM:006D .dw func_LEFT$ ; LEFT$
ROM:006F .dw func_RIGHT$ ; RIGHT$
ROM:0071 .dw func_MID$ ; MID$
ROM:0073 .dw oper_do_FC_error ; INKEY$
ROM:0075 .dw oper_do_FC_error ; HEX$
ROM:0077 .dw oper_do_FC_error ; POINT
ROM:0079 .dw oper_do_FC_error ; VARPTR
ROM:007B .dw oper_do_FC_error ; CSRLIN
ROM:007D .dw oper_do_FC_error ; VPEEK
ROM:007F .dw oper_do_FC_error ; @@
ROM:0081 .dw oper_do_FC_error ; @@
ROM:0083 .dw oper_do_FC_error ; @@
ROM:0085 .dw oper_do_FC_error ; @@
ROM:0087 .dw oper_do_FC_error ; @@
ROM:0089 .dw oper_do_FC_error ; @@
ROM:008B .dw oper_do_FC_error ; @@
ROM:008D .dw oper_do_FC_error ; @@
ROM:008F ptr_oprtrs_tab: .dw oper_END ; END
ROM:0091 .dw oper_FOR ; FOR
ROM:0093 .dw oper_NEXT ; NEXT
ROM:0095 .dw oper_DATA ; DATA
ROM:0097 .dw oper_INPUT ; INPUT
ROM:0099 .dw oper_DIM ; DIM
ROM:009B .dw oper_READ ; READ
ROM:009D .dw oper_LET ; LET
ROM:009F .dw oper_GOTO ; GOTO
ROM:00A1 .dw oper_RUN ; RUN
ROM:00A3 .dw oper_IF ; IF
ROM:00A5 .dw oper_RESTORE ; RESTORE
ROM:00A7 .dw oper_GOSUB ; GOSUB
ROM:00A9 .dw oper_RETURN ; RETURN
ROM:00AB .dw oper_REM ; REM
ROM:00AD .dw oper_STOP ; STOP
ROM:00AF .dw oper_CLS ; CLS
ROM:00B1 .dw oper_ON ; ON
ROM:00B3 .dw oper_PLOT ; PLOT
ROM:00B5 .dw oper_DRAW ; DRAW
ROM:00B7 .dw oper_POKE ; POKE
ROM:00B9 .dw oper_PRINT ; PRINT
ROM:00BB .dw oper_DEF ; DEF
ROM:00BD .dw oper_CONT ; CONT
ROM:00BF .dw oper_LIST ; LIST
ROM:00C1 .dw oper_CLEAR ; CLEAR
ROM:00C3 .dw oper_CLOAD ; CLOAD
ROM:00C5 .dw oper_CSAVE ; CSAVE
ROM:00C7 .dw oper_NEW ; NEW
ROM:00C9 .dw oper_LOAD ; LOAD
ROM:00CB .dw oper_MERGE ; MERGE
ROM:00CD .dw oper_SAVE ; SAVE
ROM:00CF .dw oper_OUT ; OUT
ROM:00D1 .dw oper_WAIT ; WAIT
ROM:00D3 .dw oper_SLOAD ; SLOAD
ROM:00D5 .dw oper_BSAVE ; BSAVE
ROM:00D7 .dw oper_BLOAD ; BLOAD
ROM:00D9 .dw oper_BAUD ; BAUD
ROM:00DB .dw oper_LOCATE ; LOCATE
ROM:00DD .dw oper_COLOR ; COLOR
ROM:00DF .dw oper_LINE ; LINE
ROM:00E1 .dw oper_PSET ; PSET
ROM:00E3 .dw oper_PRESET ; PRESET
ROM:00E5 .dw oper_CIRCLE ; CIRCLE
ROM:00E7 .dw oper_PAINT ; PAINT
ROM:00E9 .dw oper_do_FC_error ; GET
ROM:00EB .dw oper_do_FC_error ; PUT
ROM:00ED .dw oper_BEEP ; BEEP
ROM:00EF .dw oper_SOUND ; SOUND
ROM:00F1 .dw oper_DELETE ; DELETE
ROM:00F3 .dw oper_do_FC_error ; RENUM
ROM:00F5 .dw oper_EDIT ; EDIT
ROM:00F7 .dw oper_VPOKE ; VPOKE
ROM:00F9 .dw oper_do_FC_error ; @@
ROM:00FB .dw oper_do_FC_error ; @@
ROM:00FD .dw oper_do_FC_error ; @@
ROM:00FF .dw oper_do_FC_error ; @@
ROM:0101 .dw oper_do_FC_error ; @@
ROM:0103 .dw oper_do_FC_error ; @@
ROM:0105 .dw oper_do_FC_error ; @@
ROM:0107 .dw loc_2C
делалось вот этим
Code:
#include <idc.idc>
static main() {
MakeRptCmt(0x008F, "END"); // token: 80
MakeRptCmt(0x0091, "FOR"); // token: 81
MakeRptCmt(0x0093, "NEXT"); // token: 82
MakeRptCmt(0x0095, "DATA"); // token: 83
MakeRptCmt(0x0097, "INPUT"); // token: 84
MakeRptCmt(0x0099, "DIM"); // token: 85
MakeRptCmt(0x009B, "READ"); // token: 86
MakeRptCmt(0x009D, "LET"); // token: 87
MakeRptCmt(0x009F, "GOTO"); // token: 88
MakeRptCmt(0x00A1, "RUN"); // token: 89
MakeRptCmt(0x00A3, "IF"); // token: 8A
MakeRptCmt(0x00A5, "RESTORE"); // token: 8B
MakeRptCmt(0x00A7, "GOSUB"); // token: 8C
MakeRptCmt(0x00A9, "RETURN"); // token: 8D
MakeRptCmt(0x00AB, "REM"); // token: 8E
MakeRptCmt(0x00AD, "STOP"); // token: 8F
MakeRptCmt(0x00AF, "CLS"); // token: 90
MakeRptCmt(0x00B1, "ON"); // token: 91
MakeRptCmt(0x00B3, "PLOT"); // token: 92
MakeRptCmt(0x00B5, "DRAW"); // token: 93
MakeRptCmt(0x00B7, "POKE"); // token: 94
MakeRptCmt(0x00B9, "PRINT"); // token: 95
MakeRptCmt(0x00BB, "DEF"); // token: 96
MakeRptCmt(0x00BD, "CONT"); // token: 97
MakeRptCmt(0x00BF, "LIST"); // token: 98
MakeRptCmt(0x00C1, "CLEAR"); // token: 99
MakeRptCmt(0x00C3, "CLOAD"); // token: 9A
MakeRptCmt(0x00C5, "CSAVE"); // token: 9B
MakeRptCmt(0x00C7, "NEW"); // token: 9C
MakeRptCmt(0x00C9, "LOAD"); // token: 9D
MakeRptCmt(0x00CB, "MERGE"); // token: 9E
MakeRptCmt(0x00CD, "SAVE"); // token: 9F
MakeRptCmt(0x00CF, "OUT"); // token: A0
MakeRptCmt(0x00D1, "WAIT"); // token: A1
MakeRptCmt(0x00D3, "SLOAD"); // token: A2
MakeRptCmt(0x00D5, "BSAVE"); // token: A3
MakeRptCmt(0x00D7, "BLOAD"); // token: A4
MakeRptCmt(0x00D9, "BAUD"); // token: A5
MakeRptCmt(0x00DB, "LOCATE"); // token: A6
MakeRptCmt(0x00DD, "COLOR"); // token: A7
MakeRptCmt(0x00DF, "LINE"); // token: A8
MakeRptCmt(0x00E1, "PSET"); // token: A9
MakeRptCmt(0x00E3, "PRESET"); // token: AA
MakeRptCmt(0x00E5, "CIRCLE"); // token: AB
MakeRptCmt(0x00E7, "PAINT"); // token: AC
MakeRptCmt(0x00E9, "GET"); // token: AD
MakeRptCmt(0x00EB, "PUT"); // token: AE
MakeRptCmt(0x00ED, "BEEP"); // token: AF
MakeRptCmt(0x00EF, "SOUND"); // token: B0
MakeRptCmt(0x00F1, "DELETE"); // token: B1
MakeRptCmt(0x00F3, "RENUM"); // token: B2
MakeRptCmt(0x00F5, "EDIT"); // token: B3
MakeRptCmt(0x00F7, "VPOKE"); // token: B4
MakeRptCmt(0x00F9, "@@"); // token: B5
MakeRptCmt(0x00FB, "@@"); // token: B6
MakeRptCmt(0x00FD, "@@"); // token: B7
MakeRptCmt(0x00FF, "@@"); // token: B8
MakeRptCmt(0x0101, "@@"); // token: B9
MakeRptCmt(0x0103, "@@"); // token: BA
MakeRptCmt(0x0105, "@@"); // token: BB
// intrinsic: "TAB(" // token: BC
// intrinsic: "TO" // token: BD
// intrinsic: "SPC(" // token: BE
// intrinsic: "FN" // token: BF
// intrinsic: "THEN" // token: C0
// intrinsic: "NOT" // token: C1
// intrinsic: "STEP" // token: C2
// intrinsic: "+" // token: C3
// intrinsic: "-" // token: C4
// intrinsic: "*" // token: C5
// intrinsic: "/" // token: C6
// intrinsic: "^" // token: C7
// intrinsic: "AND" // token: C8
// intrinsic: "OR" // token: C9
// intrinsic: ">" // token: CA
// intrinsic: "=" // token: CB
// intrinsic: "<" // token: CC
// intrinsic: "@@" // token: CD
// intrinsic: "@@" // token: CE
// intrinsic: "@@" // token: CF
MakeRptCmt(0x0043, "SGN"); // token: D0
MakeRptCmt(0x0045, "INT"); // token: D1
MakeRptCmt(0x0047, "ABS"); // token: D2
MakeRptCmt(0x0049, "USR"); // token: D3
MakeRptCmt(0x004B, "FRE"); // token: D4
MakeRptCmt(0x004D, "INP"); // token: D5
MakeRptCmt(0x004F, "POS"); // token: D6
MakeRptCmt(0x0051, "SQR"); // token: D7
MakeRptCmt(0x0053, "RND"); // token: D8
MakeRptCmt(0x0055, "LOG"); // token: D9
MakeRptCmt(0x0057, "EXP"); // token: DA
MakeRptCmt(0x0059, "COS"); // token: DB
MakeRptCmt(0x005B, "SIN"); // token: DC
MakeRptCmt(0x005D, "TAN"); // token: DD
MakeRptCmt(0x005F, "ATN"); // token: DE
MakeRptCmt(0x0061, "PEEK"); // token: DF
MakeRptCmt(0x0063, "LEN"); // token: E0
MakeRptCmt(0x0065, "STR$"); // token: E1
MakeRptCmt(0x0067, "VAL"); // token: E2
MakeRptCmt(0x0069, "ASC"); // token: E3
MakeRptCmt(0x006B, "CHR$"); // token: E4
MakeRptCmt(0x006D, "LEFT$"); // token: E5
MakeRptCmt(0x006F, "RIGHT$"); // token: E6
MakeRptCmt(0x0071, "MID$"); // token: E7
MakeRptCmt(0x0073, "INKEY$"); // token: E8
MakeRptCmt(0x0075, "HEX$"); // token: E9
MakeRptCmt(0x0077, "POINT"); // token: EA
MakeRptCmt(0x0079, "VARPTR"); // token: EB
MakeRptCmt(0x007B, "CSRLIN"); // token: EC
MakeRptCmt(0x007D, "VPEEK"); // token: ED
MakeRptCmt(0x007F, "@@"); // token: EE
MakeRptCmt(0x0081, "@@"); // token: EF
MakeRptCmt(0x0083, "@@"); // token: F0
MakeRptCmt(0x0085, "@@"); // token: F1
MakeRptCmt(0x0087, "@@"); // token: F2
MakeRptCmt(0x0089, "@@"); // token: F3
MakeRptCmt(0x008B, "@@"); // token: F4
MakeRptCmt(0x008D, "@@"); // token: F5
MakeCode(0x05F1); MakeName(0x05F1, "oper_END");
MakeCode(0x0535); MakeName(0x0535, "oper_FOR");
MakeCode(0x091D); MakeName(0x091D, "oper_NEXT");
MakeCode(0x06F9); MakeName(0x06F9, "oper_DATA");
MakeCode(0x0852); MakeName(0x0852, "oper_INPUT");
MakeCode(0x0B15); MakeName(0x0B15, "oper_DIM");
MakeCode(0x0879); MakeName(0x0879, "oper_READ");
MakeCode(0x0710); MakeName(0x0710, "oper_LET");
MakeCode(0x06C7); MakeName(0x06C7, "oper_GOTO");
MakeCode(0x06AB); MakeName(0x06AB, "oper_RUN");
MakeCode(0x0778); MakeName(0x0778, "oper_IF");
MakeCode(0xC200); MakeName(0xC200, "oper_RESTORE");
MakeCode(0x06B7); MakeName(0x06B7, "oper_GOSUB");
MakeCode(0x06E3); MakeName(0x06E3, "oper_RETURN");
MakeCode(0x06FB); MakeName(0x06FB, "oper_REM");
MakeCode(0x05EF); MakeName(0x05EF, "oper_STOP");
MakeCode(0xEBD0); MakeName(0xEBD0, "oper_CLS");
MakeCode(0x075C); MakeName(0x075C, "oper_ON");
MakeCode(0xD723); MakeName(0xD723, "oper_PLOT");
MakeCode(0xD8C8); MakeName(0xD8C8, "oper_DRAW");
MakeCode(0x1064); MakeName(0x1064, "oper_POKE");
MakeCode(0x0791); MakeName(0x0791, "oper_PRINT");
MakeCode(0x0CB0); MakeName(0x0CB0, "oper_DEF");
MakeCode(0x0617); MakeName(0x0617, "oper_CONT");
MakeCode(0xD800); MakeName(0xD800, "oper_LIST");
MakeCode(0x0682); MakeName(0x0682, "oper_CLEAR");
MakeCode(0xE556); MakeName(0xE556, "oper_CLOAD");
MakeCode(0xE532); MakeName(0xE532, "oper_CSAVE");
MakeCode(0x039D); MakeName(0x039D, "oper_NEW");
MakeCode(0xDB6E); MakeName(0xDB6E, "oper_LOAD");
MakeCode(0xDB77); MakeName(0xDB77, "oper_MERGE");
MakeCode(0xDC23); MakeName(0xDC23, "oper_SAVE");
MakeCode(0x0F80); MakeName(0x0F80, "oper_OUT");
MakeCode(0x0F86); MakeName(0x0F86, "oper_WAIT");
MakeCode(0xD873); MakeName(0xD873, "oper_SLOAD");
MakeCode(0xDCC6); MakeName(0xDCC6, "oper_BSAVE");
MakeCode(0xDCF5); MakeName(0xDCF5, "oper_BLOAD");
MakeCode(0xDDD3); MakeName(0xDDD3, "oper_BAUD");
MakeCode(0xDF30); MakeName(0xDF30, "oper_LOCATE");
MakeCode(0xDE06); MakeName(0xDE06, "oper_COLOR");
MakeCode(0xF0D7); MakeName(0xF0D7, "oper_LINE");
MakeCode(0xF03A); MakeName(0xF03A, "oper_PSET");
MakeCode(0xF01D); MakeName(0xF01D, "oper_PRESET");
MakeCode(0xFDD5); MakeName(0xFDD5, "oper_CIRCLE");
MakeCode(0xE748); MakeName(0xE748, "oper_PAINT");
MakeCode(0x065C); MakeName(0x065C, "oper_do_FC_error");
MakeCode(0xDEBF); MakeName(0xDEBF, "oper_BEEP");
MakeCode(0xF9D0); MakeName(0xF9D0, "oper_SOUND");
MakeCode(0xF633); MakeName(0xF633, "oper_DELETE");
MakeCode(0xF362); MakeName(0xF362, "oper_EDIT");
MakeCode(0xFC49); MakeName(0xFC49, "oper_VPOKE");
MakeCode(0x12D4); MakeName(0x12D4, "func_SGN");
MakeCode(0x1392); MakeName(0x1392, "func_INT");
MakeCode(0x12E8); MakeName(0x12E8, "func_ABS");
MakeCode(0x0C7A); MakeName(0x0C7A, "func_FRE");
MakeCode(0x0F75); MakeName(0x0F75, "func_INP");
MakeCode(0x0CA8); MakeName(0x0CA8, "func_POS");
MakeCode(0x1554); MakeName(0x1554, "func_SQR");
MakeCode(0x162A); MakeName(0x162A, "func_RND");
MakeCode(0x117E); MakeName(0x117E, "func_LOG");
MakeCode(0x1599); MakeName(0x1599, "func_EXP");
MakeCode(0x1660); MakeName(0x1660, "func_COS");
MakeCode(0x1666); MakeName(0x1666, "func_SIN");
MakeCode(0x16C3); MakeName(0x16C3, "func_TAN");
MakeCode(0x16D8); MakeName(0x16D8, "func_ATN");
MakeCode(0x105D); MakeName(0x105D, "func_PEEK");
MakeCode(0x0EE7); MakeName(0x0EE7, "func_LEN");
MakeCode(0x0D1F); MakeName(0x0D1F, "func_STR$");
MakeCode(0x0FC8); MakeName(0x0FC8, "func_VAL");
MakeCode(0x0EF6); MakeName(0x0EF6, "func_ASC");
MakeCode(0x0F04); MakeName(0x0F04, "func_CHR$");
MakeCode(0x0F14); MakeName(0x0F14, "func_LEFT$");
MakeCode(0x0F44); MakeName(0x0F44, "func_RIGHT$");
MakeCode(0x0F4E); MakeName(0x0F4E, "func_MID$");
}
из вот этого
Code:
#!/usr/bin/perl
open F,"<JUSTBOOT.SAV" or die "$!"; binmode F;
read F, $ram, -s F; close F;
@tokens =
(
'END', 'FOR', 'NEXT', 'DATA', 'INPUT', 'DIM', 'READ', 'LET',
'GOTO', 'RUN', 'IF', 'RESTORE', 'GOSUB', 'RETURN', 'REM', 'STOP',
'CLS', 'ON', 'PLOT', 'DRAW', 'POKE', 'PRINT', 'DEF', 'CONT',
'LIST', 'CLEAR', 'CLOAD', 'CSAVE', 'NEW', 'LOAD', 'MERGE', 'SAVE',
'OUT', 'WAIT', 'SLOAD', 'BSAVE', 'BLOAD', 'BAUD', 'LOCATE', 'COLOR',
'LINE', 'PSET', 'PRESET', 'CIRCLE', 'PAINT', 'GET', 'PUT', 'BEEP',
'SOUND', 'DELETE', 'RENUM', 'EDIT', 'VPOKE', '@@', '@@', '@@',
'@@', '@@', '@@', '@@', 'TAB(', 'TO', 'SPC(', 'FN',
'THEN', 'NOT', 'STEP', '+', '-', '*', '/', '^',
'AND', 'OR', '>', '=', '<', '@@', '@@', '@@',
'SGN', 'INT', 'ABS', 'USR', 'FRE', 'INP', 'POS', 'SQR',
'RND', 'LOG', 'EXP', 'COS', 'SIN', 'TAN', 'ATN', 'PEEK',
'LEN', 'STR$', 'VAL', 'ASC', 'CHR$', 'LEFT$', 'RIGHT$', 'MID$',
'INKEY$', 'HEX$', 'POINT', 'VARPTR', 'CSRLIN', 'VPEEK', '@@', '@@',
'@@', '@@', '@@', '@@', '@@', '@@', '@@', '@@',
'@@', '@@', '@@', '@@', '@@', '@@', '@@', '@@'
);
print <<IDC;
static main() {
IDC
$addr = 0x8f; for $i (0x80..0xBB)
{
$token = $tokens[$i-0x80];
$call = unpack "v", substr $ram, $addr, 2;
$chain1 .= sprintf <<IDC, $addr, '"'.$token.'"', $i;
MakeRptCmt(0x%04X, %15s); // token: %X
IDC
if (++$xa{$call} == 1)
{
$name = ++$xn{$token} == 1 ? $token : $token.'_'.$xn{$token};
$name = "do_FC_error" if $call == 0x65C;
$chain2 .= sprintf <<IDC, $call, $call, $name;
MakeCode(0x%04X); MakeName(0x%04X, "oper_%s");
IDC
}
$addr += 2;
}
for $i (0xBC..0xCF)
{
$token = $tokens[$i-0x80];
$chain1 .= sprintf <<IDC, '"'.$token.'"', $i;
// intrinsic: %15s // token: %X
IDC
}
$addr = 0x43; for $i (0xD0..0xF5)
{
$token = $tokens[$i-0x80];
$call = unpack "v", substr $ram, $addr, 2;
$chain1 .= sprintf <<IDC, $addr, '"'.$token.'"', $i;
MakeRptCmt(0x%04X, %15s); // token: %X
IDC
if (++$xa{$call} == 1)
{
$name = ++$xn{$token} == 1 ? $token : $token.'_'.$xn{$token};
$name = "do_FC_error" if $call == 0x65C;
$chain2 .= sprintf <<IDC, $call, $call, $name;
MakeCode(0x%04X); MakeName(0x%04X, "func_%s");
IDC
}
$addr += 2;
}
print <<IDC;
$chain1
$chain2
}
IDC
файл JUSTBOOT.SAV берётся из моего эмулятора откусыванием заголовка
как-то так...