;LAST UPDATE: 16.11.2014 savelij
MASTER EQU 0
SLAVE EQU 0X80
DRV_A EQU 0 ;DRIVE A
DRV_B EQU 1 ;DRIVE B
DRV_C EQU 2 ;DRIVE C
DRV_D EQU 3 ;DRIVE D
SDZ EQU 4 ;SD КАРТА НА ZC
SDG EQU 5 ;SD КАРТА НА NEOGS
HDDN EQU 6 ;HDD NEMO
HDDS EQU 7 ;HDD SMUC
HDDV EQU 8 ;HDD DIVIDE
EXTERNAL EQU 0 ;ВНЕШНИЙ ВЫЗОВ
INTERNAL EQU 1 ;ВНУТРЕННИЙ ВЫЗОВ
INT4EXT EQU 3 ;ВНУТРЕННИЙ ВЫЗОВ ДЛЯ ВЫЗВАВШЕЙ ПРОГИ
B_SDZ EQU %00000001
B_SDG EQU %00000010
B_HDD EQU %00000100
B_NEW_SD EQU %01000000
B_INST_SDG EQU %10000000
;ВЫЗОВ ВЫБРАННОГО ДРАЙВЕРА
TO_DRV PUSH HL
LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,TO_DRV1
CALL P5_READ_BYTE
LD A,(RREG_A)
LD DE,(RREG_E)
LD BC,(RREG_C)
LD HL,(RREG_L)
EX (SP),HL
TO_DRV1 LD HL,(GO_DEV)
EX (SP),HL
RET
;ВНЕШНИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
COM_DEV EX AF,AF'
CALL P5_READ_BYTE
LD A,(NEXTBYTERST8)
PUSH IY
LD IYL,EXTERNAL ;ВНЕШНИЙ ВЫЗОВ
NEXT_ICOM_DEV PUSH IX
PUSH HL
LD HL,EXITDEV
EX (SP),HL
PUSH HL
ADD A,A
ADD A,LOW (TABLDEV)
LD L,A
ADC A,HIGH (TABLDEV)
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EX AF,AF'
EX (SP),HL
RET
EXITDEV POP IX
POP IY
RET
;ВНУТРЕННИЙ ВЫЗОВ МЕНЕДЖЕРА УСТРОЙСТВ
ICOM_DEV EX AF,AF'
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
PUSH IY
LD IYL,INTERNAL ;ВНУТРЕННИЙ ВЫЗОВ
JR NEXT_ICOM_DEV
TABLDEV DW DEVFIND ;00 ПОИСК УСТРОЙСТВ
DW SET_VOL ;01 ВЫБОР РАЗДЕЛА
DW KOL_VOL ;02 ЗАПРОС НАЙДЕНОГО
DW GET_FNDVOLUME ;03 ПОЛУЧИТЬ ТАБЛИЦУ НАЙДЕННЫХ РАЗДЕЛОВ
DW TO_DRV ;04 ВЫЗОВ ДРАЙВЕРА ВЫБРАННОГО УСТРОЙСТВА
DW SET_DEVICE ;05 УСТАНОВКА БИТОВ УСТРОЙСТВА И LBA РЕЖИМА
DW CONTROL_SD ;06 КОНТРОЛЬ НАЛИЧИЯ SD КАРТ
DW COMHDDNEX ;07 ПРЯМОЙ ВЫЗОВ ДРАЙВЕРА HDD NEMO (ВРЕМЕННАЯ ФУНКЦИЯ)
DW FREINIT_VOL ;08 ПОЛНАЯ ПЕРЕИНИЦИАЛИЗАЦИЯ РАЗДЕЛА
;ФОРМАТ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
;+0(1)-0-DRIVE A
; 1-DRIVE B
; 2-DRIVE C
; 3-DRIVE D
; 4-SD КАРТА ZC
; 5-SD КАРТА NEOGS
; 6-HDD NEMO
; 7-HDD SMUC
; 8-HDD DIVIDE
;+1(1)-ДЛЯ SD-ТУПО 0
; ИНАЧЕ HDD/CD 0-MASTER, 1-SLAVE
;+2(1)-ТИП РАЗДЕЛА, В ТАБЛИЦЕ ТОЛЬКО
;РАЗДЕЛЫ:
;00=01-FAT12
;01=04,06,0E-FAT16
;02=0B,0C-FAT32
;+3(4)-СТАРТОВЫЙ СЕКТОР РАЗДЕЛА
;+7(1)-РЕЗЕРВ
;ТОЧКА ВХОДА ДЛЯ ПОИСКА РАЗДЕЛОВ
;HL-АДРЕС КУДА ПОКЛАСТЬ ТАБЛИЦУ РАЗДЕЛОВ
;НА ВЫХОДЕ:
;A-КОЛ-ВО РАЗДЕЛОВ
DEVFIND LD A,(FLAGS_DRV)
AND B_NEW_SD
JR NZ,DEVFIND4
LD HL,0XFE
LD IX,BUF_TABLVOL
PCALL CRC16_FAST,P_ADDON1
LD BC,(BUF_TABLVOL+0XFE)
AND A
SBC HL,BC
JP Z,KOL_VOL
DEVFIND4 LD HL,FLAGS_DRV
LD A,B_NEW_SD!0XFF
AND (HL)
LD (HL),A
PUSH IY
XOR A
LD (KOLDVOL),A
LD HL,BUF_TABLVOL
LD DE,BUF_TABLVOL+1
LD BC,0XEF
LD (HL),B
LDIR
LD IX,DEVICES
LD IYL,INTERNAL
LD A,(HDDTIMEOUT)
DEVFIND41 EI
HALT
HALT
DI
DEC A
JR NZ,DEVFIND41
INC A
LD (HDDTIMEOUT),A
;NEMO
LD HL,BUF_512 ;АДРЕС БУФЕРА ДЛЯ ЗАГРУЗКИ СЕКТОРА (512 БАЙТ)
CALL COMHDDN
DB _DEV_INIT ;ИНИЦИАЛИЗАЦИЯ УСТРОЙСТВА С ОПРЕДЕЛЕНИЕМ ЧТО ПОДКЛЮЧЕНО
LD A,H
AND A
JR NZ,DEVFIND1
DEVFIND10 LD (IX+0),HDDN+MASTER
INC IX
DEVFIND1
;SD ON NEOGS
LD H,CMOS_BYTE_01
PCALL READCMOS,P_ADDONS
LD A,L
AND ACCESSSDG ;ПРОВЕРКА РАЗРЕШЕНИЯ ДОСТУПА К SD КАРТЕ NEOGS
JR Z,DEVFIND2 ;ЕСЛИ ЗАПРЕЩЕН, ТО НЕ ВЫЗЫВАЕМ
CALL INSTSDD ;УCТАНОВКА ДРАЙВЕРА SD КАРТЫ НА NEOGS
AND A
JR NZ,DEVFIND2 ;НЕ ИНИЦИАЛИЗИРОВАТЬ ЕСЛИ NEOGS НЕ НАЙДЕН
LD HL,FLAGS_DRV
SET 7,(HL) ;ДРАЙВЕР УСТАНОВИЛСЯ
CALL COMSDG
DB _DEV_INIT ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ НА NEOGS
AND A
JR NZ,DEVFIND2
DEVFIND20 LD (IX+0),SDG
INC IX
DEVFIND2
;SD ON Z-CONTROLLER
CALL COMSDZ
DB _DEV_INIT ;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ
AND A
JR NZ,DEVFIND3
DEVFIND30 LD (IX+0),SDZ
INC IX
DEVFIND3 LD (IX+0),0XFF ;ДАЛЕЕ НЕТ НАЙДЕННЫХ УСТРОЙСТВ
CALL FIND_SD
LD HL,DEVICES
LD IX,BUF_TABLVOL
LD A,(HL)
INC A
JR Z,DEVFIND6
DEVFIND5 CALL FINDVOL
INC HL
LD A,(HL)
INC A
JR NZ,DEVFIND5
DEVFIND6 CALL SETVOLD ;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
POP IY
SCF
JP Z,KOLVOL1 ;ПЕРЕХОД ЕСЛИ НИЧЕГО НЕ НАЙДЕНО
DEC A
LD (SETDVOL),A
;====ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ ВСЕХ НАЙДЕННЫХ РАЗДЕЛОВ====
INIT_VOLS LD IX,BUF_TABLVOL
LD A,(SETDVOL)
PUSH AF ;СОХРАНИЛИ ТЕКУЩИЙ ВЫБРАННЫЙ РАЗДЕЛ
LD A,(KOLDVOL)
LD E,A
LD D,0
IV_SETDRV2 PUSH AF
LD A,D
LD (SETDVOL),A
LD A,(IX+0)
CP SDZ
LD HL,COMSDZ
JR Z,IV_SETDRV1
CP SDG
LD HL,COMSDG
JR Z,IV_SETDRV1
LD HL,COMHDDN
IV_SETDRV1 LD (GO_DEV),HL ;УСТАНОВИЛИ АДРЕС ТЕКУЩЕГО ВЫЗЫВАЕМОГО ДРАЙВЕРА
LD A,(IX+2)
LD HL,BUF_TABLVOL
PUSH DE
CALL ICOM_FAT
DB _INIT_FATVARS
CALL SAVE_FNDVOL
POP DE
INC D
LD BC,8
ADD IX,BC
POP AF
DEC A
JR NZ,IV_SETDRV2
;====ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ ВСЕХ НАЙДЕННЫХ РАЗДЕЛОВ====
POP AF
CALL SET_VOL1 ;ВОССТАНОВЛЕНИЕ ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
LD A,(KOLDVOL)
DEC A
CALL C,SET_VOL1 ;ЕСЛИ ВЫБРАН НЕ СУЩЕСТВУЮЩИЙ РАЗДЕЛ, ТО ПРИНУДИТЕЛЬНО ВЫБИРАЕМ ПОСЛЕДНИЙ НАЙДЕННЫЙ
CALL ICOM_FAT
DB _INIT_TEKDIR
LD HL,0XFE
LD IX,BUF_TABLVOL
PCALL CRC16_FAST,P_ADDON1
LD (CRC_DRVS),HL
KOL_VOL LD A,IYL
AND A
JR NZ,IKOL_VOL
LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD HL,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD (RREG_E),HL
AND A
KOLVOL1 PUSH AF
POP HL
LD (RREG_F),HL
RET
FINDVOL PUSH HL
LD A,(HL)
LD (TEK_TYPE),A
AND 0X7F
CP HDDN
LD HL,COMHDDN
JR Z,FINDVOL1
CP SDG
LD HL,COMSDG
JR Z,FINDVOL1
LD HL,COMSDZ
FINDVOL1 LD (GO_DEV),HL ;ВЫСТАВИЛИ АДРЕС ВЫЗОВА НУЖНОГО ДРАЙВЕРА
LD DE,0
LD B,D
LD C,D ;ЧИТАТЬ СЕКТОР 0
LD A,1 ;1 СЕКТОР
LD HL,BUF_512 ;АДРЕС БУФЕРА ЧТЕНИЯ
PUSH HL
LD IYL,INTERNAL
CALL TO_DRV
DB _DEV_READ
DEC HL
LD D,(HL)
DEC HL
LD E,(HL)
LD HL,0XAA55
AND A
SBC HL,DE
POP IY
LD (ADRTEKV),IX
CALL Z,READ_MBR
POP HL
RET
;ЗАПРОС НАЙДЕНОГО И ТЕКУЩЕГО ВЫБРАННОГО УСТРОЙСТВА
IKOL_VOL LD HL,(ADRTEKV) ;АДРЕС ТЕКУЩЕГО ВЫБРАННОГО РАЗДЕЛА
INC HL
INC HL
LD A,(HL) ;ТИП РАЗДЕЛА
LD DE,(KOLDVOL) ;D-НОМЕР ВЫБРАННОГО РАЗДЕЛА, E-КОЛИЧЕСТВО НАЙДЕННЫХ РАЗДЕЛОВ
LD HL,BUF_TABLVOL ;АДРЕС НАЧАЛА ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ
AND A
RET
;ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА НАЙДЕННЫХ РАЗДЕЛОВ НА ВСЕХ УСТРОЙСТВАХ
SETVOLD LD A,IXL
RRCA
RRCA
RRCA
AND 0X1F
LD (KOLDVOL),A
RET
;ВЫБОР РАЗДЕЛА И ИНИТ ЕГО ПЕРЕМЕННЫХ
FREINIT_VOL LD L,A
LD A,IYL
AND A
JR Z,FREINITVOL1
LD A,(RREG_A)
FREINITVOL1 LD IYL,INTERNAL
CALL SET_VOL1
CALL INIT_FATVARS
JP INIRTSC
;ВЫБОР РАЗДЕЛА
SET_VOL LD L,A
LD A,IYL
AND A
LD A,L
JR NZ,SET_VOL1
LD A,(RREG_A)
LD HL,KOLVOL1
PUSH HL
SET_VOL1 PUSH AF
CALL SAVE_FNDVOL
POP AF
SET_VOL_MNT LD HL,KOLDVOL
CP (HL)
CCF
RET C
LD (SETDVOL),A
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,BUF_TABLVOL
ADD HL,DE
LD (ADRTEKV),HL
LD A,(HL)
; CP 4
; LD HL,DISKETA ;ЕЩЕ НЕ ОСИЛИЛ
; JR C,SET_DRV
CP SDZ
LD HL,COMSDZ
JR Z,SET_DRV
CP SDG
LD HL,COMSDG
JR Z,SET_DRV
LD HL,COMHDDN
SET_DRV LD (GO_DEV),HL
CALL LOAD_FNDVOL
LD HL,0XFE
PUSH IX
LD IX,BUF_TABLVOL
PCALL CRC16_FAST,P_ADDON1
POP IX
LD (CRC_DRVS),HL
XOR A
RET
SAVE_FNDVOL PUSH IX
LD HL,0XFE
LD IX,ERORDRV
PCALL CRC16_FAST,P_ADDON1
POP IX
LD (CRC_VOL),HL ;ВЫЧИСЛЕНИЕ CRC РАЗДЕЛА ПЕРЕД СОХРАНЕНИЕМ
EVOPORT WIN_P5,PAGE_FATVARS
LD A,(SETDVOL)
ADD A,HIGH (CPU5+BUF_ALLVOL)+4
LD D,A
LD E,0
LD HL,BUF_TEKVOL
LD BC,0X100
LDIR
RET
LOAD_FNDVOL EVOPORT WIN_P5,PAGE_FATVARS
LD A,(SETDVOL)
ADD A,HIGH (CPU5+BUF_ALLVOL)+4
LD H,A
LD L,0
LD DE,BUF_TEKVOL
LD BC,0X100
LDIR
; PUSH IX
; LD HL,0XFE
; LD IX,ERORDRV
; PCALL CRC16_FAST,P_ADDON1
; POP IX
; LD DE,(CRC_VOL)
; AND A
; SBC HL,DE
; JP NZ,REDEVFIND
CALL ICOM_FAT
DB _INIT_TEKDIR
RET
CMP_SDCARD LD A,(SETDVOL)
CP SDG
JR NZ,CMPSDCARD1
LD H,CMOS_BYTE_01
PCALL READCMOS,P_ADDONS
LD A,L
AND ACCESSSDG ;ПРОВЕРКА РАЗРЕШЕНИЯ ДОСТУПА К SD КАРТЕ NEOGS
RET Z
CMPSDCARD1 PUSH IY
LD IYL,INTERNAL
CALL TO_DRV
DB _DEV_STATUS
POP IY
INC A
RET
READ_MBR LD DE,0X01BE ;СМЕЩЕНИЕ В 0 СЕКТОРЕ УСТРОЙСТВА ДО ТАБЛИЦЫ MBR
PUSH IY
ADD IY,DE ;УСТАНОВИЛИ УКАЗАТЕЛЬ НА НАЧАЛО ОПИСАТЕЛЕЙ РАЗДЕЛОВ
LD BC,0X0400 ;РАЗДЕЛОВ МАКСИМУМ 4 И ОБНУЛИЛИ СЧЕТЧИК РАЗДЕЛОВ С FAT
RDMBR0 LD A,(IY) ;ПЕРВЫЙ БАЙТ 16 БАЙТНОГО ОПИСАТЕЛЯ
AND A ;ДОЛЖЕН БЫТЬ РАВЕН 0
JR Z,RDMBR1
CP 0X80 ;ИЛИ 0X80 (ПРИЗНАК ЗАГРУЗОЧНОГО РАЗДЕЛА)
JR NZ,RDMBR2
RDMBR1 LD A,(IY+4) ;БАЙТ ТИПА РАЭДЕЛА
CALL CP_RAZD ;ПРОВЕРКА ТИПА РАЗДЕЛА
JR NZ,RDMBR2 ;ЕСЛИ НЕ FAT ТО ПРОВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ
INC C
RDMBR2 LD DE,0X10
ADD IY,DE
DJNZ RDMBR0 ;ПРОВЕРЯЕМ СЛЕДУЮЩУЮ 16 БАЙТНУЮ ЗАПИСЬ В MBR
LD A,C
AND A
POP HL
JP NZ,SCANMBR
PUSH HL
POP IY
LD C,(IY+0X0D)
XOR A
LD E,A
LD B,8
RR C
ADC A,0
DJNZ $-4
DEC A
JR NZ,$+3
INC E
LD A,(IY+0X0E)
OR (IY+0X0F)
JR Z,$+3
INC E
; LD A,(IY+0X13)
; OR (IY+0X14)
; JR Z,$+3
; INC E
; LD A,(IY+0X20)
; OR (IY+0X21)
; OR (IY+0X22)
; OR (IY+0X22)
; JR Z,$+3
; INC E
LD A,(IY+0X15)
AND 0XF0
CP 0XF0
JR NZ,$+3
INC E
LD A,E
CP 3;4
RET NZ
LD A,(TEK_TYPE)
BIT 7,A
LD B,0
JR Z,$+3
INC B
AND 0X7F
LD C,A
PUSH IX
POP HL
XOR A
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (HL),0XFF
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
LD DE,8
ADD IX,DE
INIT_VOL PUSH IY
LD IYL,INTERNAL
CALL SETVOLD
DEC A
LD (SETDVOL),A
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,BUF_TABLVOL
ADD HL,DE
LD (ADRTEKV),HL
LD A,(HL)
AND 0X7F
; CP 4
; LD HL,DISKETA ;ЕЩЕ НЕ ОСИЛИЛ
JR C,DSET_DRV
CP SDZ
LD HL,COMSDZ
JR Z,DSET_DRV
CP SDG
LD HL,COMSDG
JR Z,DSET_DRV
LD HL,COMHDDN
DSET_DRV LD (GO_DEV),HL
CALL IKOL_VOL
CALL ICOM_FAT
DB _INIT_FATVARS
LD (IX-6),A
POP IY
RET
;НА ВХОДЕ:
;A-BIT 7-0/1-MASTER/SLAVE
;BITS 6-0-ТИП НОСИТЕЛЯ
SCANMBR LD DE,0X01BE
ADD HL,DE
EXX
LD A,(TEK_TYPE)
BIT 7,A
LD B,0
JR Z,$+3
INC B
AND 0X7F
LD C,A
EXX
LD A,4
SCNMBR0 PUSH AF
LD A,(HL)
LD C,4
ADD HL,BC
LD C,0X0C
AND A
JR Z,SCNMBR1
CP 0X80
JR NZ,SCNMBR2
SCNMBR1 LD A,(HL)
AND A
JR Z,SCNMBR2
CALL CP_RAZD
JR NZ,SCNMBR2
SCNMBR3 EXX
LD (IX+0),C
LD (IX+1),B
EXX
LD (IX+2),E ;УСТАНОВКА ТИПА FAT
PUSH IX
POP DE
INC DE
INC DE
INC DE
LD C,4
ADD HL,BC
LDI
LDI
LDI
LDI
LD (IX+7),0 ;РЕЗЕРВНЫЙ БАЙТ
SCNMBR4 LD C,8
ADD IX,BC
LD C,4
SCNMBR2 ADD HL,BC
POP AF
DEC A
JR NZ,SCNMBR0
RET
SET_DEVICE PUSH AF
PUSH HL
LD A,B
AND 0X0F
LD B,A
LD HL,(ADRTEKV)
INC HL
LD A,(HL)
AND 1 ;MASTER ИЛИ SLAVE?
RLCA
RLCA
RLCA
RLCA
OR 0XE0 ;ВСЕГДА LBA РЕЖИМ
OR B
LD B,A ;УСТАНОВИЛИ ВЫБРАННОЕ УСТРОЙСТВО MASTER ИЛИ SLAVE
POP HL
POP AF
RET
;ПРОВЕРКА ТИПА РАЗДЕЛА
CP_RAZD LD E,1 ;FAT16
CP 4
RET Z
CP 6
RET Z
CP 0X0E
RET Z
LD E,2 ;FAT32
CP 0X0B
RET Z
CP 0X0C
RET Z
LD E,0 ;FAT12
CP 1
RET
;ВРЕМЕННАЯ ФУНКЦИЯ ВЫЗОВА ДРАЙВЕРА HDD NEMO
COMHDDNEX CALL P5_READ_BYTE
LD A,(RREG_A)
LD DE,(RREG_E)
LD BC,(RREG_C)
LD HL,(RREG_L)
JP COMHDDN
;КОПИРОВАНИЕ ТАБЛИЦЫ НАЙДЕННЫХ РАЗДЕЛОВ ВО ВНЕШНЮЮ ПРОГРАММУ
GET_FNDVOLUME LD BC,0X100 ;ПЕРЕНОС 256 БАЙТ
LD DE,(RREG_L) ;АДРЕС КУДА ПЕРЕНОСИТЬ
LD HL,BUF_TABLVOL-CPU6
JP LDIR_BYTES
CONTROL_SD LD A,(FLAGS_DRV)
PUSH AF
CALL FIND_SD
LD C,A
AND 3
LD (RREG_A),A
LD A,C
POP BC
CP B
JP NZ,SD_CARD_LOST
RET
FIND_SD PUSH IY
LD IYL,INTERNAL
LD E,0
LD A,(FLAGS_DRV)
AND B_INST_SDG
JR Z,CRTLSD1 ;ЕСЛИ ДРАЙВЕР НЕ УСТАНОВЛЕН
PUSH HL
PUSH DE
CALL COMSDG
DB _DEV_STATUS
POP DE
POP HL
AND A
SET 1,E ;ЕСТЬ SD КАРТА NEOGS
JR Z,CRTLSD1
RES 1,E ;КАРТЫ НЕТ
EX DE,HL
LD HL,FLAGS_DRV
RES 7,(HL)
EX DE,HL
CRTLSD1 PUSH HL
CALL COMSDZ
DB _DEV_STATUS
POP HL
AND A
SET 0,E ;ЕСТЬ SD КАРТЫ ZC
JR Z,CRTLSD2
RES 0,E ;КАРТЫ НЕТ
CRTLSD2 POP IY
LD HL,FLAGS_DRV
LD A,0XFC
AND (HL)
OR E
LD (HL),A
RET