?? l73.asm
字號:
DATA SEGMENT
BUF DB 100 DUP(?)
MUS DB 100 DUP(?)
PICT DB 100 DUP(?)
MES1 DB 0DH,0AH,'You have send a string!',0DH,0AH
LEN1 EQU $-MES1
MES2 DB 0DH,0AH,'A string has been received!',0DH,0AH
LEN2 EQU $-MES2
MARK DB 00H
VAR DB 00H
DATA ENDS
STACK SEGMENT STACK
STA DB 50 DUP(?)
TOP DW $
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,STACK
MOV SS,AX
MOV SP,TOP
MOV AX,CS
MOV DS,AX
LEA DX,INT7 ;設置中斷向量
MOV AX,250FH
INT 21H
CLI
IN AL,21H
AND AL,7FH ;解除IRQ7的屏蔽
OUT 21H,AL
MOV AX,DATA
MOV DS,AX
MOV DX,2B9H ;設置8251
MOV AL,0
OUT DX,AL
OUT DX,AL
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,4EH
OUT DX,AL
MOV AL,27H
OUT DX,AL
MOV AL,14H ;設置8253
MOV DX,283H
OUT DX,AL
MOV AL,52
MOV DX,280H
OUT DX,AL
N:
MOV MARK,00H
MOV BP, OFFSET BUF
MOV SI,0
MOV BH,0
L1:
CMP BH,0 ;BH為0且未啟動發送時,程序在L1與L3間來回跳轉,處于查詢狀態
JE L3
L2:
CMP BH,2
JNE L2
CMP MARK,1
JNZ NEXT1
CALL DRAW ;接收到圖片,調用顯示函數
JMP N
NEXT1:
CMP MARK,2 ;接到音樂,調用播放函數
JNZ NEXT2
CALL PLAY
JMP N
NEXT2:
LEA SI,MES2 ;接收完畢,輸出已收到信息,并顯示接收內容
MOV CX,LEN2
MOV AH,0EH
DISP2:
LODSB
INT 10H
LOOP DISP2
JMP N
L3:
MOV AH,1
INT 16H
JZ L1
MOV AH,0 ;有鍵按下,ESC跳出,回車發送,否則記錄下來接著查詢
INT 16H
CMP AL,1BH
JE EXIT
CMP AL,'*' ;文件發送標志
JNZ DATASEND
CALL JUDGE
DATASEND:
MOV AH,0EH
INT 10H
MOV [BP+SI],AL
INC SI
CMP AL,0DH ;如果是回車則需要發送
JNE L3
MOV AL,0DH
MOV AH,0EH
INT 10H
MOV AL,0AH
MOV AH,0EH
INT 10H
MOV BX,SI
MOV SI,0
CALL DATA_SEND
MOV AX,DATA
MOV DS,AX
LEA SI,MES1
MOV CX,LEN1
MOV AH,0EH
DISP1:
LODSB
INT 10H
LOOP DISP1
JMP N
EXIT:
IN AL,21H
OR AL,80H
OUT 21H,AL
MOV AH,4CH
INT 21H
INT7 PROC FAR ;中斷接收程序也與自發自收類似,不同的是用BH來判斷是否
;什么都沒有收到(發送方發了空行),并用BH給發送者以反饋
PUSH AX
PUSH DX
MOV DX,2B8H
IN AL,DX
CMP BH,0
JNE M
MOV BH,1
MOV AH,0
MOV SI,AX
JMP FINISHED
M:
CMP MARK,AL
MOV AH,0EH
INT 10H
DEC SI
CMP SI,0
JNE FINISHED
MOV BH,2
FINISHED:
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
INT7 ENDP
JUDGE PROC NEAR
MOV AH,0EH
INT 10H
LL1:
MOV AH,1
INT 16H
JZ LL1
CMP AL,1BH
JE EXIT2
MOV VAR,AL
MOV AL,VAR-48
MOV MARK,AL
RET
EXIT2:
IN AL,21H
OR AL,80H
OUT 21H,AL
MOV AH,4CH
INT 21H
JUDGE ENDP
DATA_SEND PROC NEAR
CMP MARK,0
JZ SEND0
CMP MARK,1
JNZ MUSIC
MOV BP,OFFSET PICT
JMP SEND0
MUSIC:
MOV BP,OFFSET MUS
SEND0:
MOV DX,2B9H ;發送模塊用B是否等于SI來判斷是否發送結束
IN AL,DX
TEST AL,1
JZ SEND0
MOV AL,MARK ;標記位
MOV DX,2B8H
OUT DX,AL
SEND1:
MOV DX,2B9H
IN AL,DX
TEST AL,1
JZ SEND1
MOV AL,BL ;BL中是數據長度
MOV DX,2B8H
OUT DX,AL
SEND2:
MOV DX,2B9H
IN AL,DX
TEST AL,1
JZ SEND2
MOV AL,[BP+SI] ;發送數據內容
MOV DX,2B8H
OUT DX,AL
INC SI
CMP SI,BX
JNE SEND2
RET
DATA_SEND ENDP
DRAW PROC NEAR
RET
DRAW ENDP
PLAY PROC NEAR
RET
PLAY ENDP
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -