![]() |
|
:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №32 (10.10.2009) Просмотров: 8133
![]() Автор: Вадим Акимов / LVD. Рубрика: Железо. Номер: №32 (10.10.2009). NeoGS – шаг в будущееГруппа NedoPC запустила в производство качественно новое звуковое устройство для вашего Спектрума – NeoGS. Данная карта программно совместима со старой картой General Sound (в дальнейшем oldGS), однако предлагает значительно улучшенные и практически неограниченные (при соответственном программировании) возможности. В данной статье кратко описывается потенциал NeoGS.Итак, что же такое NeoGS? Это звуковая карта, основанная (как и oldGS) на процессоре Z80. Однако, на этом вся схожесть заканчивается. Истинным сердцем NeoGS является ПЛИС (программируемая логическая интегральная схема - она же FPGA – field programmable gate array), содержащая в себе 1728 логических ячеек (одна такая ячейка выполняет произвольную четырёхвходовую логическую функцию и может содержать на выходе триггер) и 3 килобайта синхронного ОЗУ, выполненного блоками по 4 килобита (512 байт). Конечно, по современным меркам ёмкость FPGA весьма скромна, однако и такая ёмкость ограничивает потенциальные возможности NeoGS лишь принципиальной схемой и фантазией разработчика. Помимо ПЛИС, NeoGS также содержит: - процессор Z80, работающий на частотах до 24 Мгц - 512 килобайт flash-ПЗУ - 2 мегабайта статического ОЗУ - 16-битный стереоаудио ЦАП типа TDA1543 - слот SD-карты - аппаратный (в виде отдельной м/сх) MP3-декодер - аналог VS1001 или VS1011. Прошивка в FPGA (загружаемая при каждом включении или холодном сбросе) превращает сборище микросхем в звуковую карту NeoGS, выполняющую на данный момент следующие функции: - полная программная совместимость с oldGS; - адресация памяти вплоть до 2 мегабайт ОЗУ и 512 килобайт ПЗУ страничным методом: страницами по 32 килобайта в одном окне (как в oldGS) или двумя страницами по 16 килобайт одновременно в двух окнах; - эмуляция ПЗУ oldGS при помощи аппаратной защиты от записи нулевой страницы. - поддержка 4 каналов семплированного звука (как в oldGS), а также новых режимов: 8 каналов звука и 4 каналов звука с двумя громкостями; - управление частотой процессора Z80 (10, 12, 20 и 24 Мгц); - дополнительные возможности контроля NeoGS со стороны Спектрума: тёплый сброс, выдача NMI и управление светодиодом на плате (полезно при отладке программ); - аппаратные SPI-интерфейсы с SD-картой и MP3-декодером. Кроме того, предусмотрены штатные программные средства перезагрузки прошивки ПЛИС. В настоящее время ведутся работы над DMA (к моменту сборки номера стало известно, что тестовая прошивка NeoGS с поддержкой DMA создана и проходит тестирование - прим. ред.), который позволит: - быстрое копирование данных со Спектрума или на Спектрум (Спектрум пишет или читает данные для NeoGS в область ПЗУ, обмен с памятью NeoGS происходит средствами DMA независимо от процессора NeoGS); - обмен данными с SD-картой и MP3-декодером независимо от процессора NeoGS; - вывод семплированного звука через DMA. Кроме того, разрабатывается контроллер прерываний для NeoGS, который позволит: - иметь прерывания от программируемых таймеров; - иметь прерывания от командного интерфейса со Спектрумом (нет необходимости в «поллинге» портов обмена со стороны NeoGS); - иметь прерывания по окончании чтения или записи сектора на SD-карту. Данная статья нисколько не пытается предоставить техническую информацию по программированию NeoGS. В настоящее время готовится руководство программиста, которое будет доступно на сайте http://www.nedopc.com. Однако исключительно для иллюстрации некоторых возможностей NeoGS здесь приводится исходный код простейшего MP3-плеера на NeoGS, играющего MP3-поток с SD-карты. Предполагается, что MP3-файл записан на SD-карту без файловой системы с нулевого сектора. Запись можно осуществить утилитой dd в линуксе или же программой WinHEX в Windows (ими же можно сделать резервную копию всей SD-карты). В исходном коде предполагается использование файла «ports.inc», содержащего символические обозначения для всех внутренних портов NeoGS и битовых полей этих портов, а также обозначения портов NeoGS, доступных со стороны Спектрума. Данный файл также будет доступен на сайте http://www.nedopc.com вместе с руководством программиста. Примечание: политика NedoPC в отношении руководства программиста и исходных кодов для NeoGS состоит в использовании исключительно символических имён портов и битовых полей, в противовес документации на oldGS. Плеер состоит из двух частей: кода, работающего на NeoGS (как загрузить и запустить этот код в NeoGS, следует читать в руководстве к стандартной прошивке gs105a.rom, которая использовалась в oldGS и под управлением которой работает процессор NeoGS по умолчанию), и кода, работающего на Спектруме, который и осуществляет все функции плеера, кроме непосредственно копирования данных с SD-карты в MP3-декодер. Исходник кода в NeoGS: ORG #5B00
DI
;устанавливаем частоту процессора 12 МГц
IN A,(GSCFG0)
AND #FF-M_CKSEL1-M_CKSEL0
OR C_12MHZ
OUT (GSCFG0),A
MAINLOOP IN A,(CLRCBIT) ;очищаем COMMAND BIT
WAITCOMMAND IN A,(ZXSTAT) ;ждем, когда Спектрум запишет команду
AND M_CBIT
JR Z,WAITCOMMAND
IN A,(ZXCMD) ;читаем команду
CP #FF
JR Z,MOVMP3 ;копирование 512 байт из SD-карты в MP3-декодер
RLCA
SRL A
JR C,PREAD ;старший бит=1 - чтение порта для Cпектрума
;старший бит=0 - запись в порт
PWRITE LD C,A ;биты 6-0 - адрес порта
IN A,(ZXDATRD) ;данные для записи
OUT (C),A
JR MAINLOOP
PREAD LD C,A
IN A,(C) ;читаем указанный порт
OUT (ZXDATWR),A ;отправляем спеку байт
JR MAINLOOP
MOVMP3 LD D,16
SECLOOP IN A,(SSTAT) ;ждем готовности MP3-декодера
AND M_MDDRQ ;принять данные
JR Z,SECLOOP
LD B,32 ;шлем по 32 байта
LD C,MD_SEND
BYTELOOP LD A,#FF ;инициируем обмен по SPI с SD-картой
OUT (SD_SEND),A ;(в карту уходит холостой байт #FF)
NOP ;пауза - >=16 тактов для обмена по SPI
NOP
IN A,(SD_READ) ;читаем принятые данные
OUT (MD_SEND),A ;отсылаем в MP3-декодер
DJNZ BYTELOOP
DEC D
JR NZ,SECLOOP
JR MAINLOOP
Исходник кода для Спектрума (для понимания рекомендуется изучения datasheet’ов на VS1001 и SD-карты):
ORG #8000
CALL I_MP3 ;инициализация MP3-декодера
CALL I_SDC ;инициализациз SD-карты
CALL PLAYMP3 ;проигрывание
CALL DEI_SDC ;деинициализация SD-карты
EI
RET
RDSECBEG LD HL,CMD17
CALL SENDCMD
CMDOK2 LD A,#FF
LD C,SD_SEND
CALL WRPORT
LD C,SD_READ
CALL RDPORT
CP #FE
JR NZ,CMDOK2
RET
RDSECEND LD A,#FF
LD C,SD_SEND
CALL WRPORT
CALL WRPORT
CALL WFF
LD HL,CMD17+3
INC (HL)
INC (HL)
RET NZ
DEC HL
INC (HL)
RET NZ
DEC HL
INC (HL)
RET
WRPORT OUT (GSDAT),A ;write GS port: OUT (C),A
PUSH AF
LD A,C
AND #7F
OUT (GSCOM),A
IN A,(GSSTAT)
RRA
JR C,$-3
POP AF
RET
RDPORT ;read GS port: IN A,(C)
LD A,C
OR #80
OUT (GSCOM),A
IN A,(GSSTAT)
RRA
JR C,$-3
IN A,(GSDAT)
RET
SENDCMD LD B,6
SCMDL LD A,(HL)
LD C,SD_SEND
CALL WRPORT
CALL RDPORT
INC HL
DJNZ SCMDL
RET
CMD0 DB #40,0,0,0,0,#95
CMD1 DB #41,0,0,0,0,#FF
CMD17 DB #51,0,0,000,0,#FF
I_MP3 LD C,GSCFG0
LD A,C_10MHZ
CALL WRPORT ;частота процессора в NeoGS 10 MHz
LD C,SCTRL
LD A,M_MPXRS ;вкл. сигнал сброса на MP3-декодер
CALL WRPORT
LD C,SCTRL ;выкл. сброс
LD A,M_SETNCLR+M_MPXRS
CALL WRPORT
HALT
HALT
WDRQ1 LD C,SSTAT
CALL RDPORT
AND M_MDDRQ
JR Z,WDRQ1 ;ждем готожности MP3-декодера
;информируем декодер о частоте кварца и включаем умножитель
;9B58 for 14MHz
LD C,SCTRL
LD A,M_MCNCS
CALL WRPORT ;CS=0 на SPI-интерфейс декодера
LD C,MC_SEND ;шлем 4 байта
LD A,2
CALL WRPORT
LD A,3
CALL WRPORT
LD A,#9B
CALL WRPORT
LD A,#58
CALL WRPORT
LD C,SCTRL
LD A,M_SETNCLR+M_MCNCS ;CS=1
CALL WRPORT
HALT
LD C,SCTRL
LD A,M_MCNCS
CALL WRPORT ;CS=0
LD C,MC_SEND
LD A,2
CALL WRPORT
LD A,2
CALL WRPORT
LD A,#80 ;включаем умножитель
CALL WRPORT ;(см. аппноты на VS1001)
LD A,#08
CALL WRPORT
LD C,SCTRL
LD A,M_SETNCLR+M_MCNCS
CALL WRPORT
HALT
LD C,GSCFG0
LD A,C_12MHZ ;проц. Обратно на 12 МГц
CALL WRPORT
RET
I_SDC LD HL,CMD17+1
LD (HL),0
INC HL
LD (HL),0
INC HL
LD (HL),0
LD C,SCTRL
LD A,M_SETNCLR+M_SDNCS ;SD CS=1
CALL WRPORT
LD B,74
FFLO LD C,SD_SEND ;шлем много FF’ов в карту при
LD A,#FF ;снятом CS’е
CALL WRPORT
DJNZ FFLO
LD C,SCTRL
LD A,M_SDNCS ;SD CS=0
CALL WRPORT
;начинаем обмен с картой с инициализации
LD HL,CMD0
CALL SENDCMD
WAIKARD LD C,SD_SEND
LD A,#FF
CALL WRPORT
LD C,SD_READ
CALL RDPORT
DEC A
JR NZ,WAIKARD
WAINIT CALL WFF
LD HL,CMD1
CALL SENDCMD
WNOTFF LD C,SD_SEND
LD A,#FF
CALL WRPORT
LD C,SD_READ
CALL RDPORT
CP #FF
JR Z,WNOTFF
RRA
JR C,WAINIT
CALL WFF
RET
DEI_SDC LD A,M_SETNCRL+M_SDNCS ;SD CS=1
LD C,SCTRL
CALL WRPORT
LD A,#FF
LD C,SD_SEND
CALL WRPORT
RET
PLAYMP3 ;тут играем MP3-файл с нулевого сектора из карты
CALL RDSECBEG ;начинаем чтение сектора
LD A,#FF ;даем команду коду в NeoGS
OUT (GSCOM),A ;на пересылку 512 байт сектора
IN A,(GSSTAT) ;в MP3-декодер
RRA
JR C,$-3
CALL RDSECEND ;заключительные операции чтения и инкремент
;номера сектора
LD DE,#4000 ;печать адреса (номер сектора*512)
LD A,(CMD17+1)
CALL PRIHEX
LD A,(CMD17+2)
CALL PRIHEX
LD A,(CMD17+3)
CALL PRIHEX
LD A,(CMD17+4)
CALL PRIHEX
LD A,#7F
IN A,(#FE)
RRA
JR C,PLAYMP3
RET
WFF LD C,SD_SEND
LD A,#FF
CALL WRPORT
LD C,SD_READ
CALL RDPORT
INC A
JR NZ,WFF
RET
PRIHEX ;hex from A
PUSH AF
RRA
RRA
RRA
RRA
CALL PHC
POP AF
PHC AND #0F
CP 10
JR C,PH_2
ADD A,”A”-”0”-10
PH_2 ADD A,”0”
CALL PRISYM
RET
PRISYM ;A - sym
;DE - scr addr (inc E)
PUSH HL
ADD A,A
LD L,A
LD H,#0F
ADD HL,HL
ADD HL,HL
;LD BC,#3C00
;ADD HL,BC
PUSH DE
;----
DUP 8 ;повторение фрагмента 8 раз
LD A,(HL)
LD (DE),A
INC L
INC D
EDUP
;----
ORG $-2
POP DE
INC E
POP HL
RETЗвуковая картa NeoGS – технически сложное устройство, требующее для успешного применения большое количество работы помимо просто сборки платы, в частности написания софта (плееры, прошивки FPGA) и описаний (руководство программиста). Кроме того, группа NedoPC придерживается идеологии open-source, и на все устройства, производимые группой, доступны исходные коды прошивок, схемы и печатные платы в CAD-форматах. Данный материал для NeoGS готовится к публикации и будет доступен в ближайшее время на http://www.nedopc.com. Кроме того, работа над прошивками постоянно продолжается, и постепенно добавляются новые возможности, такие как, например, DMA и контроллер прерываний. Следите за обновлениями на нашем сайте. |