User Tag List

Страница 13 из 15 ПерваяПервая ... 9101112131415 ПоследняяПоследняя
Показано с 121 по 130 из 151

Тема: Ретро-ЯП Millfork для Atari, Apple II, ZX Spectrum, MSX, CP/M, NES, Game Boy и MS-DOS

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Решил пока отвлечься от скроллов и заняться не менее интересной штукой, как чтение файлов с диска.
    Чисто теоретически опять «ничего сложного», но блин! как же геморно искать по крупицам информацию, её вроде как и вагон в каждой книжке, но где-то одно не дописано, где-то воды много итд.

    Досов на атари как известно много, все они разные и в меру навороченные. Остановится решил на XDOS, как наследнике классической Atari DOS 2.x. Минималистичненько, без всяких меню, чисто командная строка, минимальный размер загрузчика.

    Для сборки готовой дискеты использовал тулзу «dir2atr» из пакета «Atari Tools for Win32»

    Если говорить вкратце, то принцип работы с файлами такой же как и «везде» открываем файл, читаем, закрываем.
    На атари, при открытии нужно указать номер потока*16.

    Для примера сделал что бы с диска читалась картинка в формате ATASCII и выводилась на экран. Экран в DOS обрезан слева на 2 колонки, пришлось картинку подрезать тоже.





    пример простой как 5 копеек

    Выделяем место под буфер
    Читаем, если ошибка (файл не найден), выводим код ошибки
    Если всё успешно выводим посимвольно.

    Код:
    import stdio
    import xdos
    
    const byte channelID = 16*2
    
    array fileName = ["D:DINO.ATA",0x9b]
    const word fileSize = 950
    
    array fileData[fileSize]
    
    void main() {
        word i
        byte status
    
    
        status = openFile(fileName, XDOS_R, channelID)
        if (status == XDOS_OK) {
            readFile(fileData, fileSize, channelID)
            closeFile(channelID)
    
            new_line()
            for i,0,to,fileSize-1 {
                putchar(fileData[i])
            }
        } else {
            putstrz("Open error:"z)
            putword(status)
        }
    }
    Имя файла «прибито», было бы не плохо разобраться с аргументами командной строки, вроде XDOS это позволяет, если я правильно понял.

    Есть ещё нюанс с размером файла. Чисто гипотетически, если задать размер, например 255, а размер файла будет 24 байта, то система прочитает ровно 24 байта, даже если указать 255 в параметрах. Но остаётся вопрос с тем же выводом, как реально понять сколько же фактически было прочитано с диска. Нужно ещё разбираться.

    Но начало уже положено, можно подгружать «уровни» и другую информацию с дискеты на ура
    Вложения Вложения
    • Тип файла: zip DOS.zip (37.3 Кб, Просмотров: 53)
    Последний раз редактировалось breeze; 06.11.2024 в 12:54.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,511
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    207
    Поблагодарили
    146 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    тут один камрад подсказал насчет конца строки на Атари:"priwet,vestokij WORLD!{x9b}"

    Этот пользователь поблагодарил Shiny за это полезное сообщение:

    breeze(06.11.2024)

  4. #3

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Поковырял тут немного XDOS. Согласно документации, после загрузки программы, с адреса XLINE ($0880) находится вся строка (имя файла + аргументы) которые набрали.
    Сделал небольшую процедурку, которая копирует эту шнягу в буфер и теперь можно загружать разные файлы, указав их как аргумент:





    Единственное что осталось это разобраться с размерами загружаемого файла. Чисто гипотетически конечно можно не грузится этим и грузить частями в небольшой буфер, но так не интересно
    Вложения Вложения
    • Тип файла: zip DOS2.zip (39.1 Кб, Просмотров: 108)

  5. #4

    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    14,318
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    203
    Спасибо Благодарностей получено 
    1,483
    Поблагодарили
    968 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от breeze Посмотреть сообщение
    Единственное что осталось это разобраться с размерами загружаемого файла.
    возможно стоит посмотреть в
    Код:
    XFILE = $87D filename buffer
    ещё про команду LOA пишут что
    After executing the command, the Number of bytes actually loaded in $358/9
    (and can be determined with the DUP command = 358)
    Последний раз редактировалось goodboy; 07.11.2024 в 15:20.

  6. #5

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,511
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    207
    Поблагодарили
    146 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это только ATASCII? poke 82,0 решат заморочку с краями.

  7. #6

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Это только ATASCII?
    Ну для примера да, а так не важно что там, может и обычный текст быть.

    Цитата Сообщение от Shiny Посмотреть сообщение
    poke 82,0 решат заморочку с краями.
    Ну как вариант

    - - - Добавлено - - -

    Цитата Сообщение от goodboy Посмотреть сообщение
    возможно стоит посмотреть в
    Код:
    XFILE = $87D filename buffer
    Честно там не совсем понятно что за данные.

    Цитата Сообщение от goodboy Посмотреть сообщение
    ещё про команду LOA пишут что
    After executing the command, the Number of bytes actually loaded in $358/9
    (and can be determined with the DUP command = 358)
    Ну надо подумать, вообще хотелось бы предварительно знать, сколько выделять памяти. Но это только в мечтах. Размер Array должен быть статический, тупо выделил 256б вот и радуйся)
    Чисто гипотетически можно выделить 128б (по размеру сектора) и сделать счётчик загрузки

  8. #7

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Короче, пошаманив немного, нашел идеальный вариант. Методом научного тыка (из дампа памяти) нашел интересный адрес $0028/29 а потом в описании памяти атари увидел, что здесь хранится количество переданных/принятых байт через SIO. Так что вопрос с точностью быстро решился.

    Вариант с адресами $358/9 не проканал, поскольку это используется при команде 40 (если я правильно понял) загрузчика бинарных файлов (исполняемых). И там ничего нет при загрузке через команду 7.

    Переименовал файл в XV.COM, так как задолбало набирать длинное название с расширением, а XEX XDOS не понимает

    Ну и поправил некоторые ляпы с $9b (перенос строки) и на время отображения отключаю смещение (poke 82,0). Буфер сделал 1024 байта, если сделать меньше (например 255), то видно как частями грузится картинка

    Так же встречается ESC код $1b (в картинке ATARI600) поправил, теперь всё збс!

    Есть косяк с US2.ATA не могу понять почему на середине картинки позицию швыряет в начало экрана o_O

    Ещё почему-то не зависимо от того нашелся ли файли или нет(заблокирован) из $0343 возвращается код 01 - ошибок нет. Надо копать.

    Ну а так в целом минималистичный вьювер ATASCII готов





    Вложения Вложения
    • Тип файла: zip DOS3.zip (22.5 Кб, Просмотров: 129)

    Эти 3 пользователя(ей) поблагодарили breeze за это полезное сообщение:

    andrews(08.11.2024), goodboy(10.11.2024), Oleg N. Cher(08.11.2024)

  9. #8

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Решил тут ещё немного поколупаться с DOS, в результате чего родился плеер треков в формате MPT (Atari Music ProTracker) да да, всем так нравилось это слово, что протрекер есть везде



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

    На бордюре такты, по любой клавише выход.

    Из интересного, в Millfork есть пример для этого плеера, но он немного некорректен. Во первых исходный XEX занимает аж 38кб, поскольку сама программа и плеер с музыкой «размазаны» по памяти, выгружается такой огромный брикет. А во вторых, пропускаются 6 байт при импорте файлов:

    Код:
    const array player @ ADDRPLA = file("data/mpt_player.obj", 6)
    Почему их было не обрезать сразу при создании мне не ясно. В принципе я нашел плеер MPT в исходниках, так что можно подумать об оптимизации.
    Кроме того походу пьесы автор не разобрался как управлять плеером, и вместо того что бы подать команду 2 (остановить) он глушит цифровые каналы (да-да плеер умеет в дигитал).

    В сырках я перевёл команды плеера:

    Код:
    // commands, A:
    // 0 - инициализация. в регистрах Y-младший и X-старший байт адреса музыкальных данных.
    // 1 - воспроизвести инструмент, номер которого находится в битах 4-0 рег.X,
    //     в битах 7-6 рег.X - номер канала, на котором должен быть сыгран этот инструмент,
    //     а в рег.Y-номер ноты инструмента, с C-1 - $00, c#1 - $01.
    // 2 - остановить воспроизведение музыки, без каких-либо параметров.
    // 3 - воспроизвести паттрен, номер которого находится в битах 5-0 рег.X,
    //     в битах 7-6 рег.X - номер канала, а рег.Y - транспозиция канала.
    // 4 - начать воспроизведение музыки. В рег.X - номер позиции начала, а рег.Y - биты 0-3 какой из
    //     каналов должен быть выключен (0 - 3й, 1 - 2й, 2 - 1й, 3 - 0й канал = 1 выключен)
    // 5 - воспрозвести цифровой семпл, в регистрах Y-младший и X-старший байт адреса таблици, в которой
    //     находится список адресов расположения семплов.
    // 6 - воспроизведение цифровой музыки, в рег.X bit 0 = 1 - 15kHz, 0 - 8kHz
    // 7 - воссоздаёт(?) цифровой семпл, номер которого в рег.Y(0-F), в рег.X bit0 - 15kHz, bit7-6 номер канала
    Вложения Вложения
    • Тип файла: zip DOS4.zip (43.8 Кб, Просмотров: 62)

  10. #9

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,511
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    207
    Поблагодарили
    146 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от breeze Посмотреть сообщение
    во вторых, пропускаются 6 байт при импорте файлов:

    Код:
    const array player @ ADDRPLA = file("data/mpt_player.obj", 6)
    Почему их было не обрезать сразу при создании мне не ясно

    Вангую, что стандартный заголовок - слово $FFFF, начальный адрес, конечный адрес.

  11. #10

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,887
    Спасибо Благодарностей отдано 
    137
    Спасибо Благодарностей получено 
    135
    Поблагодарили
    83 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Вангую, что стандартный заголовок - слово $FFFF, начальный адрес, конечный адрес.
    Ну где-то так Это DOS-заголовок файлов?

Страница 13 из 15 ПерваяПервая ... 9101112131415 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 11
    Последнее: 08.12.2023, 17:18
  2. Bad Apple для MSX/MSX2
    от Pyhesty в разделе MSX
    Ответов: 4
    Последнее: 31.05.2021, 21:45
  3. Перенос игр с Game Boy на ZX Spectrum
    от CityAceE в разделе Программирование
    Ответов: 104
    Последнее: 14.02.2019, 10:56
  4. Game Boy Advance
    от megabyte в разделе Nintendo
    Ответов: 8
    Последнее: 22.05.2006, 14:48
  5. Game Boy Advance в Питере.
    от Surfin_Bird в разделе Nintendo
    Ответов: 10
    Последнее: 21.08.2005, 09:50

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •