;LAST UPDATE: 07.10.2021 savelij
RCALL MACRO ADDR
LD SP,RADDR
JP ADDR
IF MOMPASS > 1
RADDR DW $+2
ELSE
RADDR := $+2
ENDIF
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 ;+ ПРИЗНАК ВКЛЮЧЕНИЯ МОТОРА
;-----------------------