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