-
Notifications
You must be signed in to change notification settings - Fork 0
/
LCD - grafico.asm
1297 lines (1134 loc) · 27.1 KB
/
LCD - grafico.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
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; 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
; REGISTRADORES DA CONTROLADORA 8255
ADR_PPI_PORTA EQU (IO9) ; 0a00h
ADR_PPI_PORTB EQU (IO9 + 02h) ; 0a02
ADR_PPI_PORTC EQU (IO9 + 04h) ; 0a04
ADR_PPI_CONTROL EQU (IO9 + 06h) ; 0a06
PPI_PORTA_INP EQU 10h
PPI_PORTA_OUT EQU 00h
PPI_PORTB_INP EQU 02h
PPI_PORTB_OUT EQU 00h
PPI_PORTCL_INP EQU 01h
PPI_PORTCL_OUT EQU 00h
PPI_PORTCH_INP EQU 08h
PPI_PORTCH_OUT EQU 00h
PPI_MODE_BCL_0 EQU 00h
PPI_MODE_BCL_1 EQU 04h
PPI_MODE_ACH_0 EQU 00h
PPI_MODE_ACH_1 EQU 20h
PPI_MODE_ACH_2 EQU 40h
PPI_ACTIVE EQU 80h
TAM_STRING EQU 200
;MEU CODIGO
CODE SEGMENT
ASSUME DS:DATA
org 0000h
org 0008h
DW OFFSET RELOGIO
DW SEG RELOGIO
;RESERVADO PARA VETOR DE INTERRUPCOES
org 0400h
;MEU CODIGO
inicio:
MOV AX,DATA
MOV DS,AX ; DS AGORA APONTA PARA DATA SEGMENT
MOV AX,EXTRA
MOV ES,AX ; ES AGORA APONTA PARA EXTRA SEGMENT
MOV AX,STACK
MOV SS,AX ; SS AGORA APONTA PARA STACK SEGMENT
CALL INICIALIZA_8251
CALL INICIALIZA_8255_PORTB_OUTPUT
MOV BX, OFFSET TITULO
CALL MANDA_MENSAGEM
CALL GLCD_ATIVA
CALL GLCD_CLR
MOV BX, OFFSET TEXTO
CALL RECEBE_MENSAGEM
CALL REPETICOES
CALL INSERE_BASE_LCD ; COLOCA OS NUMEROS BASE
MOV AH, 0 ;DEFINIDO COLUNA
MOV AL, 53 ;DEFININDO LINHA
MOV BH, 1 ; ASCENDER OS PIXELS
GRAFICO_BASE:
MOV TRACO, 0
INC TAMANHO
CALL GLCD_DRAW_POINT ; COLOCA UM PIXEL NAS COORDENADAS AH - AL
PULA:
CMP TRACO, 4
JE SAI_ROTINA
INC TRACO
INC AH
CALL GLCD_DRAW_POINT ; COLOCA UM PIXEL NAS COORDENADAS AH - AL
JMP PULA
SAI_ROTINA:
CMP TAMANHO, 10
JE FIM_BASE
ADD AH, 4 ; DA ESPACO ENTRE TRACOS
JMP GRAFICO_BASE
FIM_BASE:
MOV AH, 0 ; DEFINIDO COLUNA
SUB AL, 2 ; DEFININDO LINHA
MOV BH, 1 ; ASCENDER OS PIXELS
MOV SI, OFFSET REPETICOES_DIGITADOS
INC SI
MOV CX, 10
GRAFICO_REPETICOES:
PUSH CX
MOV CL,[SI]
SUB CL, 48
CALL CHAMA_GRAFICO
ADD AH,8
INC SI
POP CX
LOOP GRAFICO_REPETICOES
JMP $
AUMENTA_VEZES_NUMERO:
SUB AL,48
MOV AH,0
MOV BX,AX
INC REPETICOES_DIGITADOS[BX]
RET
CHAMA_GRAFICO:
PUSHF
PUSH AX
CMP CX,0
JE FIM_MOSTRA_GRAFICO
MOSTRA_GRAFICO:
CALL COLOCA_GRAFICO_RESULTADO
SUB AL, 2
LOOP MOSTRA_GRAFICO
FIM_MOSTRA_GRAFICO:
POP AX
POPF
RET
COLOCA_GRAFICO_RESULTADO:
PUSH AX
PUSH CX
MOV CX,5
GRAFICO_ESCREVE:
CALL GLCD_DRAW_POINT
INC AH
LOOP GRAFICO_ESCREVE
CALL INSERE_RESULTADO_LCD ; PRINTA A VARIAVEL COM AS REPETICOES
POP CX
POP AX
RET
;======================================= FIM MEU CODIGO =======================================;
MOV SEGUNDOS_UNID, 0
MOV SEGUNDOS_DEZ, 0
MOSTRA:
CALL DISPLAY
JMP MOSTRA
REPETICOES:
PUSHF
PUSH AX
PUSH CX
MOV CX, 0
MOV SI, OFFSET TEXTO
INC SI
REPETE_ACHA_LETRA:
CMP SI, 0
JE SAI_ACHA_LETRA
MOV BX, OFFSET REPETICOES_DIGITADOS
INC BX
MOV AL, [SI]
SUB AL, 48
ADD BL, AL
MOV AL, [BX]
INC AL
MOV [BX], AL
INC SI
JMP REPETE_ACHA_LETRA
SAI_ACHA_LETRA:
POP CX
POP AX
POPF
INSERE_BASE_LCD:
PUSHF
PUSH CX
MOV CL, 0
CONTA:
CMP CL, 10
JE SAI_CONTA
MOV AH, CL
MOV AL, 7
CALL GLCD_GOTO_XY_TEXT
MOV AL, CL
ADD AL, 48
CALL PRINT_CAR
INC CL
JMP CONTA
SAI_CONTA:
POP CX
POPF
RET
INSERE_RESULTADO_LCD:
PUSHF
PUSH AX
PUSH BX
PUSH CX
MOV CL, 0
MOV BX, OFFSET REPETICOES_DIGITADOS
INC BX
CONTA_RESULTADO:
CMP CL, 10
JE SAI_CONTA_RESULTADO
MOV AH, CL
MOV AL, 0
CALL GLCD_GOTO_XY_TEXT
MOV AL, [BX]
CALL PRINT_CAR
INC CL
INC BX
JMP CONTA_RESULTADO
SAI_CONTA_RESULTADO:
POP CX
POP BX
POP AX
POPF
RET
INVERTE_MENSAGEM:
PUSHF
PUSH AX
PUSH CX
MOV CL, [BX] ; CL PEGA O TAMANHO DO TEXTO
CMP CL,0 ; SE STRING VAZIA, IGNORA TUDO
JE FIM_INVERTE_MENSAGEM
MOV AL, [BX] ; AL CONTEM O TAMANHO DO TEXTO
MOV AH, 0 ; LIMPA AH PARA SOMA COM AX (PAI DE AL)
ADD BX, AX
PROCURA_INVERTE_CARACTER:
MOV AL, [BX]
CALL MANDA_CARACTER
DEC BX ; VOLTA CARACTER
DEC CL
CMP CL,0
JNE PROCURA_INVERTE_CARACTER
FIM_INVERTE_MENSAGEM:
POP CX
POP AX
POPF
RET
MENSAGEM_MAIUSCULO:
PUSHF
PUSH AX
IGNORA_CARACTER_MAISCULO:
INC BX ; PARA PULAR TAMANHO
MOV AL, [BX]
CMP AL, 0
JE SAI_MENSAGEM_MAIUSCULO
CMP AL, 'a'
JL IGNORA_CARACTER_MAISCULO
CMP AL, 'z'
JG IGNORA_CARACTER_MAISCULO
MOV AL,32
SUB [BX],AL ; LE CARACTERE DA MEMORIA, SUBTRAI 32 E ESCREVE NOVAMENTE NA MEMORIA
JMP IGNORA_CARACTER_MAISCULO
SAI_MENSAGEM_MAIUSCULO:
POP AX
POPF
RET
PULA_LINHA:
PUSHF
PUSH AX
MOV AL,13
CALL MANDA_CARACTER
MOV AL,10
CALL MANDA_CARACTER
POP AX
POPF
RET
DISPLAY:
PUSH AX
PUSH BX
PUSH DX
MOV BL, SEGUNDOS_UNID
MOV BH, 0
MOV AL, TABELA[BX]
MOV DX, IO3
OUT DX, AL
MOV BL, SEGUNDOS_DEZ
MOV BH, 0
MOV AL, TABELA[BX]
MOV DX, IO2
OUT DX, AL
POP DX
POP BX
POP AX
RET
DELAY: PUSH CX
MOV CX, 65535
DEC_CX:
DEC CX
CMP CX, 0
JE SAI_DELAY
JMP DEC_CX
SAI_DELAY:
POP CX
RET
RELOGIO:
PUSHF
INC SEGUNDOS_UNID
CMP SEGUNDOS_UNID, 10
JE ZERA_SEGUNDOS_UNID
JMP SAI_INTERRUPT_RELOGIO
ZERA_SEGUNDOS_UNID:
MOV SEGUNDOS_UNID, 0
INC SEGUNDOS_DEZ
CMP SEGUNDOS_DEZ, 6
JE ZERA_SEGUNDOS_DEZ
JMP SAI_INTERRUPT_RELOGIO
ZERA_SEGUNDOS_DEZ:
MOV SEGUNDOS_DEZ, 0
SAI_INTERRUPT_RELOGIO:
POPF
IRET
; 8251A USART
ADR_USART_DATA EQU (IO8 + 00h)
;ONDE VOCE VAI MANDAR E RECEBER DADOS DO 8251
ADR_USART_CMD EQU (IO8 + 02h)
;É O LOCAL ONDE VOCE VAI ESCREVER PARA PROGRAMAR O 8251
ADR_USART_STAT EQU (IO8 + 02h)
;RETORNA O STATUS SE UM CARACTER FOI DIGITADO
;RETORNA O STATUS SE POSSO TRANSMITIR CARACTER PARA O TERMINAL
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
MANDA_MENSAGEM:
PUSHF
PUSH AX
INC BX ; PULA TAMANHO DA MENSAGEM
MANDA_MENSAGEM_CARACTER:
MOV AL,[BX]
CMP AL,0
JE FIM_MANDA_MENSAGEM
CALL MANDA_CARACTER
INC BX
JMP MANDA_MENSAGEM_CARACTER
FIM_MANDA_MENSAGEM:
POP AX
POPF
RET
RECEBE_MENSAGEM:
PUSHF
PUSH AX
INC BX ; APONTE PARA O PAYLOAD, NAO APONTE PARA O TAMANHO
MOV CONTADOR_LETRAS,0
RECEBE_MENSAGEM_CARACTER:
CMP CONTADOR_LETRAS,50
JE SAI_RECEBE_CARACTER
CALL RECEBE_CARACTER
CMP AL,13
JE SAI_RECEBE_CARACTER
CMP AL, 8 ; BACKSPACE
JE CONSISTE_BACKSPACE
CMP CONTADOR_LETRAS,TAM_STRING
JE RECEBE_MENSAGEM_CARACTER
IMPRIME_SALVA:
CALL MANDA_CARACTER
MOV [BX],AL
INC BX
INC CONTADOR_LETRAS
JMP RECEBE_MENSAGEM_CARACTER
CONSISTE_BACKSPACE:
CMP CONTADOR_LETRAS,0
JE RECEBE_MENSAGEM_CARACTER
DEC BX
DEC CONTADOR_LETRAS
CALL MANDA_CARACTER ; EXCLUSIVO PARA IMPRIMIR BACKSPACE
JMP RECEBE_MENSAGEM_CARACTER
SAI_RECEBE_CARACTER:
MOV AL,0
MOV [BX],AL
MOV BX, OFFSET TEXTO ; APONTA PARA CAMPO TAMANHO DE TEXTO
MOV AL, CONTADOR_LETRAS ; PEGA
MOV [BX],AL
POP AX
POPF
RET
;---------------------------------------------------------
;ROTINAS PARA 8255
;CONFIGURA PORTA E PORTB COMO SAIDAS
INICIALIZA_8255_PORTB_OUTPUT:
PUSHF
PUSH AX
PUSH DX
MOV DX, ADR_PPI_CONTROL
MOV AL,0
OR AL,PPI_PORTA_OUT
OR AL,PPI_PORTB_OUT
OR AL,PPI_PORTCL_INP
OR AL,PPI_PORTCH_INP
OR AL,PPI_MODE_BCL_0
OR AL,PPI_MODE_ACH_0
OR AL,PPI_ACTIVE
OUT DX,AL
POP DX
POP AX
POPF
RET
;INICIALIZA PORTB E "PORTC" COMO ENTRADA
INICIALIZA_8255_PORT_INPUT:
PUSHF
PUSH AX
PUSH DX
MOV DX, ADR_PPI_CONTROL
MOV AL,0
OR AL,PPI_PORTA_OUT
OR AL,PPI_PORTB_INP
OR AL,PPI_PORTCL_INP
OR AL,PPI_PORTCH_INP
OR AL,PPI_MODE_BCL_0
OR AL,PPI_MODE_ACH_0
OR AL,PPI_ACTIVE
OUT DX,AL
POP DX
POP AX
POPF
RET
;MANDA AL PARA PORTA
MANDA_PORT_A:
PUSHF
PUSH DX
MOV DX,ADR_PPI_PORTA
OUT DX,AL
POP DX
POPF
RET
;MANDA AL PARA PORTB
MANDA_PORT_B:
PUSHF
PUSH DX
MOV DX,ADR_PPI_PORTB
OUT DX,AL
POP DX
POPF
RET
;LE PORTB E JOGA EM AL
LE_PORT_B:
PUSHF
PUSH DX
MOV DX,ADR_PPI_PORTB
IN AL,DX
POP DX
POPF
RET
;LE PORTC E JOGA EM AL
LE_PORT_C:
PUSHF
PUSH DX
MOV DX,ADR_PPI_PORTC
IN AL,DX
POP DX
POPF
RET
;---------------------------------------------------------
;LIGA DISPLAY
GLCD_ON:
CALL GLCD_CS1_LOW
CALL GLCD_CS2_LOW
CALL GLCD_RS_LOW
CALL GLCD_RW_LOW
MOV AL,03FH
CALL MANDA_PORT_B
CALL ENABLE_PULSE
RET
;------------------------------------
;POSICIONA "CURSOR" NA COLUNA
GLCD_GOTO_COL:
PUSHF
PUSH AX
CALL GLCD_RS_LOW
CALL GLCD_RW_LOW
CMP AH,64
JL LEFT
CALL GLCD_CS2_LOW
CALL GLCD_CS1_HIGH
SUB AH,64
MOV COL_DATA,AH
JMP SAI_GOTO_COL
LEFT:
CALL GLCD_CS1_LOW
CALL GLCD_CS2_HIGH
MOV COL_DATA,AH
SAI_GOTO_COL:
OR COL_DATA, 40H
AND COL_DATA, 7FH
MOV AL,COL_DATA
CALL MANDA_PORT_B
CALL ENABLE_PULSE
POP AX
POPF
RET
;------------------------------------
;------------------------------------
;POSICIONA "CURSOR" NA COLUNA
GLCD_GOTO_COL_TEXT:
PUSHF
PUSH AX
PUSH BX
PUSH AX
MOV BL,8
MOV AL,AH
MUL BL
MOV BL,AL
POP AX
MOV AH,BL
CALL GLCD_RS_LOW
CALL GLCD_RW_LOW
CMP AH,64
JL LEFT_TEXT
CALL GLCD_CS2_LOW
CALL GLCD_CS1_HIGH
SUB AH,64
MOV COL_DATA,AH
JMP SAI_GOTO_COL_TEXT
LEFT_TEXT:
CALL GLCD_CS1_LOW
CALL GLCD_CS2_HIGH
MOV COL_DATA,AH
SAI_GOTO_COL_TEXT:
OR COL_DATA, 40H
AND COL_DATA, 7FH
MOV AL,COL_DATA
CALL MANDA_PORT_B
CALL ENABLE_PULSE
POP BX
POP AX
POPF
RET
;------------------------------------
;------------------------------------
;POSICIONA "CURSOR" NA LINHA
GLCD_GOTO_ROW:
PUSH AX
CALL GLCD_RS_LOW
CALL GLCD_RW_LOW
OR AL,0B8H
AND AL,0BFH
MOV COL_DATA,AL
CALL MANDA_PORT_B
CALL ENABLE_PULSE
POP AX
RET
;------------------------------------
;------------------------------------
;POSICIONA "CURSOR" NA LINHA
GLCD_GOTO_ROW_TEXT:
PUSH AX
CALL GLCD_RS_LOW
CALL GLCD_RW_LOW
OR AL,0B8H
AND AL,0BFH
MOV COL_DATA,AL
CALL MANDA_PORT_B
CALL ENABLE_PULSE
POP AX
RET
;------------------------------------
;------------------------------------
; AH LINHA E AL COLUNA
; POSICIONAMENTO DO "CURSOR" EM LINHA X COLUNA
; MODO GRAFICO (128x64)
GLCD_GOTO_XY:
CALL GLCD_GOTO_COL
CALL GLCD_GOTO_ROW
RET
;;------------------------------------
;------------------------------------
; AH LINHA E AL COLUNA
; POSICIONAMENTO DO "CURSOR" EM LINHA X COLUNA
; COLUNAS 16 (0..15), LINHAS 8 (0..7)
GLCD_GOTO_XY_TEXT:
CALL GLCD_GOTO_COL_TEXT
CALL GLCD_GOTO_ROW_TEXT
RET
;------------------------------------
; AL = DATA
GLCD_WRITE:
CALL GLCD_RS_HIGH
CALL GLCD_RW_LOW
CALL MANDA_PORT_B
CALL ENABLE_PULSE
RET
;AL = DATA
GLCD_CLRLN:
PUSHF
PUSH AX
PUSH CX
MOV AH,0
CALL GLCD_GOTO_XY
MOV AH,64
CALL GLCD_GOTO_XY
CALL GLCD_CS1_LOW
MOV AL,0
MOV CX,64
ESCREVA:
CALL GLCD_WRITE
LOOP ESCREVA
POP CX
POP AX
POPF
RET
;---------------------------------------------------------
;APAGA DISPLAY GRAFICO
GLCD_CLR:
PUSHF
PUSH AX
MOV AL,0
CLRLN:
CALL GLCD_CLRLN
ADD AL,1
CMP AL,8
JNE CLRLN
POP AX
POPF
RET
;---------------------------------------------------------
;---------------------------------------------------------
;DESENHA UM PONTO NESTAS COORDENADAS
;AH, AL, BH
;COLUNAS MODO GRAFICO = 128 (0..127) AH
;LINHAS MODO GRAFICO = 64 (0..63) AL
;BH = 0 PIXEL APAGADO, BH=1 PIXEL ACESO
GLCD_DRAW_POINT:
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH AX ; SALVA AH, AL
PUSH AX ; SALVA AH, AL
MOV CH,AH ; SALVA AH
MOV AH,0
MOV BL,8
DIV BL
MOV AH,CH
CALL GLCD_GOTO_XY
POP AX ; RESTAURA AH, AL
CMP BH,0
JE LIGHT_SPOT
MOV AH,0
MOV BH,8
DIV BH
; AH RESTO
MOV CL,AH
MOV AL,1
SHL AL,CL
MOV COL_DATA_AUX,AL
MOV AH,CH
CALL GLCD_READ_DATA
OR COL_DATA_AUX,AL
JMP SAI_GLCD_DRAW_POINT
LIGHT_SPOT:
MOV AH,0
MOV BH,8
DIV BH
; AH RESTO
MOV CL,AH
MOV AL,1
SHL AL,CL
NOT AL
MOV COL_DATA_AUX,AL
MOV AH,CH
CALL GLCD_READ_DATA
AND COL_DATA_AUX,AL
SAI_GLCD_DRAW_POINT:
POP AX
MOV CH,AH ; SALVA AH
MOV AH,0
MOV BL,8
DIV BL
MOV AH,CH
CALL GLCD_GOTO_XY
MOV AL, COL_DATA_AUX
CALL GLCD_WRITE
POP CX
POP BX
POP AX
POPF
RET
;---------------------------------------------------------
;---------------------------------------------------------
;LE STATUS DO DISPLAY
GLCD_READ_DATA:
CALL INICIALIZA_8255_PORT_INPUT
CALL GLCD_RW_HIGH
CALL GLCD_RS_HIGH
CMP AH,63
JG HAB_CS2
HAB_CS1:
CALL GLCD_CS2_HIGH
CALL GLCD_CS1_LOW
JMP HAB
HAB_CS2:
CALL GLCD_CS2_LOW
CALL GLCD_CS1_HIGH
HAB:
CALL GLCD_EN_HIGH
CALL GLCD_EN_LOW
CALL GLCD_EN_HIGH
CALL LE_PORT_B
MOV READ_DATA,AL
CALL GLCD_EN_LOW
CALL INICIALIZA_8255_PORTB_OUTPUT
RET
;---------------------------------------------------------
;---------------------------------------------------------
; AL = INDICE CARACTER FONT (COMECA EM 0)
; IMPRIME CARACTER NA LINHA E COLUNA DEFINIDA
PRINT_CAR:
PUSHF
PUSH AX
PUSH BX
PUSH CX
MOV BL,5
MUL BL
MOV BX,AX
MOV CX,5
PRINTING_CAR:
MOV AL,FONTS[BX]
CALL GLCD_WRITE
INC BX
LOOP PRINTING_CAR
POP CX
POP BX
POP AX
POPF
RET
;---------------------------------------------------------
; AH = COLUNA, AL=LINHA
; PRIMEIRO BYTE DO VETOR É NUMERO DE LINHAS E COLUNAS OCUPADAS
; EXEMPLO, IMAGEM DE 24X24 PIXELS = 3 LINHAS X 3 COLUNAS
PRINT_ICON:
PUSHF
PUSH AX
PUSH CX
MOV CL, DS:[SI]
MOV QNT_COLUNAS, CL ; QNT COLUNAS IMPRESSAS
MOV SALVA_QNT_COLUNAS, CL ; GUARDA QNT PARA NOVO LACO QNT COLUNAS IMPRESSAS
MOV POS_COLUNAS, AH ; COLUNA PASSADA COMO PARAMETRO
MOV CL, DS:[SI+1]
MOV LINHA, CL ;LINHA
ADD SI,2 ; APONTA PARA ICONE...
PRINT:
MOV CX,8
CALL GLCD_GOTO_XY_TEXT
PRINTING_ICON:
PUSH AX
MOV AL,DS:[SI]
CALL GLCD_WRITE
POP AX
INC SI
LOOP PRINTING_ICON
INC AH
DEC QNT_COLUNAS
JNE PRINT
MOV AH,SALVA_QNT_COLUNAS
MOV QNT_COLUNAS,AH
MOV AH,POS_COLUNAS
INC AL
DEC LINHA
JNE PRINT
POP CX
POP AX
POPF
RET
;---------------------------------------------------------
;ESTA ROTINA IMPRIME O GRAFICO APONTADO POR SI
PLOT_BMP:
PUSHF
PUSH AX
PUSH SI
MOV AL,0
MOV AH,0
PLOT:
CALL GLCD_GOTO_XY
PUSH AX
MOV AL,[SI]
CALL GLCD_WRITE
POP AX
INC SI
INC AH
CMP AH,127
JNE PLOT
MOV AH,0
INC AL
CMP AL,8
JNE PLOT
POP SI
POP AX
POPF
RET
;---------------------------------------------------------
;---------------------------------------------------------
;ATIVA O GLCD
GLCD_ATIVA:
CALL GLCD_CS1_HIGH
CALL GLCD_CS2_HIGH
CALL GLCD_RST_HIGH
CALL GLCD_ON
RET
;---------------------------------------------------------
;---------------------------------------------------------
;ESTAS ROTINAS APENAS GERAM PULSOS PARA O DISPLAY GRAFICO
GLCD_CS1_HIGH:
PUSHF
PUSH AX
OR GLCD_CONTROL, 32
MOV AL,GLCD_CONTROL
CALL MANDA_PORT_A
POP AX
POPF
RET
GLCD_CS1_LOW:
PUSHF
PUSH AX
MOV AL, 32
NOT AL
AND GLCD_CONTROL, AL
MOV AL,GLCD_CONTROL
CALL MANDA_PORT_A
POP AX
POPF
RET
GLCD_CS2_HIGH:
PUSHF
PUSH AX
OR GLCD_CONTROL, 16
MOV AL,GLCD_CONTROL
CALL MANDA_PORT_A
POP AX
POPF
RET
GLCD_CS2_LOW:
PUSHF
PUSH AX
MOV AL, 16
NOT AL
AND GLCD_CONTROL, AL
MOV AL,GLCD_CONTROL
CALL MANDA_PORT_A