APIC patch from Ghost. Not tested.
git-svn-id: svn://kolibrios.org@1638 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
647985aea3
commit
1e30c8e1c2
@ -203,9 +203,6 @@ WIN_STACK equ (OS_BASE+0x000C000)
|
|||||||
WIN_POS equ (OS_BASE+0x000C400)
|
WIN_POS equ (OS_BASE+0x000C400)
|
||||||
FDD_BUFF equ (OS_BASE+0x000D000)
|
FDD_BUFF equ (OS_BASE+0x000D000)
|
||||||
|
|
||||||
;unused ? only one reference
|
|
||||||
ENABLE_TASKSWITCH equ (OS_BASE+0x000E000)
|
|
||||||
|
|
||||||
PUTPIXEL equ (OS_BASE+0x000E020)
|
PUTPIXEL equ (OS_BASE+0x000E020)
|
||||||
GETPIXEL equ (OS_BASE+0x000E024)
|
GETPIXEL equ (OS_BASE+0x000E024)
|
||||||
|
|
||||||
|
487
kernel/branches/Kolibri-acpi/core/apic.inc
Normal file
487
kernel/branches/Kolibri-acpi/core/apic.inc
Normal file
@ -0,0 +1,487 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2007-2008. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
IRQ_RESERVE = 24 ; 16 or 24
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
IRQ_COUNT dd 16
|
||||||
|
endg
|
||||||
|
|
||||||
|
uglobal
|
||||||
|
APIC: dd 0
|
||||||
|
LAPIC_BASE: dd 0
|
||||||
|
IOAPIC_base: dd 0
|
||||||
|
endg
|
||||||
|
|
||||||
|
APIC_ID equ 0x20
|
||||||
|
APIC_TPR equ 0x80
|
||||||
|
APIC_EOI equ 0xb0
|
||||||
|
APIC_LDR equ 0xd0
|
||||||
|
APIC_DFR equ 0xe0
|
||||||
|
APIC_SVR equ 0xf0
|
||||||
|
APIC_ISR equ 0x100
|
||||||
|
APIC_ESR equ 0x280
|
||||||
|
APIC_ICRL equ 0x300
|
||||||
|
APIC_ICRH equ 0x310
|
||||||
|
APIC_LVT_LINT0 equ 0x350
|
||||||
|
APIC_LVT_LINT1 equ 0x360
|
||||||
|
APIC_LVT_err equ 0x370
|
||||||
|
|
||||||
|
; APIC timer
|
||||||
|
APIC_LVT_timer equ 0x320
|
||||||
|
APIC_timer_div equ 0x3e0
|
||||||
|
APIC_timer_init equ 0x380
|
||||||
|
APIC_timer_cur equ 0x390
|
||||||
|
; IOAPIC
|
||||||
|
IOAPIC_ID equ 0x0
|
||||||
|
IOAPIC_VER equ 0x1
|
||||||
|
IOAPIC_ARB equ 0x2
|
||||||
|
IOAPIC_REDTBL equ 0x10
|
||||||
|
|
||||||
|
APIC_init:
|
||||||
|
mov dword[APIC], 0
|
||||||
|
; jmp .no_apic ; NO APIC
|
||||||
|
bt [cpu_caps], CAPS_APIC
|
||||||
|
jnc .no_apic
|
||||||
|
; Check for MP table
|
||||||
|
;.....
|
||||||
|
|
||||||
|
call IRQ_mask_all
|
||||||
|
|
||||||
|
; IOAPIC init
|
||||||
|
; 0xfec00000 - may be relocated, see chip reference... & MP table
|
||||||
|
stdcall map_io_mem, 0xfec00000, 0x20, PG_SW
|
||||||
|
mov [IOAPIC_base], eax
|
||||||
|
|
||||||
|
mov eax, IOAPIC_VER
|
||||||
|
call IOAPIC_read
|
||||||
|
shr eax, 16
|
||||||
|
inc al
|
||||||
|
movzx eax, al
|
||||||
|
cmp al, IRQ_RESERVE
|
||||||
|
jbe @f
|
||||||
|
mov al, IRQ_RESERVE
|
||||||
|
@@: mov [IRQ_COUNT], eax
|
||||||
|
|
||||||
|
; Reroute IOAPIC & mask all interrupts
|
||||||
|
xor ecx, ecx
|
||||||
|
mov eax, IOAPIC_REDTBL
|
||||||
|
@@: mov ebx, eax
|
||||||
|
call IOAPIC_read
|
||||||
|
mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical
|
||||||
|
mov al, cl
|
||||||
|
add al, 0x20 ; vector
|
||||||
|
or eax, 0x10000 ; Mask Interrupt
|
||||||
|
cmp ecx, 16
|
||||||
|
jb .set
|
||||||
|
or eax, 0xa000 ;<<< level-triggered active-low for IRQ16+
|
||||||
|
.set:
|
||||||
|
xchg eax, ebx
|
||||||
|
call IOAPIC_write
|
||||||
|
inc eax
|
||||||
|
mov ebx, eax
|
||||||
|
call IOAPIC_read
|
||||||
|
or eax, 0xff000000 ; Destination Field
|
||||||
|
xchg eax, ebx
|
||||||
|
call IOAPIC_write
|
||||||
|
inc eax
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, [IRQ_COUNT]
|
||||||
|
jb @b
|
||||||
|
|
||||||
|
call LAPIC_init
|
||||||
|
|
||||||
|
mov dword[APIC], 0xffffffff
|
||||||
|
; mov dword[irq_type_to_set], IRQ_TYPE_APIC
|
||||||
|
.no_apic:
|
||||||
|
ret
|
||||||
|
|
||||||
|
;===========================================================
|
||||||
|
align 4
|
||||||
|
LAPIC_init:
|
||||||
|
; Check MSR support
|
||||||
|
;....
|
||||||
|
; Get LAPIC base address
|
||||||
|
mov ecx, 0x1b
|
||||||
|
rdmsr ; it may be replaced to
|
||||||
|
and ax, 0xf000 ; mov eax, 0xfee00000
|
||||||
|
|
||||||
|
stdcall map_io_mem, eax, 0x1000, PG_SW
|
||||||
|
mov [LAPIC_BASE], eax
|
||||||
|
mov esi, eax
|
||||||
|
|
||||||
|
; Program Destination Format Register for Flat mode.
|
||||||
|
mov eax, [esi + APIC_DFR]
|
||||||
|
or eax, 0xf0000000
|
||||||
|
mov [esi + APIC_DFR], eax
|
||||||
|
|
||||||
|
|
||||||
|
; Program Logical Destination Register.
|
||||||
|
mov eax, [esi + APIC_LDR]
|
||||||
|
;and eax, 0xff000000
|
||||||
|
and eax, 0x00ffffff
|
||||||
|
or eax, 0x01000000 ;!!!!!!!!!!!!
|
||||||
|
mov [esi + APIC_LDR], eax
|
||||||
|
|
||||||
|
; Task Priority Register initialization.
|
||||||
|
mov eax, [esi + APIC_TPR]
|
||||||
|
and eax, 0xffffff00
|
||||||
|
mov [esi + APIC_TPR], eax
|
||||||
|
|
||||||
|
; Flush the queue
|
||||||
|
mov edx, 0
|
||||||
|
.nxt2: mov ecx, 32
|
||||||
|
mov eax, [esi + APIC_ISR + edx]
|
||||||
|
.nxt: shr eax, 1
|
||||||
|
jnc @f
|
||||||
|
mov dword [esi + APIC_EOI], 0 ; EOI
|
||||||
|
@@: loop .nxt
|
||||||
|
add edx, 0x10
|
||||||
|
cmp edx, 0x170
|
||||||
|
jbe .nxt2
|
||||||
|
|
||||||
|
; Spurious-Interrupt Vector Register initialization.
|
||||||
|
mov eax, [esi + APIC_SVR]
|
||||||
|
or eax, 0x1ff
|
||||||
|
and eax, 0xfffffdff
|
||||||
|
mov [esi + APIC_SVR], eax
|
||||||
|
|
||||||
|
; Initialize LVT LINT0 register. (INTR)
|
||||||
|
mov eax, 0x00700
|
||||||
|
; mov eax, 0x10700
|
||||||
|
mov [esi + APIC_LVT_LINT0], eax
|
||||||
|
|
||||||
|
; Initialize LVT LINT1 register. (NMI)
|
||||||
|
mov eax, 0x00400
|
||||||
|
mov [esi + APIC_LVT_LINT1], eax
|
||||||
|
|
||||||
|
; Initialize LVT Error register.
|
||||||
|
mov eax, [esi + APIC_LVT_err]
|
||||||
|
or eax, 0x10000 ; bit 16
|
||||||
|
mov [esi + APIC_LVT_err], eax
|
||||||
|
|
||||||
|
; LAPIC timer
|
||||||
|
; pre init
|
||||||
|
mov dword[esi + APIC_timer_div], 1011b ; 1
|
||||||
|
mov dword[esi + APIC_timer_init], 0xffffffff ; max val
|
||||||
|
push esi
|
||||||
|
mov esi, 640 ; wait 0.64 sec
|
||||||
|
call delay_ms
|
||||||
|
pop esi
|
||||||
|
mov eax, [esi + APIC_timer_cur] ; read current tick couner
|
||||||
|
xor eax, 0xffffffff ; eax = 0xffffffff - eax
|
||||||
|
shr eax, 6 ; eax /= 64; APIC ticks per 0.01 sec
|
||||||
|
|
||||||
|
; Start (every 0.01 sec)
|
||||||
|
mov dword[esi + APIC_LVT_timer], 0x30020 ; periodic int 0x20
|
||||||
|
mov dword[esi + APIC_timer_init], eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
;===========================================================
|
||||||
|
; IOAPIC implementation
|
||||||
|
align 4
|
||||||
|
IOAPIC_read:
|
||||||
|
; in : EAX - IOAPIC register
|
||||||
|
; out: EAX - readed value
|
||||||
|
push esi
|
||||||
|
mov esi, [IOAPIC_base]
|
||||||
|
mov [esi], eax
|
||||||
|
mov eax, [esi + 0x10]
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
align 4
|
||||||
|
IOAPIC_write:
|
||||||
|
; in : EAX - IOAPIC register
|
||||||
|
; EBX - value
|
||||||
|
; out: none
|
||||||
|
push esi
|
||||||
|
mov esi, [IOAPIC_base]
|
||||||
|
mov [esi], eax
|
||||||
|
mov [esi + 0x10], ebx
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
;===========================================================
|
||||||
|
; Remap all IRQ to 0x20+ Vectors
|
||||||
|
; IRQ0 to vector 0x20, IRQ1 to vector 0x21....
|
||||||
|
PIC_init:
|
||||||
|
cli
|
||||||
|
mov al,0x11 ; icw4, edge triggered
|
||||||
|
out 0x20,al
|
||||||
|
call pic_delay
|
||||||
|
out 0xA0,al
|
||||||
|
call pic_delay
|
||||||
|
|
||||||
|
mov al,0x20 ; generate 0x20 +
|
||||||
|
out 0x21,al
|
||||||
|
call pic_delay
|
||||||
|
mov al,0x28 ; generate 0x28 +
|
||||||
|
out 0xA1,al
|
||||||
|
call pic_delay
|
||||||
|
|
||||||
|
mov al,0x04 ; slave at irq2
|
||||||
|
out 0x21,al
|
||||||
|
call pic_delay
|
||||||
|
mov al,0x02 ; at irq9
|
||||||
|
out 0xA1,al
|
||||||
|
call pic_delay
|
||||||
|
|
||||||
|
mov al,0x01 ; 8086 mode
|
||||||
|
out 0x21,al
|
||||||
|
call pic_delay
|
||||||
|
out 0xA1,al
|
||||||
|
call pic_delay
|
||||||
|
|
||||||
|
call IRQ_mask_all
|
||||||
|
cli
|
||||||
|
; mov dword[irq_type_to_set], IRQ_TYPE_PIC
|
||||||
|
ret
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
pic_delay:
|
||||||
|
jmp pdl1
|
||||||
|
pdl1: ret
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
; TIMER SET TO 1/100 S
|
||||||
|
PIT_init:
|
||||||
|
mov al,0x34 ; set to 100Hz
|
||||||
|
out 0x43,al
|
||||||
|
mov al,0x9b ; lsb 1193180 / 1193
|
||||||
|
out 0x40,al
|
||||||
|
mov al,0x2e ; msb
|
||||||
|
out 0x40,al
|
||||||
|
ret
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
unmask_timer:
|
||||||
|
test dword[APIC], 0xffffffff
|
||||||
|
jnz @f
|
||||||
|
stdcall enable_irq, 0
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
; use PIT
|
||||||
|
; in some systems PIT no connected to IOAPIC
|
||||||
|
; mov eax, 0x14
|
||||||
|
; call IOAPIC_read
|
||||||
|
; mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical
|
||||||
|
; mov al, 0x20
|
||||||
|
; or eax, 0x10000 ; Mask Interrupt
|
||||||
|
; mov ebx, eax
|
||||||
|
; mov eax, 0x14
|
||||||
|
; call IOAPIC_write
|
||||||
|
; stdcall enable_irq, 2
|
||||||
|
; ret
|
||||||
|
|
||||||
|
; use LAPIC timer
|
||||||
|
mov esi, [LAPIC_BASE]
|
||||||
|
mov eax, [esi + APIC_LVT_timer]
|
||||||
|
and eax, 0xfffeffff
|
||||||
|
mov [esi + APIC_LVT_timer], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
; Disable all IRQ
|
||||||
|
IRQ_mask_all:
|
||||||
|
test dword[APIC], 0xffffffff
|
||||||
|
jnz .APIC
|
||||||
|
mov al, 0xFF
|
||||||
|
out 0x21, al
|
||||||
|
out 0xA1, al
|
||||||
|
mov ecx,0x1000
|
||||||
|
cld
|
||||||
|
@@: call pic_delay
|
||||||
|
loop @b
|
||||||
|
ret
|
||||||
|
.APIC:
|
||||||
|
mov ecx, [IRQ_COUNT]
|
||||||
|
mov eax, 0x10
|
||||||
|
@@: mov ebx, eax
|
||||||
|
call IOAPIC_read
|
||||||
|
or eax, 0x10000 ; bit 16
|
||||||
|
xchg eax, ebx
|
||||||
|
call IOAPIC_write
|
||||||
|
inc eax
|
||||||
|
inc eax
|
||||||
|
loop @b
|
||||||
|
ret
|
||||||
|
; -----------------------------------------
|
||||||
|
; End Of Interrupt
|
||||||
|
; al - IRQ number
|
||||||
|
align 16
|
||||||
|
IRQ_EOI:
|
||||||
|
test dword[APIC], 0xffffffff
|
||||||
|
jnz .APIC
|
||||||
|
cmp al, 8
|
||||||
|
mov al, 0x20
|
||||||
|
jb @f
|
||||||
|
out 0xa0, al
|
||||||
|
@@: out 0x20, al
|
||||||
|
ret
|
||||||
|
.APIC:
|
||||||
|
mov eax, [LAPIC_BASE]
|
||||||
|
mov dword [eax + APIC_EOI], 0 ; EOI
|
||||||
|
ret
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
; from dll.inc
|
||||||
|
align 4
|
||||||
|
proc enable_irq stdcall, irq_line:dword
|
||||||
|
mov ebx, [irq_line]
|
||||||
|
test dword[APIC], 0xffffffff
|
||||||
|
jnz .APIC
|
||||||
|
mov edx, 0x21
|
||||||
|
cmp ebx, 8
|
||||||
|
jb @F
|
||||||
|
mov edx, 0xA1
|
||||||
|
sub ebx,8
|
||||||
|
@@:
|
||||||
|
in al,dx
|
||||||
|
btr eax, ebx
|
||||||
|
out dx, al
|
||||||
|
ret
|
||||||
|
.APIC:
|
||||||
|
shl ebx, 1
|
||||||
|
add ebx, 0x10
|
||||||
|
mov eax, ebx
|
||||||
|
call IOAPIC_read
|
||||||
|
and eax, 0xfffeffff ; bit 16
|
||||||
|
xchg eax, ebx
|
||||||
|
call IOAPIC_write
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; IRQ_TYPE_DISABLE equ 0
|
||||||
|
; IRQ_TYPE_PIC equ 1
|
||||||
|
; IRQ_TYPE_APIC equ 2
|
||||||
|
|
||||||
|
; uglobal
|
||||||
|
; irq_type_to_set rd 1
|
||||||
|
; irq_types rd IRQ_RESERVE
|
||||||
|
; endg
|
||||||
|
|
||||||
|
; -----------------------------------------
|
||||||
|
; End Of Interrupt
|
||||||
|
; al - IRQ number
|
||||||
|
; align 16
|
||||||
|
; IRQ_EOI:
|
||||||
|
; movzx eax, al
|
||||||
|
; cmp dword[irq_types + eax * 4], IRQ_TYPE_APIC
|
||||||
|
; jne @f
|
||||||
|
; mov eax, [LAPIC_BASE]
|
||||||
|
; mov dword [eax + APIC_EOI], 0 ; EOI
|
||||||
|
; ret
|
||||||
|
; @@:
|
||||||
|
; cmp al, 8
|
||||||
|
; mov al, 0x20
|
||||||
|
; jb @f
|
||||||
|
; out 0xa0, al
|
||||||
|
; @@: out 0x20, al
|
||||||
|
; ret
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc enable_irq stdcall, irq_line:dword
|
||||||
|
; cmp dword[irq_type_to_set], IRQ_TYPE_APIC
|
||||||
|
; jne @f
|
||||||
|
; stdcall APIC_enable_irq, [irq_line]
|
||||||
|
; ret
|
||||||
|
; @@: stdcall PIC_enable_irq, [irq_line]
|
||||||
|
; ret
|
||||||
|
; endp
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc disable_irq stdcall, irq_line:dword
|
||||||
|
; push eax
|
||||||
|
; mov eax, [irq_line]
|
||||||
|
; cmp dword[irq_types + eax * 4], IRQ_TYPE_APIC
|
||||||
|
; jne @f
|
||||||
|
; stdcall APIC_disable_irq, eax
|
||||||
|
; pop eax
|
||||||
|
; ret
|
||||||
|
; @@: stdcall PIC_disable_irq, eax
|
||||||
|
; pop eax
|
||||||
|
; ret
|
||||||
|
; endp
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc PIC_enable_irq stdcall, irq_line:dword
|
||||||
|
; pusha
|
||||||
|
; mov ebx, [irq_line]
|
||||||
|
; mov eax, [irq_types + ebx * 4]
|
||||||
|
; cmp eax, IRQ_TYPE_DISABLE
|
||||||
|
; je @f
|
||||||
|
; cmp eax, IRQ_TYPE_PIC
|
||||||
|
; je @f
|
||||||
|
; stdcall disable_irq, ebx
|
||||||
|
; @@: mov dword[irq_types + ebx * 4], IRQ_TYPE_PIC
|
||||||
|
; mov edx, 0x21
|
||||||
|
; cmp ebx, 8
|
||||||
|
; jb @F
|
||||||
|
; mov edx, 0xA1
|
||||||
|
; sub ebx,8
|
||||||
|
; @@: in al,dx
|
||||||
|
; btr eax, ebx
|
||||||
|
; out dx, al
|
||||||
|
; popa
|
||||||
|
; ret
|
||||||
|
; endp
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc PIC_disable_irq stdcall, irq_line:dword
|
||||||
|
; pusha
|
||||||
|
; mov ebx, [irq_line]
|
||||||
|
; mov dword[irq_types + ebx * 4], IRQ_TYPE_DISABLE
|
||||||
|
; mov edx, 0x21
|
||||||
|
; cmp ebx, 8
|
||||||
|
; jb @F
|
||||||
|
; mov edx, 0xA1
|
||||||
|
; sub ebx,8
|
||||||
|
; @@: in al,dx
|
||||||
|
; bts eax, ebx
|
||||||
|
; out dx, al
|
||||||
|
; popa
|
||||||
|
; ret
|
||||||
|
; endp
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc APIC_enable_irq stdcall, irq_line:dword
|
||||||
|
; pusha
|
||||||
|
; mov ebx, [irq_line]
|
||||||
|
; mov eax, [irq_types + ebx * 4]
|
||||||
|
; cmp eax, IRQ_TYPE_DISABLE
|
||||||
|
; je @f
|
||||||
|
; cmp eax, IRQ_TYPE_APIC
|
||||||
|
; je @f
|
||||||
|
; stdcall disable_irq, ebx
|
||||||
|
; @@: mov dword[irq_types + ebx * 4], IRQ_TYPE_APIC
|
||||||
|
; shl ebx, 1
|
||||||
|
; add ebx, 0x10
|
||||||
|
; mov eax, ebx
|
||||||
|
; call IOAPIC_read
|
||||||
|
; and eax, 0xfffeffff ; bit 16
|
||||||
|
; xchg eax, ebx
|
||||||
|
; call IOAPIC_write
|
||||||
|
; popa
|
||||||
|
; ret
|
||||||
|
; endp
|
||||||
|
|
||||||
|
; align 4
|
||||||
|
; proc APIC_disable_irq stdcall, irq_line:dword
|
||||||
|
; pusha
|
||||||
|
; mov ebx, [irq_line]
|
||||||
|
; mov dword[irq_types + ebx * 4], IRQ_TYPE_DISABLE
|
||||||
|
; shl ebx, 1
|
||||||
|
; add ebx, 0x10
|
||||||
|
; mov eax, ebx
|
||||||
|
; call IOAPIC_read
|
||||||
|
; or eax, 0x10000
|
||||||
|
; xchg eax, ebx
|
||||||
|
; call IOAPIC_write
|
||||||
|
; popa
|
||||||
|
; ret
|
||||||
|
; endp
|
@ -22,8 +22,9 @@ proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword
|
|||||||
mov ebx, [irq] ;irq num
|
mov ebx, [irq] ;irq num
|
||||||
test ebx, ebx
|
test ebx, ebx
|
||||||
jz .err
|
jz .err
|
||||||
cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's
|
cmp ebx, [IRQ_COUNT] ; hidnplayr says: we only have 16 IRQ's
|
||||||
ja .err
|
; Ghost says: we can have more...
|
||||||
|
jae .err
|
||||||
mov eax, [handler]
|
mov eax, [handler]
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .err
|
jz .err
|
||||||
@ -54,7 +55,7 @@ endp
|
|||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
|
|
||||||
irq_rights rd 16
|
irq_rights rd IRQ_RESERVE
|
||||||
|
|
||||||
endg
|
endg
|
||||||
|
|
||||||
@ -80,85 +81,31 @@ proc detach_int_handler
|
|||||||
ret
|
ret
|
||||||
endp
|
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
|
align 16
|
||||||
;; proc irq_serv
|
;; proc irq_serv
|
||||||
|
|
||||||
irq_serv:
|
irq_serv:
|
||||||
|
|
||||||
.irq_1:
|
; .irq_1:
|
||||||
push 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
|
; jmp .main
|
||||||
|
; etc...
|
||||||
|
|
||||||
|
macro irq_serv_h [num] {
|
||||||
|
forward
|
||||||
align 4
|
align 4
|
||||||
.irq_7:
|
.irq_#num :
|
||||||
push 7
|
push num
|
||||||
jmp .main
|
jmp .main
|
||||||
align 4
|
}
|
||||||
.irq_8:
|
|
||||||
push 8
|
irq_serv_h 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12
|
||||||
jmp .main
|
|
||||||
align 4
|
; I don`t known how to use IRQ_RESERVE
|
||||||
.irq_9:
|
if IRQ_RESERVE > 16
|
||||||
push 9
|
irq_serv_h 16, 17, 18, 19, 20, 21, 22, 23
|
||||||
jmp .main
|
end if
|
||||||
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
|
align 16
|
||||||
.main:
|
.main:
|
||||||
@ -178,15 +125,8 @@ align 16
|
|||||||
call ebx
|
call ebx
|
||||||
mov [check_idle_semaphore],5
|
mov [check_idle_semaphore],5
|
||||||
|
|
||||||
.exit:
|
.exit: mov eax, [esp + 32]
|
||||||
|
call IRQ_EOI
|
||||||
cmp dword [esp + 32], 8
|
|
||||||
mov al, 0x20
|
|
||||||
jb @f
|
|
||||||
out 0xa0, al
|
|
||||||
@@:
|
|
||||||
out 0x20, al
|
|
||||||
|
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
add esp, 4
|
add esp, 4
|
||||||
|
|
||||||
@ -1620,70 +1560,3 @@ destroy_kernel_object:
|
|||||||
|
|
||||||
call free ;release object memory
|
call free ;release object memory
|
||||||
ret
|
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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@ irq0:
|
|||||||
add [next_usage_update],100
|
add [next_usage_update],100
|
||||||
call updatecputimes
|
call updatecputimes
|
||||||
.nocounter:
|
.nocounter:
|
||||||
mov al,0x20 ; send End Of Interrupt signal
|
mov al, 0 ; send End Of Interrupt signal
|
||||||
out 0x20,al
|
call IRQ_EOI
|
||||||
btr dword[DONT_SWITCH], 0
|
btr dword[DONT_SWITCH], 0
|
||||||
jc .return
|
jc .return
|
||||||
call find_next_task
|
call find_next_task
|
||||||
|
@ -39,6 +39,7 @@ iglobal
|
|||||||
times 12 dd unknown_interrupt ;int_20..int_31
|
times 12 dd unknown_interrupt ;int_20..int_31
|
||||||
|
|
||||||
;interrupt handlers addresses (for interrupt gate construction)
|
;interrupt handlers addresses (for interrupt gate construction)
|
||||||
|
; 0x20 .. 0x2F - IRQ handlers
|
||||||
dd irq0, irq_serv.irq_1, irq_serv.irq_2
|
dd irq0, irq_serv.irq_1, irq_serv.irq_2
|
||||||
if USE_COM_IRQ
|
if USE_COM_IRQ
|
||||||
dd irq_serv.irq_3, irq_serv.irq_4
|
dd irq_serv.irq_3, irq_serv.irq_4
|
||||||
@ -47,9 +48,22 @@ iglobal
|
|||||||
end if
|
end if
|
||||||
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7
|
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7
|
||||||
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
|
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
|
||||||
dd irq_serv.irq_11, irq_serv.irq_12, irqD,p_irq14,p_irq15
|
dd irq_serv.irq_11, irq_serv.irq_12
|
||||||
times 16 dd unknown_interrupt ;int_0x30..int_0x3F
|
dd irq13
|
||||||
|
dd p_irq14,p_irq15
|
||||||
|
; I don`t known how to use IRQ_RESERVE
|
||||||
|
if IRQ_RESERVE > 16
|
||||||
|
dd irq_serv.irq_16
|
||||||
|
dd irq_serv.irq_17
|
||||||
|
dd irq_serv.irq_18
|
||||||
|
dd irq_serv.irq_19
|
||||||
|
dd irq_serv.irq_20
|
||||||
|
dd irq_serv.irq_21
|
||||||
|
dd irq_serv.irq_22
|
||||||
|
dd irq_serv.irq_23
|
||||||
|
end if
|
||||||
|
|
||||||
|
times 32 - IRQ_RESERVE dd unknown_interrupt
|
||||||
;int_0x40 gate trap (for directly copied)
|
;int_0x40 gate trap (for directly copied)
|
||||||
dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
|
dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
|
||||||
|
|
||||||
@ -122,8 +136,9 @@ exc_c: ;
|
|||||||
reg_esi equ esp+0x04
|
reg_esi equ esp+0x04
|
||||||
reg_edi equ esp+0x00
|
reg_edi equ esp+0x00
|
||||||
|
|
||||||
Mov ds,ax,app_data ; çàãðóçèì ïðàâèëüíûå çíà÷åíèÿ
|
mov ax, app_data ;èñêëþ÷åíèå
|
||||||
mov es,ax ; â ñåãìåíòíûå ðåãèñòðû
|
mov ds, ax ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
|
||||||
|
mov es, ax ;â ðåãèñòðû
|
||||||
cld ; è ïðèâîäèì DF ê ñòàíäàðòó
|
cld ; è ïðèâîäèì DF ê ñòàíäàðòó
|
||||||
movzx ebx,bl
|
movzx ebx,bl
|
||||||
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
|
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
|
||||||
@ -186,10 +201,12 @@ IRetToUserHook:
|
|||||||
stosd
|
stosd
|
||||||
mov [edi], ebx
|
mov [edi], ebx
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
|
; simply return control to interrupted process
|
||||||
unknown_interrupt:
|
unknown_interrupt:
|
||||||
iretd
|
iretd
|
||||||
|
|
||||||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||||
|
; bl - error vector
|
||||||
show_error_parameters:
|
show_error_parameters:
|
||||||
mov edx,[TASK_BASE] ;not scratched below
|
mov edx,[TASK_BASE] ;not scratched below
|
||||||
DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
|
DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
|
||||||
@ -228,6 +245,8 @@ show_error_parameters:
|
|||||||
restore reg_esi
|
restore reg_esi
|
||||||
restore reg_edi
|
restore reg_edi
|
||||||
|
|
||||||
|
; IRQ runtime
|
||||||
|
|
||||||
; irq1 -> hid/keyboard.inc
|
; irq1 -> hid/keyboard.inc
|
||||||
macro irqh [num] {
|
macro irqh [num] {
|
||||||
p_irq#num :
|
p_irq#num :
|
||||||
@ -235,9 +254,13 @@ macro irqh [num] {
|
|||||||
jmp irqhandler
|
jmp irqhandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
irqh 2,3,4,5,7,8,9,10,11
|
||||||
|
; I don`t known how to use IRQ_RESERVE
|
||||||
|
if IRQ_RESERVE > 16
|
||||||
|
irqh 16, 17, 18, 19, 20, 21, 22, 23
|
||||||
|
end if
|
||||||
|
|
||||||
|
p_irq6: ; FDC
|
||||||
p_irq6:
|
|
||||||
save_ring3_context
|
save_ring3_context
|
||||||
mov ax, app_data ;os_data
|
mov ax, app_data ;os_data
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
@ -246,12 +269,28 @@ p_irq6:
|
|||||||
cmp [v86_irqhooks+edi*8], 0
|
cmp [v86_irqhooks+edi*8], 0
|
||||||
jnz v86_irq2
|
jnz v86_irq2
|
||||||
call fdc_irq
|
call fdc_irq
|
||||||
call ready_for_next_irq
|
mov [check_idle_semaphore], 5
|
||||||
|
mov al, 6
|
||||||
|
call IRQ_EOI
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
iret
|
iret
|
||||||
|
|
||||||
|
irq13: ; Math coprocessor
|
||||||
|
save_ring3_context
|
||||||
|
mov ax, app_data ;os_data
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
p_irq14:
|
mov dx, 0xf0
|
||||||
|
mov al, 0
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
mov al, 13
|
||||||
|
call IRQ_EOI
|
||||||
|
restore_ring3_context
|
||||||
|
iret
|
||||||
|
|
||||||
|
p_irq14: ; HDD
|
||||||
save_ring3_context
|
save_ring3_context
|
||||||
mov ax, app_data ;os_data
|
mov ax, app_data ;os_data
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
@ -261,10 +300,13 @@ p_irq14:
|
|||||||
jnz v86_irq2
|
jnz v86_irq2
|
||||||
; mov byte [BOOT_VAR + 0x48E], 0xFF
|
; mov byte [BOOT_VAR + 0x48E], 0xFF
|
||||||
call [irq14_func]
|
call [irq14_func]
|
||||||
call ready_for_next_irq_1
|
mov [check_idle_semaphore], 5
|
||||||
|
mov al, 14
|
||||||
|
call IRQ_EOI
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
iret
|
iret
|
||||||
p_irq15:
|
|
||||||
|
p_irq15: ; HDD2
|
||||||
save_ring3_context
|
save_ring3_context
|
||||||
mov ax, app_data ;os_data
|
mov ax, app_data ;os_data
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
@ -274,7 +316,9 @@ p_irq15:
|
|||||||
jnz v86_irq2
|
jnz v86_irq2
|
||||||
; mov byte [BOOT_VAR + 0x48E], 0xFF
|
; mov byte [BOOT_VAR + 0x48E], 0xFF
|
||||||
call [irq15_func]
|
call [irq15_func]
|
||||||
call ready_for_next_irq_1
|
mov [check_idle_semaphore], 5
|
||||||
|
mov al, 15
|
||||||
|
call IRQ_EOI
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
iret
|
iret
|
||||||
|
|
||||||
@ -307,7 +351,7 @@ irqD:
|
|||||||
iret
|
iret
|
||||||
|
|
||||||
|
|
||||||
irqh 2,3,4,5,7,8,9,10,11
|
align 4
|
||||||
|
|
||||||
irqhandler:
|
irqhandler:
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ v86_start:
|
|||||||
cmp edx, -1
|
cmp edx, -1
|
||||||
jz .noirqhook
|
jz .noirqhook
|
||||||
uglobal
|
uglobal
|
||||||
v86_irqhooks rd 16*2
|
v86_irqhooks rd IRQ_RESERVE * 2
|
||||||
endg
|
endg
|
||||||
cmp [v86_irqhooks+edx*8], 0
|
cmp [v86_irqhooks+edx*8], 0
|
||||||
jz @f
|
jz @f
|
||||||
@ -898,12 +898,10 @@ v86_irq2:
|
|||||||
pop ecx
|
pop ecx
|
||||||
.cont:
|
.cont:
|
||||||
loop .scan
|
loop .scan
|
||||||
mov al, 20h
|
|
||||||
out 20h, al
|
mov eax, edi
|
||||||
cmp edi, 8
|
call IRQ_EOI
|
||||||
jb @f
|
|
||||||
out 0A0h, al
|
|
||||||
@@:
|
|
||||||
popad
|
popad
|
||||||
iretd
|
iretd
|
||||||
.found:
|
.found:
|
||||||
|
@ -49,24 +49,21 @@ keymap_alt:
|
|||||||
|
|
||||||
boot_memdetect db 'Determining amount of memory',0
|
boot_memdetect db 'Determining amount of memory',0
|
||||||
boot_fonts db 'Fonts loaded',0
|
boot_fonts db 'Fonts loaded',0
|
||||||
boot_tss db 'Setting TSSs',0
|
|
||||||
boot_cpuid db 'Reading CPUIDs',0
|
|
||||||
boot_devices db 'Detecting devices',0
|
boot_devices db 'Detecting devices',0
|
||||||
boot_timer db 'Setting timer',0
|
|
||||||
boot_irqs db 'Reprogramming IRQs',0
|
|
||||||
boot_setmouse db 'Setting mouse',0
|
boot_setmouse db 'Setting mouse',0
|
||||||
boot_windefs db 'Setting window defaults',0
|
boot_windefs db 'Setting window defaults',0
|
||||||
boot_bgr db 'Calculating background',0
|
boot_bgr db 'Calculating background',0
|
||||||
boot_resirqports db 'Reserving IRQs & ports',0
|
boot_resirqports db 'Reserving IRQs & ports',0
|
||||||
boot_setrports db 'Setting addresses for IRQs',0
|
|
||||||
boot_setostask db 'Setting OS task',0
|
boot_setostask db 'Setting OS task',0
|
||||||
boot_allirqs db 'Unmasking all IRQs',0
|
boot_allirqs db 'Unmasking IRQs',0
|
||||||
boot_tsc db 'Reading TSC',0
|
boot_tsc db 'Reading TSC',0
|
||||||
boot_cpufreq db 'CPU frequency is ',' ',' MHz',0
|
boot_cpufreq db 'CPU frequency is ',' ',' MHz',0
|
||||||
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
|
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
|
||||||
boot_pal_vga db 'Setting VGA 640x480 palette',0
|
boot_pal_vga db 'Setting VGA 640x480 palette',0
|
||||||
boot_failed db 'Failed to start first app',0
|
boot_failed db 'Failed to start first app',0
|
||||||
boot_mtrr db 'Setting MTRR',0
|
boot_APIC_found db 'APIC enabled', 0
|
||||||
|
boot_APIC_nfound db 'APIC not found', 0
|
||||||
|
|
||||||
if preboot_blogesc
|
if preboot_blogesc
|
||||||
boot_tasking db 'All set - press ESC to start',0
|
boot_tasking db 'All set - press ESC to start',0
|
||||||
end if
|
end if
|
||||||
@ -262,28 +259,10 @@ cur_saved_data rb 4096
|
|||||||
fpu_data: rb 512
|
fpu_data: rb 512
|
||||||
|
|
||||||
; device irq owners
|
; device irq owners
|
||||||
irq_owner rd 16 ; process id
|
irq_owner rd IRQ_RESERVE ; process id
|
||||||
|
|
||||||
; on irq read ports
|
; on irq read ports
|
||||||
|
irq00read rd 16 * IRQ_RESERVE
|
||||||
irq00read rd 16
|
irq_tab rd IRQ_RESERVE
|
||||||
irq01read rd 16
|
|
||||||
irq02read rd 16
|
|
||||||
irq03read rd 16
|
|
||||||
irq04read rd 16
|
|
||||||
irq05read rd 16
|
|
||||||
irq06read rd 16
|
|
||||||
irq07read rd 16
|
|
||||||
irq08read rd 16
|
|
||||||
irq09read rd 16
|
|
||||||
irq10read rd 16
|
|
||||||
irq11read rd 16
|
|
||||||
irq12read rd 16
|
|
||||||
irq13read rd 16
|
|
||||||
irq14read rd 16
|
|
||||||
irq15read rd 16
|
|
||||||
|
|
||||||
irq_tab rd 16
|
|
||||||
|
|
||||||
mem_block_map rb 512
|
mem_block_map rb 512
|
||||||
mem_block_list rd 64
|
mem_block_list rd 64
|
||||||
|
@ -591,28 +591,22 @@ high_code:
|
|||||||
|
|
||||||
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
|
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
|
||||||
|
|
||||||
call rerouteirqs
|
call PIC_init
|
||||||
|
|
||||||
; Initialize system V86 machine
|
; Initialize system V86 machine
|
||||||
call init_sys_v86
|
call init_sys_v86
|
||||||
|
|
||||||
; TIMER SET TO 1/100 S
|
; Initialize system timer (IRQ0)
|
||||||
|
call PIT_init
|
||||||
|
|
||||||
mov al,0x34 ; set to 100Hz
|
; Try to Initialize APIC
|
||||||
out 0x43,al
|
call APIC_init
|
||||||
mov al,0x9b ; lsb 1193180 / 1193
|
|
||||||
out 0x40,al
|
|
||||||
mov al,0x2e ; msb
|
|
||||||
out 0x40,al
|
|
||||||
|
|
||||||
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15)
|
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15)
|
||||||
; they are used: when partitions are scanned, hd_read relies on timer
|
; they are used: when partitions are scanned, hd_read relies on timer
|
||||||
; Also enable IRQ2, because in some configurations
|
call unmask_timer
|
||||||
; IRQs from slave controller are not delivered until IRQ2 on master is enabled
|
stdcall enable_irq, 14
|
||||||
mov al, 0xFA
|
stdcall enable_irq, 15
|
||||||
out 0x21, al
|
|
||||||
mov al, 0x3F
|
|
||||||
out 0xA1, al
|
|
||||||
|
|
||||||
; Enable interrupts in IDE controller
|
; Enable interrupts in IDE controller
|
||||||
mov al, 0
|
mov al, 0
|
||||||
@ -662,6 +656,13 @@ end if
|
|||||||
mov esi,boot_fonts
|
mov esi,boot_fonts
|
||||||
call boot_log
|
call boot_log
|
||||||
|
|
||||||
|
; Display APIC status
|
||||||
|
mov esi, boot_APIC_found
|
||||||
|
test dword[APIC], 0xffffffff
|
||||||
|
jnz @f
|
||||||
|
mov esi, boot_APIC_nfound
|
||||||
|
@@: call boot_log
|
||||||
|
|
||||||
; PRINT AMOUNT OF MEMORY
|
; PRINT AMOUNT OF MEMORY
|
||||||
mov esi, boot_memdetect
|
mov esi, boot_memdetect
|
||||||
call boot_log
|
call boot_log
|
||||||
@ -779,9 +780,6 @@ end if
|
|||||||
mov [CPU_FREQ],eax ; save tsc / sec
|
mov [CPU_FREQ],eax ; save tsc / sec
|
||||||
; mov ebx, 1000000
|
; mov ebx, 1000000
|
||||||
; div ebx
|
; div ebx
|
||||||
; ¢®®¡é¥-â® ¯à®¨§¢®¤¨â¥«ì®áâì ¢ ¤ ®¬ ª®ªà¥â®¬ ¬¥áâ¥
|
|
||||||
; ᮢ¥à襮 ¥ªà¨â¨ç , ® çâ®¡ë § âªãâì «î¡¨â¥«¥©
|
|
||||||
; ®¯â¨¬¨§¨àãîé¨å ª®¬¯¨«ïâ®à®¢ Ÿ‚“...
|
|
||||||
mov edx, 2251799814
|
mov edx, 2251799814
|
||||||
mul edx
|
mul edx
|
||||||
shr edx, 19
|
shr edx, 19
|
||||||
@ -805,7 +803,6 @@ end if
|
|||||||
|
|
||||||
; SET MOUSE
|
; SET MOUSE
|
||||||
|
|
||||||
;call detect_devices
|
|
||||||
stdcall load_driver, szPS2MDriver
|
stdcall load_driver, szPS2MDriver
|
||||||
; stdcall load_driver, szCOM_MDriver
|
; stdcall load_driver, szCOM_MDriver
|
||||||
|
|
||||||
@ -904,7 +901,7 @@ first_app_found:
|
|||||||
and al,00000010b
|
and al,00000010b
|
||||||
loopnz @b
|
loopnz @b
|
||||||
|
|
||||||
; mov al, 0xED ; svetodiody - only for testing!
|
; mov al, 0xED ; Keyboard LEDs - only for testing!
|
||||||
; call kb_write
|
; call kb_write
|
||||||
; call kb_read
|
; call kb_read
|
||||||
; mov al, 111b
|
; mov al, 111b
|
||||||
@ -963,8 +960,9 @@ if defined debug_com_base
|
|||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
; START MULTITASKING
|
;-=-=-=-=-=-=- START MULTITASKING -=-=-=-=-=-=-=-=-
|
||||||
|
|
||||||
|
; A 'All set - press ESC to start' messages if need
|
||||||
if preboot_blogesc
|
if preboot_blogesc
|
||||||
mov esi, boot_tasking
|
mov esi, boot_tasking
|
||||||
call boot_log
|
call boot_log
|
||||||
@ -973,7 +971,6 @@ if preboot_blogesc
|
|||||||
jne .bll1
|
jne .bll1
|
||||||
end if
|
end if
|
||||||
|
|
||||||
; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled
|
|
||||||
|
|
||||||
; UNMASK ALL IRQ'S
|
; UNMASK ALL IRQ'S
|
||||||
|
|
||||||
@ -994,8 +991,12 @@ end if
|
|||||||
; out 0xa0,al
|
; out 0xa0,al
|
||||||
;
|
;
|
||||||
; loop ready_for_irqs ; flush the queue
|
; loop ready_for_irqs ; flush the queue
|
||||||
|
cli ;guarantee forbidance of interrupts.
|
||||||
|
stdcall enable_irq, 2 ; @#$%! PIC
|
||||||
|
stdcall enable_irq, 6 ; FDD
|
||||||
|
stdcall enable_irq, 13 ; co-processor
|
||||||
|
|
||||||
stdcall attach_int_handler, 1, irq1, 0
|
stdcall attach_int_handler, dword 1, irq1, dword 0 ; keyboard
|
||||||
|
|
||||||
; mov [dma_hdd],1
|
; mov [dma_hdd],1
|
||||||
cmp [IDEContrRegsBaseAddr], 0
|
cmp [IDEContrRegsBaseAddr], 0
|
||||||
@ -1007,7 +1008,6 @@ end if
|
|||||||
|
|
||||||
jmp osloop
|
jmp osloop
|
||||||
|
|
||||||
; jmp $ ; wait here for timer to take control
|
|
||||||
|
|
||||||
; Fly :)
|
; Fly :)
|
||||||
|
|
||||||
@ -1042,8 +1042,8 @@ boot_log:
|
|||||||
align 32
|
align 32
|
||||||
osloop:
|
osloop:
|
||||||
call [draw_pointer]
|
call [draw_pointer]
|
||||||
call window_check_events
|
call window_check_events
|
||||||
call mouse_check_events
|
call mouse_check_events
|
||||||
call checkmisc
|
call checkmisc
|
||||||
call checkVga_N13
|
call checkVga_N13
|
||||||
call stack_handler
|
call stack_handler
|
||||||
@ -1150,8 +1150,8 @@ reserve_irqs_ports:
|
|||||||
|
|
||||||
setirqreadports:
|
setirqreadports:
|
||||||
|
|
||||||
mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte
|
mov [irq00read+12*4*16],dword 0x60 + 0x01000000 ; read port 0x60 , byte
|
||||||
and dword [irq12read+4],0 ; end of port list
|
and dword [irq00read+12*4*16],0 ; end of port list
|
||||||
; mov [irq12read+4],dword 0 ; end of port list
|
; mov [irq12read+4],dword 0 ; end of port list
|
||||||
;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
|
;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
|
||||||
;mov [irq04read+4],dword 0 ; end of port list
|
;mov [irq04read+4],dword 0 ; end of port list
|
||||||
@ -1240,7 +1240,7 @@ sys_outport:
|
|||||||
mov [esp+32],eax
|
mov [esp+32],eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
.sopl4:
|
.sopl4:
|
||||||
|
|
||||||
mov dx,cx ; read
|
mov dx,cx ; read
|
||||||
@ -1549,13 +1549,13 @@ cd_base db 0
|
|||||||
|
|
||||||
endg
|
endg
|
||||||
nsyse4:
|
nsyse4:
|
||||||
|
|
||||||
sub ebx,2 ; SYSTEM LANGUAGE
|
sub ebx,2 ; SYSTEM LANGUAGE
|
||||||
jnz nsyse5
|
jnz nsyse5
|
||||||
mov [syslang],ecx
|
mov [syslang],ecx
|
||||||
ret
|
ret
|
||||||
nsyse5:
|
nsyse5:
|
||||||
|
|
||||||
sub ebx,2 ; HD BASE
|
sub ebx,2 ; HD BASE
|
||||||
jnz nsyse7
|
jnz nsyse7
|
||||||
|
|
||||||
@ -1762,7 +1762,7 @@ ngsyse12:
|
|||||||
mov [esp+32],dword 1
|
mov [esp+32],dword 1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
get_timer_ticks:
|
get_timer_ticks:
|
||||||
mov eax,[timer_ticks]
|
mov eax,[timer_ticks]
|
||||||
ret
|
ret
|
||||||
@ -2936,7 +2936,7 @@ sheduler:
|
|||||||
dd sys_sheduler.03
|
dd sys_sheduler.03
|
||||||
dd sys_sheduler.04
|
dd sys_sheduler.04
|
||||||
endg
|
endg
|
||||||
sys_sheduler:
|
sys_sheduler:
|
||||||
;rewritten by <Lrz> 29.12.2009
|
;rewritten by <Lrz> 29.12.2009
|
||||||
jmp dword [sheduler+ebx*4]
|
jmp dword [sheduler+ebx*4]
|
||||||
;.shed_counter:
|
;.shed_counter:
|
||||||
@ -2949,7 +2949,7 @@ sys_sheduler:
|
|||||||
;.perf_control:
|
;.perf_control:
|
||||||
inc ebx ;before ebx=2, ebx=3
|
inc ebx ;before ebx=2, ebx=3
|
||||||
cmp ebx,ecx ;if ecx=3, ebx=3
|
cmp ebx,ecx ;if ecx=3, ebx=3
|
||||||
jz cache_disable
|
jz cache_disable
|
||||||
|
|
||||||
dec ebx ;ebx=2
|
dec ebx ;ebx=2
|
||||||
cmp ebx,ecx ;
|
cmp ebx,ecx ;
|
||||||
@ -2965,7 +2965,7 @@ sys_sheduler:
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.03:
|
.03:
|
||||||
;.rdmsr_instr:
|
;.rdmsr_instr:
|
||||||
;now counter in ecx
|
;now counter in ecx
|
||||||
;(edx:eax) esi:edi => edx:esi
|
;(edx:eax) esi:edi => edx:esi
|
||||||
@ -3591,7 +3591,7 @@ siar1:
|
|||||||
; * ecx = number start arrea of ports
|
; * ecx = number start arrea of ports
|
||||||
; * edx = number end arrea of ports (include last number of port)
|
; * edx = number end arrea of ports (include last number of port)
|
||||||
;Return value:
|
;Return value:
|
||||||
; * eax = 0 - succesful
|
; * eax = 0 - succesful
|
||||||
; * eax = 1 - error
|
; * eax = 1 - error
|
||||||
; * The system has reserve this ports:
|
; * The system has reserve this ports:
|
||||||
; 0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port).
|
; 0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port).
|
||||||
@ -3744,19 +3744,19 @@ reserve_free_irq:
|
|||||||
|
|
||||||
push ecx
|
push ecx
|
||||||
lea ecx, [irq_owner + 4 * ecx]
|
lea ecx, [irq_owner + 4 * ecx]
|
||||||
mov edx, [ecx]
|
mov edx, [ecx] ; IRQ owner PID
|
||||||
mov eax, [TASK_BASE]
|
mov eax, [TASK_BASE]
|
||||||
mov edi, [eax + TASKDATA.pid]
|
mov edi, [eax + TASKDATA.pid] ; current task PID
|
||||||
pop eax
|
pop eax
|
||||||
dec ebx
|
dec ebx
|
||||||
jnz reserve_irq
|
jnz reserve_irq
|
||||||
|
; free irq
|
||||||
cmp edx, edi
|
cmp edx, edi ; check owner
|
||||||
jne ril1
|
jne ril1
|
||||||
dec esi
|
dec esi
|
||||||
mov [ecx], esi
|
mov [ecx], esi ; esi = 0
|
||||||
|
|
||||||
jmp ril1
|
jmp ril1 ; return successful
|
||||||
|
|
||||||
reserve_irq:
|
reserve_irq:
|
||||||
|
|
||||||
@ -3793,6 +3793,18 @@ f_irqs:
|
|||||||
dd p_irq14
|
dd p_irq14
|
||||||
dd p_irq15
|
dd p_irq15
|
||||||
|
|
||||||
|
; I don`t known how to use IRQ_RESERVE
|
||||||
|
if IRQ_RESERVE > 16
|
||||||
|
dd p_irq16
|
||||||
|
dd p_irq17
|
||||||
|
dd p_irq18
|
||||||
|
dd p_irq19
|
||||||
|
dd p_irq20
|
||||||
|
dd p_irq21
|
||||||
|
dd p_irq22
|
||||||
|
dd p_irq23
|
||||||
|
end if
|
||||||
|
|
||||||
endg
|
endg
|
||||||
|
|
||||||
drawbackground:
|
drawbackground:
|
||||||
@ -4286,64 +4298,6 @@ _rdtsc:
|
|||||||
ret
|
ret
|
||||||
end if
|
end if
|
||||||
|
|
||||||
rerouteirqs:
|
|
||||||
|
|
||||||
cli
|
|
||||||
|
|
||||||
mov al,0x11 ; icw4, edge triggered
|
|
||||||
out 0x20,al
|
|
||||||
call pic_delay
|
|
||||||
out 0xA0,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
mov al,0x20 ; generate 0x20 +
|
|
||||||
out 0x21,al
|
|
||||||
call pic_delay
|
|
||||||
mov al,0x28 ; generate 0x28 +
|
|
||||||
out 0xA1,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
mov al,0x04 ; slave at irq2
|
|
||||||
out 0x21,al
|
|
||||||
call pic_delay
|
|
||||||
mov al,0x02 ; at irq9
|
|
||||||
out 0xA1,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
mov al,0x01 ; 8086 mode
|
|
||||||
out 0x21,al
|
|
||||||
call pic_delay
|
|
||||||
out 0xA1,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
mov al,255 ; mask all irq's
|
|
||||||
out 0xA1,al
|
|
||||||
call pic_delay
|
|
||||||
out 0x21,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
mov ecx,0x1000
|
|
||||||
cld
|
|
||||||
picl1: call pic_delay
|
|
||||||
loop picl1
|
|
||||||
|
|
||||||
mov al,255 ; mask all irq's
|
|
||||||
out 0xA1,al
|
|
||||||
call pic_delay
|
|
||||||
out 0x21,al
|
|
||||||
call pic_delay
|
|
||||||
|
|
||||||
cli
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
pic_delay:
|
|
||||||
|
|
||||||
jmp pdl1
|
|
||||||
pdl1: ret
|
|
||||||
|
|
||||||
|
|
||||||
sys_msg_board_str:
|
sys_msg_board_str:
|
||||||
|
|
||||||
pushad
|
pushad
|
||||||
@ -4806,27 +4760,27 @@ syscall_getarea:
|
|||||||
dec ebx
|
dec ebx
|
||||||
; eax - x, ebx - y
|
; eax - x, ebx - y
|
||||||
mov edx,ecx
|
mov edx,ecx
|
||||||
|
|
||||||
shr ecx,16
|
shr ecx,16
|
||||||
and edx,0xffff
|
and edx,0xffff
|
||||||
mov esi,ecx
|
mov esi,ecx
|
||||||
; ecx - size x, edx - size y
|
; ecx - size x, edx - size y
|
||||||
|
|
||||||
mov ebp,edx
|
mov ebp,edx
|
||||||
dec ebp
|
dec ebp
|
||||||
lea ebp,[ebp*3]
|
lea ebp,[ebp*3]
|
||||||
|
|
||||||
imul ebp,esi
|
imul ebp,esi
|
||||||
|
|
||||||
mov esi,ecx
|
mov esi,ecx
|
||||||
dec esi
|
dec esi
|
||||||
lea esi,[esi*3]
|
lea esi,[esi*3]
|
||||||
|
|
||||||
add ebp,esi
|
add ebp,esi
|
||||||
add ebp,edi
|
add ebp,edi
|
||||||
|
|
||||||
add ebx,edx
|
add ebx,edx
|
||||||
|
|
||||||
.start_y:
|
.start_y:
|
||||||
push ecx edx
|
push ecx edx
|
||||||
.start_x:
|
.start_x:
|
||||||
@ -4834,7 +4788,7 @@ syscall_getarea:
|
|||||||
add eax,ecx
|
add eax,ecx
|
||||||
|
|
||||||
call dword [GETPIXEL] ; eax - x, ebx - y
|
call dword [GETPIXEL] ; eax - x, ebx - y
|
||||||
|
|
||||||
mov [ebp],cx
|
mov [ebp],cx
|
||||||
shr ecx,16
|
shr ecx,16
|
||||||
mov [ebp+2],cl
|
mov [ebp+2],cl
|
||||||
@ -5118,9 +5072,7 @@ yes_shutdown_param:
|
|||||||
|
|
||||||
call restorefatchain
|
call restorefatchain
|
||||||
|
|
||||||
mov al, 0xFF
|
call IRQ_mask_all
|
||||||
out 0x21, al
|
|
||||||
out 0xA1, al
|
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
mov word [OS_BASE+0x467+0],pr_mode_exit
|
mov word [OS_BASE+0x467+0],pr_mode_exit
|
||||||
|
@ -221,6 +221,7 @@ include "core/peload.inc" ;
|
|||||||
include "core/exports.inc"
|
include "core/exports.inc"
|
||||||
include "core/string.inc"
|
include "core/string.inc"
|
||||||
include "core/v86.inc" ; virtual-8086 manager
|
include "core/v86.inc" ; virtual-8086 manager
|
||||||
|
include "core/apic.inc" ; Interrupt Controller functions
|
||||||
|
|
||||||
; GUI stuff
|
; GUI stuff
|
||||||
include "gui/window.inc"
|
include "gui/window.inc"
|
||||||
|
Loading…
Reference in New Issue
Block a user