mirror of https://git.ia64.cc/perso/cos2000v1.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
4.2 KiB
241 lines
4.2 KiB
.model tiny |
|
.486 |
|
smart |
|
.code |
|
org 0100h |
|
start: |
|
jmp tsr |
|
db 'PIC8259A' |
|
Tsr: |
|
cli |
|
cmp ax,1234h |
|
jne nomore |
|
mov ax,4321h |
|
jmp itsok |
|
nomore: |
|
push bx |
|
mov bl,ah |
|
xor bh,bh |
|
shl bx,1 |
|
mov bx,cs:[bx].tables |
|
mov cs:current,bx |
|
pop bx |
|
call cs:current |
|
itsok: |
|
jnc noerror |
|
push bp |
|
mov bp,sp |
|
or byte ptr [bp+6],1b |
|
pop bp |
|
mov ax,cs |
|
shl eax,16 |
|
mov ax,cs:current |
|
jmp endofint |
|
noerror: |
|
push bp |
|
mov bp,sp |
|
and byte ptr [bp+6],0FEh |
|
pop bp |
|
endofint: |
|
sti |
|
iret |
|
current dw 0 |
|
tables dw enableirq |
|
dw disableirq |
|
dw readmaskirq |
|
dw readirr |
|
dw readisr |
|
dw installhandler |
|
dw replacehandler |
|
dw getint |
|
dw setint |
|
dw seteoi |
|
|
|
;Adresses de port du contr“leur 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 sp‚cifi‚ |
|
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 ;‚lectroniques |
|
|
|
;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'op‚ration, pas de Poll, lire ISR OCW3 |
|
IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR |
|
|
|
|
|
;Autorise une interruption ‚lectronique |
|
;Entr‚e : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC |
|
EnableIRQ: |
|
push ax cx dx |
|
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 |
|
pop dx cx ax |
|
ret |
|
|
|
;Desactive une interruption ‚lectronique |
|
;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC |
|
DisableIRQ: |
|
push ax cx dx |
|
mov dx,MASTERPIC+IRQMASK |
|
cmp al,7 |
|
jbe master2 |
|
mov dx,SLAVEPIC+IRQMASK |
|
master2: |
|
mov cl,al |
|
and cl,7 |
|
mov al,1 |
|
shl al,cl |
|
mov ah,al |
|
in al,dx |
|
or al,ah |
|
out dx,al |
|
pop dx cx ax |
|
ret |
|
|
|
;Signale "End Of Interrupt" de l'interruption al |
|
SetEOI: |
|
push ax dx |
|
cmp al,7 |
|
jbe master3 |
|
mov al,EOI |
|
out SLAVEPIC,al |
|
master3: |
|
mov al,EOI |
|
out MASTERPIC,al |
|
pop dx ax |
|
ret |
|
|
|
;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh |
|
ReadmaskIrq: |
|
push dx |
|
mov dx,MASTERPIC+ IRQMASK |
|
cmp bh,0 |
|
jne Master5 |
|
mov dx,SLAVEPIC+ IRQMASK |
|
master5: |
|
in al,dx |
|
pop dx |
|
ret |
|
|
|
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh |
|
ReadISR: |
|
push dx |
|
mov dx,MASTERPIC |
|
cmp bh,0 |
|
jne Master6 |
|
mov dx,SLAVEPIC |
|
master6: |
|
mov al,isr |
|
out dx,al |
|
in al,dx |
|
pop dx |
|
ret |
|
|
|
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh |
|
ReadIRR: |
|
push dx |
|
mov dx,MASTERPIC |
|
cmp bh,0 |
|
jne Master7 |
|
mov dx,SLAVEPIC |
|
master7: |
|
mov al,irr |
|
out dx,al |
|
in al,dx |
|
pop dx |
|
ret |
|
|
|
;remplace le handler pointer par ds:si en bx:100h interruption ax |
|
replacehandler: |
|
push ax bx cx si di ds es |
|
mov es,bx |
|
mov di,0100h |
|
mov ah,4 |
|
int 48h |
|
jc reph |
|
mov bx,ax |
|
call getint |
|
mov es:[102h],si |
|
mov es:[104h],ds |
|
call setint |
|
reph: |
|
pop es ds di si cx bx ax |
|
ret |
|
|
|
;install le handler pointer par ds:si en bx:100h interruption ax |
|
installhandler: |
|
push bx cx di es |
|
mov es,bx |
|
mov di,100h |
|
mov ah,4 |
|
int 48h |
|
jc inh |
|
mov bx,ax |
|
call setint |
|
inh: |
|
pop es di cx bx |
|
ret |
|
|
|
;met es:di le handle de l'int al |
|
setint: |
|
push ax bx ds |
|
call disableirq |
|
cli |
|
xor ah,ah |
|
mov bx,ax |
|
shl bx,2 |
|
xor ax,ax |
|
mov ds,ax |
|
mov ds:[bx],di |
|
mov ds:[bx+2],es |
|
pop ds bx ax |
|
sti |
|
call enableirq |
|
ret |
|
|
|
;met ds:si le handle de l'int al |
|
getint: |
|
push ax bx es |
|
xor ah,ah |
|
mov bx,ax |
|
shl bx,2 |
|
xor ax,ax |
|
mov es,ax |
|
mov si,es:[bx] |
|
mov ds,es:[bx+2] |
|
pop es bx ax |
|
ret |
|
|
|
|
|
end start |
|
|
|
|