📄 comm.asm
字号:
;This program for:Communication
;----------------------------------------------------------------
;define stack segment
STACK SEGMENT STACK 'STACK'
DB 500 DUP (0)
STACK ENDS
;define data segment
DATA SEGMENT
;--------------------------------------------------
TEMP1 DW (?)
TEMP2 DW (?)
TEMP3 DW (?)
TEMP4 DW (?)
;
LED1 DB (?)
LED2 DB (?)
LED3 DB (?)
LED4 DB (?)
LED5 DB (?)
LED6 DB (?)
;
BUFFER0 DB (?)
BUFFER1 DB (?)
BUFFER2 DB (?)
RE_COMM_BUFF DB (?)
SD_COMM_BUFF DB (?)
COUNT DB (?)
;------------------------------------
DATA ENDS
;------------------------------------
;define es segment
VIDEO SEGMENT AT 0B800H
WD_BUFFER LABEL WORD
V_BUFF DB 25*80*2 DUP (?)
VIDEO ENDS
;------------------------------------
;define code segment
PROGRAM SEGMENT
;
MAIN PROC FAR
ASSUME CS:PROGRAM,DS:DATA,SS:STACK,ES:VIDEO
;
START: PUSH DS ;return DOS standard program
MOV AX,0
PUSH AX
CALL INIT_COMM
MOV AX,DATA ;set DS
MOV DS,AX
MOV AX,VIDEO ;set ES
MOV ES,AX
MOV TEMP1,0000H ;clr screen
MOV TEMP2,184FH
MOV BH,0FH ;set background color
CALL CLR_SCREEN
;----------------------------------------------------------
SWAIT: MOV COUNT,10
SWAIT1: MOV AH,1
INT 16H
JZ YES_KEY
MOV AH,0
INT 16H
CMP AL,1BH ;TEST "ESC"
JNZ YES_KEY
JMP EXIT
YES_KEY:
CALL RE_COMM
MOV AL,RE_COMM_BUFF
MOV AH,0
CALL BCTD
MOV CH,AL
AND AL,0F0H
MOV CL,4
ROR AL,CL
ADD AL,30H
MOV LED2,AL
AND CH,0FH
ADD CH,30H
MOV LED3,CH
;
AND AH,0FH
ADD AH,30H
MOV LED1,AH
MOV AL,SD_COMM_BUFF
MOV AH,0
CALL BCTD
MOV CH,AL
AND AL,0F0H
MOV CL,4
ROR AL,CL
ADD AL,30H
MOV LED5,AL
AND CH,0FH
ADD CH,30H
MOV LED6,CH
;
AND AH,0FH
ADD AH,30H
MOV LED4,AH
;----------------------------------------------------
MOV BUFFER1,3
LEA BX,LED1
MOV CX,0E23H ;ROW=14 ,COL=35
MOV BUFFER0,1EH
SEND_LED:
MOV AL,[BX]
CALL DISPL
INC BX
INC CX
DEC BUFFER1
JNZ SEND_LED
MOV BUFFER1,3
LEA BX,LED4
MOV CX,0A23H ;ROW=10 ,COL=35
MOV BUFFER0,5FH
SEND_LED1:
MOV AL,[BX]
CALL DISPL
INC BX
INC CX
DEC BUFFER1
JNZ SEND_LED1
CALL DELAY
DEC COUNT
JNZ SWAIT2
JMP SWAIT1
SWAIT2: INC SD_COMM_BUFF
CALL SD_COMM
JMP SWAIT
EXIT:
RET
;------------------------------
MAIN ENDP
;********************************************************
DELAY PROC NEAR
MOV CX,10
MOV TEMP1,0
DELAY1: NOP
DEC TEMP1
JNZ DELAY1
LOOP DELAY1
RET
DELAY ENDP
;-------------------------------------------------------
BCTD PROC NEAR
;input=AX
;out=AX compress BCD code
MOV DX,AX
MOV AX,0
MOV CX,16
BCTD1: CLC
RCL DX,1
ADC AL,AL
DAA
XCHG AL,AH
ADC AL,AL
DAA
XCHG AL,AH
LOOP BCTD1
RET
BCTD ENDP
;-------------------------------------------------
;display a symbol
;input: symbol=al
; color=ah
; row=ch
; col=cl
;use reg:AX,BX,CX
DISPL PROC NEAR ;address of display
;buffer=row*80*2+col*2
PUSH BX
PUSH CX
PUSH AX
MOV AL,160
MUL CH ;ROW*80*2(160)=AX
MOV BL,CL
ROL BL,1 ;BL*2
MOV BH,0
ADD BX,AX
POP AX
MOV AH,BUFFER0
MOV ES:[BX],AX
POP CX
POP BX
RET
DISPL ENDP
;----------------------------------------
CLR_SCREEN PROC NEAR
MOV AH,06H
MOV CX,TEMP1
MOV DX,TEMP2
INT 10H
MOV AH,02H
MOV DH,24
MOV DL,80
MOV BH,0
INT 10H
RET
CLR_SCREEN ENDP
;---------------------------------------------------------
INIT_COMM PROC NEAR
MOV AL,10000000B
MOV DX,3FBH
OUT DX,AL
MOV AL,30H
MOV DX,3F8H
OUT DX,AL
MOV AL,0
MOV DX,3F9H
OUT DX,AL
MOV AL,00000011B
MOV DX,3FBH
OUT DX,AL
MOV AL,10001011B
MOV DX,3FCH
OUT DX,AL
RET
INIT_COMM ENDP
;-----------------------------------------------
RE_COMM PROC NEAR
PUSH AX
PUSH DX
MOV DX,3FDH
IN AL,DX
TEST AL,00000001B
JZ RE_COMM_EXIT
MOV DX,3F8H
IN AL,DX
MOV RE_COMM_BUFF,AL
;
RE_COMM_EXIT:
POP DX
POP AX
RET
RE_COMM ENDP
;----------------------------------------------
SD_COMM PROC NEAR
PUSH AX
PUSH DX
MOV AL,SD_COMM_BUFF
MOV DX,3F8H
OUT DX,AL
POP DX
POP AX
RET
SD_COMM ENDP
;--------------------------------------
PROGRAM ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -