Просмотр полной версии : Расширение возможностей Evo SDK
Есть способ читать/писать нужные ячейки памяти в страничках (например, чтобы хранить большую карту).
Для этого надо:
1. В lib_startup.asm (после export _time) добавить строчку
export _memSlot2
2. Пересобрать библиотеки (compile_sdk_libs_atm.bat или compile_sdk_libs_atm_tfm.bat)
3. В начало вашей программы (main.c) добавить две функции:
void put_mem(u8 pg, u16 addr, u8 data)
{
//addr=32768+nn
_asm
//pg
ld a,4 (ix)
xor #0x7f
ld bc,#0xbff7
ld (_MEMSLOT2),a
out (c),a
//addr
ld l,5 (ix)
ld h,6 (ix)
//data
ld a,7 (ix)
ld (hl),a
ld a,#0x71
out (c),a
_endasm;
}
u8 get_mem(u8 pg, u16 addr)
{
//addr=32768+nn
_asm
//pg
ld a,4 (ix)
xor #0x7f
ld bc,#0xbff7
ld (_MEMSLOT2),a
out (c),a
//addr
ld l,5 (ix)
ld h,6 (ix)
//data
ld l,(hl)
ld a,#0x71
out (c),a
_endasm;
}
Дима, а добавь пожалуйста работу с Диском в СДК
Shadow Maker
16.04.2014, 14:18
Да, уже много кто просил. Сохранение и загрузку всего и всюду. Хотя Сергей в соседней теме что-то связанное с трдосом вроде пилил.
У кого есть идеи, как это сделать?
Shadow Maker
16.04.2014, 14:27
Опиши проблему. Я мало себе представляю, в чем сложность.
В резиденте осталось 0 байт свободно.
Опиши проблему. Я мало себе представляю, в чем сложность.
Сложность в том, что в том режиме, в котором работает SDK, с 0го адреса включено ОЗУ и там располагается управляющая программа, скомпилированная на C со всеми структурами и переменными, а в верхних адресах висит библиотека i/o. Т.е. привычным способом обратиться к ПЗУ не получится - только через костыли, которые будут подключать ПЗУ, восстанавливать переменные TR-DOS, считывать/записывать данные, и восстанавливать все это восвояси. Драйвер должен уметь полноценно работать с файлами (последовательный, произвольный (под вопросом) доступ), и не на уровне секторов (256байт), как это принято в TR-DOS. Иначе использование диска в программе на языке си, для заполнения структур весьма сомнительно. Не скажу, что это невозможная задача, но... как сказал Дима, места там уже нет.
Можно попробовать упихать эти процедуры в страничку звуковых процедур.
Отгрузки.
Проблема ещё с уровнями - если их не грузить, то нужна тулза, которая перекодирует их в bmp, чтобы Evo SDK могла распихать их по страничкам, как тайлы.
Можно добавить новый ресурс:
set blob.01=filename1.bin
set blob.02=filename2.bin
...
Это надо evoresc ломать же?
ну блин а если выделить страницу под загрузку? чтобы в странице был код загрузки/записи и соответственно корректного включения всего этого?
Это надо evoresc ломать же?
И makeresh.
нет открытых портов ВГ-93.
Какие такие открытые порты ВГ93? Разве кто-то еще пользуется дискетами?
Пользуются-пользуются :) Самый простой доступ к файлам, - по-прежнему, TR-DOS.
Только файлы не на дискете, а на SD-карте. С открытыми портами карточка отпадает.
Вопрос, что с этим делать.
Если очень надо, то можно получить доступ к ВГ93. Но делать этого не стоит, для чтения с диска есть #3D13.
Ну блин не можете сделать нормально, сделайте через ().()
просто сделайте чтобы подгружать файл (допустим не более 16к) в страницу и спокойно вызывайте такую функцию из своего кода.
Sergey, я вообще не собираюсь писать под сдк
но вот Хиппи давно игру вынашивает
и если вы не сделаете диск то игру и не увидите.
кстати рекомендую все таки сделать файлы и непривязанный доступ чтобы читать не только с дискет но и с карточек
Подо что используется память 0xc000 - 0xbfff ?
Это как?
С 0x0000 С программа, с 0xdfff вниз стек и локальные переменные.
Что подвинуть вверх? 0xdfff?
Если стек, то двигать вниз надо. Где память то нужна?
Я, значит, маленько расширил возможности SDK (версия для TS-Config/SDCC v.3.xx) в части увеличения памяти под си-программу. :)
Вполне возможно сделать это и для оригинальной SDK и любую версию компилятора.
Суть улучшений: был один большой rel-файл, который целиком линковался в компилируемую программу, - стал один большой lib-файл, состоящий из кучи мелких rel-файлов, из которых в конечную программу линкуются только те, которые в ней задействованы.
Так на игре XNX выигрыш составил целых 226 (Двести двадцать шесть) байт.
Прилагаю архив. Более подробно всё описано в read_me.
Замечания и критика приветствуются.
Есть способ читать/писать нужные ячейки памяти в страничках (например, чтобы хранить большую карту).
...
void put_mem(u8 pg, u16 addr, u8 data)
...
u8 get_mem(u8 pg, u16 addr)
Тогда уж неплохо бы и для int и long данных процедурки добавить, а то по байту читать дюже накладно.
Профит для АТМ в архивчике - проверяйте.
void put_memw(u8 pg, u16 addr, u16 data)
u16 get_memw(u8 pg, u16 addr)
void put_meml(u8 pg, u16 addr, u32 data)
u32 get_meml(u8 pg, u16 addr)
Добавил версию для TS-Config. Дополнительно нужно добавить экспорт переменной CC_PAGE2.
В версии для TS-Config в целях ускорения п/п отказался от индексной адресации в пользу адресации через HL относительно стэка.
(Не совсем понимаю, почему в оригинале используется IX).
Проверяйте.
void put_mem(unsigned char pg, unsigned char *addr, unsigned char data)
unsigned char get_mem(unsigned char pg, unsigned char *addr)
void put_memw(unsigned char pg, unsigned int *addr, unsigned int data)
unsigned int get_memw(unsigned char pg, unsigned int addr)
void put_meml(unsigned char pg, unsigned long *addr, unsigned long data)
unsigned long get_meml(unsigned char pg, unsigned long *addr)
P.S.
В общем-то, всё это - "хак", с расчетом, что стэк и временные переменные программы не "раздуются" настолько, что вылезут из области 0xE000 - 0xC000.
P.P.S.
Пожалуй, удалю остальные свои сообщения как бесполезные. Призываю народ поступить аналогично.
Добавлены функции для TS-Config. См.выше.
hippiman
11.06.2014, 14:01
А нет возможности сделать загрузку/выгрузку посекторно? Допустим я выделяю где-то в памяти буфер нужного объема, указываю функции номер дорожки, сектора и она уже делает свое дело. Такое реализовать возможно?
А нет возможности сделать загрузку/выгрузку посекторно? Допустим я выделяю где-то в памяти буфер нужного объема, указываю функции номер дорожки, сектора и она уже делает свое дело. Такое реализовать возможно?
Такое реализовать легко: http://alonecoder.nedopc.com/evo_sdcc_3d13.rar
Буфер в окне #8000..#bfff, подпрограмма туда подключает страницу, которую укажешь в регистре A'. Остальные параметры идут в #3D13 напрямую.
Во время работы с диском устанавливается IM 1, EI, экран 6912.
После завершения #3D13 состояние системы восстанавливается обратно: IM 2, экран EGA, старая страница в окне #8000.
Область #5c00..#5fff сохраняется в конце PAL_PAGE (4-я страница), поэтому дополнительных ограничений на программу нет.
hippiman
11.06.2014, 16:11
alone, спасибо! Вечером начну разбираться.
А нет возможности сделать загрузку/выгрузку посекторно? Допустим я выделяю где-то в памяти буфер нужного объема, указываю функции номер дорожки, сектора и она уже делает свое дело. Такое реализовать возможно?
Есть такая возможность. Но только для ТС-Конфы. Готовность 70%. Надеюсь, за предстоящие праздники добью.
Будет что-то типа:
unsigned char rdsect(unsigned char *buffer, unsigned char NumSect, unsigned char *path)
unsigned char wrsect(unsigned char *buffer, unsigned char NumSect, unsigned char *path)
Пока затык из-за возможной нечетности адреса буфера - ПДП только с четными адресами работает.
hippiman
11.06.2014, 16:25
Sergey, тс конфа - не вариант. Мне для базовой нужно :)
Обновил. Теперь при работе с диском ещё устанавливается 5-я страница, SP=#6000, IY=23610, а в примере добавлена процедура-обвязка на Си.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot