-
Notifications
You must be signed in to change notification settings - Fork 0
/
DISPLAYS.asm
356 lines (294 loc) · 6.49 KB
/
DISPLAYS.asm
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
; I/O Address Bus decode - every device gets 0x200 addresses */
IO0 EQU 0000h
IO1 EQU 0200h
IO2 EQU 0400h
IO3 EQU 0600h
IO4 EQU 0800h
IO5 EQU 0A00h
IO6 EQU 0C00h
IO7 EQU 0E00h
IO8 EQU 1000h
IO9 EQU 1200h
IO10 EQU 1400h
IO11 EQU 1600h
IO12 EQU 1800h
IO13 EQU 1A00h
IO14 EQU 1C00h
IO15 EQU 1E00h
; 8251A USART
ADR_USART_DATA EQU (IO4 + 00h)
;ONDE VOCE VAI MANDAR E RECEBER DADOS DO 8251
ADR_USART_CMD EQU (IO4 + 02h)
;É O LOCAL ONDE VOCE VAI ESCREVER PARA PROGRAMAR O 8251
ADR_USART_STAT EQU (IO4 + 02h)
;RETORNA O STATUS SE UM CARACTER FOI DIGITADO
;RETORNA O STATUS SE POSSO TRANSMITIR CARACTER PARA O TERMINAL
; 8251A USART 2
ADR_USART_DATA_2 EQU (IO5 + 00h)
;ONDE VOCE VAI MANDAR E RECEBER DADOS DO 8251
ADR_USART_CMD_2 EQU (IO5 + 02h)
;É O LOCAL ONDE VOCE VAI ESCREVER PARA PROGRAMAR O 8251
ADR_USART_STAT_2 EQU (IO5 + 02h)
;RETORNA O STATUS SE UM CARACTER FOI DIGITADO
;RETORNA O STATUS SE POSSO TRANSMITIR CARACTER PARA O TERMINAL
;MEU CODIGO
code SEGMENT 'code'
assume CS:code,DS:data,SS:stack,ES:extra
Org 0008H
PONTEIRO_TRATADOR_INTERRUPCAO DB 4 DUP("P") ; PONTEIRO PARA INTERRUPCAO
;RESERVADO PARA VETOR DE INTERRUPCOES
org 0400H
CONVERTE_10_BITS:
RCR BH,1
JC ACENDE_LSB
AND BL,01111111B
JMP CONVERTED_10_BITS
ACENDE_LSB:
OR BL,10000000B
CONVERTED_10_BITS:
RET
INICIALIZA_8251:
MOV AL,0
MOV DX, ADR_USART_CMD
OUT DX,AL
OUT DX,AL
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,4DH
OUT DX,AL
MOV AL,37H
OUT DX,AL
RET
RECEBE_CARACTER:
PUSHF
PUSH DX
AGUARDA_CARACTER:
MOV DX, ADR_USART_STAT
IN AL,DX
TEST AL,2
JZ AGUARDA_CARACTER
MOV DX, ADR_USART_DATA
IN AL,DX
;SHR AL,1
NAO_RECEBIDO:
POP DX
POPF
RET
MANDA_CARACTER:
PUSHF
PUSH DX
PUSH AX ; SALVA AL
BUSY:
MOV DX, ADR_USART_STAT
IN AL,DX
TEST AL,1
JZ BUSY
MOV DX, ADR_USART_DATA
POP AX ; RESTAURA AL
OUT DX,AL
POP DX
POPF
RET
INICIALIZA_8251_2:
MOV AL,0
MOV DX, ADR_USART_CMD_2
OUT DX,AL
OUT DX,AL
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,4DH
OUT DX,AL
MOV AL,37H
OUT DX,AL
RET
RECEBE_CARACTER_2:
PUSHF
PUSH DX
AGUARDA_CARACTER_2:
MOV DX, ADR_USART_STAT_2
IN AL,DX
TEST AL,2
JZ AGUARDA_CARACTER_2
MOV DX, ADR_USART_DATA_2
IN AL,DX
;SHR AL,1
NAO_RECEBIDO_2:
POP DX
POPF
RET
MANDA_CARACTER_2:
PUSHF
PUSH DX
PUSH AX ; SALVA AL
BUSY_2:
MOV DX, ADR_USART_STAT_2
IN AL,DX
TEST AL,1
JZ BUSY_2
MOV DX, ADR_USART_DATA_2
POP AX ; RESTAURA AL
OUT DX,AL
POP DX
POPF
RET
DELAY:
MOV CX,65535
DELAY_1:
LOOP DELAY_1
RET
MAIUSCULO:
PUSHF
PUSH AX
MAIUSCULO_COMPARA:
MOV AL,[BX]
CMP AL,0
JE FIM_MAIUSCULO
CMP AL,"a"
JL MAIUSCULO_IGNORA
CMP AL,"z"
JG MAIUSCULO_IGNORA
SUB AL,32
MOV [BX],AL
INC BX
JMP MAIUSCULO_COMPARA
MAIUSCULO_IGNORA:
INC BX
JMP MAIUSCULO_COMPARA
FIM_MAIUSCULO:
POP AX
POPF
RET
IMPRIME_TEXTO:
MANDA:
MOV AL, [BX]
CMP AL, 0 ; null ou indicador de fim de texto
JE FINALIZA
CALL MANDA_CARACTER
ADD BX,1 ; inc bx
JMP MANDA
FINALIZA:
RET
IMPRIME_TEXTO_2:
MANDA_2:
MOV AL, [BX]
CMP AL, 0 ; null ou indicador de fim de texto
JE FINALIZA
CALL MANDA_CARACTER_2
ADD BX,1 ; inc bx
JMP MANDA_2
FINALIZA_2:
RET
MANDA_FIRMATA:
MANDA_FIRM:
MOV AL, [BX]
CMP AL, 0F7H ; null ou indicador de fim de texto
JE FINALIZA_FIRM
CALL MANDA_CARACTER
ADD BX,1 ; inc bx
JMP MANDA_FIRM
FINALIZA_FIRM:
RET
ENTRADA:
MOV CL,0
MOV BX, OFFSET TEXTO_DIGITADO
LE_TECLA:
CALL RECEBE_CARACTER ;AL VAI TER CARACTER
CMP AL, 13
JE PRESSIONOU_13
CMP AL,8
JE BACKSPACE
CMP CL, 80
JE LE_TECLA
CALL MANDA_CARACTER ;QUE ESTA EM AL
MOV [BX], AL
INC BX
INC CL
JMP LE_TECLA
PRESSIONOU_13:
MOV AL,0
MOV [BX],AL
RET
BACKSPACE:
CMP CL, 0
JE LE_TECLA
CALL MANDA_CARACTER ;QUE ESTA EM AL
DEC CL
DEC BX
JMP LE_TECLA
;MEU CODIGO
inicio:
MOV AX,0
MOV DS, AX ;FAZ O DS APONTAR PARA O SEGMENTO 0000
MOV WORD PTR PONTEIRO_TRATADOR_INTERRUPCAO, OFFSET SYSTICK
MOV WORD PTR PONTEIRO_TRATADOR_INTERRUPCAO + 2, SEG SYSTICK
MOV AX,DATA ;JOGA EM AX O NUMERO DO SEGMENTO ALOCADO PARA DATA
MOV DS,AX ;MOVA AX PARA DS, OU SEJA, DS AGORA APONTA PARA
;AQUELE SEGMENTO
MOV AX,EXTRA ; FAZ COM O REGISTRADORES APONTE PARA O SEGMENTO
MOV ES,AX
; FACA A ROTINA QUE JUNTE LSB COM MSB E FORME UM UNICO NUMERO DE 10 BITS E COLOQUE EM BX
CALL DELAY
;CALL INICIALIZA_8251
CALL INICIALIZA_8251_2
MOV BX, OFFSET MENSAGEM
CALL IMPRIME_TEXTO_2
ACABOU: JMP ACABOU
;MOV BX, OFFSET CMD_INIT_RGB_13
;CALL MANDA_FIRMATA
MOV BX, OFFSET CMD_INIT_ANALOG_A0
CALL MANDA_FIRMATA
;MOV BX, OFFSET CMD_SET_ON_13
;CALL MANDA_FIRMATA
;MOV BX, OFFSET CMD_SET_OFF_13
;CALL MANDA_FIRMATA
;MOV BX, OFFSET CMD_READ_ANALOG_0
;CALL MANDA_FIRMATA
LE_AD:
CALL RECEBE_CARACTER
AND AL,10000000B
CMP AL,10000000B ; INICIO PACOTE
JNE LE_AD
INICIO_PACOTE:
CALL RECEBE_CARACTER
SHR AL,1
MOV LSB,AL
CALL RECEBE_CARACTER
SHR AL,1
MOV MSB,AL
CALL CONVERTE_10_BITS ; RETORNA EM BX O DADO DIGITAL EM 10 BITS
JMP LE_AD
SYSTICK:
IRET
code ends
;MILHA PILHA
STACK SEGMENT STACK
DW 128 DUP("*")
STACK ENDS
;MEUS DADOS
DATA SEGMENT
MENSAGEM DB "*************ABABABABABABABABABABABABABABABABABAB*************",13,10,0
MENSAGEM2 DB "PRESS ANY KEY TO CONTINUE",13,10,0
MENSAGEM3 DB "THANKS",13,10,0
MENSAGEM4 DB "AbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAb%38381123@3",13,10,0
TEXTO_DIGITADO DB 81 DUP(" ")
CMD_INIT_RGB_10 DB 0F4H, 10, 1, 0F7H
CMD_INIT_RGB_11 DB 0F4H, 11, 1, 0F7H
CMD_INIT_RGB_12 DB 0F4H, 12, 1, 0F7H
CMD_INIT_RGB_13 DB 0F4H, 13, 1, 0F7H
CMD_SET_ON_10 DB 0F5H, 10, 1, 0F7H
CMD_SET_OFF_10 DB 0F5H, 10, 0, 0F7H
CMD_SET_ON_11 DB 0F5H, 11, 1, 0F7H
CMD_SET_OFF_11 DB 0F5H, 11, 0, 0F7H
CMD_SET_ON_12 DB 0F5H, 12, 1, 0F7H
CMD_SET_OFF_12 DB 0F5H, 12, 0, 0F7H
CMD_SET_ON_13 DB 0F5H, 13, 1, 0F7H
CMD_SET_OFF_13 DB 0F5H, 13, 0, 0F7H
CMD_INIT_ANALOG_A0 DB 0F4H, 14, 2, 0F7H
LSB DB 7FH
MSB DB 07H
DATA ENDS
EXTRA SEGMENT
EXTRA ENDS
end inicio