PAGE 56,132 ; ; NETWORK INTERRUPT ROUTINES ; INCLUDE ENVIRON.ASM INCLUDE STRUCS.ASM DELAY MACRO JMP $+2 JMP $+2 JMP $+2 JMP $+2 ENDM IFDEF PCSWITCH DATA SEGMENT PUBLIC 'DATA' DW 128 DUP (0) INTSTACK LABEL WORD DATA ENDS INITSEG SEGMENT PUBLIC 'INITSEG' PUBLIC HOOKINT,CLEARINTS ASSUME CS:INITSEG,DS:DATA,ES:DATA INTROUTINES DW INT2 DW INT3 DW INT4 DW INT5 DW INT6 DW INT7 DW INT8 DW INT9 DW INT10 DW INT11 DW INT12 DW INT13 DW INT14 DW INT15 HOOKINT: ; ; ATTACH PROCESS ; ; PORT CONTROL TABLE IN BX, LEVEL NUMBER IN INTLEVEL[BX] ; PUSH ES MOV AX,CODE MOV ES,AX ASSUME ES:CODE MOV AL,INTLEVEL[BX] CBW SUB AX,2 ADD AX,AX MOV DI,OFFSET INT2PORTBASE ADD DI,AX ; ; SEE IF LEVEL ALREADY IN USE ; CMP WORD PTR ES:[DI],0 JE NOTINUSE ; ; LEVEL IN USE - CHAIN THIS PORT ENTRY TO FIRST ; MOV DI,ES:[DI] ; GET FIRST PORT ENTRY FINDENDOFCHAIN: CMP INTCHAIN[DI],0 JE ENDOFCHAIN MOV DI,INTCHAIN[DI] JMP FINDENDOFCHAIN ENDOFCHAIN: MOV INTCHAIN[DI],BX POP ES RET NOTINUSE: MOV WORD PTR ES:[DI],BX ; SAVE PORT CONTROL ADDRESS MOV AL,INTLEVEL[BX] CBW SUB AX,2 ADD AX,AX MOV DI,OFFSET INTROUTINES ADD DI,AX ; MOV DX,CS:[DI] ; GET ADDR OF INTERRUPT ROUTINE ; ; SET INTERRUPT VECTOR ; MOV AL,INTLEVEL[BX] ADD AL,8 ; BASE 8259 ADDR CMP AL,15 JBE INTOK ADD AL,60H ; TO 70-77 INTOK: PUSH DS ; MOV CX,SEG CODE MOV DS,CX ; MOV AH,25H INT 21H ; SET VECTOR POP DS CMP INTLEVEL[BX],8 JB PIC1 ; ; USES PIC 2 ; IN AL,0A1H ; GET MASK DELAY MOV AH,0FEH MOV CL,INTLEVEL[BX] SUB CL,8 ROL AH,CL AND AL,AH ; UNMASK LEVEL OUT 0A1H,AL DELAY MOV AL,58H ADD AL,INTLEVEL[BX] OUT 0A0H,AL ; SEND SPECIFIC EOI ; POP ES RET ; PIC1: IN AL,21H ; GET MASK DELAY MOV AH,0FEH MOV CL,INTLEVEL[BX] ROL AH,CL AND AL,AH ; UNMASK LEVEL OUT 21H,AL DELAY MOV AL,60H OR AL,INTLEVEL[BX] OUT 20H,AL ; SEND SPECIFIC EOI ; POP ES RET ; INITSEG ENDS CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:DATA EXTRN DATASEG:WORD EVEN ; SAVESTACKSEG DW 0 SAVESTACKPTR DW 0 ; INT2PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 2 INT3PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 3 INT4PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 4 INT5PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 5 INT6PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 6 INT7PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 7 INT8PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 8 INT9PORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 9 INTAPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 10 INTBPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 11 INTCPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 12 INTDPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 13 INTEPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 14 INTFPORTBASE DW 0 ; PORT CONTROL TABLE ENTRY FOR INT 15 INT2HAPPENED DB 1 ; INTERRUPT HAPPENED RECENTLY FLAG INT3HAPPENED DB 1 INT4HAPPENED DB 1 INT5HAPPENED DB 1 INT6HAPPENED DB 1 INT7HAPPENED DB 1 INT8HAPPENED DB 1 ; INTERRUPT HAPPENED RECENTLY FLAG INT9HAPPENED DB 1 INTAHAPPENED DB 1 INTBHAPPENED DB 1 INTCHAPPENED DB 1 INTDHAPPENED DB 1 INTEHAPPENED DB 1 INTFHAPPENED DB 1 INT2: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT2HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT2PORTBASE JMP SHORT DOINT INT3: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT3HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT3PORTBASE JMP SHORT DOINT INT4: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT4HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT4PORTBASE JMP SHORT DOINT INT5: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT5HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT5PORTBASE JMP SHORT DOINT INT6: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT6HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT6PORTBASE JMP SHORT DOINT INT7: ; ENTERED FROM HARDWARE INTERRUPT ; MOV CS:INT7HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT7PORTBASE DOINT: ; ; save stack ; MOV CS:SAVESTACKSEG,SS MOV CS:SAVESTACKPTR,SP ; MOV SP,CS:DATASEG MOV SS,SP MOV SP,OFFSET INTSTACK ; CLD PUSH AX PUSH ES PUSH DS PUSH SI PUSH DI PUSH BP PUSH CX PUSH DX ; MOV AX,CS:DATASEG MOV DS,AX ; SET UP DATA SEGMENT MOV ES,AX PUSH BX CALL PORTINTERRUPT[BX] POP BX ; ; IF SHARED INTERRUPT, CALL OTHERS, THEN LOOP BACK AND CALL ; THEM ALL AGAIN ; CMP INTCHAIN[BX],0 JE ENDINT ; NOT SHARED PUSH BX MOV BX,INTCHAIN[BX] DOINTLOOP: PUSH BX CALL PORTINTERRUPT[BX] POP BX ; ; DO ANY MORE ON SAME LEVEL ; SHARED: MOV BX,INTCHAIN[BX] OR BX,BX JNZ DOINTLOOP POP BX ; PUSH BX ; ; DO THEM ALL AGAIN ; DOINTLOOP1: PUSH BX CALL PORTINTERRUPT[BX] POP BX ; ; DO ANY MORE ON SAME LEVEL ; MOV BX,INTCHAIN[BX] OR BX,BX JNZ DOINTLOOP1 POP BX ENDINT: MOV AL,INTLEVEL[BX] POP DX POP CX POP BP POP DI POP SI POP DS POP ES ; CLI CMP AL,8 JB EOI20 ; ; SECOND CONTROLLER ; MOV AL,20H ; EOI OUT 0A0H,AL ; SEND TO SECOND 8259 EOI20: MOV AL,20H ; EOI OUT 20H,AL ; SEND TO FIRST 8259 ; EOIX: POP AX ; ; RESTORE OLD STACK ; MOV SS,CS:SAVESTACKSEG MOV SP,CS:SAVESTACKPTR ; POP BX IRET ; INT8: MOV CS:INT8HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT8PORTBASE JMP DOINT INT9: MOV CS:INT9HAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INT9PORTBASE JMP DOINT INT10: MOV CS:INTAHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTAPORTBASE JMP DOINT INT11: MOV CS:INTBHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTBPORTBASE JMP DOINT INT12: MOV CS:INTCHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTCPORTBASE JMP DOINT INT13: MOV CS:INTDHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTDPORTBASE JMP DOINT INT14: MOV CS:INTEHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTEPORTBASE JMP DOINT INT15: MOV CS:INTFHAPPENED,18 ; INDICATE HAD AN INTERRUPT RECENTLY PUSH BX MOV BX,CS:INTFPORTBASE JMP DOINT CLEARINTS: ; ; CALL INT ROUTINE FOR EACH LEVEL IN USE ; PUSH ES MOV AX,CODE MOV ES,AX ASSUME ES:CODE CMP WORD PTR ES:INT2PORTBASE,0 JE NOINT2 DEC ES:INT2HAPPENED JNZ NOINT2 INT 10 NOINT2: CMP WORD PTR ES:INT3PORTBASE,0 JE NOINT3 DEC ES:INT3HAPPENED JNZ NOINT3 INT 11 NOINT3: CMP WORD PTR ES:INT4PORTBASE,0 JE NOINT4 DEC ES:INT4HAPPENED JNZ NOINT4 INT 12 NOINT4: CMP WORD PTR ES:INT5PORTBASE,0 JE NOINT5 DEC ES:INT5HAPPENED JNZ NOINT5 ; INT 13 NOINT5: CMP WORD PTR ES:INT7PORTBASE,0 JE NOINT7 DEC ES:INT7HAPPENED JNZ NOINT7 INT 15 NOINT7: if 0 CMP WORD PTR ES:INT8PORTBASE,0 JE NOINT8 DEC ES:INT8HAPPENED JNZ NOINT8 INT 70H NOINT8: CMP WORD PTR ES:INT9PORTBASE,0 JE NOINT9 DEC ES:INT9HAPPENED JNZ NOINT9 INT 71H NOINT9: CMP WORD PTR ES:INTAPORTBASE,0 JE NOINTA DEC ES:INTAHAPPENED JNZ NOINTA INT 72H NOINTA: CMP WORD PTR ES:INTBPORTBASE,0 JE NOINTB DEC ES:INTBHAPPENED JNZ NOINTB INT 73 NOINTB: CMP WORD PTR ES:INTCPORTBASE,0 JE NOINTC DEC ES:INTCHAPPENED JNZ NOINTC INT 74H NOINTC: CMP WORD PTR ES:INTDPORTBASE,0 JE NOINTD DEC ES:INTDHAPPENED JNZ NOINTD INT 75H NOINTD: CMP WORD PTR ES:INTEPORTBASE,0 JE NOINTE DEC ES:INTEHAPPENED JNZ NOINTE INT 76H NOINTE: CMP WORD PTR ES:INTFPORTBASE,0 JE NOINTF DEC ES:INTFHAPPENED JNZ NOINTF INT 77H NOINTF: endif POP ES RETF ENDIF IFDEF MSC .186 INCLUDE MSCEQU.ASM DATA SEGMENT PUBLIC 'DATA' SCC0PORT DW 0 SCC2PORT DW 0 EXTRN RAN4:BYTE DATA ENDS CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:DATA PUBLIC HOOKINT,SCC0INT,SCC2INT HOOKINT: ; ; ATTACH PROCESS ; ; PORT CONTROL TABLE IN BX, LEVEL NUMBER IN INTLEVEL[BX] ; CMP IOBASE[BX],0 JE ISCC0 ; ; MUST BE SCC 2 ; MOV DI,OFFSET SCC2PORT mov dx,INT1_CTRL mov ax,INT1_INIT out dx,ax ; SET UP LEVEL JMP ISCC2 ISCC0: MOV DI,OFFSET SCC0PORT mov dx,INT0_CTRL mov ax,INT0_INIT out dx,ax ISCC2: CMP WORD PTR [DI],0 JE NOTINUSE ; ; LEVEL IN USE - CHAIN THIS PORT ENTRY TO FIRST ; MOV DI,[DI] ; GET FIRST PORT ENTRY FINDENDOFCHAIN: CMP INTCHAIN[DI],0 JE ENDOFCHAIN MOV DI,INTCHAIN[DI] JMP FINDENDOFCHAIN ENDOFCHAIN: MOV INTCHAIN[DI],BX RET NOTINUSE: MOV WORD PTR [DI],BX ; SAVE PORT CONTROL ADDRESS RET ; SCC0INT: ; ENTERED FROM HARDWARE INTERRUPT ; PUSHA MOV BX,SCC0PORT JMP SHORT DOINT SCC2INT: PUSHA MOV BX,SCC2PORT DOINT: ; CALL PORTINTERRUPT[BX] ; CLI MOV DX,INT_EOI MOV AX,8000H OUT DX,AX ; SEND EOI TO CONTROLLER INC RAN4 POPA IRET ; ENDIF CODE ENDS END