-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path5_3.asm
More file actions
133 lines (113 loc) · 2.69 KB
/
5_3.asm
File metadata and controls
133 lines (113 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
DATA SEGMENT
MSG DB 'Hello_this_is_Siarnold!', '$'
DIVID DW 60H ; Baud rate = 1200
DATA ENDS
STACK SEGMENT PARA STACK
DW 128 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX ; initialize
MOV AL, 80H
; DLAB = 1 to visit the divid register
MOV DX, 3FBH
OUT DX, AL
MOV AX, DIVID ; get dividor
MOV DX, 3F8H
OUT DX, AL
MOV AL, AH
MOV DX, 3F9H
OUT DX, AL
; set Baud rate
; set line control reg
MOV AL, 00001011B
;DLAB = 0, odd check, 1 stop bit, 8 data bits
MOV DX, 3FBH
OUT DX, AL
; set MODEM control reg
MOV AL, 00000011B
;MODEM normal
MOV DX, 3FCH
OUT DX, AL
; set interrupt control reg
MOV AL, 0 ; mask all interrupts
MOV DX, 3F9H
OUT DX, AL
WAIT_FOR:
MOV DX, 3FDH ;read line status reg
IN AL, DX
TEST AL, 00011110B ;if error
JNZ ERR
TEST AL, 00000001B ;if ready to receive
JNZ RECEIVE
TEST AL, 00100000B ;if not ready to send
JZ WAIT_FOR
; get keyboard input
MOV AH, 1
INT 16H ; BIOS to read in
JZ WAIT_FOR ; if no input, WAIT_FOR
MOV AH, 1 ; get char and echo
INT 21H
CMP AL, 20H ; if AL != ' ', continue
JNZ CONTINUE
MOV DX, 3F8H ; send ' '
OUT DX, AL
JMP FINISH
CONTINUE:
CMP AL, 'S' ;if not 'S', CHECK_CHAR
JZ SENDING
; check for '\n'
CHECK_CHAR:
CMP AL, 0DH
JNE SEND_CHAR ; if AL != '\n', SEND_CHAR
MOV AL, 0AH ; else, '\r'
MOV AH, 0EH
INT 10H
JMP WAIT_FOR
RECEIVE:
MOV DX, 3F8H
IN AL, DX
CMP AL, 20H ; if AL == ' ', end
JZ FINISH
MOV AH, 0EH ;show AL
INT 10H
CMP AL, 'R' ;if 'R', SENDING
JZ SENDING
JMP CHECK_CHAR
SENDING:
PUSH AX
PUSH DX ; protect scene
LEA SI, MSG
SENDING_LOOP:
MOV DX, 3FDH ;read line status reg
IN AL, DX
TEST AL, 01000000B ;if send-shift-reg is not empty, SENDING_LOOP
JZ SENDING_LOOP
TEST AL, 00100000B ;if send-reg is not empty, SENDING_LOOP
JZ SENDING_LOOP
MOV AL, [SI]
CMP AL, '$' ;stop sending when '$'
JZ SENDING_FINISH
MOV DX, 3F8H ;send AL
OUT DX, AL
INC SI ; send next char
JMP SENDING_LOOP
SENDING_FINISH:
POP DX
POP AX ; restore scene
JMP WAIT_FOR
ERR:
MOV DX, 3F8H
IN AL, DX ; read the error char to continue
MOV AL, '?'
MOV AH, 14
INT 10H
JMP WAIT_FOR
FINISH:
MOV AH, 4CH ; end
INT 21H
CODE ENDS
END START