Здравейте,
nova600 е подкарал и личния ми Правец 82 (много съм щастлив), както и има успех с 8M-a . Отново, големи благодарности
Остана ми време тази вечер и успях да подкарам C++14 програма на Apple II емулатора
Като дойде флопито за физическия Правец - ще го пробвам там.
Набързо ще обясня как става. Първо, правя всичко под Ubuntu. Би трябвало да стане и с други компилатори, но това имам под ръка.
Нужен софтуер:
- g++ (sudo apt-get install g++ && sudo apt-get install g++-multilib)
- x86-to-6502 (
https://github.com/lefticus/x86-to-6502) - компилира се просто като (cd src; g++ main.cpp -o x86-to-6502)
- 6502 асемблер (sudo apt-get install xa65)
- Apple II/Правец 8 емулатор (
https://github.com/AppleWin/AppleWin)
- софтуер за създаване на дискове и файлове (
http://a2ciderpress.com/)
- wine (sudo apt-get install wine-stable) - пускам Windows версията на AppleWin емулатора, проблеми с native версията под Linux
Целта ни е да запишем стойността 0x12 в адрес 0x526 . Резултатът е буквичката "R" в горния десен ъгъл на екрана.
C++ програмата, която го прави е (нарочно написана в C++ режим, това е целта на упражнението, да не се сърдят C програмистите
):
#include <cstdint>
using mem_addr_t = uint16_t;
using mem_loc_t = volatile uint8_t;
int main()
{
const auto set_mem = [](mem_addr_t addr) -> mem_loc_t& { return *(reinterpret_cast<mem_loc_t*>(addr)); };
set_mem(0x526) = 0x12;
}
Първата стъпка е да компилираме програмата за x86 и да генерираме 6502 асемблер:
g++ -c -O3 -o- -Wall -Wextra -m32 -march=i386 -std=c++1z -S print_r.cpp | ./src/x86-to-6502 | sed '/^\t\./d' > print_r.6502
Изходът е print_r.6502 файл с 6502 асемблерен код:
main
lda #18 ; movb $18, 1318
sta 1318 ; movb $18, 1318
lda #$00 ; xorl %eax, %eax
sta $03 ; xorl %eax, %eax
sta $04 ; xorl %eax, %eax
rts ; ret
Следващата стъпка е да създадем изпълним файл с 6502 асемблера (разширението на името на файла указва, че е binary тип файл):
xa -C print_r.6502 -o PRINTR#060300
Остава да създадем дискета с DOS 3.3 със CiderPress:
Записваме изпълнимия файл там:
И накрая зареждаме от дискетата в Apple II емулатора, пускаме програмата и виждаме, че се появява буквата R горе
:
Като остане време ще пробвам и по-сложни неща, както и потенциално може да се направи библиотека от високо ниво за работа с хардуера (примерно библиотека за графика на C++, естествено без exceptions, динамична памет с heap и т.н.)
Ако някой се интересува и му е интересно - ще съдействам както мога.
Благодаря за помощта