|

楼主 |
发表于 2005-1-11 19:30:50
|
显示全部楼层
今天在整理旧资料,发现以前编写了一个windows下的串口通讯程序minicom,我想就发出来大家参考一下吧,虽然事隔已久,而且是windows版本,但姑且看看它的原理吧。
使用IBMx86汇编语言编写,实现的功能是串口的聊天通讯,工作在全双工非阻塞模式,可以使用特殊控制字符来清屏、退出,扩展性较好。
- TITLE Serial HyperCom v0.01 (EXE)
- ;Written by home_king
- ;home_king@163.com
- ;Macro to receive/send byte through COM1 port series.
- MOUTB MACRO OADDR, OBYTE
- MOV DX, OADDR
- MOV AL, OBYTE
- OUT DX, AL
- ENDM
-
- MINB MACRO IADDR
- MOV DX, IADDR
- IN AL, DX
- ENDM
-
- ;Macro to do comparison between two strings.
- CMPSTR MACRO STR_LEN, STR1, STR2
- MOV CX, STR_LEN
- LEA DI, STR1
- LEA SI, STR2
- REPE CMPSB
- ENDM
- ;Macro to clear the specified region of the screen.
- CLRSCR MACRO CLRROWS, STARTROW, STARTCOL, ENDROW, ENDCOL, ATTRIB
- MOV AH, 06H
- MOV AL, CLRROWS
- MOV BH, ATTRIB
- MOV CH, STARTROW
- MOV CL, STARTCOL
- MOV DH, ENDROW
- MOV DL, ENDCOL
- INT 10H
- ENDM
- ;Macro for COM1 Initialization
- COMINIT MACRO
- ;set baud rate 2400
- ;Enable set Baud rate
- MOUTB COMBASEADDR+3, 10000000B
- MOUTB COMBASEADDR, 30H
- ;enable receive interrupt
- MOUTB COMBASEADDR+1, 00000001B
- ;8 data bits, 1 stop bit, no Parity check
- MOUTB COMBASEADDR+3, 00000011B
- ENDM
- ;Macro to locate cursor.
- LOCATECURSOR MACRO CURSORROW, CURSORCOL
- MOV AH, 02H
- MOV BH, 00
- MOV DH, CURSORROW
- MOV DL, CURSORCOL
- INT 10H
- ENDM
-
- MSHOWSTR MACRO ATTRIB, STRLEN, SHOWROW
- MOV AH, 13H
- MOV AL, 01
- MOV BH, 00
- MOV BL, ATTRIB
- MOV CX, STRLEN
- MOV DH, SHOWROW
- MOV DL, 01
- INT 10H
- ENDM
-
- SHOWPROMPT MACRO PROMPT, CURSORROW
- LEA BP, PROMPT
- CALL GETLEN
- MSHOWSTR 6AH, STRLEN, CURSORROW
- ENDM
- ;------------------------------------------
- .MODEL SMALL
- .STACK 64
- ;------------------------------------------
- .DATA
- ;Buffer Chars
- ;used to flag
- BUFCHAR EQU '$'
- ENDCHAR EQU '#'
- ;Key Defination
- KRETURN EQU 0DH
- KBACK EQU 08H
- KBLANK EQU 00H
- KTAB EQU 09H
- ;Buffer Defination
- MAXLEN EQU 78
- INPUTBUF DB MAXLEN dup(BUFCHAR)
- REVBUF DB MAXLEN+1 dup(BUFCHAR)
- ;Cursor Location Trace
- CURSORROW DB 23
- CURSORCOL DB 00
- SHOWROW DB SHOWTOP-1
- SHOWTOP EQU 05
- SHOWEDGE EQU 19
- ;COM1 I/O port.
- COMBASEADDR EQU 03F8H
- ;Color Attribute
- ATTRIB DB ?
- REVATTRIB EQU 84H
- KEYATTRIB EQU 8AH
- INPUTATTRIB EQU 6FH
- SHOWBACKGROUND EQU 80H
- ;Flag Variable
- COMMONFLAG DB 00
- ;Variable to store the length of a string
- STRLEN DW ?
- CHARREG DB ?
- ENDPOS DW ?
- ;Miscellaneous variables
- BANNER DB '***HyperCom v0.01*** (home_king@163.com)','$'
- PROMPT DB '[*HyperCom@SCAU*]:','$'
- PROMPTLEN DW ?
- ;Special Key Function
- STRQUIT db '/q'
- STRRESET db '/r'
- ;------------------------------------------
- .386
- .CODE
- START PROC FAR
- MOV AX, @data
- MOV DS, AX
- MOV ES, AX
-
- ;clear the screen
- clrscr 00, 00, 00, CURSORROW, 79, 00
- clrscr 01, CURSORROW, 01, CURSORROW, 78, 6FH
- clrscr SHOWEDGE-SHOWTOP+1, SHOWTOP, 01, showedge, 78, SHOWBACKGROUND
-
- ;Initialize COM1
- COMINIT
-
- ;show banner
- lea bp, banner
- call GETLEN
- ;show adjust
- MOV AX, 80
- SUB AX, STRLEN
- SHR AX, 2
- MOV DL, AL
- MOV AH, 13H
- MOV AL, 01
- MOV BH, 00
- MOV BL, 0eh
- MOV CX, STRLEN
- MOV DH, 00
- INT 10H
-
- LEA SI, INPUTBUF
-
- ;show prompt
- PUSH SI
- SHOWPROMPT PROMPT, CURSORROW
- ;Insert ENDCHAR
- MOV AX, MAXLEN
- SUB AX, STRLEN
- ADD SI, AX
- MOV BYTE PTR [SI], ENDCHAR
- MOV ENDPOS, SI
- ;Save PROMPT's length and adjust CURSORCOL
- MOV AX, STRLEN
- INC AX
- MOV PROMPTLEN, AX
- MOV CURSORCOL, AL
- POP SI
-
- ;Initial cursor position
- LOCATECURSOR CURSORROW, CURSORCOL
-
- ;***Engine Start***
- ;check input status
- CHECKINPUT:
- MOV AH, 11H
- INT 16H
- JNZ INPUT
-
- ;check receive status
- CHECKREV:
- ;test start
- ;LEA BP, PROMPT
- ;CALL GETLEN
- ;MSHOWSTR REVATTRIB, STRLEN, 15
- ;test end
-
- MINB COMBASEADDR +5
- TEST AL, 00000001B
- JZ CHECKINPUT
- CALL REVHANDLER
- JMP CHECKINPUT
- ;***Engine End***
- INPUT:
- ;check whether the buffer is overflow or not
- CMP BYTE PTR [SI], ENDCHAR
- JE GOSHOW
- MOV COMMONFLAG, 00
- MOV AH, 10H
- INT 16H
- MOV CHARREG, AL
- ;***special key parsing start***
-
- ;check 'RETURN' key
- cmp CHARREG, KRETURN
- je goshow
- ;check 'BLACKSPACE' key
- CHKBCK:
- CMP CHARREG, KBACK
- JNE CHKTAB
- CMP BYTE PTR inputbuf, BUFCHAR
- JE input
- ;fill '$'
- MOV BYTE PTR [SI], BUFCHAR
- dec si
- ;set flag
- mov commonflag, BUFCHAR
- ;fill '$' too
- MOV BYTE PTR [SI], BUFCHAR
- mov ATTRIB, 66H
- ;process back
- dec cursorcol
- LOCATECURSOR CURSORROW, CURSORCOL
- jmp goecho
- CHKTAB:
- ;check 'TAB' key
- cmp CHARREG, KTAB
- JNE normalchar
- ;fill pads=blank*(8-((CURSORCOL+1) mod 8))
- ;setcursor pads+1
- MOV AL, CURSORCOL
- AND AX, 0FH
- INC AX
- MOV CX, 08
- DIV CL
- AND AX, 0FF00H
- XCHG AL, AH
- SUB CX, AX
- MOV STRLEN, CX
- DOTAB1:
- CMP CX, 00
- JE DOTAB2
- MOV BYTE PTR [SI], KBLANK
- INC SI
- DEC CX
- JMP DOTAB1
- DOTAB2:
- MOV COMMONFLAG, KTAB
- MOV AL, KBLANK
- MOV ATTRIB, INPUTATTRIB
- JMP GOECHO
-
- ;***special key parsing end***
-
- normalchar:
- MOV AL, CHARREG
- mov byte ptr [si], AL
- inc si
- mov ATTRIB, INPUTATTRIB
- goecho:
- mov ah, 09h
- mov bh, 00
- mov bl, ATTRIB
- mov cx, 1
- int 10h
- endecho:
- CMP commonflag, BUFCHAR
- je input
- CMP COMMONFLAG, KTAB
- JNE ENDECHO1
- DEC STRLEN
- CMP STRLEN, 00
- JE ENDECHO1
- INC CURSORCOL
- LOCATECURSOR CURSORROW, CURSORCOL
- JMP GOECHO
- ENDECHO1:
- inc cursorcol
- LOCATECURSOR CURSORROW, CURSORCOL
- jmp CHECKINPUT
- goshow:
- ;fill '$'
- mov byte ptr [si], BUFCHAR
- cmp byte ptr inputbuf, BUFCHAR
- je restart
- ;send strings
- CALL SEND
- ;show strings
- lea bp, inputbuf
- call GETLEN
- ;***command process start***
- cmpstr strlen, inputbuf, strquit
- JE normalquit
- cmpstr strlen, inputbuf, strreset
- JE clrshow
- ;***command process end***
- lea bp, inputbuf
- mov ATTRIB, KEYATTRIB
- CALL SHOWSTR
-
- goshow1:
- lea si, inputbuf
- restart:
- ;clear the input region
- clrscr 01, 17h, 01, 17h, 4eh, 6FH
- ;redraw PROMPT
- SHOWPROMPT PROMPT, CURSORROW
-
- ;fill '#'
- mov byte ptr inputbuf, BUFCHAR
- ;fill ENDCHAR
- PUSH SI
- LEA SI, INPUTBUF
- MOV SI, ENDPOS
- mov byte ptr [SI], ENDCHAR
- POP SI
-
- MOV AX, PROMPTLEN
- mov cursorcol, AL
- LOCATECURSOR CURSORROW, CURSORCOL
- jmp CHECKINPUT
- normalquit:
- clrscr 00, 00, 00, 18h, 4fh, 00
- mov ax, 4c00h
- int 21h
- clrshow:
- clrscr SHOWEDGE-SHOWTOP+1, SHOWTOP, 01, showedge, 78, SHOWBACKGROUND
- mov showrow, SHOWTOP-1
- jmp goshow1
- START ENDP
-
- REVHANDLER PROC NEAR
- PUSHA
- ;receive strings
- CALL RECEIVE
- ;show strings
- LEA BP, REVBUF
- MOV ATTRIB, REVATTRIB
- CALL SHOWSTR
- ;reset cursor
- LOCATECURSOR CURSORROW, CURSORCOL
- POPA
- RET
- REVHANDLER ENDP
- ;Send routine
- SEND PROC NEAR
- PUSHA
- LEA SI, inputbuf
- CHECKTXD:
- MINB COMBASEADDR +5
- TEST AL, 20H
- JZ CHECKTXD
- MOV AL, [SI]
- MOUTB COMBASEADDR, AL
- INC SI
- CMP BYTE PTR [SI], BUFCHAR
- JNE CHECKTXD
- MOUTB COMBASEADDR, BUFCHAR
- POPA
- RET
- SEND ENDP
- ;receive routine
- RECEIVE PROC NEAR
- PUSHA
- LEA DI, REVBUF
- CHECKRXD:
- MINB COMBASEADDR +5
- TEST AL, 01
- JZ CHECKRXD
- MINB COMBASEADDR
- MOV BYTE PTR [DI], AL
- INC DI
- CMP AL, BUFCHAR
- JNE CHECKRXD
- POPA
- RET
- RECEIVE ENDP
- GETLEN PROC NEAR
- PUSHA
- MOV SI, BP
- MOV CX, 00
- DOGET:
- INC CX
- INC SI
- CMP BYTE PTR [SI], BUFCHAR
- JNE DOGET
- MOV STRLEN, CX
- POPA
- RET
- GETLEN ENDP
- SHOWSTR PROC NEAR
- PUSHA
- PRESHOW:
- CMP SHOWROW, showedge
- JB showentry
- clrscr 01, SHOWTOP+1, 01, showedge, 78, SHOWBACKGROUND
- jmp doshow
- showentry:
- inc SHOWROW
- doshow:
- MSHOWSTR ATTRIB, STRLEN, SHOWROW
- POPA
- RET
- SHOWSTR ENDP
- END START
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|