Игры чII (продолжение) 29.03.2024
В детстве в Алматы я знал примерно только два человека, у которых была приставка Денди, а у нас же дома в конце 80х был настоящий компьютер. Ну так вот, если память мне не изменият в гости меня никто не приглашал, я знал только про эту приставку. Денди это китайский клон Японской Nintendo Famicom или Nintendo Entertainment System. Я не знаю как делали игры японцы, но лично я пользусь cc65 для компиляции игры с Си в NES, FamiTracker для создания музыки, YY-Chr для создания шрифтов и спрайтов, FCEUX эмулятор, для тестирования игры.
1. Сначало нужно настроить cc65, компилятор у меня находится в директории C:\cc65_2023_new создадим bat-файл, пусть будет называться compile.bat:
@echo off SET CC65_PATH=C:\cc65_2023_new SET CC65_HOME=C:\cc65_2023_new C:\cc65_2023_new\bin\cl65 -L C:\cc65_2023_new\lib -t nes -I C:\cc65_2023_new\include %1 -o %2
2. Небольшой пример hello.c:
#include <nes.h> void printtext(char *str) { *((unsigned char *)0x2006) = 0x21; *((unsigned char *)0x2006) = 0x42; while(*str) { *((unsigned char *)0x2007) = *str; str++; } } int main() { waitvsync(); *((unsigned char *)0x2006) = 0x3F; *((unsigned char *)0x2006) = 0x00; *((unsigned char *)0x2007) = 1; *((unsigned char *)0x2006) = 0x3F; *((unsigned char *)0x2006) = 0x03; *((unsigned char *)0x2007) = 0x30; printtext("Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82"); *((unsigned char *)0x2005) = 0x00; *((unsigned char *)0x2005) = 0x00; *((unsigned char *)0x2001) = 8; while(1); return 0; }
Если в коде будет ошибка cc65 обязательно покажет, в каком месте ошибка например:
C:\cc65_new>compile.bat hello.c hello.nes hello.c:22: Error: Undefined symbol: 'x' hello.c:22: Error: ';' expected 2 errors and 0 warnings generated.
Но в нашем коде ошибки не будет, нужно ввести следующую команду:
C:\cc65_new>compile.bat hello.c hello.nes
Программа выводит текст на консоль Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82. Вот запуск программы на эмуляторе FCEUX:
Так выглядет программа YY-Chr:
Итак нарисуем мордочку, вместо 0:
2. Удалим число 0:
3. Нарисуем кружок:
Вот так должна выглядеть морда:
Вот сам весь шрифт:
Вот код:
#include <nes.h> void printtext(char *str) { *((unsigned char *)0x2006) = 0x21; *((unsigned char *)0x2006) = 0x42; while(*str) { *((unsigned char *)0x2007) = *str; str++; } } int main() { waitvsync(); *((unsigned char *)0x2006) = 0x3F; *((unsigned char *)0x2006) = 0x00; *((unsigned char *)0x2007) = 1; *((unsigned char *)0x2006) = 0x3F; *((unsigned char *)0x2006) = 0x03; *((unsigned char *)0x2007) = 0x30; printtext("0 Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82"); *((unsigned char *)0x2005) = 0x00; *((unsigned char *)0x2005) = 0x00; *((unsigned char *)0x2001) = 8; while(1); return 0; }
Вот результат работы программы на эмуляторе:
Вместо 0, там подставилась вот такая морда
Но! Если запускаю на железе (оно тоже эмулирует денди/NES), то происходит искажение: