📄 13_8237.asm
字号:
;//****************************************************************
;文件名: 8237 for 8088
;功能: 8237可编程DMA控制实验
;接线: 用导线连接8237模块的CS_8237到CPU模块的200H;
; 8237模块的DMAAEN、AEN互连;
; 用导线连接SRAM模块的CS_RAM到GND。
;//****************************************************************
CH0A EQU 200H ;通道0地址寄存器
CH0C EQU 201H ;通道0字节计数器
CH1A EQU 202H ;通道1地址寄存器
CH1C EQU 203H ;通道1字节计数器
COST EQU 208H ;状态寄存器/命令寄存器
REQ EQU 209H ;请求寄存器
MODE EQU 20BH ;模式寄存器
CLRF EQU 20CH ;先/后触发器
LACH EQU 20DH ;暂存器
MASK EQU 20FH ;多通道屏蔽寄存器
;==================================================
Z8279 EQU 239H
D8279 EQU 238H
LEDMOD EQU 00 ;左边输入,八位显示外部译码八位显示
LEDFEQ EQU 38H ;扫描频率
LEDCLS EQU 0C1H ;清除显示 RAM
;==================================================
DSEG SEGMENT
DIS_BUFFER0 DB ? ;显示缓冲0
DIS_BUFFER1 DB ? ;显示缓冲1
DIS_BUFFER2 DB ? ;显示缓冲2
DIS_BUFFER3 DB ? ;显示缓冲3
DIS_BUFFER4 DB ? ;显示缓冲4
DIS_BUFFER5 DB ? ;显示缓冲5
DIS_BUFFER6 DB ? ;显示缓冲6
DIS_BUFFER7 DB ? ;显示缓冲7
DSEG ENDS
CODE SEGMENT
ASSUME CS: CODE,DS:CODE
START:
PUSH CS
POP DS
CALL INIT8279 ;初始化8279
MOV AL,0
MOV DX,LACH ;发复位命令
OUT DX,AL
MOV DX,CLRF ;清先/后触发器
OUT DX,AL
CALL BUF1
CALL DISPLAY
;对DMAC(8237)的4个通道的基地址寄存器与当前地址寄存器、基字节数寄存器及当前字节数寄存器先写入FFFFH,
;再读出比较,看读写操作是否正确。若正确,再写入0000H,同样读出校验,若仍正确则认为DMAC工作正常,就开始对其初始化。
;若比较时发现有错,则执行停机指令
MOV AL,0F0H
TEST1:
MOV BL,AL
MOV BH,AL
MOV CX,08
MOV DX,CH0A
TEST2:
OUT DX,AL
PUSH AX
OUT DX,AL
NOP
NOP
IN AL,DX
MOV AH,AL
IN AL,DX
CMP BX,AX
JE TEST3
JMP ERR
TEST3:
INC DX
LOOP TEST2
INC AL
JZ TEST1
MOV SI,1000H ;源地址
MOV DI,2000H ;目标地址
MOV CX,07FFH ;字节数
MOV AL,0
MOV DX,LACH ;发复位命令
OUT DX,AL
MOV DX,CLRF ;清先/后触发器
OUT DX,AL
MOV DX,CH0A ;通道0基地址1000H
MOV AX,SI
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,CH1A ;通道1基地址2000H
MOV AX,DI
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AX,CX ;通道0传送字节数7FF+1
MOV DX,CH0C
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AX,CX ;通道1传送字节数7FF+1
MOV DX,CH1C
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AL,88H ;模式:通道0,数据块传送,地址增一,禁止自动预置,读传送
MOV DX,MODE
OUT DX,AL
MOV AL,85H ;模式:通道1,数据块传送,地址增一,禁止自动预置,写传送
MOV DX,MODE
OUT DX,AL
MOV AL,0 ;清除所有通道屏蔽位
MOV DX,MASK
OUT DX,AL
MOV AL,1 ;存储器到存储器传送
MOV DX,COST ;写命令寄存器
OUT DX,AL
MOV AL,04H ;请求存储器到存储器传送
MOV DX,REQ ;写请求寄存器
OUT DX,AL
MOV CX,8000H
LOOP $
CALL BUF2
CALL DISPLAY ;结束
OK: JMP OK
ERR: CALL BUF3 ;出错
CALL DISPLAY
ELP: JMP ELP
INIT8279: ;初始化8279
MOV DX,Z8279
MOV AL,LEDMOD
OUT DX,AL
MOV AL,LEDFEQ
OUT DX,AL
MOV AL,LEDCLS ;清除显示
OUT DX,AL
RET
;显示字符子程序
;输入: AH,位置 AL,值
DISLED:
PUSH AX
OR AH,80H ;加显示位置偏移量
PUSH AX
MOV AL,AH
MOV DX,Z8279
OUT DX,AL ;设定显示位置
POP AX
LEA BX,TABLE
XLAT ;查表取值
MOV DX,D8279
OUT DX,AL ;显示数据
POP AX
RET
DISPLAY:
MOV CX,8
MOV AH,0 ;显示位置
DLOOP: MOV AL,AH
LEA BX,DIS_BUFFER0
XLAT
CALL DISLED
INC AH
LOOP DLOOP
RET
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 40H,00H,6FH,5CH,5EH,50H ;'-, ,g,o,d,r
BUF1: MOV DIS_BUFFER7,8 ;8
MOV DIS_BUFFER6,2 ;2
MOV DIS_BUFFER5,3 ;3
MOV DIS_BUFFER4,7 ;7
MOV DIS_BUFFER3,16 ;-
MOV DIS_BUFFER2,16 ;-
MOV DIS_BUFFER1,17 ;
MOV DIS_BUFFER0,17 ;
RET
BUF2: MOV DIS_BUFFER3,18 ;g
MOV DIS_BUFFER2,19 ;o
MOV DIS_BUFFER1,19 ;o
MOV DIS_BUFFER0,20 ;d
RET
BUF3: MOV DIS_BUFFER3,17 ;
MOV DIS_BUFFER2,0EH ;E
MOV DIS_BUFFER1,21 ;r
MOV DIS_BUFFER0,21 ;r
RET
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -