Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Dport

Страницы: [1]
1
В дискорде MD Engine тоже один чел одержим этой навязчивой идеей, спрашивает сможет ли этот MD Engine импортировать и скомпилировать дизасм первого соника, сейчас или в потом. Но все увещевания, что это asm68k дизасм, а не gcc пролетают мимо него. Это не ты случайно?  :)
У меня нет дискорда.  :biggrin:

2
SegaMark, Первого соника (хотя бы) портировать на пк, а дальше как пойдет.

3
В самом роме исходников нет, ясно дело, кто их станет класть в продаваемые диски, но есть в декомпиляции, прикрепляю архив. Ответ от автора насчет С/С++ кода: All of the .cpp files make up most of the wrapper. graphics.cpp sends the framebuffer to DirectX, while csound.cpp is responsible for sound effects.

The graphics are stored in Mega Drive format inside the executable. The game writes to a memory region that it considers the VDP's. The code for reading from that region and blitting to the framebuffer seems to be written in x86 assembly, but I converted it to C (vdp.c).

The code for handling vertical interrupts is in main.cpp, one of which gets called each frame and reads controller input, uploads the current palette, converts the sprite format, etc.
P.S. а асм легко можно посмотреть через ghidra или бесплатную версию ida, они из-под коробки работают с .exe файлами.

4
Я может, не очень понимаю, но как могут быть  рекомпилированы игры, написанные на 68к асме, а не на С/С++(как Sonic Unleashed или Mario 64)?

5
да эмулятор вам нужен :) эмулятор это и есть по сути перевод сеговского кода в виндовый.
Ну, не совсем, для наглядности своей идеи прикрепляю сам Sonic & Knuckles Collection 97-го года(как вы понимаете, эмуляторов тогда еще не было, (s3k.ini надо положить в папку windows, иначе слишком быстро идти будет) запускаем саму игру через SONIC3K.EXE. Хотелось бы также, но с любой другой сеговской игрой(только дизасм нужен для конвертации в x86 asm). Это яркий пример реасма под целевую платформу. Игра идентична оригиналу.

6
SegaMark, Звук, мегадрайвовская графика.

Добавлено позже:
Через что он рендерит то? Неужели на прямую через winAPI выводит?
Спрошу у автора С порта, позже напишу

7
Sonic & Knuckles Collection (официальный порт на пк от Сеги) использовал c++ оболочку для мультимедийных операций, в С же у меня портированный код, отвечающий за vdp(в самом порте он был на чистом x86 асме, но чел, занимающийся С портом - декомпиляцией перевел его в С)

8
Я тут в теме про рекомпил прочитал, что практичнее реасм под другую платформу. 

Добавлено позже:
Ну если Вы c/cpp скомпилите тоже в x86, то почему бы и нет.
А с .bin файлами(сжатая графика) как быть? Как-то можно их туда включить?

Добавлено позже:
Мне говорили, что в с/с++ файлах можно использовать inline assembly т.е. вызывать асм в с/с++ коде. Но мне надо почитать подробнее про это.

9
Всем здравствуйте, у меня вопрос такой, транслятор 68к -> x86 работает замечательно, но хотелось бы для проверки собрать прототипный экзешник. Вот, что отвечает гадалка:Да, собрать файлы с расширениями `.c`, `.cpp`и ассемблерным кодом для x86 в один `.exe` файл возможно. Разберу процесс подробно.

## Основные этапы сборки

1. **Компиляция отдельных файлов** в объектные модули (`.obj` или `.o`):
   * файлы `.c` и `.cpp` компилируются соответствующими компиляторами C/C++;
   * ассемблерный код компилируется ассемблером (например, MASM или NASM).
2. **Линковка** всех объектных файлов в единый исполняемый файл с помощью линкера.

## Инструменты для разных ОС

**Windows:**
* **Visual Studio + MASM (ml.exe)** — стандартный набор для Windows;
* **GCC (MinGW)** — если предпочитаете инструменты GNU.

**Linux:**
* **GCC + GAS (GNU Assembler)** — стандартный набор инструментов.

## Практические примеры

### Вариант 1. Использование Visual Studio (Windows)

**Шаг 1.** Создайте проект в Visual Studio.
**Шаг 2.** Добавьте файлы:
* `main.c` или `main.cpp` — основной код;
* `asm_func.asm` — ассемблерные функции.

**Шаг 3.** Настройте проект:
1. В свойствах проекта перейдите в `Build Customizations`.
2. Отметьте `masm (.targets, .props)`.
3. Убедитесь, что для `.asm` файлов установлен тип сборки `Microsoft Macro Assembler`.

**Шаг 4.** Пример кода:

*main.cpp:*
```cpp
extern "C" int asm_function(int a, int b);

int main() {
    int result = asm_function(5, 3);
    return 0;
}
```

*asm_func.asm:*
```asm
.386
.model flat, C

.code
asm_function PROC a:DWORD, b:DWORD
    mov eax, a
    add eax, b
    ret
asm_function ENDP
END
```

**Шаг 5.** Соберите проект — Visual Studio автоматически скомпилирует и свяжет все файлы.

### Вариант 2. Командная строка с GCC (MinGW для Windows или нативный GCC для Linux)

**Шаг 1.** Компиляция ассемблерного кода:
```bash
nasm -f win32 asm_func.asm -o asm_func.obj  # для Windows
# или
nasm -f elf32 asm_func.asm -o asm_func.o   # для Linux
```

**Шаг 2.** Компиляция C/C++ кода:
```bash
gcc -c main.c -o main.obj  # Windows
# или
gcc -c main.c -o main.o   # Linux
```

**Шаг 3.** Линковка всех объектных файлов:
```bash
gcc main.obj asm_func.obj -o program.exe  # Windows
# или
gcc main.o asm_func.o -o program         # Linux
```

### Вариант 3. Встроенная ассемблерная вставка

Можно вставить ассемблерный код прямо в C/C++ файл с помощью `asm` или `__asm__`:

```cpp
int add_asm(int a, int b) {
    int result;
    __asm__ (
        "addl %%ebx, %%eax;"
        : "=a" (result)
        : "a" (a), "b" (b)
    );
    return result;
}
```

## Важные нюансы

1. **Соглашения о вызовах** (calling conventions):
   * убедитесь, что ассемблерный код использует то же соглашение о вызовах, что и C/C++ код (обычно `__cdecl` или `__stdcall`);
   * в ассемблере это задаётся директивой `.model flat, C`.

2. **Имена функций**:
   * в C++ может происходить «name mangling» — используйте `extern "C"` для предотвращения;
   * для 32‑битного кода имена функций могут иметь ведущий подчёркивание (`_function`).

3. **Архитектура**:
   * убедитесь, что все файлы компилируются для одной архитектуры (x86 32‑bit);
   * 64‑битная сборка имеет ограничения на встроенную ассемблерную вставку.

4. **Инструменты**:
   * MASM (ml.exe) — для Windows, совместим с Visual Studio;
   * NASM — кроссплатформенный, требует указания формата вывода;
   * GAS — используется с GCC, синтаксис отличается от MASM.

---

## Краткий итог

**Да, собрать можно. Для этого:**
1. Компилируйте каждый файл в объектный модуль своим инструментом.
2. Свяжите все объектные файлы в один исполняемый с помощью линкера.
3. Следите за согласованностью соглашений о вызовах и имён функций.

Наиболее удобный способ для Windows — Visual Studio с MASM, для кроссплатформенной разработки — GCC + NASM.

Хотите, я раскрою какой‑то из этапов подробнее или помогу с конкретным примером для вашей среды разработки?
Хотелось бы и .bin файлы туда включить(графика в сониках только в таком формате, наверное, и в других Мегадрайвовских играх также).

10
Может сюда кто-нибудь кто собрал, скинуть c++  код, который выплевывает этот рекомпилятор?

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

11
SeregaZ, а как мне сэмулировать память?

12
Всем привет, у меня вопрос к местным экспертам: Как заставить транслятор назначать части памяти регистрам mega drive? Я воспользовался транслятором 68k -> x86 и транслировал Obj_Bloominator из Sonic 3 & Knuckles, у которого уже есть дизасм. Вот так выглядит оригинальный код (68к):Obj_Bloominator:
        jsr    (Obj_WaitOffscreen).l
        moveq    #0,d0
        move.b    routine(a0),d0
        move.w    Bloominator_Index(pc,d0.w),d1
        jsr    Bloominator_Index(pc,d1.w)
        jmp    (Sprite_CheckDeleteTouch).l
; ---------------------------------------------------------------------------
 
loc_54B86:
        jsr    SetUp_ObjAttributes(pc)
        move.w    #$1F,$2E(a0)
        move.l    #loc_54BAA,$34(a0)
 
locret_54B9C:
        rts
; ---------------------------------------------------------------------------
 
loc_54B9E:
        tst.b    render_flags(a0)
        bpl.w    locret_54B9C
        jmp    Obj_Wait(pc)
; ---------------------------------------------------------------------------
 
loc_54BAA:
        move.b    #4,routine(a0)
        move.l    #byte_54C3E,$30(a0)
        move.l    #loc_54BF8,$34(a0)
        rts
; ---------------------------------------------------------------------------
 
loc_54BC2:
        jsr    Animate_RawMultiDelay(pc)
        beq.s    locret_54B9C
        cmpi.b    #6,d0
        beq.s    loc_54BD4
        cmpi.b    #$E,d0
        bne.s    locret_54B9C
 
loc_54BD4:
        moveq    #signextendB(sfx_Projectile),d0
        jsr    (Play_SFX).l
        lea    ChildObjDat_54C26(pc),a2
        jsr    CreateChild2_Complex(pc)
        bne.s    locret_54BF6
        addq.b    #1,$39(a0)
        btst    #0,$39(a0)
        beq.s    locret_54BF6
        neg.w    x_vel(a1)
 
locret_54BF6:
        rts
; ---------------------------------------------------------------------------
 
loc_54BF8:
        move.b    #2,routine(a0)
        move.w    #2*60,$2E(a0)
        move.l    #loc_54BAA,$34(a0)
        rts
; ------------------------------------------------------------------------
 
Так выглядит тот код, который был транслирован внутренним инструментом Сеги из официального порта на win 95 (Sonic & Knuckles Collection):hana00:
CALL chk_framein
XOR EAX,EAX
MOV [68k_d0],EAX
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x5]
MOV [68k_d0],AL
MOVSX ESI,word ptr [68k_d0]
ADD ESI,hana00@@act_tbl
MOV AX,word ptr [ESI]
MOV [68k_d1],AX
MOVSX EAX,word ptr [68k_d1]
LEA EAX,[EAX + hana00@@act_tbl]
CALL EAX
JMP chk_emy_foutc0
 
hana00_init:
MOV EAX,hana00_init_tbl
MOV [68k_a1],EAX
MOV EAX,enemy_init0
CALL EAX
MOV AX,0x1f
MOV EDI,dword ptr [68k_a0]
MOV word ptr [EDI + 0x2e],AX
MOV EAX,hana00_shot_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
 
return45:
RET
 
hana00_wait:
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x4]
TEST AL,AL
JNS return45
MOV EAX,dec_timer
JMP EAX
 
hana00_shot_init:
MOV AL,0x4
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x5],AL
MOV EAX,hana00_pg00
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x30],EAX
MOV EAX,hana00_wait_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
RET
 
hana00_shot:
MOV EAX,time_pg
CALL EAX
JZ return45
MOV BL,0x6
MOV AL,[68k_d0]
CMP AL,BL
JZ hana00_shot@@set_shot
MOV BL,0xe
MOV AL,[68k_d0]
CMP AL,BL
JNZ return45
 
hana00_shot@@set_shot:
MOV dword ptr [68k_d0],0x4d
CALL soundset
MOV EAX,hana00_shot_set_tbl
MOV [68k_a2],EAX
MOV EAX,set_act01
CALL EAX
JNZ hana00_shot@@100
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x39]
ADD AL,0x1
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x39],AL
MOV EDI,dword ptr [68k_a0]
MOV EAX,dword ptr [EDI + 0x39]
BT EAX,0x0
SETC AL
AND AL,AL
JZ hana00_shot@@100
MOV EDI,dword ptr [68k_a1]
MOV AX,word ptr [EDI + 0x18]
NEG AX
MOV EDI,dword ptr [68k_a1]
MOV word ptr [EDI + 0x18],AX
 
hana00_shot@@100:
RET
 
hana00_wait_init:
MOV AL,0x2
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x5],AL
MOV AX,0x78
MOV EDI,dword ptr [68k_a0]
MOV word ptr [EDI + 0x2e],AX
MOV EAX,hana00_shot_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
RET
А так выглядит тот же код, транслированный собранной мной утилитой(вставил официальные имена переменных из Sonic & Knuckles Collection):hana00:
    CALL chk_framein
    MOV  ESI,offset 0
    MOV  D0.L,ESI
    MOV  EDI,A0.L
    MOV  EBX,ESI
    MOV  BL,routine[EDI].B
    MOV  D0.L,EBX
    MOVSX ESI,BX
    MOV  EBP,D1.L
    MOV  BP,hana00@@act_tbl[ESI].W
    MOV  D1.L,EBP
    MOVSX ESI,BP
    LEA  ECX,hana00@@act_tbl[ESI].L
    CALL ECX
    JMP  chk_emy_foutc0
; ---------------------------------------------------------------------------
 
hana00_init:
    CALL enemy_init0
    MOV  ESI,A0.L
    MOV  $2E[ESI].W,offset 01FH
    MOV  $34[ESI].L,offset hana00_shot_init
 
return45:
    RET
; ---------------------------------------------------------------------------
 
hana00_wait:
    MOV  ESI,A0.L
    CMP  render_flags[ESI].B,offset 0
    JNS  return45
    JMP  dec_timer
; ---------------------------------------------------------------------------
 
hana00_shot_init:
    MOV  ESI,A0.L
    MOV  routine[ESI].B,offset 4
    MOV  $30[ESI].L,offset byte_54C3E
    MOV  $34[ESI].L,offset hana00_wait_init
    RET
; ---------------------------------------------------------------------------
 
hana00_shot:
    CALL time_pg
    JE   return45
    MOV  EBX,D0.L
    CMP  BL,offset 6
    JE   hana00_shot@@set_shot
    CMP  BL,offset 0EH
    JNE  return45
 
hana00_shot@@set_shot:
    MOV  ESI,offset
    MOV  D0.L,ESI
    CALL soundset
    LEA  ESI,[ChildObjDat_54C26]
    MOV  A2.L,ESI
    CALL CreateChild2_Complex
    JNE  hana00_shot@@100
    MOV  ESI,A0.L
    ADD  $39[ESI].B,offset 1
    BT   $39[ESI].L,offset 0
    SBB  EDI,EDI
    JE   hana00_shot@@100
    MOV  EBP,A1.L
    NEG  DS:x_vel[EBP].W
 
hana00_shot@@100:
    RET
; ---------------------------------------------------------------------------
 
hana00_wait_init:
    MOV  ESI,A0.L
    MOV  routine[ESI].B,offset 2
    MOV  $2E[ESI].W,offset 2*60
    MOV  $34[ESI].L,offset hana00_shot_init
    RET
; ---------------------------------------------------------------------------
;TOTAL: IN 60, INSTR 56, LABELS 9, COMMENTS 6, ERRORS 0
Сеговский транслятор сопоставляет части памяти регистрам mega drive, а мой - нет. Я бы задал вопрос ии, но хотелось бы сначала услышать человеческое экспертное мнение

13
чувак пишет типа просто сделай make
ты пишешь
то есть уже не просто make делать. Мне кажется он что то не договаривает

Добавлено позже:Вот этих умников я никогда не понимал. Типа потрать кучу времени, возможно больше чем я, но релиз который мне не нужен и просто лежит у меня на компе я тебе не дам. Это же пустая трата времени

Добавлено позже:
Dport, Я проверил все работает, спасибо тебе :thumbup:. Теперь смогу лично поэкспериментировать
Про numbers.c мне писал Clownacy
Цитата
The 'numbers' function in 'numbers.c' needs to be modified to return NULL if 'in' is NULL. Other than that, I just compiled it with 32-bit MinGW with '-Werror' disabled and it worked fine.
а про опечатку писал Technokami, отвечая Clownacy:
Цитата
Huh! I tried taking a stab at compiling it myself with GCC and, after dealing with some typos (generate.h line 1) I got it to compile with warnings, but it would just segfault. Anything else needed to get this thing to build properly? I had to disable error on warnings because I was unsure how to handle the enum comparison issue in one of the files.

Добавлено позже:
Алиса - самая слабая нейросеть из всех бесплатных, пробуй chat.deepseek.com и google.ru/aimode
Беларус, Однако, она здорово помогла

14
Нет, на вопрос почему, мне отвечает уже другой эксперт с Sonic Retro:
Цитата
If you have the tools properly installed (hint: install MinGW if you are on Windows) then all you need to do is open the source directory with a command line and run the command "make".
Цитата
This is actually very simple to do, if you know even some basic C programming skills. So I think you should take a bit of time to learn some C and try doing this one yourself, rather than have someone else serve you the answer on a silver platter. It'll be far more rewarding in the end.
P.S. последняя цитата как раз связана с причиной, по которой у меня пустой output.asm, оказывается, мне нужно модифицировать numbers.c, чтобы он возвращал NULL если 'in' равно NULL, я больше на python программировал, чем на С, если честно, но посмотрим, что я смогу сделать. P.P.S в файле generate.h в первой строчке опечатка:
Цитата
#ifndef GENRATE_H
должно быть
Цитата
#ifndef GENERATE_H

Добавлено позже:
Итак, после долгих мучений и помощи Алисы, я  наконец-то собрал рабочий (не обращайте внимания на ошибку компиляции, на работу она не влияет) транслятор. P.S. команда для использования: P.P.S кто захочет сам скомпилить, добавьте в функцию OUTPUT *numbers(void) между in=READER() и switch(in->type)(файл numbers.c) эти строки:if (in == NULL) {
        return NULL;
    }

15
Я еще не до конца собрал, одна ошибка осталась
Цитата
match86.c: In function 'newInstr':
match86.c:371:27: warning: comparison between 'OPSMODE {aka enum <anonymous>}' and 'enum <anonymous>' [-Wenum-compare]
  if(!info || info->opsMode==OP_UNKNOWN) {
Однако ее уже скомпилировал англоязычный эксперт с sonic retro под ником Clownacy, у него программа выдавала такое (конвертировался TEST1.S)
Цитата
    POP  SI
    MOV  EBX,ESI
    MOVSX ESI,BL
    MOV  D0.L,ESI
    POP  BX
    MOVSX EDI,BL
    MOV  D1.L,EDI
    POP  BX
    MOVSX EBP,BL
    MOV  D2.L,EBP
    POP  BX
    MOVSX ECX,BL
    MOV  D3.L,ECX
    POP  BX
    MOVSX EDX,BL
    MOV  D4.L,EDX
    POP  BX
    MOVSX ESI,BL
    MOV  D5.L,ESI
    POP  BX
    MOVSX EDI,BL
    MOV  D6.L,EDI
    POP  BX
    MOVSX EBP,BL
    MOV  D7.L,EBP
;TOTAL: IN 1, INSTR 25, LABELS 0, COMMENTS 0, ERRORS 0

оригинал (TEST1.S):
Цитата
   movem.b   (A7)+,d0-d7


Добавлено позже:
Короче, я решил проверить транслятор в действии, ведь даже несмотря на ошибку он собирается, вот так это выглядит:
313702-0
output.asm пустой, что здесь не так, ума не приложу

Просьба не размещать с помощью тэга img изображение со стороной более 700 пикселей. ghostdog3

16
Ура! Я собрал .exe, правда с ошибками:
для этого в начало makefile добавил:
Цитата
CC = gcc
спасибо гадалке Алисе. P.S. Надеюсь, меня тут за использование ии не распнут  :biggrin: P.P.S еще через установщик mingw пришлось установить stdlib++, иначе выскакивала ошибка fatal error: stdlib.h: No such file or directory

17
Он как будто make не находит, судя по сообщению

18
Нет. там 404 not found

Добавлено позже:
Dport Напиши, если получится рабочая игра, хотелось бы тоже попробовать что-нибудь портировать.

Relogix похоже, приказал долго жить (все-таки ссылка с форума 2000-х) . P.S. я, скорее всего, тему сделаю под портирование, задокументировав весь процесс, пробовать пока буду на Сонике

Добавлено позже:
В общем, разобрался с Mingw но при компиляции вылезает бяка
Цитата
C:\Users\user\Downloads\68k to x86 translator\682386_1_0\src>make
cc -O2 -Wall -Werror   -c -o dotlabel.o dotlabel.c
process_begin: CreateProcess(NULL, cc -O2 -Wall -Werror -c -o dotlabel.o dotlabel.c, ...) failed.
make (e=2): Не удается найти указанный файл.
<builtin>: recipe for target 'dotlabel.o' failed
make: *** [dotlabel.o] Error 2
Что делать?

19
ссылка не работает
Опять забыл пробел, сорри, с телефона печатал



20
А в чем конечная цель? Хочешь таким образом игры на ПК портировать? Или просто в качестве эксперимента посмотреть как это все работает?
И то и другое, тем более я знаю, что Сега официально портировала игры про Соника таким образом(Sonic & Knuckles collection на windows и Sonic Jam (sega saturn) (68k->x86 и 68k ->SH-2)

Добавлено позже:
Я нашел ещё один транслятор 68k -> x86: http://www.microapl.com/download/pademo68kto86.zip, надо будет их сравнить

21
Короче, все получилось,  (спасибо большое, clownacy из sonic retro) оказалось надо через stdout вывод делать, подробнее в моем треде на sonic retro: https://forums.sonicretro.org/threads/cant-find-portable-c-compiler-pcc-version-older-than-2011.44666/#post-1113816 P.S. Вам всем тоже огромное спасибо, вот она сила интернета!

22
Всем здравствуйте, помните, я спрашивал по транслятор 68k->x86, ну так вот, он под Amiga компьютер, я читал, что они оба используют процессор 68k (megadrive - Motorola 68000, а amiga - Motorola 68020). Хочется узнать у местных экспертов, насколько они совместимы на уровне ассемблера?

P.S. ответ от гадалки (Алисы)

23
Просто отдели ссылку пробелом и она станет кликабельной.

К гадалкам нейросетям обращался?
Ты же хотел получить Си-код, а теперь меняеш шыло на мыло?
Это просто мой другой хак, если его можно так назвать, хотел попробовать портировать соника 1 на пк, но не просто портировать, а в стиле Sonic and Knuckles Collection, который нативно работал на win 95, там использовали переведенный 68к асм на x86 и оболочку на c++, для того чтобы все нормально работало на пк. Причем я знаю, что того же первого соника да и второго с третьим уже портировали также, правда на Saturn (68к на SH-2) (см Sonic Jam)

24
Всем здравствуйте, хочу скомпилить одну интересную утилиту, транслятор M68K в x86 (вот ссылка на нее: https://sourceforge.net/projects/m682386/?ysclid=moq4nlvhmo726308740) но там используется makefile, а я понятия не имею как через него компилировать. Может кто-то объяснить как это делать, пожалуйста, весь инет облазил. P.S. прикрепляю архив, если ссылка не работает

25
Вообще, насчет портирования игр с Сеги на пк необязательна рекомпиляция, взять тот же Sonic & Knuckles Collection, хакеры с Sonic Retro выяснили, то портирование происходило так: исходный код Sonic 3 & Knuckles был переведен из m68k в x86 ассемблер(с помощью автотранслятора), для того чтобы все этого работало в Win 95 была написана оболочка на с++, она отвечала за графику(vdp) и ввод-вывод с пк ну и музыку. Оболочка была декомпилирована и самое интересное, что она не заточена специально под Соника. за сжатие и расжатие графики отвечает именно конвертированный x86 код. Т.Е. в теории, можно использовать 68к -> x86 транслятор, чтобы перевести код дизассемблированной игры и подружить ее с этой оболочкой. Репозиторий с декомпиляцией(хотя правильнее было бы сказать перевод x86 асма в С): (пока не завершена, но с++ оболочка уже декомпилирована) https://git.sr.ht/~benoitren/skccport

26
Ромхакинг / Re: Вопросы новичков
« : 01 Май 2026, 22:06:27 »
 Она закончена и компилируема, просто инструкции не в репозитории, а в треде на sonic retro (13, 14-15 страницы вроде)  (есть makefile для сборки или cmakeLists.txt для visual studio)P.S. репозиторий (https://git.sr.ht/~benoitren/soniccdrespinned) P.P.S.(есть уже собранная версия:https://shc.zone/entries/contest2025/1412) нужно извлечь файл soniccd.cvm из sonic gems collection(.iso образ для ps2  вроде любым архиватором можно открыть), и распаковать cvm через 7-zip в директорию с экзешником) Чтобы появилась музыка нужно из оригинального образа пк версии извлечь файл pcm.cmp в ту же директорию с экзешником

27
Ромхакинг / Вопросы новичков
« : 01 Май 2026, 13:11:01 »
проблема заключается в том, что одним 68К ты погоду не сделаешь. это целая, мать её, экосистема! 68К шлет всяко разно в Z80. шлет в видео память, шлет в палитру... поэтому даже если ты и родишь конвертер 68К в С и как бы движок игры может и очухается и запустится, но вот все побрякушки работать не будут. надо будет изобретать костыли, чтобы заставить их работать. типа эмулировать Z80 (ладно, тут наверное есть какие-то дллки, которые можно будет подключить), эмулировать VDP, эмулировать палитру, эмулировать ввод - то есть кнопки с геймпада, эмулировать спрайтовую систему. ты готовый утонуть в сей вакханалии? это в одну каску на полгода-год пыхтения. хотя с ИИ может и пошустрей процесс пойдет. и тем не менее это полный швах :)
Дело в том, что я хотел бы портировать spindash из sonic 2 в sonic cd (версию на win 95), соль в том, что весь код там был переведен интелловскими программистами в С с исходников от Сеги, у этой версии уже есть своя декомпиляция от доброго человека (https://git.sr.ht/~benoitren/soniccddecompilation) и именно туда я и хочу добавить spindash, все-таки с С проще работать, чем с ассемблером(тред на sonic retro: https://forums.sonicretro.org/index.php?threads/sonic-cd-decompilation.41878/)

28
Ромхакинг / Вопросы новичков
« : 30 Апрель 2026, 21:59:20 »
Всем здравствуйте, у меня вопрос такой: как перевести код асма 68к на С? Я знаю, что есть Ghidra, но тамошний псевдокод на до же приводить в нормальный вид и с этим у меня сложновато пока, есть у кого-то примеры перевода 68k->С через Ghidra?

Страницы: [1]