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