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

📄 ad.asm

📁 D/A转换(DA)连线: 228-22F端口(数码管上方)->0832的CS(DMA键正上方)
💻 ASM
字号:
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
;*********************;
;*       0809        *;
;*********************;
 io_plx_device_id	equ 05406h	;TPC卡设备ID
 io_plx_vendor_id	equ 010b5h	;TPC卡厂商ID
 IO_PLX_SUB_ID		EQU 0905410B5H	;TPC卡子设备及厂商ID
ADDX1    EQU    220H-200H	;0809端口地址
ADDX2    EQU    221H-200H
ADDX3    EQU    222H-200H
SPACE    EQU    20H
ENTER_CR EQU    0DH
ENTER_LF EQU    0AH
DELAY_TIME      EQU     0001H
DELAY_X1_LOOPNO EQU     0000H
DELAY_NO        EQU     0FFFFH          ;DON'T  CHANGE
DISP_ADDXX_NO   EQU     0005H
;--------------------------------------
CRLF MACRO 
	MOV DL,0DH
	MOV AH,02H
	INT 21H
	MOV DL,0AH
	MOV AH,02H
	INT 21H
ENDM
;--------------------------------------
data segment
 io_base_address	db 4 DUP(0)	;TPC卡I/O基地址暂存空间
 pcicardnotfind		db 0dh,0ah,'TPC pci card not find or address/interrupt error !!!',0dh,0ah,'$'
 iobaseaddress		db 0dh,0ah,'TPC pci card I/O Base Address : ','$'
 enter_return		db 0dh,0ah,'$'
 DISP_BUFFER     DB(00)
data ends
stacks segment
 db 100 dup (?)
 STA      DW        512 DUP (?)
stacks ends
code segment
        assume cs:code,ds:data,ss:stacks,es:data
start:
.386
        cli
        mov ax,data
        mov ds,ax
        mov es,ax
        mov ax,stacks
        mov ss,ax
	call	findtpc		;查找TPC卡资源并显示
START1:
	MOV  DX,word ptr io_base_address
	add  dx,ADDX1
	CALL   DISP_ADDXX_NUM  ;DISP ADDX1
	MOV  DX,word ptr io_base_address
	add  dx,ADDX2
	CALL   DISP_ADDXX_NUM  ;DISP ADDX2
	MOV  DX,word ptr io_base_address
	add  dx,ADDX3
	CALL   DISP_ADDXX_NUM  ;DISP ADDX3

	CALL   DISP_ENTER
	MOV    AH,01           
	INT    16H
	JZ     START1          ;COUNTION

	MOV       AH,4CH
	INT       21H          ;EXIT

DISP_ADDXX_NUM PROC NEAR
	 MOV    CL,DISP_ADDXX_NO
DISP:    OUT    DX,AL

;        CALL   DELAY_X         ;DELAY MODE1
;        CALL   DELAY_X1        ;DELAY MODE2

	 PUSH   CX
	 MOV    CX,DELAY_NO     ;DELAY MODE3
LOOP1:   NOP       
	 DEC    CX
	 JNZ    LOOP1
	 POP    CX

	 IN     AL,DX
	 MOV    BL,AL
	 CALL   DISP_ADDXX      ;DISP ADDXX
	 DEC    CL
	 JNZ    DISP
	 MOV    AL,0
	 RET
DISP_ADDXX_NUM ENDP

DISP_ADDXX PROC NEAR            ;DISP BL'S ASCII TO SCREEN
	 PUSH   AX
	 PUSH   BX
	 PUSH   CX
	 PUSH   DX
	 MOV    AL,BL
	 MOV    CL,04
	 SHR    AL,CL
	 CALL   DISP_CHAR
	 MOV    AL,BL
	 AND    AL,0FH
	 CALL   DISP_CHAR
	 CALL   DISP_SPACE
	 CALL   DISP_SPACE
	 POP    DX
	 POP    CX
	 POP    BX
	 POP    AX
	 RET
DISP_ADDXX ENDP

DISP_CHAR PROC NEAR             ;DISP AL'S CHAR TO SCREEN
	 PUSH   AX
	 PUSH   DX
	 MOV    DL,AL
	 CMP    DL,09
	 JLE    NUM
	 ADD    DL,07H
NUM:     ADD    DL,30H
	 CALL   DISP_X
	 POP    DX
	 POP    AX
	 RET
DISP_CHAR ENDP

DISP_SPACE PROC NEAR
	 PUSH   DX
	 MOV    DL,SPACE
	 CALL   DISP_X
	 POP    DX
	 RET
DISP_SPACE ENDP

DISP_ENTER PROC NEAR
	 PUSH   DX
	 MOV    DL,ENTER_CR
	 CALL   DISP_X
	 MOV    DL,ENTER_LF
	 CALL   DISP_X
	 POP    DX
	 RET
DISP_ENTER ENDP

DISP_X  PROC NEAR               ;DISP DL'S ASCII TO SCREEN
	 PUSH   AX
	 MOV    AH,02
	 INT    21H
	 POP    AX
	 RET
DISP_X  ENDP

DELAY_X1 PROC NEAR
	PUSH    CX
	POP     CX
DELAY_X1 ENDP

DELAY_X PROC NEAR
	PUSH BX
	MOV BX,DELAY_TIME
	CALL DELAY
	POP BX
	RET
DELAY_X ENDP

delay  proc near                ;delay time in bh,bl
	push ax
	push bx
	push cx
	push dx
	mov ah,2ch              ;bh is Seciend
	int 21h                 ;bl is persent Seciend
	add bx,dx               ;PG use  AX,BX,CX,DX
	cmp bl,100
	jle sec
	sub bl,100
	inc bh
sec:    cmp bh,60
	jle beg
	sub bh,60
beg:    int 21h
	cmp dx,bx
	jle beg
	pop dx
	pop cx
	pop bx
	pop ax
	ret
delay  endp

findtpc proc near		;查找TPC卡资源并显示
	pushad
	pushfd
	MOV	AX,0B101H
	INT	1AH
	JC	findtpc_notfind		;检查PCI BIOS是否存在

	MOV	AX,0B102H
	MOV	CX,io_plx_device_id
	MOV	DX,io_plx_vendor_id
	MOV	SI,0
	INT	1AH
	JC	findtpc_notfind		;检查TPC卡是否安装,设备号、厂商号

	MOV	AX,0B10AH
	MOV	DI,02CH
	INT	1AH
	JC	findtpc_notfind
	CMP	ECX,IO_PLX_SUB_ID
	JNZ	findtpc_notfind		;检查TPC卡是否安装,子设备号、厂商号

	MOV	AX,0B10AH
	MOV	DI,18H
	INT	1AH
	JC	findtpc_notfind		;读TPC卡I/O基址信息
	mov	dword ptr io_base_address,ecx
	and	ecx,1
	jz	findtpc_notfind		;检查是否为i/o基址信息
	mov	ecx,dword ptr io_base_address
	and	ecx,0fffffffeh
	mov	dword ptr io_base_address,ecx	;去除i/o指示位并保存

	mov	dx,offset iobaseaddress		;显示i/o提示信息
	mov	ah,09h
	int	21h
	mov	ax,word ptr io_base_address
	call	dispword			;显示i/o基地址

	mov	dx,offset enter_return		;加回车符,换行符
	mov	ah,09h
	int	21h
	popfd
	popad
	ret
findtpc_notfind:
	mov dx,offset pcicardnotfind		;显示未找到tpc卡提示信息
	mov ah,09h
	int 21h
	mov ax,4c00h
	int 21h		;退出
findtpc endp

dispword proc near		;显示子程序
	push dx
	push cx
	push bx
	mov cx,4
	mov bx,16
dispword_loop1:
	push ax
	push cx
	sub bx,4
	mov cx,bx
	shr ax,cl
	and al,0fh	;首先取低四位
	mov dl,al
	cmp dl,9	;判断是否<=9
	jle dispword_num		;若是则为'0'-'9',ASCII码加30H
	add dl,7	;否则为'A'-'F',ASCII码加37H
dispword_num:
	add dl,30h
	mov ah,02h	;显示
	int 21h
	pop cx
	pop ax
	loop dispword_loop1
	pop bx
	pop cx
	pop dx
	ret		;子程序返回
dispword endp
code ends
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -