;LAST UPDATE: 21.10.2012 savelij
 
 
 
RCALL           MACRO ADDR
 
                LD SP,RADDR
 
                JP ADDR
 
RADDR           DW $+2
 
                ENDM
 
 
 
ENT_DEF         MACRO V1,V2,V3,V4
 
                DB V1+V2*4+V3*16+V4*64
 
                ENDM
 
 
 
_KS_SHFT        EQU 0
 
_KS_CTRL        EQU 1
 
_KS_ALT         EQU 2
 
_KS_SHFT2       EQU 3
 
_KS_CAPS        EQU 4
 
_KS_NUM         EQU 5
 
_KS_SCROLL      EQU 6
 
_KS_RUS         EQU 7
 
 
 
ED_PROC         EQU 0
 
ED_CHAR         EQU 1
 
ED_SCAN         EQU 2
 
 
 
ED_INI          EQU 0
 
_RU5            EQU 0
 
_INTOF          EQU 5
 
 
 
BIOS            EQU 0EA00H
 
CCP             EQU BIOS-1600H
 
 
 
_RESET          EQU 0
 
_SEEK           EQU 1
 
_FORMAT         EQU 2
 
_RECAL          EQU 3
 
_READ           EQU 4
 
_WSECT          EQU 5
 
_WRITE          EQU 6
 
_SETCH          EQU 7
 
_GETCH          EQU 8
 
 
 
;------------------------------
 
; ERRORS CODES FOR C_STAT
 
;
 
CS_UNKNO        EQU   0FFH    ; UNKNOWN FUNCTION
 
CS_ERSEC        EQU   80H     ; WRONG SEQUENCE
 
CS_UNPRN        EQU   81H     ; UNPRINTABLE CHAR IN SEQUENCE
 
CS_NODRV        EQU   82H     ; DRIVER NOT INSTALLED
 
CS_ERPAR        EQU   83H     ; WRONG PARAMETERS
 
CS_NOMOD        EQU   84H     ; SCREEN MODE DOES NOT EXIST
 
; TEXT MODE ERRORS
 
CST_OVER        EQU   1       ; CAN'T WRITE OVER
 
 
 
ADRD            EQU   7DFDH
 
 
 
_TF_CURATR      EQU 0        ; CURSOR IS FLEX ATTRIB
 
 
 
;----------------------------
 
; КОДЫ ОШИБОК, ВОЗВРАЩАЕМЫЕ ДИСКОВОЙ СИСТЕМОЙ
 
;
 
_ADRERR         EQU     08H     ;ОШИБКА АДРЕСАЦИИ
 
_CHNFND         EQU     09H     ;КАНАЛ НЕ ПРИСОЕДИНЕН
 
_HRDERR         EQU     40H     ;ОШИБКА АППАРАТУРЫ
 
_INVALID        EQU     41H     ;НЕСООТВЕТСТВИЕ ДРАЙВЕРА АППАРАТУРЕ
 
_DTYPER         EQU     50H     ;НЕДОПУСТИМЫЙ НОМЕР ДРАЙВЕРА В КАНАЛЕ
 
_DRNFND         EQU     51H     ;ДРАЙВЕР ОТСУТСТВУЕТ
 
_COMERR         EQU     52H     ;ЗАПРЕЩЕННАЯ КОМАНДА
 
_IOERR          EQU     53H     ;ОШИБКА ВВОДА/ВЫВОДА
 
_WR_PROT        EQU     54H     ;ЗАЩИТА ОТ ЗАПИСИ
 
_FATAL_ERROR    EQU     56H     ;НЕ ОБРАБОТАННАЯ ФАТАЛЬНАЯ ОШИБКА
 
_NRDY           EQU     59H     ;НЕТ ГОТОВНОСТИ АППАРАТУРЫ (TIMEOUT)
 
 
 
_NO_DATA        EQU     81H     ;СЕКТОР НЕ НАЙДЕН
 
_NO_ADDR_MARK   EQU     82H     ;АДРЕСНЫЙ МАРКЕР НЕ НАЙДЕН
 
_OVERRUN        EQU     83H     ;OVERRUN
 
_CRC_ERR        EQU     84H     ;ОШИБКА В CRC
 
 
 
MAXDRVN         EQU     7       ;МАКСИМАЛЬНЫЙ НОМЕР ДРАЙВЕРА
 
 
 
IOBYTE          EQU     3
 
 
 
SYS_SP          EQU 0X8000
 
 
 
ED_BUF          EQU 0X7F40                      ;DS  128
 
MAXQUI          EQU 10H                         ; KEYBUFFER SIZE
 
BEGQUI          EQU ED_BUF+0X80                 ;DS  MAXQUI
 
 
 
IX_BAS          EQU 0X5F40
 
IX_SHIFT        EQU 0X7F
 
IX_BASE         EQU IX_BAS+IX_SHIFT
 
 
 
; VARIABLES IX RELATIVE
 
FLAG            EQU IX_BAS      ;DB 0           ;       DM     FLAG   1      <DEFB 0         >
 
FLAG1           EQU FLAG+1      ;DB 0           ;       DM     FLAG1  1      <DEFB 0         >
 
 
 
CUR_X           EQU FLAG1+1     ;DB 0           ;       DM     CUR_X  1      <DEFB 0         >
 
CUR_Y           EQU CUR_X+1     ;DB 0           ;       DM     CUR_Y  1      <DEFB 0         >
 
W_X1            EQU CUR_Y+1     ;DB 0           ;       DM     W_X1   1      <DEFB 0         >
 
W_Y1            EQU W_X1+1      ;DB 0           ;       DM     W_Y1   1      <DEFB 0         >
 
W_X2            EQU W_Y1+1      ;DB 50          ;       DM     W_X2   1      <DEFB 50        >
 
W_Y2            EQU W_X2+1      ;DB 24          ;       DM     W_Y2   1      <DEFB 24        >
 
COLOR_P         EQU W_Y2+1      ;DB 0           ;       DM     COLOR_P 1     <DEFB 0         >
 
COLOR_I         EQU COLOR_P+1   ;DB 7           ;       DM     COLOR_I 1     <DEFB 7         >
 
C_STAT          EQU COLOR_I+1   ;DB 0           ;       DM     C_STAT 1      <DEFB 0         >
 
T_FLAG          EQU C_STAT+1    ;DB 0           ;       DM     T_FLAG 1      <DEFB 0         >
 
CUR_VAL         EQU T_FLAG+1    ;DB 0           ;       DM     CUR_VAL 1     <DEFB 0         >
 
SCR_ADR         EQU CUR_VAL+1   ;DW 0           ;       DM     SCR_ADR 2     <DEFW 0         >
 
COLOR_M         EQU SCR_ADR+2   ;DB 7           ;       DM     COLOR_M 1     <DEFB 7         >
 
SAV_CUR         EQU COLOR_M+1   ;DB 0           ;       DM     SAV_CUR 1     <DEFB 0         >
 
 
 
MEMDSP          EQU SAV_CUR+1   ;DB 0X11        ;       DM     MEMDSP 1      <DEFB 11H       >
 
C_CNT           EQU MEMDSP+1    ;DB 1           ;       DM     C_CNT  1      <DEFB 1         >
 
C_MAX           EQU C_CNT+1     ;DB 10          ;       DM     C_MAX  1      <DEFB 10        >
 
C_BEG           EQU C_MAX+1     ;DB 7           ;       DM     C_BEG  1      <DEFB 7         >
 
C_END           EQU C_BEG+1     ;DB 8           ;       DM     C_END  1      <DEFB 8         >
 
TMP_W           EQU C_END+1     ;DW 0           ;       DM     TMP_W  2      <DEFS 2         >
 
C_ACT           EQU TMP_W+2     ;DB 1           ;       DM     C_ACT  1      <DEFB 1         >
 
BEEP_D          EQU C_ACT+1     ;DW 0X3F10      ;       DM     BEEP_D 2      <DEFW 3F10H     >
 
FE_IMG          EQU BEEP_D+2    ;DB 0XBE        ;       DM     FE_IMG 1      <DEFB 0BEH      >
 
BORDER          EQU FE_IMG+1    ;DB 0           ;       DM     BORDER 1      <DEFB 0         >
 
SYS_P           EQU BORDER+1    ;DB 0           ;       DM     SYS_P  1      <DEFB 0         >
 
FUNC            EQU SYS_P+1     ;DB 0           ;       DM     FUNC   1      <DEFS 1         >
 
FCNT            EQU FUNC+1      ;DB 0           ;       DM     FCNT   1      <DEFS 1         >
 
PAR_PT          EQU FCNT+1      ;DW 0           ;       DM     PAR_PT 2      <DEFS 2         >
 
BCOL            EQU PAR_PT+2    ;DB 0           ;       DM     BCOL   1      <DEFB 0         >
 
TIME_C          EQU BCOL+1      ;DUPL 4,0       ;       DM     TIME_C 4      <DEFB 0,0,0,0   >
 
;  FOR KEYBOARD
 
K_5CNT          EQU TIME_C+4    ;DB 0           ;       DM     K_5CNT 1      <DB 0           >
 
K_LAST          EQU K_5CNT+1    ;DB 0           ;       DM     K_LAST 1      <DB 0           >
 
K_CNT           EQU K_LAST+1    ;DB 0           ;       DM     K_CNT  1      <DB 0           >
 
K_BUF           EQU K_CNT+1     ;DB -1          ;       DM     K_BUF  1      <DB -1          >
 
KEY_DEL         EQU K_BUF+1     ;DB 15          ;       DM     KEY_DEL 1     <DB 15          >
 
KEY_REP         EQU KEY_DEL+1   ;DB 5           ;       DM     KEY_REP 1     <DB 5           >
 
TAIL            EQU KEY_REP+1   ;DB 0           ;       DM     TAIL   1      <DEFB 0         >
 
BEEP_T          EQU TAIL+1      ;DW 0X6008      ;       DM     BEEP_T 2      <DEFW 6008H     >
 
BEEP_K          EQU BEEP_T+2    ;DW 0X3F04      ;       DM     BEEP_K 2      <DEFW 3F04H     >
 
; KB SWITCH
 
KEYBOARD        EQU BEEP_K+2    ;DB 0XC9,0,0    ;       DM     KEYBOARD  3    <DB 0C9H,0,0    >
 
READ_K          EQU KEYBOARD+3  ;DUPL 3,0       ;       DM     READ_K    3
 
STAT_K          EQU READ_K+3    ;DUPL 3,0       ;       DM     STAT_K    3
 
READA_KNW       EQU STAT_K+3    ;DUPL 3,0       ;       DM     READA_KNW 3
 
KB_TYP          EQU READA_KNW+3 ;DUPL 3,0       ;       DM     KB_TYP    3
 
K_INIT          EQU KB_TYP+3    ;DUPL 3,0       ;       DM     K_INIT    3
 
 
 
KS_ASH          EQU K_INIT+3    ;DB 0           ;       DM     KS_ASH    1
 
KS_SHIFTS       EQU KS_ASH+1    ;DB 0           ;       DM     KS_SHIFTS 1
 
KS_UND          EQU KS_SHIFTS+1 ;DW 0           ;       DM     KS_UND    2
 
KS_UNDS         EQU KS_UND+2    ;DB 0           ;       DM     KS_UNDS   1
 
KS_UNDS1        EQU KS_UNDS+1   ;DB 0           ;       DM     KS_UNDS1  1
 
I_MAX           EQU KS_UNDS1+1  ;DB 0           ;       DM     I_MAX  1
 
I_MIN           EQU I_MAX+1     ;DB 0           ;       DM     I_MIN  1
 
I_AVR           EQU I_MIN+1     ;DB 0           ;       DM     I_AVR  1
 
;  EDISK WORK VALUE
 
ED_CYL          EQU I_AVR+1     ;DB 0           ;       DM     ED_CYL 1
 
;  FDISK WORK VALUE
 
SV_SP           EQU ED_CYL+1    ;DW 0           ;       DM     SV_SP  2
 
;  PROTECT VALUE
 
RTIME           EQU SV_SP+2     ;DW 0           ;       DM     RTIME  2
 
;  INTERPAGE LDIR'S PARAMETERS
 
R8_FR           EQU RTIME;+2    ;DB 0           ;       DM     R8_FR  1
 
R8_TO           EQU RTIME+1;2   ;DB 0           ;       DM     R8_TO  1
 
;  ESC SEQUENCE PARAMS
 
PAR1            EQU RTIME+2     ;DB 0           ;       DM     PAR1   1
 
PAR2            EQU PAR1+1      ;DB 0           ;       DM     PAR2   1
 
PAR3            EQU PAR2+1      ;DB 0           ;       DM     PAR3   1
 
PAR4            EQU PAR3+1      ;DB 0           ;       DM     PAR4   1
 
PARR            EQU PAR4+1      ;DUPL 13,0      ;       DM     PARR   13
 
BUF             EQU PAR1
 
;  POWER ON DETECTOR
 
TST_1RUN        EQU PARR+13     ;DW 0           ;       DM     TST_1RUN 2
 
TST_IS1         EQU TST_1RUN+2  ;DB 0           ;       DM     TST_IS1  1
 
 
 
;СМЕЩЕНИЯ ОТ IX
 
_FLAG           EQU LOW (IX_BASE-FLAG)
 
_FLAG1          EQU LOW (IX_BASE-FLAG1)
 
_W_X1           EQU LOW (IX_BASE-W_X1)
 
_W_X2           EQU LOW (IX_BASE-W_X2)
 
_W_Y1           EQU LOW (IX_BASE-W_Y1)
 
_W_Y2           EQU LOW (IX_BASE-W_Y2)
 
_CUR_X          EQU LOW (IX_BASE-CUR_X)
 
_CUR_Y          EQU LOW (IX_BASE-CUR_Y)
 
_C_STAT         EQU LOW (IX_BASE-C_STAT)
 
_CUR_VAL        EQU LOW (IX_BASE-CUR_VAL)
 
_T_FLAG         EQU LOW (IX_BASE-T_FLAG)
 
_MEMDSP         EQU LOW (IX_BASE-MEMDSP)
 
_C_CNT          EQU LOW (IX_BASE-C_CNT)
 
_TMP_W          EQU LOW (IX_BASE-TMP_W)
 
_C_ACT          EQU LOW (IX_BASE-C_ACT)
 
_FE_IMG         EQU LOW (IX_BASE-FE_IMG)
 
_BORDER         EQU LOW (IX_BASE-BORDER)
 
_SYS_P          EQU LOW (IX_BASE-SYS_P)
 
_FUNC           EQU LOW (IX_BASE-FUNC)
 
_FCNT           EQU LOW (IX_BASE-FCNT)
 
_TIME_C         EQU LOW (IX_BASE-TIME_C)
 
_K_5CNT         EQU LOW (IX_BASE-K_5CNT)
 
_K_LAST         EQU LOW (IX_BASE-K_LAST)
 
_K_CNT          EQU LOW (IX_BASE-K_CNT)
 
_K_BUF          EQU LOW (IX_BASE-K_BUF)
 
_TAIL           EQU LOW (IX_BASE-TAIL)
 
_KS_ASH         EQU LOW (IX_BASE-KS_ASH)
 
_KS_SHIFTS      EQU LOW (IX_BASE-KS_SHIFTS)
 
_KS_UND         EQU LOW (IX_BASE-KS_UND)
 
_KS_UNDS        EQU LOW (IX_BASE-KS_UNDS)
 
_I_MAX          EQU LOW (IX_BASE-I_MAX)
 
_I_MIN          EQU LOW (IX_BASE-I_MIN)
 
_ED_CYL         EQU LOW (IX_BASE-ED_CYL)
 
_PAR1           EQU LOW (IX_BASE-PAR1)
 
_PAR2           EQU LOW (IX_BASE-PAR2)
 
_PAR4           EQU LOW (IX_BASE-PAR4)
 
_TST_IS1        EQU LOW (IX_BASE-TST_IS1)
 
_RQCHAN         EQU LOW (IX_BASE-RQCHAN)
 
_RQCOM          EQU LOW (IX_BASE-RQCOM)
 
_RQBLN          EQU LOW (IX_BASE-RQBLN)
 
_RQTRACK        EQU LOW (IX_BASE-RQTRACK)
 
_RQBLOCK        EQU LOW (IX_BASE-RQBLOCK)
 
_RQBADR         EQU LOW (IX_BASE-RQBADR)
 
_RQHEAD         EQU LOW (IX_BASE-RQHEAD)
 
_REP            EQU LOW (IX_BASE-REP)
 
_BUFT           EQU LOW (IX_BASE-BUFT)
 
_BUFSEC         EQU LOW (IX_BASE-BUFSEC)
 
 
 
; REST OF SWITCH AREA
 
CL_SW           EQU 0XDF40
 
SW_DO           EQU CL_SW+3
 
OUT_SW          EQU CL_SW+3
 
SW_CLR          EQU OUT_SW
 
 
 
; SOME DATA AREAS
 
SV_ARE          EQU SW_CLR
 
ARR_CO          EQU SV_ARE+2
 
SG_ENC          EQU ARR_CO+16+3
 
ENC_SI          EQU SG_ENC+4
 
ENC_SO          EQU ENC_SI+4
 
PAL_BUF         EQU ENC_SO+4
 
 
 
; FILLED SWITCH AREA
 
SW_C            EQU CL_SW
 
SW_PUT          EQU CL_SW
 
SW_CLL          EQU CL_SW
 
SW_SCO          EQU CL_SW
 
SW_RRL          EQU CL_SW
 
SW_SIZ          EQU CL_SW
 
 
 
;          IN VALUE
 
RQCHAN          EQU TST_IS1+1   ;DB 0           ;       DM      RQCHAN   1       ;НОМЕР КАНАЛА
 
RQCOM           EQU RQCHAN+1    ;DB 0           ;       DM      RQCOM    1       ;КОМАНДА
 
RQBLN           EQU RQCOM+1     ;DB 0           ;       DM      RQBLN    1       ;ЧИСЛО БЛОКОВ
 
RQTRACK         EQU RQBLN+1     ;DW 0           ;       DM      RQTRACK  2       ;НОМЕР ДОРОЖКИ
 
RQBLOCK         EQU RQTRACK+2   ;DW 0X4F00      ;       DM      RQBLOCK  2       ;НОМЕР БЛОКА
 
RQBADR          EQU RQBLOCK+2   ;DW 0X18        ;       DM      RQBADR   2       ;БУФЕР ПОЛЬЗОВАТЕЛЯ
 
 
 
;          WORK VALUE
 
RQHEAD          EQU RQBADR+2    ;DB 7           ;       DM      RQHEAD   1       ;НОМЕР ГОЛОВКИ
 
RQCYL           EQU RQHEAD+1    ;DW 0           ;       DM      RQCYL    2       ;НОМЕР ЦИЛИНДРА
 
LOCBUF          EQU RQCYL+2     ;DW 0           ;       DM      LOCBUF   2       ;АДРЕС БЛОКА В БУФЕРЕ
 
RQSECT          EQU LOCBUF+2    ;DB 7           ;       DM      RQSECT   1       ;НОМЕР СЕКТОРА
 
DCBUF           EQU RQSECT+1    ;DW 0X300       ;       DM      DCBUF    2       ;АДРЕС БУФЕРА
 
REP             EQU DCBUF+2     ;DB 1           ;       DM      REP      1       ;СЧЕТЧИК ЧИСЛА ПОВТОРОВ
 
 
 
;ПЕРЕМЕННЫЕ КОНТРОЛЕРА ФЛОПОВ
 
FD_TRKS         EQU REP+1       ;DB 0X0A,7;,8,0 ;       DM      FD_TRKS  4       ;НОМЕРА ТЕКУЩИХ ДОРОЖЕК
 
 
 
;БЛОК СОСТОЯНИЯ БУФЕРА
 
BUFT            EQU FD_TRKS+2   ;DB 0           ;       DM      BUFT     1               ;НОМЕР КАНАЛА
 
BUFTRK          EQU BUFT+1      ;DW 0X1001      ;       DM      BUFTRK   2               ;НОМЕР ДОРОЖКИ
 
BUFSEC          EQU BUFTRK+2    ;DB 0X3F        ;       DM      BUFSEC   1               ;НОМЕР СЕКТОРА
 
 
 
;-----------------------
 
DVALID          EQU 0           ;:      DS      1       ;+ ПРИЗНАК ДЕЙСТВИТЕЛЬНОСТИ
 
_DTYP           EQU DVALID+1    ;:      DS      1       ;+ КОД УСТРОЙСТВА
 
_DUS            EQU _DTYP+1     ;:      DS      1       ;+ НОМЕР ПРИВОДА
 
_DDTYP          EQU _DUS+1      ;:      DS      1       ;- КОД ПРИВОДА  (Hi bit - unbuferized)
 
_DHEADF         EQU _DDTYP+1    ;:      DS      1       ;+ ЧИСЛО ФИКСИРОВАННЫХ ГОЛОВОК
 
_DHEADR         EQU _DHEADF+1   ;:      DS      1       ;+ ЧИСЛО СМЕННЫХ ГОЛОВОК
 
_DCYLN          EQU _DHEADR+1   ;:      DS      2       ;+ ЧИСЛО ЦИЛИНДРОВ НА ДИСКЕ
 
_DSECTT         EQU _DCYLN+2    ;:      DS      1       ;+ ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ
 
_DBYTES         EQU _DSECTT+1   ;:      DS      2       ;+ ЧИСЛО БАЙТОВ В СЕКТОРЕ
 
_DALTCYL        EQU _DBYTES+2   ;:      DS      1       ;+ ЧИСЛО СИСТЕМНЫХ ДОРОЖЕК
 
_DBEGCYL        EQU _DALTCYL+1  ;:      DS      2       ;+ НОМЕР НАЧАЛЬНОГО ЦИЛИНДРА
 
_DBLDR          EQU _DBEGCYL+2  ;:      DS      2       ;+ ЧИСЛО БЛОКОВ НА ДИСКЕ
 
_DBLTR          EQU _DBLDR+2    ;:      DS      2       ;+ ЧИСЛО БЛОКОВ НА ДОРОЖКЕ
 
_DTRACK         EQU _DBLTR+2    ;:      DS      2       ;+ ЧИСЛО ДОРОЖЕК НА ДИСКЕ
 
_DSEKTL         EQU _DTRACK+2   ;:      DS      1       ;+ ДЛИНА НОМЕРА БЛОКА В СЕКТОРЕ
 
_DDIRENT        EQU _DSEKTL+1   ;:      DS      2       ;+ ЧИСЛО ЗАПИСЕЙ В ДИРЕКТОРИИ
 
_DIF0           EQU _DDIRENT+2  ;:      DS      1       ;+ РАЗМЕТКА ПЕРВОЙ ДОРОЖКИ
 
_DIF1           EQU _DIF0+1     ;:      DS      1       ;+ РАЗМЕТКА ВТОРОЙ ДОРОЖКИ
 
_DIF2           EQU _DIF1+1     ;:      DS      1       ;+ РАЗМЕТКА ВСЕХ ОСТАВШИХСЯ ДОРОЖЕК
 
_DTIF           EQU _DIF2+1     ;:      DS      1       ;? СМЕЩЕНИЕ ПЕРВОГО СЕКТОРА
 
_DF8            EQU _DTIF+1     ;       DS      1       ;+ ПРИЗНАК 8-ДЮЙМОВОГО ДИСКА
 
;  ИЛИ НОМЕР НАЧАЛЬНОЙ ГОЛОВКИ
 
_DFMFM          EQU _DF8+1      ;:      DS      1       ;+ ПЛОТНОСТЬ ЗАПИСИ
 
_DFN            EQU _DFMFM+1    ;:      DS      1       ;+ РАЗМЕР СЕКТОРА
 
_DFGPL          EQU _DFN+1      ;:      DS      1       ;+ GAP3 ДЛЯ ЧТЕНИЯ/ЗАПИСИ
 
_DFGPF          EQU _DFGPL+1    ;:      DS      1       ;+ GAP3 ДЛЯ ФОРМАТА
 
_DFSRHUT        EQU _DFGPF+1    ;:      DS      1       ;+ ВРЕМЯ ШАГА
 
;  ИЛИ ВРЕМЯ ШАГА ПРИ SEEK
 
_DFHLT          EQU _DFSRHUT+1  ;       DS      1:                      ;+ ВРЕМЯ ОПУСКАНИЯ ГОЛОВКИ
 
;  ИЛИ ВРЕМЯ ШАГА ПРИ RECALIBRATE
 
_DFMOTOR        EQU _DFHLT+1    ;:      DS      1       ;+ ПРИЗНАК ВКЛЮЧЕНИЯ МОТОРА
 
;-----------------------