天天看點

南郵彙編實驗2——序列槽測試南郵彙編實驗2——序列槽測試

南郵彙編實驗2——序列槽測試

序列槽測試,實作電腦的自發自收。

發送用查詢方式,接收用中斷方式。

.586
DATA        SEGMENT     USE16
OLD0C       DD          ?                  ;存放中斷向量
FLAG        DB          0                  ;結束
DATA        ENDS
CODE        SEGMENT     USE16
            ASSUME      CS:CODE,DS:DATA
BEG:        MOV         AX,DATA
            MOV         DS,AX
            CLI                            ;關中斷
            CALL        I8250              ;8250初始化
            CALL        I8259              ;開放 設定的屏蔽字
            CALL        RD0C
            CALL        WR0C
            STI                            ;開中斷
SCANT:      CMP         FLAG,-1            ;判斷結束
            JE          RETURN
            MOV         DX,2FDH            ;狀态端口,查詢狀态
            IN          AL,DX
            TEST        AL,20H             ;判斷8250有沒有準備好
            JZ          SCANT
            MOV         AH,1               ;查詢鍵盤緩沖區
            INT         16H                ;bios功能
            JZ          SCANT
            MOV         AH,0               ;讀取
            INT         16H                ;bios功能
            AND         AL,7FH             ;後7位
            MOV         DX,2F8H            ;資料端口
            OUT         DX,AL
            CMP         AL,1BH             ;判斷esc
            JNE         SCANT
TWAIT:      MOV         DX,2FDH
            IN          AL,DX
            TEST        AL,40H             ;測試一幀資料是否發送完
            JZ          TWAIT
RETURN:     CALL        RESET
            MOV         AH,4CH
            INT         21H
            
RECEIVE     PROC
            PUSH        AX					;保護現場
            PUSH        DX
            PUSH        DS
            MOV         AX,DATA
            MOV         DS,AX
            MOV         DX,2F8H				;接收資料緩沖寄存器
            IN          AL,DX               ;讀取
            AND         AL,7FH              ;最高位置0
            CMP         AL,1BH
            JE          NEXT                ;FLAG=-1
            MOV         AH,2                ;顯示字元
            MOV         DL,AL
            INT         21H
            JMP         EXIT
NEXT:       MOV         FLAG,-1
EXIT:       MOV         AL,20H              ;向主8259發送結束
            OUT         20H,AL
            POP         DS
            POP         DX
            POP         AX
            IRET
RECEIVE     ENDP

I8250       PROC						;8250初始化
            MOV         DX,2F8H
            MOV         AL,80H
            OUT         DX,AL
            MOV         DX,2F9H
            MOV         AL,0
            OUT         DX,AL
            MOV         DX,2F8H
            MOV         AL,60H
            OUT         DX,AL
            MOV         DX,2F8H
            MOV         AL,03H
            OUT         DX,AL
            MOV         DX,2F9H
            MOV         AL,01H
            OUT         DX,AL
            MOV         DX,2FCH
            MOV         AL,08H
            OUT         DX,AL
            RET
I8250       ENDP

I8259       PROC
            IN          AL,21H
            AND         AL,11110111B     ;IR3開放,全0則全開放
            OUT         21H,AL
            RET                          ;結束
I8259       ENDP

RD0C        PROC
            MOV         AX,350BH          ;輔序列槽0B,主序列槽0C
            INT         21H
            MOV         WORD PTR OLD0C,BX		;ES:BX中斷程式位址
            MOV         WORD PTR OLD0C+2,ES
            
            RET
RD0C        ENDP

WR0C        PROC
            PUSH        DS
            MOV         AX,CODE
            MOV         DS,AX			;段基址
            MOV         DX,OFFSET RECEIVE	;偏移位址
            MOV         AX,250BH		;25H功能号,0BH終端類型号
            INT         21H
            POP         DS
            RET
WR0C        ENDP

RESET       PROC
            IN          AL,21H
            OR          AL,00001000B	;IR3端口開放
            OUT         21H,AL
            MOV         AX,250BH        ;25H功能号,0BH終端類型号
            MOV         DX,WORD PTR OLD0C  		;DX偏移位址
            MOV         DS,WORD PTR OLD0C+2		;DS段基址
            INT         21H
            RET
RESET       ENDP
CODE        ENDS
            END         BEG