![]() |
:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №32 (10.10.2009) Просмотров: 7739
![]() Автор: Вадим Акимов / 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 и контроллер прерываний. Следите за обновлениями на нашем сайте. |