PC-01 Lviv http://pc01.lviv.ua/forum/ |
|
CLOAD and a bit of magic http://pc01.lviv.ua/forum/viewtopic.php?f=22&t=84 |
Page 1 of 1 |
Author: | Zelya [ 18 Jan 2012, 13:14 ] |
Post subject: | CLOAD and a bit of magic |
Вопрос о "магии" CLOAD-а (катсти, а по какому он адресу?). Проблема следующая, заливал я игрушку Frog, которая насмерть отказывалась работать. Игра состоит ищ двух файлов, первый - программа на бейсике. Самое интересное, что в "Башкирии" все пашет нормально. Самый первый же анализ показал, что у меня бейсик-программа "поломана". Я открыл монитор памяти у себя и в "Башкирии" и о чудо! У меня память байт в байт аналогична файлу, а в "Башкирии" 10-20% байт изменено. Что за магия? Кто меняет байты? По какому принципу? Где справедливость? |
Author: | sadfsdfsdaf [ 18 Jan 2012, 20:48 ] |
Post subject: | |
нужны байты изменения, кусочек дампа покажи. Если это cload, то там поле связи перестраивают, а поле связи определяется размещением программы в ОЗУ, которое задаётся системными переменными бейсика. Если эти переменные не менялись, то после загрузки по cload изменений поля связи в коде не будет. |
Author: | sadfsdfsdaf [ 18 Jan 2012, 23:00 ] |
Post subject: | |
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 берётся из моего эмулятора откусыванием заголовка как-то так... |
Author: | liberation [ 18 Jan 2012, 23:16 ] |
Post subject: | |
Quote: (содержимое ОЗУ в моей версии ПЗУ)
И тут я внезапно понял, что пора ложиться спать... Code: #!/usr/bin/perl Я смутно припоминаю, что у Фрога действительно были проблемы с запуском. Я вроде бы столкнулся с ними из-за того, что на ПК-02 стандартный Бэйсик был модифицирован, а потому занимал больше места в ОЗУ. Больше ничего не помню... Кроме того факта, что Фрог у меня все-таки заработал! |
Author: | Zelya [ 18 Jan 2012, 23:56 ] |
Post subject: | |
Вот например концовка программы: Дамп "Башкирии" (работает): Code: 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Сам файл (если он в памяти - не работает) Code: 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Переменные начала и конца Бейсик программы (соответственно и адреса) - одинаковые. |
Author: | sadfsdfsdaf [ 19 Jan 2012, 16:16 ] |
Post subject: | |
Отформатировал в "канонический вид": поле связи, номер строки, токенизированное тело строки, завершающий 0 ... завершающий 0000 (вместо поля связи) поле связи является абсолютным адресом "следующей строки" Дамп "Башкирии" (работает): Code: 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Сам файл (если он в памяти - не работает) Code: 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 вот об этом я и говорил. |
Author: | Zelya [ 21 Jan 2012, 20:08 ] |
Post subject: | |
sadfsdfsdaf Вобщем, подправил я, согласно Вашему объяснению, свой .NET эмуль, и все запахало! Но я все-таки думаю поступить теперь по другому. Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу. |
Author: | liberation [ 21 Jan 2012, 20:41 ] |
Post subject: | |
Quote: Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу.
Хорошая идея! Только что взбрело в голову: добавьте режим эмуляции реальной загрузки! Чтобы выбрал файл для загрузки, выбрал тип кассеты (МК60-6, Range, BASF) - и "полчаса рекламы на Русском Радио". И чтобы пленку время от времени зажевывало. |
Author: | sadfsdfsdaf [ 28 Jan 2012, 22:33 ] |
Post subject: | |
Quote: sadfsdfsdaf
У себя я делал переход на точку горячего старта, бейсик сам переиндексировал файл, тем более, что он так и "в жизни" работал.Вобщем, подправил я, согласно Вашему объяснению, свой .NET эмуль, и все запахало! Но я все-таки думаю поступить теперь по другому. Для загрузки файлов использовать штатные команды ПЗУ, ит только подсовывать им байты из файла. Дмуаю, так будет ближе к оригиналу. Помимо размещения и индексации самой программы, надо ещё корректировать переменные указывающие на пул строк, стек и т.п. Это всё очень бейсикозависимо. Вариант с перехватом функции чтения байта с магнитофона действительно самый правильный, но, с другой стороны, надо уметь на компьютере работать, иначе даже будешь не в состоянии игрушку запустить Помню свои ощущения от эмулей Синклера на двойке.... Самый правильный вариант - это генерировать "wav файл" и на ходу подсовывать его в порт. Так, кстати, поступали в тех эмуляторах Синклеров, что я видел. (да и современному железу это будет тривиально). В общем, я бы реализовал все 3 способа. (у каждого своя область применения). Только RLE формат продумать стоит, если возникнет необходимость хранить битовый поток в виде файла. |
Page 1 of 1 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |