      align 16

pmidt dw (int00 AND 65535),8,8e00h,((int00 shr 16) AND 65535)
      dw (int01 AND 65535),8,8e00h,((int01 shr 16) AND 65535)
      dw (int02 AND 65535),8,8e00h,((int02 shr 16) AND 65535)
      dw (int03 AND 65535),8,8e00h,((int03 shr 16) AND 65535)
      dw (int04 AND 65535),8,8e00h,((int04 shr 16) AND 65535)
      dw (int05 AND 65535),8,8e00h,((int05 shr 16) AND 65535)
      dw (int06 AND 65535),8,8e00h,((int06 shr 16) AND 65535)
      dw (int07 AND 65535),8,8e00h,((int07 shr 16) AND 65535)
      dw (int08 AND 65535),8,8e00h,((int08 shr 16) AND 65535)
      dw (int09 AND 65535),8,8e00h,((int09 shr 16) AND 65535)
      dw (int0a AND 65535),8,8e00h,((int0a shr 16) AND 65535)
      dw (int0b AND 65535),8,8e00h,((int0b shr 16) AND 65535)
      dw (int0c AND 65535),8,8e00h,((int0c shr 16) AND 65535)
      dw (int0d AND 65535),8,8e00h,((int0d shr 16) AND 65535)
      dw (int0e AND 65535),8,8e00h,((int0e shr 16) AND 65535)
      dw (int0f AND 65535),8,8e00h,((int0f shr 16) AND 65535)
      dw (int10 AND 65535),8,8e00h,((int10 shr 16) AND 65535)
      dw (int11 AND 65535),8,8e00h,((int11 shr 16) AND 65535)
      dw (int12 AND 65535),8,8e00h,((int12 shr 16) AND 65535)
      dw (int13 AND 65535),8,8e00h,((int13 shr 16) AND 65535)
      dw (int14 AND 65535),8,8e00h,((int14 shr 16) AND 65535)
      dw (int15 AND 65535),8,8e00h,((int15 shr 16) AND 65535)
      dw (int16 AND 65535),8,8e00h,((int16 shr 16) AND 65535)
      dw (int17 AND 65535),8,8e00h,((int17 shr 16) AND 65535)
      dw (int18 AND 65535),8,8e00h,((int18 shr 16) AND 65535)
      dw (int19 AND 65535),8,8e00h,((int19 shr 16) AND 65535)
      dw (int1a AND 65535),8,8e00h,((int1a shr 16) AND 65535)
      dw (int1b AND 65535),8,8e00h,((int1b shr 16) AND 65535)
      dw (int1c AND 65535),8,8e00h,((int1c shr 16) AND 65535)
      dw (int1d AND 65535),8,8e00h,((int1d shr 16) AND 65535)
      dw (int1e AND 65535),8,8e00h,((int1e shr 16) AND 65535)
      dw (int1f AND 65535),8,8e00h,((int1f shr 16) AND 65535)
      dw (irq00 AND 65535),8,8e00h,((irq00 shr 16) AND 65535)
      dw (irq01 AND 65535),8,8e00h,((irq01 shr 16) AND 65535)
      dw (irq02 AND 65535),8,8e00h,((irq02 shr 16) AND 65535)
      dw (irq03 AND 65535),8,8e00h,((irq03 shr 16) AND 65535)
      dw (irq04 AND 65535),8,8e00h,((irq04 shr 16) AND 65535)
      dw (irq05 AND 65535),8,8e00h,((irq05 shr 16) AND 65535)
      dw (irq06 AND 65535),8,8e00h,((irq06 shr 16) AND 65535)
      dw (irq07 AND 65535),8,8e00h,((irq07 shr 16) AND 65535)
      dw (irq08 AND 65535),8,8e00h,((irq08 shr 16) AND 65535)
      dw (irq09 AND 65535),8,8e00h,((irq09 shr 16) AND 65535)
      dw (irq0a AND 65535),8,8e00h,((irq0a shr 16) AND 65535)
      dw (irq0b AND 65535),8,8e00h,((irq0b shr 16) AND 65535)
      dw (irq0c AND 65535),8,8e00h,((irq0c shr 16) AND 65535)
      dw (irq0d AND 65535),8,8e00h,((irq0d shr 16) AND 65535)
      dw (irq0e AND 65535),8,8e00h,((irq0e shr 16) AND 65535)
      dw (irq0f AND 65535),8,8e00h,((irq0f shr 16) AND 65535)

pmlidt dw (48*8)-1
       dd pmidt

picmasklo db 11111100b ;allow only IRQ0 (timer) and IRQ1 (kbd)
picmaskhi db 11111111b

int00:
int01:
int02:
int03:
int04:
int05:
int06:
int07:
int08:
int09:
int0a:
int0b:
int0c:
int0d:
int0e:
int0f:
int10:
int11:
int12:
int13:
int14:
int15:
int16:
int17:
int18:
int19:
int1a:
int1b:
int1c:
int1d:
int1e:
int1f:
	mov dword [0xb8000],"E E "
	jmp $

irq00:	call tmr32_main
eoi1:	push eax
	mov al,20h
	out 20h,al
	pop eax
	iret
irq01:	call kbd32_main
	jmp eoi1
irq02:
irq03:
irq04:
irq05:
irq06:
irq07:
	jmp eoi1
irq08:
irq09:
irq0a:
irq0b:
irq0c:
irq0d:
irq0e:
irq0f:
eoi2:	push eax
	mov al,20h
	out 20h,al
	out 0a0h,al
	pop eax
	iret


setuppic:
	;send ICW1
	mov al,00010001b	;ICW1FLAG ICW4NEEDED
	out 20h,al
	out 0a0h,al
;        jmp $+2
;        jmp $+2
	 out 0edh,al
	;send ICW2
	mov al,20h		;first PIC (IRQ0-7 = INT 20-27)
	out 21h,al
	mov al,28h		;2nd PIC (IRQ0-7 = INT 28-2F)
	out 0a1h,al
;        jmp $+2
;        jmp $+2
	 out 0edh,al
	;send ICW3
	mov al,00000100b	;IRQ2HASSLAVE
	out 21h,al
	mov al,00000010b	;
	out 0a1h,al
;        jmp $+2
;        jmp $+2
	 out 0edh,al
	;send ICW4
	mov al,1
	out 21h,al		;8086MODE
	out 0a1h,al
;        jmp $+2
;        jmp $+2
	 out 0edh,al
	;set mask
	mov al,-1		;no ints for now...
	out 21h,al
	out 0a1h,al
	ret

pic32_init:
	call setuppic
	lidt fword [pmlidt]
	mov al,[picmasklo]
	out 21h,al
	mov al,[picmaskhi]
	out 0a1h,al
	sti
	ret
