-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsnake-source.asm
More file actions
1722 lines (1466 loc) · 35.3 KB
/
Copy pathsnake-source.asm
File metadata and controls
1722 lines (1466 loc) · 35.3 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
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
;=============================================================================;
; SNAKE! ver 0.1 ;
; ;
; by Bruno (_Faster) (x_bruno17@yahoo.com.br) 2003;
; ToDo - Optimizar o péssimo código :( ;
;=============================================================================;
.model compact
.stack 100h
.386
;=============================================================================;
.data
SNAKECOUNT EQU 50
STARSCOUNT EQU 25
Buffer db 64000 DUP (?)
Palette db 0,0,0, 0,0,40, 40,0,0, 5,4,3, 23,23,23, 40,40,40, 15,10,10,0,0,0,20,0,0,0,00,00
db 30,1,2,0,0,0,63,63,63,0,0,0,0,0,0,63,30,0,63,63,63,63,63,63,0,00
db 0,63,63,63,10,20,00,10,50,00,20,30,00,63,63,20,20,30,00,20,63,00
db 30,40,00,63,63,63
ARect STRUC
X dw ?
Y dw ?
XL dw ?
YL dw ?
Color db ?
ARect ENDS
AFont STRUC
X dw ?
Y dw ?
InitX dw ?
Col db ?
Italic db ?
Shadow db 255
AFont ENDS
TempX dw ?
TempY dw ?
TempByte db ?
CharToDraw db ?
Radius dw ?
Angle dw ?
DegPi dw ?
ShowDebug db ?
ShowStars db ?
Rect ARect <>
Font AFont <>
HeadFlag db ?
Dir db ?
Vel db ?
VelCount db ?
IntroMode db ?
SCount db ?
Score dd ?
Level db ?
StringMask dd ?
DotX db ?
DotY db ?
RandRange dw ?
Seed dw ?
.FARDATA @dsegment2
;font usada durante o jogo
SmallFont db 000, 000, 000, 000, 000, 032, 032, 032, 000, 032, 080, 080, 000, 000, 000, 080
db 248, 080, 248, 080, 032, 112, 096, 048, 112, 200, 208, 032, 088, 152, 096, 104
db 112, 144, 104, 032, 032, 000, 000, 000, 016, 032, 032, 032, 016, 064, 032, 032
db 032, 064, 168, 112, 032, 112, 168, 032, 032, 248, 032, 032, 000, 000, 000, 032
db 064, 000, 000, 248, 000, 000, 000, 000, 000, 000, 032, 008, 016, 032, 064, 128
db 112, 136, 136, 136, 112, 016, 048, 016, 016, 056, 112, 008, 112, 128, 248, 240
db 008, 112, 008, 240, 016, 144, 240, 016, 016, 240, 128, 240, 008, 240, 112, 128
db 240, 136, 112, 120, 008, 016, 032, 032, 112, 136, 112, 136, 112, 112, 136, 120
db 008, 112, 000, 032, 000, 032, 000, 000, 032, 000, 032, 064, 016, 032, 064, 032
db 016, 000, 248, 000, 248, 000, 064, 032, 016, 032, 064, 112, 008, 048, 000, 032
db 112, 184, 184, 128, 112, 112, 136, 248, 136, 136, 240, 136, 240, 136, 240, 112
db 128, 128, 128, 112, 240, 136, 136, 136, 240, 248, 128, 240, 128, 248, 248, 128
db 240, 128, 128, 120, 128, 184, 136, 120, 136, 136, 248, 136, 136, 248, 032, 032
db 032, 248, 120, 016, 016, 144, 096, 136, 144, 224, 144, 136, 128, 128, 128, 128
db 248, 136, 216, 168, 136, 136, 136, 200, 168, 152, 136, 112, 136, 136, 136, 112
db 240, 136, 240, 128, 128, 112, 136, 168, 152, 120, 240, 136, 240, 144, 136, 112
db 128, 112, 008, 112, 248, 032, 032, 032, 032, 136, 136, 136, 136, 112, 136, 136
db 080, 080, 032, 136, 136, 168, 216, 136, 136, 080, 032, 080, 136, 136, 136, 120
db 008, 112, 248, 016, 032, 064, 248, 112, 064, 064, 064, 112, 128, 064, 032, 016
db 008, 112, 016, 016, 016, 112, 032, 080, 000, 000, 000, 000, 000, 000, 000, 252, 000, 000, 000, 000, 000
SnakeBody db 00h, 14h, 14h, 14h, 14h, 14h, 14h, 00h
db 14h, 16h, 16h, 15h, 15h, 16h, 16h, 14h
db 14h, 16h, 15h, 15h, 15h, 15h, 16h, 14h
db 14h, 15h, 15h, 17h, 17h, 15h, 15h, 14h
db 14h, 15h, 15h, 17h, 17h, 15h, 15h, 14h
db 14h, 16h, 15h, 15h, 15h, 15h, 16h, 14h
db 14h, 16h, 16h, 15h, 15h, 16h, 16h, 14h
db 00h, 14h, 14h, 14h, 14h, 14h, 14h, 00h
Dot db 00h, 00h, 00h, 18h, 18h, 00h, 00h, 00h
db 00h, 00h, 18h, 1Ah, 1Ah, 18h, 00h, 00h
db 00h, 18h, 1Ah, 19h, 19h, 1Ah, 18h, 00h
db 18h, 1Ah, 19h, 1Bh, 1Bh, 19h, 1Ah, 18h
db 18h, 1Ah, 19h, 1Bh, 1Bh, 19h, 1Ah, 18h
db 00h, 18h, 1Ah, 19h, 19h, 1Ah, 18h, 00h
db 00h, 00h, 18h, 1Ah, 1Ah, 18h, 00h, 00h
db 00h, 00h, 00h, 18h, 18h, 00h, 00h, 00h
NumberStr db 17,"99999999",0
LevelText db 15,"NIVEL:",0
ScoreText db 15,"SCORE:",0
Credits db 17,"BY _FASTER 2003",0
GameTitle db 23,"SNAKE!",0
Ver db 17,"VERSAO 0.1",0
PressAKey db 15,"PRESSIONE ESPACO PARA CONTINUAR",0
PressAnyKey db 17,"PRESSIONE QUALQUER TECLA :(",0
InstrTitle db 17,"INSTRUCOES",0
Instruct db 17,"MOVER COBRINHA = ",15,"SETAS",255
db 17,"PAUSAR JOGO = ",15,"ESPACO",255
db 17,"APAGAR ESTRELAS = ",15,"S",255,255
db 17,"DEBUGMODE WINDOW = ",15,"D",255
db 17,"AUMENTAR NIVEL = ",15,"A",17," EM DEBUGMODE",255,255
db 17,"SAIR DO JOGO = ",23,"ESC",0
GOverTitle db 17,"GAME OVER :(",0
GameOver db 15,"NAO FIQUE TRISTE PRESSIONE ENTER PARA JOGAR",255
db " OUTRA PARTIDA, MAS SE VC",255
db " QUISER SAIR, APERTE ESC ",17,"(NAO VAHH)",15," :)",0
DebugTitle db 17,"DEBUG",0
DotXStr db 23,"DOT_X:",0
DotYStr db 23,"DOT_Y:",0
SnakeXStr db 23,"SNAKE_X:",0
SnakeYStr db 23,"SNAKE_Y:",0
SnakeStr db 23,"SIZE:",0
SSStr db 23,"SHOWSTARS:",0
UpStr db 17,"CIMA",0
DownStr db 15,"BAIXO",0
LeftStr db 21,"ESQ.",0
RightStr db 25,"DIR.",0
SnakeDirStr db 23,"DIRECAO:",0
FinalCredits db " ",17,"SNAKE!",255,255
db " ",23,"PROGRAMADO POR",255
db " ",15,"_FASTER (BRUNO COSTA)",255
db " ",25,"X_BRUNO17",17,"@",15,"YAHOO",17,".",15,"COM",17,".",15,"BR",255,255
db " EM",255
db " ",15,"VARIOS DIAS DE ",17,"AGOSTO",15," DE ",17,"2003",255,255,255
db " ",17,"VISITEM OS CANAIS:",255
db " ",21,"#DEFINE, #ROMHACKING, #UNASHAMED",255,255,255
db " ",17,"BLIND GUARDIAN ROX",255,255,255,255
db " ",21,"\O/",0
.FARDATA @dsegment3
ForeStarsX dw STARSCOUNT DUP (?)
BackStarsY dw STARSCOUNT DUP (?)
BackStarsX dw STARSCOUNT DUP (?)
ForeStarsY dw STARSCOUNT DUP (?)
SnakeX db SNAKECOUNT DUP (?)
SnakeY db SNAKECOUNT DUP (?)
;Logo, compactado com rle
Logo db 255,000,123,000,001,240,001,255,001,127,009,000,001,128,001,031
db 007,000,001,126,009,000,001,032,001,000,001,128,010,000,001,033
db 007,000,001,132,009,000,001,064,002,000,001,001,009,000,001,066
db 007,000,001,008,001,001,008,000,001,128,002,000,001,002,009,000
db 001,132,007,000,001,016,001,002,009,000,001,001,001,000,001,004
db 009,000,001,008,001,001,006,000,001,032,001,004,008,000,001,240
db 002,255,001,015,009,000,001,016,001,002,006,000,001,064,001,008
db 008,000,001,032,001,004,011,000,001,032,001,004,006,000,001,128
db 001,016,008,000,001,064,001,008,011,000,001,064,001,008,007,000
db 001,033,008,000,001,128,001,016,011,000,001,128,001,016,007,000
db 001,066,009,000,001,033,012,000,001,033,007,000,001,132,009,000
db 001,066,012,000,001,066,007,000,001,008,001,001,008,000,001,132
db 012,000,001,132,007,000,001,016,001,002,008,000,001,008,001,001
db 011,000,001,008,001,001,006,000,001,032,001,004,008,000,001,016
db 001,002,011,000,001,016,001,002,001,128,001,031,004,000,001,064
db 001,008,008,000,001,224,002,255,001,031,001,000,001,252,001,255
db 001,127,002,000,001,254,001,255,001,000,001,032,001,004,001,000
db 001,033,001,000,001,248,001,255,001,003,001,128,001,016,009,000
db 001,008,001,000,001,032,001,000,001,008,001,000,001,128,002,000
db 001,004,001,000,001,001,001,064,001,008,001,000,001,066,001,000
db 001,016,001,000,001,004,001,000,001,033,009,000,001,016,001,000
db 001,064,001,000,001,016,002,000,001,001,001,000,001,008,001,000
db 001,002,001,128,001,016,001,000,001,132,001,000,001,032,001,000
db 001,008,001,000,001,066,009,000,001,032,001,000,001,128,001,000
db 001,032,002,000,001,002,001,000,001,016,001,000,001,004,001,000
db 001,033,001,000,001,008,001,001,001,064,001,000,001,016,001,000
db 001,132,009,000,001,064,002,000,001,001,001,064,002,000,001,004
db 001,000,001,032,001,000,001,008,001,000,001,066,001,128,001,255
db 001,003,001,128,001,000,001,032,001,000,001,008,001,001,008,000
db 001,128,002,255,001,127,001,128,001,240,002,255,001,001,001,192
db 002,255,001,003,001,132,001,000,001,033,001,000,001,248,002,255
db 001,015,001,016,001,002,011,000,001,132,001,000,001,033,001,000
db 001,016,001,002,002,000,001,032,001,004,001,008,001,001,001,066
db 001,000,001,016,001,002,001,128,001,016,001,032,001,004,011,000
db 001,008,001,001,001,066,001,000,001,032,001,004,002,000,001,064
db 001,008,001,016,001,002,001,132,001,000,001,032,001,004,001,000
db 001,033,001,064,001,008,011,000,001,016,001,002,001,132,001,000
db 001,064,001,008,002,000,001,128,001,016,001,032,001,004,001,008
db 001,001,001,064,001,008,001,000,001,066,001,128,001,016,011,000
db 001,032,001,004,001,008,001,001,001,128,001,016,001,000,001,252
db 001,255,001,033,001,064,001,248,001,255,001,003,001,128,001,240
db 001,255,001,135,001,000,001,033,011,000,001,064,001,008,001,016
db 001,002,001,000,001,033,001,000,001,008,001,000,001,064,001,128
db 001,000,001,032,002,000,001,001,002,000,001,001,001,066,011,000
db 001,128,001,016,001,032,001,004,001,000,001,066,001,000,001,016
db 001,000,001,128,001,000,001,001,001,064,002,000,001,002,002,000
db 001,002,001,132,012,000,001,033,001,064,001,008,001,000,001,132
db 001,000,001,032,002,000,001,001,001,002,001,128,002,000,001,004
db 002,000,001,004,001,008,001,001,011,000,001,066,001,128,001,016
db 001,000,001,008,001,001,001,064,002,000,001,002,001,004,001,000
db 001,001,001,000,001,008,002,000,001,008,001,016,001,002,011,000
db 001,132,001,000,001,033,001,000,001,016,001,002,001,252,001,255
db 001,063,001,004,001,008,001,255,001,127,001,000,001,016,001,254
db 001,255,001,031,001,224,001,007,011,000,001,008,001,001,001,066
db 001,000,001,032,001,004,001,008,001,001,001,064,001,008,001,016
db 001,002,001,132,001,000,001,032,001,004,015,000,001,016,001,002
db 001,132,001,000,001,064,001,008,001,016,001,002,001,128,001,016
db 001,032,001,004,001,008,001,001,001,064,001,008,015,000,001,032
db 001,004,001,008,001,001,001,128,001,016,001,032,001,004,001,000
db 001,033,001,064,001,008,001,016,001,002,001,128,001,016,012,000
db 001,128,003,255,001,015,001,016,001,002,001,000,001,033,001,064
db 001,008,001,000,001,066,001,128,001,016,001,032,001,004,001,000
db 002,255,001,015,001,000,001,126,009,000,001,001,001,000,001,128
db 001,000,001,032,001,004,001,000,001,066,001,128,002,255,001,135
db 001,000,001,033,001,192,001,255,001,001,001,064,001,000,001,016
db 001,000,001,132,009,000,001,002,002,000,001,001,001,064,001,008
db 001,000,001,132,001,000,001,032,002,000,001,001,001,066,001,000
db 001,016,001,002,001,128,001,000,001,032,001,000,001,008,001,001
db 008,000,001,004,002,000,001,002,001,128,001,016,001,000,001,008
db 001,001,001,064,002,000,001,002,001,132,001,000,001,032,001,004
db 001,000,001,001,001,064,001,000,001,016,001,002,008,000,001,008
db 002,000,001,004,001,000,001,033,001,000,001,016,001,002,001,128
db 002,000,001,004,001,008,001,001,001,064,001,008,001,000,001,002
db 001,128,001,000,001,032,001,004,008,000,001,240,002,255,001,015
db 001,000,001,126,001,000,001,224,001,007,001,000,002,255,001,015
db 001,240,001,003,001,128,001,031,001,000,001,252,001,255,001,001
db 001,192,001,015,001,000,001,000,001,000,001,000,001,000,001,000
;===============================================================================
.code
ASSUME fs:@dsegment2
ASSUME gs:@dsegment3
;-------------------------------------------------------------------------------
Mode13h PROC
mov ax, 0013h
int 10h
mov si, offset palette
mov cx, 84
mov dx, 03C8h
xor al, al
cli
out dx, al
inc dx
cld
rep outsb
sti
ret
Mode13h ENDP
;-------------------------------------------------------------------------------
TextMode PROC
mov ax, 0003h
int 10h
ret
TextMode ENDP
;-------------------------------------------------------------------------------
PutPixel PROC
mov ax, TempY
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, offset Buffer
add di, TempX
mov al, TempByte
mov ds:[di], al
ret
PutPixel ENDP
;-------------------------------------------------------------------------------
Random PROC
mov ax, Seed
mov dx, 0ABCDh
mul dx
inc ax
mov seed, ax
xor dx, dx
mov cx, randrange
div cx
ret
Random ENDP
;-------------------------------------------------------------------------------
InitStars PROC
xor bx, bx
SetNextStar:
mov randrange, 309
call random
add dx, 10
mov ForeStarsX[bx], dx
mov randrange, 181
call random
add dx, 10
mov ForeStarsY[bx], dx
mov randrange, 307
call random
add dx, 13
mov BackStarsX[bx], dx
mov randrange, 181
call random
add dx, 10
mov BackStarsY[bx], dx
inc bx
inc bx
cmp bx, STARSCOUNT*2
jne SetNextStar
ret
InitStars ENDP
;-------------------------------------------------------------------------------
DrawStars PROC
xor bx, bx
UpdateNextStar:
cmp BackStarsX[bx], 0
je WrapBSX
dec BackStarsX[bx]
jmp UpdFore
WrapBSX:
mov randrange, 180
call random
add dx, 10
mov BackStarsY[bx], dx
mov BackStarsX[bx], 318
UpdFore:
cmp ForeStarsX[bx], 2
jb WrapFSX
dec ForeStarsX[bx]
dec ForeStarsX[bx]
jmp UpdEnd
WrapFSX:
mov randrange, 180
call random
add dx, 10
mov ForeStarsY[bx], dx
mov ForeStarsX[bx], 318
UpdEnd:
inc bx
inc bx
cmp bx, STARSCOUNT*2
jne UpdateNextStar
xor bx, bx
DrawNextStar:
mov ax, BackStarsX[bx]
mov TempX, ax
mov ax, BackStarsY[bx]
mov TempY, ax
mov TempByte, 4
call PutPixel
cmp TempX, 319
jnb nd1
inc TempX
mov TempByte,6
call PutPixel
nd1:
mov ax, ForeStarsX[bx]
mov TempX, ax
mov ax, ForeStarsY[bx]
mov TempY, ax
mov TempByte, 17
call PutPixel
cmp TempX, 319
jnb ndd
inc TempX
mov TempByte,5
call PutPixel
inc TempX
mov TempByte,6
call PutPixel
ndd:
inc bx
inc bx
cmp bx, STARSCOUNT*2
jne DrawNextStar
ret
DrawStars ENDP
;-------------------------------------------------------------------------------
DrawChar PROC
cmp [Font.Y], 199-5
ja DrawCharClip
push si
mov si, offset SmallFont
xor ah, ah
mov al, CharToDraw
sub al, 32
mov cl, 5
mul cl
add si, ax
mov ax, ds
mov es, ax
xor cx, cx
nextlin:
xor dx, dx
nextcol:
mov bl, fs:[si]
mov cl, 7
sub cl, dl
shr bl, cl
and bl, 1
jz MaskBit
mov ax, [Font.Y]
add al, ch
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, [Font.X]
add di, dx
add di, offset Buffer
mov al, [Font.col]
cmp [Font.Italic], 0
je NoItalic
xor bx, bx
mov bl, ch
shr bl, 1
sub di, bx
NoItalic:
mov es:[di], al
MaskBit:
inc dl
cmp dl, 5
jne nextcol
inc si
inc ch
cmp ch, 5
jne nextlin
pop si
DrawCharClip:
ret
DrawChar ENDP
;-------------------------------------------------------------------------------
DrawText PROC
mov ax, [Font.X]
mov [Font.InitX], ax
DrawNextChar:
mov al, fs:[si]
cmp al, 0
je DrawTextEnd
cmp al, 32
jnb NoChangeFontColor
mov [Font.Col], al
jmp NoDrawChar
NoChangeFontColor:
cmp al, 255
jne NoWrapLine
add [Font.Y], 6
mov bx, [Font.InitX]
mov [Font.X], bx
jmp NoDrawChar
NoWrapLine:
mov CharToDraw, al
add [Font.X], 6
cmp [Font.Shadow], 255
je NoShadow
inc [Font.X]
inc [Font.Y]
mov al, [Font.Col]
push ax
mov al, [Font.Shadow]
mov [Font.Col], al
call DrawChar
dec [Font.X]
dec [Font.Y]
pop ax
mov [Font.Col], al
NoShadow:
call DrawChar
NoDrawChar:
inc si
jmp DrawNextChar
DrawTextEnd:
add [Font.X], 6
ret
DrawText ENDP
;-------------------------------------------------------------------------------
IntToString PROC
xor edx, edx
mov ecx, StringMask
mov bx, 1
GetNextNumber:
cmp ecx, 0
je ConversionFinished
div ecx
add eax, 48
mov NumberStr[bx], al
mov eax, edx
xor edx, edx
push eax
mov eax, ecx
mov ecx, 10
div ecx
mov ecx, eax
pop eax
inc bl
cmp bl, 9
jne GetNextNumber
ConversionFinished:
mov NumberStr[bx], 0
mov si, offset NumberStr
call DrawText
ret
IntToString ENDP
;-------------------------------------------------------------------------------
WaitRetrace PROC
mov dx, 03DAh
Retrace1:
in al, dx
test al, 08h
jnz Retrace1
Retrace2:
in al,dx
test al, 08h
jz Retrace2
ret
WaitRetrace ENDP
;-------------------------------------------------------------------------------
ClearScreen PROC
cld
mov ax, ds
mov es, ax
xor edi, edi
mov di, offset Buffer
mov cx, 16000
xor eax, eax
rep stosd
ret
ClearScreen ENDP
;-------------------------------------------------------------------------------
SpriteDraw PROC
mov ax, ds
mov es, ax
xor ch, ch
nlin:
xor dh, dh
ncol:
mov ax, [Rect.y]
add al, ch
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, [Rect.x]
xor bx, bx
mov bl, dh
add di, bx
add di, offset Buffer
mov al, fs:[si]
cmp al, 0
je maskbyte
cmp HeadFlag, 0
jz drawnohead
add al, 4
drawnohead:
mov es:[di], al
maskbyte:
inc si
inc dh
cmp dh, 8
jne ncol
inc ch
cmp ch, 8
jne nlin
ret
SpriteDraw ENDP
;-------------------------------------------------------------------------------
FlipBuffer PROC
cld
mov ax, 0a000h
mov es, ax
xor edi, edi
xor esi, esi
mov si, offset buffer
mov cx, 16000
rep movsd
ret
FlipBuffer ENDP
;-------------------------------------------------------------------------------
DrawHL PROC
mov ax, ds
mov es, ax
cld
mov ax, [Rect.Y]
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, offset Buffer
add di, [Rect.X]
mov cx, [Rect.XL]
mov al, [Rect.Color]
rep stosb
ret
DrawHL ENDP
;-------------------------------------------------------------------------------
DrawVL PROC
mov ax, ds
mov es, ax
mov cx, [Rect.X]
mov dx, [Rect.YL]
DrawVLine:
mov ax, [Rect.Y]
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, offset Buffer
add di, cx
add cx, 320
mov al, [Rect.Color]
mov es:[di], al
dec dx
jnz DrawVLine
ret
DrawVL ENDP
;-------------------------------------------------------------------------------
DrawBox PROC
mov ax, [Rect.X]
add ax, [Rect.XL]
cmp ax, 320
ja clip
mov ax, [Rect.Y]
add ax, [Rect.YL]
cmp ax, 200
ja clip
mov dx, [Rect.Y]
add dx, [Rect.YL]
mov ax, ds
mov es, ax
DrawHLine:
cld
mov ax, dx
shl ax, 6
mov di, ax
shl ax, 2
add di, ax
add di, offset Buffer
add di, [Rect.X]
mov cx, [Rect.XL]
mov al, [Rect.Color]
rep stosb
dec dx
cmp dx, [Rect.Y]
ja DrawHLine
Clip:
ret
DrawBox ENDP
;-------------------------------------------------------------------------------
DrawWindow PROC
push [Rect.YL]
mov [Rect.YL], 7
call DrawBox
pop [Rect.YL]
call DrawHL
call DrawVL
push [Rect.X]
mov ax, [Rect.XL]
add [Rect.X], ax
call DrawVL
pop [Rect.X]
inc [Rect.XL]
mov ax, [Rect.YL]
add [Rect.Y], ax
call DrawHL
ret
DrawWindow ENDP
;-------------------------------------------------------------------------------
InitializeSnake PROC
mov bx, 0
ToZero:
mov SnakeX[bx], 0
mov SnakeY[bx], 0
inc bx
cmp bx, 50
jne ToZero
mov Vel, 10
mov al, 19
mov cl, 12
mov SnakeX[0], al
mov SnakeY[0], cl
dec al
mov SnakeX[1], al
mov SnakeY[1], cl
dec al
mov SnakeX[2], al
mov SnakeY[2], cl
mov SCount, 3
mov Dir, 1
mov DotX, 0
mov DotY, 0
mov Score, 0
mov Level, 0
ret
InitializeSnake ENDP
;-------------------------------------------------------------------------------
SnakeInXY PROC
mov al, 1
xor bx, bx
mov bl, SCount
dec bl
TestCol:
cmp cl, SnakeX[bx]
jne NextIter
cmp dl, SnakeY[bx]
je SIXYEnd
NextIter:
dec bx
cmp bx, 0
jne Testcol
jmp NoCol
NoCol:
mov al, 0
SIXYEnd:
ret
SnakeInXY ENDP
;-------------------------------------------------------------------------------
PutDot PROC
RegenerateAll:
mov al, DotX
mov TempByte, al
mov randrange, 39
RegenerateDotX:
call random
mov DotX, dl
mov al, TempByte
cmp al, DotX
je RegenerateDotX
mov al, DotY
mov TempByte, al
mov randrange, 22
RegenerateDotY:
call Random
mov DotY, dl
inc DotY
mov al, TempByte
cmp al, DotY
je RegenerateDotY
mov cl, DotX
mov dl, DotY
call SnakeInXY
cmp al, 0
je TestHead
jmp RegenerateAll
TestHead:
mov al, DotX
cmp al, SnakeX[0]
jne EndPutDot
mov al, DotY
cmp al, SnakeY[0]
je RegenerateAll
EndPutDot:
ret
PutDot ENDP
;-------------------------------------------------------------------------------
DrawGameOver PROC
GameOverScreen:
mov [Rect.X], 30
mov [Rect.Y], 65
mov [Rect.XL], 260
mov [Rect.YL], 60
mov [Rect.Color], 1
call DrawWindow
mov si, offset GOverTitle
mov [Font.X], 120
mov [Font.Y], 66
mov [Font.Shadow], 0
call DrawText
mov [Font.Shadow], 255
call FlipBuffer
mov si, offset GameOver
mov [Font.X], 26
mov [Font.Y], 90
call DrawText
call FlipBuffer
mov ah, 01h
int 16h
jz GameOverScreen
mov ah, 00h
int 16h
cmp al, 13
je Start
cmp ah, 01
je Fim
jmp GameOverScreen
ret
DrawGameOver ENDP
;-------------------------------------------------------------------------------
UpdateSnake PROC
xor ax, ax
mov al, Level
inc al
shl al, 2
mov Vel, al
shl al, 1
add Vel, al
cmp IntroMode, 1
je JumpColTest
mov cl, SnakeX[0]
mov dl, SnakeY[0]
call SnakeInXY
cmp al, 0
je GoUpdate
Collisioned:
call DrawGameOver
JumpColTest:
GoUpdate:
mov cl, SnakeX[0]
mov dl, SnakeY[0]
cmp cl, DotX
jne InitUpdate
cmp dl, DotY
jne InitUpdate
inc SCount
cmp IntroMode, 1
je JumpAddScore
add Score, 250
JumpAddScore:
call Putdot
cmp SCount, 49
jna InitUpdate
cmp IntroMode, 1
je JumpIncLevel
inc Level
JumpIncLevel:
mov SCount, 3
InitUpdate:
mov cl, SCount
dec cl
xor bx, bx
UpdateNext:
mov bl, cl
dec bl
mov al, SnakeX[bx]
inc bl
mov SnakeX[bx], al
dec bl
mov al, SnakeY[bx]
inc bl
mov SnakeY[bx], al
dec cl
cmp cl, 0
jne UpdateNext
mov cl, Dir
GoLeft:
cmp cl, 0
jne GoRight
mov cl, SnakeX[0]
cmp cl, 0
je ToRight
dec SnakeX[0]
jmp GoNothing
ToRight:
mov SnakeX[0], 39
jmp GoNothing
GoRight:
cmp cl, 1
jne GoUp
mov cl, SnakeX[0]