cos2000v1/noyau/8259a.asm

391 lines
8.6 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;Adresses de port du controleur IRQ
MASTERPIC = 020h ;Adresse de base du PIC maŒtre
SLAVEPIC = 0A0h ;Adresse de base du PIC esclave
IRQMASK = 001h ;Offset sur port de masquage
;Commandes IRQ OCW2
DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique
EOI = 020h ;End of Interrupt non spcifi
COMMANDEOI = 060h ;Commande EOI particulière
ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique
ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique
SETPRIORITY = 0C0h ;Definir la priorité
ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié
;Position des vecteurs d'interruptions
MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions
SLAVEFIRSTVECTOR = 070h ;electroniques
;OCW3 codes registres
IRR = 002h ;Interrupt Request Register
ISR = 003h ;In Service Register
;OCW3 et modes
OCW3 = 008h ;OCW3
POLLING = 004h ;Polling bit
ISR = 0Bh ; Pas d'operation, pas de Poll, lire ISR OCW3
IRR = 0Ah ; Pas d'operation, pas de Poll, lire IRR
;Autorise une interruption electronique
;Entree : %1 - Numero de l'interruption (0-15) à autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC
proc enableirq, irq
mov ax,[irq]
mov dx,MASTERPIC+IRQMASK
cmp al,7
jbe .master
mov dx,SLAVEPIC+IRQMASK
.master:
mov cl,al
and cl,7
mov al,1
shl al,cl
not al
mov ah,al
in al,dx
and al,ah
out dx,al
retf
endp
;Desactive une interruption lectronique
;Entre : %0 - Numro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC
proc disableirq, irq
mov ax,[irq]
mov dx,MASTERPIC+IRQMASK
cmp al,7
jbe .master
mov dx,SLAVEPIC+IRQMASK
.master:
mov cl,al
and cl,7
mov al,1
shl al,cl
not al
mov ah,al
in al,dx
or al,ah
out dx,al
retf
endp
;Signale "End Of Interrupt" de l'interruption %0
proc seteoi, irq
mov ax,[irq]
cmp al,7
jbe .master
mov al,EOI
out SLAVEPIC,al
.master:
mov al,EOI
out MASTERPIC,al
retf
endp
;Lit les masques d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1
proc readimr, controleurx
mov bx,[controleur]
mov dx,MASTERPIC+ IRQMASK
cmp bl,0
jne .master
mov dx,SLAVEPIC+ IRQMASK
.master:
xor ah,ah
in al,dx
pop dx
retf
endp
;Lit le registre d'tat d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1
proc readisr, controleur
mov bx,[controleur]
mov dx,MASTERPIC
cmp bh,0
jne .master
mov dx,SLAVEPIC
.master:
mov al,ISR
out dx,al
xor ah,ah
in al,dx
retf
endp
;Lit le registre d'tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
proc readirr, controleur
mov bx,[controleur]
mov dx,MASTERPIC
cmp bh,0
jne .master
mov dx,SLAVEPIC
.master:
mov al,IRR
out dx,al
xor ah,ah
in al,dx
retf
endp
;carry si enable et pas carry si pas enable
proc isenableirq, irq
mov ax,[irq]
mov dx,MASTERPIC+IRQMASK
cmp al,7
jbe .master
mov dx,SLAVEPIC+IRQMASK
.master:
mov cl,al
and cx,7
in al,dx
neg al
bt ax,cx
retf
endp
;carry si enable et pas carry si pas enable
proc isinserviceirq, irq
mov ax,[irq]
mov dx,MASTERPIC
cmp al,7
jbe .master
mov dx,SLAVEPIC
.master:
mov cl,al
mov al,ISR
out dx,al
and cx,7
in al,dx
neg al
bt ax,cx
retf
endp
;carry si enable et pas carry si pas enable
proc isrequestirq, irq
mov ax,[irq]
mov dx,MASTERPIC
cmp al,7
jbe .master
mov dx,SLAVEPIC
.master:
mov cl,al
mov al,IRR
out dx,al
and cx,7
in al,dx
neg al
bt ax,cx
retf
endp
proc installirqhandler
push fs
stdcall mbcreate,interruptionbloc,256*ints.sizeof
mov es,ax
mov ax,0x0000
mov ds,ax
xor si,si
.searchdummypointer:
mov fs,[si+vector.data.seg]
mov bx,[si+vector.data.off]
cmp byte [fs:bx],0xCF ;iret
je .founded
add si,vector.sizeof
cmp si,256*4
jb .searchdummypointer
xor edx,edx
jmp .suite
.founded:
mov edx,[si+vector.content]
.suite:
xor cx,cx
xor si,si
xor di,di
cli
.copy:
mov [es:di+ints.number],cl
mov [es:di+ints.locked],0
mov [es:di+ints.vector1.content],0
mov [es:di+ints.vector3.content],0
mov [es:di+ints.vector4.content],0
mov [es:di+ints.vector5.content],0
mov [es:di+ints.vector6.content],0
mov [es:di+ints.vector7.content],0
mov [es:di+ints.vector8.content],0
mov [es:di+ints.launchedlow],0
mov [es:di+ints.launchedhigh],0
mov [es:di+ints.calledlow],0
mov [es:di+ints.calledhigh],0
mov eax,[si+vector.ints.content]
cmp eax,edx
je .notarealvector
mov [es:di+ints.vector1.content],eax
mov [es:di+ints.activated],1
jmp .copynext
.notarealvector:
mov [es:di+ints.vector1.content],0
mov [es:di+ints.activated],0
.copynext:
mov bx,cx
shl bx,3
sub bx,cx
add bx,coupling
mov [si+vector.data.seg],cs
mov [si+vector.data.off],bx
add si,vector.sizeof
add di,ints.sizeof
inc cl
cmp cl,0
jne .copy
.end:
pop fs
sti
retf
endp
interruptionbloc db '/interrupts',0
proc savecontext, pointer
pushfd
push eax
push ebx
push ecx
push edx
push esi
push edi
push ds
push es
push fs
push gs
push ss
mov si,[pointer]
mov ds,[ss:bp+4]
mov eax,ebp
mov ax,word [ss:bp]
push eax
push word [ss:bp+4]
xor eax,eax
mov ax,word [ss:bp+2]
push eax
mov ax,bp
add ax,4
push eax
pop [si+regs.sesp]
pop [si+regs.seip]
pop [si+regs.scs]
pop [si+regs.sebp]
pop [si+regs.sss]
pop [si+regs.sgs]
pop [si+regs.sfs]
pop [si+regs.ses]
pop [si+regs.sds]
pop [si+regs.sedi]
pop [si+regs.sesi]
pop [si+regs.sedx]
pop [si+regs.secx]
pop [si+regs.sebx]
pop [si+regs.seax]
pop [si+regs.seflags]
retf
endp
proc restorecontextg, pointer
mov si,[pointer]
pushd [cs:si+regs.sesi]
pushd [cs:si+regs.seflags]
mov eax,[cs:si+regs.seax]
mov ebx,[cs:si+regs.sebx]
mov ecx,[cs:si+regs.secx]
mov edx,[cs:si+regs.sedx]
mov edi,[cs:si+regs.sedi]
mov ebp,[cs:si+regs.sebp]
mov es,[cs:si+regs.ses]
mov fs,[cs:si+regs.sfs]
mov gs,[cs:si+regs.sgs]
mov ds,[cs:si+regs.sds]
popfd
pop esi
pop [cs:dummy]
db 0xCA,0x02,0x00 ;retf 2
endp
coupling:
repeat 256
push %+256
push offset irqhandlers
ret
end repeat
interrupt dw 0
dummy dw 0
calling_reg regs
function_reg regs
irqhandlers:
cli
pop [cs:interrupt]
stdcall savecontext,offset calling_reg
stdcall irqhandler,[cs:interrupt]
stdcall restorecontextg,offset calling_reg
sti
iret
proc irqhandler, int
push cs
pop ds
stdcall mbfindsb,offset interruptionbloc,cs
jc .end
mov es,ax
mov ax,[int]
sub ax,256
mov cx,ints.sizeof
mul cx
mov si,ax
add [es:si+ints.calledlow],1
adc [es:si+ints.calledhigh],0
cmp [es:si+ints.activated],1
jne .end
add [es:si+ints.launchedlow],1
adc [es:si+ints.launchedhigh],0
lea si,[es:si+ints.vector1]
mov cl,8
.launchall:
cmp [es:si+vector.content],0
je .end
push word [cs:calling_reg.seflags]
push cs
push offset .back
push [es:si+vector.data.seg]
push [es:si+vector.data.off]
stdcall savecontext,offset function_reg
stdcall restorecontextg,offset calling_reg
db 0xCB
.back:
cli
stdcall savecontext,offset calling_reg
stdcall restorecontextg,offset function_reg
.next:
add si,vector.sizeof
dec cl
jnz .launchall
.end:
ret
endp