Advertisement
Ladies_Man

#NUP lab1(kb,ms,com init)...........^sem 3^

Jan 15th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586
  2. ;include my_macro.asm
  3. _TEXT   segment byte public 'CODE' use16
  4. assume cs:_TEXT, ds:nothing
  5. org     100h       
  6.        
  7. start:
  8.         cli    
  9.         lss     SP, dword ptr STKPTR
  10.         sti    
  11.  
  12.     call    init_BIOS
  13.     call    init_PIC
  14.     call    unreal_mode_on
  15.     call    init_IOAPIC
  16.     call    init_LAPIC
  17.  
  18. ;Изменить последнюю работу предыдущего семестра (N6) так, чтобы:
  19. ;a) Было обеспечено определение наличия и вывод сведений о PS/2 клавиатуре и PS/2 мыши, наличии и
  20. ;характеристиках COM-портов, наличии последовательной мыши, подключенной к одному из
  21. ;обнаруженных COM-портов.
  22. ;b) Для обнаружения последовательной мыши настроить порт в режиме 1200-N-7-1, затем в регистре MCR
  23. ;взвести биты 0 и 1 (т.н.DTR и RTS), если мышь подключена, то она ответит с задержкой не более 10 мс
  24. ;байтом 'M' (обычная 2-кнопочная мышь) или последовательностью 'MZ@' (мышь с колёсиком прокрутки).
  25. ;c) Опрос и определение характеристик аппаратуры выполнять асинхронно во время работы финального
  26. ;цикла bios'а.
  27. ;d) Отчёты об обнаруженном оборудовании должны накапливаться во временном буфере, откуда они
  28. ;должны извлекаться и выводиться в консоль эмулятора bochs (порт 0xE9) каждые 1 секунды.
  29.  
  30.     call    init_UART
  31.     call    FINAL_CYCLE
  32.     call    stop
  33.  
  34.  
  35. ;========================================================================
  36. ;-----------------------ADDRESSES-AND-VARIABLES-------------------------
  37. ;========================================================================
  38. ;--------------------------------UART-----------------------------------
  39. COM1        equ 3F8h
  40. COM2        equ 2F8h
  41. COM3        equ 3E8h
  42. COM4        equ 2E8h
  43.  
  44. PORT        equ 000h
  45. THR         equ 000h        ;write only
  46. RBR         equ 000h        ;read only
  47. IER         equ 001h
  48. DLL         equ 000h
  49. DLH         equ 001h
  50. IIR         equ 002h        ;read only
  51. FCR         equ 002h        ;write only
  52. LCR         equ 003h
  53. MCR         equ 004h
  54. LSR         equ 005h        ;read only
  55. MSR         equ 006h        ;read only
  56. SR          equ 007h        ;scratch
  57. ;-------------------------------BUFFER-----------------------------------
  58. SBUFADR     equ 400h        ;адрес текущего начала буфера
  59. EBUFADR     equ 402h        ;адрес текущего конца буфера
  60. SBUF        equ 406h        ;начало буфера
  61. EBUF        equ 43Ah        ;конец буфера
  62. ;-----------------------------CONTROLLERS--------------------------------
  63. TESTOK      equ 0AAh       
  64. ACK         equ 0FAh
  65. ;---------------------------IOAPICS-LAPICS-------------------------------
  66. TIMERC      equ 424h        ;адрес ячейки таймера
  67. IOAPICB     equ 0FEC00000h  ;адрес иоапика
  68. LAPICB      equ 0FEE00000h  ;адрес лапика
  69.  
  70.  
  71. ;========================================================================
  72. ;---------------------------------TABLES--------------------------------
  73. ;========================================================================
  74. ;--------------------------- KEYBOARD INITIALIZATION TABLE -------------
  75. KBD_INIT    db      0AAh,   064h,       1,              055h,              
  76.                     0ABh,   064h,       1,              000h,              
  77.                     0AEh,   064h,       0,                     
  78.                     0FFh,   060h,       2,          ACK, TESTOK            
  79.             db      0EEh                ;stop-symbol               
  80. ;------------------------------------------------------------------------
  81.  
  82. ;----------------------------- COM INTERVIEW TABLE ---------------------    
  83. COM_TABLE   dw  COM1,   COM2,   COM3,   COM4
  84. ;------------------------------------------------------------------------
  85.  
  86. ;----------------------------- UART INITIALIZATION TABLE ---------------
  87. COM_INIT    db      10000000b,      LCR,   
  88.                     60h,            DLL,   
  89.                     0,              DLH,   
  90.                     00000010b,      LCR,   
  91.                     0,              IER,
  92.                     00000110b,      FCR,       
  93.                     00001000b,      MCR                                
  94.             db      0FEh            ;stop-symbol
  95. ;1200 baud, 7 bit, 1 stop bit, no parity
  96. ;------------------------------------------------------------------------
  97.  
  98.  
  99. ;========================================================================
  100. ;------------------------------init_BIOS--------------------------------
  101. ;========================================================================
  102.  
  103. STKPTR      dw      0FFFEh, 09000h
  104. init_BIOS:  mov     dx, 0C000h 
  105. cycle:      mov     DS, dx
  106.             mov     ax, 80h        
  107.             cmp     word ptr DS:[0], 0AA55h
  108.             jnz     nxt
  109.             call scanbios
  110.  
  111.             movzx   ax, byte ptr DS:[2]
  112.             add     al, 3h     
  113.             and     al, 0FCh
  114.             shl     ax, 5  
  115.          
  116. nxt:        add     dx, ax         
  117.             cmp     dx, 0F000h         
  118.             jb      cycle      
  119.         ret
  120.  
  121. scanbios proc near
  122.         cld
  123.         xor     si, si
  124.         xor     cx, cx
  125.         mov     ch, DS:[2]     
  126.         xor     bl, bl
  127. chcksm: lodsw  
  128.         add     al, ah         
  129.         add     bl, al         
  130.         dec     cx
  131.         jnz     short chcksm
  132.         or      bl, bl 
  133.         jnz     short skip     
  134.         pusha
  135.         push    ds
  136.         push    es
  137.         push    fs
  138.         push    gs
  139.         push    CS
  140.         push    offset __ret
  141.         push    DS
  142.         push    3h
  143.         retf
  144. __ret:
  145.         pop     gs
  146.         pop     fs
  147.         pop     es
  148.         pop     ds
  149.         popa
  150. skip:   ret     0
  151. scanbios endp
  152.  
  153.  
  154.  
  155. ;========================================================================
  156. ;---------------------------------init_PIC------------------------------
  157. ;========================================================================
  158. init_PIC proc near
  159. ;начальный сброс обоих контроллеров
  160.  
  161.     mov al, 20h     ;1
  162.     out 20h, al
  163.     mov al, 20h     ;2
  164.     out 0A0h, al
  165.  
  166.     mov al, 11h     ;1
  167.     out 20h, al
  168.     mov al, 11h     ;2
  169.     out 0A0h, al
  170.  
  171.     mov al, 08h     ;1
  172.     out 21h, al
  173.     mov al, 70h     ;2
  174.     out 0A1h, al
  175.  
  176.     mov al, 04h     ;1
  177.     out 21h, al
  178.     mov al, 02h     ;2
  179.     out 0A1h, al
  180.    
  181.     mov al, 05h     ;1
  182.     out 21h, al
  183.     mov al, 01h     ;2
  184.     out 0A1h, al
  185.  
  186. ;разршение выбранных IRQ
  187. ;PIC0
  188.     mov al, 0FBh    ;1111 1011
  189.     out 21h, al
  190. ;PIC1
  191.     mov al, 0FFh   
  192.     out 0A1h, al
  193.     ret
  194. init_PIC endp
  195.  
  196.  
  197.  
  198. ;========================================================================
  199. ;---------------------------------unreal_mode_on------------------------
  200. ;========================================================================
  201. .586p
  202. unreal_mode_on proc near
  203.         push    ds
  204.         push    es
  205.         push    gs
  206.         push    fs
  207.         push    cx
  208.         push    ax
  209.         push    si
  210.         push    di
  211.  
  212.         mov ax, cs
  213.         mov ds, ax
  214.         mov si, offset _TEXT:unreal_mode_c
  215.  
  216.         mov ax, 9000h
  217.         mov es, ax
  218.         xor di, di
  219.  
  220.         cld
  221.         mov cx, 6
  222.         rep movsd
  223.         lgdt fword ptr _TEXT:unreal_mode_b
  224.  
  225.         mov eax, cr0
  226.         or  eax, 1
  227.         mov cr0, eax
  228.         db  0EAh
  229.         dw  $+4, 8h
  230.  
  231.         mov ax, 10h
  232.         mov ss, ax
  233.         mov ds, ax
  234.         mov es, ax
  235.         mov fs, ax
  236.         mov gs, ax
  237.  
  238.         mov eax, cr0
  239.         and eax, 0FFFFFFFEh
  240.         mov cr0, eax
  241.         db  0EAh
  242.         dw  $+4, 0F000h
  243.  
  244.         mov ax, 9000h
  245.         mov ss, ax
  246.  
  247.         in  al, 92h
  248.         test    al, 2
  249.         jne unreal_mode_d
  250.         or  al, 2
  251.         jmp short $+2
  252.         out 092h, al
  253. unreal_mode_d:
  254.         lgdt fword ptr _TEXT:unreal_mode_a
  255.  
  256.         pop di
  257.         pop si
  258.         pop ax
  259.         pop cx
  260.         pop fs
  261.         pop gs
  262.         pop es
  263.         pop ds
  264.         ret 0
  265. unreal_mode_on endp
  266.  
  267. unreal_mode_a:
  268.     dw  0
  269.     dd  0, 0
  270.  
  271. unreal_mode_b:
  272.     dw  23
  273.     dd  90000h, 0
  274.  
  275. unreal_mode_c:
  276.     dd  0, 0, 0FFFFh, 8F9A0Fh, 0FFFFh, 8F9200h
  277.  
  278.  
  279. ;========================================================================
  280. ;---------------------------------COUTS---------------------------------
  281. ;========================================================================
  282. space proc near
  283.         mov al, 20h
  284.         call pushbuf
  285.         ret
  286. space endp
  287.  
  288. cout_kb proc near
  289.         mov al, 6Bh             ;"kb:"
  290.         call pushbuf
  291.         mov al, 62h
  292.         call pushbuf
  293.         mov al, 3Ah
  294.         call pushbuf
  295.         ret
  296. cout_kb endp
  297.  
  298. cout_mf proc near
  299.         mov al, 'M'             ;"MF"
  300.         call pushbuf
  301.         mov al, 'F'
  302.         call pushbuf
  303.         ret
  304. cout_mf endp
  305.  
  306. cout_at proc near
  307.         mov al, 'A'             ;"AT"
  308.         call pushbuf
  309.         mov al, 'T'
  310.         call pushbuf
  311.         ret
  312. cout_at endp
  313.  
  314. cout_xt proc near
  315.         mov al, 'X'             ;"XT"
  316.         call pushbuf
  317.         mov al, 'T'
  318.         call pushbuf
  319.         ret
  320. cout_xt endp
  321.  
  322. cout_minus proc near            ;"-"
  323.         mov al, '-'
  324.         call pushbuf
  325.         ret
  326. cout_minus endp
  327.  
  328. cout_id proc near
  329.         mov al, 69h             ;"id:"
  330.         call pushbuf
  331.         mov al, 64h
  332.         call pushbuf
  333.         mov al, 3Ah
  334.         call pushbuf
  335.         ret
  336. cout_id endp
  337.  
  338. cout_ms proc near               ;"  ms:"   
  339.         call space
  340.         call space
  341.         mov al, 'm'
  342.         call pushbuf
  343.         mov al, 73h
  344.         call pushbuf
  345.         mov al, 3Ah
  346.         call pushbuf
  347.         ret
  348. cout_ms endp
  349.  
  350. cout_ps2 proc near
  351.         mov al, 'p'
  352.         call pushbuf
  353.         mov al, 's'
  354.         call pushbuf
  355.         mov al, '/'
  356.         call pushbuf
  357.         mov al, '2'
  358.         call pushbuf
  359.         ret
  360. cout_ps2 endp
  361.  
  362. cout_im1 proc near
  363.         mov al, 'i'
  364.         call pushbuf
  365.         mov al, 'm'
  366.         call pushbuf
  367.         mov al, '1'
  368.         call pushbuf
  369.         ret
  370. cout_im1 endp
  371.  
  372. cout_im2 proc near
  373.         mov al, 'i'
  374.         call pushbuf
  375.         mov al, 'm'
  376.         call pushbuf
  377.         mov al, '2'
  378.         call pushbuf
  379.         ret
  380. cout_im2 endp
  381.  
  382. cout_uart proc near             ;"  uart:"
  383.         call space
  384.         call space
  385.         mov al, 'u'                
  386.         call pushbuf
  387.         mov al, 'a'                
  388.         call pushbuf
  389.         mov al, 'r'                
  390.         call pushbuf
  391.         mov al, 't'                
  392.         call pushbuf
  393.         mov al, 3Ah
  394.         call pushbuf
  395.         ret
  396. cout_uart endp
  397.  
  398. cout_16 proc near               ;"16"
  399.         mov al, '1'
  400.         call pushbuf
  401.         mov al, '6'
  402.         call pushbuf
  403.         ret
  404. cout_16 endp
  405.  
  406. cout_bps proc near
  407.         mov al, 'b'
  408.         call pushbuf
  409.         mov al, '/'
  410.         call pushbuf
  411.         mov al, 's'
  412.         call pushbuf
  413.         ret
  414. cout_bps endp
  415.  
  416. cout_00 proc near
  417.         mov al, '0'
  418.         call pushbuf
  419.         mov al, '0'
  420.         call pushbuf
  421.         ret
  422. cout_00 endp
  423.  
  424. cout_type16750 proc near        ;"16750 "
  425.         call cout_16
  426.         mov al, '7'
  427.         call pushbuf
  428.         mov al, '5'
  429.         call pushbuf
  430.         mov al, '0'
  431.         call pushbuf
  432.         call space
  433.         ret
  434. cout_type16750 endp
  435.  
  436. cout_type16550A proc near       ;"16550A "
  437.         call cout_16
  438.         mov al, '5'
  439.         call pushbuf
  440.         mov al, '5'
  441.         call pushbuf
  442.         mov al, '0'
  443.         call pushbuf
  444.         mov al, 'A'
  445.         call pushbuf
  446.         call space
  447.         ret
  448. cout_type16550A endp
  449.  
  450. cout_type16550 proc near        ;"16550 "
  451.         call cout_16
  452.         mov al, '5'
  453.         call pushbuf
  454.         mov al, '5'
  455.         call pushbuf
  456.         mov al, '0'
  457.         call pushbuf
  458.         call space
  459.         ret
  460. cout_type16550 endp
  461.  
  462. cout_type16450 proc near        ;"16450 "
  463.         call cout_16
  464.         mov al, '4'
  465.         call pushbuf
  466.         mov al, '5'
  467.         call pushbuf
  468.         mov al, '0'
  469.         call pushbuf
  470.         call space
  471.         ret
  472. cout_type16450 endp
  473.  
  474. cout_type8250 proc near         ;"8250 "
  475.         mov al, '8'
  476.         call pushbuf
  477.         mov al, '2'
  478.         call pushbuf
  479.         mov al, '5'
  480.         call pushbuf
  481.         mov al, '0'
  482.         call pushbuf
  483.         call space
  484.         ret
  485. cout_type8250 endp
  486.  
  487. cout_2400bps proc near          ;"2400b/s "
  488.         mov al, '2'
  489.         call pushbuf
  490.         mov al, '4'
  491.         call pushbuf
  492.         call cout_00
  493.         call cout_bps
  494.         call space
  495.         ret
  496. cout_2400bps endp
  497.  
  498. cout_9600bps proc near          ;"9600b/s "
  499.         mov al, '9'
  500.         call pushbuf
  501.         mov al, '6'
  502.         call pushbuf
  503.         call cout_00
  504.         call cout_bps
  505.         call space
  506.         ret
  507. cout_9600bps endp
  508.  
  509. cout_19200bps proc near         ;"19200b/s "
  510.         mov al, '1'
  511.         call pushbuf
  512.         mov al, '9'
  513.         call pushbuf
  514.         mov al, '2'
  515.         call pushbuf
  516.         call cout_00
  517.         call cout_bps
  518.         call space
  519.         ret
  520. cout_19200bps endp
  521.  
  522. cout_115200bps proc near            ;"115200b/s "
  523.         mov al, '1'
  524.         call pushbuf
  525.         mov al, '1'
  526.         call pushbuf
  527.         mov al, '5'
  528.         call pushbuf
  529.         mov al, '2'
  530.         call pushbuf
  531.         call cout_00
  532.         call cout_bps
  533.         call space
  534.         ret
  535. cout_115200bps endp
  536. ;========================================================================
  537. ;---------------------------------init_IOAPIC---------------------------
  538. ;========================================================================
  539. ;1.IOAPIC обычно отображается на адрес IOAPICBASE 0xFEC00000 (адрес может быть несколько изменен средствами северного моста)
  540. ;2.IOZPIC представлен двумя регистрами: "селектор" (selector) по адресу IOAPICBASE и "окно" (window) по адресу IOAPICBASE+0x10
  541. ;3.При работе с IOAPIC в селектор записывается номер регистра IOAPIC, а из окна производится чтение или запись регистра
  542. ;4.Термин "Reserved", определяющий те или иные биты регистров IOAPIC обозначает не "MBZ", а то, что содержимое этих разрядов нельзя изменять,
  543. ;при необходимости изменить регистр надо сначала прочитать прежнее значение, потом только нужные биты обнулить или установить, а затем записать обратно.
  544. .586p
  545. init_IOAPIC proc near
  546.     push    DS
  547.     push    cx
  548.     xor ax, ax
  549.     mov DS, ax
  550.  
  551. ;0 линия, 10 рег
  552.     mov     dword ptr DS:[0FEC00000h], 10h          ;номер регистра отвечающего за 0-ю линию -> в адрес селектора (0-я линия - 10,11 рег, 23-я линия - 3E,3F рег)
  553.     mov     eax, dword ptr DS:[0FEC00010h]          ;работа с регистром в окне
  554.     and     eax, 0FFFE60FFh                         ;Физическая адресация LAPIC, обнуляем Trigger Mode(15), Pin Polarity(13), возбуждение прерывания передним фронтом (состояние 1) (т.к. настройка irq0)
  555.     or      eax, 0700h                              ;Delivery Mod = 111 = ExtInt - Causes the processor to respond the intr as if the intr originated in an externally connected intr controller                               
  556.     mov     dword ptr DS:[0FEC00010h], eax 
  557. ;0 линия, 11 рег
  558.     mov     dword ptr DS:[0FEC00000h], 011h
  559.     mov     eax, dword ptr DS:[0FEC00010h] 
  560.     and     eax, 0FFFFFFh                           ;Обнулить целевой ID лапика приёмника (0-й lapic единственного процессора, который эмулирует бочс)
  561.     mov     dword ptr DS:[0FEC00010h], eax 
  562.  
  563.     mov     ecx, 012h                              
  564. loop_masking:
  565.     mov     DS:[0FEC00000h], ecx                    ;номер очередного регистра в селектор
  566.     mov     eax, dword ptr DS:[0FEC00010h] 
  567.     or      eax, 010000h                            ;16-й бит MASK
  568.     mov     dword ptr DS:[0FEC00010h], eax 
  569.     add     ecx, 2                                 
  570.     cmp     ecx, 040h                              
  571.     jnz     loop_masking
  572.  
  573.     pop     cx                             
  574.     pop     DS                 
  575.     ret
  576. init_IOAPIC endp
  577.  
  578. ;========================================================================
  579. ;---------------------------------init_LAPIC----------------------------
  580. ;========================================================================
  581. init_LAPIC proc near
  582.         push DS
  583.         push cx
  584.         mov ecx, 01Bh
  585.         rdmsr
  586.         or  eax, 0800h
  587.         wrmsr
  588.         xor ax, ax
  589.         mov DS, ax
  590.  
  591.         mov DS:[040h], offset spur_intr             ;обработка фиктивных прерываний
  592.         mov DS:[042h], cs
  593.         mov dword ptr DS:[0FEE000F0h], 0110h            ;apicen = ApicEnabled и бит разрешения -> в дескриптор spurious вектора
  594.         or dword ptr DS:[0FEE00350h], 010000h       ;максирование LINT0
  595.         or dword ptr DS:[0FEE00360h], 010000h       ;маскирование LINT1
  596.         mov DS:[080h], offset interrupt            
  597.         mov DS:[082h], cs
  598.         mov eax, dword ptr DS:[0FEE00320h]          ;LVT[0] - Timer
  599.         and eax, 06F00h
  600.         or  eax, 020020h                           
  601.         mov dword ptr DS:[0FEE00320h], eax
  602.         or dword ptr DS:[0FEE003E0h], 0Bh           ;Timer Divide Config: 1011, d0=1, d1=1, d3=1 => делитель частоты = 1
  603.         ;mov dword ptr DS:[0FEE00380h], 123B64Fh        ;Timer Initial Count: 1,3 GHz / 68Hz
  604.         mov dword ptr DS:[0FEE00380h], 30000000     ;new frequency for interview result showing
  605.         mov dword ptr DS:[012300h], 0
  606.  
  607.         pop cx
  608.         pop DS
  609.         ret
  610. init_LAPIC endp
  611.  
  612. spur_intr:  
  613. iret  ;Ends without EndOfInterrupt!
  614.  
  615. interrupt:     
  616.         push DS
  617.         push ax
  618.         xor ax, ax
  619.         mov DS, ax
  620.         mov dword ptr DS:[0FEE000B0h], 0
  621.         inc dword ptr DS:[012300h]
  622.         pop ax
  623.         pop DS
  624. iret
  625.  
  626.  
  627. ;========================================================================
  628. ;---------------------------------init_INTERVIEW------------------------
  629. ;========================================================================
  630. move_out macro  port, value
  631.             mov al, value
  632.             out port, al
  633. endm           
  634. ;------------------------------------------------------------------------
  635. mov_segm macro  sreg, value, treg:vararg
  636.             _treg equ ax
  637.             for t, <treg>
  638.                 t
  639.             endm
  640.             mov _treg, value
  641.             mov sreg, _treg
  642. endm
  643. ;------------------------------------------------------------------------
  644. rebuf proc near
  645.         cmp di, EBUF
  646.         jnz exit
  647.         mov di, SBUF
  648. exit:   ret
  649. rebuf endp
  650. ;------------------------------------------------------------------------
  651. pushbuf proc near
  652.         push di
  653.         push es
  654.         mov_segm es, 0, <_treg equ bx>      ;вполнить смов используя не ax (который по умолчанию, но сейчас занят) , а bx
  655.         mov di, word ptr es:[EBUFADR]
  656.         stosb
  657.         call rebuf
  658.         cmp di, word ptr es:[SBUFADR]
  659.         jz exit1
  660.         mov word ptr es:[EBUFADR], di
  661.     exit1:
  662.         pop es
  663.         pop di
  664.         ret
  665. pushbuf endp
  666.  
  667. ;------------------------------------------------------------------------
  668. req_resp macro port, rq, rp:vararg
  669.         mov dx, port
  670.         mov bl, rq
  671.         call request
  672.         for rsp, <rp>
  673.             mov bl, rsp
  674.             call respond
  675.             cmp al, bl
  676.             ;jnz stop
  677.         endm
  678. endm
  679. ;-----------------------------------------------------------------------
  680. request proc near
  681.         mov cx, 0FFF0h
  682. w0:
  683.         in al, 064h
  684.         test 2, al
  685.         jz w1
  686.         loop w0
  687.         ;call stop
  688. w1:
  689.         move_out dx, bl
  690.         ret
  691. request endp
  692. ;------------------------------------------------------------------------
  693. respond proc near
  694.         mov cx, 0FFFFh
  695.         ;mov ecx, 0FFFFFFh
  696. w2:
  697.         in al, 064h
  698.         test 1, al
  699.         jnz w3
  700.         dec ecx
  701.         jnz w2
  702.         ;call stop
  703. w3:
  704.         in al, 060h
  705.         ret
  706. respond endp
  707. ;------------------------------------------------------------------------
  708. send_com macro  port, value
  709.             push dx
  710.             mov     dx, port
  711.             mov     al, value
  712.             out     dx, al
  713.             pop dx
  714. endm
  715. ;------------------------------------------------------------------------
  716.  
  717. init_INTERVIEW proc near
  718.         push    DS
  719.         push    ax
  720.         push    dx     
  721.         push    cx     
  722.         push    bx     
  723.         push    si     
  724.  
  725. ;-----------------K E Y B O A R D - I N T E R V I E W-------------------
  726. ;keyboard_interview:
  727.  
  728.         call cout_kb
  729.        
  730.         req_resp 64h, 0AAh, 55h             ;сброс и автотест 8042
  731.         req_resp 64h, 0ABh, 0               ;тест синхронизации с 8031
  732.         req_resp 64h, 0AEh                  ;разрешить клавиатуру
  733.         req_resp 60h, 0FFh, ACK, TESTOK     ;сброс и тест 8031
  734.  
  735. ;http://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html#keyboardid
  736. ;An XT keyboard does not reply
  737. ;an AT keyboard only replies with an "ACK".
  738. ;An MF2 AT keyboard reports ID "ab 83". Translation turns this into "ab 41".
  739.  
  740.         req_resp 60h, 0F2h, 0FAh            ;запрос 2х байтного ID
  741.         call respond                        ;got 1st byte, lets check it
  742.  
  743.         cmp eax, 000200abh                  ;ab (MF)
  744.         je  its_mf
  745.                 cmp eax, 000200fah              ;fa==ACK (AT)
  746.                 je  its_at
  747.                                                 ;otherwise its XT (if it doesnt reply)
  748.                             call cout_xt
  749.                             call respond        ;just in case lets get 2nd byte of id (but we dont really need it)
  750.                             jmp mouse_i
  751.  
  752.                 its_at:
  753.                     call cout_at   
  754.                     call respond        ;just in case lets get 2nd byte of id (but we dont really need it)
  755.                     jmp mouse_i
  756.  
  757.         its_mf:
  758.             call cout_mf
  759.             call respond        ;lets get 2nd byte and check it
  760.  
  761.     ;НАСЧЕТ КОМА-НУЖНО ЗАПРЕТИТЬ ФИФО И НЕПОСРЕДСТВЕННО СТРАЗУ ПОСЛЕ НАСТРОЙКИ КОМА ПРОВЕРИТЬ
  762.     ;НЕ ПРИШЕЛ ЛИ В THR БАЙТ M ИЛИ MZ@ В ТЕЧЕНИЕ БУКВАЛЬНО НЕСК МИЛИСЕКУНД БАНАЛЬНЫМ CMP В НЕБОЛЬШОМ ЦИКЛЕ С ПРОВЕРКОЙ НА M/MZ@
  763.     ;ИНТЕРВЬЮ ПРОВОДИТЬ ОДИН РАЗ А ДАЛЬШЕ ТОЛЬКО ВЫВОДЫ
  764.  
  765. ;------------------M O U S E - I N T E R V I E W-------------------
  766. mouse_i:
  767.         mov al, ';'
  768.         call pushbuf
  769.  
  770.         call cout_ms
  771.        
  772.         req_resp 64h, 0A8h                      ;разрешить мышь
  773.         req_resp 64h, 60h                       ;запись управл. регистра
  774.         req_resp 60h, 0                         ;запрещаем IRQ1, IRQ12  разрешение интерфейсов клав. и мыши
  775.         req_resp 64h, 0D4h                      ;передать след. байт мыши
  776.         req_resp 60h, 0FFh, ACK, TESTOK, 0     
  777.         req_resp 64h, 0D4h                      ;передать след. байт мыши
  778.  
  779. ;http://www.win.tue.nl/~aeb/linux/kbd/scancodes-13.html
  780. ;Read mouse ID command is answered by 00.
  781. ;In Intellimouse mode, the Read mouse ID command returns 03.
  782. ;In Intellimouse Explorer mode, the Read mouse ID command returns 04.
  783.  
  784.         req_resp 60h, 0F2h, 0FAh                ;получить ID (ответы FA (ack) и 00 (id))
  785.         call respond
  786.        
  787.         cmp al, 0               ;ps/2 id at initialization = 0
  788.         je  its_ps2
  789.                 cmp al, 3               ;imps id = 3
  790.                 je  its_imps1
  791.                         cmp al, 4               ;imps2 id = 4
  792.                         je  its_imps2
  793.                         jmp uart_i
  794.                        
  795.                         its_imps2:
  796.                             call cout_im2
  797.                             jmp uart_i
  798.  
  799.                 its_imps1:
  800.                     call cout_im1
  801.                     jmp uart_i
  802.  
  803.         its_ps2:
  804.             call cout_ps2
  805.  
  806. ;--------------------U A R T - I N T E R V I E W-------------------
  807. uart_i:
  808.         mov al, ';'
  809.         call pushbuf
  810.         call cout_uart
  811.  
  812. ;Test UART chip type:
  813.  
  814.         send_com <COM4+FCR>, 0E7h
  815.         mov     dx, COM4+IIR
  816.         in      al, dx
  817.         test    al, 64d                     ;check 6th bit
  818.         jz oldtype
  819.                 test    al, 128d                ;check 7th bit
  820.                 jz t16550
  821.                         test    al, 32d             ;check 5th bit
  822.                         jz t16550A
  823.                                 call cout_type16750
  824.                                 jmp @f
  825.  
  826.                         t16550A:
  827.                             call cout_type16550A
  828.                             jmp @f
  829.                 t16550:
  830.                     call cout_type16550
  831.                     jmp @f
  832.  
  833.     oldtype:                                ;Else we know the chip doesnt use FIFO, so we need to check the scratch register
  834.         send_com <COM4+SR>, 05Ah            ;Arbitary value (can be any but not 0xFF or 0x00)
  835.         mov     dx, COM4+SR
  836.         in      al, dx
  837.         cmp     al, 05Ah                    ;If the arbitrary value comes back identical, UART is 16450
  838.         je t16450
  839.                 call cout_type8250
  840.                 jmp @f
  841.         t16450:
  842.             call cout_type16450
  843.  
  844. ;Test UART speed:
  845. @@:    
  846.         send_com <COM4+LCR>, 128d           ;set DLAB
  847.         send_com <COM4+DLL>, 12d            ;check 9600 bps
  848.         send_com <COM4+DLH>, 0
  849.         mov     dx, COM4+DLL
  850.         in      al, dx
  851.         cmp     al, 12d
  852.         jne s2400
  853.  
  854.                 send_com <COM4+DLL>, 6d         ;check 19200 bps
  855.                 send_com <COM4+DLH>, 0
  856.                 in      al, dx
  857.                 cmp     al, 6d
  858.                 jne s9600
  859.  
  860.                         send_com <COM4+DLL>, 1      ;check 115200 bps (top speed)
  861.                         send_com <COM4+DLH>, 0
  862.                         in      al, dx
  863.                         cmp     al, 1
  864.                         jne s19200
  865.  
  866.                                 call cout_115200bps
  867.                                 jmp @f
  868.  
  869.                         s19200:
  870.                             call cout_19200bps
  871.                             jmp @f
  872.                 s9600:
  873.                     call cout_9600bps
  874.                     jmp @f
  875.         s2400:
  876.             call cout_2400bps
  877.  
  878. @@:     send_com <COM4+LCR>, 0
  879.  
  880. ;----------------------------------------------
  881.         mov si, 10d
  882. @@:     call space              ;fill free space in buffer with spaces
  883.         dec si
  884.         jnz @b
  885.  
  886.         pop si
  887.         pop bx
  888.         pop cx
  889.         pop dx
  890.         pop ax
  891.         pop DS
  892.         ret
  893. init_INTERVIEW endp
  894.  
  895.  
  896.  
  897. ;========================================================================
  898. ;---------------------------------init_UART-----------------------------
  899. ;========================================================================
  900. ;При настройке UART необходимо задать: размер слова (5..8 бит);
  901. ;                                      число т.н. «стоп-битов» (1 или 1.5(2) бита),
  902. ;                                      способ задания бита чётности,
  903. ;                                      скорость передачи данных (от 50 до 115200 бод).
  904. ComRead proc near
  905.         xor ax, ax
  906.         xor bx, bx
  907.        
  908.         mov dx, COM1 + LSR
  909.         mov ecx, 0FFFFFFh
  910. w4:
  911.         in  al, dx
  912.         and al, 8Fh    
  913.         jnz w5
  914.         dec ecx
  915.         jnz w4
  916. w5:
  917.         and al, 08Eh
  918.         jnz stop
  919.         mov dx, COM1 + RBR
  920.         in al, dx
  921.  
  922.         move_out 0E9h, al
  923.         cmp al, 'M'
  924.         jne skppp
  925.  
  926.         mov al, '!'
  927.         move_out 0E9h, al
  928. skppp:
  929.         ret
  930. ComRead endp
  931. ;------------------------------------------------------------------------
  932. ComWrite    proc near
  933.  
  934.         mov dx, COM1 + LSR
  935.         mov cx, 0FFFFh
  936. xxx:    in      al, dx
  937.         and     al, 0AEh
  938.         jnz     xxy
  939.         loop xxx
  940. xxy:
  941.         and     al, 08Eh
  942.         jnz     stop
  943.  
  944.         mov dx, COM1 + THR
  945.         mov al, 'M'
  946.         out dx, al
  947.  
  948.         ret
  949. ComWrite endp
  950. ;------------------------------------------------------------------------
  951. sendcomport proc near
  952.         push        dx
  953.         add         bx, cx      ;its implied we have COM address in 'cx' and it's REGISTER in bx(bl)
  954.         mov         dx, bx
  955.         out         dx, al      ;in 'al' we have value
  956.         pop         dx
  957.         ret
  958. sendcomport endp
  959.  
  960. ;Биты 2 и 1 регистра FCR используются при первоначальной настройке порта,
  961. ;чтобы очистить содержимое FIFO, если туда что-то уже успело попасть;
  962. ;это вполне может случиться, так как включение устройства на другой стороне линии
  963. ;могло выполниться гораздо раньше и оно уже могло пытаться передать какие-либо данные..
  964.  
  965. init_UART proc near
  966.         push    si
  967.         push    ax
  968.         push    bx
  969.         push    cx
  970.         push    DS
  971.  
  972.         xor     si, si
  973.  
  974. ;http://www.sci.muni.cz/docs/pc/serport.txt
  975. allcoms:
  976.         mov     cl, byte ptr [COM_TABLE+si]
  977.         inc     si
  978.         mov     ch, byte ptr [COM_TABLE+si]
  979.         inc     si
  980.         push    si
  981.  
  982.         xor     si, si
  983.  
  984.         comloop:
  985.                     mov     al, [COM_INIT+si]
  986.                     inc     si
  987.                     cmp     al, 0FEh
  988.                     jz      endcom
  989.  
  990.                     mov     bl, [COM_INIT+si]          
  991.                     inc     si
  992.                     call    sendcomport
  993.                     jmp     comloop
  994.         endcom:
  995.  
  996.         pop     si
  997.         cmp     si, 8
  998.         jnz allcoms
  999.    
  1000.         send_com <COM1+MCR>, 3          ;set 0,1 bits of MCR (DTR, RTS)
  1001.         send_com <COM2+MCR>, 3          ;set 0,1 bits of MCR (DTR, RTS)
  1002.         send_com <COM3+MCR>, 3          ;set 0,1 bits of MCR (DTR, RTS)
  1003.         send_com <COM4+MCR>, 3          ;set 0,1 bits of MCR (DTR, RTS)
  1004.  
  1005.         call ComRead
  1006.  
  1007.         pop     DS
  1008.         pop     cx
  1009.         pop     bx
  1010.         pop     ax
  1011.         pop     si
  1012.         ret
  1013. init_UART endp
  1014.  
  1015.  
  1016. ;========================================================================
  1017. ;---------------------------------FINAL_CYCLE---------------------------
  1018. ;========================================================================
  1019. FINAL_CYCLE proc near
  1020.         push ax
  1021.         push edi
  1022.         push es
  1023.  
  1024.         xor         ax, ax
  1025.         mov         ds, ax
  1026.         mov         word ptr DS:[SBUFADR], SBUF     ;start buffer
  1027.         mov         word ptr DS:[EBUFADR], SBUF
  1028.        
  1029. inf_cycle:
  1030.         mov         dword ptr ds:[12300h], 0
  1031.         call        init_INTERVIEW
  1032. aw0:
  1033.        
  1034.         cmp         dword ptr ds:[12300h], 0        ;connect interviews with timer's freq
  1035.         jz      aw0
  1036.  
  1037.         mov         di, ds:[SBUFADR]   
  1038. aw1:
  1039.         cmp         di, word ptr ds:[EBUFADR]       ;check if need to restart buffer
  1040.         jnz     aw2
  1041.  
  1042.         move_out    0E9h, 10                        ;\n
  1043.         move_out    0E9h, 13
  1044.         jz      inf_cycle
  1045. aw2:
  1046.         mov         al, ds:[di]
  1047.         inc         di
  1048.         call        rebuf
  1049.         mov         word ptr ds:[SBUFADR], di
  1050.         move_out    0E9h, al
  1051.         jmp     aw1                                 ;come back with renewed buffer
  1052.  
  1053.         ret
  1054. FINAL_CYCLE endp
  1055.  
  1056.  
  1057.  
  1058. ;========================================================================
  1059. ;---------------------------------stop----------------------------------
  1060. ;========================================================================
  1061.  
  1062. stop    proc    near
  1063.     ; cli
  1064.     hlt
  1065.     jmp short stop
  1066. stop    endp
  1067. ;------------------------------------------------------------------------
  1068. org 0FFF0h
  1069.     db  0EAh        ; JMP FAR
  1070.     dw  offset start    ; offset
  1071.     dw  0F000h      ; segment
  1072.  
  1073. org 0FFFEh
  1074.     dw  99FCh       ; PC
  1075.  
  1076. _TEXT   ends
  1077. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement