-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVotos.asm
2291 lines (1899 loc) · 80.6 KB
/
Votos.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
; multi-segment executable file template.
data segment
;*************************** Constantes *******************************************
num_eleitores EQU 08
PASS EQU 'morangos'
; cores
BRANCO EQU 15
VERMELHO EQU 04
PRETO EQU 00
; teclas
ENTER EQU 13
BACKSPACE EQU 08
ESC EQU 27
; FD TYPE
READ EQU 00
WR EQU 01
READWR EQU 02
; caracteres
CR EQU 0dh
LF EQU 0Ah
Tab EQU 09
HIFEN EQU 45
; tamanhos
squareSize EQU 10
maxNum EQU 12
maxString EQU 30
lineSize EQU 190
; figuras desenhadas: o ecra tem 200 rows | 320 colunas, cada pixel esta em ordem na memoria a primeira linha
; do ecra é entao de 1 a 320, dai em diante se quero meter o meu quadrado no row 20 e coluna 230 fica 20 * 320 + 230
; depois o mesmo espaçamento é usado para todos => 8000 (25 rows)
square1 EQU 6660
square2 EQU square1 + 8000
square3 EQU square2 + 8000
square4 EQU square3 + 8000
square5 EQU square4 + 8000
rect EQU 54587
line1 EQU 23100
line2 EQU 31100
;*************************** Menu *******************************************
; as strings sao null terminated e fazem parte do mesmo bloco podem ou nao ter nome, mas dependendo do caso, vamos (ou nao) ter que reutiliza-las
; individualmente , o int 21h vai fazer printate ao $ portanto podemos printar tudo de uma vez
str_menu db "Votar", "$"
str_menu2 db " Carregar eleitores", "$"
restoMenu:
db "Gerir", CR,LF,LF,LF,LF,Tab
db " Creditos", CR,LF,LF,LF,LF,Tab,Tab
db " Sair", "$"
restoMenu2:
db "Grafico de Resultados",CR,LF,LF,LF,Tab,Tab
db " Sair", "$"
;*************************** Input *******************************************
num_eleitor dw 1 dup (00)
pass_input db maxString+1 dup (00)
passwd db PASS, 00
input_s:
db "Introduza o seu numero de eleitor",CR,LF," (max: 65535):","$"
db "Introduza a palavra chave ",CR,LF," da administracao:", "$" ; 51
; candidatos
c1 db "Manuel Maria du Bocage:", Tab,"$"
c2 db "Paula Rego:", Tab,Tab,Tab,"$"
c3 db "Luiz Vaz de Camoes:", Tab,Tab,"$"
c4 db "Natalia Correia: ", Tab,Tab,"$"
c5 db "Amadeo de Souza-Cardoso:",Tab,"$"
; contadores de votos
v1 db 1 dup (00)
v2 db 1 dup (00)
v3 db 1 dup (00)
v4 db 1 dup (00)
v5 db 1 dup (00)
voto1 db 1 dup (00)
voto2 db 1 dup (00)
voto3 db 1 dup (00)
voto4 db 1 dup (00)
voto5 db 1 dup (00)
s_votos_brancos db "VOTOS EM BRANCO:",Tab,Tab,"$"
votos_brancos db 1 dup (00)
s_votos_nulos db "VOTOS NULOS:",Tab,Tab,Tab,"$"
votos_nulos db 1 dup (00)
;*************************** Misc *******************************************
quantos_votos db 1 dup (06) ; comeca a 5 porque vai ser decrementado 6 vezes antes da votaçao
bool_eleitoresCarregados db 1 dup (00)
rectLength dw 1 dup (squareSize)
rectHeight dw 1 dup (squareSize)
s_aux db "Eleitor: ", "$"," - ","$"
s_continue db "CONTINUAR", "$"
s_saving db "Saving...", LF,"$"
s_loading db "Loading file...", LF,"$"
s_loaded db "eleitores carregados!", "$"
s_click db "Click to continue", "$"
s_key db "Press any key to continue", "$"
s_indisp db "Acao indisponivel", "$"
s_cabecalho db "Numero",Tab,"Nome",Tab,Tab,"Data/Hora",CR,LF
authors:
db " Tiago leal 66181", CR,LF,LF,LF,Tab
db " Sidi brahim 63452", CR,LF,LF,LF,Tab
db " Guilherme Silva 64937", "$"
;*************************** Ficheiros ***********************************************
dataFile db "C:\dados.bin", 00
logFile db "C:\logs.txt", 00
csvFile db "C:\Eleitores.csv", 00
buffer db 01 dup(00) ; Buffer para leitura de dados
lista_eleitores db (02 + 30 + 01) * num_eleitores dup(00)
;*************************** error ***********************************************
serr_path db "error: path not found" ,LF,"$"
serr_access db "error: access denied" ,LF,"$"
serr_invhand db "error: invalid handler" ,LF,"$"
serr_wpass db "error: wrong password" ,LF,"$"
serr_failed db "error: loading failed" ,LF,"$"
serr_nan db "error: input a number" ,LF,"$"
serr_empty db "error: empty argument" ,LF,"$"
serr_open db "error: could not open file" ,LF,"$"
serr_close db "error: could not close file" ,LF,"$"
serr_create db "error: could not create file",LF,"$"
serr_read db "error: could not read file" ,LF,"$"
serr_write db "error: could not write file" ,LF,"$"
serr_max db "error: exceeded max value" ,LF,"$"
serr_inv db "eleitor nao existente" ,LF,"$"
serr_rep db "eleitor ja votou!" ,LF,"$"
serr_num db "je chega de numeros!" ,LF,"$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
include emu8086.inc
mov Ax, data
mov ds, Ax
mov es, Ax
call init_mouse
call cleanPixels
call loadDataFile
call selectMenu ; loop infinito ate sair
call loadMemoryToBin
mov Ax, 4c00h ; exit to operating system.
int 21h
;*************************************************************************************************
; Nome: printMenu
; Descrição: Exibe o menu principal na tela, verificando se os dados de eleitores foram carregados.
;
; Input: N/A.
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
printMenu proc
cmp bool_eleitoresCarregados, 00 ; do enunciado: não pode entrar aqui se não estiverem carregados os dados dos eleitores
je print_menu
mov Dx, 0410h
call setCursorPosition
lea Dx, str_menu
call printStr$
jmp print_rest
print_menu:
mov Dx, 040Bh
call setCursorPosition
lea Dx, s_indisp
call printStr$
print_rest:
mov Dx, 0810h
call setCursorPosition
lea Dx, restoMenu
call printStr$
ret
printMenu endp
;*************************************************************************************************
; Nome: selectMenu
; Descrição: Detecta cliques no menu principal e chama a função correspondente à opção escolhida,
; votar, gerir, créditos ou sair.
;
; Input: bool_eleitoresCarregados - 01 | 00
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
selectMenu proc
main_loop:
call setTextMode
call printMenu
click_loop:
call getClick ; loop infinito que sai e retorna posicao do rato QUANDO o rato for premido => Cx row | Dx coluna
cmp Cx, 115
jl click_loop
cmp Cx, 185
jg click_loop
cmp Dx, 28
jl click_loop
cmp Dx, 137
jg click_loop
cmp Dx, 40
jl vote
cmp Dx, 60
jl click_loop
cmp Dx, 72
jl manage
cmp Dx, 93
jl click_loop
cmp Dx, 105
jl credits
cmp Dx, 126
jl click_loop
jmp exit_program
vote:
cmp bool_eleitoresCarregados, 00
je click_loop
call frontOffice
jmp main_loop
manage:
call backOffice
jmp main_loop
credits:
call setTextMode
mov Dx, 070Bh
call setCursorPosition
lea Dx, authors
call printStr$
call keyToContinue
jmp main_loop
exit_program:
call setTextMode
ret
selectMenu endp
;************************************************************** Votar ****************************************************************
;*************************************************************************************************
; Nome: frontOffice
; Descrição: Gerencia a interface de votação e incrementa os votos que foram feitos,
; nulo, branco ou valido.
;
; Input: N/A.
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
frontOffice proc
call setTextMode
; pede numero eleitor
GOTOXY 2, 2
lea Dx, input_s
call PrintStr$
call getNumeroEleitor
cmp Bx, 10
jg fim_front_office
call validaNumeroEleitor
cmp Bx, 01
je fim_front_office
call setVideoMode
call showCandidates
call voteLoop
cmp quantos_votos, 00
je voto_branco
cmp quantos_votos, 01
jg voto_nulo
; voto valido
call addVotesToCounters
jmp fim_front_office
voto_branco:
inc votos_brancos
jmp fim_front_office
voto_nulo:
inc votos_nulos
fim_front_office:
mov num_eleitor, 00
mov quantos_votos, 06
call cleanPixels
mov voto1, 00
mov voto2, 00
mov voto3, 00
mov voto4, 00
mov voto5, 00
ret
frontOffice endp
;*************************************************************************************************
; Nome: validaNumeroEleitor
; Descrição: Valida se o número de eleitor fornecido se encontra , se sim, verifica se já votou.
;
; Input: Nenhum.
; Output: Bx = 01 (nao encontrou eleitor/eleitor ja votou) | Bx = 00 (eleitor valido)
; Destroi: N/A.
;*************************************************************************************************
validaNumeroEleitor proc
lea Di, lista_eleitores
mov Ax, num_eleitor
mov Cx, num_eleitores
valida_loop:
cmp [Di], Ax
je eleitor_encontrado
add Di, 33
loop valida_loop
lea Dx, serr_inv
call printError
mov Bx, 01
sai_erro:
ret
eleitor_encontrado:
cmp [Di + 32], 00 ; nulo se nao votou
je sair_validacao
lea Dx, serr_rep
call printError
mov Bx, 01
jmp sai_erro
sair_validacao:
mov Bx, 00
ret
validaNumeroEleitor endp
;*************************************************************************************************
; Nome: showCandidates
; Descrição: Exibe o menu de votacao nos candidatos, com o numero e nome do eleitor encontrado.
;
; Input: Di - endereço do primeiro byte do eleitor a selecionado
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
showCandidates proc
; print candidatos
mov Dx, 0301h
call setCursorPosition
lea Dx, c1
call printStr$
mov Dx, 0601h
call setCursorPosition
lea Dx, c2
call printStr$
mov Dx, 0901h
call setCursorPosition
lea Dx, c3
call printStr$
mov Dx, 0C01h
call setCursorPosition
lea Dx, c4
call printStr$
mov Dx, 0F01h
call setCursorPosition
lea Dx, c5
call printStr$
call printCandidatesRect
; print da linha "Eleitor: (num) - (name)"
mov Dx, 1402h
call setCursorPosition
lea Dx, s_aux
call PrintStr$
mov Ax, [Di]
mov Dx, 10000
call divideInt
call printByte ; primeiro digito
mov Dx, 1000
call divideInt
call printByte ; segundo digito
mov Dx, 100
call divideInt
call printByte ; terceiro digito
mov Dx, 10
call divideInt
call printByte ; quarto digito
call printByte ; quinto digito
add Di, 2
; " - "
lea Dx, s_aux+10
call PrintStr$
mov Ah, 0Eh
mov Cx, 30
print_nome_eleitor:
mov Al, [Di]
cmp Al, 00 ; quando chegar a um char null
je fim_nome
int 10h
inc Di
loop print_nome_eleitor
fim_nome:
inc Di
loop fim_nome ; avanca o resto dos nulos
sub Di, 32
; print CONTINUAR
mov Dx, 1618h
call setCursorPosition
lea Dx, s_continue
call PrintStr$
call printContinueRect
ret
showCandidates endp
;*************************************************************************************************
; Nome: printByte
; Descrição: Imprime um único byte (valor numérico) na tela no formato ASCII.
;
; Input: Al - valor a imprimir na tela
; Dx - resto da divisao anterior
; Output: Ax - valor a ser imprimido da proxima vez que chamarmos a rotina
; Destroi: N/A.
;*************************************************************************************************
printByte proc
push Dx
mov Ah, 0Eh
add Al, '0'
int 10h
pop Ax
ret
printByte endp
;*************************************************************************************************
; Nome: voteLoop
; Descrição: Gerencia o loop de votação, detectando cliques e atualizando os votos selecionados
; retorna ao menu principal.
;
; Input: N/A.
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
voteLoop proc
push Di
vote_loop:
call getClick ; Dx => colunas | Cx => linhas
cmp Dx, 20
jl vote_loop
cmp Dx, 130
jg continue
cmp Cx, 520
jl vote_loop
cmp Cx, 540
jg vote_loop
cmp Dx, 30
jl square_1
cmp Dx, 45
jl vote_loop
cmp Dx, 55
jl square_2
cmp Dx, 70
jl vote_loop
cmp Dx, 80
jl square_3
cmp Dx, 95
jl vote_loop
cmp Dx, 105
jl square_4
cmp Dx, 120
jl vote_loop
cmp Dx, 130
jl square_5
jmp vote_loop
square_1:
not voto1
lea Di, [square1]
jmp draw
square_2:
not voto2
lea Di, [square2]
jmp draw
square_3:
not voto3
lea Di, [square3]
jmp draw
square_4:
not voto4
lea Di, [square4]
jmp draw
square_5:
not voto5
lea Di, [square5]
draw:
call drawSquare
jmp vote_loop
continue:
cmp Dx, 167
jl vote_loop
cmp Cx, 370
jl vote_loop
cmp Cx, 530
jg vote_loop
cmp Dx, 190
jg vote_loop
pop Di
call saveVotesToLog
ret
voteLoop endp
;*************************************************************************************************
; Nome: addVotesToCounters
; Descrição: Adiciona os votos válidos aos contadores de cada candidato. Os votos estarao
; negativos se tiverem selecionados
;
; Input: voto1 a voto5 - 00 (candidato nao selecionado) | -1 (selecionado)
; Output: N/A.
; Destroi: N/A.
;*************************************************************************************************
addVotesToCounters proc
cmp voto1, 00
je add_voto2
neg voto1
mov Al, voto1
add v1, Al
add_voto2:
cmp voto2, 00
je add_voto3
neg voto2
mov Al, voto2
add v2, Al
add_voto3:
cmp voto3, 00
je add_voto4
neg voto3
mov Al, voto3
add v3, Al
add_voto4:
cmp voto4, 00
je add_voto5
neg voto4
mov Al, voto4
add v4, Al
add_voto5:
cmp voto5, 00
je fim_add_votos
neg voto5
mov Al, voto5
add v5, Al
fim_add_votos:
ret
addVotesToCounters endp
;*************************************************************************************************
; Nome: saveVotesToLog
; Descrição: Salva as informações de votos nos logs com a formatação
; número eleitor TAB nome eleitor TAB data (com '-') ESPAÇO horário (com ':').
;
; Input: Nenhum.
; Output: Nenhum.
; Destroi: N/A.
;*************************************************************************************************
saveVotesToLog proc
call setTextMode
lea Dx, s_saving
call printStr$
lea Dx, logFile
mov Al, READWR
call openFile
jnc log_file_exists
mov Al, READWR
call createFile
mov Bx, Ax
mov Cx, 24 ; testar
lea Dx, s_cabecalho
call writeToFile
jmp seek
log_file_exists:
mov Bx, Ax
seek:
mov al, 02 ; mete o file pointer no fim do ficheiro
call fSeek
; numero eleitor
mov Cx, 01
mov Ax, [Di]
mov Dx, 10000
call divideInt
call printByteToFile ; primeiro digito
mov Dx, 1000
call divideInt
call printByteToFile
mov Dx, 100
call divideInt
call printByteToFile
mov Dx, 10
call divideInt
call printByteToFile
call printByteToFile
add Di, 2
mov [buffer], Tab
call writeToFile
; nome eleitor
mov Cx, 30
save_nome_eleitor:
mov Al, [Di]
cmp Al, 00 ; quando chegar a um char null
je fim_nome_log
push Cx
mov Cx, 01
mov [buffer], Al
call writeToFile
pop Cx
inc Di
loop save_nome_eleitor
fim_nome_log:
inc Di
loop fim_nome_log
mov Cx, 01
mov [buffer], Tab
call writeToFile
call writeDateTimeTolog
mov Cx, 01
mov [buffer], CR
call writeToFile
mov [buffer], LF
call writeToFile
call closeFile
; muda byte voto
mov [Di], 01
call keyToContinue
leave_log:
ret
saveVotesToLog endp
;*************************************************************************************************
; Nome: printByteToFile
; Descrição: Escreve um único byte convertido para ASCII no ficheiro.
;
; Input: Al - byte a escrever
; Bx - handler ficheiro
; Dx - resto da divisao anterior
; Output: Ax - o proximo valor a escrever quando a rotina for utilizada outra vez
; Destroi: N/A.
;**************************************************************************************************
printByteToFile proc
push Dx
add Ax, '0'
mov [buffer], Al
call writeToFile
pop Ax
ret
printByteToFile endp
;***************************************************************** Gerir ************************************************************
;*************************************************************************************************
; Nome: backOffice
; Descrição: Gera o menu de administração após validação da palavra-passe. Apenas prossegue se a
; passe for correta, senao podemos sair com ESC
;
; Input: Nenhum.
; Output: Nenhum.
; Destroi: N/A.
;**************************************************************************************************
backOffice proc
call setTextMode
; pergunta pela password
mov Dx, 0202h
call setCursorPosition
lea Dx, input_s+51
call printStr$
passwd_loop:
lea Si, passwd
lea Di, pass_input
call getName
cmp Bx, 01
je return_to_menu
mov Cx, 09
repe cmpsb
jnz not_equal ; Flag zero metida a 0 se algum charactere n for igual
jmp valid_user ; se for igual apresenta o próximo menu
not_equal:
lea Di, pass_input
mov Cx, maxString+1 ; verificar que a string ta limpa
call clearString
lea Dx, serr_wpass
call printError
jmp passwd_loop
valid_user:
call menuGerente
return_to_menu:
lea Di, pass_input
mov Cx, maxString+1
call clearString
ret
backOffice endp
;***************************************************************************************************
; Nome: menuGerente
; Descrição: Exibe o menu de gerenciamento, permitindo carregar eleitores apenas se ja nao tiverem
; sido carregados.
;
; Input: bool_eleitoresCarregados
; Output: Nenhum.
; Destroi: N/A.
;***************************************************************************************************
menuGerente proc
call setVideoMode
cmp bool_eleitoresCarregados, 00
jg carregar_eleitores_indisponivel
mov Dx, 070Ah
call setCursorPosition
lea Dx, str_menu2
call printStr$
jmp resto_menu
carregar_eleitores_indisponivel:
mov Dx, 070Bh
call setCursorPosition
lea Dx, s_indisp
call printStr$
resto_menu:
mov Dx, 0A09h
call setCursorPosition
lea Dx, restoMenu2
call printStr$
call printGerirLines
gerir_loop:
call getClick
cmp Cx, 116
jl gerir_loop
cmp Cx, 510
jg gerir_loop
cmp Dx, 115
jg gerir_loop
cmp Dx, 50
jl gerir_loop
cmp Dx, 72
jl carregar_eleitores
cmp Dx, 97
jl grafico_resultados
jmp sair_menu_gerir
carregar_eleitores:
cmp bool_eleitoresCarregados, 00
jg gerir_loop
call setTextMode
mov Dx, 0A03h
call setCursorPosition
lea Dx, s_loading
call printStr$
call carregarEleitoresMemoria
call setTextMode
mov Dx, 0C03h
call setCursorPosition
lea Dx, s_loaded
call printStr$
call wait1s
jmp sair_menu_gerir
grafico_resultados:
call mostrarResultados
sair_menu_gerir:
call cleanPixels
ret
menuGerente endp
;***************************************************************************************************
; Nome: carregarEleitoresMemoria
; Descrição: Carrega os dados dos eleitores a partir de um ficheiro CSV para a estrutura lista_eleitores.
;
; Input: Nenhum
; Output: bool_eleitoresCarregados - 01
; Destroi: N/A.
;***************************************************************************************************
carregarEleitoresMemoria proc
lea Dx, csvFile
mov Al, READ
call openFile
jnc csvFileExists
call createFile ; completar em caso de erro de criacao
jc fim_read_csv
csvFileExists:
mov Bx, Ax
mov Cx, num_eleitores
lea Di, lista_eleitores
carregar_loop:
push Cx
lea Dx, buffer
xor Ax, Ax
read_number_loop:
mov Cx, 01 ; vamos querer sempre ler só 1 byte
call readFromFile ; as strings teram sempre ',' portanto nao e necessario proteger com jc
cmp [buffer], ',' ; Verificar se encontrou a virgula
je read_number_fim ; Finalizar ao encontrar a virgula
push Dx
mov Cx, 10 ; multiplicar digito anterior por 10
mul Cx
pop Dx
sub [buffer], '0'
add Al, [buffer]
jmp read_number_loop
read_number_fim:
mov [Di], Ax
add Di, 2
mov Cx, 30
xor Ax, Ax
read_name_loop:
push Cx
mov Cx, 01
call readFromFile ; quando nao ha carry e Ax ta a 00 é porque atingiu EOF, mas havera sempre CR LF
pop Cx
cmp [buffer], CR ; Encontrar o Carriage Return
je read_name_fim
mov Al, [buffer]
stosb ; Armazenar byte no endereco apontado por DI
loop read_name_loop
read_name_fim:
mov Al, 00
stosb
loop read_name_fim ; preenche os espaços restantes com nulos (até 30)
stosb ; bit de voto inicializado a nulo
mov Cx, 01
call readFromFile ; ler o LF (e desperdicar)
pop Cx
loop carregar_loop
fim_read_csv:
call closeFile
inc bool_eleitoresCarregados
ret
carregarEleitoresMemoria endp
;***************************************************************************************************
; Nome: mostrarResultados
; Descrição: Exibe os resultados da votação obtidas até ao momento.
;
; Input: Nenhum
; Output: Nenhum
; Destroi: N/A.
;***************************************************************************************************
mostrarResultados proc
call setVideoMode
mov Bx, 0101h
lea Dx, c1
mov Cl, v1
call printCandidato
mov Bx, 0301h
lea Dx, c2
mov Cl, v2
call printCandidato
mov Bx, 0501h
lea Dx, c3
mov Cl, v3
call printCandidato
mov Bx, 0701h
lea Dx, c4
mov Cl, v4
call printCandidato
mov Bx, 0901h
lea Dx, c5
mov Cl, v5
call printCandidato
mov Bx, 0B01h
lea Dx, s_votos_brancos
mov Cl, votos_brancos
call printCandidato
mov Bx, 0D01h
lea Dx, s_votos_nulos
mov Cl, votos_nulos
call printCandidato
; graficos
call keyToContinue
call setVideoMode
mov Dx, 0101h
call setCursorPosition
lea Dx, c1
call printStr$
mov Dx, 0301h
call setCursorPosition
lea Dx, c2
call printStr$
mov Dx, 0501h
call setCursorPosition
lea Dx, c3