Код:
В HL адрес для сохранения результатов теста
;Есть ли хоть что-нибудь, если порт пустой, то не будем тратить время
TGS IN A,(#BB)
INC A
RET Z
IN A,(#B3)
INC A
RET Z
;Кто-то на портах #BB и #B3 есть, выясним, является ли этот "кто-то" GS
LD A,#23; Команда "Получить кол-во страниц ОЗУ"
OUT (#BB),A
LD C,#0B; Ждём готовность не более 11 сек. Такое большое время сделал чтобы GS успел проинициализироваться после сброса
CALL GS_WRDY
RET C; GS не ответил
TGS1 IN A,(#B3); Получаем кол-во страниц ОЗУ
CP #40; Страниц ОЗУ не может быть больше 63 (не учитывается 0-я страница)
RET NC
PUSH HL
PUSH AF; Сохраняем в стек кол-во страниц ОЗУ
LD A,#3F; Новое значение глобальной громкости модулей
OUT (#B3),A
LD A,#2A; Команда "Установить новую громкость"
OUT (#BB),A
LD C,#01
CALL GS_WRDY; Ждём готовность не более 1 сек.
JR NC,TGS6
POP AF; Не дождались
POP HL
RET
TGS6 IN A,(#B3); Получаем предыдущую глобальную громкость, которая была изначально
OUT (#B3),A ; Возвращаем старую громкость
LD A,#2A; Команда "Установить глобальную громкость модулей"
OUT (#BB),A
LD C,#01
CALL GS_WRDY; Ждём готовность не более 1 сек.
JR NC,TGS7
POP AF; Не дождались
POP HL
RET
TGS7 IN A,(#B3); Получаем предыдущую громкость, которую мы установили 1-й раз
CP #3F
JR NZ,TGSE; Это не наша громкость, не корректный ответ
INC (HL); GS обнаружен, отвечает адекватно, сохраняем в результатах
INC HL
POP AF; Возвращаем из стека кол-во страниц ОЗУ, которое без 0-й страницы
INC A; Учитываем 0-ю страницу
;Подсчитаем кол-во Кбайт ОЗУ, 1 страница = 32 Кбайт
LD E,A
LD D,#00
LD B,#05; Умножаем на 2^5
TGS5 SLA E
RL D
DJNZ TGS5
;Сохраняем в результатах объём ОЗУ в Кбайтах
LD (HL),E
INC HL
LD (HL),D
POP HL
RET
TGSE POP AF; Не успешное завершение
POP HL
RET
; Ожидание готовности, в регистре C - максимальное время в секундах
GS_WRDY LD B,#32
GSRDY IN A,(#BB)
RRCA
RET NC
EI
HALT
DI
DJNZ GSRDY
DEC C
JR NZ,GS_WRDY
RET