;-------------------------------------------------------------------------- 
; Константы 
;----------------------------------------------------------------------------- 
;  коррекции: 
;     14.02.89 - переменная SCAN_CODE_OLD 
;----------------------------------------------------------------------------- 
FALSE           EQU        0 
TRUE            EQU        NOT FALSE 
FIRST_TIME      EQU        8 
SECOND_TIME     EQU        2 
DATA_ORG        EQU        80H 
KEY_INT         EQU        9 
CURSOR_TIME     EQU        4 
PORT_A          EQU        60H         ;Адрес порта А 8255 
PORT_B          EQU        61H         ;Адрес порта B 8255 
PORT_C		EQU        62H	       ;Адрес порта C 8255 
INTA00          EQU        20H         ;Порт 8259 
INTA01          EQU        21H         ;Порт 8259 
EOI             EQU        20H 
TIMER           EQU        40H 
TIM_CTL         EQU        43H         ;Адрес порта управления таймером 8253 
TIMER0          EQU        40H         ;Адрес порта счетчика/таймера 0  8253 
TMINT           EQU        01          ;Маска прерывания таймера 0 
MOTOR_TURN_BIT  EQU	   04H 
KBD_IN          EQU        60H         ;Адрес порта ввода данных клавиатуры 
BDINT           EQU        02          ;Маска прерываний клавиатуры 
KB_DATA         EQU        60H         ;Порт сканкодов клавиатуры 
KB_CTL          EQU        61H         ;Управляющие биты клавиатуры 
;---------------------------------------------------------------------------- 
; Определение порта 8255 для PPI_TRAP или PPI_KBD 
;---------------------------------------------------------------------------- 
TRAP_A		EQU	28H		; 
TRAP_D		EQU	2AH		; 
SCR_MODE        EQU     68H             ;Порт режима 
P61		EQU	61H 
P6A             EQU     6AH             ;PORT SET COLOR!!!!!!!!!!!!!!!!!!!!!!!! 
P62             EQU     62H 
PPIC		EQU	63H		;Порт режима PPI_TRAP 
; 
LINE_SEL	EQU	60H		;Выбор строки или сохранение сканкод 
COL_READ	EQU	69H		;Чтение колонок KBD 
KEY_SERV_MODE	EQU	6BH		;Порт режима PPI_KBD 
;---------------------------------------------------------------------------- 
; Адреса прерываний К1810 ВМ88 
;---------------------------------------------------------------------------- 
ABS0   SEGMENT         AT 0 
STG_LOC0               LABEL     BYTE 
       ORG             2*4 
NMI_PTR                LABEL     WORD 
       ORG             5*4 
INT5_PTR               LABEL     WORD 
       ORG             8*4 
INT_ADDR               LABEL     WORD 
INT_PTR                LABEL     DWORD 
       ORG             10H*4 
VIDEO_INT              LABEL     WORD 
       ORG             1DH*4 
PARM_PTR               LABEL     DWORD       ;Указатель параметров ВИДЕО 
       ORG             01EH*4                ;Указатель параметров диска 
DISK_POINTER           LABEL     DWORD 
       ORG             01FH*4                ;Расположение знакогенератора 
EXT_PTR                LABEL     DWORD       ;Для графического режима 
       ORG             7C00H 
BOOT_LOCN              LABEL     FAR 
ABS0   ENDS 
 
;----------------------------------------------------------------------------- 
; Стек - используется только во время инициализации 
;------------------------------------------------------------------------------ 
STOCK  SEGMENT         AT  30H 
       DW              128 DUP(?) 
TOS    LABEL           WORD 
STOCK  ENDS 
 
;----------------------------------------------------------------------------- 
; Области данных для ПЗУ BIOS 
;------------------------------------------------------------------------------ 
DATA   SEGMENT         AT  40H 
RS232_BASE             DW     4 DUP(?)     ;Адреса портов адаптеров RS232 
PRINTER_BASE           DW     4 DUP(?)     ;Адреса портов принтеров 
EQUIP_FLAG             DW     ?            ;Установленное оборудование 
MFG_TST                DB     ?            ;Флаг инициализации 
MEMORY_SIZE            DW     ?            ;Размер памяти в Кбайтах 
IO_RAM_SIZE            DW     ?            ;Размер памяти канала ввода-вывода 
;----------------------------------------------------------------------------- 
; Область данных клавиатуры 
;------------------------------------------------------------------------------ 
KB_FLAG                DB     ? 
;------Расположение флагов SHIFT внутри переменной KB_FLAG 
INS_STATE              EQU    80H          ;Состояние вставки (INS) 
CAPS_STATE             EQU    40H          ;Нажата клавиша ФИКС.ВЕРХ (CAPS) 
NUM_STATE              EQU    20H          ;Нажата клавиша ЦИФРА (NUM) 
SCROLL_STATE           EQU    10H          ;Нажата клавиша свертки 
ALT_SHIFT              EQU    08H          ;Нажата клавиша ДОП(ALT) 
CTL_SHIFT              EQU    04H          ;Нажата клавиша УПР (CTL) 
LEFT_SHIFT             EQU    02H          ;Нажата клавиша ВЕРХ (слева) 
RIGHT_SHIFT            EQU    01H          ;Нажата клавиша ВЕРХ (справа) 
KB_FLAG_1              DB     ?            ;Второй байт состояния клавиатуры 
INS_SHIFT              EQU    80H          ;Нажата клавиша вставки (INS) 
CAPS_SHIFT             EQU    40H          ;Нажата клавиша ФИКС.ВЕРХ (CAPS) 
NUM_SHIFT              EQU    20H          ;Нажата клавиша ЦИФРА (NUM) 
SCROLL_SHIFT           EQU    10H          ;Нажата клавиша свертки 
HOLD_STATE             EQU    08H          ;Задержка нажатия клавиши 
ALT_INPUT              DB     ?            ;Ячейка для ввода ALT 
BUFFER_HEAD            DW     ?            ;Указатель вершины буфера клавиатуры 
BUFFER_TAIL            DW     ?            ;Указатель начала буфера клавиатуры 
KB_BUFFER              DW     16 DUP(?)    ;Область для 15-ти вводов в буфер 
KB_BUFFER_END          LABEL  WORD         ;Конец буфера клавиатуры 
;-----Вершина=началу показывает, что буфер пуст 
NUM_KEY                EQU    69           ;Код сканирования клавиши ЦИФРА 
SCROLL_KEY             EQU    70           ;Код сканирования клавиши свертки 
ALT_KEY                EQU    56           ;Код сканирования клавиши ДОП 
CTL_KEY                EQU    29           ;Код сканирования клавиши УПР 
CAPS_KEY               EQU    58           ;Код сканирования клавиши ИКС.ВЕРХ 
LEFT_KEY               EQU    42           ;SCAN-код левой клавиши ВЕРХ 
RIGHT_KEY              EQU    54           ;SCAN-код правой клавиши ВЕРХ 
INS_KEY                EQU    82           ;SCAN-код клавиши вставки 
DEL_KEY                EQU    83           ;SCAN-код клавиши удаления 
RUS_KEY                EQU    91           ;SCAN-код клавиши РУС/ЛАТ 
SHIFT2_KEY             EQU    92           ;SCAN-код клавиши SHIFT2 
;---------------------------------------------------------------------------- 
; Области данных НГМД 
;---------------------------------------------------------------------------- 
SEEK_STATUS            DB     ?             ;Состояние перекалибровки 
;                                           Биты 3-0= Устройство нуждается 
;                                           в перекалибровке перед следующей 
;                                           щперацией поиска, если бит=0 
INT_FLAG               EQU    080H          ;Флаг обнаружения прерывания 
MOTOR_STATUS           DB     ?             ;Состояние двигателя 
;                             Биты 3-0 = Устройство 3-0 работает 
;                             Бит 7 = текущая операция - запись, 
;                             задержка ответа НГМД 
MOTOR_WAIT             EQU    37            ;Счетчик задержки (2сек) для 
;                                            запуска двигателя 
MOTOR_COUNT     	DB	?           ;Счетчик времени запуска 
; 
DISKETTE_STATUS        DB     ?             ;Байт кода возврата 
;                                      Байты состояний контроллера НГМД (7байт) 
NEC_STATUS		LABEL BYTE      	;7 BYTE 
TRACK_PTR              DB     2 DUP(?) 
STEP_MULT              DB     ? 
			DB	4 DUP (?)	;Резерв 
;----------------------------------------------------------------------- 
; Контакты для ВИДЕО 
;-------------------------- 
;                    !/Высокое разрешение 
;                    !!/Активная страница ВИДЕО 
;                    !!!/Цветовая палитра 
;                    !!!!/Фон палитры 
;                    !!!!!/Бит разрешения NMI 
CHAR_40_MODE   EQU   01000000B 
CHAR_80_MODE   EQU   11000000B 
MED_RES_MODE   EQU   00101000B 
HIGH_RES_MODE  EQU   10001000B 
CRT_MODE_PORT  EQU   3DEH              ;Порт текущего режима отображения 
START_BUFFER   EQU   0B800H            ;Начало буфера 
EXTRA_BUFFER   EQU   START_BUFFER+400h ;Конец буфера (16К) 
REG3D4         EQU   3D4H 
REG3D5         EQU   3D5H 
REG3D8         EQU   3D8H 
REG3D9         EQU   3D9h 
REG3DA         EQU   3DAH 
REG3DE         EQU   3DEH 
DSEGMENT       EQU   40h 
INT_VIDEO      EQU   10H 
;--------------------------------------------------------------------------- 
;  Область данных ВИДЕО 
;-------------------------------------------------------------------------- 
CRT_MODE      DB      ?       ;Текущий режим отображения 
CRT_COLS      DW      ?       ;Число колонок экрана 
CRT_LEN       DW      ?       ;Длина видеопамяти в байтах 
CRT_START     DW      ?       ;Начальный адрес видеобуфера 
CURSOR_POSN   DW      8 DUP(?);Курсор для каждой из 8-ми страниц 
CURSOR_MODE   DW      ?       ;Текущий режим курсора 
ACTIVE_PAGE   DB      ?       ;Текущая отображаемая страница 
ADDR_6845     DW      ? 
CRT_MODE_SET  DB      ?       ;Текущее назначение для 3x8 регистров 
CRT_PALLETTE  DB      ?       ;Текущая палитра для цветной графики 
;---------------------------------------------------------------------------- 
;  Область данных кассетного магнитофона 
;---------------------------------------------------------------------------- 
EDGE_CNT               DW      ?             ;Счетчик длительности конца данных 
CRC_REG                DW      ?             ;Регистр CRC 
;---------------------------------------------------------------------------- 
INTR_FLAG              DB      ?             ;Флаг прерывания 
;---------------------------------------------------------------------------- 
;  Область данных таймера 
;---------------------------------------------------------------------------- 
TIMER_LOW              DW       ?            ;Мл. слово счетчика таймера 
TIMER_HIGH             DW       ?            ;Ст. слово счетчика таймера 
TIMER_OFL              DB       ?            ;Признак цикла таймера 
                                             ;После последнего чтения 
;COUNTS_SEC            EQU      18 
;COUNTS_MIN            EQU      1092 
;COUNTS_HOUR           EQU      65543 
;COUNTS_DAY            EQU      1573040=1800B0H 
;----------------------------------------------------------------------------- 
; Область системных данных 
;----------------------------------------------------------------------------- 
BIOS_BREAK             DB        ?            ;Бит 7=1 если клавиша 
;                                              отпускается 
RESET_FLAG             DW        ?            ;Слово=1234H если сброс 
;                                              от клавиатуры 
;------------ Переменная INT15H ---------------------------------------------- 
LOWLIM		DW	?		;MIN ДЛИТ. ПЕРИОДА "1" 
; 
ORG DATA_ORG 
; 
;--------Дополнительная область ВИДЕО----------------------------------------- 
; 
CURSOR_COUNT           DB        ? 
;                                             Сброс 
CRT_MODE_SAFE DB      ?       ;Текущий режим отображения 
CURSOR_ON     DB      ?       ;Флаг установки курсора 
CRT_STATUS    DB      ? 
REG_6845      DB      ? 
CURSOR_POS_L  DB      ? 
CURSOR_POS_H  DB      ? 
; 
;--------Область данных эмуляции клавиатуры----------------------------------- 
; 
KB_STAT_L     EQU     8     ; количество линий в матрице клавиатуры 
KB_STAT_C     EQU     800H  ; код старшей колонки (клавиши в линии) 
KB_STAT_S     EQU     80H   ; код старшей линии 
KB_KEY        EQU     96    ; количество клавиш 
KB_L_KEY      EQU     12    ; количество линий 
KB_STAT       DW      KB_STAT_L DUP (?) ; состояние клавиатуры по линиям ) 
RUSS          DB      ?     ; признак наличия TRUE или FALSE 
FBEEP         DB      ?     ; признак наличия TRUE или FALSE 
TIME          DB      ?     ; количество тиков до повторения кода клавиши 
LAST          DW      ?     ; адрес последней нажатой клавиши 
                            ; 00 - нет клавиши для повторения 
EMPTY	      DW      ?     ; состояние клавиатуры после последнего 
                            ; опроса (интегральная оценка: пустая/ не пустая) 
                            ; 00 - пустая клавиатура 
                            ; другой код - не пустая клавиатура 
W_SCAN        DB      ?     ; работает сканирование аппаратуры 
; SHIFT1        DB      ? 
SHIFT2        DB      ? 
MEM_KEY       DB      15 DUP (?)  ; память нажатий особых клавиш 
                            ;   ( с тремя скан-кодами ) 
SCAN_CODE_OLD DB      ?     ; последний скан_код из порта 60H 
;------------- имя файла для кассетного магнитофона ----------------------- 
LOAD_ADDR               DW       ? 
BUFFERM         DB      8 DUP (?) 
LAST_VAL        DB      ?        ;Последнее введенное значение 
K_CICL          DB      ? 
T_CURSOR        DB      ? 
DATA   ENDS 
;---------------------------------------------------------------------------- 
;---------------------------------------------------------------------------- 
;  Область дополнительных данных 
;---------------------------------------------------------------------------- 
XXDATA  SEGMENT         AT       50H 
STATUS_BYTE             DB       ? 
                        ORG      6 
;ADDR_MON                DW       ? 
XXDATA ENDS 
;----------------------------------------------------------------------------- 
; Видеобуфер 
;----------------------------------------------------------------------------- 
VIDEO_RAM               SEGMENT AT 0B800H 
REGEN   LABEL           BYTE 
REGENW  LABEL           WORD 
        DB              16384 DUP(?) 
VIDEO_RAM   ENDS 
 
VECTOR  SEGMENT AT 0F000H 
        ASSUME CS:VECTOR 
        ORG    0E016H 
RESETV  LABEL   FAR 
VECTOR  ENDS 
 
hard    segment at 5400h 
	assume cs:hard 
	org    0h 
hd	label    far 
hard    ends 
 
INT13   SEGMENT AT 0E000H 
        ASSUME CS:INT13 
        ORG    40H 
INT13_SERVICE	LABEL	FAR 
INT13   ENDS 
 
KARTR   SEGMENT AT 0C000H           ;Область памяти картридиса 
        ASSUME CS:KARTR 
        ORG    0000H 
KARTRIDJ	LABEL	FAR 
KARTR   ENDS 
 
BOOTM   SEGMENT AT 60H 
        ASSUME CS:BOOTM 
        ORG    0000H 
BOOT_SM LABEL	FAR 
BOOTM   ENDS 
 
;---------------------------------------------------------------------------- 
;  Коды ПЗУ 
;---------------------------------------------------------------------------- 
 
CODE    SEGMENT 
        ORG    0E000H 
 
DB             'POISK (C) 1989 UkSSR  '  ;Метка фирмы 
