ЕС-1841. Листинг BIOS

Материал из Emuverse
Версия от 10:37, 22 декабря 2015; Panther (обсуждение | вклад) (Новая страница: «{{ДИ|Источник=http://zx-pk.ru/showthread.php?t=9276&p=511425&viewfull=1#post511425}} <pre> �� Microsoft MACRO Assembler Version 3.00…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Источник: http://zx-pk.ru/showthread.php?t=9276&p=511425&viewfull=1#post511425

  �� Microsoft MACRO Assembler  Version 3.00               	Page	1-1
	 	 	 	 	 	 	 	09-15-88    


1	 	 	 	 	
5	 	 	 	 	
6	                ;___________________	 	 	 	
7	 	 	 	 	; 8/04/1986 новая клавиатура
8	 	 	 	 	 PAGE 55,120
9	 	 	 	 	;  БАЗОВАЯ СИСТЕМА ВВОДА/ВЫВОДА (БСУВВ)
10	 	 	 	 	;___________________
11	 = 0060	 	 	 	port_a	equ	60h
12	 = F000	 	 	 	cod	equ	0f000h
13	 = 0040	 	 	 	dat	equ	0040h
14	 = 0030	 	 	 	sta	equ	0030h
15	 = 0050	 	 	 	xxdat	equ	0050h
16	 = B800	 	 	 	video_ra equ	0b800h
17	 = 0061	 	 	 	port_b	equ	61h
18	 = 0062	 	 	 	port_c	equ	62h
19	 = 0063	 	 	 	cmd_port equ	63h
20	 = 0020	 	 	 	inta00	equ	20h
21	 = 0021	 	 	 	inta01	equ	21h
22	 = 0020	 	 	 	eoi	equ	20h
23	 = 0040	 	 	 	timer	equ	40h
24	 = 0043	 	 	 	tim_ctl equ	43h
25	 = 0040	 	 	 	timero	equ	40h
26	 = 0001	 	 	 	tmint	equ	01
27	 = 0008	 	 	 	dma08	equ	08
28	 = 0000	 	 	 	dma	equ	00
29	 = 0540	 	 	 	max_period equ	540h
30	 = 0410	 	 	 	min_period equ	410h
31	 = 0060	 	 	 	kbd_in	equ	60h
32	 = 0002	 	 	 	kbdint	equ	02
33	 = 0060	 	 	 	kb_dat	equ	60h
34	 = 0061	 	 	 	kb_ctl	equ	61h
35	 	 	 	 	;_______________
36	 	 	 	 	;  Расположение прерываний 8086
37	 	 	 	 	;_________________________
38	 0000	 	 	 	abs0	segment para
39	 0000	 	 	 	zb	label	byte
40	 0000	 	 	 	zw	label	word
41	 0000	 	 	 	stg_loc0 label	byte
42	 0008	 	 	 	 	org	2*4
43	 0008	 	 	 	nmi_ptr label	word
44	 0014	 	 	 	 	org	5*4
45	 0014	 	 	 	int5_ptr label	word
46	 0020	 	 	 	 	org	8*4
47	 0020	 	 	 	int_addr label	word
48	 0020	 	 	 	int_ptr label	dword
49	 0034	 	 	 	 	org	0dh*4
50	 0034	 	 	 	hdisk_int  label  dword
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-2
	 	 	 	 	 	 	 	09-15-88    


51	 0040	 	 	 	 	org	10h*4
52	 0040	 	 	 	video_int label word
53	 004C	 	 	 	 	org	13h*4
54	 004C	 	 	 	org_vector  label  dword
55	 0064	 	 	 	 	org	19h*4
56	 0064	 	 	 	boot_vec  label  dword
57	 0074	 	 	 	 	org	1dh*4
58	 0074	 	 	 	parm_ptr label	dword
59	 0078	 	 	 	 	org	01eh*4
60	 0078	 	 	 	disk_pointer label dword
61	 0078	 	 	 	diskette_parm  label  dword
62	 007C	 	 	 	 	org	01fh*4
63	 007C	 	 	 	ext_ptr label	dword
64	 0100	 	 	 	 	org	040h*4
65	 0100	 	 	 	disk_vector  label  dword
66	 0104	 	 	 	 	org	041h*4
67	 	 	 	 	
68	 0104	 	 	 	hf_tbl_vec  label  dword
69	 0410	 	 	 	 	org	410h
70	 0410	 	 	 	eq_fl	label	byte
71	 	 	 	 	
72	 0413	 	 	 	 	org	413h
73	 0413	 	 	 	mem_siz label	word
74	 0472	 	 	 	 	org	472h
75	 0472	 	 	 	res_fl	label	word
76	 04D0	 	 	 	 	org	4d0h
77	 04D0	 	 	 	csi	label	word
78	 04E0	 	 	 	 	org	4e0h
79	 04E0	 	 	 	tabl1	label	word
80	 7C00	 	 	 	 	org	7c00h
81	 7C00	 	 	 	boot_locn label far
82	 7C00	 	 	 	abs0	ends
83	 	 	 	 	
84	 	 	 	 	;______________________
85	 	 	 	 	;  Использование стека только во время инициализации
86	 	 	 	 	;______________________
87	 0000	 	 	 	stac	segment para stack
88	 0000     80 [	 	 	 	dw	128 dup(?)
89	                ????	 	
90	                      ]	 	
91	 	 	 	 	
92	 0100	 	 	 	tos	label	word
93	 0100	 	 	 	stac	ends
94	 	 	 	 	
95	 	 	 	 	;______________________
96	 	 	 	 	;  Область данных ПЗУ
97	 	 	 	 	;____________________
98	 0000	 	 	 	data segment	para
99	 0000     04 [	 	 	rs232_base dw 4 dup(?)
100	                ????	 	
101	                      ]	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-3
	 	 	 	 	 	 	 	09-15-88    


102	 	 	 	 	
103	 0008     04 [	 	 	printer_base dw 4 dup(?)
104	                ????	 	
105	                      ]	 	
106	 	 	 	 	
107	 0010  ????	 	 	equip_flag dw ?
108	 0012  ??	 	 	mfg_tst db	?
109	 0013  ????	 	 	memory_size dw	?
110	 0015  ????	 	 	io_ram_size dw	?
111	 	 	 	 	;_______________
112	 	 	 	 	;  Область данных клавиатуры
113	 	 	 	 	;_________________
114	 0017  ??	 	 	kb_flag db	?
115	 	 	 	 	
116	 	 	 	 	;  Размещение флажков в kb_flag
117	 	 	 	 	
118	 = 0080	 	 	 	ins_state equ	80h
119	 = 0040	 	 	 	caps_state equ	40h
120	 = 0020	 	 	 	num_state equ	20h
121	 = 0010	 	 	 	scroll_state equ 10h
122	 = 0008	 	 	 	alt_shift equ	08h
123	 = 0004	 	 	 	ctl_shift equ	04h
124	 = 0002	 	 	 	left_shift equ	02h
125	 = 0001	 	 	 	right_shift equ 01h
126	 	 	 	 	
127	 0018  ??	 	 	kb_flag_1 db	?
128	 	 	 	 	
129	 = 0080	 	 	 	ins_shift equ	80h
130	 = 0040	 	 	 	caps_shift equ	40h
131	 = 0020	 	 	 	num_shift equ	20h
132	 = 0010	 	 	 	scroll_shift equ 10h
133	 = 0008	 	 	 	hold_state equ	08h
134	 = 0004	 	 	 	inv_shift equ	04h
135	 = 0002	 	 	 	lat	 	equ	02h
136	 = 0001	 	 	 	lat_shift	equ	01h
137	 	 	 	 	
138	 	 	 	 	
139	 	 	 	 	
140	 0019  ??	 	 	alt_input db	?
141	 001A  ????	 	 	buffer_head dw	?
142	 001C  ????	 	 	buffer_tail dw	?
143	 001E     10 [	 	 	kb_buffer dw	16 dup(?)
144	                ????	 	
145	                      ]	 	
146	 	 	 	 	
147	 003E	 	 	 	kb_buffer_end label word
148	 	 	 	 	
149	 	 	 	 	;  head=tail указывает на заполнение буфера
150	 	 	 	 	
151	 = 0045	 	 	 	num_key equ	69
152	 = 0046	 	 	 	scroll_key equ	70
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-4
	 	 	 	 	 	 	 	09-15-88    


153	 = 0038	 	 	 	alt_key equ	56
154	 = 001D	 	 	 	ctl_key equ	29
155	 = 0056	 	 	 	caps_key equ	86
156	 = 0054	 	 	 	left_key equ	84
157	 = 0055	 	 	 	right_key equ	85
158	 = 0052	 	 	 	ins_key equ	82
159	 = 0053	 	 	 	del_key equ	83
160	 = 0059	 	 	 	inf_key   equ	89
161	 = 0058	 	 	 	inv_key_l  equ	88
162	 = 005A	 	 	 	inv_key_r equ	90
163	 = 005B	 	 	 	rus_key    equ	91
164	 = 0057	 	 	 	lat_key equ	87
165	 	 	 	 	
166	 	 	 	 	;____________________
167	 	 	 	 	;  Область данных НГМД
168	 	 	 	 	;____________________
169	 003E  ??	 	 	seek_status db	?
170	 	 	 	 	;
171	 	 	 	 	;
172	 = 0080	 	 	 	int_flag equ	080h
173	 003F  ??	 	 	motor_status db ?
174	 	 	 	 	;
175	 	 	 	 	;
176	 0040  ??	 	 	motor_count db	?
177	 = 0025	 	 	 	motor_wait equ	37
178	 	 	 	 	
179	 	 	 	 	;
180	 0041  ??	 	 	diskette_status db ?
181	 = 0080	 	 	 	time_out equ	80h
182	 = 0040	 	 	 	bad_seek equ	40h
183	 = 0020	 	 	 	bad_nec  equ	20h
184	 = 0010	 	 	 	bad_crc  equ	10h
185	 = 0009	 	 	 	dma_boundary equ 09h
186	 = 0008	 	 	 	bad_dma  equ	08h
187	 = 0004	 	 	 	record_not_fnd equ 04h
188	 = 0003	 	 	 	write_protect equ 03h
189	 = 0002	 	 	 	bad_addr_mark equ 02h
190	 = 0001	 	 	 	bad_cmd equ	01h
191	 	 	 	 	
192	 0042	 	 	 	cmd_block  label  byte
193	 0042	 	 	 	hd_error  label  byte
194	 0042     07 [	 	 	nec_status db	7 dup(?)
195	                ??	 	
196	                    ]	 	
197	 	 	 	 	
198	 	 	 	 	
199	 	 	 	 	;_____________________
200	 	 	 	 	;  Область данных ЭЛИ
201	 	 	 	 	;_____________________
202	 0049  ??	 	 	crt_mode db	?
203	 004A  ????	 	 	crt_cols dw	?
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-5
	 	 	 	 	 	 	 	09-15-88    


204	 004C  ????	 	 	crt_len  dw	?
205	 004E  ????	 	 	crt_start dw	?
206	 0050     08 [	 	 	cursor_posn dw	8 dup(?)
207	                ????	 	
208	                      ]	 	
209	 	 	 	 	
210	 0060  ????	 	 	cursor_mode dw	?
211	 0062  ??	 	 	active_page db	?
212	 0063  ????	 	 	addr_6845 dw	?
213	 0065  ??	 	 	crt_mode_set db ?
214	 0066  ??	 	 	crt_pallette db ?
215	 	 	 	 	
216	 	 	 	 	;___________________
217	 	 	 	 	;  Область данных НМД
218	 	 	 	 	;___________________
219	 0067  ????	 	 	io_rom_init dw	?
220	 0069  ????	 	 	io_rom_seg dw	?
221	 006B  ??	 	 	last_val db	?
222	 	 	 	 	
223	 	 	 	 	;___________________
224	 	 	 	 	;  Область данных таймера
225	 	 	 	 	;___________________
226	 006C  ????	 	 	timer_low dw	?
227	 006E  ????	 	 	timer_high dw	?
228	 0070  ??	 	 	timer_ofl db	?
229	 	 	 	 	;counts_sec equ 18
230	 	 	 	 	;counts_min equ 1092
231	 	 	 	 	;counts_hour equ 65543
232	 	 	 	 	;counts_day equ 1573040 = 1800b0h
233	 	 	 	 	
234	 	 	 	 	;___________________
235	 	 	 	 	;  Область данных системы
236	 	 	 	 	;___________________
237	 0071  ??	 	 	bios_break db	?
238	 0072  ????	 	 	reset_flag dw	?
239	 0074  ??	 	 	diskw_status  db  ?
240	 0075  ??	 	 	hf_num	db   ?
241	 0076  ??	 	 	control_byte  db  ?
242	 0077  ??	 	 	port_off  db  ?
243	 007C	 	 	 	 	 	org	7ch
244	 007C	 	 	 	stat_offset	label	byte ; смещение для хранения состояний модема
245	 	 	 	 	
246	 0080	 	 	 	 	org	80h
247	 0080  ????	 	 	buffer_start	dw	?
248	 0082  ????	 	 	buffer_end	dw	?
249	 0090	 	 	 	 	org	0090h
250	 0090  ????	 	 	idnpol	dw	?
251	 00E0	 	 	 	 	org	0e0h
252	 00E0	 	 	 	tabl	label	word
253	 	 	 	 	;
254	 00E0	 	 	 	data	ends
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-6
	 	 	 	 	 	 	 	09-15-88    


255	 	 	 	 	
256	 	 	 	 	;___________________
257	 	 	 	 	;  Область расширения данных
258	 	 	 	 	;_________________________________
259	 0000	 	 	 	xxdata segment	para
260	 0000  ??	 	 	status_byte db	?
261	 0001	 	 	 	xxdata	ends
262	 	 	 	 	
263	 	 	 	 	;_________________
264	 	 	 	 	;  Буфер ЭЛИ
265	 	 	 	 	;___________________
266	 0000	 	 	 	video_ram segment para
267	 0000	 	 	 	regen	label	byte
268	 0000	 	 	 	regenw	label	word
269	 0000  4000 [	 	 	 	db	16384 dup(?)
270	                ??	 	
271	                    ]	 	
272	 	 	 	 	
273	 4000	 	 	 	video_ram ends
274	 	 	 	 	;____________________
275	 	 	 	 	;  Основной массив в ПЗУ (сегмент code)
276	 	 	 	 	;____________________
277	 	 	 	 	;***************  INT 13  *****************************************
278	 	 	 	 	;******************************************************************
279	 	 	 	 	;
280	 	 	 	 	;
281	 	 	 	 	;    Программа обслуживания накопителя на магнитном диске
282	 	 	 	 	;
283	 	 	 	 	;
284	 	 	 	 	;	ВВОД
285	 	 	 	 	;	 	(АН-шестнадцатеричное значение)
286	 	 	 	 	;    (АН=00) - сброс НМД (DL=80H,81H)/НГМД
287	 	 	 	 	;	(АН=01) считывание состояния последней операции диска в (AL)
288	 	 	 	 	;	 	  Замечание: DL<80Н-НГМД,DL>80Н-НМД
289	 	 	 	 	;	(АН=02) считывание указанных секторов в память
290	 	 	 	 	;	(АН=03) запись указанных секторов из памяти
291	 	 	 	 	;	(АН=04) проверка указанных секторов
292	 	 	 	 	;	(АН=05) форматизация указанной дорожки
293	 	 	 	 	;	(АН=06) форматизация указанной дорожки
294	 	 	 	 	;	 	неверного сектора
295	 	 	 	 	;	(АН=07) форматизация устройства,начиная с указанной дорожки
296	 	 	 	 	;	(АН=08) возврат текущих параметров устройства
297	 	 	 	 	;	(АН=09) инициализация характеристик устройства
298	 	 	 	 	;	 	Прерывание 41H указывает на блок данных
299	 	 	 	 	;	(АН=0А) длинное считывание
300	 	 	 	 	;	(АН=0В) длинная запись
301	 	 	 	 	;	 	Замечание:длинные считывание и запись включают 512 байт +
302	 	 	 	 	;	 	4 байта ЕСС
303	 	 	 	 	;	(АН=0С) установка
304	 	 	 	 	;	(АН=0D) селективный сброс диска
305	 	 	 	 	;	(АН=0Е) считать буфер сектора
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-7
	 	 	 	 	 	 	 	09-15-88    


306	 	 	 	 	;	(АН=0F) записать буфера сектора
307	 	 	 	 	;	(АН=10) проверить готовность устройства
308	 	 	 	 	;	(АН=11) рекалибровать
309	 	 	 	 	;	(АН=12) диагностика памяти контроллера
310	 	 	 	 	;	(АН=13) диагностика устройства
311	 	 	 	 	;	(АН=14) внутренняя диагностика контроллера
312	 	 	 	 	;
313	 	 	 	 	;
314	 	 	 	 	;	Регистры,используемые для операций НМД
315	 	 	 	 	;
316	 	 	 	 	;	(DL) -номер устройства (80Н-87Н для диска,контр.значение)
317	 	 	 	 	;	(DH) -номер головки (разрешается 0-7,не контр.значение)
318	 	 	 	 	;	(СН) -номер цилиндра (0-1023,не контролируемое значение)
319	 	 	 	 	;	(СL) -номер сектора (1-17,не контролируемое значение)
320	 	 	 	 	;	 	Замечание:старшие 2 бита номера цилиндра размещены
321	 	 	 	 	;	 	в двух старших битах регистра CL (всего 10 бит)
322	 	 	 	 	;	(АL) -число секторов (максимально возможное число 1-80Н,
323	 	 	 	 	;	      для длинного считывания/записи 1-79H)
324	 	 	 	 	;	(значение чередования для форматизации 1-16D)
325	 	 	 	 	;	(ES:BX)-адрес буфера для бит номера цилиндра
326	 	 	 	 	;	 	(не требуется для проверки)
327	 	 	 	 	;
328	 	 	 	 	;
329	 	 	 	 	;	ВЫВОД
330	 	 	 	 	;	АН-состояние текущей операции
331	 	 	 	 	;	   CF=0 -успешная операция (АН=0 при возврате)
332	 	 	 	 	;	   CF=1 -неверная операция (АН содержит ошибку)
333	 	 	 	 	;
334	 	 	 	 	;	Замечание:ошибка 11Н показывает,что считанные данные имеют
335	 	 	 	 	;	 	  исправляемую ошибку,которая была скорректирована
336	 	 	 	 	;	 	  алгоритмом ЕСС.Ошибка может не повторяться,если
337	 	 	 	 	;	 	  данные перезаписаны.(АL) содержит длину пакета.
338	 	 	 	 	;
339	 	 	 	 	;	Если были затребованы параметры устройства:
340	 	 	 	 	;
341	 	 	 	 	;	DL -количество подключенных устройств(0-2)
342	 	 	 	 	;	DH -максимальное используемое значение для номера головки
343	 	 	 	 	;	СН -максимальное используемое значение для номера цилиндра
344	 	 	 	 	;	CL -максимальное используемое значение для номера сектора и
345	 	 	 	 	;	    старших бит номера цилиндра
346	 	 	 	 	;
347	 	 	 	 	;	Замечание:если ошибка имеет место в коде диска,то диск
348	 	 	 	 	;	 	  сбрасывается,и операция повторяется
349	 	 	 	 	;
350	 	 	 	 	;
351	 0000	 	 	 	code segment para
352	 	 	 	 	;
353	 = 00FF	 	 	 	sense_fail	equ	0ffh	  ;
354	 = 00BB	 	 	 	undef_err	equ	0bbh
355	 = 0080	 	 	 	time_out	equ	80h
356	 = 0040	 	 	 	bad_seek	equ	40h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-8
	 	 	 	 	 	 	 	09-15-88    


357	 = 0020	 	 	 	bad_cntlr	equ	20h
358	 = 0011	 	 	 	data_corrected	equ	11h
359	 = 0010	 	 	 	bad_ecc 	equ	10h
360	 = 000B	 	 	 	bad_track	equ	0bh
361	 = 0009	 	 	 	dma_boundary	equ	09h
362	 = 0007	 	 	 	init_fail	equ	07h
363	 = 0005	 	 	 	bad_reset	equ	05h
364	 = 0004	 	 	 	record_not_fnd	equ	04h
365	 = 0002	 	 	 	bad_addr_mark	equ	02h
366	 = 0001	 	 	 	bad_cmd 	equ	01h
367	 	 	 	 	;
368	 	 	 	 	;-------Порт контроллера в/в-------------------------------------
369	 	 	 	 	;
370	 	 	 	 	;	 	-считывание из порта:
371	 	 	 	 	;	HF_PORT+0 -считывание данных(из контроллера в CPU)
372	 	 	 	 	;	HF_PORT+1 -считывание состояния оборудования контроллера
373	 	 	 	 	;	HF_PORT+2 -считывание конфигурации переключателей
374	 	 	 	 	;	HF_PORT+3 -не используется
375	 	 	 	 	;
376	 	 	 	 	;	 	-запись в порт:
377	 	 	 	 	;	HF_PORT+0 -запись данных (из CPU в контроллер)
378	 	 	 	 	;	HF_PORT+1 -сброс контроллера
379	 	 	 	 	;	HF_PORT+2 -выработка такта выборки контроллера
380	 	 	 	 	;	HF_PORT+3 -запись в регистр маски ПДП/прерывания
381	 	 	 	 	;
382	 	 	 	 	;----------------------------------------------------------------
383	 	 	 	 	
384	 	 	 	 	;
385	 	 	 	 	;
386	 	 	 	 	
387	 = 0320	 	 	 	hf_port 	equ	0320h	    ; порт НМД
388	 = 0008	 	 	 	r1_busy 	equ	00001000b   ; бит занятости порта 1 диска
389	 = 0004	 	 	 	r1_bus	 	equ	00000100b   ; бит команда/данные порта 1 диска
390	 = 0002	 	 	 	r1_iomode	equ	00000010b   ; бит режима порта 1 диска
391	 = 0001	 	 	 	r1_req	 	equ	00000001b   ; бит запроса порта 1 диска
392	 	 	 	 	
393	 = 0047	 	 	 	dma_read	equ	01000111b   ; 3 канал ПДП (при считывании-047Н)
394	 = 004B	 	 	 	dma_write	equ	01001011b   ; 3 канал ПДП (при записи-04ВН)
395	 = 0000	 	 	 	dma	 	equ	0	    ; адрес ПДП
396	 = 0082	 	 	 	dma_high	equ	082h	    ; порт для старших 4бит ПДП
397	 	 	 	 	
398	 = 0000	 	 	 	tst_rdy_cmd	equ	00000000b
399	 = 0001	 	 	 	recal_cmd	equ	00000001b
400	 = 0003	 	 	 	sense_cmd	equ	00000011b
401	 = 0004	 	 	 	fmtdrv_cmd	equ	00000100b
402	 = 0005	 	 	 	chk_trk_cmd	equ	00000101b
403	 = 0006	 	 	 	fmttrk_cmd	equ	00000110b
404	 = 0007	 	 	 	fmtbad_cmd	equ	00000111b
405	 = 0008	 	 	 	read_cmd	equ	00001000b
406	 = 000A	 	 	 	write_cmd	equ	00001010b
407	 = 000B	 	 	 	seek_cmd	equ	00001011b
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-9
	 	 	 	 	 	 	 	09-15-88    


408	 = 000C	 	 	 	init_drv_cmd	equ	00001100b
409	 = 000D	 	 	 	rd_ecc_cmd	equ	00001101b
410	 = 000E	 	 	 	rd_buff_cmd	equ	00001110b
411	 = 000F	 	 	 	wr_buff_cmd	equ	00001111b
412	 = 00E0	 	 	 	ram_diag_cmd	equ	11100000b
413	 = 00E3	 	 	 	chk_drv_cmd	equ	11100011b
414	 = 00E4	 	 	 	cntlr_diag_cmd	equ	11100100b
415	 = 00E5	 	 	 	rd_long_cmd	equ	11100101b
416	 = 00E6	 	 	 	wr_long_cmd	equ	11100110b
417	 	 	 	 	
418	 = 0020	 	 	 	int_ctl_port	equ	20h
419	 = 0020	 	 	 	eoi	 	equ	20h
420	 	 	 	 	
421	 = 0008	 	 	 	max_file	equ	8
422	 = 0002	 	 	 	s_max_file	equ	2
423	 	 	 	 	
424	 	 	 	 	 	assume	cs:code
425	 C000	 	 	 	 	org	0c000h
426	 	 	 	 	
427	 C000  55	 	 	 	db	055h
428	 C001  AA	 	 	 	db	0aah
429	 C002  10	 	 	 	db	16d
430	 	 	 	 	
431	 	 	 	 	;----------------------------------------------------------------
432	 	 	 	 	;      ТЕСТ НМД
433	 	 	 	 	;
434	 	 	 	 	;	-установка векторов для НМД
435	 	 	 	 	;	-выполнение диагностики по включению электропитания должно
436	 	 	 	 	;	 отображать информацию об ошибках '1701' на дисплее
437	 	 	 	 	;
438	 	 	 	 	;
439	 	 	 	 	;---------------------------------------------------------------
440	 	 	 	 	
441	 C003	 	 	 	disk_setup	proc	near
442	 C003  EB 1E	 	 	 	jmp	short	l3
443	 	 	 	 	
444	 C005  20 B1 B0 B7 BE B2	 	db	' БАЗОВАЯ СИСТЕМА ВВОДА/ВЫВОДА '
445	       B0 CF 20 C1 B8 C1	
446	       C2 B5 BC B0 20 B2	
447	       B2 BE B4 B0 2F B2	
448	       CB B2 BE B4 B0 20	
449	 	 	 	 	
450	 C023	 	 	 	l3:
451	 	 	 	 	 	assume	ds:abs0
452	 C023  2B C0	 	 	 	sub	ax,ax
453	 C025  8E D8	 	 	 	mov	ds,ax	 	    ; установка сегмента DUMMY (0)
454	 C027  FA	 	 	 	cli	 	; сброс признака разрешения прерывания
455	 C028  A1 004C R	 	 	mov	ax,word ptr org_vector	; установка вектора НГМД
456	 C02B  A3 0100 R	 	 	mov	word ptr disk_vector,ax ;     в прерывание 40Н
457	 C02E  A1 004E R	 	 	mov	ax,word ptr org_vector+2
458	 C031  A3 0102 R	 	 	mov	word ptr disk_vector+2,ax
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-10
	 	 	 	 	 	 	 	09-15-88    


459	 C034  C7 06 004C R C256 R	 	mov	word ptr org_vector,offset disk_io  ; поддержка
460	 C03A  8C 0E 004E R	 	 	mov	word ptr org_vector+2,cs   ; НМД
461	 	 	 	 	
462	 C03E  B8 C760 R	 	 	mov	ax,offset hd_int
463	 C041  A3 0034 R	 	 	mov	word ptr hdisk_int,ax  ; прерывание НМД
464	 C044  8C 0E 0036 R	 	 	mov	word ptr hdisk_int+2,cs
465	 C048  C7 06 0064 R C186 R	 	mov	word ptr boot_vec,offset boot_strapt ; загрузка
466	 C04E  8C 0E 0066 R	 	 	mov	word ptr boot_vec+2,cs
467	 C052  C7 06 0104 R C3E7 R	 	mov	word ptr hf_tbl_vec,offset fd_tbl ; таблица параметров
468	 C058  8C 0E 0106 R	 	 	mov	word ptr hf_tbl_vec+2,cs
469	 C05C  FB	 	 	 	sti	; установить признак разрешения прерывания
470	 	 	 	 	
471	 	 	 	 	 	assume	ds:data
472	 C05D  B8 0040	 	 	 	mov	ax,dat
473	 C060  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента DATA
474	 C062  C6 06 0074 R 00	 	 	mov	diskw_status,0	; сброс индикации состояния
475	 C067  C6 06 0075 R 00	 	 	mov	hf_num,0	; нулевое число устройств
476	 C06C  C6 06 0043 R 00	 	 	mov	cmd_block+1,0	; нулевое устройство,установить
477	 	 	 	 	 	 	 	 	; значение в блоке команд
478	 C071  C6 06 0077 R 00	 	 	mov	port_off,0	; нулевое смещение порта
479	 	 	 	 	
480	 C076  B9 0025	 	 	 	mov	cx,25h	 	; число повторений
481	 C079	 	 	 	l4:
482	 C079  E8 C16E R	 	 	call	hd_reset_1	; сброс контроллера
483	 C07C  73 05	 	 	 	jnc	l7
484	 C07E  E2 F9	 	 	 	loop	l4	; повторный сброс,счетчик повторений = 25Н
485	 C080  E9 C142 R	 	 	jmp	error_ex
486	 C083	 	 	 	l7:
487	 C083  B9 0001	 	 	 	mov	cx,1
488	 C086  BA 0080	 	 	 	mov	dx,80h
489	 	 	 	 	
490	 C089  B8 1200	 	 	 	mov	ax,1200h	; диагностика памяти контроллера
491	 C08C  CD 13	 	 	 	int	13h
492	 C08E  73 03	 	 	 	jnc	p7t
493	 C090  E9 C142 R	 	 	jmp	error_ex
494	 C093	 	 	 	p7t:
495	 C093  B8 1400	 	 	 	mov	ax,1400h	; внутренняя диагностика контроллера
496	 C096  CD 13	 	 	 	int	13h
497	 C098  73 03	 	 	 	jnc	p9t
498	 C09A  E9 C142 R	 	 	jmp	error_ex
499	 C09D	 	 	 	p9t:
500	 C09D  C7 06 006C R 0000	 	mov	timer_low,0	; обнуление таймера
501	 C0A3  A1 0072 R	 	 	mov	ax,reset_flag
502	 C0A6  3D 1234	 	 	 	cmp	ax,1234h	; сброс клавиатуры?
503	 C0A9  75 06	 	 	 	jne	p8t
504	 C0AB  C7 06 006C R 019A	 	mov	timer_low,410d
505	 C0B1	 	 	 	p8t:
506	 C0B1  E4 21	 	 	 	in	al,021h
507	 C0B3  24 FE	 	 	 	and	al,0feh 	; таймер доступен
508	 C0B5  E6 21	 	 	 	out	021h,al 	; запуск таймера
509	 C0B7	 	 	 	p4t:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-11
	 	 	 	 	 	 	 	09-15-88    


510	 C0B7  E8 C16E R	 	 	call	hd_reset_1	; сброс контроллера
511	 C0BA  72 07	 	 	 	jc	p10t
512	 C0BC  B8 1000	 	 	 	mov	ax,1000h	; проверить готовность устройства
513	 C0BF  CD 13	 	 	 	int	13h
514	 C0C1  73 0B	 	 	 	jnc	p2t
515	 C0C3	 	 	 	p10t:
516	 C0C3  A1 006C R	 	 	mov	ax,timer_low
517	 C0C6  3D 01BE	 	 	 	cmp	ax,446d 	; 25 секунд
518	 C0C9  72 EC	 	 	 	jb	p4t
519	 C0CB  EB 75 90	 	 	 	jmp	error_ex
520	 C0CE	 	 	 	p2t:
521	 C0CE  B9 0001	 	 	 	mov	cx,1
522	 C0D1  BA 0080	 	 	 	mov	dx,80h	 	; DL=80Н - НМД 0
523	 C0D4  B8 0900	 	 	 	mov	ax,0900h	; установка параметров у-ва
524	 C0D7  CD 13	 	 	 	int	13h
525	 C0D9  72 67	 	 	 	jc	error_ex
526	 	 	 	 	
527	 C0DB  B8 1100	 	 	 	mov	ax,1100h	; рекалибровка
528	 C0DE  CD 13	 	 	 	int	13h
529	 C0E0  72 60	 	 	 	jc	error_ex
530	 	 	 	 	
531	 C0E2  B8 FC00	 	 	 	mov	ax,0fc00h
532	 C0E5  8E C0	 	 	 	mov	es,ax	 	; установка сегмента ES=FC00
533	 C0E7  2B DB	 	 	 	sub	bx,bx	 	; смещение (ВХ) равно 0
534	 C0E9  B8 0F00	 	 	 	mov	ax,0f00h	; запись буфера сектора (АН=0F)
535	 C0EC  CD 13	 	 	 	int	13h
536	 	 	 	 	
537	 C0EE  72 52	 	 	 	jc	error_ex
538	 	 	 	 	
539	 C0F0  FE 06 0075 R	 	 	inc	hf_num	 	; нулевое устройство опрошено
540	 	 	 	 	
541	 C0F4  BA 0213	 	 	 	mov	dx,213h 	; блок расширения
542	 C0F7  B0 00	 	 	 	mov	al,0
543	 C0F9  EE	 	 	 	out	dx,al	 	; отключение блока расширения
544	 C0FA  BA 0321	 	 	 	mov	dx,321h 	; считывание состояния оборудования
545	 	 	 	 	 	 	 	 	; контроллера.Находится ли контроллер
546	 	 	 	 	 	 	 	 	; в системном блоке?
547	 C0FD  EC	 	 	 	in	al,dx
548	 C0FE  24 0F	 	 	 	and	al,0fh	 	; выделение 4-х младших бит
549	 C100  3C 0F	 	 	 	cmp	al,0fh
550	 C102  74 06	 	 	 	je	box_on
551	 C104  C7 06 006C R 01A4	 	mov	timer_low,420d	; контроллер в системном блоке
552	 C10A	 	 	 	box_on:
553	 C10A  BA 0213	 	 	 	mov	dx,213h 	; блок расширения
554	 C10D  B0 FF	 	 	 	mov	al,0ffh
555	 C10F  EE	 	 	 	out	dx,al	 	; включение блока расширения
556	 	 	 	 	
557	 C110  B9 0001	 	 	 	mov	cx,1
558	 C113  BA 0081	 	 	 	mov	dx,081h 	; DL=81 - НМД 1
559	 C116	 	 	 	p3t:
560	 C116  2B C0	 	 	 	sub	ax,ax	 	; сброс диска (АН=00)
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-12
	 	 	 	 	 	 	 	09-15-88    


561	 C118  CD 13	 	 	 	int	13h
562	 C11A  72 40	 	 	 	jc	pod_done
563	 C11C  B8 1100	 	 	 	mov	ax,01100h	; рекалибровка (АН=11)
564	 C11F  CD 13	 	 	 	int	13h
565	 C121  73 0B	 	 	 	jnc	p5t
566	 C123  A1 006C R	 	 	mov	ax,timer_low
567	 C126  3D 01BE	 	 	 	cmp	ax,446d 	; 25 секунд
568	 C129  72 EB	 	 	 	jb	p3t
569	 C12B  EB 2F 90	 	 	 	jmp	pod_done
570	 C12E	 	 	 	p5t:
571	 C12E  B8 0900	 	 	 	mov	ax,0900h	; инициализация характеристик устройства
572	 C131  CD 13	 	 	 	int	13h
573	 C133  72 27	 	 	 	jc	pod_done
574	 C135  FE 06 0075 R	 	 	inc	hf_num	 	; увеличение числа устройств
575	 C139  81 FA 0081	 	 	cmp	dx,[80h + s_max_file - 1]
576	 C13D  73 1D	 	 	 	jae	pod_done
577	 C13F  42	 	 	 	inc	dx	 	; увеличение номера устройства
578	 C140  EB D4	 	 	 	jmp	p3t
579	 	 	 	 	
580	 	 	 	 	;------Ошибки POD
581	 	 	 	 	
582	 C142	 	 	 	error_ex:
583	 C142  BD 000F	 	 	 	mov	bp,0fh	 	; флажки ошибок POD
584	 C145  2B C0	 	 	 	sub	ax,ax
585	 C147  8B F0	 	 	 	mov	si,ax	 	; счетчик равен 0
586	 C149  B9 0006 90	 	 	mov	cx,f17tl	; сообщение числа символов (6 байт)
587	 C14D  B7 00	 	 	 	mov	bh,0	 	; обнуление страницы
588	 C14F	 	 	 	out_ch:
589	 C14F  2E: 8A 84 C168 R	 	 	mov	al,cs:f17t[si]	; получение байта
590	 C154  B4 0E	 	 	 	mov	ah,14d	 	; ЭЛИ
591	 C156  CD 10	 	 	 	int	10h	 	; отображение символа
592	 C158  46	 	 	 	inc	si	 	; следующий символ
593	 C159  E2 F4	 	 	 	loop	out_ch
594	 C15B  F9	 	 	 	stc	; установка признака переноса
595	 C15C	 	 	 	pod_done:
596	 C15C  FA	 	 	 	cli	; сброс признака разрешения прерывания
597	 C15D  E4 21	 	 	 	in	al,021h
598	 C15F  0C 01	 	 	 	or	al,01h	 	; таймер неработоспособен
599	 C161  E6 21	 	 	 	out	021h,al
600	 C163  FB	 	 	 	sti	; установить признак разрешения прерывания
601	 C164  E8 C20C R	 	 	call	dsbl	 	; сброс маски прерывания
602	 C167  C3	 	 	 	ret
603	 	 	 	 	
604	 C168  31 37 30 31 0D 0A	f17t	db	'1701',0dh,0ah  ;    1701
605	 	 	 	 	
606	 = 0006	 	 	 	f17tl	equ	$-f17t
607	 	 	 	 	
608	 C16E	 	 	 	hd_reset_1	proc	near	; сброс контроллера
609	 C16E  51	 	 	 	push	cx	 	; сохранение регистров
610	 C16F  52	 	 	 	push	dx
611	 C170  F8	 	 	 	clc	 	 	; сброс переноса
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-13
	 	 	 	 	 	 	 	09-15-88    


612	 C171  B9 0100	 	 	 	mov	cx,0100h	; счетчик повторений
613	 C174	 	 	 	l6:
614	 C174  E8 C77E R	 	 	call	port_1
615	 C177  EE	 	 	 	out	dx,al	 	; сброс контроллера
616	 C178  E8 C77E R	 	 	call	port_1
617	 C17B  EC	 	 	 	in	al,dx	 	; считывание состояния
618	 C17C  24 02	 	 	 	and	al,2	 	; проверка сброса бита 1(ввод/вывод)
619	 C17E  74 03	 	 	 	jz	r3t
620	 C180  E2 F2	 	 	 	loop	l6	 	; повторение сброса,счетчик = 100Н
621	 C182  F9	 	 	 	stc	; установить признак переноса при неудачном сбросе
622	 C183	 	 	 	r3t:
623	 C183  5A	 	 	 	pop	dx	 	; восстановление регистров
624	 C184  59	 	 	 	pop	cx
625	 C185  C3	 	 	 	ret
626	 C186	 	 	 	hd_reset_1	endp
627	 	 	 	 	
628	 C186	 	 	 	disk_setup	endp
629	 	 	 	 	
630	 	 	 	 	;-----------INT 19---------------------------------------
631	 	 	 	 	;
632	 	 	 	 	;    Прерывание 19H загрузки системы
633	 	 	 	 	;    -БСУВВ НМД размещает в прерывании 19H вектор
634	 	 	 	 	;     первоначальной загрузки с указателем на эту программу загрузки
635	 	 	 	 	;    -сброс векторов параметров неверного НМД  или НГМД
636	 	 	 	 	;    -программа загрузки будет прочитана из цилиндра 0 сектора 1
637	 	 	 	 	;    -последовательность загрузки:
638	 	 	 	 	;	  -попытка загрузить систему с НГМД в ячейку BOOT_LOCN
639	 	 	 	 	;	   (0000/7C00)
640	 	 	 	 	;	  -если НГМД отсутствует, НМД используется
641	 	 	 	 	;	   как действительный блок загрузки.Действительный блок
642	 	 	 	 	;	   загрузки на НМД содержит байты 055Н 0ААН,
643	 	 	 	 	;	   как последние два байта блока
644	 	 	 	 	;	  -если отсутствуют и НГМД, и НМД, то устанавливается преры-
645	 	 	 	 	;	вание типа INT 18H, которое вызывает выполнение программ
646	 	 	 	 	;	тестирования и инициализации системы
647	 	 	 	 	;----------------------------------------------------------------------
648	 	 	 	 	
649	 C186	 	 	 	boot_strapt:
650	 	 	 	 	 	assume	ds:abs0,es:abs0
651	 C186  2B C0	 	 	 	sub	ax,ax
652	 C188  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента DUMMY (0)
653	 	 	 	 	
654	 	 	 	 	;-----Установка параметров векторов---------------------------
655	 	 	 	 	
656	 C18A  FA	 	 	 	cli	; сброс признака разрешения прерывания
657	 C18B  C7 06 0104 R C3E7 R	 	mov	word ptr hf_tbl_vec,offset fd_tbl
658	 C191  8C 0E 0106 R	 	 	mov	word ptr hf_tbl_vec+2,cs
659	 C195  C7 06 0078 R C201 R	 	mov	word ptr diskette_parm,offset diskette_tbl
660	 C19B  8C 0E 007A R	 	 	mov	word ptr diskette_parm+2,cs
661	 C19F  FB	 	 	 	sti	; установка признака разрешения прерывания
662	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-14
	 	 	 	 	 	 	 	09-15-88    


663	 	 	 	 	;-------Попытка загрузки с НГМД----------------------------------
664	 	 	 	 	
665	 C1A0  B9 0003	 	 	 	mov	cx,3	 	; установить счетчик повторений
666	 C1A3	 	 	 	h1t:
667	 C1A3  51	 	 	 	push	cx	 	; запомнить счетчик повторений
668	 C1A4  2B D2	 	 	 	sub	dx,dx	 	; обнуление номера устройства
669	 C1A6  2B C0	 	 	 	sub	ax,ax	 	; сброс НГМД
670	 C1A8  CD 13	 	 	 	int	13h
671	 C1AA  72 0F	 	 	 	jc	h2t	 	; если ошибка,еще попытка
672	 C1AC  B8 0201	 	 	 	mov	ax,0201h	; считывание одного сектора
673	 	 	 	 	
674	 C1AF  2B D2	 	 	 	sub	dx,dx
675	 C1B1  8E C2	 	 	 	mov	es,dx	 	; установка сегмента
676	 C1B3  BB 7C00 R	 	 	mov	bx,offset boot_locn ; начальный адрес блока загрузки
677	 	 	 	 	
678	 C1B6  B9 0001	 	 	 	mov	cx,1	 	; сектор 1,дорожка 0
679	 C1B9  CD 13	 	 	 	int	13h
680	 C1BB  59	 	 	h2t:	pop	cx	 	; восстановление числа повторений
681	 C1BC  73 0A	 	 	 	jnc	h4t	 	; при неудачном считывании CF=1
682	 C1BE  80 FC 80	 	 	 	cmp	ah,80h	; если time-out,нет повторения
683	 C1C1  74 0A	 	 	 	jz	h5	; попытка загрузки с НГМД
684	 C1C3  E2 DE	 	 	 	loop	h1t	; проделать загрузку с НГМД для нужного
685	 	 	 	 	 	 	 	; числа повторений
686	 C1C5  EB 06 90	 	 	 	jmp	h5	; невозможность загрузки программы с НГМД
687	 C1C8	 	 	 	h4t:	 	 	 	; загрузка была успешной
688	 C1C8  EA 00 7C 00 00	 	 	db	0eah,00h,7ch,0,0   ; JMP     BOOT_LOCN
689	 	 	 	 	
690	 	 	 	 	;-------Попытка загрузки с НГМД---------------------------------------
691	 	 	 	 	
692	 C1CD	 	 	 	h5:
693	 C1CD  2B C0	 	 	 	sub	ax,ax	 	; сброс НГМД (АН=0)
694	 C1CF  2B D2	 	 	 	sub	dx,dx
695	 C1D1  CD 13	 	 	 	int	13h
696	 C1D3  B9 0003	 	 	 	mov	cx,3	 	; установить счетчик повторений
697	 C1D6	 	 	 	h6:	 	 	 	; IPL_SYSTEM
698	 C1D6  51	 	 	 	push	cx	 	; запомнить счетчик повторений
699	 C1D7  BA 0080	 	 	 	mov	dx,0080h	; нулевой НМД
700	 C1DA  2B C0	 	 	 	sub	ax,ax	 	; сброс диска (АН=0)
701	 C1DC  CD 13	 	 	 	int	13h
702	 C1DE  72 12	 	 	 	jc	h7	 	; если ошибка,еще попытка
703	 C1E0  B8 0201	 	 	 	mov	ax,0201h	; считывание одного сектора
704	 C1E3  2B DB	 	 	 	sub	bx,bx
705	 C1E5  8E C3	 	 	 	mov	es,bx	 	; установка сегмента
706	 C1E7  BB 7C00 R	 	 	mov	bx,offset boot_locn ; начальный адрес блока загрузки
707	 C1EA  BA 0080	 	 	 	mov	dx,80h	 	; НМД 0
708	 C1ED  B9 0001	 	 	 	mov	cx,1	 	; сектор 1, дорожка 0
709	 C1F0  CD 13	 	 	 	int	13h
710	 C1F2  59	 	 	h7:	pop	cx	 	; восстановить счетчик повторений
711	 C1F3  72 08	 	 	 	jc	h8
712	 C1F5  A1 7DFE R	 	 	mov	ax,word ptr boot_locn+510d  ; считываются последние
713	 	 	 	 	 	 	 	 	 	    ; 2 байта блока загрузки
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-15
	 	 	 	 	 	 	 	09-15-88    


714	 C1F8  3D AA55	 	 	 	cmp	ax,0aa55h	; тест для генерации BOOT (последние
715	 	 	 	 	 	 	 	 	; 2 байта блока должны быть равны АА55Н)
716	 C1FB  74 CB	 	 	 	jz	h4t	 	; загрузка была успешной
717	 C1FD	 	 	 	h8:
718	 C1FD  E2 D7	 	 	 	loop	h6  ;проделать загрузку для нужного числа повторений
719	 	 	 	 	
720	 	 	 	 	;----Невозможность загрузки с НГМД или с НМД--------------------
721	 	 	 	 	
722	 C1FF  CD 18	 	 	 	int	18h	 	; RESTART
723	 	 	 	 	;-------Таблица параметров НГМД-------------------------------------
724	 C201	 	 	 	diskette_tbl:
725	 C201  CF	 	 	 	db	11001111b	; SRT=C,HD UNLOAD=0F-первый байт
726	 C202  02	 	 	 	db	2	 	; HD LOAD=1,MODE=DMA-второй байт
727	 C203  25	 	 	 	db	25h	 	; ожидание после выключения мотора
728	 C204  02	 	 	 	db	2	 	; 512 байт на сектор
729	 C205  08	 	 	 	db	8	 	; ЕОТ (последний сектор на дорожке)
730	 C206  2A	 	 	 	db	02ah	 	; длина пробела
731	 C207  FF	 	 	 	db	0ffh	 	; DTL
732	 C208  50	 	 	 	db	050h	 	; длина пробела для форматизации
733	 C209  F6	 	 	 	db	0f6h	 	; полный байт для форматизации
734	 C20A  19	 	 	 	db	25	 	; время установки головки (мсек)
735	 C20B  04	 	 	 	db	4	 	; время запуска мотора (1/8 сек)
736	 	 	 	 	
737	 	 	 	 	;
738	 	 	 	 	
739	 C20C	 	 	 	dsbl	proc	near
740	 	 	 	 	 	assume	ds:data
741	 C20C  1E	 	 	 	push	ds	 	; запомнить сегмент
742	 C20D  B8 0040	 	 	 	mov	ax,dat
743	 C210  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента DATA
744	 	 	 	 	
745	 C212  8A 26 0077 R	 	 	mov	ah,port_off
746	 C216  50	 	 	 	push	ax	 	; запомнить смещение порта
747	 	 	 	 	
748	 C217  C6 06 0077 R 00	 	 	mov	port_off,0h	; смещение равно 0Н
749	 C21C  E8 C788 R	 	 	call	port_3	 	; порт 323
750	 C21F  2A C0	 	 	 	sub	al,al
751	 C221  EE	 	 	 	out	dx,al	 	; сброс маски INT/DMA (в порт 323
752	 	 	 	 	 	 	 	 	; записывается нулевой байт)
753	 C222  C6 06 0077 R 04	 	 	mov	port_off,4h	; смещение равно 4Н
754	 C227  E8 C788 R	 	 	call	port_3	 	; порт 327
755	 C22A  2A C0	 	 	 	sub	al,al
756	 C22C  EE	 	 	 	out	dx,al	 	; сброс маски INT/DMA
757	 C22D  C6 06 0077 R 08	 	 	mov	port_off,8h	; смещение равно 8Н
758	 C232  E8 C788 R	 	 	call	port_3	 	; порт 32В
759	 C235  2A C0	 	 	 	sub	al,al
760	 C237  EE	 	 	 	out	dx,al	 	; сброс маски INT/DMA
761	 C238  C6 06 0077 R 0C	 	 	mov	port_off,0ch	; смещение равно 0СН
762	 C23D  E8 C788 R	 	 	call	port_3	 	; порт 32F
763	 C240  2A C0	 	 	 	sub	al,al
764	 C242  EE	 	 	 	out	dx,al	 	; сброс маски INT/DMA
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-16
	 	 	 	 	 	 	 	09-15-88    


765	 C243  B0 07	 	 	 	mov	al,07h
766	 C245  E6 0A	 	 	 	out	dma+10,al	; установить режим ПДП невозможным
767	 C247  FA	 	 	 	cli
768	 C248  E4 21	 	 	 	in	al,021h
769	 C24A  0C 20	 	 	 	or	al,020h
770	 C24C  E6 21	 	 	 	out	021h,al 	; невозможность прерывания 5
771	 C24E  FB	 	 	 	sti	; установить признак разрешения прерывания
772	 C24F  58	 	 	 	pop	ax	 	; восстановить смещение порта
773	 C250  88 26 0077 R	 	 	mov	port_off,ah
774	 C254  1F	 	 	 	pop	ds	 	; восстановить сегмент
775	 C255  C3	 	 	 	ret
776	 C256	 	 	 	dsbl	endp
777	 	 	 	 	
778	 	 	 	 	;---------------------------------------------------------------------
779	 	 	 	 	;-------Точка входа в БСУВВ НМД---------------------------------------
780	 	 	 	 	;----------------------------------------------------------------------
781	 	 	 	 	
782	 C256	 	 	 	disk_io proc	far
783	 	 	 	 	 	assume	ds:nothing,es:nothing
784	 C256  80 FA 80	 	 	 	cmp	dl,80h	 	; проверка наличия НМД
785	 C259  73 05	 	 	 	jae	hard_disk	; есть НМД
786	 C25B  CD 40	 	 	 	int	40h	 	; НГМД
787	 C25D	 	 	 	ret_2:
788	 C25D  CA 0002	 	 	 	ret	2
789	 C260	 	 	 	hard_disk:
790	 	 	 	 	 	assume	ds:data
791	 C260  FB	 	 	 	sti	 	     ; установка признака разрешения прерывания
792	 C261  0A E4	 	 	 	or	ah,ah
793	 C263  75 09	 	 	 	jnz	a3
794	 C265  CD 40	 	 	 	int	40h	 	; сброс НГМД
795	 C267  2A E4	 	 	 	sub	ah,ah
796	 C269  80 FA 81	 	 	 	cmp	dl,[80h + s_max_file - 1] ; устройство 80 и 81
797	 C26C  77 EF	 	 	 	ja	ret_2	 	; если номер устройства больше
798	 	 	 	 	 	 	 	 	; максимального,то на выход
799	 C26E	 	 	 	a3:
800	 C26E  80 FC 08	 	 	 	cmp	ah,08	 	; возврат параметров
801	 C271  75 03	 	 	 	jnz	a2
802	 C273  E9 C390 R	 	 	jmp	get_parmt_n	; возврат параметров устройства
803	 C276	 	 	 	a2:
804	 C276  53	 	 	 	push	bx	 	; запомнить регистры
805	 C277  51	 	 	 	push	cx
806	 C278  52	 	 	 	push	dx
807	 C279  1E	 	 	 	push	ds
808	 C27A  06	 	 	 	push	es
809	 C27B  56	 	 	 	push	si
810	 C27C  57	 	 	 	push	di
811	 	 	 	 	
812	 C27D  E8 C2EA R	 	 	call	disk_io_cont	; выполнение операции
813	 	 	 	 	
814	 C280  50	 	 	 	push	ax
815	 C281  E8 C20C R	 	 	call	dsbl	 	; убедиться,что все сброшено
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-17
	 	 	 	 	 	 	 	09-15-88    


816	 C284  B8 0040	 	 	 	mov	ax,dat
817	 C287  8E D8	 	 	 	mov	ds,ax	 	; установить сегмент DATA
818	 C289  58	 	 	 	pop	ax
819	 C28A  8A 26 0074 R	 	 	mov	ah,diskw_status ; получить состояние операции
820	 C28E  80 FC 01	 	 	 	cmp	ah,1	 	; установить флажок переноса для
821	 	 	 	 	 	 	 	 	; индикации неуспешной операции
822	 C291  F5	 	 	 	cmc	; заменить значение CF на противоположное
823	 C292  5F	 	 	 	pop	di	 	; восстановление регистров
824	 C293  5E	 	 	 	pop	si
825	 C294  07	 	 	 	pop	es
826	 C295  1F	 	 	 	pop	ds
827	 C296  5A	 	 	 	pop	dx
828	 C297  59	 	 	 	pop	cx
829	 C298  5B	 	 	 	pop	bx
830	 C299  CA 0002	 	 	 	ret	2
831	 C29C	 	 	 	disk_io endp
832	 	 	 	 	;-------Таблица переходов по АН--------------------------------------
833	 C29C	 	 	 	m1t	label	word
834	 C29C  C338 R	 	 	 	dw	disk_resett	; 000h
835	 C29E  C34D R	 	 	 	dw	return_status	; 001h
836	 C2A0  C356 R	 	 	 	dw	disk_readt	; 002h
837	 C2A2  C360 R	 	 	 	dw	disk_writet	; 003h
838	 C2A4  C36A R	 	 	 	dw	disk_verft	; 004h
839	 C2A6  C372 R	 	 	 	dw	fmt_trk 	; 005h
840	 C2A8  C379 R	 	 	 	dw	fmt_bad 	; 006h
841	 C2AA  C380 R	 	 	 	dw	fmt_drv 	; 007h
842	 C2AC  C330 R	 	 	 	dw	bad_command	; 008h
843	 C2AE  C427 R	 	 	 	dw	init_drv	; 009h
844	 C2B0  C4CF R	 	 	 	dw	rd_long 	; 00ah
845	 C2B2  C4DD R	 	 	 	dw	wr_long 	; 00bh
846	 C2B4  C4F2 R	 	 	 	dw	disk_seek	; 00ch
847	 C2B6  C338 R	 	 	 	dw	disk_resett	; 00dh
848	 C2B8  C4F9 R	 	 	 	dw	rd_buff 	; 00eh
849	 C2BA  C507 R	 	 	 	dw	wr_buff 	; 00fh
850	 C2BC  C515 R	 	 	 	dw	tst_rdy 	; 010h
851	 C2BE  C51C R	 	 	 	dw	hdisk_recal	; 011h
852	 C2C0  C523 R	 	 	 	dw	ram_diag	; 012h
853	 C2C2  C52A R	 	 	 	dw	chk_drv 	; 013h
854	 C2C4  C531 R	 	 	 	dw	cntlr_diag	; 014h
855	 = 002A	 	 	 	m1tl	equ	$-m1t
856	 	 	 	 	;-------Формирование 1-го байта управляющего блока(устр.+головка)-----
857	 C2C6	 	 	 	setup_a proc	near
858	 C2C6  C6 06 0074 R 00	 	 	mov	diskw_status,0	; сброс индикации состояния
859	 C2CB  51	 	 	 	push	cx	 	; запомнить СХ
860	 	 	 	 	
861	 	 	 	 	;-------Вычисление сдвига порта (PORT_OFF)---------------------------
862	 	 	 	 	
863	 C2CC  8A EA	 	 	 	mov	ch,dl	 	; запомнить номер устройства в СН
864	 C2CE  80 CA 01	 	 	 	or	dl,1	 	; установка младшего разряда в 1
865	 C2D1  FE CA	 	 	 	dec	dl	 	; уменьшить номер устройства на 1
866	 C2D3  D0 E2	 	 	 	shl	dl,1  ; выработка сдвига для пары 0-1(2-3,4-5,6-7)
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-18
	 	 	 	 	 	 	 	09-15-88    


867	 C2D5  88 16 0077 R	 	 	mov	port_off,dl	; запись сдвига
868	 C2D9  8A D5	 	 	 	mov	dl,ch	 	; восстановление номера устройства
869	 C2DB  80 E2 01	 	 	 	and	dl,1	 	; выделение младшего разряда
870	 	 	 	 	
871	 C2DE  B1 05	 	 	 	mov	cl,5	 	; счетчик сдвига
872	 C2E0  D2 E2	 	 	 	shl	dl,cl ; номер устройства сдвигается на 5 разрядов влево
873	 C2E2  0A D6	 	 	 	or	dl,dh	; номер головки + сдвинутый номер устройства
874	 C2E4  88 16 0043 R	 	 	mov	cmd_block+1,dl	; формирование 1-го байта упр.слова
875	 C2E8  59	 	 	 	pop	cx	 	; восстанавливаем СХ
876	 C2E9  C3	 	 	 	ret
877	 C2EA	 	 	 	setup_a endp
878	 	 	 	 	
879	 C2EA	 	 	 	disk_io_cont	proc	near	; выполнение операции
880	 C2EA  50	 	 	 	push	ax
881	 C2EB  B8 0040	 	 	 	mov	ax,dat
882	 C2EE  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента DATA
883	 C2F0  58	 	 	 	pop	ax
884	 C2F1  80 FC 01	 	 	 	cmp	ah,01h	 	; проверяется возврат состояния (АН=1)
885	 C2F4  75 03	 	 	 	jnz	a4
886	 C2F6  EB 55 90	 	 	 	jmp	return_status	; переход на возврат состояния
887	 C2F9	 	 	 	a4:
888	 C2F9  80 EA 80	 	 	 	sub	dl,80h	 	; номер устройства начинается с 0
889	 C2FC  80 FA 08	 	 	 	cmp	dl,max_file	; проверка номера устройства
890	 C2FF  73 2F	 	 	 	jae	bad_command
891	 	 	 	 	
892	 C301  E8 C2C6 R	 	 	call	setup_a 	  ; формирование 1-го байта упр.блока
893	 	 	 	 	
894	 	 	 	 	;-------Формирование блока команд---------------------------------
895	 	 	 	 	
896	 C304  FE C9	 	 	 	dec	cl	; сектора 0-16 для контроллера
897	 C306  C6 06 0042 R 00	 	 	mov	cmd_block+0,0
898	 C30B  88 0E 0044 R	 	 	mov	cmd_block+2,cl	; сектор и старшие 2 бита цилиндра
899	 C30F  88 2E 0045 R	 	 	mov	cmd_block+3,ch	; цилиндр
900	 C313  A2 0046 R	 	 	mov	cmd_block+4,al	; чередование/число блоков
901	 C316  A0 0076 R	 	 	mov	al,control_byte
902	 C319  A2 0047 R	 	 	mov	cmd_block+5,al	; управляющий байт
903	 C31C  50	 	 	 	push	ax	 	; запомнить АХ
904	 C31D  8A C4	 	 	 	mov	al,ah	 	; получить в AL код операции
905	 C31F  32 E4	 	 	 	xor	ah,ah	 	; нулевой старший байт
906	 C321  D1 E0	 	 	 	sal	ax,1 ; сдвиг на 2 разряда влево для получения смещения
907	 C323  8B F0	 	 	 	mov	si,ax	; смещение получить в SI для ветвления
908	 C325  3D 002A	 	 	 	cmp	ax,m1tl ; смещение в пределах заданной области?
909	 C328  58	 	 	 	pop	ax	 	; восстановление АХ
910	 C329  73 05	 	 	 	jnb	bad_command
911	 C32B  2E: FF A4 C29C R	 	 	jmp	word ptr cs:[si + offset m1t ] ; переход по смещению
912	 C330	 	 	 	bad_command:
913	 C330  C6 06 0074 R 01	 	 	mov	diskw_status,bad_cmd	; ошибка в команде
914	 C335  B0 00	 	 	 	mov	al,0
915	 C337  C3	 	 	 	ret
916	 C338	 	 	 	disk_io_cont	endp
917	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-19
	 	 	 	 	 	 	 	09-15-88    


918	 	 	 	 	;---------------------------------------------------------------------
919	 	 	 	 	;	Сброс диска (АН=00Н)
920	 	 	 	 	;---------------------------------------------------------------------
921	 	 	 	 	
922	 C338	 	 	 	disk_resett	proc	near
923	 C338  E8 C77E R	 	 	call	port_1	 	; порт сброса
924	 C33B  EE	 	 	 	out	dx,al	 	; сброс контроллера
925	 C33C  E8 C77E R	 	 	call	port_1
926	 C33F  EC	 	 	 	in	al,dx	 	; получить состояние
927	 C340  24 02	 	 	 	and	al,2	 	; проверка сброса бита 1 (ввод/вывод)
928	 C342  74 06	 	 	 	jz	dr1
929	 C344  C6 06 0074 R 05	 	 	mov	diskw_status,bad_reset	; неудачный сброс
930	 C349  C3	 	 	 	ret
931	 C34A	 	 	 	dr1:
932	 C34A  E9 C427 R	 	 	jmp	init_drv	; инициализация параметров устройства
933	 C34D	 	 	 	disk_resett	endp
934	 	 	 	 	
935	 	 	 	 	;----------------------------------------------------------------------
936	 	 	 	 	;	Программа состояния диска (АН=001)
937	 	 	 	 	;---------------------------------------------------------------------
938	 	 	 	 	
939	 C34D	 	 	 	return_status	proc	near
940	 C34D  A0 0074 R	 	 	mov	al,diskw_status ; получение предыдущего состояния
941	 C350  C6 06 0074 R 00	 	 	mov	diskw_status,0	; сброс состояния
942	 C355  C3	 	 	 	ret
943	 C356	 	 	 	return_status	endp
944	 	 	 	 	
945	 	 	 	 	;-----------------------------------------------------------------------
946	 	 	 	 	;	Программа считывания диска (АН=002Н)
947	 	 	 	 	;-----------------------------------------------------------------------
948	 	 	 	 	
949	 C356	 	 	 	disk_readt	proc	near
950	 C356  B0 47	 	 	 	mov	al,dma_read	; байт режима для чтения ПДП
951	 C358  C6 06 0042 R 08	 	 	mov	cmd_block+0,read_cmd	; код операции
952	 C35D  E9 C545 R	 	 	jmp	dma_opn
953	 C360	 	 	 	disk_readt	endp
954	 	 	 	 	
955	 	 	 	 	;--------------------------------------------------------------------
956	 	 	 	 	;	Программа записи диска (АН=003Н)
957	 	 	 	 	;--------------------------------------------------------------------
958	 	 	 	 	
959	 C360	 	 	 	disk_writet	proc	near
960	 C360  B0 4B	 	 	 	mov	al,dma_write	; байт режима для записи ПДП (3 канал)
961	 C362  C6 06 0042 R 0A	 	 	mov	cmd_block+0,write_cmd
962	 C367  E9 C545 R	 	 	jmp	dma_opn
963	 C36A	 	 	 	disk_writet	endp
964	 	 	 	 	
965	 	 	 	 	;---------------------------------------------------------------------
966	 	 	 	 	;	Проверка диска (АН=004Н)
967	 	 	 	 	;---------------------------------------------------------------------
968	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-20
	 	 	 	 	 	 	 	09-15-88    


969	 C36A	 	 	 	disk_verft	proc	near
970	 C36A  C6 06 0042 R 05	 	 	mov	cmd_block+0,chk_trk_cmd
971	 C36F  E9 C536 R	 	 	jmp	ndma_opn
972	 C372	 	 	 	disk_verft	endp
973	 	 	 	 	
974	 	 	 	 	;--------------------------------------------------------------------
975	 	 	 	 	;	Форматизация (АН=005Н,006Н,007Н)
976	 	 	 	 	;--------------------------------------------------------------------
977	 	 	 	 	
978	 C372	 	 	 	fmt_trk proc	near	 	; форматизация дорожки (АН=005Н)
979	 C372  C6 06 0042 R 06	 	 	mov	cmd_block,fmttrk_cmd
980	 C377  EB 0C	 	 	 	jmp	short	fmt_cont
981	 C379	 	 	 	fmt_trk endp
982	 	 	 	 	
983	 C379	 	 	 	fmt_bad proc	near	    ; форматизация неверной дорожки (АН=006Н)
984	 C379  C6 06 0042 R 07	 	 	mov	cmd_block,fmtbad_cmd
985	 C37E  EB 05	 	 	 	jmp	short	fmt_cont
986	 C380	 	 	 	fmt_bad endp
987	 	 	 	 	
988	 C380	 	 	 	fmt_drv proc	near	 	; форматизация устройства (АН=007Н)
989	 C380  C6 06 0042 R 04	 	 	mov	cmd_block,fmtdrv_cmd
990	 C385	 	 	 	fmt_drv endp
991	 	 	 	 	
992	 C385	 	 	 	fmt_cont:
993	 C385  A0 0044 R	 	 	mov	al,cmd_block+2
994	 C388  24 C0	 	 	 	and	al,11000000b	; обнуление поля сектора
995	 C38A  A2 0044 R	 	 	mov	cmd_block+2,al
996	 C38D  E9 C536 R	 	 	jmp	ndma_opn
997	 	 	 	 	
998	 	 	 	 	;--------------------------------------------------------------------
999	 	 	 	 	;	Получение параметров устройства (АН=008Н)
1000	 	 	 	 	;--------------------------------------------------------------------
1001	 	 	 	 	
1002	 C390	 	 	 	get_parmt_n	label	near
1003	 C390	 	 	 	get_parmt	proc	far
1004	 C390  1E	 	 	 	push	ds	 	; сохранение регистров
1005	 C391  06	 	 	 	push	es
1006	 C392  53	 	 	 	push	bx
1007	 	 	 	 	
1008	 	 	 	 	 	assume	ds:abs0
1009	 C393  2B C0	 	 	 	sub	ax,ax
1010	 C395  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента
1011	 C397  C4 1E 0104 R	 	 	les	bx,hf_tbl_vec	; адрес таблицы параметров FD_TBL
1012	 	 	 	 	 	assume	ds:data
1013	 C39B  B8 0040	 	 	 	mov	ax,dat
1014	 C39E  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента DATA
1015	 	 	 	 	
1016	 C3A0  80 EA 80	 	 	 	sub	dl,80h
1017	 C3A3  80 FA 08	 	 	 	cmp	dl,max_file	; проверка номера устройства
1018	 C3A6  73 2F	 	 	 	jae	g4t
1019	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-21
	 	 	 	 	 	 	 	09-15-88    


1020	 C3A8  E8 C2C6 R	 	 	call	setup_a  ; формирование 1-го байта упр. блока
1021	 	 	 	 	
1022	 C3AB  E8 C78D R	 	 	call	sw2_offs ; формирование смещения для таблицы параметров
1023	 C3AE  72 27	 	 	 	jc	g4t
1024	 C3B0  03 D8	 	 	 	add	bx,ax	; адрес таблицы параметров
1025	 	 	 	 	
1026	 C3B2  26: 8B 07	 	 	mov	ax,es:[bx]	; максимальный номер цилиндра
1027	 C3B5  2D 0002	 	 	 	sub	ax,2	; установить номер 0-N и зарезервировать
1028	 	 	 	 	 	 	 	; последнюю дорожку для диагностики
1029	 C3B8  8A E8	 	 	 	mov	ch,al	; мл.разряды номера цилиндра в СН
1030	 C3BA  25 0300	 	 	 	and	ax,0300h	; старшие 2 бита цилиндра
1031	 C3BD  D1 E8	 	 	 	shr	ax,1
1032	 C3BF  D1 E8	 	 	 	shr	ax,1	; сдвиг на 2 разряда вправо (из АН в AL)
1033	 C3C1  0C 11	 	 	 	or	al,011h 	; максимальное число секторов
1034	 C3C3  8A C8	 	 	 	mov	cl,al	; в CL-ст.разряды номера цилиндра+число секторов
1035	 	 	 	 	
1036	 C3C5  26: 8A 77 02	 	 	mov	dh,es:[bx][2]	; максимальный номер головки
1037	 C3C9  FE CE	 	 	 	dec	dh	 	; номер головки начинается с 0
1038	 C3CB  8A 16 0075 R	 	 	mov	dl,hf_num	; число устройств
1039	 C3CF  2B C0	 	 	 	sub	ax,ax
1040	 C3D1	 	 	 	g5t:
1041	 C3D1  5B	 	 	 	pop	bx	 	; сохранить регистры
1042	 C3D2  07	 	 	 	pop	es
1043	 C3D3  1F	 	 	 	pop	ds
1044	 C3D4  CA 0002	 	 	 	ret	2
1045	 C3D7	 	 	 	g4t:
1046	 C3D7  C6 06 0074 R 07	 	 	mov	diskw_status,init_fail	; неверная операция
1047	 C3DC  B4 07	 	 	 	mov	ah,init_fail	 	; код ошибки в АН
1048	 C3DE  2A C0	 	 	 	sub	al,al	 	 	; нулевые параметры
1049	 C3E0  2B D2	 	 	 	sub	dx,dx
1050	 C3E2  2B C9	 	 	 	sub	cx,cx
1051	 C3E4  F9	 	 	 	stc	 	 	 	; установить флажок ошибки
1052	 C3E5  EB EA	 	 	 	jmp	g5t
1053	 C3E7	 	 	 	get_parmt	endp
1054	 	 	 	 	
1055	 	 	 	 	;----------------------------------------------------------------------
1056	 	 	 	 	;	Инициализация характеристик устройства
1057	 	 	 	 	;----------------------------------------------------------------------
1058	 	 	 	 	;	Таблица параметров НМД
1059	 	 	 	 	;	Таблица составлена из следующих блоков:
1060	 	 	 	 	;	(1 слово)-максимальное число цилиндров
1061	 	 	 	 	;	(1 байт) -максимальное число головок
1062	 	 	 	 	;	(1 слово)- начальный цилиндр уменьшения тока записи
1063	 	 	 	 	;	(1 слово)- начальный цилиндр предкомпенсации
1064	 	 	 	 	;	(1 байт) -максимальная длина блока данных ЕСС
1065	 	 	 	 	;	(1 байт) -байт управления
1066	 	 	 	 	;	 	бит 7-невозможность повторения доступа к диску
1067	 	 	 	 	;	 	бит 6-невозможность повторения ЕСС
1068	 	 	 	 	;	 	биты  5-3-нули
1069	 	 	 	 	;	 	биты 2-0 -выбор устройства
1070	 	 	 	 	;	(1 байт) -стандартное значение time_out
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-22
	 	 	 	 	 	 	 	09-15-88    


1071	 	 	 	 	;	(1 байт) -значение time_out для форматизации устройства
1072	 	 	 	 	;	(1 байт) -значение time_out для проверки устройства
1073	 	 	 	 	;	(4 байта)-резерв для последующего использования
1074	 	 	 	 	;
1075	 	 	 	 	;	-чтобы определить набор параметров,строится таблица значений
1076	 	 	 	 	;	 и помещается соответствующий вектор в прерывание 41H
1077	 	 	 	 	;
1078	 	 	 	 	
1079	 	 	 	 	;	Установка переключателей на плате
1080	 	 	 	 	;
1081	 	 	 	 	;	 	 	устройство 0	устройство 1
1082	 	 	 	 	;	 	   ------------------------------------
1083	 	 	 	 	;	включен    :	 	      / 	      :
1084	 	 	 	 	;	 	   :   -1-    -2-     /   -3-	-4-   :
1085	 	 	 	 	;	выключен   :	 	      / 	      :
1086	 	 	 	 	;	 	   ------------------------------------
1087	 	 	 	 	;
1088	 	 	 	 	;	Таблица расшифровки:
1089	 	 	 	 	;
1090	 	 	 	 	;	 	1/3	2/4	вход таблицы
1091	 	 	 	 	;	      -------------------------------
1092	 	 	 	 	;	       вкл   : вкл   :	    0
1093	 	 	 	 	;	       вкл   : выкл  :	    1
1094	 	 	 	 	;	       выкл  : вкл   :	    2
1095	 	 	 	 	;	       выкл  : выкл  :	    3
1096	 	 	 	 	;	      -------------------------------
1097	 	 	 	 	
1098	 C3E7	 	 	 	fd_tbl:
1099	 	 	 	 	
1100	 	 	 	 	;-------Тип устройства 00 ( 10 Mb, г.Пенза )------------------------
1101	 	 	 	 	
1102	 C3E7  00CD	 	 	 	dw	0cdh
1103	 C3E9  06	 	 	 	db	06d
1104	 C3EA  0080	 	 	 	dw	080h
1105	 C3EC  0000	 	 	 	dw	0000d
1106	 C3EE  0B	 	 	 	db	0bh
1107	 C3EF  05	 	 	 	db	05h
1108	 C3F0  0C	 	 	 	db	0ch
1109	 C3F1  B4	 	 	 	db	0b4h
1110	 C3F2  28	 	 	 	db	028h
1111	 C3F3  00 00 00 00	 	 	db	0,0,0,0
1112	 	 	 	 	
1113	 	 	 	 	;-------Тип устройства 01 ( 20 Мб,615 цилиндров )-------------------
1114	 	 	 	 	
1115	 C3F7  0267	 	 	 	dw	0267h
1116	 C3F9  04	 	 	 	db	04d
1117	 C3FA  0267	 	 	 	dw	0267h
1118	 C3FC  012C	 	 	 	dw	0300d
1119	 C3FE  0B	 	 	 	db	0bh
1120	 C3FF  05	 	 	 	db	05h
1121	 C400  28	 	 	 	db	028h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-23
	 	 	 	 	 	 	 	09-15-88    


1122	 C401  E0	 	 	 	db	0e0h
1123	 C402  42	 	 	 	db	042h
1124	 C403  00 00 00 00	 	 	db	0,0,0,0
1125	 	 	 	 	
1126	 	 	 	 	;-------Тип устройства 02 ( 20 Мб, 612 цилиндров )-----------------
1127	 	 	 	 	
1128	 C407  0264	 	 	 	dw	0612d
1129	 C409  04	 	 	 	db	04d
1130	 C40A  0264	 	 	 	dw	0612d
1131	 C40C  0000	 	 	 	dw	0
1132	 C40E  0B	 	 	 	db	0bh
1133	 C40F  05	 	 	 	db	05h
1134	 C410  28	 	 	 	db	028h
1135	 C411  E0	 	 	 	db	0e0h
1136	 C412  42	 	 	 	db	042h
1137	 C413  00 00 00 00	 	 	db	0,0,0,0
1138	 	 	 	 	
1139	 	 	 	 	;-------Тип устройства 03 --------------------------------------------
1140	 	 	 	 	
1141	 C417  0132	 	 	 	dw	0306d
1142	 C419  04	 	 	 	db	04d
1143	 C41A  0132	 	 	 	dw	0306d
1144	 C41C  0000	 	 	 	dw	0000d
1145	 C41E  0B	 	 	 	db	0bh
1146	 C41F  05	 	 	 	db	05h
1147	 C420  0C	 	 	 	db	0ch
1148	 C421  B4	 	 	 	db	0b4h
1149	 C422  28	 	 	 	db	028h
1150	 C423  00 00 00 00	 	 	db	0,0,0,0
1151	 	 	 	 	
1152	 C427	 	 	 	init_drv	proc	near	; инициализация устройства
1153	 	 	 	 	
1154	 	 	 	 	;------Для нулевого устройства---------------------------------------
1155	 	 	 	 	
1156	 C427  C6 06 0042 R 0C	 	 	mov	cmd_block+0,init_drv_cmd	; код операции
1157	 C42C  C6 06 0043 R 00	 	 	mov	cmd_block+1,0	; устройство 0,головка 0
1158	 C431  E8 C444 R	 	 	call	init_drv_r ; считываем 8 байт из таблицы параметров
1159	 C434  72 0D	 	 	 	jc	init_drv_out
1160	 	 	 	 	
1161	 	 	 	 	;-------Для первого устройства -------------------------------------
1162	 	 	 	 	
1163	 C436  C6 06 0042 R 0C	 	 	mov	cmd_block+0,init_drv_cmd	; код операции
1164	 C43B  C6 06 0043 R 20	 	 	mov	cmd_block+1,00100000b	; устройство 1,головка 0
1165	 C440  E8 C444 R	 	 	call	init_drv_r  ; считываем 8 байт из таблицы параметров
1166	 C443	 	 	 	init_drv_out:
1167	 C443  C3	 	 	 	ret
1168	 C444	 	 	 	init_drv	endp
1169	 	 	 	 	;------Считываем 8 байт из таблицы параметров-----------------------
1170	 C444	 	 	 	init_drv_r	proc	near
1171	 	 	 	 	 	assume	es:code
1172	 C444  2A C0	 	 	 	sub	al,al
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-24
	 	 	 	 	 	 	 	09-15-88    


1173	 C446  E8 C562 R	 	 	call	command 	; выдача команды (6 байт)
1174	 C449  73 01	 	 	 	jnc	b1t
1175	 C44B  C3	 	 	 	ret
1176	 C44C	 	 	 	b1t:
1177	 C44C  1E	 	 	 	push	ds
1178	 	 	 	 	 	assume	ds:abs0
1179	 C44D  2B C0	 	 	 	sub	ax,ax
1180	 C44F  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента
1181	 C451  C4 1E 0104 R	 	 	les	bx,hf_tbl_vec	; адрес таблицы параметров FD_TBL
1182	 C455  1F	 	 	 	pop	ds
1183	 	 	 	 	 	assume	ds:data
1184	 C456  E8 C78D R	 	 	call	sw2_offs	; сдвиг таблицы параметров
1185	 C459  72 57	 	 	 	jc	b3t
1186	 C45B  03 D8	 	 	 	add	bx,ax	 	; сдвиг начального адреса таблицы
1187	 	 	 	 	
1188	 	 	 	 	;----Получение параметров устройства----------------------------
1189	 	 	 	 	
1190	 C45D  BF 0001	 	 	 	mov	di,1
1191	 C460  E8 C4C2 R	 	 	call	init_drv_s	;запись первого байта из таблицы
1192	 	 	 	 	 	 	 	 	;параметров (адрес BX+DI)-старший байт
1193	 	 	 	 	 	 	 	 	;максимального номера цилиндра
1194	 C463  72 4D	 	 	 	jc	b3t
1195	 	 	 	 	
1196	 C465  BF 0000	 	 	 	mov	di,0	 	; 0 байт из таблицы
1197	 C468  E8 C4C2 R	 	 	call	init_drv_s	; младший байт номера цилиндра
1198	 C46B  72 45	 	 	 	jc	b3t
1199	 	 	 	 	
1200	 C46D  BF 0002	 	 	 	mov	di,2	 	; 2 байт из таблицы
1201	 C470  E8 C4C2 R	 	 	call	init_drv_s	; максимальное число головок
1202	 C473  72 3D	 	 	 	jc	b3t
1203	 	 	 	 	
1204	 C475  BF 0004	 	 	 	mov	di,4	 	; 4 байт из таблицы
1205	 C478  E8 C4C2 R	 	 	call	init_drv_s	; ст.байт записи текущего цилиндра
1206	 C47B  72 35	 	 	 	jc	b3t
1207	 	 	 	 	
1208	 C47D  BF 0003	 	 	 	mov	di,3	 	; 3 байт из таблицы
1209	 C480  E8 C4C2 R	 	 	call	init_drv_s	; мл.байт записи текущего цилиндра
1210	 C483  72 2D	 	 	 	jc	b3t
1211	 	 	 	 	
1212	 C485  BF 0006	 	 	 	mov	di,6	 	; 6 байт из таблицы
1213	 C488  E8 C4C2 R	 	 	call	init_drv_s	; ст.байт записи с предкомпенсацией
1214	 C48B  72 25	 	 	 	jc	b3t
1215	 	 	 	 	
1216	 C48D  BF 0005	 	 	 	mov	di,5	 	; 5 байт из таблицы
1217	 C490  E8 C4C2 R	 	 	call	init_drv_s	;мл.байт записи с предкомпенсацией
1218	 C493  72 1D	 	 	 	jc	b3t
1219	 	 	 	 	
1220	 C495  BF 0007	 	 	 	mov	di,7	 	; 7 байт из таблицы
1221	 C498  E8 C4C2 R	 	 	call	init_drv_s	; максимальная длина блока данных ЕСС
1222	 C49B  72 15	 	 	 	jc	b3t
1223	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-25
	 	 	 	 	 	 	 	09-15-88    


1224	 C49D  BF 0008	 	 	 	mov	di,8	 	; 8 байт из таблицы
1225	 C4A0  26: 8A 01	 	 	mov	al,es:[bx + di] ; байт управления
1226	 C4A3  A2 0076 R	 	 	mov	control_byte,al
1227	 	 	 	 	
1228	 C4A6  2B C9	 	 	 	sub	cx,cx
1229	 C4A8	 	 	 	b5t:
1230	 C4A8  E8 C77E R	 	 	call	port_1
1231	 C4AB  EC	 	 	 	in	al,dx	 	; считывание состояния
1232	 C4AC  A8 02	 	 	 	test	al,r1_iomode	; проверка режима ввода
1233	 C4AE  75 09	 	 	 	jnz	b6t
1234	 C4B0  E2 F6	 	 	 	loop	b5t
1235	 C4B2	 	 	 	b3t:
1236	 C4B2  C6 06 0074 R 07	 	 	mov	diskw_status,init_fail	; неверная операция
1237	 C4B7  F9	 	 	 	stc	 	 	 	; установить перенос
1238	 C4B8  C3	 	 	 	ret
1239	 C4B9	 	 	 	b6t:
1240	 C4B9  E8 C771 R	 	 	call	port_0	 	 	; порт данных
1241	 C4BC  EC	 	 	 	in	al,dx	 	 	; считывание байта состояния
1242	 C4BD  24 02	 	 	 	and	al,2	 	 	; проверяется бит ошибки
1243	 C4BF  75 F1	 	 	 	jnz	b3t	 	 	; переход по ошибке
1244	 C4C1  C3	 	 	 	ret
1245	 	 	 	 	 	assume	es:nothing
1246	 C4C2	 	 	 	init_drv_r	endp
1247	 	 	 	 	
1248	 	 	 	 	;-------Послать байт в контроллер------------------------------------
1249	 	 	 	 	
1250	 C4C2	 	 	 	init_drv_s	proc	near
1251	 C4C2  E8 C68A R	 	 	call	hd_wait_req	; ожидание установки запроса
1252	 C4C5  72 07	 	 	 	jc	d1t	 	; нет запроса
1253	 C4C7  E8 C771 R	 	 	call	port_0	 	; порт данных
1254	 C4CA  26: 8A 01	 	 	mov	al,es:[bx + di] ; считывание байта из таблицы
1255	 C4CD  EE	 	 	 	out	dx,al	 	; запись байта в контроллер
1256	 C4CE	 	 	 	d1t:
1257	 C4CE  C3	 	 	 	ret
1258	 C4CF	 	 	 	init_drv_s	endp
1259	 	 	 	 	
1260	 	 	 	 	;--------------------------------------------------------------------
1261	 	 	 	 	;	Длинное считывание (АН=0АН)
1262	 	 	 	 	;--------------------------------------------------------------------
1263	 	 	 	 	
1264	 C4CF	 	 	 	rd_long 	proc	near
1265	 C4CF  E8 C4EB R	 	 	call	chk_long	; проверка длины блока
1266	 C4D2  72 6B	 	 	 	jc	g8t
1267	 C4D4  C6 06 0042 R E5	 	 	mov	cmd_block+0,rd_long_cmd ; код операции
1268	 C4D9  B0 47	 	 	 	mov	al,dma_read	 	; 3 канал ПДП
1269	 C4DB  EB 68	 	 	 	jmp	short	dma_opn
1270	 C4DD	 	 	 	rd_long 	endp
1271	 	 	 	 	
1272	 	 	 	 	;----------------------------------------------------------------------
1273	 	 	 	 	;	Длинная запись (АН=0ВН)
1274	 	 	 	 	;---------------------------------------------------------------------
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-26
	 	 	 	 	 	 	 	09-15-88    


1275	 	 	 	 	
1276	 C4DD	 	 	 	wr_long 	proc	near
1277	 C4DD  E8 C4EB R	 	 	call	chk_long	; проверка длины блока
1278	 C4E0  72 5D	 	 	 	jc	g8t
1279	 C4E2  C6 06 0042 R E6	 	 	mov	cmd_block+0,wr_long_cmd ; код операции
1280	 C4E7  B0 4B	 	 	 	mov	al,dma_write	; 3 канал ПДП
1281	 C4E9  EB 5A	 	 	 	jmp	short	dma_opn
1282	 C4EB	 	 	 	wr_long 	endp
1283	 	 	 	 	
1284	 C4EB	 	 	 	chk_long	proc	near	; проверка длины блока
1285	 C4EB  A0 0046 R	 	 	mov	al,cmd_block+4	; счетчик
1286	 C4EE  3C 80	 	 	 	cmp	al,080h 	; длинные считывание и запись от 1 до 79Н
1287	 C4F0  F5	 	 	 	cmc	; заменяет значение переноса на противоположное
1288	 C4F1  C3	 	 	 	ret
1289	 C4F2	 	 	 	chk_long	endp
1290	 	 	 	 	
1291	 	 	 	 	;-------------------------------------------------------------------
1292	 	 	 	 	;	Установка (АН=0СН)
1293	 	 	 	 	;-------------------------------------------------------------------
1294	 	 	 	 	
1295	 C4F2	 	 	 	disk_seek	proc	near
1296	 C4F2  C6 06 0042 R 0B	 	 	mov	cmd_block,seek_cmd	; код операции
1297	 C4F7  EB 3D	 	 	 	jmp	short	ndma_opn
1298	 C4F9	 	 	 	disk_seek	endp
1299	 	 	 	 	
1300	 	 	 	 	;--------------------------------------------------------------------
1301	 	 	 	 	;	Считывание буфера сектора (АН=0ЕН)
1302	 	 	 	 	;--------------------------------------------------------------------
1303	 	 	 	 	
1304	 C4F9	 	 	 	rd_buff proc	near
1305	 C4F9  C6 06 0042 R 0E	 	 	mov	cmd_block+0,rd_buff_cmd ; код операции
1306	 C4FE  C6 06 0046 R 01	 	 	mov	cmd_block+4,1	 	; один сектор
1307	 C503  B0 47	 	 	 	mov	al,dma_read	 	; 3 канал ПДП
1308	 C505  EB 3E	 	 	 	jmp	short	dma_opn
1309	 C507	 	 	 	rd_buff endp
1310	 	 	 	 	
1311	 	 	 	 	;-------------------------------------------------------------------
1312	 	 	 	 	;	Запись буфера сектора (АН=0FH)
1313	 	 	 	 	;-------------------------------------------------------------------
1314	 	 	 	 	
1315	 C507	 	 	 	wr_buff proc	near
1316	 C507  C6 06 0042 R 0F	 	 	mov	cmd_block+0,wr_buff_cmd ; код операции
1317	 C50C  C6 06 0046 R 01	 	 	mov	cmd_block+4,1	 	; один сектор
1318	 C511  B0 4B	 	 	 	mov	al,dma_write	 	; 3 канал ПДП
1319	 C513  EB 30	 	 	 	jmp	short	dma_opn
1320	 C515	 	 	 	wr_buff endp
1321	 	 	 	 	
1322	 	 	 	 	;---------------------------------------------------------------------
1323	 	 	 	 	;	Проверка готовности диска (АН=010Н)
1324	 	 	 	 	;---------------------------------------------------------------------
1325	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-27
	 	 	 	 	 	 	 	09-15-88    


1326	 C515	 	 	 	tst_rdy proc	near
1327	 C515  C6 06 0042 R 00	 	 	mov	cmd_block+0,tst_rdy_cmd ; код операции
1328	 C51A  EB 1A	 	 	 	jmp	short	ndma_opn
1329	 C51C	 	 	 	tst_rdy endp
1330	 	 	 	 	
1331	 	 	 	 	;--------------------------------------------------------------------
1332	 	 	 	 	;	Рекалибровка (АН=011Н)
1333	 	 	 	 	;---------------------------------------------------------------------
1334	 	 	 	 	
1335	 C51C	 	 	 	hdisk_recal	proc	near
1336	 C51C  C6 06 0042 R 01	 	 	mov	cmd_block+0,recal_cmd	; код операции
1337	 C521  EB 13	 	 	 	jmp	short	ndma_opn
1338	 C523	 	 	 	hdisk_recal	endp
1339	 	 	 	 	
1340	 	 	 	 	;--------------------------------------------------------------------
1341	 	 	 	 	;	Диагностика памяти контроллера (АН=012Н)
1342	 	 	 	 	;--------------------------------------------------------------------
1343	 	 	 	 	
1344	 C523	 	 	 	ram_diag	proc	near
1345	 C523  C6 06 0042 R E0	 	 	mov	cmd_block+0,ram_diag_cmd
1346	 C528  EB 0C	 	 	 	jmp	short	ndma_opn
1347	 C52A	 	 	 	ram_diag	endp
1348	 	 	 	 	
1349	 	 	 	 	;---------------------------------------------------------------------
1350	 	 	 	 	;	Диагностика устройства (АН=013Н)
1351	 	 	 	 	;--------------------------------------------------------------------
1352	 	 	 	 	
1353	 C52A	 	 	 	chk_drv proc	near
1354	 C52A  C6 06 0042 R E3	 	 	mov	cmd_block+0,chk_drv_cmd
1355	 C52F  EB 05	 	 	 	jmp	short	ndma_opn
1356	 C531	 	 	 	chk_drv endp
1357	 	 	 	 	
1358	 	 	 	 	;---------------------------------------------------------------------
1359	 	 	 	 	;	Внутренняя диагностика контроллера (АН=014Н)
1360	 	 	 	 	;--------------------------------------------------------------------
1361	 	 	 	 	
1362	 C531	 	 	 	cntlr_diag	proc	near
1363	 C531  C6 06 0042 R E4	 	 	mov	cmd_block+0,cntlr_diag_cmd
1364	 C536	 	 	 	cntlr_diag	endp
1365	 	 	 	 	
1366	 	 	 	 	;--------------------------------------------------------------------
1367	 	 	 	 	;	Программы поддержки
1368	 	 	 	 	;--------------------------------------------------------------------
1369	 	 	 	 	
1370	 C536	 	 	 	ndma_opn:
1371	 C536  B0 02	 	 	 	mov	al,02h
1372	 C538  E8 C562 R	 	 	call	command 	; получение команды
1373	 C53B  72 21	 	 	 	jc	g11
1374	 C53D  EB 16	 	 	 	jmp	short	g3t
1375	 C53F	 	 	 	g8t:
1376	 C53F  C6 06 0074 R 09	 	 	mov	diskw_status,dma_boundary	; нарушение границы
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-28
	 	 	 	 	 	 	 	09-15-88    


1377	 C544  C3	 	 	 	ret
1378	 C545	 	 	 	dma_opn:
1379	 C545  E8 C69F R	 	 	call	dma_setupt	; установка операции ПДП
1380	 C548  72 F5	 	 	 	jc	g8t
1381	 C54A  B0 03	 	 	 	mov	al,03h
1382	 C54C  E8 C562 R	 	 	call	command 	; получение команды
1383	 C54F  72 0D	 	 	 	jc	g11
1384	 C551  B0 03	 	 	 	mov	al,03h
1385	 C553  E6 0A	 	 	 	out	dma+10,al	; инициализация каналов
1386	 C555	 	 	 	g3t:
1387	 C555  E4 21	 	 	 	in	al,021h
1388	 C557  24 DF	 	 	 	and	al,0dfh 	; разрешение прерываний диска
1389	 C559  E6 21	 	 	 	out	021h,al
1390	 C55B  E8 C708 R	 	 	call	wait_intt	; ожидание прерывания
1391	 C55E	 	 	 	g11:
1392	 C55E  E8 C59C R	 	 	call	error_chk	; обработка ошибок
1393	 C561  C3	 	 	 	ret
1394	 	 	 	 	
1395	 	 	 	 	;---------------------------------------------------------------------
1396	 	 	 	 	;	 	КОМАНДА
1397	 	 	 	 	;	Посылает управляющий блок в контроллер
1398	 	 	 	 	;	ВВОД
1399	 	 	 	 	;
1400	 	 	 	 	;	AL=маска регистра DMA/INT
1401	 	 	 	 	;
1402	 	 	 	 	;---------------------------------------------------------------------
1403	 	 	 	 	
1404	 C562	 	 	 	command proc	near
1405	 C562  BE 0042 R	 	 	mov	si,offset cmd_block ; начальный адрес для считывания
1406	 	 	 	 	 	 	 	 	    ; блока команд
1407	 C565  E8 C783 R	 	 	call	port_2
1408	 C568  EE	 	 	 	out	dx,al	; выработка сигнала выборки контроллера
1409	 C569  E8 C788 R	 	 	call	port_3
1410	 C56C  EE	 	 	 	out	dx,al	; установка маски DMA/INT
1411	 C56D  2B C9	 	 	 	sub	cx,cx	; счетчик ожидания
1412	 C56F  E8 C77E R	 	 	call	port_1
1413	 C572	 	 	 	wait_busy:
1414	 C572  EC	 	 	 	in	al,dx	; получение состояния контроллера
1415	 C573  24 0F	 	 	 	and	al,0fh	; выделение младших бит
1416	 C575  3C 0D	 	 	 	cmp	al,r1_busy or r1_bus or r1_req	; проверка наличия
1417	 	 	 	 	 	 	 	 	; сигналов от контроллера:
1418	 	 	 	 	 	 	 	 	;	бит 3-занято
1419	 	 	 	 	 	 	 	 	;	бит 2-команда/данные
1420	 	 	 	 	 	 	 	 	;	бит 0-запрос
1421	 C577  74 09	 	 	 	je	c1t
1422	 C579  E2 F7	 	 	 	loop	wait_busy	; ожидание установки бит
1423	 C57B  C6 06 0074 R 80	 	 	mov	diskw_status,time_out
1424	 C580  F9	 	 	 	stc	 	 	; установка флажка по ошибке
1425	 C581  C3	 	 	 	ret
1426	 C582	 	 	 	c1t:
1427	 C582  FC	 	 	 	cld	 	 	; сброс признака направления
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-29
	 	 	 	 	 	 	 	09-15-88    


1428	 C583  B9 0006	 	 	 	mov	cx,6	 	; счетчик байт команды
1429	 C586	 	 	 	cm3:	 	; получение 6 байт управляющего блока
1430	 C586  E8 C771 R	 	 	call	port_0	 	; порт данных
1431	 C589  AC	 	 	 	lodsb	 	 	; получение байта команды
1432	 C58A  EE	 	 	 	out	dx,al	 	; запись данных из CPU в контроллер
1433	 C58B  E2 F9	 	 	 	loop	cm3	 	; счетчик повторения равен 6
1434	 	 	 	 	
1435	 C58D  E8 C77E R	 	 	call	port_1	 	; порт состояния
1436	 C590  EC	 	 	 	in	al,dx	 	; считывание состояния контроллера
1437	 C591  A8 01	 	 	 	test	al,r1_req	; проверка бита запроса (R1_REQ)
1438	 C593  74 06	 	 	 	jz	cm7
1439	 C595  C6 06 0074 R 20	 	 	mov	diskw_status,bad_cntlr	; сбой контроллера
1440	 C59A  F9	 	 	 	stc	 	 	; установить флажок переноса
1441	 C59B	 	 	 	cm7:
1442	 C59B  C3	 	 	 	ret
1443	 C59C	 	 	 	command endp
1444	 	 	 	 	
1445	 	 	 	 	;---------------------------------------------------------------------
1446	 	 	 	 	;	Считывание байт уточненного состояния
1447	 	 	 	 	;---------------------------------------------------------------------
1448	 	 	 	 	;
1449	 	 	 	 	;	Байт 0
1450	 	 	 	 	;
1451	 	 	 	 	;	бит  7	-адрес действителен,когда бит установлен
1452	 	 	 	 	;	бит  6	-резерв,устанавливается в 0
1453	 	 	 	 	;	биты 5-4-тип ошибки
1454	 	 	 	 	;	биты 3-0-код ошибки
1455	 	 	 	 	;
1456	 	 	 	 	;	Байт 1
1457	 	 	 	 	;
1458	 	 	 	 	;	биты 7-6-нули
1459	 	 	 	 	;	бит  5	-устройство (0-1)
1460	 	 	 	 	;	биты 4-0-номер головки
1461	 	 	 	 	;
1462	 	 	 	 	;	Байт 2
1463	 	 	 	 	;
1464	 	 	 	 	;	биты 7-5-старшие 2 бита номера цилиндра
1465	 	 	 	 	;	биты 4-0-номер сектора
1466	 	 	 	 	;
1467	 	 	 	 	;	Байт 3
1468	 	 	 	 	;
1469	 	 	 	 	;	биты 7-0-младшие биты номера цилиндра
1470	 	 	 	 	;
1471	 	 	 	 	;-------------------------------------------------------------------
1472	 	 	 	 	
1473	 C59C	 	 	 	error_chk	proc	near	; обработка ошибок
1474	 	 	 	 	 	assume	es:data
1475	 C59C  A0 0074 R	 	 	mov	al,diskw_status ; состояние операции в AL
1476	 C59F  0A C0	 	 	 	or	al,al	 	; проверить наличие ошибок
1477	 C5A1  75 01	 	 	 	jnz	g21	 	; переход по ошибке
1478	 C5A3  C3	 	 	 	ret	 	 	; нет ошибок
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-30
	 	 	 	 	 	 	 	09-15-88    


1479	 	 	 	 	
1480	 	 	 	 	;-------Считывание уточненного состояния----------------------------
1481	 	 	 	 	
1482	 C5A4	 	 	 	g21:
1483	 C5A4  B8 0040	 	 	 	mov	ax,dat
1484	 C5A7  8E C0	 	 	 	mov	es,ax	 	; установка сегмента
1485	 C5A9  2B C0	 	 	 	sub	ax,ax
1486	 C5AB  8B F8	 	 	 	mov	di,ax	 	; смещение для нулевого байта
1487	 C5AD  C6 06 0042 R 03	 	 	mov	cmd_block+0,sense_cmd	; код операции
1488	 C5B2  2A C0	 	 	 	sub	al,al
1489	 C5B4  E8 C562 R	 	 	call	command 	; выдача команды считывания состояния
1490	 C5B7  72 23	 	 	 	jc	sense_abort	; переход по ошибке
1491	 C5B9  B9 0004	 	 	 	mov	cx,4	 	; счетчик равен 4
1492	 C5BC	 	 	 	g22:
1493	 C5BC  E8 C68A R	 	 	call	hd_wait_req	; ожидание запроса
1494	 C5BF  72 20	 	 	 	jc	g24
1495	 C5C1  E8 C771 R	 	 	call	port_0	 	; порт данных
1496	 C5C4  EC	 	 	 	in	al,dx	 	; считывание байта состояния
1497	 C5C5  26 88 45 42	 	 	db 26h,88h,45h,42h	; mov	es:hd_error[di],al
1498	 C5C9  47	 	 	 	inc	di	 	; смещение для следующего байта
1499	 C5CA  E8 C77E R	 	 	call	port_1
1500	 C5CD  E2 ED	 	 	 	loop	g22	 	; счетчик повторения равен 4
1501	 C5CF  E8 C68A R	 	 	call	hd_wait_req	; ожидание запроса
1502	 C5D2  72 0D	 	 	 	jc	g24	 	; нет запроса
1503	 C5D4  E8 C771 R	 	 	call	port_0	 	; порт данных
1504	 C5D7  EC	 	 	 	in	al,dx	 	; байт состояния
1505	 C5D8  A8 02	 	 	 	test	al,2	 	; проверка бита ошибки
1506	 C5DA  74 0F	 	 	 	jz	stat_err	; нет ошибок при считывании б/с
1507	 C5DC	 	 	 	sense_abort:
1508	 C5DC  C6 06 0074 R FF	 	 	mov	diskw_status,sense_fail ; ошибки при считывании б/с
1509	 C5E1	 	 	 	g24:
1510	 C5E1  F9	 	 	 	stc	 	 	; установить флажок переноса
1511	 C5E2  C3	 	 	 	ret
1512	 C5E3	 	 	 	error_chk	endp
1513	 	 	 	 	
1514	 C5E3  C61A R	 	 	t_0	dw	type_0
1515	 C5E5  C627 R	 	 	t_1	dw	type_1
1516	 C5E7  C66A R	 	 	t_2	dw	type_2
1517	 C5E9  C677 R	 	 	t_3	dw	type_3
1518	 	 	 	 	
1519	 C5EB	 	 	 	stat_err:
1520	 C5EB  26: 8A 1E 0042 R	 	 	mov	bl,es:hd_error	; получение байта ошибки
1521	 C5F0  8A C3	 	 	 	mov	al,bl
1522	 C5F2  24 0F	 	 	 	and	al,0fh	 	; выделение кода ошибки(0-3 разр)
1523	 C5F4  80 E3 30	 	 	 	and	bl,00110000b	; выделение типа ошибки(4-5 разр)
1524	 C5F7  2A FF	 	 	 	sub	bh,bh	 	; обнулить ВН
1525	 C5F9  B1 03	 	 	 	mov	cl,3	 	; счетчик сдвига равен 3
1526	 C5FB  D3 EB	 	 	 	shr	bx,cl	 	; сдвинуть вправо тип ошибки
1527	 C5FD  2E: FF A7 C5E3 R	 	 	jmp	word ptr cs:[bx + offset t_0]	; переход по типу
1528	 	 	 	 	 	 	 	 	; ошибки:  000-тип 0
1529	 	 	 	 	 	 	 	 	;	   010-тип 1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-31
	 	 	 	 	 	 	 	09-15-88    


1530	 	 	 	 	 	 	 	 	;	   100-тип 2
1531	 	 	 	 	 	 	 	 	;	   110-тип 3
1532	 	 	 	 	 	assume	es:nothing
1533	 	 	 	 	
1534	 C602	 	 	 	type0_table	label	byte
1535	 C602  00 20 40 20 80 00	 	db	0,bad_cntlr,bad_seek,bad_cntlr,time_out,0,bad_cntlr
1536	       20	 	 	
1537	 C609  00 40	 	 	 	db	0,bad_seek
1538	 = 0009	 	 	 	type0_len	equ	$-type0_table
1539	 C60B	 	 	 	type1_table	label	byte
1540	 C60B  10 10 02 00 04	 	 	db	bad_ecc,bad_ecc,bad_addr_mark,0,record_not_fnd
1541	 C610  40 00 00 11 0B	 	 	db	bad_seek,0,0,data_corrected,bad_track
1542	 = 000A	 	 	 	type1_len	equ	$-type1_table
1543	 C615	 	 	 	type2_table	label	byte
1544	 C615  01 02	 	 	 	db	bad_cmd,bad_addr_mark
1545	 = 0002	 	 	 	type2_len	equ	$-type2_table
1546	 C617	 	 	 	type3_table	label	byte
1547	 C617  20 20 10	 	 	 	db	bad_cntlr,bad_cntlr,bad_ecc
1548	 = 0003	 	 	 	type3_len	equ	$-type3_table
1549	 	 	 	 	
1550	 	 	 	 	;-------Ошибки типа 0-----------------------------------------------
1551	 	 	 	 	
1552	 C61A	 	 	 	type_0:
1553	 C61A  BB C602 R	 	 	mov	bx,offset type0_table	; адрес таблицы ошибок типа 0
1554	 C61D  3C 09	 	 	 	cmp	al,type0_len	; проверить,определяется ли ошибка
1555	 C61F  73 63	 	 	 	jae	undef_err_l	; неопределяемая ошибка
1556	 C621  2E: D7	 	 	 	xlat	cs:type0_table	; поиск таблицы
1557	 C623  A2 0074 R	 	 	mov	diskw_status,al ; установить код ошибки
1558	 C626  C3	 	 	 	ret
1559	 	 	 	 	
1560	 	 	 	 	;-------Ошибки типа 1----------------------------------------------
1561	 	 	 	 	
1562	 C627	 	 	 	type_1:
1563	 C627  BB C60B R	 	 	mov	bx,offset type1_table	; адрес таблицы ошибок типа 1
1564	 C62A  8B C8	 	 	 	mov	cx,ax	 	; сохранить код ошибки
1565	 C62C  3C 0A	 	 	 	cmp	al,type1_len	; проверить,определяется ли ошибка
1566	 C62E  73 54	 	 	 	jae	undef_err_l	; неопределяемая ошибка
1567	 C630  2E: D7	 	 	 	xlat	cs:type1_table	; поиск таблицы
1568	 C632  A2 0074 R	 	 	mov	diskw_status,al ; установить код ошибки
1569	 C635  80 E1 08	 	 	 	and	cl,08h	 	; выделить 3 бит
1570	 C638  80 F9 08	 	 	 	cmp	cl,08h	 	; коррекция ЕСС?
1571	 C63B  75 2A	 	 	 	jnz	g3t0
1572	 	 	 	 	
1573	 	 	 	 	;-------Получение длины пакета ошибок ЕСС----------------------------
1574	 	 	 	 	
1575	 C63D  C6 06 0042 R 0D	 	 	mov	cmd_block+0,rd_ecc_cmd	; код операции
1576	 C642  2A C0	 	 	 	sub	al,al
1577	 C644  E8 C562 R	 	 	call	command 	; получение 6 байт команды
1578	 C647  72 1E	 	 	 	jc	g3t0
1579	 C649  E8 C68A R	 	 	call	hd_wait_req	; ожидание запроса
1580	 C64C  72 19	 	 	 	jc	g3t0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-32
	 	 	 	 	 	 	 	09-15-88    


1581	 C64E  E8 C771 R	 	 	call	port_0	 	; порт данных
1582	 C651  EC	 	 	 	in	al,dx	 	; получить байт состояния
1583	 C652  8A C8	 	 	 	mov	cl,al	 	; запомнить б/с в CL
1584	 C654  E8 C68A R	 	 	call	hd_wait_req	; ожидание запроса
1585	 C657  72 0E	 	 	 	jc	g3t0
1586	 C659  E8 C771 R	 	 	call	port_0	 	; порт данных
1587	 C65C  EC	 	 	 	in	al,dx	 	; получить байт состояния
1588	 C65D  A8 01	 	 	 	test	al,01h	 	; проверить 0 бит
1589	 C65F  74 06	 	 	 	jz	g3t0	 	; 0 бит равен 1-ошибка
1590	 C661  C6 06 0074 R 20	 	 	mov	diskw_status,bad_cntlr	; сбой контроллера
1591	 C666  F9	 	 	 	stc	 	 	; установить флажок переноса
1592	 C667	 	 	 	g3t0:
1593	 C667  8A C1	 	 	 	mov	al,cl	 	; получить байт состояния в AL
1594	 C669  C3	 	 	 	ret
1595	 	 	 	 	
1596	 	 	 	 	;-------Ошибки типа 2------------------------------------------------
1597	 	 	 	 	
1598	 C66A	 	 	 	type_2:
1599	 C66A  BB C615 R	 	 	mov	bx,offset type2_table	; адрес таблицы ошибок типа 2
1600	 C66D  3C 02	 	 	 	cmp	al,type2_len	; проверить,определяется ли ошибка
1601	 C66F  73 13	 	 	 	jae	undef_err_l	 	; неопределяемая ошибка
1602	 C671  2E: D7	 	 	 	xlat	cs:type2_table	 	; поиск таблицы
1603	 C673  A2 0074 R	 	 	mov	diskw_status,al 	; установить код ошибки
1604	 C676  C3	 	 	 	ret
1605	 	 	 	 	
1606	 	 	 	 	;-------Ошибки типа 3------------------------------------------------
1607	 	 	 	 	
1608	 C677	 	 	 	type_3:
1609	 C677  BB C617 R	 	 	mov	bx,offset type3_table	; адрес таблицы ошибок типа 3
1610	 C67A  3C 03	 	 	 	cmp	al,type3_len	; проверить,определяется ли ошибка
1611	 C67C  73 06	 	 	 	jae	undef_err_l	 	; неопределяемая ошибка
1612	 C67E  2E: D7	 	 	 	xlat	cs:type3_table	 	; поиск таблицы
1613	 C680  A2 0074 R	 	 	mov	diskw_status,al 	; установить код ошибки
1614	 C683  C3	 	 	 	ret
1615	 	 	 	 	
1616	 C684	 	 	 	undef_err_l:
1617	 C684  C6 06 0074 R BB	 	 	mov	diskw_status,undef_err	; наличие неопределяемой ошибки
1618	 C689  C3	 	 	 	ret
1619	 	 	 	 	
1620	 C68A	 	 	 	hd_wait_req	proc	near	; ожидание установки запроса
1621	 C68A  51	 	 	 	push	cx
1622	 C68B  2B C9	 	 	 	sub	cx,cx	 	; установить счетчик
1623	 C68D  E8 C77E R	 	 	call	port_1
1624	 C690	 	 	 	l1:
1625	 C690  EC	 	 	 	in	al,dx	 	; считывание состояния оборудования
1626	 C691  A8 01	 	 	 	test	al,r1_req	; проверка наличия запроса
1627	 C693  75 08	 	 	 	jnz	l2	 	; бит запроса установлен
1628	 C695  E2 F9	 	 	 	loop	l1	 	; ожидание запроса
1629	 C697  C6 06 0074 R 80	 	 	mov	diskw_status,time_out	; запрос не установлен
1630	 C69C  F9	 	 	 	stc	 	 	; установить флажок переноса
1631	 C69D	 	 	 	l2:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-33
	 	 	 	 	 	 	 	09-15-88    


1632	 C69D  59	 	 	 	pop	cx
1633	 C69E  C3	 	 	 	ret
1634	 C69F	 	 	 	hd_wait_req	endp
1635	 	 	 	 	
1636	 	 	 	 	;-------------------------------------------------------------------
1637	 	 	 	 	;	Установка ПДП
1638	 	 	 	 	;------------------------------------------------------------------
1639	 	 	 	 	;
1640	 	 	 	 	;	ВВОД
1641	 	 	 	 	;
1642	 	 	 	 	;	(AL)   -байт режима для ПДП
1643	 	 	 	 	;	(ES:BX)-адрес для данных считывания/записи
1644	 	 	 	 	;----------------------------------------------------------------------
1645	 C69F	 	 	 	dma_setupt	proc	near
1646	 C69F  50	 	 	 	push	ax	; сохраняем байт режима для ПДП
1647	 C6A0  A0 0046 R	 	 	mov	al,cmd_block+4	; получаем значение счетчика
1648	 C6A3  3C 81	 	 	 	cmp	al,81h	 	; 80Н-максимальное число секторов
1649	 C6A5  58	 	 	 	pop	ax	 	; байт режима
1650	 C6A6  72 02	 	 	 	jb	j1t
1651	 C6A8  F9	 	 	 	stc	 	; устанавливаем флажок переноса по ошибке
1652	 C6A9  C3	 	 	 	ret
1653	 C6AA	 	 	 	j1t:
1654	 C6AA  51	 	 	 	push	cx
1655	 C6AB  FA	 	 	 	cli
1656	 C6AC  E6 0C	 	 	 	out	dma+12,al
1657	 C6AE  50	 	 	 	push	ax
1658	 C6AF  58	 	 	 	pop	ax
1659	 C6B0  E6 0B	 	 	 	out	dma+11,al	; вывод байта режима в порт 0В ПДП
1660	 	 	 	 	
1661	 	 	 	 	;-------Генерация физического адреса----------------------------------
1662	 	 	 	 	
1663	 C6B2  8C C0	 	 	 	mov	ax,es	 	; получить значение ES
1664	 C6B4  B1 04	 	 	 	mov	cl,4	 	; установить счетчик сдвига
1665	 C6B6  D3 C0	 	 	 	rol	ax,cl	; циклически сдвинуть на 4 разр. содержимое АХ
1666	 C6B8  8A E8	 	 	 	mov	ch,al	; получить старшую часть ES в СН(4 ст.бита)
1667	 C6BA  24 F0	 	 	 	and	al,0f0h 	; обнулить младшие разряды AL
1668	 C6BC  03 C3	 	 	 	add	ax,bx	; сложить значение смещения(ВХ) со сдвинутым
1669	 	 	 	 	 	 	 	; значением сегментного регистра
1670	 C6BE  73 02	 	 	 	jnc	j33t	; проверка наличия переноса
1671	 C6C0  FE C5	 	 	 	inc	ch	; перенос означает,что 4 ст.бита должны быть
1672	 	 	 	 	 	 	 	; увеличены на 1
1673	 C6C2	 	 	 	j33t:
1674	 C6C2  50	 	 	 	push	ax	; сохранить физический адрес
1675	 C6C3  E6 06	 	 	 	out	dma+6,al    ; вывод первого байта адреса в порт 06 ПДП
1676	 C6C5  8A C4	 	 	 	mov	al,ah	    ; получить второй байт адреса
1677	 C6C7  E6 06	 	 	 	out	dma+6,al    ; вывод второго байта адреса в порт 06 ПДП
1678	 C6C9  8A C5	 	 	 	mov	al,ch	    ; получить 4 старших бита адреса
1679	 C6CB  24 0F	 	 	 	and	al,0fh	    ; выделение младших бит AL
1680	 C6CD  E6 82	 	 	 	out	dma_high,al ; вывод 4 ст.битов в регистр страницы
1681	 	 	 	 	
1682	 	 	 	 	;-------Определение счетчика-----------------------------------------
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-34
	 	 	 	 	 	 	 	09-15-88    


1683	 	 	 	 	
1684	 C6CF  A0 0046 R	 	 	mov	al,cmd_block+4	; получение числа блоков
1685	 C6D2  D0 E0	 	 	 	shl	al,1
1686	 C6D4  FE C8	 	 	 	dec	al
1687	 C6D6  8A E0	 	 	 	mov	ah,al
1688	 C6D8  B0 FF	 	 	 	mov	al,0ffh
1689	 	 	 	 	
1690	 	 	 	 	;-------Длинное считывание и длинная запись-----------------------------
1691	 	 	 	 	
1692	 C6DA  50	 	 	 	push	ax	 	; сохранить счетчик байт
1693	 C6DB  A0 0042 R	 	 	mov	al,cmd_block+0	; получение кода операции
1694	 C6DE  3C E5	 	 	 	cmp	al,rd_long_cmd	; длинное считывание ?
1695	 C6E0  74 07	 	 	 	je	add4
1696	 C6E2  3C E6	 	 	 	cmp	al,wr_long_cmd	; длинная запись?
1697	 C6E4  74 03	 	 	 	je	add4
1698	 C6E6  58	 	 	 	pop	ax	 	; восстановление счетчика
1699	 C6E7  EB 11	 	 	 	jmp	short	j20t
1700	 C6E9	 	 	 	add4:
1701	 C6E9  58	 	 	 	pop	ax	 	; восстановление счетчика
1702	 C6EA  B8 0204	 	 	 	mov	ax,516d 	; 512 байтов + 4 байта ЕСС
1703	 C6ED  53	 	 	 	push	bx	 	; сохранить регистр
1704	 C6EE  2A FF	 	 	 	sub	bh,bh
1705	 C6F0  8A 1E 0046 R	 	 	mov	bl,cmd_block+4	; получение числа блоков
1706	 C6F4  52	 	 	 	push	dx
1707	 C6F5  F7 E3	 	 	 	mul	bx	 	; вычисление количества байт
1708	 C6F7  5A	 	 	 	pop	dx
1709	 C6F8  5B	 	 	 	pop	bx
1710	 C6F9  48	 	 	 	dec	ax	 	; счет от 0 до N
1711	 C6FA	 	 	 	j20t:
1712	 C6FA  50	 	 	 	push	ax	 	; сохранить значение счетчика
1713	 C6FB  E6 07	 	 	 	out	dma+7,al	; вывод мл.байта счетчика в порт 07 ПДП
1714	 C6FD  8A C4	 	 	 	mov	al,ah	 	; получить старший байт счетчика
1715	 C6FF  E6 07	 	 	 	out	dma+7,al	; вывод ст.байта счетчика в порт 07 ПДП
1716	 C701  FB	 	 	 	sti	 	; установить признак разрешения прерывания
1717	 C702  59	 	 	 	pop	cx	 	; восстановить значение счетчика
1718	 C703  58	 	 	 	pop	ax	 	; восстановить значение адреса
1719	 C704  03 C1	 	 	 	add	ax,cx	 	; проверка границы области 64К
1720	 C706  59	 	 	 	pop	cx
1721	 C707  C3	 	 	 	ret
1722	 C708	 	 	 	dma_setupt	endp
1723	 	 	 	 	
1724	 	 	 	 	;---------------------------------------------------------------------
1725	 	 	 	 	;	Ожидание прерывания
1726	 	 	 	 	;--------------------------------------------------------------------
1727	 	 	 	 	
1728	 C708	 	 	 	wait_intt	proc	near
1729	 C708  FB	 	 	 	sti	 	; установить признак разрешения прерывания
1730	 C709  53	 	 	 	push	bx	; сохранить регистры
1731	 C70A  51	 	 	 	push	cx
1732	 C70B  06	 	 	 	push	es
1733	 C70C  56	 	 	 	push	si
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-35
	 	 	 	 	 	 	 	09-15-88    


1734	 C70D  1E	 	 	 	push	ds
1735	 	 	 	 	 	assume	ds:abs0
1736	 C70E  2B C0	 	 	 	sub	ax,ax
1737	 C710  8E D8	 	 	 	mov	ds,ax	 	; установка сегмента
1738	 C712  C4 36 0104 R	 	 	les	si,hf_tbl_vec	; адрес таблицы параметров FD_TBL в SI
1739	 	 	 	 	 	assume	ds:data
1740	 C716  1F	 	 	 	pop	ds	 	; восстановление сегмента DATA
1741	 	 	 	 	
1742	 	 	 	 	;-------Установка времени ожидания (time_out)-------------------------
1743	 	 	 	 	
1744	 C717  2A FF	 	 	 	sub	bh,bh
1745	 C719  26: 8A 5C 09	 	 	mov	bl,byte ptr es:[si][9]	; стандартный time_out из FD_TBL
1746	 C71D  8A 26 0042 R	 	 	mov	ah,cmd_block	 	; код операции в АН
1747	 C721  80 FC 04	 	 	 	cmp	ah,fmtdrv_cmd	 	; форматизация устройства?
1748	 C724  75 06	 	 	 	jnz	w5
1749	 C726  26: 8A 5C 0A	 	 	mov	bl,byte ptr es:[si][0ah]  ; time_out для форматизации
1750	 C72A  EB 09	 	 	 	jmp	short	w4
1751	 C72C	 	 	 	w5:
1752	 C72C  80 FC E3	 	 	 	cmp	ah,chk_drv_cmd	 	; проверка устройства?
1753	 C72F  75 04	 	 	 	jnz	w4
1754	 C731  26: 8A 5C 0B	 	 	mov	bl,byte ptr es:[si][0bh]  ; time_out для проверки
1755	 C735	 	 	 	w4:
1756	 C735  2B C9	 	 	 	sub	cx,cx	 	; установка счетчика
1757	 	 	 	 	
1758	 	 	 	 	;-------Ожидание прерывания------------------------------------------
1759	 	 	 	 	
1760	 C737	 	 	 	w1:
1761	 C737  E8 C77E R	 	 	call	port_1	 	; порт состояния
1762	 C73A  EC	 	 	 	in	al,dx	 	; считывание состояния контроллера
1763	 C73B  24 20	 	 	 	and	al,020h 	; 5 бит -запрос на прерывание
1764	 C73D  3C 20	 	 	 	cmp	al,020h 	; 5 бит установлен?
1765	 C73F  74 0A	 	 	 	jz	w2
1766	 C741  E2 F4	 	 	 	loop	w1	 	; счетчик ожидания равен 64К
1767	 C743  4B	 	 	 	dec	bx
1768	 C744  75 F1	 	 	 	jnz	w1
1769	 C746  C6 06 0074 R 80	 	 	mov	diskw_status,time_out
1770	 C74B	 	 	 	w2:
1771	 C74B  E8 C771 R	 	 	call	port_0	 	; порт данных
1772	 C74E  EC	 	 	 	in	al,dx	 	; считывание байта состояния
1773	 C74F  24 02	 	 	 	and	al,2	 	; выделение бита ошибки
1774	 C751  08 06 0074 R	 	 	or	diskw_status,al ; сохранить ошибку
1775	 C755  E8 C788 R	 	 	call	port_3
1776	 C758  32 C0	 	 	 	xor	al,al
1777	 C75A  EE	 	 	 	out	dx,al	 	; сброс маски прерывания
1778	 C75B  5E	 	 	 	pop	si	 	; восстановление регистров
1779	 C75C  07	 	 	 	pop	es
1780	 C75D  59	 	 	 	pop	cx
1781	 C75E  5B	 	 	 	pop	bx
1782	 C75F  C3	 	 	 	ret
1783	 C760	 	 	 	wait_intt	endp
1784	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-36
	 	 	 	 	 	 	 	09-15-88    


1785	 C760	 	 	 	hd_int	proc	near	 	; прерывание НМД
1786	 C760  50	 	 	 	push	ax
1787	 C761  B0 20	 	 	 	mov	al,eoi	 	; конец прерывания
1788	 C763  E6 20	 	 	 	out	int_ctl_port,al
1789	 C765  B0 07	 	 	 	mov	al,07h	 	; установить режим ПДП неработоспособным
1790	 C767  E6 0A	 	 	 	out	dma+10,al	; запись в порт 10 ПДП
1791	 C769  E4 21	 	 	 	in	al,021h
1792	 C76B  0C 20	 	 	 	or	al,020h
1793	 C76D  E6 21	 	 	 	out	021h,al
1794	 C76F  58	 	 	 	pop	ax
1795	 C770  CF	 	 	 	iret
1796	 C771	 	 	 	hd_int	endp
1797	 	 	 	 	
1798	 	 	 	 	;----------------------------------------------------------------------
1799	 	 	 	 	;	Порты: выработка значений портов по значению сдвига порта
1800	 	 	 	 	;----------------------------------------------------------------------
1801	 	 	 	 	
1802	 C771	 	 	 	port_0	proc	near
1803	 C771  BA 0320	 	 	 	mov	dx,hf_port	; базовое значение порта (320Н)
1804	 C774  50	 	 	 	push	ax
1805	 C775  2A E4	 	 	 	sub	ah,ah
1806	 C777  A0 0077 R	 	 	mov	al,port_off	; значение сдвига адреса порта
1807	 C77A  03 D0	 	 	 	add	dx,ax	 	; формирование адреса порта
1808	 C77C  58	 	 	 	pop	ax
1809	 C77D  C3	 	 	 	ret
1810	 C77E	 	 	 	port_0	endp
1811	 	 	 	 	
1812	 C77E	 	 	 	port_1	proc	near
1813	 C77E  E8 C771 R	 	 	call	port_0
1814	 C781  42	 	 	 	inc	dx
1815	 C782  C3	 	 	 	ret
1816	 C783	 	 	 	port_1	endp
1817	 	 	 	 	
1818	 C783	 	 	 	port_2	proc	near
1819	 C783  E8 C77E R	 	 	call	port_1
1820	 C786  42	 	 	 	inc	dx
1821	 C787  C3	 	 	 	ret
1822	 C788	 	 	 	port_2	endp
1823	 	 	 	 	
1824	 C788	 	 	 	port_3	proc	near
1825	 C788  E8 C783 R	 	 	call	port_2
1826	 C78B  42	 	 	 	inc	dx
1827	 C78C  C3	 	 	 	ret
1828	 C78D	 	 	 	port_3	endp
1829	 	 	 	 	
1830	 	 	 	 	;-------------------------------------------------------------------
1831	 	 	 	 	;-------Определить сдвиг таблицы параметров----------------------------
1832	 	 	 	 	
1833	 C78D	 	 	 	sw2_offs	proc	near
1834	 C78D  E8 C783 R	 	 	call	port_2
1835	 C790  EC	 	 	 	in	al,dx	; считывание конфигурации переключателей
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-37
	 	 	 	 	 	 	 	09-15-88    


1836	 C791  50	 	 	 	push	ax	; запомнить переключатели
1837	 C792  E8 C77E R	 	 	call	port_1	; порт состояния
1838	 C795  EC	 	 	 	in	al,dx	; считывание состояния контроллера
1839	 C796  24 02	 	 	 	and	al,2	; проверяется бит 1
1840	 C798  58	 	 	 	pop	ax	; восстановление переключателей
1841	 C799  75 16	 	 	 	jnz	sw2_offs_err
1842	 C79B  8A 26 0043 R	 	 	mov	ah,cmd_block+1	; устройство + головка
1843	 C79F  80 E4 20	 	 	 	and	ah,00100000b	; устройство 0 или 1
1844	 C7A2  75 04	 	 	 	jnz	sw2_and
1845	 C7A4  D0 E8	 	 	 	shr	al,1	 	; в AL -конфигурация переключателей
1846	 C7A6  D0 E8	 	 	 	shr	al,1	 	; сдвиг на 2 разряда вправо
1847	 C7A8	 	 	 	sw2_and:
1848	 C7A8  24 03	 	 	 	and	al,011b 	; сохранить 2 младших разряда
1849	 C7AA  B1 04	 	 	 	mov	cl,4	 	; установка счетчика сдвига
1850	 C7AC  D2 E0	 	 	 	shl	al,cl	 	; сдвиг на 4 разр.-определение смещения
1851	 	 	 	 	 	 	 	 	;	00Н-тип 0
1852	 	 	 	 	 	 	 	 	;	10Н-тип 1
1853	 	 	 	 	 	 	 	 	;	20Н-тип 2
1854	 	 	 	 	 	 	 	 	;	30Н-тип 3
1855	 C7AE  2A E4	 	 	 	sub	ah,ah
1856	 C7B0  C3	 	 	 	ret
1857	 C7B1	 	 	 	sw2_offs_err:
1858	 C7B1  F9	 	 	 	stc	 	; установить флажок переноса по ошибке
1859	 C7B2  C3	 	 	 	ret
1860	 C7B3	 	 	 	sw2_offs	endp
1861	 	 	 	 	
1862	 C7B3  30 38 2F 31 36 2F	 	db	'08/16/82'
1863	       38 32	 	 	
1864	 	 	 	 	
1865	 C7BB	 	 	 	end_address	label	byte
1866	 	 	 	 	;   Изменения для НМД
1867	 	 	 	 	
1868	 	 	 	 	 	assume cs:code,ss:code,es:abs0,ds:data
1869	 	 	 	 	
1870	 C7BB	 	 	 	rom_check	proc	near
1871	 C7BB  B8 0040	 	 	 	mov	ax,dat
1872	 C7BE  8E C0	 	 	 	mov	es,ax
1873	 C7C0  2A E4	 	 	 	sub	ah,ah
1874	 C7C2  8A 47 02	 	 	 	mov	al,[bx+2]
1875	 C7C5  B1 09	 	 	 	mov	cl,09h
1876	 C7C7  D3 E0	 	 	 	shl	ax,cl
1877	 C7C9  8B C8	 	 	 	mov	cx,ax
1878	 C7CB  51	 	 	 	push	cx
1879	 C7CC  B9 0004	 	 	 	mov	cx,4
1880	 C7CF  D3 E8	 	 	 	shr	ax,cl
1881	 C7D1  03 D0	 	 	 	add	dx,ax
1882	 C7D3  59	 	 	 	pop	cx
1883	 C7D4  E8 C854 R	 	 	call	ros_checksum_cnt
1884	 C7D7  74 06	 	 	 	jz	rom_check_1
1885	 C7D9  E8 C7F3 R	 	 	call	rom_err
1886	 C7DC  EB 14 90	 	 	 	jmp	rom_check_end
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-38
	 	 	 	 	 	 	 	09-15-88    


1887	 C7DF	 	 	 	rom_check_1:
1888	 C7DF  52	 	 	 	push	dx
1889	 	 	 	 	 	assume es:data
1890	 C7E0  26: C7 06 0067 R 0003	 	mov	es:io_rom_init,0003h
1891	 C7E7  26: 8C 1E 0069 R	 	 	mov	es:io_rom_seg,ds
1892	 C7EC  26: FF 1E 0067 R	 	 	call	dword ptr es:io_rom_init
1893	 	 	 	 	 	assume es:abs0
1894	 C7F1  5A	 	 	 	pop	dx
1895	 C7F2	 	 	 	rom_check_end:
1896	 C7F2  C3	 	 	 	ret
1897	 C7F3	 	 	 	rom_check	endp
1898	 	 	 	 	
1899	 	 	 	 	
1900	 	 	 	 	
1901	 C7F3	 	 	 	rom_err   proc	near
1902	 C7F3  52	 	 	 	push	dx
1903	 C7F4  50	 	 	 	push	ax
1904	 C7F5  8C DA	 	 	 	mov	dx,ds
1905	 C7F7  81 FA C800	 	 	cmp	dx,0c800h
1906	 C7FB  7C 0C	 	 	 	jl	rom_err_beep
1907	 C7FD  E8 C816 R	 	 	call	prt_seg
1908	 C800  BE C811 R	 	 	mov	si,offset f3a
1909	 C803  E8 C840 R	 	 	call	e_msg
1910	 C806	 	 	 	rom_err_end:
1911	 C806  58	 	 	 	pop	ax
1912	 C807  5A	 	 	 	pop	dx
1913	 C808  C3	 	 	 	ret
1914	 C809	 	 	 	rom_err_beep:
1915	 C809  BA 0102	 	 	 	mov	dx,0102h
1916	 C80C  E8 E5A0 R	 	 	call	err_beep
1917	 C80F  EB F5	 	 	 	jmp	short rom_err_end
1918	 C811	 	 	 	rom_err endp
1919	 	 	 	 	
1920	 	 	 	 	
1921	 	 	 	 	
1922	 C811  52 4F 4D 0D 0A	 	f3a	db	'ROM',13,10
1923	 	 	 	 	
1924	 	 	 	 	
1925	 C816	 	 	 	prt_seg proc	near
1926	 C816  8A C6	 	 	 	mov	al,dh
1927	 C818  E8 C82B R	 	 	call	xpc_byte
1928	 C81B  8A C2	 	 	 	mov	al,dl
1929	 C81D  E8 C82B R	 	 	call	xpc_byte
1930	 C820  B0 30	 	 	 	mov	al,'0'
1931	 C822  E8 D1B4 R	 	 	call	prt_hex
1932	 C825  B0 20	 	 	 	mov	al,' '
1933	 C827  E8 D1B4 R	 	 	call	prt_hex
1934	 C82A  C3	 	 	 	ret
1935	 C82B	 	 	 	prt_seg endp
1936	 	 	 	 	
1937	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-39
	 	 	 	 	 	 	 	09-15-88    


1938	 C82B	 	 	 	xpc_byte  proc	near
1939	 C82B  50	 	 	 	push	ax
1940	 C82C  B1 04	 	 	 	mov	cl,4
1941	 C82E  D2 E8	 	 	 	shr	al,cl
1942	 C830  E8 C836 R	 	 	call	xlat_pr
1943	 C833  58	 	 	 	pop	ax
1944	 C834  24 0F	 	 	 	and	al,0fh
1945	 	 	 	 	
1946	 	 	 	 	
1947	 C836	 	 	 	xlat_pr proc	near
1948	 C836  04 90	 	 	 	add	al,090h
1949	 C838  27	 	 	 	daa
1950	 C839  14 40	 	 	 	adc	al,040h
1951	 C83B  27	 	 	 	daa
1952	 C83C  E8 D1B4 R	 	 	call	prt_hex
1953	 C83F  C3	 	 	 	ret
1954	 C840	 	 	 	xlat_pr endp
1955	 C840	 	 	 	xpc_byte endp
1956	 	 	 	 	
1957	 	 	 	 	
1958	 	 	 	 	
1959	 C840	 	 	 	e_msg	proc	near
1960	 C840  8B EE	 	 	 	mov	bp,si
1961	 C842  E8 C846 R	 	 	call	p_msg1
1962	 C845  C3	 	 	 	ret
1963	 C846	 	 	 	e_msg	endp
1964	 	 	 	 	
1965	 	 	 	 	
1966	 	 	 	 	
1967	 C846	 	 	 	p_msg1	proc	near
1968	 C846	 	 	 	g12a:
1969	 C846  2E: 8A 04	 	 	mov	al,cs:[si]
1970	 C849  46	 	 	 	inc	si
1971	 C84A  50	 	 	 	push	ax
1972	 C84B  E8 D1B4 R	 	 	call	prt_hex
1973	 C84E  58	 	 	 	pop	ax
1974	 C84F  3C 0A	 	 	 	cmp	al,10
1975	 C851  75 F3	 	 	 	jne	g12a
1976	 C853  C3	 	 	 	ret
1977	 C854	 	 	 	p_msg1	endp
1978	 	 	 	 	
1979	 	 	 	 	
1980	 C854	 	 	 	ros_checksum_cnt  proc	near
1981	 C854  32 C0	 	 	 	xor	al,al
1982	 C856	 	 	 	c26k:
1983	 C856  02 07	 	 	 	add	al,ds:[bx]
1984	 C858  43	 	 	 	inc	bx
1985	 C859  E2 FB	 	 	 	loop	c26k
1986	 C85B  0A C0	 	 	 	or	al,al
1987	 C85D  C3	 	 	 	ret
1988	 C85E	 	 	 	ros_checksum_cnt  endp
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-40
	 	 	 	 	 	 	 	09-15-88    


1989	 	 	 	 	;-----------------------------------------------------------
1990	 	 	 	 	;
1991	 	 	 	 	;     INT 10  (AH=13H)
1992	 	 	 	 	;
1993	 	 	 	 	;     Пересылка цепочки символов
1994	 	 	 	 	;
1995	 	 	 	 	;     ES:BP  - начальный адрес цепочки символов
1996	 	 	 	 	;     CX     - количество символов
1997	 	 	 	 	;     DH,DL  - строка и колонка для начала записи
1998	 	 	 	 	;     BH     - номер страницы
1999	 	 	 	 	;
2000	 	 	 	 	;     AL=0:
2001	 	 	 	 	;	       цепочка = (символ,символ,символ,...)
2002	 	 	 	 	;	       BL = атрибут
2003	 	 	 	 	;	       курсор не движется
2004	 	 	 	 	;     AL = 1:
2005	 	 	 	 	;	       цепочка = (символ,символ,символ,...)
2006	 	 	 	 	;	       BL = атрибут
2007	 	 	 	 	;	       курсор движется
2008	 	 	 	 	;     AL =2:
2009	 	 	 	 	;	       цепочка = (символ,атрибут,символ,атрибут,...)
2010	 	 	 	 	;	       курсор не движется
2011	 	 	 	 	;     AL = 3:
2012	 	 	 	 	;	       цепочка = (символ,атрибут,символ,атрибут,...)
2013	 	 	 	 	;	       курсор движется
2014	 	 	 	 	;
2015	 	 	 	 	;-----------------------------------------------------
2016	 C85E  E9 C8F0 R	 	byxod1: jmp	byxod
2017	 C861	 	 	 	ah13:
2018	 	 	 	 	
2019	 	 	 	 	
2020	 C861  55	 	 	 	push	bp
2021	 C862  3C 04	 	 	 	cmp	al,04
2022	 C864  73 F8	 	 	 	jnb	byxod1
2023	 C866  83 F9 00	 	 	 	cmp	cx,0
2024	 C869  74 F3	 	 	 	je	byxod1
2025	 C86B  53	 	 	 	push	bx
2026	 C86C  8A DF	 	 	 	mov	bl,bh	; номер страницы
2027	 C86E  2A FF	 	 	 	sub	bh,bh
2028	 C870  D1 E3	 	 	 	shl	bx,1
2029	 C872  8B B7 0050 R	 	 	mov	si,word ptr [bx + offset cursor_posn]	; si=позиция
2030	 	 	 	 	 	 	 	; курсора для заданной страницы
2031	 C876  5B	 	 	 	pop	bx
2032	 C877  56	 	 	 	push	si
2033	 C878  50	 	 	 	push	ax
2034	 C879  B8 0200	 	 	 	mov	ax,200h ; установить позицию курсора
2035	 C87C  CD 10	 	 	 	int	10h
2036	 C87E  58	 	 	 	pop	ax
2037	 C87F  51	 	 	rdcimb: push	cx
2038	 C880  53	 	 	 	push	bx	; номер активной страницы
2039	 C881  50	 	 	 	push	ax
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-41
	 	 	 	 	 	 	 	09-15-88    


2040	 C882  86 C4	 	 	 	xchg	al,ah
2041	 C884  26: 8A 46 00	 	 	mov	al,es:[bp+0]	; считать в AL символ строки
2042	 C888  45	 	 	 	inc	bp
2043	 C889  3C 0D	 	 	 	cmp	al,0dh	; возврат каретки
2044	 C88B  74 2A	 	 	 	jz	zaptel
2045	 C88D  3C 0A	 	 	 	cmp	al,0ah	; граница поля
2046	 C88F  74 26	 	 	 	jz	zaptel
2047	 C891  3C 08	 	 	 	cmp	al,08	; возврат на одну позицию
2048	 C893  74 22	 	 	 	jz	zaptel
2049	 C895  3C 07	 	 	 	cmp	al,07	; звуковой сигнал
2050	 C897  74 1E	 	 	 	jz	zaptel
2051	 C899  B9 0001	 	 	 	mov	cx,0001
2052	 C89C  80 FC 02	 	 	 	cmp	ah,2
2053	 C89F  73 0F	 	 	 	jnb	picat
2054	 C8A1  B4 09	 	 	piczn:	mov	ah,09	; писать знак/атрибут
2055	 C8A3  CD 10	 	 	 	int	10h
2056	 C8A5  FE C2	 	 	 	inc	dl	; колонка
2057	 C8A7  3A 16 004A R	 	 	cmp	dl,byte ptr crt_cols
2058	 C8AB  73 1B	 	 	 	jnb	pockol
2059	 C8AD  EB 29 90	 	 	 	jmp	ustkur
2060	 C8B0  26: 8A 5E 00	 	picat:	mov	bl,es:[bp+0]
2061	 C8B4  45	 	 	 	inc	bp
2062	 C8B5  EB EA	 	 	 	jmp	piczn
2063	 C8B7  B4 0E	 	 	zaptel: mov	ah,0eh	; запись телетайпа
2064	 C8B9  CD 10	 	 	 	int	10h
2065	 C8BB  8A DF	 	 	 	mov	bl,bh
2066	 C8BD  2A FF	 	 	 	sub	bh,bh
2067	 C8BF  D1 E3	 	 	 	shl	bx,1
2068	 C8C1  8B 97 0050 R	 	 	mov	dx,word ptr [bx + offset cursor_posn]
2069	 C8C5  EB 16 90	 	 	 	jmp	bozin
2070	 C8C8  80 FE 24	 	 	pockol: cmp	dh,24h	; последняя строка ?
2071	 C8CB  75 07	 	 	 	jnz	nepocl
2072	 C8CD  B8 0E0A	 	 	 	mov	ax,0e0ah	; перевод строки
2073	 C8D0  CD 10	 	 	 	int	10h
2074	 C8D2  FE CE	 	 	 	dec	dh
2075	 C8D4  FE C6	 	 	nepocl: inc	dh
2076	 C8D6  2A D2	 	 	 	sub	dl,dl
2077	 C8D8  B8 0200	 	 	ustkur: mov	ax,200h ; установить курсор
2078	 C8DB  CD 10	 	 	 	int	10h
2079	 C8DD  58	 	 	bozin:	pop	ax
2080	 C8DE  5B	 	 	 	pop	bx
2081	 C8DF  59	 	 	 	pop	cx
2082	 C8E0  E2 9D	 	 	 	loop	rdcimb
2083	 C8E2  5A	 	 	 	pop	dx
2084	 C8E3  3C 01	 	 	 	cmp	al,01
2085	 C8E5  74 09	 	 	 	jz	byxod
2086	 C8E7  3C 03	 	 	 	cmp	al,03
2087	 C8E9  74 05	 	 	 	jz	byxod
2088	 C8EB  B8 0200	 	 	 	mov	ax,200h
2089	 C8EE  CD 10	 	 	 	int	10h	; установить	старую позицию курсора
2090	 C8F0  5D	 	 	byxod:	pop	bp
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-42
	 	 	 	 	 	 	 	09-15-88    


2091	 C8F1  E9 F1DC R	 	 	jmp	video_return
2092	 C8F4  CF	 	 	 	iret
2093	 	 	 	 	
2094	 	 	 	 	;=============================================================
2095	 	 	 	 	; ПОДДЕРЖКА АДАПТЕРОВ СТЫКА С2 В АСИНХРОННОМ РЕЖИМЕ ПО ОПРОСУ
2096	 	 	 	 	; МОДУЛЬ ПОЛУЧАЕТ УПРАВЛЕНИЕ ПО КОМАНДЕ  INT  14H
2097	 	 	 	 	;=============================================================
2098	 	 	 	 	;  (AH) = 00h - инициализировать адаптер
2099	 	 	 	 	;	(AL) - параметры:
2100	 	 	 	 	;	   7	 6	5      4      3       2      1	   0
2101	 	 	 	 	;	   ---скорость---      контроль    стоп-бит  -длина-
2102	 	 	 	 	;	   000 - 110	       Х0-нет	    0 - 1    10 - 7 бит
2103	 	 	 	 	;	   001 - 150	       01-нечет     1 - 2    11 - 8 бит
2104	 	 	 	 	;	   010 - 300	       11-чет
2105	 	 	 	 	;	   011 - 600
2106	 	 	 	 	;	   100 - 1200
2107	 	 	 	 	;	   101 - 2400
2108	 	 	 	 	;	   110 - 4800
2109	 	 	 	 	;	   111 - 9600
2110	 	 	 	 	;	(DX) - номер адаптера стыка С2 (0,1)
2111	 	 	 	 	;     ВЫХОД:
2112	 	 	 	 	;	 ----------- (AH) ------------
2113	 	 	 	 	;	 7   6	 5   4	 3   2	 1   0
2114	 	 	 	 	;	 |   |	 |   |	 |   |	 |   |___ приемник содержит данные
2115	 	 	 	 	;	 |   |	 |   |	 |   |	 |_______ переполнение
2116	 	 	 	 	;	 |   |	 |   |	 |   |___________ ошибка четности
2117	 	 	 	 	;	 |   |	 |   |	 |_______________ ошибка стоп-бита
2118	 	 	 	 	;	 |   |	 |   |___________________ пауза
2119	 	 	 	 	;	 |   |	 |_______________________ адаптер готов к передаче
2120	 	 	 	 	;	 |   |___________________________ передатчик пуст
2121	 	 	 	 	;	 |_______________________________ тайм-аут
2122	 	 	 	 	;
2123	 	 	 	 	;	 ------------- (AL) ----------
2124	 	 	 	 	;	 7   6	 5   4	 3   2	 1   0
2125	 	 	 	 	;	 |   |	 |   |	 0   0	 0   0
2126	 	 	 	 	;	 |   |	 |   |	 |   |	 |   |___ изменен бит 4
2127	 	 	 	 	;	 |   |	 |   |	 |   |	 |_______ изменен бит 5
2128	 	 	 	 	;	 |   |	 |   |	 |   |___________ изменен бит 6
2129	 	 	 	 	;	 |   |	 |   |	 |_______________ изменен бит 7
2130	 	 	 	 	;	 |   |	 |   |___________________ готов к передаче (цепь 106 вкл)
2131	 	 	 	 	;	 |   |	 |_______________________ аппаратура передачи данных готова
2132	 	 	 	 	;	 |   |	 	 	 	  (цепь 107 вкл)
2133	 	 	 	 	;	 |   |___________________________ индикатор вызова (цепь 125 вкл)
2134	 	 	 	 	;	 |_______________________________ детектор линейного
2135	 	 	 	 	;	 	 	 	 	  сигнала (цепь 109 вкл)
2136	 	 	 	 	;	 ЗАМЕЧАНИЕ: Если бит 7 в AH равен 1, значение остальных бит в AH
2137	 	 	 	 	;	 	    непредсказуемо
2138	 	 	 	 	;  (AH) = 01h - передать символ
2139	 	 	 	 	;	(AL) - символ для передачи
2140	 	 	 	 	;	(DX) - номер адаптера стыка С2 (0,1)
2141	 	 	 	 	;     ВЫХОД:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-43
	 	 	 	 	 	 	 	09-15-88    


2142	 	 	 	 	;	(AL) сохраняется
2143	 	 	 	 	;	(AH) - как при инициализации ((AH) = 0)
2144	 	 	 	 	;  (AH) = 02h - принять символ из канала связи
2145	 	 	 	 	;	(DX) - номер адаптера стыка С2 (0,1)
2146	 	 	 	 	;     ВЫХОД:
2147	 	 	 	 	;	(AL) - принятый символ
2148	 	 	 	 	;	(AH) - как при инициализации ((AH) = 0)
2149	 	 	 	 	;  (AH) = 03h - уточнить состояние
2150	 	 	 	 	;	(DX) - номер адаптера стыка С2 (0,1)
2151	 	 	 	 	;     ВЫХОД:
2152	 	 	 	 	;	(AL) и (AH) - как при инициализации ((AH) = 0)
2153	 	 	 	 	;  (AH) = FFh - расширенная инициализация адаптера стыка С2
2154	 	 	 	 	;	-------------- (CL) ---------------
2155	 	 	 	 	;	7    6	  5    4    3	 2    1   0
2156	 	 	 	 	;	0    0	  0    0    ----скорость----
2157	 	 	 	 	;	 	 	 	 0-50
2158	 	 	 	 	;	 	 	 	 1-75
2159	 	 	 	 	;	 	 	 	 2-100
2160	 	 	 	 	;	 	 	 	 3-110
2161	 	 	 	 	;	 	 	 	 4-150
2162	 	 	 	 	;	 	 	 	 5-200
2163	 	 	 	 	;	 	 	 	 6-300
2164	 	 	 	 	;	 	 	 	 7-600
2165	 	 	 	 	;	 	 	 	 8-1200
2166	 	 	 	 	;	 	 	 	 9-2400
2167	 	 	 	 	;	 	 	 	 A-4800
2168	 	 	 	 	;	 	 	 	 B-6400
2169	 	 	 	 	;	 	 	 	 C-9600
2170	 	 	 	 	;	 	 	 	 D-19200
2171	 	 	 	 	;	------------------- (AL) -----------------------
2172	 	 	 	 	;	7     6     5	   4	  3	  2	 1     0
2173	 	 	 	 	;	стоп-бит    контроль	  --длина--	 1     0
2174	 	 	 	 	;	 01-1	    Х0 - нет	  00 - 5 бит
2175	 	 	 	 	;	 10-1.5     01 - нечет	  01 - 6 бит
2176	 	 	 	 	;	 11-2	    11 - чет	  10 - 7 бит
2177	 	 	 	 	;	 	 	 	  11 - 8 бит
2178	 	 	 	 	;	(DX) - номер адаптера стыка С2 (0,1)
2179	 	 	 	 	;     ВЫХОД:
2180	 	 	 	 	;	(AL) и (AH) - как при инициализации ((AH) = 0)
2181	 	 	 	 	;	 ЗАМЕЧАНИЕ: Эта функция используется только для ЕС1840, ЕС1841
2182	 	 	 	 	;	 	    для адаптеров стыка С2 в модуле ЕС1840.0004
2183	 	 	 	 	 	assume	cs:code,ds:data
2184	 C8F5	 	 	 	rs232_io	proc	far
2185	 C8F5  FB	 	 	 	STI
2186	 C8F6  1E	 	 	 	push	ds
2187	 C8F7  53	 	 	 	push	bx
2188	 C8F8  51	 	 	 	push	cx
2189	 C8F9  52	 	 	 	push	dx
2190	 C8FA  56	 	 	 	push	si
2191	 C8FB  80 FC 00	 	 	 	cmp	ah,0	; проверить вид инициализации (если есть)
2192	 C8FE  75 2F	 	 	 	jne	v0ok	; обойти преобразование
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-44
	 	 	 	 	 	 	 	09-15-88    


2193	 	 	 	 	;------- преобразовать (AX) к виду как при (AH) = FFh -----------
2194	 	 	 	 	;------ постоянные значения
2195	 C900  B4 4A	 	 	 	mov	ah,01001010b
2196	 	 	 	 	;------ длина
2197	 C902  A8 01	 	 	 	test	al,1
2198	 C904  74 03	 	 	 	jz	v0p1
2199	 C906  80 CC 04	 	 	 	or	ah,00000100b
2200	 	 	 	 	;------стоп-биты
2201	 C909	 	 	 	v0p1:
2202	 C909  A8 04	 	 	 	test	al,4
2203	 C90B  74 03	 	 	 	jz	v0p2
2204	 C90D  80 CC 80	 	 	 	or	ah,80h
2205	 	 	 	 	;------ контроль
2206	 C910	 	 	 	v0p2:
2207	 C910  A8 08	 	 	 	test	al,00001000b
2208	 C912  74 0A	 	 	 	jz	v0p3
2209	 C914  80 CC 10	 	 	 	or	ah,00010000b
2210	 C917  A8 10	 	 	 	test	al,00010000b
2211	 C919  74 03	 	 	 	jz	v0p3
2212	 C91B  80 CC 20	 	 	 	or	ah,00100000b
2213	 	 	 	 	;------ скорость и номер функции
2214	 C91E	 	 	 	v0p3:
2215	 C91E  B1 05	 	 	 	mov	cl,5
2216	 C920  D2 E8	 	 	 	shr	al,cl
2217	 C922  2A FF	 	 	 	sub	bh,bh
2218	 C924  8A D8	 	 	 	mov	bl,al
2219	 C926  2E: 8A 8F CADB R	 	 	mov	cl,cs: z0b[bx]
2220	 C92B  8A C4	 	 	 	mov	al,ah
2221	 C92D  B4 FF	 	 	 	mov	ah,0ffh
2222	 	 	 	 	;========================================================
2223	 C92F	 	 	 	v0ok:
2224	 	 	 	 	;-------- загрузить базовый адрес адаптера -------------
2225	 C92F  8B F2	 	 	 	mov	si,dx
2226	 C931  D1 E6	 	 	 	shl	si,1
2227	 C933  BA 0040	 	 	 	mov	dx,dat
2228	 C936  8E DA	 	 	 	mov	ds,dx
2229	 C938  8B 14	 	 	 	mov	dx,[si]
2230	 C93A  0B D2	 	 	 	or	dx,dx
2231	 C93C  75 03	 	 	 	jnz	v00
2232	 C93E  E9 CA0F R	 	 	jmp	v0to	; недействительный адаптер
2233	 	 	 	 	;------ выбрать функцию --------------------------------
2234	 C941	 	 	 	v00:
2235	 C941  FE CC	 	 	 	dec	ah
2236	 C943  75 03	 	 	 	jnz	$+5
2237	 C945  E9 C9E6 R	 	 	jmp	v0b	; передать символ
2238	 C948  FE CC	 	 	 	dec	ah
2239	 C94A  75 03	 	 	 	jnz	$+5
2240	 C94C  E9 CA1B R	 	 	jmp	v0c	; принять символ
2241	 C94F  FE CC	 	 	 	dec	ah
2242	 C951  75 03	 	 	 	jnz	$+5
2243	 C953  E9 CA45 R	 	 	jmp	v0d	; уточнить состояние
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-45
	 	 	 	 	 	 	 	09-15-88    


2244	 C956  80 FC FC	 	 	 	cmp	ah,0fch
2245	 C959  74 03	 	 	 	je	v0a	; расширенная инициализация
2246	 C95B  E9 CA0F R	 	 	jmp	v0to	; недействительная функция
2247	 	 	 	 	;============================================================
2248	 	 	 	 	;------ функция FFh - расширенная инициализация ---------
2249	 C95E	 	 	 	v0a:
2250	 C95E  50	 	 	 	push	ax
2251	 	 	 	 	;------ записать управляющее слово адаптера
2252	 C95F  83 C2 07	 	 	 	add	dx,7
2253	 C962  B0 8A	 	 	 	mov	al,8ah
2254	 C964  EE	 	 	 	out	dx,al	;упр. слово --> 2/3ff
2255	 	 	 	 	;----- замаскировать все прерывания адаптера
2256	 C965  4A	 	 	 	dec	dx
2257	 C966  B0 08	 	 	 	mov	al,8
2258	 C968  EE	 	 	 	out	dx,al	;маски запрета прерываний --> 2/3fe
2259	 	 	 	 	;------ выбрать таймер
2260	 C969  83 EA 02	 	 	 	sub	dx,2
2261	 C96C  8B DA	 	 	 	mov	bx,dx
2262	 C96E  B0 80	 	 	 	mov	al,80h
2263	 C970  B6 03	 	 	 	mov	dh,3
2264	 C972  FA	 	 	 	CLI
2265	 C973  EE	 	 	 	out	dx,al	;выбор таймера --> 3fc
2266	 C974  8B D3	 	 	 	mov	dx,bx
2267	 	 	 	 	;------ определить смещение делителя скорости
2268	 C976  D0 E1	 	 	 	shl	cl,1
2269	 C978  2A ED	 	 	 	sub	ch,ch
2270	 C97A  8B D9	 	 	 	mov	bx,cx
2271	 	 	 	 	;----- записать управляющее слово таймера
2272	 C97C  8B CA	 	 	 	mov	cx,dx
2273	 C97E  BA 03FB	 	 	 	mov	dx,3fbh
2274	 C981  B0 36	 	 	 	mov	al,36h
2275	 C983  80 FD 03	 	 	 	cmp	ch,3
2276	 C986  74 02	 	 	 	je	v0a1
2277	 C988  B0 76	 	 	 	mov	al,76h
2278	 C98A	 	 	 	v0a1:
2279	 C98A  EE	 	 	 	out	dx,al	;упр. слово --> 3fb
2280	 	 	 	 	;------ записать делитель скорости
2281	 C98B  83 EA 03	 	 	 	sub	dx,3
2282	 C98E  80 FD 03	 	 	 	cmp	ch,3
2283	 C991  74 01	 	 	 	je	v0a2
2284	 C993  42	 	 	 	inc	dx
2285	 C994	 	 	 	v0a2:
2286	 C994  2E: 8B 87 CABF R	 	 	mov	ax,cs: z0a[bx]
2287	 C999  EE	 	 	 	out	dx,al	;младший байт делителя --> 3f8/3f9
2288	 C99A  E8 CABE R	 	 	call	v0z	;задержка
2289	 C99D  8A C4	 	 	 	mov	al,ah
2290	 C99F  EE	 	 	 	out	dx,al	;старший байт делителя --> 3f8/3f9
2291	 C9A0  8B D1	 	 	 	mov	dx,cx
2292	 C9A2  80 FE 03	 	 	 	cmp	dh,3
2293	 C9A5  74 07	 	 	 	je	v0a3
2294	 	 	 	 	;------ восстановить режим адаптера в 3fc
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-46
	 	 	 	 	 	 	 	09-15-88    


2295	 C9A7  B6 03	 	 	 	mov	dh,3
2296	 C9A9  B0 08	 	 	 	mov	al,8
2297	 C9AB  EE	 	 	 	out	dx,al	;режим --> 3fc
2298	 C9AC  B6 02	 	 	 	mov	dh,2
2299	 C9AE	 	 	 	v0a3:
2300	 	 	 	 	;------ установить контроллер прерываний
2301	 C9AE  B0 A4	 	 	 	mov	al,0A4h
2302	 C9B0  E4 21	 	 	 	in	al,21h
2303	 C9B2  8A E0	 	 	 	mov	ah,al
2304	 C9B4  B0 A4	 	 	 	mov	al,0a4h
2305	 C9B6  E6 21	 	 	 	out	21h,al	; открыть маски IRQ3,IRQ4
2306	 C9B8  B0 0C	 	 	 	mov	al,0ch
2307	 C9BA  E6 20	 	 	 	out	20h,al	; уст. режим POLL
2308	 C9BC  90	 	 	 	nop
2309	 C9BD  90	 	 	 	nop
2310	 C9BE  90	 	 	 	nop
2311	 C9BF  E4 20	 	 	 	in	al,20h	; сбр. режима POLL
2312	 C9C1  90	 	 	 	nop
2313	 C9C2  90	 	 	 	nop
2314	 C9C3  90	 	 	 	nop
2315	 C9C4  B0 20	 	 	 	mov	al,20h	; СБРОС ложного прерывания
2316	 C9C6  E6 20	 	 	 	out	20h,al
2317	 C9C8  8A C4	 	 	 	mov	al,ah
2318	 C9CA  E6 21	 	 	 	out	21h,al
2319	 C9CC  FB	 	 	 	STI
2320	 	 	 	 	;------ сбросить контроллер адаптера
2321	 C9CD  B0 40	 	 	 	mov	al,40h
2322	 C9CF  EE	 	 	 	out	dx,al	;сброс --> 2/3fc
2323	 	 	 	 	;------ записать режим адаптера
2324	 C9D0  E8 CABE R	 	 	call	v0z	;задержка
2325	 C9D3  B0 08	 	 	 	mov	al,8
2326	 C9D5  EE	 	 	 	out	dx,al	;режим --> 2/3fc
2327	 	 	 	 	;------ загрузить режим в передающую микросхему
2328	 C9D6  83 EA 03	 	 	 	sub	dx,3
2329	 C9D9  58	 	 	 	pop	ax
2330	 C9DA  EE	 	 	 	out	dx,al	;режим --> 2/3f9
2331	 	 	 	 	;------ записать команду ПЕРЕДАЧА + ПРИЁМ
2332	 C9DB  E8 CABE R	 	 	call	v0z	;задержка
2333	 C9DE  B0 05	 	 	 	mov	al,00000101b
2334	 C9E0  EE	 	 	 	out	dx,al
2335	 	 	 	 	;------ выход
2336	 C9E1  2A E4	 	 	 	sub	ah,ah
2337	 C9E3  EB 60 90	 	 	 	jmp	v0d	;уточнить состояние
2338	 	 	 	 	;=================================================================
2339	 	 	 	 	;------ функция 1 - передать символ ------------------------------
2340	 C9E6	 	 	 	v0b:
2341	 C9E6  2A E4	 	 	 	sub	ah,ah
2342	 C9E8  50	 	 	 	push	ax
2343	 	 	 	 	;------ записать команду ВКЛ. Ц.108 + ВКЛ. Ц.105 + ПЕРЕДАЧА + ПРИЁМ
2344	 C9E9  42	 	 	 	inc	dx
2345	 C9EA  B0 27	 	 	 	mov	al,00100111b
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-47
	 	 	 	 	 	 	 	09-15-88    


2346	 C9EC  EE	 	 	 	out	dx,al
2347	 	 	 	 	;------ проверить готовность адаптера к передаче + ВКЛ.Ц.107 + ВКЛ.Ц.106
2348	 C9ED  2B C9	 	 	 	sub	cx,cx
2349	 C9EF  E8 CABE R	 	 	call	v0z	;задержка
2350	 C9F2	 	 	 	v0b1:
2351	 C9F2  EC	 	 	 	in	al,dx	;баит состояния 1 <-- 2/3f9
2352	 C9F3  24 81	 	 	 	and	al,81h
2353	 C9F5  8A D8	 	 	 	mov	bl,al
2354	 C9F7  42	 	 	 	inc	dx
2355	 C9F8  EC	 	 	 	in	al,dx	;байт состояния 2 <-- 2/3fa
2356	 C9F9  24 01	 	 	 	and	al,01h
2357	 C9FB  D0 E0	 	 	 	shl	al,1
2358	 C9FD  0A C3	 	 	 	or	al,bl
2359	 C9FF  3C 81	 	 	 	cmp	al,81h
2360	 CA01  74 06	 	 	 	je	v0b2
2361	 CA03  4A	 	 	 	dec	dx
2362	 CA04  E2 EC	 	 	 	loop	v0b1
2363	 	 	 	 	 	 	 	;условия(е) не выполнены(о)
2364	 CA06  58	 	 	 	pop	ax
2365	 CA07  EB 06	 	 	 	jmp	short	v0to
2366	 	 	 	 	;------ передать байт
2367	 CA09	 	 	 	v0b2:
2368	 CA09  4A	 	 	 	dec	dx
2369	 CA0A  4A	 	 	 	dec	dx
2370	 CA0B  58	 	 	 	pop	ax
2371	 CA0C  EE	 	 	 	out	dx,al	;байт данных --> 2/3f8
2372	 	 	 	 	;------ выход
2373	 CA0D  EB 03	 	 	 	jmp	short	v0end
2374	 	 	 	 	;==============================================================
2375	 	 	 	 	; передача управления вызывающей программе
2376	 	 	 	 	;------ выход по тайм-ауту
2377	 CA0F	 	 	 	v0to:
2378	 CA0F  80 CC 80	 	 	 	or	ah,80h
2379	 	 	 	 	;------ все другие выходы, кроме приема
2380	 CA12	 	 	 	v0end:
2381	 CA12  E8 CA7E R	 	 	call	v0e	; уточнить состояние адаптера
2382	 CA15	 	 	 	v0end1: 	 	; выход из функции приема
2383	 CA15  5E	 	 	 	pop	si
2384	 CA16  5A	 	 	 	pop	dx
2385	 CA17  59	 	 	 	pop	cx
2386	 CA18  5B	 	 	 	pop	bx
2387	 CA19  1F	 	 	 	pop	ds
2388	 CA1A  CF	 	 	 	iret
2389	 	 	 	 	;==============================================================
2390	 	 	 	 	;------ функция 2 - принять символ ----------------------------
2391	 CA1B	 	 	 	v0c:
2392	 CA1B  2A E4	 	 	 	sub	ah,ah
2393	 	 	 	 	;------ записать команду ВКЛ. Ц.108 + ПЕРЕДАЧА + ПРИЁМ
2394	 CA1D  42	 	 	 	inc	dx
2395	 CA1E  B0 07	 	 	 	mov	al,00000111b
2396	 CA20  EE	 	 	 	out	dx,al
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-48
	 	 	 	 	 	 	 	09-15-88    


2397	 	 	 	 	;------ проверить готовность приемника + ВКЛ. Ц.107
2398	 CA21  2B C9	 	 	 	sub	cx,cx
2399	 CA23  E8 CABE R	 	 	call	v0z	;задержка
2400	 CA26	 	 	 	v0c1:
2401	 CA26  EC	 	 	 	in	al,dx	;байт состояния 1 <-- 2/3f9
2402	 CA27  24 82	 	 	 	and	al,82h
2403	 CA29  3C 82	 	 	 	cmp	al,82h
2404	 CA2B  74 06	 	 	 	je     v0c2
2405	 CA2D  E2 F7	 	 	 	loop	v0c1
2406	 	 	 	 	 	 	 	;условия(е) не выплнены(о)
2407	 CA2F  2A C0	 	 	 	sub	al,al
2408	 CA31  EB DC	 	 	 	jmp	short	v0to
2409	 	 	 	 	;------ прочитать байт из приемника
2410	 CA33	 	 	 	v0c2:
2411	 CA33  4A	 	 	 	dec	dx
2412	 CA34  EC	 	 	 	in	al,dx	;2/3f8 <-- байт из приемникa
2413	 	 	 	 	;------ уточнить состояние адаптера
2414	 CA35  E8 CA7E R	 	 	call	v0e
2415	 CA38  80 E4 1E	 	 	 	and	ah,00011110b
2416	 	 	 	 	;------ сбросить триггеры ошибок приема
2417	 CA3B  42	 	 	 	inc	dx
2418	 CA3C  8A C8	 	 	 	mov	cl,al
2419	 CA3E  B0 16	 	 	 	mov	al,00010110b
2420	 CA40  EE	 	 	 	out	dx,al	;команда --> 2/3f9
2421	 CA41  8A C1	 	 	 	mov	al,cl
2422	 	 	 	 	;------ выход
2423	 CA43  EB D0	 	 	 	jmp	short	v0end1
2424	 	 	 	 	;=============================================================
2425	 	 	 	 	;------ уточнить состояние ---------------------------------
2426	 CA45	 	 	 	v0d:
2427	 	 	 	 	;------ прочитать состояние модема в AL
2428	 CA45  2A E4	 	 	 	sub	ah,ah
2429	 CA47  8B 14	 	 	 	mov	dx,[si] ; база адаптера
2430	 CA49  42	 	 	 	inc	dx
2431	 CA4A  EC	 	 	 	in	al,dx	;байт состояния 1 <-- 2/3f9
2432	 CA4B  A8 80	 	 	 	test	al,10000000b
2433	 CA4D  74 03	 	 	 	jz	$+5
2434	 CA4F  80 CC 20	 	 	 	or	ah,00100000b	; цепь 107 вкл.
2435	 CA52  42	 	 	 	inc	dx
2436	 CA53  EC	 	 	 	in	al,dx	;байт состояния 2 <-- 2/3fa
2437	 CA54  EE	 	 	 	out	dx,al	;сбросить бит 3
2438	 CA55  A8 01	 	 	 	test	al,00000001b
2439	 CA57  75 03	 	 	 	jnz	$+5
2440	 CA59  80 CC 10	 	 	 	or	ah,00010000b	; цепь 106 вкл.
2441	 CA5C  A8 02	 	 	 	test	al,00000010b
2442	 CA5E  75 03	 	 	 	jnz	$+5
2443	 CA60  80 CC 80	 	 	 	or	ah,10000000b	; цепь 109 вкл.
2444	 CA63  A8 08	 	 	 	test	al,00001000b
2445	 CA65  74 03	 	 	 	jz	$+5
2446	 CA67  80 CC 40	 	 	 	or	ah,01000000b	; цепь 125 вкл.
2447	 	 	 	 	;------ установить биты изменения
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-49
	 	 	 	 	 	 	 	09-15-88    


2448	 CA6A  8B 14	 	 	 	mov	dx,[si] ; база адаптера
2449	 CA6C  8A C4	 	 	 	mov	al,ah
2450	 CA6E  86 84 007C R	 	 	xchg	al,stat_offset[si]
2451	 CA72  32 C4	 	 	 	xor	al,ah
2452	 CA74  B1 04	 	 	 	mov	cl,4
2453	 CA76  D2 E8	 	 	 	shr	al,cl
2454	 CA78  0A C4	 	 	 	or	al,ah
2455	 	 	 	 	;------ выход
2456	 CA7A  2A E4	 	 	 	sub	ah,ah
2457	 CA7C  EB 94	 	 	 	jmp	short	v0end
2458	 	 	 	 	;=============================================================
2459	 	 	 	 	;------ прочитать состояние адаптера в AH --------------------
2460	 CA7E	 	 	 	v0e	proc	near
2461	 CA7E  52	 	 	 	push	dx
2462	 CA7F  50	 	 	 	push	ax
2463	 CA80  2A E4	 	 	 	sub	ah,ah
2464	 CA82  8B 14	 	 	 	mov	dx,[si] ; база адаптера
2465	 CA84  42	 	 	 	inc	dx
2466	 CA85  EC	 	 	 	in	al,dx	;байт состояния 1 <-- 2/3f9
2467	 CA86  A8 01	 	 	 	test	al,00000001b
2468	 CA88  74 03	 	 	 	jz	$+5
2469	 CA8A  80 CC 20	 	 	 	or	ah,00100000b	; передатчик пуст
2470	 CA8D  A8 02	 	 	 	test	al,00000010b
2471	 CA8F  74 03	 	 	 	jz	$+5
2472	 CA91  80 CC 01	 	 	 	or	ah,00000001b	; приемник содержит данные
2473	 CA94  A8 04	 	 	 	test	al,00000100b
2474	 CA96  74 03	 	 	 	jz	$+5
2475	 CA98  80 CC 40	 	 	 	or	ah,01000000b	; адаптер пуст
2476	 CA9B  A8 08	 	 	 	test	al,00001000b
2477	 CA9D  74 03	 	 	 	jz	$+5
2478	 CA9F  80 CC 04	 	 	 	or	ah,00000100b	; ошибка четности
2479	 CAA2  A8 10	 	 	 	test	al,00010000b
2480	 CAA4  74 03	 	 	 	jz	$+5
2481	 CAA6  80 CC 02	 	 	 	or	ah,00000010b	; переполнение
2482	 CAA9  A8 20	 	 	 	test	al,00100000b
2483	 CAAB  74 03	 	 	 	jz	$+5
2484	 CAAD  80 CC 08	 	 	 	or	ah,00001000b	; ошибка стоп-бита
2485	 CAB0  A8 40	 	 	 	test	al,01000000b
2486	 CAB2  74 03	 	 	 	jz	$+5
2487	 CAB4  80 CC 10	 	 	 	or	ah,00010000b	; пауза
2488	 CAB7  5A	 	 	 	pop	dx
2489	 CAB8  0A E6	 	 	 	or	ah,dh	 	; тайм-аут
2490	 CABA  8A C2	 	 	 	mov	al,dl	 	; восстановить AL
2491	 CABC  5A	 	 	 	pop	dx
2492	 CABD  C3	 	 	 	ret
2493	 CABE	 	 	 	v0e	endp
2494	 	 	 	 	;=============================================================
2495	 	 	 	 	;------ подпрограмма задержки процессора ---------------------
2496	 CABE	 	 	 	v0z	proc	near
2497	 CABE  C3	 	 	 	ret
2498	 CABF	 	 	 	v0z	endp
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-50
	 	 	 	 	 	 	 	09-15-88    


2499	 	 	 	 	;=============================================================
2500	 	 	 	 	;------ делители скорости
2501	 CABF  0600 0400 0300 02BA	z0a	dw	1536,1024,768,698,512,384,256,128,64,32,16,12,8,4
2502	       0200 0180 0100 0080	
2503	       0040 0020 0010 000C	
2504	       0008 0004	 	
2505	 	 	 	 	;------ для преобразования форматов
2506	 CADB  03 04 06 07 08 09	z0b	db	3h,4h,6h,7h,8h,9h,0Ah,0Ch
2507	       0A 0C	 	 	
2508	 CAE3	 	 	 	rs232_io	endp
2509	 	 	 	 	     assume cs:code,ds:data
2510	 	 	 	 	;------------------------------------------------------
2511	 	 	 	 	;
2512	 	 	 	 	;      Загрузить знакогенератор пользователя  (INT 10H, AH=11H)
2513	 	 	 	 	;
2514	 	 	 	 	;  На входе:
2515	 	 	 	 	;
2516	 	 	 	 	;	ES:BP  -  адрес таблицы, сформированной пользователем
2517	 	 	 	 	;	CX     -  количество передаваемых символов
2518	 	 	 	 	;	BL     -  код символа, начиная с которого загружается
2519	 	 	 	 	;	 	  таблица пользователя
2520	 	 	 	 	;	BH     -  количество байт на знакоместо
2521	 	 	 	 	;	DL     -  идентификатор таблицы пользователя
2522	 	 	 	 	;	AL     -  режим
2523	 	 	 	 	;	 	  AL=0	 -  загрузить знакогенератор
2524	 	 	 	 	;	 	  AL=1	 -  выдать идентификатор таблицы
2525	 	 	 	 	;
2526	 	 	 	 	;	 	  AL=3	 -  загрузить вторую половину знакогенератора:
2527	 	 	 	 	;	 	 	    BL=0 - загрузить вторую половину знакогене-
2528	 	 	 	 	;	 	 	    ратора из ПЗУ кодовой таблицы с русским
2529	 	 	 	 	;	 	 	    алфавитом,
2530	 	 	 	 	;	 	 	    BL=1 - загрузить вторую половину знакогене-
2531	 	 	 	 	;	 	 	    ратора из ПЗУ стандартной кодовой таблицей
2532	 	 	 	 	;	 	 	    ASCII (USA)
2533	 	 	 	 	;
2534	 	 	 	 	;   На выходе:
2535	 	 	 	 	;
2536	 	 	 	 	;	AH   -	количество байт на знакоместо
2537	 	 	 	 	;	AL   -	идентификатор таблицы пользователя
2538	 	 	 	 	;
2539	 	 	 	 	;	CF=1   -   операция завершена успешно
2540	 	 	 	 	;
2541	 	 	 	 	;--------------------------------------------------
2542	 CAE3	 	 	 	   znak:
2543	 CAE3  86 D6	 	 	 	xchg	dl,dh
2544	 CAE5  86 DE	 	 	 	xchg	bl,dh
2545	 CAE7  55	 	 	 	push	bp
2546	 CAE8  3C 00	 	 	 	cmp	al,0
2547	 CAEA  B8 0040	 	 	 	mov	ax,dat
2548	 CAED  8E D8	 	 	 	mov	ds,ax
2549	 CAEF  75 42	 	 	 	jnz	wid
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-51
	 	 	 	 	 	 	 	09-15-88    


2550	 CAF1  8A F7	 	 	 	mov	dh,bh
2551	 CAF3  89 16 0090 R	 	 	mov	idnpol,dx
2552	 CAF7  51	 	 	 	push	cx
2553	 CAF8  80 FF 08	 	 	 	cmp	bh,8
2554	 CAFB  76 3E	 	 	 	jbe	zagr8
2555	 	 	 	 	;
2556	 	 	 	 	;
2557	 	 	 	 	;      Загрузка знакогенератора черно-белого дисплея
2558	 	 	 	 	;
2559	 	 	 	 	;
2560	 CAFD  B8 DC00	 	 	 	mov	ax,0dc00h
2561	 CB00  8E D8	 	 	 	mov	ds,ax	; база знакогенератора
2562	 CB02  B1 05	 	 	 	mov	cl,5
2563	 CB04  BA 03B8	 	 	 	mov	dx,3b8h
2564	 CB07	 	 	 	zgr:
2565	 	 	 	 	
2566	 CB07  B0 00	 	 	 	mov	al,0
2567	 CB09  EE	 	 	 	out	dx,al
2568	 CB0A  B8 0000	 	 	 	mov	ax,0	; смещение в знакогенераторе
2569	 CB0D  8A C3	 	 	 	mov	al,bl
2570	 CB0F  D3 E0	 	 	 	shl	ax,cl
2571	 CB11  8B F8	 	 	 	mov	di,ax
2572	 CB13  59	 	 	 	pop	cx
2573	 CB14  8A DF	 	 	kolby:	mov	bl,bh	; число байт на знакоместо
2574	 CB16  26: 8A 46 00	 	zapby:	mov	al,es:[bp]    ; считывание байта из таблицы
2575	 CB1A  88 05	 	 	 	mov	byte ptr [di],al   ; запись байта в знакогенератор
2576	 CB1C  47	 	 	 	inc	di
2577	 CB1D  45	 	 	 	inc	bp
2578	 CB1E  FE CB	 	 	 	dec	bl
2579	 CB20  75 F4	 	 	 	jnz	zapby
2580	 CB22  E2 F0	 	 	 	loop	kolby
2581	 CB24  B8 0040	 	 	 	mov	ax,dat
2582	 CB27  8E D8	 	 	 	mov	ds,ax
2583	 CB29  80 FF 08	 	 	 	cmp	bh,8
2584	 CB2C  76 1F	 	 	 	jbe	gr8
2585	 CB2E  B4 29	 	 	 	mov	ah,29h
2586	 CB30  8A C4	 	 	weport: mov	al,ah
2587	 CB32  EE	 	 	 	out	dx,al
2588	 CB33	 	 	 	wid:
2589	 	 	 	 	
2590	 CB33  A1 0090 R	 	 	mov	ax,idnpol
2591	 CB36  5D	 	 	 	pop	bp
2592	 CB37  F9	 	 	 	stc
2593	 CB38  E9 F1DC R	 	 	jmp	video_return
2594	 	 	 	 	;
2595	 	 	 	 	;
2596	 	 	 	 	;    Загрузка знакогенератора цветного дисплея
2597	 	 	 	 	;
2598	 	 	 	 	;
2599	 CB3B  B8 B800	 	 	zagr8:	mov	ax,0b800h
2600	 CB3E  8E D8	 	 	 	mov	ds,ax	; база знакогенератора
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-52
	 	 	 	 	 	 	 	09-15-88    


2601	 CB40  B1 03	 	 	 	mov	cl,3
2602	 CB42  BA 03DF	 	 	 	mov	dx,3dfh
2603	 CB45  B0 01	 	 	 	mov	al,01
2604	 CB47  EE	 	 	 	out	dx,al
2605	 CB48  BA 03D8	 	 	 	mov	dx,3d8h
2606	 CB4B  EB BA	 	 	 	jmp	zgr
2607	 CB4D  BA 03DF	 	 	gr8:	mov	dx,3dfh
2608	 CB50  B0 00	 	 	 	mov	al,0
2609	 CB52  EE	 	 	 	out	dx,al
2610	 CB53  BA 03D8	 	 	 	mov	dx,3d8h
2611	 CB56  8A 1E 0049 R	 	 	mov	bl,crt_mode
2612	 CB5A  B7 00	 	 	 	mov	bh,0
2613	 CB5C  2E: 8A A7 F109 R	 	 	mov	ah,cs:[bx+offset m7]
2614	 CB61  EB CD	 	 	 	jmp	weport
2615	 	 	 	 	
2616	 	 	 	 	;
2617	 	 	 	 	;__________________________________
2618	 	 	 	 	;
2619	 	 	 	 	;   Загрузка знакогенератора цветного дисплея
2620	 	 	 	 	;
2621	 	 	 	 	;__________________________________
2622	 	 	 	 	;
2623	 CB63  B8 B800	 	 	zagrcw: mov	ax,0b800h
2624	 CB66  8E C0	 	 	 	mov	es,ax
2625	 CB68  B0 01	 	 	 	mov	al,1
2626	 CB6A  BA 03DF	 	 	 	mov	dx,3dfh
2627	 CB6D  EE	 	 	 	out	dx,al	   ; порт 3DF = 1
2628	 CB6E  BA 03D8	 	 	 	mov	dx,3d8h
2629	 CB71  EC	 	 	 	in	al,dx
2630	 CB72  8A D8	 	 	 	mov	bl,al	   ; сохранить значение порта 3D8
2631	 CB74  B0 00	 	 	 	mov	al,0
2632	 CB76  EE	 	 	 	out	dx,al	   ; порт 3D8 = 0
2633	 CB77  33 FF	 	 	 	xor	di,di
2634	 CB79  B9 0400	 	 	 	mov	cx,400h
2635	 CB7C  33 C0	 	 	 	xor	ax,ax
2636	 CB7E  FC	 	 	 	cld
2637	 CB7F  F3/ AB	 	 	 	rep	stosw
2638	 CB81  BE FA6E R	 	 	mov	si,offset crt_char_gen
2639	 CB84  B9 0400	 	 	 	mov	cx,400h
2640	 CB87  33 FF	 	 	 	xor	di,di
2641	 CB89  2E: 8A 04	 	zn:	mov	al,cs:[si]
2642	 CB8C  26: 88 05	 	 	mov	byte ptr es:[di],al
2643	 CB8F  46	 	 	 	inc	si
2644	 CB90  47	 	 	 	inc	di
2645	 CB91  E2 F6	 	 	 	loop	zn
2646	 CB93  B9 0400	 	 	 	mov	cx,400h    ; счетчик для 128 символов русского алфавита
2647	 CB96  BE CBB2 R	 	 	mov	si,offset crt_char_rus
2648	 CB99  2E: 8A 04	 	trus:	mov	al,cs:[si]
2649	 CB9C  26: 88 05	 	 	mov	byte ptr es:[di],al
2650	 CB9F  46	 	 	 	inc	si
2651	 CBA0  47	 	 	 	inc	di
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-53
	 	 	 	 	 	 	 	09-15-88    


2652	 CBA1  E2 F6	 	 	 	loop	trus
2653	 CBA3  B0 00	 	 	 	mov	al,0
2654	 CBA5  BA 03DF	 	 	 	mov	dx,3dfh
2655	 CBA8  EE	 	 	 	out	dx,al	   ; порт 3DF = 0
2656	 CBA9  BA 03D8	 	 	 	mov	dx,3d8h
2657	 CBAC  8A C3	 	 	 	mov	al,bl
2658	 CBAE  EE	 	 	 	out	dx,al	   ; восстановить значение порта 3D8
2659	 CBAF  E9 F8A6 R	 	 	jmp	kzagr
2660	 	 	 	 	;
2661	 	 	 	 	;
2662	 	 	 	 	;*************************************************
2663	 	 	 	 	;   Знакогенератор графический русский
2664	 	 	 	 	;************************************************
2665	 	 	 	 	
2666	 	 	 	 	
2667	 CBB2	 	 	 	crt_char_rus	label	byte
2668	 	 	 	 	
2669	 	 	 	 	;**************************************************
2670	 	 	 	 	;	 	 	 	 	 	 **
2671	 	 	 	 	;  Новый знакогенератор для ЕС1841	 	 **
2672	 	 	 	 	;	 	 	 	 	 	 **
2673	 	 	 	 	;**************************************************
2674	 	 	 	 	;
2675	 	 	 	 	;
2676	 CBB2  18 18 FF 00 FF 00	 	 	db 018h,018h,0ffh,000h,0ffh,000h,000h,000h
2677	       00 00	 	 	
2678	 CBBA  6C 6C 6C FF 00 00	 	 	db 06ch,06ch,06ch,0ffh,000h,000h,000h,000h
2679	       00 00	 	 	
2680	 CBC2  00 00 FF 00 FF 18	 	 	db 000h,000h,0ffh,000h,0ffh,018h,018h,018h
2681	       18 18	 	 	
2682	 CBCA  18 18 F8 18 F8 18	 	 	db 018h,018h,0f8h,018h,0f8h,018h,018h,018h
2683	       18 18	 	 	
2684	 CBD2  6C 6C 6C EC 6C 6C	 	 	db 06ch,06ch,06ch,0ech,06ch,06ch,06ch,06ch
2685	       6C 6C	 	 	
2686	 CBDA  00 00 00 FC 6C 6C	 	 	db 000h,000h,000h,0fch,06ch,06ch,06ch,06ch
2687	       6C 6C	 	 	
2688	 CBE2  00 00 F8 18 F8 18	 	 	db 000h,000h,0f8h,018h,0f8h,018h,018h,018h
2689	       18 18	 	 	
2690	 CBEA  00 00 00 FF 6C 6C	 	 	db 000h,000h,000h,0ffh,06ch,06ch,06ch,06ch
2691	       6C 6C	 	 	
2692	 CBF2  6C 6C 6C 7F 00 00	 	 	db 06ch,06ch,06ch,07fh,000h,000h,000h,000h
2693	       00 00	 	 	
2694	 CBFA  18 18 1F 18 1F 00	 	 	db 018h,018h,01fh,018h,01fh,000h,000h,000h
2695	       00 00	 	 	
2696	 CC02  00 00 1F 18 1F 18	 	 	db 000h,000h,01fh,018h,01fh,018h,018h,018h
2697	       18 18	 	 	
2698	 CC0A  6C 6C 6C FC 00 00	 	 	db 06ch,06ch,06ch,0fch,000h,000h,000h,000h
2699	       00 00	 	 	
2700	 CC12  18 18 F8 18 F8 00	 	 	db 018h,018h,0f8h,018h,0f8h,000h,000h,000h
2701	       00 00	 	 	
2702	 CC1A  18 18 1F 18 1F 18	 	 	db 018h,018h,01fh,018h,01fh,018h,018h,018h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-54
	 	 	 	 	 	 	 	09-15-88    


2703	       18 18	 	 	
2704	 CC22  6C 6C 6C 6F 6C 6C	 	 	db 06ch,06ch,06ch,06fh,06ch,06ch,06ch,06ch
2705	       6C 6C	 	 	
2706	 CC2A  00 00 00 7F 6C 6C	 	 	db 000h,000h,000h,07fh,06ch,06ch,06ch,06ch
2707	       6C 6C	 	 	
2708	 CC32  00 00 7F 60 6F 6C	 	 	db 000h,000h,07fh,060h,06fh,06ch,06ch,06ch
2709	       6C 6C	 	 	
2710	 CC3A  00 00 FC 0C EC 6C	 	 	db 000h,000h,0fch,00ch,0ech,06ch,06ch,06ch
2711	       6C 6C	 	 	
2712	 CC42  6C 6C EC 0C FC 00	 	 	db 06ch,06ch,0ech,00ch,0fch,000h,000h,000h
2713	       00 00	 	 	
2714	 CC4A  6C 6C 6F 60 7F 00	 	 	db 06ch,06ch,06fh,060h,07fh,000h,000h,000h
2715	       00 00	 	 	
2716	 CC52  00 00 FF 00 FF 00	 	 	db 000h,000h,0ffh,000h,0ffh,000h,000h,000h
2717	       00 00	 	 	
2718	 CC5A  6C 6C 6C 6C 6C 6C	 	 	db 06ch,06ch,06ch,06ch,06ch,06ch,06ch,06ch
2719	       6C 6C	 	 	
2720	 CC62  00 00 FF 00 EF 6C	 	 	db 000h,000h,0ffh,000h,0efh,06ch,06ch,06ch
2721	       6C 6C	 	 	
2722	 CC6A  6C 6C EC 0C EC 6C	 	 	db 06ch,06ch,0ech,00ch,0ech,06ch,06ch,06ch
2723	       6C 6C	 	 	
2724	 CC72  6C 6C EF 00 FF 00	 	 	db 06ch,06ch,0efh,000h,0ffh,000h,000h,000h
2725	       00 00	 	 	
2726	 CC7A  6C 6C 6F 60 6F 6C	 	 	db 06ch,06ch,06fh,060h,06fh,06ch,06ch,06ch
2727	       6C 6C	 	 	
2728	 CC82  6C 6C EF 00 EF 6C	 	 	db 06ch,06ch,0efh,000h,0efh,06ch,06ch,06ch
2729	       6C 6C	 	 	
2730	 CC8A  92 00 92 00 92 00	 	 	db 092h,000h,092h,000h,092h,000h,092h,000h
2731	       92 00	 	 	
2732	 CC92  92 49 92 49 92 49	 	 	db 092h,049h,092h,049h,092h,049h,092h,000h
2733	       92 00	 	 	
2734	 CC9A  AA 55 AA 55 AA 55	 	 	db 0aah,055h,0aah,055h,0aah,055h,0aah,000h
2735	       AA 00	 	 	
2736	 CCA2  6C 6C 6C EF 6C 6C	 	 	db 06ch,06ch,06ch,0efh,06ch,06ch,06ch,06ch
2737	       6C 6C	 	 	
2738	 CCAA  18 18 FF 00 FF 18	 	 	db 018h,018h,0ffh,000h,0ffh,018h,018h,018h
2739	       18 18	 	 	
2740	 CCB2  00 00 00 1F 18 18	 	 	db 000h,000h,000h,01fh,018h,018h,018h,018h
2741	       18 18	 	 	
2742	 CCBA  00 00 00 F8 18 18	 	 	db 000h,000h,000h,0f8h,018h,018h,018h,018h
2743	       18 18	 	 	
2744	 CCC2  18 18 18 F8 00 00	 	 	db 018h,018h,018h,0f8h,000h,000h,000h,000h
2745	       00 00	 	 	
2746	 CCCA  18 18 18 1F 00 00	 	 	db 018h,018h,018h,01fh,000h,000h,000h,000h
2747	       00 00	 	 	
2748	 CCD2  00 00 00 FF 00 00	 	 	db 000h,000h,000h,0ffh,000h,000h,000h,000h
2749	       00 00	 	 	
2750	 CCDA  18 18 18 18 18 18	 	 	db 018h,018h,018h,018h,018h,018h,018h,018h
2751	       18 18	 	 	
2752	 CCE2  00 00 00 FF 18 18	 	 	db 000h,000h,000h,0ffh,018h,018h,018h,018h
2753	       18 18	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-55
	 	 	 	 	 	 	 	09-15-88    


2754	 CCEA  18 18 18 F8 18 18	 	 	db 018h,018h,018h,0f8h,018h,018h,018h,018h
2755	       18 18	 	 	
2756	 CCF2  18 18 18 FF 00 00	 	 	db 018h,018h,018h,0ffh,000h,000h,000h,000h
2757	       00 00	 	 	
2758	 CCFA  18 18 18 1F 18 18	 	 	db 018h,018h,018h,01fh,018h,018h,018h,018h
2759	       18 18	 	 	
2760	 CD02  18 18 18 FF 18 18	 	 	db 018h,018h,018h,0ffh,018h,018h,018h,018h
2761	       18 18	 	 	
2762	 CD0A  FF FF FF FF FF FF	 	 	db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
2763	       FF FF	 	 	
2764	 CD12  00 00 00 00 FF FF	 	 	db 000h,000h,000h,000h,0ffh,0ffh,0ffh,0ffh
2765	       FF FF	 	 	
2766	 CD1A  F0 F0 F0 F0 F0 F0	 	 	db 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h
2767	       F0 F0	 	 	
2768	 CD22  0F 0F 0F 0F 0F 0F	 	 	db 00fh,00fh,00fh,00fh,00fh,00fh,00fh,00fh
2769	       0F 0F	 	 	
2770	 CD2A  FF FF FF FF 00 00	 	 	db 0ffh,0ffh,0ffh,0ffh,000h,000h,000h,000h
2771	       00 00	 	 	
2772	 CD32  1E 36 66 66 7E 66	 	 	db 01eh,036h,066h,066h,07eh,066h,066h,000h
2773	       66 00	 	 	
2774	 CD3A  7C 60 60 7C 66 66	 	 	db 07ch,060h,060h,07ch,066h,066h,07ch,000h
2775	       7C 00	 	 	
2776	 CD42  7C 66 66 7C 66 66	 	 	db 07ch,066h,066h,07ch,066h,066h,07ch,000h
2777	       7C 00	 	 	
2778	 CD4A  7E 60 60 60 60 60	 	 	db 07eh,060h,060h,060h,060h,060h,060h,000h
2779	       60 00	 	 	
2780	 CD52  38 6C 6C 6C 6C 6C	 	 	db 038h,06ch,06ch,06ch,06ch,06ch,0feh,0c6h
2781	       FE C6	 	 	
2782	 CD5A  7E 60 60 7C 60 60	 	 	db 07eh,060h,060h,07ch,060h,060h,07eh,000h
2783	       7E 00	 	 	
2784	 CD62  DB DB 7E 3C 7E DB	 	 	db 0dbh,0dbh,07eh,03ch,07eh,0dbh,0dbh,000h
2785	       DB 00	 	 	
2786	 CD6A  3C 66 06 1C 06 66	 	 	db 03ch,066h,006h,01ch,006h,066h,03ch,000h
2787	       3C 00	 	 	
2788	 CD72  66 66 6E 7E 76 66	 	 	db 066h,066h,06eh,07eh,076h,066h,066h,000h
2789	       66 00	 	 	
2790	 CD7A  3C 66 6E 7E 76 66	 	 	db 03ch,066h,06eh,07eh,076h,066h,066h,000h
2791	       66 00	 	 	
2792	 CD82  66 6C 78 70 78 6C	 	 	db 066h,06ch,078h,070h,078h,06ch,066h,000h
2793	       66 00	 	 	
2794	 CD8A  1E 36 66 66 66 66	 	 	db 01eh,036h,066h,066h,066h,066h,066h,000h
2795	       66 00	 	 	
2796	 CD92  C6 EE FE FE D6 C6	 	 	db 0c6h,0eeh,0feh,0feh,0d6h,0c6h,0c6h,000h
2797	       C6 00	 	 	
2798	 CD9A  66 66 66 7E 66 66	 	 	db 066h,066h,066h,07eh,066h,066h,066h,000h
2799	       66 00	 	 	
2800	 CDA2  3C 66 66 66 66 66	 	 	db 03ch,066h,066h,066h,066h,066h,03ch,000h
2801	       3C 00	 	 	
2802	 CDAA  7E 66 66 66 66 66	 	 	db 07eh,066h,066h,066h,066h,066h,066h,000h
2803	       66 00	 	 	
2804	 CDB2  7C 66 66 66 7C 60	 	 	db 07ch,066h,066h,066h,07ch,060h,060h,000h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-56
	 	 	 	 	 	 	 	09-15-88    


2805	       60 00	 	 	
2806	 CDBA  3C 66 60 60 60 66	 	 	db 03ch,066h,060h,060h,060h,066h,03ch,000h
2807	       3C 00	 	 	
2808	 CDC2  7E 18 18 18 18 18	 	 	db 07eh,018h,018h,018h,018h,018h,018h,000h
2809	       18 00	 	 	
2810	 CDCA  66 66 66 3E 06 66	 	 	db 066h,066h,066h,03eh,006h,066h,03ch,000h
2811	       3C 00	 	 	
2812	 CDD2  7E DB DB DB 7E 18	 	 	db 07eh,0dbh,0dbh,0dbh,07eh,018h,018h,000h
2813	       18 00	 	 	
2814	 CDDA  66 66 3C 18 3C 66	 	 	db 066h,066h,03ch,018h,03ch,066h,066h,000h
2815	       66 00	 	 	
2816	 CDE2  66 66 66 66 66 66	 	 	db 066h,066h,066h,066h,066h,066h,07fh,003h
2817	       7F 03	 	 	
2818	 CDEA  66 66 66 3E 06 06	 	 	db 066h,066h,066h,03eh,006h,006h,006h,000h
2819	       06 00	 	 	
2820	 CDF2  DB DB DB DB DB DB	 	 	db 0dbh,0dbh,0dbh,0dbh,0dbh,0dbh,0ffh,000h
2821	       FF 00	 	 	
2822	 CDFA  DB DB DB DB DB DB	 	 	db 0dbh,0dbh,0dbh,0dbh,0dbh,0dbh,0ffh,003h
2823	       FF 03	 	 	
2824	 CE02  E0 60 60 7C 66 66	 	 	db 0e0h,060h,060h,07ch,066h,066h,07ch,000h
2825	       7C 00	 	 	
2826	 CE0A  C6 C6 C6 F6 DE DE	 	 	db 0c6h,0c6h,0c6h,0f6h,0deh,0deh,0f6h,000h
2827	       F6 00	 	 	
2828	 CE12  60 60 60 7C 66 66	 	 	db 060h,060h,060h,07ch,066h,066h,07ch,000h
2829	       7C 00	 	 	
2830	 CE1A  78 0C 06 3E 06 0C	 	 	db 078h,00ch,006h,03eh,006h,00ch,078h,000h
2831	       78 00	 	 	
2832	 CE22  CE DB DB FB DB DB	 	 	db 0ceh,0dbh,0dbh,0fbh,0dbh,0dbh,0ceh,000h
2833	       CE 00	 	 	
2834	 CE2A  3E 66 66 66 3E 36	 	 	db 03eh,066h,066h,066h,03eh,036h,066h,000h
2835	       66 00	 	 	
2836	 CE32  00 00 78 0C 7C CC	 	 	db 000h,000h,078h,00ch,07ch,0cch,076h,000h
2837	       76 00	 	 	
2838	 CE3A  00 3C 60 3C 66 66	 	 	db 000h,03ch,060h,03ch,066h,066h,03ch,000h
2839	       3C 00	 	 	
2840	 CE42  00 3C 66 7C 66 66	 	 	db 000h,03ch,066h,07ch,066h,066h,07ch,000h
2841	       7C 00	 	 	
2842	 CE4A  00 00 7E 60 60 60	 	 	db 000h,000h,07eh,060h,060h,060h,060h,000h
2843	       60 00	 	 	
2844	 CE52  00 00 3C 6C 6C 6C	 	 	db 000h,000h,03ch,06ch,06ch,06ch,0feh,0c6h
2845	       FE C6	 	 	
2846	 CE5A  00 00 3C 66 7E 60	 	 	db 000h,000h,03ch,066h,07eh,060h,03ch,000h
2847	       3C 00	 	 	
2848	 CE62  00 00 DB 7E 3C 7E	 	 	db 000h,000h,0dbh,07eh,03ch,07eh,0dbh,000h
2849	       DB 00	 	 	
2850	 CE6A  00 00 3C 66 0C 66	 	 	db 000h,000h,03ch,066h,00ch,066h,03ch,000h
2851	       3C 00	 	 	
2852	 CE72  00 00 66 6E 7E 76	 	 	db 000h,000h,066h,06eh,07eh,076h,066h,000h
2853	       66 00	 	 	
2854	 CE7A  00 18 66 6E 7E 76	 	 	db 000h,018h,066h,06eh,07eh,076h,066h,000h
2855	       66 00	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-57
	 	 	 	 	 	 	 	09-15-88    


2856	 CE82  00 00 66 6C 78 6C	 	 	db 000h,000h,066h,06ch,078h,06ch,066h,000h
2857	       66 00	 	 	
2858	 CE8A  00 00 1E 36 66 66	 	 	db 000h,000h,01eh,036h,066h,066h,066h,000h
2859	       66 00	 	 	
2860	 CE92  00 00 C6 FE FE D6	 	 	db 000h,000h,0c6h,0feh,0feh,0d6h,0c6h,000h
2861	       C6 00	 	 	
2862	 CE9A  00 00 66 66 7E 66	 	 	db 000h,000h,066h,066h,07eh,066h,066h,000h
2863	       66 00	 	 	
2864	 CEA2  00 00 3C 66 66 66	 	 	db 000h,000h,03ch,066h,066h,066h,03ch,000h
2865	       3C 00	 	 	
2866	 CEAA  00 00 7E 66 66 66	 	 	db 000h,000h,07eh,066h,066h,066h,066h,000h
2867	       66 00	 	 	
2868	 CEB2  00 00 7C 66 66 7C	 	 	db 000h,000h,07ch,066h,066h,07ch,060h,000h
2869	       60 00	 	 	
2870	 CEBA  00 00 3C 66 60 66	 	 	db 000h,000h,03ch,066h,060h,066h,03ch,000h
2871	       3C 00	 	 	
2872	 CEC2  00 00 7E 18 18 18	 	 	db 000h,000h,07eh,018h,018h,018h,018h,000h
2873	       18 00	 	 	
2874	 CECA  00 00 66 66 3E 06	 	 	db 000h,000h,066h,066h,03eh,006h,03ch,000h
2875	       3C 00	 	 	
2876	 CED2  00 00 7E DB DB 7E	 	 	db 000h,000h,07eh,0dbh,0dbh,07eh,018h,000h
2877	       18 00	 	 	
2878	 CEDA  00 00 66 3C 18 3C	 	 	db 000h,000h,066h,03ch,018h,03ch,066h,000h
2879	       66 00	 	 	
2880	 CEE2  00 00 66 66 66 66	 	 	db 000h,000h,066h,066h,066h,066h,07fh,003h
2881	       7F 03	 	 	
2882	 CEEA  00 00 66 66 3E 06	 	 	db 000h,000h,066h,066h,03eh,006h,006h,000h
2883	       06 00	 	 	
2884	 CEF2  00 00 DB DB DB DB	 	 	db 000h,000h,0dbh,0dbh,0dbh,0dbh,0ffh,000h
2885	       FF 00	 	 	
2886	 CEFA  00 00 DB DB DB DB	 	 	db 000h,000h,0dbh,0dbh,0dbh,0dbh,0ffh,003h
2887	       FF 03	 	 	
2888	 CF02  00 00 E0 60 7C 66	 	 	db 000h,000h,0e0h,060h,07ch,066h,07ch,000h
2889	       7C 00	 	 	
2890	 CF0A  00 00 C6 C6 F6 DE	 	 	db 000h,000h,0c6h,0c6h,0f6h,0deh,0f6h,000h
2891	       F6 00	 	 	
2892	 CF12  00 00 60 60 7C 66	 	 	db 000h,000h,060h,060h,07ch,066h,07ch,000h
2893	       7C 00	 	 	
2894	 CF1A  00 00 7C 06 3E 06	 	 	db 000h,000h,07ch,006h,03eh,006h,07ch,000h
2895	       7C 00	 	 	
2896	 CF22  00 00 CE DB FB DB	 	 	db 000h,000h,0ceh,0dbh,0fbh,0dbh,0ceh,000h
2897	       CE 00	 	 	
2898	 CF2A  00 00 3E 66 3E 36	 	 	db 000h,000h,03eh,066h,03eh,036h,066h,000h
2899	       66 00	 	 	
2900	 CF32  66 7E 60 7C 60 60	 	 	db 066h,07eh,060h,07ch,060h,060h,07eh,000h
2901	       7E 00	 	 	
2902	 CF3A  00 66 3C 66 7E 60	 	 	db 000h,066h,03ch,066h,07eh,060h,03ch,000h
2903	       3C 00	 	 	
2904	 CF42  00 00 00 00 03 06	 	 	db 000h,000h,000h,000h,003h,006h,00ch,018h
2905	       0C 18	 	 	
2906	 CF4A  00 00 00 00 C0 60	 	 	db 000h,000h,000h,000h,0c0h,060h,030h,018h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-58
	 	 	 	 	 	 	 	09-15-88    


2907	       30 18	 	 	
2908	 CF52  18 30 60 C0 00 00	 	 	db 018h,030h,060h,0c0h,000h,000h,000h,000h
2909	       00 00	 	 	
2910	 CF5A  18 0C 06 03 00 00	 	 	db 018h,00ch,006h,003h,000h,000h,000h,000h
2911	       00 00	 	 	
2912	 CF62  00 00 18 0C 7E 0C	 	 	db 000h,000h,018h,00ch,07eh,00ch,018h,000h
2913	       18 00	 	 	
2914	 CF6A  00 00 18 30 7E 30	 	 	db 000h,000h,018h,030h,07eh,030h,018h,000h
2915	       18 00	 	 	
2916	 CF72  18 3C 7E 18 18 18	 	 	db 018h,03ch,07eh,018h,018h,018h,018h,000h
2917	       18 00	 	 	
2918	 CF7A  18 18 18 18 7E 3C	 	 	db 018h,018h,018h,018h,07eh,03ch,018h,000h
2919	       18 00	 	 	
2920	 CF82  18 18 00 7E 00 18	 	 	db 018h,018h,000h,07eh,000h,018h,018h,000h
2921	       18 00	 	 	
2922	 CF8A  18 18 7E 18 18 00	 	 	db 018h,018h,07eh,018h,018h,000h,07ch,000h
2923	       7C 00	 	 	
2924	 CF92  CF CC EF FC DC CC	 	 	db 0cfh,0cch,0efh,0fch,0dch,0cch,0cch,000h
2925	       CC 00	 	 	
2926	 CF9A  00 66 3C 66 66 3C	 	 	db 000h,066h,03ch,066h,066h,03ch,066h,000h
2927	       66 00	 	 	
2928	 CFA2  00 00 00 1C 1C 00	 	 	db 000h,000h,000h,01ch,01ch,000h,000h,000h
2929	       00 00	 	 	
2930	 CFAA  00 00 00 00 00 00	 	 	db 000h,000h,000h,000h,000h,000h,000h,000h
2931	       00 00	 	 	
2932	 	 	 	 	
2933	 	 	 	 	
2934	 	 	 	 	 	assume	ds:abs0
2935	 CFB2	 	 	 	ca0:
2936	 CFB2  E4 61	 	 	 	in	al,port_b
2937	 CFB4  24 CF	 	 	 	and	al,0cfh
2938	 CFB6  E6 61	 	 	 	out	port_b,al
2939	 CFB8  33 C0	 	 	 	xor	ax,ax
2940	 CFBA  8E D8	 	 	 	mov	ds,ax
2941	 CFBC  8E C0	 	 	 	mov	es,ax
2942	 CFBE  BA 0213	 	 	 	mov	dx,213h
2943	 CFC1  B0 01	 	 	 	mov	al,01
2944	 CFC3  EE	 	 	 	out	dx,al	   ; активизировать плату расширения
2945	 CFC4  BB 0000	 	 	 	mov	bx,0
2946	 CFC7  BA 02B0	 	 	 	mov	dx,2b0h
2947	 CFCA  EC	 	 	 	in	al,dx
2948	 CFCB  24 0C	 	 	 	and	al,0ch
2949	 CFCD  3C 0C	 	 	 	cmp	al,0ch
2950	 CFCF  74 04	 	 	 	jz	ca1
2951	 CFD1  8B 1E 0472 R	 	 	mov	bx,res_fl
2952	 CFD5  B0 0A	 	 	ca1:	mov	al,0ah
2953	 CFD7  EE	 	 	 	out	dx,al
2954	 CFD8  EC	 	 	 	in	al,dx
2955	 CFD9  24 0F	 	 	 	and	al,0fh
2956	 CFDB  3C 0A	 	 	 	cmp	al,0ah
2957	 CFDD  75 31	 	 	 	jnz	oshp	   ; нет платы 2B0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-59
	 	 	 	 	 	 	 	09-15-88    


2958	 CFDF  B0 0C	 	 	 	mov	al,0ch
2959	 CFE1  EE	 	 	 	out	dx,al
2960	 CFE2  32 C0	 	 	 	xor	al,al  ; сброс активности остальных плат памяти
2961	 CFE4  42	 	 	ca2:	inc	dx
2962	 CFE5  EE	 	 	 	out	dx,al
2963	 CFE6  80 FA B3	 	 	 	cmp	dl,0b3h
2964	 CFE9  75 F9	 	 	 	jnz	ca2
2965	 CFEB  8B 1E 0472 R	 	ca22:	mov	bx,res_fl
2966	 CFEF  B9 2000	 	 	 	mov	cx,2000h
2967	 CFF2  81 FB 1234	 	 	cmp	bx,1234h
2968	 CFF6  74 2F	 	 	 	jz	ca8
2969	 CFF8  B8 F000	 	 	 	mov	ax,0f000h
2970	 CFFB  8E D0	 	 	 	mov	ss,ax
2971	 CFFD  BC E018 R	 	ca7a:	mov	sp,offset caw
2972	 D000  E9 D460 R	 	ca7:	jmp	stgtst_cnt
2973	 D003  B9 2000	 	 	ca3:	mov	cx,2000h
2974	 D006  74 1F	 	 	 	je	ca8
2975	 D008  BA 02B0	 	 	 	mov	dx,2b0h    ; сбой в первых 16К основной платы
2976	 D00B  EC	 	 	 	in	al,dx	   ; памяти
2977	 D00C  A8 03	 	 	 	test	al,03	   ; реконфигурация была?
2978	 D00E  74 12	 	 	 	jz	ca6
2979	 D010	 	 	 	oshp:
2980	 D010  8A D8	 	 	 	mov	bl,al	   ; была реконфигурация
2981	 D012  B0 89	 	 	 	mov	al,89h
2982	 D014  E6 63	 	 	 	out	63h,al
2983	 D016  B0 04	 	 	 	mov	al,04
2984	 D018  E6 60	 	 	ca5:	out	60h,al
2985	 D01A  33 C9	 	 	 	xor	cx,cx
2986	 D01C  E2 FE	 	 	ca4:	loop	ca4
2987	 D01E  86 D8	 	 	 	xchg	bl,al
2988	 D020  EB F6	 	 	 	jmp	ca5
2989	 D022  0C 03	 	 	ca6:	or	al,3
2990	 D024  EE	 	 	 	out	dx,al
2991	 D025  EB D6	 	 	 	jmp	ca7a
2992	 D027  33 C0	 	 	ca8:	xor	ax,ax
2993	 D029  FC	 	 	 	cld
2994	 D02A  33 F6	 	 	 	xor	si,si
2995	 D02C  33 FF	 	 	 	xor	di,di
2996	 D02E  BD 02B0	 	 	 	mov	bp,2b0h
2997	 D031  F3/ AB	 	 	 	rep	stosw
2998	 D033  89 1E 0472 R	 	 	mov	res_fl,bx
2999	 D037  BA 0400	 	 	ca9:	mov	dx,0400h
3000	 D03A  BB 0010	 	 	 	mov	bx,16
3001	 D03D  8E C2	 	 	ca10:	mov	es,dx
3002	 D03F  33 FF	 	 	 	xor	di,di
3003	 D041  B8 AA55	 	 	 	mov	ax,0aa55h
3004	 D044  8B C8	 	 	 	mov	cx,ax
3005	 D046  26: 89 05	 	 	mov	es:[di],ax  ; проверка наличия очередных 16К памяти
3006	 D049  B0 0F	 	 	 	mov	al,0fh
3007	 D04B  26: 8B 05	 	 	mov	ax,es:[di]
3008	 D04E  33 C1	 	 	 	xor	ax,cx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-60
	 	 	 	 	 	 	 	09-15-88    


3009	 D050  75 1F	 	 	 	jnz	ca11
3010	 D052  B9 2000	 	 	 	mov	cx,2000h
3011	 D055  F3/ AB	 	 	 	rep	stosw
3012	 D057  B9 2000	 	 	 	mov	cx,2000h
3013	 D05A  33 FF	 	 	 	xor	di,di
3014	 D05C  F3/ AF	 	 	 	repz	scasw	   ; есть сбойные адреса в порции 16К?
3015	 D05E  0B C8	 	 	 	or	cx,ax
3016	 D060  75 0F	 	 	 	jnz	ca11	   ; да
3017	 D062  81 C2 0400	 	 	add	dx,0400h   ; нет
3018	 D066  83 C3 10	 	 	 	add	bx,16
3019	 D069  80 FE A0	 	 	 	cmp	dh,0a0h
3020	 D06C  75 CF	 	 	 	jnz	ca10
3021	 D06E  EB 24 90	 	 	 	jmp	ca12
3022	 D071  80 FE 60	 	 	ca11:	cmp	dh,60h
3023	 D074  73 1E	 	 	 	jnb	ca12
3024	 D076  8B D5	 	 	 	mov	dx,bp	   ; адрес меньше 512К
3025	 D078  EC	 	 	 	in	al,dx
3026	 D079  A8 03	 	 	 	test	al,03
3027	 D07B  75 17	 	 	 	jnz	ca12
3028	 D07D  8C C2	 	 	 	mov	dx,es
3029	 D07F  80 E6 60	 	 	 	and	dh,60h
3030	 D082  80 F6 60	 	 	 	xor	dh,60h
3031	 D085  B1 05	 	 	 	mov	cl,5
3032	 D087  D2 EE	 	 	 	shr	dh,cl
3033	 D089  0A C6	 	 	 	or	al,dh
3034	 D08B  8B D5	 	 	 	mov	dx,bp
3035	 D08D  EE	 	 	 	out	dx,al
3036	 D08E  33 D2	 	 	 	xor	dx,dx
3037	 D090  33 DB	 	 	 	xor	bx,bx
3038	 D092  EB A9	 	 	 	jmp	ca10
3039	 D094	 	 	 	ca12:	 	 	   ; сброс активности текущего модуля памяти
3040	 D094  8B D5	 	 	 	mov	dx,bp
3041	 D096  EC	 	 	 	in	al,dx
3042	 D097  24 F3	 	 	 	and	al,0f3h
3043	 D099  EE	 	 	 	out	dx,al
3044	 D09A  BA 02B0	 	 	 	mov	dx,2b0h    ; возврат на плату памяти 2B0
3045	 D09D  EC	 	 	 	in	al,dx
3046	 D09E  0C 0C	 	 	 	or	al,0ch
3047	 D0A0  EE	 	 	 	out	dx,al
3048	 D0A1  F7 C5 0003	 	 	test	bp,3
3049	 D0A5  75 31	 	 	 	jnz	ca14
3050	 D0A7  89 1E 0413 R	 	 	mov	mem_siz,bx
3051	 D0AB	 	 	 	ca15:
3052	 D0AB  8B 36 04D0 R	 	 	mov	si,csi
3053	 D0AF  89 AC 04E0 R	 	 	mov	tabl1[si],bp
3054	 D0B3  89 9C 04E2 R	 	 	mov	tabl1[si+2],bx
3055	 D0B7  45	 	 	 	inc	bp
3056	 D0B8  83 06 04D0 R 04	 	 	add	csi,4
3057	 D0BD  81 FD 02B4	 	ca16:	cmp	bp,2b4h
3058	 D0C1  73 1D	 	 	 	jnb	ca13
3059	 D0C3  BB 0000	 	 	 	mov	bx,0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-61
	 	 	 	 	 	 	 	09-15-88    


3060	 D0C6  B0 0C	 	 	 	mov	al,0ch
3061	 D0C8  8B D5	 	 	 	mov	dx,bp
3062	 D0CA  EE	 	 	 	out	dx,al
3063	 D0CB  BA 02B0	 	 	 	mov	dx,2b0h 	; сброс активности 2b0
3064	 D0CE  EC	 	 	 	in	al,dx
3065	 D0CF  24 F3	 	 	 	and	al,0f3h
3066	 D0D1  EE	 	 	 	out	dx,al
3067	 D0D2  BA 0000	 	 	 	mov	dx,0
3068	 D0D5  E9 D03D R	 	 	jmp	ca10
3069	 D0D8  83 FB 00	 	 	ca14:	cmp	bx,0
3070	 D0DB  75 CE	 	 	 	jnz	ca15
3071	 D0DD  45	 	 	 	inc	bp
3072	 D0DE  EB DD	 	 	 	jmp	ca16
3073	 D0E0	 	 	 	ca13:
3074	 D0E0  B8 0040	 	 	 	mov	ax,dat
3075	 D0E3  8E D8	 	 	 	mov	ds,ax
3076	 D0E5  BD 0000	 	 	 	mov	bp,0
3077	 D0E8  E9 E15C R	 	 	jmp	c21
3078	 	 	 	 	;
3079	 	 	 	 	;
3080	 	 	 	 	 	assume cs:code,ds:data
3081	 D0EB  1E	 	 	e190:	push	ds
3082	 D0EC  B8 0010	 	 	 	mov	ax,16
3083	 D0EF  81 3E 0072 R 1234	 	cmp	reset_flag,1234h
3084	 D0F5  75 03	 	 	 	jnz	e20a
3085	 D0F7  E9 E3A4 R	 	 	jmp	e22
3086	 D0FA  B8 0010	 	 	e20a:	mov	ax,16
3087	 D0FD  EB 25	 	 	 	jmp	short prt_siz
3088	 D0FF  8B 1E 0013 R	 	e20b:	mov	bx,memory_size
3089	 D103  83 EB 10	 	 	 	sub	bx,16
3090	 D106  B1 04	 	 	 	mov	cl,4
3091	 D108  D3 EB	 	 	 	shr	bx,cl
3092	 D10A  8B CB	 	 	 	mov	cx,bx
3093	 D10C  BB 0400	 	 	 	mov	bx,0400h
3094	 D10F  8E DB	 	 	e20c:	mov	ds,bx
3095	 D111  8E C3	 	 	 	mov	es,bx
3096	 D113  81 C3 0400	 	 	add	bx,0400h
3097	 D117  52	 	 	 	push	dx
3098	 D118  51	 	 	 	push	cx
3099	 D119  53	 	 	 	push	bx
3100	 D11A  50	 	 	 	push	ax
3101	 D11B  E8 D45D R	 	 	call	stgtst
3102	 D11E  75 41	 	 	 	jnz	e21a
3103	 D120  58	 	 	 	pop	ax
3104	 D121  05 0010	 	 	 	add	ax,16
3105	 D124	 	 	 	prt_siz:
3106	 D124  50	 	 	 	push	ax
3107	 D125  BB 000A	 	 	 	mov	bx,10
3108	 D128  B9 0003	 	 	 	mov	cx,3
3109	 D12B	 	 	 	decimal_loop:
3110	 D12B  33 D2	 	 	 	xor	dx,dx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-62
	 	 	 	 	 	 	 	09-15-88    


3111	 D12D  F7 F3	 	 	 	div	bx
3112	 D12F  80 CA 30	 	 	 	or	dl,30h
3113	 D132  52	 	 	 	push	dx
3114	 D133  E2 F6	 	 	 	loop	decimal_loop
3115	 D135  B9 0003	 	 	 	mov	cx,3
3116	 D138	 	 	 	prt_dec_loop:
3117	 D138  58	 	 	 	pop	ax
3118	 D139  E8 D1B4 R	 	 	call	prt_hex
3119	 D13C  E2 FA	 	 	 	loop	prt_dec_loop
3120	 D13E  B9 0016	 	 	 	mov	cx,22
3121	 D141  BE D1BB R	 	 	mov	si,offset e300
3122	 D144  2E: 8A 04	 	kb_ok:	mov	al,byte ptr cs:[si]
3123	 D147  46	 	 	 	inc	si
3124	 D148  E8 D1B4 R	 	 	call	prt_hex
3125	 D14B  E2 F7	 	 	 	loop	kb_ok
3126	 D14D  58	 	 	 	pop	ax
3127	 D14E  3D 0010	 	 	 	cmp	ax,16
3128	 D151  74 AC	 	 	 	je	e20b
3129	 D153  5B	 	 	 	pop	bx
3130	 D154  59	 	 	 	pop	cx
3131	 D155  5A	 	 	 	pop	dx
3132	 D156  E2 B7	 	 	 	loop	e20c
3133	 D158  B0 0A	 	 	 	mov	al,10
3134	 D15A  E8 D1B4 R	 	 	call	prt_hex
3135	 D15D  1F	 	 	 	pop	ds
3136	 D15E  E9 E3A4 R	 	 	jmp	e22
3137	 D161	 	 	 	e21a:
3138	 D161  5B	 	 	 	pop	bx
3139	 D162  83 C4 06	 	 	 	add	sp,6
3140	 D165  8C DA	 	 	 	mov	dx,ds
3141	 D167  1F	 	 	 	pop	ds
3142	 D168  1E	 	 	 	push	ds
3143	 D169  53	 	 	 	push	bx
3144	 D16A  8B DA	 	 	 	mov	bx,dx
3145	 D16C  50	 	 	 	push	ax
3146	 D16D  80 FE 60	 	 	 	cmp	dh,60h
3147	 D170  73 2C	 	 	 	jnb	ea1
3148	 D172  BA 02B0	 	 	 	mov	dx,2b0h
3149	 D175  EC	 	 	 	in	al,dx
3150	 D176  A8 03	 	 	 	test	al,3
3151	 D178  75 24	 	 	 	jnz	ea1
3152	 D17A  50	 	 	 	push	ax
3153	 D17B  A0 0049 R	 	 	mov	al,crt_mode
3154	 D17E  B4 00	 	 	 	mov	ah,0
3155	 D180  CD 10	 	 	 	int	10h
3156	 D182  58	 	 	 	pop	ax
3157	 D183  8B D3	 	 	 	mov	dx,bx
3158	 D185  80 E6 60	 	 	 	and	dh,60h
3159	 D188  80 F6 60	 	 	 	xor	dh,60h
3160	 D18B  B1 05	 	 	 	mov	cl,5
3161	 D18D  D2 EE	 	 	 	shr	dh,cl
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-63
	 	 	 	 	 	 	 	09-15-88    


3162	 D18F  0A C6	 	 	 	or	al,dh
3163	 D191  BA 02B0	 	 	 	mov	dx,2b0h
3164	 D194  EE	 	 	 	out	dx,al
3165	 D195  33 C0	 	 	 	xor	ax,ax
3166	 D197  8E C0	 	 	 	mov	es,ax
3167	 D199  8E D8	 	 	 	mov	ds,ax
3168	 D19B  E9 CFEB R	 	 	jmp	ca22
3169	 D19E  58	 	 	ea1:	pop	ax
3170	 D19F  8B D3	 	 	 	mov	dx,bx
3171	 D1A1  5B	 	 	 	pop	bx
3172	 D1A2  89 1E 00E2 R	 	 	mov	tabl+2,bx
3173	 D1A6  89 1E 0013 R	 	 	mov	memory_size,bx
3174	 D1AA  50	 	 	 	push	ax
3175	 D1AB  B0 0A	 	 	 	mov	al,10
3176	 D1AD  E8 D1B4 R	 	 	call	prt_hex
3177	 D1B0  58	 	 	 	pop	ax
3178	 D1B1  E9 E367 R	 	 	jmp	osh
3179	 D1B4	 	 	 	prt_hex proc	near
3180	 D1B4  B4 0E	 	 	 	mov	ah,14
3181	 D1B6  B7 00	 	 	 	mov	bh,0
3182	 D1B8  CD 10	 	 	 	int	10h
3183	 D1BA  C3	 	 	 	ret
3184	 D1BB	 	 	 	prt_hex endp
3185	 D1BB  20 20 4B 62 20 BE	e300	db	'  Kb ОБ',0cah,'ЕМ ПАМЯТИ (С)',0dh
3186	       B1 CA B5 BC 20 BF	
3187	       B0 BC CF C2 B8 20	
3188	       28 C1 29 0D	 	
3189	 D1D1  20 20 BE C8 B8 B1	f39	db	'  ОШИБКА  ( НАЖМИ КЛАВИШУ "Ф1" )'
3190	       BA B0 20 20 28 20	
3191	       BD B0 B6 BC B8 20	
3192	       BA BB B0 B2 B8 C8	
3193	       C3 20 22 C4 31 22	
3194	       20 29	 	 	
3195	 	 	 	 	
3196	 	 	 	 	
3197	 	 	 	 	;-------int 15--------------------------
3198	 	 	 	 	;
3199	 	 	 	 	;   Программа поддержки расширенной памяти
3200	 	 	 	 	;
3201	 	 	 	 	;   AH = 87H
3202	 	 	 	 	;	  Переслать блок, параметры которого указаны в таблице GDT
3203	 	 	 	 	;
3204	 	 	 	 	;   На входе
3205	 	 	 	 	;	  ES:SI - адрес таблицы
3206	 	 	 	 	;	  CX	- количество пересылаемых слов
3207	 	 	 	 	;
3208	 	 	 	 	;   AH = 88H
3209	 	 	 	 	;	   Определить об'ем расширенной памяти
3210	 	 	 	 	;
3211	 	 	 	 	;   На выходе
3212	 	 	 	 	;	  AX - об'ем расширенной памяти
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-64
	 	 	 	 	 	 	 	09-15-88    


3213	 	 	 	 	;	  CF = 0, если расширенная память присутствует
3214	 	 	 	 	;	  CF = 1, если расширенная память отсутствует
3215	 	 	 	 	;
3216	 	 	 	 	;   AH = C7H
3217	 	 	 	 	;	  Переслать блок в соответствии с указанными параметрами
3218	 	 	 	 	;
3219	 	 	 	 	;   На входе
3220	 	 	 	 	;	  CX - количество пересылаемых слов
3221	 	 	 	 	;	  DS:SI - адрес источника
3222	 	 	 	 	;	  ES:DI - адрес приемника
3223	 	 	 	 	;	  BL	- логический номер платы источника
3224	 	 	 	 	;	  BH	- логический номер платы приемника
3225	 	 	 	 	;
3226	 	 	 	 	;   AH = C8H
3227	 	 	 	 	;	  Определить об'ем памяти платы, логический номер которой
3228	 	 	 	 	;	  указан в AL
3229	 	 	 	 	;
3230	 	 	 	 	;   На выходе
3231	 	 	 	 	;	  AX  - об'ем памяти выбранной платы
3232	 	 	 	 	;	  CF = 0, если плата присутствует
3233	 	 	 	 	;	     CF = 1, если плата отсутствует
3234	 	 	 	 	;---------------------------------------
3235	 	 	 	 	 	assume cs:code
3236	 D1F1	 	 	 	ex_memory proc far
3237	 	 	 	 	;
3238	 D1F1  FB	 	 	 	sti
3239	 	 	 	 	;
3240	 D1F2  80 FC C7	 	 	 	cmp ah,0c7h	; анализ операций
3241	 D1F5  74 21	 	 	 	je move_mem_block_1    ; переход по AH=C7
3242	 	 	 	 	;
3243	 D1F7  1E	 	 	 	push ds
3244	 D1F8  53	 	 	 	push bx
3245	 	 	 	 	;
3246	 D1F9  80 FC 87	 	 	 	cmp ah,87h
3247	 D1FC  74 3B	 	 	 	je move 	; переход по AH=87
3248	 	 	 	 	;
3249	 D1FE  BB 0040	 	 	 	mov bx,40h	; установить базовый адрес для об'ема памяти
3250	 D201  8E DB	 	 	 	mov ds,bx	; 40:Е2
3251	 D203  BB 00E2	 	 	 	mov bx,0e2h
3252	 	 	 	 	;
3253	 D206  80 FC 88	 	 	 	cmp ah,88h
3254	 D209  74 10	 	 	 	je ex_mem_size	; переход по AH=88
3255	 	 	 	 	;
3256	 D20B  80 FC C8	 	 	 	cmp ah,0c8h
3257	 D20E  74 16	 	 	 	je mem_block	; переход по AH=C8
3258	 	 	 	 	;
3259	 D210  5B	 	 	 	pop bx
3260	 D211  1F	 	 	 	pop ds
3261	 D212  B4 86	 	 	 	mov ah,86h	; выход. Заданный код операции не обрабатывается
3262	 D214  F9	 	 	 	stc
3263	 D215  CA 0002	 	 	 	ret 2
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-65
	 	 	 	 	 	 	 	09-15-88    


3264	 	 	 	 	;
3265	 	 	 	 	;
3266	 D218	 	 	 	move_mem_block_1:
3267	 D218  EB 7B 90	 	 	 	jmp move_mem_block
3268	 	 	 	 	;
3269	 	 	 	 	;
3270	 	 	 	 	;
3271	 D21B	 	 	 	ex_mem_size:	 	    ; AH=88
3272	 D21B  8B 47 04	 	 	 	mov ax,[bx+4]	; прочитать об'ем первого расширенного блока
3273	 	 	 	 	 	 	 	; памяти (40:Е6)
3274	 D21E  03 47 08	 	 	 	add ax,[bx+8]	; добавить об'ем второго расширенного блока
3275	 	 	 	 	 	 	 	; памяти (40:ЕА)
3276	 D221  03 47 0C	 	 	 	add ax,[bx+12]	; добавить об'ем третьего расширенного блока
3277	 	 	 	 	 	 	 	; памяти (40:ЕЕ)
3278	 D224  EB 0B	 	 	 	jmp short mem_inf
3279	 	 	 	 	;
3280	 	 	 	 	;
3281	 D226	 	 	 	mem_block:	 	    ; AH=C8
3282	 D226  25 0003	 	 	 	and ax,3	; преобразовать логический номер платы
3283	 D229  02 C0	 	 	 	add al,al
3284	 D22B  02 C0	 	 	 	add al,al	; определить величину смещения
3285	 D22D  03 D8	 	 	 	add bx,ax
3286	 D22F  8B 07	 	 	 	mov ax,[bx]	; прочитать об'ем заданного блока памяти
3287	 D231	 	 	 	mem_inf:
3288	 D231  3D 0001	 	 	 	cmp ax,1	; определить существует ли запрашиваемая память
3289	 D234  5B	 	 	 	pop bx
3290	 D235  1F	 	 	 	pop ds
3291	 D236  CA 0002	 	 	 	ret 2	 	; выход
3292	 	 	 	 	;
3293	 	 	 	 	;
3294	 D239	 	 	 	move:	 	 	     ; AH=87
3295	 D239  06	 	 	 	push es 	; сохранить регистры
3296	 D23A  52	 	 	 	push dx
3297	 D23B  56	 	 	 	push si
3298	 D23C  57	 	 	 	push di
3299	 D23D  51	 	 	 	push cx
3300	 D23E  83 C6 10	 	 	 	add si,16	; получить смещение в таблице GDT
3301	 D241  26: 8A 64 04	 	 	mov ah,es:[si+4]  ; получить старший байт адреса источника
3302	 D245  26: 8A 44 0C	 	 	mov al,es:[si+12] ; получить старший байт адреса назначения
3303	 D249  25 F0F0	 	 	 	and ax,0f0f0h
3304	 D24C  3D 0000	 	 	 	cmp ax,0
3305	 D24F  74 2C	 	 	 	je main_mem	; источник и назначение осуществляется
3306	 	 	 	 	 	 	 	; в основную память
3307	 D251  80 FC 00	 	 	 	cmp ah,0
3308	 D254  74 13	 	 	 	je in_mem	; пересылка из основной памяти в расширенную
3309	 D256  3C 00	 	 	 	cmp al,0
3310	 D258  74 14	 	 	 	je out_mem	; пересылка из расширенной памяти в основную
3311	 	 	 	 	;   источник и назначение в расширенной памяти
3312	 D25A  E8 D306 R	 	 	call ext	; определить реальный адрес источника
3313	 	 	 	 	 	 	 	; расширенной памяти
3314	 D25D	 	 	 	ext_mem:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-66
	 	 	 	 	 	 	 	09-15-88    


3315	 D25D  8A DF	 	 	 	mov bl,bh  ; сохранить номер платы источника расширенной памяти
3316	 D25F  1E	 	 	 	push ds
3317	 D260  57	 	 	 	push di
3318	 D261  83 C6 08	 	 	 	add si,8  ; установить адрес назначения в таблице GDT
3319	 D264  E8 D306 R	 	 	call ext  ; определить реальный адрес назначения расширенной
3320	 	 	 	 	 	 	  ; памяти
3321	 D267  EB 19	 	 	 	jmp short move_block
3322	 	 	 	 	;
3323	 D269	 	 	 	in_mem:
3324	 D269  E8 D2D7 R	 	 	call main  ; определить реальный адрес источника основной
3325	 	 	 	 	 	 	   ; памяти
3326	 D26C  EB EF	 	 	 	jmp short ext_mem
3327	 	 	 	 	;
3328	 D26E	 	 	 	out_mem:
3329	 D26E  E8 D306 R	 	 	call ext ; определить реальный адрес источника из расширенной
3330	 	 	 	 	 	 	 ; памяти
3331	 D271	 	 	 	ext_mem_1:
3332	 D271  8A DF	 	 	 	mov bl,bh ; сохранить номер платы источника расширенной памяти
3333	 D273  1E	 	 	 	push ds
3334	 D274  57	 	 	 	push di
3335	 D275  83 C6 08	 	 	 	add si,8 ; установить адрес назначения в таблице GDT
3336	 D278  E8 D2D7 R	 	 	call main ; определить реальный адрес назначения из основной
3337	 	 	 	 	 	 	  ; памяти
3338	 D27B  EB 05	 	 	 	jmp short move_block
3339	 	 	 	 	;
3340	 D27D	 	 	 	main_mem:
3341	 D27D  E8 D2D7 R	 	 	call main ; определить реальный адрес источника из основной
3342	 	 	 	 	 	 	  ; памяти
3343	 D280  EB EF	 	 	 	jmp short ext_mem_1
3344	 	 	 	 	;
3345	 	 	 	 	;
3346	 D282	 	 	 	move_block:
3347	 D282  1E	 	 	 	push ds ; установить DS:SI - адрес источника
3348	 D283  07	 	 	 	pop es	;	     ES:DI - адрес назначения
3349	 D284  5E	 	 	 	pop si
3350	 D285  1F	 	 	 	pop ds
3351	 	 	 	 	;
3352	 D286  E8 D367 R	 	 	call go 	; переслать
3353	 	 	 	 	;
3354	 	 	 	 	;
3355	 D289  33 C0	 	 	 	xor ax,ax	; установить CF=0
3356	 D28B  59	 	 	 	pop cx	 	; восстановить регистры
3357	 D28C  5F	 	 	 	pop di
3358	 D28D  5E	 	 	 	pop si
3359	 D28E  5A	 	 	 	pop dx
3360	 D28F  07	 	 	 	pop es
3361	 D290  5B	 	 	 	pop bx
3362	 D291  1F	 	 	 	pop ds
3363	 D292  CA 0002	 	 	 	ret 2	; выход
3364	 	 	 	 	;
3365	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-67
	 	 	 	 	 	 	 	09-15-88    


3366	 	 	 	 	;
3367	 D295	 	 	 	move_mem_block: 	 ; AH=C7
3368	 D295  1E	 	 	 	push ds
3369	 D296  56	 	 	 	push si
3370	 D297  57	 	 	 	push di
3371	 D298  B8 0040	 	 	 	mov ax,40h
3372	 D29B  8E D8	 	 	 	mov ds,ax
3373	 D29D  81 E3 0303	 	 	and bx,303h  ; определить смещение для определения параметров
3374	 D2A1  03 DB	 	 	 	add bx,bx    ; платы источника и платы назначения
3375	 D2A3  03 DB	 	 	 	add bx,bx
3376	 D2A5  81 CB E0E0	 	 	or bx,0e0e0h
3377	 D2A9  8B F3	 	 	 	mov si,bx
3378	 D2AB  86 FB	 	 	 	xchg bh,bl
3379	 D2AD  8B FB	 	 	 	mov di,bx
3380	 D2AF  81 E6 00FF	 	 	and si,0ffh  ; уст адрес смещения для параметров источника
3381	 D2B3  81 E7 00FF	 	 	and di,0ffh  ; уст адрес смещения для параметров приемника
3382	 D2B7  8B 1C	 	 	 	mov bx,[si]  ; прочитать параметры источника
3383	 D2B9  8B 05	 	 	 	mov ax,[di]  ; прочитать параметры приемника
3384	 D2BB  8A F8	 	 	 	mov bh,al    ; сохранить адрес платы источника в BL
3385	 D2BD  5F	 	 	 	pop di	     ; сохранить адрес платы приемника в BH
3386	 D2BE  5E	 	 	 	pop si
3387	 D2BF  1F	 	 	 	pop ds
3388	 	 	 	 	;
3389	 D2C0  E8 D367 R	 	 	call go 	; переслать
3390	 	 	 	 	;
3391	 D2C3  33 C0	 	 	 	xor ax,ax	; установить CF=0
3392	 D2C5  CA 0002	 	 	 	ret 2	 	; выход
3393	 	 	 	 	;
3394	 	 	 	 	;
3395	 	 	 	 	;
3396	 	 	 	 	;
3397	 	 	 	 	;
3398	 D2C8	 	 	 	main_port proc near   ; прочитать адрес порта основной памяти
3399	 	 	 	 	 	 	      ; в AH (40:E0)
3400	 D2C8  1E	 	 	 	push ds
3401	 D2C9  53	 	 	 	push bx
3402	 D2CA  B8 0040	 	 	 	mov ax,40h
3403	 D2CD  8E D8	 	 	 	mov ds,ax
3404	 D2CF  BB 00E0	 	 	 	mov bx,0e0h
3405	 D2D2  8A 27	 	 	 	mov ah,[bx]
3406	 D2D4  5B	 	 	 	pop bx
3407	 D2D5  1F	 	 	 	pop ds
3408	 D2D6  C3	 	 	 	ret
3409	 D2D7	 	 	 	main_port endp
3410	 	 	 	 	;
3411	 	 	 	 	;
3412	 D2D7	 	 	 	main proc near	; определить реальный адрес основной памяти в DS:DI
3413	 D2D7  50	 	 	 	push ax
3414	 D2D8  E8 D2C8 R	 	 	call main_port	; определить адрес порта основной памяти
3415	 D2DB  8A FC	 	 	 	mov bh,ah  ; сохранить адрес порта основной памяти в BH
3416	 D2DD  26: 8B 44 02	 	 	mov ax,es:[si+2]
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-68
	 	 	 	 	 	 	 	09-15-88    


3417	 D2E1  50	 	 	 	push ax
3418	 D2E2  5F	 	 	 	pop di
3419	 D2E3  81 E7 000F	 	 	and di,0fh   ; определение адреса обращения (DI)
3420	 D2E7  D1 E8	 	 	 	shr ax,1     ; определение базового адреса (DS)
3421	 D2E9  D1 E8	 	 	 	shr ax,1
3422	 D2EB  D1 E8	 	 	 	shr ax,1
3423	 D2ED  D1 E8	 	 	 	shr ax,1
3424	 D2EF  25 0FFF	 	 	 	and ax,0fffh
3425	 D2F2  53	 	 	 	push bx
3426	 D2F3  26: 8A 5C 04	 	 	mov bl, es:[si+4]
3427	 D2F7  02 DB	 	 	 	add bl,bl
3428	 D2F9  02 DB	 	 	 	add bl,bl
3429	 D2FB  02 DB	 	 	 	add bl,bl
3430	 D2FD  02 DB	 	 	 	add bl,bl
3431	 D2FF  0A E3	 	 	 	or ah,bl
3432	 D301  5B	 	 	 	pop bx
3433	 D302  8E D8	 	 	 	mov ds,ax
3434	 D304  58	 	 	 	pop ax
3435	 D305  C3	 	 	 	ret
3436	 D306	 	 	 	main endp
3437	 	 	 	 	;
3438	 	 	 	 	;
3439	 D306	 	 	 	ext proc near
3440	 D306  50	 	 	 	push ax
3441	 D307  52	 	 	 	push dx
3442	 D308  1E	 	 	 	push ds
3443	 D309  53	 	 	 	push bx
3444	 D30A  B8 0040	 	 	 	mov ax,40h
3445	 D30D  8E D8	 	 	 	mov ds,ax
3446	 D30F  26: 8B 44 03	 	 	mov ax,es:[si+3] ;уменьшить адрес расширенной памяти на 100000H
3447	 D313  80 EC 10	 	 	 	sub ah,10h
3448	 D316  BB 00E0	 	 	 	mov bx,0e0h
3449	 	 	 	 	;
3450	 D319	 	 	 	scanirov:
3451	 D319  E8 D35B R	 	 	call mem_2   ; определить адрес порта расширенной памяти
3452	 D31C  3B C2	 	 	 	cmp ax,dx
3453	 D31E  72 0A	 	 	 	jc find
3454	 D320  2B C2	 	 	 	sub ax,dx
3455	 D322  81 FB 00F0	 	 	cmp bx,0f0h
3456	 D326  74 3E	 	 	 	je error_ext
3457	 D328  EB EF	 	 	 	jmp short scanirov
3458	 	 	 	 	;
3459	 D32A	 	 	 	find:	; определить диапазон адресов выбранной зоны расширенной памяти
3460	 	 	 	 	;
3461	 D32A  8B D0	 	 	 	mov dx,ax
3462	 D32C  8A 27	 	 	 	mov ah,[bx]
3463	 D32E  5B	 	 	 	pop bx
3464	 D32F  1F	 	 	 	pop ds
3465	 D330  8A FC	 	 	 	mov bh,ah  ; сохранить адрес порта выбранной памяти в BH
3466	 D332  03 D2	 	 	 	add dx,dx  ; определение базового адреса (DS)
3467	 D334  03 D2	 	 	 	add dx,dx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-69
	 	 	 	 	 	 	 	09-15-88    


3468	 D336  03 D2	 	 	 	add dx,dx
3469	 D338  03 D2	 	 	 	add dx,dx
3470	 D33A  81 E2 FFF0	 	 	and dx,0fff0h
3471	 D33E  26: 8B 44 02	 	 	mov ax,es:[si+2]
3472	 D342  D1 E8	 	 	 	shr ax,1
3473	 D344  D1 E8	 	 	 	shr ax,1
3474	 D346  D1 E8	 	 	 	shr ax,1
3475	 D348  D1 E8	 	 	 	shr ax,1
3476	 D34A  24 0F	 	 	 	and al,0fh
3477	 D34C  0A D0	 	 	 	or dl,al
3478	 D34E  8E DA	 	 	 	mov ds,dx
3479	 D350  26: 8B 7C 02	 	 	mov di,es:[si+2]  ; определить адрес обращения (DI)
3480	 D354  81 E7 000F	 	 	and di,0fh
3481	 D358  5A	 	 	 	pop dx
3482	 D359  58	 	 	 	pop ax
3483	 D35A  C3	 	 	 	ret
3484	 	 	 	 	;
3485	 D35B	 	 	 	ext endp
3486	 	 	 	 	;
3487	 	 	 	 	;
3488	 D35B	 	 	 	mem_2 proc near
3489	 D35B  83 C3 04	 	 	 	add bx,4
3490	 D35E  8B 57 02	 	 	 	mov dx,[bx+2]
3491	 D361  03 D2	 	 	 	add dx,dx
3492	 D363  03 D2	 	 	 	add dx,dx
3493	 D365  C3	 	 	 	ret
3494	 D366	 	 	 	mem_2 endp
3495	 	 	 	 	;
3496	 D366	 	 	 	error_ext:
3497	 D366  90	 	 	 	nop
3498	 	 	 	 	;
3499	 	 	 	 	;
3500	 D367	 	 	 	go proc near
3501	 	 	 	 	;
3502	 D367  E8 D2C8 R	 	 	call main_port	; сохранить адрес порта основной памяти в AH
3503	 	 	 	 	;
3504	 	 	 	 	;
3505	 D36A  FA	 	 	 	cli	 	; закрыть прерывание
3506	 D36B  BA 0200	 	 	 	mov dx,200h	; уст адрес порта платы основной памяти
3507	 D36E  8A D4	 	 	 	mov dl,ah
3508	 D370  EC	 	 	 	in al,dx
3509	 D371  24 F3	 	 	 	and al,0f3h ;*** reset r&w
3510	 D373  EE	 	 	 	out dx,al ; выключить режим чтения/записи для основной памяти
3511	 	 	 	 	;
3512	 	 	 	 	;
3513	 D374  8A D3	 	 	 	mov dl,bl ; уст адрес порта платы источника
3514	 D376  EC	 	 	 	in al,dx
3515	 D377  24 F3	 	 	 	and al,0f3h   ; выключить режим чтения/записи
3516	 D379  0C 04	 	 	 	or al,4     ; включить режим чтения для источника
3517	 D37B  EE	 	 	 	out dx,al
3518	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-70
	 	 	 	 	 	 	 	09-15-88    


3519	 	 	 	 	;
3520	 D37C  8A D7	 	 	 	mov dl,bh	; установить адрес порта платы назначения
3521	 D37E  EC	 	 	 	in al,dx
3522	 D37F  24 F3	 	 	 	and al,0f3h	; выключить режим чтения/записи
3523	 D381  0C 08	 	 	 	or al,8 	; включить режим записи для приемника
3524	 D383  EE	 	 	 	out dx,al
3525	 	 	 	 	;
3526	 D384  FC	 	 	 	cld	 	; переслать по счетчику
3527	 D385  F3/ A5	 	 	 	rep movsw
3528	 	 	 	 	;
3529	 D387  EC	 	 	 	in al,dx  ; выключить режим чтения/записи для платы приемника
3530	 D388  24 F3	 	 	 	and al,0f3h
3531	 D38A  EE	 	 	 	out dx,al
3532	 D38B  8A D3	 	 	 	mov dl,bl  ; выключить режим чтения/записи для платы источника
3533	 D38D  EC	 	 	 	in al,dx
3534	 D38E  24 F3	 	 	 	and al,0f3h
3535	 D390  EE	 	 	 	out dx,al
3536	 	 	 	 	;
3537	 D391  8A D4	 	 	 	mov dl,ah	; установить адрес порта основной памяти
3538	 D393  EC	 	 	 	in al,dx
3539	 D394  0C 0C	 	 	 	or al,0ch      ; включить режим чтения/записи
3540	 D396  EE	 	 	 	out dx,al  ; перевести основную память в режим чтения/записи
3541	 	 	 	 	;
3542	 D397  FB	 	 	 	sti	   ; включить прерывания
3543	 D398  C3	 	 	 	ret
3544	 D399	 	 	 	go endp
3545	 	 	 	 	;
3546	 	 	 	 	;
3547	 	 	 	 	;
3548	 	 	 	 	;
3549	 D399	 	 	 	ex_memory endp
3550	 	 	 	 	;
3551	 D399	 	 	 	pmsg	proc	near
3552	 D399  B8 0040	 	 	 	mov	ax,dat
3553	 D39C  8E D8	 	 	 	mov	ds,ax
3554	 D39E  8B EE	 	 	 	mov	bp,si
3555	 D3A0	 	 	 	gr12:
3556	 D3A0  2E: 8A 04	 	 	mov	al,cs:[si]
3557	 D3A3  46	 	 	 	inc	si
3558	 D3A4  B7 00	 	 	 	mov	bh,0
3559	 D3A6  B4 0E	 	 	 	mov	ah,14
3560	 D3A8  CD 10	 	 	 	int	10h
3561	 D3AA  E2 F4	 	 	 	loop	gr12
3562	 D3AC  C3	 	 	 	ret
3563	 D3AD	 	 	 	pmsg	endp
3564	 	 	 	 	
3565	 	 	 	 	
3566	 	 	 	 	;----------------------------------------
3567	 	 	 	 	;
3568	 	 	 	 	;   Записать телетайп (INT 10H, AH=14)
3569	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-71
	 	 	 	 	 	 	 	09-15-88    


3570	 	 	 	 	;   Эта программа выводит символ в буфер ЭЛИ с одновременной уста-
3571	 	 	 	 	; новкой позиции курсора и передвижением курсора на экране.
3572	 	 	 	 	;   После записи символа в последнюю позицию строки выполняется ав-
3573	 	 	 	 	; томатический переход на новую строку. Если страница экрана за-
3574	 	 	 	 	; полнена (позиция курсора 24,79/39), выполняется перемещение экрана
3575	 	 	 	 	; на одну строку вверх. Освободившаяся строка заполняется значением
3576	 	 	 	 	; атрибута символа (для алфавитно-цифрового режима). Для графики цвет=00
3577	 	 	 	 	; После записи очередного символа курсор установлен в следующую позицию.
3578	 	 	 	 	;
3579	 	 	 	 	;   ВХОД
3580	 	 	 	 	;	   AL - код выводимого символа,
3581	 	 	 	 	;	   BL - цвет переднего плана для графики.
3582	 	 	 	 	;
3583	 	 	 	 	;----------------------------------------
3584	 	 	 	 	
3585	 	 	 	 	 	assume	cs:code,ds:data
3586	 D3AD	 	 	 	write_tty	proc	near
3587	 D3AD  50	 	 	 	push	ax	 	; сохранить регистры
3588	 D3AE  50	 	 	 	push	ax
3589	 D3AF  B4 03	 	 	 	mov	ah,3
3590	 D3B1  8A 3E 0062 R	 	 	mov	bh,active_page
3591	 D3B5  CD 10	 	 	 	int	10h	 	; считать положение текущего курсора
3592	 D3B7  58	 	 	 	pop	ax	 	; восстановить символ
3593	 	 	 	 	
3594	 	 	 	 	;   DX содержит текущую позицию курсора
3595	 	 	 	 	
3596	 D3B8  3C 08	 	 	 	cmp	al,8	 	; есть возврат на одну позицию ?
3597	 D3BA  74 59	 	 	 	je	u8	 	; возврат на одну позицию
3598	 D3BC  3C 0D	 	 	 	cmp	al,0dh	 	; есть возврат каретки ?
3599	 D3BE  74 5E	 	 	 	je	u9	 	; возврат каретки
3600	 D3C0  3C 0A	 	 	 	cmp	al,0ah	 	; есть граница поля ?
3601	 D3C2  74 5E	 	 	 	je	u10	 	; граница поля
3602	 D3C4  3C 07	 	 	 	cmp	al,07h	 	; звуковой сигнал ?
3603	 D3C6  74 61	 	 	 	je	u11	 	; звуковой сигнал
3604	 	 	 	 	
3605	 	 	 	 	;   Запись символа на экран
3606	 	 	 	 	
3607	 D3C8  8A 3E 0062 R	 	 	mov	bh,active_page
3608	 D3CC  B4 0A	 	 	 	mov	ah,10	 	; запись символа без атрибута
3609	 D3CE  B9 0001	 	 	 	mov	cx,1
3610	 D3D1  CD 10	 	 	 	int	10h
3611	 	 	 	 	
3612	 	 	 	 	;   Положение курсора для следующего символа
3613	 	 	 	 	
3614	 D3D3  FE C2	 	 	 	inc	dl
3615	 D3D5  3A 16 004A R	 	 	cmp	dl,byte ptr crt_cols
3616	 D3D9  75 36	 	 	 	jnz	u7	 	; переход к установке курсора
3617	 D3DB  B2 00	 	 	 	mov	dl,0
3618	 D3DD  80 FE 18	 	 	 	cmp	dh,24	 	; проверка граничной строки
3619	 D3E0  75 2D	 	 	 	jnz	u6	 	; установить курсор
3620	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-72
	 	 	 	 	 	 	 	09-15-88    


3621	 	 	 	 	;   Сдвиг экрана
3622	 D3E2	 	 	 	u1:
3623	 	 	 	 	
3624	 D3E2  B4 02	 	 	 	mov	ah,2
3625	 D3E4  B7 00	 	 	 	mov	bh,0
3626	 D3E6  CD 10	 	 	 	int	10h	 	; установить курсор
3627	 	 	 	 	
3628	 	 	 	 	
3629	 D3E8  A0 0049 R	 	 	mov	al,crt_mode	; получить текущий режим
3630	 D3EB  3C 04	 	 	 	cmp	al,4
3631	 D3ED  72 06	 	 	 	jc	u2	 	; считывание курсора
3632	 D3EF  3C 07	 	 	 	cmp	al,7
3633	 D3F1  B7 00	 	 	 	mov	bh,0	 	; цвет заднего плана
3634	 D3F3  75 06	 	 	 	jne	u3
3635	 	 	 	 	
3636	 D3F5	 	 	 	u2:	 	 	 	; считывание курсора
3637	 D3F5  B4 08	 	 	 	mov	ah,8
3638	 D3F7  CD 10	 	 	 	int	10h	   ; считать символ/атрибут текущего курсора
3639	 D3F9  8A FC	 	 	 	mov	bh,ah	 	; запомнить в BH
3640	 	 	 	 	
3641	 	 	 	 	;   Перемещение экрана на одну строку вверх
3642	 	 	 	 	
3643	 D3FB	 	 	 	u3:
3644	 D3FB  B8 0601	 	 	 	mov	ax,601h
3645	 D3FE  B9 0000	 	 	 	mov	cx,0	 	; верхний левый угол
3646	 D401  B6 18	 	 	 	mov	dh,24	 	; координаты нижнего правого
3647	 D403  8A 16 004A R	 	 	mov	dl,byte ptr crt_cols	; угла
3648	 D407  FE CA	 	 	 	dec	dl
3649	 D409	 	 	 	u4:
3650	 D409  CD 10	 	 	 	int	10h
3651	 	 	 	 	
3652	 	 	 	 	;   Выход из прерывания
3653	 	 	 	 	
3654	 D40B	 	 	 	u5:
3655	 D40B  58	 	 	 	pop	ax	 	; восстановить символ
3656	 D40C  E9 F1DC R	 	 	jmp	video_return	; возврат к программе
3657	 	 	 	 	
3658	 D40F	 	 	 	u6:	 	 	 	; установить курсор
3659	 D40F  FE C6	 	 	 	inc	dh	 	; следующая строка
3660	 D411	 	 	 	u7:	 	 	 	; установить курсор
3661	 D411  B4 02	 	 	 	mov	ah,2
3662	 D413  EB F4	 	 	 	jmp	short u4	; установить новый курсор
3663	 	 	 	 	
3664	 	 	 	 	;   Сдвиг курсора на одну позицию влево
3665	 	 	 	 	
3666	 D415	 	 	 	u8:
3667	 D415  80 FA 00	 	 	 	cmp	dl,0
3668	 D418  74 F7	 	 	 	je	u7	 	; установить курсор
3669	 D41A  FE CA	 	 	 	dec	dl	 	; нет - снова его передать
3670	 D41C  EB F3	 	 	 	jmp	short u7
3671	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-73
	 	 	 	 	 	 	 	09-15-88    


3672	 	 	 	 	;   Перемещение курсора в начало строки
3673	 	 	 	 	
3674	 D41E	 	 	 	u9:
3675	 D41E  B2 00	 	 	 	mov	dl,0
3676	 D420  EB EF	 	 	 	jmp	short u7	; установить курсор
3677	 	 	 	 	
3678	 	 	 	 	;   Перемещение курсора на следующую строку
3679	 	 	 	 	
3680	 D422	 	 	 	u10:
3681	 D422  80 FE 18	 	 	 	cmp	dh,24	 	; последняя строка экрана
3682	 D425  75 E8	 	 	 	jne	u6	 	; да - сдвиг экрана
3683	 D427  EB B9	 	 	 	jmp	short u1	; нет - снова установить курсор
3684	 	 	 	 	
3685	 	 	 	 	;   Звуковой сигнал
3686	 	 	 	 	
3687	 D429	 	 	 	u11:
3688	 D429  B3 02	 	 	 	mov	bl,2	 	; уст длительность звукового сигнала
3689	 D42B  E8 E5C9 R	 	 	call	beep	 	; звук
3690	 D42E  EB DB	 	 	 	jmp	short u5	; возврат
3691	 D430	 	 	 	write_tty	endp
3692	 	 	 	 	
3693	 D430	 	 	 	ah12:
3694	 D430  3C 03	 	 	 	cmp	al,3
3695	 D432  75 26	 	 	 	jnz	ah121
3696	 D434  53	 	 	 	push	bx
3697	 D435  8C C8	 	 	 	mov	ax,cs
3698	 D437  8E C0	 	 	 	mov	es,ax
3699	 D439  B9 0080	 	 	 	mov	cx,80h
3700	 D43C  BA 0080	 	 	 	mov	dx,80h
3701	 D43F  5B	 	 	 	pop	bx
3702	 D440  BD CBB2 R	 	 	mov	bp,offset crt_char_rus
3703	 D443  80 FB 00	 	 	 	cmp	bl,0
3704	 D446  BB 0800	 	 	 	mov	bx,0800h
3705	 D449  74 03	 	 	 	jz	rav
3706	 D44B  BD DC00 R	 	 	mov	bp,offset crt_char_ibm
3707	 D44E	 	 	 	rav:
3708	 D44E  B8 1100	 	 	 	mov	ax,1100h
3709	 D451  50	 	 	 	push	ax
3710	 D452  CD 10	 	 	 	int	10h
3711	 D454  58	 	 	 	pop	ax
3712	 D455  CD 10	 	 	 	int	10h
3713	 D457  E9 F1DC R	 	 	jmp	video_return
3714	 D45A	 	 	 	ah121:
3715	 D45A  E9 CAE3 R	 	 	jmp	znak
3716	 D45D	 	 	 	stgtst:
3717	 D45D  B9 2000	 	 	 	 	mov	cx,2000h
3718	 	 	 	 	
3719	 D460	 	 	 	stgtst_cnt	proc	near
3720	 D460  8B D9	 	 	 	 	mov	bx,cx
3721	 D462  FC	 	 	 	 	cld
3722	 D463  2B FF	 	 	 	 	sub	di,di
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-74
	 	 	 	 	 	 	 	09-15-88    


3723	 D465  2B C0	 	 	 	 	sub	ax,ax
3724	 D467	 	 	 	c2_1:
3725	 D467  88 05	 	 	 	 	mov	[di],al
3726	 D469  8A 05	 	 	 	 	mov	al,[di]
3727	 D46B  32 C4	 	 	 	 	xor	al,ah
3728	 D46D  75 79	 	 	 	 	jnz	c7
3729	 D46F  FE C4	 	 	 	 	inc	ah
3730	 D471  8A C4	 	 	 	 	mov	al,ah
3731	 D473  75 F2	 	 	 	 	jnz	c2_1
3732	 D475  B8 55AA	 	 	 	 	mov	ax,055aah
3733	 D478  8B D0	 	 	 	 	mov	dx,ax
3734	 D47A  F3/ AB	 	 	 	 	rep	stosw
3735	 D47C  E4 61	 	 	 	 	in	al,port_b
3736	 D47E  0C 30	 	 	 	 	or	al,030h
3737	 D480  E6 61	 	 	 	 	out	port_b,al
3738	 D482  90	 	 	 	 	nop
3739	 D483  24 CF	 	 	 	 	and	al,0cfh
3740	 D485  E6 61	 	 	 	 	out	port_b,al
3741	 	 	 	 	;
3742	 D487  4F	 	 	 	 	dec	di
3743	 D488  4F	 	 	 	 	dec	di
3744	 D489  FD	 	 	 	 	std
3745	 D48A  8B F7	 	 	 	 	mov	si,di
3746	 D48C  8B CB	 	 	 	 	mov	cx,bx
3747	 D48E	 	 	 	c3:
3748	 D48E  AD	 	 	 	 	lodsw
3749	 D48F  33 C2	 	 	 	 	xor	ax,dx
3750	 D491  75 57	 	 	 	 	jne	c7x
3751	 D493  B8 AA55	 	 	 	 	mov	ax,0aa55h
3752	 D496  AB	 	 	 	 	stosw
3753	 D497  E2 F5	 	 	 	 	loop	c3
3754	 	 	 	 	;
3755	 D499  FC	 	 	 	 	cld
3756	 D49A  47	 	 	 	 	inc	di
3757	 D49B  47	 	 	 	 	inc	di
3758	 D49C  8B F7	 	 	 	 	mov	si,di
3759	 D49E  8B CB	 	 	 	 	mov	cx,bx
3760	 D4A0  8B D0	 	 	 	 	mov	dx,ax
3761	 D4A2	 	 	 	c4:
3762	 D4A2  AD	 	 	 	 	lodsw
3763	 D4A3  33 C2	 	 	 	 	xor	ax,dx
3764	 D4A5  75 43	 	 	 	 	jne	c7x
3765	 D4A7  B8 FFFF	 	 	 	 	mov	ax,0ffffh
3766	 D4AA  AB	 	 	 	 	stosw
3767	 D4AB  E2 F5	 	 	 	 	loop	c4
3768	 	 	 	 	;
3769	 D4AD  4F	 	 	 	 	dec	di
3770	 D4AE  4F	 	 	 	 	dec	di
3771	 D4AF  FD	 	 	 	 	std
3772	 D4B0  8B F7	 	 	 	 	mov	si,di
3773	 D4B2  8B CB	 	 	 	 	mov	cx,bx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-75
	 	 	 	 	 	 	 	09-15-88    


3774	 D4B4  8B D0	 	 	 	 	mov	dx,ax
3775	 D4B6	 	 	 	c5:
3776	 D4B6  AD	 	 	 	 	lodsw
3777	 D4B7  33 C2	 	 	 	 	xor	ax,dx
3778	 D4B9  75 2F	 	 	 	 	jne	c7x
3779	 D4BB  B8 0101	 	 	 	 	mov	ax,00101h
3780	 D4BE  AB	 	 	 	 	stosw
3781	 D4BF  E2 F5	 	 	 	 	loop	c5
3782	 	 	 	 	;
3783	 D4C1  FC	 	 	 	 	cld
3784	 D4C2  47	 	 	 	 	inc	di
3785	 D4C3  47	 	 	 	 	inc	di
3786	 D4C4  8B F7	 	 	 	 	mov	si,di
3787	 D4C6  8B CB	 	 	 	 	mov	cx,bx
3788	 D4C8  8B D0	 	 	 	 	mov	dx,ax
3789	 D4CA	 	 	 	c6:
3790	 D4CA  AD	 	 	 	 	lodsw
3791	 D4CB  33 C2	 	 	 	 	xor	ax,dx
3792	 D4CD  75 1B	 	 	 	 	jne	c7x
3793	 D4CF  AB	 	 	 	 	stosw
3794	 D4D0  E2 F8	 	 	 	 	loop	c6
3795	 	 	 	 	;
3796	 D4D2  4F	 	 	 	 	dec	di
3797	 D4D3  4F	 	 	 	 	dec	di
3798	 D4D4  FD	 	 	 	 	std
3799	 D4D5  8B F7	 	 	 	 	mov	si,di
3800	 D4D7  8B CB	 	 	 	 	mov	cx,bx
3801	 D4D9  8B D0	 	 	 	 	mov	dx,ax
3802	 D4DB	 	 	 	c6x:
3803	 D4DB  AD	 	 	 	 	lodsw
3804	 D4DC  33 C2	 	 	 	 	xor	ax,dx
3805	 D4DE  75 0A	 	 	 	 	jne	c7x
3806	 D4E0  E2 F9	 	 	 	 	loop	c6x
3807	 	 	 	 	;
3808	 D4E2  E4 62	 	 	 	 	in	al,port_c
3809	 D4E4  24 40	 	 	 	 	and	al,040h
3810	 D4E6  B0 00	 	 	 	 	mov	al,0
3811	 D4E8	 	 	 	c7:
3812	 D4E8  FC	 	 	 	 	cld
3813	 D4E9  C3	 	 	 	 	ret
3814	 D4EA	 	 	 	c7x:
3815	 D4EA  3C 00	 	 	 	 	cmp	al,0
3816	 D4EC  75 FA	 	 	 	 	jnz	c7
3817	 D4EE  32 C4	 	 	 	 	xor	al,ah
3818	 D4F0  46	 	 	 	 	inc	si
3819	 D4F1  EB F5	 	 	 	 	jmp	short c7
3820	 D4F3	 	 	 	stgtst_cnt	endp
3821	 	 	 	 	
3822	 DC00	 	 	 	 	org	0DC00h
3823	 	 	 	 	
3824	 DC00	 	 	 	crt_char_ibm	label byte
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-76
	 	 	 	 	 	 	 	09-15-88    


3825	 	 	 	 	
3826	 DC00  78 CC C0 CC 78	 	 	DB	78H,0CCH,0C0H,0CCH,78H	 	;0100 78 CC C0 CC 78
3827	 DC05  18 0C 78 00 CC	 	 	DB	18H,0CH,78H,0,0CCH	 	;0105 18 0C 78 00 CC
3828	 DC0A  00 03 [	 	 	 	DB	0,3 DUP(0CCH),7EH	 	;010A 00 CC CC CC 7E
3829	                CC	 	
3830	                    ]	 	
3831	                   7E	 	
3832	 DC0F  00 1C 00 78 CC	 	 	DB	0,1CH,0,78H,0CCH	 	;010F 00 1C 00 78 CC
3833	 DC14  FC C0 78 00 7E	 	 	DB	0FCH,0C0H,78H,0,7EH	 	;0114 FC C0 78 00 7E
3834	 DC19  C3 3C 06 3E 66	 	 	DB	0C3H,3CH,6,3EH,66H	 	;0119 C3 3C 06 3E 66
3835	 DC1E  3F 00 CC 00 78	 	 	DB	3FH,0,0CCH,0,78H	 	;011E 3F 00 CC 00 78
3836	 DC23  0C 7C CC 7E 00	 	 	DB	0CH,7CH,0CCH,7EH,0	 	;0123 0C 7C CC 7E 00
3837	 DC28  E0 00 78 0C 7C	 	 	DB	0E0H,0,78H,0CH,7CH	 	;0128 E0 00 78 0C 7C
3838	 DC2D  CC 02 [0	 	 	 	DB	0CCH,7EH,0,2 DUP(30H),78H	;012D CC 7E 00 30 30 78
3839	                30	 	
3840	                    ]	 	
3841	                   78	 	
3842	 DC33  0C 7C CC 7E 00	 	 	DB	0CH,7CH,0CCH,7EH,0	 	;0133 0C 7C CC 7E 00
3843	 DC38     02 [	 	 	 	DB	2 DUP(0),78H,0C0H	 	;0138 00 00 78 C0
3844	                00	 	
3845	                    ]	 	
3846	                   78 C0	
3847	 DC3C  C0 78 0C 38 7E	 	 	DB	0C0H,78H,0CH,38H,7EH	 	;013C C0 78 0C 38 7E
3848	 DC41  C3 3C 66 7E 60	 	 	DB	0C3H,3CH,66H,7EH,60H	 	;0141 C3 3C 66 7E 60
3849	 DC46  3C 00 CC 00 78	 	 	DB	3CH,0,0CCH,0,78H	 	;0146 3C 00 CC 00 78
3850	 DC4B  CC FC C0 78 00	 	 	DB	0CCH,0FCH,0C0H,78H,0	 	;014B CC FC C0 78 00
3851	 DC50  E0 00 78 CC FC	 	 	DB	0E0H,0,78H,0CCH,0FCH	 	;0150 E0 00 78 CC FC
3852	 DC55  C0 78 00 CC 00	 	 	DB	0C0H,78H,0,0CCH,0	 	;0155 C0 78 00 CC 00
3853	 DC5A  70 03 [	 	 	 	DB	70H,3 DUP(30H),78H	 	;015A 70 30 30 30 78
3854	                30	 	
3855	                    ]	 	
3856	                   78	 	
3857	 DC5F  00 7C C6 38 18	 	 	DB	0,7CH,0C6H,38H,18H	 	;015F 00 7C C6 38 18
3858	 DC64     02 [	 	 	 	DB	2 DUP(18H),3CH,0	 	;0164 18 18 3C 00
3859	                18	 	
3860	                    ]	 	
3861	                   3C 00	
3862	 DC68  E0 03 [0	 	 	 	DB	0E0H,0,70H,3 DUP(30H),78H	;0168 E0 00 70 30 30 30 78
3863	                30	 	
3864	                    ]	 	
3865	                   78	 	
3866	 DC6F  00 C6 38 6C C6	 	 	DB	0,0C6H,38H,6CH,0C6H	 	;016F 00 C6 38 6C C6
3867	 DC74  FE 02 [	 	 	 	DB	0FEH,2 DUP(0C6H),0	 	;0174 FE C6 C6 00
3868	                C6	 	
3869	                    ]	 	
3870	                   00	 	
3871	 DC78     02 [	 	 	 	DB	2 DUP(30H),0,78H	 	;0178 30 30 00 78
3872	                30	 	
3873	                    ]	 	
3874	                   00 78	
3875	 DC7C  CC FC CC 00 1C	 	 	DB	0CCH,0FCH,0CCH,0,1CH	 	;017C CC FC CC 00 1C
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-77
	 	 	 	 	 	 	 	09-15-88    


3876	 DC81  00 FC 60 78 60	 	 	DB	0,0FCH,60H,78H,60H	 	;0181 00 FC 60 78 60
3877	 DC86  FC 03 [	 	 	 	DB	0FCH,3 DUP(0),7FH	 	;0186 FC 00 00 00 7F
3878	                00	 	
3879	                    ]	 	
3880	                   7F	 	
3881	 DC8B  0C 7F CC 7F 00	 	 	DB	0CH,7FH,0CCH,7FH,0	 	;018B 0C 7F CC 7F 00
3882	 DC90  3E 6C CC FE CC	 	 	DB	3EH,6CH,0CCH,0FEH,0CCH	 	;0190 3E 6C CC FE CC
3883	 DC95  CC CE 00 78 CC	 	 	DB	0CCH,0CEH,0,78H,0CCH	 	;0195 CC CE 00 78 CC
3884	 DC9A  00 02 [	 	 	 	DB	0,78H,2 DUP(0CCH),78H	 	;019A 00 78 CC CC 78
3885	                CC	 	
3886	                    ]	 	
3887	                   78	 	
3888	 DC9F     02 [	 	 	 	DB	2 DUP(0),0CCH,0 	 	;019F 00 00 CC 00
3889	                00	 	
3890	                    ]	 	
3891	                   CC 00	
3892	 DCA3  78 02 [	 	 	 	DB	78H,2 DUP(0CCH),78H	 	;01A3 78 CC CC 78
3893	                CC	 	
3894	                    ]	 	
3895	                   78	 	
3896	 DCA7     02 [	 	 	 	DB	2 DUP(0),0E0H,0 	 	;01A7 00 00 E0 00
3897	                00	 	
3898	                    ]	 	
3899	                   E0 00	
3900	 DCAB  78 02 [	 	 	 	DB	78H,2 DUP(0CCH),78H	 	;01AB 78 CC CC 78
3901	                CC	 	
3902	                    ]	 	
3903	                   78	 	
3904	 DCAF  00 78 CC 00 CC	 	 	DB	0,78H,0CCH,0,0CCH	 	;01AF 00 78 CC 00 CC
3905	 DCB4     02 [	 	 	 	DB	2 DUP(0CCH),7EH,0	 	;01B4 CC CC 7E 00
3906	                CC	 	
3907	                    ]	 	
3908	                   7E 00	
3909	 DCB8  00 03 [0	 	 	 	DB	0,0E0H,0,3 DUP(0CCH),7EH	;01B8 00 E0 00 CC CC CC 7E
3910	                CC	 	
3911	                    ]	 	
3912	                   7E	 	
3913	 DCBF     02 [	 	 	 	DB	2 DUP(0),0CCH,0 	 	;01BF 00 00 CC 00
3914	                00	 	
3915	                    ]	 	
3916	                   CC 00	
3917	 DCC3     02 [	 	 	 	DB	2 DUP(0CCH),7CH,0CH	 	;01C3 CC CC 7C 0C
3918	                CC	 	
3919	                    ]	 	
3920	                   7C 0C	
3921	 DCC7  F8 C3 18 3C 66	 	 	DB	0F8H,0C3H,18H,3CH,66H	 	;01C7 F8 C3 18 3C 66
3922	 DCCC  66 3C 18 00 CC	 	 	DB	66H,3CH,18H,0,0CCH	 	;01CC 66 3C 18 00 CC
3923	 DCD1  00 04 [	 	 	 	DB	0,4 DUP(0CCH),78H	 	;01D1 00 CC CC CC CC 78
3924	                CC	 	
3925	                    ]	 	
3926	                   78	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-78
	 	 	 	 	 	 	 	09-15-88    


3927	 DCD7  00 02 [	 	 	 	DB	0,2 DUP(18H),7EH	 	;01D7 00 18 18 7E
3928	                18	 	
3929	                    ]	 	
3930	                   7E	 	
3931	 DCDB     02 [	 	 	 	DB	2 DUP(0C0H),7EH,18H	 	;01DB C0 C0 7E 18
3932	                C0	 	
3933	                    ]	 	
3934	                   7E 18	
3935	 DCDF  18 38 6C 64 F0	 	 	DB	18H,38H,6CH,64H,0F0H	 	;01DF 18 38 6C 64 F0
3936	 DCE4  60 E6 FC 00 CC	 	 	DB	60H,0E6H,0FCH,0,0CCH	 	;01E4 60 E6 FC 00 CC
3937	 DCE9  CC 78 FC 30 FC	 	 	DB	0CCH,78H,0FCH,30H,0FCH	 	;01E9 CC 78 FC 30 FC
3938	 DCEE     02 [	 	 	 	DB	2 DUP(30H),0F8H,0CCH	 	;01EE 30 30 F8 CC
3939	                30	 	
3940	                    ]	 	
3941	                   F8 CC	
3942	 DCF2  CC FA C6 CF C6	 	 	DB	0CCH,0FAH,0C6H,0CFH,0C6H	;01F2 CC FA C6 CF C6
3943	 DCF7  C7 0E 1B 18 3C	 	 	DB	0C7H,0EH,1BH,18H,3CH	 	;01F7 C7 0E 1B 18 3C
3944	 DCFC     02 [	 	 	 	DB	2 DUP(18H),0D8H,70H	 	;01FC 18 18 D8 70
3945	                18	 	
3946	                    ]	 	
3947	                   D8 70	
3948	 DD00  1C 00 78 0C 7C	 	 	DB	1CH,0,78H,0CH,7CH	 	;0200 1C 00 78 0C 7C
3949	 DD05  CC 7E 00 38 00	 	 	DB	0CCH,7EH,0,38H,0	 	;0205 CC 7E 00 38 00
3950	 DD0A  70 03 [	 	 	 	DB	70H,3 DUP(30H),78H	 	;020A 70 30 30 30 78
3951	                30	 	
3952	                    ]	 	
3953	                   78	 	
3954	 DD0F     02 [	 	 	 	DB	2 DUP(0),1CH,0	 	 	;020F 00 00 1C 00
3955	                00	 	
3956	                    ]	 	
3957	                   1C 00	
3958	 DD13  78 02 [	 	 	 	DB	78H,2 DUP(0CCH),78H	 	;0213 78 CC CC 78
3959	                CC	 	
3960	                    ]	 	
3961	                   78	 	
3962	 DD17     02 [	 	 	 	DB	2 DUP(0),1CH,0	 	 	;0217 00 00 1C 00
3963	                00	 	
3964	                    ]	 	
3965	                   1C 00	
3966	 DD1B     03 [	 	 	 	DB	3 DUP(0CCH),7EH,0	 	;021B CC CC CC 7E 00
3967	                CC	 	
3968	                    ]	 	
3969	                   7E 00	
3970	 DD20  00 F8 00 F8 CC	 	 	DB	0,0F8H,0,0F8H,0CCH	 	;0220 00 F8 00 F8 CC
3971	 DD25     02 [	 	 	 	DB	2 DUP(0CCH),0,0FCH	 	;0225 CC CC 00 FC
3972	                CC	 	
3973	                    ]	 	
3974	                   00 FC	
3975	 DD29  00 CC EC FC DC	 	 	DB	0,0CCH,0ECH,0FCH,0DCH	 	;0229 00 CC EC FC DC
3976	 DD2E  CC 02 [C	 	 	 	DB	0CCH,0,3CH,2 DUP(6CH),3EH	;022E CC 00 3C 6C 6C 3E
3977	                6C	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-79
	 	 	 	 	 	 	 	09-15-88    


3978	                    ]	 	
3979	                   3E	 	
3980	 DD34  00 02 [	 	 	 	DB	0,7EH,2 DUP(0),38H	 	;0234 00 7E 00 00 38
3981	                00	 	
3982	                    ]	 	
3983	                   38	 	
3984	 DD39     02 [	 	 	 	DB	2 DUP(6CH),38H,0	 	;0239 6C 6C 38 00
3985	                6C	 	
3986	                    ]	 	
3987	                   38 00	
3988	 DD3D  7C 02 [	 	 	 	DB	7CH,2 DUP(0),30H	 	;023D 7C 00 00 30
3989	                00	 	
3990	                    ]	 	
3991	                   30	 	
3992	 DD41  00 30 60 C0 CC	 	 	DB	0,30H,60H,0C0H,0CCH	 	;0241 00 30 60 C0 CC
3993	 DD46  78 04 [	 	 	 	DB	78H,4 DUP(0),0FCH	 	;0246 78 00 00 00 00 FC
3994	                00	 	
3995	                    ]	 	
3996	                   FC	 	
3997	 DD4C     02 [	 	 	 	DB	2 DUP(0C0H),5 DUP(0),0FCH	;024C C0 C0 00 00 00 00 00 FC
3998	                C0	 	
3999	                    ]	 	
4000	          05 [	 	 	
4001	                00	 	
4002	                    ]	 	
4003	                   FC	 	
4004	 DD54     02 [	 	 	 	DB	2 DUP(0CH),2 DUP(0),0C3H	;0254 0C 0C 00 00 C3
4005	                0C	 	
4006	                    ]	 	
4007	          02 [	 	 	
4008	                00	 	
4009	                    ]	 	
4010	                   C3	 	
4011	 DD59  C6 CC DE 33 66	 	 	DB	0C6H,0CCH,0DEH,33H,66H	 	;0259 C6 CC DE 33 66
4012	 DD5E  CC 0F C3 C6 CC	 	 	DB	0CCH,0FH,0C3H,0C6H,0CCH 	;025E CC 0F C3 C6 CC
4013	 DD63  DB 37 6F CF 03	 	 	DB	0DBH,37H,6FH,0CFH,3	 	;0263 DB 37 6F CF 03
4014	 DD68     02 [	 	 	 	DB	2 DUP(18H),0,18H	 	;0268 18 18 00 18
4015	                18	 	
4016	                    ]	 	
4017	                   00 18	
4018	 DD6C     03 [	 	 	 	DB	3 DUP(18H),2 DUP(0),33H 	;026C 18 18 18 00 00 33
4019	                18	 	
4020	                    ]	 	
4021	          02 [	 	 	
4022	                00	 	
4023	                    ]	 	
4024	                   33	 	
4025	 DD72  66 CC 66 33 00	 	 	DB	66H,0CCH,66H,33H,0	 	;0272 66 CC 66 33 00
4026	 DD77     02 [	 	 	 	DB	2 DUP(0),0CCH,66H	 	;0277 00 00 CC 66
4027	                00	 	
4028	                    ]	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-80
	 	 	 	 	 	 	 	09-15-88    


4029	                   CC 66	
4030	 DD7B  33 02 [C	 	 	 	DB	33H,66H,0CCH,2 DUP(0),22H	;027B 33 66 CC 00 00 22
4031	                00	 	
4032	                    ]	 	
4033	                   22	 	
4034	 DD81  88 22 88 22 88	 	 	DB	88H,22H,88H,22H,88H	 	;0281 88 22 88 22 88
4035	 DD86  22 88 55 AA 55	 	 	DB	22H,88H,55H,0AAH,55H	 	;0286 22 88 55 AA 55
4036	 DD8B  AA 55 AA 55 AA	 	 	DB	0AAH,55H,0AAH,55H,0AAH	 	;028B AA 55 AA 55 AA
4037	 DD90  DB 77 DB EE DB	 	 	DB	0DBH,77H,0DBH,0EEH,0DBH 	;0290 DB 77 DB EE DB
4038	 DD95  77 0C [E	 	 	 	DB	77H,0DBH,0EEH,0CH DUP(18H),0F8H ;0295 77 DB EE 18 18 18 18 18 1
	 	 	 	8 18 18 18 18 18 18 F8
4039	                18	 	
4040	                    ]	 	
4041	                   F8	 	
4042	 DDA5     05 [	 	 	 	DB	5 DUP(18H),0F8H,18H	 	;02A5 18 18 18 18 18 F8 18
4043	                18	 	
4044	                    ]	 	
4045	                   F8 18	
4046	 DDAC  F8 03 [	 	 	 	DB	0F8H,3 DUP(18H),36H	 	;02AC F8 18 18 18 36
4047	                18	 	
4048	                    ]	 	
4049	                   36	 	
4050	 DDB1     03 [	 	 	 	DB	3 DUP(36H),0F6H,36H	 	;02B1 36 36 36 F6 36
4051	                36	 	
4052	                    ]	 	
4053	                   F6 36	
4054	 DDB6     02 [	 	 	 	DB	2 DUP(36H),4 DUP(0),0FEH	;02B6 36 36 00 00 00 00 FE
4055	                36	 	
4056	                    ]	 	
4057	          04 [	 	 	
4058	                00	 	
4059	                    ]	 	
4060	                   FE	 	
4061	 DDBD     03 [	 	 	 	DB	3 DUP(36H),2 DUP(0),0F8H	;02BD 36 36 36 00 00 F8
4062	                36	 	
4063	                    ]	 	
4064	          02 [	 	 	
4065	                00	 	
4066	                    ]	 	
4067	                   F8	 	
4068	 DDC3  18 03 [	 	 	 	DB	18H,0F8H,3 DUP(18H),36H 	;02C3 18 F8 18 18 18 36
4069	                18	 	
4070	                    ]	 	
4071	                   36	 	
4072	 DDC9  36 F6 06 F6 36	 	 	DB	36H,0F6H,6,0F6H,36H	 	;02C9 36 F6 06 F6 36
4073	 DDCE     0A [	 	 	 	DB	0AH DUP(36H),2 DUP(0),0FEH	;02CE 36 36 36 36 36 36 36 36 3
	 	 	 	6 36 00 00 FE
4074	                36	 	
4075	                    ]	 	
4076	          02 [	 	 	
4077	                00	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-81
	 	 	 	 	 	 	 	09-15-88    


4078	                    ]	 	
4079	                   FE	 	
4080	 DDDB  06 05 [	 	 	 	DB	6,0F6H,5 DUP(36H),0F6H	 	;02DB 06 F6 36 36 36 36 36 F6
4081	                36	 	
4082	                    ]	 	
4083	                   F6	 	
4084	 DDE3  06 03 [	 	 	 	DB	6,0FEH,3 DUP(0),36H	 	;02E3 06 FE 00 00 00 36
4085	                00	 	
4086	                    ]	 	
4087	                   36	 	
4088	 DDE9     03 [	 	 	 	DB	3 DUP(36H),0FEH,0	 	;02E9 36 36 36 FE 00
4089	                36	 	
4090	                    ]	 	
4091	                   FE 00	
4092	 DDEE     02 [	 	 	 	DB	2 DUP(0),2 DUP(18H),0F8H	;02EE 00 00 18 18 F8
4093	                00	 	
4094	                    ]	 	
4095	          02 [	 	 	
4096	                18	 	
4097	                    ]	 	
4098	                   F8	 	
4099	 DDF3  18 07 [	 	 	 	DB	18H,0F8H,7 DUP(0),0F8H	 	;02F3 18 F8 00 00 00 00 00 00 0
	 	 	 	0 F8
4100	                00	 	
4101	                    ]	 	
4102	                   F8	 	
4103	 DDFD     07 [	 	 	 	DB	7 DUP(18H),1FH,0	 	;02FD 18 18 18 18 18 18 18 1F 0
	 	 	 	0
4104	                18	 	
4105	                    ]	 	
4106	                   1F 00	
4107	 DE06     02 [	 	 	 	DB	2 DUP(0),4 DUP(18H),0FFH	;0306 00 00 18 18 18 18 FF
4108	                00	 	
4109	                    ]	 	
4110	          04 [	 	 	
4111	                18	 	
4112	                    ]	 	
4113	                   FF	 	
4114	 DE0D     07 [	 	 	 	DB	7 DUP(0),0FFH,18H	 	;030D 00 00 00 00 00 00 00 FF 1
	 	 	 	8
4115	                00	 	
4116	                    ]	 	
4117	                   FF 18	
4118	 DE16     06 [	 	 	 	DB	6 DUP(18H),1FH,18H	 	;0316 18 18 18 18 18 18 1F 18
4119	                18	 	
4120	                    ]	 	
4121	                   1F 18	
4122	 DE1E     02 [	 	 	 	DB	2 DUP(18H),4 DUP(0),0FFH	;031E 18 18 00 00 00 00 FF
4123	                18	 	
4124	                    ]	 	
4125	          04 [	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-82
	 	 	 	 	 	 	 	09-15-88    


4126	                00	 	
4127	                    ]	 	
4128	                   FF	 	
4129	 DE25     03 [	 	 	 	DB	3 DUP(0),4 DUP(18H),0FFH	;0325 00 00 00 18 18 18 18 FF
4130	                00	 	
4131	                    ]	 	
4132	          04 [	 	 	
4133	                18	 	
4134	                    ]	 	
4135	                   FF	 	
4136	 DE2D     05 [	 	 	 	DB	5 DUP(18H),1FH,18H	 	;032D 18 18 18 18 18 1F 18
4137	                18	 	
4138	                    ]	 	
4139	                   1F 18	
4140	 DE34  1F 03 [	 	 	 	DB	1FH,3 DUP(18H),36H	 	;0334 1F 18 18 18 36
4141	                18	 	
4142	                    ]	 	
4143	                   36	 	
4144	 DE39     03 [	 	 	 	DB	3 DUP(36H),37H,36H	 	;0339 36 36 36 37 36
4145	                36	 	
4146	                    ]	 	
4147	                   37 36	
4148	 DE3E     04 [	 	 	 	DB	4 DUP(36H),37H,30H	 	;033E 36 36 36 36 37 30
4149	                36	 	
4150	                    ]	 	
4151	                   37 30	
4152	 DE44  3F 05 [	 	 	 	DB	3FH,5 DUP(0),3FH	 	;0344 3F 00 00 00 00 00 3F
4153	                00	 	
4154	                    ]	 	
4155	                   3F	 	
4156	 DE4B  30 05 [	 	 	 	DB	30H,37H,5 DUP(36H),0F7H 	;034B 30 37 36 36 36 36 36 F7
4157	                36	 	
4158	                    ]	 	
4159	                   F7	 	
4160	 DE53  00 05 [	 	 	 	DB	0,0FFH,5 DUP(0),0FFH	 	;0353 00 FF 00 00 00 00 00 FF
4161	                00	 	
4162	                    ]	 	
4163	                   FF	 	
4164	 DE5B  00 05 [	 	 	 	DB	0,0F7H,5 DUP(36H),37H	 	;035B 00 F7 36 36 36 36 36 37
4165	                36	 	
4166	                    ]	 	
4167	                   37	 	
4168	 DE63  30 03 [	 	 	 	DB	30H,37H,3 DUP(36H),0	 	;0363 30 37 36 36 36 00
4169	                36	 	
4170	                    ]	 	
4171	                   00	 	
4172	 DE69  00 FF 00 FF 00	 	 	DB	0,0FFH,0,0FFH,0 	 	;0369 00 FF 00 FF 00
4173	 DE6E     02 [	 	 	 	DB	2 DUP(0),2 DUP(36H),0F7H	;036E 00 00 36 36 F7
4174	                00	 	
4175	                    ]	 	
4176	          02 [	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-83
	 	 	 	 	 	 	 	09-15-88    


4177	                36	 	
4178	                    ]	 	
4179	                   F7	 	
4180	 DE73  00 03 [	 	 	 	DB	0,0F7H,3 DUP(36H),18H	 	;0373 00 F7 36 36 36 18
4181	                36	 	
4182	                    ]	 	
4183	                   18	 	
4184	 DE79  18 FF 00 FF 00	 	 	DB	18H,0FFH,0,0FFH,0	 	;0379 18 FF 00 FF 00
4185	 DE7E     02 [	 	 	 	DB	2 DUP(0),4 DUP(36H),0FFH	;037E 00 00 36 36 36 36 FF
4186	                00	 	
4187	                    ]	 	
4188	          04 [	 	 	
4189	                36	 	
4190	                    ]	 	
4191	                   FF	 	
4192	 DE85     05 [	 	 	 	DB	5 DUP(0),0FFH,0 	 	;0385 00 00 00 00 00 FF 00
4193	                00	 	
4194	                    ]	 	
4195	                   FF 00	
4196	 DE8C  FF 03 [	 	 	 	DB	0FFH,3 DUP(18H),0	 	;038C FF 18 18 18 00
4197	                18	 	
4198	                    ]	 	
4199	                   00	 	
4200	 DE91     03 [	 	 	 	DB	3 DUP(0),0FFH,36H	 	;0391 00 00 00 FF 36
4201	                00	 	
4202	                    ]	 	
4203	                   FF 36	
4204	 DE96     06 [	 	 	 	DB	6 DUP(36H),3FH,0	 	;0396 36 36 36 36 36 36 3F 00
4205	                36	 	
4206	                    ]	 	
4207	                   3F 00	
4208	 DE9E     02 [	 	 	 	DB	2 DUP(0),2 DUP(18H),1FH 	;039E 00 00 18 18 1F
4209	                00	 	
4210	                    ]	 	
4211	          02 [	 	 	
4212	                18	 	
4213	                    ]	 	
4214	                   1F	 	
4215	 DEA3  18 05 [	 	 	 	DB	18H,1FH,5 DUP(0),1FH	 	;03A3 18 1F 00 00 00 00 00 1F
4216	                00	 	
4217	                    ]	 	
4218	                   1F	 	
4219	 DEAB  18 03 [	 	 	 	DB	18H,1FH,3 DUP(18H),0	 	;03AB 18 1F 18 18 18 00
4220	                18	 	
4221	                    ]	 	
4222	                   00	 	
4223	 DEB1     03 [	 	 	 	DB	3 DUP(0),3FH,36H	 	;03B1 00 00 00 3F 36
4224	                00	 	
4225	                    ]	 	
4226	                   3F 36	
4227	 DEB6     06 [	 	 	 	DB	6 DUP(36H),0FFH,36H	 	;03B6 36 36 36 36 36 36 FF 36
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-84
	 	 	 	 	 	 	 	09-15-88    


4228	                36	 	
4229	                    ]	 	
4230	                   FF 36	
4231	 DEBE     02 [	 	 	 	DB	2 DUP(36H),2 DUP(18H),0FFH	;03BE 36 36 18 18 FF
4232	                36	 	
4233	                    ]	 	
4234	          02 [	 	 	
4235	                18	 	
4236	                    ]	 	
4237	                   FF	 	
4238	 DEC3  18 07 [	 	 	 	DB	18H,0FFH,7 DUP(18H),0F8H	;03C3 18 FF 18 18 18 18 18 18 1
	 	 	 	8 F8
4239	                18	 	
4240	                    ]	 	
4241	                   F8	 	
4242	 DECD     07 [	 	 	 	DB	7 DUP(0),1FH,18H	 	;03CD 00 00 00 00 00 00 00 1F 1
	 	 	 	8
4243	                00	 	
4244	                    ]	 	
4245	                   1F 18	
4246	 DED6     02 [	 	 	 	DB	2 DUP(18H),8 DUP(0FFH),0	;03D6 18 18 FF FF FF FF FF FF F
	 	 	 	F FF 00
4247	                18	 	
4248	                    ]	 	
4249	          08 [	 	 	
4250	                FF	 	
4251	                    ]	 	
4252	                   00	 	
4253	 DEE1     03 [	 	 	 	DB	3 DUP(0),4 DUP(0FFH),0F0H	;03E1 00 00 00 FF FF FF FF F0
4254	                00	 	
4255	                    ]	 	
4256	          04 [	 	 	
4257	                FF	 	
4258	                    ]	 	
4259	                   F0	 	
4260	 DEE9     07 [	 	 	 	DB	7 DUP(0F0H),8 DUP(0FH),0FFH	;03E9 F0 F0 F0 F0 F0 F0 F0 0F 0
	 	 	 	F 0F 0F 0F 0F 0F 0F FF
4261	                F0	 	
4262	                    ]	 	
4263	          08 [	 	 	
4264	                0F	 	
4265	                    ]	 	
4266	                   FF	 	
4267	 DEF9     03 [	 	 	 	DB	3 DUP(0FFH),6 DUP(0),76H	;03F9 FF FF FF 00 00 00 00 00 0
	 	 	 	0 76
4268	                FF	 	
4269	                    ]	 	
4270	          06 [	 	 	
4271	                00	 	
4272	                    ]	 	
4273	                   76	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-85
	 	 	 	 	 	 	 	09-15-88    


4274	 DF03  DC C8 DC 76 00	 	 	DB	0DCH,0C8H,0DCH,76H,0	 	;0403 DC C8 DC 76 00
4275	 DF08  00 78 CC F8 CC	 	 	DB	0,78H,0CCH,0F8H,0CCH	 	;0408 00 78 CC F8 CC
4276	 DF0D  F8 02 [	 	 	 	DB	0F8H,2 DUP(0C0H),0	 	;040D F8 C0 C0 00
4277	                C0	 	
4278	                    ]	 	
4279	                   00	 	
4280	 DF11  FC 04 [	 	 	 	DB	0FCH,0CCH,4 DUP(0C0H),0 	;0411 FC CC C0 C0 C0 C0 00
4281	                C0	 	
4282	                    ]	 	
4283	                   00	 	
4284	 DF18  00 05 [	 	 	 	DB	0,0FEH,5 DUP(6CH),0	 	;0418 00 FE 6C 6C 6C 6C 6C 00
4285	                6C	 	
4286	                    ]	 	
4287	                   00	 	
4288	 DF20  FC CC 60 30 60	 	 	DB	0FCH,0CCH,60H,30H,60H	 	;0420 FC CC 60 30 60
4289	 DF25  CC 03 [	 	 	 	DB	0CCH,0FCH,3 DUP(0),7EH	 	;0425 CC FC 00 00 00 7E
4290	                00	 	
4291	                    ]	 	
4292	                   7E	 	
4293	 DF2B     03 [	 	 	 	DB	3 DUP(0D8H),70H,0	 	;042B D8 D8 D8 70 00
4294	                D8	 	
4295	                    ]	 	
4296	                   70 00	
4297	 DF30  00 04 [	 	 	 	DB	0,4 DUP(66H),7CH	 	;0430 00 66 66 66 66 7C
4298	                66	 	
4299	                    ]	 	
4300	                   7C	 	
4301	 DF36  60 C0 00 76 DC	 	 	DB	60H,0C0H,0,76H,0DCH	 	;0436 60 C0 00 76 DC
4302	 DF3B     04 [	 	 	 	DB	4 DUP(18H),0,0FCH	 	;043B 18 18 18 18 00 FC
4303	                18	 	
4304	                    ]	 	
4305	                   00 FC	
4306	 DF41  30 02 [	 	 	 	DB	30H,78H,2 DUP(0CCH),78H 	;0441 30 78 CC CC 78
4307	                CC	 	
4308	                    ]	 	
4309	                   78	 	
4310	 DF46  30 FC 38 6C C6	 	 	DB	30H,0FCH,38H,6CH,0C6H	 	;0446 30 FC 38 6C C6
4311	 DF4B  FE C6 6C 38 00	 	 	DB	0FEH,0C6H,6CH,38H,0	 	;044B FE C6 6C 38 00
4312	 DF50  38 02 [	 	 	 	DB	38H,6CH,2 DUP(0C6H),6CH 	;0450 38 6C C6 C6 6C
4313	                C6	 	
4314	                    ]	 	
4315	                   6C	 	
4316	 DF55  6C EE 00 1C 30	 	 	DB	6CH,0EEH,0,1CH,30H	 	;0455 6C EE 00 1C 30
4317	 DF5A  18 02 [	 	 	 	DB	18H,7CH,2 DUP(0CCH),78H 	;045A 18 7C CC CC 78
4318	                CC	 	
4319	                    ]	 	
4320	                   78	 	
4321	 DF5F     03 [	 	 	 	DB	3 DUP(0),7EH,0DBH	 	;045F 00 00 00 7E DB
4322	                00	 	
4323	                    ]	 	
4324	                   7E DB	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-86
	 	 	 	 	 	 	 	09-15-88    


4325	 DF64  DB 02 [	 	 	 	DB	0DBH,7EH,2 DUP(0),6	 	;0464 DB 7E 00 00 06
4326	                00	 	
4327	                    ]	 	
4328	                   06	 	
4329	 DF69  0C 02 [	 	 	 	DB	0CH,7EH,2 DUP(0DBH),7EH 	;0469 0C 7E DB DB 7E
4330	                DB	 	
4331	                    ]	 	
4332	                   7E	 	
4333	 DF6E  60 C0 38 60 C0	 	 	DB	60H,0C0H,38H,60H,0C0H	 	;046E 60 C0 38 60 C0
4334	 DF73  F8 C0 60 38 00	 	 	DB	0F8H,0C0H,60H,38H,0	 	;0473 F8 C0 60 38 00
4335	 DF78  78 06 [	 	 	 	DB	78H,6 DUP(0CCH),0	 	;0478 78 CC CC CC CC CC CC 00
4336	                CC	 	
4337	                    ]	 	
4338	                   00	 	
4339	 DF80  00 FC 00 FC 00	 	 	DB	0,0FCH,0,0FCH,0 	 	;0480 00 FC 00 FC 00
4340	 DF85  FC 02 [	 	 	 	DB	0FCH,2 DUP(0),30H	 	;0485 FC 00 00 30
4341	                00	 	
4342	                    ]	 	
4343	                   30	 	
4344	 DF89  30 02 [	 	 	 	DB	30H,0FCH,2 DUP(30H),0	 	;0489 30 FC 30 30 00
4345	                30	 	
4346	                    ]	 	
4347	                   00	 	
4348	 DF8E  FC 00 60 30 18	 	 	DB	0FCH,0,60H,30H,18H	 	;048E FC 00 60 30 18
4349	 DF93  30 60 00 FC 00	 	 	DB	30H,60H,0,0FCH,0	 	;0493 30 60 00 FC 00
4350	 DF98  18 30 60 30 18	 	 	DB	18H,30H,60H,30H,18H	 	;0498 18 30 60 30 18
4351	 DF9D  00 FC 00 0E 1B	 	 	DB	0,0FCH,0,0EH,1BH	 	;049D 00 FC 00 0E 1B
4352	 DFA2  1B 0A [	 	 	 	DB	1BH,0AH DUP(18H),0D8H	 	;04A2 1B 18 18 18 18 18 18 18 1
	 	 	 	8 18 18 D8
4353	                18	 	
4354	                    ]	 	
4355	                   D8	 	
4356	 DFAE  D8 02 [	 	 	 	DB	0D8H,70H,2 DUP(30H),0	 	;04AE D8 70 30 30 00
4357	                30	 	
4358	                    ]	 	
4359	                   00	 	
4360	 DFB3  FC 02 [	 	 	 	DB	0FCH,0,2 DUP(30H),0	 	;04B3 FC 00 30 30 00
4361	                30	 	
4362	                    ]	 	
4363	                   00	 	
4364	 DFB8  00 76 DC 00 76	 	 	DB	0,76H,0DCH,0,76H	 	;04B8 00 76 DC 00 76
4365	 DFBD  DC 02 [	 	 	 	DB	0DCH,2 DUP(0),38H	 	;04BD DC 00 00 38
4366	                00	 	
4367	                    ]	 	
4368	                   38	 	
4369	 DFC1     02 [	 	 	 	DB	2 DUP(6CH),38H,0	 	;04C1 6C 6C 38 00
4370	                6C	 	
4371	                    ]	 	
4372	                   38 00	
4373	 DFC5     06 [	 	 	 	DB	6 DUP(0),2 DUP(18H),0	 	;04C5 00 00 00 00 00 00 18 18 0
	 	 	 	0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-87
	 	 	 	 	 	 	 	09-15-88    


4374	                00	 	
4375	                    ]	 	
4376	          02 [	 	 	
4377	                18	 	
4378	                    ]	 	
4379	                   00	 	
4380	 DFCE     06 [	 	 	 	DB	6 DUP(0),18H,0	 	 	;04CE 00 00 00 00 00 00 18 00
4381	                00	 	
4382	                    ]	 	
4383	                   18 00	
4384	 DFD6     02 [	 	 	 	DB	2 DUP(0),0FH,0CH	 	;04D6 00 00 0F 0C
4385	                00	 	
4386	                    ]	 	
4387	                   0F 0C	
4388	 DFDA     02 [	 	 	 	DB	2 DUP(0CH),0ECH,6CH	 	;04DA 0C 0C EC 6C
4389	                0C	 	
4390	                    ]	 	
4391	                   EC 6C	
4392	 DFDE  3C 04 [8	 	 	 	DB	3CH,1CH,78H,4 DUP(6CH),0	;04DE 3C 1C 78 6C 6C 6C 6C 00
4393	                6C	 	
4394	                    ]	 	
4395	                   00	 	
4396	 DFE6     02 [	 	 	 	DB	2 DUP(0),70H,18H	 	;04E6 00 00 70 18
4397	                00	 	
4398	                    ]	 	
4399	                   70 18	
4400	 DFEA  30 05 [8	 	 	 	DB	30H,60H,78H,5 DUP(0),3CH	;04EA 30 60 78 00 00 00 00 00 3
	 	 	 	C
4401	                00	 	
4402	                    ]	 	
4403	                   3C	 	
4404	 DFF3     03 [	 	 	 	DB	3 DUP(3CH),0AH DUP(0)	 	;04F3 3C 3C 3C 00 00 00 00 00 0
	 	 	 	0 00 00 00 00
4405	                3C	 	
4406	                    ]	 	
4407	          0A [	 	 	
4408	                00	 	
4409	                    ]	 	
4410	 	 	 	 	
4411	 	 	 	 	
4412	 	 	 	 	
4413	 	 	 	 	
4414	 E000	 	 	 	 	org	0e000h
4415	 	 	 	 	
4416	 E000     16 [	 	 	 	db	16h dup(?) 
4417	                ??	 	
4418	                    ]	 	
4419	 	 	 	 	
4420	 	 	 	 	
4421	 	 	 	 	;____________________
4422	 	 	 	 	;  Сброс системы - фаза 1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-88
	 	 	 	 	 	 	 	09-15-88    


4423	 	 	 	 	;____________________
4424	 	 	 	 	;_____________________
4425	 	 	 	 	;  Проверка 16К памяти
4426	 	 	 	 	;_____________________
4427	 E016  E0D9 R	 	 	c1	dw	c11	 	;адрес возврата
4428	 E018  D003 R	 	 	caw	dw	ca3
4429	 	 	 	 	
4430	 	 	 	 	
4431	 E05B	 	 	 	 	org	0e05bh
4432	 	 	 	 	
4433	 	 	 	 	
4434	 	 	 	 	;___________________
4435	 	 	 	 	;  ТЕСТ.01
4436	 	 	 	 	;	Тест процессора 8086. Осуществляет проверку регистра
4437	 	 	 	 	;	признаков, команд перехода и считывания-записи
4438	 	 	 	 	;	общих и сегментных регистров.
4439	 	 	 	 	;_____________________________________
4440	 E05B	 	 	 	reset	label	near
4441	 E05B  FA	 	 	start:	cli	 	 	; сброс признака разрешения прерывания
4442	 E05C  B4 D5	 	 	 	mov	ah,0d5h 	;уст признаки SF,CF,ZF,AF
4443	 E05E  9E	 	 	 	sahf
4444	 E05F  73 4E	 	 	 	jnc	err01	 	;CF=0,в программу ошибок
4445	 E061  75 4C	 	 	 	jnz	err01	 	;ZF=0,в программу ошибок
4446	 E063  7B 4A	 	 	 	jnp	err01	 	;PF=0,в программу ошибок
4447	 E065  79 48	 	 	 	jns	err01	 	;SF=0,в программу ошибок
4448	 E067  9F	 	 	 	lahf	 	 	;загрузить признаки в AH
4449	 E068  B1 05	 	 	 	mov	cl,5	 	;загрузить счетчик
4450	 E06A  D2 EC	 	 	 	shr	ah,cl	 	;выделить бит переноса
4451	 E06C  73 41	 	 	 	jnc	err01	 	;признак AF=0
4452	 E06E  B0 40	 	 	 	mov	al,40h	 	;уст признак переполнения
4453	 E070  D0 E0	 	 	 	shl	al,1	 	;уст для контроля
4454	 E072  71 3B	 	 	 	jno	err01	 	;признак OF не уст
4455	 E074  32 E4	 	 	 	xor	ah,ah	 	;уст AH=0
4456	 E076  9E	 	 	 	sahf	 	 	;уст в исходное состояние SF,CF,ZF,PF
4457	 E077  72 36	 	 	 	jc	err01	 	;признак CF=1
4458	 E079  74 34	 	 	 	jz	err01	 	;признак ZF=1
4459	 E07B  78 32	 	 	 	js	err01	 	;признак SF=1
4460	 E07D  7A 30	 	 	 	jp	err01	 	;признак PF=1
4461	 E07F  9F	 	 	 	lahf	 	 	;загрузить признаки в AH
4462	 E080  B1 05	 	 	 	mov	cl,5	 	;загрузить счетчик
4463	 E082  D2 EC	 	 	 	shr	ah,cl	 	;выделить бит переноса
4464	 E084  72 29	 	 	 	jc	err01	 	;признак IF=1
4465	 E086  D0 E4	 	 	 	shl	ah,1	 	;контроль, что OF сброшен
4466	 E088  70 25	 	 	 	jo	err01
4467	 E08A  B8 FFFF	 	 	 	mov	ax,0ffffh	;уст эталона в AX
4468	 E08D  F9	 	 	 	stc
4469	 E08E  8E D8	 	 	c8:	mov	ds,ax	 	;запись во все регистры
4470	 E090  8C DB	 	 	 	mov	bx,ds
4471	 E092  8E C3	 	 	 	mov	es,bx
4472	 E094  8C C1	 	 	 	mov	cx,es
4473	 E096  8E D1	 	 	 	mov	ss,cx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-89
	 	 	 	 	 	 	 	09-15-88    


4474	 E098  8C D2	 	 	 	mov	dx,ss
4475	 E09A  8B E2	 	 	 	mov	sp,dx
4476	 E09C  8B EC	 	 	 	mov	bp,sp
4477	 E09E  8B F5	 	 	 	mov	si,bp
4478	 E0A0  8B FE	 	 	 	mov	di,si
4479	 E0A2  73 07	 	 	 	jnc	c9
4480	 E0A4  33 C7	 	 	 	xor	ax,di	 	;проверка всех регистров
4481	 	 	 	 	 	 	 	 	;эталонами "FFFF", "0000"
4482	 E0A6  75 07	 	 	 	jnz	err01
4483	 E0A8  F8	 	 	 	clc
4484	 E0A9  73 E3	 	 	 	jnc	c8
4485	 E0AB	 	 	 	c9:
4486	 E0AB  0B C7	 	 	 	or	ax,di	 	;нулевым шаблоном все регистры проверены ?
4487	 E0AD  74 02	 	 	 	jz	c10	 	;ДА - переход к следующему тесту
4488	 E0AF  EB AA	 	 	err01:	jmp   short  start
4489	 	 	 	 	;_______________________
4490	 	 	 	 	; ТЕСТ.02
4491	 	 	 	 	;_______________________
4492	 E0B1	 	 	 	c10:
4493	 E0B1  B0 00	 	 	 	mov	al,0	 	;запретить прерывaния NMI
4494	 E0B3  E6 A0	 	 	 	out	0a0h,al
4495	 E0B5  E6 83	 	 	 	out	83h,al	 	;инициализация регистрa страниц ПДП
4496	 E0B7  B0 99	 	 	 	mov	al,99h	 	;уст A,C -ввод, B - вывод
4497	 E0B9  E6 63	 	 	       out	cmd_port,al	 	;запись в регистр режима
4498	 	 	 	 	 	 	 	 	 	;трехканального порта
4499	 E0BB  B0 FC	 	 	 	mov	al,0fch 	 	;блокировка контроля по четности
4500	 E0BD  E6 61	 	 	 	out	port_b,al
4501	 E0BF  2A C0	 	 	 	sub	al,al
4502	 E0C1  BA 03D8	 	 	 	mov	dx,3d8h
4503	 E0C4  EE	 	 	 	out	dx,al	 	;блокировка цветного ЭЛИ
4504	 E0C5  FE C0	 	 	 	inc	al
4505	 E0C7  BA 03B8	 	 	 	mov	dx,3b8h
4506	 E0CA  EE	 	 	 	out	dx,al	 	;блокировка черно-белого ЭЛИ
4507	 E0CB  B8 F000	 	 	 	mov	ax,cod	 	;уст сегментного регистра SS
4508	 E0CE  8E D0	 	 	 	mov	ss,ax
4509	 E0D0  BB E000	 	 	 	mov	bx,0e000h	 	;уст начального адреса памяти
4510	 E0D3  BC E016 R	 	 	mov	sp,offset c1	 	;уст адреса возврата
4511	 E0D6  EB 03 90	 	 	 	jmp	ros
4512	 E0D9  75 D4	 	 	c11:	jne	err01
4513	 	 	 	 	;------------------------
4514	 	 	 	 	;  ТЕСТ.03
4515	 	 	 	 	;   Осуществляет проверку, инициализацию и запуск ПДП и
4516	 	 	 	 	; таймера 1 для регенерации памяти
4517	 	 	 	 	;_________________________
4518	 	 	 	 	;   Блокировка контроллера ПДП
4519	 	 	 	 	
4520	 E0DB  B0 04	 	 	ros:	mov	al,04
4521	 E0DD  E6 08	 	 	 	out	dma08,al
4522	 	 	 	 	
4523	 	 	 	 	;   Проверка правильности функционирования
4524	 	 	 	 	;   таймера 1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-90
	 	 	 	 	 	 	 	09-15-88    


4525	 	 	 	 	
4526	 E0DF  B0 54	 	 	 	mov	al,54h	 	;выбор таймера 1,LSB, режим 2
4527	 E0E1  E6 43	 	 	 	out	timer+3,al
4528	 E0E3  2B C9	 	 	 	sub	cx,cx
4529	 E0E5  8A D9	 	 	 	mov	bl,cl
4530	 E0E7  8A C1	 	 	 	mov	al,cl	 	;уст начального счетчика таймера в 0
4531	 E0E9  E6 41	 	 	 	out	timer+1,al
4532	 E0EB	 	 	 	c12:
4533	 E0EB  B0 40	 	 	 	mov	al,40h
4534	 E0ED  E6 43	 	 	 	out	timer+3,al
4535	 E0EF  E4 41	 	 	 	in	al,timer+1	;считывание счетчика таймера 1
4536	 E0F1  0A D8	 	 	 	or	bl,al	 	;все биты таймера включены ?
4537	 E0F3  80 FB FF	 	 	 	cmp	bl,0ffh 	;ДА - сравнение с FF
4538	 E0F6  74 04	 	 	 	je	c13	 	;биты таймера сброшены
4539	 E0F8  E2 F1	 	 	 	loop	c12	 	;биты таймера установлены
4540	 E0FA  EB B3	 	 	 	jmp	short err01	;сбой таймера 1, останов системы
4541	 E0FC	 	 	 	c13:
4542	 E0FC  8A C3	 	 	 	mov	al,bl	 	;уст счетчика таймера 1
4543	 E0FE  2B C9	 	 	 	sub	cx,cx
4544	 E100  E6 41	 	 	 	out	timer+1,al
4545	 E102	 	 	 	c14:	 	;цикл таймера
4546	 E102  B0 40	 	 	 	mov	al,40h
4547	 E104  E6 43	 	 	 	out	timer+3,al
4548	 E106  E4 41	 	 	 	in	al,timer+1	 	;считывание счетчика таймера 1
4549	 E108  22 D8	 	 	 	and	bl,al
4550	 E10A  74 04	 	 	 	jz	c15
4551	 E10C  E2 F4	 	 	 	loop	c14	 	;цикл таймера
4552	 E10E  EB 9F	 	 	 	jmp	short err01
4553	 	 	 	 	
4554	 	 	 	 	;   Инициализация таймера 1
4555	 	 	 	 	
4556	 E110	 	 	 	c15:
4557	 E110  B0 54	 	 	 	mov	al,54h
4558	 E112  E6 43	 	 	 	out	timer+3,al	;запись в регистр режима таймера
4559	 E114  B0 07	 	 	 	mov	al,7	;уст коэффициента деления для регенерации
4560	 E116  E6 41	 	 	 	out	timer+1,al	;запись в счетчик таймера 1
4561	 E118  E6 0D	 	 	 	out	dma+0dh,al	;послать гашение ПДП
4562	 	 	 	 	
4563	 	 	 	 	;   Цикл проверки регистров ПДП
4564	 	 	 	 	
4565	 E11A  B0 FF	 	 	 	mov	al,0ffh 	;запись шаблона FF во все регистры
4566	 E11C  8A D8	 	 	c16:	mov	bl,al	 	;сохранить шаблон для сравнения
4567	 E11E  8A F8	 	 	 	mov	bh,al
4568	 E120  B9 0008	 	 	 	mov	cx,8	 	;уст цикла счетчика
4569	 E123  BA 0000	 	 	 	mov	dx,dma	 	;уст адреса регистра порта ввода/вывода
4570	 E126  EE	 	 	c17:	out	dx,al	 	;запись  шаблона в регистр
4571	 E127  EE	 	 	 	out	dx,al	 	;старшие 16 бит регистра
4572	 E128  B8 0101	 	 	 	mov	ax,0101h	;изменение AX перед считыванием
4573	 E12B  EC	 	 	 	in	al,dx
4574	 E12C  8A E0	 	 	 	mov	ah,al	 	;сохранить младшие 16 бит регистра
4575	 E12E  EC	 	 	 	in	al,dx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-91
	 	 	 	 	 	 	 	09-15-88    


4576	 E12F  3B D8	 	 	 	cmp	bx,ax	 	;считан тот же шаблон ?
4577	 E131  74 03	 	 	 	je	c18	 	;ДА - проверка следующего регистра
4578	 E133  E9 E0AF R	 	 	jmp	err01	 	;НЕТ - ошибка
4579	 E136	 	 	 	c18:	 	 	 	;выбор следующего регистра ПДП
4580	 E136  42	 	 	 	inc	dx	 	;установка адреса следующего
4581	 	 	 	 	 	 	 	 	;регистра ПДП
4582	 E137  E2 ED	 	 	 	loop	c17	 	;запись шаблона для следующего регистра
4583	 E139  F6 D0	 	 	 	not	al	 	  ;уст шаблона в 0
4584	 E13B  74 DF	 	 	 	jz	c16
4585	 	 	 	 	
4586	 	 	 	 	;   Инициализация и запуск ПДП
4587	 	 	 	 	
4588	 E13D  B0 FF	 	 	 	mov	al,0ffh 	;уст счетчика 64K для регенерации
4589	 E13F  E6 01	 	 	 	out	dma+1,al
4590	 E141  E6 01	 	 	 	out	dma+1,al
4591	 E143  B0 58	 	 	 	mov	al,058h 	;уст режим ПДП, счетчик 0, считывание
4592	 E145  E6 0B	 	 	 	out	dma+0bh,al	;запись в регистр режима ПДП
4593	 E147  B0 00	 	 	 	mov	al,0	 	;доступность контроллера ПДП
4594	 E149  E6 08	 	 	 	out	dma+8,al	;уст регистр команд ПДП
4595	 E14B  E6 0A	 	 	 	out	dma+10,al	;доступность канала 0 для регенерации
4596	 E14D  B0 41	 	 	 	mov	al,41h	 	;уст режим дла канала 1
4597	 E14F  E6 0B	 	 	 	out	dma+0bh,al
4598	 E151  B0 42	 	 	 	mov	al,42h	 	;уст режим для канала 2
4599	 E153  E6 0B	 	 	 	out	dma+0bh,al
4600	 E155  B0 43	 	 	 	mov	al,43h	 	;уст режим для канала 3
4601	 E157  E6 0B	 	 	 	out	dma+0bh,al
4602	 	 	 	 	;____________________
4603	 	 	 	 	;   ТЕСТ.04
4604	 	 	 	 	;
4605	 	 	 	 	;   Осуществляет считывание-запись эталонов в 16К байт ОЗУ,
4606	 	 	 	 	; тестирование клавиатуры, установку стека, вектора NMI
4607	 	 	 	 	; и вектора режима печати экрана ЭЛИ
4608	 	 	 	 	;___________________
4609	 	 	 	 	;   Определение об'ема памяти
4610	 	 	 	 	;   и заполнение памяти данными
4611	 	 	 	 	
4612	 E159  E9 CFB2 R	 	 	jmp	ca0
4613	 	 	 	 	
4614	 	 	 	 	;____________________
4615	 	 	 	 	;   Инициализация контроллера
4616	 	 	 	 	;   прерываний 8259
4617	 	 	 	 	;____________________
4618	 E15C	 	 	 	c21:
4619	 E15C  B0 13	 	 	 	mov	al,13h	 	;ICW1 - EDGE, SNGL, ICW4
4620	 E15E  E6 20	 	 	 	out	inta00,al
4621	 E160  B0 08	 	 	 	mov	al,8	 	;УСТ ICW2 - прерывание типа 8(8-F)
4622	 E162  E6 21	 	 	 	out	inta01,al
4623	 E164  B0 09	 	 	 	mov	al,9	 	;уст ICW4 - BUFFERD , режим 8086
4624	 E166  E6 21	 	 	 	out	inta01,al
4625	 	 	 	 	
4626	 	 	 	 	;   Установка сегмента стека и SP
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-92
	 	 	 	 	 	 	 	09-15-88    


4627	 	 	 	 	
4628	 E168	 	 	 	c25:
4629	 E168  B8 0030	 	 	 	mov	ax,sta	 	;получить величину стека
4630	 E16B  8E D0	 	 	 	mov	ss,ax	 	;уст стек
4631	 E16D  BC 0100 R	 	 	mov	sp,offset tos	;стек готов
4632	 	 	 	 	
4633	 	 	 	 	;   Установка указателя вектора прерывания NMI
4634	 	 	 	 	
4635	 E170  26: C7 06 0008 R E240 R	 	mov	es:nmi_ptr,offset nmi_int
4636	 E177  26: C7 06 000A R F000	 	mov	es:nmi_ptr+2,cod
4637	 E17E  EB 32	 	 	 	jmp	short tst6	;переход к следующему тесту
4638	 	 	 	 	
4639	 E180	 	 	 	ros_checksum proc  near
4640	 E180  B9 2000	 	 	 	mov	cx,8192 	;число байт для сложения
4641	 E183  32 C0	 	 	 	xor	al,al
4642	 E185  2E: 02 07	 	c26:	add	al,cs:[bx]
4643	 E188  43	 	 	 	inc	bx	 	;указание следующего байта
4644	 E189  E2 FA	 	 	 	loop	c26	 	;сложить все байты в модуле ROS
4645	 E18B  0A C0	 	 	 	or	al,al	 	;сумма = 0 ?
4646	 E18D  C3	 	 	 	ret
4647	 E18E	 	 	 	ros_checksum endp
4648	 	 	 	 	;______________________
4649	 	 	 	 	;   Начальный тест надежности
4650	 	 	 	 	;______________________
4651	 	 	 	 	 	assume	cs:code,es:abs0
4652	 	 	 	 	
4653	 E18E  20 C1 B1 BE B9 20	d1	db	' СБОЙ  ПАРИТЕТА ПАМЯТИ'
4654	       20 BF B0 C0 B8 C2	
4655	       B5 C2 B0 20 BF B0	
4656	       BC CF C2 B8	 	
4657	 = 0016	 	 	 	d1l	equ	22
4658	 E1A4  70 61 72 69 74 79	d2	db	'parity check 1'
4659	       20 63 68 65 63 6B	
4660	       20 31	 	 	
4661	 = 000E	 	 	 	d2l	equ	0eh
4662	 	 	 	 	;______________________
4663	 	 	 	 	;   ТЕСТ.06
4664	 	 	 	 	;	 Тест контроллера прерываний
4665	 	 	 	 	;	 8259
4666	 	 	 	 	;_______________________
4667	 E1B2	 	 	 	tst6:
4668	 E1B2  2B C0	 	 	 	sub	ax,ax	 	;уст регистра ES
4669	 E1B4  8E C0	 	 	 	mov	es,ax
4670	 	 	 	 	
4671	 	 	 	 	;-----уст вектора прерываний 5
4672	 	 	 	 	
4673	 E1B6  26: C7 06 0014 R FF54 R	 	mov	es:int5_ptr,offset print_screen   ; печать экрана
4674	 E1BD  26: C7 06 0016 R F000	 	mov	es:int5_ptr+2,cod
4675	 	 	 	 	
4676	 	 	 	 	;   Проверка регистра масок прерываний (IMR)
4677	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-93
	 	 	 	 	 	 	 	09-15-88    


4678	 E1C4  FA	 	 	 	cli	 	 	;сброс признака разрешения прерываний
4679	 E1C5  B0 00	 	 	 	mov	al,0	 	;уст IMR в 0
4680	 E1C7  E6 21	 	 	 	out	inta01,al
4681	 E1C9  E4 21	 	 	 	in	al,inta01	;считывание IMR
4682	 E1CB  0A C0	 	 	 	or	al,al	 	;IMR=0 ?
4683	 E1CD  75 2B	 	 	 	jnz	d6	 	;IMR не 0,в программу ошибок
4684	 E1CF  B0 FF	 	 	 	mov	al,0ffh 	;недоступность прерываний
4685	 E1D1  E6 21	 	 	 	out	inta01,al	;запись в IMR
4686	 E1D3  E4 21	 	 	 	in	al,inta01	;считывание IMR
4687	 E1D5  04 01	 	 	 	add	al,1	 	;все биты IMR установлены ?
4688	 E1D7  75 21	 	 	 	jnz	d6	 	;НЕТ - в программу ошибок
4689	 	 	 	 	
4690	 	 	 	 	;   Контроль ожидания прерывания
4691	 	 	 	 	
4692	 E1D9  FC	 	 	 	cld	 	 	; уст признак направления
4693	 E1DA  B9 0008	 	 	 	mov	cx,8
4694	 E1DD  BF 0020 R	 	 	mov	di,offset int_ptr	; уст адресацию таблицы
4695	 E1E0	 	 	 	d3:
4696	 E1E0  B8 E233 R	 	 	mov	ax,offset d11	; установить адрес процедуры прерываний
4697	 E1E3  AB	 	 	 	stosw
4698	 E1E4  B8 F000	 	 	 	mov	ax,cod	; получить адрес сегмента процедуры
4699	 E1E7  AB	 	 	 	stosw
4700	 E1E8  83 C3 04	 	 	 	add	bx,4	;уст BX для указания следующего значения
4701	 E1EB  E2 F3	 	 	 	loop	d3
4702	 	 	 	 	
4703	 	 	 	 	;   Прерывания размаскированы
4704	 	 	 	 	
4705	 E1ED  32 E4	 	 	 	xor	ah,ah	 	;очистить регистр AH
4706	 E1EF  FB	 	 	 	sti	 	 	; установка признака разрешения прерывания
4707	 E1F0  2B C9	 	 	 	sub	cx,cx	 	; ожидание 1 сек любого прерывания,
4708	 E1F2  E2 FE	 	 	d4:	loop	d4	 	; которое может произойти
4709	 E1F4  E2 FE	 	 	d5:	loop	d5
4710	 E1F6  0A E4	 	 	 	or	ah,ah	 	; прерывание возникло ?
4711	 E1F8  74 08	 	 	 	jz	d7	 	; нет - к следующему тесту
4712	 E1FA  BA 0101	 	 	d6:	mov	dx,101h 	; уст длительности звукового сигнала
4713	 E1FD  E8 E5A0 R	 	 	call	err_beep	; идти в программу звукового сигнала
4714	 E200  FA	 	 	 	cli
4715	 E201  F4	 	 	 	hlt	 	 	; останов системы
4716	 	 	 	 	;__________________
4717	 	 	 	 	;   ТЕСТ.07
4718	 	 	 	 	;	 Проверка таймера 8253
4719	 	 	 	 	;___________________
4720	 E202	 	 	 	d7:
4721	 E202  B4 00	 	 	 	mov	ah,0	 	; сброс признака прерывания таймера
4722	 E204  32 ED	 	 	 	xor	ch,ch	 	; очистить регистр CH
4723	 E206  B0 FE	 	 	 	mov	al,0feh   ; маскировать все прерывания, кроме LVL 0
4724	 E208  E6 21	 	 	 	out	inta01,al	; запись IMR
4725	 E20A  B0 10	 	 	 	mov	al,00010000b	; выбрать TIM 0, LSD, режим 0, BINARY
4726	 E20C  E6 43	 	 	 	out	tim_ctl,al  ;записать регистр режима управления таймера
4727	 E20E  B1 16	 	 	 	mov	cl,16h	 	; уст счетчик программного цикла
4728	 E210  8A C1	 	 	 	mov	al,cl	 	; установить счетчик таймера 0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-94
	 	 	 	 	 	 	 	09-15-88    


4729	 E212  E6 40	 	 	 	out	timero,al	; записать счетчик таймера 0
4730	 E214  F6 C4 FF	 	 	d8:	test	ah,0ffh 	; прерывание таймера 0 произошло ?
4731	 E217  75 04	 	 	 	jnz	d9	 	; да - таймер считал медленно
4732	 E219  E2 F9	 	 	 	loop	d8	 	; ожидание прерывания определенное время
4733	 E21B  EB DD	 	 	 	jmp	short d6   ;прерывание таймера 0 не произошло - ошибка
4734	 E21D  B1 12	 	 	d9:	mov	cl,18	 	; уст счетчик программного цикла
4735	 E21F  B0 FF	 	 	 	mov	al,0ffh 	; записать счетчик таймера 0
4736	 E221  E6 40	 	 	 	out	timero,al
4737	 E223  B4 00	 	 	 	mov	ah,0	 	; сброс признака,полученного прерывания
4738	 E225  B0 FE	 	 	 	mov	al,0feh 	; недоступность прерываний таймера 0
4739	 E227  E6 21	 	 	 	out	inta01,al
4740	 E229  F6 C4 FF	 	 	d10:	test	ah,0ffh 	; прерывание таймера 0 произошло ?
4741	 E22C  75 CC	 	 	 	jnz	d6	 	; да - таймер считает быстро
4742	 E22E  E2 F9	 	 	 	loop	d10	 	; ожидание прерывания определенное время
4743	 E230  EB 3F 90	 	 	 	jmp	tst8	 	; переход к следующему тесту
4744	 	 	 	 	;____________________
4745	 	 	 	 	;   Программа обслуживания
4746	 	 	 	 	;   временного прерывания
4747	 	 	 	 	;____________________
4748	 E233	 	 	 	d11	proc	near
4749	 E233  B4 01	 	 	 	mov	ah,1
4750	 E235  50	 	 	 	push	ax	 	; хранить регистр AX
4751	 E236  B0 FF	 	 	 	mov	al,0ffh 	; размаскировать все прерывания
4752	 E238  E6 21	 	 	 	out	inta01,al
4753	 E23A  B0 20	 	 	 	mov	al,eoi
4754	 E23C  E6 20	 	 	 	out	inta00,al
4755	 E23E  58	 	 	 	pop	ax	 	; восстановить регистр AX
4756	 E23F  CF	 	 	 	iret
4757	 E240	 	 	 	d11	endp
4758	 	 	 	 	
4759	 E240	 	 	 	nmi_int proc	near
4760	 E240  50	 	 	 	push	ax	 	; хранить регистр AX
4761	 E241  E4 62	 	 	 	in	al,port_c
4762	 E243  A8 40	 	 	 	test	al,40h	 	; ошибка паритета при вводе/выводе ?
4763	 E245  74 08	 	 	 	jz	d12	 	; да - признак сбрасывается в 0
4764	 E247  BE E18E R	 	 	mov	si,offset d1	; адрес поля сообщения об ошибке
4765	 E24A  B9 0016	 	 	 	mov	cx,d1l	 	; длина поля сообщения об ошибке
4766	 E24D  EB 0A	 	 	 	jmp	short d13	; отобразить ошибку на дисплее
4767	 E24F	 	 	 	d12:
4768	 E24F  A8 80	 	 	 	test	al,80h
4769	 E251  74 10	 	 	 	jz	d14
4770	 E253  BE E1A4 R	 	 	mov	si,offset d2	; адрес поля сообщения об ошибке
4771	 E256  B9 000E	 	 	 	mov	cx,d2l	 	; длина поля сообщения об ошибке
4772	 E259	 	 	 	d13:
4773	 E259  B8 0000	 	 	 	mov	ax,0	 	; инициировать и установить режим ЭЛИ
4774	 E25C  CD 10	 	 	 	int	10h	 	; вызвать процедуру VIDEO_IO
4775	 E25E  E8 E615 R	 	 	call	p_msg	 	; распечатать ошибку
4776	 E261  FA	 	 	 	cli
4777	 E262  F4	 	 	 	hlt	 	 	; останов системы
4778	 E263	 	 	 	d14:
4779	 E263  58	 	 	 	pop	ax	 	; восстановить AX
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-95
	 	 	 	 	 	 	 	09-15-88    


4780	 E264  CF	 	 	 	iret
4781	 E265	 	 	 	nmi_int endp
4782	 	 	 	 	;____________________
4783	 	 	 	 	;   Начальный тест надежности
4784	 	 	 	 	;____________________
4785	 	 	 	 	 	assume	cs:code,ds:data
4786	 	 	 	 	
4787	 E265  20 32 30 31	 	e1	db	' 201'
4788	 = 0004	 	 	 	e1l	equ	04h
4789	 E269  20 28 30 29	 	e1n	db	' (0)'
4790	 E26D  20 28 31 29	 	 	db	' (1)'
4791	 = 0004	 	 	 	e1nl	equ	4
4792	 	 	 	 	
4793	 	 	 	 	;   Выполнение программы БСУВВ,
4794	 	 	 	 	;   генерирующей вектора прерываний
4795	 	 	 	 	
4796	 E271	 	 	 	tst8:
4797	 E271  FC	 	 	 	cld	 	 	; установить признак направления вперед
4798	 E272  BF 0040 R	 	 	mov	di,offset video_int   ; уст адреса области прерываний
4799	 E275  0E	 	 	 	push	cs
4800	 E276  1F	 	 	 	pop	ds	 	; уст адреса таблицы векторов
4801	 E277  BE FF13 R	 	 	mov	si,offset vector_table+20h  ; смещение VECTOR_TABLE+32
4802	 E27A  B9 0020	 	 	 	mov	cx,20h
4803	 E27D  F3/ A5	 	 	 	rep	movsw	 	; передать таблицу векторов в память
4804	 	 	 	 	
4805	 	 	 	 	;   Установка таймера 0 в режим 3
4806	 	 	 	 	
4807	 E27F  B0 FF	 	 	 	mov	al,0ffh
4808	 E281  E6 21	 	 	 	out	inta01,al
4809	 E283  B0 36	 	 	 	mov	al,36h	 	; выбор счетчика 0,считывания-за-
4810	 	 	 	 	; писи младшего,затем старшего байта счетчика,уст режима 3
4811	 E285  E6 43	 	 	 	out	timer+3,al	; запись режима таймера
4812	 E287  B0 C7	 	 	 	mov	al,0c7h
4813	 E289  E6 40	 	 	 	out	timer,al	; записать младшую часть счетчика
4814	 E28B  B0 DB	 	 	 	mov	al,0dbh
4815	 E28D  E6 40	 	 	 	out	timer,al	; записать старшую часть счетчика
4816	 	 	 	 	
4817	 	 	 	 	
4818	 	 	 	 	 	assume	ds:data
4819	 E28F  B8 0040	 	 	 	mov	ax,dat	 	; DS - сегмент данных
4820	 E292  8E D8	 	 	 	mov	ds,ax
4821	 E294	 	 	 	e3:
4822	 E294  81 3E 0072 R 1234	 	cmp	reset_flag,1234h
4823	 E29A  74 03	 	 	 	jz	e3a
4824	 E29C  E8 F866 R	 	 	call	bct	;загрузка знакогенератора Ч/Б ЭЛИ
4825	 	 	 	 	;_____________________
4826	 	 	 	 	;   ТЕСТ.08
4827	 	 	 	 	;	 Инициализация и запуск
4828	 	 	 	 	;	 контроллера ЭЛИ
4829	 	 	 	 	;______________________
4830	 E29F  E4 60	 	 	e3a:	in	al,port_a	; считывание состояния переключателей
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-96
	 	 	 	 	 	 	 	09-15-88    


4831	 E2A1  B4 00	 	 	 	mov	ah,0
4832	 E2A3  A3 0010 R	 	 	mov	equip_flag,ax	; запомнить считанное состояние пере-
4833	 	 	 	 	 	 	 	 	; ключателей
4834	 E2A6  24 30	 	 	 	and	al,30h	 	; выделить переключатели ЭЛИ
4835	 E2A8  75 03	 	 	 	jnz	e7	 	; переключатели ЭЛИ установлены в 0 ?
4836	 E2AA  E9 E345 R	 	 	jmp	e19	 	; пропустить тест ЭЛИ
4837	 E2AD	 	 	 	e7:
4838	 E2AD  86 E0	 	 	 	xchg	ah,al
4839	 E2AF  80 FC 30	 	 	 	cmp	ah,30h	 	; адаптер ч/б ?
4840	 E2B2  74 09	 	 	 	je	e8	 	; да - установить режим для ч/б адаптера
4841	 E2B4  FE C0	 	 	 	inc	al	 ; уст цветной режим для цветного адаптера
4842	 E2B6  80 FC 20	 	 	 	cmp	ah,20h	 	; режим 80х25 установлен ?
4843	 E2B9  75 02	 	 	 	jne	e8	 	; нет - уст режим для 40х25
4844	 E2BB  B0 03	 	 	 	mov	al,3	 	; установить режим 80х25
4845	 E2BD	 	 	 	e8:
4846	 E2BD  50	 	 	 	push	ax	 	; хранить режим ЭЛИ в стеке
4847	 E2BE  2A E4	 	 	 	sub	ah,ah	 	;
4848	 E2C0  CD 10	 	 	 	int	10h
4849	 E2C2  58	 	 	 	pop	ax
4850	 E2C3  50	 	 	 	push	ax
4851	 E2C4  BB B000	 	 	 	mov	bx,0b000h
4852	 E2C7  BA 03B8	 	 	 	mov	dx,3b8h 	; регистр режима для ч/б
4853	 E2CA  B9 0800	 	 	 	mov	cx,2048 	; счетчик байт для ч/б адаптера
4854	 E2CD  B0 01	 	 	 	mov	al,1	 	; уст режим для ч/б адаптера
4855	 E2CF  80 FC 30	 	 	 	cmp	ah,30h	 	; ч/б адаптер ЭЛИ подключен ?
4856	 E2D2  74 0B	 	 	 	je	e9	 	; переход к проверке буфера ЭЛИ
4857	 E2D4  BB B800	 	 	 	mov	bx,0b800h
4858	 E2D7  BA 03D8	 	 	 	mov	dx,3d8h 	; регистр режима для цветного адаптера
4859	 E2DA  B9 2000	 	 	 	mov	cx,2000h
4860	 E2DD  FE C8	 	 	 	dec	al	 	; уст режим в 0 для цветного адаптера
4861	 	 	 	 	;
4862	 	 	 	 	;	Проверка буфера ЭЛИ
4863	 	 	 	 	;
4864	 E2DF	 	 	 	e9:
4865	 E2DF  EE	 	 	 	out	dx,al	 	; блокировка ЭЛИ для цветного адаптера
4866	 E2E0  8E C3	 	 	 	mov	es,bx
4867	 E2E2  B8 0040	 	 	 	mov	ax,dat	 	; DS - сегмент данных
4868	 E2E5  8E D8	 	 	 	mov	ds,ax
4869	 E2E7  81 3E 0072 R 1234	 	cmp	reset_flag,1234h
4870	 E2ED  74 0D	 	 	 	je	e10
4871	 E2EF  8E DB	 	 	 	mov	ds,bx	 	;
4872	 E2F1  E8 D460 R	 	 	call	stgtst_cnt	; переход к проверке памяти
4873	 E2F4  74 06	 	 	 	je	e10
4874	 E2F6  BA 0102	 	 	 	mov	dx,102h
4875	 E2F9  E8 E5A0 R	 	 	call	err_beep
4876	 	 	 	 	
4877	 	 	 	 	;___________________________
4878	 	 	 	 	;
4879	 	 	 	 	;   ТЕСТ.09
4880	 	 	 	 	;	 Осуществляет проверку формирования строк в буфере ЭЛИ
4881	 	 	 	 	;_________________________
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-97
	 	 	 	 	 	 	 	09-15-88    


4882	 E2FC	 	 	 	e10:
4883	 E2FC  58	 	 	 	pop	ax   ; получить считанные переключатели ЭЛИ в AH
4884	 E2FD  50	 	 	 	push	ax	 	; сохранить их
4885	 E2FE  B4 00	 	 	 	mov	ah,0
4886	 E300  CD 10	 	 	 	int	10h
4887	 E302  B8 7020	 	 	 	mov	ax,7020h	; запись пробелов в режиме реверса
4888	 E305  2B FF	 	 	 	sub	di,di	 	; установка начала области
4889	 E307  B9 0028	 	 	 	mov	cx,40	 	;
4890	 E30A  FC	 	 	 	cld	    ; установить признак направления для уменьшения
4891	 E30B  F3/ AB	 	 	 	rep	stosw	 	; записать в память
4892	 	 	 	 	;______________________
4893	 	 	 	 	;    ТЕСТ.10
4894	 	 	 	 	;	  Осуществляет проверку линий интерфейса ЭЛИ
4895	 	 	 	 	;______________________
4896	 E30D  58	 	 	 	pop	ax	 	; получить считанные переключатели
4897	 E30E  50	 	 	 	push	ax	 	; сохранить их
4898	 E30F  80 FC 30	 	 	 	cmp	ah,30h	 	; ч/б адаптер подключен ?
4899	 E312  BA 03BA	 	 	 	mov	dx,03bah	; уст адрес порта состояния ч/б дисплея
4900	 E315  74 03	 	 	 	je	e11	 	; да - переход к следующей строке
4901	 E317  BA 03DA	 	 	 	mov	dx,03dah	; цветной адаптер подключен
4902	 	 	 	 	;
4903	 	 	 	 	;	Тест строчной развертки
4904	 	 	 	 	;
4905	 E31A	 	 	 	e11:
4906	 E31A  B4 08	 	 	 	mov	ah,8
4907	 E31C	 	 	 	e12:
4908	 E31C  2B C9	 	 	 	sub	cx,cx
4909	 E31E  EC	 	 	e13:	in	al,dx	    ;считывание порта состояния контроллера СМ607
4910	 E31F  22 C4	 	 	 	and	al,ah	 	; проверка строки
4911	 E321  75 04	 	 	 	jnz	e14
4912	 E323  E2 F9	 	 	 	loop	e13
4913	 E325  EB 13	 	 	 	jmp	short e17	; переход к сообщению об ошибке
4914	 E327  2B C9	 	 	e14:	sub	cx,cx
4915	 E329  EC	 	 	e15:	in	al,dx	  ;считывание порта состояния контроллера СМ607
4916	 E32A  22 C4	 	 	 	and	al,ah
4917	 E32C  74 04	 	 	 	jz	e16
4918	 E32E  E2 F9	 	 	 	loop	e15
4919	 E330  EB 08	 	 	 	jmp	short e17
4920	 	 	 	 	;
4921	 	 	 	 	;	Следующий строчный импульс
4922	 	 	 	 	;
4923	 E332	 	 	 	e16:
4924	 E332  B1 03	 	 	 	mov	cl,3	 	; получить следующий бит для контроля
4925	 E334  D2 EC	 	 	 	shr	ah,cl
4926	 E336  75 E4	 	 	 	jnz	e12
4927	 E338  EB 06	 	 	 	jmp	short e18	; отобразить курсор на экране
4928	 	 	 	 	;
4929	 	 	 	 	;	Сообщение об ошибке конттроллера СМ607
4930	 	 	 	 	;
4931	 E33A	 	 	 	e17:
4932	 E33A  BA 0103	 	 	 	mov	dx,103h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-98
	 	 	 	 	 	 	 	09-15-88    


4933	 E33D  E8 E5A0 R	 	 	call	err_beep
4934	 	 	 	 	;
4935	 	 	 	 	;	Отображение курсора на экране
4936	 	 	 	 	;
4937	 E340	 	 	 	e18:
4938	 E340  58	 	 	 	pop	ax	 	; получить считанные переключатели в AH
4939	 E341  B4 00	 	 	 	mov	ah,0	 	; установить режим
4940	 E343  CD 10	 	 	 	int	10h
4941	 	 	 	 	;______________________
4942	 	 	 	 	;   ТЕСТ.11
4943	 	 	 	 	;	 Дополнительный тест памяти
4944	 	 	 	 	;______________________
4945	 	 	 	 	 	assume	ds:data
4946	 E345	 	 	 	e19:
4947	 E345  B8 0040	 	 	 	mov	ax,dat
4948	 E348  8E D8	 	 	 	mov	ds,ax
4949	 E34A  81 3E 0072 R 1234	 	cmp	reset_flag,1234h
4950	 E350  74 52	 	 	 	je	e22
4951	 	 	 	 	
4952	 	 	 	 	;   Проверка любой действительной памяти
4953	 	 	 	 	;   на считывание и запись
4954	 	 	 	 	
4955	 E352  E9 D0EB R	 	 	jmp	e190
4956	 	 	 	 	
4957	 	 	 	 	;   Печать адреса и эталона, если
4958	 	 	 	 	;   произошла ошибка данных
4959	 E367	 	 	 	 	org	0e367h
4960	 	 	 	 	
4961	 	 	 	 	
4962	 E367	 	 	 	osh:
4963	 E367  8A E8	 	 	 	mov	ch,al	 	;
4964	 E369  8A C6	 	 	 	mov	al,dh	 	; получить измененный адрес
4965	 E36B  B1 04	 	 	 	mov	cl,4
4966	 E36D  D2 E8	 	 	 	shr	al,cl	 	;
4967	 E36F  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать кода
4968	 E372  8A C6	 	 	 	mov	al,dh
4969	 E374  24 0F	 	 	 	and	al,0fh
4970	 E376  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать кода
4971	 E379  8A C5	 	 	 	mov	al,ch	 	; получить следующий шаблон
4972	 E37B  B1 04	 	 	 	mov	cl,4
4973	 E37D  D2 E8	 	 	 	shr	al,cl
4974	 E37F  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать кода
4975	 E382  8A C5	 	 	 	mov	al,ch	 	;
4976	 E384  24 0F	 	 	 	and	al,0fh	 	;
4977	 E386  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать кода
4978	 E389  81 E6 0001	 	 	and	si,0001
4979	 E38D  D1 E6	 	 	 	shl	si,1
4980	 E38F  D1 E6	 	 	 	shl	si,1
4981	 E391  81 C6 E269 R	 	 	add	si,offset e1n
4982	 E395  B9 0004	 	 	 	mov	cx,e1nl
4983	 E398  E8 D399 R	 	 	call	pmsg
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-99
	 	 	 	 	 	 	 	09-15-88    


4984	 E39B  BE E265 R	 	 	mov	si,offset e1	; установить адрес поля сообщения
4985	 	 	 	 	 	 	 	 	; об ошибке
4986	 E39E  B9 0004	 	 	 	mov	cx,e1l	 	; получить счетчик поля сообщения об ошибке
4987	 E3A1  E8 E615 R	 	 	call	p_msg	 	; печать ошибки
4988	 E3A4	 	 	 	e22:
4989	 E3A4  EB 2C 90	 	 	 	jmp	tst12	 	; переход к следующему тесту
4990	 	 	 	 	
4991	 	 	 	 	;_____________________
4992	 	 	 	 	;
4993	 	 	 	 	;   Процедура вывода на экран сообщения об ошибке в коде ASCII
4994	 	 	 	 	;
4995	 	 	 	 	;_______________________
4996	 	 	 	 	
4997	 E3A7	 	 	 	xlat_print_cod proc near
4998	 E3A7  1E	 	 	 	push	ds	 	; сохранить DS
4999	 E3A8  0E	 	 	 	push	cs
5000	 E3A9  1F	 	 	 	pop	ds
5001	 E3AA  BB E3C2 R	 	 	mov	bx,offset f4e	; адрес таблицы кодов ASCII
5002	 E3AD  D7	 	 	 	xlatb
5003	 E3AE  B4 0E	 	 	 	mov	ah,14
5004	 E3B0  B7 00	 	 	 	mov	bh,0
5005	 E3B2  CD 10	 	 	 	int	10h
5006	 E3B4  1F	 	 	 	pop	ds
5007	 E3B5  C3	 	 	 	ret
5008	 E3B6	 	 	 	xlat_print_cod endp
5009	 	 	 	 	;______________________
5010	 	 	 	 	;   Сброс системы - фаза 4
5011	 	 	 	 	;______________________
5012	 	 	 	 	;
5013	 	 	 	 	;   Коды сообщений об ошибках
5014	 	 	 	 	;_______________________
5015	 	 	 	 	
5016	 	 	 	 	 	assume	cs:code,ds:data
5017	 E3B6  20 33 30 31	 	f1	db	' 301'
5018	 = 0004	 	 	 	f1l	equ	4h	 	; сообщение клавиатуры
5019	 E3BA  31 33 31	 	 	f2	db	'131'
5020	 = 0003	 	 	 	f2l	equ	3h	 	; сообщение кассеты
5021	 E3BD  36 30 31	 	 	f3	db	'601'
5022	 = 0003	 	 	 	f3l	equ	3h	 	; сообщение НГМД
5023	 	 	 	 	
5024	 E3C0	 	 	 	f4	label	word
5025	 E3C0  0378	 	 	 	dw	378h
5026	 E3C2	 	 	 	f4e	label	word
5027	 E3C2  30 31 32 33 34 35	ascii_tbl db	'0123456789abcdef'
5028	       36 37 38 39 61 62	
5029	       63 64 65 66	 	
5030	 	 	 	 	;______________________
5031	 	 	 	 	;   ТЕСТ.12
5032	 	 	 	 	;   Тест клавиатуры
5033	 	 	 	 	;______________________
5034	 E3D2	 	 	 	tst12:
�
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-100
	 	 	 	 	 	 	 	09-15-88    


5035	 E3D2  B8 0040	 	 	 	mov	ax,dat
5036	 E3D5  8E D8	 	 	 	mov	ds,ax
5037	 E3D7  E8 E5EB R	 	 	call	kbd_reset	; Сброс клавиатуры
5038	 E3DA  E3 2B	 	 	 	jcxz	f6	 	; печать ошибки, если нет прерывания
5039	 E3DC  B0 4D	 	 	 	mov	al,4dh	 	; доступность клавиатуры
5040	 E3DE  E6 61	 	 	 	out	port_b,al
5041	 E3E0  80 FB AA	 	 	 	cmp	bl,0aah 	; код сканирования 'AA' ?
5042	 E3E3  75 22	 	 	 	jne	f6	 	; нет - печать ошибки
5043	 	 	 	 	
5044	 	 	 	 	;   Поиск "залипших" клавиш
5045	 	 	 	 	
5046	 E3E5  B0 CC	 	 	 	mov	al,0cch       ; сброс клавиатуры, уст синхронизации
5047	 E3E7  E6 61	 	 	 	out	port_b,al
5048	 E3E9  B0 4C	 	 	 	mov	al,4ch	      ; доступность клавиатуры
5049	 E3EB  E6 61	 	 	 	out	port_b,al
5050	 E3ED  2B C9	 	 	 	sub	cx,cx
5051	 	 	 	 	;
5052	 	 	 	 	;	Ожидание прерывания клавиатуры
5053	 	 	 	 	;
5054	 E3EF	 	 	 	f5:
5055	 E3EF  E2 FE	 	 	 	loop	f5	 	; задержка
5056	 E3F1  E4 60	 	 	 	in	al,kbd_in	; получение кода сканирования
5057	 E3F3  3C 00	 	 	 	cmp	al,0	 	; код сканирования равен 0 ?
5058	 E3F5  74 19	 	 	 	je	f7	 	; да - продолжение тестирования
5059	 E3F7  8A E8	 	 	 	mov	ch,al	 	; сохранить код сканирования
5060	 E3F9  B1 04	 	 	 	mov	cl,4
5061	 E3FB  D2 E8	 	 	 	shr	al,cl
5062	 E3FD  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать
5063	 E400  8A C5	 	 	 	mov	al,ch	 	; восстановить код сканирования
5064	 E402  24 0F	 	 	 	and	al,0fh	 	; выделить младший байт
5065	 E404  E8 E3A7 R	 	 	call	xlat_print_cod	; преобразование и печать
5066	 E407  BE E3B6 R	 	f6:	mov	si,offset f1	; получить адрес поля сообщения об
5067	 	 	 	 	 	 	 	 	; ошибке
5068	 E40A  B9 0004	 	 	 	mov	cx,f1l	 	 ; длина поля сообщения об ошибке
5069	 E40D  E8 E615 R	 	 	call	p_msg	 	 ; вывод сообщения об ошибке на экран
5070	 	 	 	 	
5071	 	 	 	 	;   Установка таблицы векторов прерываний
5072	 	 	 	 	
5073	 E410	 	 	 	f7:
5074	 E410  2B C0	 	 	 	sub	ax,ax
5075	 E412  8E C0	 	 	 	mov	es,ax
5076	 E414  B9 0030	 	 	 	mov	cx,24*2 	; получить счетчик векторов
5077	 E417  0E	 	 	 	push	cs
5078	 E418  1F	 	 	 	pop	ds
5079	 E419  BE FEF3 R	 	 	mov	si,offset vector_table	 ; адрес таблицы векторов
5080	 E41C  BF 0020 R	 	 	mov	di,offset int_ptr
5081	 E41F  FC	 	 	 	cld
5082	 E420  F3/ A5	 	 	 	rep	movsw
5083	 E422  26: F6 06 0410 R 08	 	test	eq_fl,08h
5084	 E428  74 53	 	 	 	jz	alzo
5085	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-101
	 	 	 	 	 	 	 	09-15-88    


5086	 	 	 	 	
5087	 E42A  E8 C003 R	 	 	call	disk_setup
5088	 	 	 	 	
5089	 	 	 	 	;
5090	 	 	 	 	;   Проверка памяти от C8000 до F6000 по 2К
5091	 	 	 	 	;
5092	 	 	 	 	
5093	 E42D	 	 	 	rom_scan:
5094	 E42D  BA C800	 	 	 	mov	dx,0c800h
5095	 E430	 	 	 	rom_scan_1:
5096	 E430  8E DA	 	 	 	mov	ds,dx
5097	 E432  2B DB	 	 	 	sub	bx,bx
5098	 E434  8B 07	 	 	 	mov	ax,[bx]
5099	 E436  53	 	 	 	push	bx
5100	 E437  5B	 	 	 	pop	bx
5101	 E438  3D AA55	 	 	 	cmp	ax,0aa55h
5102	 E43B  75 06	 	 	 	jnz	next_rom
5103	 E43D  E8 C7BB R	 	 	call	rom_check
5104	 E440  EB 05 90	 	 	 	jmp	are_we_done
5105	 E443	 	 	 	next_rom:
5106	 E443  81 C2 0080	 	 	add	dx,0080h
5107	 E447	 	 	 	are_we_done:
5108	 E447  81 FA F600	 	 	cmp	dx,0f600h
5109	 E44B  7C E3	 	 	 	jl	rom_scan_1
5110	 E44D  EB 2E 90	 	 	 	jmp	alzo
5111	 	 	 	 	
5112	 E47D	 	 	 	 	org	0e47dh
5113	 	 	 	 	
5114	 	 	 	 	;______________________
5115	 	 	 	 	;   ТЕСТ.14
5116	 	 	 	 	;   Осуществляет проверку НГМД
5117	 	 	 	 	;______________________
5118	 E47D  B8 0040	 	 	alzo:	mov	ax,dat	 	; уст. регистр DS
5119	 E480  8E D8	 	 	 	mov	ds,ax
5120	 E482  B0 FC	 	 	 	mov	al,0fch  ; доступность прерываний таймера и клавиатуры
5121	 E484  E6 21	 	 	 	out	inta01,al
5122	 E486  A0 0010 R	 	 	mov	al,byte ptr equip_flag	; получить состояние переклю-
5123	 	 	 	 	 	 	 	 	 	; чателей
5124	 E489  A8 01	 	 	 	test	al,01h	 	; первоначальная загрузка с НГМД ?
5125	 E48B  75 03	 	 	 	jnz	f10	 	; да - проверка управления НГМД
5126	 E48D  E9 E59D R	 	 	jmp	f23
5127	 E490	 	 	 	f10:
5128	 E490  B0 BC	 	 	 	mov	al,0bch 	; доступность прерываний с НГМД,
5129	 E492  E6 21	 	 	 	out	inta01,al	; клавиатуры и таймера
5130	 E494  B4 00	 	 	 	mov	ah,0	 	; сброс контроллера НГМД
5131	 E496  CD 13	 	 	 	int	13h	 	; переход к сбросу НГМД
5132	 E498  F6 C4 FF	 	 	 	test	ah,0ffh 	; состояние верно ?
5133	 E49B  75 20	 	 	 	jnz	f13	 	; нет - сбой устройства
5134	 	 	 	 	
5135	 	 	 	 	;   Включить мотор устройства 0
5136	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-102
	 	 	 	 	 	 	 	09-15-88    


5137	 E49D  BA 03F2	 	 	 	mov	dx,03f2h	; получить адрес адаптера НГМД
5138	 E4A0  B0 1C	 	 	 	mov	al,1ch	 	; включить мотор
5139	 E4A2  EE	 	 	 	out	dx,al
5140	 E4A3  2B C9	 	 	 	sub	cx,cx
5141	 	 	 	 	
5142	 	 	 	 	;    Ожидание включения мотора НГМД
5143	 	 	 	 	
5144	 E4A5	 	 	 	f11:
5145	 E4A5  E2 FE	 	 	 	loop	f11
5146	 E4A7	 	 	 	f12:	 	 	 	; ожидание мотора 1
5147	 E4A7  E2 FE	 	 	 	loop	f12
5148	 E4A9  33 D2	 	 	 	xor	dx,dx
5149	 E4AB  B5 01	 	 	 	mov	ch,1	 	; выбор первой дорожки
5150	 E4AD  88 16 003E R	 	 	mov seek_status,dl
5151	 E4B1  E8 EE67 R	 	 	call	seek	 	; переход к рекалибровке НГМД
5152	 E4B4  72 07	 	 	 	jc	f13	 	; перейти в программу ошибок
5153	 E4B6  B5 22	 	 	 	mov	ch,34	 	; выбор 34 дорожки
5154	 E4B8  E8 EE67 R	 	 	call	seek
5155	 E4BB  73 09	 	 	 	jnc	f14	 	; выключить мотор
5156	 	 	 	 	
5157	 	 	 	 	;    Ошибки НГМД
5158	 	 	 	 	
5159	 E4BD	 	 	 	f13:
5160	 E4BD  BE E3BD R	 	 	mov	si,offset f3	; получить адрес поля сообщения об
5161	 	 	 	 	 	 	 	 	; ошибке
5162	 E4C0  B9 0003	 	 	 	mov	cx,f3l	 	; установить счетчик
5163	 E4C3  E8 E615 R	 	 	call	p_msg	 	; идти в программу ошибок
5164	 	 	 	 	
5165	 	 	 	 	;   Выключить мотор устройства 0
5166	 	 	 	 	
5167	 E4C6	 	 	 	f14:
5168	 E4C6  B0 0C	 	 	 	mov	al,0ch	 	; выключить мотор устройства 0
5169	 E4C8  BA 03F2	 	 	 	mov	dx,03f2h	; уст адрес порта управления НГМД
5170	 E4CB  EE	 	 	 	out	dx,al
5171	 	 	 	 	
5172	 	 	 	 	;   Установка печати и базового адреса
5173	 	 	 	 	;   адаптера стыка С2, если устройства подключены
5174	 	 	 	 	
5175	 E4CC	 	 	 	f15:
5176	 E4CC  C7 06 001A R 001E R	 	mov	buffer_head,offset kb_buffer  ; уст параметров
5177	 	 	 	 	 	 	 	 	 	      ; клавиатуры
5178	 E4D2  C7 06 001C R 001E R	 	mov	buffer_tail,offset kb_buffer
5179	 E4D8  C7 06 0082 R 003E R	 	mov	buffer_end,offset kb_buffer_end
5180	 E4DE  C7 06 0080 R 001E R	 	mov	buffer_start,offset kb_buffer
5181	 E4E4  83 FD 00	 	 	 	cmp	bp,0000h
5182	 E4E7  74 18	 	 	 	jz	dal
5183	 E4E9  BA 0003	 	 	 	mov	dx,3
5184	 E4EC  E8 E5A0 R	 	 	call	err_beep
5185	 E4EF  BE D1D1 R	 	 	mov	si,offset f39
5186	 E4F2  B9 0020	 	 	 	mov	cx,32
5187	 E4F5  E8 E615 R	 	 	call	p_msg
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-103
	 	 	 	 	 	 	 	09-15-88    


5188	 E4F8	 	 	 	err_wait:
5189	 E4F8  B4 00	 	 	 	mov	ah,0
5190	 E4FA  CD 16	 	 	 	int	16h
5191	 E4FC  80 FC 3B	 	 	 	cmp	ah,3bh
5192	 E4FF  75 F7	 	 	 	jnz	err_wait
5193	 E501  2A E4	 	 	dal:	sub	ah,ah
5194	 E503  A0 0049 R	 	 	mov	al,crt_mode
5195	 E506  CD 10	 	 	 	int	10h
5196	 E508  BD E3C0 R	 	 	mov	bp,offset f4	; таблица PRT_SRC
5197	 E50B  BE 0000	 	 	 	mov	si,0
5198	 E50E	 	 	 	f16:
5199	 E50E  2E: 8B 56 00	 	 	mov	dx,cs:[bp]	; получить базовый адрес печати
5200	 E512  B0 AA	 	 	 	mov	al,0aah 	; записать данные в порт А
5201	 E514  EE	 	 	 	out	dx,al
5202	 E515  2A C0	 	 	 	sub	al,al
5203	 E517  EC	 	 	 	in	al,dx	 	; считывание порта А
5204	 E518  3C AA	 	 	 	cmp	al,0aah 	; шаблон данных тот же
5205	 E51A  75 06	 	 	 	jne	f17	    ; нет - проверка следующего устройства печати
5206	 E51C  89 94 0008 R	 	 	mov	word ptr printer_base[si],dx  ;да-уст базовый адрес
5207	 E520  46	 	 	 	inc	si	 	; вычисление следующего слова
5208	 E521  46	 	 	 	inc	si
5209	 E522	 	 	 	f17:
5210	 E522  45	 	 	 	inc	bp	 	; указать следующий базовый адрес
5211	 E523  45	 	 	 	inc	bp
5212	 E524  81 FD E3C2 R	 	 	cmp	bp,offset f4e	; все возможные адреса проверены ?
5213	 E528  75 E4	 	 	 	jne	f16	 	; нет, к проверке следующего адреса печати
5214	 E52A  BB 0000	 	 	 	mov	bx,0
5215	 E52D  BA 03FF	 	 	 	mov	dx,3ffh 	; проверка подключения адаптера 1 стыка С2
5216	 E530  B0 8A	 	 	 	mov	al,8ah
5217	 E532  EE	 	 	 	out	dx,al
5218	 E533  BA 02FF	 	 	 	mov	dx,2ffh
5219	 E536  EE	 	 	 	out	dx,al
5220	 E537  BA 03FC	 	 	 	mov	dx,3fch
5221	 E53A  B0 AA	 	 	 	mov	al,0aah
5222	 E53C  EE	 	 	 	out	dx,al
5223	 E53D  42	 	 	 	inc	dx
5224	 E53E  EC	 	 	 	in	al,dx
5225	 E53F  3C AA	 	 	 	cmp	al,0aah
5226	 E541  75 08	 	 	 	jnz	f18
5227	 E543  C7 87 0000 R 03F8	 	mov  word ptr rs232_base[bx],3f8h  ; уст адрес адаптера 1
5228	 E549  43	 	 	 	inc	bx
5229	 E54A  43	 	 	 	inc	bx
5230	 E54B  BA 02FC	 	 	f18:	mov	dx,2fch 	; проверка подключения адаптера 2 стыка С2
5231	 E54E  B0 AA	 	 	 	mov	al,0aah
5232	 E550  EE	 	 	 	out	dx,al
5233	 E551  42	 	 	 	inc	dx
5234	 E552  EC	 	 	 	in	al,dx
5235	 E553  3C AA	 	 	 	cmp	al,0aah
5236	 E555  75 08	 	 	 	jnz	f19
5237	 E557  C7 87 0000 R 02F8	 	mov  word ptr rs232_base[bx],2f8h   ; уст адрес адаптера 2
5238	 E55D  43	 	 	 	inc	bx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-104
	 	 	 	 	 	 	 	09-15-88    


5239	 E55E  43	 	 	 	inc	bx
5240	 	 	 	 	
5241	 	 	 	 	
5242	 	 	 	 	
5243	 	 	 	 	;_____Установка EQUIP_FLAG для инди-
5244	 	 	 	 	;     кации номера печати
5245	 	 	 	 	
5246	 E55F	 	 	 	f19:
5247	 	 	 	 	
5248	 E55F  42	 	 	 	inc	dx	 	;
5249	 E560  B0 08	 	 	 	mov	al,8	 	; сброс низкого уровня IRQ3
5250	 E562  EE	 	 	 	OUT	DX,AL
5251	 E563  BA 03FE	 	 	 	mov	dx,3feh
5252	 E566  EE	 	 	 	out	dx,al	 	;сброс низкого уровня IRQ4
5253	 E567  B0 A4	 	 	 	mov	al,0a4h
5254	 E569  E6 21	 	 	 	out	21h,al	 	; разрешить прерывания адаптера С2
5255	 	 	 	 	
5256	 E56B  8B C6	 	 	 	mov	ax,si
5257	 E56D  B1 03	 	 	 	mov	cl,3
5258	 E56F  D2 C8	 	 	 	ror	al,cl
5259	 E571  0A C3	 	 	 	or	al,bl
5260	 E573  A2 0011 R	 	 	mov	byte ptr equip_flag+1,al
5261	 E576  BA 0201	 	 	 	mov	dx,201h
5262	 E579  EC	 	 	 	in	al,dx
5263	 E57A  A8 0F	 	 	 	test	al,0fh
5264	 E57C  75 05	 	 	 	jnz	f20	 	 	   ; проверка адаптера игр
5265	 E57E  80 0E 0011 R 10	 	 	or	byte ptr equip_flag+1,16
5266	 E583	 	 	 	f20:
5267	 	 	 	 	
5268	 	 	 	 	;   Разрешить прерывания NMI,закрыть маски адаптера стыка С2
5269	 	 	 	 	
5270	 E583  B0 BC	 	 	 	mov	al,0bch
5271	 E585  E6 21	 	 	 	out	21h,al
5272	 	 	 	 	
5273	 	 	 	 	
5274	 E587  E4 61	 	 	 	in	al,port_b
5275	 E589  0C 30	 	 	 	or	al,30h
5276	 E58B  E6 61	 	 	 	out	port_b,al	; сброс ошибки паритета
5277	 E58D  24 CF	 	 	 	and	al,0cfh
5278	 E58F  E6 61	 	 	 	out	port_b,al
5279	 E591  B0 80	 	 	 	mov	al,80h	 	; разрешение прерываний NMI
5280	 E593  E6 A0	 	 	 	out	0a0h,al
5281	 E595  BA 0001	 	 	 	mov	dx,1
5282	 E598  E8 E5A0 R	 	 	call	err_beep	; переход к подпрограмме звукового сигнала
5283	 E59B	 	 	 	f21:
5284	 E59B  CD 19	 	 	 	int	19h	 	; переход к программе первоначальной загрузки
5285	 E59D	 	 	 	f23:
5286	 E59D  E9 E4CC R	 	 	jmp	f15
5287	 	 	 	 	
5288	 	 	 	 	;    Установка длительности звукового сигнала
5289	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-105
	 	 	 	 	 	 	 	09-15-88    


5290	 	 	 	 	 	assume	cs:code,ds:data
5291	 E5A0	 	 	 	err_beep proc	near
5292	 E5A0  9C	 	 	 	pushf	 	 	; сохранить признаки
5293	 E5A1  FA	 	 	 	cli	 	 	; сброс признака разрешения прерывания
5294	 E5A2  1E	 	 	 	push	ds	 	; сохранить DS
5295	 E5A3  B8 0040	 	 	 	mov	ax,dat	 	; DS - сегмент данных
5296	 E5A6  8E D8	 	 	 	mov	ds,ax
5297	 E5A8  0A F6	 	 	 	or	dh,dh
5298	 E5AA  74 0B	 	 	 	jz	g3
5299	 E5AC	 	 	 	g1:	 	 	 	 ; длинный звуковой сигнал
5300	 E5AC  B3 06	 	 	 	mov	bl,6	 	 ; счетчик для звуковых сигналов
5301	 E5AE  E8 E5C9 R	 	 	call	beep	 	 ; выполнить звуковой сигнал
5302	 E5B1  E2 FE	 	 	g2:	loop	g2	 	 ; задержка между звуковыми сигналами
5303	 E5B3  FE CE	 	 	 	dec	dh
5304	 E5B5  75 F5	 	 	 	jnz	g1
5305	 E5B7	 	 	 	g3:	 	 	 	 ; короткий звуковой сигнал
5306	 E5B7  B3 01	 	 	 	mov	bl,1   ; счетчик для короткого звукового сигнала
5307	 E5B9  E8 E5C9 R	 	 	call	beep	 	; выполнить звуковой сигнал
5308	 E5BC  E2 FE	 	 	g4:	loop	g4	 	; задержка между звуковыми сигналами
5309	 E5BE  FE CA	 	 	 	dec	dl	 	;
5310	 E5C0  75 F5	 	 	 	jnz	g3	 	; выполнить
5311	 E5C2  E2 FE	 	 	g5:	loop	g5	 	; длинная задержка перед возвратом
5312	 E5C4  E2 FE	 	 	g6:	loop	g6
5313	 E5C6  1F	 	 	 	pop	ds	 	; восстановление DS
5314	 E5C7  9D	 	 	 	popf	 	   ; восстановление первоначальных признаков
5315	 E5C8  C3	 	 	 	ret	 	 	; возврат к программе
5316	 E5C9	 	 	 	err_beep	endp
5317	 	 	 	 	
5318	 	 	 	 	;   Подпрограмма звукового сигнала
5319	 	 	 	 	
5320	 E5C9	 	 	 	beep	proc	near
5321	 E5C9  B0 B6	 	 	 	mov	al,10110110b	; таймер 2,младший и старший счет-
5322	 	 	 	 	 	 	 	 	; чики, двоичный счет
5323	 E5CB  E6 43	 	 	 	out	timer+3,al	; записать в регистр режима
5324	 E5CD  B8 045E	 	 	 	mov	ax,45eh 	; делитель
5325	 E5D0  E6 42	 	 	 	out	timer+2,al	; записать младший счетчик
5326	 E5D2  8A C4	 	 	 	mov	al,ah
5327	 E5D4  E6 42	 	 	 	out	timer+2,al	; записать старший счетчик
5328	 E5D6  E4 61	 	 	 	in	al,port_b	; получить текущее состояние порта
5329	 E5D8  8A E0	 	 	 	mov	ah,al	 	; сохранить это состояние
5330	 E5DA  0C 03	 	 	 	or	al,03	 	; включить звук
5331	 E5DC  E6 61	 	 	 	out	port_b,al
5332	 E5DE  2B C9	 	 	 	sub	cx,cx	 	; установить счетчик ожидания
5333	 E5E0  E2 FE	 	 	g7:	loop	g7	 	; задержка перед выключением
5334	 E5E2  FE CB	 	 	 	dec	bl	 	; задержка счетчика закончена ?
5335	 E5E4  75 FA	 	 	 	jnz	g7	; нет - продолжение подачи звукового сигнала
5336	 E5E6  8A C4	 	 	 	mov	al,ah	 	; восстановить значение порта
5337	 E5E8  E6 61	 	 	 	out	port_b,al
5338	 E5EA  C3	 	 	 	ret	 	 	; возврат к программе
5339	 E5EB	 	 	 	beep	endp
5340	 	 	 	 	;_____________________
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-106
	 	 	 	 	 	 	 	09-15-88    


5341	 	 	 	 	;   Эта процедура вызывает программный
5342	 	 	 	 	;   сброс клавиатуры
5343	 	 	 	 	;_____________________
5344	 E5EB	 	 	 	kbd_reset proc	near
5345	 E5EB  B0 0C	 	 	 	mov	al,0ch	   ; установить низкий уровень синхронизации
5346	 E5ED  E6 61	 	 	 	out	port_b,al	; записать порт B
5347	 E5EF  B9 7530	 	 	 	mov	cx,30000	; время длительности низкого уровня
5348	 E5F2  E2 FE	 	 	g8:	loop	g8
5349	 E5F4  B0 CC	 	 	 	mov	al,0cch 	; уст CLK
5350	 E5F6  E6 61	 	 	 	out	port_b,al
5351	 E5F8	 	 	 	sp_test:
5352	 E5F8  B0 4C	 	 	 	mov	al,4ch	 	; уст высокий уровень синхронизации
5353	 E5FA  E6 61	 	 	 	out	port_b,al
5354	 E5FC  B0 FD	 	 	 	mov	al,0fdh 	; разрешить прерывания клавиатуры
5355	 E5FE  E6 21	 	 	 	out	inta01,al	; записать регистр масок
5356	 E600  FB	 	 	 	sti	 	 	; уст признака разрешения прерывания
5357	 E601  B4 00	 	 	 	mov	ah,0
5358	 E603  2B C9	 	 	 	sub	cx,cx	 	; уст счетчика ожидания прерываний
5359	 E605  F6 C4 FF	 	 	g9:	test	ah,0ffh 	; прерывание клавиатуры возникло ?
5360	 E608  75 02	 	 	 	jnz	g10   ;  да - считывание возвращенного кода сканирования
5361	 E60A  E2 F9	 	 	 	loop	g9	 	; нет - цикл ожидания
5362	 E60C  E4 60	 	 	g10:	in	al,port_a   ; считать код сканирования клавиатуры
5363	 E60E  8A D8	 	 	 	mov	bl,al	 	; сохранить этот код
5364	 E610  B0 CC	 	 	 	mov	al,0cch 	; очистка клавиатуры
5365	 E612  E6 61	 	 	 	out	port_b,al
5366	 E614  C3	 	 	 	ret	 	 	; возврат к программе
5367	 E615	 	 	 	kbd_reset	endp
5368	 	 	 	 	;_____________________
5369	 	 	 	 	;   Эта программа выводит на экран дисплея
5370	 	 	 	 	;   сообщения об ошибках
5371	 	 	 	 	;
5372	 	 	 	 	;     Необходимые условия:
5373	 	 	 	 	;   SI = адрес поля сообщения об ошибке
5374	 	 	 	 	;   CX = длина поля сообщения об ошибке
5375	 	 	 	 	;   Максимальный размер передаваемой
5376	 	 	 	 	;   информации - 36 знаков
5377	 	 	 	 	;
5378	 	 	 	 	;______________________
5379	 E615	 	 	 	p_msg	proc	near
5380	 E615  B8 0040	 	 	 	mov	ax,dat
5381	 E618  8E D8	 	 	 	mov	ds,ax
5382	 E61A  8B EE	 	 	 	mov	bp,si
5383	 E61C	 	 	 	g12:
5384	 E61C  2E: 8A 04	 	 	mov	al,cs:[si]	; поместить знак в AL
5385	 E61F  46	 	 	 	inc	si	 	; указать следующий знак
5386	 E620  B7 00	 	 	 	mov	bh,0	 	; установить страницу
5387	 E622  B4 0E	 	 	 	mov	ah,14	 	; уст функцию записи знака
5388	 E624  CD 10	 	 	 	int	10h	 	; и записать знак
5389	 E626  E2 F4	 	 	 	loop	g12	; продолжать до записи всего сообщения
5390	 E628  B8 0E0D	 	 	 	mov	ax,0e0dh   ; переместить курсор в начало строки
5391	 E62B  CD 10	 	 	 	int	10h
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-107
	 	 	 	 	 	 	 	09-15-88    


5392	 E62D  B8 0E0A	 	 	 	mov	ax,0e0ah  ; переместить курсор на следующую строку
5393	 E630  CD 10	 	 	 	int	10h
5394	 E632  C3	 	 	 	ret
5395	 E633	 	 	 	p_msg	endp
5396	 	 	 	 	
5397	 	 	 	 	;   Таблица кодов русских больших букв (заглавных)
5398	 	 	 	 	
5399	 E633	 	 	 	rust2	label	byte
5400	 E633  1B 21 40 23 24 25	 	db	1bh,'!@#$',37,05eh,'&*()_+'
5401	       5E 26 2A 28 29 5F	
5402	       2B	 	 	
5403	 E640  08 00	 	 	 	db	08h,0
5404	 E642  B9 C6 C3 BA B5 BD	 	db	0b9h,0c6h,0c3h,0bah,0b5h,0bdh,0b3h,0c8h
5405	       B3 C8	 	 	
5406	 E64A  C9 B7 B6 CD 0D FF	 	db	0c9h,0b7h,0b6h,0cdh,0dh,-1,0c4h,0cbh
5407	       C4 CB	 	 	
5408	 E652  B2 B0 BF C0 BE BB	 	db	0b2h,0b0h,0bfh,0c0h,0beh,0bbh,0b4h,27h
5409	       B4 27	 	 	
5410	 E65A  22 B1 CE 7C CF C7	 	db	'"',0b1h,0ceh,7ch,0cfh,0c7h,0c1h,0bch,0b8h
5411	       C1 BC B8	 	 	
5412	 E663  C2 CC 3C 3E 3F C5	 	db	0c2h,0cch,'<>?',0c5h,000,-1,' ',0cah
5413	       00 FF 20 CA	 	
5414	 	 	 	 	
5415	 	 	 	 	
5416	 	 	 	 	
5417	 	 	 	 	;___int 19_____________
5418	 	 	 	 	;   Программа загрузки системы с НГМД
5419	 	 	 	 	;
5420	 	 	 	 	; Программа считывает содержимое дорожки 0 сектора 1 в
5421	 	 	 	 	; ячейку boot_locn (адрес 7C00,сегмент 0)
5422	 	 	 	 	;   Если НГМД отсутствует или произошла аппаратная ошибка,
5423	 	 	 	 	; устанавливается прерывание типа INT 18H, которое вызывает
5424	 	 	 	 	; выполнение программ тестирования и инициализации
5425	 	 	 	 	; системы
5426	 	 	 	 	;
5427	 	 	 	 	;_________________________
5428	 	 	 	 	 	assume	cs:code,ds:data
5429	 E66D	 	 	 	boot_strap proc near
5430	 	 	 	 	
5431	 E66D  FB	 	 	 	sti	 	      ; установить признак разрешения прерывания
5432	 E66E  B8 0040	 	 	 	mov	ax,dat	      ; установить адресацию
5433	 E671  8E D8	 	 	 	mov	ds,ax
5434	 E673  A1 0010 R	 	 	mov	ax,equip_flag ; получить состояние переключателей
5435	 E676  A8 01	 	 	 	test	al,1	      ; опрос первоначальной загрузки
5436	 E678  74 23	 	 	 	jz	h3
5437	 	 	 	 	
5438	 	 	 	 	;   Система загружается с НГМД
5439	 	 	 	 	;   CX содержит счетчик повторений
5440	 	 	 	 	
5441	 E67A  B9 0004	 	 	 	mov	cx,4	 	; установить счетчик повторений
5442	 E67D	 	 	 	h1:	 	 	 	; первоначальная загрузка
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-108
	 	 	 	 	 	 	 	09-15-88    


5443	 E67D  51	 	 	 	push	cx	 	; сохранить счетчик повторений
5444	 E67E  B4 00	 	 	 	mov	ah,0	 	; сброс НГМД
5445	 E680  CD 13	 	 	 	int	13h
5446	 E682  72 14	 	 	 	jc	h2	 	; если ошибка,повторить
5447	 E684  B4 02	 	 	 	mov	ah,2	 	; считать сектор 1
5448	 E686  BB 0000	 	 	 	mov	bx,0	 	;
5449	 E689  8E C3	 	 	 	mov	es,bx
5450	 E68B  BB 7C00 R	 	 	mov	bx,offset boot_locn
5451	 E68E  BA 0000	 	 	 	mov	dx,0	 	;
5452	 E691  B9 0001	 	 	 	mov	cx,1	 	; сектор 1 , дорожка 0
5453	 E694  B0 01	 	 	 	mov	al,1	 	; считывание первого сектора
5454	 E696  CD 13	 	 	 	int	13h
5455	 E698  59	 	 	h2:	pop	cx	 	; восстановить счетчик повторений
5456	 E699  73 05	 	 	 	jnc	h4	 	; уст CF при безуспешном считывании
5457	 E69B  E2 E0	 	 	 	loop	h1	 	; цикл повторения
5458	 	 	 	 	
5459	 	 	 	 	;   Загрузка с НГМД недоступна
5460	 	 	 	 	
5461	 E69D	 	 	 	h3:	 	 	 	; кассета
5462	 E69D  E9 E0AF R	 	 	jmp	err01	; отсутствует дискет загрузки
5463	 	 	 	 	
5464	 	 	 	 	;   Загрузка завершилась успешно
5465	 	 	 	 	
5466	 E6A0	 	 	 	h4:
5467	 E6A0  EA 00 7C 00 00	 	 	db	0eah,00h,7ch,00h,00h
5468	 E6A5	 	 	 	boot_strap	endp
5469	 	 	 	 	;--------------------
5470	 	 	 	 	;   Эта программа посылает байт в контроллер адаптера НГМД
5471	 	 	 	 	; после проверки корректности управления и готовности
5472	 	 	 	 	; контроллера.
5473	 	 	 	 	;   Программа ожидает байт состояния определенное время
5474	 	 	 	 	; и проверяет готовность НГМД к работе.
5475	 	 	 	 	;
5476	 	 	 	 	;   ВВОД   (AH) - выводимый байт
5477	 	 	 	 	;
5478	 	 	 	 	;   ВЫВОД  CY=0 - успешно,
5479	 	 	 	 	;	   CY=1 - не успешно.Состояние
5480	 	 	 	 	;	   НГМД анализируется.
5481	 	 	 	 	;-----------------------
5482	 E6A5	 	 	 	nec_output proc near
5483	 E6A5  52	 	 	 	push	dx	 	; сохранить регистры
5484	 E6A6  51	 	 	 	push	cx
5485	 E6A7  BA 03F4	 	 	 	mov	dx,03f4h	; состояние порта
5486	 E6AA  33 C9	 	 	 	xor	cx,cx	 	; счетчик времени вывода
5487	 E6AC	 	 	 	j23:
5488	 E6AC  EC	 	 	 	in	al,dx	 	; получить состояние
5489	 E6AD  A8 40	 	 	 	test	al,040h 	; проверка управляющих бит
5490	 E6AF  74 0C	 	 	 	jz	j25	 	; биты управления нормальные
5491	 E6B1  E2 F9	 	 	 	loop	j23
5492	 E6B3	 	 	 	j24:
5493	 E6B3  80 0E 0041 R 80	 	 	or	diskette_status,time_out
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-109
	 	 	 	 	 	 	 	09-15-88    


5494	 E6B8  59	 	 	 	pop	cx
5495	 E6B9  5A	 	 	 	pop	dx	; установить код ошибки и восстановить регистры
5496	 E6BA  58	 	 	 	pop	ax	 	; адрес возврата
5497	 E6BB  F9	 	 	 	stc	 	 	;
5498	 E6BC  C3	 	 	 	ret
5499	 	 	 	 	
5500	 E6BD	 	 	 	j25:
5501	 E6BD  33 C9	 	 	 	xor	cx,cx	 	; обнуление счетчика
5502	 E6BF	 	 	 	j26:
5503	 E6BF  EC	 	 	 	in	al,dx	 	; получить состояние
5504	 E6C0  A8 80	 	 	 	test	al,080h 	; проверка готовности
5505	 E6C2  75 04	 	 	 	jnz	j27	 	; да - идти на выход
5506	 E6C4  E2 F9	 	 	 	loop	j26	 	; повторить
5507	 E6C6  EB EB	 	 	 	jmp	short j24	; ошибка состояния
5508	 E6C8	 	 	 	j27:	 	 	 	; выход
5509	 E6C8  8A C4	 	 	 	mov	al,ah	 	; получить байт
5510	 E6CA  BA 03F5	 	 	 	mov	dx,03f5h	; переслать байт данных в порт
5511	 E6CD  EE	 	 	 	out	dx,al
5512	 E6CE  59	 	 	 	pop	cx	 	; восстановить регистры
5513	 E6CF  5A	 	 	 	pop	dx
5514	 E6D0  C3	 	 	 	ret	 	 	;
5515	 E6D1	 	 	 	nec_output	endp
5516	 	 	 	 	
5517	 	 	 	 	;___int 16_________________
5518	 	 	 	 	;
5519	 	 	 	 	;   Программа поддержки клавиатуры
5520	 	 	 	 	;
5521	 	 	 	 	;   Эта программа считывает в регистр
5522	 	 	 	 	; AX код сканирования клавиши и код
5523	 	 	 	 	; ASCII из буфера клавиатуры.
5524	 	 	 	 	;
5525	 	 	 	 	;   Программа выполняет три функции, код
5526	 	 	 	 	; которых задается в регистре AH:
5527	 	 	 	 	;
5528	 	 	 	 	;    AH=0 - считать следующий символ
5529	 	 	 	 	;	     из буфера.При выходе код
5530	 	 	 	 	;	     сканирования в AH,код
5531	 	 	 	 	;	     ASCII в AL.
5532	 	 	 	 	;   AH=1 - установить ZF, если код
5533	 	 	 	 	;	     ASCII прочитан:
5534	 	 	 	 	;
5535	 	 	 	 	;	     ZF=0 - буфер заполнен,
5536	 	 	 	 	;	     ZF=1 - буфер пустой.
5537	 	 	 	 	;   При выходе в AX помещен адрес вершины буфера клавиатуры.
5538	 	 	 	 	;   AH=2 - возврат текущего состояния в регистр AL
5539	 	 	 	 	;	      из постоянно распределенной области памяти с
5540	 	 	 	 	;	   адресом 00417H.
5541	 	 	 	 	;
5542	 	 	 	 	;   При выполнении программ клавиатуры используются флажки,
5543	 	 	 	 	; которые устанавливаются в постоянно распределенной области
5544	 	 	 	 	; памяти по адресам 00417H и 00418H и имеют значение:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-110
	 	 	 	 	 	 	 	09-15-88    


5545	 	 	 	 	;   00417H
5546	 	 	 	 	;	  0 - правое переключение регистра;
5547	 	 	 	 	;	  1 - левое переключение регистра;
5548	 	 	 	 	;	     2 - УПР;
5549	 	 	 	 	;	  3 - ДОП;
5550	 	 	 	 	;	  4 - ФСД;
5551	 	 	 	 	;	  5 - ЦИФ;
5552	 	 	 	 	;	  6 - ФПБ;
5553	 	 	 	 	;	  7 - ВСТ;
5554	 	 	 	 	;   00418H
5555	 	 	 	 	;	  0 - состояние клавиши ЛАТ между нажатием и отжатием;
5556	 	 	 	 	;	  1 - ЛАТ;
5557	 	 	 	 	;	  2 - Р/Л;
5558	 	 	 	 	;	  3 - пауза;
5559	 	 	 	 	;	  4 - ФСД;
5560	 	 	 	 	;	  5 - ЦИФ;
5561	 	 	 	 	;	  6 - ФПБ;
5562	 	 	 	 	;	  7 - ВСТ.
5563	 	 	 	 	;
5564	 	 	 	 	;   Флажки, соответствующие разрядам 4-7 постоянно распределенной
5565	 	 	 	 	; области памяти с адресом 00417H, устанавливаются по нажатию
5566	 	 	 	 	; клавиш ВСТ, ФПБ, ЦИФ, ФСД и сохраняют свои значения до сле-
5567	 	 	 	 	; дующего нажатия соответствующей клавиши.
5568	 	 	 	 	; Одноименные флажки, соответствующие разрядам 4-7 постоянно
5569	 	 	 	 	; распределенной области памяти с адресом 00418H, и флажки
5570	 	 	 	 	; ДОП, УПР, левое переключение регистра, правое переключение
5571	 	 	 	 	; регистра, Р/Л устанавливаются по нажатию клавиш и сбрасываются
5572	 	 	 	 	; по отжатию.
5573	 	 	 	 	;
5574	 	 	 	 	;------------------------------
5575	 	 	 	 	 	assume	cs:code,ds:data
5576	 	 	 	 	
5577	 	 	 	 	
5578	 E6D1	 	 	 	k4	proc	near
5579	 E6D1  83 C3 02	 	 	 	add	bx,2
5580	 E6D4  3B 1E 0082 R	 	 	cmp  bx,buffer_end	 	 ; конец буфера ?
5581	 E6D8  75 04	 	 	 	jne	k5	 	 	 ; нет - продолжить
5582	 E6DA  8B 1E 0080 R	 	 	mov	bx,buffer_start 	 ; да - уст начала буфера
5583	 E6DE	 	 	 	k5:
5584	 E6DE  C3	 	 	 	ret
5585	 E6DF	 	 	 	k4	endp
5586	 	 	 	 	
5587	 E6DF	 	 	 	error_beep proc near
5588	 E6DF  50	 	 	 	push	ax
5589	 E6E0  53	 	 	 	push	bx
5590	 E6E1  51	 	 	 	push	cx
5591	 E6E2  BB 00C0	 	 	 	mov	bx,0c0h
5592	 E6E5  E4 61	 	 	 	in	al,kb_ctl
5593	 E6E7  50	 	 	 	push	ax
5594	 E6E8	 	 	 	k65:
5595	 E6E8  24 FC	 	 	 	and	al,0fch
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-111
	 	 	 	 	 	 	 	09-15-88    


5596	 E6EA  E6 61	 	 	 	out	kb_ctl,al
5597	 E6EC  B9 0048	 	 	 	mov	cx,48h
5598	 E6EF  E2 FE	 	 	k66:	loop	k66
5599	 E6F1  0C 02	 	 	 	or	al,2
5600	 E6F3  E6 61	 	 	 	out	kb_ctl,al
5601	 E6F5  B9 0048	 	 	 	mov	cx,48h
5602	 E6F8  E2 FE	 	 	k67:	loop	k67
5603	 E6FA  4B	 	 	 	dec	bx
5604	 E6FB  75 EB	 	 	 	jnz	k65
5605	 E6FD  58	 	 	 	pop	ax
5606	 E6FE  E6 61	 	 	 	out	kb_ctl,al
5607	 E700  59	 	 	 	pop	cx
5608	 E701  5B	 	 	 	pop	bx
5609	 E702  58	 	 	 	pop	ax
5610	 E703  C3	 	 	 	ret
5611	 E704	 	 	 	error_beep	endp
5612	 	 	 	 	
5613	 	 	 	 	;---
5614	 	 	 	 	
5615	 E704	 	 	 	k54:
5616	 E704  3C 3B	 	 	 	cmp	al,59
5617	 E706  72 05	 	 	 	jb	k55
5618	 E708  B0 00	 	 	 	mov	al,0
5619	 E70A  EB 0F 90	 	 	 	jmp	 k57
5620	 	 	 	 	
5621	 E70D  BB E8DC R	 	k55:	mov	bx,offset k10
5622	 E710  F6 06 0018 R 02	 	 	test	kb_flag_1,lat
5623	 E715  74 57	 	 	 	jz	k99
5624	 	 	 	 	
5625	 	 	 	 	;---
5626	 	 	 	 	
5627	 E717	 	 	 	k56:
5628	 E717  FE C8	 	 	 	dec	al
5629	 E719  2E: D7	 	 	 	xlat	cs:k11
5630	 	 	 	 	
5631	 	 	 	 	;---
5632	 	 	 	 	
5633	 E71B	 	 	 	k57:
5634	 E71B  3C FF	 	 	 	cmp	al,-1
5635	 E71D  74 2A	 	 	 	je	k59
5636	 E71F  80 FC FF	 	 	 	cmp	ah,-1
5637	 E722  74 25	 	 	 	je	k59
5638	 	 	 	 	;---
5639	 	 	 	 	
5640	 E724	 	 	 	k58:
5641	 E724  F6 06 0017 R 40	 	 	test	kb_flag,caps_state
5642	 E729  74 2B	 	 	 	jz	k61
5643	 	 	 	 	
5644	 	 	 	 	;---
5645	 E72B  F6 06 0018 R 02	 	 	test	kb_flag_1,lat
5646	 E730  75 03	 	 	 	jnz	k88
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-112
	 	 	 	 	 	 	 	09-15-88    


5647	 E732  E9 F905 R	 	 	jmp	k89
5648	 E735	 	 	 	k88:
5649	 E735  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
5650	 E73A  74 10	 	 	 	jz	k60
5651	 	 	 	 	
5652	 	 	 	 	;----------
5653	 	 	 	 	
5654	 E73C  3C 41	 	 	 	cmp	al,'A'
5655	 E73E  72 16	 	 	 	jb	k61
5656	 E740  3C 5A	 	 	 	cmp	al,'Z'
5657	 E742  77 12	 	 	 	ja	k61
5658	 E744  04 20	 	 	 	add	al,'a'-'A'
5659	 E746  EB 0E 90	 	 	 	jmp	 k61
5660	 	 	 	 	
5661	 E749	 	 	 	k59:
5662	 E749  E9 EAEB R	 	 	jmp	k26
5663	 	 	 	 	
5664	 	 	 	 	
5665	 E74C	 	 	 	k60:
5666	 E74C  3C 61	 	 	 	cmp	al,'a'
5667	 E74E  72 06	 	 	 	jb	k61
5668	 E750  3C 7A	 	 	 	cmp	al,'z'
5669	 E752  77 02	 	 	 	ja	k61
5670	 E754  2C 20	 	 	 	sub	al,'a'-'A'
5671	 	 	 	 	
5672	 E756	 	 	 	k61:
5673	 E756  8B 1E 001C R	 	 	mov	bx,buffer_tail
5674	 E75A  8B F3	 	 	 	mov	si,bx
5675	 E75C  E8 E6D1 R	 	 	call   k4
5676	 E75F  3B 1E 001A R	 	 	cmp	bx,buffer_head
5677	 E763  74 0E	 	 	 	je	k62
5678	 E765  89 04	 	 	 	mov	word ptr [si],ax
5679	 E767  89 1E 001C R	 	 	mov	buffer_tail,bx
5680	 E76B  E9 EAEB R	 	 	jmp	k26
5681	 E76E  BB F8A7 R	 	k99:	mov	bx,offset rust
5682	 E771  EB A4	 	 	 	jmp k56
5683	 	 	 	 	
5684	 	 	 	 	;---
5685	 	 	 	 	
5686	 E773	 	 	 	k62:
5687	 E773  E8 E6DF R	 	 	call	error_beep
5688	 E776  E9 EAEB R	 	 	jmp	k26
5689	 	 	 	 	
5690	 	 	 	 	;---
5691	 	 	 	 	
5692	 E779	 	 	 	k63:
5693	 E779  2C 3B	 	 	 	sub	al,59
5694	 E77B	 	 	 	k64:
5695	 E77B  2E: D7	 	 	 	xlat	cs:k9
5696	 E77D  8A E0	 	 	 	mov	ah,al
5697	 E77F  B0 00	 	 	 	mov	al,0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-113
	 	 	 	 	 	 	 	09-15-88    


5698	 E781  EB 98	 	 	 	jmp	 k57
5699	 	 	 	 	
5700	 	 	 	 	
5701	 	 	 	 	;---
5702	 E82E	 	 	 	 	org	0e82eh
5703	 E82E	 	 	 	keyboard_io proc	far
5704	 E82E  FB	 	 	 	sti	 	 	;
5705	 E82F  1E	 	 	 	push	ds
5706	 E830  53	 	 	 	push	bx
5707	 E831  BB 0040	 	 	 	mov	bx,dat
5708	 E834  8E DB	 	 	 	mov	ds,bx	 	; установить сегмент данных
5709	 E836  0A E4	 	 	 	or	ah,ah	 	; AH=0
5710	 E838  74 0B	 	 	 	jz	k1	     ; переход к считыванию следующего символа
5711	 E83A  FE CC	 	 	 	dec	ah	 	; AH=1
5712	 E83C  74 20	 	 	 	jz	k2	     ; переход к считыванию кода ASCII
5713	 E83E  FE CC	 	 	 	dec	ah	 	     ; AH=2
5714	 E840  74 2D	 	 	 	jz	k3	     ; переход к получению байта состояния
5715	 E842  5B	 	 	 	pop	bx	 	     ; восстановить регистр
5716	 E843  1F	 	 	 	pop	ds
5717	 E844  CF	 	 	 	iret
5718	 	 	 	 	
5719	 	 	 	 	;   Считывание кода сканирования и кода ASCII из буфера клавиатуры
5720	 	 	 	 	;
5721	 E845	 	 	 	k1:
5722	 E845  FB	 	 	 	sti	 	; уст признака разрешения прерывания
5723	 E846  90	 	 	 	nop	 	 	; задержка
5724	 E847  FA	 	 	 	cli	 	; сброс признака разрешения прерывания
5725	 E848  8B 1E 001A R	 	 	mov	bx,buffer_head	; уст вершину буфера по чтению
5726	 E84C  3B 1E 001C R	 	 	cmp	bx,buffer_tail	; сравнить с вершиной буфера по записи
5727	 E850  74 F3	 	 	 	jz	k1
5728	 E852  8B 07	 	 	 	mov	ax,word ptr [bx] ; получить код сканирования и код ASCII
5729	 E854  E8 E6D1 R	 	 	call	k4
5730	 E857  89 1E 001A R	 	 	mov	buffer_head,bx	; запомнить вершину буфера по чтению
5731	 E85B  5B	 	 	 	pop	bx	 	; восстановить регистр
5732	 E85C  1F	 	 	 	pop	ds	 	; восстановить сегмент
5733	 E85D  CF	 	 	 	iret	 	 	; возврат к программе
5734	 	 	 	 	
5735	 	 	 	 	;   Считать код ASCII
5736	 	 	 	 	
5737	 E85E	 	 	 	k2:
5738	 E85E  FA	 	 	 	cli	 	; Сброс признака разрешения прерывания
5739	 E85F  8B 1E 001A R	 	 	mov	bx,buffer_head	; получить указатель вершины буфера
5740	 	 	 	 	 	 	 	 	; по чтению
5741	 E863  3B 1E 001C R	 	 	cmp	bx,buffer_tail	; сравнить с вершиной буфера по записи
5742	 E867  8B 07	 	 	 	mov	ax,word ptr [bx]
5743	 E869  FB	 	 	 	sti	 	 	; уст признак разрешения прерывания
5744	 E86A  5B	 	 	 	pop	bx	 	; восстановить регистр
5745	 E86B  1F	 	 	 	pop	ds	 	; восстановить сегмент
5746	 E86C  CA 0002	 	 	 	ret	2
5747	 	 	 	 	
5748	 	 	 	 	;   Получение младшего байта состояния (флажков)
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-114
	 	 	 	 	 	 	 	09-15-88    


5749	 	 	 	 	
5750	 E86F	 	 	 	k3:
5751	 E86F  A0 0017 R	 	 	mov	al,kb_flag	; получить младший байт состояния     на
5752	 E872  5B	 	 	 	pop	bx	 	; восстановить регистр
5753	 E873  1F	 	 	 	pop	ds	 	; восстановить сегмент
5754	 E874  CF	 	 	 	iret	 	 	; возврат к программе
5755	 E875	 	 	 	keyboard_io	endp
5756	 	 	 	 	
5757	 	 	 	 	;   Таблица кодов сканирования управляющих клавиш
5758	 	 	 	 	
5759	 E875	 	 	 	k6	label	byte
5760	 E875  52	 	 	 	db	ins_key
5761	 E876  56 45 46 38 1D	 	 	db	caps_key,num_key,scroll_key,alt_key,ctl_key
5762	 E87B  54 55	 	 	 	db	left_key,right_key
5763	 E87D  58	 	 	 	db	inv_key_l
5764	 E87E  5A 57 5B	 	 	 	db	inv_key_r,lat_key,rus_key
5765	 = 000C	 	 	 	k6l	equ	0ch
5766	 	 	 	 	
5767	 	 	 	 	;   Таблица масок нажатых управляющих клавиш
5768	 	 	 	 	
5769	 E881	 	 	 	k7	label	byte
5770	 E881  80	 	 	 	db	ins_shift
5771	 E882  40 20 10 08 04	 	 	db	caps_shift,num_shift,scroll_shift,alt_shift,ctl_shift
5772	 E887  02 01	 	 	 	db	left_shift,right_shift
5773	 	 	 	 	
5774	 	 	 	 	
5775	 	 	 	 	;   Таблица кодов сканирования при нажатой клавише УПР для
5776	 	 	 	 	; кодов сканирования клавиш меньше 59
5777	 	 	 	 	
5778	 E889  1B FF 00 FF FF FF	k8	db	27,-1,0,-1,-1,-1,30,-1
5779	       1E FF	 	 	
5780	 E891  FF FF FF 1F FF 7F	 	db	-1,-1,-1,31,-1,127,-1,17
5781	       FF 11	 	 	
5782	 E899  17 05 12 14 19 15	 	db	23,5,18,20,25,21,9,15
5783	       09 0F	 	 	
5784	 E8A1  10 1B 1D 0A FF 01	 	db	16,27,29,10,-1,1,19
5785	       13	 	 	
5786	 E8A8  04 06 07 08 0A 0B	 	db	4,6,7,8,10,11,12,-1,-1
5787	       0C FF FF	 	 	
5788	 E8B1  FF FF 1C 1A 18 03	 	db	-1,-1,28,26,24,3,22,2
5789	       16 02	 	 	
5790	 E8B9  0E 0D FF FF FF FF	 	db	14,13,-1,-1,-1,-1,-1,-1
5791	       FF FF	 	 	
5792	 E8C1  20 FF	 	 	 	db	' ',-1
5793	 	 	 	 	
5794	 	 	 	 	;   Таблица кодов сканирования при нажатой клавише УПР для
5795	 	 	 	 	; кодов сканирования клавиш больше 59
5796	 E8C3	 	 	 	k9	label	byte
5797	 E8C3  5E 5F 60 61 62 63	 	db	94,95,96,97,98,99,100,101
5798	       64 65	 	 	
5799	 E8CB  66 67 FF FF 77 FF	 	db	102,103,-1,-1,119,-1,132,-1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-115
	 	 	 	 	 	 	 	09-15-88    


5800	       84 FF	 	 	
5801	 E8D3  73 FF 74 FF 75 FF	 	db	115,-1,116,-1,117,-1,118,-1
5802	       76 FF	 	 	
5803	 E8DB  FF	 	 	 	db	-1
5804	 	 	 	 	
5805	 	 	 	 	;   Таблица кодов ASCII нижнего регистра клавиатуры
5806	 	 	 	 	
5807	 E8DC	 	 	 	k10	label	byte
5808	 E8DC  1B 31 32 33 34 35	 	db	27,'1234567890-='
5809	       36 37 38 39 30 2D	
5810	       3D	 	 	
5811	 E8E9  08 09	 	 	 	db	08h,09h
5812	 E8EB  71 77 65 72 74 79	 	db	'qwertyuiop[]',0dh,-1,'asdfghjkl;:',60h,7eh
5813	       75 69 6F 70 5B 5D	
5814	       0D FF 61 73 64 66	
5815	       67 68 6A 6B 6C 3B	
5816	       3A 60 7E	 	 	
5817	 E906  5C 7A 78 63 76 62	 	db	05ch,'zxcvbnm',',./{'
5818	       6E 6D 2C 2E 2F 7B	
5819	 E912  2A FF 20 7D	 	 	db	'*',-1,' }'
5820	 	 	 	 	
5821	 	 	 	 	;   Таблица кодов ASCII верхнего регистра клавиатуры
5822	 	 	 	 	
5823	 E916	 	 	 	k11	label	byte
5824	 E916  1B 21 40 23 24 25	 	db	27,'!@#$',37,05eh,'&*()_+'
5825	       5E 26 2A 28 29 5F	
5826	       2B	 	 	
5827	 E923  08 00	 	 	 	db	08h,0
5828	 E925  51 57 45 52 54 59	 	db	'QWERTYUIOP',-1,-1,0dh,-1
5829	       55 49 4F 50 FF FF	
5830	       0D FF	 	 	
5831	 E933  41 53 44 46 47 48	 	db	'ASDFGHJKL'
5832	       4A 4B 4C	 	 	
5833	 E93C  27 22 FF FF 7C	 	 	db	027h,'"',-1,-1,7ch
5834	 E941  5A 58 43 56 42 4E	 	db	'ZXCVBNM'
5835	       4D	 	 	
5836	 E948  3C 3E 3F FF 00 FF	 	db	'<>?',-1,0,-1,' ',-1
5837	       20 FF	 	 	
5838	 	 	 	 	
5839	 	 	 	 	;   Таблица кодов сканирования клавиш Ф11 - Ф20 (на верхнем
5840	 	 	 	 	; регистре Ф1 - Ф10)
5841	 	 	 	 	
5842	 E950	 	 	 	k12	label	byte
5843	 E950  54 55 56 57 58 59	 	db	84,85,86,87,88,89,90
5844	       5A	 	 	
5845	 E957  5B 5C 5D	 	 	 	db	91,92,93
5846	 	 	 	 	
5847	 	 	 	 	;   Таблица кодов сканирования одновременно нажатых клавиш
5848	 	 	 	 	; ДОП и Ф1 - Ф10
5849	 	 	 	 	
5850	 E95A	 	 	 	k13	label byte
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-116
	 	 	 	 	 	 	 	09-15-88    


5851	 E95A  68 69 6A 6B 6C	 	 	db	104,105,106,107,108
5852	 E95F  6D 6E 6F 70 71	 	 	db	109,110,111,112,113
5853	 	 	 	 	
5854	 	 	 	 	;   Таблица кодов правого пятнадцатиклавишного поля на верхнем
5855	 	 	 	 	; регистре
5856	 	 	 	 	
5857	 E964	 	 	 	k14	label	byte
5858	 E964  37 38 39 2D 34 35	 	db	'789-456+1230.'
5859	       36 2B 31 32 33 30	
5860	       2E	 	 	
5861	 	 	 	 	
5862	 	 	 	 	;   Таблица кодов правого пятнадцатиклавишного поля на нижнем
5863	 	 	 	 	; регистре
5864	 	 	 	 	
5865	 E971	 	 	 	k15	label byte
5866	 E971  47 48 49 FF 4B FF	 	db	71,72,73,-1,75,-1,77
5867	       4D	 	 	
5868	 E978  FF 4F 50 51 52 53	 	db	-1,79,80,81,82,83
5869	 	 	 	 	
5870	 E987	 	 	 	 	org	0e987h
5871	 	 	 	 	
5872	 	 	 	 	;----INT 9--------------------------
5873	 	 	 	 	;
5874	 	 	 	 	;    Программа обработки прерывания клавиатуры
5875	 	 	 	 	;
5876	 	 	 	 	; Программа считывает код сканирования клавиши в регистр AL.
5877	 	 	 	 	; Единичное состояние разряда 7 в коде сканирования означает,
5878	 	 	 	 	; что клавиша отжата.
5879	 	 	 	 	;   В результате выполнения программы в регистре AX формируется
5880	 	 	 	 	; слово, старший байт которого (AH) содержит код сканирования,
5881	 	 	 	 	; а младший (AL) - код ASCII. Эта информация помещается в буфер
5882	 	 	 	 	; клавиатуры. После заполнения буфера подается звуковой сигнал.
5883	 	 	 	 	;
5884	 	 	 	 	;-----------------------------------
5885	 	 	 	 	
5886	 E987	 	 	 	kb_int proc far
5887	 E987  FB	 	 	 	sti	 	   ; установка признака разрешения прерывания
5888	 E988  50	 	 	 	push	ax
5889	 E989  53	 	 	 	push	bx
5890	 E98A  51	 	 	 	push	cx
5891	 E98B  52	 	 	 	push	dx
5892	 E98C  56	 	 	 	push	si
5893	 E98D  57	 	 	 	push	di
5894	 E98E  1E	 	 	 	push	ds
5895	 E98F  06	 	 	 	push	es
5896	 E990  FC	 	 	 	cld	 	       ; установить признак направления вперед
5897	 E991  B8 0040	 	 	 	mov	ax,dat	       ; установить адресацию
5898	 E994  8E D8	 	 	 	mov	ds,ax
5899	 E996  E4 60	 	 	 	in	al,kb_dat      ; считать код сканирования
5900	 E998  50	 	 	 	push	ax
5901	 E999  E4 61	 	 	 	in	al,kb_ctl      ; считать значение порта 61
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-117
	 	 	 	 	 	 	 	09-15-88    


5902	 E99B  8A E0	 	 	 	mov	ah,al	       ; сохранить считанное значение
5903	 E99D  0C 80	 	 	 	or	al,80h	       ; установить бит 7 порта 61
5904	 E99F  E6 61	 	 	 	out	kb_ctl,al      ; для работы с клавиатурой
5905	 E9A1  86 E0	 	 	 	xchg	ah,al	       ; восстановить значение порта 61
5906	 E9A3  E6 61	 	 	 	out	kb_ctl,al
5907	 E9A5  58	 	 	 	pop	ax	       ; восстановить код сканирования
5908	 E9A6  8A E0	 	 	 	mov	ah,al	       ; и сохранить его в AH
5909	 	 	 	 	
5910	 	 	 	 	;---
5911	 	 	 	 	
5912	 E9A8  3C FF	 	 	 	cmp	al,0ffh  ; сравнение с кодом заполнения буфера
5913	 	 	 	 	 	 	 	 ; клавиатуры
5914	 E9AA  75 03	 	 	 	jnz	k16	 	; продолжить
5915	 E9AC  E9 E773 R	 	 	jmp	k62	; переход на звуковой сигнал по заполнению
5916	 	 	 	 	 	 	 	; буфера клавиатуры
5917	 	 	 	 	
5918	 E9AF	 	 	 	k16:
5919	 E9AF  24 7F	 	 	 	and	al,07fh 	; сброс бита отжатия клавиши
5920	 E9B1  0E	 	 	 	push	cs
5921	 E9B2  07	 	 	 	pop	es
5922	 E9B3  BF E875 R	 	 	mov	di,offset k6  ; установить адрес таблицы сканирования
5923	 	 	 	 	 	 	 	      ; управляющих клавиш
5924	 E9B6  B9 000C	 	 	 	mov	cx,k6l
5925	 E9B9  F2 AE	 	 	 	db  0f2h,0aeh	; repne scasb, сравнение полученного кода ска-
5926	 	 	 	 	 	 	 	; нирования с содержимым таблицы
5927	 E9BB  8A C4	 	 	 	mov	al,ah	 	; запомнить код сканирования
5928	 E9BD  74 1A	 	 	 	je	k17	 	; переход по совпадению
5929	 E9BF  E9 EACC R	 	 	jmp	k25	 	; переход по несовпадению
5930	 E9C2	 	 	 	k406:
5931	 E9C2  F6 06 0018 R 02	 	 	test	kb_flag_1,lat
5932	 E9C7  75 7F	 	 	 	jnz	k26a
5933	 E9C9  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
5934	 E9CE  B8 5CF1	 	 	 	mov	ax,5cf1h
5935	 E9D1  74 03	 	 	 	jz	k407
5936	 E9D3  B8 5CF0	 	 	 	mov	ax,5cf0h
5937	 	 	 	 	
5938	 	 	 	 	;   Получение маски нажатой управляющей клавиши
5939	 	 	 	 	
5940	 E9D6	 	 	 	k407:
5941	 E9D6  E9 E71B R	 	 	jmp	k57
5942	 	 	 	 	
5943	 E9D9  81 EF E876 R	 	k17:	sub	di,offset k6+1
5944	 E9DD  83 FF 08	 	 	 	cmp	di,8
5945	 E9E0  72 3B	 	 	 	jb	k300
5946	 E9E2  B4 06	 	 	 	mov	ah,6
5947	 E9E4  83 FF 0A	 	 	 	cmp	di,0ah
5948	 E9E7  72 39	 	 	 	jb	k301
5949	 E9E9  A8 80	 	 	 	test	al,80h
5950	 E9EB  74 5B	 	 	 	jz	k26a
5951	 E9ED  80 26 0018 R FC	 	 	and	kb_flag_1,not lat+lat_shift
5952	 E9F2  83 FF 0B	 	 	 	cmp	di,0bh
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-118
	 	 	 	 	 	 	 	09-15-88    


5953	 E9F5  74 17	 	 	 	je	k401
5954	 E9F7  F6 06 0018 R 04	 	 	test	kb_flag_1,inv_shift
5955	 E9FC  74 08	 	 	 	jz	k400
5956	 E9FE  80 0E 0018 R 01	 	 	or	kb_flag_1,lat_shift
5957	 EA03  EB 43 90	 	 	 	jmp	k26a
5958	 EA06  80 0E 0018 R 03	 	k400:	or	kb_flag_1,lat+lat_shift
5959	 EA0B  EB 3B 90	 	 	 	jmp	k26a
5960	 EA0E  F6 06 0018 R 04	 	k401:	test	kb_flag_1,inv_shift
5961	 EA13  74 33	 	 	 	jz	k26a
5962	 EA15  80 0E 0018 R 02	 	 	or	kb_flag_1,lat
5963	 EA1A  EB 2C 90	 	 	 	jmp	k26a
5964	 EA1D  2E: 8A A5 E881 R	 	k300:	mov	ah,cs:k7[di]
5965	 EA22	 	 	 	k301:
5966	 EA22  A8 80	 	 	 	test	al,80h	 	; клавиша отжата ?
5967	 EA24  75 79	 	 	 	jnz	k23	; переход, если клавиша отжата
5968	 	 	 	 	
5969	 	 	 	 	;   Управляющая клавиша нажата
5970	 	 	 	 	
5971	 EA26  80 FC 10	 	 	 	cmp	ah,scroll_shift ; нажата управляющая клавиша с
5972	 	 	 	 	 	 	 	 	;  запоминанием ?
5973	 EA29  73 20	 	 	 	jae	k18	 	; переход, если да
5974	 	 	 	 	
5975	 	 	 	 	;---
5976	 EA2B  80 FC 06	 	 	 	cmp	ah,6
5977	 EA2E  74 07	 	 	 	je	k302
5978	 	 	 	 	
5979	 EA30  08 26 0017 R	 	 	or	kb_flag,ah	; установка масок управляющих клавиш
5980	 	 	 	 	 	 	 	 	; без запоминания
5981	 EA34  E9 EAEB R	 	 	jmp	k26	 	; к выходу из прерывания
5982	 EA37  80 0E 0018 R 06	 	k302:	or	kb_flag_1,inv_shift+lat
5983	 EA3C  F6 06 0018 R 01	 	 	test	kb_flag_1,lat_shift
5984	 EA41  74 05	 	 	 	jz	k26a
5985	 EA43  80 26 0018 R FD	 	 	and	kb_flag_1,not lat
5986	 EA48	 	 	 	k26a:
5987	 EA48  E9 EAEB R	 	 	jmp	k26
5988	 	 	 	 	
5989	 	 	 	 	;   Опрос нажатия клавиши с запоминанием
5990	 	 	 	 	
5991	 EA4B	 	 	 	k18:
5992	 EA4B  F6 06 0017 R 04	 	 	test	kb_flag,ctl_shift	  ; опрос клавиши УПР
5993	 EA50  75 7A	 	 	 	jnz	k25
5994	 EA52  3C 52	 	 	 	cmp	al,ins_key	 	  ; опрос клавиши ВСТ
5995	 EA54  75 25	 	 	 	jnz	k22
5996	 EA56  F6 06 0017 R 08	 	 	test	kb_flag,alt_shift	  ; опрос клавиши ДОП
5997	 EA5B  74 03	 	 	 	jz	k19
5998	 EA5D  EB 6D 90	 	 	 	jmp	k25
5999	 EA60  F6 06 0017 R 20	 	k19:	test	kb_flag,num_state  ; опрос клавиши ЦИФ
6000	 EA65  75 0D	 	 	 	jnz	k21
6001	 EA67  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift ; опрос клавиш левого
6002	 	 	 	 	 	 	 	     ; и правого переключения регистров
6003	 EA6C  74 0D	 	 	 	jz	k22
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-119
	 	 	 	 	 	 	 	09-15-88    


6004	 	 	 	 	
6005	 EA6E	 	 	 	k20:
6006	 EA6E  B8 5230	 	 	 	mov	ax,5230h
6007	 EA71  E9 E71B R	 	 	jmp	k57	      ; установка кода нуля
6008	 EA74	 	 	 	k21:
6009	 EA74  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
6010	 EA79  74 F3	 	 	 	jz	k20
6011	 	 	 	 	
6012	 EA7B	 	 	 	k22:
6013	 EA7B  84 26 0018 R	 	 	test	ah,kb_flag_1
6014	 EA7F  75 6A	 	 	 	jnz	k26
6015	 EA81  08 26 0018 R	 	 	or	kb_flag_1,ah
6016	 EA85  30 26 0017 R	 	 	xor	kb_flag,ah
6017	 EA89  3C 52	 	 	 	cmp	al,ins_key
6018	 EA8B  75 5E	 	 	 	jne	k26
6019	 EA8D  B8 5200	 	 	 	mov	ax,ins_key*256
6020	 EA90  E9 E71B R	 	 	jmp	k57
6021	 	 	 	 	
6022	 EA93	 	 	 	k303:
6023	 EA93  80 26 0018 R FB	 	 	and	kb_flag_1,not inv_shift
6024	 EA98  80 36 0018 R 02	 	 	xor	kb_flag_1,lat
6025	 EA9D  EB 10	 	 	 	jmp	short k304
6026	 	 	 	 	
6027	 	 	 	 	;   Управляющая клавиша отжата
6028	 	 	 	 	
6029	 EA9F	 	 	 	k23:
6030	 	 	 	 	
6031	 EA9F  80 FC 10	 	 	 	cmp	ah,scroll_shift
6032	 EAA2  73 1F	 	 	 	jae	k24
6033	 EAA4  F6 D4	 	 	 	not	ah
6034	 EAA6  80 FC F9	 	 	 	cmp	ah,0f9h
6035	 EAA9  74 E8	 	 	 	je	k303
6036	 EAAB  20 26 0017 R	 	 	and	kb_flag,ah
6037	 EAAF	 	 	 	k304:
6038	 EAAF  3C B8	 	 	 	cmp	al,alt_key+80h
6039	 EAB1  75 38	 	 	 	jne	k26
6040	 	 	 	 	
6041	 	 	 	 	;---
6042	 	 	 	 	
6043	 EAB3  A0 0019 R	 	 	mov	al,alt_input
6044	 EAB6  B4 00	 	 	 	mov	ah,0
6045	 EAB8  88 26 0019 R	 	 	mov	alt_input,ah
6046	 EABC  3C 00	 	 	 	cmp	al,0
6047	 EABE  74 2B	 	 	 	je	k26
6048	 EAC0  E9 E724 R	 	 	jmp	k58
6049	 	 	 	 	
6050	 EAC3	 	 	 	k24:
6051	 EAC3  F6 D4	 	 	 	not	ah
6052	 EAC5  20 26 0018 R	 	 	and	kb_flag_1,ah
6053	 EAC9  EB 20 90	 	 	 	jmp	 k26
6054	 	 	 	 	;---
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-120
	 	 	 	 	 	 	 	09-15-88    


6055	 	 	 	 	
6056	 EACC	 	 	 	k25:
6057	 EACC  3C 80	 	 	 	cmp	al,80h
6058	 EACE  73 1B	 	 	 	jae	k26
6059	 EAD0  3C 59	 	 	 	cmp	al,inf_key
6060	 EAD2  74 25	 	 	 	je	k307
6061	 EAD4  3C 5C	 	 	 	cmp	al,92
6062	 EAD6  75 03	 	 	 	jne	k406b
6063	 EAD8  E9 E9C2 R	 	 	jmp	k406
6064	 EADB	 	 	 	k406b:
6065	 EADB  F6 06 0018 R 08	 	 	test	kb_flag_1,hold_state
6066	 EAE0  74 1D	 	 	 	jz	k28
6067	 EAE2  3C 45	 	 	 	cmp	al,num_key
6068	 EAE4  74 05	 	 	 	je	k26
6069	 EAE6  80 26 0018 R F7	 	 	and	kb_flag_1,not hold_state
6070	 	 	 	 	
6071	 EAEB	 	 	 	k26:
6072	 EAEB  FA	 	 	 	cli
6073	 EAEC  B0 20	 	 	 	mov	al,eoi
6074	 EAEE  E6 20	 	 	 	out	020h,al
6075	 EAF0	 	 	 	k27:
6076	 EAF0  07	 	 	 	pop	es
6077	 EAF1  1F	 	 	 	pop	ds
6078	 EAF2  5F	 	 	 	pop	di
6079	 EAF3  5E	 	 	 	pop	si
6080	 EAF4  5A	 	 	 	pop	dx
6081	 EAF5  59	 	 	 	pop	cx
6082	 EAF6  5B	 	 	 	pop	bx
6083	 EAF7  58	 	 	 	pop	ax
6084	 EAF8  CF	 	 	 	iret
6085	 	 	 	 	
6086	 EAF9  B8 A000	 	 	k307:	mov	ax,0a000h
6087	 EAFC  E9 E71B R	 	 	jmp	k57
6088	 	 	 	 	
6089	 	 	 	 	
6090	 	 	 	 	;---
6091	 	 	 	 	
6092	 EAFF	 	 	 	k28:
6093	 EAFF  F6 06 0017 R 08	 	 	test	kb_flag,alt_shift
6094	 EB04  75 03	 	 	 	jnz	k29
6095	 EB06  EB 6D 90	 	 	 	jmp	k38
6096	 	 	 	 	
6097	 	 	 	 	;---
6098	 	 	 	 	
6099	 EB09	 	 	 	k29:
6100	 EB09  F6 06 0017 R 04	 	 	test	kb_flag,ctl_shift
6101	 EB0E  74 0F	 	 	 	jz	k31
6102	 EB10  3C 53	 	 	 	cmp	al,del_key
6103	 EB12  75 0B	 	 	 	jne	k31
6104	 	 	 	 	
6105	 	 	 	 	;---
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-121
	 	 	 	 	 	 	 	09-15-88    


6106	 EB14	 	 	 	k306:
6107	 EB14  C7 06 0072 R 1234	 	mov	reset_flag,1234h
6108	 EB1A  EA 5B E0 00 F0	 	 	db	0eah,5bh,0e0h,00h,0f0h
6109	 	 	 	 	;---
6110	 	 	 	 	
6111	 	 	 	 	
6112	 	 	 	 	
6113	 	 	 	 	
6114	 EB1F	 	 	 	k31:
6115	 EB1F  3C 39	 	 	 	cmp	al,57
6116	 EB21  75 05	 	 	 	jne	k32
6117	 EB23  B0 20	 	 	 	mov	al,' '
6118	 EB25  E9 E71B R	 	 	jmp	k57
6119	 	 	 	 	
6120	 	 	 	 	;---
6121	 	 	 	 	
6122	 EB28	 	 	 	k32:
6123	 EB28  BF F8E1 R	 	 	mov	di,offset k30
6124	 EB2B  B9 000A	 	 	 	mov	cx,10
6125	 EB2E  F2 AE	 	 	 	db	0f2h,0aeh
6126	 EB30  75 12	 	 	 	jne	k33
6127	 EB32  81 EF F8E2 R	 	 	sub	di,offset k30+1
6128	 EB36  A0 0019 R	 	 	mov	al,alt_input
6129	 EB39  B4 0A	 	 	 	mov	ah,10
6130	 EB3B  F6 E4	 	 	 	mul	ah
6131	 EB3D  03 C7	 	 	 	add	ax,di
6132	 EB3F  A2 0019 R	 	 	mov	alt_input,al
6133	 EB42  EB A7	 	 	 	jmp	 k26
6134	 	 	 	 	
6135	 	 	 	 	;---
6136	 	 	 	 	
6137	 EB44	 	 	 	k33:
6138	 EB44  C6 06 0019 R 00	 	 	mov	alt_input,00h
6139	 EB49  B9 001A	 	 	 	mov	cx,0026
6140	 EB4C  F2 AE	 	 	 	db  0f2h,0aeh
6141	 EB4E  75 05	 	 	 	jne	k34
6142	 EB50  B0 00	 	 	 	mov	al,0
6143	 EB52  E9 E71B R	 	 	jmp	k57
6144	 	 	 	 	
6145	 	 	 	 	;---
6146	 	 	 	 	
6147	 EB55	 	 	 	k34:
6148	 EB55  3C 02	 	 	 	cmp	al,2
6149	 EB57  72 0C	 	 	 	jb	k35
6150	 EB59  3C 0E	 	 	 	cmp	al,14
6151	 EB5B  73 08	 	 	 	jae	k35
6152	 EB5D  80 C4 76	 	 	 	add	ah,118
6153	 EB60  B0 00	 	 	 	mov	al,0
6154	 EB62  E9 E71B R	 	 	jmp	k57
6155	 	 	 	 	
6156	 	 	 	 	;---
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-122
	 	 	 	 	 	 	 	09-15-88    


6157	 	 	 	 	
6158	 EB65	 	 	 	k35:
6159	 EB65  3C 3B	 	 	 	cmp	al,59
6160	 EB67  73 02	 	 	 	jae	k37
6161	 EB69	 	 	 	k36:
6162	 EB69  EB 80	 	 	 	jmp	k26
6163	 EB6B	 	 	 	k37:
6164	 EB6B  3C 47	 	 	 	cmp	al,71
6165	 EB6D  73 FA	 	 	 	jae	k36
6166	 EB6F  BB E95A R	 	 	mov	bx,offset k13
6167	 EB72  E9 E779 R	 	 	jmp	k63
6168	 	 	 	 	
6169	 	 	 	 	;---
6170	 	 	 	 	
6171	 EB75	 	 	 	k38:
6172	 EB75  F6 06 0017 R 04	 	 	test	kb_flag,ctl_shift
6173	 EB7A  74 5B	 	 	 	jz	k44
6174	 	 	 	 	
6175	 	 	 	 	;---
6176	 	 	 	 	;---
6177	 	 	 	 	
6178	 EB7C  3C 46	 	 	 	cmp	al,scroll_key
6179	 EB7E  75 18	 	 	 	jne	k39
6180	 EB80  BB 001E R	 	 	mov	bx,offset kb_buffer
6181	 EB83  89 1E 001A R	 	 	mov	buffer_head,bx
6182	 EB87  89 1E 001C R	 	 	mov	buffer_tail,bx
6183	 EB8B  C6 06 0071 R 80	 	 	mov	bios_break,80h
6184	 EB90  CD 1B	 	 	 	int	1bh
6185	 EB92  B8 0000	 	 	 	mov	ax,0
6186	 EB95  E9 E71B R	 	 	jmp	k57
6187	 	 	 	 	
6188	 EB98	 	 	 	k39:
6189	 EB98  3C 45	 	 	 	cmp	al,num_key
6190	 EB9A  75 21	 	 	 	jne	k41
6191	 EB9C  80 0E 0018 R 08	 	 	or	kb_flag_1,hold_state
6192	 EBA1  B0 20	 	 	 	mov	al,eoi
6193	 EBA3  E6 20	 	 	 	out	020h,al
6194	 	 	 	 	
6195	 	 	 	 	;---
6196	 	 	 	 	
6197	 EBA5  80 3E 0049 R 07	 	 	cmp	crt_mode,7
6198	 EBAA  74 07	 	 	 	je	k40
6199	 EBAC  BA 03D8	 	 	 	mov	dx,03d8h
6200	 EBAF  A0 0065 R	 	 	mov	al,crt_mode_set
6201	 EBB2  EE	 	 	 	out	dx,al
6202	 EBB3	 	 	 	k40:
6203	 EBB3  F6 06 0018 R 08	 	 	test	kb_flag_1,hold_state
6204	 EBB8  75 F9	 	 	 	jnz	k40
6205	 EBBA  E9 EAF0 R	 	 	jmp	k27
6206	 EBBD	 	 	 	k41:
6207	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-123
	 	 	 	 	 	 	 	09-15-88    


6208	 	 	 	 	;---
6209	 	 	 	 	
6210	 EBBD  3C 37	 	 	 	cmp	al,55
6211	 EBBF  75 06	 	 	 	jne	k42
6212	 EBC1  B8 7200	 	 	 	mov	ax,114*256
6213	 EBC4  E9 E71B R	 	 	jmp	k57
6214	 	 	 	 	
6215	 	 	 	 	;---
6216	 	 	 	 	
6217	 EBC7	 	 	 	k42:
6218	 EBC7  BB E889 R	 	 	mov	bx,offset k8
6219	 EBCA  3C 3B	 	 	 	cmp	al,59
6220	 EBCC  73 03	 	 	 	jae	k43
6221	 EBCE  E9 E717 R	 	 	jmp	k56
6222	 EBD1	 	 	 	k43:
6223	 EBD1  BB E8C3 R	 	 	mov	bx,offset k9
6224	 EBD4  E9 E779 R	 	 	jmp	k63
6225	 	 	 	 	
6226	 	 	 	 	;---
6227	 	 	 	 	
6228	 EBD7	 	 	 	k44:
6229	 	 	 	 	
6230	 EBD7  3C 47	 	 	 	cmp	al,71
6231	 EBD9  73 3E	 	 	 	jae	k48
6232	 EBDB  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
6233	 EBE0  74 0A	 	 	 	jz	k54a
6234	 	 	 	 	
6235	 	 	 	 	;---
6236	 	 	 	 	
6237	 EBE2  3C 0F	 	 	 	cmp	al,15
6238	 EBE4  75 09	 	 	 	jne	k45
6239	 EBE6  B8 0F00	 	 	 	mov	ax,15*256
6240	 EBE9  E9 E71B R	 	 	jmp	k57
6241	 	 	 	 	
6242	 EBEC	 	 	 	k54a:
6243	 EBEC  E9 E704 R	 	 	jmp k54
6244	 	 	 	 	
6245	 EBEF	 	 	 	k45:
6246	 EBEF  3C 37	 	 	 	cmp	al,55
6247	 EBF1  75 09	 	 	 	jne	k46
6248	 	 	 	 	
6249	 	 	 	 	;---
6250	 	 	 	 	
6251	 EBF3  B0 20	 	 	 	mov	al,eoi
6252	 EBF5  E6 20	 	 	 	out	020h,al
6253	 EBF7  CD 05	 	 	 	int	5h
6254	 EBF9  E9 EAF0 R	 	 	jmp	k27
6255	 	 	 	 	
6256	 EBFC	 	 	 	k46:
6257	 EBFC  3C 3B	 	 	 	cmp	al,59
6258	 EBFE  72 06	 	 	 	jb	k47
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-124
	 	 	 	 	 	 	 	09-15-88    


6259	 EC00  BB E950 R	 	 	mov	bx,offset k12
6260	 EC03  E9 E779 R	 	 	jmp	k63
6261	 	 	 	 	
6262	 EC06	 	 	 	k47:
6263	 EC06  F6 06 0018 R 02	 	 	test	kb_flag_1,lat
6264	 EC0B  74 06	 	 	 	jz	k98
6265	 EC0D  BB E916 R	 	 	mov	bx,offset k11
6266	 EC10  E9 E717 R	 	 	jmp	 k56
6267	 EC13  BB E633 R	 	k98:	mov	bx,offset rust2
6268	 EC16  E9 E717 R	 	 	jmp	k56
6269	 	 	 	 	
6270	 	 	 	 	;---
6271	 	 	 	 	
6272	 EC19	 	 	 	k48:
6273	 EC19  F6 06 0017 R 20	 	 	test	kb_flag,num_state
6274	 EC1E  75 23	 	 	 	jnz	k52
6275	 EC20  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
6276	 EC25  75 23	 	 	 	jnz	k53
6277	 	 	 	 	
6278	 	 	 	 	;---
6279	 	 	 	 	
6280	 EC27	 	 	 	k49:
6281	 	 	 	 	
6282	 EC27  3C 4A	 	 	 	cmp	al,74
6283	 EC29  74 0C	 	 	 	je	k50
6284	 EC2B  3C 4E	 	 	 	cmp	al,78
6285	 EC2D  74 0E	 	 	 	je	k51
6286	 EC2F  2C 47	 	 	 	sub	al,71
6287	 EC31  BB E971 R	 	 	mov	bx,offset k15
6288	 EC34  E9 E77B R	 	 	jmp	  k64
6289	 	 	 	 	
6290	 EC37  B8 4A2D	 	 	k50:	mov	ax,74*256+'-'
6291	 EC3A  E9 E71B R	 	 	jmp	 k57
6292	 	 	 	 	
6293	 EC3D  B8 4E2B	 	 	k51:	mov	ax,78*256+'+'
6294	 EC40  E9 E71B R	 	 	jmp	 k57
6295	 	 	 	 	
6296	 	 	 	 	;---
6297	 	 	 	 	
6298	 EC43	 	 	 	k52:
6299	 EC43  F6 06 0017 R 03	 	 	test	kb_flag,left_shift+right_shift
6300	 EC48  75 DD	 	 	 	jnz	k49
6301	 	 	 	 	
6302	 EC4A	 	 	 	k53:
6303	 EC4A  2C 46	 	 	 	sub	al,70
6304	 EC4C  BB E964 R	 	 	mov	bx,offset k14
6305	 EC4F  E9 E717 R	 	 	jmp	 k56
6306	 EC52	 	 	 	kb_int	endp
6307	 	 	 	 	
6308	 	 	 	 	;--- int 40H---------
6309	 	 	 	 	;   Программа обслуживания накопителя на гибком магнитном
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-125
	 	 	 	 	 	 	 	09-15-88    


6310	 	 	 	 	; диске выполняет шесть функций, код которых задается
6311	 	 	 	 	; в регистре AH:
6312	 	 	 	 	;   AH=0 - сбросить  НГМД;
6313	 	 	 	 	;   AH=1 - считать байт состояния НГМД. Состояние соответствует
6314	 	 	 	 	; последней выполняемой операции и передается в регистр AL из
6315	 	 	 	 	; постоянно распределенной области оперативной памяти с адресом
6316	 	 	 	 	; 00441H;
6317	 	 	 	 	;    AH=2H - считать указанный сектор в память;
6318	 	 	 	 	;    AH=3H - записать указанный сектор из памяти;
6319	 	 	 	 	;    AH=4H - верификация;
6320	 	 	 	 	;    AH=5H - форматизация.
6321	 	 	 	 	;    Для выполнения функций записи, считывания, верификации,
6322	 	 	 	 	; форматизации в регистрах задается следующая информация:
6323	 	 	 	 	;    DL - номер устройства (0-3, контролируемое значение);
6324	 	 	 	 	;    DH - номер головки (0-1, неконтролируемое значение);
6325	 	 	 	 	;    CH - номер дорожки (0-39, неконтролируемое значение);
6326	 	 	 	 	;    CL - номер сектора (1-8, неконтролируемое значение);
6327	 	 	 	 	;    AL - количество секторов (1-8, неконтролируемое значение).
6328	 	 	 	 	;
6329	 	 	 	 	;    Для выполнения форматизации необходимо сформировать в
6330	 	 	 	 	; памяти четырехбайтную таблицу для каждого сектора, содержащую
6331	 	 	 	 	; следующую информацию:
6332	 	 	 	 	;    номер дорожки;
6333	 	 	 	 	;    номер головки;
6334	 	 	 	 	;    номер сектора;
6335	 	 	 	 	;    количество байт в секторе (00 - 128 байт, 01 - 256 байт,
6336	 	 	 	 	; 02 - 512 байт, 03 - 1024 байта).
6337	 	 	 	 	;    Адрес таблицы задается в регистрах ES:BX.
6338	 	 	 	 	;
6339	 	 	 	 	;    После выполнения программы в регистре AH находится
6340	 	 	 	 	; байт состояния НГМД.
6341	 	 	 	 	;
6342	 	 	 	 	;    Байт состояния НГМД имеет следующее значение:
6343	 	 	 	 	;    80 - тайм-аут;
6344	 	 	 	 	;    40 - сбой позиционирования;
6345	 	 	 	 	;    20 - сбой контроллера;
6346	 	 	 	 	;    10 - ошибка кода циклического контроля при считывании;
6347	 	 	 	 	;    09 - переход адреса через сегмент (64К байт);
6348	 	 	 	 	;    08 - переполнение;
6349	 	 	 	 	;    04 - сектор не найден;
6350	 	 	 	 	;    03 - защита записи;
6351	 	 	 	 	;    02 - не обнаружен маркер идентификатора сектора;
6352	 	 	 	 	;    01 - команда отвергнута.
6353	 	 	 	 	;    При успешном завершении программы признак CF=0,  в про-
6354	 	 	 	 	; тивном случае - признак CF=1 (регистр AH содержит код ошибки).
6355	 	 	 	 	;    Регистр AL содержит количество реально считанных секторов.
6356	 	 	 	 	;    Адрес программы обслуживания накопителя на гибком магнитном
6357	 	 	 	 	; диске записывается в вектор 40H в процедуре сброса по включению
6358	 	 	 	 	; питания.
6359	 	 	 	 	;-------------------------
6360	 	 	 	 	 	assume	cs:code,ds:data,es:data
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-126
	 	 	 	 	 	 	 	09-15-88    


6361	 EC59	 	 	 	 	org	0ec59h
6362	 EC59	 	 	 	diskette_io proc	far
6363	 EC59  FB	 	 	 	sti	 	 	; установить признак прерывания
6364	 EC5A  53	 	 	 	push	bx	 	; сохранить адрес
6365	 EC5B  51	 	 	 	push	cx
6366	 EC5C  1E	 	 	 	push	ds	   ; сохранить сегментное значение регистра
6367	 EC5D  56	 	 	 	push	si	   ; сохранить все регистры во время операции
6368	 EC5E  57	 	 	 	push	di
6369	 EC5F  55	 	 	 	push	bp
6370	 EC60  52	 	 	 	push	dx
6371	 EC61  8B EC	 	 	 	mov	bp,sp	   ; установить указатель вершины стека
6372	 EC63  BE 0040	 	 	 	mov	si,dat
6373	 EC66  8E DE	 	 	 	mov	ds,si	 	; установить область данных
6374	 EC68  E8 EC87 R	 	 	call	j1	 	;
6375	 EC6B  BB 0004	 	 	 	mov	bx,4	 	; получить параметры ожидания мотора
6376	 EC6E  E8 EE51 R	 	 	call	get_parm
6377	 EC71  88 26 0040 R	 	 	mov	motor_count,ah	; уст время отсчета для мотора
6378	 EC75  8A 26 0041 R	 	 	mov	ah,diskette_status  ; получить состояние операции
6379	 EC79  80 FC 01	 	 	 	cmp	ah,1	 	; уст признак CF для индикации
6380	 EC7C  F5	 	 	 	cmc	 	 	; успешной операции
6381	 EC7D  5A	 	 	 	pop	dx	 	; восстановить все регистры
6382	 EC7E  5D	 	 	 	pop	bp
6383	 EC7F  5F	 	 	 	pop	di
6384	 EC80  5E	 	 	 	pop	si
6385	 EC81  1F	 	 	 	pop	ds
6386	 EC82  59	 	 	 	pop	cx
6387	 EC83  5B	 	 	 	pop	bx
6388	 EC84  CA 0002	 	 	 	ret	2
6389	 EC87	 	 	 	diskette_io	endp
6390	 EC87	 	 	 	j1	proc	near
6391	 EC87  8A F0	 	 	 	mov	dh,al	 	; сохранить количество секторов
6392	 EC89  80 26 003F R 7F	 	 	and	motor_status,07fh   ; указать операцию считывания
6393	 EC8E  0A E4	 	 	 	or	ah,ah	 	; AH=0
6394	 EC90  74 27	 	 	 	jz	disk_reset
6395	 EC92  FE CC	 	 	 	dec	ah	 	; AH=1
6396	 EC94  74 74	 	 	 	jz	disk_status
6397	 EC96  C6 06 0041 R 00	 	 	mov	diskette_status,0   ; сброс состояния
6398	 EC9B  80 FA 04	 	 	 	cmp	dl,4	 	; проверка количества устройств
6399	 EC9E  73 13	 	 	 	jae	j3	 	; переход по ошибке
6400	 ECA0  FE CC	 	 	 	dec	ah	 	; AH=2
6401	 ECA2  74 6A	 	 	 	jz	disk_read
6402	 ECA4  FE CC	 	 	 	dec	ah	 	; AH=3
6403	 ECA6  75 03	 	 	 	jnz	j2
6404	 ECA8  E9 ED41 R	 	 	jmp	disk_write
6405	 ECAB	 	 	 	j2:
6406	 ECAB  FE CC	 	 	 	dec	ah	 	; AH=4
6407	 ECAD  74 68	 	 	 	jz	disk_verf
6408	 ECAF  FE CC	 	 	 	dec	ah	 	; AH=5
6409	 ECB1  74 68	 	 	 	jz	disk_format
6410	 ECB3	 	 	 	j3:
6411	 ECB3  C6 06 0041 R 01	 	 	mov	diskette_status,bad_cmd   ; неверная команда
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-127
	 	 	 	 	 	 	 	09-15-88    


6412	 	 	 	 	
6413	 ECB8  C3	 	 	 	ret	 	 	; операция не определена
6414	 ECB9	 	 	 	j1	endp
6415	 	 	 	 	
6416	 	 	 	 	;   Сбросить НГМД
6417	 	 	 	 	
6418	 ECB9	 	 	 	disk_reset proc near
6419	 ECB9  BA 03F2	 	 	 	mov	dx,03f2h
6420	 ECBC  FA	 	 	 	cli	 	 	; сброс признака разрешения прерывания
6421	 ECBD  A0 003F R	 	 	mov	al,motor_status  ; какой мотор включен
6422	 ECC0  B1 04	 	 	 	mov	cl,4	 	; счетчик сдвига
6423	 ECC2  D2 E0	 	 	 	sal	al,cl
6424	 ECC4  A8 20	 	 	 	test	al,20h	 	; выбрать соответствующее устройство
6425	 ECC6  75 0C	 	 	 	jnz	j5	 	; переход, если включен мотор первого
6426	 	 	 	 	 	 	 	 	; устройства
6427	 ECC8  A8 40	 	 	 	test	al,40h
6428	 ECCA  75 06	 	 	 	jnz	j4	 	; переход, если включен мотор второго
6429	 	 	 	 	 	 	 	 	; устройства
6430	 ECCC  A8 80	 	 	 	test	al,80h
6431	 ECCE  74 06	 	 	 	jz	j6	 	; переход, если включен мотор нулевого
6432	 	 	 	 	 	 	 	 	; устройства
6433	 ECD0  FE C0	 	 	 	inc	al
6434	 ECD2  FE C0	 	 	j4:	inc	al
6435	 ECD4  FE C0	 	 	j5:	inc	al
6436	 ECD6  0C 08	 	 	j6:	or	al,8	 	; включить доступность прерывания
6437	 ECD8  EE	 	 	 	out	dx,al	 	; сброс адаптера
6438	 ECD9  C6 06 003E R 00	 	 	mov	seek_status,0
6439	 ECDE  C6 06 0041 R 00	 	 	mov	diskette_status,0  ; уст нормальное состояние НГМД
6440	 ECE3  0C 04	 	 	 	or	al,4	 	; выключить сброс
6441	 ECE5  EE	 	 	 	out	dx,al
6442	 ECE6  FB	 	 	 	sti	 	 	; установить бит разрешения прерывания
6443	 ECE7  E8 EF0E R	 	 	call	chk_stat_2	; выполнить прерывание после сброса
6444	 ECEA  A0 0042 R	 	 	mov	al,nec_status
6445	 ECED  3C C0	 	 	 	cmp	al,0c0h    ; проверка готовности устройства для передачи
6446	 ECEF  74 07	 	 	 	jz	j7	 	; устройство готово
6447	 ECF1  80 0E 0041 R 20	 	 	or	diskette_status,bad_nec  ; уст код ошибки
6448	 ECF6  EB 11	 	 	 	jmp	short j8
6449	 	 	 	 	
6450	 	 	 	 	;   Послать команду в контроллер
6451	 	 	 	 	
6452	 ECF8	 	 	 	j7:
6453	 ECF8  B4 03	 	 	 	mov	ah,03h	 	; установить команду
6454	 ECFA  E8 E6A5 R	 	 	call	nec_output	; передать команду
6455	 ECFD  BB 0001	 	 	 	mov	bx,1	 	; передача первого байта параметров
6456	 ED00  E8 EE51 R	 	 	call	get_parm	; в контроллер
6457	 ED03  BB 0003	 	 	 	mov	bx,3	 	; передача второго байта параметров
6458	 ED06  E8 EE51 R	 	 	call	get_parm	; в контроллер
6459	 ED09	 	 	 	j8:
6460	 ED09  C3	 	 	 	ret	 	 	; возврат к прерванной программе
6461	 ED0A	 	 	 	disk_reset	endp
6462	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-128
	 	 	 	 	 	 	 	09-15-88    


6463	 	 	 	 	;
6464	 	 	 	 	; Считать байт состояния НГМД (AH=1)
6465	 	 	 	 	;
6466	 	 	 	 	
6467	 ED0A	 	 	 	disk_status proc near
6468	 ED0A  A0 0041 R	 	 	mov	al,diskette_status
6469	 ED0D  C3	 	 	 	ret
6470	 ED0E	 	 	 	disk_status	endp
6471	 	 	 	 	
6472	 	 	 	 	;   Считать указанный сектор в память (AH=2)
6473	 	 	 	 	
6474	 ED0E	 	 	 	disk_read proc near
6475	 ED0E  B0 46	 	 	 	mov	al,046h 	; установить команду
6476	 ED10	 	 	 	j9:
6477	 ED10  E8 EEC8 R	 	 	call	dma_setup	; установить ПДП
6478	 ED13  B4 E6	 	 	 	mov	ah,0e6h     ; уст команду считывания  контроллера
6479	 ED15  EB 36	 	 	 	jmp	short rw_opn	; переход к выполнению операции
6480	 ED17	 	 	 	disk_read	endp
6481	 	 	 	 	
6482	 	 	 	 	;   Верификация (AH=4)
6483	 	 	 	 	
6484	 ED17	 	 	 	disk_verf proc near
6485	 ED17  B0 42	 	 	 	mov	al,042h 	; установить команду
6486	 ED19  EB F5	 	 	 	jmp	short j9
6487	 ED1B	 	 	 	disk_verf	endp
6488	 	 	 	 	
6489	 	 	 	 	;   Форматизация (AH=5)
6490	 	 	 	 	
6491	 ED1B	 	 	 	disk_format proc near
6492	 ED1B  80 0E 003F R 80	 	 	or	motor_status,80h  ; индикация операции записи
6493	 ED20  B0 4A	 	 	 	mov	al,04ah 	  ; установить команду
6494	 ED22  E8 EEC8 R	 	 	call	dma_setup	  ; установить ПДП
6495	 ED25  B4 4D	 	 	 	mov	ah,04dh 	  ; установить команду
6496	 ED27  EB 24	 	 	 	jmp	short rw_opn
6497	 ED29	 	 	 	j10:
6498	 ED29  BB 0007	 	 	 	mov	bx,7	 	  ; получить значение сектора
6499	 ED2C  E8 EE51 R	 	 	call	get_parm
6500	 ED2F  BB 0009	 	 	 	mov	bx,9	 	; получить значение дорожки на секторе
6501	 ED32  E8 EE51 R	 	 	call	get_parm
6502	 ED35  BB 000F	 	 	 	mov	bx,15	 	; получить значение длины интервала
6503	 ED38  E8 EE51 R	 	 	call	get_parm	; для контроллера
6504	 ED3B  BB 0011	 	 	 	mov	bx,17	 	; получить полный байт
6505	 ED3E  E9 EDF9 R	 	 	jmp	j16
6506	 ED41	 	 	 	disk_format	endp
6507	 	 	 	 	
6508	 	 	 	 	;   Записать указанный сектор из памяти (AH=3)
6509	 	 	 	 	
6510	 ED41	 	 	 	disk_write proc near
6511	 ED41  80 0E 003F R 80	 	 	or	motor_status,80h	; индикация операции записи
6512	 ED46  B0 4A	 	 	 	mov	al,04ah 	 	; уст код операции записи
6513	 ED48  E8 EEC8 R	 	 	call	dma_setup
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-129
	 	 	 	 	 	 	 	09-15-88    


6514	 ED4B  B4 C5	 	 	 	mov	ah,0c5h 	 	; команда записи на НГМД
6515	 ED4D	 	 	 	disk_write	endp
6516	 	 	 	 	
6517	 	 	 	 	;______________________
6518	 	 	 	 	; rw_opn
6519	 	 	 	 	;   Программа выполнения операций
6520	 	 	 	 	;   считывания, записи, верификации
6521	 	 	 	 	;----------------------
6522	 ED4D	 	 	 	rw_opn	proc	near
6523	 ED4D  73 08	 	 	 	jnc	j11	 	; проверка ошибки ПДП
6524	 ED4F  C6 06 0041 R 09	 	 	mov	diskette_status,dma_boundary   ; установить ошибку
6525	 ED54  B0 00	 	 	 	mov	al,0	 	;
6526	 ED56  C3	 	 	 	ret	 	 	; возврат к основной программе
6527	 ED57	 	 	 	j11:
6528	 ED57  50	 	 	 	push	ax	 	; сохранить команду
6529	 	 	 	 	
6530	 	 	 	 	;   Включить мотор и выбрать устройство
6531	 	 	 	 	
6532	 ED58  51	 	 	 	push	cx
6533	 ED59  8A CA	 	 	 	mov	cl,dl	 	; уст номер устройства, как счетчик сдвига
6534	 ED5B  B0 01	 	 	 	mov	al,1	 	; маска для определения мотора устройства
6535	 ED5D  D2 E0	 	 	 	sal	al,cl	 	; сдвиг
6536	 ED5F  FA	 	 	 	cli	 	 	; сбросить бит разрешения прерывания
6537	 ED60  C6 06 0040 R FF	 	 	mov	motor_count,0ffh  ; установить счетчик
6538	 ED65  84 06 003F R	 	 	test	al,motor_status
6539	 ED69  75 3F	 	 	 	jnz	j14
6540	 ED6B  80 26 003F R F0	 	 	and	motor_status,0f0h  ; выключить все биты мотора
6541	 ED70  08 06 003F R	 	 	or	motor_status,al    ; включить мотор
6542	 ED74  FB	 	 	 	sti	 	 	; установить бит разрешения прерывания
6543	 ED75  B0 10	 	 	 	mov	al,10h	 	; бит маски
6544	 ED77  D2 E0	 	 	 	sal	al,cl	 	; уст бит маски для доступности мотора
6545	 ED79  0A C2	 	 	 	or	al,dl	 	; включить бит выбора устройства
6546	 ED7B  0C 0C	 	 	 	or	al,0ch	 	; нет сброса, доступность прерывания ПДП
6547	 ED7D  52	 	 	 	push	dx
6548	 ED7E  BA 03F2	 	 	 	mov	dx,03f2h	; установить адрес порта
6549	 ED81  EE	 	 	 	out	dx,al
6550	 ED82  5A	 	 	 	pop	dx	 	; восстановить регистры
6551	 ED83  51	 	 	 	push	cx	 	;задержка для включения мотора устройства
6552	 ED84  B9 0003	 	 	 	mov	cx,3
6553	 ED87  51	 	 	x2:	push	cx
6554	 ED88  B9 0000	 	 	 	mov	cx,0
6555	 ED8B  E2 FE	 	 	x1:	loop	x1
6556	 ED8D  59	 	 	 	pop	cx
6557	 ED8E  E2 F7	 	 	 	loop	x2
6558	 ED90  59	 	 	 	pop	cx
6559	 	 	 	 	
6560	 	 	 	 	;   Ожидание включения мотора для операции записи
6561	 	 	 	 	
6562	 ED91  F6 06 003F R 80	 	 	test	motor_status,80h  ; запись ?
6563	 ED96  74 12	 	 	 	jz	j14	; нет - продолжать без ожидания
6564	 ED98  BB 0014	 	 	 	mov	bx,20	 	; установить ожидание включения мотора
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-130
	 	 	 	 	 	 	 	09-15-88    


6565	 ED9B  E8 EE51 R	 	 	call	get_parm	; получить параметры
6566	 ED9E  0A E4	 	 	 	or	ah,ah
6567	 EDA0	 	 	 	j12:
6568	 EDA0  74 08	 	 	 	jz	j14	 	; выход по окончании времени ожидания
6569	 EDA2  2B C9	 	 	 	sub	cx,cx	 	; установить счетчик
6570	 EDA4  E2 FE	 	 	j13:	loop	j13	 	; ожидать требуемое время
6571	 EDA6  FE CC	 	 	 	dec	ah	 	; уменьшеть значение времени
6572	 EDA8  EB F6	 	 	 	jmp	short j12	; повторить цикл
6573	 	 	 	 	
6574	 EDAA	 	 	 	j14:
6575	 EDAA  FB	 	 	 	sti	 	 	; уст признак разрешения прерывания
6576	 EDAB  59	 	 	 	pop	cx
6577	 	 	 	 	
6578	 	 	 	 	;   Выполнить операцию поиска
6579	 	 	 	 	
6580	 EDAC  E8 EE67 R	 	 	call	seek	 	; установить дорожку
6581	 EDAF  58	 	 	 	pop	ax	 	; восстановить команду
6582	 EDB0  8A FC	 	 	 	mov	bh,ah	 	; сохранить команду в BH
6583	 EDB2  B6 00	 	 	 	mov	dh,0	 	; уст 0 сектор в случае ошибки
6584	 EDB4  72 4A	 	 	 	jc	j17	 	; выход, если ошибка
6585	 EDB6  BE EE00 R	 	 	mov	si,offset j17
6586	 	 	 	 	
6587	 EDB9  56	 	 	 	push	si
6588	 	 	 	 	
6589	 	 	 	 	;   Послать параметры в контроллер
6590	 	 	 	 	
6591	 EDBA  E8 E6A5 R	 	 	call	nec_output	; передача команды
6592	 EDBD  8A 66 01	 	 	 	mov	ah,byte ptr [bp+1]  ; уст номер головки
6593	 EDC0  D0 E4	 	 	 	sal	ah,1	 	; сдвиг на 2
6594	 EDC2  D0 E4	 	 	 	sal	ah,1
6595	 EDC4  80 E4 04	 	 	 	and	ah,4	 	; выделить бит
6596	 EDC7  0A E2	 	 	 	or	ah,dl	 	; операция OR с номером устройства
6597	 EDC9  E8 E6A5 R	 	 	call	nec_output
6598	 	 	 	 	
6599	 	 	 	 	;   Проверка операции форматизации
6600	 	 	 	 	
6601	 EDCC  80 FF 4D	 	 	 	cmp	bh,04dh 	; форматизация ?
6602	 EDCF  75 03	 	 	 	jne	j15    ; нет - продолжать запись/считывание/верификацию
6603	 EDD1  E9 ED29 R	 	 	jmp	j10
6604	 	 	 	 	
6605	 EDD4  8A E5	 	 	j15:	mov	ah,ch	 	; номер цилиндра
6606	 EDD6  E8 E6A5 R	 	 	call	nec_output
6607	 EDD9  8A 66 01	 	 	 	mov	ah,byte ptr [bp+1]  ; номер головки
6608	 EDDC  E8 E6A5 R	 	 	call	nec_output
6609	 EDDF  8A E1	 	 	 	mov	ah,cl	 	; номер сектора
6610	 EDE1  E8 E6A5 R	 	 	call	nec_output
6611	 EDE4  BB 0007	 	 	 	mov	bx,7
6612	 EDE7  E8 EE51 R	 	 	call	get_parm
6613	 EDEA  BB 0009	 	 	 	mov	bx,9
6614	 EDED  E8 EE51 R	 	 	call	get_parm
6615	 EDF0  BB 000B	 	 	 	mov	bx,11
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-131
	 	 	 	 	 	 	 	09-15-88    


6616	 EDF3  E8 EE51 R	 	 	call	get_parm
6617	 EDF6  BB 000D	 	 	 	mov	bx,13
6618	 EDF9	 	 	 	j16:
6619	 EDF9  E8 EE51 R	 	 	call	get_parm
6620	 EDFC  5E	 	 	 	pop	si
6621	 	 	 	 	
6622	 	 	 	 	;   Операция запущена
6623	 	 	 	 	
6624	 EDFD  E8 EF2F R	 	 	call	wait_int	; ожидание прерывания
6625	 EE00	 	 	 	j17:
6626	 EE00  72 45	 	 	 	jc	j21	 	; поиск ошибки
6627	 EE02  E8 EF6B R	 	 	call	results 	; получить состояние контроллера
6628	 EE05  72 3F	 	 	 	jc	j20	 	; поиск ошибки
6629	 	 	 	 	
6630	 	 	 	 	;   Проверка  состояния, полученного из контроллера
6631	 	 	 	 	
6632	 EE07  FC	 	 	 	cld	 	 	; установить направление коррекции
6633	 EE08  BE 0042 R	 	 	mov	si,offset nec_status
6634	 EE0B  AC	 	 	 	lods	nec_status
6635	 EE0C  24 C0	 	 	 	and	al,0c0h 	; проверить нормальное окончание
6636	 EE0E  74 3B	 	 	 	jz	j22
6637	 EE10  3C 40	 	 	 	cmp	al,040h 	; проверить неверное окончание
6638	 EE12  75 29	 	 	 	jnz	j18
6639	 	 	 	 	
6640	 	 	 	 	;   Обнаруженно неверное окончание
6641	 	 	 	 	
6642	 EE14  AC	 	 	 	lods	nec_status
6643	 EE15  D0 E0	 	 	 	sal	al,1
6644	 EE17  B4 04	 	 	 	mov	ah,record_not_fnd
6645	 EE19  72 24	 	 	 	jc	j19
6646	 EE1B  D0 E0	 	 	 	sal	al,1
6647	 EE1D  D0 E0	 	 	 	sal	al,1
6648	 EE1F  B4 10	 	 	 	mov	ah,bad_crc
6649	 EE21  72 1C	 	 	 	jc	j19
6650	 EE23  D0 E0	 	 	 	sal	al,1
6651	 EE25  B4 08	 	 	 	mov	ah,bad_dma
6652	 EE27  72 16	 	 	 	jc	j19
6653	 EE29  D0 E0	 	 	 	sal	al,1
6654	 EE2B  D0 E0	 	 	 	sal	al,1
6655	 EE2D  B4 04	 	 	 	mov	ah,record_not_fnd
6656	 EE2F  72 0E	 	 	 	jc	j19
6657	 EE31  D0 E0	 	 	 	sal	al,1
6658	 EE33  B4 03	 	 	 	mov	ah,write_protect  ; проверка защиты записи
6659	 EE35  72 08	 	 	 	jc	j19
6660	 EE37  D0 E0	 	 	 	sal	al,1
6661	 EE39  B4 02	 	 	 	mov	ah,bad_addr_mark
6662	 EE3B  72 02	 	 	 	jc	j19
6663	 	 	 	 	
6664	 	 	 	 	;   Контроллер вышел из строя
6665	 	 	 	 	
6666	 EE3D	 	 	 	j18:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-132
	 	 	 	 	 	 	 	09-15-88    


6667	 EE3D  B4 20	 	 	 	mov	ah,bad_nec
6668	 EE3F	 	 	 	j19:
6669	 EE3F  08 26 0041 R	 	 	or	diskette_status,ah
6670	 EE43  E8 EFB0 R	 	 	call	num_trans
6671	 EE46	 	 	 	j20:
6672	 EE46  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6673	 	 	 	 	
6674	 EE47	 	 	 	j21:
6675	 EE47  E8 EF6B R	 	 	call	results 	; вызов результатов в буфер
6676	 EE4A  C3	 	 	 	ret
6677	 	 	 	 	
6678	 	 	 	 	;   Операция была успешной
6679	 	 	 	 	
6680	 EE4B	 	 	 	j22:
6681	 EE4B  E8 EFB0 R	 	 	call	num_trans
6682	 EE4E  32 E4	 	 	 	xor	ah,ah	 	; нет ошибок
6683	 EE50  C3	 	 	 	ret
6684	 EE51	 	 	 	rw_opn	endp
6685	 	 	 	 	;------------------------
6686	 	 	 	 	;get_parm
6687	 	 	 	 	;
6688	 	 	 	 	;   ВХОД   BX - индекс байта,деленный
6689	 	 	 	 	;	 	на 2,который будет
6690	 	 	 	 	;	 	выбран,если младший
6691	 	 	 	 	;	 	бит BX установлен,то
6692	 	 	 	 	;	 	байт немедленно пере-
6693	 	 	 	 	;	 	дается контроллеру.
6694	 	 	 	 	;
6695	 	 	 	 	;   ВЫХОД  AH - байт из блока.
6696	 	 	 	 	;-------------------------
6697	 EE51	 	 	 	get_parm proc	near
6698	 EE51  1E	 	 	 	push	ds	 	; сохранить сегмент
6699	 EE52  2B C0	 	 	 	sub	ax,ax	 	; AX=0
6700	 EE54  8E D8	 	 	 	mov	ds,ax
6701	 	 	 	 	 	assume	ds:abs0
6702	 EE56  C5 36 0078 R	 	 	lds	si,disk_pointer
6703	 EE5A  D1 EB	 	 	 	shr	bx,1	 	; делить BX на 2, уст флаг для выхода
6704	 EE5C  8A A0 0000 R	 	 	mov	ah,zb[si+bx]	; получить слово
6705	 EE60  1F	 	 	 	pop	ds	 	; восстановить сегмент
6706	 	 	 	 	 	assume	ds:data
6707	 EE61  72 01	 	 	 	jc	nec_op	 	 ;если флаг установлен, выход
6708	 EE63  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6709	 EE64  E9 E6A5 R	 	nec_op: jmp	nec_output
6710	 EE67	 	 	 	get_parm endp
6711	 	 	 	 	;----------------------------
6712	 	 	 	 	;   Позиционирование
6713	 	 	 	 	;
6714	 	 	 	 	;   Эта программа позиционирует голов-
6715	 	 	 	 	; ку обозначенного устройства на нуж-
6716	 	 	 	 	; ную дорожку. Если устройство не
6717	 	 	 	 	; было выбрано до тех пор, пока не
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-133
	 	 	 	 	 	 	 	09-15-88    


6718	 	 	 	 	; была сброшена команда,то устройство
6719	 	 	 	 	; будет рекалибровано.
6720	 	 	 	 	;
6721	 	 	 	 	;   ВВОД
6722	 	 	 	 	;	(DL) - номер усройства для
6723	 	 	 	 	;	       позиционирования,
6724	 	 	 	 	;	(CH) - номер дорожки.
6725	 	 	 	 	;
6726	 	 	 	 	;   ВЫВОД
6727	 	 	 	 	;	 CY=0 - успешно,
6728	 	 	 	 	;	 CY=1 - сбой (состояние НГМД установить
6729	 	 	 	 	;	 	согласно  AX).
6730	 	 	 	 	;----------------------------
6731	 EE67	 	 	 	seek	proc	near
6732	 EE67  B0 01	 	 	 	mov	al,1	 	; уст маску
6733	 EE69  51	 	 	 	push	cx
6734	 EE6A  8A CA	 	 	 	mov	cl,dl	 	; установить номер устройства
6735	 EE6C  D2 C0	 	 	 	rol	al,cl	 	; циклический сдвиг влево
6736	 EE6E  59	 	 	 	pop	cx
6737	 EE6F  84 06 003E R	 	 	test	al,seek_status
6738	 EE73  75 20	 	 	 	jnz	j28
6739	 EE75  08 06 003E R	 	 	or	seek_status,al
6740	 EE79  B4 07	 	 	 	mov	ah,07h
6741	 EE7B  E8 E6A5 R	 	 	call	nec_output
6742	 EE7E  8A E2	 	 	 	mov	ah,dl
6743	 EE80  E8 E6A5 R	 	 	call	nec_output
6744	 EE83  E8 EF0E R	 	 	call	chk_stat_2   ; получить и обработать прерывание
6745	 EE86  B4 07	 	 	 	mov	ah,07h	 	; команда рекалибровки
6746	 EE88  E8 E6A5 R	 	 	call	nec_output
6747	 EE8B  8A E2	 	 	 	mov	ah,dl
6748	 EE8D  E8 E6A5 R	 	 	call	nec_output
6749	 EE90  E8 EF0E R	 	 	call	chk_stat_2
6750	 EE93  72 32	 	 	 	jc	j32	 	; сбой позиционирования
6751	 	 	 	 	
6752	 	 	 	 	
6753	 EE95	 	 	 	j28:
6754	 EE95  B4 0F	 	 	 	mov	ah,0fh
6755	 EE97  E8 E6A5 R	 	 	call	nec_output
6756	 EE9A  8A E2	 	 	 	mov	ah,dl	 	; номер устройства
6757	 EE9C  E8 E6A5 R	 	 	call	nec_output
6758	 EE9F  8A E5	 	 	 	mov	ah,ch	 	; номер дорожки
6759	 EEA1  F6 06 0010 R 04	 	 	test	byte ptr equip_flag,4
6760	 EEA6  75 02	 	 	 	jnz	j300
6761	 EEA8  02 E4	 	 	 	add	ah,ah	 	; удвоение номера дорожки
6762	 EEAA	 	 	 	j300:
6763	 EEAA  E8 E6A5 R	 	 	call	nec_output
6764	 EEAD  E8 EF0E R	 	 	call	chk_stat_2	; получить конечное прерывание и
6765	 	 	 	 	 	 	 	 	; считать состояние
6766	 	 	 	 	
6767	 	 	 	 	
6768	 EEB0  9C	 	 	 	pushf	 	 	; сохранить значение флажков
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-134
	 	 	 	 	 	 	 	09-15-88    


6769	 EEB1  BB 0012	 	 	 	mov	bx,18
6770	 EEB4  E8 EE51 R	 	 	call	get_parm
6771	 EEB7  51	 	 	 	push	cx	 	; сохранить регистр
6772	 EEB8	 	 	 	j29:
6773	 EEB8  B9 0226	 	 	 	mov	cx,550	 	; организовать цикл = 1 ms
6774	 EEBB  0A E4	 	 	 	or	ah,ah	 	; проверка окончания времени
6775	 EEBD  74 06	 	 	 	jz	j31
6776	 EEBF  E2 FE	 	 	j30:	loop	j30	 	; задержка 1ms
6777	 EEC1  FE CC	 	 	 	dec	ah	 	; вычитание из счетчика
6778	 EEC3  EB F3	 	 	 	jmp	short j29	; возврат к началу цикла
6779	 EEC5	 	 	 	j31:
6780	 EEC5  59	 	 	 	pop	cx	 	; восстановить состояние
6781	 EEC6  9D	 	 	 	popf
6782	 EEC7	 	 	 	j32:	 	 	 	; ошибка позиционирования
6783	 EEC7  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6784	 EEC8	 	 	 	seek	endp
6785	 	 	 	 	;-----------------------
6786	 	 	 	 	; dma_setup
6787	 	 	 	 	;   Программа установки ПДП для операций записи,считывания,верифи-
6788	 	 	 	 	; кации.
6789	 	 	 	 	;
6790	 	 	 	 	;   ВВОД
6791	 	 	 	 	;
6792	 	 	 	 	;	(AL) - байт режима для ПДП,
6793	 	 	 	 	;	(ES:BX) - адрес считывания/записи информации.
6794	 	 	 	 	;
6795	 	 	 	 	;------------------------
6796	 EEC8	 	 	 	dma_setup proc	near
6797	 EEC8  51	 	 	 	push	cx	 	; сохранить регистр
6798	 EEC9  E6 0C	 	 	 	out	dma+12,al
6799	 EECB  E6 0B	 	 	 	out	dma+11,al	; вывод байта состояния
6800	 EECD  8C C0	 	 	 	mov	ax,es	 	; получить значение ES
6801	 EECF  B1 04	 	 	 	mov	cl,4	 	; счетчик для сдвига
6802	 EED1  D3 C0	 	 	 	rol ax,cl	 	; циклический сдвиг влево
6803	 EED3  8A E8	 	 	 	mov	ch,al	 	;
6804	 EED5  24 F0	 	 	 	and	al,0f0h 	;
6805	 EED7  03 C3	 	 	 	add	ax,bx
6806	 EED9  73 02	 	 	 	jnc	j33
6807	 EEDB  FE C5	 	 	 	inc	ch	 	; перенос означает, что старшие 4 бита
6808	 	 	 	 	 	 	 	 	; должны быть прибавлены
6809	 EEDD	 	 	 	j33:
6810	 EEDD  50	 	 	 	push	ax	 	; сохранить начальный адрес
6811	 EEDE  E6 04	 	 	 	out	dma+4,al	; вывод младшей половины адреса
6812	 EEE0  8A C4	 	 	 	mov	al,ah
6813	 EEE2  E6 04	 	 	 	out	dma+4,al	; вывод старшей половины адреса
6814	 EEE4  8A C5	 	 	 	mov	al,ch	 	; получить 4 старших бита
6815	 EEE6  24 0F	 	 	 	and	al,0fh
6816	 EEE8  E6 81	 	 	 	out	081h,al   ; вывод 4 старших бит на регистр страниц
6817	 	 	 	 	
6818	 	 	 	 	;   Определение счетчика
6819	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-135
	 	 	 	 	 	 	 	09-15-88    


6820	 EEEA  8A E6	 	 	 	mov	ah,dh	 	; номер сектора
6821	 EEEC  2A C0	 	 	 	sub	al,al	 	;
6822	 EEEE  D1 E8	 	 	 	shr	ax,1	 	;
6823	 EEF0  50	 	 	 	push	ax
6824	 EEF1  BB 0006	 	 	 	mov	bx,6	 	; получить параметры байт/сектор
6825	 EEF4  E8 EE51 R	 	 	call	get_parm
6826	 EEF7  8A CC	 	 	 	mov	cl,ah	 	; счетчик сдига (0=128, 1=256 и т.д)
6827	 EEF9  58	 	 	 	pop	ax
6828	 EEFA  D3 E0	 	 	 	shl	ax,cl	 	; сдвиг
6829	 EEFC  48	 	 	 	dec	ax	 	; -1
6830	 EEFD  50	 	 	 	push	ax	 	; сохранить значение счетчика
6831	 EEFE  E6 05	 	 	 	out	dma+5,al	; вывести младший байт счетчика
6832	 EF00  8A C4	 	 	 	mov	al,ah
6833	 EF02  E6 05	 	 	 	out	dma+5,al	; вывести старший байт счетчика
6834	 EF04  59	 	 	 	pop	cx	 	; восстановить значение счетчика
6835	 EF05  58	 	 	 	pop	ax	 	; восстановить значение адреса
6836	 EF06  03 C1	 	 	 	add	ax,cx	 	; проверка заполнения 64K
6837	 EF08  59	 	 	 	pop	cx	 	; восстановить регистр
6838	 EF09  B0 02	 	 	 	mov	al,2	 	; режим для 8237
6839	 EF0B  E6 0A	 	 	 	out	dma+10,al	; инициализация канала НГМД
6840	 EF0D  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6841	 EF0E	 	 	 	dma_setup	endp
6842	 	 	 	 	;-----------------------
6843	 	 	 	 	;chk_stat_2
6844	 	 	 	 	;   Эта программа обрабатывает прерывания ,полученные после
6845	 	 	 	 	; рекалибровки, позиционирования или сброса адаптера. Прерывание
6846	 	 	 	 	; ожидается, принимается, обрабатывается и результат выдается программе,
6847	 	 	 	 	; вызвавшей прерывание.
6848	 	 	 	 	;
6849	 	 	 	 	;   ВЫВОД
6850	 	 	 	 	;	  CY=0 - успешно,
6851	 	 	 	 	;	  CY=1 - сбой (ошибка в состоянии НГМД),
6852	 	 	 	 	;--------------------------
6853	 EF0E	 	 	 	chk_stat_2 proc near
6854	 EF0E  E8 EF2F R	 	 	call	wait_int	; ожидание прерывания
6855	 EF11  72 14	 	 	 	jc	j34	 	; если ошибка, то возврат
6856	 EF13  B4 08	 	 	 	mov	ah,08h	 	; команда получения состояния
6857	 EF15  E8 E6A5 R	 	 	call	nec_output
6858	 EF18  E8 EF6B R	 	 	call	results 	; считать результаты
6859	 EF1B  72 0A	 	 	 	jc	j34
6860	 EF1D  A0 0042 R	 	 	mov	al,nec_status	; получить первый байт состояния
6861	 EF20  24 60	 	 	 	and	al,060h 	; выделить биты
6862	 EF22  3C 60	 	 	 	cmp	al,060h 	; проверка
6863	 EF24  74 02	 	 	 	jz	j35	   ; если ошибка, то идти на метку
6864	 EF26  F8	 	 	 	clc	 	 	; возврат
6865	 EF27	 	 	 	j34:
6866	 EF27  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6867	 EF28	 	 	 	j35:
6868	 EF28  80 0E 0041 R 40	 	 	or	diskette_status,bad_seek
6869	 EF2D  F9	 	 	 	stc	 	 	; ошибка в возвращенном коде
6870	 EF2E  C3	 	 	 	ret
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-136
	 	 	 	 	 	 	 	09-15-88    


6871	 EF2F	 	 	 	chk_stat_2	endp
6872	 	 	 	 	;---------------------------------
6873	 	 	 	 	; wait_int
6874	 	 	 	 	;   Эта программа ожидает прерывание, которое возникает во время
6875	 	 	 	 	; программы вывода. Если устройство не готово, ошибка может быть
6876	 	 	 	 	; возвращена.
6877	 	 	 	 	;
6878	 	 	 	 	;
6879	 	 	 	 	;   ВЫВОД
6880	 	 	 	 	;	      CY=0 - успешно,
6881	 	 	 	 	;	      CY=1 - сбой(состояние НГМД устанавливается),
6882	 	 	 	 	;-----------------------------------
6883	 EF2F	 	 	 	wait_int proc	near
6884	 EF2F  FB	 	 	 	sti	 	 	; установить признак разрешения прерывания
6885	 EF30  53	 	 	 	push	bx
6886	 EF31  51	 	 	 	push	cx	 	; сохранить регистр
6887	 EF32  B3 02	 	 	 	mov	bl,2	 	; количество циклов
6888	 EF34  33 C9	 	 	 	xor	cx,cx	 	; длителность одного цикла ожидания
6889	 EF36	 	 	 	j36:
6890	 EF36  F6 06 003E R 80	 	 	test	seek_status,int_flag  ; опрос наличия прерывания
6891	 EF3B  75 0C	 	 	 	jnz	j37
6892	 EF3D  E2 F7	 	 	 	loop	j36	 	; возврат к началу цикла
6893	 EF3F  FE CB	 	 	 	dec	bl
6894	 EF41  75 F3	 	 	 	jnz	j36
6895	 EF43  80 0E 0041 R 80	 	 	or	diskette_status,time_out
6896	 EF48  F9	 	 	 	stc	 	 	; возврат при ошибке
6897	 EF49	 	 	 	j37:
6898	 EF49  9C	 	 	 	pushf	 	 	; сохранить текущие признаки
6899	 EF4A  80 26 003E R 7F	 	 	and	seek_status,not int_flag
6900	 EF4F  9D	 	 	 	popf	 	 	; восстановить признаки
6901	 EF50  59	 	 	 	pop	cx
6902	 EF51  5B	 	 	 	pop	bx	 	; восстановить регистр
6903	 EF52  C3	 	 	 	ret	 	; возврат к программе, вызвавшей прерывание
6904	 EF53	 	 	 	wait_int	endp
6905	 	 	 	 	;---------------------------
6906	 	 	 	 	;disk_int
6907	 	 	 	 	;   Эта программа обрабатывает прерывания НГМД
6908	 	 	 	 	;
6909	 	 	 	 	;   ВЫВОД  - признак прерывания устанавливается в SEEK_STATUS.
6910	 	 	 	 	;---------------------------
6911	 EF57	 	 	 	 	org	0ef57h
6912	 EF57	 	 	 	disk_int proc	far
6913	 EF57  FB	 	 	 	sti	 	 	; установить признак разрешения прерывания
6914	 EF58  1E	 	 	 	push	ds
6915	 EF59  50	 	 	 	push	ax
6916	 EF5A  B8 0040	 	 	 	mov	ax,dat
6917	 EF5D  8E D8	 	 	 	mov	ds,ax
6918	 EF5F  80 0E 003E R 80	 	 	or	seek_status,int_flag
6919	 EF64  B0 20	 	 	 	mov	al,20h	 	; установить конец прерывания
6920	 EF66  E6 20	 	 	 	out	20h,al	 	; послать конец прерывания в порт
6921	 EF68  58	 	 	 	pop	ax
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-137
	 	 	 	 	 	 	 	09-15-88    


6922	 EF69  1F	 	 	 	pop	ds
6923	 EF6A  CF	 	 	 	iret	 	 	; возврат из прерывания
6924	 EF6B	 	 	 	disk_int	endp
6925	 	 	 	 	;----------------------------
6926	 	 	 	 	;
6927	 	 	 	 	;   Эта программа считывет все, что контроллер адаптера НГМД указывает
6928	 	 	 	 	; программе, следующей за прерыванием.
6929	 	 	 	 	;
6930	 	 	 	 	;
6931	 	 	 	 	;   ВЫВОД
6932	 	 	 	 	;	   CF=0 - успешно,
6933	 	 	 	 	;	   CF=1 - сбой
6934	 	 	 	 	;----------------------------
6935	 EF6B	 	 	 	results proc	near
6936	 EF6B  FC	 	 	 	cld
6937	 EF6C  BF 0042 R	 	 	mov	di,offset nec_status
6938	 EF6F  51	 	 	 	push	cx	 	; сохранить счетчик
6939	 EF70  52	 	 	 	push	dx
6940	 EF71  53	 	 	 	push	bx
6941	 EF72  B3 07	 	 	 	mov	bl,7	 	; установить длину области состояния
6942	 	 	 	 	
6943	 	 	 	 	
6944	 EF74	 	 	 	j38:
6945	 EF74  33 C9	 	 	 	xor	cx,cx	 	; длительность одного цикла
6946	 EF76  BA 03F4	 	 	 	mov	dx,03f4h	; адрес порта
6947	 EF79	 	 	 	j39:
6948	 EF79  EC	 	 	 	in	al,dx	 	; получить состояние
6949	 EF7A  A8 80	 	 	 	test	al,080h 	; готово ?
6950	 EF7C  75 0C	 	 	 	jnz	j40a
6951	 EF7E  E2 F9	 	 	 	loop	j39
6952	 EF80  80 0E 0041 R 80	 	 	or	diskette_status,time_out
6953	 EF85	 	 	 	j40:	 	 	 	; ошибка
6954	 EF85  F9	 	 	 	stc	 	 	; возврат по ошибке
6955	 EF86  5B	 	 	 	pop	bx
6956	 EF87  5A	 	 	 	pop	dx
6957	 EF88  59	 	 	 	pop	cx
6958	 EF89  C3	 	 	 	ret
6959	 	 	 	 	
6960	 	 	 	 	;   Проверка признака направления
6961	 	 	 	 	
6962	 EF8A  EC	 	 	j40a:	in	al,dx	 	; получить регистр состояния
6963	 EF8B  A8 40	 	 	 	test	al,040h 	; сбой позиционирования
6964	 EF8D  75 07	 	 	 	jnz	j42	; если все нормально, считать состояние
6965	 EF8F	 	 	 	j41:
6966	 EF8F  80 0E 0041 R 20	 	 	or	diskette_status,bad_nec
6967	 EF94  EB EF	 	 	 	jmp	short j40	; ошибка
6968	 	 	 	 	
6969	 	 	 	 	;   Считывание состояния
6970	 	 	 	 	
6971	 EF96	 	 	 	j42:
6972	 EF96  42	 	 	 	inc	dx	 	; указать порт
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-138
	 	 	 	 	 	 	 	09-15-88    


6973	 EF97  EC	 	 	 	in	al,dx	 	; ввести данные
6974	 EF98  88 05	 	 	 	mov    byte ptr [di],al  ; сохранить байт
6975	 EF9A  47	 	 	 	inc	di	 	; увеличить адрес
6976	 EF9B  B9 000A	 	 	 	mov	cx,000ah	; счетчик
6977	 EF9E  E2 FE	 	 	j43:	loop	j43
6978	 EFA0  4A	 	 	 	dec	dx
6979	 EFA1  EC	 	 	 	in	al,dx	 	; получить состояние
6980	 EFA2  A8 10	 	 	 	test	al,010h
6981	 EFA4  74 06	 	 	 	jz	j44
6982	 EFA6  FE CB	 	 	 	dec	bl	 	; -1 из количества циклов
6983	 EFA8  75 CA	 	 	 	jnz	j38
6984	 EFAA  EB E3	 	 	 	jmp	short j41	; сигнал неверен
6985	 	 	 	 	
6986	 EFAC	 	 	 	j44:
6987	 EFAC  5B	 	 	 	pop	bx	 	; восстановить регистры
6988	 EFAD  5A	 	 	 	pop	dx
6989	 EFAE  59	 	 	 	pop	cx
6990	 EFAF  C3	 	 	 	ret	 	 	; возврат из прерывания
6991	 EFB0	 	 	 	results endp
6992	 	 	 	 	;-----------------------------
6993	 	 	 	 	; num_trans
6994	 	 	 	 	;   Эта программа вычисляет количество секторов, которое действительно
6995	 	 	 	 	; было записано или считано с НГМД
6996	 	 	 	 	;
6997	 	 	 	 	;   ВВОД
6998	 	 	 	 	;	 (CH) - цилиндр,
6999	 	 	 	 	;	 (CL) - сектор.
7000	 	 	 	 	;
7001	 	 	 	 	;   ВЫВОД
7002	 	 	 	 	;	 (AL) - количество действительно переданных секторов.
7003	 	 	 	 	;
7004	 	 	 	 	;------------------------------
7005	 EFB0	 	 	 	num_trans proc	near
7006	 EFB0  A0 0045 R	 	 	mov	al,nec_status+3  ; получить последний цилиндр
7007	 EFB3  3A C5	 	 	 	cmp	al,ch	 	; сравнить со стартовым
7008	 EFB5  A0 0047 R	 	 	mov	al,nec_status+5  ; получить последний сектор
7009	 EFB8  74 0A	 	 	 	jz	j45
7010	 EFBA  BB 0008	 	 	 	mov	bx,8
7011	 EFBD  E8 EE51 R	 	 	call	get_parm	; получить значение EOT
7012	 EFC0  8A C4	 	 	 	mov	al,ah	 	; AH в AL
7013	 EFC2  FE C0	 	 	 	inc	al	 	; EOT+1
7014	 EFC4  2A C1	 	 	j45:	sub	al,cl	    ; вычисление стартового номера из конечного
7015	 EFC6  C3	 	 	 	ret
7016	 EFC7	 	 	 	num_trans endp
7017	 	 	 	 	
7018	 	 	 	 	;-------------------------------
7019	 	 	 	 	; disk_base
7020	 	 	 	 	;   Эта программа устанавливает параметры,требуемые для операций
7021	 	 	 	 	; НГМД.
7022	 	 	 	 	;--------------------------------
7023	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-139
	 	 	 	 	 	 	 	09-15-88    


7024	 EFC7	 	 	 	disk_base label byte
7025	 EFC7  CF	 	 	 	db	11001111b	;
7026	 EFC8  02	 	 	 	db	2	 	;
7027	 EFC9  25	 	 	 	db	motor_wait	;
7028	 EFCA  02	 	 	 	db	2	 	;
7029	 EFCB  08	 	 	 	db	8	 	;
7030	 EFCC  2A	 	 	 	db	02ah	 	;
7031	 EFCD  FF	 	 	 	db	0ffh	 	;
7032	 EFCE  50	 	 	 	db	050h	 	;
7033	 EFCF  F6	 	 	 	db	0f6h	 	;
7034	 EFD0  19	 	 	 	db	25	 	;
7035	 EFD1  04	 	 	 	db	4	 	;
7036	 	 	 	 	;--- int 17-------------------
7037	 	 	 	 	;   Программа связи с печатающим устройством
7038	 	 	 	 	;
7039	 	 	 	 	;   Эта программа выполняет три функции, код которых задается
7040	 	 	 	 	; в регистре AH:
7041	 	 	 	 	;   AH=0 - печать знака, заданного в регистре AL. Если в
7042	 	 	 	 	; результате выполнения функции знак не напечатается, то в регистре
7043	 	 	 	 	; AL устанавливается "1" (тайм-аут);
7044	 	 	 	 	;   AH=1 - инициализация порта печати. После выполнения функции
7045	 	 	 	 	; в регистре AH находится байт состояния печатающего устройства;
7046	 	 	 	 	;   AH=2H - считывание байта состояния печатающего устройства.
7047	 	 	 	 	;   В регистре DX необходимо задать ноль.
7048	 	 	 	 	;   Значение разрядов байта состояния печатающего устройства:
7049	 	 	 	 	;   0 - тайм-аут;
7050	 	 	 	 	;   3 - ошибка ввода-вывода;
7051	 	 	 	 	;   4 - выбран (SLCT);
7052	 	 	 	 	;   5 - конец бумаги (PE);
7053	 	 	 	 	;   6 - подтверждение;
7054	 	 	 	 	;   7 - занято.
7055	 	 	 	 	;------------------------------
7056	 	 	 	 	
7057	 	 	 	 	 	assume	cs:code,ds:data
7058	 EFD2	 	 	 	printer_io proc far
7059	 EFD2  FB	 	 	 	sti	 	 	; установить признак разрешения прерывания
7060	 EFD3  1E	 	 	 	push	ds	 	; сохранить сегмент
7061	 EFD4  52	 	 	 	push	dx
7062	 EFD5  56	 	 	 	push	si
7063	 EFD6  51	 	 	 	push	cx
7064	 EFD7  53	 	 	 	push	bx
7065	 EFD8  BE 0040	 	 	 	mov	si,dat
7066	 EFDB  8E DE	 	 	 	mov	ds,si	 	; установить сегмент
7067	 EFDD  8B F2	 	 	 	mov	si,dx
7068	 EFDF  D1 E6	 	 	 	shl	si,1
7069	 EFE1  8B 94 0008 R	 	 	mov	dx,printer_base[si]  ; получить базовый адрес
7070	 	 	 	 	 	 	 	 	     ; печатающего устройства
7071	 EFE5  0B D2	 	 	 	or	dx,dx	 	   ; печать подключена ?
7072	 EFE7  74 0C	 	 	 	jz	b1	 	   ; нет, возврат
7073	 EFE9  0A E4	 	 	 	or	ah,ah	 	   ; AH=0 ?
7074	 EFEB  74 0E	 	 	 	jz	b2	 	   ; да, переход к печати знака
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-140
	 	 	 	 	 	 	 	09-15-88    


7075	 EFED  FE CC	 	 	 	dec	ah	 	   ; AH=1 ?
7076	 EFEF  74 42	 	 	 	jz	b8	 	   ; да, переход к инициализации
7077	 EFF1  FE CC	 	 	 	dec	ah	 	   ; AH=2 ?
7078	 EFF3  74 2A	 	 	 	jz	b5	   ; да, переход к считыванию байта состояния
7079	 	 	 	 	
7080	 	 	 	 	;    Выход из программы
7081	 	 	 	 	
7082	 EFF5	 	 	 	b1:
7083	 EFF5  5B	 	 	 	pop	bx	 	; восстановить регистры
7084	 EFF6  59	 	 	 	pop	cx
7085	 EFF7  5E	 	 	 	pop	si
7086	 EFF8  5A	 	 	 	pop	dx
7087	 EFF9  1F	 	 	 	pop	ds
7088	 EFFA  CF	 	 	 	iret
7089	 	 	 	 	
7090	 	 	 	 	;   Печать знака, заданного в AL
7091	 	 	 	 	
7092	 EFFB	 	 	 	b2:
7093	 EFFB  50	 	 	 	push	ax
7094	 EFFC  B3 0A	 	 	 	mov	bl,10	 	; количество циклов ожидания
7095	 EFFE  33 C9	 	 	 	xor	cx,cx	 	; длительность одного цикла
7096	 F000  EE	 	 	 	out	dx,al	 	; вывести символ в порт
7097	 F001  42	 	 	 	inc	dx	 	; -1 из адреса порта
7098	 F002	 	 	 	b3:	 	 	 	; ожидание BUSY
7099	 F002  EC	 	 	 	in	al,dx	 	; получить состояние
7100	 F003  8A E0	 	 	 	mov	ah,al	 	; переслать состояние в AH
7101	 F005  A8 80	 	 	 	test	al,80h	 	; печать занята ?
7102	 F007  75 0E	 	 	 	jnz	b4	 	; переход, если да
7103	 F009  E2 F7	 	 	 	loop	b3	 	; цикл ожидания закончился ?
7104	 F00B  FE CB	 	 	 	dec	bl	 	; да, -1 из количества циклов
7105	 F00D  75 F3	 	 	 	jnz	b3	 	; время ожидания истекло ?
7106	 F00F  80 CC 01	 	 	 	or	ah,1	 	; да, уст бит "тайм-аут"
7107	 F012  80 E4 F9	 	 	 	and	ah,0f9h 	;
7108	 F015  EB 14	 	 	 	jmp	short b7
7109	 F017	 	 	 	b4:	 	 	 	; OUT_STROBE
7110	 F017  B0 0D	 	 	 	mov	al,0dh	 	; установить высокий строб
7111	 F019  42	 	 	 	inc	dx	; стробирование битом 0 порта C для 8255
7112	 F01A  EE	 	 	 	out	dx,al
7113	 F01B  B0 0C	 	 	 	mov	al,0ch	 	; установить низкий строб
7114	 F01D  EE	 	 	 	out	dx,al
7115	 F01E  58	 	 	 	pop	ax	 	;
7116	 	 	 	 	
7117	 	 	 	 	;   Считывание байта состояния печатающего устройства
7118	 	 	 	 	
7119	 F01F	 	 	 	b5:
7120	 F01F  50	 	 	 	push	ax	 	; сохранить регистр
7121	 F020	 	 	 	b6:
7122	 F020  8B 94 0008 R	 	 	mov	dx,printer_base[si]  ; получить адрес печати
7123	 F024  42	 	 	 	inc	dx
7124	 F025  EC	 	 	 	in	al,dx	 	; получить состояние печати
7125	 F026  8A E0	 	 	 	mov	ah,al
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-141
	 	 	 	 	 	 	 	09-15-88    


7126	 F028  80 E4 F8	 	 	 	and	ah,0f8h
7127	 F02B	 	 	 	b7:
7128	 F02B  5A	 	 	 	pop	dx
7129	 F02C  8A C2	 	 	 	mov	al,dl
7130	 F02E  80 F4 48	 	 	 	xor	ah,48h
7131	 F031  EB C2	 	 	 	jmp	short b1	; к выходу из программы
7132	 	 	 	 	
7133	 	 	 	 	;   Инициализация порта печатающего устройства
7134	 	 	 	 	
7135	 F033	 	 	 	b8:
7136	 F033  50	 	 	 	push	ax
7137	 F034  83 C2 02	 	 	 	add	dx,2	 	; указать порт
7138	 F037  B0 08	 	 	 	mov	al,8
7139	 F039  EE	 	 	 	out	dx,al
7140	 F03A  B8 03E8	 	 	 	mov	ax,1000 	 ; время задержки
7141	 F03D	 	 	 	b9:
7142	 F03D  48	 	 	 	dec	ax	 	 ; цикл задержки
7143	 F03E  75 FD	 	 	 	jnz	b9
7144	 F040  B0 0C	 	 	 	mov	al,0ch
7145	 F042  EE	 	 	 	out	dx,al
7146	 F043  EB DB	 	 	 	jmp	short b6    ; переход к считыванию байта состояния
7147	 F045	 	 	 	printer_io	endp
7148	 	 	 	 	;--- int 10------------------
7149	 	 	 	 	;
7150	 	 	 	 	;   Программа обработки прерывания ЭЛИ
7151	 	 	 	 	;
7152	 	 	 	 	;   Эта программа обеспечивает выполнение функций обслуживания
7153	 	 	 	 	; адаптера ЭЛИ, код которых задается в регистре AH:
7154	 	 	 	 	;
7155	 	 	 	 	;    AH=0   - установить режим работы адаптера ЭЛИ. В результате
7156	 	 	 	 	; выполнения функции в регистре AL могут устанавливаться следу-
7157	 	 	 	 	; ющие режимы:
7158	 	 	 	 	;    0 - 40х25, черно-белый, алфавитно-цифровой;
7159	 	 	 	 	;    1 - 40х25, цветной, алфавитно-цифровой;
7160	 	 	 	 	;    2 - 80х25, черно-белый, алфавитно-цифровой;
7161	 	 	 	 	;    3 - 80х25, цветной, алфавитно-цифровой;
7162	 	 	 	 	;    4 - 320х200, цветной, графический;
7163	 	 	 	 	;    5 - 320х200, черно-белый, графический;
7164	 	 	 	 	;    6 - 640х200, черно-белый, графический;
7165	 	 	 	 	;    7 - 80х25, черно-белый, алфавитно-цифровой.
7166	 	 	 	 	;    Режимы 0 - 6 используются для ЭМ адаптера ЭЛИ, режим 7
7167	 	 	 	 	; используется для монохромного черно-белого 80х25 адаптера.
7168	 	 	 	 	;
7169	 	 	 	 	;    AH=1   - установить размер курсора. Функция задает размер кур-
7170	 	 	 	 	; сора и управление им.
7171	 	 	 	 	;   Разряды 0 - 4 регистра CL определяют конечную границу курсора,
7172	 	 	 	 	; разряды 0 - 4 регистра CH - начальную границу курсора.
7173	 	 	 	 	;    Разряды 6 и 5 задают управление курсором:
7174	 	 	 	 	;    00 - курсор мерцает с частотой, задаваемой аппаратурно;
7175	 	 	 	 	;    01 - курсор отсутствует.
7176	 	 	 	 	;    Аппаратурно всегда вызывается мерцание курсора с частотой,
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-142
	 	 	 	 	 	 	 	09-15-88    


7177	 	 	 	 	; равной 1/16 частоты кадровой развертки.
7178	 	 	 	 	;
7179	 	 	 	 	;    AH=2   - установить текущую позицию курсора. Для выполнения
7180	 	 	 	 	; функции необходимо задать следующие координаты курсора:
7181	 	 	 	 	;    BH - страница;
7182	 	 	 	 	;    DX - строка и колонка.
7183	 	 	 	 	; При графическом режиме регистр BH=0.
7184	 	 	 	 	;
7185	 	 	 	 	;    AH=3   - считать текущее положение курсора. Функция вос-
7186	 	 	 	 	; станавливает текущее положение курсора. Перед выполнением
7187	 	 	 	 	; функции в регистре BH необходимо задать страницу.
7188	 	 	 	 	;    После выполнения программы регистры содержат следующую
7189	 	 	 	 	; информацию:
7190	 	 	 	 	;    DH - строка;
7191	 	 	 	 	;    DL - колонка;
7192	 	 	 	 	;    CX - размер курсора и управление им.
7193	 	 	 	 	;
7194	 	 	 	 	;    AH=5  - установить активную страницу буфера адаптера.
7195	 	 	 	 	; Функция используется только в алфавитно-цифровом режиме.
7196	 	 	 	 	; Для ее выполнения необходимо в регистре AL задать страницу:
7197	 	 	 	 	;    0-7 - для режимов 0 и 1;
7198	 	 	 	 	;    0-3 - для режимов 2 и 3.
7199	 	 	 	 	;    Значения режимов те же, что и для функции AH=0.
7200	 	 	 	 	;
7201	 	 	 	 	;    AH=6   - переместить блок символов вверх по экрану.
7202	 	 	 	 	; Функция перемещает символы в пределах заданной области вверх
7203	 	 	 	 	; по экрану, заполняя нижние строки пробелами с заданным атрибу-
7204	 	 	 	 	; том.
7205	 	 	 	 	;    Для выполнения функции необходимо задать следующие пара-
7206	 	 	 	 	; метры;
7207	 	 	 	 	;    AL - количество перемещаемых строк. Для очистки блока AL=0;
7208	 	 	 	 	;    CX - координаты левого верхнего угла блока (строка,колонка);
7209	 	 	 	 	;    DX - координаты правого нижнего угла блока;
7210	 	 	 	 	;    BH - атрибут символа пробела.
7211	 	 	 	 	;
7212	 	 	 	 	;    AH=7   - переместить блок символов вниз. Функция перемещает
7213	 	 	 	 	; символы в пределах заданной области вниз по экрану, заполняя
7214	 	 	 	 	; верхние строки пробелами с заданным атрибутом.
7215	 	 	 	 	;    Для выполнения функции необходимо задать те же параметры,
7216	 	 	 	 	; что и для функции AH=6H.
7217	 	 	 	 	;
7218	 	 	 	 	;    AH=8   - считать атрибут и код символа, находящегося в теку-
7219	 	 	 	 	; щей позиции курсора. Функция считывает атрибут и код символа
7220	 	 	 	 	; и помещает их в регистр AX (AL - код символа, AH - атрибут
7221	 	 	 	 	; символа).
7222	 	 	 	 	;    Для выполнения функции необходимо в регистре BH задать
7223	 	 	 	 	; страницу (только для алфавитно-цифрового режима).
7224	 	 	 	 	;
7225	 	 	 	 	;    AH=9   - записать атрибут и код символа в текущую позицию
7226	 	 	 	 	; курсора. Функция помещает код символа и его атрибут в текущую
7227	 	 	 	 	; позицию курсора.
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-143
	 	 	 	 	 	 	 	09-15-88    


7228	 	 	 	 	;    Для выполнения функции необходимо задать следующие параметры:
7229	 	 	 	 	;    BH - отображаемая страница (только для алфавитно-цифрового
7230	 	 	 	 	; режима;
7231	 	 	 	 	;    CX - количество записываемых символов;
7232	 	 	 	 	;    AL - код символа;
7233	 	 	 	 	;    BL - атрибут символа для алфавитно-цифрового режима или
7234	 	 	 	 	; цвет знака для графики. При записи точки разряд 7 регистра BL=1.    =1
7235	 	 	 	 	;
7236	 	 	 	 	;    AH=10 - записать символ в текущую позицию курсора. Атрибут
7237	 	 	 	 	; не изменяется.
7238	 	 	 	 	;    Для выполнения функции необходимо задать следующие параметры:
7239	 	 	 	 	;    BH - отображаемая страница (только для алфавитно-цифрового
7240	 	 	 	 	; режима);
7241	 	 	 	 	;    CX - количество повторений символа;
7242	 	 	 	 	;    AL - код записываемого символа.	 	 	 	      ся
7243	 	 	 	 	;	 	 	 	 	 	 	 	      -
7244	 	 	 	 	;    AH=11 - установить цветовую палитру.	 	 	      ь
7245	 	 	 	 	;    При выполнении функции используются два варианта.
7246	 	 	 	 	;    Для первого варианта в регистре BH задается ноль,а в регистре
7247	 	 	 	 	; BL - значения пяти младших разрядов, используемых для выбора
7248	 	 	 	 	; цветовой палитры (цвет заднего плана для цветного графического
7249	 	 	 	 	; режима 320х200 или цвет каймы для цветного графического режима
7250	 	 	 	 	; 40х25).
7251	 	 	 	 	;    Для второго варианта в регистре BH задается "1", а в регистре
7252	 	 	 	 	; BL - номер цветовой палитры (0 или 1).
7253	 	 	 	 	;    Палитра 0 состоит из зеленого (1), красного (2) и желтого (3)
7254	 	 	 	 	; цветов, палитра 1 - из голубого (1), фиолетового (2) и белого (3).
7255	 	 	 	 	; При работе с видеомонитором цвета палитры заменяются соответству-
7256	 	 	 	 	; ющими градациями цвета.
7257	 	 	 	 	;    Результатом выполнения функции является установка цветовой       )
7258	 	 	 	 	; палитры в регистре выбора цвета (3D9).
7259	 	 	 	 	;
7260	 	 	 	 	;    AH=12  - записать точку. Функция определяет относительный
7261	 	 	 	 	; адрес байта внутри буфера ЭЛИ, по которому должна быть записана
7262	 	 	 	 	; точка с заданными координатами.
7263	 	 	 	 	;    Для выполнения функции необходимо задать следующие параметры:    ,
7264	 	 	 	 	;    DX - строка;
7265	 	 	 	 	;    CX - колонка;
7266	 	 	 	 	;    AL - цвет выводимой точки. Если разряд 7 регистра AL уста-       3)
7267	 	 	 	 	; новлен в "1", то выполняется операция XOR над значением точки
7268	 	 	 	 	; из буфера и значением точки из регистра AL.
7269	 	 	 	 	;
7270	 	 	 	 	;    AH=13 - считать точку. Функция определяет относительный
7271	 	 	 	 	; адрес байта внутри буфера ЭЛИ, по которому должна быть считана
7272	 	 	 	 	; точка с заданными координатами.
7273	 	 	 	 	;    Перед выполнением программы в регистрах задаются те же парамет-
7274	 	 	 	 	; ры, что и для функции AH=12.
7275	 	 	 	 	;   После выполнения программы в регистре AL находится значение
7276	 	 	 	 	; считанной точки.
7277	 	 	 	 	;
7278	 	 	 	 	;    AH=14 - записать телетайп. Функция выводит символ в буфер
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-144
	 	 	 	 	 	 	 	09-15-88    


7279	 	 	 	 	; ЭЛИ с одновременной установкой позиции курсора и передвижением
7280	 	 	 	 	; курсора на экране.
7281	 	 	 	 	;    После записи символа в последнюю позицию строки выполняется
7282	 	 	 	 	; автоматический переход на новую строку. Если страница экрана
7283	 	 	 	 	; заполнена, выполняется перемещение на одну строку вверх. Осво-
7284	 	 	 	 	; бодившаяся строка заполняется значением атрибута символа для
7285	 	 	 	 	; алфавитно-цифрового режима или нулями - для графики.
7286	 	 	 	 	;    После записи очередного символа курсор устанавливается
7287	 	 	 	 	; в следующую позицию.
7288	 	 	 	 	;    Для выполнения программы необходимо задать следующие параметры:
7289	 	 	 	 	;    AL - код выводимого символа;
7290	 	 	 	 	;    BL - цвет переднего плана (для графического режима).
7291	 	 	 	 	;    Программа обрабатывает следующие служебные символы:
7292	 	 	 	 	;    0BH - сдвиг курсора на одну позицию (без очистки);
7293	 	 	 	 	;    0DH - перемещение курсора в начало строки;
7294	 	 	 	 	;    0AH - перемещение курсора на следующую строку;
7295	 	 	 	 	;    07H - звуковой сигнал.
7296	 	 	 	 	;
7297	 	 	 	 	;    AH=15 - получить текущее состояние ЭЛИ. Функция считывает
7298	 	 	 	 	; текущее состояние ЭЛИ из памяти и размещает его в следующих
7299	 	 	 	 	; регистрах;
7300	 	 	 	 	;    AH - количество колонок (40 или 80);
7301	 	 	 	 	;    AL - текущий режим (0-7). Значения режимов те же, что и для
7302	 	 	 	 	; функции AH=0;
7303	 	 	 	 	;    BH - номер активной страницы.
7304	 	 	 	 	;
7305	 	 	 	 	;   AH=17 - загрузить знакогенератор пользователя. Функция дает
7306	 	 	 	 	; возможность пользователю загружать знакогенератор любым, необ-
7307	 	 	 	 	; ходимым ему алфавитом.
7308	 	 	 	 	;    Для выполнения программы необходимо задать следующие параметры:
7309	 	 	 	 	;    ES:BP - адрес таблицы, сформированной пользователем;
7310	 	 	 	 	;    CX    - количество передаваемых символов;
7311	 	 	 	 	;    BL    - код символа, начиная с которого загружается таблица
7312	 	 	 	 	; пользователя;
7313	 	 	 	 	;    BH - количество байт на знакоместо;
7314	 	 	 	 	;    DL - идентификатор таблицы пользователя;
7315	 	 	 	 	;    AL - режим:
7316	 	 	 	 	;	 	  AL=0	 -  загрузить знакогенератор
7317	 	 	 	 	;	 	  AL=1	 -  выдать идентификатор таблицы
7318	 	 	 	 	;	 	  AL=3	 -  загрузить вторую половину знакогенератора:
7319	 	 	 	 	;	 	 	    BL=0 - загрузить вторую половину знакогене
7320	 	 	 	 	;	 	 	    ратора из ПЗУ кодовой таблицы с русским
7321	 	 	 	 	;	 	 	    алфавитом,
7322	 	 	 	 	;	 	 	    BL=1 - загрузить вторую половину знакогене
7323	 	 	 	 	;	 	 	    ратора из ПЗУ стандартной кодовой таблицей
7324	 	 	 	 	;	 	 	    ASCII (USA)
7325	 	 	 	 	;   На выходе:
7326	 	 	 	 	;	AH   -	количество байт на знакоместо
7327	 	 	 	 	;	AL   -	идентификатор таблицы пользователя
7328	 	 	 	 	;	CF=1   -   операция завершена успешно
7329	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-145
	 	 	 	 	 	 	 	09-15-88    


7330	 	 	 	 	;    AH=19 - переслать цепочку символов. Функция позволяет пере-
7331	 	 	 	 	; сылать символы четырьмя способами, тип которых задается в
7332	 	 	 	 	; регистре AL:
7333	 	 	 	 	;    AL=0 - символ, символ, символ, ...
7334	 	 	 	 	; В регистре BL задается атрибут, курсор не движется;
7335	 	 	 	 	;    AL=1 - символ, символ, символ, ...
7336	 	 	 	 	; В регистре BL задается атрибут, курсор движется;
7337	 	 	 	 	;    AL=2H - символ, атрибут, символ, атрибут, ...
7338	 	 	 	 	; Курсор не движется;
7339	 	 	 	 	;    AL=3H - символ, атрибут, символ, атрибут, ...
7340	 	 	 	 	; Курсор движется.
7341	 	 	 	 	;     Кроме того необходимо задать в регистрах:
7342	 	 	 	 	;    ES:BP - начальный адрес цепочки символов;
7343	 	 	 	 	;    CX    - количество символов;
7344	 	 	 	 	;    DH,DL - строку и колонку для начала записи;
7345	 	 	 	 	;    BH    - номер страницы.
7346	 	 	 	 	;-----------------------------------------------------------
7347	 	 	 	 	
7348	 	 	 	 	 	assume cs:code,ds:data,es:video_ram
7349	 	 	 	 	
7350	 F045	 	 	 	m1	label	word	 	; таблица функций адаптера ЭЛИ
7351	 F045  F111 R	 	 	 	dw	offset	set_mode
7352	 F047  F1E5 R	 	 	 	dw	offset	set_ctype
7353	 F049  F206 R	 	 	 	dw	offset	set_cpos
7354	 F04B  F230 R	 	 	 	dw	offset	read_cursor
7355	 F04D  F93F R	 	 	 	dw	offset	read_lpen1
7356	 F04F  F247 R	 	 	 	dw	offset	act_disp_page
7357	 F051  F2B4 R	 	 	 	dw	offset	scroll_up
7358	 F053  F359 R	 	 	 	dw	offset	scroll_down
7359	 F055  F395 R	 	 	 	dw	offset	read_ac_current
7360	 F057  F3DB R	 	 	 	dw	offset	write_ac_current
7361	 F059  F40E R	 	 	 	dw	offset	write_c_current
7362	 F05B  F26B R	 	 	 	dw	offset	set_color
7363	 F05D  F450 R	 	 	 	dw	offset	write_dot
7364	 F05F  F43F R	 	 	 	dw	offset	read_dot
7365	 F061  D3AD R	 	 	 	dw	offset	write_tty
7366	 F063  F291 R	 	 	 	dw	offset	video_state
7367	 F065  F1DC R	 	 	 	dw	video_return
7368	 F067  D430 R	 	 	 	dw	offset ah12
7369	 F069  F1DC R	 	 	 	dw	offset video_return
7370	 F06B  C861 R	 	 	 	dw	ah13
7371	 = 0028	 	 	 	m1l	equ	28h
7372	 	 	 	 	
7373	 F06D	 	 	 	video_io proc	near
7374	 F06D  FB	 	 	 	sti	 	    ; установить признак разрешения прерывания
7375	 F06E  FC	 	 	 	cld
7376	 F06F  06	 	 	 	push	es
7377	 F070  1E	 	 	 	push	ds
7378	 F071  52	 	 	 	push	dx
7379	 F072  51	 	 	 	push	cx
7380	 F073  53	 	 	 	push	bx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-146
	 	 	 	 	 	 	 	09-15-88    


7381	 F074  56	 	 	 	push	si
7382	 F075  57	 	 	 	push	di
7383	 F076  55	 	 	 	push	bp
7384	 F077  50	 	 	 	push	ax	 	; сохранить значение AX
7385	 F078  8A C4	 	 	 	mov	al,ah	 	; переслать AH в AL
7386	 F07A  32 E4	 	 	 	xor	ah,ah	 	; обнулить старший байт
7387	 F07C  D1 E0	 	 	 	sal	ax,1	 	; умножить на 2
7388	 F07E  8B F0	 	 	 	mov	si,ax	 	; поместить в SI
7389	 F080  3D 0028	 	 	 	cmp	ax,m1l	 	; проверка длины таблицы функций
7390	 F083  72 04	 	 	 	jb	m2	 	; адаптера ЭЛИ
7391	 F085  58	 	 	 	pop	ax	 	; восстановить AX
7392	 F086  E9 F1DC R	 	 	jmp	video_return	; выход, если AX неверно
7393	 F089  B8 0040	 	 	m2:	mov	ax,dat
7394	 F08C  8E D8	 	 	 	mov	ds,ax
7395	 F08E  B8 B800	 	 	 	mov	ax,0b800h	; сегмент для цветного адаптера
7396	 F091  8B 3E 0010 R	 	 	mov	di,equip_flag	; получить тип адаптера
7397	 F095  81 E7 0030	 	 	and	di,30h	 	; выделить биты режима
7398	 F099  83 FF 30	 	 	 	cmp	di,30h	 	; есть установка ч/б адаптера ?
7399	 F09C  75 03	 	 	 	jne	m3
7400	 F09E  B8 B000	 	 	 	mov	ax,0b000h	; уст адреса буфера для ч/б адаптера
7401	 F0A1  8E C0	 	 	m3:	mov	es,ax
7402	 F0A3  58	 	 	 	pop	ax	 	; восстановить значение
7403	 F0A4  80 FC 10	 	 	 	cmp	ah,10h
7404	 F0A7  72 07	 	 	 	jb	mm3
7405	 F0A9  55	 	 	 	push	bp
7406	 F0AA  8B EC	 	 	 	mov	bp,sp
7407	 F0AC  8E 46 10	 	 	 	mov	es,[bp+10h]
7408	 F0AF  5D	 	 	 	pop	bp
7409	 F0B0	 	 	 	mm3:
7410	 F0B0  8A 26 0049 R	 	 	mov	ah,crt_mode	; получить текущий режим в AH
7411	 F0B4  2E: FF A4 F045 R	 	 	jmp   cs:[si+offset m1]
7412	 F0B9	 	 	 	video_io	endp
7413	 	 	 	 	;-------------------------
7414	 	 	 	 	; set mode
7415	 	 	 	 	
7416	 	 	 	 	;   Эта программа устанавливает режим работы адаптера ЭЛИ
7417	 	 	 	 	;
7418	 	 	 	 	;   ВХОД
7419	 	 	 	 	;	   (AL) - содержит значение режима.
7420	 	 	 	 	;
7421	 	 	 	 	;--------------------------
7422	 	 	 	 	
7423	 	 	 	 	;   Таблицы параметров ЭЛИ
7424	 	 	 	 	
7425	 F0B9	 	 	 	video_parms label	byte
7426	 	 	 	 	
7427	 	 	 	 	;   Таблица инициализации
7428	 	 	 	 	
7429	 F0B9  38 28 2D 0A 1F 06	 	db	38h,28h,2dh,0ah,1fh,6,19h   ; уст для 40х25
7430	       19	 	 	
7431	 F0C0  1C 02 07 06 07	 	 	db	1ch,2,7,6,7
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-147
	 	 	 	 	 	 	 	09-15-88    


7432	 F0C5  00 00 00 00	 	 	db	0,0,0,0
7433	 = 0010	 	 	 	m4	equ	10h
7434	 	 	 	 	
7435	 F0C9  71 50 5A 0A 1F 06	 	db	71h,50h,5ah,0ah,1fh,6,19h   ; уст для 80х25
7436	       19	 	 	
7437	 F0D0  1C 02 07 06 07	 	 	db	1ch,2,7,6,7
7438	 F0D5  00 00 00 00	 	 	db	0,0,0,0
7439	 	 	 	 	
7440	 F0D9  38 28 2D 0A 7F 06	 	db	38h,28h,2dh,0ah,7fh,6,64h   ; уст для графики
7441	       64	 	 	
7442	 F0E0  70 02 01 06 07	 	 	db	70h,2,1,6,7
7443	 F0E5  00 00 00 00	 	 	db	0,0,0,0
7444	 	 	 	 	
7445	 F0E9  62 50 50 0F 19 06	 	db	62h,50h,50h,0fh,19h,6,19h   ; уст для 80х25 ч/б адаптера
7446	       19	 	 	
7447	 F0F0  19 02 0D 0B 0C	 	 	db	19h,2,0dh,0bh,0ch
7448	 F0F5  00 00 00 00	 	 	db	0,0,0,0
7449	 	 	 	 	
7450	 F0F9	 	 	 	m5	label	word	 	; таблица для восстановления длины
7451	 F0F9  0800	 	 	 	dw	2048
7452	 F0FB  1000	 	 	 	dw	4096
7453	 F0FD  4000	 	 	 	dw	16384
7454	 F0FF  4000	 	 	 	dw	16384
7455	 	 	 	 	
7456	 	 	 	 	;   Колонки
7457	 F101	 	 	 	m6	label	byte
7458	 F101  28 28 50 50 28 28	 	db	40,40,80,80,40,40,80,80
7459	       50 50	 	 	
7460	 	 	 	 	
7461	 	 	 	 	;--- c_reg_tab
7462	 F109	 	 	 	m7	label	byte	 	; таблица установки режима
7463	 F109  2C 28 2D 29 2A 2E	 	db	2ch,28h,2dh,29h,2ah,2eh,1eh,29h
7464	       1E 29	 	 	
7465	 	 	 	 	
7466	 F111	 	 	 	set_mode proc	near
7467	 F111  BA 03D4	 	 	 	mov	dx,03d4h	; адрес цветного адаптера
7468	 F114  B3 00	 	 	 	mov	bl,0	 ; уст значение для цветного адаптера
7469	 F116  83 FF 30	 	 	 	cmp	di,30h	 	; установлен ч/б адаптер ?
7470	 F119  75 07	 	 	 	jne	m8	 	; переход, если указан цветной
7471	 F11B  B0 07	 	 	 	mov	al,7	 	; указать ч/б режим
7472	 F11D  BA 03B4	 	 	 	mov	dx,03b4h	; адрес для ч/б адаптера
7473	 F120  FE C3	 	 	 	inc	bl	 	; установить режим для ч/б адаптера
7474	 F122  8A E0	 	 	m8:	mov	ah,al	 	; сохранить режим в AH
7475	 F124  A2 0049 R	 	 	mov	crt_mode,al
7476	 F127  89 16 0063 R	 	 	mov	addr_6845,dx	; сохранить адрес управляющего порта
7477	 	 	 	 	 	 	 	 	; для активного дисплея
7478	 F12B  1E	 	 	 	push	ds
7479	 F12C  50	 	 	 	push	ax	 	; сохранить режим
7480	 F12D  52	 	 	 	push	dx	 	; сохранить значение порта вывода
7481	 F12E  83 C2 04	 	 	 	add	dx,4	 	; указать адрес регистра управления
7482	 F131  8A C3	 	 	 	mov	al,bl	 	; получить режим для адаптера
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-148
	 	 	 	 	 	 	 	09-15-88    


7483	 F133  EE	 	 	 	out	dx,al	 	; сброс экрана
7484	 F134  5A	 	 	 	pop	dx	 	; восстановить DX
7485	 F135  2B C0	 	 	 	sub	ax,ax
7486	 F137  8E D8	 	 	 	mov	ds,ax	 	; установить адрес таблицы векторов
7487	 	 	 	 	 	assume	ds:abs0
7488	 F139  C5 1E 0074 R	 	 	lds	bx,parm_ptr ; получить значение параметров адаптера ЭЛИ
7489	 F13D  58	 	 	 	pop	ax	 	; восстановить AX
7490	 	 	 	 	 	assume	ds:code
7491	 F13E  B9 0010	 	 	 	mov	cx,m4	   ; установить длину таблицы параметров
7492	 F141  80 FC 02	 	 	 	cmp	ah,2	 	; определение режима
7493	 F144  72 10	 	 	 	jc	m9	 	; режим 0 или 1 ?
7494	 F146  03 D9	 	 	 	add	bx,cx	 	; уст начало таблицы параметров
7495	 F148  80 FC 04	 	 	 	cmp	ah,4
7496	 F14B  72 09	 	 	 	jc	m9	 	; режим 2 или 3
7497	 F14D  03 D9	 	 	 	add	bx,cx	 	; начало таблицы для графики
7498	 F14F  80 FC 07	 	 	 	cmp	ah,7
7499	 F152  72 02	 	 	 	jc	m9	 	; режимы 4, 5 или 6 ?
7500	 F154  03 D9	 	 	 	add	bx,cx	 	; уст начало таблицы для ч/б адаптера
7501	 	 	 	 	
7502	 	 	 	 	;   BX указывает на строку таблицы инициализации
7503	 	 	 	 	
7504	 F156	 	 	 	m9:	 	 	 	; OUT_INIT
7505	 F156  50	 	 	 	push	ax	 	; сохранить режим в AH
7506	 F157  32 E4	 	 	 	xor	ah,ah	 	;
7507	 	 	 	 	
7508	 	 	 	 	;   Цикл таблицы, устанавливающий адреса регистров и выводящий значения
7509	 	 	 	 	; из таблицы
7510	 	 	 	 	
7511	 F159	 	 	 	m10:
7512	 F159  8A C4	 	 	 	mov	al,ah	 	;
7513	 F15B  EE	 	 	 	out	dx,al
7514	 F15C  42	 	 	 	inc	dx	 	; указать адрес порта
7515	 F15D  FE C4	 	 	 	inc	ah	 	;
7516	 F15F  8A 07	 	 	 	mov	al,byte ptr [bx]   ; получить значение таблицы
7517	 F161  EE	 	 	 	out	dx,al	 	; послать строку из таблицы в порт
7518	 F162  43	 	 	 	inc	bx	 	; +1 к адресу таблицы
7519	 F163  4A	 	 	 	dec	dx	 	; -1 из адреса порта
7520	 F164  E2 F3	 	 	 	loop	m10	 	; передана вся таблица ?
7521	 F166  58	 	 	 	pop	ax	 	; вернуть режимы
7522	 F167  1F	 	 	 	pop	ds	 	; вернуть сегмент
7523	 	 	 	 	 	assume	ds:data
7524	 	 	 	 	
7525	 	 	 	 	;   Инициализация буфера дисплея
7526	 	 	 	 	
7527	 F168  33 FF	 	 	 	xor	di,di	 	; DI=0
7528	 F16A  89 3E 004E R	 	 	mov	crt_start,di	; сохранить начальный адрес
7529	 F16E  C6 06 0062 R 00	 	 	mov	active_page,0	; установить активную страницу
7530	 F173  B9 2000	 	 	 	mov	cx,8192 	; количество слов в цветном адаптере
7531	 F176  80 FC 04	 	 	 	cmp	ah,4	 	; опрос графики
7532	 F179  72 0C	 	 	 	jc	m12	 	; нет инициализации графики
7533	 F17B  80 FC 07	 	 	 	cmp	ah,7	 	; опрос ч/б адаптера
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-149
	 	 	 	 	 	 	 	09-15-88    


7534	 F17E  74 04	 	 	 	je	m11	 	; инициализация ч/б адаптера
7535	 F180  33 C0	 	 	 	xor	ax,ax	 	; для графического режима
7536	 F182  EB 06	 	 	 	jmp	short m13	; очистить буфер
7537	 F184	 	 	 	m11:	 	 	 	; инициализация ч/б адаптера
7538	 F184  B9 0800	 	 	 	mov	cx,2048 	; об'ем буфера ч/б адаптера
7539	 F187	 	 	 	m12:
7540	 F187  B8 0720	 	 	 	mov	ax,' '+7*256    ; заполнить характеристики для альфа
7541	 F18A	 	 	 	m13:	 	 	 	; очистить буфер
7542	 F18A  F3/ AB	 	 	 	rep	stosw	 	; заполнить область буфера пробелами
7543	 	 	 	 	
7544	 	 	 	 	;   Формирование порта управления режимом
7545	 	 	 	 	
7546	 F18C  C7 06 0060 R 0607	 	mov	cursor_mode,607h   ; установить режим текущего курсора
7547	 F192  A0 0049 R	 	 	mov	al,crt_mode	; получить режим в регистре AX
7548	 F195  32 E4	 	 	 	xor	ah,ah
7549	 F197  8B F0	 	 	 	mov	si,ax	 	; таблица указателей режима
7550	 F199  8B 16 0063 R	 	 	mov	dx,addr_6845	; подготовить адрес порта для вывода
7551	 F19D  83 C2 04	 	 	 	add	dx,4
7552	 F1A0  2E: 8A 84 F109 R	 	 	mov al,cs:[si+offset m7]
7553	 F1A5  EE	 	 	 	out	dx,al
7554	 F1A6  A2 0065 R	 	 	mov	crt_mode_set,al
7555	 	 	 	 	
7556	 	 	 	 	;   Форморование количества колонок
7557	 	 	 	 	
7558	 F1A9  2E: 8A 84 F101 R	 	 	mov al,cs:[si+offset m6]
7559	 F1AE  32 E4	 	 	 	xor	ah,ah
7560	 F1B0  A3 004A R	 	 	mov	crt_cols,ax	; коичество колонок на экране
7561	 	 	 	 	
7562	 	 	 	 	;   Установить позицию курсора
7563	 	 	 	 	
7564	 F1B3  81 E6 000E	 	 	and	si,0eh	 	;
7565	 F1B7  2E: 8B 8C F0F9 R	 	 	mov cx,cs:[si+offset m5]  ; длина для очистки
7566	 F1BC  89 0E 004C R	 	 	mov	crt_len,cx
7567	 F1C0  B9 0008	 	 	 	mov	cx,8	 	; очистить все позиции курсора
7568	 F1C3  BF 0050 R	 	 	mov	di,offset cursor_posn
7569	 F1C6  1E	 	 	 	push	ds	 	; восстановить сегмент
7570	 F1C7  07	 	 	 	pop	es
7571	 F1C8  33 C0	 	 	 	xor	ax,ax
7572	 F1CA  F3/ AB	 	 	 	rep	stosw	 	; заполнить нулями
7573	 	 	 	 	
7574	 	 	 	 	;   Установка регистра сканирования
7575	 	 	 	 	
7576	 F1CC  42	 	 	 	inc	dx	 	; уст порт сканирования по умолчанию
7577	 F1CD  B0 30	 	 	 	mov	al,30h	 	; значение 30H для всех режимов,
7578	 	 	 	 	 	 	 	 	; исключая 640х200
7579	 F1CF  80 3E 0049 R 06	 	 	cmp	crt_mode,6	; режим ч/б 640х200
7580	 F1D4  75 02	 	 	 	jnz	m14	 	; если не 640х200
7581	 F1D6  B0 3F	 	 	 	mov	al,3fh	 	; если 640х200, то поместить в 3FH
7582	 F1D8  EE	 	 	m14:	out	dx,al	 	; вывод правильного значения в порт 3D9
7583	 F1D9  A2 0066 R	 	 	mov	crt_pallette,al   ; сохранить значение для использования
7584	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-150
	 	 	 	 	 	 	 	09-15-88    


7585	 	 	 	 	;   Нормальный возврат
7586	 	 	 	 	
7587	 F1DC	 	 	 	video_return:
7588	 F1DC  5D	 	 	 	pop	bp
7589	 F1DD  5F	 	 	 	pop	di
7590	 F1DE  5E	 	 	 	pop	si
7591	 F1DF  5B	 	 	 	pop	bx
7592	 F1E0	 	 	 	m15:
7593	 F1E0  59	 	 	 	pop	cx	 	; восстановление регистров
7594	 F1E1  5A	 	 	 	pop	dx
7595	 F1E2  1F	 	 	 	pop	ds
7596	 F1E3  07	 	 	 	pop	es
7597	 F1E4  CF	 	 	 	iret	 	 	; возврат из прерывания
7598	 F1E5	 	 	 	set_mode	endp
7599	 	 	 	 	;--------------------
7600	 	 	 	 	; set_ctype
7601	 	 	 	 	;
7602	 	 	 	 	;   Эта программа устанавливает размер курсора и управление им
7603	 	 	 	 	;
7604	 	 	 	 	;   ВХОД
7605	 	 	 	 	;	   (CX) - содержит размер курсора. (CH - начальная граница,
7606	 	 	 	 	;	 	  CL - конечная граница)
7607	 	 	 	 	;
7608	 	 	 	 	;--------------------
7609	 F1E5	 	 	 	set_ctype proc	near
7610	 F1E5  B4 0A	 	 	 	mov	ah,10	 	; установить регистр 6845 для курсора
7611	 F1E7  89 0E 0060 R	 	 	mov	cursor_mode,cx	 ; сохранить в области данных
7612	 F1EB  E8 F1F0 R	 	 	call	m16	 	; вывод регистра CX
7613	 F1EE  EB EC	 	 	 	jmp	short video_return
7614	 	 	 	 	
7615	 F1F0	 	 	 	m16:
7616	 F1F0  8B 16 0063 R	 	 	mov	dx,addr_6845	; адрес регистра
7617	 F1F4  8A C4	 	 	 	mov	al,ah	 	; получить значение
7618	 F1F6  EE	 	 	 	out	dx,al	 	; установить регистр
7619	 F1F7  42	 	 	 	inc	dx	 	; регистр данных
7620	 F1F8  8A C5	 	 	 	mov	al,ch	 	; данные
7621	 F1FA  EE	 	 	 	out	dx,al
7622	 F1FB  4A	 	 	 	dec	dx
7623	 F1FC  8A C4	 	 	 	mov	al,ah
7624	 F1FE  FE C0	 	 	 	inc	al	 	; указать другой регистр данных
7625	 F200  EE	 	 	 	out	dx,al	 	; установить второй регистр
7626	 F201  42	 	 	 	inc	dx
7627	 F202  8A C1	 	 	 	mov	al,cl	 	; второе значение данных
7628	 F204  EE	 	 	 	out	dx,al
7629	 F205  C3	 	 	 	ret	 	 	; возврат
7630	 F206	 	 	 	set_ctype	endp
7631	 	 	 	 	;----------------------------
7632	 	 	 	 	; set_cpos
7633	 	 	 	 	;
7634	 	 	 	 	;   Установить текущую позицию курсора
7635	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-151
	 	 	 	 	 	 	 	09-15-88    


7636	 	 	 	 	;   ВХОД
7637	 	 	 	 	;	   DX - строка, колонка,
7638	 	 	 	 	;	   BH - номер страницы.
7639	 	 	 	 	;
7640	 	 	 	 	;-----------------------------
7641	 F206	 	 	 	set_cpos proc	near
7642	 F206  8A CF	 	 	 	mov	cl,bh
7643	 F208  32 ED	 	 	 	xor	ch,ch	 	; установить счетчик
7644	 F20A  D1 E1	 	 	 	sal	cx,1	 	; сдвиг слова
7645	 F20C  8B F1	 	 	 	mov	si,cx
7646	 F20E  89 94 0050 R	 	 	mov word ptr [si + offset cursor_posn],dx  ;сохранить указатель
7647	 F212  38 3E 0062 R	 	 	cmp	active_page,bh
7648	 F216  75 05	 	 	 	jnz	m17
7649	 F218  8B C2	 	 	 	mov	ax,dx	 	; получить строку/колонку в AX
7650	 F21A  E8 F21F R	 	 	call	m18	 	; установить курсор
7651	 F21D	 	 	 	m17:
7652	 F21D  EB BD	 	 	 	jmp	short video_return  ; возврат
7653	 F21F	 	 	 	set_cpos	endp
7654	 	 	 	 	
7655	 	 	 	 	;   Установить позицию курсора, AX содержит  строку/колонку
7656	 	 	 	 	
7657	 F21F	 	 	 	m18	proc	near
7658	 F21F  E8 F2A3 R	 	 	call	position
7659	 F222  8B C8	 	 	 	mov	cx,ax
7660	 F224  03 0E 004E R	 	 	add	cx,crt_start	; сложить с начальным адресом страницы
7661	 F228  D1 F9	 	 	 	sar	cx,1	 	; делить на 2
7662	 F22A  B4 0E	 	 	 	mov	ah,14
7663	 F22C  E8 F1F0 R	 	 	call	m16
7664	 F22F  C3	 	 	 	ret
7665	 F230	 	 	 	m18	endp
7666	 	 	 	 	;---------------------------
7667	 	 	 	 	; read_cursor
7668	 	 	 	 	;
7669	 	 	 	 	;   Считать текущее положение курсора
7670	 	 	 	 	;
7671	 	 	 	 	;   Эта программа восстанавливает текущее положение курсора
7672	 	 	 	 	;
7673	 	 	 	 	;   ВХОД
7674	 	 	 	 	;	   BH - номер страницы
7675	 	 	 	 	;
7676	 	 	 	 	;   ВЫХОД
7677	 	 	 	 	;	   DX - строка/колонка текущей позиции курсора,
7678	 	 	 	 	;	   CX - размер курсора и управление им
7679	 	 	 	 	;
7680	 	 	 	 	;---------------------------
7681	 F230	 	 	 	read_cursor proc near
7682	 F230  8A DF	 	 	 	mov	bl,bh
7683	 F232  32 FF	 	 	 	xor	bh,bh
7684	 F234  D1 E3	 	 	 	sal	bx,1
7685	 F236  8B 97 0050 R	 	 	mov dx,word ptr [bx+offset cursor_posn]
7686	 F23A  8B 0E 0060 R	 	 	mov	cx,cursor_mode
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-152
	 	 	 	 	 	 	 	09-15-88    


7687	 F23E  5D	 	 	 	pop	bp
7688	 F23F  5F	 	 	 	pop	di	 	; восстановить регистры
7689	 F240  5E	 	 	 	pop	si
7690	 F241  5B	 	 	 	pop	bx
7691	 F242  58	 	 	 	pop	ax
7692	 F243  58	 	 	 	pop	ax
7693	 F244  1F	 	 	 	pop	ds
7694	 F245  07	 	 	 	pop	es
7695	 F246  CF	 	 	 	iret
7696	 F247	 	 	 	read_cursor	endp
7697	 	 	 	 	;-----------------------------
7698	 	 	 	 	; act_disp_page
7699	 	 	 	 	;
7700	 	 	 	 	;    Эта программа устанавливает активную страницу буфера адаптера ЭЛИ
7701	 	 	 	 	;
7702	 	 	 	 	;   ВХОД
7703	 	 	 	 	;	   AL - страница.
7704	 	 	 	 	;
7705	 	 	 	 	;   ВЫХОД
7706	 	 	 	 	;	   Выполняется сброс контроллера для установки новой страницы.
7707	 	 	 	 	;
7708	 	 	 	 	;-----------------------------
7709	 F247	 	 	 	act_disp_page proc	near
7710	 F247  A2 0062 R	 	 	mov	active_page,al	; сохранить значение активной страницы
7711	 F24A  8B 0E 004C R	 	 	mov	cx,crt_len	; получить длину области буфера
7712	 F24E  98	 	 	 	cbw	 	 	; преобразовать AL
7713	 F24F  50	 	 	 	push	ax	 	; сохранить значение страницы
7714	 F250  F7 E1	 	 	 	mul	cx
7715	 F252  A3 004E R	 	 	mov	crt_start,ax	; сохранить начальный адрес
7716	 	 	 	 	 	 	 	 	; для следующего требования
7717	 F255  8B C8	 	 	 	mov	cx,ax	 	; переслать начальный адрес в CX
7718	 F257  D1 F9	 	 	 	sar	cx,1	 	; делить на 2
7719	 F259  B4 0C	 	 	 	mov	ah,12
7720	 F25B  E8 F1F0 R	 	 	call	m16
7721	 F25E  5B	 	 	 	pop	bx	 	; восстановить значение страницы
7722	 F25F  D1 E3	 	 	 	sal	bx,1
7723	 F261  8B 87 0050 R	 	 	mov ax,word ptr [bx+offset cursor_posn]   ; получить курсор
7724	 F265  E8 F21F R	 	 	call	m18	 	; установить позицию курсора
7725	 F268  E9 F1DC R	 	 	jmp	video_return
7726	 F26B	 	 	 	act_disp_page	endp
7727	 	 	 	 	;------------------------------
7728	 	 	 	 	; set color
7729	 	 	 	 	;
7730	 	 	 	 	;   Эта программа устанавливает цветовую палитру.
7731	 	 	 	 	;
7732	 	 	 	 	;   ВХОД
7733	 	 	 	 	;	   BH=0
7734	 	 	 	 	;	 	BL - значение пяти младших бит, используемых для выбора
7735	 	 	 	 	;	 	     цветовой палитры (цвет заднего плана для цветной
7736	 	 	 	 	;	 	     графики 320х200 или цвет каймы для цветного 40х25)
7737	 	 	 	 	;	   BH=1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-153
	 	 	 	 	 	 	 	09-15-88    


7738	 	 	 	 	;	 	BL - номер цветовой палитры
7739	 	 	 	 	;	 	     BL=0 - зеленый(1), красный(2), желтый(3),
7740	 	 	 	 	;	 	     BL=1 - голубой(1), фиолетовый(2), белый (3)
7741	 	 	 	 	;
7742	 	 	 	 	;   ВЫХОД
7743	 	 	 	 	;	   Установленная цветовая палитра в порту 3D9.
7744	 	 	 	 	;------------------------------
7745	 F26B	 	 	 	set_color proc	near
7746	 F26B  8B 16 0063 R	 	 	mov	dx,addr_6845	; порт для палитры
7747	 F26F  83 C2 05	 	 	 	add	dx,5	 	; установить порт
7748	 F272  A0 0066 R	 	 	mov	al,crt_pallette   ; получить текущее значение палитры
7749	 F275  0A FF	 	 	 	or	bh,bh	 	; цвет 0 ?
7750	 F277  75 0E	 	 	 	jnz	m20	 	; вывод цвета 1
7751	 	 	 	 	
7752	 	 	 	 	;   Обработка цветовой палитры 0
7753	 	 	 	 	
7754	 F279  24 E0	 	 	 	and	al,0e0h 	; сбросить 5 младших бит
7755	 F27B  80 E3 1F	 	 	 	and	bl,01fh 	; сбросить 3 старших бита
7756	 F27E  0A C3	 	 	 	or	al,bl
7757	 F280	 	 	 	m19:
7758	 F280  EE	 	 	 	out	dx,al	 	 ; вывод выбранного цвета в порт 3D9
7759	 F281  A2 0066 R	 	 	mov	crt_pallette,al  ; сохранить значение цвета
7760	 F284  E9 F1DC R	 	 	jmp	video_return
7761	 	 	 	 	
7762	 	 	 	 	;   Обработка цветовой палитры 1
7763	 	 	 	 	
7764	 F287	 	 	 	m20:
7765	 F287  24 DF	 	 	 	and	al,0dfh 	;
7766	 F289  D0 EB	 	 	 	shr	bl,1	 	; проверить младший бит BL
7767	 F28B  73 F3	 	 	 	jnc	m19
7768	 F28D  0C 20	 	 	 	or	al,20h	 	;
7769	 F28F  EB EF	 	 	 	jmp	short m19	; переход
7770	 F291	 	 	 	set_color	endp
7771	 	 	 	 	;--------------------------
7772	 	 	 	 	; video state
7773	 	 	 	 	;
7774	 	 	 	 	;   Эта программа получает текущее состояние ЭЛИ в AX.
7775	 	 	 	 	;
7776	 	 	 	 	;	   AH - количество колонок,
7777	 	 	 	 	;	   AL - текущий режим,
7778	 	 	 	 	;	   BH - номер активной страницы.
7779	 	 	 	 	;
7780	 	 	 	 	;---------------------------
7781	 F291	 	 	 	video_state proc	near
7782	 F291  8A 26 004A R	 	 	mov	ah,byte ptr crt_cols   ; получить количество колонок
7783	 F295  A0 0049 R	 	 	mov	al,crt_mode	 	; текущий режим
7784	 F298  8A 3E 0062 R	 	 	mov	bh,active_page	; получить текущую активную страницу
7785	 F29C  5D	 	 	 	pop	bp
7786	 F29D  5F	 	 	 	pop	di	 	; восстановить регистры
7787	 F29E  5E	 	 	 	pop	si
7788	 F29F  59	 	 	 	pop	cx
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-154
	 	 	 	 	 	 	 	09-15-88    


7789	 F2A0  E9 F1E0 R	 	 	jmp	m15	 	; возврат к программе
7790	 F2A3	 	 	 	video_state	endp
7791	 	 	 	 	;---------------------------
7792	 	 	 	 	; position
7793	 	 	 	 	;
7794	 	 	 	 	;   Эта программа вычисляет адрес буфера символа в режиме альфа.
7795	 	 	 	 	;
7796	 	 	 	 	;   ВХОД
7797	 	 	 	 	;	   AX - номер строки, номер колонки,
7798	 	 	 	 	;
7799	 	 	 	 	;   ВЫХОД
7800	 	 	 	 	;	   AX - смещение символа с координатами (AH, AL) относительно
7801	 	 	 	 	;	 	начала страницы. Смещение измеряется в байтах.
7802	 	 	 	 	;
7803	 	 	 	 	;----------------------------
7804	 F2A3	 	 	 	position proc	near
7805	 F2A3  53	 	 	 	push	bx	 	; сохранить регистр
7806	 F2A4  8B D8	 	 	 	mov	bx,ax
7807	 F2A6  8A C4	 	 	 	mov	al,ah	 	; строки в AL
7808	 F2A8  F6 26 004A R	 	 	mul	byte ptr crt_cols
7809	 F2AC  32 FF	 	 	 	xor	bh,bh
7810	 F2AE  03 C3	 	 	 	add	ax,bx	 	; добавить к значению колонки
7811	 F2B0  D1 E0	 	 	 	sal	ax,1	 	; * 2 для байтов атрибута
7812	 F2B2  5B	 	 	 	pop	bx
7813	 F2B3  C3	 	 	 	ret
7814	 F2B4	 	 	 	position	endp
7815	 	 	 	 	;-------------------------------
7816	 	 	 	 	;scroll up
7817	 	 	 	 	;
7818	 	 	 	 	;   Эта программа перемещает блок символов вверх по экрану.
7819	 	 	 	 	;
7820	 	 	 	 	;   ВХОД
7821	 	 	 	 	;	   AH - текуший режим,
7822	 	 	 	 	;	   AL - количество перемещаемых строк
7823	 	 	 	 	;	   CX - координаты левого верхнего угла блока
7824	 	 	 	 	;	 	(строка, колонка),
7825	 	 	 	 	;	   DX - координаты правого нижнего угла
7826	 	 	 	 	;	   BH - атрибут символа пробела (для опробеливания освобожда-
7827	 	 	 	 	;	 	емых строк),
7828	 	 	 	 	;
7829	 	 	 	 	;   ВЫХОД
7830	 	 	 	 	;	   Модифицированный буфер дисплея.
7831	 	 	 	 	;
7832	 	 	 	 	;-----------------------------------
7833	 	 	 	 	 	assume cs:code,ds:data,es:data
7834	 F2B4	 	 	 	scroll_up proc	near
7835	 F2B4  8A D8	 	 	 	mov	bl,al	    ; сохранить количество перемещаемых строк
7836	 F2B6  80 FC 04	 	 	 	cmp	ah,4	 	; проверка графического режима
7837	 F2B9  72 08	 	 	 	jc	n1
7838	 F2BB  80 FC 07	 	 	 	cmp	ah,7	 	; проверка ч/б адаптера
7839	 F2BE  74 03	 	 	 	je	n1
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-155
	 	 	 	 	 	 	 	09-15-88    


7840	 F2C0  E9 F4B6 R	 	 	jmp	graphics_up
7841	 F2C3	 	 	 	n1:
7842	 F2C3  53	 	 	 	push	bx	 	; сохранить полный атрибут в BH
7843	 F2C4  8B C1	 	 	 	mov	ax,cx	 	; координаты левого верхнего угла
7844	 F2C6  E8 F302 R	 	 	call	scroll_position
7845	 F2C9  74 33	 	 	 	jz	n7
7846	 F2CB  03 F0	 	 	 	add	si,ax
7847	 F2CD  8A E6	 	 	 	mov	ah,dh	 	; строка
7848	 F2CF  2A E3	 	 	 	sub	ah,bl
7849	 F2D1	 	 	 	n2:
7850	 F2D1  E8 F349 R	 	 	call	n10	 	; сдвинуть одну строку
7851	 F2D4  03 F5	 	 	 	add	si,bp
7852	 F2D6  03 FD	 	 	 	add	di,bp	 	; указать на следующую строку в блоке
7853	 F2D8  FE CC	 	 	 	dec	ah	 	; счетчик строк для сдвига
7854	 F2DA  75 F5	 	 	 	jnz	n2	 	; цикл строки
7855	 F2DC	 	 	 	n3:	 	 	 	; очистка входа
7856	 F2DC  58	 	 	 	pop	ax	 	; восстановить атрибут в AH
7857	 F2DD  B0 20	 	 	 	mov	al,' '          ; заполнить пробелами
7858	 F2DF	 	 	 	n4:	 	 	 	; очистка счетчика
7859	 F2DF  E8 F352 R	 	 	call	n11	 	; очистка строки
7860	 F2E2  03 FD	 	 	 	add	di,bp	 	; указать следующую строку
7861	 F2E4  FE CB	 	 	 	dec	bl	 	; счетчик строк для сдвига
7862	 F2E6  75 F7	 	 	 	jnz	n4	 	; очистка счетчика
7863	 F2E8	 	 	 	n5:	 	 	 	; конец сдвига
7864	 F2E8  B8 0040	 	 	 	mov	ax,dat
7865	 F2EB  8E D8	 	 	 	mov	ds,ax
7866	 F2ED  80 3E 0049 R 07	 	 	cmp	crt_mode,7	; ч/б адаптер ?
7867	 F2F2  74 07	 	 	 	je	n6	 	; если да - пропуск режима сброса
7868	 F2F4  A0 0065 R	 	 	mov	al,crt_mode_set
7869	 F2F7  BA 03D8	 	 	 	mov	dx,03d8h	; установить порт цветного адаптера
7870	 F2FA  EE	 	 	 	out	dx,al
7871	 F2FB	 	 	 	n6:
7872	 F2FB  E9 F1DC R	 	 	jmp	video_return
7873	 F2FE	 	 	 	n7:
7874	 F2FE  8A DE	 	 	 	mov	bl,dh
7875	 F300  EB DA	 	 	 	jmp	short n3	; очистить
7876	 F302	 	 	 	scroll_up	endp
7877	 	 	 	 	
7878	 	 	 	 	;   Обработка сдвига
7879	 	 	 	 	
7880	 F302	 	 	 	scroll_position proc	near
7881	 F302  80 3E 0049 R 02	 	 	cmp	crt_mode,2
7882	 F307  72 19	 	 	 	jb	n9	 	; обработать 80х25 отдельно
7883	 F309  80 3E 0049 R 03	 	 	cmp	crt_mode,3
7884	 F30E  77 12	 	 	 	ja	n9
7885	 	 	 	 	
7886	 	 	 	 	;   Сдиг для цветного адаптера в режиме 80х25
7887	 	 	 	 	
7888	 F310  52	 	 	 	push	dx
7889	 F311  BA 03DA	 	 	 	mov	dx,3dah 	; обработка цветного адаптера
7890	 F314  50	 	 	 	push	ax
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-156
	 	 	 	 	 	 	 	09-15-88    


7891	 F315	 	 	 	n8:	 	 	 	; ожидание доступности дисплея
7892	 F315  EC	 	 	 	in	al,dx
7893	 F316  A8 08	 	 	 	test	al,8
7894	 F318  74 FB	 	 	 	jz	n8	 	; ожидание доступности дисплея
7895	 F31A  B0 25	 	 	 	mov	al,25h
7896	 F31C  BA 03D8	 	 	 	mov	dx,03d8h
7897	 F31F  EE	 	 	 	out	dx,al	 	; выключить ЭЛИ
7898	 F320  58	 	 	 	pop	ax
7899	 F321  5A	 	 	 	pop	dx
7900	 F322  E8 F2A3 R	 	n9:	call	position
7901	 F325  03 06 004E R	 	 	add	ax,crt_start	; смещение активной страницы
7902	 F329  8B F8	 	 	 	mov	di,ax	 	; для адреса сдвига
7903	 F32B  8B F0	 	 	 	mov	si,ax
7904	 F32D  2B D1	 	 	 	sub	dx,cx	 	; DX=строка
7905	 F32F  FE C6	 	 	 	inc	dh
7906	 F331  FE C2	 	 	 	inc	dl	 	; прибавление к началу
7907	 F333  32 ED	 	 	 	xor	ch,ch	 	; установить старший байт счетчика в 0
7908	 F335  8B 2E 004A R	 	 	mov	bp,crt_cols	; получить число колонок дисплея
7909	 F339  03 ED	 	 	 	add	bp,bp	 	; увеличить на 2 байт атрибута
7910	 F33B  8A C3	 	 	 	mov	al,bl	 	; получить счетчик строки
7911	 F33D  F6 26 004A R	 	 	mul	byte ptr crt_cols   ; определить смещение из адреса,
7912	 F341  03 C0	 	 	 	add	ax,ax	  ; умноженного на 2, для байта атрибута
7913	 F343  06	 	 	 	push	es	; установить адресацию для области буфера
7914	 F344  1F	 	 	 	pop	ds
7915	 F345  80 FB 00	 	 	 	cmp	bl,0	 	; 0 означает очистку блока
7916	 F348  C3	 	 	 	ret	 	 	; возврат с установкой флажков
7917	 F349	 	 	 	scroll_position endp
7918	 	 	 	 	
7919	 	 	 	 	;   Перемещение строки
7920	 	 	 	 	
7921	 F349	 	 	 	n10	proc	near
7922	 F349  8A CA	 	 	 	mov	cl,dl	 	; получить колонки для передачи
7923	 F34B  56	 	 	 	push	si
7924	 F34C  57	 	 	 	push	di	 	; сохранить начальный адрес
7925	 F34D  F3/ A5	 	 	 	rep	movsw	 	; передать эту строку на экран
7926	 F34F  5F	 	 	 	pop	di
7927	 F350  5E	 	 	 	pop	si	 	; восстановить адресацию
7928	 F351  C3	 	 	 	ret
7929	 F352	 	 	 	n10	endp
7930	 	 	 	 	
7931	 	 	 	 	;   очистка строки
7932	 	 	 	 	
7933	 F352	 	 	 	n11	proc	near
7934	 F352  8A CA	 	 	 	mov	cl,dl	 	; получить колонки для очистки
7935	 F354  57	 	 	 	push	di
7936	 F355  F3/ AB	 	 	 	rep	stosw	 	; запомнить полный знак
7937	 F357  5F	 	 	 	pop	di
7938	 F358  C3	 	 	 	ret
7939	 F359	 	 	 	n11	endp
7940	 	 	 	 	;------------------------
7941	 	 	 	 	; scroll_down
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-157
	 	 	 	 	 	 	 	09-15-88    


7942	 	 	 	 	;
7943	 	 	 	 	;   Эта программа перемещает блок символов вниз по
7944	 	 	 	 	; экрану, заполняя верхние строки пробелом с заданным атрибутом
7945	 	 	 	 	;
7946	 	 	 	 	;   ВХОД
7947	 	 	 	 	;	   AH - текущий режим,
7948	 	 	 	 	;	   AL - количество строк,
7949	 	 	 	 	;	   CX - верхний левый угол блока,
7950	 	 	 	 	;	   DX - правый нижний угол блока,
7951	 	 	 	 	;	   BH - атрибут символа-заполнителя (пробела),
7952	 	 	 	 	;
7953	 	 	 	 	;-------------------------
7954	 F359	 	 	 	scroll_down proc near
7955	 F359  FD	 	 	 	std	 	 	; уст направление сдвига вниз
7956	 F35A  8A D8	 	 	 	mov	bl,al	 	; количество строк в BL
7957	 F35C  80 FC 04	 	 	 	cmp	ah,4	 	; проверка графики
7958	 F35F  72 08	 	 	 	jc	n12
7959	 F361  80 FC 07	 	 	 	cmp	ah,7	 	; проверка ч/б адаптера
7960	 F364  74 03	 	 	 	je	n12
7961	 F366  E9 F50F R	 	 	jmp	graphics_down
7962	 F369	 	 	 	n12:
7963	 F369  53	 	 	 	push	bx	 	; сохранить атрибут в BH
7964	 F36A  8B C2	 	 	 	mov	ax,dx	 	; нижний правый угол
7965	 F36C  E8 F302 R	 	 	call	scroll_position
7966	 F36F  74 20	 	 	 	jz	n16
7967	 F371  2B F0	 	 	 	sub	si,ax	 	; SI для адресации
7968	 F373  8A E6	 	 	 	mov	ah,dh
7969	 F375  2A E3	 	 	 	sub	ah,bl	 	; передать количество строк
7970	 F377	 	 	 	n13:
7971	 F377  E8 F349 R	 	 	call	n10	 	; передать одну строку
7972	 F37A  2B F5	 	 	 	sub	si,bp
7973	 F37C  2B FD	 	 	 	sub	di,bp
7974	 F37E  FE CC	 	 	 	dec	ah
7975	 F380  75 F5	 	 	 	jnz	n13
7976	 F382	 	 	 	n14:
7977	 F382  58	 	 	 	pop	ax	 	; восстановить атрибут в AH
7978	 F383  B0 20	 	 	 	mov	al,' '
7979	 F385	 	 	 	n15:
7980	 F385  E8 F352 R	 	 	call	n11	 	; очистка одной строки
7981	 F388  2B FD	 	 	 	sub	di,bp	 	; перейти к следующей строке
7982	 F38A  FE CB	 	 	 	dec	bl
7983	 F38C  75 F7	 	 	 	jnz	n15
7984	 F38E  E9 F2E8 R	 	 	jmp	n5	 	; конец сдвига
7985	 F391	 	 	 	n16:
7986	 F391  8A DE	 	 	 	mov	bl,dh
7987	 F393  EB ED	 	 	 	jmp	short n14
7988	 F395	 	 	 	scroll_down  endp
7989	 	 	 	 	;--------------------
7990	 	 	 	 	; read_ac_current
7991	 	 	 	 	;
7992	 	 	 	 	;   Эта программа считывает атрибут и код символа, находящегося в теку-
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-158
	 	 	 	 	 	 	 	09-15-88    


7993	 	 	 	 	; щем положении курсора
7994	 	 	 	 	;
7995	 	 	 	 	;   ВХОД
7996	 	 	 	 	;	   AH - текущий режим,
7997	 	 	 	 	;	   BH - номер страницы (только для режима альфа),
7998	 	 	 	 	;
7999	 	 	 	 	;   ВЫХОД
8000	 	 	 	 	;	   AL - код символа,
8001	 	 	 	 	;	   AH - атрибут символа.
8002	 	 	 	 	;
8003	 	 	 	 	;---------------------
8004	 	 	 	 	 	assume cs:code,ds:data,es:data
8005	 F395	 	 	 	read_ac_current proc near
8006	 F395  80 FC 04	 	 	 	cmp	ah,4	 	; это графика ?
8007	 F398  72 08	 	 	 	jc	p1
8008	 F39A  80 FC 07	 	 	 	cmp	ah,7	 	; ч/б адаптер ?
8009	 F39D  74 03	 	 	 	je	p1
8010	 F39F  E9 F64B R	 	 	jmp	graphics_read
8011	 F3A2	 	 	 	p1:	 	 	 	;
8012	 F3A2  E8 F3BF R	 	 	call	find_position
8013	 F3A5  8B F3	 	 	 	mov	si,bx	 	; установить адресацию в SI
8014	 	 	 	 	
8015	 	 	 	 	
8016	 F3A7  8B 16 0063 R	 	 	mov	dx,addr_6845	; получить базовый адрес
8017	 F3AB  83 C2 06	 	 	 	add	dx,6	 	; порт состояния
8018	 F3AE  06	 	 	 	push	es
8019	 F3AF  1F	 	 	 	pop	ds	 	; получить сегмент
8020	 F3B0	 	 	 	p2:
8021	 F3B0  EC	 	 	 	in	al,dx	 	; получить состояние
8022	 F3B1  A8 01	 	 	 	test	al,1
8023	 F3B3  75 FB	 	 	 	jnz	p2	 	; ожидание
8024	 F3B5  FA	 	 	 	cli	 	   ; сброс признака разрешения прерывания
8025	 F3B6	 	 	 	p3:
8026	 F3B6  EC	 	 	 	in	al,dx	 	; получить состояние
8027	 F3B7  A8 01	 	 	 	test	al,1
8028	 F3B9  74 FB	 	 	 	jz	p3	 	; ожидание
8029	 F3BB  AD	 	 	 	lodsw	 	 	; получить символ/атрибут
8030	 F3BC  E9 F1DC R	 	 	jmp	video_return
8031	 F3BF	 	 	 	read_ac_current endp
8032	 	 	 	 	
8033	 F3BF	 	 	 	find_position proc near
8034	 F3BF  8A CF	 	 	 	mov	cl,bh	 	; поместить страницу в CX
8035	 F3C1  32 ED	 	 	 	xor	ch,ch
8036	 F3C3  8B F1	 	 	 	mov	si,cx	 	; передать в SI индекс, умноженный на 2
8037	 F3C5  D1 E6	 	 	 	sal	si,1	 	; для слова смещения
8038	 F3C7  8B 84 0050 R	 	 	mov ax,word ptr [si+offset cursor_posn]   ; получить строку/ко-
8039	 	 	 	 	 	 	 	 	; лонку этой страницы
8040	 F3CB  33 DB	 	 	 	xor	bx,bx	 	; установить начальный адрес в 0
8041	 F3CD  E3 06	 	 	 	jcxz	p5
8042	 F3CF	 	 	 	p4:
8043	 F3CF  03 1E 004C R	 	 	add	bx,crt_len	; длина буфера
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-159
	 	 	 	 	 	 	 	09-15-88    


8044	 F3D3  E2 FA	 	 	 	loop	p4
8045	 F3D5	 	 	 	p5:
8046	 F3D5  E8 F2A3 R	 	 	call	position
8047	 F3D8  03 D8	 	 	 	add	bx,ax
8048	 F3DA  C3	 	 	 	ret
8049	 F3DB	 	 	 	find_position	endp
8050	 	 	 	 	;---------------------
8051	 	 	 	 	;write_ac_current
8052	 	 	 	 	;
8053	 	 	 	 	;   Эта программа записывает атрибут и код символа в текущую позицию
8054	 	 	 	 	; курсора
8055	 	 	 	 	;
8056	 	 	 	 	;   ВХОД
8057	 	 	 	 	;	   AH - текущий режим,
8058	 	 	 	 	;	   BH - номер страницы,
8059	 	 	 	 	;	   CX - счетчик (количество повторений символов),
8060	 	 	 	 	;	   AL - код символа,
8061	 	 	 	 	;	   BL - атрибут символа (для режимов альфа) или цвет символа
8062	 	 	 	 	;	 	для графики.
8063	 	 	 	 	;
8064	 	 	 	 	;----------------------
8065	 F3DB	 	 	 	write_ac_current proc near
8066	 F3DB  80 FC 04	 	 	 	cmp	ah,4	 	; это графика ?
8067	 F3DE  72 08	 	 	 	jc	p6
8068	 F3E0  80 FC 07	 	 	 	cmp	ah,7	 	; это ч/б адаптер ?
8069	 F3E3  74 03	 	 	 	je	p6
8070	 F3E5  E9 F599 R	 	 	jmp	graphics_write
8071	 F3E8	 	 	 	p6:
8072	 F3E8  8A E3	 	 	 	mov	ah,bl	 	; получить атрибут в AH
8073	 F3EA  50	 	 	 	push	ax	 	; хранить
8074	 F3EB  51	 	 	 	push	cx	 	; хранить счетчик
8075	 F3EC  E8 F3BF R	 	 	call	find_position
8076	 F3EF  8B FB	 	 	 	mov	di,bx	 	; адрес в DI
8077	 F3F1  59	 	 	 	pop	cx	 	; вернуть счетчик
8078	 F3F2  5B	 	 	 	pop	bx	 	; и символ
8079	 F3F3	 	 	 	p7:	 	 	 	; цикл записи
8080	 	 	 	 	
8081	 	 	 	 	
8082	 F3F3  8B 16 0063 R	 	 	mov	dx,addr_6845	; получить базовый адрес
8083	 F3F7  83 C2 06	 	 	 	add	dx,6	 	; указать порт состояния
8084	 F3FA	 	 	 	p8:
8085	 F3FA  EC	 	 	 	in	al,dx	 	; получить состояние
8086	 F3FB  A8 01	 	 	 	test	al,1
8087	 F3FD  75 FB	 	 	 	jnz	p8	 	; ожидать
8088	 F3FF  FA	 	 	 	cli	 	     ; сброс признака разрешения прерывания
8089	 F400	 	 	 	p9:
8090	 F400  EC	 	 	 	in	al,dx	 	; получить состояние
8091	 F401  A8 01	 	 	 	test	al,1
8092	 F403  74 FB	 	 	 	jz	p9	 	; ожидать
8093	 F405  8B C3	 	 	 	mov	ax,bx
8094	 F407  AB	 	 	 	stosw	 	 	; записать символ и атрибут
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-160
	 	 	 	 	 	 	 	09-15-88    


8095	 F408  FB	 	 	 	sti	 	 	; уст признак разрешения прерывания
8096	 F409  E2 E8	 	 	 	loop	p7
8097	 F40B  E9 F1DC R	 	 	jmp	video_return
8098	 F40E	 	 	 	write_ac_current  endp
8099	 	 	 	 	;---------------------
8100	 	 	 	 	;write_c_current
8101	 	 	 	 	;
8102	 	 	 	 	;   Эта программа записывает символ в текущую позицию курсора.
8103	 	 	 	 	;
8104	 	 	 	 	;   ВХОД
8105	 	 	 	 	;	   BH - номер страницы (только для альфа режимов),
8106	 	 	 	 	;	   CX - счетчик (количество повторений символа),
8107	 	 	 	 	;	   AL - код символа,
8108	 	 	 	 	;
8109	 	 	 	 	;-----------------------
8110	 F40E	 	 	 	write_c_current proc near
8111	 F40E  80 FC 04	 	 	 	cmp	ah,4	 	; это графика ?
8112	 F411  72 08	 	 	 	jc	p10
8113	 F413  80 FC 07	 	 	 	cmp	ah,7	 	; это ч/б адаптер ?
8114	 F416  74 03	 	 	 	je	p10
8115	 F418  E9 F599 R	 	 	jmp	graphics_write
8116	 F41B	 	 	 	p10:
8117	 F41B  50	 	 	 	push	ax	 	; сохранить в стеке
8118	 F41C  51	 	 	 	push	cx	 	; сохранить количество повторений
8119	 F41D  E8 F3BF R	 	 	call	find_position
8120	 F420  8B FB	 	 	 	mov	di,bx	 	; адрес в DI
8121	 F422  59	 	 	 	pop	cx	 	; вернуть количество повторений
8122	 F423  5B	 	 	 	pop	bx	 	; BL - код символа
8123	 F424	 	 	 	p11:
8124	 	 	 	 	
8125	 	 	 	 	
8126	 F424  8B 16 0063 R	 	 	mov	dx,addr_6845	; получить базовый адрес
8127	 F428  83 C2 06	 	 	 	add	dx,6	 	; указать порт состояния
8128	 F42B	 	 	 	p12:
8129	 F42B  EC	 	 	 	in	al,dx	 	; получить состояние
8130	 F42C  A8 01	 	 	 	test	al,1
8131	 F42E  75 FB	 	 	 	jnz	p12	 	; ожидать
8132	 F430  FA	 	 	 	cli	 	 	; сброс признака разрешения прерывания
8133	 F431	 	 	 	p13:
8134	 F431  EC	 	 	 	in	al,dx	 	; получить состояние
8135	 F432  A8 01	 	 	 	test	al,1
8136	 F434  74 FB	 	 	 	jz	p13	 	; ожидание
8137	 F436  8A C3	 	 	 	mov	al,bl	 	; восстановить символ
8138	 F438  AA	 	 	 	stosb	 	 	; записать символ
8139	 F439  47	 	 	 	inc	di
8140	 F43A  E2 E8	 	 	 	loop	p11	 	; цикл
8141	 F43C  E9 F1DC R	 	 	jmp	video_return
8142	 F43F	 	 	 	write_c_current endp
8143	 	 	 	 	;---------------------
8144	 	 	 	 	; read dot - write dot
8145	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-161
	 	 	 	 	 	 	 	09-15-88    


8146	 	 	 	 	;   Эта программа считывает/записывает точку.
8147	 	 	 	 	;
8148	 	 	 	 	;   ВХОД
8149	 	 	 	 	;	   DX - строка (0-199),
8150	 	 	 	 	;	   CX - колонка (0-639),
8151	 	 	 	 	;	   AL - цвет выводимой точки.
8152	 	 	 	 	;	 	Если бит 7=1, то выполняется операция
8153	 	 	 	 	;	 	XOR над значением точки из буфера дисплея и значением
8154	 	 	 	 	;	 	точки из регистра AL (при записи точки).
8155	 	 	 	 	;
8156	 	 	 	 	;   ВЫХОД
8157	 	 	 	 	;	   AL - значение считанной точки
8158	 	 	 	 	;
8159	 	 	 	 	;----------------------
8160	 	 	 	 	 	assume cs:code,ds:data,es:data
8161	 F43F	 	 	 	read_dot proc	near
8162	 F43F  E8 F473 R	 	 	call	r3	 	; определить положение точки
8163	 F442  26: 8A 04	 	 	mov	al,es:[si]	; получить байт
8164	 F445  22 C4	 	 	 	and	al,ah	 	; размаскировать другие биты в байте
8165	 F447  D2 E0	 	 	 	shl	al,cl	 	;
8166	 F449  8A CE	 	 	 	mov	cl,dh	 	; получить число бит результата
8167	 F44B  D2 C0	 	 	 	rol	al,cl
8168	 F44D  E9 F1DC R	 	 	jmp	video_return	; выход из прерывания
8169	 F450	 	 	 	read_dot	endp
8170	 	 	 	 	
8171	 F450	 	 	 	write_dot proc	near
8172	 F450  50	 	 	 	push	ax	 	; сохранить значение точки
8173	 F451  50	 	 	 	push	ax	 	; еще раз
8174	 F452  E8 F473 R	 	 	call	r3	 	; определить положение точки
8175	 F455  D2 E8	 	 	 	shr	al,cl	 	; сдвиг для установки бит при выводе
8176	 F457  22 C4	 	 	 	and	al,ah	 	; сбросить другие биты
8177	 F459  26: 8A 0C	 	 	mov	cl,es:[si]	; получить текущий байт
8178	 F45C  5B	 	 	 	pop	bx
8179	 F45D  F6 C3 80	 	 	 	test	bl,80h
8180	 F460  75 0D	 	 	 	jnz	r2
8181	 F462  F6 D4	 	 	 	not	ah	  ; установить маску для передачи указанных бит
8182	 F464  22 CC	 	 	 	and	cl,ah
8183	 F466  0A C1	 	 	 	or	al,cl
8184	 F468	 	 	 	r1:
8185	 F468  26: 88 04	 	 	mov es:[si],al	 	; восстановить байт в памяти
8186	 F46B  58	 	 	 	pop	ax
8187	 F46C  E9 F1DC R	 	 	jmp	video_return	; к выходу из программы
8188	 F46F	 	 	 	r2:
8189	 F46F  32 C1	 	 	 	xor	al,cl	 	; исключающее ИЛИ над значениями точки
8190	 F471  EB F5	 	 	 	jmp	short r1	; конец записи
8191	 F473	 	 	 	write_dot	endp
8192	 	 	 	 	
8193	 	 	 	 	;-------------------------------------
8194	 	 	 	 	;
8195	 	 	 	 	;   Эта программа определяет относительный адрес байта (внутри буфера
8196	 	 	 	 	; дисплея), из которого должна быть считана/записана точка,с заданными
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-162
	 	 	 	 	 	 	 	09-15-88    


8197	 	 	 	 	; координатами.
8198	 	 	 	 	;
8199	 	 	 	 	;   ВХОД
8200	 	 	 	 	;	   DX - строка (0-199),
8201	 	 	 	 	;	   CX - колонка (0-639).
8202	 	 	 	 	;
8203	 	 	 	 	;   ВЫХОД
8204	 	 	 	 	;	   SI - относительный адрес байта, содержащего точку внутри
8205	 	 	 	 	;	 	буфера дисплея,
8206	 	 	 	 	;	   AH - маска для выделения значения заданной точки внутри байта
8207	 	 	 	 	;	   CL - константа сдвига маски в AH в крайнюю левую позицию,
8208	 	 	 	 	;	   DH - число бит, определяющих значение точки.
8209	 	 	 	 	;
8210	 	 	 	 	;--------------------------------------
8211	 	 	 	 	
8212	 F473	 	 	 	r3	proc	near
8213	 F473  53	 	 	 	push	bx	 	; сохранить BX
8214	 F474  50	 	 	 	push	ax	 	; сохранить AL
8215	 	 	 	 	
8216	 	 	 	 	;   Вычисление первого байта указанной строки умножением на 40.
8217	 	 	 	 	; Наименьший бит строки определяет четно/нечетную 80-байтовую строку.
8218	 	 	 	 	
8219	 F475  B0 28	 	 	 	mov	al,40
8220	 F477  52	 	 	 	push	dx	 	; сохранить значение строки
8221	 F478  80 E2 FE	 	 	 	and	dl,0feh 	; сброс четно/нечетного бита
8222	 F47B  F6 E2	 	 	 	mul	dl   ; AX содержит адрес первого байта указанной строки
8223	 F47D  5A	 	 	 	pop	dx	 	; восстановить его
8224	 F47E  F6 C2 01	 	 	 	test	dl,1	 	; проверить четность/нечетность
8225	 F481  74 03	 	 	 	jz	r4	 	; переход,если строка четная
8226	 F483  05 2000	 	 	 	add	ax,2000h	; смещение для нахождения нечетных строк
8227	 F486	 	 	 	r4:	 	 	 	; четная строка
8228	 F486  8B F0	 	 	 	mov	si,ax	 	; передать указатель в SI
8229	 F488  58	 	 	 	pop	ax	 	; восстановить значение AL
8230	 F489  8B D1	 	 	 	mov	dx,cx	 	; значение колонки в DX
8231	 	 	 	 	
8232	 	 	 	 	;   Определение действительных графических режимов
8233	 	 	 	 	;
8234	 	 	 	 	;   Установка регистров согласно режимaм
8235	 	 	 	 	;
8236	 	 	 	 	;	  BH - количество бит, определяющее точку,
8237	 	 	 	 	;	  BL - константа выделения точки из левых бит байта,
8238	 	 	 	 	;	  CH - константа для выделения из номера колонки номера позиции
8239	 	 	 	 	;	       первого бита, определяющего точку в байте, т.е. получение
8240	 	 	 	 	;	       остатка от деления номера на 8 (для режима 640х200) или
8241	 	 	 	 	;	       номера на 4 (для режима 320х200),
8242	 	 	 	 	;	  CL - константа сдвига (для выполнения деления на 8 или на 4).
8243	 	 	 	 	
8244	 F48B  BB 02C0	 	 	 	mov	bx,2c0h
8245	 F48E  B9 0302	 	 	 	mov	cx,302h 	; установка параметров
8246	 F491  80 3E 0049 R 06	 	 	cmp	crt_mode,6
8247	 F496  72 06	 	 	 	jc	r5	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-163
	 	 	 	 	 	 	 	09-15-88    


8248	 F498  BB 0180	 	 	 	mov	bx,180h
8249	 F49B  B9 0703	 	 	 	mov	cx,703h 	; уст параметры для старшего регистра
8250	 	 	 	 	
8251	 	 	 	 	;   Определение бита смещения в байте по маске
8252	 F49E	 	 	 	r5:
8253	 F49E  22 EA	 	 	 	and	ch,dl	 	;
8254	 	 	 	 	
8255	 	 	 	 	;   Определение байта смещения в колонке
8256	 	 	 	 	
8257	 F4A0  D3 EA	 	 	 	shr	dx,cl	 	; сдвиг для коррекции
8258	 F4A2  03 F2	 	 	 	add	si,dx	 	; получить указатель
8259	 F4A4  8A F7	 	 	 	mov	dh,bh	; получить указатель битов результата в DH
8260	 	 	 	 	
8261	 	 	 	 	;   Умножение BH (количество бит в байте) на CH (бит смещения)
8262	 	 	 	 	
8263	 F4A6  2A C9	 	 	 	sub	cl,cl
8264	 F4A8	 	 	 	r6:
8265	 F4A8  D0 C8	 	 	 	ror	al,1	; левое крайнее значение в AL для записи
8266	 F4AA  02 CD	 	 	 	add	cl,ch	 	; прибавить значение бита смещения
8267	 F4AC  FE CF	 	 	 	dec	bh	 	; счетчик контроля
8268	 F4AE  75 F8	 	 	 	jnz	r6	; на выходе CL содержит счетчик сдвига для
8269	 	 	 	 	 	 	 	 	; восстановления
8270	 F4B0  8A E3	 	 	 	mov	ah,bl	 	; получить маску в AH
8271	 F4B2  D2 EC	 	 	 	shr	ah,cl	 	; передать маску в ячейку
8272	 F4B4  5B	 	 	 	pop	bx	 	; восстановить регистр
8273	 F4B5  C3	 	 	 	ret	 	 	; возврат с восстановлением
8274	 F4B6	 	 	 	r3	endp
8275	 	 	 	 	
8276	 	 	 	 	;----------------------------------------
8277	 	 	 	 	;
8278	 	 	 	 	;
8279	 	 	 	 	;    Программа перемещает блок символов вверх в режиме графики
8280	 	 	 	 	;
8281	 	 	 	 	;-----------------------------------------
8282	 	 	 	 	
8283	 F4B6	 	 	 	graphics_up proc near
8284	 F4B6  8A D8	 	 	 	mov	bl,al	 	; сохранить количество символов
8285	 F4B8  8B C1	 	 	 	mov	ax,cx	 	; получить верхний левый угол в AX
8286	 	 	 	 	
8287	 	 	 	 	
8288	 F4BA  E8 F727 R	 	 	call	graph_posn
8289	 F4BD  8B F8	 	 	 	mov	di,ax	 	; сохранить результат
8290	 	 	 	 	
8291	 	 	 	 	;   Определить размеры блока
8292	 	 	 	 	
8293	 F4BF  2B D1	 	 	 	sub	dx,cx
8294	 F4C1  81 C2 0101	 	 	add	dx,101h
8295	 F4C5  D0 E6	 	 	 	sal	dh,1
8296	 F4C7  D0 E6	 	 	 	sal	dh,1
8297	 	 	 	 	
8298	 F4C9  80 3E 0049 R 06	 	 	cmp	crt_mode,6
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-164
	 	 	 	 	 	 	 	09-15-88    


8299	 F4CE  73 04	 	 	 	jnc	r7
8300	 	 	 	 	
8301	 F4D0  D0 E2	 	 	 	sal	dl,1
8302	 F4D2  D1 E7	 	 	 	sal	di,1	 	;
8303	 	 	 	 	
8304	 	 	 	 	;   Определение адреса источника в буфере
8305	 F4D4	 	 	 	r7:
8306	 F4D4  06	 	 	 	push	es
8307	 F4D5  1F	 	 	 	pop	ds
8308	 F4D6  2A ED	 	 	 	sub	ch,ch	 	; обнулить старший байт счетчика
8309	 F4D8  D0 E3	 	 	 	sal	bl,1	 	; умножение числа строк на 4
8310	 F4DA  D0 E3	 	 	 	sal	bl,1
8311	 F4DC  74 2D	 	 	 	jz	r11	 	; если 0, занести пробелы
8312	 F4DE  8A C3	 	 	 	mov	al,bl	 	; получить число строк в AL
8313	 F4E0  B4 50	 	 	 	mov	ah,80	 	; 80 байт/строк
8314	 F4E2  F6 E4	 	 	 	mul	ah	 	; определить смещение источника
8315	 F4E4  8B F7	 	 	 	mov	si,di	 	; установить источник
8316	 F4E6  03 F0	 	 	 	add	si,ax	 	; сложить источник с ним
8317	 F4E8  8A E6	 	 	 	mov	ah,dh	 	; количество строк
8318	 F4EA  2A E3	 	 	 	sub	ah,bl	 	; определить число перемещений
8319	 	 	 	 	
8320	 F4EC	 	 	 	r8:
8321	 F4EC  E8 F56F R	 	 	call	r17	 	; перемещение одной строки
8322	 F4EF  81 EE 1FB0	 	 	sub	si,2000h-80	; перемещение в следующую строку
8323	 F4F3  81 EF 1FB0	 	 	sub	di,2000h-80
8324	 F4F7  FE CC	 	 	 	dec	ah	 	; количество строк для перемещения
8325	 F4F9  75 F1	 	 	 	jnz	r8	; продолжать, пока все строки не переместятся
8326	 	 	 	 	
8327	 	 	 	 	;   Заполнение освобожденных строк
8328	 F4FB	 	 	 	r9:
8329	 F4FB  8A C7	 	 	 	mov	al,bh
8330	 F4FD	 	 	 	r10:
8331	 F4FD  E8 F588 R	 	 	call	r18	 	; очистить эту строку
8332	 F500  81 EF 1FB0	 	 	sub	di,2000h-80	; указать на следующую
8333	 F504  FE CB	 	 	 	dec	bl	 	; количество строк для заполнения
8334	 F506  75 F5	 	 	 	jnz	r10	 	; цикл очистки
8335	 F508  E9 F1DC R	 	 	jmp	video_return	; к выходу из программы
8336	 	 	 	 	
8337	 F50B	 	 	 	r11:
8338	 F50B  8A DE	 	 	 	mov	bl,dh	 	; установить количество пробелов
8339	 F50D  EB EC	 	 	 	jmp	short r9	; очистить
8340	 F50F	 	 	 	graphics_up	endp
8341	 	 	 	 	
8342	 	 	 	 	;---------------------------------
8343	 	 	 	 	;
8344	 	 	 	 	;   Программа перемещает блок символов вниз в режиме графики
8345	 	 	 	 	;
8346	 	 	 	 	;----------------------------------
8347	 	 	 	 	
8348	 F50F	 	 	 	graphics_down proc	near
8349	 F50F  FD	 	 	 	std	 	 	; установить направление
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-165
	 	 	 	 	 	 	 	09-15-88    


8350	 F510  8A D8	 	 	 	mov	bl,al	 	; сохранить количество строк
8351	 F512  8B C2	 	 	 	mov	ax,dx	 	; получить нижнюю правую позицию в AX
8352	 	 	 	 	
8353	 	 	 	 	
8354	 F514  E8 F727 R	 	 	call	graph_posn
8355	 F517  8B F8	 	 	 	mov	di,ax	 	; сохранить результат
8356	 	 	 	 	
8357	 	 	 	 	;   Определение размера блока
8358	 	 	 	 	
8359	 F519  2B D1	 	 	 	sub	dx,cx
8360	 F51B  81 C2 0101	 	 	add	dx,101h
8361	 F51F  D0 E6	 	 	 	sal	dh,1
8362	 F521  D0 E6	 	 	 	sal	dh,1
8363	 	 	 	 	
8364	 	 	 	 	
8365	 F523  80 3E 0049 R 06	 	 	cmp	crt_mode,6
8366	 F528  73 05	 	 	 	jnc	r12
8367	 	 	 	 	
8368	 F52A  D0 E2	 	 	 	sal	dl,1
8369	 F52C  D1 E7	 	 	 	sal	di,1
8370	 F52E  47	 	 	 	inc	di
8371	 	 	 	 	
8372	 	 	 	 	;   Определение адреса источника в буфере
8373	 F52F	 	 	 	r12:
8374	 F52F  06	 	 	 	push	es
8375	 F530  1F	 	 	 	pop	ds
8376	 F531  2A ED	 	 	 	sub	ch,ch	 	; обнулить старший байт счетчика
8377	 F533  81 C7 00F0	 	 	add	di,240	 	; указать последнюю строку
8378	 F537  D0 E3	 	 	 	sal	bl,1	 	; умножить количество строк на 4
8379	 F539  D0 E3	 	 	 	sal	bl,1
8380	 F53B  74 2E	 	 	 	jz	r16	 	; если 0, заполнить пробелом
8381	 F53D  8A C3	 	 	 	mov	al,bl	 	; получить количество строк в AL
8382	 F53F  B4 50	 	 	 	mov	ah,80	 	; 80 байт/строк
8383	 F541  F6 E4	 	 	 	mul	ah	 	; определить смещение источника
8384	 F543  8B F7	 	 	 	mov	si,di	 	; установить источник
8385	 F545  2B F0	 	 	 	sub	si,ax	 	; вычесть смещение
8386	 F547  8A E6	 	 	 	mov	ah,dh	 	; количество строк
8387	 F549  2A E3	 	 	 	sub	ah,bl	 	; определить число для перемещения
8388	 	 	 	 	
8389	 F54B	 	 	 	r13:
8390	 F54B  E8 F56F R	 	 	call	r17	 	; переместить одну строку
8391	 F54E  81 EE 2050	 	 	sub	si,2000h+80	; установить следующую строку
8392	 F552  81 EF 2050	 	 	sub	di,2000h+80
8393	 F556  FE CC	 	 	 	dec	ah	 	; количество строк для перемещения
8394	 F558  75 F1	 	 	 	jnz	r13	 	; продолжать, пока все не переместятся
8395	 	 	 	 	
8396	 	 	 	 	;   Заполнение освобожденных строк
8397	 F55A	 	 	 	r14:
8398	 F55A  8A C7	 	 	 	mov	al,bh	 	; атрибут заполнения
8399	 F55C	 	 	 	r15:
8400	 F55C  E8 F588 R	 	 	call	r18	 	; очистить строку
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-166
	 	 	 	 	 	 	 	09-15-88    


8401	 F55F  81 EF 2050	 	 	sub	di,2000h+80	; указать следующую строку
8402	 F563  FE CB	 	 	 	dec	bl	 	; число строк для заполнения
8403	 F565  75 F5	 	 	 	jnz	r15
8404	 F567  FC	 	 	 	cld	 	 	; сброс признака направления
8405	 F568  E9 F1DC R	 	 	jmp	video_return	; к выходу из программы
8406	 	 	 	 	
8407	 F56B	 	 	 	r16:
8408	 F56B  8A DE	 	 	 	mov	bl,dh
8409	 F56D  EB EB	 	 	 	jmp	short r14	; очистить
8410	 F56F	 	 	 	graphics_down endp
8411	 	 	 	 	
8412	 	 	 	 	;   Программа перемещения одной строки
8413	 	 	 	 	
8414	 F56F	 	 	 	r17	proc	near
8415	 F56F  8A CA	 	 	 	mov	cl,dl	 	; число байт в строке
8416	 F571  56	 	 	 	push	si
8417	 F572  57	 	 	 	push	di	 	; хранить указатели
8418	 F573  F3/ A4	 	 	 	rep	movsb	 	; переместить четное поле
8419	 F575  5F	 	 	 	pop	di
8420	 F576  5E	 	 	 	pop	si
8421	 F577  81 C6 2000	 	 	add	si,2000h
8422	 F57B  81 C7 2000	 	 	add	di,2000h	; указать нечетное поле
8423	 F57F  56	 	 	 	push	si
8424	 F580  57	 	 	 	push	di	 	; сохранить указатели
8425	 F581  8A CA	 	 	 	mov	cl,dl	 	; возврат счвтчика
8426	 F583  F3/ A4	 	 	 	rep	movsb	 	; передать нечетное поле
8427	 F585  5F	 	 	 	pop	di
8428	 F586  5E	 	 	 	pop	si	 	; возврат указателей
8429	 F587  C3	 	 	 	ret	 	 	; возврат к программе
8430	 F588	 	 	 	r17	endp
8431	 	 	 	 	
8432	 	 	 	 	;   Заполнение пробелами строки
8433	 	 	 	 	
8434	 F588	 	 	 	r18	proc	near
8435	 F588  8A CA	 	 	 	mov	cl,dl	 	; число байт в поле
8436	 F58A  57	 	 	 	push	di	 	; хранить указатель
8437	 F58B  F3/ AA	 	 	 	rep	stosb	 	; запомнить новое значение
8438	 F58D  5F	 	 	 	pop	di	 	; вернуть указатель
8439	 F58E  81 C7 2000	 	 	add	di,2000h	; указать нечетное поле
8440	 F592  57	 	 	 	push	di
8441	 F593  8A CA	 	 	 	mov	cl,dl
8442	 F595  F3/ AA	 	 	 	rep	stosb	 	; заполнить нечетное поле
8443	 F597  5F	 	 	 	pop	di
8444	 F598  C3	 	 	 	ret	 	 	; возврат к программе
8445	 F599	 	 	 	r18	endp
8446	 	 	 	 	
8447	 	 	 	 	;--------------------------------------
8448	 	 	 	 	;
8449	 	 	 	 	;  graphics_write
8450	 	 	 	 	;
8451	 	 	 	 	;   Эта программа записывает символ в режиме графики
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-167
	 	 	 	 	 	 	 	09-15-88    


8452	 	 	 	 	;
8453	 	 	 	 	;   ВХОД
8454	 	 	 	 	;	   AL - код символа,
8455	 	 	 	 	;	   BL - атрибут цвета, который используется в качестве цвета
8456	 	 	 	 	;	 	переднего плана (цвет символа). Если бит 7 BL=1, то
8457	 	 	 	 	;	 	выполняется операция XOR над байтом в буфере и байтом
8458	 	 	 	 	;	 	в генераторе символов,
8459	 	 	 	 	;	   CX - счетчик повторений символа
8460	 	 	 	 	;
8461	 	 	 	 	;----------------------------------------
8462	 	 	 	 	
8463	 	 	 	 	 	assume cs:code,ds:data,es:data
8464	 F599	 	 	 	graphics_write proc near
8465	 F599  B4 00	 	 	 	mov	ah,0	 	; AH=0
8466	 F59B  50	 	 	 	push	ax	 	; сохранить значение кода символа
8467	 	 	 	 	
8468	 	 	 	 	;   Определение позиции в области буфера засылкой туда кода точек
8469	 	 	 	 	
8470	 F59C  E8 F724 R	 	 	call	s26	 	; найти ячейку в области буфера
8471	 F59F  8B F8	 	 	 	mov	di,ax	 	; указатель области в DI
8472	 	 	 	 	
8473	 	 	 	 	;   Определение области для получения кода точки
8474	 	 	 	 	
8475	 F5A1  58	 	 	 	pop	ax	 	; восстановить код точки
8476	 F5A2  3C 80	 	 	 	cmp	al,80h	 	; во второй половине ?
8477	 F5A4  73 06	 	 	 	jae	s1	 	; да
8478	 	 	 	 	
8479	 	 	 	 	;   Изображение есть в первой половине памяти
8480	 	 	 	 	
8481	 F5A6  BE FA6E R	 	 	mov	si, offset crt_char_gen  ; смещение изображения
8482	 F5A9  0E	 	 	 	push	cs	 	; хранить сегмент в стеке
8483	 F5AA  EB 0F	 	 	 	jmp	short s2	; определить режим
8484	 	 	 	 	
8485	 	 	 	 	;   Изображение есть во второй части памяти
8486	 	 	 	 	
8487	 F5AC	 	 	 	s1:
8488	 F5AC  2C 80	 	 	 	sub	al,80h	 	; 0 во вторую половину
8489	 F5AE  1E	 	 	 	push	ds	 	; хранить указатель данных
8490	 F5AF  2B F6	 	 	 	sub	si,si
8491	 F5B1  8E DE	 	 	 	mov	ds,si	 	; установить адресацию
8492	 	 	 	 	 	assume	ds:abs0
8493	 F5B3  C5 36 007C R	 	 	lds	si,ext_ptr	; получить смещение
8494	 F5B7  8C DA	 	 	 	mov	dx,ds	 	; получить сегмент
8495	 	 	 	 	 	assume	ds:data
8496	 F5B9  1F	 	 	 	pop	ds	 	; восстановить сегмент данных
8497	 F5BA  52	 	 	 	push	dx	 	; хранить сегмент в стеке
8498	 	 	 	 	
8499	 	 	 	 	;   Опеделение графического режима операции
8500	 	 	 	 	
8501	 F5BB	 	 	 	s2:	 	 	 	; определение режима
8502	 F5BB  D1 E0	 	 	 	sal	ax,1	 	; умножить указатель кода на 8
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-168
	 	 	 	 	 	 	 	09-15-88    


8503	 F5BD  D1 E0	 	 	 	sal	ax,1
8504	 F5BF  D1 E0	 	 	 	sal	ax,1
8505	 F5C1  03 F0	 	 	 	add	si,ax	 	; SI содержит смещение
8506	 F5C3  80 3E 0049 R 06	 	 	cmp	crt_mode,6
8507	 F5C8  1F	 	 	 	pop	ds	 	; восстановить указатель таблицы
8508	 F5C9  72 2C	 	 	 	jc	s7	; проверка для средней разрешающей способности
8509	 	 	 	 	
8510	 	 	 	 	;   Высокая разрешающая способность
8511	 F5CB	 	 	 	s3:
8512	 F5CB  57	 	 	 	push	di	 	; сохранить указатель области
8513	 F5CC  56	 	 	 	push	si	 	; сохранить указатель кода
8514	 F5CD  B6 04	 	 	 	mov	dh,4	 	; количество циклов
8515	 F5CF	 	 	 	s4:
8516	 F5CF  AC	 	 	 	lodsb	 	 	; выборка четного байта
8517	 F5D0  F6 C3 80	 	 	 	test	bl,80h
8518	 F5D3  75 16	 	 	 	jnz	s6
8519	 F5D5  AA	 	 	 	stosb
8520	 F5D6  AC	 	 	 	lodsb
8521	 F5D7	 	 	 	s5:
8522	 F5D7  26: 88 85 1FFF	 	 	mov es:[di+1fffh],al	; запомнить во второй части
8523	 F5DC  83 C7 4F	 	 	 	add	di,79	 	; передать следующую строку
8524	 F5DF  FE CE	 	 	 	dec	dh	 	; выполнить цикл
8525	 F5E1  75 EC	 	 	 	jnz	s4
8526	 F5E3  5E	 	 	 	pop	si
8527	 F5E4  5F	 	 	 	pop	di	 	; восстановить указатель области
8528	 F5E5  47	 	 	 	inc	di	; указать на следующую позицию символа
8529	 F5E6  E2 E3	 	 	 	loop	s3	 	; записать последующие символы
8530	 F5E8  E9 F1DC R	 	 	jmp	video_return
8531	 	 	 	 	
8532	 F5EB	 	 	 	s6:
8533	 F5EB  26: 32 05	 	 	xor al,es:[di]
8534	 F5EE  AA	 	 	 	stosb	 	 	; запомнить код
8535	 F5EF  AC	 	 	 	lodsb	 	 	; выборка нечетного символа
8536	 F5F0  26: 32 85 1FFF	 	 	xor  al,es:[di+1fffh]
8537	 F5F5  EB E0	 	 	 	jmp	s5	 	; повторить
8538	 	 	 	 	
8539	 	 	 	 	;   Средняя разрешающая способность записи
8540	 F5F7	 	 	 	s7:
8541	 F5F7  8A D3	 	 	 	mov	dl,bl	 	; сохранить старший бит цвета
8542	 F5F9  D1 E7	 	 	 	sal	di,1	; умножить на 2, т.к. два байта/символа
8543	 F5FB  E8 F6CF R	 	 	call	s19	 	; расширение BL до полного слова цвета
8544	 F5FE	 	 	 	s8:
8545	 F5FE  57	 	 	 	push	di
8546	 F5FF  56	 	 	 	push	si
8547	 F600  B6 04	 	 	 	mov	dh,4	 	; число циклов
8548	 F602	 	 	 	s9:
8549	 F602  AC	 	 	 	lodsb	 	 	; получить код точки
8550	 F603  E8 F6E4 R	 	 	call	s21	 	; продублировать
8551	 F606  23 C3	 	 	 	and	ax,bx	 	; окрашивание в заданный цвет
8552	 F608  F6 C2 80	 	 	 	test	dl,80h
8553	 F60B  74 07	 	 	 	jz	s10
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-169
	 	 	 	 	 	 	 	09-15-88    


8554	 F60D  26: 32 25	 	 	xor	ah,es:[di]	; выполнить функцию XOR со "старым"
8555	 F610  26: 32 45 01	 	 	xor	al,es:[di+1]	; и "новым" цветами
8556	 F614  26: 88 25	 	s10:	mov  es:[di],ah 	; запомнить первый байт
8557	 F617  26: 88 45 01	 	 	mov es:[di+1],al	; запомнить второй байт
8558	 F61B  AC	 	 	 	lodsb	 	 	; получить код точки
8559	 F61C  E8 F6E4 R	 	 	call	s21
8560	 F61F  23 C3	 	 	 	and	ax,bx	 	; окрашивание нечетного байта
8561	 F621  F6 C2 80	 	 	 	test	dl,80h
8562	 F624  74 0A	 	 	 	jz  s11
8563	 F626  26: 32 A5 2000	 	 	xor	ah,es:[di+2000h]   ; из первой половины
8564	 F62B  26: 32 85 2001	 	 	xor	al,es:[di+2001h]   ; и из второй половины
8565	 F630  26: 88 A5 2000	 	s11:	mov	es:[di+2000h],ah
8566	 F635  26: 88 85 2001	 	 	mov	es:[di+2001h],al   ; запомнить вторую часть буфера
8567	 F63A  83 C7 50	 	 	 	add	di,80	 	; указать следующую ячейку
8568	 F63D  FE CE	 	 	 	dec	dh
8569	 F63F  75 C1	 	 	 	jnz	s9	 	; повторить
8570	 F641  5E	 	 	 	pop	si
8571	 F642  5F	 	 	 	pop	di
8572	 F643  83 C7 02	 	 	 	add	di,2	 	; переход к следующему символу
8573	 F646  E2 B6	 	 	 	loop	s8	 	; режим записи
8574	 F648  E9 F1DC R	 	 	jmp	video_return
8575	 F64B	 	 	 	graphics_write	endp
8576	 	 	 	 	;-------------------------------------
8577	 	 	 	 	;graphics_read
8578	 	 	 	 	;
8579	 	 	 	 	;   Программа считывает символ в режиме графики
8580	 	 	 	 	;
8581	 	 	 	 	;-------------------------------------
8582	 F64B	 	 	 	graphics_read	proc	near
8583	 F64B  E8 F724 R	 	 	call	s26
8584	 F64E  8B F0	 	 	 	mov	si,ax	 	; сохранить в SI
8585	 F650  83 EC 08	 	 	 	sub	sp,8	 	; зарезервировать в стеке 8 байт для
8586	 	 	 	 	 	 	 	 	; записи символа из буфера дисплея
8587	 F653  8B EC	 	 	 	mov	bp,sp	 	; указатель для хранения области
8588	 	 	 	 	
8589	 	 	 	 	;   Определение режима графики
8590	 	 	 	 	
8591	 F655  80 3E 0049 R 06	 	 	cmp	crt_mode,6
8592	 F65A  06	 	 	 	push	es
8593	 F65B  1F	 	 	 	pop	ds	 	; указать сегмент
8594	 F65C  72 1A	 	 	 	jc	s13	 	; средняя разрешающая способность
8595	 	 	 	 	
8596	 	 	 	 	;  Высокая разрешающая способность для считавания
8597	 	 	 	 	
8598	 F65E  B6 04	 	 	 	mov	dh,4
8599	 F660	 	 	 	s12:
8600	 F660  8A 04	 	 	 	mov	al,byte ptr [si]   ; получить первый байт
8601	 F662  88 46 00	 	 	 	mov byte ptr [bp],al	   ; запомнить в памяти
8602	 F665  45	 	 	 	inc	bp
8603	 F666  8A 84 2000	 	 	mov al,byte ptr [si+2000h]   ; получить младший байт
8604	 F66A  88 46 00	 	 	 	mov byte ptr [bp],al
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-170
	 	 	 	 	 	 	 	09-15-88    


8605	 F66D  45	 	 	 	inc	bp
8606	 F66E  83 C6 50	 	 	 	add	si,80	 	; переход на следующую четную строку
8607	 F671  FE CE	 	 	 	dec	dh
8608	 F673  75 EB	 	 	 	jnz	s12	 	; повторить
8609	 F675  EB 17 90	 	 	 	jmp	s15	 	; переход к хранению кодов точек
8610	 	 	 	 	
8611	 	 	 	 	;   Средняя разрешающая способность для считывания
8612	 F678	 	 	 	s13:
8613	 F678  D1 E6	 	 	 	sal	si,1	  ; смещение умножить на 2, т.к. 2 байта/символа
8614	 F67A  B6 04	 	 	 	mov	dh,4
8615	 F67C	 	 	 	s14:
8616	 F67C  E8 F707 R	 	 	call	s23
8617	 F67F  81 C6 2000	 	 	add	si,2000h
8618	 F683  E8 F707 R	 	 	call	s23
8619	 F686  81 EE 1FB0	 	 	sub	si,2000h-80
8620	 F68A  FE CE	 	 	 	dec	dh
8621	 F68C  75 EE	 	 	 	jnz	s14	 	; повторить
8622	 	 	 	 	
8623	 	 	 	 	;   Сохранить
8624	 F68E	 	 	 	s15:
8625	 F68E  BF FA6E R	 	 	mov	di,offset crt_char_gen	 ; смещение
8626	 F691  0E	 	 	 	push	cs
8627	 F692  07	 	 	 	pop	es
8628	 F693  83 ED 08	 	 	 	sub	bp,8	 	; восстановить начальный адрес
8629	 F696  8B F5	 	 	 	mov	si,bp
8630	 F698  FC	 	 	 	cld	 	 	; установить направление
8631	 F699  B0 00	 	 	 	mov	al,0
8632	 F69B	 	 	 	s16:
8633	 F69B  16	 	 	 	push	ss
8634	 F69C  1F	 	 	 	pop	ds
8635	 F69D  BA 0080	 	 	 	mov	dx,128	 	; количество символов
8636	 F6A0	 	 	 	s17:
8637	 F6A0  56	 	 	 	push	si
8638	 F6A1  57	 	 	 	push	di
8639	 F6A2  B9 0008	 	 	 	mov	cx,8	 	; количество байт в символе
8640	 F6A5  F3/ A6	 	 	 	repe	cmpsb	 	; сравнить
8641	 F6A7  5F	 	 	 	pop	di
8642	 F6A8  5E	 	 	 	pop	si
8643	 F6A9  74 1E	 	 	 	jz	s18	 	; если признак = 0,символы сравнились
8644	 F6AB  FE C0	 	 	 	inc	al	 	; не сравнились
8645	 F6AD  83 C7 08	 	 	 	add	di,8	 	; следующий код точки
8646	 F6B0  4A	 	 	 	dec	dx	 	; - 1 из счетчика
8647	 F6B1  75 ED	 	 	 	jnz	s17	 	; повторить
8648	 	 	 	 	
8649	 	 	 	 	
8650	 F6B3  3C 00	 	 	 	cmp	al,0
8651	 F6B5  74 12	 	 	 	je	s18    ; переход, если все сканировано, но символ
8652	 	 	 	 	 	 	       ; не найден
8653	 F6B7  2B C0	 	 	 	sub	ax,ax
8654	 F6B9  8E D8	 	 	 	mov	ds,ax	 	; установить адресацию вектора
8655	 	 	 	 	 	assume	ds:abs0
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-171
	 	 	 	 	 	 	 	09-15-88    


8656	 F6BB  C4 3E 007C R	 	 	les	di,ext_ptr
8657	 F6BF  8C C0	 	 	 	mov	ax,es
8658	 F6C1  0B C7	 	 	 	or	ax,di
8659	 F6C3  74 04	 	 	 	jz	s18
8660	 F6C5  B0 80	 	 	 	mov	al,128	 	; начало второй части
8661	 F6C7  EB D2	 	 	 	jmp	short s16	; вернуться и повторить
8662	 	 	 	 	 	assume	ds:data
8663	 	 	 	 	
8664	 F6C9	 	 	 	s18:
8665	 F6C9  83 C4 08	 	 	 	add	sp,8
8666	 F6CC  E9 F1DC R	 	 	jmp	video_return
8667	 F6CF	 	 	 	graphics_read	endp
8668	 	 	 	 	
8669	 	 	 	 	;---------------------------------
8670	 	 	 	 	;
8671	 	 	 	 	;   Эта программа заполняет регистр BX двумя младшими битами
8672	 	 	 	 	; регистра BL.
8673	 	 	 	 	;
8674	 	 	 	 	;   ВХОД
8675	 	 	 	 	;	   BL - используемый цвет (младшие два бита).
8676	 	 	 	 	;
8677	 	 	 	 	;   ВЫХОД
8678	 	 	 	 	;	   BX - используемый цвет (восемь повторений двух битов цвета).
8679	 	 	 	 	;
8680	 	 	 	 	;---------------------------------
8681	 F6CF	 	 	 	s19	proc	near
8682	 F6CF  80 E3 03	 	 	 	and	bl,3	 	; выделить биты цвета
8683	 F6D2  8A C3	 	 	 	mov	al,bl	 	; переписать в AL
8684	 F6D4  51	 	 	 	push	cx	 	; сохранить регистр
8685	 F6D5  B9 0003	 	 	 	mov	cx,3	 	; количество повторений
8686	 F6D8	 	 	 	s20:
8687	 F6D8  D0 E0	 	 	 	sal	al,1
8688	 F6DA  D0 E0	 	 	 	sal	al,1	 	; сдвиг влево на 2
8689	 F6DC  0A D8	 	 	 	or	bl,al	 	; в BL накапливается результат
8690	 F6DE  E2 F8	 	 	 	loop	s20	 	; цикл
8691	 F6E0  8A FB	 	 	 	mov	bh,bl	 	; заполнить
8692	 F6E2  59	 	 	 	pop	cx
8693	 F6E3  C3	 	 	 	ret	 	 	; все выполнено
8694	 F6E4	 	 	 	s19	endp
8695	 	 	 	 	;--------------------------------------
8696	 	 	 	 	;
8697	 	 	 	 	;   Эта программа берет байт в AL и удваивает все биты, превращая
8698	 	 	 	 	; 8 бит в 16 бит. Результат помещается в AX.
8699	 	 	 	 	;--------------------------------------
8700	 F6E4	 	 	 	s21	proc	near
8701	 F6E4  52	 	 	 	push	dx	 	; сохранить регистры
8702	 F6E5  51	 	 	 	push	cx
8703	 F6E6  53	 	 	 	push	bx
8704	 F6E7  BA 0000	 	 	 	mov	dx,0	 	; результат удвоения
8705	 F6EA  B9 0001	 	 	 	mov	cx,1	 	; маска
8706	 F6ED	 	 	 	s22:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-172
	 	 	 	 	 	 	 	09-15-88    


8707	 F6ED  8B D8	 	 	 	mov	bx,ax
8708	 F6EF  23 D9	 	 	 	and	bx,cx	 	; выделение бита
8709	 F6F1  0B D3	 	 	 	or	dx,bx	 	; накапливание результата
8710	 F6F3  D1 E0	 	 	 	shl	ax,1
8711	 F6F5  D1 E1	 	 	 	shl	cx,1	 	; сдвинуть базу и маску на 1
8712	 F6F7  8B D8	 	 	 	mov	bx,ax
8713	 F6F9  23 D9	 	 	 	and	bx,cx
8714	 F6FB  0B D3	 	 	 	or	dx,bx
8715	 F6FD  D1 E1	 	 	 	shl	cx,1	; сдиг маски, для выделения следующего бита
8716	 F6FF  73 EC	 	 	 	jnc	s22
8717	 F701  8B C2	 	 	 	mov	ax,dx
8718	 F703  5B	 	 	 	pop	bx	 	; восстановить регистры
8719	 F704  59	 	 	 	pop	cx
8720	 F705  5A	 	 	 	pop	dx
8721	 F706  C3	 	 	 	ret	 	 	; к выходу из прерывания
8722	 F707	 	 	 	s21	endp
8723	 	 	 	 	
8724	 	 	 	 	;----------------------------------
8725	 	 	 	 	;
8726	 	 	 	 	;   Эта программа преобразовывает двух-битовое представление точки
8727	 	 	 	 	; (C1,C0) в однобитовое
8728	 	 	 	 	; (C1,C0) к однобитовому.
8729	 	 	 	 	;
8730	 	 	 	 	;----------------------------------
8731	 F707	 	 	 	s23	proc	near
8732	 F707  8A 24	 	 	 	mov	ah,byte ptr [si]   ; получить первый байт
8733	 F709  8A 44 01	 	 	 	mov	al,byte ptr [si+1]   ; получить второй байт
8734	 F70C  B9 C000	 	 	 	mov	cx,0c000h	; 2 бита маски
8735	 F70F  B2 00	 	 	 	mov	dl,0	 	; регистр результата
8736	 F711	 	 	 	s24:
8737	 F711  85 C1	 	 	 	test	ax,cx	 	; проверка 2 младших бит AX на 0
8738	 F713  F8	 	 	 	clc	 	 	; сбросить признак переноса CF
8739	 F714  74 01	 	 	 	jz	s25	 	; переход если 0
8740	 F716  F9	 	 	 	stc	 	 	; нет - установить CF
8741	 F717  D0 D2	 	 	s25:	rcl	dl,1	 	; циклический сдвиг
8742	 F719  D1 E9	 	 	 	shr	cx,1
8743	 F71B  D1 E9	 	 	 	shr	cx,1
8744	 F71D  73 F2	 	 	 	jnc	s24	 	; повторить, если CF=1
8745	 F71F  88 56 00	 	 	 	mov byte ptr [bp],dl	; запомнить результат
8746	 F722  45	 	 	 	inc	bp
8747	 F723  C3	 	 	 	ret	 	 	; к выходу из прерывания
8748	 F724	 	 	 	s23	endp
8749	 	 	 	 	
8750	 	 	 	 	;---------------------------------------
8751	 	 	 	 	;
8752	 	 	 	 	;   Эта программа определает положение курсора относительно	 мяти и
8753	 	 	 	 	; начала буфера в режиме графики	 	 	 	 /символ
8754	 	 	 	 	;
8755	 	 	 	 	;   ВЫХОД
8756	 	 	 	 	;	   AX  содержит смещение курсора
8757	 	 	 	 	;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-173
	 	 	 	 	 	 	 	09-15-88    


8758	 	 	 	 	;-----------------------------------------
8759	 F724	 	 	 	s26	proc	near
8760	 F724  A1 0050 R	 	 	mov	ax,cursor_posn	; получить текущее положение курсора
8761	 F727	 	 	 	graph_posn	label	near
8762	 F727  53	 	 	 	push	bx	 	; сохранить регистр
8763	 F728  8B D8	 	 	 	mov	bx,ax	 	; сохранить текущее положение курсора
8764	 F72A  8A C4	 	 	 	mov	al,ah	 	; строка
8765	 F72C  F6 26 004A R	 	 	mul	byte ptr crt_cols   ; умножить на байт/колонку
8766	 F730  D1 E0	 	 	 	shl	ax,1	 	; умножить на 4
8767	 F732  D1 E0	 	 	 	shl	ax,1
8768	 F734  2A FF	 	 	 	sub	bh,bh	 	; выделить значение колонки
8769	 F736  03 C3	 	 	 	add	ax,bx	 	; определить смещение
8770	 F738  5B	 	 	 	pop	bx
8771	 F739  C3	 	 	 	ret	 	 	; к выходу из прерывания
8772	 F73A	 	 	 	s26	endp
8773	 	 	 	 	
8774	 	 	 	 	;
8775	 	 	 	 	;----------------------------------------
8776	 	 	 	 	;
8777	 	 	 	 	;   Эта программа считывает положение светового пера.
8778	 	 	 	 	; Проверяется переключатель и триггер светового пера. Если бит 1 ре-
8779	 	 	 	 	; гистра состояния (порт 3DA)=1, то триггер установлен. Если бит 2 порта
8780	 	 	 	 	; 3DA=0, то установлен переключатель.
8781	 	 	 	 	;   Порты 3BD и 3DC используются для установки и сброса триггера и пере-
8782	 	 	 	 	; ключателя светового пера.
8783	 	 	 	 	;   В регистрах R16 и R17 контроллера содержится адрес координат пера
8784	 	 	 	 	; относительно начала буфера дисплея.
8785	 	 	 	 	;   Если триггер и переключатель установлены, то программа определяет
8786	 	 	 	 	; положение светового пера, в противном случае, возврат без выдачи
8787	 	 	 	 	; информации.
8788	 	 	 	 	;
8789	 	 	 	 	;   В ППЭВМ ЕС1841 функция не поддерживается
8790	 	 	 	 	;-------------------------------------------------
8791	 	 	 	 	
8792	 	 	 	 	
8793	 	 	 	 	
8794	 F7AE	 	 	 	 	org	0f7aeh
8795	 	 	 	 	
8796	 	 	 	 	
8797	 	 	 	 	 	assume	cs:code,ds:data
8798	 	 	 	 	
8799	 	 	 	 	;   Таблица поправок для получения фактических координат светового пера
8800	 	 	 	 	
8801	 F7AE	 	 	 	v1	label	byte
8802	 F7AE  03 03 05 05 03 03	 	db	3,3,5,5,3,3,3,4
8803	       03 04	 	 	
8804	 F7B6	 	 	 	read_lpen	proc	near
8805	 	 	 	 	
8806	 	 	 	 	
8807	 F7B6  B4 00	 	 	 	mov	ah,0	 	; код возврата, если перо не включено
8808	 F7B8  8B 16 0063 R	 	 	mov	dx,addr_6845	; получить базовый адрес 6845
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-174
	 	 	 	 	 	 	 	09-15-88    


8809	 F7BC  83 C2 06	 	 	 	add	dx,6	 	; указать регистр состояния
8810	 F7BF  EC	 	 	 	in	al,dx	 	; получить регистр состояния
8811	 F7C0  A8 04	 	 	 	test	al,4	 	; проверить переключатель светового пера
8812	 F7C2  75 78	 	 	 	jnz	v6	 	; не установлено, возврат
8813	 	 	 	 	
8814	 	 	 	 	;   Проверка триггера светового пера
8815	 	 	 	 	
8816	 F7C4  A8 02	 	 	 	test	al,2	 	; проверить триггер светового пера
8817	 F7C6  74 7E	 	 	 	jz	v7	 	; возврат без сброса триггера
8818	 	 	 	 	
8819	 	 	 	 	;   Триггер был установлен, считать значение в AH
8820	 	 	 	 	
8821	 F7C8  B4 10	 	 	 	mov	ah,16	 	; уст регистры светового пера 6845
8822	 	 	 	 	
8823	 	 	 	 	;   Ввод регистров, указанных AH и преобразование в строки колонки в DX
8824	 	 	 	 	
8825	 F7CA  8B 16 0063 R	 	 	mov	dx,addr_6845
8826	 F7CE  8A C4	 	 	 	mov	al,ah
8827	 F7D0  EE	 	 	 	out	dx,al	 	; вывести в порт
8828	 F7D1  42	 	 	 	inc	dx
8829	 F7D2  EC	 	 	 	in	al,dx	 	; получить значение из порта
8830	 F7D3  8A E8	 	 	 	mov	ch,al	 	; сохранить его в CX
8831	 F7D5  4A	 	 	 	dec	dx	 	; регистр адреса
8832	 F7D6  FE C4	 	 	 	inc	ah
8833	 F7D8  8A C4	 	 	 	mov	al,ah	 	; второй регистр данных
8834	 F7DA  EE	 	 	 	out	dx,al
8835	 F7DB  42	 	 	 	inc	dx
8836	 F7DC  EC	 	 	 	in	al,dx	 	; получить второе значение данных
8837	 F7DD  8A E5	 	 	 	mov	ah,ch	 	; AX содержит координаты светового пера
8838	 	 	 	 	
8839	 	 	 	 	
8840	 F7DF  8A 1E 0049 R	 	 	mov	bl,crt_mode
8841	 F7E3  2A FF	 	 	 	sub	bh,bh	 	; выделить значение режима в BX
8842	 F7E5  2E: 8A 9F F7AE R	 	 	mov	bl,cs:v1[bx]	; значение поправки
8843	 F7EA  2B C3	 	 	 	sub	ax,bx
8844	 F7EC  2B 06 004E R	 	 	sub	ax,crt_start
8845	 	 	 	 	
8846	 F7F0  79 03	 	 	 	jns	v2
8847	 F7F2  B8 0000	 	 	 	mov	ax,0	 	; поместить 0
8848	 	 	 	 	
8849	 	 	 	 	;   Определить режим
8850	 	 	 	 	
8851	 F7F5	 	 	 	v2:
8852	 F7F5  B1 03	 	 	 	mov	cl,3	 	; установить счетчик
8853	 F7F7  80 3E 0049 R 04	 	 	cmp	crt_mode,4	; определить, режим графики или
8854	 	 	 	 	 	 	 	 	; альфа
8855	 F7FC  72 2A	 	 	 	jb	v4	 	; альфа-перо
8856	 F7FE  80 3E 0049 R 07	 	 	cmp	crt_mode,7
8857	 F803  74 23	 	 	 	je	v4	 	; альфа-перо
8858	 	 	 	 	
8859	 	 	 	 	;   Графический режим
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-175
	 	 	 	 	 	 	 	09-15-88    


8860	 	 	 	 	
8861	 F805  B2 28	 	 	 	mov	dl,40	 	; делитель для графики
8862	 F807  F6 F2	 	 	 	div	dl	; определение строки (AL) и колонки (AH)
8863	 	 	 	 	 	 	 	 	; пределы AL 0-99, AH 0-39
8864	 	 	 	 	
8865	 	 	 	 	;   Определение положения строки для графики
8866	 	 	 	 	
8867	 F809  8A E8	 	 	 	mov	ch,al	 	; сохранить значение строки в CH
8868	 F80B  02 ED	 	 	 	add	ch,ch	 	; умножить на 2 четно/нечетное поле
8869	 F80D  8A DC	 	 	 	mov	bl,ah	 	; значение колонки в BX
8870	 F80F  2A FF	 	 	 	sub	bh,bh	 	; умножить на 8 для среднего результата
8871	 F811  80 3E 0049 R 06	 	 	cmp	crt_mode,6	; определить среднюю или наивысшую
8872	 	 	 	 	 	 	 	 	; разрешающую способность
8873	 F816  75 04	 	 	 	jne	v3	 	; не наивысшая разрешающая способность
8874	 F818  B1 04	 	 	 	mov	cl,4	 ; сдвинуть значение наивысшей разрешающей
8875	 	 	 	 	 	 	 	 ; способности
8876	 F81A  D0 E4	 	 	 	sal	ah,1	; сдвиг на 1 разряд влево значения колонки
8877	 F81C	 	 	 	v3:	 	 	 	; не наивысшая разрешающая способность
8878	 F81C  D3 E3	 	 	 	shl	bx,cl	; умножить на 16 для наивысшей разрешающей
8879	 	 	 	 	 	 	 	; способности
8880	 	 	 	 	
8881	 	 	 	 	;   Определение положения символа для альфа
8882	 	 	 	 	
8883	 F81E  8A D4	 	 	 	mov	dl,ah	 	; значение колонки для возврата
8884	 F820  8A F0	 	 	 	mov	dh,al	 	; значение строки
8885	 F822  D0 EE	 	 	 	shr	dh,1	 	; делить на 4
8886	 F824  D0 EE	 	 	 	shr	dh,1	 	; для значения в пределах 0-24
8887	 F826  EB 12	 	 	 	jmp	short v5	; возврат светового пера
8888	 	 	 	 	
8889	 	 	 	 	;   Режим альфа светового пера
8890	 	 	 	 	
8891	 F828	 	 	 	v4:	 	 	 	; альфа светового пера
8892	 F828  F6 36 004A R	 	 	div	byte ptr crt_cols  ; строка, колонка
8893	 F82C  8A F0	 	 	 	mov	dh,al	 	; строка в DH
8894	 F82E  8A D4	 	 	 	mov	dl,ah	 	; колонка в DL
8895	 F830  D2 E0	 	 	 	sal	al,cl	 	; умножение строк на 8
8896	 F832  8A E8	 	 	 	mov	ch,al
8897	 F834  8A DC	 	 	 	mov	bl,ah
8898	 F836  32 FF	 	 	 	xor	bh,bh
8899	 F838  D3 E3	 	 	 	sal	bx,cl
8900	 F83A	 	 	 	v5:
8901	 F83A  B4 01	 	 	 	mov	ah,1	 	; указать, что все установлено
8902	 F83C	 	 	 	v6:
8903	 F83C  52	 	 	 	push	dx	 	; сохранить значение возврата
8904	 F83D  8B 16 0063 R	 	 	mov	dx,addr_6845	; получить базовый адрес
8905	 F841  83 C2 07	 	 	 	add	dx,7
8906	 F844  EE	 	 	 	out	dx,al	 	; вывод
8907	 F845  5A	 	 	 	pop	dx	 	; восстановить значение
8908	 F846	 	 	 	v7:
8909	 F846  5F	 	 	 	pop	di	 	 ; восстановить регистры
8910	 F847  5E	 	 	 	pop	si
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-176
	 	 	 	 	 	 	 	09-15-88    


8911	 F848  1F	 	 	 	pop	ds
8912	 F849  1F	 	 	 	pop	ds
8913	 F84A  1F	 	 	 	pop	ds
8914	 F84B  1F	 	 	 	pop	ds
8915	 F84C  07	 	 	 	pop	es
8916	 F84D  CF	 	 	 	iret
8917	 F84E	 	 	 	read_lpen	endp
8918	 	 	 	 	
8919	 	 	 	 	;--- int 12 ------------------------------------
8920	 	 	 	 	;
8921	 	 	 	 	;    Программа определения размера памяти.
8922	 	 	 	 	;
8923	 	 	 	 	;    Эта программа передает в регистр AX об'ем памяти в Кбайтах.
8924	 	 	 	 	;
8925	 	 	 	 	;-----------------------------------------
8926	 	 	 	 	
8927	 	 	 	 	 	assume	cs:code,ds:data
8928	 F84E	 	 	 	memory_size_determine	proc	far
8929	 F84E  FB	 	 	 	sti	 	 	; установить бит разрешения прерывания
8930	 F84F  1E	 	 	 	push	ds	 	; сохранить сегмент
8931	 F850  B8 0040	 	 	 	mov	ax,dat	 	; установить адресацию
8932	 F853  8E D8	 	 	 	mov	ds,ax
8933	 F855  A1 0013 R	 	 	mov	ax,memory_size	; получить значение размера памяти
8934	 F858  1F	 	 	 	pop	ds	 	; восстановить сегмент
8935	 F859  CF	 	 	 	iret	 	 	; возврат из прерывания
8936	 F85A	 	 	 	memory_size_determine	endp
8937	 	 	 	 	
8938	 	 	 	 	;--- int 11-------------------------------
8939	 	 	 	 	;
8940	 	 	 	 	;    Программа определения состава оборудования.
8941	 	 	 	 	;
8942	 	 	 	 	;   Эта программа передает в регистр AX конфигурацию системы.
8943	 	 	 	 	;
8944	 	 	 	 	;   Разряды регистра AX имеют следующее значение:
8945	 	 	 	 	;   0	    - загрузка системы с НГМД;
8946	 	 	 	 	;   5,4     - тип подключенного ЭЛИ и режим его работы:
8947	 	 	 	 	;	      00 - не используется;
8948	 	 	 	 	;	      01 - 40х25, черно-белый режим цветного графического
8949	 	 	 	 	;	 	   ЭЛИ;
8950	 	 	 	 	;	      10 - 80х25, черно-белый режим цветного графического
8951	 	 	 	 	;	 	   ЭЛИ;
8952	 	 	 	 	;	      11 - 80х25, черно-белый режим монохромного ЭЛИ.
8953	 	 	 	 	;   7,6     - количество НГМД;
8954	 	 	 	 	;   11,10,9 - количество адаптеров стыка С2;
8955	 	 	 	 	;   12	    - адаптер игр;
8956	 	 	 	 	;   15,14   - количество печатающих устройств.
8957	 	 	 	 	;   Разряды 6 и 7 устанавливаются только в том случае, если
8958	 	 	 	 	; разряд 0 установлен в "1".
8959	 	 	 	 	;
8960	 	 	 	 	;----------------------------------------------
8961	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-177
	 	 	 	 	 	 	 	09-15-88    


8962	 	 	 	 	 	assume	cs:code,ds:data
8963	 F85A	 	 	 	equipment	proc	far
8964	 F85A  FB	 	 	 	sti	 	 	; установить признак разрешения прерывания
8965	 F85B  1E	 	 	 	push	ds	 	; сохранить сегмент
8966	 F85C  B8 0040	 	 	 	mov	ax,dat	 	; установить адресацию
8967	 F85F  8E D8	 	 	 	mov	ds,ax
8968	 F861  A1 0010 R	 	 	mov	ax,equip_flag	; получить конфигурацию системы
8969	 F864  1F	 	 	 	pop	ds	 	; восстановить сегмент
8970	 F865  CF	 	 	 	iret	 	 	; возврат из прерывания
8971	 F866	 	 	 	equipment	endp
8972	 	 	 	 	
8973	 	 	 	 	;****************************************
8974	 	 	 	 	;
8975	 	 	 	 	;   Загрузка знакогенератора
8976	 	 	 	 	;
8977	 	 	 	 	;****************************************
8978	 	 	 	 	
8979	 F866	 	 	 	bct	proc	near
8980	 F866  B8 DC00	 	 	 	mov	ax,0dc00h
8981	 F869  8E C0	 	 	 	mov	es,ax
8982	 F86B  B9 1000	 	 	 	mov	cx,1000h
8983	 F86E  BA 03B8	 	 	 	mov	dx,3b8h
8984	 F871  33 C0	 	 	 	xor	ax,ax
8985	 F873  EE	 	 	 	out	dx,al
8986	 F874  33 FF	 	 	 	xor	di,di
8987	 F876  FC	 	 	 	cld
8988	 F877  F3/ AB	 	 	 	rep	stosw
8989	 F879  BE FA6E R	 	bct3:	mov	si,offset crt_char_gen
8990	 F87C  33 FF	 	 	 	xor	di,di
8991	 F87E  33 C0	 	 	 	xor	ax,ax
8992	 F880  B9 0100	 	 	 	mov	cx,256
8993	 F883	 	 	 	bct1:
8994	 F883  B3 08	 	 	 	mov	bl,8
8995	 F885  2E: 8A 04	 	bct2:	mov	al,cs:[si]
8996	 F888  46	 	 	 	inc	si
8997	 F889  26: 89 05	 	 	mov	word ptr es:[di],ax
8998	 F88C  47	 	 	 	inc	di
8999	 F88D  47	 	 	 	inc	di
9000	 F88E  FE CB	 	 	 	dec	bl
9001	 F890  75 F3	 	 	 	jnz	bct2
9002	 F892  83 C7 10	 	 	 	add	di,10h
9003	 F895  49	 	 	 	dec	cx
9004	 F896  75 03	 	 	 	jnz	pr128
9005	 F898  E9 CB63 R	 	 	jmp	zagrcw
9006	 F89B  81 F9 0080	 	pr128:	cmp	cx,128
9007	 F89F  75 E2	 	 	 	jne	bct1
9008	 F8A1  BE CBB2 R	 	 	mov	si,offset crt_char_rus
9009	 F8A4  EB DD	 	 	 	jmp	bct1
9010	 F8A6  C3	 	 	kzagr:	ret
9011	 F8A7	 	 	 	bct	endp
9012	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-178
	 	 	 	 	 	 	 	09-15-88    


9013	 	 	 	 	;
9014	 	 	 	 	;   Таблица кодов русских маленьких букв (строчных)
9015	 	 	 	 	;
9016	 F8A7	 	 	 	rust	label	byte
9017	 F8A7  1B 31 32 33 34 35	 	db	1bh,'1234567890-='
9018	       36 37 38 39 30 2D	
9019	       3D	 	 	
9020	 F8B4  08 09	 	 	 	db	08h,09h
9021	 F8B6  D9 E6 E3 DA D5 DD	 	db	0d9h,0e6h,0e3h,0dah,0d5h,0ddh,0d3h,0e8h
9022	       D3 E8	 	 	
9023	 F8BE  E9 D7 D6 ED 0D FF	 	db	0e9h,0d7h,0d6h,0edh,0dh,-1,0e4h,0ebh
9024	       E4 EB	 	 	
9025	 F8C6  D2 D0 DF E0 DE DB	 	db	0d2h,0d0h,0dfh,0e0h,0deh,0dbh,0d4h,';:'
9026	       D4 3B 3A	 	 	
9027	 F8CF  D1 EE 5C EF E7 E1	 	db	0d1h,0eeh,5ch,0efh,0e7h,0e1h,0dch,0d8h
9028	       DC D8	 	 	
9029	 F8D7  E2 EC 2C 2E 2F E5	 	db	0e2h,0ech,',./',0e5h,'*'
9030	       2A	 	 	
9031	 F8DE  FF 20 EA	 	 	 	db	-1,' ',0eah
9032	 	 	 	 	
9033	 	 	 	 	
9034	 F8E1	 	 	 	k30	label	byte
9035	 F8E1  52 4F 50 51 4B 4C	 	db	82,79,80,81,75,76,77
9036	       4D	 	 	
9037	 F8E8  47 48 49	 	 	 	db	71,72,73
9038	 	 	 	 	;---
9039	 F8EB  10 11 12 13 14 15	 	db	16,17,18,19,20,21,22,23
9040	       16 17	 	 	
9041	 F8F3  18 19 1E 1F 20 21	 	db	24,25,30,31,32,33,34,35
9042	       22 23	 	 	
9043	 F8FB  24 25 26 2C 2D 2E	 	db	36,37,38,44,45,46,47,48
9044	       2F 30	 	 	
9045	 F903  31 32	 	 	 	db	49,50
9046	 	 	 	 	
9047	 	 	 	 	;---
9048	 F905  F6 06 0017 R 03	 	k89:	test	kb_flag,left_shift+right_shift
9049	 F90A  74 11	 	 	 	jz	k80
9050	 F90C  3C F0	 	 	 	cmp	al,0f0h
9051	 F90E  74 23	 	 	 	je	k89a
9052	 F910  3C B0	 	 	 	cmp	al,0b0h
9053	 F912  72 06	 	 	 	jb	k81
9054	 F914  3C CF	 	 	 	cmp	al,0cfh
9055	 F916  77 02	 	 	 	ja	k81
9056	 F918  04 20	 	 	 	add	al,20h
9057	 F91A  E9 E756 R	 	k81:	jmp	k61
9058	 F91D  3C F1	 	 	k80:	cmp	al,0f1h
9059	 F91F  74 0D	 	 	 	je	k89b
9060	 F921  3C D0	 	 	 	cmp	al,0d0h
9061	 F923  72 F5	 	 	 	jb	k81
9062	 F925  3C FE	 	 	 	cmp	al,0feh
9063	 F927  77 F1	 	 	 	ja	k81
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-179
	 	 	 	 	 	 	 	09-15-88    


9064	 F929  2C 20	 	 	 	sub	al,20h
9065	 F92B  E9 E756 R	 	 	jmp	k61
9066	 F92E  2C 01	 	 	k89b:	sub	al,01h
9067	 F930  E9 E756 R	 	 	jmp	k61
9068	 F933  04 01	 	 	k89a:	add	al,01h
9069	 F935  E9 E756 R	 	 	jmp	k61
9070	 	 	 	 	
9071	 	 	 	 	
9072	 	 	 	 	
9073	 	 	 	 	;	Временный обработчик прерываний стыка С2
9074	 	 	 	 	;
9075	 	 	 	 	;
9076	 F938  50	 	 	dummm_return:	push	ax
9077	 F939  B0 20	 	 	 	 	mov	al,20h
9078	 F93B  E6 20	 	 	 	 	out	20h,al
9079	 F93D  58	 	 	 	 	pop	ax
9080	 F93E  CF	 	 	 	 	iret
9081	 F93F  5D	 	 	read_lpen1:	pop	bp
9082	 F940  E9 F7B6 R	 	 	 	 	jmp	read_lpen
9083	 	 	 	 	
9084	 	 	 	 	
9085	 	 	 	 	;**************************************
9086	 	 	 	 	;
9087	 	 	 	 	;   Знакогенератор графический 320х200 и 640х200
9088	 	 	 	 	;
9089	 	 	 	 	;***************************************
9090	 	 	 	 	
9091	 FA6E	 	 	 	 	org	0fa6eh
9092	 	 	 	 	
9093	 	 	 	 	
9094	 FA6E	 	 	 	crt_char_gen  label  byte
9095	 FA6E  00 00 00 00 00 00	 	db	000h,000h,000h,000h,000h,000h,000h,000h ;d_00
9096	       00 00	 	 	
9097	 FA76  7E 81 A5 81 BD 99	 	db	07eh,081h,0a5h,081h,0bdh,099h,081h,07eh ;d_01
9098	       81 7E	 	 	
9099	 FA7E  7E FF DB FF C3 E7	 	db	07eh,0ffh,0dbh,0ffh,0c3h,0e7h,0ffh,07eh ;d_02
9100	       FF 7E	 	 	
9101	 FA86  6C FE FE FE 7C 38	 	db	06ch,0feh,0feh,0feh,07ch,038h,010h,000h ;d_03
9102	       10 00	 	 	
9103	 FA8E  10 38 7C FE 7C 38	 	db	010h,038h,07ch,0feh,07ch,038h,010h,008h ;d_04
9104	       10 08	 	 	
9105	 FA96  38 7C 38 FE FE 7C	 	db	038h,07ch,038h,0feh,0feh,07ch,038h,07ch ;d_05
9106	       38 7C	 	 	
9107	 FA9E  10 10 38 7C FE 7C	 	db	010h,010h,038h,07ch,0feh,07ch,038h,07ch ;d_06
9108	       38 7C	 	 	
9109	 FAA6  00 00 18 3C 3C 18	 	db	000h,000h,018h,03ch,03ch,018h,000h,000h ;d_07
9110	       00 00	 	 	
9111	 FAAE  FF FF E7 C3 C3 E7	 	db	0ffh,0ffh,0e7h,0c3h,0c3h,0e7h,0ffh,0ffh ;d_08
9112	       FF FF	 	 	
9113	 FAB6  00 3C 66 42 42 66	 	db	000h,03ch,066h,042h,042h,066h,03ch,000h ;d_09
9114	       3C 00	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-180
	 	 	 	 	 	 	 	09-15-88    


9115	 FABE  FF C3 99 BD BD 99	 	db	0ffh,0c3h,099h,0bdh,0bdh,099h,0c3h,0ffh ;d_0a
9116	       C3 FF	 	 	
9117	 FAC6  0F 07 0F 7D CC CC	 	db	00fh,007h,00fh,07dh,0cch,0cch,0cch,078h ;d_0b
9118	       CC 78	 	 	
9119	 FACE  3C 66 66 66 3C 18	 	db	03ch,066h,066h,066h,03ch,018h,07eh,018h ;d_0c
9120	       7E 18	 	 	
9121	 FAD6  3F 33 3F 30 30 70	 	db	03fh,033h,03fh,030h,030h,070h,0f0h,0e0h ;d_0d
9122	       F0 E0	 	 	
9123	 FADE  7F 63 7F 63 63 67	 	db	07fh,063h,07fh,063h,063h,067h,0e6h,0c0h ;d_0e
9124	       E6 C0	 	 	
9125	 FAE6  99 5A 3C E7 E7 3C	 	db	099h,05ah,03ch,0e7h,0e7h,03ch,05ah,099h ;d_0f
9126	       5A 99	 	 	
9127	 	 	 	 	
9128	 FAEE  80 E0 F8 FE F8 E0	 	db	080h,0e0h,0f8h,0feh,0f8h,0e0h,080h,000h ;d_10
9129	       80 00	 	 	
9130	 FAF6  02 0E 3E FE 3E 0E	 	db	002h,00eh,03eh,0feh,03eh,00eh,002h,000h ;d_11
9131	       02 00	 	 	
9132	 FAFE  18 3C 7E 18 18 7E	 	db	018h,03ch,07eh,018h,018h,07eh,03ch,018h ;d_12
9133	       3C 18	 	 	
9134	 FB06  66 66 66 66 66 00	 	db	066h,066h,066h,066h,066h,000h,066h,000h ;d_13
9135	       66 00	 	 	
9136	 FB0E  7F DB DB 7B 1B 1B	 	db	07fh,0dbh,0dbh,07bh,01bh,01bh,01bh,000h ;d_14
9137	       1B 00	 	 	
9138	 FB16  3E 63 38 6C 6C 38	 	db	03eh,063h,038h,06ch,06ch,038h,0cch,078h ;d_15
9139	       CC 78	 	 	
9140	 FB1E  00 00 00 00 7E 7E	 	db	000h,000h,000h,000h,07eh,07eh,07eh,000h ;d_16
9141	       7E 00	 	 	
9142	 FB26  18 3C 7E 18 7E 3C	 	db	018h,03ch,07eh,018h,07eh,03ch,018h,0ffh ;d_17
9143	       18 FF	 	 	
9144	 FB2E  18 3C 7E 18 18 18	 	db	018h,03ch,07eh,018h,018h,018h,018h,000h ;d_18
9145	       18 00	 	 	
9146	 FB36  18 18 18 18 7E 3C	 	db	018h,018h,018h,018h,07eh,03ch,018h,000h ;d_19
9147	       18 00	 	 	
9148	 FB3E  00 18 0C FE 0C 18	 	db	000h,018h,00ch,0feh,00ch,018h,000h,000h ;d_1a
9149	       00 00	 	 	
9150	 FB46  00 30 60 FE 60 30	 	db	000h,030h,060h,0feh,060h,030h,000h,000h ;d_1b
9151	       00 00	 	 	
9152	 FB4E  00 00 C0 C0 C0 FE	 	db	000h,000h,0c0h,0c0h,0c0h,0feh,000h,000h ;d_1c
9153	       00 00	 	 	
9154	 FB56  00 24 66 FF 66 24	 	db	000h,024h,066h,0ffh,066h,024h,000h,000h ;d_1d
9155	       00 00	 	 	
9156	 FB5E  00 18 3C 7E FF FF	 	db	000h,018h,03ch,07eh,0ffh,0ffh,000h,000h ;d_1e
9157	       00 00	 	 	
9158	 FB66  00 FF FF 7E 3C 18	 	db	000h,0ffh,0ffh,07eh,03ch,018h,000h,000h ;d_1f
9159	       00 00	 	 	
9160	 	 	 	 	
9161	 FB6E  00 00 00 00 00 00	 	db	000h,000h,000h,000h,000h,000h,000h,000h ;sp d_20
9162	       00 00	 	 	
9163	 FB76  30 78 78 30 30 00	 	db	030h,078h,078h,030h,030h,000h,030h,000h ;! d_21
9164	       30 00	 	 	
9165	 FB7E  6C 6C 6C 00 00 00	 	db	06ch,06ch,06ch,000h,000h,000h,000h,000h ;"d_22
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-181
	 	 	 	 	 	 	 	09-15-88    


9166	       00 00	 	 	
9167	 FB86  6C 6C FE 6C FE 6C	 	db	06ch,06ch,0feh,06ch,0feh,06ch,06ch,000h ;# d_23
9168	       6C 00	 	 	
9169	 FB8E  30 7C C0 78 0C F8	 	db	030h,07ch,0c0h,078h,00ch,0f8h,030h,000h ;$ d_24
9170	       30 00	 	 	
9171	 FB96  00 C6 CC 18 30 66	 	db	000h,0c6h,0cch,018h,030h,066h,0c6h,000h ;per cent d_25
9172	       C6 00	 	 	
9173	 FB9E  38 6C 38 76 DC CC	 	db	038h,06ch,038h,076h,0dch,0cch,076h,000h ;& d_26
9174	       76 00	 	 	
9175	 FBA6  60 60 C0 00 00 00	 	db	060h,060h,0c0h,000h,000h,000h,000h,000h ;' d_27
9176	       00 00	 	 	
9177	 FBAE  18 30 60 60 60 30	 	db	018h,030h,060h,060h,060h,030h,018h,000h ;( d_28
9178	       18 00	 	 	
9179	 FBB6  60 30 18 18 18 30	 	db	060h,030h,018h,018h,018h,030h,060h,000h ;) d_29
9180	       60 00	 	 	
9181	 FBBE  00 66 3C FF 3C 66	 	db	000h,066h,03ch,0ffh,03ch,066h,000h,000h ;* d_2a
9182	       00 00	 	 	
9183	 FBC6  00 30 30 FC 30 30	 	db	000h,030h,030h,0fch,030h,030h,000h,000h ;+ d_2b
9184	       00 00	 	 	
9185	 FBCE  00 00 00 00 00 30	 	db	000h,000h,000h,000h,000h,030h,030h,060h ;, d_2c
9186	       30 60	 	 	
9187	 FBD6  00 00 00 FC 00 00	 	db	000h,000h,000h,0fch,000h,000h,000h,000h ;- d_2d
9188	       00 00	 	 	
9189	 FBDE  00 00 00 00 00 30	 	db	000h,000h,000h,000h,000h,030h,030h,000h ;. d_2e
9190	       30 00	 	 	
9191	 FBE6  06 0C 18 30 60 C0	 	db	006h,00ch,018h,030h,060h,0c0h,080h,000h ;/ d_2f
9192	       80 00	 	 	
9193	 	 	 	 	
9194	 FBEE  7C C6 CE DE F6 E6	 	db	07ch,0c6h,0ceh,0deh,0f6h,0e6h,07ch,000h ;0 d_30
9195	       7C 00	 	 	
9196	 FBF6  30 70 30 30 30 30	 	db	030h,070h,030h,030h,030h,030h,0fch,000h ;1 d_31
9197	       FC 00	 	 	
9198	 FBFE  78 CC 0C 38 60 CC	 	db	078h,0cch,00ch,038h,060h,0cch,0fch,000h ;2 d_32
9199	       FC 00	 	 	
9200	 FC06  78 CC 0C 38 0C CC	 	db	078h,0cch,00ch,038h,00ch,0cch,078h,000h ;3 d_33
9201	       78 00	 	 	
9202	 FC0E  1C 3C 6C CC FE 0C	 	db	01ch,03ch,06ch,0cch,0feh,00ch,01eh,000h ;4 d_34
9203	       1E 00	 	 	
9204	 FC16  FC C0 F8 0C 0C CC	 	db	0fch,0c0h,0f8h,00ch,00ch,0cch,078h,000h ;5 d_35
9205	       78 00	 	 	
9206	 FC1E  38 60 C0 F8 CC CC	 	db	038h,060h,0c0h,0f8h,0cch,0cch,078h,000h ;6 d_36
9207	       78 00	 	 	
9208	 FC26  FC CC 0C 18 30 30	 	db	0fch,0cch,00ch,018h,030h,030h,030h,000h ;7 d_37
9209	       30 00	 	 	
9210	 FC2E  78 CC CC 78 CC CC	 	db	078h,0cch,0cch,078h,0cch,0cch,078h,000h ;8 d_38
9211	       78 00	 	 	
9212	 FC36  78 CC CC 7C 0C 18	 	db	078h,0cch,0cch,07ch,00ch,018h,070h,000h ;9 d_39
9213	       70 00	 	 	
9214	 FC3E  00 30 30 00 00 30	 	db	000h,030h,030h,000h,000h,030h,030h,000h ;: d_3a
9215	       30 00	 	 	
9216	 FC46  00 30 30 00 00 30	 	db	000h,030h,030h,000h,000h,030h,030h,060h ;; d_3b
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-182
	 	 	 	 	 	 	 	09-15-88    


9217	       30 60	 	 	
9218	 FC4E  18 30 60 C0 60 30	 	db	018h,030h,060h,0c0h,060h,030h,018h,000h ;< d_3c
9219	       18 00	 	 	
9220	 FC56  00 00 FC 00 00 FC	 	db	000h,000h,0fch,000h,000h,0fch,000h,000h ;= d_3d
9221	       00 00	 	 	
9222	 FC5E  60 30 18 0C 18 30	 	db	060h,030h,018h,00ch,018h,030h,060h,000h ;> d_3e
9223	       60 00	 	 	
9224	 FC66  78 CC 0C 18 30 00	 	db	078h,0cch,00ch,018h,030h,000h,030h,000h ;? d_3f
9225	       30 00	 	 	
9226	 	 	 	 	
9227	 FC6E  7C C6 DE DE DE C0	 	db	07ch,0c6h,0deh,0deh,0deh,0c0h,078h,000h ;@ d_40
9228	       78 00	 	 	
9229	 FC76  30 78 CC CC FC CC	 	db	030h,078h,0cch,0cch,0fch,0cch,0cch,000h ;A d_41
9230	       CC 00	 	 	
9231	 FC7E  FC 66 66 7C 66 66	 	db	0fch,066h,066h,07ch,066h,066h,0fch,000h ;B d_42
9232	       FC 00	 	 	
9233	 FC86  3C 66 C0 C0 C0 66	 	db	03ch,066h,0c0h,0c0h,0c0h,066h,03ch,000h ;C d_43
9234	       3C 00	 	 	
9235	 FC8E  F8 6C 66 66 66 6C	 	db	0f8h,06ch,066h,066h,066h,06ch,0f8h,000h ;D d_44
9236	       F8 00	 	 	
9237	 FC96  FE 62 68 78 68 62	 	db	0feh,062h,068h,078h,068h,062h,0feh,000h ;E d_45
9238	       FE 00	 	 	
9239	 FC9E  FE 62 68 78 68 60	 	db	0feh,062h,068h,078h,068h,060h,0f0h,000h ;F d_46
9240	       F0 00	 	 	
9241	 FCA6  3C 66 C0 C0 CE 66	 	db	03ch,066h,0c0h,0c0h,0ceh,066h,03eh,000h ;G d_47
9242	       3E 00	 	 	
9243	 FCAE  CC CC CC FC CC CC	 	db	0cch,0cch,0cch,0fch,0cch,0cch,0cch,000h ;H d_48
9244	       CC 00	 	 	
9245	 FCB6  78 30 30 30 30 30	 	db	078h,030h,030h,030h,030h,030h,078h,000h ;I d_49
9246	       78 00	 	 	
9247	 FCBE  1E 0C 0C 0C CC CC	 	db	01eh,00ch,00ch,00ch,0cch,0cch,078h,000h ;J d_4a
9248	       78 00	 	 	
9249	 FCC6  E6 66 6C 78 6C 66	 	db	0e6h,066h,06ch,078h,06ch,066h,0e6h,000h ;K d_4b
9250	       E6 00	 	 	
9251	 FCCE  F0 60 60 60 62 66	 	db	0f0h,060h,060h,060h,062h,066h,0feh,000h ;L d_4c
9252	       FE 00	 	 	
9253	 FCD6  C6 EE FE FE D6 C6	 	db	0c6h,0eeh,0feh,0feh,0d6h,0c6h,0c6h,000h ;M d_4d
9254	       C6 00	 	 	
9255	 FCDE  C6 E6 F6 DE CE C6	 	db	0c6h,0e6h,0f6h,0deh,0ceh,0c6h,0c6h,000h ;N d_4e
9256	       C6 00	 	 	
9257	 FCE6  38 6C C6 C6 C6 6C	 	db	038h,06ch,0c6h,0c6h,0c6h,06ch,038h,000h ;O d_4f
9258	       38 00	 	 	
9259	 	 	 	 	
9260	 FCEE  FC 66 66 7C 60 60	 	db	0fch,066h,066h,07ch,060h,060h,0f0h,000h ;P d_50
9261	       F0 00	 	 	
9262	 FCF6  78 CC CC CC DC 78	 	db	078h,0cch,0cch,0cch,0dch,078h,01ch,000h ;Q d_51
9263	       1C 00	 	 	
9264	 FCFE  FC 66 66 7C 6C 66	 	db	0fch,066h,066h,07ch,06ch,066h,0e6h,000h ;R d_52
9265	       E6 00	 	 	
9266	 FD06  78 CC E0 70 1C CC	 	db	078h,0cch,0e0h,070h,01ch,0cch,078h,000h ;S d_53
9267	       78 00	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-183
	 	 	 	 	 	 	 	09-15-88    


9268	 FD0E  FC B4 30 30 30 30	 	db	0fch,0b4h,030h,030h,030h,030h,078h,000h ;T d_54
9269	       78 00	 	 	
9270	 FD16  CC CC CC CC CC CC	 	db	0cch,0cch,0cch,0cch,0cch,0cch,0fch,000h ;U d_55
9271	       FC 00	 	 	
9272	 FD1E  CC CC CC CC CC 78	 	db	0cch,0cch,0cch,0cch,0cch,078h,030h,000h ;V d_56
9273	       30 00	 	 	
9274	 FD26  C6 C6 C6 D6 FE EE	 	db	0c6h,0c6h,0c6h,0d6h,0feh,0eeh,0c6h,000h ;W d_57
9275	       C6 00	 	 	
9276	 FD2E  C6 C6 6C 38 38 6C	 	db	0c6h,0c6h,06ch,038h,038h,06ch,0c6h,000h ;X d_58
9277	       C6 00	 	 	
9278	 FD36  CC CC CC 78 30 30	 	db	0cch,0cch,0cch,078h,030h,030h,078h,000h ;Y d_59
9279	       78 00	 	 	
9280	 FD3E  FE C6 8C 18 32 66	 	db	0feh,0c6h,08ch,018h,032h,066h,0feh,000h ;Z d_5a
9281	       FE 00	 	 	
9282	 FD46  78 60 60 60 60 60	 	db	078h,060h,060h,060h,060h,060h,078h,000h ;( d_5b
9283	       78 00	 	 	
9284	 FD4E  C0 60 30 18 0C 06	 	db	0c0h,060h,030h,018h,00ch,006h,002h,000h ;backslash
9285	       02 00	 	 	
9286	 FD56  78 18 18 18 18 18	 	db	078h,018h,018h,018h,018h,018h,078h,000h ;) d_5d
9287	       78 00	 	 	
9288	 FD5E  10 38 6C C6 00 00	 	db	010h,038h,06ch,0c6h,000h,000h,000h,000h ;cimpqumflex
9289	       00 00	 	 	
9290	 FD66  00 00 00 00 00 00	 	db	000h,000h,000h,000h,000h,000h,000h,0ffh ;_ d_5f
9291	       00 FF	 	 	
9292	 	 	 	 	
9293	 FD6E  30 30 18 00 00 00	 	db	030h,030h,018h,000h,000h,000h,000h,000h ;  d_60
9294	       00 00	 	 	
9295	 FD76  00 00 78 0C 7C CC	 	db	000h,000h,078h,00ch,07ch,0cch,076h,000h ;lower case a
9296	       76 00	 	 	
9297	 FD7E  E0 60 60 7C 66 66	 	db	0e0h,060h,060h,07ch,066h,066h,0dch,000h ;b d_62
9298	       DC 00	 	 	
9299	 FD86  00 00 78 CC C0 CC	 	db	000h,000h,078h,0cch,0c0h,0cch,078h,000h ;c d_63
9300	       78 00	 	 	
9301	 FD8E  1C 0C 0C 7C CC CC	 	db	01ch,00ch,00ch,07ch,0cch,0cch,076h,000h ;d d_64
9302	       76 00	 	 	
9303	 FD96  00 00 78 CC FC C0	 	db	000h,000h,078h,0cch,0fch,0c0h,078h,000h ;e d_65
9304	       78 00	 	 	
9305	 FD9E  38 6C 60 F0 60 60	 	db	038h,06ch,060h,0f0h,060h,060h,0f0h,000h ;f d_66
9306	       F0 00	 	 	
9307	 FDA6  00 00 76 CC CC 7C	 	db	000h,000h,076h,0cch,0cch,07ch,00ch,0f8h ;g d_67
9308	       0C F8	 	 	
9309	 FDAE  E0 60 6C 76 66 66	 	db	0e0h,060h,06ch,076h,066h,066h,0e6h,000h ;h d_68
9310	       E6 00	 	 	
9311	 FDB6  30 00 70 30 30 30	 	db	030h,000h,070h,030h,030h,030h,078h,000h ;i d_69
9312	       78 00	 	 	
9313	 FDBE  0C 00 0C 0C 0C CC	 	db	00ch,000h,00ch,00ch,00ch,0cch,0cch,078h ;j d_6a
9314	       CC 78	 	 	
9315	 FDC6  E0 60 66 6C 78 6C	 	db	0e0h,060h,066h,06ch,078h,06ch,0e6h,000h ;k d_6b
9316	       E6 00	 	 	
9317	 FDCE  70 30 30 30 30 30	 	db	070h,030h,030h,030h,030h,030h,078h,000h ;l d_6c
9318	       78 00	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-184
	 	 	 	 	 	 	 	09-15-88    


9319	 FDD6  00 00 CC FE FE D6	 	db	000h,000h,0cch,0feh,0feh,0d6h,0c6h,000h ;m d_6d
9320	       C6 00	 	 	
9321	 FDDE  00 00 F8 CC CC CC	 	db	000h,000h,0f8h,0cch,0cch,0cch,0cch,000h ;n d_6e
9322	       CC 00	 	 	
9323	 FDE6  00 00 78 CC CC CC	 	db	000h,000h,078h,0cch,0cch,0cch,078h,000h ;o d_6f
9324	       78 00	 	 	
9325	 	 	 	 	
9326	 FDEE  00 00 DC 66 66 7C	 	db	000h,000h,0dch,066h,066h,07ch,060h,0f0h ;p d_70
9327	       60 F0	 	 	
9328	 FDF6  00 00 76 CC CC 7C	 	db	000h,000h,076h,0cch,0cch,07ch,00ch,01eh ;q d_71
9329	       0C 1E	 	 	
9330	 FDFE  00 00 DC 76 66 60	 	db	000h,000h,0dch,076h,066h,060h,0f0h,000h ;r d_72
9331	       F0 00	 	 	
9332	 FE06  00 00 7C C0 78 0C	 	db	000h,000h,07ch,0c0h,078h,00ch,0f8h,000h ;s d_73
9333	       F8 00	 	 	
9334	 FE0E  10 30 7C 30 30 34	 	db	010h,030h,07ch,030h,030h,034h,018h,000h ;t d_74
9335	       18 00	 	 	
9336	 FE16  00 00 CC CC CC CC	 	db	000h,000h,0cch,0cch,0cch,0cch,076h,000h ;u d_75
9337	       76 00	 	 	
9338	 FE1E  00 00 CC CC CC 78	 	db	000h,000h,0cch,0cch,0cch,078h,030h,000h ;v d_76
9339	       30 00	 	 	
9340	 FE26  00 00 C6 D6 FE FE	 	db	000h,000h,0c6h,0d6h,0feh,0feh,06ch,000h ;w d_77
9341	       6C 00	 	 	
9342	 FE2E  00 00 C6 6C 38 6C	 	db	000h,000h,0c6h,06ch,038h,06ch,0c6h,000h ;x d_78
9343	       C6 00	 	 	
9344	 FE36  00 00 CC CC CC 7C	 	db	000h,000h,0cch,0cch,0cch,07ch,00ch,0f8h ;y d_79
9345	       0C F8	 	 	
9346	 FE3E  00 00 FC 98 30 64	 	db	000h,000h,0fch,098h,030h,064h,0fch,000h ;z d_7a
9347	       FC 00	 	 	
9348	 FE46  1C 30 30 E0 30 30	 	db	01ch,030h,030h,0e0h,030h,030h,01ch,000h ;  d_7b
9349	       1C 00	 	 	
9350	 FE4E  18 18 18 00 18 18	 	db	018h,018h,018h,000h,018h,018h,018h,000h ;  d_7c
9351	       18 00	 	 	
9352	 FE56  E0 30 30 1C 30 30	 	db	0e0h,030h,030h,01ch,030h,030h,0e0h,000h ;  d_7d
9353	       E0 00	 	 	
9354	 FE5E  76 DC 00 00 00 00	 	db	076h,0dch,000h,000h,000h,000h,000h,000h ;  d_7e
9355	       00 00	 	 	
9356	 FE66  00 10 38 6C C6 C6	 	db	000h,010h,038h,06ch,0c6h,0c6h,0feh,000h ;delta d_7f
9357	       FE 00	 	 	
9358	 	 	 	 	
9359	 	 	 	 	;---int 1a-------------------------------
9360	 	 	 	 	;
9361	 	 	 	 	;   Программа установки-считывания времени суток
9362	 	 	 	 	;
9363	 	 	 	 	;   Эта программа обеспечивает выполнение двух функций, код которых
9364	 	 	 	 	; задается в регистре AH:
9365	 	 	 	 	;   AH=0 - считать текущее состояние часов. После выполнения коман-
9366	 	 	 	 	; ды регистры CX и DX содержат старшую и младшую части счетчика.
9367	 	 	 	 	;   Если регистр AL содержит "0", то счет идет в течение одних
9368	 	 	 	 	; суток, при любом другом значении счет переходит на следующие
9369	 	 	 	 	; сутки;
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-185
	 	 	 	 	 	 	 	09-15-88    


9370	 	 	 	 	;
9371	 	 	 	 	;   AH=1 - записать текущее состояние часов. Регистры CX и DX
9372	 	 	 	 	; содержат старшую и младшую части счетчика.
9373	 	 	 	 	;
9374	 	 	 	 	;------------------------------------------
9375	 	 	 	 	 	assume	cs:code,ds:data
9376	 FE6E	 	 	 	time_of_day	proc	far
9377	 FE6E  FB	 	 	 	sti	 	; уст признак разрешения прерывания
9378	 FE6F  1E	 	 	 	push	ds	; сохранить сегмент
9379	 FE70  50	 	 	 	push	ax	; сохранить параметры
9380	 FE71  B8 0040	 	 	 	mov	ax,dat
9381	 FE74  8E D8	 	 	 	mov	ds,ax
9382	 FE76  58	 	 	 	pop	ax
9383	 FE77  0A E4	 	 	 	or	ah,ah	; AH=0 ?
9384	 FE79  74 07	 	 	 	jz	t2  ; да, переход к считыванию текущего состояния
9385	 FE7B  FE CC	 	 	 	dec	ah	; AH=1 ?
9386	 FE7D  74 16	 	 	 	jz	t3  ; да, переход к установке текущего состояния
9387	 	 	 	 	
9388	 FE7F	 	 	 	t1:	; Возврат из программы
9389	 	 	 	 	
9390	 FE7F  FB	 	 	 	sti	 	; уст признак разрешения прерывания
9391	 FE80  1F	 	 	 	pop	ds	; возврат сегмента
9392	 FE81  CF	 	 	 	iret	 	; возврат к программе,вызвавшей процедуру
9393	 	 	 	 	
9394	 FE82	 	 	 	t2:	; Считать текущее состояния часов
9395	 	 	 	 	
9396	 FE82  FA	 	 	 	cli	 	; сбросить признак разрешения прерывания
9397	 FE83  A0 0070 R	 	 	mov	al,timer_ofl  ; считать в AL флажок перехода на сле-
9398	 FE86  C6 06 0070 R 00	 	 	mov	timer_ofl,0   ; дующие сутки и сбросить его в памяти
9399	 FE8B  8B 0E 006E R	 	 	mov	cx,timer_high	 	; установить старшую и младшую
9400	 FE8F  8B 16 006C R	 	 	mov	dx,timer_low	 	; части счетчика
9401	 FE93  EB EA	 	 	 	jmp	short t1
9402	 	 	 	 	
9403	 FE95	 	 	 	t3:	; Установить текущее состояние часов
9404	 	 	 	 	
9405	 FE95  FA	 	 	 	cli	 	; сброс признака разрешения прерывания
9406	 FE96  89 16 006C R	 	 	mov	timer_low,dx	 	; установить младшую и старшую
9407	 FE9A  89 0E 006E R	 	 	mov	timer_high,cx	 	; части счетчика
9408	 FE9E  C6 06 0070 R 00	 	 	mov	timer_ofl,0	; сброс флажка перехода через сутки
9409	 FEA3  EB DA	 	 	 	jmp	short t1	; возврат из программы отсчета времени
9410	 FEA5	 	 	 	time_of_day	endp
9411	 	 	 	 	
9412	 	 	 	 	;-------int 08-------------------
9413	 	 	 	 	;
9414	 	 	 	 	;   Программа обработки прерывания таймера КР580ВИ53 (INT 8H) об-
9415	 	 	 	 	; рабатывает прерывания, аппаратурно возникающие от нулевого канала
9416	 	 	 	 	; таймера, на вход которого подаются сигналы с частотой 1,228 МГц,
9417	 	 	 	 	; делящиеся на 56263 для обеспечения 18,2 прерываний в секунду.
9418	 	 	 	 	;   При обработке прерывания корректируется программный счетчик,
9419	 	 	 	 	; хранящийся в памяти по адресу 0046CH (младшая часть счетчика) и
9420	 	 	 	 	; адресу 0047EH (старшая часть счетчика) и используемый для уста-
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-186
	 	 	 	 	 	 	 	09-15-88    


9421	 	 	 	 	; новки времени суток.
9422	 	 	 	 	;   В функции программы входит коррекция счетчика, управляющего
9423	 	 	 	 	; двигателем НГМД. После обнуления счетчика двигатель выключается.
9424	 	 	 	 	;   Вектор 1CH дает возможность пользователю входить в заданную
9425	 	 	 	 	; программу с частотой прерывания таймера (18.2 прерываний в секун-
9426	 	 	 	 	; ду). Для этого в таблице векторов прерываний по адресу 007CH
9427	 	 	 	 	; необходимо задать адрес пользовательской программы.
9428	 	 	 	 	;
9429	 	 	 	 	;---------------------------------------------------
9430	 	 	 	 	
9431	 FEA5	 	 	 	timer_int	proc	far
9432	 FEA5  FB	 	 	 	sti	 	; уст признак разрешения прерывания
9433	 FEA6  1E	 	 	 	push	ds
9434	 FEA7  50	 	 	 	push	ax
9435	 FEA8  52	 	 	 	push	dx
9436	 FEA9  B8 0040	 	 	 	mov	ax,dat
9437	 FEAC  8E D8	 	 	 	mov	ds,ax
9438	 FEAE  FF 06 006C R	 	 	inc	timer_low    ; +1 к старшей части счетчика
9439	 FEB2  75 04	 	 	 	jnz	t4
9440	 FEB4  FF 06 006E R	 	 	inc	timer_high   ; +1 к старшей части счетчика
9441	 	 	 	 	
9442	 FEB8	 	 	 	t4:	; Опрос счетчика = 24 часам
9443	 	 	 	 	
9444	 FEB8  83 3E 006E R 18	 	 	cmp	timer_high,018h
9445	 FEBD  75 19	 	 	 	jnz	t5
9446	 FEBF  81 3E 006C R 00B0	 	cmp	timer_low,0b0h
9447	 FEC5  75 11	 	 	 	jnz	t5
9448	 	 	 	 	
9449	 	 	 	 	;   Таймер исчерпал 24 часа
9450	 	 	 	 	
9451	 FEC7  C7 06 006E R 0000	 	mov	timer_high,0   ; сброс старшей и младшей частей
9452	 FECD  C7 06 006C R 0000	 	mov	timer_low,0    ; счетчика и установка флажка пере-
9453	 FED3  C6 06 0070 R 01	 	 	mov	timer_ofl,1    ; хода счета на следующие сутки
9454	 	 	 	 	
9455	 	 	 	 	;   Выключение мотора НГМД, если счетчик управления мотором
9456	 	 	 	 	; исчерпан
9457	 	 	 	 	
9458	 FED8	 	 	 	t5:
9459	 FED8  FE 0E 0040 R	 	 	dec	motor_count
9460	 FEDC  75 0B	 	 	 	jnz	t6	 	; переход, если счетчик не установлен
9461	 FEDE  80 26 003F R F0	 	 	and	motor_status,0f0h
9462	 FEE3  B0 0C	 	 	 	mov	al,0ch
9463	 FEE5  BA 03F2	 	 	 	mov	dx,03f2h
9464	 FEE8  EE	 	 	 	out	dx,al	 	; выключить мотор
9465	 	 	 	 	
9466	 FEE9	 	 	 	t6:
9467	 FEE9  CD 1C	 	 	 	int	1ch	; передача управления программе пользователя
9468	 FEEB  B0 20	 	 	 	mov	al,eoi
9469	 FEED  E6 20	 	 	 	out	020h,al        ; конец прерывания
9470	 FEEF  5A	 	 	 	pop	dx
9471	 FEF0  58	 	 	 	pop	ax
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-187
	 	 	 	 	 	 	 	09-15-88    


9472	 FEF1  1F	 	 	 	pop	ds
9473	 FEF2  CF	 	 	 	iret	 	 	; возврат из прерывания
9474	 FEF3	 	 	 	timer_int	endp
9475	 	 	 	 	;---------------------------------
9476	 	 	 	 	;
9477	 	 	 	 	;   Эти вектора передаются в область прерывания 8086 во время
9478	 	 	 	 	; включения питания.
9479	 	 	 	 	;
9480	 	 	 	 	;---------------------------------
9481	 FEF3	 	 	 	vector_table	label	word	; таблица векторов прерываний
9482	 	 	 	 	
9483	 FEF3  FEA5 R	 	 	 	dw	offset timer_int	; прерывание 8
9484	 FEF5  F000	 	 	 	dw	cod
9485	 	 	 	 	
9486	 FEF7  E987 R	 	 	 	dw	offset kb_int	 	; прерывание 9
9487	 FEF9  F000	 	 	 	dw	cod
9488	 	 	 	 	
9489	 FEFB  FF53 R	 	 	 	dw	offset dummy_return	; прерывание А
9490	 FEFD  F000	 	 	 	dw	cod
9491	 FEFF  F938 R	 	 	 	dw	offset dummm_return	; прерывание B
9492	 FF01  F000	 	 	 	dw	cod
9493	 FF03  F938 R	 	 	 	dw	offset dummm_return	; прерывание C
9494	 FF05  F000	 	 	 	dw	cod
9495	 FF07  FF53 R	 	 	 	dw	offset dummy_return	; прерывание D
9496	 FF09  F000	 	 	 	dw	cod
9497	 FF0B  EF57 R	 	 	 	dw	offset disk_int 	; прерывание E
9498	 FF0D  F000	 	 	 	dw	cod
9499	 	 	 	 	
9500	 FF0F  FF53 R	 	 	 	dw	offset dummy_return	; прерывание F
9501	 FF11  F000	 	 	 	dw	cod
9502	 FF13  F06D R	 	 	 	dw	offset video_io 	; прерывание 10H
9503	 FF15  F000	 	 	 	dw	cod
9504	 	 	 	 	
9505	 FF17  F85A R	 	 	 	dw	offset equipment	; прерывание 11H
9506	 FF19  F000	 	 	 	dw	cod
9507	 	 	 	 	
9508	 FF1B  F84E R	 	 	 	dw	offset memory_size_determine	; прерывание 12H
9509	 FF1D  F000	 	 	 	dw	cod
9510	 	 	 	 	
9511	 FF1F  EC59 R	 	 	 	dw	offset diskette_io	; прерывание 13H
9512	 FF21  F000	 	 	 	dw	cod
9513	 	 	 	 	
9514	 FF23  C8F5 R	 	 	 	dw	offset rs232_io 	; прерывание  14H
9515	 FF25  F000	 	 	 	dw	cod
9516	 	 	 	 	
9517	 FF27  D1F1 R	 	 	 	dw	offset ex_memory	; int 15h
9518	 FF29  F000	 	 	 	dw	cod
9519	 	 	 	 	
9520	 FF2B  E82E R	 	 	 	dw	offset keyboard_io	; прерывание 16H
9521	 FF2D  F000	 	 	 	dw	cod
9522	 	 	 	 	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-188
	 	 	 	 	 	 	 	09-15-88    


9523	 FF2F  EFD2 R	 	 	 	dw	offset printer_io	; прерывание 17H
9524	 FF31  F000	 	 	 	dw	cod
9525	 	 	 	 	
9526	 FF33  E05B R	 	 	 	dw	offset start	 	; прерывание 18H
9527	 FF35  F000	 	 	 	dw	cod	 	 	; RESTART
9528	 	 	 	 	
9529	 FF37  C186 R	 	 	 	dw	offset boot_strapt	; прерывание 19H
9530	 FF39  F000	 	 	 	dw	cod
9531	 	 	 	 	
9532	 FF3B  FE6E R	 	 	 	dw	time_of_day	; прерывание 1АH - время суток
9533	 FF3D  F000	 	 	 	dw	cod
9534	 	 	 	 	
9535	 FF3F  FF53 R	 	 	 	dw	dummy_return	; прерывание 1BH - прерывание клавиатуры
9536	 FF41  F000	 	 	 	dw	cod
9537	 	 	 	 	
9538	 FF43  FF53 R	 	 	 	dw	dummy_return	; прерывание 1C - прерывание таймера
9539	 FF45  F000	 	 	 	dw	cod
9540	 	 	 	 	
9541	 FF47  F0B9 R	 	 	 	dw	video_parms	; прерывание 1D - параметры видео
9542	 FF49  F000	 	 	 	dw	cod
9543	 	 	 	 	
9544	 FF4B  EFC7 R	 	 	 	dw	offset	disk_base   ;прерывание 1EH - параметры НГМД
9545	 FF4D  F000	 	 	 	dw	cod
9546	 	 	 	 	
9547	 FF4F  CBB2 R	 	 	 	dw	offset crt_char_rus	; 1FH - адрес таблицы пользова-
9548	 FF51  F000	 	 	 	dw	cod	       ; тельского дополнительного знакогенератора
9549	 	 	 	 	
9550	 FF53	 	 	 	dummy_return:
9551	 FF53  CF	 	 	 	iret
9552	 	 	 	 	
9553	 	 	 	 	;---int 5----------------------
9554	 	 	 	 	;
9555	 	 	 	 	;   Программа вывода на печать содержимого буфера ЭЛИ вызывается
9556	 	 	 	 	; одновременным нажатием клавиши ПЕЧ и клавиши переключения регист-
9557	 	 	 	 	; ров. Позиция курсора сохраняется до завершения процедуры обработки
9558	 	 	 	 	; прерывания. Повторное нажатие названных клавиш во время обработки
9559	 	 	 	 	; прерывания игнорируется.
9560	 	 	 	 	;   При выполнении программы в постоянно распределенной рабочей
9561	 	 	 	 	; области памяти по адресу 0500H устанавливается следующая
9562	 	 	 	 	; информация:
9563	 	 	 	 	;   0	 - содержимое буфера ЭЛИ еще не выведено на печать, либо
9564	 	 	 	 	; вывод уже завершен;
9565	 	 	 	 	;   1	 - в процессе вывода содержимого буфера ЭЛИ на печать;
9566	 	 	 	 	;   255  - при печати обнаружена ошибка.
9567	 	 	 	 	;-----------------------------------------------------
9568	 	 	 	 	
9569	 	 	 	 	 	assume	cs:code,ds:xxdata
9570	 	 	 	 	
9571	 FF54	 	 	 	print_screen	proc	far
9572	 FF54  FB	 	 	 	sti	 	     ; уст признак разрешения прерывания
9573	 FF55  1E	 	 	 	push	ds
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-189
	 	 	 	 	 	 	 	09-15-88    


9574	 FF56  50	 	 	 	push	ax
9575	 FF57  53	 	 	 	push	bx
9576	 FF58  51	 	 	 	push	cx   ; будет использоваться заглавная буква для курсора
9577	 FF59  52	 	 	 	push	dx   ; будет содержать текущее положение курсора
9578	 FF5A  B8 0050	 	 	 	mov	ax,xxdat	; адрес 50
9579	 FF5D  8E D8	 	 	 	mov	ds,ax
9580	 FF5F  80 3E 0000 R 01	 	 	cmp	status_byte,1	; печать готова ?
9581	 FF64  74 5F	 	 	 	jz	exit	 	; переход, если печать готова
9582	 FF66  C6 06 0000 R 01	 	 	mov	status_byte,1	;
9583	 FF6B  B4 0F	 	 	 	mov	ah,15	 	; требуется текущий режим экрана
9584	 FF6D  CD 10	 	 	 	int	10h	 	; AL - режим, AH - число строк/колонок
9585	 	 	 	 	 	 	 	 	; BH - страница,выведенная на экран
9586	 	 	 	 	
9587	 	 	 	 	
9588	 	 	 	 	;*************************************8
9589	 	 	 	 	;
9590	 	 	 	 	;   В этом месте:
9591	 	 	 	 	;	 	    AX - колонка, строка,
9592	 	 	 	 	;	 	    BH - номер отображаемой страницы.
9593	 	 	 	 	;
9594	 	 	 	 	;   Стек содержит DS, AX, BX, CX, DX.
9595	 	 	 	 	;
9596	 	 	 	 	;	 	    AL - режим
9597	 	 	 	 	;
9598	 	 	 	 	;**************************************
9599	 	 	 	 	
9600	 FF6F  8A CC	 	 	 	mov	cl,ah
9601	 FF71  B5 19	 	 	 	mov	ch,25
9602	 FF73  E8 FFCB R	 	 	call	crlf
9603	 FF76  51	 	 	 	push	cx
9604	 FF77  B4 03	 	 	 	mov	ah,3
9605	 FF79  CD 10	 	 	 	int	10h
9606	 FF7B  59	 	 	 	pop	cx
9607	 FF7C  52	 	 	 	push	dx
9608	 FF7D  33 D2	 	 	 	xor	dx,dx
9609	 	 	 	 	
9610	 	 	 	 	;**************************************
9611	 	 	 	 	;
9612	 	 	 	 	;    Считывание знака, находящегося в текущей позиции курсора
9613	 	 	 	 	; и вывод на печать
9614	 	 	 	 	;
9615	 	 	 	 	;**************************************
9616	 	 	 	 	
9617	 FF7F  B4 02	 	 	pri10:	mov	ah,2
9618	 FF81  CD 10	 	 	 	int	10h
9619	 FF83  B4 08	 	 	 	mov	ah,8
9620	 FF85  CD 10	 	 	 	int	10h
9621	 FF87  0A C0	 	 	 	or	al,al
9622	 FF89  75 02	 	 	 	jnz	pri15
9623	 FF8B  B0 20	 	 	 	mov	al,' '
9624	 FF8D	 	 	 	pri15:
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-190
	 	 	 	 	 	 	 	09-15-88    


9625	 FF8D  52	 	 	 	push	dx
9626	 FF8E  33 D2	 	 	 	xor	dx,dx
9627	 FF90  32 E4	 	 	 	xor	ah,ah
9628	 FF92  CD 17	 	 	 	int	17h
9629	 FF94  5A	 	 	 	pop	dx
9630	 FF95  F6 C4 25	 	 	 	test	ah,25h
9631	 FF98  75 21	 	 	 	jnz	err10
9632	 FF9A  FE C2	 	 	 	inc	dl
9633	 FF9C  3A CA	 	 	 	cmp	cl,dl
9634	 FF9E  75 DF	 	 	 	jnz	pri10
9635	 FFA0  32 D2	 	 	 	xor	dl,dl
9636	 FFA2  8A E2	 	 	 	mov	ah,dl
9637	 FFA4  52	 	 	 	push	dx
9638	 FFA5  E8 FFCB R	 	 	call	crlf
9639	 FFA8  5A	 	 	 	pop	dx
9640	 FFA9  FE C6	 	 	 	inc	dh
9641	 FFAB  3A EE	 	 	 	cmp	ch,dh
9642	 FFAD  75 D0	 	 	 	jnz	pri10
9643	 FFAF  5A	 	 	pri20:	pop	dx
9644	 FFB0  B4 02	 	 	 	mov	ah,2
9645	 FFB2  CD 10	 	 	 	int	10h
9646	 FFB4  C6 06 0000 R 00	 	 	mov	status_byte,0
9647	 FFB9  EB 0A	 	 	 	jmp	short exit
9648	 FFBB  5A	 	 	err10:	pop	dx
9649	 FFBC  B4 02	 	 	 	mov	ah,2
9650	 FFBE  CD 10	 	 	 	int	10h
9651	 FFC0  C6 06 0000 R FF	 	err20:	mov	status_byte,0ffh
9652	 	 	 	 	
9653	 FFC5  5A	 	 	exit:	pop	dx
9654	 FFC6  59	 	 	 	pop	cx
9655	 FFC7  5B	 	 	 	pop	bx
9656	 FFC8  58	 	 	 	pop	ax
9657	 FFC9  1F	 	 	 	pop	ds
9658	 FFCA  CF	 	 	 	iret
9659	 FFCB	 	 	 	print_screen	endp
9660	 	 	 	 	
9661	 	 	 	 	;   Возврат каретки
9662	 	 	 	 	
9663	 FFCB	 	 	 	crlf	proc	near
9664	 FFCB  33 D2	 	 	 	xor	dx,dx
9665	 FFCD  32 E4	 	 	 	xor	ah,ah
9666	 FFCF  B0 0A	 	 	 	mov	al,12q
9667	 FFD1  CD 17	 	 	 	int	17h
9668	 FFD3  32 E4	 	 	 	xor	ah,ah
9669	 FFD5  B0 0D	 	 	 	mov	al,15q
9670	 FFD7  CD 17	 	 	 	int	17h
9671	 FFD9  C3	 	 	 	ret
9672	 FFDA	 	 	 	crlf	endp
9673	 FFE0	 	 	 	 	org	0ffe0h
9674	 FFE0  B5 C1 31 38 34 31	 	db	'ЕС1841.(РЕД.02)'
9675	       2E 28 C0 B5 B4 2E	
�� Microsoft MACRO Assembler  Version 3.00               	Page	1-191
	 	 	 	 	 	 	 	09-15-88    


9676	       30 32 29	 	 	
9677	 	 	 	 	
9678	 	 	 	 	
9679	 FFF0	 	 	 	 	org	0fff0h
9680	 	 	 	 	;--------------------------------------
9681	 	 	 	 	;
9682	 	 	 	 	;   Включение питания
9683	 	 	 	 	;
9684	 	 	 	 	;--------------------------------------
9685	 	 	 	 	
9686	 	 	 	 	;vector segment at 0ffffh
9687	 	 	 	 	
9688	 	 	 	 	;   Переход по включению питания
9689	 	 	 	 	
9690	 FFF0  EA 5B E0 00 F0	 	 	db	0eah,5bh,0e0h,00h,0f0h	;    jmp reset
9691	 	 	 	 	
9692	 FFF5  31 32 2F 30 31 2F	 	db	'12/01/86'
9693	       38 36	 	 	
9694	 FFFD  FF FE	 	 	 	db	0ffh,0feh
9695	 	 	 	 	;vector ends
9696	 	 	 	 	
9697	 	 	 	 	
9698	 	 	 	 	
9699	 	 	 	 	
9700	 	 	 	 	
9701	 	 	 	 	
9702	 FFFF	 	 	 	code	ends
9703	 	 	 	 	 	end

�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-1
	 	 	 	 	 	 	 	09-15-88    


Segments and Groups:

	 	N a m e	 	 	Size	Align	Combine	Class

ABS0 . . . . . . . . . . . . . .	7C00	PARA  	NONE	
CODE . . . . . . . . . . . . . .	FFFF	PARA  	NONE	
DATA . . . . . . . . . . . . . .	00E0	PARA  	NONE	
STAC . . . . . . . . . . . . . .	0100	PARA  	STACK 	
VIDEO_RAM. . . . . . . . . . . .	4000	PARA  	NONE	
XXDATA . . . . . . . . . . . . .	0001	PARA  	NONE	

Symbols:            

	 	N a m e	 	 	Type	Value	Attr         

A2 . . . . . . . . . . . . . . .	L NEAR 	C276	CODE
A3 . . . . . . . . . . . . . . .	L NEAR 	C26E	CODE
A4 . . . . . . . . . . . . . . .	L NEAR 	C2F9	CODE
ACTIVE_PAGE. . . . . . . . . . .	L BYTE 	0062	DATA
ACT_DISP_PAGE. . . . . . . . . .	N PROC	F247	CODE	Length =0024
ADD4 . . . . . . . . . . . . . .	L NEAR 	C6E9	CODE
ADDR_6845. . . . . . . . . . . .	L WORD 	0063	DATA
AH12 . . . . . . . . . . . . . .	L NEAR 	D430	CODE
AH121. . . . . . . . . . . . . .	L NEAR 	D45A	CODE
AH13 . . . . . . . . . . . . . .	L NEAR 	C861	CODE
ALT_INPUT. . . . . . . . . . . .	L BYTE 	0019	DATA
ALT_KEY. . . . . . . . . . . . .	Number	0038	
ALT_SHIFT. . . . . . . . . . . .	Number	0008	
ALZO . . . . . . . . . . . . . .	L NEAR 	E47D	CODE
ARE_WE_DONE. . . . . . . . . . .	L NEAR 	E447	CODE
ASCII_TBL. . . . . . . . . . . .	L BYTE 	E3C2	CODE
B1 . . . . . . . . . . . . . . .	L NEAR 	EFF5	CODE
B1T. . . . . . . . . . . . . . .	L NEAR 	C44C	CODE
B2 . . . . . . . . . . . . . . .	L NEAR 	EFFB	CODE
B3 . . . . . . . . . . . . . . .	L NEAR 	F002	CODE
B3T. . . . . . . . . . . . . . .	L NEAR 	C4B2	CODE
B4 . . . . . . . . . . . . . . .	L NEAR 	F017	CODE
B5 . . . . . . . . . . . . . . .	L NEAR 	F01F	CODE
B5T. . . . . . . . . . . . . . .	L NEAR 	C4A8	CODE
B6 . . . . . . . . . . . . . . .	L NEAR 	F020	CODE
B6T. . . . . . . . . . . . . . .	L NEAR 	C4B9	CODE
B7 . . . . . . . . . . . . . . .	L NEAR 	F02B	CODE
B8 . . . . . . . . . . . . . . .	L NEAR 	F033	CODE
B9 . . . . . . . . . . . . . . .	L NEAR 	F03D	CODE
BAD_ADDR_MARK. . . . . . . . . .	Number	0002	
BAD_CMD. . . . . . . . . . . . .	Number	0001	
BAD_CNTLR. . . . . . . . . . . .	Number	0020	
BAD_COMMAND. . . . . . . . . . .	L NEAR 	C330	CODE
BAD_CRC. . . . . . . . . . . . .	Number	0010	
BAD_DMA. . . . . . . . . . . . .	Number	0008	
BAD_ECC. . . . . . . . . . . . .	Number	0010	
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-2
	 	 	 	 	 	 	 	09-15-88    


BAD_NEC. . . . . . . . . . . . .	Number	0020	
BAD_RESET. . . . . . . . . . . .	Number	0005	
BAD_SEEK . . . . . . . . . . . .	Number	0040	
BAD_TRACK. . . . . . . . . . . .	Number	000B	
BCT. . . . . . . . . . . . . . .	N PROC	F866	CODE	Length =0041
BCT1 . . . . . . . . . . . . . .	L NEAR 	F883	CODE
BCT2 . . . . . . . . . . . . . .	L NEAR 	F885	CODE
BCT3 . . . . . . . . . . . . . .	L NEAR 	F879	CODE
BEEP . . . . . . . . . . . . . .	N PROC	E5C9	CODE	Length =0022
BIOS_BREAK . . . . . . . . . . .	L BYTE 	0071	DATA
BOOT_LOCN. . . . . . . . . . . .	L FAR  	7C00	ABS0
BOOT_STRAP . . . . . . . . . . .	N PROC	E66D	CODE	Length =0038
BOOT_STRAPT. . . . . . . . . . .	L NEAR 	C186	CODE
BOOT_VEC . . . . . . . . . . . .	L DWORD	0064	ABS0
BOX_ON . . . . . . . . . . . . .	L NEAR 	C10A	CODE
BOZIN. . . . . . . . . . . . . .	L NEAR 	C8DD	CODE
BUFFER_END . . . . . . . . . . .	L WORD 	0082	DATA
BUFFER_HEAD. . . . . . . . . . .	L WORD 	001A	DATA
BUFFER_START . . . . . . . . . .	L WORD 	0080	DATA
BUFFER_TAIL. . . . . . . . . . .	L WORD 	001C	DATA
BYXOD. . . . . . . . . . . . . .	L NEAR 	C8F0	CODE
BYXOD1 . . . . . . . . . . . . .	L NEAR 	C85E	CODE
C1 . . . . . . . . . . . . . . .	L WORD 	E016	CODE
C10. . . . . . . . . . . . . . .	L NEAR 	E0B1	CODE
C11. . . . . . . . . . . . . . .	L NEAR 	E0D9	CODE
C12. . . . . . . . . . . . . . .	L NEAR 	E0EB	CODE
C13. . . . . . . . . . . . . . .	L NEAR 	E0FC	CODE
C14. . . . . . . . . . . . . . .	L NEAR 	E102	CODE
C15. . . . . . . . . . . . . . .	L NEAR 	E110	CODE
C16. . . . . . . . . . . . . . .	L NEAR 	E11C	CODE
C17. . . . . . . . . . . . . . .	L NEAR 	E126	CODE
C18. . . . . . . . . . . . . . .	L NEAR 	E136	CODE
C1T. . . . . . . . . . . . . . .	L NEAR 	C582	CODE
C21. . . . . . . . . . . . . . .	L NEAR 	E15C	CODE
C25. . . . . . . . . . . . . . .	L NEAR 	E168	CODE
C26. . . . . . . . . . . . . . .	L NEAR 	E185	CODE
C26K . . . . . . . . . . . . . .	L NEAR 	C856	CODE
C2_1 . . . . . . . . . . . . . .	L NEAR 	D467	CODE
C3 . . . . . . . . . . . . . . .	L NEAR 	D48E	CODE
C4 . . . . . . . . . . . . . . .	L NEAR 	D4A2	CODE
C5 . . . . . . . . . . . . . . .	L NEAR 	D4B6	CODE
C6 . . . . . . . . . . . . . . .	L NEAR 	D4CA	CODE
C6X. . . . . . . . . . . . . . .	L NEAR 	D4DB	CODE
C7 . . . . . . . . . . . . . . .	L NEAR 	D4E8	CODE
C7X. . . . . . . . . . . . . . .	L NEAR 	D4EA	CODE
C8 . . . . . . . . . . . . . . .	L NEAR 	E08E	CODE
C9 . . . . . . . . . . . . . . .	L NEAR 	E0AB	CODE
CA0. . . . . . . . . . . . . . .	L NEAR 	CFB2	CODE
CA1. . . . . . . . . . . . . . .	L NEAR 	CFD5	CODE
CA10 . . . . . . . . . . . . . .	L NEAR 	D03D	CODE
CA11 . . . . . . . . . . . . . .	L NEAR 	D071	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-3
	 	 	 	 	 	 	 	09-15-88    


CA12 . . . . . . . . . . . . . .	L NEAR 	D094	CODE
CA13 . . . . . . . . . . . . . .	L NEAR 	D0E0	CODE
CA14 . . . . . . . . . . . . . .	L NEAR 	D0D8	CODE
CA15 . . . . . . . . . . . . . .	L NEAR 	D0AB	CODE
CA16 . . . . . . . . . . . . . .	L NEAR 	D0BD	CODE
CA2. . . . . . . . . . . . . . .	L NEAR 	CFE4	CODE
CA22 . . . . . . . . . . . . . .	L NEAR 	CFEB	CODE
CA3. . . . . . . . . . . . . . .	L NEAR 	D003	CODE
CA4. . . . . . . . . . . . . . .	L NEAR 	D01C	CODE
CA5. . . . . . . . . . . . . . .	L NEAR 	D018	CODE
CA6. . . . . . . . . . . . . . .	L NEAR 	D022	CODE
CA7. . . . . . . . . . . . . . .	L NEAR 	D000	CODE
CA7A . . . . . . . . . . . . . .	L NEAR 	CFFD	CODE
CA8. . . . . . . . . . . . . . .	L NEAR 	D027	CODE
CA9. . . . . . . . . . . . . . .	L NEAR 	D037	CODE
CAPS_KEY . . . . . . . . . . . .	Number	0056	
CAPS_SHIFT . . . . . . . . . . .	Number	0040	
CAPS_STATE . . . . . . . . . . .	Number	0040	
CAW. . . . . . . . . . . . . . .	L WORD 	E018	CODE
CHK_DRV. . . . . . . . . . . . .	N PROC	C52A	CODE	Length =0007
CHK_DRV_CMD. . . . . . . . . . .	Number	00E3	
CHK_LONG . . . . . . . . . . . .	N PROC	C4EB	CODE	Length =0007
CHK_STAT_2 . . . . . . . . . . .	N PROC	EF0E	CODE	Length =0021
CHK_TRK_CMD. . . . . . . . . . .	Number	0005	
CM3. . . . . . . . . . . . . . .	L NEAR 	C586	CODE
CM7. . . . . . . . . . . . . . .	L NEAR 	C59B	CODE
CMD_BLOCK. . . . . . . . . . . .	L BYTE 	0042	DATA
CMD_PORT . . . . . . . . . . . .	Number	0063	
CNTLR_DIAG . . . . . . . . . . .	N PROC	C531	CODE	Length =0005
CNTLR_DIAG_CMD . . . . . . . . .	Number	00E4	
COD. . . . . . . . . . . . . . .	Number	F000	
COMMAND. . . . . . . . . . . . .	N PROC	C562	CODE	Length =003A
CONTROL_BYTE . . . . . . . . . .	L BYTE 	0076	DATA
CRLF . . . . . . . . . . . . . .	N PROC	FFCB	CODE	Length =000F
CRT_CHAR_GEN . . . . . . . . . .	L BYTE 	FA6E	CODE
CRT_CHAR_IBM . . . . . . . . . .	L BYTE 	DC00	CODE
CRT_CHAR_RUS . . . . . . . . . .	L BYTE 	CBB2	CODE
CRT_COLS . . . . . . . . . . . .	L WORD 	004A	DATA
CRT_LEN. . . . . . . . . . . . .	L WORD 	004C	DATA
CRT_MODE . . . . . . . . . . . .	L BYTE 	0049	DATA
CRT_MODE_SET . . . . . . . . . .	L BYTE 	0065	DATA
CRT_PALLETTE . . . . . . . . . .	L BYTE 	0066	DATA
CRT_START. . . . . . . . . . . .	L WORD 	004E	DATA
CSI. . . . . . . . . . . . . . .	L WORD 	04D0	ABS0
CTL_KEY. . . . . . . . . . . . .	Number	001D	
CTL_SHIFT. . . . . . . . . . . .	Number	0004	
CURSOR_MODE. . . . . . . . . . .	L WORD 	0060	DATA
CURSOR_POSN. . . . . . . . . . .	L WORD 	0050	DATA	Length =0008
D1 . . . . . . . . . . . . . . .	L BYTE 	E18E	CODE
D10. . . . . . . . . . . . . . .	L NEAR 	E229	CODE
D11. . . . . . . . . . . . . . .	N PROC	E233	CODE	Length =000D
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-4
	 	 	 	 	 	 	 	09-15-88    


D12. . . . . . . . . . . . . . .	L NEAR 	E24F	CODE
D13. . . . . . . . . . . . . . .	L NEAR 	E259	CODE
D14. . . . . . . . . . . . . . .	L NEAR 	E263	CODE
D1L. . . . . . . . . . . . . . .	Number	0016	
D1T. . . . . . . . . . . . . . .	L NEAR 	C4CE	CODE
D2 . . . . . . . . . . . . . . .	L BYTE 	E1A4	CODE
D2L. . . . . . . . . . . . . . .	Number	000E	
D3 . . . . . . . . . . . . . . .	L NEAR 	E1E0	CODE
D4 . . . . . . . . . . . . . . .	L NEAR 	E1F2	CODE
D5 . . . . . . . . . . . . . . .	L NEAR 	E1F4	CODE
D6 . . . . . . . . . . . . . . .	L NEAR 	E1FA	CODE
D7 . . . . . . . . . . . . . . .	L NEAR 	E202	CODE
D8 . . . . . . . . . . . . . . .	L NEAR 	E214	CODE
D9 . . . . . . . . . . . . . . .	L NEAR 	E21D	CODE
DAL. . . . . . . . . . . . . . .	L NEAR 	E501	CODE
DAT. . . . . . . . . . . . . . .	Number	0040	
DATA_CORRECTED . . . . . . . . .	Number	0011	
DECIMAL_LOOP . . . . . . . . . .	L NEAR 	D12B	CODE
DEL_KEY. . . . . . . . . . . . .	Number	0053	
DISKETTE_IO. . . . . . . . . . .	F PROC	EC59	CODE	Length =002E
DISKETTE_PARM. . . . . . . . . .	L DWORD	0078	ABS0
DISKETTE_STATUS. . . . . . . . .	L BYTE 	0041	DATA
DISKETTE_TBL . . . . . . . . . .	L NEAR 	C201	CODE
DISKW_STATUS . . . . . . . . . .	L BYTE 	0074	DATA
DISK_BASE. . . . . . . . . . . .	L BYTE 	EFC7	CODE
DISK_FORMAT. . . . . . . . . . .	N PROC	ED1B	CODE	Length =0026
DISK_INT . . . . . . . . . . . .	F PROC	EF57	CODE	Length =0014
DISK_IO. . . . . . . . . . . . .	F PROC	C256	CODE	Length =0046
DISK_IO_CONT . . . . . . . . . .	N PROC	C2EA	CODE	Length =004E
DISK_POINTER . . . . . . . . . .	L DWORD	0078	ABS0
DISK_READ. . . . . . . . . . . .	N PROC	ED0E	CODE	Length =0009
DISK_READT . . . . . . . . . . .	N PROC	C356	CODE	Length =000A
DISK_RESET . . . . . . . . . . .	N PROC	ECB9	CODE	Length =0051
DISK_RESETT. . . . . . . . . . .	N PROC	C338	CODE	Length =0015
DISK_SEEK. . . . . . . . . . . .	N PROC	C4F2	CODE	Length =0007
DISK_SETUP . . . . . . . . . . .	N PROC	C003	CODE	Length =0183
DISK_STATUS. . . . . . . . . . .	N PROC	ED0A	CODE	Length =0004
DISK_VECTOR. . . . . . . . . . .	L DWORD	0100	ABS0
DISK_VERF. . . . . . . . . . . .	N PROC	ED17	CODE	Length =0004
DISK_VERFT . . . . . . . . . . .	N PROC	C36A	CODE	Length =0008
DISK_WRITE . . . . . . . . . . .	N PROC	ED41	CODE	Length =000C
DISK_WRITET. . . . . . . . . . .	N PROC	C360	CODE	Length =000A
DMA. . . . . . . . . . . . . . .	Number	0000	
DMA08. . . . . . . . . . . . . .	Number	0008	
DMA_BOUNDARY . . . . . . . . . .	Number	0009	
DMA_HIGH . . . . . . . . . . . .	Number	0082	
DMA_OPN. . . . . . . . . . . . .	L NEAR 	C545	CODE
DMA_READ . . . . . . . . . . . .	Number	0047	
DMA_SETUP. . . . . . . . . . . .	N PROC	EEC8	CODE	Length =0046
DMA_SETUPT . . . . . . . . . . .	N PROC	C69F	CODE	Length =0069
DMA_WRITE. . . . . . . . . . . .	Number	004B	
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-5
	 	 	 	 	 	 	 	09-15-88    


DR1. . . . . . . . . . . . . . .	L NEAR 	C34A	CODE
DSBL . . . . . . . . . . . . . .	N PROC	C20C	CODE	Length =004A
DUMMM_RETURN . . . . . . . . . .	L NEAR 	F938	CODE
DUMMY_RETURN . . . . . . . . . .	L NEAR 	FF53	CODE
E1 . . . . . . . . . . . . . . .	L BYTE 	E265	CODE
E10. . . . . . . . . . . . . . .	L NEAR 	E2FC	CODE
E11. . . . . . . . . . . . . . .	L NEAR 	E31A	CODE
E12. . . . . . . . . . . . . . .	L NEAR 	E31C	CODE
E13. . . . . . . . . . . . . . .	L NEAR 	E31E	CODE
E14. . . . . . . . . . . . . . .	L NEAR 	E327	CODE
E15. . . . . . . . . . . . . . .	L NEAR 	E329	CODE
E16. . . . . . . . . . . . . . .	L NEAR 	E332	CODE
E17. . . . . . . . . . . . . . .	L NEAR 	E33A	CODE
E18. . . . . . . . . . . . . . .	L NEAR 	E340	CODE
E19. . . . . . . . . . . . . . .	L NEAR 	E345	CODE
E190 . . . . . . . . . . . . . .	L NEAR 	D0EB	CODE
E1L. . . . . . . . . . . . . . .	Number	0004	
E1N. . . . . . . . . . . . . . .	L BYTE 	E269	CODE
E1NL . . . . . . . . . . . . . .	Number	0004	
E20A . . . . . . . . . . . . . .	L NEAR 	D0FA	CODE
E20B . . . . . . . . . . . . . .	L NEAR 	D0FF	CODE
E20C . . . . . . . . . . . . . .	L NEAR 	D10F	CODE
E21A . . . . . . . . . . . . . .	L NEAR 	D161	CODE
E22. . . . . . . . . . . . . . .	L NEAR 	E3A4	CODE
E3 . . . . . . . . . . . . . . .	L NEAR 	E294	CODE
E300 . . . . . . . . . . . . . .	L BYTE 	D1BB	CODE
E3A. . . . . . . . . . . . . . .	L NEAR 	E29F	CODE
E7 . . . . . . . . . . . . . . .	L NEAR 	E2AD	CODE
E8 . . . . . . . . . . . . . . .	L NEAR 	E2BD	CODE
E9 . . . . . . . . . . . . . . .	L NEAR 	E2DF	CODE
EA1. . . . . . . . . . . . . . .	L NEAR 	D19E	CODE
END_ADDRESS. . . . . . . . . . .	L BYTE 	C7BB	CODE
EOI. . . . . . . . . . . . . . .	Number	0020	
EQUIPMENT. . . . . . . . . . . .	F PROC	F85A	CODE	Length =000C
EQUIP_FLAG . . . . . . . . . . .	L WORD 	0010	DATA
EQ_FL. . . . . . . . . . . . . .	L BYTE 	0410	ABS0
ERR01. . . . . . . . . . . . . .	L NEAR 	E0AF	CODE
ERR10. . . . . . . . . . . . . .	L NEAR 	FFBB	CODE
ERR20. . . . . . . . . . . . . .	L NEAR 	FFC0	CODE
ERROR_BEEP . . . . . . . . . . .	N PROC	E6DF	CODE	Length =0025
ERROR_CHK. . . . . . . . . . . .	N PROC	C59C	CODE	Length =0047
ERROR_EX . . . . . . . . . . . .	L NEAR 	C142	CODE
ERROR_EXT. . . . . . . . . . . .	L NEAR 	D366	CODE
ERR_BEEP . . . . . . . . . . . .	N PROC	E5A0	CODE	Length =0029
ERR_WAIT . . . . . . . . . . . .	L NEAR 	E4F8	CODE
EXIT . . . . . . . . . . . . . .	L NEAR 	FFC5	CODE
EXT. . . . . . . . . . . . . . .	N PROC	D306	CODE	Length =0055
EXT_MEM. . . . . . . . . . . . .	L NEAR 	D25D	CODE
EXT_MEM_1. . . . . . . . . . . .	L NEAR 	D271	CODE
EXT_PTR. . . . . . . . . . . . .	L DWORD	007C	ABS0
EX_MEMORY. . . . . . . . . . . .	F PROC	D1F1	CODE	Length =01A8
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-6
	 	 	 	 	 	 	 	09-15-88    


EX_MEM_SIZE. . . . . . . . . . .	L NEAR 	D21B	CODE
E_MSG. . . . . . . . . . . . . .	N PROC	C840	CODE	Length =0006
F1 . . . . . . . . . . . . . . .	L BYTE 	E3B6	CODE
F10. . . . . . . . . . . . . . .	L NEAR 	E490	CODE
F11. . . . . . . . . . . . . . .	L NEAR 	E4A5	CODE
F12. . . . . . . . . . . . . . .	L NEAR 	E4A7	CODE
F13. . . . . . . . . . . . . . .	L NEAR 	E4BD	CODE
F14. . . . . . . . . . . . . . .	L NEAR 	E4C6	CODE
F15. . . . . . . . . . . . . . .	L NEAR 	E4CC	CODE
F16. . . . . . . . . . . . . . .	L NEAR 	E50E	CODE
F17. . . . . . . . . . . . . . .	L NEAR 	E522	CODE
F17T . . . . . . . . . . . . . .	L BYTE 	C168	CODE
F17TL. . . . . . . . . . . . . .	Number	0006	
F18. . . . . . . . . . . . . . .	L NEAR 	E54B	CODE
F19. . . . . . . . . . . . . . .	L NEAR 	E55F	CODE
F1L. . . . . . . . . . . . . . .	Number	0004	
F2 . . . . . . . . . . . . . . .	L BYTE 	E3BA	CODE
F20. . . . . . . . . . . . . . .	L NEAR 	E583	CODE
F21. . . . . . . . . . . . . . .	L NEAR 	E59B	CODE
F23. . . . . . . . . . . . . . .	L NEAR 	E59D	CODE
F2L. . . . . . . . . . . . . . .	Number	0003	
F3 . . . . . . . . . . . . . . .	L BYTE 	E3BD	CODE
F39. . . . . . . . . . . . . . .	L BYTE 	D1D1	CODE
F3A. . . . . . . . . . . . . . .	L BYTE 	C811	CODE
F3L. . . . . . . . . . . . . . .	Number	0003	
F4 . . . . . . . . . . . . . . .	L WORD 	E3C0	CODE
F4E. . . . . . . . . . . . . . .	L WORD 	E3C2	CODE
F5 . . . . . . . . . . . . . . .	L NEAR 	E3EF	CODE
F6 . . . . . . . . . . . . . . .	L NEAR 	E407	CODE
F7 . . . . . . . . . . . . . . .	L NEAR 	E410	CODE
FD_TBL . . . . . . . . . . . . .	L NEAR 	C3E7	CODE
FIND . . . . . . . . . . . . . .	L NEAR 	D32A	CODE
FIND_POSITION. . . . . . . . . .	N PROC	F3BF	CODE	Length =001C
FMTBAD_CMD . . . . . . . . . . .	Number	0007	
FMTDRV_CMD . . . . . . . . . . .	Number	0004	
FMTTRK_CMD . . . . . . . . . . .	Number	0006	
FMT_BAD. . . . . . . . . . . . .	N PROC	C379	CODE	Length =0007
FMT_CONT . . . . . . . . . . . .	L NEAR 	C385	CODE
FMT_DRV. . . . . . . . . . . . .	N PROC	C380	CODE	Length =0005
FMT_TRK. . . . . . . . . . . . .	N PROC	C372	CODE	Length =0007
G1 . . . . . . . . . . . . . . .	L NEAR 	E5AC	CODE
G10. . . . . . . . . . . . . . .	L NEAR 	E60C	CODE
G11. . . . . . . . . . . . . . .	L NEAR 	C55E	CODE
G12. . . . . . . . . . . . . . .	L NEAR 	E61C	CODE
G12A . . . . . . . . . . . . . .	L NEAR 	C846	CODE
G2 . . . . . . . . . . . . . . .	L NEAR 	E5B1	CODE
G21. . . . . . . . . . . . . . .	L NEAR 	C5A4	CODE
G22. . . . . . . . . . . . . . .	L NEAR 	C5BC	CODE
G24. . . . . . . . . . . . . . .	L NEAR 	C5E1	CODE
G3 . . . . . . . . . . . . . . .	L NEAR 	E5B7	CODE
G3T. . . . . . . . . . . . . . .	L NEAR 	C555	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-7
	 	 	 	 	 	 	 	09-15-88    


G3T0 . . . . . . . . . . . . . .	L NEAR 	C667	CODE
G4 . . . . . . . . . . . . . . .	L NEAR 	E5BC	CODE
G4T. . . . . . . . . . . . . . .	L NEAR 	C3D7	CODE
G5 . . . . . . . . . . . . . . .	L NEAR 	E5C2	CODE
G5T. . . . . . . . . . . . . . .	L NEAR 	C3D1	CODE
G6 . . . . . . . . . . . . . . .	L NEAR 	E5C4	CODE
G7 . . . . . . . . . . . . . . .	L NEAR 	E5E0	CODE
G8 . . . . . . . . . . . . . . .	L NEAR 	E5F2	CODE
G8T. . . . . . . . . . . . . . .	L NEAR 	C53F	CODE
G9 . . . . . . . . . . . . . . .	L NEAR 	E605	CODE
GET_PARM . . . . . . . . . . . .	N PROC	EE51	CODE	Length =0016
GET_PARMT. . . . . . . . . . . .	F PROC	C390	CODE	Length =0057
GET_PARMT_N. . . . . . . . . . .	L NEAR 	C390	CODE
GO . . . . . . . . . . . . . . .	N PROC	D367	CODE	Length =0032
GR12 . . . . . . . . . . . . . .	L NEAR 	D3A0	CODE
GR8. . . . . . . . . . . . . . .	L NEAR 	CB4D	CODE
GRAPHICS_DOWN. . . . . . . . . .	N PROC	F50F	CODE	Length =0060
GRAPHICS_READ. . . . . . . . . .	N PROC	F64B	CODE	Length =0084
GRAPHICS_UP. . . . . . . . . . .	N PROC	F4B6	CODE	Length =0059
GRAPHICS_WRITE . . . . . . . . .	N PROC	F599	CODE	Length =00B2
GRAPH_POSN . . . . . . . . . . .	L NEAR 	F727	CODE
H1 . . . . . . . . . . . . . . .	L NEAR 	E67D	CODE
H1T. . . . . . . . . . . . . . .	L NEAR 	C1A3	CODE
H2 . . . . . . . . . . . . . . .	L NEAR 	E698	CODE
H2T. . . . . . . . . . . . . . .	L NEAR 	C1BB	CODE
H3 . . . . . . . . . . . . . . .	L NEAR 	E69D	CODE
H4 . . . . . . . . . . . . . . .	L NEAR 	E6A0	CODE
H4T. . . . . . . . . . . . . . .	L NEAR 	C1C8	CODE
H5 . . . . . . . . . . . . . . .	L NEAR 	C1CD	CODE
H6 . . . . . . . . . . . . . . .	L NEAR 	C1D6	CODE
H7 . . . . . . . . . . . . . . .	L NEAR 	C1F2	CODE
H8 . . . . . . . . . . . . . . .	L NEAR 	C1FD	CODE
HARD_DISK. . . . . . . . . . . .	L NEAR 	C260	CODE
HDISK_INT. . . . . . . . . . . .	L DWORD	0034	ABS0
HDISK_RECAL. . . . . . . . . . .	N PROC	C51C	CODE	Length =0007
HD_ERROR . . . . . . . . . . . .	L BYTE 	0042	DATA
HD_INT . . . . . . . . . . . . .	N PROC	C760	CODE	Length =0011
HD_RESET_1 . . . . . . . . . . .	N PROC	C16E	CODE	Length =0018
HD_WAIT_REQ. . . . . . . . . . .	N PROC	C68A	CODE	Length =0015
HF_NUM . . . . . . . . . . . . .	L BYTE 	0075	DATA
HF_PORT. . . . . . . . . . . . .	Number	0320	
HF_TBL_VEC . . . . . . . . . . .	L DWORD	0104	ABS0
HOLD_STATE . . . . . . . . . . .	Number	0008	
IDNPOL . . . . . . . . . . . . .	L WORD 	0090	DATA
INF_KEY. . . . . . . . . . . . .	Number	0059	
INIT_DRV . . . . . . . . . . . .	N PROC	C427	CODE	Length =001D
INIT_DRV_CMD . . . . . . . . . .	Number	000C	
INIT_DRV_OUT . . . . . . . . . .	L NEAR 	C443	CODE
INIT_DRV_R . . . . . . . . . . .	N PROC	C444	CODE	Length =007E
INIT_DRV_S . . . . . . . . . . .	N PROC	C4C2	CODE	Length =000D
INIT_FAIL. . . . . . . . . . . .	Number	0007	
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-8
	 	 	 	 	 	 	 	09-15-88    


INS_KEY. . . . . . . . . . . . .	Number	0052	
INS_SHIFT. . . . . . . . . . . .	Number	0080	
INS_STATE. . . . . . . . . . . .	Number	0080	
INT5_PTR . . . . . . . . . . . .	L WORD 	0014	ABS0
INTA00 . . . . . . . . . . . . .	Number	0020	
INTA01 . . . . . . . . . . . . .	Number	0021	
INT_ADDR . . . . . . . . . . . .	L WORD 	0020	ABS0
INT_CTL_PORT . . . . . . . . . .	Number	0020	
INT_FLAG . . . . . . . . . . . .	Number	0080	
INT_PTR. . . . . . . . . . . . .	L DWORD	0020	ABS0
INV_KEY_L. . . . . . . . . . . .	Number	0058	
INV_KEY_R. . . . . . . . . . . .	Number	005A	
INV_SHIFT. . . . . . . . . . . .	Number	0004	
IN_MEM . . . . . . . . . . . . .	L NEAR 	D269	CODE
IO_RAM_SIZE. . . . . . . . . . .	L WORD 	0015	DATA
IO_ROM_INIT. . . . . . . . . . .	L WORD 	0067	DATA
IO_ROM_SEG . . . . . . . . . . .	L WORD 	0069	DATA
J1 . . . . . . . . . . . . . . .	N PROC	EC87	CODE	Length =0032
J10. . . . . . . . . . . . . . .	L NEAR 	ED29	CODE
J11. . . . . . . . . . . . . . .	L NEAR 	ED57	CODE
J12. . . . . . . . . . . . . . .	L NEAR 	EDA0	CODE
J13. . . . . . . . . . . . . . .	L NEAR 	EDA4	CODE
J14. . . . . . . . . . . . . . .	L NEAR 	EDAA	CODE
J15. . . . . . . . . . . . . . .	L NEAR 	EDD4	CODE
J16. . . . . . . . . . . . . . .	L NEAR 	EDF9	CODE
J17. . . . . . . . . . . . . . .	L NEAR 	EE00	CODE
J18. . . . . . . . . . . . . . .	L NEAR 	EE3D	CODE
J19. . . . . . . . . . . . . . .	L NEAR 	EE3F	CODE
J1T. . . . . . . . . . . . . . .	L NEAR 	C6AA	CODE
J2 . . . . . . . . . . . . . . .	L NEAR 	ECAB	CODE
J20. . . . . . . . . . . . . . .	L NEAR 	EE46	CODE
J20T . . . . . . . . . . . . . .	L NEAR 	C6FA	CODE
J21. . . . . . . . . . . . . . .	L NEAR 	EE47	CODE
J22. . . . . . . . . . . . . . .	L NEAR 	EE4B	CODE
J23. . . . . . . . . . . . . . .	L NEAR 	E6AC	CODE
J24. . . . . . . . . . . . . . .	L NEAR 	E6B3	CODE
J25. . . . . . . . . . . . . . .	L NEAR 	E6BD	CODE
J26. . . . . . . . . . . . . . .	L NEAR 	E6BF	CODE
J27. . . . . . . . . . . . . . .	L NEAR 	E6C8	CODE
J28. . . . . . . . . . . . . . .	L NEAR 	EE95	CODE
J29. . . . . . . . . . . . . . .	L NEAR 	EEB8	CODE
J3 . . . . . . . . . . . . . . .	L NEAR 	ECB3	CODE
J30. . . . . . . . . . . . . . .	L NEAR 	EEBF	CODE
J300 . . . . . . . . . . . . . .	L NEAR 	EEAA	CODE
J31. . . . . . . . . . . . . . .	L NEAR 	EEC5	CODE
J32. . . . . . . . . . . . . . .	L NEAR 	EEC7	CODE
J33. . . . . . . . . . . . . . .	L NEAR 	EEDD	CODE
J33T . . . . . . . . . . . . . .	L NEAR 	C6C2	CODE
J34. . . . . . . . . . . . . . .	L NEAR 	EF27	CODE
J35. . . . . . . . . . . . . . .	L NEAR 	EF28	CODE
J36. . . . . . . . . . . . . . .	L NEAR 	EF36	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-9
	 	 	 	 	 	 	 	09-15-88    


J37. . . . . . . . . . . . . . .	L NEAR 	EF49	CODE
J38. . . . . . . . . . . . . . .	L NEAR 	EF74	CODE
J39. . . . . . . . . . . . . . .	L NEAR 	EF79	CODE
J4 . . . . . . . . . . . . . . .	L NEAR 	ECD2	CODE
J40. . . . . . . . . . . . . . .	L NEAR 	EF85	CODE
J40A . . . . . . . . . . . . . .	L NEAR 	EF8A	CODE
J41. . . . . . . . . . . . . . .	L NEAR 	EF8F	CODE
J42. . . . . . . . . . . . . . .	L NEAR 	EF96	CODE
J43. . . . . . . . . . . . . . .	L NEAR 	EF9E	CODE
J44. . . . . . . . . . . . . . .	L NEAR 	EFAC	CODE
J45. . . . . . . . . . . . . . .	L NEAR 	EFC4	CODE
J5 . . . . . . . . . . . . . . .	L NEAR 	ECD4	CODE
J6 . . . . . . . . . . . . . . .	L NEAR 	ECD6	CODE
J7 . . . . . . . . . . . . . . .	L NEAR 	ECF8	CODE
J8 . . . . . . . . . . . . . . .	L NEAR 	ED09	CODE
J9 . . . . . . . . . . . . . . .	L NEAR 	ED10	CODE
K1 . . . . . . . . . . . . . . .	L NEAR 	E845	CODE
K10. . . . . . . . . . . . . . .	L BYTE 	E8DC	CODE
K11. . . . . . . . . . . . . . .	L BYTE 	E916	CODE
K12. . . . . . . . . . . . . . .	L BYTE 	E950	CODE
K13. . . . . . . . . . . . . . .	L BYTE 	E95A	CODE
K14. . . . . . . . . . . . . . .	L BYTE 	E964	CODE
K15. . . . . . . . . . . . . . .	L BYTE 	E971	CODE
K16. . . . . . . . . . . . . . .	L NEAR 	E9AF	CODE
K17. . . . . . . . . . . . . . .	L NEAR 	E9D9	CODE
K18. . . . . . . . . . . . . . .	L NEAR 	EA4B	CODE
K19. . . . . . . . . . . . . . .	L NEAR 	EA60	CODE
K2 . . . . . . . . . . . . . . .	L NEAR 	E85E	CODE
K20. . . . . . . . . . . . . . .	L NEAR 	EA6E	CODE
K21. . . . . . . . . . . . . . .	L NEAR 	EA74	CODE
K22. . . . . . . . . . . . . . .	L NEAR 	EA7B	CODE
K23. . . . . . . . . . . . . . .	L NEAR 	EA9F	CODE
K24. . . . . . . . . . . . . . .	L NEAR 	EAC3	CODE
K25. . . . . . . . . . . . . . .	L NEAR 	EACC	CODE
K26. . . . . . . . . . . . . . .	L NEAR 	EAEB	CODE
K26A . . . . . . . . . . . . . .	L NEAR 	EA48	CODE
K27. . . . . . . . . . . . . . .	L NEAR 	EAF0	CODE
K28. . . . . . . . . . . . . . .	L NEAR 	EAFF	CODE
K29. . . . . . . . . . . . . . .	L NEAR 	EB09	CODE
K3 . . . . . . . . . . . . . . .	L NEAR 	E86F	CODE
K30. . . . . . . . . . . . . . .	L BYTE 	F8E1	CODE
K300 . . . . . . . . . . . . . .	L NEAR 	EA1D	CODE
K301 . . . . . . . . . . . . . .	L NEAR 	EA22	CODE
K302 . . . . . . . . . . . . . .	L NEAR 	EA37	CODE
K303 . . . . . . . . . . . . . .	L NEAR 	EA93	CODE
K304 . . . . . . . . . . . . . .	L NEAR 	EAAF	CODE
K306 . . . . . . . . . . . . . .	L NEAR 	EB14	CODE
K307 . . . . . . . . . . . . . .	L NEAR 	EAF9	CODE
K31. . . . . . . . . . . . . . .	L NEAR 	EB1F	CODE
K32. . . . . . . . . . . . . . .	L NEAR 	EB28	CODE
K33. . . . . . . . . . . . . . .	L NEAR 	EB44	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-10
	 	 	 	 	 	 	 	09-15-88    


K34. . . . . . . . . . . . . . .	L NEAR 	EB55	CODE
K35. . . . . . . . . . . . . . .	L NEAR 	EB65	CODE
K36. . . . . . . . . . . . . . .	L NEAR 	EB69	CODE
K37. . . . . . . . . . . . . . .	L NEAR 	EB6B	CODE
K38. . . . . . . . . . . . . . .	L NEAR 	EB75	CODE
K39. . . . . . . . . . . . . . .	L NEAR 	EB98	CODE
K4 . . . . . . . . . . . . . . .	N PROC	E6D1	CODE	Length =000E
K40. . . . . . . . . . . . . . .	L NEAR 	EBB3	CODE
K400 . . . . . . . . . . . . . .	L NEAR 	EA06	CODE
K401 . . . . . . . . . . . . . .	L NEAR 	EA0E	CODE
K406 . . . . . . . . . . . . . .	L NEAR 	E9C2	CODE
K406B. . . . . . . . . . . . . .	L NEAR 	EADB	CODE
K407 . . . . . . . . . . . . . .	L NEAR 	E9D6	CODE
K41. . . . . . . . . . . . . . .	L NEAR 	EBBD	CODE
K42. . . . . . . . . . . . . . .	L NEAR 	EBC7	CODE
K43. . . . . . . . . . . . . . .	L NEAR 	EBD1	CODE
K44. . . . . . . . . . . . . . .	L NEAR 	EBD7	CODE
K45. . . . . . . . . . . . . . .	L NEAR 	EBEF	CODE
K46. . . . . . . . . . . . . . .	L NEAR 	EBFC	CODE
K47. . . . . . . . . . . . . . .	L NEAR 	EC06	CODE
K48. . . . . . . . . . . . . . .	L NEAR 	EC19	CODE
K49. . . . . . . . . . . . . . .	L NEAR 	EC27	CODE
K5 . . . . . . . . . . . . . . .	L NEAR 	E6DE	CODE
K50. . . . . . . . . . . . . . .	L NEAR 	EC37	CODE
K51. . . . . . . . . . . . . . .	L NEAR 	EC3D	CODE
K52. . . . . . . . . . . . . . .	L NEAR 	EC43	CODE
K53. . . . . . . . . . . . . . .	L NEAR 	EC4A	CODE
K54. . . . . . . . . . . . . . .	L NEAR 	E704	CODE
K54A . . . . . . . . . . . . . .	L NEAR 	EBEC	CODE
K55. . . . . . . . . . . . . . .	L NEAR 	E70D	CODE
K56. . . . . . . . . . . . . . .	L NEAR 	E717	CODE
K57. . . . . . . . . . . . . . .	L NEAR 	E71B	CODE
K58. . . . . . . . . . . . . . .	L NEAR 	E724	CODE
K59. . . . . . . . . . . . . . .	L NEAR 	E749	CODE
K6 . . . . . . . . . . . . . . .	L BYTE 	E875	CODE
K60. . . . . . . . . . . . . . .	L NEAR 	E74C	CODE
K61. . . . . . . . . . . . . . .	L NEAR 	E756	CODE
K62. . . . . . . . . . . . . . .	L NEAR 	E773	CODE
K63. . . . . . . . . . . . . . .	L NEAR 	E779	CODE
K64. . . . . . . . . . . . . . .	L NEAR 	E77B	CODE
K65. . . . . . . . . . . . . . .	L NEAR 	E6E8	CODE
K66. . . . . . . . . . . . . . .	L NEAR 	E6EF	CODE
K67. . . . . . . . . . . . . . .	L NEAR 	E6F8	CODE
K6L. . . . . . . . . . . . . . .	Number	000C	
K7 . . . . . . . . . . . . . . .	L BYTE 	E881	CODE
K8 . . . . . . . . . . . . . . .	L BYTE 	E889	CODE
K80. . . . . . . . . . . . . . .	L NEAR 	F91D	CODE
K81. . . . . . . . . . . . . . .	L NEAR 	F91A	CODE
K88. . . . . . . . . . . . . . .	L NEAR 	E735	CODE
K89. . . . . . . . . . . . . . .	L NEAR 	F905	CODE
K89A . . . . . . . . . . . . . .	L NEAR 	F933	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-11
	 	 	 	 	 	 	 	09-15-88    


K89B . . . . . . . . . . . . . .	L NEAR 	F92E	CODE
K9 . . . . . . . . . . . . . . .	L BYTE 	E8C3	CODE
K98. . . . . . . . . . . . . . .	L NEAR 	EC13	CODE
K99. . . . . . . . . . . . . . .	L NEAR 	E76E	CODE
KBDINT . . . . . . . . . . . . .	Number	0002	
KBD_IN . . . . . . . . . . . . .	Number	0060	
KBD_RESET. . . . . . . . . . . .	N PROC	E5EB	CODE	Length =002A
KB_BUFFER. . . . . . . . . . . .	L WORD 	001E	DATA	Length =0010
KB_BUFFER_END. . . . . . . . . .	L WORD 	003E	DATA
KB_CTL . . . . . . . . . . . . .	Number	0061	
KB_DAT . . . . . . . . . . . . .	Number	0060	
KB_FLAG. . . . . . . . . . . . .	L BYTE 	0017	DATA
KB_FLAG_1. . . . . . . . . . . .	L BYTE 	0018	DATA
KB_INT . . . . . . . . . . . . .	F PROC	E987	CODE	Length =02CB
KB_OK. . . . . . . . . . . . . .	L NEAR 	D144	CODE
KEYBOARD_IO. . . . . . . . . . .	F PROC	E82E	CODE	Length =0047
KOLBY. . . . . . . . . . . . . .	L NEAR 	CB14	CODE
KZAGR. . . . . . . . . . . . . .	L NEAR 	F8A6	CODE
L1 . . . . . . . . . . . . . . .	L NEAR 	C690	CODE
L2 . . . . . . . . . . . . . . .	L NEAR 	C69D	CODE
L3 . . . . . . . . . . . . . . .	L NEAR 	C023	CODE
L4 . . . . . . . . . . . . . . .	L NEAR 	C079	CODE
L6 . . . . . . . . . . . . . . .	L NEAR 	C174	CODE
L7 . . . . . . . . . . . . . . .	L NEAR 	C083	CODE
LAST_VAL . . . . . . . . . . . .	L BYTE 	006B	DATA
LAT. . . . . . . . . . . . . . .	Number	0002	
LAT_KEY. . . . . . . . . . . . .	Number	0057	
LAT_SHIFT. . . . . . . . . . . .	Number	0001	
LEFT_KEY . . . . . . . . . . . .	Number	0054	
LEFT_SHIFT . . . . . . . . . . .	Number	0002	
M1 . . . . . . . . . . . . . . .	L WORD 	F045	CODE
M10. . . . . . . . . . . . . . .	L NEAR 	F159	CODE
M11. . . . . . . . . . . . . . .	L NEAR 	F184	CODE
M12. . . . . . . . . . . . . . .	L NEAR 	F187	CODE
M13. . . . . . . . . . . . . . .	L NEAR 	F18A	CODE
M14. . . . . . . . . . . . . . .	L NEAR 	F1D8	CODE
M15. . . . . . . . . . . . . . .	L NEAR 	F1E0	CODE
M16. . . . . . . . . . . . . . .	L NEAR 	F1F0	CODE
M17. . . . . . . . . . . . . . .	L NEAR 	F21D	CODE
M18. . . . . . . . . . . . . . .	N PROC	F21F	CODE	Length =0011
M19. . . . . . . . . . . . . . .	L NEAR 	F280	CODE
M1L. . . . . . . . . . . . . . .	Number	0028	
M1T. . . . . . . . . . . . . . .	L WORD 	C29C	CODE
M1TL . . . . . . . . . . . . . .	Number	002A	
M2 . . . . . . . . . . . . . . .	L NEAR 	F089	CODE
M20. . . . . . . . . . . . . . .	L NEAR 	F287	CODE
M3 . . . . . . . . . . . . . . .	L NEAR 	F0A1	CODE
M4 . . . . . . . . . . . . . . .	Number	0010	
M5 . . . . . . . . . . . . . . .	L WORD 	F0F9	CODE
M6 . . . . . . . . . . . . . . .	L BYTE 	F101	CODE
M7 . . . . . . . . . . . . . . .	L BYTE 	F109	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-12
	 	 	 	 	 	 	 	09-15-88    


M8 . . . . . . . . . . . . . . .	L NEAR 	F122	CODE
M9 . . . . . . . . . . . . . . .	L NEAR 	F156	CODE
MAIN . . . . . . . . . . . . . .	N PROC	D2D7	CODE	Length =002F
MAIN_MEM . . . . . . . . . . . .	L NEAR 	D27D	CODE
MAIN_PORT. . . . . . . . . . . .	N PROC	D2C8	CODE	Length =000F
MAX_FILE . . . . . . . . . . . .	Number	0008	
MAX_PERIOD . . . . . . . . . . .	Number	0540	
MEMORY_SIZE. . . . . . . . . . .	L WORD 	0013	DATA
MEMORY_SIZE_DETERMINE. . . . . .	F PROC	F84E	CODE	Length =000C
MEM_2. . . . . . . . . . . . . .	N PROC	D35B	CODE	Length =000B
MEM_BLOCK. . . . . . . . . . . .	L NEAR 	D226	CODE
MEM_INF. . . . . . . . . . . . .	L NEAR 	D231	CODE
MEM_SIZ. . . . . . . . . . . . .	L WORD 	0413	ABS0
MFG_TST. . . . . . . . . . . . .	L BYTE 	0012	DATA
MIN_PERIOD . . . . . . . . . . .	Number	0410	
MM3. . . . . . . . . . . . . . .	L NEAR 	F0B0	CODE
MOTOR_COUNT. . . . . . . . . . .	L BYTE 	0040	DATA
MOTOR_STATUS . . . . . . . . . .	L BYTE 	003F	DATA
MOTOR_WAIT . . . . . . . . . . .	Number	0025	
MOVE . . . . . . . . . . . . . .	L NEAR 	D239	CODE
MOVE_BLOCK . . . . . . . . . . .	L NEAR 	D282	CODE
MOVE_MEM_BLOCK . . . . . . . . .	L NEAR 	D295	CODE
MOVE_MEM_BLOCK_1 . . . . . . . .	L NEAR 	D218	CODE
N1 . . . . . . . . . . . . . . .	L NEAR 	F2C3	CODE
N10. . . . . . . . . . . . . . .	N PROC	F349	CODE	Length =0009
N11. . . . . . . . . . . . . . .	N PROC	F352	CODE	Length =0007
N12. . . . . . . . . . . . . . .	L NEAR 	F369	CODE
N13. . . . . . . . . . . . . . .	L NEAR 	F377	CODE
N14. . . . . . . . . . . . . . .	L NEAR 	F382	CODE
N15. . . . . . . . . . . . . . .	L NEAR 	F385	CODE
N16. . . . . . . . . . . . . . .	L NEAR 	F391	CODE
N2 . . . . . . . . . . . . . . .	L NEAR 	F2D1	CODE
N3 . . . . . . . . . . . . . . .	L NEAR 	F2DC	CODE
N4 . . . . . . . . . . . . . . .	L NEAR 	F2DF	CODE
N5 . . . . . . . . . . . . . . .	L NEAR 	F2E8	CODE
N6 . . . . . . . . . . . . . . .	L NEAR 	F2FB	CODE
N7 . . . . . . . . . . . . . . .	L NEAR 	F2FE	CODE
N8 . . . . . . . . . . . . . . .	L NEAR 	F315	CODE
N9 . . . . . . . . . . . . . . .	L NEAR 	F322	CODE
NDMA_OPN . . . . . . . . . . . .	L NEAR 	C536	CODE
NEC_OP . . . . . . . . . . . . .	L NEAR 	EE64	CODE
NEC_OUTPUT . . . . . . . . . . .	N PROC	E6A5	CODE	Length =002C
NEC_STATUS . . . . . . . . . . .	L BYTE 	0042	DATA	Length =0007
NEPOCL . . . . . . . . . . . . .	L NEAR 	C8D4	CODE
NEXT_ROM . . . . . . . . . . . .	L NEAR 	E443	CODE
NMI_INT. . . . . . . . . . . . .	N PROC	E240	CODE	Length =0025
NMI_PTR. . . . . . . . . . . . .	L WORD 	0008	ABS0
NUM_KEY. . . . . . . . . . . . .	Number	0045	
NUM_SHIFT. . . . . . . . . . . .	Number	0020	
NUM_STATE. . . . . . . . . . . .	Number	0020	
NUM_TRANS. . . . . . . . . . . .	N PROC	EFB0	CODE	Length =0017
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-13
	 	 	 	 	 	 	 	09-15-88    


ORG_VECTOR . . . . . . . . . . .	L DWORD	004C	ABS0
OSH. . . . . . . . . . . . . . .	L NEAR 	E367	CODE
OSHP . . . . . . . . . . . . . .	L NEAR 	D010	CODE
OUT_CH . . . . . . . . . . . . .	L NEAR 	C14F	CODE
OUT_MEM. . . . . . . . . . . . .	L NEAR 	D26E	CODE
P1 . . . . . . . . . . . . . . .	L NEAR 	F3A2	CODE
P10. . . . . . . . . . . . . . .	L NEAR 	F41B	CODE
P10T . . . . . . . . . . . . . .	L NEAR 	C0C3	CODE
P11. . . . . . . . . . . . . . .	L NEAR 	F424	CODE
P12. . . . . . . . . . . . . . .	L NEAR 	F42B	CODE
P13. . . . . . . . . . . . . . .	L NEAR 	F431	CODE
P2 . . . . . . . . . . . . . . .	L NEAR 	F3B0	CODE
P2T. . . . . . . . . . . . . . .	L NEAR 	C0CE	CODE
P3 . . . . . . . . . . . . . . .	L NEAR 	F3B6	CODE
P3T. . . . . . . . . . . . . . .	L NEAR 	C116	CODE
P4 . . . . . . . . . . . . . . .	L NEAR 	F3CF	CODE
P4T. . . . . . . . . . . . . . .	L NEAR 	C0B7	CODE
P5 . . . . . . . . . . . . . . .	L NEAR 	F3D5	CODE
P5T. . . . . . . . . . . . . . .	L NEAR 	C12E	CODE
P6 . . . . . . . . . . . . . . .	L NEAR 	F3E8	CODE
P7 . . . . . . . . . . . . . . .	L NEAR 	F3F3	CODE
P7T. . . . . . . . . . . . . . .	L NEAR 	C093	CODE
P8 . . . . . . . . . . . . . . .	L NEAR 	F3FA	CODE
P8T. . . . . . . . . . . . . . .	L NEAR 	C0B1	CODE
P9 . . . . . . . . . . . . . . .	L NEAR 	F400	CODE
P9T. . . . . . . . . . . . . . .	L NEAR 	C09D	CODE
PARM_PTR . . . . . . . . . . . .	L DWORD	0074	ABS0
PICAT. . . . . . . . . . . . . .	L NEAR 	C8B0	CODE
PICZN. . . . . . . . . . . . . .	L NEAR 	C8A1	CODE
PMSG . . . . . . . . . . . . . .	N PROC	D399	CODE	Length =0014
POCKOL . . . . . . . . . . . . .	L NEAR 	C8C8	CODE
POD_DONE . . . . . . . . . . . .	L NEAR 	C15C	CODE
PORT_0 . . . . . . . . . . . . .	N PROC	C771	CODE	Length =000D
PORT_1 . . . . . . . . . . . . .	N PROC	C77E	CODE	Length =0005
PORT_2 . . . . . . . . . . . . .	N PROC	C783	CODE	Length =0005
PORT_3 . . . . . . . . . . . . .	N PROC	C788	CODE	Length =0005
PORT_A . . . . . . . . . . . . .	Number	0060	
PORT_B . . . . . . . . . . . . .	Number	0061	
PORT_C . . . . . . . . . . . . .	Number	0062	
PORT_OFF . . . . . . . . . . . .	L BYTE 	0077	DATA
POSITION . . . . . . . . . . . .	N PROC	F2A3	CODE	Length =0011
PR128. . . . . . . . . . . . . .	L NEAR 	F89B	CODE
PRI10. . . . . . . . . . . . . .	L NEAR 	FF7F	CODE
PRI15. . . . . . . . . . . . . .	L NEAR 	FF8D	CODE
PRI20. . . . . . . . . . . . . .	L NEAR 	FFAF	CODE
PRINTER_BASE . . . . . . . . . .	L WORD 	0008	DATA	Length =0004
PRINTER_IO . . . . . . . . . . .	F PROC	EFD2	CODE	Length =0073
PRINT_SCREEN . . . . . . . . . .	F PROC	FF54	CODE	Length =0077
PRT_DEC_LOOP . . . . . . . . . .	L NEAR 	D138	CODE
PRT_HEX. . . . . . . . . . . . .	N PROC	D1B4	CODE	Length =0007
PRT_SEG. . . . . . . . . . . . .	N PROC	C816	CODE	Length =0015
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-14
	 	 	 	 	 	 	 	09-15-88    


PRT_SIZ. . . . . . . . . . . . .	L NEAR 	D124	CODE
P_MSG. . . . . . . . . . . . . .	N PROC	E615	CODE	Length =001E
P_MSG1 . . . . . . . . . . . . .	N PROC	C846	CODE	Length =000E
R1 . . . . . . . . . . . . . . .	L NEAR 	F468	CODE
R10. . . . . . . . . . . . . . .	L NEAR 	F4FD	CODE
R11. . . . . . . . . . . . . . .	L NEAR 	F50B	CODE
R12. . . . . . . . . . . . . . .	L NEAR 	F52F	CODE
R13. . . . . . . . . . . . . . .	L NEAR 	F54B	CODE
R14. . . . . . . . . . . . . . .	L NEAR 	F55A	CODE
R15. . . . . . . . . . . . . . .	L NEAR 	F55C	CODE
R16. . . . . . . . . . . . . . .	L NEAR 	F56B	CODE
R17. . . . . . . . . . . . . . .	N PROC	F56F	CODE	Length =0019
R18. . . . . . . . . . . . . . .	N PROC	F588	CODE	Length =0011
R1_BUS . . . . . . . . . . . . .	Number	0004	
R1_BUSY. . . . . . . . . . . . .	Number	0008	
R1_IOMODE. . . . . . . . . . . .	Number	0002	
R1_REQ . . . . . . . . . . . . .	Number	0001	
R2 . . . . . . . . . . . . . . .	L NEAR 	F46F	CODE
R3 . . . . . . . . . . . . . . .	N PROC	F473	CODE	Length =0043
R3T. . . . . . . . . . . . . . .	L NEAR 	C183	CODE
R4 . . . . . . . . . . . . . . .	L NEAR 	F486	CODE
R5 . . . . . . . . . . . . . . .	L NEAR 	F49E	CODE
R6 . . . . . . . . . . . . . . .	L NEAR 	F4A8	CODE
R7 . . . . . . . . . . . . . . .	L NEAR 	F4D4	CODE
R8 . . . . . . . . . . . . . . .	L NEAR 	F4EC	CODE
R9 . . . . . . . . . . . . . . .	L NEAR 	F4FB	CODE
RAM_DIAG . . . . . . . . . . . .	N PROC	C523	CODE	Length =0007
RAM_DIAG_CMD . . . . . . . . . .	Number	00E0	
RAV. . . . . . . . . . . . . . .	L NEAR 	D44E	CODE
RDCIMB . . . . . . . . . . . . .	L NEAR 	C87F	CODE
RD_BUFF. . . . . . . . . . . . .	N PROC	C4F9	CODE	Length =000E
RD_BUFF_CMD. . . . . . . . . . .	Number	000E	
RD_ECC_CMD . . . . . . . . . . .	Number	000D	
RD_LONG. . . . . . . . . . . . .	N PROC	C4CF	CODE	Length =000E
RD_LONG_CMD. . . . . . . . . . .	Number	00E5	
READ_AC_CURRENT. . . . . . . . .	N PROC	F395	CODE	Length =002A
READ_CMD . . . . . . . . . . . .	Number	0008	
READ_CURSOR. . . . . . . . . . .	N PROC	F230	CODE	Length =0017
READ_DOT . . . . . . . . . . . .	N PROC	F43F	CODE	Length =0011
READ_LPEN. . . . . . . . . . . .	N PROC	F7B6	CODE	Length =0098
READ_LPEN1 . . . . . . . . . . .	L NEAR 	F93F	CODE
RECAL_CMD. . . . . . . . . . . .	Number	0001	
RECORD_NOT_FND . . . . . . . . .	Number	0004	
REGEN. . . . . . . . . . . . . .	L BYTE 	0000	VIDEO_RAM
REGENW . . . . . . . . . . . . .	L WORD 	0000	VIDEO_RAM
RESET. . . . . . . . . . . . . .	L NEAR 	E05B	CODE
RESET_FLAG . . . . . . . . . . .	L WORD 	0072	DATA
RESULTS. . . . . . . . . . . . .	N PROC	EF6B	CODE	Length =0045
RES_FL . . . . . . . . . . . . .	L WORD 	0472	ABS0
RETURN_STATUS. . . . . . . . . .	N PROC	C34D	CODE	Length =0009
RET_2. . . . . . . . . . . . . .	L NEAR 	C25D	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-15
	 	 	 	 	 	 	 	09-15-88    


RIGHT_KEY. . . . . . . . . . . .	Number	0055	
RIGHT_SHIFT. . . . . . . . . . .	Number	0001	
ROM_CHECK. . . . . . . . . . . .	N PROC	C7BB	CODE	Length =0038
ROM_CHECK_1. . . . . . . . . . .	L NEAR 	C7DF	CODE
ROM_CHECK_END. . . . . . . . . .	L NEAR 	C7F2	CODE
ROM_ERR. . . . . . . . . . . . .	N PROC	C7F3	CODE	Length =001E
ROM_ERR_BEEP . . . . . . . . . .	L NEAR 	C809	CODE
ROM_ERR_END. . . . . . . . . . .	L NEAR 	C806	CODE
ROM_SCAN . . . . . . . . . . . .	L NEAR 	E42D	CODE
ROM_SCAN_1 . . . . . . . . . . .	L NEAR 	E430	CODE
ROS. . . . . . . . . . . . . . .	L NEAR 	E0DB	CODE
ROS_CHECKSUM . . . . . . . . . .	N PROC	E180	CODE	Length =000E
ROS_CHECKSUM_CNT . . . . . . . .	N PROC	C854	CODE	Length =000A
RS232_BASE . . . . . . . . . . .	L WORD 	0000	DATA	Length =0004
RS232_IO . . . . . . . . . . . .	F PROC	C8F5	CODE	Length =01EE
RUST . . . . . . . . . . . . . .	L BYTE 	F8A7	CODE
RUST2. . . . . . . . . . . . . .	L BYTE 	E633	CODE
RUS_KEY. . . . . . . . . . . . .	Number	005B	
RW_OPN . . . . . . . . . . . . .	N PROC	ED4D	CODE	Length =0104
S1 . . . . . . . . . . . . . . .	L NEAR 	F5AC	CODE
S10. . . . . . . . . . . . . . .	L NEAR 	F614	CODE
S11. . . . . . . . . . . . . . .	L NEAR 	F630	CODE
S12. . . . . . . . . . . . . . .	L NEAR 	F660	CODE
S13. . . . . . . . . . . . . . .	L NEAR 	F678	CODE
S14. . . . . . . . . . . . . . .	L NEAR 	F67C	CODE
S15. . . . . . . . . . . . . . .	L NEAR 	F68E	CODE
S16. . . . . . . . . . . . . . .	L NEAR 	F69B	CODE
S17. . . . . . . . . . . . . . .	L NEAR 	F6A0	CODE
S18. . . . . . . . . . . . . . .	L NEAR 	F6C9	CODE
S19. . . . . . . . . . . . . . .	N PROC	F6CF	CODE	Length =0015
S2 . . . . . . . . . . . . . . .	L NEAR 	F5BB	CODE
S20. . . . . . . . . . . . . . .	L NEAR 	F6D8	CODE
S21. . . . . . . . . . . . . . .	N PROC	F6E4	CODE	Length =0023
S22. . . . . . . . . . . . . . .	L NEAR 	F6ED	CODE
S23. . . . . . . . . . . . . . .	N PROC	F707	CODE	Length =001D
S24. . . . . . . . . . . . . . .	L NEAR 	F711	CODE
S25. . . . . . . . . . . . . . .	L NEAR 	F717	CODE
S26. . . . . . . . . . . . . . .	N PROC	F724	CODE	Length =0016
S3 . . . . . . . . . . . . . . .	L NEAR 	F5CB	CODE
S4 . . . . . . . . . . . . . . .	L NEAR 	F5CF	CODE
S5 . . . . . . . . . . . . . . .	L NEAR 	F5D7	CODE
S6 . . . . . . . . . . . . . . .	L NEAR 	F5EB	CODE
S7 . . . . . . . . . . . . . . .	L NEAR 	F5F7	CODE
S8 . . . . . . . . . . . . . . .	L NEAR 	F5FE	CODE
S9 . . . . . . . . . . . . . . .	L NEAR 	F602	CODE
SCANIROV . . . . . . . . . . . .	L NEAR 	D319	CODE
SCROLL_DOWN. . . . . . . . . . .	N PROC	F359	CODE	Length =003C
SCROLL_KEY . . . . . . . . . . .	Number	0046	
SCROLL_POSITION. . . . . . . . .	N PROC	F302	CODE	Length =0047
SCROLL_SHIFT . . . . . . . . . .	Number	0010	
SCROLL_STATE . . . . . . . . . .	Number	0010	
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-16
	 	 	 	 	 	 	 	09-15-88    


SCROLL_UP. . . . . . . . . . . .	N PROC	F2B4	CODE	Length =004E
SEEK . . . . . . . . . . . . . .	N PROC	EE67	CODE	Length =0061
SEEK_CMD . . . . . . . . . . . .	Number	000B	
SEEK_STATUS. . . . . . . . . . .	L BYTE 	003E	DATA
SENSE_ABORT. . . . . . . . . . .	L NEAR 	C5DC	CODE
SENSE_CMD. . . . . . . . . . . .	Number	0003	
SENSE_FAIL . . . . . . . . . . .	Number	00FF	
SETUP_A. . . . . . . . . . . . .	N PROC	C2C6	CODE	Length =0024
SET_COLOR. . . . . . . . . . . .	N PROC	F26B	CODE	Length =0026
SET_CPOS . . . . . . . . . . . .	N PROC	F206	CODE	Length =0019
SET_CTYPE. . . . . . . . . . . .	N PROC	F1E5	CODE	Length =0021
SET_MODE . . . . . . . . . . . .	N PROC	F111	CODE	Length =00D4
SP_TEST. . . . . . . . . . . . .	L NEAR 	E5F8	CODE
STA. . . . . . . . . . . . . . .	Number	0030	
START. . . . . . . . . . . . . .	L NEAR 	E05B	CODE
STATUS_BYTE. . . . . . . . . . .	L BYTE 	0000	XXDATA
STAT_ERR . . . . . . . . . . . .	L NEAR 	C5EB	CODE
STAT_OFFSET. . . . . . . . . . .	L BYTE 	007C	DATA
STGTST . . . . . . . . . . . . .	L NEAR 	D45D	CODE
STGTST_CNT . . . . . . . . . . .	N PROC	D460	CODE	Length =0093
STG_LOC0 . . . . . . . . . . . .	L BYTE 	0000	ABS0
SW2_AND. . . . . . . . . . . . .	L NEAR 	C7A8	CODE
SW2_OFFS . . . . . . . . . . . .	N PROC	C78D	CODE	Length =0026
SW2_OFFS_ERR . . . . . . . . . .	L NEAR 	C7B1	CODE
S_MAX_FILE . . . . . . . . . . .	Number	0002	
T1 . . . . . . . . . . . . . . .	L NEAR 	FE7F	CODE
T2 . . . . . . . . . . . . . . .	L NEAR 	FE82	CODE
T3 . . . . . . . . . . . . . . .	L NEAR 	FE95	CODE
T4 . . . . . . . . . . . . . . .	L NEAR 	FEB8	CODE
T5 . . . . . . . . . . . . . . .	L NEAR 	FED8	CODE
T6 . . . . . . . . . . . . . . .	L NEAR 	FEE9	CODE
TABL . . . . . . . . . . . . . .	L WORD 	00E0	DATA
TABL1. . . . . . . . . . . . . .	L WORD 	04E0	ABS0
TIMER. . . . . . . . . . . . . .	Number	0040	
TIMERO . . . . . . . . . . . . .	Number	0040	
TIMER_HIGH . . . . . . . . . . .	L WORD 	006E	DATA
TIMER_INT. . . . . . . . . . . .	F PROC	FEA5	CODE	Length =004E
TIMER_LOW. . . . . . . . . . . .	L WORD 	006C	DATA
TIMER_OFL. . . . . . . . . . . .	L BYTE 	0070	DATA
TIME_OF_DAY. . . . . . . . . . .	F PROC	FE6E	CODE	Length =0037
TIME_OUT . . . . . . . . . . . .	Number	0080	
TIM_CTL. . . . . . . . . . . . .	Number	0043	
TMINT. . . . . . . . . . . . . .	Number	0001	
TOS. . . . . . . . . . . . . . .	L WORD 	0100	STAC
TRUS . . . . . . . . . . . . . .	L NEAR 	CB99	CODE
TST12. . . . . . . . . . . . . .	L NEAR 	E3D2	CODE
TST6 . . . . . . . . . . . . . .	L NEAR 	E1B2	CODE
TST8 . . . . . . . . . . . . . .	L NEAR 	E271	CODE
TST_RDY. . . . . . . . . . . . .	N PROC	C515	CODE	Length =0007
TST_RDY_CMD. . . . . . . . . . .	Number	0000	
TYPE0_LEN. . . . . . . . . . . .	Number	0009	
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-17
	 	 	 	 	 	 	 	09-15-88    


TYPE0_TABLE. . . . . . . . . . .	L BYTE 	C602	CODE
TYPE1_LEN. . . . . . . . . . . .	Number	000A	
TYPE1_TABLE. . . . . . . . . . .	L BYTE 	C60B	CODE
TYPE2_LEN. . . . . . . . . . . .	Number	0002	
TYPE2_TABLE. . . . . . . . . . .	L BYTE 	C615	CODE
TYPE3_LEN. . . . . . . . . . . .	Number	0003	
TYPE3_TABLE. . . . . . . . . . .	L BYTE 	C617	CODE
TYPE_0 . . . . . . . . . . . . .	L NEAR 	C61A	CODE
TYPE_1 . . . . . . . . . . . . .	L NEAR 	C627	CODE
TYPE_2 . . . . . . . . . . . . .	L NEAR 	C66A	CODE
TYPE_3 . . . . . . . . . . . . .	L NEAR 	C677	CODE
T_0. . . . . . . . . . . . . . .	L WORD 	C5E3	CODE
T_1. . . . . . . . . . . . . . .	L WORD 	C5E5	CODE
T_2. . . . . . . . . . . . . . .	L WORD 	C5E7	CODE
T_3. . . . . . . . . . . . . . .	L WORD 	C5E9	CODE
U1 . . . . . . . . . . . . . . .	L NEAR 	D3E2	CODE
U10. . . . . . . . . . . . . . .	L NEAR 	D422	CODE
U11. . . . . . . . . . . . . . .	L NEAR 	D429	CODE
U2 . . . . . . . . . . . . . . .	L NEAR 	D3F5	CODE
U3 . . . . . . . . . . . . . . .	L NEAR 	D3FB	CODE
U4 . . . . . . . . . . . . . . .	L NEAR 	D409	CODE
U5 . . . . . . . . . . . . . . .	L NEAR 	D40B	CODE
U6 . . . . . . . . . . . . . . .	L NEAR 	D40F	CODE
U7 . . . . . . . . . . . . . . .	L NEAR 	D411	CODE
U8 . . . . . . . . . . . . . . .	L NEAR 	D415	CODE
U9 . . . . . . . . . . . . . . .	L NEAR 	D41E	CODE
UNDEF_ERR. . . . . . . . . . . .	Number	00BB	
UNDEF_ERR_L. . . . . . . . . . .	L NEAR 	C684	CODE
USTKUR . . . . . . . . . . . . .	L NEAR 	C8D8	CODE
V00. . . . . . . . . . . . . . .	L NEAR 	C941	CODE
V0A. . . . . . . . . . . . . . .	L NEAR 	C95E	CODE
V0A1 . . . . . . . . . . . . . .	L NEAR 	C98A	CODE
V0A2 . . . . . . . . . . . . . .	L NEAR 	C994	CODE
V0A3 . . . . . . . . . . . . . .	L NEAR 	C9AE	CODE
V0B. . . . . . . . . . . . . . .	L NEAR 	C9E6	CODE
V0B1 . . . . . . . . . . . . . .	L NEAR 	C9F2	CODE
V0B2 . . . . . . . . . . . . . .	L NEAR 	CA09	CODE
V0C. . . . . . . . . . . . . . .	L NEAR 	CA1B	CODE
V0C1 . . . . . . . . . . . . . .	L NEAR 	CA26	CODE
V0C2 . . . . . . . . . . . . . .	L NEAR 	CA33	CODE
V0D. . . . . . . . . . . . . . .	L NEAR 	CA45	CODE
V0E. . . . . . . . . . . . . . .	N PROC	CA7E	CODE	Length =0040
V0END. . . . . . . . . . . . . .	L NEAR 	CA12	CODE
V0END1 . . . . . . . . . . . . .	L NEAR 	CA15	CODE
V0OK . . . . . . . . . . . . . .	L NEAR 	C92F	CODE
V0P1 . . . . . . . . . . . . . .	L NEAR 	C909	CODE
V0P2 . . . . . . . . . . . . . .	L NEAR 	C910	CODE
V0P3 . . . . . . . . . . . . . .	L NEAR 	C91E	CODE
V0TO . . . . . . . . . . . . . .	L NEAR 	CA0F	CODE
V0Z. . . . . . . . . . . . . . .	N PROC	CABE	CODE	Length =0001
V1 . . . . . . . . . . . . . . .	L BYTE 	F7AE	CODE
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-18
	 	 	 	 	 	 	 	09-15-88    


V2 . . . . . . . . . . . . . . .	L NEAR 	F7F5	CODE
V3 . . . . . . . . . . . . . . .	L NEAR 	F81C	CODE
V4 . . . . . . . . . . . . . . .	L NEAR 	F828	CODE
V5 . . . . . . . . . . . . . . .	L NEAR 	F83A	CODE
V6 . . . . . . . . . . . . . . .	L NEAR 	F83C	CODE
V7 . . . . . . . . . . . . . . .	L NEAR 	F846	CODE
VECTOR_TABLE . . . . . . . . . .	L WORD 	FEF3	CODE
VIDEO_INT. . . . . . . . . . . .	L WORD 	0040	ABS0
VIDEO_IO . . . . . . . . . . . .	N PROC	F06D	CODE	Length =004C
VIDEO_PARMS. . . . . . . . . . .	L BYTE 	F0B9	CODE
VIDEO_RA . . . . . . . . . . . .	Number	B800	
VIDEO_RETURN . . . . . . . . . .	L NEAR 	F1DC	CODE
VIDEO_STATE. . . . . . . . . . .	N PROC	F291	CODE	Length =0012
W1 . . . . . . . . . . . . . . .	L NEAR 	C737	CODE
W2 . . . . . . . . . . . . . . .	L NEAR 	C74B	CODE
W4 . . . . . . . . . . . . . . .	L NEAR 	C735	CODE
W5 . . . . . . . . . . . . . . .	L NEAR 	C72C	CODE
WAIT_BUSY. . . . . . . . . . . .	L NEAR 	C572	CODE
WAIT_INT . . . . . . . . . . . .	N PROC	EF2F	CODE	Length =0024
WAIT_INTT. . . . . . . . . . . .	N PROC	C708	CODE	Length =0058
WEPORT . . . . . . . . . . . . .	L NEAR 	CB30	CODE
WID. . . . . . . . . . . . . . .	L NEAR 	CB33	CODE
WRITE_AC_CURRENT . . . . . . . .	N PROC	F3DB	CODE	Length =0033
WRITE_CMD. . . . . . . . . . . .	Number	000A	
WRITE_C_CURRENT. . . . . . . . .	N PROC	F40E	CODE	Length =0031
WRITE_DOT. . . . . . . . . . . .	N PROC	F450	CODE	Length =0023
WRITE_PROTECT. . . . . . . . . .	Number	0003	
WRITE_TTY. . . . . . . . . . . .	N PROC	D3AD	CODE	Length =0083
WR_BUFF. . . . . . . . . . . . .	N PROC	C507	CODE	Length =000E
WR_BUFF_CMD. . . . . . . . . . .	Number	000F	
WR_LONG. . . . . . . . . . . . .	N PROC	C4DD	CODE	Length =000E
WR_LONG_CMD. . . . . . . . . . .	Number	00E6	
X1 . . . . . . . . . . . . . . .	L NEAR 	ED8B	CODE
X2 . . . . . . . . . . . . . . .	L NEAR 	ED87	CODE
XLAT_PR. . . . . . . . . . . . .	N PROC	C836	CODE	Length =000A
XLAT_PRINT_COD . . . . . . . . .	N PROC	E3A7	CODE	Length =000F
XPC_BYTE . . . . . . . . . . . .	N PROC	C82B	CODE	Length =0015
XXDAT. . . . . . . . . . . . . .	Number	0050	
Z0A. . . . . . . . . . . . . . .	L WORD 	CABF	CODE
Z0B. . . . . . . . . . . . . . .	L BYTE 	CADB	CODE
ZAGR8. . . . . . . . . . . . . .	L NEAR 	CB3B	CODE
ZAGRCW . . . . . . . . . . . . .	L NEAR 	CB63	CODE
ZAPBY. . . . . . . . . . . . . .	L NEAR 	CB16	CODE
ZAPTEL . . . . . . . . . . . . .	L NEAR 	C8B7	CODE
ZB . . . . . . . . . . . . . . .	L BYTE 	0000	ABS0
ZGR. . . . . . . . . . . . . . .	L NEAR 	CB07	CODE
ZN . . . . . . . . . . . . . . .	L NEAR 	CB89	CODE
ZNAK . . . . . . . . . . . . . .	L NEAR 	CAE3	CODE
ZW . . . . . . . . . . . . . . .	L WORD 	0000	ABS0
�� Microsoft MACRO Assembler  Version 3.00               	Page	Symbols-19
	 	 	 	 	 	 	 	09-15-88    



12474 Bytes free   

Warning Severe
Errors	Errors 
0	0
�