⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s1aq20.asm

📁 声音采集源程序
💻 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 + -