PC-01 Lviv

It is currently 29 Mar 2024, 00:01

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 9 posts ] 
Author Message
 Post subject: CLOAD and a bit of magic
PostPosted: 18 Jan 2012, 13:14 
Offline
Site Admin
User avatar

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


Top
   
 Post subject:
PostPosted: 18 Jan 2012, 20:48 
Offline

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


Top
   
 Post subject:
PostPosted: 18 Jan 2012, 23:00 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
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 берётся из моего эмулятора откусыванием заголовка

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


Last edited by sadfsdfsdaf on 18 Jan 2012, 23:38, edited 1 time in total.

Top
   
 Post subject:
PostPosted: 18 Jan 2012, 23:16 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Quote:
(содержимое ОЗУ в моей версии ПЗУ)
Code:
#!/usr/bin/perl
И тут я внезапно понял, что пора ложиться спать... :D

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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
 Post subject:
PostPosted: 18 Jan 2012, 23:56 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Вот например концовка программы:

Дамп "Башкирии" (работает):
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
Переменные начала и конца Бейсик программы (соответственно и адреса) - одинаковые.


Top
   
 Post subject:
PostPosted: 19 Jan 2012, 16:16 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Отформатировал в "канонический вид":
поле связи, номер строки, токенизированное тело строки, завершающий 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

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


Top
   
 Post subject:
PostPosted: 21 Jan 2012, 20:08 
Offline
Site Admin
User avatar

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


Top
   
 Post subject:
PostPosted: 21 Jan 2012, 20:41 
Offline
User avatar

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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
 Post subject:
PostPosted: 28 Jan 2012, 22:33 
Offline

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

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

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

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 9 posts ] 

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited