14,191 → 14,9 |
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT |
PID_KERNEL equ 1 ;os_idle thread |
|
align 4 |
proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword |
|
pushfd |
cli |
|
push ebx |
|
mov ebx, [irq] ;irq num |
test ebx, ebx |
jz .err |
cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's |
ja .err |
mov eax, [handler] |
test eax, eax |
jz .err |
|
mov [irq_tab+ebx*4], eax |
stdcall enable_irq, [irq] |
pop ebx |
mov eax, 1 |
popfd |
ret |
.err: |
pop ebx |
xor eax, eax |
popfd |
ret |
endp |
|
align 4 |
proc get_int_handler stdcall, irq:dword |
|
mov eax, [irq] |
cmp eax, 15 |
ja .fail |
mov eax, [irq_tab + 4 * eax] |
ret |
.fail: |
xor eax, eax |
ret |
endp |
|
align 4 |
proc detach_int_handler |
|
ret |
endp |
|
align 4 |
proc enable_irq stdcall, irq_line:dword |
mov ebx, [irq_line] |
mov edx, 0x21 |
cmp ebx, 8 |
jb @F |
mov edx, 0xA1 |
sub ebx,8 |
@@: |
in al,dx |
btr eax, ebx |
out dx, al |
ret |
endp |
|
align 16 |
;; proc irq_serv |
|
irq_serv: |
|
.irq_1: |
push 1 |
jmp .main |
align 4 |
.irq_2: |
push 2 |
jmp .main |
align 4 |
.irq_3: |
push 3 |
jmp .main |
align 4 |
.irq_4: |
push 4 |
jmp .main |
align 4 |
.irq_5: |
push 5 |
jmp .main |
align 4 |
.irq_6: |
push 6 |
jmp .main |
align 4 |
.irq_7: |
push 7 |
jmp .main |
align 4 |
.irq_8: |
push 8 |
jmp .main |
align 4 |
.irq_9: |
push 9 |
jmp .main |
align 4 |
.irq_10: |
push 10 |
jmp .main |
align 4 |
.irq_11: |
push 11 |
jmp .main |
align 4 |
.irq_12: |
push 12 |
jmp .main |
; align 4 |
; .irq_13: |
; push 13 |
; jmp .main |
align 4 |
.irq_14: |
push 14 |
jmp .main |
align 4 |
.irq_15: |
push 15 |
jmp .main |
|
align 16 |
.main: |
save_ring3_context |
mov eax, [esp + 32] |
mov bx, app_data ;os_data |
mov ds, bx |
mov es, bx |
|
cmp [v86_irqhooks+eax*8], 0 |
jnz v86_irq |
|
cmp al, 6 |
jnz @f |
push eax |
call [fdc_irq_func] |
mov [check_idle_semaphore],5 |
pop eax |
@@: |
|
cmp al, 14 |
jnz @f |
push eax |
call [irq14_func] |
mov [check_idle_semaphore],5 |
pop eax |
@@: |
cmp al, 15 |
jnz @f |
push eax |
call [irq15_func] |
mov [check_idle_semaphore],5 |
pop eax |
@@: |
|
mov ebx, [irq_tab+eax*4] |
test ebx, ebx |
jz .exit |
|
call ebx |
mov [check_idle_semaphore],5 |
|
.exit: |
|
cmp dword [esp + 32], 8 |
mov al, 0x20 |
jb @f |
out 0xa0, al |
@@: |
out 0x20, al |
|
restore_ring3_context |
add esp, 4 |
|
iret |
|
align 4 |
proc get_notify stdcall, p_ev:dword |
|
.wait: |
803,6 → 621,7 |
ret |
endp |
|
align 4 |
proc rebase_coff stdcall uses ebx esi, coff:dword, sym:dword, \ |
delta:dword |
locals |
1626,70 → 1445,3 |
|
call free ;release object memory |
ret |
|
|
|
if 0 |
|
irq: |
|
.irq0: |
pusfd |
pushad |
push IRQ_0 |
jmp .master |
.irq_1: |
pusfd |
pushad |
push IRQ_1 |
jmp .master |
|
.master: |
mov ax, app_data |
mov ds, eax |
mov es, eax |
mov ebx, [esp+4] ;IRQ_xx |
mov eax, [irq_handlers+ebx+4] |
call intr_handler |
mov ecx, [esp+4] |
cmp [irq_actids+ecx*4], 0 |
je @F |
in al, 0x21 |
bts eax, ecx |
out 0x21, al |
mov al, 0x20 |
out 0x20, al |
jmp .restart |
|
.slave: |
mov ax, app_data |
mov ds, eax |
mov es, eax |
mov ebx, [esp+4] ;IRQ_xx |
mov eax, [irq_handlers+ebx+4] |
call intr_handler |
mov ecx, [esp+4] |
sub ecx, 8 |
cmp [irq_actids+ecx*4], 0 |
je @F |
in al, 0xA1 |
bts eax, ecx |
out 0xA1, al |
mov al, 0x20 |
out 0xA0, al |
out 0x20, al |
.restart: |
mov ebx, [next_slot] |
test ebx, ebx |
jz @F |
mov [next_task],0 |
mov esi, [prev_slot] |
call do_change_task |
add esp, 4 |
iretd |
|
end if |
|
|
|
|