ПК-01 ЛЬВОВ

форум о ПК-01,02 "Львов"
Текущее время: 06 мар 2021, 17:04

Forum Games WEB Tape Loader Twitter RSS

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 9 сообщений ] 
Автор Сообщение
 Заголовок сообщения: CLOAD and a bit of magic
СообщениеДобавлено: 18 янв 2012, 13:14 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 24 июл 2008, 12:05
Сообщения: 1029
Вопрос о "магии" CLOAD-а (катсти, а по какому он адресу?). Проблема следующая, заливал я игрушку Frog, которая насмерть отказывалась работать. Игра состоит ищ двух файлов, первый - программа на бейсике. Самое интересное, что в "Башкирии" все пашет нормально. Самый первый же анализ показал, что у меня бейсик-программа "поломана". Я открыл монитор памяти у себя и в "Башкирии" и о чудо! У меня память байт в байт аналогична файлу, а в "Башкирии" 10-20% байт изменено. Что за магия? Кто меняет байты? По какому принципу? Где справедливость?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 18 янв 2012, 20:48 
Не в сети

Зарегистрирован: 07 дек 2010, 16:54
Сообщения: 227
нужны байты изменения, кусочек дампа покажи. Если это cload, то там поле связи перестраивают, а поле связи определяется размещением программы в ОЗУ, которое задаётся системными переменными бейсика. Если эти переменные не менялись, то после загрузки по cload изменений поля связи в коде не будет.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 18 янв 2012, 23:00 
Не в сети

Зарегистрирован: 07 дек 2010, 16:54
Сообщения: 227
Цитата:
Вопрос о "магии" CLOAD-а (катсти, а по какому он адресу?)
операторы и функции бейсика
(содержимое ОЗУ в моей версии ПЗУ)
Код:
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
делалось вот этим
Код:
#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$");

}
из вот этого
Код:
#!/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 берётся из моего эмулятора откусыванием заголовка

как-то так...


Последний раз редактировалось sadfsdfsdaf 18 янв 2012, 23:38, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 18 янв 2012, 23:16 
Не в сети
Аватара пользователя

Зарегистрирован: 11 авг 2008, 17:05
Сообщения: 1405
Откуда: Украина
Цитата:
(содержимое ОЗУ в моей версии ПЗУ)
Код:
#!/usr/bin/perl
И тут я внезапно понял, что пора ложиться спать... :D

Я смутно припоминаю, что у Фрога действительно были проблемы с запуском. Я вроде бы столкнулся с ними из-за того, что на ПК-02 стандартный Бэйсик был модифицирован, а потому занимал больше места в ОЗУ. Больше ничего не помню... Кроме того факта, что Фрог у меня все-таки заработал!

_________________
Carthago delenda est, Carthaginem delendam esse


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 18 янв 2012, 23:56 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 24 июл 2008, 12:05
Сообщения: 1029
Вот например концовка программы:

Дамп "Башкирии" (работает):
Код:
00 F4 34 AC E4 B0 49 2C 32 3A 88 35 38 35 31 30
00 FA 34 60 EA 8E 00 17 35 61 EA 94 33 36 37 30
34 2C 33 32 3A 94 33 36 37 30 35 2C 31 32 39 3A
8C 31 30 00 34 35 62 EA 94 33 36 37 30 34 2C 37
30 3A 94 33 36 37 30 35 2C 31 32 38 3A 8C 31 30
00 3A 35 65 EA 8D 00 00 00
Сам файл (если он в памяти - не работает)
Код:
00 d1 37 ac e4 b0 49 2c 32 3a 88 35 38 35 31 30
00 d7 37 60 ea 8e 00 f4 37 61 ea 94 33 36 37 30 
34 2c 33 32 3a 94 33 36 37 30 35 2c 31 32 39 3a 
8c 31 30 00 11 38 62 ea 94 33 36 37 30 34 2c 37 
30 3a 94 33 36 37 30 35 2c 31 32 38 3a 8c 31 30 
00 17 38 65 ea 8d 00 00 00
Переменные начала и конца Бейсик программы (соответственно и адреса) - одинаковые.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 19 янв 2012, 16:16 
Не в сети

Зарегистрирован: 07 дек 2010, 16:54
Сообщения: 227
Отформатировал в "канонический вид":
поле связи, номер строки, токенизированное тело строки, завершающий 0
...
завершающий 0000 (вместо поля связи)

поле связи является абсолютным адресом "следующей строки"

Дамп "Башкирии" (работает):
Код:
34F4   E4AC   B0 49 2C 32 3A 88 35 38 35 31 30 00
34FA   EA60   8E 00
3517   EA61   94 33 36 37 30 34 2C 33 32 3A 94 33 36 37 30 35 2C 31 32 39 3A 8C 31 30 00
3534   EA62   94 33 36 37 30 34 2C 37 30 3A 94 33 36 37 30 35 2C 31 32 38 3A 8C 31 30 00
353A   EA65   8D 00
0000
Сам файл (если он в памяти - не работает)
Код:
37d1   e4ac   b0 49 2c 32 3a 88 35 38 35 31 30 00
37d7   ea60   8e 00
37f4   ea61   94 33 36 37 30 34 2c 33 32 3a 94 33 36 37 30 35 2c 31 32 39 3a 8c 31 30 00
3811   ea62   94 33 36 37 30 34 2c 37 30 3a 94 33 36 37 30 35 2c 31 32 38 3a 8c 31 30 00
3817   ea65   8d 00
0000 
Первая строка дампа:
58540 SOUNDI,2:GOTO58510

вот об этом я и говорил.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 21 янв 2012, 20:08 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 24 июл 2008, 12:05
Сообщения: 1029
sadfsdfsdaf
Вобщем, подправил я, согласно Вашему объяснению, свой .NET эмуль, и все запахало! Но я все-таки думаю поступить теперь по другому. Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 21 янв 2012, 20:41 
Не в сети
Аватара пользователя

Зарегистрирован: 11 авг 2008, 17:05
Сообщения: 1405
Откуда: Украина
Цитата:
Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу.
Хорошая идея! :)
Только что взбрело в голову: добавьте режим эмуляции реальной загрузки! Чтобы выбрал файл для загрузки, выбрал тип кассеты (МК60-6, Range, BASF) - и "полчаса рекламы на Русском Радио". И чтобы пленку время от времени зажевывало. :D

_________________
Carthago delenda est, Carthaginem delendam esse


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: 28 янв 2012, 22:33 
Не в сети

Зарегистрирован: 07 дек 2010, 16:54
Сообщения: 227
Цитата:
sadfsdfsdaf
Вобщем, подправил я, согласно Вашему объяснению, свой .NET эмуль, и все запахало! Но я все-таки думаю поступить теперь по другому. Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу.
У себя я делал переход на точку горячего старта, бейсик сам переиндексировал файл, тем более, что он так и "в жизни" работал.
Помимо размещения и индексации самой программы, надо ещё корректировать переменные указывающие на пул строк, стек и т.п.
Это всё очень бейсикозависимо.

Вариант с перехватом функции чтения байта с магнитофона действительно самый правильный, но, с другой стороны, надо уметь на компьютере работать, иначе даже будешь не в состоянии игрушку запустить :-) Помню свои ощущения от эмулей Синклера на двойке.... :-)

Самый правильный вариант - это генерировать "wav файл" и на ходу подсовывать его в порт. Так, кстати, поступали в тех эмуляторах Синклеров, что я видел. (да и современному железу это будет тривиально).

В общем, я бы реализовал все 3 способа.
(у каждого своя область применения).

Только RLE формат продумать стоит, если возникнет необходимость хранить битовый поток в виде файла.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 9 сообщений ] 

Forum Games WEB Tape Loader Twitter RSS

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB