2014-12-25 4 views
-1

= [TASM OR MASM은 내 코드에 영향을 미치지 않습니다.] DOSBOX를 사용하고 있습니다.시리얼 통신으로 문자열 보내기 UART-8250 x8086 [조립품]

좋아요, 그래서 저는 시리얼 통신 코드 게임을하고 있는데, 실제로 "사용자 이름"을 묻는 부분이 있습니다. 다른 플레이어도 그의 이름을 입력 할 때까지 기다리겠습니다. 주 메뉴.

여기에서 문제는 "PlayerName"을 다른 PC에 보내고 "PartnerName"으로받을 수 없다는 것입니다.

내 코드의 일부이다 :

Welcome proc ;Welcome Screen ! 

mov al,03h 
mov ah,00 
int 10h 

mov ah,02h 
mov dh,10d 
mov dl,20d 
mov bh,00d 
int 10h 

mov ah,09h 
lea dx,WelcomeMsg 
int 21h 

mov dh,11 ;Row number 
mov dl,28 ;Column number 
mov bh,0 
mov ah,2 
int 10h 

;Reading PlayerName 
mov ah,0ah 
lea dx,PlayerName 
int 21h 

;Adding $ at the end, so we can print it later 
mov bx,00 
mov bl,PlayerName[1] 
mov PlayerName[bx+2],'$' 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CHECKING FOR NAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; SendingName: ;Sending Player Name 
; mov dx,3fdh 
; in al,dx 
; test al,01000000b 
; jnz SendNameDone 
; jmp SendingName 
; SendNameDone: 
; lea ax,[PlayerName] 
; mov dx,3f8h 
; out dx,ax 


; ReceivingName: ;Receiving PLayer Name 
; mov dx,3fdh 
; in al,dx 
; test al,00000001b 
; jnz ReceiveNameDone 
; jmp ReceivingName ;This will occur if nothing is received. 
; ReceiveNameDone: 
; mov dx,3f8h 
; in ax,dx 
; mov si,ax 
; mov di,OFFSET PartnerName 
; mov cx,15 
; movsb 

; mov dh,1 ;Row number 
; mov dl,1 ;Column number 
; mov bh,0 
; mov ah,2 
; int 10h 

; mov ah,09h 
; lea dx,PartnerName 
; int 21h 

; mov ah,01h 
; int 21h 



;Confirm Message 
mov dh,13 ;Row number 
mov dl,18 ;Column number 
mov bh,0 
mov ah,2 
int 10h 

mov ah,09h 
lea dx,WelcomeMsg2 
int 21h 

mov ah,01h 
int 21h 

ret 
Welcome endp 

그리고 당신이 혼동하는 경우, 내 DataSegment의 일부있다 : 여기

WelcomeMsg db 'Welcome, Please Enter Your Name: $' 
WelcomeMsg2 db 'Please Press Any Key To Continue!$' 

문제가 내 "댓글 파트" - 그것이 잘못되었다는 것을 알고 있습니다 - 무한 루프가되는 것 같습니다.

당신이 도울 수 있다면 어떻게 시리얼 통신을 통해 "PlayerName"을 보내고 "PartnerName"으로받을 수 있습니까? 매우 감사 할 것입니다!

+0

아직 도움이 :( – Cereal

답변

0

송신기 지주 레지스터를 사용하려면 먼저 Divisor 래치 액세스 비트를 지운다.

mov dx,03FBh  ;Line Control Register 
in al,dx 
and al,0111_1111b ;Set DLAB=0 
out dx,al 

송신기 유지 레지스터가 비어 있는지 한 번에 한 바이트 씩 전송합니다.

mov si,PlayerName+2 ;Send name including terminating $ character 
SendingName:  ;Sending Player Name 
mov dx,03FDh  ;Line Status Register 
in al,dx 
test al,0010_0000b ;Use bit 5 to see if THR is empty 
jz SendingName 
lodsb 
mov dx,03F8h  ;Transmitter Holding Register 
out dx,al 
cmp al,"$" 
jne SendingName