📄 s1aq20.asm
字号:
;program title
name s1aq10
;EQU statement
INTE EQU 72H
INTEA EQU 20H
INTEB EQU 0A0H
INTE59A EQU 21H
INTE59B EQU 0A1H
INA1L EQU 340H
INA1H EQU 341H
INA2L EQU 342H
INA2H EQU 343H
OUTD1L EQU 344H
OUTD1H EQU 345H
OUTD2L EQU 346H
OUTD2H EQU 347H
NUM EQU 10240 ;OUTPUT POINT NUMBER
;---------define initialized data segment --------------
DGROUP group _DATA,_BSS
_DATA segment word PUBLIC 'DATA'
d@ label byte
d@w label word
_DATA ENDS
;---------define uninitialized data segment-------------
_BSS segment word PUBLIC 'BSS'
b@ label byte
b@w label word
extrn _offset1:word,_seg1:word
_BSS ENDS
;-----------define code segment -------------------
s1aq10_TEXT segment byte PUBLIC 'CODE'
assume cs:s1aq10_TEXT,DS:DGROUP
PUBLIC @s1aq10$qv
@s1aq10$qv proc FAR
CLI ;close interrupt
PUSH BP ;SAVE BP
MOV BP,SP ;SET BASE PARM LIST
PUSH DS
PUSH AX
PUSH DI
PUSH SI
PUSH BX
PUSH DX
PUSH CX
PUSH ES
PUSH SS
;*** SET IRQ10 INTER JMP ADDRESS ***
MOV AX,DGROUP
MOV DS,AX
PUSH DS
MOV AL,INTE ;type INTE interrupt
MOV AH,35h ;get interrupt vextor
INT 21h
PUSH ES ;save the old base and offset
PUSH BX ;of interrupt INTE
MOV DX,SEG INTER
MOV DS,DX
MOV DX,OFFSET INTER
MOV AL,INTE
MOV AH,25H
INT 21H
;*** OPEN IRQ10 INTER ***
IN AL,INTE59A ;READ IMR REGISTER
MOV Ah,11111011B
AND AL,AH
OUT INTE59A,AL
IN AL,INTE59B ;READ IMR REGISTER
MOV AH,11111011B
AND AL,AH
OUT INTE59B,AL
;*** RUN IRQ10 INTER ***
NOP
; modified
MOV AX,4000H
MOV DS,AX
;------------------------------
; MOV AX,seg _seg1
; MOV ES,AX
; MOV AX,ES:_seg1;
; MOV DS,AX ;transfer buf's seg address
; MOV AX,seg _offset1;
; MOV ES,AX
; MOV si,ES:_offset1 ;transfer buf's offset address
;-----------------------------------
MOV AX,0 ;interrupt restore
MOV DI,AX
MOV DX,34EH
OUT DX,AL
MOV DX,34FH
OUT DX,AL
MOV CX,NUM
STI ;make inte's flag=1 open interrupt
MAD:MOV AX,CX
AND AX,AX
JNZ MAD ;ZF=0
CLI ;close interrupt
;*** CLOSE IRQ10 INTER ***
IN AL,INTE59B
OR AL,00000100B
AND AL,11111111B
OUT INTE59B,AL
IN AL,INTE59A
OR AL,00000100B
AND AL,11111111B
OUT INTE59A,AL
;****************************
POP DX ;restore old interrupt vector of INTE
POP DS
MOV AL,INTE
MOV AH,25h
INT 21h
;--------------
POP DS
POP SS
POP ES
POP CX
POP DX
POP BX
POP SI
POP DI
POP AX
POP DS
POP BP ;RESTORE BP
RET
@s1aq10$qv endp
INTER PROC FAR
PUSH DS
MOV DX,INA1L ;340H 595L
IN AX,DX
MOV [SI],AX
INC SI
INC SI
MOV DX,INA2L ;342H 595H
IN AX,DX
MOV [SI],AX
INC SI
INC SI
MOV AX,0
MOV DX,34EH ;RESET INTERRUPT
OUT DX,AL
MOV AL,20H
OUT INTEB,AL ;END OF INTERRUPT
MOV AL,20H
OUT INTEA,AL ;END OF INTERRUPT
SUB CX,1
POP DS
IRET
INTER ENDP
s1aq10_TEXT ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -