; LAST UPDATE: 22.11.2025 savelij
;ПОСТАВЛЯЕТСЯ КАК ЕСТЬ ИЗ КОМПЛЕКТА FATALL
;ПЕРЕД ИСПОЛЬЗОВАНИЕ ВЗБОЛТАТЬ, В СМЫСЛЕ ОБЯЗАТЕЛЕН ВЫЗОВ УСТАНОВЩИКА
;НГС СБРАСЫВАЕТСЯ И ИНИТИТСЯ ПОЛНОСТЬЮ ВО ИЗБЕЖАНИЕ ЭКСЦЕССОВ И ПРАВИЛЬНОГО КОНФИГА НГС СД ИНТЕРФЕЙСА
;ПОСЛЕ УСТАНОВКИ ДРАЙВЕРА ОСТАЛЬНЫЕ ФУНКЦИИ НГС НЕ БЛОКИРУЮТСЯ
;ВЫЗЫВАТЬ УСТАНОВЩИК ПО ИМЕНИ INSTSDD
;САМ ДРАЙВЕР ВЫЗЫВАТЬ ЧЕРЕЗ RD_WR
;ПЕРЕД ПЕРВЫМ ВЫЗОВОМ И ДЛЯ НОВОЙ КАРТЫ ИНИТИТЬ ОБЯЗАТЕЛЬНО
;ПРИМЕР ИСПОЛЬЗОВАНИЯ
; CALL INSTSDD ;УСТАНОВКА ДРАЙВЕРА
; CALL RD_WR
; DB 0 ;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
; LD HL,0X8000
; LD BC,0
; LD DE,0
; CALL RD_WR
; DB 2 ;ЧИТАТЬ 1 СЕКТОР НОМЕР 0 В ПАМЯТЬ
; LD HL,0X9000
; LD BC,0
; LD DE,5
; LD A,3
; CALL RD_WR
; DB 3 ;ЧИТАТЬ 3 СЕКТОРА С НОМЕРА 5 В ПАМЯТЬ
;АНАЛОГИЧНО ДЛЯ ЗАПИСИ ЧИСЛО ПОСЛЕ CALL ДОЛЖНО БЫТЬ 4 ИЛИ 5 СООТВЕТСВЕННО
;АДРЕС ЦИКЛА ОБЩЕНИЯ СО СПЕКОМ
COMINT_ EQU 0X026E
;АДРЕС УСТАНОВЩИКА ДРАЙВЕРА НА NeoGS
SETUPSD EQU 0X5B00
;ДРАЙВЕР SD-CARD ДЛЯ NGS
;Входные параметры общие:
;HL-адрес загрузки в память
;BCDE-32-х битный номер сектора
;A-количество блоков (блок=512 байт)
;только для многоблочной записи/чтении
;Ошибки выдаваемые на выходе:
;A=0-инициализация прошла успешно
;A=1-карта не найдена или не ответила
; ============= код на спеке ==============
;ЗДЕСЬ ВЫЗЫВАТЬ ДЛЯ ЧТЕНИЯ/ЗАПИСИ, ИМЯ МЕТКИ ПО ВКУСУ
;RD_WR
START_COMSDG
; PHASE ADR_DRIVER
EX AF,AF'
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
ADD A,A
PUSH HL
LD HL,NGSSDT
ADD A,L
LD L,A
LD A,0
ADC A,H
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX AF,AF'
EX (SP),HL
RET
NGSSDT DW GSDINIT ; 00 ИНИТ SD КАРТЫ
DW GSDOFF ; 01 ОТКЛЮЧЕНИЕ SD КАРТЫ
DW SDRDSIN ; 02 ЧИТАТЬ 1 СЕКТОР
DW SDRDMUL ; 03 ЧИТАТЬ "A" СЕКТОРОВ
DW SDWRSIN ; 04 ПИСАТЬ 1 СЕКТОР
DW SDWRMUL ; 05 ПИСАТЬ "A" СЕКТОРОВ
DW GETMP3TYPE ; 06
;ЗАПИСЬ "A" СЕКТОРОВ
SDWRMUL EX AF,AF'
LD A,5
JR SDWRSN3
;ЗАПИСЬ ОДНОГО СЕКТОРА
SDWRSIN LD A,1
EX AF,AF'
LD A,4
SDWRSN3 CALL COMM2SD
EX AF,AF'
PUSH DE
PUSH BC
LD BC,GSDAT
SDWRSN1 EX AF,AF'
OUT (GSCOM),A
CALL WC_
LD DE,0X0200
SDWRSN2 OUTI
CALL WD_
DEC DE
LD A,D
OR E
JR NZ,SDWRSN2
EX AF,AF'
DEC A
JR NZ,SDWRSN1
CALL WN_
IN A,(C)
CP 0X77
JR NZ,$-4
POP BC
POP DE
XOR A
RET
;ЧТЕНИЕ "A" СЕКТОРОВ
SDRDMUL EX AF,AF'
LD A,3
JR SDRDSN3
;ЧТЕНИЕ ОДНОГО СЕКТОРА
SDRDSIN LD A,1
EX AF,AF'
LD A,2
SDRDSN3 CALL COMM2SD
EX AF,AF'
PUSH DE
PUSH BC
LD BC,GSDAT
SDRDSN1 EX AF,AF'
OUT (GSCOM),A
CALL WC_
LD DE,0X0200
SDRDSN2 CALL WN_
INI
DEC DE
LD A,D
OR E
JR NZ,SDRDSN2
EX AF,AF'
DEC A
JR NZ,SDRDSN1
CALL WN_
IN A,(C)
CP 0X77
JR NZ,$-4
POP BC
POP DE
XOR A
RET
GETMP3TYPE LD A,6
CALL COMM2SD
LD BC,GSDAT
LD A,0x77
OUT (GSCOM),A
CALL WN_
IN A,(C)
EX AF,AF'
.L1 IN A,(C)
CP 0X77
JR NZ,.L1
EX AF,AF'
RET
;ОТКЛЮЧЕНИЕ ВЫБОРА КАРТОЧКИ
GSDOFF LD A,1
JR GSDINIT.L1
;ИНИЦИАЛИЗАЦИЯ КАРТОЧКИ
GSDINIT XOR A
.L1 CALL COMM2SD
CALL WN_
IN A,(GSDAT)
CP 0X77
LD A,1
RET NZ
XOR A
RET
;ПЕРЕДАТЧИК КОМАНД/ПАРАМЕТРОВ В ДРАЙВЕР НА NeoGS
COMM2SD OUT (GSDAT),A ;УШЛА КОМАНДА ДРАЙВЕРУ
LD A,0X1E
OUT (GSCOM),A
CALL WC_ ;УШЛА КОМАНДА ПРОШИВКЕ
LD A,B
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 31-24 ПАРАМЕТРОВ
LD A,C
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 23-16 ПАРАМЕТРОВ
LD A,D
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 15-8 ПАРАМЕТРОВ
LD A,E
OUT (GSDAT),A
CALL WD_ ;УШЛИ БИТЫ 7-0 ПАРАМЕТРОВ
EX AF,AF'
OUT (GSDAT),A
EX AF,AF'
DUPL 9,0
RET ;УШЛО КОЛ-ВО СЕКТОРОВ
;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
WD_ IN A,(GSCOM)
RLA
JR C,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
WN_ IN A,(GSCOM)
RLA
JR NC,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
WC_ IN A,(GSCOM)
RRA
JR C,$-3
RET
; DEPHASE
END_COMSDG
;УСТАНОВЩИК ДРАЙВЕРА НА NeoGS
INSTSDD LD BC,GSDAT
IN A,(C)
LD DE,UKLAD3 - UKLAD1 ; размер заливки
LD HL,SETUPSD ; адрес заливки
OUT (C),E
LD A,0X14
OUT (GSCOM),A
CALL WC__
OUT (C),D
CALL WD__
OUT (C),L
CALL WD__
OUT (C),H
CALL WD__
LD HL,UKLAD1
ISDD3 OUTI
CALL WD__
DEC DE
LD A,D
OR E
JR NZ,ISDD3
LD HL,SETUPSD
OUT (C),L
LD A,0X13
OUT (GSCOM),A
CALL WC__
OUT (C),H
EI
HALT
HALT
DI
IN A,(GSDAT)
CP 0X77
LD A,1
RET NZ
XOR A
RET
;ОЖИДАНИЕ КОГДА NeoGS БАЙТ ЗАБЕРЕТ
WD__ IN A,(GSCOM)
RLA
JR C,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS ДАСТ БАЙТ
WN__ IN A,(GSCOM)
RLA
JR NC,$-3
RET
;ОЖИДАНИЕ КОГДА NeoGS КОМАНДУ ЗАБЕРЕТ
WC__ IN A,(GSCOM)
RRA
JR C,$-3
RET
; ============== код на нгс =================
INIT_VAR 0x4168
SETVAR MP3_CHIP_TYPE, BYTE
UKLAD1 ;ОТКУДА КОД НА НГС ЗАКИДЫВАТЬ
PHASE SETUPSD
;САМ УСТАНОВЩИК ДРАЙВЕРА ДЛЯ NeoGS
DI
LD A,0X9C
OUT (SCTRL),A ;КОНФИГУРАТОР NeoGS
CALL AVTODET
AND A
LD A,0X77 ;0X77-NeoGS НАЙДЕН
JR Z,$+4
LD A,0XCC ;0XCC-НАЙДЕН OLDGS
OUT (ZXDATWR),A
OUT (CLRCBIT),A
JP NZ,COMINT_
DI
IN A,(GSCFG0)
RES B_RAMRO,A
OUT (GSCFG0),A
LD HL,0X1D00
LD (0X0300+(0X1E*2)),HL
LD DE,UKLAD2
LD BC,GSDDRVE-GSDDRV
EX DE,HL
LDIR
IN A,(GSCFG0)
SET B_RAMRO,A
OUT (GSCFG0),A
JP COMINT_
;ПРОВЕРКА ЧТО ЭТО NeoGS И ВКЛЮЧЕНИЕ ЧАСТОТЫ 24MHz
AVTODET IN A,(GSCFG0)
AND 0XCF
OUT (GSCFG0),A ;ОБРАТНАЯ ЗАПИСЬ В ПОРТ СО СБРОШЕННЫМИ
;БИТАМИ 5-4 ВКЛЮЧАЕТ ЧАСТОТУ ПРОЦЕССОРА РАВНЫМ 24 МГц
LD D,A
IN A,(GSCFG0)
CP D
LD A,0
RET Z
DEC A
RET
UKLAD2 ;ОТКУДА КОД ПЕРЕКИДЫВАТЬ
DEPHASE
PHASE 0X1D00
;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С
GSDDRV DI
IN A,(ZXDATRD) ;ПРИЕМ КОМАНДЫ ДРАЙВЕРА
OUT (CLRCBIT),A ;СБРОС COMANDBIT
LD HL,COMINT_
PUSH HL
ADD A,A
LD E,A
LD D,0
LD HL,TABLSDG
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 31-24 ПАРАМЕТРА
LD B,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 23-16 ПАРАМЕТРА
LD C,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 15-8 ПАРАМЕТРА
LD D,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ БИТОВ 7-0 ПАРАМЕТРА
LD E,A
CALL WDY
IN A,(ZXDATRD) ;ПРИЕМ КОЛ-ВО СЕКТОРОВ
JP (HL)
TABLSDG DW SDINITG ; 00 ПАРАМЕТРОВ НЕ ТРЕБУЕТ, НА ВЫХОДЕ A
; СМОТРИ ВЫШЕ ПЕРВЫЕ 2 ЗНАЧЕНИЯ
DW SDOFFG ; 01 ПРОСТО СНЯТИЕ ВЫБОРА SD КАРТЫ
DW RDSING ; 02 ЧИТАТЬ 1 СЕКТОР
DW RDMULG ; 03 ЧИТАТЬ "A" СЕКТОРОВ
DW OK_WORK;WRSING ; 04 ПИСАТЬ 1 СЕКТОР
DW OK_WORK;WRMULG ; 05 ПИСАТЬ "A" СЕКТОРОВ
DW GET_CHIPTYPE ; 06
GET_CHIPTYPE CALL HARDMP3
.L1 IN A,(ZXSTAT)
RRA
JR NC,.L1
OUT (CLRCBIT),A
LD A,(MP3_CHIP_TYPE)
OUT (ZXDATWR),A
CALL WDN
JP OK_WORK
FREQNC LD A,E
LD D,C_10MHZ ; 0x30
AND 3
JR Z,.L1
LD D,C_12MHZ ; 0x10
DEC A
JR Z,.L1
LD D,C_20MHZ ; 0x20
DEC A
JR Z,.L1
LD D,C_24MHZ ; 0
.L1 IN A,(GSCFG0)
AND %11001111
OR D
OUT (GSCFG0),A
RET
; полный сброс
HARDMP3
; CALL VOL_MOD ; заглушили громкость портов GS
LD BC,MC_SEND
LD A,%10011100 ; 0x9C
OUT (SCTRL),A
LD E,0
CALL FREQNC ; выставили частоту на NGS 10 МГц
LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
CALL COM_MP3
LD A,M_MPXRS
OUT (SCTRL),A
CALL NOPER
LD A,M_MPXRS + M_SNCLR ; 0x84
OUT (SCTRL),A ; выдали сброс на декодер
; CALL DRQVS
CALL SET_CLOCKF
CALL RTYPEVS
LD A,(MP3_CHIP_TYPE)
PUSH AF
CP VS1001
LD HL,VS10XX_WRITE << 8 + SCI_BASS; 0x0202
LD DE,%1000000000001000 ; 0x8008
CALL Z,COM_MP3 ; для VS1001 запись недокументированного пинка в
; недокументированный регистр, если
; биты 7-4 регистра статуса в нуле
LD HL,VS10XX_WRITE << 8 + SCI_MODE
LD DE,0
CALL COM_MP3
POP AF
CP VS1001
JR Z,.L1
LD HL,VS10XX_WRITE << 8 + SCI_AIADDR
LD DE,0
CALL COM_MP3
.L1 LD E,0
JP FREQNC ; выставили частоту на NGS 10 МГц
; определение установленного чипа
RTYPEVS LD HL,VS10XX_READ << 8 + SCI_STATUS
CALL COM_MP3
LD A,E ; нас интересуют биты 7-4 из регистра статуса
AND SCISTATUS.M_SS_VER
RRCA
RRCA
RRCA
RRCA
LD (MP3_CHIP_TYPE),A ; тип установленного MP3 чипа
RET
; SS_VER в битах 7-4
TABL_CLOCK DW 0x8000 + (14000000 / 2000) ; 0 for VS1001 (MA8201) 9B58
DW 0x8000 + (14000000 / 2000) ; 1 for VS1011 (MA8201A) 9B58
DW 0 ; 2 for VS1002 ; не поддерживается, не проверялся
DW SC_MULT4 | SC_ADD3 | 1500 ; 3 for VS1003
DW SC_MULT4 | SC_ADD1 | 1500 ; 4 for VS1053 and VS8053 ; пока не доделан
DW 0 ; 5 for VS1033 ; не поддерживается, не проверялся
DW SC_MULT4 | SC_ADD1 | 1500 ; 6 for VS1063 ; пока не доделан
DW 0 ; 7 for VS1103 ; не поддерживается, не проверялся
; установка частоты MP3 чипа
SET_CLOCKF LD A,(MP3_CHIP_TYPE)
ADD A,A
ADD A,LOW (TABL_CLOCK)
LD L,A
ADC A,HIGH (TABL_CLOCK)
SUB L
LD H,A
LD E,(HL)
INC HL
LD D,(HL)
LD HL,VS10XX_WRITE << 8 + SCI_CLOCKF;0x0202
CALL COM_MP3 ; установка частоты для декодера
; ожидание готовности MP3 декодера
DRQVS IN A,(SSTAT)
RRA ; B_MDDRQ
JR NC,DRQVS ; дождались готовности декодера
RET
; процедура чтения/записи адресов MP3 декодера
; H - команда декодеру 3-READ или 2-WRITE
; L - адрес в декодере
; D - старший байт
; E - младший байт
; DE по записи подать на вход
; по чтению получить на выходе
COM_MP3 CALL DRQVS
LD A,M_MCNCS
OUT (SCTRL),A ; выбираем декодер и объясняем ему, что от него требуется
CALL NOPER
LD BC,MC_SEND
LD A,H
OUT (C),H
CALL NOPER
OUT (C),L
CALL NOPER
CP VS10XX_READ
JR Z,MP3READ ; переходим на чтение (смотри выше)
OUT (C),D
CALL NOPER
OUT (C),E ; записали в адрес декодера
MP3_END
; CALL NOPER
CALL DRQVS
LD A,M_MCNCS + M_SNCLR ; 0x82 снимаем выбор декодера
OUT (SCTRL),A
RET
; ожидание готовности SPI MP3 чипа
NOPER
REPT 18
NOP
ENDM
RET
; читаем что затребовали
MP3READ LD BC,MC_READ
LD A,0xFF
OUT (MC_SEND),A
CALL NOPER
IN D,(C)
CALL NOPER
OUT (MC_SEND),A
CALL NOPER
IN E,(C)
JR MP3_END
ZAW003G CALL CSHIGHG
LD A,0XEE
JP OUTSTAT
SDINITG CALL CSHIGHG
LD BC,SD_SEND
LD DE,0X20FF
OUT (C),E
DEC D
JR NZ,$-3
LD BC,SD_RSTR
XOR A
EX AF,AF'
ZAW001G LD HL,CMD00G
CALL OUTCOMG
CALL INOOUTG
EX AF,AF'
DEC A
JR Z,ZAW003G
EX AF,AF'
DEC A
JR NZ,ZAW001G
LD HL,CMD08G
CALL OUTCOMG
CALL INOOUTG
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
LD HL,0
BIT 2,A
JR NZ,ZAW006G
LD H,0X40
ZAW006G LD A,CMD_55
CALL OUT_COG
CALL INOOUTG
LD BC,SD_SEND
LD A,ACMD_41
OUT (C),A
NOP
OUT (C),H
NOP
OUT (C),L
NOP
OUT (C),L
NOP
OUT (C),L
LD A,0XFF
OUT (C),A
CALL INOOUTG
AND A
JR NZ,ZAW006G
ZAW004G LD A,CMD_59
CALL OUT_COG
CALL INOOUTG
AND A
JR NZ,ZAW004G
ZAW005G LD HL,CMD16G
CALL OUTCOMG
CALL INOOUTG
AND A
JR NZ,ZAW005G
SDOFFG JP OK_WORK
CSHIGHG PUSH AF
LD A,M_SDNCS+M_SNCLR ;0X81
OUT (SCTRL),A
POP AF
RET
CSLOWG PUSH AF
LD A,M_SDNCS ;1
OUT (SCTRL),A
POP AF
RET
OUTCOMG CALL CSLOWG
PUSH BC
LD BC,0X0600+SD_SEND
OTIR
POP BC
RET
OUT_COG PUSH BC
CALL CSLOWG
LD BC,SD_SEND
OUT (C),A
XOR A
OUT (C),A
NOP
OUT (C),A
NOP
OUT (C),A
NOP
OUT (C),A
DEC A
OUT (C),A
POP BC
RET
SECM20G PUSH HL
PUSH DE
PUSH BC
PUSH AF
PUSH BC
LD A,CMD_58
LD BC,SD_RSTR
CALL OUT_COG
CALL INOOUTG
IN A,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
BIT 6,A
POP HL
JR NZ,SECN20G
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
LD H,L
LD L,D
LD D,E
LD E,0
SECN20G POP AF
LD BC,SD_SEND
OUT (C),A
NOP
OUT (C),H
NOP
OUT (C),L
NOP
OUT (C),D
NOP
OUT (C),E
LD A,0XFF
OUT (C),A
POP BC
POP DE
POP HL
RET
INOOUTG PUSH DE
LD DE,0X80FF
INWAITG IN A,(SD_RSTR)
CP E
JR NZ,INEXITG
DEC D
JR NZ,INWAITG
INEXITG POP DE
RET
CMD00G DB 0X40,0X00,0X00,0X00,0X00,0X95 ;GO_IDLE_STATE
CMD08G DB 0X48,0X00,0X00,0X01,0XAA,0X87 ;SEND_IF_COND
CMD16G DB 0X50,0X00,0X00,0X02,0X00,0XFF ;SET_BLOCKEN
IF 0
;ПЕРЕДАЧА ОДНОГО СЕКТОРА В SD КАРТУ
WRSECTG LD BC,SD_SEND
OUT (C),A
IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD HL,0X0200
CALL WDY
IN A,(ZXDATRD)
DEC HL
OUT (C),A
LD A,H
OR L
JR NZ,$-10
LD A,0XFF
OUT (C),A
NOP
OUT (C),A
RET
ENDIF
;ПЕРЕДАЧА ОДНОГО СЕКТОРА НА СПЕК
RDSECTG IN A,(ZXSTAT)
RRA
JR NC,$-3
OUT (CLRCBIT),A
LD BC,SD_RSTR
LD HL,0X0200
IN A,(C)
DEC HL
OUT (ZXDATWR),A
CALL WDN
LD A,H
OR L
JR NZ,$-10
IN A,(C)
NOP
IN A,(C)
RET
;ЗАГРУЗКА ОДНОГО СЕКТОРА
RDSING LD A,CMD_17
CALL SECM20G
CALL INOOUTG
CP 0XFE
JR NZ,$-5
CALL RDSECTG
CALL INOOUTG
INC A
JR NZ,$-4
JR OK_WORK
;ЗАГРУЗКА "A" СЕКТОРОВ
RDMULG EX AF,AF'
LD A,CMD_18
CALL SECM20G
EX AF,AF'
RDMULG1 EX AF,AF'
CALL INOOUTG
CP 0XFE
JR NZ,$-5
CALL RDSECTG
EX AF,AF'
DEC A
JR NZ,RDMULG1
LD A,CMD_12
CALL OUT_COG
CALL INOOUTG
INC A
JR NZ,$-4
JR OK_WORK
IF 0
;ЗАПИСЬ ОДНОГО СЕКТОРА
WRSING LD A,CMD_24
CALL SECM20G
CALL INOOUTG
INC A
JR NZ,$-4
LD A,0XFE
CALL WRSECTG
CALL INOOUTG
INC A
JR NZ,$-4
JR OK_WORK
;ЗАПИСЬ "A" СЕКТОРОВ
WRMULG EX AF,AF'
LD A,CMD_25
CALL SECM20G
CALL INOOUTG
INC A
JR NZ,$-4
EX AF,AF'
WRMULG1 EX AF,AF'
LD A,0XFC
CALL WRSECTG
CALL INOOUTG
INC A
JR NZ,$-4
EX AF,AF'
DEC A
JR NZ,WRMULG1
LD C,SD_SEND
LD A,0XFD
OUT (C),A
CALL INOOUTG
INC A
JR NZ,$-4
ENDIF
OK_WORK CALL CSHIGHG
LD A,0X77
OUTSTAT OUT (ZXDATWR),A
;ОЖИДАНИЕ КОГДА СПЕК ЗАБЕРЕТ БАЙТ ДАННЫХ
WDN IN A,(ZXSTAT)
RLA
JR C,WDN
RET
;ОЖИДАНИЕ КОГДА СПЕК ДАСТ БАЙТ ДАННЫХ
WDY IN A,(ZXSTAT)
RLA
JR NC,WDY
RET
GSDDRVE
DEPHASE
UKLAD3