.MODEL SMALL .STACK 100H .DATA ;Begin van het datasegment. OUDEISR DW 0 ;Offset oude ISR-adres. DW 0 ;Segment oude ISR-adres. PATROON DB 1 ;Bitpatroon. .CODE ;Begin van het codesegment. MOV AX,@DATA MOV DS,AX ;Laat DS naar datasegment wijzen. MOV AX,350FH INT 21H ;DOS getIntVec voor INT 0F (IRQ7). MOV [OUDEISR],BX MOV [OUDEISR+2],ES PUSH DS ;DS tijdelijk bewaren op stapel. MOV DX,SEG ISR ;Nieuwe ISR-adres zetten. MOV DS,DX MOV DX,OFFSET ISR MOV AX,250FH ;DOS setIntVec voor INT 0F (IRQ7). INT 21H POP DS ;DS weer van stapel halen. MOV DX,03BEH IN AL,DX ;Lees LPT1C. OR AL,10H ;Set IRQ-enable-bit. OUT DX,AL IN AL,21H ;Lees PIC-mask-register. AND AL,7FH ;IRQ7 vrijgeven. OUT 21H,AL MOV DX,03BDH LUS: IN AL,DX ;Lees LPT1S. AND AL,08H JNE LUS ;Herhaal totdat I0 = 0. PUSH DS MOV DX,[OUDEISR] ;Oude ISR-adres terugzetten. MOV DS,[OUDEISR+2] MOV AX,250FH INT 21H ;DOS setIntVec voor INT 0F (IRQ7). POP DS MOV AH,4CH INT 21H ;Sluit het programma af en keer terug naar OS. ;Interrupt Service Routine voor IRQ7. ISR: PUSH AX ;Bewaar te gebruiken registers. PUSH DX PUSH DS MOV AL,67H OUT 20H,AL ;EOI IRQ7 naar PIC. MOV AX,@DATA MOV DS,AX ;Laat DS naar datasegment wijzen. MOV AL,[PATROON] MOV DX,03BCH OUT DX,AL ;Schrijf PATROON naar LPT1D. ROL AL,1 ;Rotate PATROON naar links. MOV [PATROON],AL POP DS POP DX POP AX ;Herstel de gebruikte registers. IRET END