📄 da.asm
字号:
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
;*********************;
;* 0832 *;
;*********************;
io_plx_device_id equ 05406h ;TPC卡设备ID
io_plx_vendor_id equ 010b5h ;TPC卡厂商ID
IO_PLX_SUB_ID EQU 0905410B5H ;TPC卡子设备及厂商ID
DA EQU 228H-200H ;0832端口地址
;--------------------------------------
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,'$'
MESS1 DB 'START D/A--1,press any key to next step !',0DH,0AH,'$'
MESS2 DB 'START D/A--2,press any key to next step !',0DH,0AH,'$'
MESS3 DB 'START D/A--3,press any key to end !',0DH,0AH,'$'
SINBUF DB 128,88,53,24,6,0,6,24,53,88,128,168,203,232
DB 250,255,250,232,203,168
data ends
stacks segment
db 100 dup (?)
STA DB 20 DUP(?)
TOP EQU LENGTH STA
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卡资源并显示
MOV AX,TOP
MOV SP,AX
MOV DX,OFFSET MESS1
MOV AH,09H
INT 21H
A1:
MOV CX,0FFH
MOV DX,word ptr io_base_address
add dx,DA
MOV AL,00H
BBB:
OUT DX,AL
INC DX
OUT DX,AL
DEC DX
ADD AL,10H
CMP AL,00H
JNZ BBB
LOOP BBB
sti
MOV AH,01H
INT 16H
jz a1
mov ah,00h
int 16h
CRLF
MOV DX,OFFSET MESS2
MOV AH,09H
INT 21H
DDD:
MOV CX,0FFH
MOV DX,word ptr io_base_address
add dx,DA
MOV AL,00H
EEE:
OUT DX,AL
INC DX
OUT DX,AL
DEC DX
ADD AL,10H
CMP AL,0F0H
JNZ EEE
FFF:
OUT DX,AL
INC DX
OUT DX,AL
DEC DX
SUB AL,10H
CMP AL,00H
JNZ FFF
LOOP EEE
sti
MOV AH,01H
INT 16H
jz ddd
mov ah,00h
int 16h
CRLF
MOV DX,OFFSET MESS3
MOV AH,09H
INT 21H
GGG:
MOV CX,0FFH
MOV DX,word ptr io_base_address
add dx,DA
HHH:
MOV SI,OFFSET SINBUF
MOV BL,20
III:
MOV AL,[SI]
OUT DX,AL
INC DX
OUT DX,AL
DEC DX
INC SI
DEC BL
JNZ III
LOOP HHH
sti
MOV AH,01H
INT 16H
jz ggg
mov ah,00h
int 16h
mov ax,4c00h
int 21h ;退出
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 + -