PDA

Просмотр полной версии : ZX MIDI player



Uzix
27.05.2023, 20:49
https://pic.maxiol.com/thumbs2/1685209654.2965552434.screenshot.png (https://pic.maxiol.com/?v=1685209654.2965552434.screenshot.png&dp=2)

Представляю релиз первой версии моего проигрывателя MIDI файлов для ZX Spectrum.

ТТХ:
* Работает на любом ZX Spectrum 128-совместимом компьютере с MIDI синтезатором;
* Поддерживаются файлы размером до 64Кб форматов RMI и MID (типов 0 и 1);
* Поддержка до 60 дорожек в файле. Для тяжёлых файлов желателен турбо режим процессора;
* Поддерживается работа на 3.5, 3.54, 7, 14, 28 МГц (процессор должен работать без вейтов);
* Поддержка загрузки файлов с BDI/TR-DOS. В планах работа с FAT32/SD-картами.

Проигрыватель протестирован на Sizif-512, ZX Evolution + Multisound и на ZX UNO 1010, но должен работать и на других компьютерах с TR-DOS. Так же можно запустить в эмуляторе - например, в Es.pectrum - в нём есть поддержка MIDI.

Проект с открытым исходным кодом, лицензия GPLv3.
Ссылка на исходный код: https://github.com/UzixLS/zx-midiplayer
Ссылка на скачивание: https://github.com/UzixLS/zx-midiplayer/releases

voldemar_d
01.06.2023, 19:24
> Работает на любом ZX Spectrum 128-совместимом компьютере с MIDI синтезатором

Извиняюсь, а в каком ZX Spectrum есть MIDI-синтезатор? Это какая-то плата расширения с GM?

ZX Spectrum Next N-go, например, является таким компьютером?

Uzix
01.06.2023, 19:53
voldemar_d, MIDI-синтезатор - чип или устройство, преобразующее MIDI-команды в звук. Например, это может быть что-то вроде Roland SC-55 или MT32-pi, или чип SAM2695 (который используется в сизифе, уне, мультисаунде).
Про Next/N-Go я не особо в курсе, но не слышал что бы там было что-то подобное. Но технически там это реализовать возможно с помощью Raspberry Pi.

voldemar_d
02.06.2023, 06:23
Что такое MIDI-синтезатор, я знаю. Просто я не в курсе, как его можно к ZX Spectrum подключить. Есть ссылка на описание того, как это можно сделать?

Наверное, я не очень понял слова "ZX Spectrum 128-совместимом компьютере с MIDI синтезатором" - наверное, имеется ввиду "ZX Spectrum 128-совместимом компьютере с MIDI-интерфейсом, к которому подключен внешний MIDI-синтезатор"? MIDI-интерфейс, если не ошибаюсь, в фирменных Спектрумах был, а во всяких современных клонах он каким образом представлен?

Black Cat / Era CG
02.06.2023, 06:59
Карточки есть, вроде.

voldemar_d
02.06.2023, 08:15
Вот мне и интересно, что за карточки и к каким Спектрумам их можно подключить, и как.
Если в клоне есть чип, про который выше написано (чип SAM2695, который используется в сизифе, уне, мультисаунде), с этим понятно.
А вот если встроенного чипа нет, то как внешнее устройство вроде Roland SC-55 к Спектруму подключить?

Вот такое нашел - это имеется ввиду?
https://www.youtube.com/watch?v=lGZXJJlRNqY

Но здесь прямо синтезатор встроенный. А бывает ли плата для Спектрума с просто MIDI-интерфейсом, в который можно воткнуть MIDI-кабель Din5 и далее подключить его к внешнему синтезатору?

Uzix
02.06.2023, 08:33
Вот мне и интересно, что за карточки и к каким Спектрумам их можно подключить, и как.
Ну так на github (https://github.com/UzixLS/zx-midiplayer) это написано :) Вход MIDI синтезатора подключается к AY к выходу IOA2 через несложную схему.
Ещё есть такая карточка - ZXM Crystal MIDI (ссылка (https://zx-pk.ru/threads/31568-zvukovaya-karta-quot-zxm-crystalmidi-quot.html)) - разработка Mick - что-то вроде turbosound по формату (т.е. вставляется вместо AY), но с midi-синтезатором. Но вроде как в общий доступ она не выложена, либо я не нашёл.

Mick
02.06.2023, 08:36
Ещё есть такая карточка - ZXM Crystal MIDI (ссылка) - разработка Mick - что-то вроде turbosound по формату (т.е. вставляется вместо AY), но с midi-синтезатором. Но вроде как в общий доступ она не выложена, либо я не нашёл.

Пока не выкладывал, раз плеер появился, надо попробовать.

voldemar_d
02.06.2023, 09:34
> Ну так на github это написано

Спасибо! Слона-то я и не заметил :-)

> подключается к AY к выходу IOA2 через несложную схему

В схеме оптрона нет - а так безопасно подключать внешний синтезатор?

creator
02.06.2023, 15:31
> Ну так на github это написано
Спасибо! Слона-то я и не заметил :-)
Можно ещё проще:
A2 (12 нога AY8912) через 220 Ом на 5 контакт DIN.
+5 (3 нога AY8912) через 220 Ом на 4 контакт DIN.
https://pic.maxiol.com/images2/1685708839.92912494.clipboard2.jpg


> подключается к AY к выходу IOA2 через несложную схему
В схеме оптрона нет - а так безопасно подключать внешний синтезатор?
Оптрон на входе синтезатора.

https://www.youtube.com/watch?v=TJy0ZgffIIk

valerium
02.06.2023, 23:11
Можно ещё проще:
A2 (12 нога AY8912) через 220 Ом на 5 контакт DIN.
+5 (3 нога AY8912) через 220 Ом на 4 контакт DIN.

https://www.youtube.com/watch?v=TJy0ZgffIIk
Я вот эти два факта сопоставить никак не могу: если вывод выполняется на дримбластер (дочерняя карточка с 26-пиновым разъемом), у которого и так вход в уровнях TTL5, то зачем там резисторы и оптронная развязка ? )
У меня ямаха704 (тоже wavetable-дочка под гребенку 26пин) припаяна на sizif512ext вместо sam2695 - напрямую, ttl5-выход на ttl5-вход.
А оптронные и некоторые другие (без развязки) схемы применяются для согласования токовой петли на источнике, которая есть стандарт у "настоящих" инструментов, со входом приемника.

А по основной теме топика - плеер класс ! А при планируемой поддержке FAT32/SD это будет просто уникальная вещь !
Шестнадцатеричное представление всех счетчиков и параметров выглядит весьма экстравагантно, но это скорее отладочная информация для автора, нежели что-то необходимое слушателю, хотя неплохо разминает мозги и заставляет переключить восприятие )

creator
03.06.2023, 03:09
Я вот эти два факта сопоставить никак не могу: если вывод выполняется на дримбластер (дочерняя карточка с 26-пиновым разъемом), у которого и так вход в уровнях TTL5, то зачем там резисторы и оптронная развязка ? )
У меня ямаха704 (тоже wavetable-дочка под гребенку 26пин) припаяна на sizif512ext вместо sam2695 - напрямую, ttl5-выход на ttl5-вход.
А оптронные и некоторые другие (без развязки) схемы применяются для согласования токовой петли на источнике, которая есть стандарт у "настоящих" инструментов, со входом приемника.

Всё правильно, можно и напрямую, но вопрос был про подключение "настоящего синтезатора", а на видео Dreamblaster (можно и любую другую "дочку" воткнуть) оформлен именно так, там и оптрон и все необходимые напряжения для питания любых "дочек" (+5,+12,–12) и формирование цепи сброса.

NEO SPECTRUMAN
06.06.2023, 22:29
Вывод в обход ПЗУ-шной процедуры?
Зачем так сделано?

...в моем унриале тишина

Uzix
06.06.2023, 22:41
NEO SPECTRUMAN, ну, во-первых, чтобы не зависеть от 128 бейсика и не щёлкать 7ffd туда-сюда. Во-вторых, пзу-шная процедура не работает на 7-14-28 МГц.
Унриал не поддерживает MIDI, нужен Es.pectrum, и в нём в Options -> Hardware выставить MIDI=128.

NEO SPECTRUMAN
06.06.2023, 22:43
мой поддерживает
но только как перехват вывода в ПЗУ

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


Во-вторых, пзу-шная процедура не работает на 7-14-28 МГц.
а утя биперение мидей сделано и на 28МГц?

Uzix
06.06.2023, 22:51
а утя биперение мидей сделано и на 28МГц?
Да, для ZX-UNO - там есть и миди, и 28 без вейтов.

NEO SPECTRUMAN
07.06.2023, 00:11
Да, для ZX-UNO - там есть и миди, и 28 без вейтов.

хотя...
тот код есть пральным только для фирмы с её 3546900

Uzix
19.08.2023, 16:06
Выпустил релиз версии 2.0:

* Реализована поддержка FAT32;
* Добавлена поддержка интерфейсов SD-карт: DivMMC (и производные), ZXMMC, Z-Controller;
* Добавлена поддержка IDE-интерфейсов: DivIDE, NemoIDE, SMUC;
* Добавлена поддержка ShamaZX SAM2695 MIDI addon;
* Исправлен сброс MIDI-синтезатора (актуально для встроенного в Windows синтезатора);
* Исправлено падение при отсутствии BDI/TRDOS.

Скачать: https://github.com/UzixLS/zx-midiplayer/releases/download/2/zxmidip2.trd

Небольшая видеодемонстрация: https://cloud.err200.net/s/GLaW53WjZnEfxpK

Iegova
26.01.2024, 20:51
Я один из немногих кто подключил реальный синтезатор к спектруму (клону). Затестил ZX MIDI player, половину нот почему то он вообще пропускает. Уж не знаю в чем дело, то ли в синтезаторе моем(из бейсика ноты нормально играет), то ли в чем то еще.

creator
26.01.2024, 22:11
Iegova, "реальный синтезатор" совместим с GeneralMIDI/GS?

Iegova
26.01.2024, 23:13
Iegova, "реальный синтезатор" совместим с GeneralMIDI/GS?

Скорее всего нет.

creator
27.01.2024, 10:50
Iegova, вот видимо в этом проблема, расклад инструментов другой. Для проверки можно подключить этот ситезатор к ПК и попробовать через него эти же MIDI файлы.

Uzix
27.01.2024, 12:26
А какой синтезатор то?

Iegova
28.01.2024, 13:15
А какой синтезатор то?
bontempi az 7500

Mick
07.02.2024, 11:23
Проект с открытым исходным кодом, лицензия GPLv3.

Да простите мою ламерность, а как компилить в win10. Я скачал последний sjasmplus, нажимаю make.bat и вылезает куча ошибок.

Uzix
07.02.2024, 11:41
Да простите мою ламерность, а как компилить в win10. Я скачал последний sjasmplus, нажимаю make.bat и вылезает куча ошибок.
Поправил make.bat. Обычно собираю через Makefile (что и есть рекомендуемый способ) - так что не заметил своевременно поломки в make.bat.

Mick
07.02.2024, 12:05
Поправил make.bat. Обычно собираю через Makefile (что и есть рекомендуемый способ) - так что не заметил своевременно поломки в make.bat.

Возможно я все таки делаю что то не так



lua/screen_address.inc(1): error: [LUA]7: ')' expected near '&'
fatfs.asm(79): error: Forward reference
player.asm(214): error: [LUA] unexpected symbol near '.'
screen.asm(46): error: [LUA] '=' expected near 'ix'
vis.asm(28): error: [LUA] unexpected symbol near '|'
vis.asm(211): error: [LUA] '=' expected near 'b'
src/main.asm(2): error: Unrecognized instruction: OPT --syntax=abf
src/main.asm(3): error: Unrecognized instruction: SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
src/main.asm(4): error: Unexpected: ,stack_top
device.asm(81): error: Unrecognized instruction: device_t #0bde+10 CPU_3_5_MHZ INT_50_HZ 19968 224 64 141
device.asm(82): error: Unrecognized instruction: device_t #0c0a+10 CPU_3_54_MHZ INT_50_HZ 19992 228 63 141
device.asm(83): error: Unrecognized instruction: device_t #0c2c+10 CPU_3_5_MHZ INT_48_HZ 20480 224 80 210
device.asm(84): error: Unrecognized instruction: device_t #17bd+10 CPU_7_MHZ INT_50_HZ 19968 448 64 302
device.asm(85): error: Unrecognized instruction: device_t #1815+10 CPU_7_MHZ INT_49_HZ 20259 456 63 302
device.asm(86): error: Unrecognized instruction: device_t #1859+10 CPU_7_MHZ INT_48_HZ 20480 448 80 440
device.asm(87): error: Unrecognized instruction: device_t #2f7a+10 CPU_14_MHZ INT_50_HZ 19968 896 64 624
device.asm(88): error: Unrecognized instruction: device_t #302b+10 CPU_14_MHZ INT_49_HZ 20259 912 63 624
device.asm(89): error: Unrecognized instruction: device_t #30b2+10 CPU_14_MHZ INT_48_HZ 20480 896 80 900
device.asm(90): error: Unrecognized instruction: device_t #5ef4+10 CPU_28_MHZ INT_50_HZ 19968 1792 64 1448
device.asm(91): error: Unrecognized instruction: device_t #6057+10 CPU_28_MHZ INT_49_HZ 20259 1824 63 1448
device.asm(92): error: Unrecognized instruction: device_t #6164+10 CPU_28_MHZ INT_48_HZ 20480 1792 80 2000
device.asm(93): error: Unrecognized instruction: device_t #ffff CPU_28_MHZ INT_48_HZ 20480 1792 80 2000
settings.asm(205): error: Unrecognized instruction: menugen_t 10
settings.asm(206): error: Unrecognized instruction: menugen_entry_t str_output settings_menu_val_cb settings_menu_cb settings_menuentry_output
settings.asm(207): error: Unrecognized instruction: menugen_entry_t str_kempston settings_menu_val_cb settings_menu_cb settings_menuentry_kempston
settings.asm(208): error: Unrecognized instruction: menugen_entry_t str_divmmc settings_menu_val_cb settings_menu_cb settings_menuentry_divmmc
settings.asm(209): error: Unrecognized instruction: menugen_entry_t str_zxmmc settings_menu_val_cb settings_menu_cb settings_menuentry_zxmmc
settings.asm(210): error: Unrecognized instruction: menugen_entry_t str_zcontroller settings_menu_val_cb settings_menu_cb settings_menuentry_zcontroller
settings.asm(211): error: Unrecognized instruction: menugen_entry_t str_divide settings_menu_val_cb settings_menu_cb settings_menuentry_divide
settings.asm(212): error: Unrecognized instruction: menugen_entry_t str_nemoide settings_menu_val_cb settings_menu_cb settings_menuentry_nemoide
settings.asm(213): error: Unrecognized instruction: menugen_entry_t str_smuc settings_menu_val_cb settings_menu_cb settings_menuentry_smuc
settings.asm(215): error: Unrecognized instruction: menugen_entry_t str_save 0 settings_menu_save_cb
settings.asm(216): error: Unrecognized instruction: menugen_entry_t str_apply 0 settings_menu_apply_cb
player.asm(214): error: [LUA] unexpected symbol near '.'
player.asm(416): error: Unrecognized instruction: _pc("ld _reg, " .. screen_address_pixel((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
player.asm(416): error: Unexpected: _pc("ld _reg, " .. screen_address_pixel((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
player.asm(416): error: [ENDLUA] End of lua script without script
screen.asm(46): error: [LUA] '=' expected near 'ix'
screen.asm(137): error: Unrecognized instruction: _pc("ld _reg, " .. screen_address_pixel((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
screen.asm(137): error: Unexpected: _pc("ld _reg, " .. screen_address_pixel((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
screen.asm(137): error: [ENDLUA] End of lua script without script
vis.asm(28): error: [LUA] unexpected symbol near '|'
vis.asm(211): error: [LUA] '=' expected near 'b'
vis.asm(245): error: Unrecognized instruction: _pc("ld _reg, " .. screen_address_attr((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
vis.asm(245): error: Unexpected: _pc("ld _reg, " .. screen_address_attr((_c("_yyxx")&0xff)*8, (_c("_yyxx")>>8)*8))
vis.asm(245): error: [ENDLUA] End of lua script without script
src/main.asm(337): error: Unrecognized instruction: menugen_t 3
src/main.asm(338): error: Unrecognized instruction: menugen_entry_t str_settings 0 main_menu_settings
src/main.asm(339): error: Unrecognized instruction: menugen_entry_t str_help 0 help
src/main.asm(340): error: Unrecognized instruction: menugen_entry_t str_exit 0 exit
src/main.asm(342): error: closing } missing
src/main.asm(343): error: Unrecognized instruction: main_menu_generator
src/main.asm(344): error: Unrecognized instruction: 0
src/main.asm(344): error: Unexpected: 0
src/main.asm(345): error: Unrecognized instruction: main_menu_callback
src/main.asm(346): error: Unrecognized instruction: main_menu_entries
src/main.asm(347): error: Unrecognized instruction: LAYOUT_MAINMENU_Y
src/main.asm(348): error: Unrecognized instruction: LAYOUT_MAINMENU_X
src/main.asm(349): error: Unrecognized instruction: LAYOUT_MAINMENU_LINES
src/main.asm(350): error: Unrecognized instruction: LAYOUT_MAINMENU_COLUMNS
src/main.asm(351): error: Invalid labelname: }
src/main.asm(352): error: closing } missing
src/main.asm(353): error: Unrecognized instruction: menu_dummy_generator
src/main.asm(354): error: Unrecognized instruction: 0
src/main.asm(354): error: Unexpected: 0
src/main.asm(355): error: Unrecognized instruction: menu_dummy_callback
src/main.asm(356): error: Unrecognized instruction: 0
src/main.asm(356): error: Unexpected: 0
src/main.asm(357): error: Unrecognized instruction: LAYOUT_RIGHTMENU_Y
src/main.asm(358): error: Unrecognized instruction: LAYOUT_RIGHTMENU_X
src/main.asm(359): error: Unrecognized instruction: LAYOUT_RIGHTMENU_LINES
src/main.asm(360): error: Unrecognized instruction: LAYOUT_RIGHTMENU_COLUMNS
src/main.asm(361): error: Invalid labelname: }
udg.asm(4): error: Unrecognized instruction: DG --------
udg.asm(5): error: Unrecognized instruction: DG ----##--
udg.asm(6): error: Unrecognized instruction: DG ----#-#-
udg.asm(7): error: Unrecognized instruction: DG ----#-#-
udg.asm(8): error: Unrecognized instruction: DG --###---
udg.asm(9): error: Unrecognized instruction: DG -#--#---
udg.asm(10): error: Unrecognized instruction: DG --##----
udg.asm(11): error: Unrecognized instruction: DG --------
udg.asm(14): error: Unrecognized instruction: DG --------
udg.asm(15): error: Unrecognized instruction: DG --------
udg.asm(16): error: Unrecognized instruction: DG -###----
udg.asm(17): error: Unrecognized instruction: DG -#--###-
udg.asm(18): error: Unrecognized instruction: DG -#----#-
udg.asm(19): error: Unrecognized instruction: DG -#----#-
udg.asm(20): error: Unrecognized instruction: DG -######-
udg.asm(21): error: Unrecognized instruction: DG --------
udg.asm(24): error: Unrecognized instruction: DG --------
udg.asm(25): error: Unrecognized instruction: DG --------
udg.asm(26): error: Unrecognized instruction: DG --------
udg.asm(27): error: Unrecognized instruction: DG --------
udg.asm(28): error: Unrecognized instruction: DG --------
udg.asm(29): error: Unrecognized instruction: DG --------
udg.asm(30): error: Unrecognized instruction: DG -#-#-#--
udg.asm(31): error: Unrecognized instruction: DG --------
udg.asm(34): error: Unrecognized instruction: DG -######-
udg.asm(35): error: Unrecognized instruction: DG ###--###
udg.asm(36): error: Unrecognized instruction: DG ##-##-##
udg.asm(37): error: Unrecognized instruction: DG ###-####
udg.asm(38): error: Unrecognized instruction: DG ####-###
udg.asm(39): error: Unrecognized instruction: DG ########
udg.asm(40): error: Unrecognized instruction: DG ####-###
udg.asm(41): error: Unrecognized instruction: DG -######-
udg.asm(45): error: Unrecognized instruction: DG -#--#-#-
udg.asm(46): error: Unrecognized instruction: DG -#--#-#-
udg.asm(47): error: Unrecognized instruction: DG -#----#-
udg.asm(48): error: Unrecognized instruction: DG -######-
udg.asm(49): error: Unrecognized instruction: DG -######-
udg.asm(50): error: Unrecognized instruction: DG -######-
udg.asm(51): error: Unrecognized instruction: DG -######-
udg.asm(52): error: Unrecognized instruction: DG --------
udg.asm(55): error: Unrecognized instruction: DG --#####-
udg.asm(56): error: Unrecognized instruction: DG -#-##-#-
udg.asm(57): error: Unrecognized instruction: DG -#-##-#-
udg.asm(58): error: Unrecognized instruction: DG -#----#-
udg.asm(59): error: Unrecognized instruction: DG -#----#-
udg.asm(60): error: Unrecognized instruction: DG -#----#-
udg.asm(61): error: Unrecognized instruction: DG -######-
udg.asm(62): error: Unrecognized instruction: DG --------
udg.asm(65): error: Unrecognized instruction: DG -######-
udg.asm(66): error: Unrecognized instruction: DG -#----#-
udg.asm(67): error: Unrecognized instruction: DG -#-##-#-
udg.asm(68): error: Unrecognized instruction: DG -#-##-#-
udg.asm(69): error: Unrecognized instruction: DG -##---#-
udg.asm(70): error: Unrecognized instruction: DG -#----#-
udg.asm(71): error: Unrecognized instruction: DG -######-
udg.asm(72): error: Unrecognized instruction: DG --------
src/main.asm(1): error: Label not found: __SJASMPLUS__
src/main.asm(1): error: [ASSERT] Assertion failed: __SJASMPLUS__ >= 0x011402
001 0000 ASSERT __SJASMPLUS__ >= 0x011402 ; SjASMPlus 1.20.2
src/main.asm(2): error: Unrecognized instruction: OPT --syntax=abf
002 0000 OPT --syntax=abf
src/main.asm(3): error: Unrecognized instruction: SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
003 0000 SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
src/main.asm(4): error: Unexpected: ,stack_top
004 0000 DEVICE ZXSPECTRUM128,stack_top

Uzix
07.02.2024, 12:13
Возможно я все таки делаю что то не так
А какая версия SjASMPlus? Нужна 1.20.2 или новее


src/main.asm(1): error: [ASSERT] Assertion failed: __SJASMPLUS__ >= 0x011402
001 0000 ASSERT __SJASMPLUS__ >= 0x011402 ; SjASMPlus 1.20.2

Mick
07.02.2024, 13:07
SjASMPlus 1.20.2

Пишет 1.20.3, может какие то пакеты надо устанавливать, я только распаковал содержимое архива ассемблера в папку - C:\Hwdev\sjasmplus\

Uzix
07.02.2024, 13:34
Пишет 1.20.3, может какие то пакеты надо устанавливать, я только распаковал содержимое архива ассемблера в папку - C:\Hwdev\sjasmplus\
А никаких изменений в проект не было внесено? Может где-то случайно лишняя скобка проставилась :)

Если через кнопку Code на github скачать ZIP-архив с исходниками проекта и запустить make.bat - что будет? Желательно полный лог с начала.

Mick
07.02.2024, 13:58
А никаких изменений в проект не было внесено? Может где-то случайно лишняя скобка проставилась

Вроде ничего не трогал, может не так скачал.
Сейчас снес всю папку, скачал исходники заново распаковал на диск D:/ZX-MidiPlayer
Теперь другая картинка и папка build появилась



D:\ZX-MidiPlayer>make.bat
This is unsupported build method!
Use "GNU make" tool!

Время ожидания 0 сек., нажмите любую клавишу для продолжения ...
Подпапка или файл build уже существует.

D:\ZX-MidiPlayer>sjasmplus --outprefix=build/ --exp=build/main.exp -DVERSION_DEF=\"\" -DVERSIONSHORT_DEF=\"\" src/mai
n.asm
SjASMPlus Z80 Cross-Assembler v1.20.3 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
strings.asm(2): warning: Empty string: "",0
strings.asm(7): ^ emitted from here
main.asm(369): warning: Empty string: "", 0
> Code entrypoint=0xA1F5 start=0x76D1 end=0xAA5A len=13193
Pass 3 complete
Errors: 0, warnings: 2, compiled: 7498 lines, work time: 0.063 seconds

D:\ZX-MidiPlayer>sjasmplus --outprefix=build/ --msg=err src/build.asm
SjASMPlus Z80 Cross-Assembler v1.20.3 (https://github.com/z00m128/sjasmplus)
"ls" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
"ls" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
"ls" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Для продолжения нажмите любую клавишу . . .

Uzix
07.02.2024, 14:11
Теперь другая картинка и папка build появилась
Ох, в винде же нет "ls"... Надо покумекать как лучше сделать.
Но в целом trd должна собраться, только без midi файлов.

Mick
07.02.2024, 14:35
Но в целом trd должна собраться, только без midi файлов.
В папке build есть main.trd, т.е. скомпилились исходники получается.
Спасибо за помощь, а то я тут репу все чешу в чем дело.

NEO SPECTRUMAN
07.02.2024, 20:41
А никаких изменений в проект не было внесено?
а чего нельзя ложить *****й компилер весом в полотора мегабайта в сорец?
чтоб все собиралось у всех из коробке

Uzix
07.02.2024, 21:00
чтоб все собиралось у всех из коробке
Относительно популярных платформ много - linux, windows, windows xp (у sjasm под неё отдельная версия), macos - в вариантах x86, x64, где-то даже arm (которых тоже не одна вариация).
Не считаю хорошей практикой таскать тулчейны/компиляторы в гит репозитории :)

NEO SPECTRUMAN
07.02.2024, 21:36
Не считаю хорошей практикой таскать тулчейны/компиляторы в гит репозитории
высказываю тебе свое ФИИИ

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

а потом ничаго не компилитсо у людей
никогда

а потом куски тулчейна протухают в интернетах
итд итп

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


Относительно популярных платформ много - linux, windows, windows xp (у sjasm под неё отдельная версия), macos - в вариантах x86, x64, где-то даже arm (которых тоже не одна вариация).
тыб еще амигу упомянул
у 99% людей венда
и закинутый сджасм будет работать
а вот "не такие как все с повышенным красноглазием" ССЗБ

в придачу для когото твой сорец будет первым
а ты его посылаешь собирать т00лчейн неизвестно каких версий
еще напомню что сджасмв 5 веток
и некоторые до сих пор юзают rc6
и совместимость между версиями одной ветки так же не ахти

пока т00лчейн небольшой и его можно положить в репу
его НУЖНО блджд ПОЛОЖИТЬ В РЕПУ

я тоже как то хотел оно скомпилить
словил феилов
ну и забил

Uzix
27.05.2024, 12:26
Выпустил релиз версии 3.0:

* Добавлена поддержка проигрывания MIDI через NeoGS с чипом VS1053;
* Добавлена поддержка чтения карты памяти на NeoGS;
* Добавлена настройка номера чипа TurboSound;
* Добавлена настройка джойстика Kempston;
* Исправлена навигация кнопкой "вниз" в списке файлов если в папке больше чем 255 файлов;
* Исправлена совместимость Z-Controller с VDAC2;
* Изменён порядок назначения букв дискам - теперь IDE диски располагаются перед SD/MMC.


Скачать: https://github.com/UzixLS/zx-midiplayer/releases/download/3/zxmidip3.trd

Chwe
03.06.2024, 16:12
Евгений, так сказать, на правах одного из первых пользователей версии 3.0 (да, так получилось, что я случайно скачал её, может быть, даже до «официального» анонса) имею несколько вопросов.

Во-первых, работает отлично «на» FUSE :)

Во-вторых, а можно для старых любителей экзотики добавить, хотя бы как compile time option, поддержку +3 DOS? Готов прислать патч, просто пока не разобрался, как там дисковая абстракция устроена.

В-третьих, расскажите, пожалуйста, а есть какие-то тонкости в режиме DivMMC? Там какой-то определённый FAT нужен или что-то ещё? Я загружаю main.tap, оно там что-то играет (нет, правда играет). Я выхожу в Settings, выбираю DivMMC ON, появляется "A:", нажимаю на него и... красный бордюр. Это, конечно, FUSE с DivMMC, FAT16, esxdos 0.8.9, но само по себе оно загружается и работает, я на нём всё тестирую.

Uzix
03.06.2024, 16:41
Во-вторых, а можно для старых любителей экзотики добавить, хотя бы как compile time option, поддержку +3 DOS?
Я не знаком с этой системой, можете посоветовать хорошие доки для разработчика для ознакомления? Ну и в ближайшее время точно не обещаю :)


Готов прислать патч, просто пока не разобрался, как там дисковая абстракция устроена.
Присылайте конечно, буду рад :-)
Там - это в плеере или в +3DOS? Если в плеере - то посмотрите файл disk.asm начиная со строки 336 (ссылка (https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L336)) - методы disk_entry_is_directory, disk_file_load, disk_directory_load, disk_directory_menu_generator. Эти функции прыгают на конкретную реализацию - TR-DOS или FAT (IDE и MMC), настройка этих функций происходит в disk_change начиная со строки 404 (ссылка (https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L404)). Все функции оперируют с номером файла (порядковый номер записи) в каталоге.


В-третьих, расскажите, пожалуйста, а есть какие-то тонкости в режиме DivMMC? Там какой-то определённый FAT нужен или что-то ещё? Я загружаю main.tap, оно там что-то играет (нет, правда играет). Я выхожу в Settings, выбираю DivMMC ON, появляется "A:", нажимаю на него и... красный бордюр. Это, конечно, FUSE с DivMMC, FAT16, esxdos 0.8.9, но само по себе оно загружается и работает, я на нём всё тестирую.
Поддерживается только FAT32. На поддержку FAT16 я не увидел смысла тратить время и силы. Да и не только я, в WildPlayer тоже FAT16 не поддерживается, как и (вроде бы) в Z-Player.

Chwe
03.06.2024, 23:21
Я не знаком с этой системой, можете посоветовать хорошие доки для разработчика для ознакомления? Ну и в ближайшее время точно не обещаю :)

[skip]

Поддерживается только FAT32. На поддержку FAT16 я не увидел смысла тратить время и силы. Да и не только я, в WildPlayer тоже FAT16 не поддерживается, как и (вроде бы) в Z-Player.

zx midi player'а абстракции, неточно выразился. Ну, теперь отправная точка есть, попробую.

Из док там я и сам пока использую только фирменное руководство (Part 26 (https://worldofspectrum.org/ZXSpectrum128+3Manual/chapter8pt26.html), Part 27 (https://worldofspectrum.org/ZXSpectrum128+3Manual/chapter8pt27.html)), да Next'овое API (https://gitlab.com/thesmog358/tbblue/-/blob/master/docs/nextzxos/NextZXOS_and_esxDOS_APIs.pdf?ref_type=heads) и, соотвественно, Next'овые исходники (https://gitlab.com/thesmog358/tbblue/-/tree/master/src?ref_type=heads). Вряд ли оно того стоит, Вам голову забивать, сильно оно экзотично для наших широт. Я сам пока попробую :)

FAT32 и esxdos, подтверждаю, работает :) Оказывается, почему-то, esxdos хотело ещё и образ не менее 4Gb. После этого, вроде, заработало. Спасибо.

izzx
04.06.2024, 10:06
У меня на Эве при 14 Мгц Мультисаунд миди не играет. Тишина. А должен? Вижу, в инструкции написано, что не гарантируется. На 3.5 и 7 хорошо играет.

Uzix
04.06.2024, 10:17
izzx, не должен т.к. на 14 МГц у Эвы есть вейтстейты - пропуски тактов грубо говоря. Выход миди на Мультисаунде сделан согласно заветам Клайва, т.е. ногодрыгом, а значит любые отклонения частоты процессора критичны.

Chwe
05.06.2024, 17:26
Присылайте конечно, буду рад :-)


Ну, честно говоря, у меня уже есть прототип. И, даже, вроде как, работает: https://dai.ly/x8zp204

Но, так как я только учусь, там есть масса тонкостей, которые хотелось бы прояснить. Вот, как уточню все тонкости (или допилю сам, без ансамбля :)) -- поделюсь кодом.

Chwe
07.06.2024, 19:52
TL;DR: есть знатоки +3 DOS, которые хотят послушать MIDI?

Значит, при переносе на +3 проблем там вылезло несколько, кратко можно их изложить как «+3 DOS это вам не TR-DOS, она подгребает под себя всю свободную память». То есть, без дополнительных прыжков, там места только на код, куда грузить данные, не говоря уже о собственно MIDI файлах -- решительно непонятно. Это нас не остановит, работающая версия, как я уже показывал, есть, дело в «proper» оформлении нужных решений.

В странице 7 (на? мне как-то «банк» привычнее), куда у Вас загружаются шаблоны экранов, там просто нет для них места, потому что именно в странице 7 +3 DOS держит все свои переменные. Это никак обойти нельзя, насколько я понимаю, сколько там есть места, столько и есть. Ещё бы выяснить, сколько именно...

Дальше, страницы 1, 3, 4 и 6 тоже (внезапно!) используются +3 DOS для кэша диска и RAM диска. Теоретически и то и другое отключаемо, но освободить (хотя бы частично) страницу 1 мне пока не удалось. 3, 4, 6 -- запросто, а чем затык с 1-й, непонятно.

Да, я там задавал вопросы на SC (не знаю, может, я недооцениваю количество +3 знатоков тут?), но там пока откликнулись только писатели.

В принципе, проблема может быть на данном этапе решена «в лоб», путём более эффективного сжатия экранов. Например, при использовании zx0, места в 7-й странице остаётся достаточно для +3 DOS. Но это очень усложняет сборку. Может, это и к лучшему, см. ниже.

И, да, проблема детектирования +3 DOS. Хотя, на мой взгляд, это не проблема. +3 DOS не с чем не совместима, ничего не может быть включено с ней одновременно, поэтому для +3 нужна отдельная сборка. Бонус -- можно не компилировать FAT32 и все интерфейсы для SD.

Ещё в +3e может быть до двух дисководов и до двух разделов жёсткого диска, причем, назначенных на произвольные устройства. Как эту информацию получить из системы, я, кажется, понял. А вот как в ZX MIDI Player отобразить произвольный набор устройств, я ещё даже и не смотрел.

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

Приехал я домой, подключил MT-32pi к Sizif'у и, что-то, не работает оно с максимальной скоростью процессора. В режиме +3, другие пока не пробовал. Определяет скорость правильно, а вот на выходе, похоже, мусор, что-то не совпадает. На 7MHz, вроде, живёт. Анализатор я куда-то засунул, пока посмотреть, что там выходит не могу. В теории на Sizif все частоты процессора поддерживаются?

Uzix
07.06.2024, 20:11
Приехал я домой, подключил MT-32pi к Sizif'у и, что-то, не работает оно с максимальной скоростью процессора. В режиме +3, другие пока не пробовал. Определяет скорость правильно, а вот на выходе, похоже, мусор, что-то не совпадает. На 7MHz, вроде, живёт. Анализатор я куда-то засунул, пока посмотреть, что там выходит не могу. В теории на Sizif все частоты процессора поддерживаются?

То же, что и у Эвы - на 14 МГц у Сизифа есть вейтстейты - пропуски тактов грубо говоря. Выход миди сделан согласно заветам Клайва, т.е. ногодрыгом, а значит любые отклонения частоты процессора критичны.

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


Дальше, страницы 1, 3, 4 и 6 тоже (внезапно!) используются +3 DOS для кэша диска и RAM диска. Теоретически и то и другое отключаемо, но освободить (хотя бы частично) страницу 1 мне пока не удалось. 3, 4, 6 -- запросто, а чем затык с 1-й, непонятно.
Так первая и не используется кажись в плеере нигде.

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


И, да, проблема детектирования +3 DOS. Хотя, на мой взгляд, это не проблема. +3 DOS не с чем не совместима, ничего не может быть включено с ней одновременно, поэтому для +3 нужна отдельная сборка. Бонус -- можно не компилировать FAT32 и все интерфейсы для SD.
Не понял почему +3 DOS ни с чем несовместима. +3e вполне может крутиться на IDE/MMC, рядом с FAT32 разделами, разве нет? https://worldofspectrum.org/zxplus3e/sharingdisks.html

Xela
07.06.2024, 20:41
можно не компилировать FAT32 и все интерфейсы для SD.
+3 и DivMMC - не редкая история

Uzix
07.06.2024, 20:42
А вот как в ZX MIDI Player отобразить произвольный набор устройств, я ещё даже и не смотрел.
Как писал в прошлый раз, начинать с disk_change - https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L379
По номеру диска disk_change доступается к элементу массива var_disks.all и подгружает оттуда ряд параметров в var_disk. Так же он вносит в var_disks.current_n номер текущего выбранного диска, а в var_disks.current_ptr - указатель на текущий диск из var_disks.all.
Тип диска определяется по var_disk.driver - если он = 0, то TR-DOS, иначе если старший бит 1 - то IDE, если 0 - то MMC.
Драйвер TR-DOS выбирает номер дисковода исходя из текущего номера диска var_disks.current_n (предполагается, что диски TR-DOS идут всегда первыми - от 0 до 3).
Драйвер IDE (MMC) выборает контроллер (DivIDE, NEMO, SMUC и т.д.) по оставшимся битам var_disk.driver. Притом для IDE самый младший бит - master/slave диск, для MMC - первая/вторая карта.
Нужно будет модифицировать эту схему. Например, для выбора драйвера использовать два старших бита: 00 - TR-DOS, 01 - IDE, 10 - MMC, 11 - +3DOS.

Так же при запуске/переконфигурации нужно, собственно, заполнить var_disks. Делает это disks_init - https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L229 - он же и должен детектировать +3DOS и занести количество найденных дисков в var_disks.count. Вот только в плеере сейчас подразумевается буква диска = 'A' + номер диска в списке, в +3DOS же, насколько знаю, буквы произвольно назначаются - нужно будет переделывать. Буквы дисков фигурируют только при выводе на экран в меню - этим занимается disks_menu_generator - https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L475 . Он дёргается из main_menu_generator нужное количество раз - по количеству дисков var_disks.count. Можно добавить поле с буквой диска в disk_t и доступаться к этому полю из disks_menu_generator.

Chwe
07.06.2024, 23:23
Не понял почему +3 DOS ни с чем несовместима. +3e вполне может крутиться на IDE/MMC, рядом с FAT32 разделами, разве нет? https://worldofspectrum.org/zxplus3e/sharingdisks.html

Да, технически оно не просто может, но именно так у меня и работает (https://zx-pk.ru/threads/32157-sizif-512.html?p=1185163&highlight=#post1185163). Но это именно «рядом», просто, чтобы карту не «пертыкать» постоянно. Смущает то, с тех пор так и не нашёл никаких следов своих предшественников, потому как CF с «настоящими» CHS это не наш вариант, а чтобы кто-то ещё, кроме меня, натянул всю эту конструкцию на современную SD карту, такого я не слышал пока. Может, конечно, я просто этих очень скромных героев пока не нашёл :)

В общем, как детектировать +3 DOS, я придумать не могу -- кто знает, подскажите.


Так первая и не используется кажись в плеере нигде.

Да, именно поэтому я и хотел её использовать для экранов, которые на 7-мую не влезают. Но, пока что-то не выходит. Есть пара идей и, в принципе, так или иначе эта проблема решаема.

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


Как писал в прошлый раз, начинать с disk_change - https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L379

Спасибо огромное, посмотрю. Но, думаю, практически планирую сначала на длинных каталогах сосредоточится, у меня получается по 512 файлов на раздел записать.

Xela
08.06.2024, 10:15
В общем, как детектировать +3 DOS
Надо +3DOS детектировать? или IDEDOS?

Chwe
08.06.2024, 18:03
Надо +3DOS детектировать? или IDEDOS?

А зачем нам кузнец IDEDOS? :) Там же будут ложные срабатывания, не говоря уже о том, что +3 DOS может быть без IDEDOS (тот самый оригинальный +3 с 3" НГМД) или вообще без дисков (+2A, хотя, конечно, это бесполезно для наших нужд). А то и IDEDOS на 48-м попадётся, как, например, у меня на Sizif. Да и +3 DOS хорошо скрывает носитель. Думаю, именно +3 DOS, именно API. Наличие диска уже там можно проверить через API.

Но, мне кажется, детектирование +3 -- оно от лукавого. Просто сделать точку входа и её вызывать из зарузчика для +3 DOS. Тем более, там, похоже, без специального загрузчика не обойтись (см. ниже).

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

С первой страницей удалось разобраться, похоже, изменив конфигурацию кэша и RAM диска. Выходить обратно в BASIC нельзя, откатывает все изменения конфигурации. Наверное, для 80-х это нормально. В общем, теоретически, там можно изыскать место для RLE упакованных экранов и практически оно работает. Правда, за счёт уменьшения кэша. И придётся грузить их из кода. Как уменьшение кэша скажется на производительности, особенно на больших разделах +3e пока не совсем понятно.

Кстати, а если экраны упаковать поплотнее (я их сейчас жму zx0 и получается 3k вместо 9k), их можно вообще «внизу» оставить, там более 4k есть свободных. Но, это усложнит процесс сборки, появятся новые зависимости. Наверное, проще написать специальный загрузчик, чтобы по страницам памяти раскидывал, как для TR-DOS сделано. Там сразу и будет понятно, что +3 DOS и диск есть -- иначе как оно загрузилось-то вообще :)

Посмотрю теперь на большие каталоги +3e, а потом уже и на диски/устройства. Кто может помочь -- пишите, не стесняйтесь :) Буржуи, судя по всему, сами в своей +3 DOS не разбираются, по испански я не говорю, искать Гарри, наверное, пока ещё рано, никаких блокирующих проблем пока не видно.

Uzix
08.06.2024, 18:29
Но, мне кажется, детектирование +3 -- оно от лукавого. Просто сделать точку входа и её вызывать из зарузчика для +3 DOS. Тем более, там, похоже, без специального загрузчика не обойтись (см. ниже).
Для детекта TR-DOS сейчас используется переменная, которая выставляется из TR-DOS загрузчика:
https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/build.asm#L71
И затем она тут проверяется:
https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L234
https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/trdos.asm#L389


Но, это усложнит процесс сборки, появятся новые зависимости.
Сейчас упаковщик RLE выполнен в виде Lua-функции для sjasmplus, если вдруг есть на примете алгоритмы получше в таком же формате и с совместимой лицензией - вообще не вопрос внедрить :) В общем-то и отдельные тулзы можно прикрутить, это просто вопрос вкуса + необходимости.

Chwe
10.06.2024, 22:35
Так же при запуске/переконфигурации нужно, собственно, заполнить var_disks. Делает это disks_init - https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L229 - он же и должен детектировать +3DOS и занести количество найденных дисков в var_disks.count.

Евгений, есть непринципиальный вопрос по disk.asm строка 327 (https://github.com/UzixLS/zx-midiplayer/blob/f6b4a7c141796b3fe85f3bb36a7f29cc68239251/src/disk.asm#L237). Там, когда TRDOS нету, оно делает jr z, .scan_divmmc. В этом глубокий смысл или просто ошибка и должно быть логически напрашивающееся jr z, .scan_divide?

P.S. с буквами +3e разобрался, а вот как этот произвольный набор объединять с другими дисками/разделами в плане UI, пока как-то не вырисовывается.


Что-то я застрял на floppy unit 1, который обычно на «просто +3» на B: назначается. Такое ощущение, что +3e FLAGS3 не обновляет и bit 5 там всякую ересь содержит. Пока приходится дёргать DD ASK 1.

Но, в целом, процесс идёт... 80884

Uzix
11.06.2024, 08:51
В этом глубокий смысл или просто ошибка и должно быть логически напрашивающееся jr z, .scan_divide?
Это ошибка, спасибо что заметили :) Первоначально был другой порядок инициализации

Chwe
12.06.2024, 17:13
Думал, как показывать устройства, в связи с появлением произвольного набора от +3. Пока придумал выводить тип носителя, вроде "DVMMC x", "+3 d", "TRDOS d".


Только, как это потестировать, ума не приложу. Xpeccy я завести не могу, не видит он моих образов дисков. В FUSE ничего, кроме DivMMC/DivIDE, да и те не работают.

https://i.postimg.cc/rdR6Qs2q/zx-midi-devices-ide.png (https://postimg.cc/rdR6Qs2q) https://i.postimg.cc/dhxP2dXW/zx-midi-devices-mix.png (https://postimg.cc/dhxP2dXW) https://i.postimg.cc/f3GGFsMm/zx-midi-devices-mmc.png (https://postimg.cc/f3GGFsMm)


Если есть желающие попробовать, вот «самораспаковывающийся архив СТАРЫЙ (https://mega.nz/file/MbUwkBoR#iXeFByGfacITKHJ6WP7op7sJLNo4K_Voq_NHXwwOc hY)», есть новее, в принципе, сделал всё, что хотел -- НОВАЯ ВЕРСИЯ от 06.14 (https://mega.nz/file/gOkCWRLT#npGMZUm_hrA4Zk7t2qX5mKki2EpE2zZSuFd9r7lJ6 D8) УСТАРЕЛО release candidate (https://mega.nz/file/kesBDBaD#78HgbwxVflXql7Uq9vHSAnIwOd-eTe3fTTRnqBOObSA). Просто загружаете с этой «ленты» и оно запишет всё, что надо, на текущий диск. Потом просто LOAD "MIDI".


1. Запускаем в режиме +3: fuse -m plus3 zx-midi+3.tap
2. «Вставляем» чистую дискету: Media -> Disk -> +3 -> Drive A: -> Insert New...
3. Форматируем её: (+3 BASIC) format "a:"
4. Переключаемся на «ленту»: LOAD "T:"
5. Загружаем всё: LOAD ""
6. Переключаемся обратно на диск: LOAD "A:"
7. Запускаем: LOAD "MIDI"
Если у вас FUSE без моего патча, то это всё, если с моим, то можно закинуть на образ диска MIDI файлов и действительно их послушать :)

Chwe
14.06.2024, 19:35
В принципе, наверное, я всё, о чём мог подумать, реализовал. Теперь можно сделать только две вещи:

1) потестировать: если кто загружал (https://mega.nz/file/gOkCWRLT#npGMZUm_hrA4Zk7t2qX5mKki2EpE2zZSuFd9r7lJ6 D8) УСТАРЕЛО release candidate (https://mega.nz/file/kesBDBaD#78HgbwxVflXql7Uq9vHSAnIwOd-eTe3fTTRnqBOObSA). и запускал -- расскажите
2) code review, если найдутся имеющие желание и возможность -- пишите, что-нибудь придумаем.


Экраны «сжимаются» «штатным» RLE. Грузить теперь обязательно специальным загрузчиком, «распихать» все по нужным страницам памяти из BASIC невозможно.

Устройства master/slave теперь показываются разными буквами: A, B, C, D для разделов на master, E, F, G, H для разделов на slave.

BUG: фалы чуть менее 64k не грузятся, это связано с неправильным рассчетом Kb → b, это затрагивает файлы без PLUS3DOS заголовка (или которые будут точно 65536 байт и больше /8Mb предел-то/, в общем, где младшие два байта длины — 0). Workaround: всегда добавлять PLUS3DOS заголовки. В коде надо поправить а области «guesstimate file size into DE» (plus3dos.asm). Аналогичная проблема с показом, ноги оттуда же, +3 DOS округляет размер (в каталоге) вверх до ближайшего килобайта, поэтому всё, чуть меньше 64K будет иметь размер 65536 — OVERFLOW, 0 :( Кое-что подпёрто палочками и приклеено «Моментом», но, может сломаться опять.

- Весь код надо «причесать».
Q: Начало всего по адресу 0x76d1, это произвольно выбранное место или зачем-то надо именно такой адрес?
- Есть проблема с двумя MMC/IDE устройствами с несколькими разделами, они оба будут отображены как ТИП X, и будет два таких ТИП X. Наверное, правильно добавить устройство перед X. В общем, те счастливчики, у которых есть два устройства на master/slave, пока видят двойной набор дисков с одинаковыми именами.
- Вынести «трамплин» для +3 API в отдельный файл. Этот код нужен в загрузчике и в основной программе.
- Нужен ли перехват фатальных ошибок, Retry/Abort/Cancel? Пока не совсем понятно, что с ними делать и есть ли место для обработки этого. Пока они игнорируются (считаются фатальными).

Магия, объяснения которой я не помню, но оно есть в где-то в документации +3 DOS: стек должен быть ниже 0xbfe0. Иначе оно и правда не работает. Я проверял :) И, вообще, стек сейчас очень близко к концу кода в связи с ростом размера этого кода. Может быть, перенести TR-DOS «вниз», как и +3 DOS? Дисковым «драйверам» же не надо быть в быстрой памяти… Прямо сейчас у меня собирается либо TR-DOS, либо +3 DOS. Одновременно они, вообще, могут в дикой природе встречаться? Я FUSE и с тем и с тем запустить не могу.

Временно используется zx0 сжатие для экранов, потому что это позволяет грузить всё из BASIC без переконфигурации кэша.

Собственно +3 DOS:
- код достаточно сложный, может, можно и упростить, особенно определение длины файла, я там оттянулся
- компиляция «за» параметром DOS_PLUS3, надо добавить -DDOS_PLUS3 при компиляции
- если компилируется вместе с TR-DOS (без правки кода сейчас это невозможно), то всё в страницу памяти не влезает и +3 код автоматически выносится в 0x7000
- вроде, изменение размера кэша и RAM диска позволило хранить RLE экраны в странице 1 (в странице 7 нет для них места, там слишком много занимает +3 DOS)
- для размещения всего в памяти требуется специальный загрузчик, так как обязательна коррекция конфигурации кэша, а после этого нельзя возвращаться в BASIC
- +3 в DISK_DRIVER добавлен как специальный случай, как и TR-DOS

Общие изменения:
- TR-DOS тоже вынесен «за флаг» -- DOS_TRDOS
- в ide.asm пришлось добавить процедуры из trdos.asm, чтобы компилировалось без TR-DOS
- параметры загрузки экранов слегка подправлены для гибкости, используется 1-я страница (можно сделать IFDEF)

Связанные с +3
- в main.asm сделана отдельная точка входа для +3, которая и используется для установки флага «+3 DOS есть». Она вызывается из загрузчика, который работает только под +3 DOS. Таким образом решена проблема детектирования +3.
- +3 DOS явно управляет страницей в 0xc000, но для этого надо знать, какая у нас там сейчас при вызове +3 API. Поэтому все записи в порт 0x7ffd копируются в BANKM, как и положено.
- в disk_t убрано поле _reserv и добавлено поле label
- disk_menu_generator использует label «as is», если там не 0
- определение устройств +3 не в disk.asm а в plus3dos.asm
- disks_menu_generator использует label, если есть, иначе -- номер unit’а
- disks_menu_generator показывает тип устройства (DVMCC, ZXMMC, SMUC, и т. п.) и номер устройства (0, 1) если нет разделов, букву A..D, если раздел есть.
- в settings.asm написан код для сохранения под +3. Magic выкинут, не думаю, что он критичен для +3. Сейчас у меня можно скомпилировать и без TR-DOS и без +3, но этот случай в settings.asm пока не предусмотрен.

Напрямую не связанные с +3:
- появился DISK_DRIVER_NOFS_MASK для упрощения показа типа устройства
- соответственно, disk_scan_filesystems добавляет в label «-», если не удалось найти файловой системы

Собственно патч, накатывать поверх f6b4a7c141796b3fe85f3bb36a7f29cc68239251.



Upd: 2024-06-16 -
https://dai.ly/x90fsgg

Всё, финальная версия. Нужен code review и тестирование, добавлять что-либо я не больше не планирую. Так сказать, release candidate (https://mega.nz/file/kesBDBaD#78HgbwxVflXql7Uq9vHSAnIwOd-eTe3fTTRnqBOObSA). Там всё разом DSK, TAP, который самораспаковывающийся, и patch. Быстро просмотреть — загрузить DSK в любом эмуляторе. Что думаю изменить после тестирования: сменить маску файлов для показа с *.* на *.mid. А, да, будете записывать свои файлы, категорически рекомендую добавлять к ним PLUS3DOS заголовки. Это сильно помогает, когда файл больше 63K.

Chwe
11.10.2024, 19:38
Дошли до меня слухи из славного города Багдада, что запилили поддержку UART для ZX Spectrum Next. Я посидел пару вечеров и в ZEsarUX оно у меня стало запускаться. Говорят, даже и на настоящем Next работает. Я код ещё заполирую и, если получится, после выходных выложу.

Это я к чему пишу, если у кого есть Next, возможность и желание всё это потестировать -- дайте знать. Да, нужен не просто Next, а Next и что-то, что может читать с его DB-9 порта (например, USB UART, amidicat и Qsynth -- у меня эта связка работает с Sizif, не вижу причин, почему бы оно не работало с Next).

Chwe
14.10.2024, 18:31
В связи с возникшим интересом к портированию кода на Next (https://www.specnext.com/forum/viewtopic.php?t=2556) группой безответственных товарищей было принято решение организовать телеграм канал, тфу ты. В общем, на выходных сделали совместными усилиями две вещи:

- +3(e) DOS код был допилен до совместимости с ZX Spectrum Next. Да, Next оказался не совсем обратно совместимым с классическим +3. Некоторые упрощения там не работают. В рамках спецификации всё чётко и совместимо, но была, оказывается, тонкость...
- нашим юнгой был написан отдельный код для поддержки только Next, без полноценного +3(e), чтобы всё в 16k влезало. Ну, нам это не нужно :)

Патч приложен, накатывать поверх текущего HEAD (2c7939a на момент написания, 2024-10-13). Проверено минимум на двух Next и у меня на Sizif и FUSE. Кто может/хочет ещё потестировать -- присоединяйтесь! А, да, Next поддержка в патче перепилена с учётом последнего слова науки и техники (у товарища Скотта был прямолинейный подход, а тут с фантазией).

81406 УСТАРЕЛО, см gitflic ссылку ниже

Upd: 2024-10-19

В связи с появлением аж двух пользователей Next считаю успешно допиленной поддержку +3, так как она была протестирована вышеупомянутыми. Распоследний код доступен на gitflic (https://gitflic.ru/project/chwe/zx-midiplayer?branch=dev-plus3-rc2) и, говорят, даже кто-то его смог собрать. «У меня всё работает». Правда, Next у меня, конечно, нет. Наверное, поэтому и работает :)


+3 DOS: make clean all 'OPTS=-DDOS_PLUS3'
Next: make clean all 'OPTS=-DDOS_PLUS3 -DDOS_NEXTZXOS'



1. Scott-Falk в своём «драйвере» UART для Next явно проверяет идентификатор модели «зашитый» в FPGA. Мне такой подход не нравится, а если у пользователя вообще не клон Next? Тогда считываться будет знаменитая плавающая шина данных и задетектировать можно что угодно. Или я ошибаюсь? Да и не нужна там проверка модели…
2. Next требует отдельной сборки. Исторически всё собиралось в образ TR-DOS, потом добавили образ +3 (который уже не совсем то, что пользователи ждут). А вот для Next пользователи точно ждут ZIP с отдельными файлами внутри. Там есть ещё формат NEX, но, как я понимаю, это тупо «слепок» памяти, который НЕ совместим с использованием +3 DOS API. Или не так?

Исходя из вышеперечисленного я предлагаю:
1. Сделать отдельную сборку для Next — Сделано, другим способом и нельзя.
2. Таки проверять Next (Z80N) это «вообще», а только потом смотреть на модель, если вообще нужно смотреть на модель.
3. При возможности вынести из сборки Next всё, чего там быть не может.


P.S. Кому интересно, попутно нашли багофичу в ZX Next OS. Читайте в ближайшем будущем на SC...

Chwe
20.10.2024, 19:57
После того, как я услышал, что «на Next всё работает», я попросил показать экран Help (это на Next KS2, VGA0):
https://i.postimg.cc/LnWvT5jL/ZXMP-Next.png (https://postimg.cc/LnWvT5jL)

Вопрос: там это только эстетическая проблема или нет? Быстрый поиск по коду показывает, что в smf.asm используется us_per_int. Как его рассчитать, я, кажется, придумать могу, а вот как остальные параметры измерить/рассчитать, учитывая какую-то безумную сложность видео (https://wiki.specnext.dev/Reference_machines) на этом Next… Я бы им рассказал, как что измерить, если бы сам понимал…

Или «на скорость не влияет»?


Если раскомментировать код после метки «debug» в device.asm, то оно выводит следующее: 4C660400. При этом 4c66 явно сильно меньше первой 28 МГц записи в таблице device_t (там первая 5ef5+10). Хотя Next заявлен как 128/+2A/+3.

Uzix
20.10.2024, 20:09
Chwe, судя по картинке - на 28 МГц процессор у некста работает с вейтами - вывод миди потока через AY работать не будет, в остальном проблем не вызовет.

Chwe
21.10.2024, 20:05
вывод миди потока через AY работать не будет, в остальном проблем не вызовет.

Ну, у них там в Next аппаратный UART (тактовый сигнал которого, почему-то, зависит от частоты кадров, ну, им так проще, наверное), поэтому «на скорость не влияет» буквально :)

Debosh
02.11.2024, 10:11
Здравствуйте, Евгений. Подскажите. Планируется поддержка плейером файловой системы FAT16?

Uzix
02.11.2024, 10:20
Debosh, FAT16 не планируется