├── bk ├── 100000z5x.txt ├── disk_326.lst └── README.md ├── dvk_kcgd ├── README.md └── ramkcgd181.txt ├── ms0511-uknc ├── RAM.LST ├── ROM1.lst ├── ROM2.lst ├── ROM3.lst ├── ROM4.lst ├── ROM5.lst ├── ROM6.lst └── readme.txt ├── ms7004 └── README.md ├── nemiga ├── nemiga-303.lst ├── nemiga-405.lst ├── nemiga-406.lst └── README.md ├── mk85 └── README.md ├── mk90 └── README.md ├── dvk_ksm └── README.md ├── PK-6128c └── readme.txt ├── README.md ├── poisk1 ├── RESTART.ASM ├── INT13.ASM ├── STP2.ASM ├── BIOS.ASM ├── INT12.ASM ├── ASMI.C ├── TBL_KBDP.ASM ├── VEK.ASM ├── INT11.ASM ├── INT19.ASM ├── INT15_NP.ASM ├── INT_TIME.ASM ├── INT10_C.ASM ├── TBL_INT9.ASM ├── INT16N.ASM ├── INT1A.ASM ├── INT15_B.ASM ├── MONN.ASM ├── STP1.ASM ├── RWCAS.ASM ├── INT10_B2.ASM ├── TEST.ASM ├── NMISER.ASM ├── ALTTAB.ASM └── CRT_GEN.ASM ├── poisk2 ├── INT1A.ASM ├── INT12.ASM ├── INT15.ASM ├── INT11.ASM ├── INT_70.ASM ├── INT8.ASM ├── D8.ASM ├── BIOSEQU1.ASM ├── TYME_1.ASM ├── INT5.ASM ├── INT17.ASM ├── TYME_CMO.ASM ├── ALTGEN.ASM ├── CHARGEN.ASM ├── D7.ASM ├── SET_DOP.ASM ├── HD_SETUP.ASM └── INT14.ASM ├── dvk_kmd ├── README.txt └── ramkmd.txt ├── gridcomp └── ccoskern.d └── agat └── teac.lst /bk/100000z5x.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/bk/100000z5x.txt -------------------------------------------------------------------------------- /bk/disk_326.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/bk/disk_326.lst -------------------------------------------------------------------------------- /bk/README.md: -------------------------------------------------------------------------------- 1 | 100000z5x.txt file source: user a214 at https://bk0010.org/forum/?id=3073&old 2 | -------------------------------------------------------------------------------- /dvk_kcgd/README.md: -------------------------------------------------------------------------------- 1 | disassembly of ROM with SHA1 hash 412c3eb71bece6f791fc5a9d707cf4692fd0b45b 2 | -------------------------------------------------------------------------------- /ms0511-uknc/RAM.LST: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/RAM.LST -------------------------------------------------------------------------------- /ms0511-uknc/ROM1.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM1.lst -------------------------------------------------------------------------------- /ms0511-uknc/ROM2.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM2.lst -------------------------------------------------------------------------------- /ms0511-uknc/ROM3.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM3.lst -------------------------------------------------------------------------------- /ms0511-uknc/ROM4.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM4.lst -------------------------------------------------------------------------------- /ms0511-uknc/ROM5.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM5.lst -------------------------------------------------------------------------------- /ms0511-uknc/ROM6.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/ROM6.lst -------------------------------------------------------------------------------- /ms7004/README.md: -------------------------------------------------------------------------------- 1 | disassembly of ROM with SHA1 hash 2d7cc7cd182f2ee09ecf2c539e33db3c2195f778 2 | -------------------------------------------------------------------------------- /nemiga/nemiga-303.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/nemiga/nemiga-303.lst -------------------------------------------------------------------------------- /nemiga/nemiga-405.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/nemiga/nemiga-405.lst -------------------------------------------------------------------------------- /nemiga/nemiga-406.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/nemiga/nemiga-406.lst -------------------------------------------------------------------------------- /mk85/README.md: -------------------------------------------------------------------------------- 1 | Elektronika MK-85 ROM disassembly by Piotr Piatek 2 | http://pisi.com.pl/piotr433/ 3 | -------------------------------------------------------------------------------- /mk90/README.md: -------------------------------------------------------------------------------- 1 | Elektronika MK-90 ROM disassembly by Piotr Piatek 2 | http://pisi.com.pl/piotr433/ 3 | -------------------------------------------------------------------------------- /ms0511-uknc/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shattered/retro-bios/HEAD/ms0511-uknc/readme.txt -------------------------------------------------------------------------------- /dvk_ksm/README.md: -------------------------------------------------------------------------------- 1 | disassembly of ROM with SHA1 hashes dd41dfb4cb3f1cf22d96d95f1ff6a27fe4eb9a38, 1f4f82c2f88f1e8615ec02076559dc606497e654 2 | -------------------------------------------------------------------------------- /nemiga/README.md: -------------------------------------------------------------------------------- 1 | https://github.com/nzeemin/nemigabtl/tree/master/docs 2 | http://www.emuverse.ru/wiki/%D0%9D%D0%B5%D0%BC%D0%B8%D0%B3%D0%B0 3 | -------------------------------------------------------------------------------- /PK-6128c/readme.txt: -------------------------------------------------------------------------------- 1 | Дизасм прошивки ПК-6128ц - Юрий Ларин (Improver) 2 | Источник: https://github.com/ImproverX/PK-6128c/blob/main/ROM.asm 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | retro-bios 2 | ========== 3 | 4 | Sources and/or disassembly listings to BIOS of ex-USSR PC clones and the like 5 | 6 | Sources and/or disassembly listings of the DEC Rainbow 100 BIOS (an early PC with VT100/VT102 capability). 7 | -------------------------------------------------------------------------------- /poisk1/RESTART.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------------------------------------------------- 3 | ; Вектор сброса по включении питания 4 | ;--------------------------------------------------------------------------- 5 | ORG 0FFF0H 6 | ;-------Сброс по включении питания 7 | 8 | JMP FAR PTR RESETV 9 | DB '10/07/88' ;Маркер даты создания версии BIOS 10 | DB 0FFH 11 | DB 0FFH ;Маркер IBM/PC 12 | ; DB 0FFH 13 | 14 | CODE ENDS 15 |  -------------------------------------------------------------------------------- /poisk2/INT1A.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;---INT 1A----------------------------------------------------------------- 3 | ; TIME_OF_DAY 4 | ; THIS ROUTINE ALLOWS THE CLOCK TO BE SET/READ 5 | ; 6 | ;INPUT 7 | ; (AH)=0 READ THE CURRENT CLOCK SETTING 8 | ; RETURNS CX=HIGH PORTION OF COUNT 9 | ; DX=LOW PORTION OF COUNT 10 | ; AL=0 IF TIMER HAS NOT PASSED 24 HOURS SINCE LAST READ 11 | ; <>0 IF ON ANOTHER DAY 12 | ; (AH)=1 SET THE CURRENT CLOCK 13 | ; CX=HIGH PORTION OF COUNT 14 | ; DX=LOW PORTION OF COUNT 15 | ; NOTE:COUNTS OCCUR AT THE RATE OF 1193180/65536 COUNTS/SEC 16 | ; (OR ABOUT 18.2 PER SECOND -- SEE EQUATES BELOW) 17 | ;---------------------------------------------------------------------------- 18 | ORG 0FE6EH 19 | TIME_OF_DAY: jmp TIME_2 20 | 21 |  -------------------------------------------------------------------------------- /poisk1/INT13.ASM: -------------------------------------------------------------------------------- 1 | ;---------------------------------------------------------- 2 | ; ВВОД/ВЫВОД С ДИСКЕТЫ (INT 13H) 3 | ;---------------------------------------------------------- 4 | 5 | ;DISKETTE_IO PROC NEAR 6 | ; JMP INT13_SERVICE 7 | ;DISKETTE_IO ENDP 8 | 9 | 10 | TEST_TABLIC LABEL WORD ;Таблица координации аппаратуры 11 | DW 0,0,0,0 ;Адреса адаптеров RS232 12 | DW 0378H,0,0,0 ;Адреса принтеров 13 | DW 40ECH ;Установить '4 устройства' 14 | DB 0 ;Флаг инициализации 15 | DW 96 ;Размер памяти в Кбайтах 16 | DW 40H ;Память канала ввода/вывода 17 | DB 0 18 | DB 0 19 | DB 0 20 | DW 1EH ;Указатель вершины буфера 21 | DW 1EH ;Указатель начала буфера 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /dvk_kmd/README.txt: -------------------------------------------------------------------------------- 1 | Источник: https://www.tis.kz/forum/topic.php?forum=28&topic=7&postid=1454491868#1454491868 2 | 3 | Архив прошивок КМД ДВК от тов. Alex_K. 4 | 5 | В прикрепленном архиве все известные четыре прошивки на КМД ДВК 6 | - бинарные файлы и дизассемблированные варианты с комментариями, 7 | плюс файл распределения памяти. 8 | 9 | Загадочный бит "ошибочное функционирование контроллера" тоже не ясен 10 | из документации. У меня он выставился один раз только - при bus timeout. 11 | При ошибочном функционировании контроллера другие биты не играют роли, 12 | в младшем байте содержится код ошибки: 13 | 14 | 100000 - возникло прерывание TRAP10 15 | 100001 - нет исправных блоков ОЗУ 16 | 100002 - ошибка контрольной суммы ПЗУ 17 | 100003 - TRAP4 во время операций чтения/записи 18 | 100004 - TRAP4 не во время операций чтения/записи 19 | 100005 - ошибка тестирования процессора 20 | 100006 - ошибка регистра команд 21 | 100007 - ошибка регистра данных 22 | 100010 - ошибка РСН накопителя 23 | 100012 - прерывание по вектору 24 -------------------------------------------------------------------------------- /poisk1/STP2.ASM: -------------------------------------------------------------------------------- 1 | 2 | AN_STR PROC NEAR 3 | PUSH AX 4 | PUSH DS 5 | MOV AX,DATA 6 | MOV DS,AX 7 | MOV AL,T_CURSOR 8 | INC K_CICL 9 | ADD AL,K_CICL 10 | MOV AH,80 11 | TEST CRT_MODE,2 12 | JNZ AN0 13 | MOV AH,40 14 | AN0: 15 | CMP AL,AH 16 | JNZ AN180 17 | MOV K_CICL,0 18 | MOV T_CURSOR,0 19 | ADD DI,80*3 20 | AN180: 21 | POP DS 22 | POP AX 23 | RET 24 | AN_STR ENDP 25 | 26 | ;AN_STR40 PROC NEAR 27 | ; PUSH AX 28 | ; MOV AL,T_CURSOR 29 | ; INC K_CICL 30 | ; ADD AL,K_CICL 31 | ; CMP AL,40 32 | ; JNZ AN140 33 | ; MOV K_CICL,0 34 | ; MOV T_CURSOR,0 35 | ; ADD DI,80*4 36 | ; 37 | ;AN140: 38 | ; POP AX 39 | ; RET 40 | ;AN_STR40 ENDP 41 | 42 | 43 | 44 | ORG 0F065H 45 | 46 | -------------------------------------------------------------------------------- /poisk1/BIOS.ASM: -------------------------------------------------------------------------------- 1 | ;ver 26.02.90 2 | ;****** ОТКРЫТА ПАМЯТЬ (96К) ****** 3 | 4 | INCLUDE EQU.ASM ;Константы и переменные 5 | INCLUDE TEST.ASM ;Начальный тест и инициализация 6 | INCLUDE MONN.ASM ;Монитор 7 | INCLUDE ALTTAB.ASM ; Таблица альтернативных кодов 128 - 256 8 | INCLUDE INT19.ASM ;INT19 - загрузка системы 9 | INCLUDE INT10_B2.ASM ;Write_TTY и световое перо 10 | INCLUDE TBL_KBDP.ASM 11 | INCLUDE INT16N.ASM 12 | INCLUDE TBL_INT9.ASM 13 | INCLUDE INT9.ASM 14 | INCLUDE INT_TIME.ASM 15 | INCLUDE INT13.ASM 16 | INCLUDE SCANINT2.ASM 17 | INCLUDE NMISER.ASM 18 | INCLUDE INT15_B.ASM 19 | INCLUDE RWCAS.ASM ;INT15 - РАБОТА С ФАЙЛАМИ 20 | INCLUDE STP2.ASM 21 | INCLUDE INT10_A.ASM 22 | INCLUDE INT10_BN.ASM 23 | INCLUDE INT10_C.ASM ;INT10 - часть 3 24 | INCLUDE INT12.ASM 25 | INCLUDE INT11.ASM 26 | INCLUDE INT15_A.ASM 27 | INCLUDE CRT_GEN.ASM 28 | INCLUDE INT1A.ASM 29 | INCLUDE VEK.ASM 30 | INCLUDE INT15_NP.ASM 31 | INCLUDE STP1.ASM ;П/П звукового сигнала и печати сообщений 32 | INCLUDE RESTART.ASM 33 | end 34 | -------------------------------------------------------------------------------- /poisk1/INT12.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;---INT 12-------------------------------------------------------------- 3 | ; MEMORY_SIZE_DETERMINE 4 | ; Эта программа определяет размер памяти в системе посредством анализа 5 | ; переключателей на плате. 6 | ; Вход: 7 | ; Размер памяти устанавливается во время диагностики по включении 8 | ; питания, используя биты 0-3 портов G0 и G2. 9 | ; Выход: 10 | ; (AX) - размер памяти в Кбайтах 11 | ;-------------------------------------------------------------------------- 12 | ASSUME CS:CODE,DS:DATA 13 | MEMORY_SIZE_DETERMINE PROC FAR 14 | STI ;Разрешить прерывания 15 | PUSH DS ;Сохранить регистр сегмента 16 | MOV AX,DATA ;Установить адресацию 17 | MOV DS,AX 18 | MOV AX,MEMORY_SIZE ;Получить значение размера памяти 19 | POP DS ;Восстановить сегмент 20 | IRET ;Возврат из прерывания 21 | MEMORY_SIZE_DETERMINE ENDP 22 | 23 | -------------------------------------------------------------------------------- /poisk1/ASMI.C: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | main() 5 | { 6 | char mass[133]; 7 | char str[100],name[13]; 8 | int i,finc = 0, 9 | kk = 0; 10 | int len = 0; 11 | FILE *in,*out,*incl; 12 | in = fopen("bios.lst","rt"); 13 | out = fopen("bios.asm","wt"); 14 | for (i = 0; i <= 99; i ++) { 15 | str[i] = 0; 16 | } 17 | for (;;) 18 | { 19 | if (fgets(mass,133,in) == 0) break; 20 | len = strlen(mass); 21 | if (len >= 100) len = 99; 22 | if (len > 32) { 23 | for (i = 0; i <= len; i ++) { 24 | str[i] = mass[i+32]; 25 | } 26 | kk = strncmp(str,"INCLUDE",7); 27 | if (kk == 0) { 28 | if (finc > 0) { 29 | fclose(incl); 30 | finc --; 31 | } 32 | finc ++; 33 | fputs(str,out); 34 | for (i = 0; i < 12; i ++) { 35 | name[i] = str[i+8]; 36 | } 37 | name[12] = 0; 38 | incl = fopen(name,"wt"); 39 | } 40 | if (finc > 0) fputs(str,incl); 41 | else fputs(str,out); 42 | for (i = 0; i <= len; i ++) { 43 | str[i] = 0; 44 | } 45 | } 46 | } 47 | fclose(in); 48 | fclose(out); 49 | fclose(incl); 50 | return(0); 51 | } 52 | 53 | 54 | 55 |  -------------------------------------------------------------------------------- /poisk1/TBL_KBDP.ASM: -------------------------------------------------------------------------------- 1 | ;---------------------------------------------------------------------------- 2 | ; таблица для комплекса "ПОИСК" 3 | ;---------------------------------------------------------------------------- 4 | ; 12.02.88 Батьковский М.Б. 5 | ;---------------------------------------------------------------------------- 6 | ; таблица описания матрицы клавиатуры (12*8) 7 | ; отрицательный код (-1..-0FH) -- ссылка на строку таблицы LN_KEY1 8 | ;- колонки--1----2----3----4----5----6----7----8----9----10---11--12- 9 | LINE1 DB 55H, 4CH, 00H, 56H, 35H, 1CH, 48H, 50H,-0CH, 18H,-0BH,57H 10 | LINE2 DB -0FH, 4BH, 52H, 41H,-0DH, 0EH, 47H, 4FH, -2H, -3H, 19H,54H 11 | LINE3 DB 21H, 49H, 51H, 31H, 20H, 1FH, 2CH, 00H, 32H, 25H, 30H,22H 12 | LINE4 DB 3DH, 00H, 00H, 40H, 3CH, 3BH, -1H, 01H, -9H,-0AH, 3FH,3EH 13 | LINE5 DB 12H, 00H, 9DH, 23H, 11H, 10H, 1EH, 3AH, 24H, 17H, 14H,13H 14 | LINE6 DB 0AAH, 37H,0B8H, 2EH, 2DH,0DCH,0DBH,0AAH, 58H, 59H, 2FH,39H 15 | LINE7 DB 00H, 45H, 53H, 00H, 27H, 44H, 4EH, 4DH, 26H, 42H, 5AH,43H 16 | LINE8 DB -06H, 4AH, 0FH, 15H, -7H, 46H, -4H, 2BH, 00H, 16H, -5H,-8H 17 | ;---------------------------------------------------------------------------- 18 | ; 03.02.88 - х-54,ъ-55,ж-56,э-57,ю-58,б-59,е-5A/ новые скан коды 19 | 20 | 21 | ORG 0E82DH 22 | 23 | DB 8FH ;Это ПОИСК 24 | 25 | -------------------------------------------------------------------------------- /poisk2/INT12.ASM: -------------------------------------------------------------------------------- 1 | ;----INT 12-------------------------------------------------------------- 2 | ; AS REPRESENTED BY THE SWITCHES ON THE PLANAR. NOTE THAT THE 3 | ; SYSTEM MAY NOT BE ABLE TO USE I/O MEMORY UNLESS THERE 4 | ; IS A FULL COMPLEMENT OF 64K BYTES ON THE PLANAR. 5 | ; INPUT 6 | ; NO REGISTERS 7 | ; THE MEMORY_SIZE VARIABLE IS SET DURING POWER ON DIAGNOSTICS 8 | ; ACCORDING TO THE FOLLOWING HARDWARE ASSUMPTIONS: 9 | ; PORT 60 BITS 3,2=00-16K BASE RAM 10 | ; 01-32K BASE RAM 11 | ; 10-48K BASE RAM 12 | ; 11-64K BASE RAM 13 | ; PORT 62 BITS 3-0 INDICATE AMOUNT OF I/O RAM IN 32K INCREMENTS 14 | ; E.G.,0000-NO RAM IN I/O CHANNEL 15 | ; 0010-64K RAM IN I/O CHANNEL,ETC. 16 | ; OUTPUT 17 | ; (AX)=NUMBER OF CONTIGUOUS 1K BLOCKS OF MEMORY 18 | ;-------------------------------------------------------------------------- 19 | ASSUME CS:CODE,DS:DATA 20 | ORG 0F841H 21 | MEMORY_SIZE_DET PROC FAR 22 | STI ;INTERRUPTS BACK ON 23 | PUSH DS ;SAVE SEGMENT 24 | CALL DDS 25 | MOV AX,MEMORY_SIZE ;GET VALUE 26 | POP DS ;RECOVER SEGMENT 27 | IRET ;RETURN TO CALLER 28 | MEMORY_SIZE_DET ENDP 29 | 30 | -------------------------------------------------------------------------------- /poisk2/INT15.ASM: -------------------------------------------------------------------------------- 1 | ;******************************************************** 2 | ;* * 3 | ;* AT РАСШИРЕННЫЙ СЕРВИС * 4 | ;* I N T 1 5 * 5 | ;* * 6 | ;******************************************************** 7 | ; 8 | ;-- INT 15 --------------------------------------------- 9 | ; ; 10 | ; INT_15_SERVICE ; 11 | ; ; 12 | ; ЭТА ПРОЦЕДУРА ОБЕСПЕЧИВАЕТ РАСШИРЕННЫЙ СЕРВИС 13 | ; ; 14 | ; ВХОД ; 15 | ; AH = C0 - ВОЗВРАЩАЕТ КОНФИГУРАЦИЮ СИСТЕМЫ 16 | ; ; 17 | ; ; 18 | ;------------------------------------------------------- 19 | ORG 0F859H 20 | INT_15_SERVICE Proc NEAR 21 | STI 22 | CMP AH,80H ; РАСШИРЕННАЯ ФУНКЦИЯ ? 23 | 24 | INT_15_AT_SERVICE: 25 | ; 26 | ;------ УПРАВЛЕНИЕ ЗАНЯТЫМИ УСТРОЙСТВАМИ 27 | ; 28 | CMP AH,90H 29 | JE INT_15_OK 30 | ;------ РУКОВОДСТВО ЗАВЕРШЕНИЕМ ПРЕРЫВАНИЙ 31 | CMP AH,91H 32 | JE INT_15_OK 33 | ;------ ВОЗВРАТ КОНФИГУРАЦИИ СИСТЕМЫ 34 | CMP AH,0C0H 35 | JNE INT_15_BAD 36 | PUSH CS 37 | POP ES ; УКАЗАТЕЛЬ НА ТАБЛИЦУ 38 | MOV BX,Offset C0_TBL 39 | INT_15_OK: 40 | XOR AH,AH ; AH=0 - ПРАВИЛЬНЫЙ СТАТУС 41 | INT_15_RET: 42 | RETF 2 43 | INT_15_BAD: 44 | STC 45 | MOV AH,86H 46 | JMP short INT_15_RET 47 | INT_15_SERVICE EndP 48 | ; 49 | ;------ СИСТЕМНАЯ ТАБЛИЦА ДИСКРИПТОРОВ 50 | ; 51 | C0_TBL DW 8 ; Length of DESC 52 | DB 0FBH ; Model 53 | DB 00 ; SubModel 54 | DB 2 ; BIOS revision level 55 | DB 10100000B ; FEATURE : 56 | ; bit 7=1 BIOS use DMA ch 3 57 | ; bit 6=0 One INT ctrl 58 | ; bit 5=1 Real-time Clock present 59 | ; bit 4=1 KBD escape sequence (INT 15) 60 | ; called in KBD INT (INT 9) 61 | ; bit 2=1 Extended BIOS data area is allocated 62 | DB 0,0,0,0 63 | 64 |  -------------------------------------------------------------------------------- /dvk_kmd/ramkmd.txt: -------------------------------------------------------------------------------- 1 | 0W Регистр ошибок и состояния 2 | 2W Копия РС накопителя 3 | 4W Начальный адрес массива данных (00-15) 4 | 6W Количество слов массива данных 5 | 10W Указатель на текущий номер дорожки текущего привода (47 - 52) 6 | 12W Размер сектора в словах 7 | 14W Сторона/дорожка в формате заголовка 8 | 16W Адресная метка 9 | 20W Время опускания головки 10 | 22W Время подъема головки 11 | 24W Время шага 12 | 26W Кол-во пропускаемых слов при чтении/записываемых нулей при записи 13 | 30W Признак чтения =0, записи !=0 14 | 32W Временный счетчик 15 | 34-42W Блок параметров (34W - заполнитель при форматировании) 16 | 44B Расширение адреса массива данных (21-16) 17 | 45B Код функции 18 | 46B Номер запрашиваемого привода 19 | 47-52B Номера текущих дорожек 20 | 53B Запрашиваемая дорожка 21 | 54B Номер дорожки включения предкомпенсации записи 22 | 55B Номер запрашиваемого сектора 23 | 56B Номер последнего сектора на дорожке 24 | 57B Кол-во оставшихся оборотов для поиска сектора 25 | 60B Кол-во оборотов для поиска сектора 26 | 61B Признак чтения с меткой 27 | 62B Размер GAP3 в словах 28 | 63B Размер GAP4 в словах 29 | 64B Признак односторонней операции текущего накопителя 30 | 65-70B Признаки односторонних накопителей 31 | 72,74 Команда перехода на обработку TRAP4 32 | 76,100 Команда перехода на обработку TRAP10 33 | 102,104 Команда перехода на обработку PWRFAIL (24) 34 | 104,106 Команда перехода на обработку IRQ2 (100) 35 | 36 | Разница между прошивками 092, 093, 255 37 | ====================================== 38 | 092 093 255 39 | ====================================== 40 | 000000 122/ 021000 024000 030000 41 | 130/ 015000 020000 024000 42 | 370/ 021000 024000 030000 43 | 452/ 021000 024000 030000 44 | 000010 004/ 012737 012737 000240 45 | 006/ 020400 023000 000240 46 | 010/ 177760 177760 000240 47 | 000012 000/ 015540 034140 017160 48 | -------------------------------------------------------------------------------- /poisk1/VEK.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; Эти векторы пересылаются в область прерываний 8086 3 | ; по включении питания 4 | ;---------------------------------------------------------------------------- 5 | VECTOR_TABLE LABEL WORD ;Таблица векторов прерываний 6 | DW DUMMY_RETURN ;Прерывание 5H 7 | DW DUMMY_RETURN ;Прерывание 6H 8 | DW DUMMY_RETURN ;Прерывание 7H 9 | DW OFFSET TIMER_INT ;Прерывание 8 10 | DW OFFSET KB_INT ;Прерывание 9 11 | DW OFFSET HARD_RETURN ;Прерывание A 12 | DW OFFSET HARD_RETURN ;Прерывание B 13 | DW OFFSET HARD_RETURN ;Прерывание C 14 | DW OFFSET HARD_RETURN ;Прерывание D 15 | DW OFFSET SCANINT ;Прерывание E 16 | DW OFFSET HARD_RETURN ;Прерывание F 17 | DW OFFSET VIDEO_IO ;Прерывание 10H 18 | DW OFFSET EQUIPMENT ;Прерывание 11H 19 | DW OFFSET MEMORY_SIZE_DETERMINE ;Прерывание 12H 20 | DW DUMMY_RETURN ;Прерывание 13H 21 | DW DUMMY_RETURN ;Прерывание 14H 22 | DW OFFSET CASSETTE_IO ;Прерывание 15H 23 | DW KEYBOARD_IO ;Прерывание 16H 24 | DW DUMMY_RETURN ;Прерывание 17H 25 | DW OFFSET MONITOR ;Прерывание 18H (Монитор) 26 | DW OFFSET BOOT_STRAP ;Прерывание 19H 27 | DW TIME_OF_DAY ;Прерывание 1AH (Время суток) 28 | DW DUMMY_RETURN ;Прерывание 1BH (Прерывание клавиатуры) 29 | DW DUMMY_RETURN ;Прерывание 1CH (Прерывание таймера) 30 | DW VIDEO_PARMS ;Прерывание 1DH (Параметры ВИДЕО) 31 | DW DUMMY_RETURN ;Прерывание 1EH (Параметры диска) 32 | DW OFFSET ALTC ;Прерывание 1FH (Указатель VIDEO_EXT) 33 | 34 | -------------------------------------------------------------------------------- /poisk2/INT11.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;---INT 11------------------------------------------------------------------ 3 | ; EQUIPMENT DETERMINATION 4 | ; THIS ROUTINE ATTEMPTS TO DETERMINE WHAT OPTIONAL 5 | ; DEVICES ARE ATTACHED TO THE SYSTEM. 6 | ; INPUT 7 | ; NO REGISTERS 8 | ; THE EQUIP_FLAG VARIABLE IS SET DURING THE POWER ON DIAGNOSTICS 9 | ; USING THE FOLLOWING HARDWARE ASSUMPTIONS: 10 | ; PORT 60 = LOW ORDER BYTE OF EQUPMENT 11 | ; PORT 3FA = INTERRUPT IO REGISTER OF 8250 12 | ; BITS 7-3 ARE ALWAYS 0 13 | ; PORT 378 = OUTPUT PORT OF PRINTER -- 8255 PORT THAT 14 | ; CAN BE READ AS WELL AS WRITTEN 15 | ; OUTPUT 16 | ; (AX) IS SET,BIT SIGNIFICANT,TO INDICATE ATTACHED I/O 17 | ; BIT 15,14 = NUMBER OF PRINTERS ATTACHED 18 | ; BIT 13 NOT USED 19 | ; BIT 12 = GAME I/O ATTACHED 20 | ; BIT 11,10,9 = NUMBER OF RS232 CARDS ATTACHED 21 | ; BIT 8 UNUSED 22 | ; BIT 7,6 = NUMBER OF DISKETTE DRIVES 23 | ; 00=1,01=2,10=3,11=4 ONLY IF BIT 0 = 1 24 | ; BIT 5,4 = INITIAL VIDEO MODE 25 | ; 00 - UNUSED 26 | ; 01 - 40*25 BW USING COLOR CARD 27 | ; 10 - 80*25 BW USING COLOR CARD 28 | ; 11 - 80*25 BW USING BW CARD 29 | ; BIT 3,2 = PLANAR RAM SIZE (00=16K,01=32K,10=48K,11=64K) 30 | ; BIT 1 NOT USED 31 | ; BIT 0 = IPL FROM DISKETTE -- THIS BIT INDICATES THAT THERE 32 | ; ARE DISKETTE DRIVES ON THE SYSTEM 33 | ; 34 | ; NO OTHER REGISTERS AFFECTED 35 | ;--------------------------------------------------------------------------- 36 | ASSUME CS:CODE,DS:DATA 37 | ORG 0F84DH 38 | EQUIPMENT PROC FAR 39 | STI ;INTERRUPTS BACK ON 40 | PUSH DS ;SAVE SEGMENT REGISTER 41 | CALL DDS 42 | MOV AX,EQUIP_FLAG ;GET THE CURRENT SETTING 43 | POP DS ;RECOVER SEGMENT 44 | IRET ;RETURN TO CALLER 45 | EQUIPMENT ENDP 46 | 47 | -------------------------------------------------------------------------------- /poisk1/INT11.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;---INT 11------------------------------------------------------------------ 3 | ; EQUIPMENT DETERMINATION 4 | ; Эта программма определяет, какие штатные устройства подсоединены к 5 | ; системе. 6 | ; Вход: 7 | ; Переменная EQUIP_FLAG устанавливается во время диагностики по включении 8 | ; питания, используя следующие выходы оборудования: 9 | ; Порт 60 - младший байт переменной, 10 | ; Порт 3FA - регистр прерывания ввода/вывода 8250 (биты 7-3 всегда 0), 11 | ; Порт 378 - выходной порт принтера (8255), может быть прочитан и записан 12 | ; Выход: 13 | ; (AX) устанавливает биты для указания значения ввода/вывода: 14 | ; Биты 15,14 - число печатающих устройств, 15 | ; Бит 13 - не используется, 16 | ; Бит 12 - игровой ввод/вывод подключен, 17 | ; Биты 11,10,9 - номер подключенного адаптера RS232, 18 | ; Бит 8 - не используется, 19 | ; Биты 7,6 - число накопителей ГМД, 20 | ; (00-1,01-2,10-3,11-4 при бите 0=1) 21 | ; Биты 5,4 - начальный видео-режим: 22 | ; 00 - не испльзуется 23 | ; 01 - 40*25 ч/б, использующий цветной адаптер 24 | ; 10 - 80*25 ч/б, использующий цветной адаптер 25 | ; 11 - 80*25 ч/б, использующий ч/б адаптер 26 | ; Биты 3,2 - размер памятим микросхемы (00-16K,01-32K,10-48K,11-64K), 27 | ; Бит 1 - не используется, 28 | ; Бит 0 - загрузка с дискеты (бит указывает, что в системе есть 29 | ; устройство ГМД), 30 | ; Другие регистры не используются 31 | ;--------------------------------------------------------------------------- 32 | ASSUME CS:CODE,DS:DATA 33 | EQUIPMENT PROC FAR 34 | STI ;Разрешить прерывания 35 | PUSH DS ;Сохранить сегментный регистр 36 | MOV AX,DATA ;Установить адресацию 37 | MOV DS,AX 38 | MOV AX,EQUIP_FLAG ;Получить текущее состояние 39 | POP DS ;Восстановить сегмент 40 | IRET ;Возврат к программе 41 | EQUIPMENT ENDP 42 | 43 | -------------------------------------------------------------------------------- /poisk2/INT_70.ASM: -------------------------------------------------------------------------------- 1 | ;-------INT 70 (LEVEL 8)-------------------------------------------- 2 | ; THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM 3 | ; THE NON-VOLATILE TIMER. INPUT FREQUENCY IS 1024 KHZ OR 4 | ; APPROXIMATELY 1024 INTERRUPTS EVERY SECOND FOR THE PERIODIC 5 | ; INTERRUPT. FOR THE ALARM FUNCTION, AN INTERRUPT WILL OCCUR 6 | ; AT THE DESIGNATED TIME. 7 | ; 8 | ; THE INTERRUPT IS ENABLED ONLY WHEN EVENT OR ALARM FUNCTIONS 9 | ; ARE ACTIVE. 10 | ; FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE WAIT 11 | ; COUNTER AND WHEN IT EXPIRES WILL TURN ON THE HIGH ORDER BIT 12 | ; OF THE DESIGNATED FLAG. 13 | ; FOR THE ALARM INTERRUPT, THE USER ROUTINE WILL BE INVOKED 14 | ; THROUGH INT 4AH. THE USER MUST CODE A ROUTINE AND PLACE THE 15 | ; CORRECT ADDRESS IN THE VECTOR TABLE. 16 | ;------------------------------------------------------------------- 17 | RTC_INT PROC FAR 18 | assume cs:code,ds:data 19 | STI ;INTERRUPTS BACK ON 20 | PUSH DS ;SAVE REGISTERS 21 | PUSH AX 22 | PUSH DX 23 | PUSH DI 24 | call dds 25 | MOV DL,0AH ;GET ENABLES 26 | CALL PORT_INC 27 | IN AL,CMOS_PORT+1 28 | MOV AH,AL ;SAVE 29 | CALL PORT_INC ;GET SOURCE 30 | IN AL,CMOS_PORT+1 31 | ; push ax 32 | AND AL,AH 33 | PUSH AX ;SAVE 34 | TEST AL,40H ;CHECK FOR PERIODIC INTERRUPT 35 | JZ RTC_INT_9 ;NO - GO AROUND 36 | CALL DDS ;ESTABLISH ADDRESSABILITY 37 | SUB RTC_LOW,0976 ;DECREMENT COUNT 38 | SBB RTC_HIGH,0 39 | JA RTC_INT_9 40 | MOV DL,0AH ;TURN OFF PIE 41 | CALL PORT_INC 42 | IN AL,CMOS_PORT+1 43 | AND AL,0BFH 44 | PUSH AX 45 | MOV DL,0AH 46 | CALL PORT_INC 47 | POP AX 48 | OUT CMOS_PORT+1,AL 49 | MOV RTC_WAIT_FLAG,0 ;SET FUNCTION ACTIVE FLAG OFF 50 | LDS DI,DWORD PTR USER_FLAG ;SET UP DS,DI TO POINT TO USER FLAG 51 | MOV BYTE PTR[DI],80H ;TURN ON USERS FLAG 52 | RTC_INT_9: 53 | POP AX ;GET INTERRUPT SOURCE BACK 54 | TEST AL,20H ;TEST FOR ALARM INTERRUPT 55 | JZ RTC_INT_10 ;NO - GO AROUND 56 | INT 4AH ;TRANSFER TO USER ROUTINE 57 | RTC_INT_10: 58 | MOV AL,EOI ;END OF INTERRUPT TO 8259 - 2 59 | OUT 020H,AL ;AND TO 8259 - 1 60 | POP DI ;RESTORE REGISTERS 61 | POP DX 62 | POP AX 63 | POP DS 64 | IRET ;END OF INTERRUPT 65 | RTC_INT ENDP 66 |  -------------------------------------------------------------------------------- /poisk1/INT19.ASM: -------------------------------------------------------------------------------- 1 | ;---INT 19------------------------------------------------ 2 | ;Программа загрузки системы 3 | ; Если устройство А - дискетта 5 1/4", то загрузка возможна 4 | ; Дорожка 0, сектор 1считываются по адресу BOOT(0:7C00) 5 | ; и на него передается управление. 6 | ; Если дискетта отсутствует или произошла аппаратная ошибка, 7 | ; то управление передается в точку CASSETE-BASIC. 8 | ; 9 | ; Если загрузка идет с дискетты, то бит 0=1 для порта 60H 10 | ;---------------------------------------------------------- 11 | ASSUME CS:CODE,DS:DATA 12 | BOOT_STRAP PROC NEAR 13 | 14 | STI ;Разрешить прерывание 15 | MOV AX,DATA ;Установка аресации данных 16 | MOV DS,AX 17 | MOV AX,EQUIP_FLAG ;Получить состояние переключателей 18 | TEST AL,1H ;Выделить состояние переключателя IPL 19 | JZ H3 ;Перейти на вход CASSETTE BASIC 20 | 21 | ;-------------Система загружается с дискетты 22 | ;CX-счетчик повторов 23 | MOV AX,0 24 | MOV DS,AX 25 | 26 | 27 | MOV CX,4 ;Установить счетчик повторов 28 | H1: 29 | PUSH CX ;Сохранить счетчик повторов 30 | MOV DX,0 ;Устройство 0, головка 0 31 | MOV AH,0 ;Сброс НГМД 32 | INT 13H ;Ввод/вывод дискетты 33 | JC H2 ;Если ошибка, повторить 34 | MOV AH,2 ;Чтение одного сектора 35 | MOV BX,0 ;По фдресу BOOT 36 | MOV ES,BX 37 | MOV BX,OFFSET BOOT_LOCN 38 | MOV DX,0 ;Устройство 0, головка 0 39 | MOV CX,1 ;Сектор 1, дорожка 0 40 | MOV AL,1 ;Считывание сектора 41 | INT 13H 42 | H2: POP CX ;Восстановить счетчик повторов 43 | JNC H4 ;Установить CF при ошибке чтения 44 | LOOP H1 ;На повтор 45 | 46 | ;---------Загрузка с дискетты невозможна 47 | 48 | H3: 49 | IRET 50 | 51 | ;---------Загрузка завершилась успешно 52 | 53 | H4: 54 | JMP BOOT_LOCN ;Передача управления системе 55 | 56 | BOOT_STRAP ENDP 57 | 58 | -------------------------------------------------------------------------------- /poisk1/INT15_NP.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | READ_HALF_BIT PROC NEAR 3 | ; ЦЕЛЬ: 4 | ; ВЫЧИСЛЯЕТ ДЛИТЕЛЬНОСТЬ ПОЛУПЕРИОДА БИТА, 5 | ; Т.Е. ДЛИТЕЛЬНОСТЬ ИНТЕРВАЛА ОТ ОДНОЙ СМЕНЫ УРОВНЯ 6 | ; СИГНАЛА ДО ДРУГОЙ 7 | ; 8 | ; НА ВХОДЕ: 9 | ; EDGE_CNT СОДЕРЖИТ ЗНАЧЕНИЕ СЧЕТЧИКА ТАЙМЕРА В МОМЕНТ СМЕНЫ УРОВНЯ СИГНАЛА 10 | ; 11 | ; ON EXIT: 12 | ; AX СОДЕРЖИТ ЗНАЧЕНИЕ СЧЕТЧИКА В МОМЕНТ НОВОЙ СМЕНЫ УРОВНЯ 13 | ; BX СОДЕРЖИТ ДЛИТЕЛЬНОСТЬ ПОЛУПЕРИОДА 14 | ;---------------------------------------------------------------------------- 15 | MOV CX,100 ;УСТАНОВИТЬ ВРЕМЯ ОЖИДАНИЯ ФРОНТА 16 | MOV AH,LAST_VAL ;AH <-- ТЕКУЩИЙ УРОВЕНЬ СИГНАЛА 17 | W22: ;ЧИТАТЬ ПОЛУБИТ 18 | IN AL,PORT_C ;ВВЕСТИ СИГНАЛ С МАГНИТОФОНА 19 | AND AL,010H ;ВЫДЕЛИТЬ ТРЕБУЕМЫЙ БИТ 20 | CMP AL,AH ;УРОВЕНЬ ПОМЕНЯЛСЯ? 21 | LOOPE W22 ;ЕСЛИ НЕТ, ПОВТОРИТЬ 22 | MOV LAST_VAL,AL ;СОХРАНИТЬ НОВЫЙ УРОВЕНЬ 23 | MOV AL,0 ;ЧИТАЕМ ТАЙМЕР НА ЛЕТУ 24 | OUT TIM_CTL,AL 25 | IN AL,TIMER0 ;МЛАДШИЙ БАЙТ 26 | MOV AH,AL ;СОХРАНЯЕМ В AH 27 | IN AL,TIMER0 ;СТАРШИЙ БАЙТ 28 | XCHG AL,AH ;XCHG AL,AH 29 | MOV BX,EDGE_CNT ;BX <-- ПРЕДЫДУЩЕЕ ЗНАЧЕНИЕ СЧЕТЧИКА 30 | SUB BX,AX ;BX <-- ДЛИТЕЛЬНОСТЬ ПОЛУПЕРИОДА 31 | MOV EDGE_CNT,AX ;СОХРАНЯЕМ ЗНАЧЕНИЕ СЧЕТЧИКА 32 | RET 33 | READ_HALF_BIT ENDP 34 | 35 | BREAK_TEST PROC NEAR 36 | ;---------------------------------------------------------------------------- 37 | ; ЦЕЛЬ: 38 | ; ОПРОС КЛАВИАТУРЫ НА ПРЕДМЕТ НАЖАТИЯ КЛАВИШ 39 | ; ESC,TAB ИЛИ CTRL ДЛЯ ПРЕРЫВАНИЯ ЧТЕНИЯ КАССЕТЫ 40 | ; 41 | ; ЕСЛИ ЕСТЬ НАЖАТИЕ ОДНОЙ ИЗ ЭТИХ КЛАВИШ - ФЛАГ Z=1 42 | ;---------------------------------------------------------------------------- 43 | PUSH AX ;СОХРАНИТЬ AX 44 | MOV AL,0FFH 45 | OUT 60H,AL 46 | IN AX,69H ;ОПРОСИТЬ ПОРТ КЛАВИАТУРЫ 47 | AND AX,080H ;ЕСЛИ НАЖАТА КЛАВИША Z<--1 48 | POP AX ;ВОССТАНОВИТЬ AX 49 | RET 50 | BREAK_TEST ENDP 51 | 52 | 53 | -------------------------------------------------------------------------------- /poisk2/INT8.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;--------------------------------------------------------------------------- 3 | ; ЭТО ПРЕРЫВАНИЕ УПРАВЛЯЕТ ПРЕРЫВАНИЯМИ ТАЙМЕРА КАНАЛА 0 4 | ; INPUT FREQUENCY IS 1.19318 MHZ 5 | ; AND THE DIVISOR IS 65536,RESULTING IN APPROX. 18.2 INTERRUPTS 6 | ; EVERY SECOND. 7 | ; 8 | ; THE INTERRUPT HANDLER MAINTAINS A COUNT OF INTERRUPTS SINCE POWER 9 | ; ON TIME, WHICH MAY BE USED TO ESTABLISH TIME OF DAY. 10 | ; THE INTERRUPT HANDLER ALSO DECREMENTS THE MOTOR CONTROL COUNT 11 | ; OF THE DISKETTE, AND WHEN IT EXPIRES, WILL TURN OFF THE DISKETTE 12 | ; MOTOR, AND RESET THE MOTOR RUNNING FLAGS. 13 | ; THE INTERRUPT HANDLER WILL ALSO INVOKE A USER ROUTINE THROUGH INTERRUPT 14 | ; 1CH AT EVERY TIME TICK. THE USER MUST CODE A ROUTINE AND PLACE THE 15 | ; CORRECT ADDRESS IN THE VECTOR TABLE. 16 | ;-------------------------------------------------------------------------- 17 | ORG 0FEA5H 18 | TIMER_INT PROC FAR 19 | STI ;INTERRUPTS BACK ON 20 | PUSH DS 21 | PUSH AX 22 | PUSH DX ;SAVE MACHINE STATE 23 | CALL DDS 24 | INC TIMER_LOW ;INCREMENT TIME 25 | JNZ T4 ;TEST_DAY 26 | INC TIMER_HIGH ;INCREMENT HIGH WORD OF TIME 27 | T4: ;TEST_DAY 28 | CMP TIMER_HIGH,018H ;TEST FOR COUNT EQUALING 24 HOURS 29 | JNZ T5 ;DISKETTE_CTL 30 | CMP TIMER_LOW,0B0H 31 | JNZ T5 ;DISKETTE_CTL 32 | 33 | ;------TIMER HAS GONE 24 HOURS 34 | SUB AX,AX 35 | MOV TIMER_HIGH,AX 36 | MOV TIMER_LOW,AX 37 | MOV TIMER_OFL,1 38 | 39 | ;------TEST FOR DISKETTE TIME OUT 40 | 41 | T5: ;DISKETTE_CTL 42 | DEC MOTOR_COUNT 43 | JNZ T6 ;RETURN IF COUNT NOT OUT 44 | AND MOTOR_STATUS,0F0H ;TURN OFF MOTOR RUNNING BITS 45 | MOV AL,0CH 46 | MOV DX,03F2H ;FDC CTL PORT 47 | OUT DX,AL ;TURN OFF THE MOTOR 48 | T6: ;TIMER_RET: 49 | NOP 50 | NOP 51 | INT 1CH ;TRANSFER CONTROL TO A USER ROUTINE 52 | MOV AL,EOI 53 | OUT 020H,AL ;END OF INTERRUPT TO 8259 54 | POP DX 55 | POP AX 56 | POP DS ;RESET MACHINE STATE 57 | IRET ;RETURN FROM INTERRUPT 58 | TIMER_INT ENDP 59 | 60 |  -------------------------------------------------------------------------------- /gridcomp/ccoskern.d: -------------------------------------------------------------------------------- 1 | bpset fe830,1,{ logerror "%% SmartIntAllocate\n"; go } 2 | bpset fe88e,1,{ logerror "%% InterruptSend\n"; go } 3 | bpset fe839,1,{ logerror "%% CpLogError\n"; go } 4 | bpset fd56f,1,{ logerror "%% CpSetMessageHandler\n"; go } 5 | bpset fe95a,1,{ logerror "%% ConLineOut\n"; go } 6 | bpset fe940,1,{ logerror "%% ConCharOut\n"; go } 7 | bpset fd053,1,{ logerror "%% TellMessageWaiters\n"; go } 8 | bpset fe252,1,{ logerror "%% CpAddressOf\n"; go } 9 | bpset 45cd,1,{ logerror "%% GpibDriver\n"; go } 10 | bpset fe04c,1,{ logerror "%% CpSetKeyHandler\n"; go } 11 | bpset fe06b,1,{ logerror "%% CpSetWatchDogHandler\n"; go } 12 | bpset fe0bc,1,{ logerror "%% CpCatchAll\n"; go } 13 | bpset fdfc6,1,{ logerror "%% CpEnableInterrupt\n"; go } 14 | bpset fdfe6,1,{ logerror "%% CpDisableInterrupt\n"; go } 15 | bpset fe004,1,{ logerror "%% CpSetinterrupt\n"; go } 16 | bpset fe032,1,{ logerror "%% CpEndOfInterrupt\n"; go } 17 | bpset fe1a6,1,{ logerror "%% CpSystemTick\n"; go } 18 | bpset fe205,1,{ logerror "%% CpRealTimeClock\n"; go } 19 | bpset fe1d0,1,{ logerror "%% CpMachineID\n"; go } 20 | bpset fdb60,1,{ logerror "%% OsNewQElement\n"; go } 21 | bpset fdb8c,1,{ logerror "%% OsInitQcb\n"; go } 22 | bpset fdbb6,1,{ logerror "%% OsElementCheckSum\n"; go } 23 | bpset fdbd7,1,{ logerror "%% OsVerifyChecksum\n"; go } 24 | bpset fdd13,1,{ logerror "%% OsInsertIntoQ\n"; go } 25 | bpset fdd49,1,{ logerror "%% OsRemoveFromQ\n"; go } 26 | bpset fdd7a,1,{ logerror "%% OsReplaceInQ\n"; go } 27 | bpset fdd9b,1,{ logerror "%% OsElementInQ\n"; go } 28 | bpset fdddc,1,{ logerror "%% OsSearchInQ\n"; go } 29 | bpset fd861,1,{ logerror "%% CpFree\n"; go } 30 | bpset fd89f,1,{ logerror "%% CpGetSize\n"; go } 31 | bpset fd8ea,1,{ logerror "%% IntAllocate\n"; go } 32 | bpset fd9be,1,{ logerror "%% CpAllocate\n"; go } 33 | bpset fd9f1,1,{ logerror "%% CpMemInit\n"; go } 34 | bpset fda40,1,{ logerror "%% CpFreeTaskMem\n"; go } 35 | bpset fda82,1,{ logerror "%% CpGetMemStatus\n"; go } 36 | bpset fcf32,1,{ logerror "%% CpWhoAmI\n"; go } 37 | bpset fd0fd,1,{ logerror "%% Reschedule\n"; go } 38 | bpset fd14e,1,{ logerror "%% CpSignal\n"; go } 39 | bpset fd1e9,1,{ logerror "%% CpWait\n"; go } 40 | bpset fd284,1,{ logerror "%% CpSend\n"; go } 41 | bpset fd297,1,{ logerror "%% CpReceive\n"; go } 42 | bpset fd36c,1,{ logerror "%% CpCreateProcess\n"; go } 43 | bpset fd3c9,1,{ logerror "%% CpDeleteProcess\n"; go } 44 | bpset fd460,1,{ logerror "%% CpDelay\n"; go } 45 | bpset fd4a0,1,{ logerror "%% CpSetPriority\n"; go } 46 | bpset fd4e9,1,{ logerror "%% CpCreateSemaphore\n"; go } 47 | bpset fd524,1,{ logerror "%% CpDeleteSemaphore\n"; go } 48 | bpset fde54,1,{ logerror "%% Upper\n"; go } 49 | -------------------------------------------------------------------------------- /dvk_kcgd/ramkcgd181.txt: -------------------------------------------------------------------------------- 1 | 0-76 - Вектора (111516,340) 2 | 60 - 110074 3 | 102 - 340 4 | 104-243 - 40000(+1750),(4452) 5 | 244-303 - 0, 200 6 | 7 | 4074-4541 - клавиатура? (111002-111447) 8 | 4344-4363 - палитра [111252-111271] 9 | 4364-4370 - [0n [111272-111276] 10 | 4371-4402 - [>7;501c [111277-111310] 11 | 4404-4406 - O [111312-111314] 12 | 4407-4411 - <15><12> [111315-111317] 13 | 4412-4414 - [ [111320-111322] 14 | 4415-4416 - [111323-111324] 15 | 4417-4421 - ? [111325-111327] 16 | 4422 - 0 30 ADD PC 17 | 4426 - 4 ADD PC 18 | 4434 - 4 ADD PC 19 | 4436 - Адрес 4404 или 4412 20 | 4442 - 2 0 ADD PC 21 | 4444 - 177400 177600 BIC 22 | 4446 - 12 Высота символа? 23 | 4450 - ? 24 | 4452 - ? 25 | 4454,4456,4460,4462 - Адреса таблиц символов 26 | 4464 - ? 27 | 4466 - ? 28 | 4470 - ? 29 | 4472 - ? 30 | 4474 - ? *11 31 | 4476 - 0 2 ADD PC 32 | 4500B - 0 1 33 | 4501 - ? 0 34 | 4502,4504,4506,4510,4512,4514 - Адреса таблиц символов 35 | 4516 - ? 36 | 4520 - ? 37 | 4522 - 0 2 ADD PC 38 | 4524 - 0 12 ADD PC 39 | 4526 - 0 (4512) (4514) 40 | 4530 - ? 41 | 4532 - ? 42 | 4534 - ? 0 4 ADD PC 43 | 4536 - ? 4 ADD PC 44 | 4540 - ? ADD PC 45 | 46 | 47 | 7434-7473 - (4502-4541) 48 | 7474-7543 - (107456-107525) 49 | 7474,7476,7500,7502 - Смещение для 160000 50 | 7504,7506,7510,7512 - Левые биты 51 | 7514,7516,7520,7522 - Правые биты 52 | 7524,7526,7530,7532 - Для ASHC 53 | 7534 - BIC 160002 54 | 7536 - связь с 4516 55 | 7540 - 12 MUL 56 | 57 | 58 | 7544-7703 - (117236-117375) - смещение в таблице шрифтов 59 | 60 | 7704-10043 - (117236-117375) - смещение в таблице шрифтов 61 | 7710 - 261 62 | 7744-10043 - (117576-117675) 63 | 64 | 10044-10203 - (117236-117375) - смещение в таблице шрифтов 65 | 10143-10202 - (117536-117575) 66 | 67 | 10204-10343 - (117376-117535) - смещение в таблице шрифтов 68 | 69 | 10644-10776 - 207 70 | 11000 - 103302 71 | 72 | 11004-11063 - (111450-111527) 73 | 11004 - ? 220 233 74 | 11006 - 77774 SP 75 | 11010 - ? 76 | 11012,11014 - ? 77 | 11016 - 77777 DEC 78 | 11020B - ? 79 | 11021B - ? 80 | 11022B - ? 81 | 11023B - ? 82 | 11024B - ? Что-то с палитрой 83 | 11025B - ? 84 | 11026,11030 - Что-то с видеостроками 85 | 11032 - ? 86 | 11034 - ? 87 | 11036 - ? 88 | 11040B - ? 89 | 11041B - ? 90 | 11042B - ? 91 | 11043B - ? 92 | 11044B - ? 93 | 11045B - ? 94 | 11046B - ? 95 | 11047B - ? 96 | 11050B - ? 97 | 11051B - ? 98 | 99 | 100 | 11430-13472 - Таблица регенерации 101 | 15574-17472 - Таблица адресов 102 | 20000-31777 - Шрифт (112236-117235) 103 | 35600-35607 - (107572-107601) -------------------------------------------------------------------------------- /poisk1/INT_TIME.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; Эта программа обрабатывет прерывания таймера 8253 по каналу 0. Входная 3 | ; частота 1.19318Мгц, делитель 65536, результат - 18.2 прерывания в секунду. 4 | ; 5 | ; Обработка прерывания содержит счетчик прерываний, который может 6 | ; использоваться для установки времени суток. Обработка прерывания также 7 | ; вычитает счетчик управления двигателем накопителем ГМД, и когда счетчик 8 | ; исчерпан, двигатель отключается и сбрасываются флажки. Обработка прерывания 9 | ; может воздействовать на программу пользователя через прерывание 1CH каждый 10 | ; такт таймера. Пользователь подготавливает программу и помещает ее адрес в 11 | ; таблицу векторов. 12 | ;-------------------------------------------------------------------------- 13 | TIMER_INT PROC FAR 14 | STI ;Разрешить прерывания 15 | PUSH DS 16 | PUSH AX 17 | PUSH DX ;Сохранить состояние 18 | MOV AX,DATA 19 | MOV DS,AX ;Установить адресацию 20 | INC TIMER_LOW ;Инкремент таймера 21 | JNZ T4 ;Переполнение? 22 | INC TIMER_HIGH ;Инкремент старшей части таймера 23 | T4: ;Переполнение 24 | CMP TIMER_HIGH,018H ;Проверка: равен счетчик 24 часам? 25 | JNZ T5 ;Управление дискеттой 26 | CMP TIMER_LOW,0B0H 27 | JNZ T5 ;Управление дискетой 28 | ; 29 | ;------Таймер исчерпал 24 часа 30 | ; 31 | MOV TIMER_HIGH,0 32 | MOV TIMER_LOW,0 33 | MOV TIMER_OFL,1 34 | ; 35 | ;------Опрос времени ожидания для дискеты 36 | ; 37 | T5: ;Управление дискетой 38 | DEC CURSOR_COUNT 39 | JNZ T6 40 | MOV CURSOR_COUNT,CURSOR_TIME 41 | CMP CURSOR_MODE,0 ;анализ на нулевой размер курсора 42 | JZ T6 43 | 44 | CMP CURSOR_MODE,2000H ;15.01.90г 45 | JZ T6 ;15.01.90г 46 | 47 | T51: MOV AX,8 48 | INT 10h 49 | NOP 50 | T6: ;Возврат из программы 51 | INT 1CH ;Передача управления программе пользователя 52 | MOV AL,EOI 53 | OUT 020H,AL ;Конец прерывания для 8259 54 | POP DX 55 | POP AX 56 | POP DS ;Восстановить состояние 57 | IRET ;Возврат из прерывания 58 | TIMER_INT ENDP 59 | 60 | 61 | ORG 0EC59H 62 | 63 | -------------------------------------------------------------------------------- /poisk1/INT10_C.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; MED_READ_BYTE 3 | ; Эта программа берет 2 байта из буфера регенерации, сличает с текущим цветом 4 | ; (передним) и помещает соответствующий 1/0 бит образца в текущую позицию 5 | ; области сохранения. 6 | ; Вход: 7 | ; SI,DS - указатель области буфера регенерации 8 | ; BX - расширенный цвет символа (передний цвет) 9 | ; BP - указатель области сохранения 10 | ; Выход: 11 | ; BP перемещен за область сохранения 12 | ;-------------------------------------------------------------------------- 13 | S23 PROC NEAR 14 | MOV AH,[SI] ;Получить первый байт 15 | MOV AL,[SI+1] ;Получить второй байт 16 | MOV CX,0C000H ;2 бита маски для проверки входов 17 | MOV DL,0 ;Регистр результата 18 | S24: 19 | TEST AX,CX ;Это поле фона (атрибут)? 20 | CLC ;Очистить перенос, надеясь что да 21 | JZ S25 ;Если 0, это фон 22 | STC ;Нет, установить перенос 23 | S25: RCL DL,1 ;Задвинуть бит в результат 24 | SHR CX,1 25 | SHR CX,1 ;Сдвинуть маску вправо на 2 бита 26 | JNC S24 ;Выполнять это снова, пока маска существует 27 | MOV [BP],DL ;Запомнить результат в области сохранения 28 | INC BP ;Привести в соответствие указатель 29 | RET ;Все сделано 30 | S23 ENDP 31 | 32 | 33 | ;--------------------------------------------------------------------------- 34 | ; V4_POSITION 35 | ; Эта программа преобразует позицию курсора, содержащуюся в ячейке памяти 36 | ; в смещение в области буфера регенерации, выделяя байт на символ. 37 | ; Для графики среднего разрешения число должно быть удвоено. 38 | ; Вход - ячейка CURSOR_POSN 39 | ; 40 | ; Выход - AX содержит смещение в буфере регенерации 41 | ;-------------------------------------------------------------------------- 42 | S26 PROC NEAR 43 | PUSH SI 44 | MOV AL,ACTIVE_PAGE 45 | XOR AH,AH 46 | SAL AX,1 47 | MOV SI,AX 48 | MOV AX,DS:[SI+OFFSET CURSOR_POSN] ;Получить позицию курсора для 49 | MOV T_CURSOR,AL 50 | MOV K_CICL,0 51 | POP SI 52 | GRAPH_POSN LABEL NEAR 53 | PUSH BX ;Сохранить регистр 54 | MOV BX,AX ;Сохранить копию текущего курсора 55 | MOV AL,AH ;Получить строку в AL 56 | MUL BYTE PTR CRT_COLS ;Умножить на байт/колонку 57 | SHL AX,1 ;Умножить на 4, т.к. требуется 58 | SHL AX,1 ; 4 байта на строку 59 | SUB BH,BH ;Выделить значение колонки 60 | ADD AX,BX ;Определить смещение 61 | POP BX ;Восстановить указатель 62 | RET ;Все сделано 63 | S26 ENDP 64 | 65 | ORG 0F841H 66 | 67 | -------------------------------------------------------------------------------- /poisk1/TBL_INT9.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;------------------------------------------------------------- 3 | ; Т А Б Л И Ц Ы Д Л Я I N T 9 4 | ;------------------------------------------------------------- 5 | 6 | 7 | ; таблица соответствия русских символов скан-кодам 8 | 9 | LR LABEL BYTE 10 | DB 'ЙЦУКЕНГШ' 11 | DB 'ЩЗФЫВАПР' 12 | DB 'ОЛДЯЧСМИ' 13 | DB 'ТЬХЪЖЭЮБ' 14 | DB 0f0h ; 15 | ;-------------------------- 16 | 17 | ;------- скан-коды управляющих клавиш 18 | 19 | K6 LABEL BYTE 20 | DB RIGHT_KEY 21 | DB LEFT_KEY 22 | DB CTL_KEY 23 | DB ALT_KEY 24 | DB SCROLL_KEY 25 | DB NUM_KEY 26 | DB CAPS_KEY 27 | DB INS_KEY 28 | K6L EQU $-K6 29 | 30 | 31 | ;------- перекодировка для CTRL, скан-коды 00-?? 32 | 33 | K8 DB 01,55 ;границы интервала 34 | DB 27, -1, 0, -1, -1, -1, 30, -1 35 | DB -1, -1, -1, 31, -1,127, -1, 17 36 | DB 23, 5, 18, 20, 25, 21, 9, 15 37 | DB 16, 27, 29, 10, -1, 1, 19, 4 38 | DB 6, 7, 8, 10, 11, 12, -1, -1 39 | DB -1, -1, 28, 26, 24, 3, 22, 2 40 | DB 14, 13, -1, -1, -1, -1, 114+80H 41 | ;-------------------------- 42 | ;------- перекодировка для CTRL, дополнительная клавиатура 43 | ; ( скан-коды ??-?? ) 44 | 45 | K9 LABEL BYTE 46 | DB 71,81 ;границы интервала 47 | DB 119+80H,-1, -2,-1,115+80H,-1 48 | DB 116+80H,-1,117+80H,-1,118+80H 49 | 50 | ;-------- перекодировка для верхнего регистра, скан-коды 00-?? (без SHIFT) 51 | 52 | K10 LABEL BYTE 53 | DB 1,55 54 | DB 01BH,'1234567890-=',08H,09H 55 | DB 'qwertyuiop[]',0DH,-1,'asdfghjkl;',027H 56 | DB 60H,-1,5CH,'zxcvbnm,./',-1,'*' 57 | ;-------------------------- 58 | ;-------- перекодировка для нижнего регистра, скан-коды 00-?? (c SHIFT) 59 | 60 | K11 LABEL BYTE 61 | DB 1,55 ;границы интервала 62 | DB 27,'!@#$',37,05EH,'&*()_+',08H,15+80H 63 | DB 'qwertyuiop',7BH,7DH,0DH,-1,'asdfghjkl:"' 64 | DB 07EH,-1,7CH,'zxcvbnm<>?',-1,114+80H 65 | ;-------------------------- 66 | ;-------перекодировка символов дополнительной клавивтуры 67 | ; (цифровой режим, скан-коды ??-??) 68 | 69 | K14 LABEL BYTE 70 | DB 71,83 ;границы интервала 71 | DB '789-456+1230.' 72 | ;-------перекодировка символов дополнительной клавивтуры 73 | ; (управление курсором, скан-коды ??-??) 74 | 75 | K15 LABEL BYTE 76 | DB 71,83 ;границы интервала 77 | DB 71+80H, 72+80H, 73+80H, '-', 75+80H, -1, 77+80H 78 | DB '+', 79+80H, 80+80H, 81+80H, 82+80H, 83+80H 79 | 80 | ;-------------------------- 81 | 82 | ;------ таблица допустимых интервалов скан-кодов для ALT и RUS 83 | 84 | KT_ALT DB 2, 13 ; 1..+ 85 | KT_RUS0 DB 16, 25 ; Q..P 86 | DB 30, 38 ; A..L 87 | DB 44, 50 ; Z..M 88 | KT_RUS DB 84, 90 ; X..Б,Е с двумя точками с верху 89 | 90 | 91 | ORG 0E987H 92 | 93 | -------------------------------------------------------------------------------- /poisk2/D8.ASM: -------------------------------------------------------------------------------- 1 | 2 | PEREDV PROC NEAR 3 | ;----ИНВЕРСИЯ ИЗОБРАЖЕНИЙ 4 | SAV1: push ds 5 | call dds 6 | assume ds:data 7 | MOV RIG_1,2 8 | MOV UPPP,0 9 | MOV DOWW,2 10 | MOV LEF_1,0 11 | RE_1: push bx 12 | push ds 13 | push cs 14 | pop ds 15 | call otsl_1 16 | CALL VVV_1 17 | pop ds 18 | pop bx 19 | MOV AH,0 20 | INT 16H 21 | RE_12: XCHG AH,DL 22 | MOV AL,7 23 | SUB BX,4 24 | CALL INVER 25 | CMP DL,4DH 26 | JE RIGH1 27 | CMP DL,4BH 28 | JE LEFT_1 29 | CMP DL,48H 30 | JE UP_1G 31 | CMP DL,50H 32 | JE DN_DN 33 | CMP DL,49H 34 | JE PGUP1 35 | CMP DL,51H 36 | JE PGDN1 37 | CMP DL,15H 38 | JE SAVE_1 39 | CMP DL,31H 40 | JE RETT 41 | mov al,70h 42 | SUB BX,4 43 | CALL INVER 44 | JMP SHORT RE_1 45 | RETT: pop ds 46 | RET 47 | SAVE_1: pop ds 48 | CALL SAVE_PRO 49 | RET 50 | PGUP1: JMP PGUP 51 | PGDN1: JMP PGDN 52 | DN_DN: JMP DN_1 53 | UP_1G: JMP UP_1 54 | RIGH1: JMP short RIGHT_1 55 | 56 | LEFT_1: 57 | MOV AL,LEF_1 58 | CMP AL,0 59 | JE RE_RE 60 | cmp bx,160*9+20*2 61 | jb mem_ob1 62 | INC BX 63 | INC BX 64 | MEM_OB1: 65 | SUB BX,10 66 | DEC AL 67 | MOV LEF_1,AL 68 | MOV AL,RIG_1 69 | INC AL 70 | MOV RIG_1,AL 71 | MOV AL,70H 72 | CALL INVER 73 | JMP RE_1 74 | RE_11: 75 | CMP BX,160*7 76 | JA RE_RE1 77 | MOV BX,160*4+15*2 78 | MOV UPPP,2 79 | MOV LEF_1,0 80 | MOV RIG_1,2 81 | MOV DOWW,0 82 | JMP SHORT RE_RE 83 | RE_RE1: 84 | mov bx,160*9+15*2 85 | mov uppp,3 86 | mov rig_1,0 87 | mov lef_1,0 88 | mov al,70h 89 | re_re: 90 | SUB BX,4 91 | MOV AL,70H 92 | CALL INVER 93 | re_re5: JMP RE_1 94 | 95 | RIGHT_1: 96 | MOV AL,RIG_1 97 | CMP AL,0 98 | JE RE_RE 99 | cmp bx,160*9+19*2 100 | ja mem_ob 101 | ADD BX,2 102 | mem_ob: DEC AL 103 | MOV RIG_1,AL 104 | MOV AL,LEF_1 105 | INC AL 106 | MOV LEF_1,AL 107 | MOV AL,70H 108 | CALL INVER 109 | JMP RE_1 110 | 111 | UP_1: MOV AL,UPPP 112 | CMP AL,0 113 | JE RE_11 114 | DEC AL 115 | MOV UPPP,AL 116 | MOV AL,DOWW 117 | INC AL 118 | MOV DOWW,AL 119 | SUB BX,160+4 120 | MOV AL,70H 121 | CALL INVER 122 | JMP RE_1 123 | 124 | DN_1: CMP BX,160*2+22*2 125 | JA D_NN 126 | CALL TIME_SAVE 127 | D_NN: MOV AL,DOWW 128 | CMP AL,0 129 | JE RE_113 130 | DEC AL 131 | MOV DOWW,AL 132 | MOV AL,UPPP 133 | INC AL 134 | MOV UPPP,AL 135 | ADD BX,160-4 136 | MOV AL,70H 137 | CALL INVER 138 | JMP RE_1 139 | 140 | PGDN: cmp bx,160*10 141 | jb sddd 142 | call pg_dn_1 143 | jmp re_1 144 | sddd: CALL PG_DN 145 | JMP RE_1 146 | PGUP: cmp bx,160*10 147 | jb sddd1 148 | call pg_up_1 149 | jmp re_1 150 | sddd1: CALL PG_UP 151 | JMP RE_1 152 | 153 | RE_113: 154 | CMP BX,160*9+13*2 155 | JA MEMOR_1 156 | MOV BX,160*6+13*2 157 | MOV AL,70H 158 | CALL INVER 159 | MOV RIG_1,0 160 | MOV LEF_1,0 161 | MOV UPPP,0 162 | MOV DOWW,3 163 | JMP RE_1 164 | MEMOR_1: 165 | MOV BX,160*10+13*2 166 | MOV AL,70H 167 | CALL INVER 168 | MOV RIG_1,1 169 | MOV LEF_1,0 170 | MOV UPPP,0 171 | MOV DOWW,1 172 | JMP RE_1 173 | PEREDV ENDP 174 | 175 | TIMER_1 PROC near 176 | push ax 177 | push bx 178 | PUSH cx 179 | push dx 180 | push si 181 | push di 182 | push es 183 | push ds 184 | push bp 185 | MOV AL,0 186 | CALL CMOS_READ 187 | MOV BX,160*1+48*2 188 | MOV byte ptr ES:[BX-2],58 189 | CALL RASP 190 | MOV AL,2 191 | CALL CMOS_READ 192 | MOV BX,160*1+45*2 193 | MOV byte ptr ES:[BX-2],58 194 | CALL RASP 195 | MOV AL,4 196 | CALL CMOS_READ 197 | MOV BX,160*1+42*2 198 | CALL RASP 199 | push cs 200 | pop ds 201 | pop bp 202 | pop ds 203 | pop es 204 | POP di 205 | pop si 206 | pop dx 207 | pop cx 208 | pop bx 209 | pop ax 210 | IRET 211 | TIMER_1 ENDP 212 | 213 | -------------------------------------------------------------------------------- /poisk1/INT16N.ASM: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------- 2 | ; 3 | ; К Л А В И А Т У Р А 4 | ; 5 | ;___int 16_________________ 6 | ; 7 | ; Программа поддержки клавиатуры 8 | ; 9 | ; Эта программа считывает в регистр 10 | ; AX код сканирования клавиши и код 11 | ; ASCII из буфера клавиатуры. 12 | ; 13 | ; Программа выполняет три функции, код 14 | ; которых задается в регистре AH: 15 | ; 16 | ; AH=0 - считать следующий символ 17 | ; из буфера.При выходе код 18 | ; сканирования в AH,код 19 | ; ASCII в AL. 20 | ; 21 | ; AH=1 - установить ZF, если код 22 | ; ASCII прочитан: 23 | ; ZF=0 - буфер заполнен, 24 | ; ZF=1 - буфер пустой. 25 | ; При выходе в AX помещено содержимое вершины буфера клавиатуры. 26 | ; 27 | ; AH=2 - возврат текущего состояния в регистр AL 28 | ; из постоянно распределенной области памяти с 29 | ; адресом 00417H. 30 | ; 31 | ; При выполнении программ клавиатуры используются флажки, 32 | ; которые устанавливаются в постоянно распределенной области 33 | ; памяти по адресам 00417H и 00418H и имеют значение: 34 | ; 00417H 35 | ; 0 - правое переключение регистра SHIFT; 36 | ; 1 - левое переключение регистра SHIFT; 37 | ; 2 - УПР (CTRL); 38 | ; 3 - ДОП (ALT) ; 39 | ; 4 - ФСД (ScrollLock) ; 40 | ; 5 - ЦИФ (NumLock); 41 | ; 6 - ФПБ (CapsLock) ; 42 | ; 7 - ВСТ (Ins) ; 43 | ; 00418H 44 | ; 0 - состояние клавиши ЛАТ между нажатием и отжатием (не использ); 45 | ; 1 - ЛАТ (не использ); 46 | ; 2 - Р/Л (не использ); 47 | ; 3 - пауза (HOLD_STATE); 48 | ; 4 - ФСД; 49 | ; 5 - ЦИФ; 50 | ; 6 - ФПБ; 51 | ; 7 - ВСТ. 52 | ; 53 | ; Флажки, соответствующие разрядам 4-7 постоянно распределенной 54 | ; области памяти с адресом 00417H, устанавливаются по нажатию 55 | ; клавиш ВСТ, ФПБ, ЦИФ, ФСД и сохраняют свои значения до сле- 56 | ; дующего нажатия соответствующей клавиши. 57 | ; Одноименные флажки, соответствующие разрядам 4-7 постоянно 58 | ; распределенной области памяти с адресом 00418H, и флажки 59 | ; ДОП, УПР, левое переключение регистра, правое переключение 60 | ; регистра, Р/Л устанавливаются по нажатию клавиш и сбрасываются 61 | ; по отжатию. 62 | ; 63 | ;--------------------------------------------------------------. 64 | ASSUME CS:CODE,DS:DATA 65 | KEYBOARD_IO PROC FAR 66 | STI ;разрешение прерывний 67 | PUSH DS 68 | PUSH BX 69 | MOV BX,DATA 70 | MOV DS,BX ;установка указателя на сегмент данных 71 | MOV BX,BUFFER_HEAD;Указатель вершины буфера ввода INT9 72 | OR AH,AH ;AH=0 73 | JZ K1 ;чтение символа ASCII 74 | DEC AH ;AH=1 75 | JZ K2 ;опрос состояния буфера 76 | DEC AH ;AH=2 77 | ; JNZ KBRET 78 | MOV AL,KB_FLAG ;SHIFT_STATUS 79 | KBRET: POP BX 80 | POP DS 81 | IRET 82 | 83 | ;------ Чтение кода символа ASCII по ожиданию 84 | 85 | K1: 86 | MOV AH,1 87 | INT 16H ;Рекурсивный опрос клавиатуры 88 | JZ K1 ;если нет готовности 89 | CALL K4 ;наращивание указателя чтения буфера 90 | MOV BUFFER_HEAD,BX ;запись нового значения указателя 91 | JMP KBRET ;Выход 92 | 93 | ;-------ASCII STATUS 94 | 95 | K2: 96 | CLI ;запрет прерываний 97 | CMP BX,BUFFER_TAIL ;если указатели равны (ZF=1), то буфер пуст 98 | MOV AX,[BX] 99 | STI ;разрешение прерываний 100 | POP BX 101 | POP DS 102 | RET 2 ;возврат без сохранения флагов 103 | 104 | KEYBOARD_IO ENDP 105 | 106 | -------------------------------------------------------------------------------- /poisk1/INT1A.ASM: -------------------------------------------------------------------------------- 1 | ;---INT 1A----------------------------------------------------------------- 2 | ; TIME_OF_DAY 3 | ; Эта программа выполняет установку/считывание часов 4 | ;Вход: 5 | ; (AH)=0 - прочитать текущее значение часов 6 | ; Возвращает: CX - старшая часть счетчика 7 | ; DX - младшая часть счетчика 8 | ; AL=0 - если таймер не прошел 24 часа с момента 9 | ; последнего считывания 10 | ; AL<>0 - если на следующий день 11 | ; (AH)=1 - установить текущее состояние часов 12 | ; CX - старшая часть счетчика 13 | ; DX - младшая часть счетчика 14 | ; Замечание: счет выполняется 1193180/65536 раз в секунду 15 | ; (или около 18.2 в сек) 16 | ;---------------------------------------------------------------------------- 17 | ASSUME CS:CODE,DS:DATA 18 | TIME_OF_DAY PROC FAR 19 | STI ;Разрешить прерывания 20 | PUSH DS ;Сохранить сегмент 21 | PUSH AX ;Сохранить параметр 22 | MOV AX,DATA 23 | MOV DS,AX ;Установить адресацию значений 24 | POP AX ;Восстановить входной параметр 25 | OR AH,AH ;AH=0 26 | JZ T2 ;Чтение времени 27 | DEC AH ;AH=1 28 | JZ T3 ;Установка времени 29 | T1: ;Возврат из программы 30 | STI ;Разрешить прерывания 31 | POP DS ;Восстановить сегмент 32 | IRET ;Возврат 33 | T2: ;Чтение времени 34 | CLI ;Запретить прерывания во время считывания 35 | ; таймера 36 | MOV AL,TIMER_OFL 37 | MOV TIMER_OFL,0 ;Переплнение, сбросить флаг 38 | MOV CX,TIMER_HIGH 39 | MOV DX,TIMER_LOW 40 | JMP T1 ;Возврат 41 | T3: ;Установка времени 42 | CLI ;Запретить прерывания во время записи 43 | ; таймера 44 | MOV TIMER_LOW,DX 45 | MOV TIMER_HIGH,CX ;Установить время 46 | MOV TIMER_OFL,0 ;Сброс переполнения 47 | JMP T1 ;Возврат 48 | TIME_OF_DAY ENDP 49 | 50 | ;---------------------------------------------------------------------------- 51 | ; Эта подпрограмма обрабатывает неиспользуемые аппаратные прерывания (A - D). 52 | ; Переменная INTR_FLAG будет содержать уровень аппаратного прерывания или 53 | ; FF если прерывание не аппаратное. 54 | ;---------------------------------------------------------------------------- 55 | HARD_RETURN PROC NEAR 56 | PUSH DS 57 | PUSH DX 58 | PUSH AX 59 | MOV AX,DATA 60 | MOV DS,AX ; сегмент данных 61 | MOV AL,0BH ; команда - чтение IN-SERVICE REG 62 | OUT 20H,AL ; определение уровня прерывания 63 | NOP 64 | IN AL,20H ; ввод уровня прерывания 65 | MOV AH,AL 66 | OR AL,AH ; проверка на ноль 67 | ; 0 - нет аппаратного прерывания 68 | JNZ HW_INT ; если аппаратное прерывание было 69 | MOV AH,0FFH ; признак нет прерывания 70 | JMP SHORT SET_INTR_FLAG ; 71 | HW_INT: IN AL,21H ; ввод значения маски 72 | OR AL,AH ; сброс бита маски 73 | OUT 21H,AL 74 | MOV AL,20H ; команда - конец прерывания 75 | OUT 20H,AL 76 | SET_INTR_FLAG: 77 | MOV INTR_FLAG,AH ; запись признака - номера прерывания 78 | POP AX 79 | POP DX 80 | POP DS 81 | DUMMY_RETURN: 82 | IRET 83 | HARD_RETURN ENDP 84 | 85 | 86 | ORG 0FEF3H 87 | 88 | -------------------------------------------------------------------------------- /poisk2/BIOSEQU1.ASM: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------- 2 | ; EQUATES 3 | ;----------------------------------------------------------------------------- 4 | 5 | PORT_A EQU 60H ;8255 PORT A ADDR 6 | PORT_B EQU 61H ;8255 PORT B ADDR 7 | PORT_C EQU 62H ;8255 PORT C ADDR 8 | CMD_PORT EQU 63H 9 | INTA00 EQU 20H ;8259 PORT 10 | INTA01 EQU 21H ;8259 PORT 11 | EOI EQU 20H 12 | TIMER EQU 40H 13 | TIM_CTL EQU 43H ;8253 TIMER CONTROL PORT ADDR 14 | TIMER0 EQU 40H ;8253 TIMER/CNTER 0 PORT ADDR 15 | TIMER2 EQU 3FCH 16 | TIM2_CTL EQU 3FFH ;8253 TIMER2 CONTROL PORT ADDR 17 | TIMER20 EQU 3FCH ;8253 TIMER/CNTER2 0 PORT ADDR 18 | TMINT EQU 01 ;TIMER 0 INTR RECVD MASK 19 | DMA EQU 00 ;DMA CH.0 ADDR. REG PORT ADDR 20 | DMA_3_ADDR EQU DMA+6 ; DMA channel 3 base addres 21 | DMA_3_CNT EQU DMA+7 ; DMA channel 3 word count 22 | DMA08 EQU 08 ;DMA STATUS REG PORT ADDR 23 | DMA_MASK EQU DMA+10 ; DMA mask register 24 | DMA_MODE EQU DMA+11D ; DMA mode register 25 | DMA_F_F EQU DMA+12D ; DMA flip/flop 26 | DMA_3_HIGH EQU 082H ; Port for high 4 bits of DMA 27 | 28 | DMA_READ_CMD EQU 01001000B ; MEM --> Port 29 | DMA_WRITE_CMD EQU 01000100B ; Port --> MEM 30 | MAX_PERIOD EQU 540H 31 | MIN_PERIOD EQU 410H 32 | KBD_IN EQU 60H ;KEYBOARD DATA IN ADDR PORT 33 | KBDINT EQU 02 ;KEYBOARD INTR MASK 34 | KB_DATA EQU 60H ;KEYBOARD SCAN CODE PORT 35 | KB_CTL EQU 61H ;CONTROL BITS FOR KEYBOARD SENSE DATA 36 | SENSE_FAIL EQU 0FFH ; Sense oparation failed 37 | STATUS_ERR EQU 0E0H ; Stattus Error/Error REG=0 38 | WRITE_FAULT EQU 0CCH ; Write Fault on selected drive 39 | UNDEF_ERR EQU 0BBH ; Undefined error occurred 40 | DRIVE_NOT_RDY EQU 0AAH ; Drive Not Ready 41 | BAD_CNTLR EQU 020H ; Controller has failed 42 | DATA_CORRECTED EQU 011H ; ECC corrected data error 43 | BAD_ECC EQU 010H ; Bad ECC on disk read 44 | BAD_TRACK EQU 00BH ; Bad tracek flag detected 45 | INIT_FAIL EQU 007H ; Drive parameter activity failed 46 | BAD_RESET EQU 005H ; Reset failed 47 | 48 | ;-----------------DISKETTE EQUATES 49 | MEDIA_CHANGE EQU 06H ; MEDIA REMOVED ON DUAL ATTACH CARD 50 | MAX_DRV EQU 002H ; MAX NUMBER OF DRIVES 51 | HOME EQU 010H ; TRACK 0 MASK 52 | SENSE_DRV_ST EQU 004H ; SENSE DRIVE STATUS COMMAND 53 | TRK_SLAP EQU 030H ; CRASH STOP (48 TPI DRIVES) 54 | QUIET_SEEK EQU 00AH ; SEEK TO TRACK 10 55 | HD12_SETTLE EQU 015D ; 1.2 M HEAD SETTLE TIME 56 | HD320_SETTLE EQU 020D ; 320 K HEAD SETTLE TIME 57 | ;---------DISK CHANGE LINE EQUATES 58 | NOCHGLN EQU 001H ; NO DISK CHANGE LINE AVAILABLE 59 | CHGLN EQU 002H ; DISK CHANGE LINE AVAILABLE 60 | 61 | LONG_FLAG EQU 0010B ; LONG opn active 62 | MULT_TRANS EQU 0100B ; Multiple Sector flag 63 | RESTORE_CMD EQU 10H+WDC_RATE 64 | SEEK_CMD EQU 70H+WDC_RATE 65 | READ_CMD EQU 28H+MULT_TRANS ; Retries Enable 66 | WRITE_CMD EQU 30H+MULT_TRANS ; Retries Enable 67 | RD_LONG_CMD EQU READ_CMD+LONG_FLAG ; 68 | WR_LONG_CMD EQU WRITE_CMD+LONG_FLAG ; 69 | SCAN_ID_CMD EQU 40H ; Retries Enable 70 | WR_FORMAT_CMD EQU 50H 71 | GAP_1 EQU 30D ; GAP length for format 72 | COMPUTE_CMD EQU 08H 73 | SET_PARM_CMD EQU 00H ; 5-bit Span 74 | 75 | 76 | ;WDC_PORT EQU 320H 77 | ;HD_PORT EQU 328H 78 | DSEL_0_BIT EQU 00001000B 79 | HD_RES_BIT EQU 00100000B 80 | IR_DMA_EN EQU 01000000B 81 | BF_RES_BIT EQU 10000000B 82 | LONG_MODE_BIT EQU 40H ; !!! 83 | I64_FMT_CMD EQU 01010000B ; Format command 84 | 85 | FD_INT_NO EQU 0DH ; Hardware INT vector 86 | INT_CTL_PORT EQU 20H ; 8259 Control port 87 | EOI EQU 20H ; END OF INTERRUPT command 88 | FD_INT_MASK EQU (1 SHL (FD_INT_NO-8)) ; 89 | 90 | 91 |  -------------------------------------------------------------------------------- /poisk1/INT15_B.ASM: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------- 2 | WRITE_BYTE PROC NEAR 3 | ; ЗАПИСЬ БАЙТА НА КАССЕТУ 4 | ; ББАЙТ ДЛЯ ЗАПИСИ ПЕРЕДАЕТСЯ В РЕГИСТРЕ AL. 5 | ;--------------------------------------------------------------------------- 6 | PUSH CX ;СОХРАНИТЬ CX,AX 7 | PUSH AX 8 | MOV CH,AL ;CH <--- ЗАПИСЫВАЕМЫЙ БАЙТ 9 | ;(СТАРШИЙ БИТ ПИШЕТСЯ ПЕРВЫМ) 10 | MOV CL,8 ;ДЛЯ 8 БИТ ДАННЫХ В БАЙТЕ. 11 | ;ПРИ ЧТЕНИИ ДВА ПЕРЕПАДА СИГНАЛА 12 | W27: ;ОПРЕДЕЛЯЮТ ОДИН БИТ 13 | RCL CH,1 ;CY <--- СТАРШИЙ БИТ 14 | PUSHF ;СОНРАНИТЬ ФЛАГИ 15 | ;ДЛЯ ЗАПИСИ БИТ ПЕРЕДАЕТСЯ В CY 16 | CALL WRITE_BIT ;ЗАПИСАТЬ БИТ ДАННЫХ 17 | POPF ;ВОССТАНОВИТЬ CY ДЛЯ ВЫЧИСЛЕНИЯ CRC 18 | CALL CRC_GEN ;ВЫЧИСЛИТЬ CRC ДЛЯ ЗАПИСЫВАЕМОГО БИТА 19 | DEC CL ;DEC СЧЕТЧИК БИТ 20 | JNZ W27 ;ПОВТОРИТЬ, ЕСЛИ НЕ ВСЕ БИТЫ ЗАПИСАНЫ 21 | POP AX ;ВОССТАНОВИТЬ AX,CX 22 | POP CX 23 | RET ;ЗАКОНЧИТЬ ЗАПИСЬ БАЙТА 24 | WRITE_BYTE ENDP 25 | ;-------------------------------------------------------------------------- 26 | WRITE_BIT PROC NEAR 27 | ; ЦЕЛЬ: 28 | ; 29 | ; ЗАПИСАТЬ БИТ ДАННЫХ НА КАССЕТУ 30 | ; ЗАПИСЫВАЕМЫЙ БИТ ПЕРЕДАЕТСЯ В CY 31 | ; Т.Е. ЕСЛИ CY=1, ЗАПИСЫВАЕТСЯ БИТ "1", 32 | ; ЕСЛИ CY=0, ЗАПИСЫВАЕТСЯ БИТ "0" 33 | ; 34 | ; ПРИМЕЧАНИЕ: БИТ ЗАПИСЫВАЕТСЯ ДУМЯ ПЕРЕПАДАМИ СИГНАЛА(1 ПЕРИОД) 35 | ; БИТ "1" ИМЕЕТ ДЛИТЕЛЬНОСТЬ ПОЛУПЕРИОДА 500 МИКРОСЕКУНД 36 | ; ( ПЕРИОД - 1000 МИКРОСЕКУНД ) 37 | ; 38 | ; БИТ "0" ИМЕЕТ ДЛИТЕЛЬНОСТЬ ПОЛУПЕРИОДА 250 МИКРОСЕКУНД 39 | ; ( ПЕРИОД - 500 МИКРОСЕКУНД ) 40 | ; 41 | ;-------------------------------------------------------------------------- 42 | ;ПРЕДПОЛОЖИМ, ЧТО '1' 43 | MOV AX,1184 ;ЗАДАТЬ ПЕРИОД "1" 44 | JC W28 ;ПЕРЕЙТИ, ЕСЛИ ЗАПИСЫВАЕМИЙ БИТ "1" 45 | MOV AX,592 ;ИНАЧЕ УСТАНОВИТЬ ПЕРИОД "0" 46 | W28: 47 | PUSH AX ;СОХРАНИТЬ AX 48 | W29: 49 | IN AL,PORT_C ;ЧИТАТЬ ВЫХОД КАНАЛА 2 ТАЙМЕРА 50 | AND AL,020H 51 | JZ W29 ;ЖДАТЬ ПОЯВЛЕНИЕ ВЫСОКОГО УРОВНЯ 52 | W30: 53 | IN AL,PORT_C ;ТЕПЕРЬ ЖДАТЬ ПОКА ТАЙМЕР ПЕРЕКЛЮЧИТСЯ 54 | ;ОБРАТНО В НИЗКИЙ УРОВЕНЬ 55 | AND AL,020H 56 | JNZ W30 57 | ;ПЕРЕЗАГРУЗИТЬ КАНАЛ 2 ТАЙМЕРА 58 | ;ДЛЯ ПОЛУЧЕНИЯ ПЕРИОДА СЛЕДУЮЩЕГО БИТА 59 | POP AX ;ВОССТАНОВИИТЬ КОЭФФИЦИЕНТ ДЕЛЕНИЯ 60 | W31: ;ПРОГРАММИРОВАНИЕ ТАЙМЕРА 61 | OUT 042H,AL ;ЗАПИСАТЬ МЛАДШИЙ БАЙТ В КАНАЛ 2 62 | MOV AL,AH 63 | OUT 042H,AL ;ЗАПИСАТЬ СТАРШИЙ БАЙТ В КАНАЛ 2 64 | RET 65 | WRITE_BIT ENDP 66 | 67 | ;------------------------------------------------------------------------ 68 | CRC_GEN PROC NEAR 69 | ; ГЕНЕРИРУЕТ CRC ДЛЯ ЗАПИСЫВАЕМОГО БИТА 70 | ; 71 | ; CRC ИСПОЛЬЗУЕТСЯ ДЛЯ ОБНАРУЖЕНИЯ ОШИБОК ЧТЕНИЯ 72 | ; 73 | ; В CY ПЕРЕДАЕТСЯ БИТ НА КОТОРЫЙ ГЕНЕРИРУЕТСЯ CRC 74 | ; 75 | ; МОДИФИЦИРУЕТ AX И ФЛАГИ 76 | ; 77 | ;------------------------------------------------------------------------- 78 | MOV AX,CRC_REG 79 | ;ПОСЛЕДУЮЩИЕ ИНСТРУКЦИИ 80 | ;УСТАНАВЛИВАЮТ ФЛАГ ФЛАГ ПЕРЕПОЛНЕНИЯ, 81 | ;ЕСЛИ CY И СТАРШИЙ БИТ CRC НЕ РАВНЫ 82 | RCR AX,1 83 | RCL AX,1 84 | CLC ;ОБНУЛИТЬ CY 85 | JNO W32 ;ПЕРЕЙТИ, ЕСЛИ ПЕРЕПОНЕНИЕ 86 | ;ЕСЛИ БИТ ДАННЫХ XOR С 15 РАЗРЯДОМ 87 | ;CRC РЕГИСТРА = 1, 88 | XOR AX,0810H ;ТО ВЫПОЛНИТЬ XOR CRC РЕГИСТРА С 89 | ;0810H 90 | STC ;УСТАНОВИТЬ CY 91 | W32: 92 | RCL AX,1 ;СДВИНУТЬ CY (БИТ ДАННЫХ) 93 | ;В CRC РЕГИСТР 94 | MOV CRC_REG,AX ;СОХРАНИТЬ CRC 95 | RET ;ЗАКОНЧИТЬ 96 | CRC_GEN ENDP 97 | 98 | -------------------------------------------------------------------------------- /poisk1/MONN.ASM: -------------------------------------------------------------------------------- 1 | MONITOR PROC FAR 2 | JMP M0 3 | MONITOR ENDP 4 | 5 | ; 6 | ;--------------------------------------------- 7 | ; НАСТРОЙКА ЭКРАНА - 40*25 ЦВЕТНОЙ 8 | ;--------------------------------------------- 9 | M0: 10 | SUB AX,AX 11 | MOV SS,AX 12 | MOV SP,03FFH 13 | 14 | mov ax,01 15 | int 10h 16 | ;--------------------------------------------- 17 | ; Вывод полного меню 18 | ;--------------------------------------------- 19 | MX0: lea si,s0 20 | mov cx,LS0 21 | call P_MSG 22 | mX1: call read_char ;ПРИЕМ ОТВЕТА 23 | cmp AH,3BH ;РАБОТА С КАССЕТОЙ? 24 | JZ READ_CAS ;ДА 25 | cmp AH,3CH ;РАБОТА С ПЗУ 26 | JNZ MX1 ;НЕТ 27 | 28 | PUSH DS 29 | MOV AX,KARTR ;(DS) - ОБЛАСТЬ КАРТРИДЖА 30 | MOV BX,0 31 | MOV DS,AX 32 | ;ПРОВЕРКА КЛЮЧА (ПЕРВЫЙ БАЙТ = E9Н) 33 | MOV AL,BYTE PTR DS:[BX] 34 | CMP AL,0E9H 35 | POP DS 36 | JNZ MX0 ;КЛЮЧА НЕТ 37 | 38 | MOV AX,2 39 | INT 10H 40 | JMP KARTRIDJ 41 | 42 | ;--------------------------------------------- 43 | ; Загрузка файла с кассеты 44 | ;--------------------------------------------- 45 | 46 | READ_CAS: 47 | ASSUME DS:DATA 48 | MOV AX,DATA 49 | MOV DS,AX 50 | mov AX,LOAD_ADDR ;УСТАНОВКА ОБЛАСТИ ЗАГРУЗКИ 51 | mov es,ax 52 | CALL READ_NAME ;ПРИЕМ ИМЕНИ ФАЙЛА 53 | LEA si,SW5 54 | MOV cx,LSW5 55 | CALL P_MSG ;ПОДГОТОВИТЬ МАГНИТОФОН 56 | RC4: CALL READ_CHAR ;ПРИЕМ ОТВЕТА 57 | CMP AL,13 ;ГОТОВ? 58 | JNZ RC4 ;НЕТ 59 | PUSH ES 60 | LEA BX,BUFFERM 61 | MOV AH,4 62 | INT 15H 63 | JC RCERROR 64 | lea si,sX12 65 | MOV cx,LSX12 66 | call P_MSG ;запускать? 67 | call read_char 68 | call wr_1_char 69 | cmp al,'N' 70 | jz RC5 71 | cmp al,'n' 72 | jz RC5 73 | cmp al,'Н' 74 | jz rc5 75 | cmp al,'н' 76 | jz rc5 77 | MOV AX,0 78 | PUSH AX 79 | DB 0CBH ;(RETF) ПЕРЕДАТЬ УПРАВЛЕНИЕ ЗАГРУЖЕННОЙ ПРОГРАММЕ 80 | RC5: JMP M0 ;возврат в монитор 81 | rcerror: 82 | lea si,sX2 83 | mov cx,LSX2 ;--------------------- 84 | call P_MSG 85 | call read_char 86 | JMP MX0 87 | 88 | ; П/П ВВОДА ИМЕНИ ФАЙЛА 89 | ;--------------------------------------------- 90 | READ_NAME: 91 | LEA si,SW2 92 | MOV cx,LSW2 93 | CALL P_MSG 94 | MOV SI,0 95 | RN1: MOV BUFFERM[SI],' ' 96 | INC SI 97 | CMP SI,8 98 | JNZ RN1 99 | MOV SI,0 100 | RN2: CALL READ_CHAR 101 | CMP AL,13 102 | JZ RN3 103 | CMP AL,1BH 104 | JZ READ_NAME 105 | CMP AL,20H 106 | JB RN2 107 | CALL WR_1_CHAR 108 | MOV BUFFERM[SI],AL 109 | INC SI 110 | CMP SI,8 111 | JNZ RN2 112 | RN3: RET 113 | 114 | wr_1_char proc 115 | push cx 116 | PUSH BX 117 | PUSH DX 118 | MOV AH,14 119 | INT 10H 120 | POP DX 121 | POP BX 122 | pop cx 123 | ret 124 | wr_1_char endp 125 | 126 | ;Чтение введенного символа 127 | 128 | read_char proc near 129 | mov ah,0 130 | int 16h 131 | r_ret: ret 132 | read_char endp 133 | ;Сообщения монитора 134 | s0: db 13,10,0F6H,' "ПОИСК" ',0F7H,13,10 135 | db 13,10 136 | s01: db 'F1 - Работа с кассетой',13,10,13,10 137 | s03: db 'F2 - Работа с ПЗУ',13,10,13,10 138 | S05: DB 'Выберите РЕЖИМ' 139 | LS05 = $ - OFFSET S05 140 | LS0 = $ - OFFSET S0 141 | sX12: db 13,10,'Запускать?' 142 | LSX12 = $ - OFFSET SX12 143 | sX2: db 13,10,'Ошибка чтения ***',13,10 144 | LSX2 = $ - OFFSET SX2 145 | SW2: DB 13,10,'Введите имя файла:' 146 | LSW2 = $ - OFFSET SW2 147 | SW5: DB 13,10,'Вкл. магнитофон, нажмите (BK)' 148 | LSW5 = $ - OFFSET SW5 149 | fn: db 13,10,'Файл найден!',13,10 150 | LFN = $ - OFFSET FN 151 | -------------------------------------------------------------------------------- /poisk2/TYME_1.ASM: -------------------------------------------------------------------------------- 1 | DATA segment at 40 2 | org 06ch 3 | TIMER_LOW label word 4 | org 06eh 5 | TIMER_HIGH label word 6 | org 070h 7 | TIMER_OFL label byte 8 | DATA ends 9 | 10 | code segment 11 | tsr proc far 12 | assume cs:code,ds:DATA 13 | 14 | ;------------------------------------------------------------------ 15 | ; THIS ROUTINE INITIALIZES THE TIMER DATA AREA IN THE 16 | ; ROM BIOS DATA AREA. IT IS CALLED BY THE POWER ON ROUTINES. 17 | ; IT CONVERTS HR:MIN:SEC FROM CMOS TO TIMER TICS. 18 | ; IF CMOS IS INVALID, TIMER DATA IS SET TO ZERO 19 | ; INPUT NONE PASSED TO ROUTINE BY CALLER 20 | ; CMOS BYTES USED FOR SETUP 21 | ; 00 SECONDS 22 | ; 02 MINUTES 23 | ; 04 HOURS 24 | ; 0A REGISTER A (UPDATE IN PROGRESS) 25 | ; 0E CMOS VALID IF ZERO 26 | ; OUTPUT 27 | ; TIMER_LOW 28 | ; TIMER_HIGH 29 | ; TIMER_OFL 30 | ; ALL REGISTERS UNCHANGED 31 | ;----------------------------------------------------------------------- 32 | COUNTS_SEC EQU 18 33 | COUNTS_MIN EQU 1092 34 | COUNTS_HOUR EQU 7 35 | CMOS_ADR EQU 70H 36 | CMOS_DATA EQU 71H 37 | CMOS_VALID EQU 0EH 38 | CMOS_SECONDS EQU 00H 39 | CMOS_MINUTES EQU 02H 40 | CMOS_HOURS EQU 04H 41 | CMOS_REGA EQU 0AH 42 | CMOS_PORT EQU 70H 43 | UPDATE_TIMER EQU 80H 44 | DIAG_STATUS EQU 08EH 45 | CMOS_CLK_FAIL EQU 004H 46 | 47 | 48 | SET_TOD PROC NEAR 49 | PUSH AX 50 | PUSH BX 51 | PUSH CX 52 | PUSH DX 53 | PUSH SI 54 | PUSH DI 55 | PUSH BP 56 | PUSH SP 57 | PUSH DS 58 | MOV AX,40H ;ESTABLISH SEGMENT 59 | MOV DS,AX 60 | SUB AX,AX 61 | MOV TIMER_OFL,AL ;RESET TIMER ROLL OVER INDICATOR 62 | MOV TIMER_LOW,AX ; AND TIMER COUNT 63 | MOV TIMER_HIGH,AX 64 | MOV AL,CMOS_VALID 65 | OUT CMOS_ADR,AL ;CHECK CMOS VALIDITY 66 | JMP SHORT $+2 67 | IN AL,CMOS_DATA 68 | AND AL,0C4H ;BAD BATTERY, CHKSUM ERROR OR CLOCK ERROR 69 | JNZ I_POD_DONE ;CMOS NOT VALID--TIMER SET TO ZERO 70 | SUB CX,CX 71 | tUIP: 72 | MOV AL,CMOS_REGA 73 | OUT CMOS_ADR,AL ;ACCESS REGISTER A 74 | JMP SHORT $+2 75 | IN AL,CMOS_DATA 76 | TEST AL,UPDATE_TIMER 77 | JZ READ_SEC 78 | LOOP tUIP 79 | JMP I_POD_DONE 80 | READ_SEC: 81 | MOV AL,CMOS_SECONDS 82 | OUT CMOS_ADR,AL ;ACCESS SECONDS VALUE IN CMOS 83 | JMP SHORT $+2 84 | IN AL,CMOS_DATA 85 | CMP AL,59H ;ARE THE SECONDS WITHIN LIMITS? 86 | JA TOD_ERROR ;GO IF NOT 87 | CALL CVT_BINARY ;CONVERT IT TO BINARY 88 | MOV BL,COUNTS_SEC 89 | MUL BL ;COUNT FOR SECONDS 90 | MOV CX,AX 91 | MOV AL,CMOS_MINUTES 92 | OUT CMOS_ADR,AL ;ACCESS MINUTES VALUE IN CMOS 93 | JMP SHORT $+2 94 | IN AL,CMOS_DATA 95 | CMP AL,59H ;ARE THE MINUTES WITHIN LIMITS? 96 | JA TOD_ERROR ;GO IF NOT 97 | CALL CVT_BINARY ;CONVERT IT TO BINARY 98 | MOV BX,COUNTS_MIN 99 | MUL BX ;COUNT FOR MINUTES 100 | ADD AX,CX 101 | MOV CX,AX 102 | MOV AL,CMOS_HOURS 103 | OUT CMOS_ADR,AL ;ACCESS HOURS VALUE IN CMOS 104 | JMP SHORT $+2 105 | IN AL,CMOS_DATA 106 | CMP AL,23H ;ARE THE HOURS WITHIN LIMITS? 107 | JA TOD_ERROR ;GO IF NOT 108 | CALL CVT_BINARY ;CONVERT IT TO BINARY 109 | MOV DX,AX 110 | MOV BL,COUNTS_HOUR 111 | MUL BL ;COUNT FOR HOURS 112 | ADD AX,CX 113 | ADC DX,0000H 114 | MOV TIMER_HIGH,DX 115 | MOV TIMER_LOW,AX 116 | I_POD_DONE: 117 | CLI ;**IO DELAY NOT REQUIRED** 118 | IN AL,021H ;BE SURE TIMER IS ENABLED 119 | AND AL,0FEH 120 | OUT 021H,AL 121 | STI 122 | POP DS 123 | POP SP 124 | POP BP 125 | POP DI 126 | POP SI 127 | POP DX 128 | POP CX 129 | POP BX 130 | POP AX 131 | ; RET 132 | MOV AH,4CH 133 | INT 21H 134 | TOD_ERROR: 135 | POP DS ;RESTORE SEGMENT 136 | POP SP 137 | POP BP 138 | POP DI 139 | POP SI 140 | POP DX 141 | POP CX 142 | POP BX 143 | POP AX ;RESTORE REG 144 | ; MOV SI,OFFSET CM3 ;DISPLAY CLOCK ERROR 145 | ;CALL E_MSG 146 | MOV AL,DIAG_STATUS ;SET CLOCK ERROR 147 | OUT CMOS_PORT,AL 148 | XCHG AL,AH ;SAVE STATUS ADDRESS 149 | JMP SHORT $+2 ;IO DELAY 150 | IN AL,CMOS_PORT+1 ;GET THE CURRENT STATUS 151 | OR AL,CMOS_CLK_FAIL ;SET NEW STATUS 152 | XCHG AL,AH ;GET STATUS ADDR AND SAVE NEW STATUS 153 | OUT CMOS_PORT,AL 154 | XCHG AL,AH 155 | JMP SHORT $+2 ;IO DELAY 156 | OUT CMOS_PORT+1,AL 157 | ; RET 158 | MOV AH,4CH 159 | INT 21H 160 | SET_TOD ENDP 161 | 162 | CVT_BINARY PROC NEAR 163 | MOV AH,AL ;UNPACK 2 BCD DIGITS IN AL 164 | SHR AH,1 165 | SHR AH,1 166 | SHR AH,1 167 | SHR AH,1 168 | AND AL,0FH ;RESULT IS IN AX 169 | AAD ;CONVERT UNPACKED BCD TO BINARY 170 | RET 171 | CVT_BINARY ENDP 172 | CODE ENDS 173 | END 174 |  -------------------------------------------------------------------------------- /poisk1/STP1.ASM: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------- 2 | ; коррекции: 3 | ; 12.02.89 - BEEP оформлена стандартной подпрограммой 4 | ;------------------------------------------------------------------------- 5 | 6 | 7 | ;----------------- П/П звукового сигнала 8 | ; (BL) - длительность в квантах (квант - ? мс ) 9 | ; (BH) - управление тоном 10 | 11 | BEEP PROC NEAR 12 | PUSH AX 13 | PUSH CX 14 | MOV AL,10110110B ;Выбрать TIM 2,LSB,MSB,BINARY 15 | OUT TIMER+3,AL ;Записать регистр режимов таймера 16 | MOV AL,33H ;Управление тоном звука 17 | OUT TIMER+2,AL ;Записать счетчик таймера 2 18 | MOV AL,BH ;управление тоном звука 19 | OUT TIMER+2,AL ;Записать счетчик таймера 2 20 | IN AL,PORT_B ;Получить текущее состояние порта 21 | PUSH AX ;Сохранение значения порта 22 | OR AL,03 ;Включить звук 23 | OUT PORT_B,AL 24 | MOV CX,100H ;Установить счетчик ожидания 500/64 мс 25 | G7: LOOP G7 ;Задержка перед включением 26 | DEC BL ;Задержка счетчика закончена? 27 | JNZ G7 ;НЕТ - продолжение подачи сигнала 28 | POP AX ;Восстановить значение порта 29 | OUT PORT_B,AL 30 | POP CX 31 | POP AX 32 | RET ;Возврат к программе 33 | BEEP ENDP 34 | 35 | ;------------------------------------------------------------------------ 36 | ; Эта подпрограмма выводит звуковой сигнал ошибки начального тестирования 37 | ; (DX) - количество писков 38 | ;------------------------------------------------------------------------ 39 | BEEP_ERROR PROC NEAR 40 | PUSH CX 41 | PUSH BX 42 | B_ERR_0: 43 | MOV BX,0203H 44 | CALL BEEP 45 | MOV CX,0FFFFH 46 | B_ERR_1: 47 | NOP 48 | LOOP B_ERR_1 49 | DEC DX 50 | JNZ B_ERR_0 51 | POP BX 52 | POP CX 53 | RET 54 | BEEP_ERROR ENDP 55 | 56 | 57 | ;------------------------------------------------------------------------ 58 | ; Эта подпрограмма печатает сообщения на экране. 59 | ; Входные условия: 60 | ; SI=смещение (адрес) буфера сообщения 61 | ; CX=счетчик байтов сообщения 62 | ; Максимальный размер передаваемого сообщения - 36 символов 63 | ;-------------------------------------------------------------------------- 64 | P_MSG PROC NEAR 65 | MOV AL,CS:[SI] ;Заслать символ в AL 66 | INC SI ;Указатель следующего символа 67 | MOV BH,0 ;Установить страницу =0 68 | MOV AH,14 ;Записать символ 69 | INT 10H ;Вызов VIDEO_IO 70 | LOOP P_MSG ;Продолжать до конца сообщения 71 | RET 72 | P_MSG ENDP 73 | 74 | ;--------------------------------------------------------------------- 75 | ; Эта процедура производит подсчет контрольной суммы области памяти 76 | ; DS:BX - начало области памяти 77 | ; CX - размер 78 | ; Если контрольная сумма совпала, то устанавливается флаг Z 79 | ;--------------------------------------------------------------------- 80 | ROS_CHECKSUM PROC NEAR 81 | XOR AL,AL 82 | ROS0: ADD AL,DS:[BX] 83 | INC BX 84 | LOOP ROS0 85 | OR AL,AL 86 | RET 87 | ROS_CHECKSUM ENDP 88 | 89 | ;------------------------------------------------------------------- 90 | ; Эта процедура производит начальную инициализацию программы в ПЗУ 91 | ; DS 92 | ;------------------------------------------------------------------- 93 | ROM_INIT PROC NEAR 94 | SUB AH,AH 95 | MOV AL,[BX+2] ; В рег. (AX) - длина ПЗУ в 512б блоках 96 | MOV CL,9 97 | SHL AX,CL ; Умножить (AX) на 512 98 | PUSH AX ; Сохранить (AX) 99 | MOV CL,4 100 | SHR AX,CL ; Разделить (AX) на 16 101 | ADD DX,AX 102 | POP CX ; (CX) - размер ПЗУ 103 | CALL ROS_CHECKSUM 104 | JZ ROM_I_0 105 | PUSH DX 106 | MOV DX,2 107 | CALL BEEP_ERROR 108 | POP DX 109 | JMP ROM_I_RET 110 | ROM_I_0: 111 | PUSH DX 112 | PUSH CS 113 | LEA AX,CS:ROM_I_1 114 | PUSH AX 115 | PUSH DS 116 | MOV AX,3 117 | PUSH AX 118 | DB 0CBH ;(RETF) 119 | ROM_I_1: 120 | POP DX 121 | SUB DX,20H 122 | ROM_I_RET: 123 | RET 124 | ROM_INIT ENDP 125 | 126 | 127 | 128 | ; ORG 0FF54H 129 | 130 | -------------------------------------------------------------------------------- /poisk1/RWCAS.ASM: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------06-04-89---------- 2 | ; ПРОЦЕДУРА ОСУЩЕСТВЛЯЕТ ЧТЕНИЕ ФАЙЛА С КАССЕТЫ 3 | ;------------------------------------------------------------------ 4 | ; 5 | ; 1.3. Заголовок файла 6 | ; Заголовок файла на магнитной ленте имеет следующий формат 7 | ;(смещения даются в байтах в шестнадцатеричной системе счисле- 8 | ;ния): 9 | ; 0 Содержит значение 0A5h, признак заголовка файла. 10 | ; 11 | ;1-8 Имя файла. Длина имени файла от 1 до 8 символов. Кроме сим- 12 | ; волов, перечисленных в описании языка как допустимые в име- 13 | ; ни файла символы, кассетный Бейсик в имени файла допускает 14 | ; также и русские буквы. 15 | ; 16 | ; 9 Тип файла. Определяет тип содержащейся в файле информации, 17 | ; способ ее представления в файле, команду, с помощью которых 18 | ; информация была записана в файл. Тип файла кодируется сле- 19 | ; дующими значениями: 20 | ; 21 | ; 00 - файл, содержащий Бейсик-программу в символьном форма- 22 | ; те, записанный на магнитную ленту с помощью оператора 23 | ; SAVE, описанного в подпункте 3.51 данного документа, 24 | ; или файл данных, записанный Бейсик-программой с по- 25 | ; мощью операторов PRINT# и WRITE#, описанных в подпунк- 26 | ; тах 3.43 и 3.59 данного документа. Из Бэйсик-программы 27 | ; такой файл открывается и закрывается с помощью опера- 28 | ; торов OPEN и CLOSE, описанных в подпунктах 3.37 и 3.4 29 | ; данного документа. В случае использования кассетного 30 | ; Бейсика оператор OPEN (см.п.3.37) записывает на маг- 31 | ; нитную ленту заголовок файла. Функция оператора CLOSE 32 | ; (см.п.3.4) заключается в дописывании в файл полностью 33 | ; незаполненного буфера файла после завершения операций 34 | ; записи в файл. Операторы PRINT# (см.п.3.43), WRITE# 35 | ; (см.п.3.59) непосредственно записывают выводимые дан- 36 | ; ные в 256-байтный буфер файла. Когда этот буфер запол- 37 | ; няется полностью, он целиком переписывается на магнит- 38 | ; ную ленту и освобождается для приема новых данных. 39 | ; 01 - файл с содержимым области оперативной памяти; записы- 40 | ; вается с помощью оператора BSAVE (см.п.3.51). 41 | ; 40 - файл, содержащий Бейсик-программу в символьном форма- 42 | ; те. Записывается на магнитную ленту с помощью операто- 43 | ; ров SAVE (см.п.3.51) с опцией А и директивы LIST, опи- 44 | ; саной в подпунктах 3.27, 5.7. 45 | ; 80 - файл, содержащий Бейсик-программу в сжатом формате. 46 | ; Записывается на магнитную ленту с помощью оператора 47 | ; SAVE (см.п.3.51) без опции. 48 | ; A0 - файл, содержащий Бейсик-программу в защищенном формате. 49 | ; Записывается на магнитную ленту с помощью операторов 50 | ; SAVE (см.п.3.51) с опцией P. 51 | ; 52 | ;A-B Длина записанной в файл информации. 53 | ;C-D Значение сегмента адреса в оперативной памяти информации, 54 | ; которая была переписана в файл. 55 | ;E-F Значение смещения адреса в оперативной памяти информации, 56 | ; которая была переписана в файл. 57 | ;10 Содержит значение 00, признак конца заголовка файла. 58 | ; 59 | ; Примечание. Длина записанной в файл информации, значения 60 | ;сегмента и смещения адреса (поля заголовка A-F) запоминаются в 61 | ;заголовке только для файлов типов 01, 80 и А0. 62 | 63 | 64 | FILE_READ PROC NEAR 65 | rc2: 66 | MOV BP,SP 67 | MOV AX,SS:[BP+2] 68 | MOV DS,AX ;(DS:BX) - ИМЯ ФАЙЛА 69 | PUSH BX 70 | RC3: mov bx,0 71 | mov cx,12 72 | mov ah,2 73 | int 15h ;загрузка заголовка 74 | JC FREND ;БЫЛА ОШИБКА 75 | mov di,0 ;СРАВНЕНИЕ ЗАГОЛОВКА 76 | cmp byte ptr es:[di],0a5h 77 | jnz rc3 78 | INC DI 79 | POP BX 80 | mov si,0 81 | rc6: mov al,byte ptr es:[di] 82 | CMP DS:[BX+SI],AL 83 | jnz rc2 ;заголовок не совпал 84 | inc di 85 | inc si 86 | cmp si,8 87 | jnz rc6 88 | LEA si,fn ;"ФАЙЛ НАЙДЕН" 89 | mov cx,LFN 90 | call P_MSG 91 | mov di,10 92 | mov cx,es:[di] 93 | mov bx,0 94 | mov ah,2 95 | int 15h ;загрузить файл 96 | ret 97 | FREND: 98 | pop bx 99 | RET 100 | FILE_READ ENDP 101 | 102 | ;----------------------------------------------06-04-89------------ 103 | ; ПРОЦЕДУРА ОСУЩЕСТВЛЯЕТ ЗАПИСЬ ФАЙЛА НА КАССЕТУ 104 | ;------------------------------------------------------------------ 105 | 106 | FILE_WRITE PROC NEAR 107 | 108 | MOV BP,SP 109 | MOV AX,SS:[BP+2] 110 | MOV DS,AX ;(DS:BX) - ИМЯ ФАЙЛА 111 | PUSH ES 112 | PUSH DS 113 | POP ES 114 | MOV CX,17 115 | MOV AH,3 116 | push bx 117 | INT 15H 118 | pop bx 119 | MOV CX,DS:[BX+10] 120 | MOV BX,0 121 | POP ES 122 | MOV AH,3 123 | INT 15H 124 | PUSH DS 125 | RET 126 | 127 | FILE_WRITE ENDP 128 | 129 | -------------------------------------------------------------------------------- /poisk1/INT10_B2.ASM: -------------------------------------------------------------------------------- 1 | ;----------------------------------------------------- 2 | ; WRITE_TTY 3 | ; Эта программа обеспечивает работу с ВИДЕО в режиме телетайпа. Выводимый 4 | ; символ записывается в текущую позицию курсора, и курсор перемещаетя в 5 | ; следующую позицию. После записи символа в последнюю позицию строки 6 | ; выполняется автоматический переход на новую строку. Если активная страница 7 | ; экрана заполнена, выполняется перемещение экрана на одну строку вверх 8 | ; (свертка). Освободившаяся строка заполняется цветом атрибута из последней 9 | ; позиции курсора перед сверткой (в символьном режиме). В графическом режиме 10 | ; используется цвет 0. 11 | ;Вход: 12 | ; (AH) - текущий режим экрана 13 | ; (AL) - выодимый символ 14 | ; (BL) - цвет переднего плана для символа в графическом режиме 15 | ;Замечание: возврат на шаг, возврат каретки, перевод строки и звонок 16 | ; отрабатываются как команды. 17 | ;Выход: 18 | ; Все регистры сохраняются 19 | ;--------------------------------------------------------------------------- 20 | ASSUME CS:CODE,DS:DATA 21 | WRITE_TTY PROC NEAR 22 | PUSH AX ;Сохранить регистры 23 | PUSH AX ;Сохранить символ для записи 24 | MOV BH,ACTIVE_PAGE ;Получить текущую активную страницу 25 | MOV AH,3 26 | INT INT_VIDEO ;Прочесть значение текущей позиции курсора 27 | POP AX ;Восстановить символ 28 | ; 29 | ;------ DX содержит текущую позицию курсора 30 | ; 31 | CMP AL,8 ;Это возврат на шаг? 32 | JE U8 ;Да, переход 33 | CMP AL,0DH ;Это возврат каретки? 34 | JE U9 ;Да, переход 35 | CMP AL,0AH ;Это перевод строки? 36 | JE U10 ;Да, переход 37 | CMP AL,07H ;Это звонок? 38 | JE U11 ;Да, переход 39 | ; 40 | ;------ Запись символа на экран 41 | ; 42 | MOV AH,10 ;Запись только символа 43 | MOV CX,1 ;Только один символ 44 | INT INT_VIDEO ;Запись символа 45 | ; 46 | ;------ Позиция курсора для следующего символа 47 | ; 48 | INC DL 49 | CMP DL,BYTE PTR CRT_COLS ;Проверка переполнения колонки 50 | JNZ U7 ;Установить курсор 51 | MOV DL,0 ;Колонка для курсора 52 | CMP DH,24 53 | JNZ U6 ;Установить курсор 54 | ; 55 | ;------ Требуется свертка (прокрутка) 56 | U1: 57 | MOV AH,2 58 | MOV BH,ACTIVE_PAGE ;Получить текущую активную страницу 59 | INT INT_VIDEO ;Установить курсор 60 | ; 61 | ;------ Определение значения заполнителя во время свертки 62 | ; 63 | CMP CRT_MODE,4 64 | JC U2 ;Считывание курсора 65 | MOV BH,0 ;Заполнение фона 66 | JMP SHORT U3 ;Установить прокрутку 67 | U2: ;Считывание курсора 68 | MOV BH,ACTIVE_PAGE ;Получить текущую активную страницу 69 | MOV AH,8 70 | INT INT_VIDEO ;Прочесть символ/атрибут текущего курсора 71 | MOV BH,AH ;Заполнить в BH 72 | U3: ;Прокрутка 73 | MOV AX,601H ;Прокрутка одной строки 74 | MOV CX,0 ;Верхний левый угол 75 | MOV DH,24 ;Нижняя правая строка 76 | MOV DL,BYTE PTR CRT_COLS ;Нижняя правая колонка 77 | DEC DL 78 | U4: 79 | INT INT_VIDEO ;Прокрутка экрана 80 | U5: ;Возврат из TTY 81 | POP AX ;Восстановить символ 82 | JMP VIDEO_RETURN ;Возврат 83 | U6: ;Установить курсор 84 | INC DH ;Следующая строка 85 | U7: ;Установить курсор 86 | MOV BH,ACTIVE_PAGE ;Получить текущую активную страницу 87 | MOV AH,2 88 | JMP U4 ;Установить новый курсор 89 | ; 90 | ;------ Определен возврат на шаг 91 | U8: 92 | CMP DL,0 ;Уже конец строки? 93 | JE U7 ;Установить курсор 94 | DEC DL ;Нет- вернуть его на шаг 95 | JMP U7 ;Установить курсор 96 | ; 97 | ;------ Определен возврат каретки 98 | U9: 99 | MOV DL,0 ;Передвинуть на первую колонку 100 | JMP U7 ;Установить курсор 101 | ; 102 | ;------ Определен перевод строки 103 | U10: 104 | CMP DH,24 ;Последняя строка экрана? 105 | JNE U6 ;Да, прокрутка экрана 106 | JMP U1 ;Нет, установить курсор снова 107 | ; 108 | ;------ Определен звонок 109 | U11: 110 | MOV BX,0602H ;Установить счетчик для сигнала 111 | CALL BEEP ;Включить звук BELL 112 | JMP U5 ;Возврат из TTY 113 | WRITE_TTY ENDP 114 | ;--------------------------------------------------------------------------- 115 | ;LIGHT PEN 116 | ; В БМ ЭВМ световое перо отсутствует, и режим считывания положения 117 | ; светового пера не поддерживается. 118 | ;---------------------------------------------------------------------------- 119 | ASSUME CS:CODE,DS:DATA 120 | READ_LPEN PROC NEAR 121 | MOV AH,0 122 | JMP VIDEO_RETURN ;Нет светового пера, возврат 123 | READ_LPEN ENDP 124 | 125 | -------------------------------------------------------------------------------- /poisk1/TEST.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; Начальные тест-программы, инициализация 3 | ;--------------------------------------------------------------------------- 4 | ASSUME CS:CODE, DS:DATA 5 | RESET LABEL NEAR 6 | START: CLI ;Точка ахода в BIOS (по сбросу, 7 | ;по включению питания) 8 | IN AL,TRAP_A ;Сброс триггера NMI 9 | MOV AL,89H ;Установка режима 8255 (TRAP) 10 | OUT PPIC,AL 11 | MOV AL,88H ;Установка режима 12 | OUT SCR_MODE,AL 13 | IN AL,TRAP_A ;Сброс триггера NMI 14 | MOV AL,83H ;Установка режима 8255 (KBD) 15 | OUT KEY_SERV_MODE,AL ;Установка режима клавиатуры 16 | ; Передача управления привелигированному ПЗУ, если оно есть 17 | MOV AX,0C000H 18 | SUB BX,BX 19 | MOV DS,AX 20 | CMP DS:[BX],055AAH 21 | JNZ ST0 22 | JMP KARTRIDJ+3 23 | 24 | ST0: SUB AX,AX 25 | MOV ES,AX ;Сегмент=0 26 | XOR DI,DI 27 | MOV CX,0FFFFH 28 | CLD ;Очистка области памяти=64К 29 | REP STOSB 30 | MOV CX,0800H 31 | MOV ES,CX 32 | MOV DI,8000H 33 | MOV CX,DI 34 | CLD 35 | REP STOSB 36 | MOV ES,AX ;Сегмент=0 37 | XOR DI,DI 38 | MOV CX,0FFFFH 39 | CLD ;Очистка области памяти=64К 40 | REP SCASB 41 | CMP CX,0 42 | JZ CLR1 43 | HLT 44 | CLR1: MOV CX,0800H 45 | MOV ES,CX 46 | MOV DI,8000H 47 | MOV CX,DI 48 | CLD 49 | REP SCASB 50 | CMP CX,0 51 | JZ CLR2 52 | MOV DX,04 53 | CALL BEEP_ERROR 54 | HLT 55 | 56 | CLR2: 57 | MOV ES,AX 58 | MOV SS,AX 59 | MOV SP,03FFH 60 | PUSH CS ;Установка таблицы прерываний: 61 | PUSH CS 62 | POP BX 63 | POP DS 64 | MOV CX,1EH ;Установка счетчика векторов 65 | MOV SI,OFFSET VECTOR_TABLE ;Смещение таблицы векторов 66 | MOV DI,OFFSET INT5_PTR 67 | SM0: LODSW ;Пересылка таблицы векторов 68 | STOSW ;(Адреса обслуживания прерываний) 69 | MOV AX,BX 70 | STOSW 71 | LOOP SM0 72 | MOV DI,8 73 | MOV AX,OFFSET NMI_SERVICE ;Засылка вектора NMI 74 | STOSW 75 | MOV AX,BX 76 | STOSW 77 | MOV AX,DATA 78 | MOV ES,AX 79 | MOV CX,10H ;Размер TEST_TABLIC 80 | MOV SI,OFFSET TEST_TABLIC ;(Таблица конфигурации) 81 | MOV DI,OFFSET RS232_BASE 82 | REP MOVSW 83 | SUB AX,AX 84 | IX0: ADD AX,4000H 85 | PUSH AX 86 | MOV DS,AX 87 | SUB BX,BX 88 | MOV AX,5AA5H 89 | MOV [BX],AX 90 | NOT AX 91 | NOT WORD PTR [BX] 92 | CMP WORD PTR [BX],AX 93 | POP AX 94 | PUSH ES 95 | POP DS 96 | JNZ IX1 97 | ADD MEMORY_SIZE+1,1 98 | JMP IX0 99 | IX1: MOV MOTOR_STATUS,1 100 | ;;; MOV EMPTY,0 ; клавиатура пустая 101 | MOV FBEEP,TRUE 102 | ;;; MOV RUSS,FALSE 103 | ;;; MOV SHIFT1,LEFT_KEY ; клавиша отжата 104 | MOV AL,13H ;Установить режим 8259 105 | OUT INTA00,AL ;Контроллер прерываний 106 | MOV AL,8 107 | OUT INTA01,AL 108 | MOV AL,9 109 | OUT INTA01,AL 110 | MOV AL,36H ;Установить режим 8253 111 | OUT TIM_CTL,AL ;Таймер 112 | XOR AL,AL 113 | OUT TIMER0,AL ;Канал 0 114 | OUT TIMER0,AL 115 | MOV AL,76H 116 | OUT TIM_CTL,AL 117 | XOR AL,AL 118 | OUT TIMER0+1,AL ;Канал 1 119 | OUT TIMER0+1,AL 120 | 121 | ; Установка режима VIDEO 122 | 123 | MOV AX,0003H 124 | INT 10H 125 | 126 | ; Тест BIOS 127 | PUSH DS 128 | PUSH CS 129 | POP DS 130 | MOV BX,0E000H 131 | MOV CX,2000H 132 | CALL ROS_CHECKSUM ;Проверка контрольной суммы 133 | JZ IX2 134 | MOV DX,3 135 | CALL BEEP_ERROR 136 | HLT 137 | ; Установка начальных значений дисковых переменных 138 | IX2: POP DS 139 | MOV BYTE PTR TRACK_PTR,0H 140 | MOV BYTE PTR TRACK_PTR+1,0H 141 | ;Заполнение начального значения адреса загрузки 142 | 143 | MOV WORD PTR LOAD_ADDR,0060H 144 | STI ;Разрещить прерывания 145 | 146 | ; Выдачы заставки 147 | 148 | ; Проверка и инициализация ПЗУ и картреджей 149 | 150 | MOV DX,0C000H 151 | ROM_CH0: 152 | MOV DS,DX 153 | SUB BX,BX 154 | CMP [BX],0AA55H 155 | JNE ROM_CH1 156 | CALL ROM_INIT 157 | ROM_CH1: 158 | ADD DX,20H 159 | CMP DX,0FE00H 160 | JL ROM_CH0 161 | SYS_BOOT: 162 | PUSH DS 163 | INT 19H ;Загрузка системы 164 | POP DS 165 | INT 18H ;Передача управления ПЗУ 166 | ;или работа с кассетой 167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /poisk2/INT5.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;---INT5-------------------------------------------------------------------- 3 | ; THIS LOGIC WILL BE INVOKED BY INTERRUPT 05H TO PRINT 4 | ; THE SCREEN. THE CURSOR POSITION AT THE TIME THIS ROUTINE 5 | ; IS INVOKED WILL BE SAVED AND RESTORED UPON COMPLETION. 6 | ; THE ROUTINE IS INTENDED TO RUN WITH INTERRUPTS ENABLED. 7 | ; IF A SUBSEQUENT 'PRINT SCREEN' KEY IS DEPRESSED DURING THE 8 | ; TIME THIS ROUTINE IS PRINTING IT WILL BE IGNORED. 9 | ; ADDRESS 50:0 CONTAINS THE STATUS OF THE PRINT SCREEN: 10 | ; 11 | ; 50:0 =0 EITHER PRINT SCREEN HAS NOT BEEN CALLED 12 | ; OR UPON RETURN FROM A CALL THIS INDICATES 13 | ; A SUCCESSFUL OPERATION. 14 | ; =1 PRINT SCREEN IS IN PROGRESS 15 | ; =255 ERROR ENCOUNTERED DURING PRINTING 16 | ;--------------------------------------------------------------------------- 17 | ASSUME CS:CODE,DS:XXDATA 18 | ORG 0FF54H 19 | PRINT_SCREEN PROC FAR 20 | STI ;MUST RUN WITH INTERRUPTS ENABLED 21 | PUSH DS ;MUST USE 50:0 FOR DATA AREA STORAGE 22 | PUSH AX 23 | PUSH BX 24 | PUSH CX ;WILL USE THIS LATER FOR CURSOR LIMITS 25 | PUSH DX ;WILL HOLD CURRENT CURSOR POSITION 26 | MOV AX,XXDATA ;HEX 50 27 | MOV DS,AX 28 | CMP STATUS_BYTE,1 ;SEE IF PRINT ALREADY IN PROGRESS 29 | JZ EXIT ;JUMP IF PRINT ALREADY IN PROGRESS 30 | MOV STATUS_BYTE,1 ;INDICATE PRINT NOW IN PROGRESS 31 | MOV AH,15 ;WILL REQUEST THE CURRENT SCREEN MODE 32 | INT 10H ; [AL]=MODE 33 | ; [AH]=NUMBER COLUMNS/LINE 34 | ; [BH]=VISUAL PAGE 35 | 36 | ;------------------------------------------------------------------ 37 | ; AT THIS POINT WE KNOW THE COLUMNS/LINE ARE IN 38 | ; [AX] AND THE PAGE IF APPLICABLE IS IN [BH]. 39 | ; THE STACK HAS DS,AX,BX,CX,DX PUSHED. 40 | ; [A] HAS VIDEO MODE 41 | ;-------------------------------------------------------------------- 42 | MOV CL,AH ;WILL MAKE USE OF [CX] REGISTER TO 43 | MOV CH,25 ;CONTROL ROW & COLUMNS 44 | CALL CRLF ;CARRIAGE RETURN LINE FEED ROUTINE 45 | PUSH CX ;SAVE SCREEN BOUNDS 46 | MOV AH,3 ;WILL NOW READ THE CURSOR 47 | INT 10H ;AND PRESERVE THE POSITION 48 | POP CX ;RECALL SCREEN BOUNDS 49 | PUSH DX ;RECALL [BH]=VISUAL PAGE 50 | XOR DX,DX ;WILL SET CURSOR POSITION TO [0,0] 51 | ;---------------------------------------------------------------------- 52 | ; THE LOOP FROM PRI10 TO THE INSTRUCTION PRIOR TO PRI20 53 | ; IS THE LOOP TO READ EACH CURSOR POSITION FROM THE SCREEN 54 | ; AND PRINT. 55 | ;---------------------------------------------------------------------- 56 | PRI10: MOV AH,2 ;TO INDICATE CURSOR SET REQUEST 57 | INT 10H ;NEW CURSOR POSITION ESTABLISHED 58 | MOV AH,8 ;TO INDICATE READ CHARACTER 59 | INT 10H ;CHARACTER NOW IN [AL] 60 | OR AL,AL ;SEE IF VALID CHAR 61 | JNZ PRI15 ;JUMP IF VALID CHAR 62 | MOV AL,' ' ;MAKE A BLANK 63 | PRI15: 64 | PUSH DX ;SAVE CURSOR POSITION 65 | XOR DX,DX ;INDICATE PRINTER 1 66 | XOR AH,AH ;TO INDICATE PRINT CHAR IN [AL] 67 | INT 17H ;PRINT TO CHARACTER 68 | POP DX ;RECALL CURSOR POSITION 69 | TEST AH,25H ;TEST FOR PRINTER ERROR 70 | JNZ ERR10 ;JUMP IF ERROR DETECTED 71 | INC DL ;ADVANCE TO NEXT COLUMN 72 | CMP CL,DL ;SEE IF AT END OF LINE 73 | JNZ PRI10 ;IF NOT PROCEED 74 | XOR DL,DL ;BACK TO COLUMN 0 75 | MOV AH,DL ;[AH]=0 76 | PUSH DX ;SAVE NEW CURSOR POSITION 77 | CALL CRLF ;LINE FEED CARRIAGE RETURN 78 | POP DX ;RECALL CURSOR POSITION 79 | INC DH ;ADVANCE TO NEXT LINE 80 | CMP CH,DH ;FINISHED? 81 | JNZ PRI10 ;IF NOT CONTINUE 82 | PRI20: 83 | POP DX ;RECALL CURSOR POSITION 84 | MOV AH,2 ;TO INDICATE CURSOR SET REQUEST 85 | INT 10H ;CURSOR POSITION RESTORED 86 | MOV STATUS_BYTE,0 ;INDICATE FINISHED 87 | JMP SHORT EXIT ;EXIT THE ROUTINE 88 | ERR10: 89 | POP DX ;GET CURSOR POSITION 90 | MOV AH,2 ;TO REQUEST CURSOR SET 91 | INT 10H ;CURSOR POSITION RESTORED 92 | ERR20: 93 | MOV STATUS_BYTE,0FFH ;INDICATE ERROR 94 | 95 | EXIT: POP DX ;RESTORE ALL THE REGISTERS USED 96 | POP CX 97 | POP BX 98 | POP AX 99 | POP DS 100 | IRET 101 | PRINT_SCREEN ENDP 102 | 103 | 104 | ;-------CARRIAGE RETURN, LINE FEED SUBROUTINE 105 | 106 | CRLF PROC NEAR 107 | XOR DX,DX ;PRINTER 0 108 | XOR AH,AH ;WILL NOW SEND INITIAL LF,CR TO PRINTER 109 | MOV AL,12Q ;LF 110 | INT 17H ;SEND THE LINE FEED 111 | XOR AH,AH ;NOW FOR THE CR 112 | MOV AL,15Q ;CR 113 | INT 17H ;SEND THE CARRIAGE RETURN 114 | RET 115 | CRLF ENDP 116 | 117 | -------------------------------------------------------------------------------- /poisk1/NMISER.ASM: -------------------------------------------------------------------------------- 1 | 2 | ;------------------------------------------------------------------------ 3 | ; ; 4 | ; ******* Программа обслуживания NMI ******* ; 5 | ; ; 6 | ;------------------------------------------------------------------------ 7 | NMI_SERVICE: 8 | CLD 9 | PUSH ES 10 | PUSH DS 11 | PUSH DX 12 | PUSH CX 13 | PUSH BX 14 | PUSH SI 15 | PUSH DI 16 | PUSH AX 17 | MOV AX,DSEGMENT 18 | MOV DS,AX 19 | MOV AX,START_BUFFER ;Адрес начала буфера 20 | MOV ES,AX 21 | IN AX,TRAP_A 22 | MOV BX,AX 23 | TEST AH,40h 24 | JNZ IO_ROUTINES 25 | MWTC_ROUTINE: ;Подпрограмма обслуживания ВИДЕО 26 | ; (запись текста) 27 | CLI ;Запрет прерываний 28 | MOV DI,BX 29 | AND DI,3FFEh ;Выбор части адреса 30 | MOV DX,ES:[DI] ;Чтение символа/атрибута 31 | SAR DI,1 32 | MOV AX,DI 33 | MOV CL,AH 34 | SAR CL,1 35 | SAR CL,1 36 | TEST CRT_MODE,2 ;80x25 ? 37 | JZ MW4 ;Нет, 40x25 38 | SAR CL,1 ;CL = PageNo 39 | MOV CH,80 ;CH = 80 40 | AND AH,7 41 | MW2: 42 | DIV CH 43 | XCHG AH,AL 44 | PUSH AX 45 | CBW 46 | SUB DI,AX 47 | SAL DI,1 48 | SAL DI,1 49 | ADD DI,AX 50 | POP AX 51 | CMP CL,ACTIVE_PAGE ;Активная страница? 52 | JNE AX_NMI 53 | XOR CH,CH 54 | MOV SI,CX 55 | SAL SI,1 56 | CMP AX,[SI+OFFSET CURSOR_POSN] 57 | MOV BX,EXTRA_BUFFER 58 | MOV ES,BX 59 | PUSHF 60 | JNE MW3 61 | CALL REMOVE_CURSOR 62 | MW3: 63 | PUSH AX 64 | MOV AX,DX 65 | MOV BL,AH 66 | XOR AH,AH 67 | MOV CL,1 68 | TEST CRT_MODE,2 ;\80x25 ? 69 | JNZ MW31 ;\ДА 70 | and di,0fffh ;\ 71 | JMP MW32 ;\ 72 | MW31: AND DI,1FFFH ;\ 73 | MW32: CALL S1B 74 | POP AX 75 | POPF 76 | AX_NMI: 77 | POP AX 78 | NMI_RET: 79 | JMP VIDEO_RETURN ;Переход на возврат из ВИДЕО 80 | MW4: 81 | MOV CH,40 82 | AND AH,3 83 | JMP MW2 84 | 85 | IO_ROUTINES: ;Дешифрация остальных NMI 86 | ; (обращение к портам ВИДЕО) 87 | TEST AH,80h 88 | JNZ IOWC_ROUTINE 89 | 90 | IORC_ROUTINE: 91 | POP AX 92 | MOV AL,0FFh 93 | JMP VIDEO_RETURN 94 | 95 | IOWC_ROUTINE: 96 | IN AL,TRAP_D 97 | MOV SI,AX 98 | CMP BL,0D4h ; ;Порт 3D4 ? 99 | JE PORT_3D4 100 | CMP BL,0D5h ;Порт 3D5 ? 101 | JE PORT_3D5 102 | CMP BL,0D8h ;Порт 3D8 ? 103 | JE PORT_3D8 104 | CMP BL,0D9h ;Порт 3D9 ? 105 | JNE AX_NMI 106 | PORT_3D9: 107 | XCHG AL,AH ;Сохранить первоначальные данные 108 | IN AL,SCR_MODE ;ввести байт текущего режима 109 | AND AX,37C8H ;Маска D7,D6 и D3 110 | ;Выбор D4,D5 и D2..D0 111 | OR AL,AH ;Составить новый байт 112 | OUT SCR_MODE,AL ;Задать новый режим экрана 113 | JMP AX_NMI 114 | PORT_3D4: ;Запись в порт 3D4 (число 6845) 115 | MOV REG_6845,AL ;Сохранить это в памяти 116 | JMP AX_NMI ;Все сделано 117 | PORT_3D5: 118 | MOV CL,REG_6845 ;Восстановить число 119 | CMP CL,11 120 | JNZ REG10 121 | MOV BYTE PTR CURSOR_MODE,AL 122 | REG10: CMP CL,10 123 | JNZ REG14 124 | MOV BYTE PTR CURSOR_MODE+1,AL 125 | REG14: 126 | CMP CL,15 ;Регистр=15? 127 | JE REG_15 128 | CMP CL,14 ;Регистр=14? 129 | JNE AX_NMI ;Если регистр не 14 и не 15, ничего не делать 130 | MOV CURSOR_POS_H,AL ;Сохранить верхнюю позицию курсора 131 | JMP AX_NMI ;Все сделано 132 | REG_15: ;Регистр 15 133 | MOV CURSOR_POS_L,AL ;Сохранить нижнюю позицию курсора 134 | MOV AH,CURSOR_POS_H 135 | TEST CRT_MODE,2 136 | JZ R_15_2 137 | MOV CL,80 138 | R_15_1: 139 | and ax,07ffh 140 | 141 | DIV CL 142 | XCHG AL,AH 143 | MOV DX,AX 144 | POP AX 145 | MOV BH,ACTIVE_PAGE 146 | JMP SET_CPOS 147 | R_15_2: 148 | MOV CL,40 149 | JMP R_15_1 150 | PORT_3D8: ;Порт 3D8 (порт режима) 151 | AND AL,1Fh ;*** 152 | JE P_D8_RET 153 | TEST AL,8 154 | JNZ P_D8_RET 155 | TEST AL,12h ;Графика? 156 | JNZ P_D8_3 ;Да 157 | XOR AH,AH 158 | TEST AL,1 ; 80X25 ? 159 | JZ P_D8_1 ;Нет 160 | MOV AH,2 161 | P_D8_1: 162 | TEST AL,4 ;Цветной? 163 | JNZ P_D8_2 ;Нет 164 | INC AH 165 | P_D8_2: 166 | XCHG AL,AH 167 | XOR AH,AH 168 | CMP AL,CRT_MODE 169 | JE P_D8_RET ;Вызов обработки функций ВИДЕО 170 | INT 10h 171 | P_D8_RET: 172 | JMP AX_NMI 173 | P_D8_3: 174 | MOV AH,6 175 | TEST AL,10h ; 640X200 ? 176 | JNZ P_D8_2 ; Да 177 | DEC AH 178 | TEST AL,4 ;Цветной? 179 | JNZ P_D8_2 ;Нет 180 | DEC AH 181 | JMP P_D8_2 182 | 183 | -------------------------------------------------------------------------------- /poisk2/INT17.ASM: -------------------------------------------------------------------------------- 1 | ;--- INT 17 ------------------------------------------------------------- 2 | ; PRINTER_IO : 3 | ; THIS ROUTINE PROVIDES COMMUNICATION WITH THE PRINTER : 4 | ; INPUT : 5 | ; (AH)=0 PRINT THE CHARACTER IN (AL) : 6 | ; ON RETURN, AH=1 IF CHARACTER COULD NOT BE PRINTED : 7 | ; (TIME OUT). OTHER BITS SET AS ON NORMAL STATUS CALL : 8 | ; (AH)=1 INITIALIZE THE PRINTER PORT : 9 | ; RETURN WITH (AH) SET WITH PRINTER STATUS : 10 | ; (AH)=2 READ THE PRINTER STATUS INTO (AH) : 11 | ; 7 6 5 4 3 2-1 0 : 12 | ; | | | | | | |_TIME OUT : 13 | ; | | | | | |_ UNUSED : 14 | ; | | | | |_ 1 = I/O ERROR : 15 | ; | | | |_ 1 = SELECTED : 16 | ; | | |_ 1 = OUT OF PAPER : 17 | ; | |_ 1 = ACKNOWLEDGE : 18 | ; |_ 1 = NOT BUSY : 19 | ; : 20 | ; (DX) = PRINTER TO BE USED (0,1,2) CORRESPONDING TO ACTUAL : 21 | ; VALUES IN PRINTER_BASE AREA : 22 | ; : 23 | ; DATA AREA PRINTER_BASE CONTAINS THE BASE ADDRESS OF THE PRINTER : 24 | ; CARD(S) AVAILABLE (LOCATED AT BEGINNING OF DATA SEGMENT, : 25 | ; 408H ABSOLUTE, 3 WORDS) : 26 | ; : 27 | ; DATA AREA PRINT_TIM_OUT (BYTE) MAY BE CHANGED TO CAUSE DIFFERENT : 28 | ; TIME-OUT WAITS. DEFAULT=20 : 29 | ; : 30 | ; REGISTERS AH IS MODIFIED : 31 | ; ALL OTHER UNCHANGED : 32 | ;------------------------------------------------------------------------ 33 | ASSUME CS:CODE,DS:DATA 34 | ORG 0EFD2H 35 | PRINTER_IO PROC FAR 36 | STI ; INTERRUPTS BACK ON 37 | PUSH DS ; SAVE SEGMENT 38 | PUSH DX 39 | PUSH SI 40 | PUSH CX 41 | PUSH BX 42 | CALL DDS 43 | MOV SI,DX ; GET PRINTER PARM 44 | MOV BL,PRINT_TIM_OUT[SI] ; LOAD TIME-OUT PARM 45 | SHL SI,1 ; WORD OFFSET INTO TABLE 46 | MOV DX,PRINTER_BASE[SI] ; GET BASE ADDRESS FOR PRINTER CARD 47 | OR DX,DX ; TEST DX FOR ZERO, 48 | ; INDICATING NO PRINTER 49 | JZ B1 ; RETURN 50 | OR AH,AH ; TEST FOR (AH)=0 51 | JZ B2 ; PRINT_AL 52 | DEC AH ; TEST FOR (AH)=1 53 | JZ B8 ; INIT_PRT 54 | DEC AH ; TEST FOR (AH)=2 55 | JZ B5 ; PINTER STATUS 56 | B1: ; RETURN 57 | POP BX 58 | POP CX 59 | POP SI ; RECOVER REGISTERS 60 | POP DX ; RECOVER REGISTERS 61 | POP DS 62 | IRET 63 | 64 | ;----- PRINT THE CHARACTER IN (AL) 65 | 66 | B2: 67 | PUSH AX ; SAVE VALUE TO PRINT 68 | OUT DX,AL ; OUTPUT CHAR TO PORT 69 | INC DX ; POINT TO STATUS PORT 70 | B3: 71 | SUB CX,CX ; WAIT_BUSY 72 | B3_1: 73 | IN AL,DX ; GET STATUS 74 | MOV AH,AL ; STATUS TO AH ALSO 75 | TEST AL,80H ; IS THE PRINTER CURRENTLY BUSY 76 | JNZ B4 ; OUT_STROBE 77 | LOOP B3_1 ; TRY AGAIN 78 | DEC BL ; DROP LOOP COUNT 79 | JNZ B3 ; GO TILL TIMEOUT ENDS 80 | OR AH,1 ; SET ERROR FLAG 81 | AND AH,0F9H ; TURN OFF THE OTHER BITS 82 | JMP SHORT B7 ; RETURN WITH ERROR FLAG SET 83 | B4: ; OUT_STROBE 84 | MOV AL,0DH ; SET THE STROBE HIGH 85 | INC DX ; STROBE IS BIT 0 OF PORT C OF 8255 86 | OUT DX,AL 87 | MOV AL,0CH ; SET THE STROBE LOW 88 | OUT DX,AL 89 | POP AX ; RECOVER THE OUTPUT CHAR 90 | 91 | ;----- PRINTER STATUS 92 | 93 | B5: 94 | PUSH AX ; SAVE AL REG 95 | B6: 96 | MOV DX,PRINTER_BASE[SI] 97 | INC DX 98 | IN AL,DX ; GET PRINTER STATUS 99 | MOV AH,AL 100 | AND AH,0F8H ; TURN 0FF UNUSED BITS 101 | B7: ; STATUS_SET 102 | POP DX ; RECOVER AL REG 103 | MOV AL,DL ; GET CHARACTER INTO AL 104 | XOR AH,48H ; FLIP A COUPLE OF BITS 105 | JMP B1 ; RETURN FROM ROUTINE 106 | 107 | ;------INITIALIZE THE PRINTER PORT 108 | 109 | B8: 110 | PUSH AX ; SAVE AL 111 | INC DX ; POINT TO OUTPUT PORT 112 | INC DX 113 | MOV AL,8 ; SET INIT LINE LOW 114 | OUT DX,AL 115 | MOV AX,1000 116 | B9: ; INIT_LOOP 117 | DEC AX ; LOOP FOR RESET THE TAKE 118 | JNZ B9 ; INIT_LOOP 119 | MOV AL,0CH ; NO INTERRUPTS, NON AUTO LF, 120 | ; INIT HIGH 121 | OUT DX,AL 122 | JMP B6 ; PRT_STATUS_1 123 | PRINTER_IO ENDP 124 | 125 | 126 | -------------------------------------------------------------------------------- /poisk2/TYME_CMO.ASM: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------ 2 | ; THIS ROUTINE INITIALIZES THE TIMER DATA AREA IN THE 3 | ; ROM BIOS DATA AREA. IT IS CALLED BY THE POWER ON ROUTINES. 4 | ; IT CONVERTS HR:MIN:SEC FROM CMOS TO TIMER TICS. 5 | ; IF CMOS IS INVALID, TIMER DATA IS SET TO ZERO 6 | ; INPUT NONE PASSED TO ROUTINE BY CALLER 7 | ; CMOS BYTES USED FOR SETUP 8 | ; 00 SECONDS 9 | ; 02 MINUTES 10 | ; 04 HOURS 11 | ; 0A REGISTER A (UPDATE IN PROGRESS) 12 | ; 0E CMOS VALID IF ZERO 13 | ; OUTPUT 14 | ; TIMER_LOW 15 | ; TIMER_HIGH 16 | ; TIMER_OFL 17 | ; ALL REGISTERS UNCHANGED 18 | ;----------------------------------------------------------------------- 19 | org 0f8ceh 20 | COUNTS_SEC EQU 18 21 | COUNTS_MIN EQU 1092 22 | COUNTS_HOUR EQU 7 23 | CMOS_ADR EQU 70H 24 | CMOS_DATA EQU 71H 25 | CMOS_VALID EQU 0EH 26 | CMOS_SECONDS EQU 00H 27 | CMOS_MINUTES EQU 02H 28 | CMOS_HOURS EQU 04H 29 | CMOS_REGA EQU 0AH 30 | UPDATE_TIMER EQU 80H 31 | 32 | SET_TOD PROC NEAR 33 | PUSH AX 34 | PUSH BX 35 | PUSH CX 36 | PUSH DX 37 | ASSUME DS:DATA 38 | MOV AX,DATA ;ESTABLISH SEGMENT 39 | MOV DS,AX 40 | SUB AX,AX 41 | MOV TIMER_OFL,AL ;RESET TIMER ROLL OVER INDICATOR 42 | MOV TIMER_LOW,AX ; AND TIMER COUNT 43 | MOV TIMER_HIGH,AX 44 | MOV AL,CMOS_VALID 45 | OUT CMOS_ADR,AL ;CHECK CMOS VALIDITY 46 | IN AL,CMOS_DATA 47 | AND AL,0C4H ;BAD BATTERY, CHKSUM ERROR OR CLOCK ERROR 48 | SUB CX,CX 49 | tUIP: 50 | MOV AL,CMOS_REGA 51 | OUT CMOS_ADR,AL ;ACCESS REGISTER A 52 | IN AL,CMOS_DATA 53 | TEST AL,UPDATE_TIMER 54 | JZ READ_SEC 55 | LOOP tUIP 56 | JMP short I_POD_DONE 57 | READ_SEC: 58 | MOV AL,CMOS_SECONDS 59 | OUT CMOS_ADR,AL ;ACCESS SECONDS VALUE IN CMOS 60 | IN AL,CMOS_DATA 61 | CMP AL,59H ;ARE THE SECONDS WITHIN LIMITS? 62 | JA TOD_ERROR ;GO IF NOT 63 | CALL CVT_BINARY ;CONVERT IT TO BINARY 64 | MOV BL,COUNTS_SEC 65 | MUL BL ;COUNT FOR SECONDS 66 | MOV CX,AX 67 | MOV AL,CMOS_MINUTES 68 | OUT CMOS_ADR,AL ;ACCESS MINUTES VALUE IN CMOS 69 | IN AL,CMOS_DATA 70 | CMP AL,59H ;ARE THE MINUTES WITHIN LIMITS? 71 | JA TOD_ERROR ;GO IF NOT 72 | CALL CVT_BINARY ;CONVERT IT TO BINARY 73 | MOV BX,COUNTS_MIN 74 | MUL BX ;COUNT FOR MINUTES 75 | ADD AX,CX 76 | MOV CX,AX 77 | MOV AL,CMOS_HOURS 78 | OUT CMOS_ADR,AL ;ACCESS HOURS VALUE IN CMOS 79 | IN AL,CMOS_DATA 80 | CMP AL,23H ;ARE THE HOURS WITHIN LIMITS? 81 | JA TOD_ERROR ;GO IF NOT 82 | CALL CVT_BINARY ;CONVERT IT TO BINARY 83 | MOV DX,AX 84 | MOV BL,COUNTS_HOUR 85 | MUL BL ;COUNT FOR HOURS 86 | ADD AX,CX 87 | ADC DX,0000H 88 | MOV TIMER_HIGH,DX 89 | MOV TIMER_LOW,AX 90 | I_POD_DONE: 91 | CLI ;**IO DELAY NOT REQUIRED** 92 | IN AL,021H ;BE SURE TIMER IS ENABLED 93 | AND AL,0FEH 94 | OUT 021H,AL 95 | STI 96 | TOD_ERROR: 97 | POP DX 98 | POP CX 99 | POP BX 100 | POP AX 101 | RET 102 | SET_TOD ENDP 103 | 104 | CVT_BINARY PROC NEAR 105 | MOV AH,AL ;UNPACK 2 BCD DIGITS IN AL 106 | SHR AH,1 107 | SHR AH,1 108 | SHR AH,1 109 | SHR AH,1 110 | AND AL,0FH ;RESULT IS IN AX 111 | AAD ;CONVERT UNPACKED BCD TO BINARY 112 | RET 113 | CVT_BINARY ENDP 114 | 115 | ;------------------------------------------------------------------- 116 | ; INT 4A 117 | ; ЭТА ПРОЦЕДУРА СРАБАТЫВАЕТ ПО ПРЕРЫВАНИЮ ALARM CMOS 118 | ; ПОЛЬЗОВАТЕЛЬ МОЖЕТ ПРИ ЖЕЛАНИИ ЗАМЕНИТЬ ЕЕ, ГРАМОТНО 119 | ; ПОВЕСИВ РЕЗИДЕНТОМ СВОЮ ПРОГРАММУ ОБРАБОТКИ ПРЕРЫВАНИЯ 120 | ; INT 4A СООТВЕТСТВЕННО ЗАМЕНИВ АДРЕС В ТАБЛИЦЕ ПРЕРЫВАНИЙ 121 | ;------------------------------------------------------------------- 122 | ALARM PROC NEAR 123 | PUSH BX 124 | PUSH CX 125 | PUSH AX 126 | MOV CX,5 127 | HJ_1N: MOV BX,100fH 128 | PUSH CX 129 | CALL BEEPER 130 | mov cx,1 131 | call pauza 132 | POP CX 133 | dec CX 134 | JNZ HJ_1N 135 | POP AX 136 | POP CX 137 | POP BX 138 | IRET 139 | ALARM ENDP 140 | 141 | 142 | ;-------INT 70 (LEVEL 8)-------------------------------------------- 143 | ; THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM 144 | ; THE NON-VOLATILE TIMER. INPUT FREQUENCY IS 1024 KHZ OR 145 | ; APPROXIMATELY 1024 INTERRUPTS EVERY SECOND FOR THE PERIODIC 146 | ; INTERRUPT. FOR THE ALARM FUNCTION, AN INTERRUPT WILL OCCUR 147 | ; AT THE DESIGNATED TIME. 148 | ; 149 | ; THE INTERRUPT IS ENABLED ONLY WHEN EVENT OR ALARM FUNCTIONS 150 | ; ARE ACTIVE. 151 | ; FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE WAIT 152 | ; COUNTER AND WHEN IT EXPIRES WILL TURN ON THE HIGH ORDER BIT 153 | ; OF THE DESIGNATED FLAG. 154 | ; FOR THE ALARM INTERRUPT, THE USER ROUTINE WILL BE INVOKED 155 | ; THROUGH INT 4AH. THE USER MUST CODE A ROUTINE AND PLACE THE 156 | ; CORRECT ADDRESS IN THE VECTOR TABLE. 157 | ;------------------------------------------------------------------- 158 | RTC_INT PROC FAR 159 | ; assume cs:code,ds:data 160 | STI ;INTERRUPTS BACK ON 161 | PUSH DS ;SAVE REGISTERS 162 | PUSH AX 163 | PUSH DX 164 | PUSH DI 165 | MOV DL,0AH ;GET ENABLES 166 | CALL PORT_INC 167 | IN AL,CMOS_PORT+1 168 | MOV AH,AL ;SAVE 169 | CALL PORT_INC ;GET SOURCE 170 | IN AL,CMOS_PORT+1 171 | AND AL,AH 172 | PUSH AX ;SAVE 173 | TEST AL,40H ;CHECK FOR PERIODIC INTERRUPT 174 | JZ RTC_INT_9 ;NO - GO AROUND 175 | CALL DDS ;ESTABLISH ADDRESSABILITY 176 | SUB RTC_LOW,0976 ;DECREMENT COUNT 177 | SBB RTC_HIGH,0 178 | JA RTC_INT_9 179 | MOV DL,0AH ;TURN OFF PIE 180 | CALL PORT_INC 181 | IN AL,CMOS_PORT+1 182 | AND AL,0BFH 183 | PUSH AX 184 | MOV DL,0AH 185 | CALL PORT_INC 186 | POP AX 187 | OUT CMOS_PORT+1,AL 188 | MOV RTC_WAIT_FLAG,0 ;SET FUNCTION ACTIVE FLAG OFF 189 | LDS DI,DWORD PTR USER_FLAG ;SET UP DS,DI TO POINT TO USER FLAG 190 | MOV BYTE PTR[DI],80H ;TURN ON USERS FLAG 191 | RTC_INT_9: 192 | POP AX ;GET INTERRUPT SOURCE BACK 193 | TEST AL,20H ;TEST FOR ALARM INTERRUPT 194 | JZ RTC_INT_10 ;NO - GO AROUND 195 | INT 4AH ;TRANSFER TO USER ROUTINE 196 | RTC_INT_10: 197 | MOV AL,EOI ;END OF INTERRUPT TO 8259 - 2 198 | OUT 020H,AL ;AND TO 8259 - 1 199 | POP DI ;RESTORE REGISTERS 200 | POP DX 201 | POP AX 202 | POP DS 203 | IRET ;END OF INTERRUPT 204 | RTC_INT ENDP 205 | 206 | 207 | SET_BAYT_DEV PROC NEAR 208 | ;--установка байта оборудования 209 | XOR BL,BL 210 | MOV AL,10H 211 | OUT 70H,AL 212 | IN AL,71H 213 | TEST AL,0FFH 214 | JZ KLOP_3 215 | dec bl 216 | TEST AL,0FH 217 | JZ KLOP_1 218 | INC BL 219 | KLOP_1: TEST AL,0F0H 220 | JZ KLOP_2 221 | INC BL 222 | KLOP_2: mov cl,6 223 | shl bl,cl 224 | INC BL 225 | KLOP_3: 226 | MOV AL,14H 227 | OUT 70H,AL 228 | IN AL,71H 229 | AND AL,00111110B 230 | OR BL,AL 231 | MOV AL,14H 232 | OUT 70H,AL 233 | XCHG AL,BL 234 | OUT 71H,AL 235 | KLOP_4: 236 | RET 237 | SET_BAYT_DEV ENDP 238 | -------------------------------------------------------------------------------- /poisk2/ALTGEN.ASM: -------------------------------------------------------------------------------- 1 | ; 2 | ; Таблица альтернативных кодов 128 - 256 3 | ; 4 | ALT_GEN: 5 | DB 007H,00FH,01BH,033H,07FH,063H,063H,000H ;А 6 | DB 07EH,060H,060H,07EH,063H,063H,07EH,000H ;Б 7 | DB 07CH,066H,066H,07EH,063H,063H,07EH,000H ;В 8 | DB 07EH,060H,060H,060H,060H,060H,060H,000H ;Г 9 | DB 03EH,036H,036H,036H,036H,036H,07FH,063H ;Д 10 | DB 07EH,060H,060H,07CH,060H,060H,07FH,000H ;Е 11 | DB 06BH,06BH,03EH,008H,03EH,06BH,06BH,000H ;Ж 12 | DB 01EH,033H,003H,01EH,003H,063H,03EH,000H ;З 13 | DB 063H,063H,067H,06FH,07BH,073H,063H,000H ;И 14 | DB 06BH,063H,067H,06FH,07BH,073H,063H,000H ;Й 15 | DB 063H,066H,06CH,07CH,066H,063H,063H,000H ;К 16 | DB 003H,007H,00FH,01BH,033H,063H,063H,000H ;Л 17 | DB 063H,077H,07FH,06BH,063H,063H,063H,000H ;М 18 | DB 063H,063H,063H,07FH,063H,063H,063H,000H ;Н 19 | DB 03EH,063H,063H,063H,063H,063H,03EH,000H ;О 20 | DB 07FH,063H,063H,063H,063H,063H,063H,000H ;П 21 | DB 07EH,063H,063H,07EH,060H,060H,060H,000H ;Р 22 | DB 03EH,063H,060H,060H,060H,063H,03EH,000H ;С 23 | DB 07EH,018H,018H,018H,018H,018H,018H,000H ;Т 24 | DB 063H,063H,063H,03FH,003H,063H,03EH,000H ;У 25 | DB 008H,03EH,06BH,06BH,06BH,03EH,008H,000H ;Ф 26 | DB 063H,036H,01CH,008H,01CH,036H,063H,000H ;Х 27 | DB 066H,066H,066H,066H,066H,066H,07FH,003H ;Ц 28 | DB 063H,063H,063H,03FH,003H,003H,003H,000H ;Ч 29 | DB 06BH,06BH,06BH,06BH,06BH,06BH,07FH,000H ;Ш 30 | DB 06BH,06BH,06BH,06BH,06BH,06BH,07FH,001H ;Щ 31 | DB 078H,018H,018H,01EH,01BH,01BH,01EH,000H ;Ъ 32 | DB 061H,061H,061H,079H,06DH,06DH,079H,000H ;Ы 33 | DB 060H,060H,060H,07EH,063H,063H,07EH,000H ;Ь 34 | DB 03EH,063H,003H,00FH,003H,063H,03EH,000H ;Э 35 | DB 04EH,05BH,05BH,07BH,05BH,05BH,04EH,000H ;Ю 36 | DB 03FH,063H,063H,03FH,01BH,033H,063H,000H ;Я 37 | DB 000H,000H,03CH,006H,03EH,066H,03FH,000H ;а 38 | DB 002H,03CH,060H,07CH,066H,066H,03CH,000H ;б 39 | DB 000H,000H,07CH,066H,07CH,063H,07EH,000H ;в 40 | DB 000H,000H,07EH,060H,060H,060H,060H,000H ;г 41 | DB 000H,000H,03EH,036H,036H,036H,07FH,063H ;д 42 | DB 000H,000H,03CH,066H,07EH,060H,03EH,000H ;е 43 | DB 000H,000H,06BH,03EH,008H,03EH,06BH,000H ;ж 44 | DB 000H,000H,03CH,066H,00CH,066H,03CH,000H ;з 45 | DB 000H,000H,066H,066H,06EH,076H,066H,000H ;и 46 | DB 018H,000H,066H,066H,06EH,076H,066H,000H ;й 47 | DB 000H,000H,066H,06CH,078H,066H,066H,000H ;к 48 | DB 000H,000H,007H,00FH,01BH,033H,063H,000H ;л 49 | DB 000H,000H,063H,077H,06BH,063H,063H,000H ;м 50 | DB 000H,000H,066H,066H,07EH,066H,066H,000H ;н 51 | DB 000H,000H,03CH,066H,066H,066H,03CH,000H ;о 52 | DB 000H,000H,07EH,066H,066H,066H,066H,000H ;п 53 | DB 022H,088H,022H,088H,022H,088H,022H,088H ;░ 54 | DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH ;▒ 55 | DB 0DBH,077H,0DBH,0EEH,0DBH,077H,0DBH,0EEH ;▓ 56 | DB 018H,018H,018H,018H,018H,018H,018H,018H ;│ 57 | DB 010H,010H,010H,010H,0F0H,010H,010H,010H ;┤ 58 | DB 010H,010H,0F0H,010H,0F0H,010H,010H,010H ;╡ 59 | DB 014H,014H,014H,014H,0F4H,014H,014H,014H ;╢ 60 | DB 000H,000H,000H,000H,0FCH,014H,014H,014H ;╖ 61 | DB 000H,000H,0F0H,010H,0F0H,010H,010H,010H ;╕ 62 | DB 014H,014H,0F4H,004H,0F4H,014H,014H,014H ;╣ 63 | DB 036H,036H,036H,036H,036H,036H,036H,036H ;║ 64 | DB 000H,000H,0FEH,006H,0F6H,036H,036H,036H ;╗ 65 | DB 036H,036H,0F6H,006H,0FEH,000H,000H,000H ;╝ 66 | DB 014H,014H,014H,014H,0FCH,000H,000H,000H ;╜ 67 | DB 010H,010H,0F0H,010H,0F0H,000H,000H,000H ;╛ 68 | DB 000H,000H,000H,000H,0F8H,018H,018H,018H ;┐ 69 | DB 018H,018H,018H,018H,01FH,000H,000H,000H ;└ 70 | DB 018H,018H,018H,018H,0FFH,000H,000H,000H ;┴ 71 | DB 000H,000H,000H,000H,0FFH,018H,018H,018H ;┬ 72 | DB 018H,018H,018H,018H,01FH,018H,018H,018H ;├ 73 | DB 000H,000H,000H,000H,0FFH,000H,000H,000H ;─ 74 | DB 018H,018H,018H,018H,0FFH,018H,018H,018H ;┼ 75 | DB 010H,010H,01FH,010H,01FH,010H,010H,010H ;╞ 76 | DB 014H,014H,014H,014H,017H,014H,014H,014H ;╟ 77 | DB 036H,036H,037H,030H,03FH,000H,000H,000H ;╚ 78 | DB 000H,000H,03FH,030H,037H,036H,036H,036H ;╔ 79 | DB 036H,036H,0F7H,000H,0FFH,000H,000H,000H ;╩ 80 | DB 000H,000H,0FFH,000H,0F7H,036H,036H,036H ;╦ 81 | DB 036H,036H,037H,030H,037H,036H,036H,036H ;╠ 82 | DB 000H,000H,0FFH,000H,0FFH,000H,000H,000H ;═ 83 | DB 036H,036H,0F7H,000H,0F7H,036H,036H,036H ;╬ 84 | DB 010H,010H,0FFH,000H,0FFH,000H,000H,000H ;╧ 85 | DB 014H,014H,014H,014H,0FFH,000H,000H,000H ;╨ 86 | DB 000H,000H,0FFH,000H,0FFH,010H,010H,010H ;╤ 87 | DB 000H,000H,000H,000H,0FFH,014H,014H,014H ;╥ 88 | DB 014H,014H,014H,014H,01FH,000H,000H,000H ;╙ 89 | DB 010H,010H,01FH,010H,01FH,000H,000H,000H ;╘ 90 | DB 000H,000H,01FH,010H,01FH,010H,010H,010H ;╒ 91 | DB 000H,000H,000H,000H,01FH,014H,014H,014H ;╓ 92 | DB 014H,014H,014H,014H,0FFH,014H,014H,014H ;╫ 93 | DB 010H,010H,0FFH,010H,0FFH,010H,010H,010H ;╪ 94 | DB 018H,018H,018H,018H,0F8H,000H,000H,000H ;┘ 95 | DB 000H,000H,000H,000H,01FH,018H,018H,018H ;┌ 96 | DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;█ 97 | DB 000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH ;▄ 98 | DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H ;▌ 99 | DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH ;▐ 100 | DB 0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H ;▀ 101 | DB 000H,000H,07CH,066H,066H,07CH,060H,060H ;р 102 | DB 000H,000H,03CH,066H,060H,066H,03CH,000H ;с 103 | DB 000H,000H,07EH,018H,018H,018H,018H,000H ;т 104 | DB 000H,000H,066H,066H,03EH,006H,066H,03CH ;у 105 | DB 000H,008H,03EH,06BH,06BH,03EH,008H,008H ;ф 106 | DB 000H,000H,063H,036H,01CH,036H,063H,000H ;х 107 | DB 000H,000H,066H,066H,066H,066H,07FH,003H ;ц 108 | DB 000H,000H,066H,066H,03EH,006H,006H,000H ;ч 109 | DB 000H,000H,06BH,06BH,06BH,06BH,07FH,000H ;ш 110 | DB 000H,000H,06BH,06BH,06BH,06BH,07FH,001H ;щ 111 | DB 000H,000H,078H,018H,01EH,01BH,01EH,000H ;ъ 112 | DB 000H,000H,061H,061H,079H,06DH,079H,000H ;ы 113 | DB 000H,000H,060H,060H,07CH,066H,07CH,000H ;ь 114 | DB 000H,000H,03EH,063H,00FH,063H,03EH,000H ;э 115 | DB 000H,000H,04EH,05BH,07BH,05BH,04EH,000H ;ю 116 | DB 000H,000H,03EH,066H,03EH,036H,066H,000H ;я 117 | DB 014H,07EH,060H,07CH,060H,060H,07FH,000H ;Ё 118 | DB 014H,000H,03CH,066H,07EH,060H,03EH,000H ;ё 119 | DB 000H,000H,000H,000H,001H,003H,006H,00CH ;? 120 | DB 000H,000H,000H,000H,060H,030H,018H,00CH ;? 121 | DB 00CH,018H,030H,060H,000H,000H,000H,000H ;? 122 | DB 00CH,006H,003H,001H,000H,000H,000H,000H ;? 123 | DB 000H,006H,003H,07FH,003H,006H,000H,000H ;? 124 | DB 000H,018H,030H,07FH,030H,018H,000H,000H ;? 125 | DB 00CH,00CH,00CH,00CH,03FH,01EH,00CH,000H ;° 126 | DB 000H,00CH,01EH,03FH,00CH,00CH,00CH,00CH ;∙ 127 | DB 00CH,00CH,000H,03FH,000H,00CH,00CH,000H ;· 128 | DB 018H,018H,07EH,018H,018H,000H,07EH,000H ;√ 129 | DB 045H,064H,054H,04CH,044H,044H,044H,000H ;? 130 | DB 000H,061H,01EH,033H,033H,01EH,061H,000H ;? 131 | DB 000H,000H,01EH,01EH,01EH,01EH,000H,000H ;■ 132 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; 133 | 134 |  -------------------------------------------------------------------------------- /poisk1/ALTTAB.ASM: -------------------------------------------------------------------------------- 1 | ; Таблица альтернативных кодов 128 - 256 2 | ALTC: DB 007H,00FH,01BH,033H,07FH,063H,063H,000H ;А 3 | 4 | DB 07EH,060H,060H,07EH,063H,063H,07EH,000H ;Б 5 | 6 | DB 07CH,066H,066H,07EH,063H,063H,07EH,000H ;В 7 | 8 | DB 07EH,060H,060H,060H,060H,060H,060H,000H ;Г 9 | 10 | DB 03EH,036H,036H,036H,036H,036H,07FH,063H ;Д 11 | 12 | DB 07EH,060H,060H,07CH,060H,060H,07FH,000H ;Е 13 | 14 | DB 06BH,06BH,03EH,008H,03EH,06BH,06BH,000H ;Ж 15 | 16 | DB 01EH,033H,003H,01EH,003H,063H,03EH,000H ;З 17 | 18 | DB 063H,063H,067H,06FH,07BH,073H,063H,000H ;И 19 | 20 | DB 06BH,063H,067H,06FH,07BH,073H,063H,000H ;Й 21 | 22 | DB 063H,066H,06CH,07CH,066H,063H,063H,000H ;К 23 | 24 | DB 003H,007H,00FH,01BH,033H,063H,063H,000H ;Л 25 | 26 | DB 063H,077H,07FH,06BH,063H,063H,063H,000H ;М 27 | 28 | DB 063H,063H,063H,07FH,063H,063H,063H,000H ;Н 29 | 30 | DB 03EH,063H,063H,063H,063H,063H,03EH,000H ;О 31 | 32 | DB 07FH,063H,063H,063H,063H,063H,063H,000H ;П 33 | 34 | DB 07EH,063H,063H,07EH,060H,060H,060H,000H ;Р 35 | 36 | DB 03EH,063H,060H,060H,060H,063H,03EH,000H ;С 37 | 38 | DB 07EH,018H,018H,018H,018H,018H,018H,000H ;Т 39 | 40 | DB 063H,063H,063H,03FH,003H,063H,03EH,000H ;У 41 | 42 | DB 008H,03EH,06BH,06BH,06BH,03EH,008H,000H ;Ф 43 | 44 | DB 063H,036H,01CH,008H,01CH,036H,063H,000H ;Х 45 | 46 | DB 066H,066H,066H,066H,066H,066H,07FH,003H ;Ц 47 | 48 | DB 063H,063H,063H,03FH,003H,003H,003H,000H ;Ч 49 | 50 | DB 06BH,06BH,06BH,06BH,06BH,06BH,07FH,000H ;Ш 51 | 52 | DB 06BH,06BH,06BH,06BH,06BH,06BH,07FH,001H ;Щ 53 | 54 | DB 078H,018H,018H,01EH,01BH,01BH,01EH,000H ;Ъ 55 | 56 | DB 061H,061H,061H,079H,06DH,06DH,079H,000H ;Ы 57 | 58 | DB 060H,060H,060H,07EH,063H,063H,07EH,000H ;Ь 59 | 60 | DB 03EH,063H,003H,00FH,003H,063H,03EH,000H ;Э 61 | 62 | DB 04EH,05BH,05BH,07BH,05BH,05BH,04EH,000H ;Ю 63 | 64 | DB 03FH,063H,063H,03FH,01BH,033H,063H,000H ;Я 65 | 66 | DB 000H,000H,03CH,006H,03EH,066H,03FH,000H ;а 67 | 68 | DB 002H,03CH,060H,07CH,066H,066H,03CH,000H ;б 69 | 70 | DB 000H,000H,07CH,066H,07CH,063H,07EH,000H ;в 71 | 72 | DB 000H,000H,07EH,060H,060H,060H,060H,000H ;г 73 | 74 | DB 000H,000H,03EH,036H,036H,036H,07FH,063H ;д 75 | 76 | DB 000H,000H,03CH,066H,07EH,060H,03EH,000H ;е 77 | 78 | DB 000H,000H,06BH,03EH,008H,03EH,06BH,000H ;ж 79 | 80 | DB 000H,000H,03CH,066H,00CH,066H,03CH,000H ;з 81 | 82 | DB 000H,000H,066H,066H,06EH,076H,066H,000H ;и 83 | 84 | DB 018H,000H,066H,066H,06EH,076H,066H,000H ;й 85 | 86 | DB 000H,000H,066H,06CH,078H,066H,066H,000H ;к 87 | 88 | DB 000H,000H,007H,00FH,01BH,033H,063H,000H ;л 89 | 90 | DB 000H,000H,063H,077H,06BH,063H,063H,000H ;м 91 | 92 | DB 000H,000H,066H,066H,07EH,066H,066H,000H ;н 93 | 94 | DB 000H,000H,03CH,066H,066H,066H,03CH,000H ;о 95 | 96 | DB 000H,000H,07EH,066H,066H,066H,066H,000H ;п 97 | 98 | DB 022H,088H,022H,088H,022H,088H,022H,088H ;░ 99 | 100 | DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH ;▒ 101 | 102 | DB 0DBH,077H,0DBH,0EEH,0DBH,077H,0DBH,0EEH ;▓ 103 | 104 | DB 018H,018H,018H,018H,018H,018H,018H,018H ;│ 105 | 106 | DB 010H,010H,010H,010H,0F0H,010H,010H,010H ;┤ 107 | 108 | DB 010H,010H,0F0H,010H,0F0H,010H,010H,010H ;╡ 109 | 110 | DB 014H,014H,014H,014H,0F4H,014H,014H,014H ;╢ 111 | 112 | DB 000H,000H,000H,000H,0FCH,014H,014H,014H ;╖ 113 | 114 | DB 000H,000H,0F0H,010H,0F0H,010H,010H,010H ;╕ 115 | 116 | DB 014H,014H,0F4H,004H,0F4H,014H,014H,014H ;╣ 117 | 118 | DB 036H,036H,036H,036H,036H,036H,036H,036H ;║ 119 | 120 | DB 000H,000H,0FEH,006H,0F6H,036H,036H,036H ;╗ 121 | 122 | DB 036H,036H,0F6H,006H,0FEH,000H,000H,000H ;╝ 123 | 124 | DB 014H,014H,014H,014H,0FCH,000H,000H,000H ;╜ 125 | 126 | DB 010H,010H,0F0H,010H,0F0H,000H,000H,000H ;╛ 127 | 128 | DB 000H,000H,000H,000H,0F8H,018H,018H,018H ;┐ 129 | 130 | DB 018H,018H,018H,018H,01FH,000H,000H,000H ;└ 131 | 132 | DB 018H,018H,018H,018H,0FFH,000H,000H,000H ;┴ 133 | 134 | DB 000H,000H,000H,000H,0FFH,018H,018H,018H ;┬ 135 | 136 | DB 018H,018H,018H,018H,01FH,018H,018H,018H ;├ 137 | 138 | DB 000H,000H,000H,000H,0FFH,000H,000H,000H ;─ 139 | 140 | DB 018H,018H,018H,018H,0FFH,018H,018H,018H ;┼ 141 | 142 | DB 010H,010H,01FH,010H,01FH,010H,010H,010H ;╞ 143 | 144 | DB 014H,014H,014H,014H,017H,014H,014H,014H ;╟ 145 | 146 | DB 036H,036H,037H,030H,03FH,000H,000H,000H ;╚ 147 | 148 | DB 000H,000H,03FH,030H,037H,036H,036H,036H ;╔ 149 | 150 | DB 036H,036H,0F7H,000H,0FFH,000H,000H,000H ;╩ 151 | 152 | DB 000H,000H,0FFH,000H,0F7H,036H,036H,036H ;╦ 153 | 154 | DB 036H,036H,037H,030H,037H,036H,036H,036H ;╠ 155 | 156 | DB 000H,000H,0FFH,000H,0FFH,000H,000H,000H ;═ 157 | 158 | DB 036H,036H,0F7H,000H,0F7H,036H,036H,036H ;╬ 159 | 160 | DB 010H,010H,0FFH,000H,0FFH,000H,000H,000H ;╧ 161 | 162 | DB 014H,014H,014H,014H,0FFH,000H,000H,000H ;╨ 163 | 164 | DB 000H,000H,0FFH,000H,0FFH,010H,010H,010H ;╤ 165 | 166 | DB 000H,000H,000H,000H,0FFH,014H,014H,014H ;╥ 167 | 168 | DB 014H,014H,014H,014H,01FH,000H,000H,000H ;╙ 169 | 170 | DB 010H,010H,01FH,010H,01FH,000H,000H,000H ;╘ 171 | 172 | DB 000H,000H,01FH,010H,01FH,010H,010H,010H ;╒ 173 | 174 | DB 000H,000H,000H,000H,01FH,014H,014H,014H ;╓ 175 | 176 | DB 014H,014H,014H,014H,0FFH,014H,014H,014H ;╫ 177 | 178 | DB 010H,010H,0FFH,010H,0FFH,010H,010H,010H ;╪ 179 | 180 | DB 018H,018H,018H,018H,0F8H,000H,000H,000H ;┘ 181 | 182 | DB 000H,000H,000H,000H,01FH,018H,018H,018H ;┌ 183 | 184 | DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;█ 185 | 186 | DB 000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH ;▄ 187 | 188 | DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H ;▌ 189 | 190 | DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH ;▐ 191 | 192 | DB 0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H ;▀ 193 | 194 | DB 000H,000H,07CH,066H,066H,07CH,060H,060H ;р 195 | 196 | DB 000H,000H,03CH,066H,060H,066H,03CH,000H ;с 197 | 198 | DB 000H,000H,07EH,018H,018H,018H,018H,000H ;т 199 | 200 | DB 000H,000H,066H,066H,03EH,006H,066H,03CH ;у 201 | 202 | DB 000H,008H,03EH,06BH,06BH,03EH,008H,008H ;ф 203 | 204 | DB 000H,000H,063H,036H,01CH,036H,063H,000H ;х 205 | 206 | DB 000H,000H,066H,066H,066H,066H,07FH,003H ;ц 207 | 208 | DB 000H,000H,066H,066H,03EH,006H,006H,000H ;ч 209 | 210 | DB 000H,000H,06BH,06BH,06BH,06BH,07FH,000H ;ш 211 | 212 | DB 000H,000H,06BH,06BH,06BH,06BH,07FH,001H ;щ 213 | 214 | DB 000H,000H,078H,018H,01EH,01BH,01EH,000H ;ъ 215 | 216 | DB 000H,000H,061H,061H,079H,06DH,079H,000H ;ы 217 | 218 | DB 000H,000H,060H,060H,07CH,066H,07CH,000H ;ь 219 | 220 | DB 000H,000H,03EH,063H,00FH,063H,03EH,000H ;э 221 | 222 | DB 000H,000H,04EH,05BH,07BH,05BH,04EH,000H ;ю 223 | 224 | DB 000H,000H,03EH,066H,03EH,036H,066H,000H ;я 225 | 226 | DB 014H,07EH,060H,07CH,060H,060H,07FH,000H ;Ё 227 | 228 | DB 014H,000H,03CH,066H,07EH,060H,03EH,000H ;ё 229 | 230 | DB 000H,000H,000H,000H,001H,003H,006H,00CH ; 231 | 232 | DB 000H,000H,000H,000H,060H,030H,018H,00CH ; 233 | 234 | DB 00CH,018H,030H,060H,000H,000H,000H,000H ; 235 | 236 | DB 00CH,006H,003H,001H,000H,000H,000H,000H ; 237 | 238 | DB 000H,006H,003H,07FH,003H,006H,000H,000H ; 239 | 240 | DB 000H,018H,030H,07FH,030H,018H,000H,000H ; 241 | 242 | DB 00CH,00CH,00CH,00CH,03FH,01EH,00CH,000H ;° 243 | 244 | DB 000H,00CH,01EH,03FH,00CH,00CH,00CH,00CH ;∙ 245 | 246 | DB 00CH,00CH,000H,03FH,000H,00CH,00CH,000H ;· 247 | 248 | DB 018H,018H,07EH,018H,018H,000H,07EH,000H ;√ 249 | 250 | DB 045H,064H,054H,04CH,044H,044H,044H,000H ; 251 | 252 | DB 000H,061H,01EH,033H,033H,01EH,061H,000H ; 253 | 254 | DB 000H,000H,01EH,01EH,01EH,01EH,000H,000H ;■ 255 | 256 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; 257 | 258 | 259 | 260 | 261 | ORG 0E6F2H 262 | 263 | -------------------------------------------------------------------------------- /poisk2/CHARGEN.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; CHARACTER GENERATOR GRAPHICS FOR 320*200 AND 640*200 GRAPHICS 3 | ;--------------------------------------------------------------------------- 4 | ORG 0FA6EH 5 | CRT_CHAR_GEN LABEL BYTE 6 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; D_00 7 | DB 07EH,081H,0A5H,081H,0BDH,099H,081H,07EH ; D_01 8 | DB 07EH,0FFH,0DBH,0FFH,0C3H,0E7H,0FFH,07EH ; D_02 9 | DB 06CH,0FEH,0FEH,0FEH,07CH,038H,010H,000H ; D_03 10 | DB 010H,038H,07CH,0FEH,07CH,038H,010H,000H ; D_04 11 | DB 038H,07CH,038H,0FEH,0FEH,07CH,038H,07CH ; D_05 12 | DB 010H,010H,038H,07CH,0FEH,07CH,038H,07CH ; D_06 13 | DB 000H,000H,018H,03CH,03CH,018H,000H,000H ; D_07 14 | DB 0FFH,0FFH,0E7H,0C3H,0C3H,0E7H,0FFH,0FFH ; D_08 15 | DB 000H,03CH,066H,042H,042H,066H,03CH,000H ; D_09 16 | DB 0FFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0FFH ; D_0A 17 | DB 00FH,007H,00FH,07DH,0CCH,0CCH,0CCH,078H ; D_0B 18 | DB 03CH,066H,066H,066H,03CH,018H,07EH,018H ; D_0C 19 | DB 03FH,033H,03FH,030H,030H,070H,0F0H,0E0H ; D_0D 20 | DB 07FH,063H,07FH,063H,063H,067H,0E6H,0C0H ; D_0E 21 | DB 099H,05AH,03CH,0E7H,0E7H,03CH,05AH,099H ; D_0F 22 | DB 080H,0E0H,0F8H,0FEH,0F8H,0E0H,080H,000H ; D_10 23 | DB 002H,00EH,03EH,0FEH,03EH,00EH,002H,000H ; D_11 24 | DB 018H,03CH,07EH,018H,018H,07EH,03CH,018H ; D_12 25 | DB 066H,066H,066H,066H,066H,000H,066H,000H ; D_13 26 | DB 07FH,0DBH,0DBH,07BH,01BH,01BH,01BH,000H ; D_14 27 | DB 03EH,063H,038H,06CH,06CH,038H,0CCH,078H ; D_15 28 | DB 000H,000H,000H,000H,07EH,07EH,07EH,000H ; D_16 29 | DB 018H,03CH,07EH,018H,07EH,03CH,018H,0FFH ; D_17 30 | DB 018H,03CH,07EH,018H,018H,018H,018H,000H ; D_18 31 | DB 018H,018H,018H,018H,07EH,03CH,018H,000H ; D_19 32 | DB 000H,018H,00CH,0FEH,00CH,018H,000H,000H ; D_1A 33 | DB 000H,030H,060H,0FEH,060H,030H,000H,000H ; D_1B 34 | DB 000H,000H,0C0H,0C0H,0C0H,0FEH,000H,000H ; D_1C 35 | DB 000H,024H,066H,0FFH,066H,024H,000H,000H ; D_1D 36 | DB 000H,018H,03CH,07EH,0FFH,0FFH,000H,000H ; D_1E 37 | DB 000H,0FFH,0FFH,07EH,03CH,018H,000H,000H ; D_1F 38 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; SP D_20 39 | DB 030H,078H,078H,030H,030H,000H,030H,000H ; ! D_21 40 | DB 06CH,06CH,06CH,000H,000H,000H,000H,000H ; " D_22 41 | DB 06CH,06CH,0FEH,06CH,0FEH,06CH,06CH,000H ; # D_23 42 | DB 030H,07CH,0C0H,078H,00CH,0F8H,030H,000H ; $ D_24 43 | DB 000H,0C6H,0CCH,018H,030H,066H,0C6H,000H ; PER CENT D_25 44 | DB 038H,06CH,038H,076H,0DCH,0CCH,076H,000H ; & D_26 45 | DB 060H,060H,0C0H,000H,000H,000H,000H,000H ; ' D_27 46 | DB 018H,030H,060H,060H,060H,030H,018H,000H ; ( D_28 47 | DB 060H,030H,018H,018H,018H,030H,060H,000H ; ) D_29 48 | DB 000H,066H,03CH,0FFH,03CH,066H,000H,000H ; * D_2A 49 | DB 000H,030H,030H,0FCH,030H,030H,000H,000H ; + D_2B 50 | DB 000H,000H,000H,000H,000H,030H,030H,060H ; , D_2C 51 | DB 000H,000H,000H,0FCH,000H,000H,000H,000H ; - D_2D 52 | DB 000H,000H,000H,000H,000H,030H,030H,000H ; . D_2E 53 | DB 006H,00CH,018H,030H,060H,0C0H,080H,000H ; / D_2F 54 | DB 07CH,0C6H,0CEH,0DEH,0F6H,0E6H,07CH,000H ; 0 D_30 55 | DB 030H,070H,030H,030H,030H,030H,0FCH,000H ; 1 D_31 56 | DB 078H,0CCH,00CH,038H,060H,0CCH,0FCH,000H ; 2 D_32 57 | DB 078H,0CCH,00CH,038H,00CH,0CCH,078H,000H ; 3 D_33 58 | DB 01CH,03CH,06CH,0CCH,0FEH,00CH,01EH,000H ; 4 D_34 59 | DB 0FCH,0C0H,0F8H,00CH,00CH,0CCH,078H,000H ; 5 D_35 60 | DB 038H,060H,0C0H,0F8H,0CCH,0CCH,078H,000H ; 6 D_36 61 | DB 0FCH,0CCH,00CH,018H,030H,030H,030H,000H ; 7 D_37 62 | DB 078H,0CCH,0CCH,078H,0CCH,0CCH,078H,000H ; 8 D_38 63 | DB 078H,0CCH,0CCH,07CH,00CH,018H,070H,000H ; 9 D_39 64 | DB 000H,030H,030H,000H,000H,030H,030H,000H ; : D_3A 65 | DB 000H,030H,030H,000H,000H,030H,030H,060H ; ; D_3B 66 | DB 018H,030H,060H,0C0H,060H,030H,018H,000H ; < D_3C 67 | DB 000H,000H,0FCH,000H,000H,0FCH,000H,000H ; = D_3D 68 | DB 060H,030H,018H,00CH,018H,030H,060H,000H ; > D_3E 69 | DB 078H,0CCH,00CH,018H,030H,000H,030H,000H ; ? D_3F 70 | DB 07CH,0C6H,0DEH,0DEH,0DEH,0C0H,078H,000H ; & D_40 71 | DB 030H,078H,0CCH,0CCH,0FCH,0CCH,0CCH,000H ; A D_41 72 | DB 0FCH,066H,066H,07CH,066H,066H,0FCH,000H ; B D_42 73 | DB 03CH,066H,0C0H,0C0H,0C0H,066H,03CH,000H ; C D_43 74 | DB 0F8H,06CH,066H,066H,066H,06CH,0F8H,000H ; D D_44 75 | DB 0FEH,062H,068H,078H,068H,062H,0FEH,000H ; E D_45 76 | DB 0FEH,062H,068H,078H,068H,060H,0F0H,000H ; F D_46 77 | DB 03CH,066H,0C0H,0C0H,0CEH,066H,03EH,000H ; G D_47 78 | DB 0CCH,0CCH,0CCH,0FCH,0CCH,0CCH,0CCH,000H ; H D_48 79 | DB 078H,030H,030H,030H,030H,030H,078H,000H ; I D_49 80 | DB 01EH,00CH,00CH,00CH,0CCH,0CCH,078H,000H ; J D_4A 81 | DB 0E6H,066H,06CH,078H,06CH,066H,0E6H,000H ; K D_4B 82 | DB 0F0H,060H,060H,060H,062H,066H,0FEH,000H ; L D_4C 83 | DB 0C6H,0EEH,0FEH,0FEH,0D6H,0C6H,0C6H,000H ; M D_4D 84 | DB 0C6H,0E6H,0F6H,0DEH,0CEH,0C6H,0C6H,000H ; N D_4E 85 | DB 038H,06CH,0C6H,0C6H,0C6H,06CH,038H,000H ; O D_4F 86 | DB 0FCH,066H,066H,07CH,060H,060H,0F0H,000H ; P D_50 87 | DB 078H,0CCH,0CCH,0CCH,0DCH,078H,01CH,000H ; Q D_51 88 | DB 0FCH,066H,066H,07CH,06CH,066H,0E6H,000H ; R D_52 89 | DB 078H,0CCH,0E0H,070H,01CH,0CCH,078H,000H ; S D_53 90 | DB 0FCH,0B4H,030H,030H,030H,030H,078H,000H ; T D_54 91 | DB 0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,0FCH,000H ; U D_55 92 | DB 0CCH,0CCH,0CCH,0CCH,0CCH,078H,030H,000H ; V D_56 93 | DB 0C6H,0C6H,0C6H,0D6H,0FEH,0EEH,0C6H,000H ; W D_57 94 | DB 0C6H,0C6H,06CH,038H,038H,06CH,0C6H,000H ; X D_58 95 | DB 0CCH,0CCH,0CCH,078H,030H,030H,078H,000H ; Y D_59 96 | DB 0FEH,0C6H,08CH,018H,032H,066H,0FEH,000H ; Z D_5A 97 | DB 078H,060H,060H,060H,060H,060H,078H,000H ; [ D_5B 98 | DB 0C0H,060H,030H,018H,00CH,006H,002H,000H ; BACKSLASH D_5C 99 | DB 078H,018H,018H,018H,018H,018H,078H,000H ; ] D_5D 100 | DB 010H,038H,06CH,0C6H,000H,000H,000H,000H ; CIRCUMFLEX D_5E 101 | DB 000H,000H,000H,000H,000H,000H,000H,0FFH ; _ D_5F 102 | DB 030H,030H,018H,000H,000H,000H,000H,000H ; D_60 103 | DB 000H,000H,078H,00CH,07CH,0CCH,076H,000H ; LOWER CASE A D_61 104 | DB 0E0H,060H,060H,07CH,066H,066H,0DCH,000H ; L.C. B D_62 105 | DB 000H,000H,078H,0CCH,0C0H,0CCH,078H,000H ; L.C. C D_63 106 | DB 01CH,00CH,00CH,07CH,0CCH,0CCH,076H,000H ; L.C. D D_64 107 | DB 000H,000H,078H,0CCH,0FCH,0C0H,078H,000H ; L.C. E D_65 108 | DB 038H,06CH,060H,0F0H,060H,060H,0F0H,000H ; L.C. F D_66 109 | DB 000H,000H,076H,0CCH,0CCH,07CH,00CH,0F8H ; L.C. G D_67 110 | DB 0E0H,060H,06CH,076H,066H,066H,0E6H,000H ; L.C. H D_68 111 | DB 030H,000H,070H,030H,030H,030H,078H,000H ; L.C. I D_69 112 | DB 00CH,000H,00CH,00CH,00CH,0CCH,0CCH,078H ; L.C. J D_6A 113 | DB 0E0H,060H,066H,06CH,078H,06CH,0E6H,000H ; L.C. K D_6B 114 | DB 070H,030H,030H,030H,030H,030H,078H,000H ; L.C. L D_6C 115 | DB 000H,000H,0CCH,0FEH,0FEH,0D6H,0C6H,000H ; L.C. M D_6D 116 | DB 000H,000H,0F8H,0CCH,0CCH,0CCH,0CCH,000H ; L.C. N D_6E 117 | DB 000H,000H,078H,0CCH,0CCH,0CCH,078H,000H ; L.C. O D_6F 118 | DB 000H,000H,0DCH,066H,066H,07CH,060H,0F0H ; L.C. P D_70 119 | DB 000H,000H,076H,0CCH,0CCH,07CH,00CH,01EH ; L.C. Q D_71 120 | DB 000H,000H,0DCH,076H,066H,060H,0F0H,000H ; L.C. R D_72 121 | DB 000H,000H,07CH,0C0H,078H,00CH,0F8H,000H ; L.C. S D_73 122 | DB 010H,030H,07CH,030H,030H,034H,018H,000H ; L.C. T D_74 123 | DB 000H,000H,0CCH,0CCH,0CCH,0CCH,076H,000H ; L.C. U D_75 124 | DB 000H,000H,0CCH,0CCH,0CCH,078H,030H,000H ; L.C. V D_76 125 | DB 000H,000H,0C6H,0D6H,0FEH,0FEH,06CH,000H ; L.C. W D_77 126 | DB 000H,000H,0C6H,06CH,038H,06CH,0C6H,000H ; L.C. X D_78 127 | DB 000H,000H,0CCH,0CCH,0CCH,07CH,00CH,0F8H ; L.C. Y D_79 128 | DB 000H,000H,0FCH,098H,030H,064H,0FCH,000H ; L.C. Z D_7A 129 | DB 01CH,030H,030H,0E0H,030H,030H,01CH,000H ; ( D_7B 130 | DB 018H,018H,018H,000H,018H,018H,018H,000H ; | D_7C 131 | DB 0E0H,030H,030H,01CH,030H,030H,0E0H,000H ; ) D_7D 132 | DB 076H,0DCH,000H,000H,000H,000H,000H,000H ; TILDE D_7E 133 | DB 000H,010H,038H,06CH,0C6H,0C6H,0FEH,000H ; DELTA D_7F 134 | 135 | -------------------------------------------------------------------------------- /poisk2/D7.ASM: -------------------------------------------------------------------------------- 1 | 2 | HARD_HELP PROC NEAR 3 | MOV SI,offset HARD_1 4 | CMP AX,3031H 5 | JE AD_5 6 | MOV SI,offset HARD_2 7 | CMP AX,3032H 8 | JE AD_5 9 | MOV SI,offset HARD_3 10 | CMP AX,3033H 11 | JE AD_5 12 | MOV SI,offset HARD_4 13 | CMP AX,3034H 14 | JE AD_5 15 | MOV SI,offset HARD_5 16 | CMP AX,3035H 17 | JE AD_5 18 | MOV SI,offset HARD_6 19 | CMP AX,3036H 20 | JE AD_5 21 | MOV SI,offset HARD_7 22 | CMP AX,3037H 23 | JE AD_5 24 | MOV SI,offset HARD_8 25 | CMP AX,3038H 26 | JE AD_5 27 | MOV SI,offset HARD_9 28 | CMP AX,3039H 29 | JE AD_5 30 | MOV SI,offset HARD_10 31 | CMP AX,3130H 32 | JE AD_5 33 | MOV SI,offset HARD_11 34 | CMP AX,3131H 35 | JE AD_5 36 | MOV SI,offset HARD_12 37 | CMP AX,3132H 38 | JE AD_5 39 | MOV SI,offset HARD_13 40 | CMP AX,3133H 41 | JE AD_5 42 | MOV SI,offset HARD_14 43 | CMP AX,3134H 44 | JE AD_5 45 | MOV SI,offset REZ_1 46 | AD_5: MOV BX,160*13+2*2 47 | CALL PROC_1 48 | MOV BX,160*13+10*2 49 | CALL PROC_1 50 | MOV BX,160*13+20*2 51 | CALL PROC_1 52 | MOV BX,160*13+34*2 53 | CALL PROC_1 54 | MOV BX,160*8+27*2 55 | CALL PROC_1 56 | RET 57 | HARD_HELP ENDP 58 | 59 | FLOP_HELP PROC NEAR 60 | MOV SI,offset DISK_2 61 | CMP AL,31H 62 | JE AD_3 63 | MOV SI,offset DISK_3 64 | CMP AL,32H 65 | JE AD_3 66 | MOV SI,offset DISK_4 67 | CMP AL,33H 68 | JE AD_3 69 | MOV SI,offset DISK_5 70 | CMP AL,34H 71 | JE AD_3 72 | MOV SI,offset DISK_0 73 | AD_3: CALL STR_SHOW 74 | RET 75 | FLOP_HELP ENDP 76 | 77 | ADAP_HELP PROC NEAR 78 | CMP AL,30H 79 | MOV SI,offset ADAPT1 80 | JE AD_1 81 | MOV SI,offset ADAPT2 82 | CMP AL,31H 83 | JE AD_1 84 | MOV SI,offset ADAPT3 85 | CMP AL,32H 86 | JE AD_1 87 | MOV SI,offset ADAPT4 88 | AD_1: 89 | MOV BX,160*9+28*2 90 | CALL STR_SHOW 91 | RET 92 | ADAP_HELP ENDP 93 | 94 | ;-------------------------------------- 95 | ; ПРОЦ. ОБРАБОТКИ PGUP 96 | ;-------------------------------------- 97 | PG_UP PROC NEAR 98 | SUB BX,4 99 | MOV AL,70H 100 | CALL INVER 101 | MOV AH,byte ptr ES:[BX-4] 102 | MOV AL,byte ptr ES:[BX-2] 103 | CMP AL,30H+9 104 | JE gPEREN 105 | INC AL 106 | gPEREN1: 107 | MOV byte ptr ES:[BX-4],AH 108 | MOV byte ptr ES:[BX-2],AL 109 | RET 110 | gPEREN: 111 | CMP AH,30H+9 112 | JE gPEREN5 113 | MOV AL,30H 114 | INC AH 115 | JMP SHORT gPEREN1 116 | gPEREN5: 117 | MOV AX,3030H 118 | JMP SHORT gPEREN1 119 | PG_UP ENDP 120 | 121 | 122 | ;-------------------------------------- 123 | ; ПРОЦ. ОБРАБОТКИ PGUP 124 | ;-------------------------------------- 125 | PG_UP_1 PROC NEAR 126 | SUB BX,4 127 | MOV AL,70H 128 | CALL INVER 129 | MOV AH,byte ptr ES:[BX-4] 130 | MOV AL,byte ptr ES:[BX-2] 131 | CMP AL,30H+9H 132 | JNE PEREN 133 | mov al,40h 134 | PEREN: INC AL 135 | CMP AL,47H 136 | JNE PEREN_2 137 | MOV AL,30H 138 | CMP AH,30H+9H 139 | JNE PEREN_1 140 | mov ah,40h 141 | PEREN_1: 142 | INC AH 143 | PEREN_2: 144 | CMP AX,4730H 145 | JNE PEREN_3 146 | MOV AX,3030H 147 | PEREN_3: 148 | MOV byte ptr ES:[BX-4],AH 149 | MOV byte ptr ES:[BX-2],AL 150 | RET 151 | PG_UP_1 ENDP 152 | 153 | 154 | ;-------------------------------------- 155 | ; ПРОЦ. ОБРАБОТКИ PGDN 156 | ;-------------------------------------- 157 | PG_DN_1 PROC NEAR 158 | SUB BX,4 159 | MOV AL,70H 160 | CALL INVER 161 | MOV AH,byte ptr ES:[BX-4] 162 | MOV AL,byte ptr ES:[BX-2] 163 | CMP AL,41H 164 | JNE PEREN6 165 | MOV AL,39H 166 | JMP SHORT PEREN2 167 | PEREN6: CMP AL,30H 168 | JE PEREN3 169 | DEC AL 170 | PEREN2: MOV byte ptr ES:[BX-4],AH 171 | MOV byte ptr ES:[BX-2],AL 172 | RET 173 | PEREN3: MOV AL,46H 174 | CMP AH,41H 175 | JNE PEREN4 176 | MOV AH,39H 177 | JMP SHORT PEREN2 178 | PEREN4: CMP AH,30H 179 | JNE PEREN5 180 | MOV AX,4646H 181 | JMP SHORT PEREN2 182 | PEREN5: DEC AH 183 | JMP SHORT PEREN2 184 | PG_DN_1 ENDP 185 | 186 | 187 | 188 | ;-------------------------------------- 189 | ; ПРОЦ. ОБРАБОТКИ PGDN 190 | ;-------------------------------------- 191 | PG_DN PROC NEAR 192 | SUB BX,4 193 | MOV AL,70H 194 | CALL INVER 195 | MOV AH,byte ptr ES:[BX-4] 196 | MOV AL,byte ptr ES:[BX-2] 197 | CMP AL,30H 198 | JE gPEREN3 199 | DEC AL 200 | gPEREN2: 201 | MOV byte ptr ES:[BX-4],AH 202 | MOV byte ptr ES:[BX-2],AL 203 | RET 204 | gPEREN3: 205 | CMP AH,30H 206 | JE gPEREN4 207 | MOV AL,30H+9 208 | DEC AH 209 | JMP SHORT gPEREN2 210 | gPEREN4: 211 | MOV AX,3939H 212 | JMP SHORT gPEREN2 213 | PG_DN ENDP 214 | 215 | 216 | STOLB PROC NEAR 217 | MOV byte ptr ES:[BX],DL ;186 218 | INC BX 219 | MOV byte ptr ES:[BX],7 220 | ADD BX,159 221 | LOOP STOLB 222 | RET 223 | STOLB ENDP 224 | 225 | 226 | SUMMM PROC NEAR 227 | 228 | xor bx,bx 229 | MOV CL,CMOS_BEGIN ;УСТАНОВИТЬ НАЧАЛО CMOS 230 | MOV CH,CMOS_END ;УСТАНОВИТЬ КОНЕЦ CMOS 231 | CMOS_2: 232 | MOV AL,CL 233 | OUT CMOS_PORT,AL ;НАЧАЛЬНЫЙ АДРЕС 234 | JMP SHORT $+2 ;ЗАДЕРЖКА 235 | IN AL,CMOS_PORT+1 236 | SUB AH,AH ;ГАРАНТИЯ AH=0 237 | ADC BX,AX ;ДОБАВИТЬ К ТЕКУЩЕМУ ЗНАЧЕНИЮ 238 | INC CL ;УКАЗАТЕЛЬ НА СЛЕДУЮЩЕЕ СЛОВО 239 | CMP CH,CL ;ЗАКОНЧИТЬ ? 240 | JNZ CMOS_2 ;ПЕРЕХОД ЕСЛИ НЕТ 241 | MOV AL,2eh 242 | OUT CMOS_PORT,AL ;НАЧАЛЬНЫЙ АДРЕС 243 | JMP SHORT $+2 ;ЗАДЕРЖКА 244 | MOV AL,BH 245 | OUT CMOS_PORT+1,AL 246 | MOV AL,2fh 247 | OUT CMOS_PORT,AL ;НАЧАЛЬНЫЙ АДРЕС 248 | MOV AL,BL 249 | OUT CMOS_PORT+1,AL 250 | RET 251 | SUMMM ENDP 252 | 253 | ADAPTER PROC NEAR 254 | ;--------------------------------------------------------------------------- 255 | ; ПРОВЕРКА ТИПА ВИДЕО АДАПТЕРА 256 | ; CMOS ЯЧЕЙКА 14H BIT 5,4 257 | ; 0 0 НЕИЗВЕСТНЫЙ ИЛИ EGA 258 | ; 0 1 40 CLM CGA 259 | ; 1 0 80 CLM CGA 260 | ; 1 1 TTL MONOXROME 261 | ;RETURN Bh=5 CGA,EGA 262 | ; Bl=5 TTL 263 | ;--------------------------------------------------------------------------- 264 | MOV DX,3D4H 265 | MOV AL,0EH 266 | OUT DX,AL 267 | MOV AL,07h 268 | MOV DX,3D5H 269 | OUT DX,AL 270 | MOV DX,3D4H 271 | MOV AL,0EH 272 | OUT DX,AL 273 | MOV DX,3D5H 274 | IN AL,DX 275 | AND AL,01111111B 276 | CMP AL,07h 277 | JnE hgfd_1 278 | MOV Bh,5 ;CGA 279 | 280 | hgfd_1: MOV DX,3b4H 281 | MOV AL,0EH 282 | OUT DX,AL 283 | MOV AL,07h 284 | MOV DX,3b5H 285 | OUT DX,AL 286 | MOV DX,3b4H 287 | MOV AL,0EH 288 | OUT DX,AL 289 | MOV DX,3b5H 290 | IN AL,DX 291 | AND AL,01111111B 292 | CMP AL,07h 293 | jne cga_n 294 | mov bl,5 295 | CGA_N: RET 296 | ADAPTER ENDP 297 | 298 | SET_UP_N PROC NEAR 299 | CALL CMOS_DIAG1 300 | JZ SUCCESS_SETUP 301 | MOV CX,SETUP_BAD1 302 | MOV SI,OFFSET SETUP_BAD 303 | CALL STR_PRINT 304 | MOV BX,810H 305 | CALL BEEPER 306 | MOV CX,10 307 | CALL PAUZA 308 | JMP SHORT ERROR_SETUP 309 | SUCCESS_SETUP: 310 | MOV CX,SETUP_1 311 | MOV SI,offset SETUP 312 | CALL STR_PRINT 313 | MOV CX,08 314 | CALL PAUZA 315 | MOV CX,NONE1 316 | MOV SI,OFFSET NONE 317 | CALL STR_PRINT 318 | MOV AH,1 319 | INT 16H 320 | JZ KONFIG2 321 | XOR AX,AX 322 | INT 16H 323 | CMP AH,53H 324 | JNE KONFIG2 325 | ;-----УСТАНОВКА ЧАСОВ 326 | ERROR_SETUP: 327 | MOV AL,0AH 328 | OUT CMOS_PORT,AL 329 | MOV AL,00100000B 330 | OUT CMOS_PORT+1,AL 331 | MOV AL,0BH 332 | OUT CMOS_PORT,AL 333 | MOV AL,00100001B 334 | OUT CMOS_PORT+1,AL 335 | ;------УСТАНОВКА РАЗМЕРА ПАМЯТИ В КМОП 336 | CALL DDS 337 | MOV BX,EDGE_CNT 338 | MOV AL,16H 339 | OUT CMOS_PORT,AL 340 | XCHG AL,BH 341 | OUT CMOS_PORT+1,AL 342 | MOV AL,15H 343 | OUT CMOS_PORT,AL 344 | XCHG AL,BL 345 | OUT CMOS_PORT+1,AL 346 | ;-----ПРОВЕРКА АДАПТЕРА 347 | MOV BX,0B000H 348 | MOV AX,EQUIP_FLAG 349 | AND AX,0110000B 350 | CMP AX,0110000B 351 | JE TTL_AD 352 | MOV BX,0B800H 353 | TTL_AD: 354 | MOV ES,BX 355 | CALL SET_UP 356 | CALL SET_BAYT_DEV 357 | CALL SUMMM 358 | JMP START 359 | KONFIG2: 360 | RET 361 | SET_UP_N ENDP 362 | 363 | ;---------------------- 364 | ;ДИАГНОСТИКА КМОП 365 | ;ПРИ ОШИБКЕ УСТАНОВЛЕН ZF 366 | ;---------------------- 367 | CMOS_DIAG1 PROC NEAR 368 | MOV AL,DIAG_STATUS 369 | OUT CMOS_PORT,AL 370 | IN AL,CMOS_PORT+1 371 | TEST AL,0C0H 372 | RET 373 | CMOS_DIAG1 ENDP 374 | 375 | REZ_1 DB ' REZ' 376 | T_IME DB 'Time',0 377 | D_ATA DB 'Data',0 378 | A_LARM DB 'Alarm',0 379 | A_FLOP DB 'Flop A',0 380 | B_FLOP DB 'Flop B',0 381 | SA_V DB 'Save Y/N',0 382 | 383 | SETUP DB 0AH,0DH,0DH,0AH,'PRESS DEL FOR RUN SET_UP' 384 | SETUP_1 EQU $ - OFFSET SETUP 385 | NONE DB 0DH,' ' 386 | NONE1 EQU $ - OFFSET NONE 387 | SETUP_BAD DB 0AH,0AH,0DH,'CMOS CHEKSUM ERROR !' 388 | SETUP_BAD1 EQU $ - OFFSET SETUP_BAD 389 | 390 | K_ONFIG PROC NEAR 391 | CALL CMOS_DIAG1 ;ПРОВЕРКА КМОП 392 | JZ M_OK 393 | JMP SHORT BAD_MOS ;ПЕРЕХОД НА МИНИМАЛЬНУЮ КОНФИГУРАЦИЮ 394 | M_OK: 395 | MOV AL,14H 396 | OUT CMOS_PORT,AL 397 | IN AL,CMOS_PORT+1 ; БАЙТ ОБОРУДОВАНИЯ 398 | MOV BX,0100010000001110b 399 | OR BL,AL 400 | MOV word ptr EQUIP_FLAG,BX ;УСТАНОВКА EQUIP_FLAG 401 | JMP SHORT G_MOS 402 | ;---------------------------------------------------------- 403 | ; ЗАГРУЗКА ПО МИНИМАЛЬНОЙ КОНФИГУРАЦИИ 404 | ;---------------------------------------------------------- 405 | BAD_MOS: 406 | MOV EQUIP_FLAG,442FH 407 | G_MOS: 408 | RET 409 | K_ONFIG ENDP -------------------------------------------------------------------------------- /poisk1/CRT_GEN.ASM: -------------------------------------------------------------------------------- 1 | ;--------------------------------------------------------------------------- 2 | ; Генератор символов для графических режимов 320*200 и 640*200 3 | ;--------------------------------------------------------------------------- 4 | CRT_CHAR_GEN LABEL BYTE 5 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; D 00 6 | 7 | DB 07EH,081H,0A5H,081H,0BDH,099H,081H,07EH ; D 01 8 | 9 | DB 07EH,0EFH,0DBH,0EFH,0C3H,0E7H,0EFH,07EH ; D 02 10 | 11 | DB 06CH,0EEH,0EEH,0EEH,07CH,038H,010H,000H ; D 03 12 | 13 | DB 010H,038H,07CH,0EEH,07CH,038H,010H,008H ; D 04 14 | 15 | DB 038H,07CH,038H,0EEH,0EEH,07CH,038H,07CH ; D 05 16 | 17 | DB 010H,010H,038H,07CH,0EEH,07CH,038H,07CH ; D 06 18 | 19 | DB 000H,000H,018H,03CH,03CH,018H,000H,000H ; D 07 20 | 21 | DB 0EFH,0EFH,0E7H,0C3H,0C3H,0E7H,0EFH,0EFH ; D 08 22 | 23 | DB 000H,03CH,066H,042H,042H,066H,03CH,000H ; D 09 24 | 25 | DB 0EFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0EFH ; D 0A 26 | 27 | DB 00FH,007H,00FH,07DH,0CCH,0CCH,0CCH,078H ; D 0B 28 | 29 | DB 03CH,066H,066H,066H,03CH,018H,07EH,018H ; D 0C 30 | 31 | DB 03FH,033H,03FH,030H,030H,070H,0E0H,0E0H ; D 0D 32 | 33 | DB 07FH,063H,07FH,063H,063H,067H,0E6H,0C0H ; D 0E 34 | 35 | DB 099H,05AH,03CH,0E7H,0E7H,03CH,05AH,099H ; D 0F 36 | 37 | DB 080H,0E0H,0E8H,0EEH,0F8H,0E0H,080H,000H ; D 10 38 | 39 | DB 002H,00EH,03EH,0EEH,03EH,00EH,002H,000H ; D 11 40 | 41 | DB 018H,03CH,07EH,018H,018H,07EH,03CH,018H ; D 12 42 | 43 | DB 066H,066H,066H,066H,066H,000H,066H,000H ; D 13 44 | 45 | DB 07FH,0DBH,0DBH,07BH,01BH,01BH,01BH,000H ; D 14 46 | 47 | DB 03EH,063H,038H,06CH,06CH,038H,0CCH,078H ; D 15 48 | 49 | DB 000H,000H,000H,000H,07EH,07EH,07EH,000H ; D 16 50 | 51 | DB 018H,03CH,07EH,018H,07EH,03CH,018H,0EFH ; D 17 52 | 53 | DB 018H,03CH,07EH,018H,018H,018H,018H,000H ; D 18 54 | 55 | DB 018H,018H,018H,018H,07EH,03CH,018H,000H ; D 19 56 | 57 | DB 000H,018H,00CH,0EEH,00CH,018H,000H,000H ; D 1A 58 | 59 | DB 000H,030H,060H,0EEH,060H,030H,000H,000H ; D 1B 60 | 61 | DB 000H,000H,0C0H,0C0H,0C0H,0EEH,000H,000H ; D 1C 62 | 63 | DB 000H,024H,066H,0EFH,066H,024H,000H,000H ; D 1D 64 | 65 | DB 000H,018H,03CH,07EH,0EFH,0EFH,000H,000H ; D 1E 66 | 67 | DB 000H,0EFH,0EFH,07EH,03CH,018H,000H,000H ; D 1F 68 | 69 | DB 000H,000H,000H,000H,000H,000H,000H,000H ; SP D 20 70 | 71 | DB 018H,03CH,03CH,018H,018H,000H,018H,000H ; ! D 21 72 | 73 | DB 036H,036H,036H,000H,000H,000H,000H,000H ; " D 22 74 | 75 | DB 036H,036H,07FH,036H,07FH,036H,036H,000H ; # D 23 76 | 77 | DB 018H,03EH,060H,03CH,006H,07CH,018H,000H ; $ D 24 78 | 79 | DB 000H,063H,066H,00CH,018H,033H,063H,000H ; % D 25 80 | 81 | DB 01CH,036H,01CH,03BH,06EH,066H,03BH,000H ; & D 26 82 | 83 | DB 030H,030H,060H,000H,000H,000H,000H,000H ; ' D 27 84 | 85 | DB 00CH,018H,030H,030H,030H,018H,00CH,000H ; ( D 28 86 | 87 | DB 030H,018H,00CH,00CH,00CH,018H,030H,000H ; ) D 29 88 | 89 | DB 000H,033H,01EH,07FH,01EH,033H,000H,000H ; * D 2A 90 | 91 | DB 000H,018H,018H,07EH,018H,018H,000H,000H ; + D 2B 92 | 93 | DB 000H,000H,000H,000H,000H,018H,018H,030H ; , D 2C 94 | 95 | DB 000H,000H,000H,07EH,000H,000H,000H,000H ; - D 2D 96 | 97 | DB 000H,000H,000H,000H,000H,018H,018H,000H ; . D 2E 98 | 99 | DB 003H,006H,00CH,018H,030H,060H,040H,000H ; / D 2F 100 | 101 | DB 03EH,063H,067H,06FH,07BH,073H,03EH,000H ; 0 D 30 102 | 103 | DB 018H,038H,018H,018H,018H,018H,07EH,000H ; 1 D 31 104 | 105 | DB 03CH,066H,006H,01CH,030H,066H,07EH,000H ; 2 D 32 106 | 107 | DB 03CH,066H,006H,01CH,006H,066H,03CH,000H ; 3 D 33 108 | 109 | DB 00EH,01EH,036H,066H,07FH,006H,00FH,000H ; 4 D 34 110 | 111 | DB 07EH,060H,07CH,006H,006H,066H,03CH,000H ; 5 D 35 112 | 113 | DB 01CH,030H,060H,07CH,066H,066H,03CH,000H ; 6 D 36 114 | 115 | DB 07EH,066H,006H,00CH,018H,018H,018H,000H ; 7 D 37 116 | 117 | DB 03CH,066H,066H,03CH,066H,066H,03CH,000H ; 8 D 38 118 | 119 | DB 03CH,066H,066H,03EH,006H,00CH,038H,000H ; 9 D 39 120 | 121 | DB 000H,018H,018H,000H,000H,018H,018H,000H ; : D 3A 122 | 123 | DB 000H,018H,018H,000H,000H,018H,018H,030H ; ; D 3B 124 | 125 | DB 00CH,018H,030H,060H,030H,018H,00CH,000H ; < D 3C 126 | 127 | DB 000H,000H,07EH,000H,000H,07EH,000H,000H ; = D 3D 128 | 129 | DB 030H,018H,00CH,006H,00CH,018H,030H,000H ; > D 3E 130 | 131 | DB 03CH,066H,006H,00CH,018H,000H,018H,000H ; ? D 3F 132 | 133 | DB 03EH,063H,06FH,06FH,06FH,060H,03CH,000H ; & D 40 134 | 135 | DB 018H,03CH,066H,066H,07EH,066H,066H,000H ; A D 41 136 | 137 | DB 07EH,033H,033H,03EH,033H,033H,07EH,000H ; B D 42 138 | 139 | DB 01EH,033H,060H,060H,060H,033H,01EH,000H ; C D 43 140 | 141 | DB 07CH,036H,033H,033H,033H,036H,07CH,000H ; D D 44 142 | 143 | DB 07FH,031H,034H,03CH,034H,031H,07FH,000H ; E D 45 144 | 145 | DB 07FH,031H,034H,03CH,034H,030H,078H,000H ; F D 46 146 | 147 | DB 01EH,033H,060H,060H,067H,033H,01FH,000H ; G D 47 148 | 149 | DB 066H,066H,066H,07EH,066H,066H,066H,000H ; H D 48 150 | 151 | DB 03CH,018H,018H,018H,018H,018H,03CH,000H ; I D 49 152 | 153 | DB 00FH,006H,006H,006H,066H,066H,03CH,000H ; J D 4A 154 | 155 | DB 073H,033H,036H,03CH,036H,033H,073H,000H ; K D 4B 156 | 157 | DB 078H,030H,030H,030H,031H,033H,07FH,000H ; L D 4C 158 | 159 | DB 063H,077H,07FH,07FH,06BH,063H,063H,000H ; M D 4D 160 | 161 | DB 063H,073H,07BH,06FH,067H,063H,063H,000H ; N D 4E 162 | 163 | DB 01CH,036H,063H,063H,063H,036H,01CH,000H ; O D 4F 164 | 165 | DB 07EH,033H,033H,03EH,030H,030H,078H,000H ; P D 50 166 | 167 | DB 03CH,066H,066H,066H,06EH,03CH,00EH,000H ; Q D 51 168 | 169 | DB 07EH,033H,033H,03EH,036H,033H,073H,000H ; R D 52 170 | 171 | DB 03CH,066H,070H,038H,00EH,066H,03CH,000H ; S D 53 172 | 173 | DB 07EH,05AH,018H,018H,018H,018H,03CH,000H ; T D 54 174 | 175 | DB 066H,066H,066H,066H,066H,066H,07EH,000H ; U D 55 176 | 177 | DB 066H,066H,066H,066H,066H,03CH,018H,000H ; V D 56 178 | 179 | DB 063H,063H,063H,06BH,07FH,077H,063H,000H ; W D 57 180 | 181 | DB 063H,063H,036H,01CH,01CH,036H,063H,000H ; X D 58 182 | 183 | DB 066H,066H,066H,03CH,018H,018H,03CH,000H ; Y D 59 184 | 185 | DB 07FH,063H,046H,00CH,019H,033H,07FH,000H ; Z D 5A 186 | 187 | DB 03CH,030H,030H,030H,030H,030H,03CH,000H ; [ D 5B 188 | 189 | DB 060H,030H,018H,00CH,006H,003H,001H,000H ; BACKSLASH D 5C 190 | 191 | DB 03CH,00CH,00CH,00CH,00CH,00CH,03CH,000H ; ] D 5D 192 | 193 | DB 008H,01CH,036H,063H,000H,000H,000H,000H ; CIRCUMFLEX D 5E 194 | 195 | DB 000H,000H,000H,000H,000H,000H,000H,07FH ; D 5F 196 | 197 | DB 018H,018H,00CH,000H,000H,000H,000H,000H ; D 60 198 | 199 | DB 000H,000H,03CH,006H,03EH,066H,03BH,000H ; LOWER CASE A D 61 200 | 201 | DB 070H,030H,030H,03EH,033H,033H,06EH,000H ; L.C. B D 62 202 | 203 | DB 000H,000H,03CH,066H,060H,066H,03CH,000H ; L.C. C D 63 204 | 205 | DB 00EH,006H,006H,03EH,066H,066H,03BH,000H ; L.C. D D 64 206 | 207 | DB 000H,000H,03CH,066H,07EH,060H,03CH,000H ; L.C. E D 65 208 | 209 | DB 01CH,036H,030H,078H,030H,030H,078H,000H ; L.C. F D 66 210 | 211 | DB 000H,000H,03BH,066H,066H,03EH,006H,07CH ; L.C. G D 67 212 | 213 | DB 070H,030H,036H,03BH,033H,033H,073H,000H ; L.C. H D 68 214 | 215 | DB 018H,000H,038H,018H,018H,018H,03CH,000H ; L.C. I D 69 216 | 217 | DB 006H,000H,006H,006H,006H,066H,066H,03CH ; L.C. J D 6A 218 | 219 | DB 070H,030H,033H,036H,03CH,036H,073H,000H ; L.C. K D 6B 220 | 221 | DB 038H,018H,018H,018H,018H,018H,03CH,000H ; L.C. L D 6C 222 | 223 | DB 000H,000H,066H,07FH,07FH,06BH,063H,000H ; L.C. M D 6D 224 | 225 | DB 000H,000H,07CH,066H,066H,066H,066H,000H ; L.C. N D 6E 226 | 227 | DB 000H,000H,03CH,066H,066H,066H,03CH,000H ; L.C. O D 6F 228 | 229 | DB 000H,000H,06EH,033H,033H,03EH,030H,078H ; L.C. P D 70 230 | 231 | DB 000H,000H,03BH,066H,066H,03EH,006H,00FH ; L.C. Q D 71 232 | 233 | DB 000H,000H,06EH,03BH,033H,030H,078H,000H ; L.C. R D 72 234 | 235 | DB 000H,000H,03EH,060H,03CH,006H,07CH,000H ; L.C. S D 73 236 | 237 | DB 008H,018H,03EH,018H,018H,01AH,00CH,000H ; L.C. T D 74 238 | 239 | DB 000H,000H,066H,066H,066H,066H,03BH,000H ; L.C. U D 75 240 | 241 | DB 000H,000H,066H,066H,066H,03CH,018H,000H ; L.C. V D 76 242 | 243 | DB 000H,000H,063H,06BH,07FH,07FH,036H,000H ; L.C. W D 77 244 | 245 | DB 000H,000H,063H,036H,01CH,036H,063H,000H ; L.C. X D 78 246 | 247 | DB 000H,000H,066H,066H,066H,03EH,006H,07CH ; L.C. Y D 79 248 | 249 | DB 000H,000H,07EH,04CH,018H,032H,07EH,000H ; L.C. Z D 7A 250 | 251 | DB 00EH,018H,018H,070H,018H,018H,00EH,000H ; D 7B 252 | 253 | DB 00CH,00CH,00CH,000H,00CH,00CH,00CH,000H ; D 7C 254 | 255 | DB 070H,018H,018H,00EH,018H,018H,070H,000H ; D 7D 256 | 257 | DB 03BH,06EH,000H,000H,000H,000H,000H,000H ; D 7E 258 | 259 | DB 000H,008H,01CH,036H,063H,063H,07FH,000H ; DELTA D 7F 260 | 261 | 262 | -------------------------------------------------------------------------------- /poisk2/SET_DOP.ASM: -------------------------------------------------------------------------------- 1 | ASSUME CS:CODE,DS:CODE 2 | SET_UP PROC NEAR 3 | PUSH CS 4 | POP DS 5 | mov cx,1000 6 | xor bx,bx 7 | sd_9: mov byte ptr es:[bx],0 8 | inc bx 9 | inc bx 10 | loop sd_9 11 | 12 | ;----ВЫВОД ОБЩЕЙ ТАБЛИЦЫ 13 | 14 | ;ВЫВОД РАМКИ 15 | XOR BX,BX 16 | MOV CX,50 17 | MOV DL,205 18 | CALL STROK 19 | MOV BX,160*15 20 | MOV CX,50 21 | CALL STROK 22 | MOV CX,50 23 | MOV DL,177 24 | MOV BX,160*16+2 25 | CALL STROK 26 | MOV BX,160 27 | MOV CX,14 28 | MOV DL,186 29 | CALL STOLB 30 | MOV BX,160+50*2 31 | MOV CX,14 32 | CALL STOLB 33 | MOV BX,160+51*2 34 | MOV CX,16 35 | MOV DL,177 36 | CALL STOLB 37 | MOV BX,160+52*2 38 | MOV CX,16 39 | MOV DL,177 40 | CALL STOLB 41 | MOV byte ptr ES:[0],201 42 | MOV byte ptr ES:[100],187 43 | MOV byte ptr ES:[160*15],200 44 | MOV byte ptr ES:[160*15+100],188 45 | MOV SI,offset SOOB_1 46 | MOV BX,160*15+30*2 47 | CALL STR_SHOW 48 | MOV SI,offset SOOB_2 49 | MOV BX,4*2 50 | CALL STR_SHOW 51 | ;вывод сообщений 52 | MOV SI,offset T_IME 53 | MOV BX,160*2+3*2 54 | CALL STR_SHOW 55 | MOV SI,offset D_ATA 56 | MOV BX,160*3+3*2 57 | CALL STR_SHOW 58 | MOV SI,offset A_LARM 59 | MOV BX,160*4+3*2 60 | CALL STR_SHOW 61 | MOV SI,offset A_FLOP 62 | MOV BX,160*6+3*2 63 | CALL STR_SHOW 64 | MOV SI,offset B_FLOP 65 | MOV BX,160*7+3*2 66 | CALL STR_SHOW 67 | MOV SI,offset H_ARD 68 | MOV BX,160*8+3*2 69 | CALL STR_SHOW 70 | MOV SI,offset A_DAP 71 | MOV BX,160*9+3*2 72 | CALL STR_SHOW 73 | MOV SI,offset ROM_S 74 | MOV BX,160*10+3*2 75 | CALL STR_SHOW 76 | MOV SI,offset EMS_S 77 | MOV BX,160*11+3*2 78 | CALL STR_SHOW 79 | MOV SI,offset HARD_1N 80 | MOV BX,160*13+7*2 81 | CALL STR_SHOW 82 | MOV SI,offset SA_V 83 | MOV BX,160*14+5*2 84 | CALL STR_SHOW 85 | MOV CX,10 86 | MOV BX,160*2+11*2 87 | D2: MOV byte ptr ES:[BX],58 88 | ADD BX,160 89 | LOOP D2 90 | MOV byte ptr ES:[160*5+11*2],0 91 | ;ВЫВОД ЯЧЕЕК 92 | CALL VVVV 93 | 94 | ;УСТАНОВКА ПРЕРЫВАНИЙ ТАЙМЕРА 95 | PUSH DS 96 | xor ax,ax 97 | mov ds,ax 98 | mov ax,offset TIMER_1 99 | mov word ptr ds:[1ch*4],ax 100 | mov ax,cs 101 | mov word ptr ds:[1ch*4+2],ax 102 | POP DS 103 | 104 | ;ИНВЕРСИЯ ИЗОБРАЖЕНИЙ 105 | ;инверсия первой ячейки 106 | MOV BX,160*2+13*2 107 | MOV AL,70H 108 | CALL INVER 109 | ;процедура передвижения курсора и инверсии 110 | CALL PEREDV 111 | RET 112 | SET_UP ENDP 113 | 114 | TERM_SHOW PROC NEAR 115 | MOV AH,AL 116 | AND AL,01111B 117 | AND AH,11110000B 118 | ADD AL,30H 119 | cmp al,39h 120 | jbe dec_11 121 | add al,7h 122 | dec_11: MOV byte ptr ES:[BX+2],AL 123 | SHR AH,1 124 | SHR AH,1 125 | SHR AH,1 126 | SHR AH,1 127 | ADD AH,30H 128 | cmp ah,39h 129 | jbe dec_2 130 | add ah,7h 131 | dec_2: MOV byte ptr ES:[BX],AH 132 | RET 133 | TERM_SHOW ENDP 134 | 135 | 136 | TIMER_1 PROC near 137 | push ax 138 | push bx 139 | PUSH cx 140 | push dx 141 | push si 142 | push di 143 | push es 144 | push ds 145 | push bp 146 | MOV AL,0 147 | CALL CMOS_READ 148 | MOV BX,160*1+48*2 149 | MOV byte ptr ES:[BX-2],58 150 | CALL RASP 151 | MOV AL,2 152 | CALL CMOS_READ 153 | MOV BX,160*1+45*2 154 | MOV byte ptr ES:[BX-2],58 155 | CALL RASP 156 | MOV AL,4 157 | CALL CMOS_READ 158 | MOV BX,160*1+42*2 159 | CALL RASP 160 | push cs 161 | pop ds 162 | pop bp 163 | pop ds 164 | pop es 165 | POP di 166 | pop si 167 | pop dx 168 | pop cx 169 | pop bx 170 | pop ax 171 | IRET 172 | TIMER_1 ENDP 173 | 174 | otsl_1 proc near 175 | ;отслеживание переполнения 176 | MOV BX,160*2+19*2 177 | MOV CX,3630H 178 | MOV DX,3539H 179 | CALL OTSL 180 | MOV BX,160*2+16*2 181 | CALL OTSL 182 | MOV BX,160*4+19*2 183 | CALL OTSL 184 | MOV BX,160*4+16*2 185 | CALL OTSL 186 | MOV BX,160*2+13*2 187 | MOV CX,3234H 188 | MOV DX,3233H 189 | CALL OTSL 190 | MOV BX,160*4+13*2 191 | CALL OTSL 192 | MOV CX,3332H 193 | MOV DX,3331H 194 | MOV BX,160*3+13*2 195 | CALL OTSL 196 | MOV CX,3133H 197 | MOV DX,3132H 198 | MOV BX,160*3+16*2 199 | CALL OTSL 200 | MOV CX,3035H 201 | MOV DX,3034H 202 | MOV BX,160*6+13*2 203 | CALL OTSL 204 | MOV BX,160*7+13*2 205 | CALL OTSL 206 | ;hard 207 | MOV CX,3136H 208 | MOV DX,3135H 209 | MOV BX,160*8+13*2 210 | OT_1: CALL OTSL 211 | ;adapter 212 | MOV CX,3034H 213 | MOV DX,3033H 214 | MOV BX,160*9+13*2 215 | CALL OTSL 216 | ret 217 | otsl_1 endp 218 | 219 | ;отслеживание 220 | ;BX-адрес,CX-максимальное значение DX=CX-1, AX-минимальное значение 221 | OTSL PROC NEAR 222 | MOV AL,byte ptr ES:[BX+2] 223 | MOV AH,byte ptr ES:[BX] 224 | CMP AX,CX 225 | jb rt_1 226 | MOV byte ptr ES:[BX],30H 227 | MOV byte ptr ES:[BX+2],30H 228 | RT_1: CMP AX,3939H 229 | jb rt_2 230 | MOV byte ptr ES:[BX],DH 231 | MOV byte ptr ES:[BX+2],DL 232 | RT_2: RET 233 | OTSL ENDP 234 | 235 | 236 | ;ВЫВОД HELP 237 | VVV_1 PROC NEAR 238 | ;adapter 239 | MOV AL,byte ptr ES:[160*9+14*2] 240 | CALL ADAP_HELP 241 | ;flop_A 242 | MOV AL,byte ptr ES:[160*6+14*2] 243 | MOV BX,160*6+28*2 244 | CALL FLOP_HELP 245 | ;flop_B 246 | MOV AL,byte ptr ES:[160*7+14*2] 247 | MOV BX,160*7+28*2 248 | CALL FLOP_HELP 249 | ;HARD 250 | MOV AL,byte ptr ES:[160*8+14*2] 251 | MOV AH,byte ptr ES:[160*8+13*2] 252 | CALL HARD_HELP 253 | RET 254 | VVV_1 ENDP 255 | 256 | HARD_HELP PROC NEAR 257 | MOV SI,offset HARD_1 258 | CMP AX,3031H 259 | JE AD_5 260 | MOV SI,offset HARD_2 261 | CMP AX,3032H 262 | JE AD_5 263 | MOV SI,offset HARD_3 264 | CMP AX,3033H 265 | JE AD_5 266 | MOV SI,offset HARD_4 267 | CMP AX,3034H 268 | JE AD_5 269 | MOV SI,offset HARD_5 270 | CMP AX,3035H 271 | JE AD_5 272 | MOV SI,offset HARD_6 273 | CMP AX,3036H 274 | JE AD_5 275 | MOV SI,offset HARD_7 276 | CMP AX,3037H 277 | JE AD_5 278 | MOV SI,offset HARD_8 279 | CMP AX,3038H 280 | JE AD_5 281 | MOV SI,offset HARD_9 282 | CMP AX,3039H 283 | JE AD_5 284 | MOV SI,offset HARD_10 285 | CMP AX,3130H 286 | JE AD_5 287 | MOV SI,offset HARD_11 288 | CMP AX,3131H 289 | JE AD_5 290 | MOV SI,offset HARD_12 291 | CMP AX,3132H 292 | JE AD_5 293 | MOV SI,offset HARD_13 294 | CMP AX,3133H 295 | JE AD_5 296 | MOV SI,offset HARD_14 297 | CMP AX,3134H 298 | JE AD_5 299 | MOV SI,offset REZ_1 300 | AD_5: MOV BX,160*13+2*2 301 | CALL PROC_1 302 | MOV BX,160*13+10*2 303 | CALL PROC_1 304 | MOV BX,160*13+20*2 305 | CALL PROC_1 306 | MOV BX,160*13+34*2 307 | CALL PROC_1 308 | MOV BX,160*8+27*2 309 | CALL PROC_1 310 | RET 311 | HARD_HELP ENDP 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | FLOP_HELP PROC NEAR 323 | MOV SI,offset DISK_2 324 | CMP AL,31H 325 | JE AD_3 326 | MOV SI,offset DISK_3 327 | CMP AL,32H 328 | JE AD_3 329 | MOV SI,offset DISK_4 330 | CMP AL,33H 331 | JE AD_3 332 | MOV SI,offset DISK_5 333 | CMP AL,34H 334 | JE AD_3 335 | MOV SI,offset DISK_0 336 | AD_3: CALL STR_SHOW 337 | RET 338 | FLOP_HELP ENDP 339 | 340 | ADAP_HELP PROC NEAR 341 | CMP AL,30H 342 | MOV SI,offset ADAPT1 343 | JE AD_1 344 | MOV SI,offset ADAPT2 345 | CMP AL,31H 346 | JE AD_1 347 | MOV SI,offset ADAPT3 348 | CMP AL,32H 349 | JE AD_1 350 | MOV SI,offset ADAPT4 351 | AD_1: 352 | MOV BX,160*9+28*2 353 | CALL STR_SHOW 354 | RET 355 | ADAP_HELP ENDP 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | ;-------------------------------------- 366 | ; ПРОЦ. ОБРАБОТКИ PGUP 367 | ;-------------------------------------- 368 | PG_UP PROC NEAR 369 | SUB BX,4 370 | MOV AL,70H 371 | CALL INVER 372 | MOV AH,byte ptr ES:[BX-4] 373 | MOV AL,byte ptr ES:[BX-2] 374 | CMP AL,30H+9 375 | JE gPEREN 376 | INC AL 377 | gPEREN1: 378 | MOV byte ptr ES:[BX-4],AH 379 | MOV byte ptr ES:[BX-2],AL 380 | RET 381 | gPEREN: 382 | CMP AH,30H+9 383 | JE gPEREN5 384 | MOV AL,30H 385 | INC AH 386 | JMP SHORT gPEREN1 387 | gPEREN5: 388 | MOV AX,3030H 389 | JMP SHORT gPEREN1 390 | PG_UP ENDP 391 | 392 | 393 | ;-------------------------------------- 394 | ; ПРОЦ. ОБРАБОТКИ PGUP 395 | ;-------------------------------------- 396 | PG_UP_1 PROC NEAR 397 | SUB BX,4 398 | MOV AL,70H 399 | CALL INVER 400 | MOV AH,byte ptr ES:[BX-4] 401 | MOV AL,byte ptr ES:[BX-2] 402 | CMP AL,30H+9H 403 | JNE PEREN 404 | mov al,40h 405 | PEREN: INC AL 406 | CMP AL,47H 407 | JNE PEREN_2 408 | MOV AL,30H 409 | CMP AH,30H+9H 410 | JNE PEREN_1 411 | mov ah,40h 412 | PEREN_1: 413 | INC AH 414 | PEREN_2: 415 | CMP AX,4730H 416 | JNE PEREN_3 417 | MOV AX,3030H 418 | PEREN_3: 419 | MOV byte ptr ES:[BX-4],AH 420 | MOV byte ptr ES:[BX-2],AL 421 | RET 422 | PG_UP_1 ENDP 423 | 424 | 425 | ;-------------------------------------- 426 | ; ПРОЦ. ОБРАБОТКИ PGDN 427 | ;-------------------------------------- 428 | PG_DN_1 PROC NEAR 429 | SUB BX,4 430 | MOV AL,70H 431 | CALL INVER 432 | MOV AH,byte ptr ES:[BX-4] 433 | MOV AL,byte ptr ES:[BX-2] 434 | CMP AL,41H 435 | JNE PEREN6 436 | MOV AL,39H 437 | JMP SHORT PEREN2 438 | PEREN6: CMP AL,30H 439 | JE PEREN3 440 | DEC AL 441 | PEREN2: MOV byte ptr ES:[BX-4],AH 442 | MOV byte ptr ES:[BX-2],AL 443 | RET 444 | PEREN3: MOV AL,46H 445 | CMP AH,41H 446 | JNE PEREN4 447 | MOV AH,39H 448 | JMP SHORT PEREN2 449 | PEREN4: CMP AH,30H 450 | JNE PEREN5 451 | MOV AX,4646H 452 | JMP SHORT PEREN2 453 | PEREN5: DEC AH 454 | JMP SHORT PEREN2 455 | PG_DN_1 ENDP 456 | 457 | 458 | 459 | ;-------------------------------------- 460 | ; ПРОЦ. ОБРАБОТКИ PGDN 461 | ;-------------------------------------- 462 | PG_DN PROC NEAR 463 | SUB BX,4 464 | MOV AL,70H 465 | CALL INVER 466 | MOV AH,byte ptr ES:[BX-4] 467 | MOV AL,byte ptr ES:[BX-2] 468 | CMP AL,30H 469 | JE gPEREN3 470 | DEC AL 471 | gPEREN2: 472 | MOV byte ptr ES:[BX-4],AH 473 | MOV byte ptr ES:[BX-2],AL 474 | RET 475 | gPEREN3: 476 | CMP AH,30H 477 | JE gPEREN4 478 | MOV AL,30H+9 479 | DEC AH 480 | JMP SHORT gPEREN2 481 | gPEREN4: 482 | MOV AX,3939H 483 | JMP SHORT gPEREN2 484 | PG_DN ENDP 485 | 486 | 487 | STOLB PROC NEAR 488 | MOV byte ptr ES:[BX],DL ;186 489 | INC BX 490 | MOV byte ptr ES:[BX],7 491 | ADD BX,159 492 | LOOP STOLB 493 | RET 494 | STOLB ENDP 495 | 496 | 497 |  -------------------------------------------------------------------------------- /poisk2/HD_SETUP.ASM: -------------------------------------------------------------------------------- 1 | ;----------------------------------------------------------------------; 2 | ; ПРОЦЕДУРА ОПРЕДЕЛЕНИЯ НАЛИЧИЯ ЖЕСТКОГО ДИСКА ; 3 | ; ЕСЛИ ДИСК НЕ НАЙДЕН ТО ВЫПОЛНЯЕТСЯ ВОЗВРАТ ; 4 | ; ЕСЛИ ДИСК НАЙДЕН : ; 5 | ; - ПРОИЗВОДИТСЯ ПЕРЕНОС АДРЕСА ИЗ INT 13H В INT 40H. ; 6 | ; ПО ВЕКТОРУ 13H РАЗМЕЩАЕТСЯ ПРОЦЕДУРА ОБРАБОТКИ ЖЕСТКОГО ДИСКА. ; 7 | ; - ИЗ КМОП ИЗВЛЕКАЕТСЯ ТИП ЖЕСТКОГО ДИСКА И АДРЕС СООТВЕТСТВУЮЩЕЙ ; 8 | ; ЕМУ ТАБЛИЦЫ ЗАНОСИТСЯ В HF_TBL_VEC. ; 9 | ; ЕСЛИ В КМОП ОШИБКА ТО ТИП ЖЕСТКОГО ДИСКА БЕРЕТСЯ ПО УМОЛЧАНИЮ (2).; 10 | ;----------------------------------------------------------------------; 11 | 12 | DISK_SETUP label NEAR 13 | 14 | ;------ ТЕСТ ПРИСУТСТВИЯ WDC 15 | 16 | MOV DX,HD_PORT 17 | MOV AL,0 18 | OUT DX,AL 19 | MOV DL,(WDC_PORT+2) and 0FFH 20 | MOV AL,0AAH 21 | WDC_TST: 22 | OUT DX,AL 23 | MOV AH,AL 24 | IN AL,DX 25 | CMP AL,AH ; WDC присутствует ? 26 | JE WDC_TST_0 27 | STC ; Нет, возврат 28 | HD_PRES: 29 | RET 30 | WDC_TST_0: 31 | SHR AX,1 32 | JNC WDC_TST 33 | ; 34 | ;------ WDC присутствует 35 | ; 36 | XOR AX,AX 37 | MOV DS,AX 38 | 39 | Assume DS:abs0 40 | 41 | CLI 42 | 43 | ; 44 | ;------ Запись 13H в 40H 45 | ; 46 | 47 | MOV AX,Word ptr [ORG_VECTOR] 48 | ;---- ПРОВЕРКА ВНЕШНЕГО BIOS HARD 49 | CMP AX,0EC59H 50 | JNE HD_PRES 51 | ;-------------------------------- 52 | MOV Word ptr [DISK_VECTOR],AX 53 | MOV AX,Word ptr [ORG_VECTOR+2] 54 | MOV Word ptr [DISK_VECTOR+2],AX 55 | 56 | ;------ Установка нового 13H 57 | MOV Word ptr [ORG_VECTOR],Offset DISK_IO 58 | ;------ Установка прерывания жесткого диска 59 | MOV Word ptr [HDISK_VEC],Offset HD_INT 60 | ;------------------------------------------------------- 61 | ; ПРОВЕРКА РАБОТОСПОСОБНОСТИ CMOS 62 | ;-------------------------------------------------------- 63 | PUSH AX 64 | XOR AX,AX 65 | XOR CX,CX 66 | CALL CMOS_DIAG1 67 | JNZ TAB_2 68 | ;---ПОЛУЧЕНИЕ НОМЕРА ТАБЛИЦЫ 69 | MOV AL,12H 70 | OUT CMOS_PORT,AL 71 | IN AL,CMOS_PORT+1 72 | 73 | ;пеpевод DEC в HEX 74 | CMP AL,09D 75 | JBE DEC_1 76 | SUB AL,6D 77 | 78 | ;вычисление адреса таблицы 79 | DEC_1: XCHG AX,CX 80 | MOV AX,Offset FD_TBL 81 | CMP CX,1 82 | JE OFFS_1 83 | dec cx 84 | OFFS: ADD AX,10H 85 | LOOP OFFS 86 | OFFS_1: MOV Word ptr [HF_TBL_VEC],AX ; 41H 87 | POP AX 88 | JMP SHORT TAB_N 89 | 90 | ;------ Установка таблицы параметров 91 | 92 | TAB_2: POP AX 93 | MOV Word ptr [HF_TBL_VEC],Offset FD_TBL2 ; 41H 94 | TAB_N: MOV Word ptr [HF_TBL_VEC+2],ax 95 | MOV FD_NUM,1 96 | STI 97 | MOV DX,80H 98 | XOR AX,AX 99 | INT 13H 100 | MOV CX,LLC3 101 | MOV SI,OFFSET HARD_TITL 102 | CALL STR_PRINT 103 | SETUP_RET: 104 | CLC 105 | RET ; return to caller 106 | ;--------------------------------------------------------------- 107 | ; ; 108 | ; ТАБЛИЦЫ ПАРАМЕТРОВ ЖЕСТКИХ ДИСКОВ ; 109 | ;--------------------------------------------------------------- 110 | ST225_tbl: 111 | FD_TBL: 112 | ; DRIVE TYPE 01 113 | DW 0306D ;CYLINDERS 114 | DB 04D ;HEADS 115 | DW 0 116 | DW 0128D ;WRITE PRE-COMPENSATION CYL 117 | DB 0 118 | DB 0 ;CONTROL BYTE 119 | DB 0,0,0 120 | DW 0305D ;LANDING ZONE 121 | DB 17D ;SECTORS/TRACK 122 | DB 0 123 | ; DRIVE TYPE 02 124 | FD_TBL2: 125 | DW 0615D ;CYLINDERS 126 | DB 04D ;HEADS 127 | DW 0 128 | DW 0300D ;WRITE PRE-COMPENSATION CYL 129 | DB 0 130 | DB 0 ;CONTROL BYTE 131 | DB 0,0,0 132 | DW 0615D ;LANDING ZONE 133 | DB 17D ;SECTORS/TRACK 134 | DB 0 135 | ; DRIVE TYPE 03 136 | DW 0615D ;CYLINDERS 137 | DB 06D ;HEADS 138 | DW 0 139 | DW 0300D ;WRITE PRE-COMPENSATION CYL 140 | DB 0 141 | DB 0 ;CONTROL BYTE 142 | DB 0,0,0 143 | DW 0615D ;LANDING ZONE 144 | DB 17D ;SECTORS/TRACK 145 | DB 0 146 | ; DRIVE TYPE 04 147 | DW 0940D ;CYLINDERS 148 | DB 08D ;HEADS 149 | DW 0 150 | DW 0512D ;WRITE PRE-COMPENSATION CYL 151 | DB 0 152 | DB 0 ;CONTROL BYTE 153 | DB 0,0,0 154 | DW 0940D ;LANDING ZONE 155 | DB 17D ;SECTORS/TRACK 156 | DB 0 157 | ; DRIVE TYPE 05 158 | DW 0940D ;CYLINDERS 159 | DB 06D ;HEADS 160 | DW 0 161 | DW 0512D ;WRITE PRE-COMPENSATION CYL 162 | DB 0 163 | DB 0 ;CONTROL BYTE 164 | DB 0,0,0 165 | DW 0940D ;LANDING ZONE 166 | DB 17D ;SECTORS/TRACK 167 | DB 0 168 | ; DRIVE TYPE 06 169 | DW 1023 ;615D ;CYLINDERS 170 | DB 08d ;04D ;HEADS 171 | DW 0 172 | DW 0FFFFH ;WRITE PRE-COMPENSATION CYL 173 | DB 0 174 | DB 0 ;CONTROL BYTE 175 | DB 0,0,0 176 | DW 1023d ;615D ;LANDING ZONE 177 | DB 17D ;SECTORS/TRACK 178 | DB 0 179 | ; DRIVE TYPE 07 180 | DW 0462D ;CYLINDERS 181 | DB 08D ;HEADS 182 | DW 0 183 | DW 0256D ;WRITE PRE-COMPENSATION CYL 184 | DB 0 185 | DB 0 ;CONTROL BYTE 186 | DB 0,0,0 187 | DW 0511D ;LANDING ZONE 188 | DB 17D ;SECTORS/TRACK 189 | DB 0 190 | ; DRIVE TYPE 08 191 | DW 0733D ;CYLINDERS 192 | DB 05D ;HEADS 193 | DW 0 194 | DW 0FFFFH ;NO WRITE PRE-COMPENSATION CYL 195 | DB 0 196 | DB 0 ;CONTROL BYTE 197 | DB 0,0,0 198 | DW 0733D ;LANDING ZONE 199 | DB 17D ;SECTORS/TRACK 200 | DB 0 201 | ; DRIVE TYPE 09 202 | DW 0900D ;CYLINDERS 203 | DB 15D ;HEADS 204 | DW 0 205 | DW 0FFFFH ;NO WRITE PRE-COMPENSATION CYL 206 | DB 0 207 | DB 008H ;CONTROL BYTE 208 | DB 0,0,0 209 | DW 0901D ;LANDING ZONE 210 | DB 17D ;SECTORS/TRACK 211 | DB 0 212 | ; DRIVE TYPE 10 213 | DW 0820D ;CYLINDERS 214 | DB 03D ;HEADS 215 | DW 0 216 | DW 0FFFFH ;NO WRITE PRE-COMPENSATION CYL 217 | DB 0 218 | DB 0 ;CONTROL BYTE 219 | DB 0,0,0 220 | DW 0820D ;LANDING ZONE 221 | DB 17D ;SECTORS/TRACK 222 | DB 0 223 | ; DRIVE TYPE 11 224 | DW 0855D ;CYLINDERS 225 | DB 05D ;HEADS 226 | DW 0 227 | DW 0FFFFH ;NO WRITE PRE-COMPENSATION CYL 228 | DB 0 229 | DB 0 ;CONTROL BYTE 230 | DB 0,0,0 231 | DW 0855D ;LANDING ZONE 232 | DB 17D ;SECTORS/TRACK 233 | DB 0 234 | ; DRIVE TYPE 12 235 | DW 0855D ;CYLINDERS 236 | DB 07D ;HEADS 237 | DW 0 238 | DW 0FFFFH ;NO WRITE PRE-COMPENSATION CYL 239 | DB 0 240 | DB 0 ;CONTROL BYTE 241 | DB 0,0,0 242 | DW 0855D ;LANDING ZONE 243 | DB 17D ;SECTORS/TRACK 244 | DB 0 245 | ; DRIVE TYPE 13 246 | DW 0306D ;CYLINDERS 247 | DB 08D ;HEADS 248 | DW 0 249 | DW 0128D ;WRITE PRE-COMPENSATION CYL 250 | DB 0 251 | DB 0 ;CONTROL BYTE 252 | DB 0,0,0 253 | DW 0319D ;LANDING ZONE 254 | DB 17D ;SECTORS/TRACK 255 | DB 0 256 | ; DRIVE TYPE 14 257 | ; DW 0733D ;CYLINDERS 258 | ; DB 07D ;HEADS 259 | ; DW 0 260 | ; DW 0FFFFH ;WRITE PRE-COMPENSATION CYL 261 | ; DB 0 262 | ; DB 0 ;CONTROL BYTE 263 | ; DB 0,0,0 264 | ; DW 0733D ;LANDING ZONE 265 | ; DB 17D ;SECTORS/TRACK 266 | ; DB 0 267 | ; DRIVE TYPE 14 268 | DW 0820D ;CYLINDERS 269 | DB 06D ;HEADS 270 | DW 0 271 | DW 0820d ;WRITE PRE-COMPENSATION CYL 272 | DB 0 273 | DB 0 ;CONTROL BYTE 274 | DB 0,0,0 275 | DW 0820D ;LANDING ZONE 276 | DB 17D ;SECTORS/TRACK 277 | DB 0 278 | 279 | 280 | ; DRIVE TYPE 15 RESERVED *** DO NOT USE *** 281 | DW 0000D ;CYLINDERS 282 | DB 00D ;HEADS 283 | DW 0 284 | DW 0000D ;NO WRITE PRE-COMPENSATION CYL 285 | DB 0 286 | DB 0 ;CONTROL BYTE 287 | DB 0,0,0 288 | DW 0000D ;LANDING ZONE 289 | DB 00D ;SECTORS/TRACK 290 | DB 0 291 | 292 | 293 | 294 | ;--------------------------------------------------------------- 295 | ; 296 | ;----- INT 19 -------------------------------------------------- 297 | ; ; 298 | ; INTERRUPT 19 ЗАГРУЗКА СИСТЕМЫ ; 299 | ; ; 300 | ; - Считывает с системной дискеты программу загрузчика ; 301 | ; размещенную на 0 дорожке в первом секторе 302 | ; - Последовательность загрузки: ; 303 | ; > попытка загрузки с дискеты программы загрузчика в ; 304 | ; область (0000:7C00) и контроль этого ; 305 | ; > при удаче передача управления загрузчику ; 306 | ; если неудача, то загрузка с жесткого диска ; 307 | ; > если ошибка, то возврат в вызывающую ; 308 | ;--------------------------------------------------------------- 309 | BOOT_STRAPR: 310 | call set_tod ;установка в ячейки DOS времени из КМОП 311 | 312 | ; 313 | ;------ ПОПЫТКА ЗАГРУЗКИ С ДИСКЕТЫ 314 | ; 315 | XOR AX,AX 316 | MOV DS,AX 317 | MOV CX,3 ; установка счетчика попыток 318 | H1: 319 | PUSH CX 320 | XOR DX,DX ; дисковод 0 321 | XOR AX,AX ; сброс контроллера 322 | INT 13H 323 | MOV AX,0201H ; чтение одного сектора 324 | XOR DX,DX ; установка ES:[BX] 325 | MOV ES,DX 326 | MOV BX,Offset BOOT_LOCN 327 | JC H2 ; если ошибка, то повтор 328 | MOV CX,1 ; SECTOR 1, TRACK 0 329 | INT 13H 330 | H2: 331 | POP CX 332 | JNC H4 ; переход при успехе 333 | CMP AH,080H ; если TIME_OUT, то не повторяем 334 | JE H5 ; повторить с FIXED DISK 335 | LOOP H1 ; повтор 336 | JMP short H5 ; невозможность загрузки с дискеты 337 | H4: ; загрузка была успешной 338 | MOV AX,3 ; 80x25 color 339 | INT 10H ; Clear screen 340 | 341 | MOV BX,806H 342 | CALL BEEPER 343 | JMP BOOT_LOCN ; (OK) 344 | ; 345 | ;------ Attempt BOOTSTRAP from FIXED DISK 346 | ; 347 | H5: 348 | ;------ 349 | H5_CONT: 350 | XOR AX,AX ; RESET 351 | INT 13H 352 | MOV AH,10H ; тест чтения 353 | MOV DL,80H ; FIXED DISK 0 354 | INT 13H 355 | JC H9 ; не читаем 356 | MOV CX,3 ; установка счетчика повторений 357 | H6: 358 | PUSH CX ; 359 | XOR AX,AX ; RESET фиксированного диска 360 | INT 13H ; 361 | JC H7 ; если ошибка, то повторить снова 362 | MOV AX,0201H ; чтение одного сектора 363 | MOV CL,1 ; SECTOR 1, TRACK 0 364 | INT 13H ; 365 | H7: 366 | POP CX 367 | JC H8 368 | CMP Word ptr [BOOT_LOCN]+510D,0AA55H ; тест наличия загрузчика 369 | JZ H4 370 | H8: 371 | LOOP H6 372 | H9: 373 | MOV BX,404H 374 | PUSH BX 375 | CALL BEEPER 376 | MOV CH,40H ; Установка 150 mS 377 | H10: 378 | LOOP H10 379 | POP BX 380 | CALL BEEPER 381 | JMP BOOT_STRAPR 382 | ; 383 | ;------ Создание звука 384 | ; 385 | BEEPER proc near 386 | MOV AL,10110110B 387 | OUT 43H,AL 388 | OUT 42H,AL 389 | MOV AL,BH 390 | OUT 42H,AL 391 | IN AL,61H 392 | PUSH AX 393 | OR AL,3 394 | OUT 61H,AL 395 | BEEP_LOOP: 396 | MOV CH,20H 397 | BEEP_0: 398 | LOOP BEEP_0 399 | DEC BL 400 | JNZ BEEP_LOOP 401 | POP AX 402 | OUT 61H,AL 403 | RET 404 | BEEPER EndP 405 | ;--------------------------------------------------------------- 406 |  -------------------------------------------------------------------------------- /agat/teac.lst: -------------------------------------------------------------------------------- 1 | 2 | Так как возникает много вопросов по поводу работы контроллера Teac, решил все-таки ответить всем и сразу. Читайте. 3 | 4 | Листинг ПЗУ контроллера дисководов ЕС5323.01(02) (фг3.089.174) с комментариями (Бончан Игорь) 5 | В листинге все числа шестнадцатиричные 6 | ;========================================================================================================================================== 7 | C500: A2 20 LDX #20 ;оставлено на случай изменений в подпрограмме 8 | C502: A0 00 LDY #00 ;FFCB (см. ниже) и совместимости между контроллерами, иногда выступает в роли ID 9 | 10 | C504: A2 03 LDX #03 ;количество шагов головки внутрь 11 | C506: 86 3C STX 3C ;кладем 12 | C508: 20 CB FF JSR FFCB ;идем на RTS (возврат из подпрограммы) в мониторе 13 | C50B: BA TSX ;помещаем указатель стека в регистр X 14 | C50C: BD 00 01 LDA 0100,X ;в FF+X имеем WORD вектор, который остался после JSR FFCB (FF+X=0A, 100+X=C5 в нашем случае) 15 | C50F: 0A ASL ;делаем это чтобы узнать слот контроллера (старший байт адреса - C0) 16 | C510: 0A ASL ;сдвигаем этот байт в аккумуляторе (С5) влево на 4 бита (ASL) 17 | C511: 0A ASL 18 | C512: 0A ASL ;имеем в аккумуляторе A=50 19 | C513: 85 2B STA 2B ;теперь ячейка равна 2B=SLOTx10 20 | C515: AA TAX ;и индексный регистр X тоже 21 | ;========================================================================================================================================== 22 | C516: A9 92 LDA #92 ;стартовая комбинация входных сигналов логики 1-го контроллера (чипа) КР580ВВ55А 23 | C518: 9D 83 C0 STA C083,X ;считайте что это "full reset" !!! именно поэтому не надо при работе писать единицу в 7 разряд RK 24 | ;конкретно: сброс режима предкомпенсации, сброс номера первого привода, выборка 25 | ;неопределенного состояния тракта чтение-запись (2-й чип) 26 | C51B: A9 BD LDA #BD ;стартовая комбинация входных сигналов логики 2-го контроллера (чипа) КР580ВВ55А 27 | C51D: 9D 87 C0 STA C087,X ;также считайте за "full reset" !!! поэтому при работе с контроллером можно изменять лишь 28 | ;биты 2 и 4, иначе, не зная конкретной схемотехники, вы получите непредсказуемое состояние 29 | ;контроллера 30 | C520: A9 0F LDA #0F ;7 бит RK в "1" - включаем НГМД 31 | C522: 9D 83 C0 STA C083,X ;начал раскручиваться первый привод 32 | C525: A9 09 LDA #09 ;в 4 бит RD пишем 1 - включаем разрешение формирования сигнала готовности чтения для тракта 33 | C527: 9D 87 C0 STA C087,X ;проще говоря - режим чтения 34 | C52A: EA NOP ; 35 | C52B: EA NOP ;оставлено после правок и для совместимости с Волжскими контроллерами 36 | C52C: A9 05 LDA #05 ;устанавливаем бит 2 регистра RK в "1" - направление движения головки "внутрь" 37 | C52E: 2C A9 04 BIT 04A9 ;типичный прием для 6502 когда пойдем на C52F установим бит 2 RK в "0" направление 38 | C531: 9D 83 C0 STA C083,X ;головки "наружу" (т.е. "0" во 2-й бит), устанавливаем RK 39 | C534: 9D 89 C0 STA C089,X ;делаем шаг 40 | C537: A0 08 LDY #08 41 | C539: CA DEX ;задержка на успокоение головки 42 | C53A: E4 2B CPX 2B ;выйдем с X таким же как и вошли 43 | C53C: D0 FB BNE C539 ;N-разъема x 10 44 | C53E: 88 DEY 45 | C53F: D0 F8 BNE C539 ;всего x*y $800 проходов 46 | C541: BD 81 C0 LDA C081,X ;опрашиваем слово состояния (регистр S) 47 | C544: 30 FB BMI C541 ;не готов, ждем (Флаг готовности "0" в 7 бите) 48 | C546: C6 3C DEC 3C ;делаем 3 шага внутрь 49 | C548: 10 EA BPL C534 ;(было по адресу C504:LDX #3,STX 3C) 50 | C54A: 29 40 AND #40 ;а когда их сделаем будем приходить сюда 51 | C54C: D0 E1 BNE C52F ;и ждать сигнала "0-й трек" (бит 6) ведь в 7 бите $3C будет "1" не менее $80 52 | C54E: EA NOP ;раз, а это больше чем дорожек $50 53 | C54F: 85 26 STA 26 ;сюда из аккумулятора "0" XFXXXXXXb AND 40 =0 (где F-сигнал "нулевой трек" регистра S) 54 | C551: EA NOP ;уже говорил выше 55 | C552: EA NOP 56 | C553: EA NOP 57 | C554: 85 41 STA 41 ; 58 | C556: 85 3D STA 3D ;обнуляем все 26,41,3d 59 | C558: A9 08 LDA #08 ;27=8, 26=0 (см.выше), это WORD вектор, по адресу 800 будет считан 0 сектор 0 дорожки 60 | C55A: 85 27 STA 27 ; 61 | ;========================================================================================================================================== 62 | C55C: 9D 8A C0 STA C08A,X ;сбрасываем состояние синхротриггера (если не поняли ведь пока мы двигали головку и ждали 63 | ;диск прошел далеко не один раз и не раз произошел сбой "синхро", секторов 20 прошло по минимуму) 64 | C55F: BD 86 C0 LDA C086,X ;теперь ждем нового взвода синхротриггера 65 | C562: 0A ASL ;выдвигаем на 1 бит влево - проверяем 6-й бит 66 | C563: 30 FA BMI C55F ;если не равен нулю (признак сбоя) то ждем 67 | C565: BD 84 C0 LDA C084,X ;сбрасываем байт-мусора после сбоя (после синхро пишется байт из единиц FF, так как 68 | ;нам нужно время после реакции синхротриггера, чтобы не зависеть от согласования схем тракта 69 | C568: BD 86 C0 LDA C086,X ;теперь ждем первый рабочий байт после сбоя "синхро" 70 | C56B: 10 FB BPL C568 ;байт сформирован ? ("1" в старшем 7 разряде - признак готовности байта) 71 | C56D: BD 84 C0 LDA C084,X ;получен первый байт маркера пролога поля адреса (95 6A) 72 | C570: C9 95 CMP #95 73 | C572: D0 E8 BNE C55C ;нет будем идем на C55C, сбросим синхротриггер и все сначала 74 | C574: 9D 8A C0 STA C08A,X ;сбрасываем синхротриггер (он ведь остался взведенным), отсюда и далее при стандартном чтении 75 | ;появление сбоя синхронизации следует считать ошибкой в стандартном чтении (не в этом ПЗУ) 76 | ;в конце чтения будет проверка сбоя "синхро" 77 | C577: BD 86 C0 LDA C086,X ;следующий байт 78 | C57A: 10 FB BPL C577 ;не готов 79 | C57C: BD 84 C0 LDA C084,X 80 | C57F: C9 6A CMP #6A ;получили 2-й байт маркера пролога адреса 81 | C581: D0 D9 BNE C55C ;нет, другой - ошибка, все сначала 82 | C583: BD 86 C0 LDA C086,X ;1-й информационный байт поля адреса 83 | C586: 10 FB BPL C583 ;не готов 84 | C588: BD 84 C0 LDA C084,X ;это должен быть номер тома, но здесь он нам не важен, поэтому просто очищаем регистр R-данных 85 | C58B: BD 86 C0 LDA C086,X ;2-й информационный байт поля адреса 86 | C58E: 10 FB BPL C58B ;не готов 87 | C590: BD 84 C0 LDA C084,X ;это трек 88 | C593: C5 41 CMP 41 ;в ячейке 41 первый записывали 0 (на C554), что первый раз проверяем нулевой ли трек 89 | ;а потом (см. ниже) будем просто проверять на нужный (41) нам трек 90 | C595: D0 C5 BNE C55C ;но если не совпадает: ошибка позиционирования или запись на дискете не верна, то так и 91 | ;будем крутиться - перепозиционирования не будет, идем на риторическое C55C, и до упора 92 | C597: BD 86 C0 LDA C086,X ;3-й информационный байт поля адреса 93 | C59A: 10 FB BPL C597 ;не готов 94 | C59C: BD 84 C0 LDA C084,X ;читаем 95 | C59F: C5 3D CMP 3D ;нужный нам сектор? первый раз 3D=0 (см.выше), а потом просто ищем нужный нам 96 | C5A1: D0 B9 BNE C55C ;нет, не тот сектор, идем искать поле адреса следующего 97 | ;========================================================================================================================================== 98 | C5A3: A0 00 LDY #00 99 | C5A5: 84 3C STY 3C ;там был мусор после поиска 0-й дорожки 100 | C5A7: 9D 8A C0 STA C08A,X ;сбрасываем синхротриггер, так как сбои синхронизации в разделителях GAP1 и GAP2 совершенно 101 | ;естественное и множественное дело, ведь когда мы перезаписываем поле данных (запись любого 102 | ;файла) информация в GAP'е нарушается и принимает вид, отличный от строки GAPxAAв после 103 | ;исходного форматирования, так и появляются в GAP'ах сбои "синхро" 104 | C5AA: BD 86 C0 LDA C086,X ;теперь ждем нового взвода синхротриггера 105 | C5AD: 0A ASL ;выдвигаем на 1 бит влево - проверяем 6-й бит 106 | C5AE: 30 FA BMI C5AA ;если не равен нулю (признак сбоя) то ждем 107 | C5B0: BD 84 C0 LDA C084,X ;сбрасываем байт-мусора после сбоя (после синхро пишется байт из единиц FF, так как 108 | ;нам нужно время после реакции синхротриггера, чтобы не зависеть от согласования схем тракта 109 | C5B3: BD 86 C0 LDA C086,X ;теперь ждем первый рабочий байт после сбоя "синхро" 110 | C5B6: 10 FB BPL C5B3 ;не готов 111 | C5B8: BD 84 C0 LDA C084,X ;получен первый байт маркера пролога поля данных (6A 95) 112 | C5BB: C9 6A CMP #6A 113 | C5BD: D0 E8 BNE C5A7 ;нет будем, значит в GAP2 висел мусор (совпадающий с маркером) идем на C5A7, 114 | ;сбросим синхротриггер, и все сначала 115 | C5BF: 9D 8A C0 STA C08A,X ;сбрасываем синхротриггер (он ведь остался взведенным), отсюда и далее при стандартном чтении 116 | ;появление сбоя синхронизации следует считать ошибкой в стандартном чтении (не в этом ПЗУ) 117 | ;в конце чтения будет проверка сбоя "синхро" 118 | C5C2: BD 86 C0 LDA C086,X ;следующий байт 119 | C5C5: 10 FB BPL C5C2 ;не готов 120 | C5C7: BD 84 C0 LDA C084,X ;получили 2-й байт маркера пролога поля данных 121 | C5CA: C9 95 CMP #95 122 | C5CC: D0 D9 BNE C5A7 ;нет, другой - ошибка, все сначала 123 | ;========================================================================================================================================== 124 | C5CE: 18 CLC ;сбрасываем флажок переноса, для операции сложения при подсчете контрольной суммы (далее CHS) 125 | C5CF: BD 86 C0 LDA C086,X ;начинаем читать собственно байты данных, помним что Y=0 (см. C5A5) 126 | C5D2: 10 FB BPL C5CF ;не готов 127 | C5D4: BD 84 C0 LDA C084,X ;байт 128 | C5D7: 91 26 STA (26),Y ;напомню 26,27 - WORD адрес страницы, сюда читаем 256 байт данных (байт берем по индексу в Y) 129 | C5D9: 65 3C ADC 3C ;добавляем к CHS 130 | C5DB: 85 3C STA 3C ;пишем в ячейку (CHS=CHS+byte) 131 | C5DD: C8 INY ;индекс + 1 132 | C5DE: D0 EF BNE C5CF ;когда пройдем до FF в Y то FF+1=0, а пока Y<>0 читаем дальше 133 | ;========================================================================================================================================== 134 | C5E0: BD 86 C0 LDA C086,X ;читаем следующий байт 135 | C5E3: 10 FB BPL C5E0 ;не готов 136 | C5E5: BD 84 C0 LDA C084,X ;это байт - контрольной суммы (CHS) 137 | C5E8: C5 3C CMP 3C ;сверяем с посчитанной 138 | C5EA: D0 B5 BNE C5A1 ;не совпадает идем через C5A1 на C55C BNE-BNE и перечитываем весь сектор и поле адреса и данные 139 | C5EC: E6 27 INC 27 ;увеличваем старший байт адреса страницы с данными +1 140 | C5EE: E6 3D INC 3D ;увеличиваем номер сектора +1 141 | C5F0: A5 3D LDA 3D ;сверяем номер сектора с первым байтом прочитанного 0-го сектора 0-й дорожки (читали по адресу 142 | C5F2: CD 00 08 CMP 0800 ;800) - в нем должно быть число секторов, которое должен прочитать контроллер до передачи 143 | ;управления на следующий за этим байтом адрес, (т.е. 801) 144 | C5F5: A6 2B LDX 2B ;еще раз в индексный регистр X=слот x 10, и если 145 | C5F7: 90 A8 BCC C5A1 ;номер прочитанного сектора меньше указанного в 800, то через C5A1 на C55C (BNE-BNE) 146 | C5F9: 4C 01 08 JMP 0801 ;прочитали столько секторов, сколько было указано (800), передаем управление программе в 147 | ;0-м секторе (смещение 1 байт) 148 | 149 | C5FC: 01 02 ORA (02,X) ;ID контроллера (02 - Teac) 150 | C5FE: 34 ??? 151 | C5FF: 02 ??? ;контроллер НГМД 152 | 153 | Вообще говоря, программа расположенная в ПЗУ является упрощенным вариантом штатного чтения сектора и не проверяет сбоев синхро, 154 | не делает проверку эпилогов, не учитывает число попыток чтения, не делает перекалибровки в случае сбоя и т.п. 155 | Обычно в первом байте 0-го сектора (загрузчика) указан байт 01, что подразумевает чтение лишь нулевого сектора. 156 | Почему? Это связано с тем, что редко имеет смысл читать начальный код самозагружающихся систем линейно, т.е.: 157 | 0-й сектор - адрес 800 158 | 1-й сектор - адрес 900 159 | 2-й сектор - адрес A00 160 | 3-й сектор - адрес B00 161 | и т.п. 162 | Обычно загрузчик сам управляет адресами загрузки в ячейке 27 возвращая управление на C55C и принимая на 801. 163 | 164 | Надеюсь, теперь вам все ясно. 165 | Спрашивайте, хотя выходные уже заканчиваются. 166 | 167 | Игорь. 168 | 169 | -------------------------------------------------------------------------------- /poisk2/INT14.ASM: -------------------------------------------------------------------------------- 1 | ;-----INT 14------------------------------------------------------------- 2 | ; RS232_IO 3 | ; ЭТА ПРОГРАММА ОБСЛУЖИВАЕТ RS232 4 | ; 5 | ; 00H инициализировать коммуникационный порт 6 | ; Вход: DX = номер порта (0-1) 7 | ; AL = битовые флаги параметра инициализации: 8 | ; ┌─7─┬─6─┬─5─┬─4─┬─3──┬─2──┬─1─┬─0─┐ 9 | ; │ -- бод -- │четность│стоп│длина │ 10 | ; └───┴───┴───┴───┴────┴─╥──┴───┴───┘ 11 | ; ╚════╦════╝ ╚═╦═╝ ║ ╚═══╩══ длина слова 12 | ; ║ ║ ║ 10=7 бит; 11=8 бит 13 | ; ║ ║ ╚═════════ стоп-бит: 0=1; 1=2; 14 | ; ║ ╚════════════════ код четности 15 | ; ║ x0=нет; 01=нечет; 11=чет 16 | ; ╚══════════════════════════ бод: 000=110; 100=1200 17 | ; 001=150; 101=2400 18 | ; 010=300; 110=4800 19 | ; 011=600; 111=9600 20 | ; Выход: AH = статус коммуникаций (см. ниже) 21 | ; 22 | ;▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 23 | ; 01H послать символ через выбранный порт RS-232 24 | ; Вход: DX = номер порта (0-1) 25 | ; AL = посылаемый символ 26 | ; Выход: AL сохранен. 27 | ; Если установлен бит 7 в AH, то произошла ошибка, и 28 | ; AH (биты 6-0) = статус линии связи (см. AH ниже) 29 | ;▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 30 | ; 02H получить символ через выбранный порт RS-232 31 | ; Вход: DX = номер порта (0-1) 32 | ; Выход: AL = полученный символ 33 | ; AH ненулевой, если произошла ошибка 34 | ;▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 35 | ; 03H дать статус порта связи 36 | ; Вход: DX = номер порта (0-1) 37 | ; Выход: AX = статус порта связи 38 | ; AH = статус линии 39 | ; ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 40 | ; bit 7: TIME OUT Этот бит используется, если символ не был отправлен 41 | ; или принят в заданное время. В этом случае все ос- 42 | ; тальные биты состояния линии и модема не имеют зна- 43 | ; чения. 44 | ; bit 6: Передатчик пуст (все символы переданы). 45 | ; bit 5: Передающий буфер пуст. 46 | ; bit 4: Обнаружена последовательность BREAK. 47 | ; bit 3: Типовая ошибка, например неправильный бит останова. 48 | ; bit 2: Ошибка в четности. 49 | ; bit 1: Переполнение приемника. 50 | ; bit 0: Данные приема присутствуют. 51 | ;──────────────────────────────────────────────────────────────────────────────── 52 | ; 53 | ; AL = статус модема 54 | ; ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 55 | ; bit 7: приемная линия получила сигнал. 56 | ; bit 6: кольцевой индикатор. 57 | ; bit 5: набор данных обнаружен. 58 | ; bit 4: очистка пересылки. 59 | ; bit 3: прием данных. 60 | ; bit 2: конец данных выделен. 61 | ; bit 1: набор данны прочитан. 62 | ; bit 0: очистка отправлена. 63 | ; 64 | ;----------------------------------------------------------------------------- 65 | ; 66 | ; COM1 и COM2 инициализирует BIOS. 67 | ; при инициализации заполняются следующие ячейки 68 | ; 69 | ; 0:400 RS232_BASE[0] DW 3F8H - адрес регистра данных передатчика COM1. 70 | ; 0:402 RS232_BASE[2] DW 2F8H - адрес регистра данных передатчика COM2. 71 | ; 72 | ; 0:47C RS232_TIM_OUT[0] DB 01 - Время ожидания прихода символа для COM1. 73 | ; При необходимости можно поставить другое. 74 | ; 0:47D RS232_TIM_OUT[1] DB 01 75 | ; 0:47E RS232_TIM_OUT[2] DB 01 76 | ; 0:47F RS232_TIM_OUT[3] DB 01 77 | ; 78 | ; Для инициализации COM3 и COM4 необходимо записать адрес в 79 | ; 80 | ; 0:404 RS232_BASE[4] DW ? 81 | ; 0:406 RS232_BASE[6] DW ? 82 | ; 83 | ; и использовать функцию AH = 0 84 | ;----------------------------------------------------------------------------- 85 | 86 | ASSUME CS:CODE,DS:DATA 87 | ORG 0E729H 88 | A1 LABEL WORD ; ТАБЛИЦА ЗНАЧЕНИЙ ДЛЯ ИНИЦИАЛИЗАЦИИ 89 | DW 1047 ; 110 БОД 90 | DW 768 ; 150 91 | DW 384 ; 300 92 | DW 192 ; 600 93 | DW 96 ; 1200 94 | DW 48 ; 2400 95 | DW 24 ; 4800 96 | DW 12 ; 9600 97 | 98 | RS232_IO PROC FAR 99 | 100 | ;----- ВХОД В ПРЕРЫВАНИЕ 101 | 102 | STI 103 | PUSH DS 104 | PUSH DX 105 | PUSH SI 106 | PUSH DI 107 | PUSH CX 108 | PUSH BX 109 | MOV SI,DX ; В SI НОМЕР COM ПОРТА ИСПОЛЬЗУЕТСЯ 110 | ; ДЛЯ АДРЕСАЦИИ К ЯЧЕЙКАМ RS232_BASE 111 | MOV DI,DX ; DI ИСПОЛЬЗУЕТСЯ ДЛЯ АДРЕСАЦИИ К 112 | ; RS232_TIM_OUT 113 | SHL SI,1 114 | CALL DDS 115 | MOV DX,RS232_BASE[SI] ; ПОЛУЧЕНИЕ БАЗОВОГО АДРЕСА 116 | OR DX,DX ; ТЕСТ НЕ ИНИЦИАЛИЗИРОВАННОГО ПОРТА 117 | JZ A3 ; ВОЗВРАТ 118 | OR AH,AH ; ТЕСТ ДЛЯ (AH)=0 119 | JZ A4 ; ИНИЦИАЛИЗАЦИЯ 120 | DEC AH ; ТЕСТ ДЛЯ (AH)=1 121 | JZ A5 ; ПЕРЕСЫЛКА AL 122 | DEC AH ; ТЕСТ ДЛЯ (AH)=2 123 | JZ A12 ; ЧТЕНИЕ В AL 124 | A2: 125 | DEC AH ; ТЕСТ ДЛЯ (AH)=3 126 | JNZ A3 127 | JMP A18 ; ПОЛУЧЕНИЕ СТАТУСА 128 | A3: ; ВЫХОД 129 | POP BX 130 | POP CX 131 | POP DI 132 | POP SI 133 | POP DX 134 | POP DS 135 | IRET 136 | 137 | ;----- ИНИЙИАЛИЗАЦИЯ 138 | 139 | A4: 140 | MOV AH,AL ; ПАРАМЕТРЫ ИНИЦИАЛИЗАЦИИ В AH 141 | ADD DX,3 ; В DX - 3FBH (2FBH) АДРЕС РЕГИСТРА 142 | ; УПРАВЛЕНИЯ ЛИНИЕЙ LCR 143 | MOV AL,80H 144 | OUT DX,AL ; УСТАНОВКА DLAB=1 ДЛЯ ПОЛУЧЕНИЯ ДОС- 145 | ; ТУПА К ФИКСАТОРАМ ДЕЛИТЕЛЯ 146 | 147 | ;----- ОПРЕДЕЛЕНИЕ СКОРОСТИ ПЕРЕДАЧИ 148 | 149 | MOV DL,AH ; ВЫДЕЛЕНИЕ ИЗ БАЙТА ИНИЦИАЛИЗАЦИИ 150 | MOV CL,4 ; СКОРОСТИ ПЕРЕДАЧИ. 151 | ROL DL,CL ; 152 | AND DX,0EH ; 153 | MOV DI,OFFSET A1 ; ПОЛУЧЕНИЕ СМЕЩЕНИЯ ТАБЛИЦЫ ДЕЛИТЕЛЯ. 154 | ADD DI,DX ; 155 | MOV DX,RS232_BASE[SI] ; ПОЛУЧЕНИЕ БАЗОВОГО АДРЕСА 156 | INC DX ; АДРЕС СТАРШЕГО БАЙТА РЕГИСТРА ДЕЛИТ. 157 | MOV AL,CS:[DI]+1 ; ПОЛУЧЕНИЕ ВЕЛИЧИНЫ ДЕЛИТЕЛЯ 158 | OUT DX,AL ; ЗАПИСЬ СТАРШЕГО БАЙТА 159 | DEC DX 160 | MOV AL,CS:[DI] ; 161 | OUT DX,AL ; ЗАПИСЬ МЛАДШЕГО БАЙТА 162 | ADD DX,3 ; РЕГИСТР УПРАВЛЕНИЯ МОДЕМОМ 163 | MOV AL,AH ; ПАРАМЕТРЫ 164 | AND AL,01FH ; ОБНУЛЕНИЕ 7,6 И 5 БИТ 165 | OUT DX,AL ; ЗАПИСЬ ПАРАМЕТРОВ 166 | DEC DX 167 | DEC DX ; РЕГИСТР ИДЕНТИФИКАЦИИ ПРЕРЫВАНИЙ 168 | MOV AL,0 169 | OUT DX,AL ; ВСЕ ПРЕРЫВАНИЯ ВЫКЛЮЧЕНЫ 170 | JMP SHORT A18 ; COM_STATUS 171 | 172 | ;----- ПЕРЕСЫЛКА СИМВОЛА AH = 1 173 | 174 | A5: 175 | PUSH AX 176 | ADD DX,4 ; РЕГИСТР УПРАВЛЕНИЯ МОДЕМОМ 177 | MOV AL,3 ; ВЫХОД DTR И RTC В АКТИВНОМ СОСТОЯНИИ 178 | OUT DX,AL 179 | INC DX ; РЕГИСТР СОСТОЯНИЯ МОДЕМА 180 | INC DX 181 | MOV BH,30H ; ОЧИСТКА ДЛЯ ПЕРЕДАЧИ И ГОТОВНОСТЬ 182 | ; ПЕРЕДАЧИ 183 | CALL WAIT_FOR_STATUS ; ОЖИДАНИЕ 184 | JE A9 ; ДА, ПЕРЕДАЧА СИМВОЛА 185 | A7: 186 | POP CX 187 | MOV AL,CL ; ПЕРЕЗАГРУЗКА БАЙТА ДАННЫХ 188 | A8: 189 | OR AH,80H ; ИНДИКАЦИЯ TIME OUT 190 | JMP A3 ; ВЫХОД 191 | A9: ; CLEAR_TO_SEND 192 | DEC DX ; РЕГИСТР СОСТОЯНИЯ ЛИНИИ 193 | A10: ; WAIT_SEND 194 | MOV BH,20H ; РЕГИСТР ДАННЫХ ПЕРЕДАТЧИКА ПУСТ 195 | CALL WAIT_FOR_STATUS 196 | JNZ A7 ; ВОЗВРАТ С УСТАНОВЛЕННЫМ TIME OUT 197 | A11: ; OUT_CHAR 198 | SUB DX,5 ; ПОРТ ДАННЫХ 199 | POP CX ; ВОЗВРАЩЕНИЕ ДАННЫХ 200 | MOV AL,CL ; 201 | OUT DX,AL ; ВЫВОД СИМВОЛА 202 | JMP A3 ; ВЫХОД 203 | 204 | ;----- ЧТЕНИЕ AH = 2 205 | 206 | A12: 207 | ADD DX,4 ; РЕГИСТР УПРАВЛЕНИЯ МОДЕМОМ 208 | MOV AL,1 ; ПЕРЕВОД DTR В АКТИВНОЕ СОСТОЯНИЕ 209 | OUT DX,AL 210 | INC DX ; РЕГИСТР СОСТОЯНИЯ МОДЕМА 211 | INC DX 212 | A13: ; WAIT_DSR 213 | MOV BH,20H ; ГОТОВНОСТЬ К ПЕРЕДАЧИ ДАННЫХ 214 | CALL WAIT_FOR_STATUS ; 215 | JNZ A8 ; ВОЗВРАТ С ОШИБКОЙ 216 | A15: ; WAIT_DSR_END 217 | DEC DX ; РЕГИСТР СОСТОЯНИЯ ЛИНИИ 218 | A16: ; WAIT_RECV 219 | MOV BH,1 ; ИНДИКАТОР ГОТОВНОСТИ ДАННЫХ В ПРИЕМНИКЕ 220 | CALL WAIT_FOR_STATUS ; 221 | JNZ A8 ; TIME OUT ОШИБКА 222 | A17: ; GET_CHAR 223 | AND AL,00011110B ; ТЕСТ ОШИБОЧНОГО СОСТОЯНИЯ 224 | MOV DX,RS232_BASE[SI] ; ПОРТ ДАННЫХ 225 | IN AL,DX ; ЧТЕНИЕ СИМВОЛА 226 | JMP A3 ; ВЫХОД 227 | 228 | ;----- СТАТУС AH = 3 229 | 230 | A18: 231 | MOV DX,RS232_BASE[SI] 232 | ADD DX,5 ; РЕГИСТР СОСТОЯНИЯ ЛИНИИ 233 | IN AL,DX ; 234 | MOV AH,AL ; ПЕРЕВОД В AH ДЛЯ ВОЗВРАТА 235 | INC DX ; РЕГИСТР СОСТОЯНИЯ МОДЕМА 236 | IN AL,DX ; 237 | JMP A3 ; ВОЗВРАТ 238 | ;---------------------------------------- 239 | ; ОЖИДАНИЕ ДЛЯ ПОЛУЧЕНИЯ СОСТОЯНИЯ : 240 | ; : 241 | ; ВХОД : : 242 | ; BH=МАСКА : 243 | ; DX=АДРЕС РЕГИСТРА СТАТУСА : 244 | ; ВЫХОД: : 245 | ; ZF УСТАНОВЛЕН = ВРЕМЯ ВЫШЛО : 246 | ; AH=СТАТУС : 247 | ;---------------------------------------- 248 | WAIT_FOR_STATUS PROC NEAR 249 | MOV BL,RS232_TIM_OUT[DI] ; ЧТЕНИЕ СЧЕТЧИКА 250 | WFS0: 251 | SUB CX,CX 252 | WFS1: 253 | IN AL,DX ; ПОЛУЧЕНИЕ СТАУСА 254 | MOV AH,AL ; СОХРАНЕНИЕ В AH 255 | AND AL,BH ; ВЫДИЛЕНИЕ БИТОВ ДЛЯ ТЕСТА 256 | CMP AL,BH ; СРАВНЕНИЕ С МАСКОЙ 257 | JE WFS_END ; ВЫХОД С СБРОШЕННЫМ ZF 258 | LOOP WFS1 ; ПОВТОРИТЬ СНОВА 259 | DEC BL 260 | JNZ WFS0 261 | 262 | OR BH,BH ; УСТАНОВИТЬ ZF 263 | WFS_END: 264 | RET 265 | WAIT_FOR_STATUS ENDP 266 | RS232_IO ENDP 267 | 268 | ;F3D DB 'ERROR. (RESUME = F1 KEY)',13,10 ; ERROR PROMPT 269 | 270 |  --------------------------------------------------------------------------------