Subversion Repositories Kolibri OS

Rev

Rev 1806 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1806 yogev_ezra 1
;
2
;    MARIO for MENUET
3
;
4
;    Compile with fasm
5
;
6
 
7
use32
8
 
9
           org     0x0
10
 
11
           db      'MENUET00'           ; 8 byte id
12
           dd      38                   ; required os
13
           dd      START                ; program start
14
           dd      I_END                ; image size
15
           dd      0x100000             ; reguired amount of memory
16
           dd      0x00000000           ; reserved=no extended header
17
 
18
 
19
empty        equ    0x80000  + 0*3*40*40
20
build_1      equ    0x80000  + 1*3*40*40
21
build_2      equ    0x80000  + 2*3*40*40
22
build_3      equ    0x80000  + 3*3*40*40
23
 
24
mario_1      equ    0x90000  + 0*3*70*51
25
mario_2      equ    0x90000  + 1*3*70*51
26
mario_3      equ    0x90000  + 2*3*70*51
27
mario_4      equ    0x90000  + 3*3*70*51
28
mario_5      equ    0x90000  + 4*3*70*51
29
mario_6      equ    0x90000  + 5*3*70*51
30
mario_green  equ    0x90000  + 6*3*70*51
31
loadp        equ    0x90000  + 7*3*70*51
32
 
33
 
34
START:
35
 
36
 
37
    call load_graph
38
 
39
    mov  [marioxy],   dword 300*65536+270
40
    mov  [leftright], dword 1
41
    mov  [velocity],  dword 0xff
42
 
43
    call draw_window
44
 
45
 
46
sta:
47
 
48
    mov  eax,field
49
    mov  edx,1*65526+30
50
    mov  [xxyy],dword 1*65536+22
51
 
52
  stl:
53
 
54
    cmp  [eax],byte ' '
55
    jnz  noempty
56
    mov  ebx,empty
57
  noempty:
58
 
59
    cmp  [eax],byte '1'
60
    jnz  no1
61
    mov  ebx,build_1
62
  no1:
63
 
64
    cmp  [eax],byte '2'
65
    jnz  no2
66
    mov  ebx,build_2
67
  no2:
68
 
69
    cmp  [eax],byte '3'
70
    jnz  no3
71
    mov  ebx,build_3
72
  no3:
73
 
74
    pusha
75
 
76
    mov  edx,[xxyy]
77
 
78
    mov  eax,7           ; display image
79
    mov  ecx,40*65536+40
80
    int  0x40
81
 
82
    popa
83
 
84
    add  word [xxyy+2],word 40
85
    cmp  word [xxyy+2],word 40*12+1
86
    jnz  nonewline
87
    mov  word [xxyy+2],word 1
88
    add  word [xxyy+0],word 40
89
  nonewline:
90
 
91
    add  eax,1
92
    cmp  eax,field+12*9
93
    jz   nodraw
94
    jmp  stl
95
 
96
  nodraw:
97
 
98
 
99
;  ********* MAIN LOOP ***********
100
 
101
 
102
wait_for_event:
103
 
104
    call draw_mario
105
 
2752 leency 106
    mov  eax,11              ; check for event
1806 yogev_ezra 107
    int  0x40
108
    cmp  eax,1
109
    jz   red
110
    cmp  eax,2
111
    jz   key
112
    cmp  eax,3
113
    jnz  wait_for_event
114
 
115
    jmp  button
116
 
117
  red:
118
 
119
    mov  [mariomem],dword 0x0
120
 
121
    call draw_window
122
    jmp  sta
123
 
124
  key:
125
 
126
    mov  [mariomem],dword 0x0
2752 leency 127
 
1806 yogev_ezra 128
    mov  eax,2   ; ah <- key
129
    int  0x40
130
 
131
    cmp  ah,176
132
    jnz  key1
133
    mov  byte [leftright],byte 1
134
  key1:
135
 
136
    cmp  ah,179
137
    jnz  key2
138
    mov  byte [leftright],byte 4
139
  key2:
140
 
141
    cmp  ah,177
142
    jnz  key3
143
    mov  al,byte [leftright]
144
    mov  bl,al
145
    cmp  al,1
146
    jnz  key31
147
    mov  bl,2
148
  key31:
149
    cmp  al,4
150
    jnz  key32
151
    mov  bl,3
152
  key32:
153
    mov  byte [leftright],bl
154
  key3:
155
 
156
    cmp  ah,178
157
    jnz  key4
158
    cmp  [velocity],dword 0xff
159
    jnz  key4
160
    mov  [velocity],dword 0x110
161
  key4:
162
 
2752 leency 163
	mov eax,71					;draw caption
164
	mov ebx,1
165
	mov ecx,title
166
	int 0x40
167
 
168
	jmp sta						;draw field
169
 
170
    ;jmp  wait_for_event
1806 yogev_ezra 171
 
172
  button:
173
 
174
    mov  eax,0xffffffff          ; close this program
175
    int  0x40
176
 
177
 
178
load_graph:
179
 
180
    pusha
181
 
182
    mov  eax,6        ; 6 = open file
183
    mov  ebx,filename
184
    mov  ecx,0
185
    mov  edx,0xFFFFFF
186
    mov  esi,loadp
187
    mov  edi,0                     ; floppy
188
    int  0x40
189
 
190
    ; empty
191
 
192
    mov  edi,empty
193
    mov  ecx,40*40
194
    mov  eax,0x00500f
195
    cld
196
  emptyl:
197
    mov  [edi],eax
198
    add  edi,3
199
    loop emptyl
200
 
201
    mov  [width],40*3
202
    mov  [width_move],20
203
    mov  [sub_esi],150*3+2
204
    mov  [add_edi],40*3*2
205
    mov  [imul_esi],20*3
206
    mov  [base],loadp+18*3+3*150*34+3*98-1
207
 
208
    mov  esi,0
209
    mov  edi,build_1
210
    call convert
211
 
212
    mov  esi,1
213
    mov  edi,build_2
214
    call convert
215
 
216
 
217
 
218
    ; build_3
219
 
220
    mov  edi,build_3
221
    mov  esi,loadp+18*3+230*3+3*300*69
222
    mov  ecx,40
223
  build_3l:
224
    pusha
225
    mov  ecx,3*40
226
    cld
227
    rep  movsb
228
    popa
229
    sub  esi,300*3
230
    add  edi,40*3
231
    loop build_3l
232
 
233
    mov  [width],50*3
234
    mov  [width_move],25
235
    mov  [sub_esi],150*3+2
236
    mov  [add_edi],50*3*2
237
    mov  [imul_esi],25*3
238
    mov  [base],loadp+18*3+3*150*34+68
239
 
240
    mov  esi,0
241
    mov  edi,mario_1
242
    call convert
243
 
244
    mov  esi,1
245
    mov  edi,mario_2
246
    call convert
247
 
248
    mov  esi,2
249
    mov  edi,mario_3
250
    call convert
251
 
252
    jmp  mario_mirror
253
 
254
 
255
convert:
256
 
257
    imul esi,[imul_esi]
258
    add  esi,[base] ; loadp+18*3+3*150*34+68
259
 
260
    mov  ecx,70
261
  mario_1l:
262
    pusha
263
    mov  ecx,[width_move]
264
  putpix:
265
    mov  eax,[esi]
266
    mov  [edi+00],ax
267
    mov  [edi+03],ax
268
    mov  ebx,[width]
269
    mov  [edi+ebx],ax
270
    add  ebx,3
271
    mov  [edi+ebx],ax
272
    shr  eax,16
273
    mov  [edi+02],al
274
    dec  ebx
275
    mov  [edi+ebx],al
276
    mov  [edi+05],al
277
    add  ebx,3
278
    mov  [edi+ebx],al
279
    add  esi,3
280
    add  edi,6
281
    loop putpix
282
    popa
283
    sub  esi,[sub_esi]
284
    add  edi,[add_edi]
285
    loop mario_1l
286
 
287
    ret
288
 
289
sub_esi  dd 0x0
290
add_edi  dd 0x0
291
imul_esi dd 0x0
292
base     dd 0x0
293
width    dd 0x0
294
width_move dd 0x0
295
 
296
 
297
 
298
mario_mirror:
299
 
300
 
301
    ; mario_green
302
 
303
    mov  edi,mario_green
304
    mov  ecx,70*50
305
  mario_greenl:
306
    mov  [edi],dword 0x00500f
307
    add  edi,3
308
    loop mario_greenl
309
 
310
 
311
 
312
    ; mario_4
313
 
314
    mov  edi,mario_4
315
    mov  esi,mario_1+49*3
316
    mov  ecx,70
317
  m4l1:
318
    pusha
319
    mov  ecx,50
320
  m4l2:
321
    mov  eax,[esi]
322
    mov  [edi],ax
323
    shr  eax,16
324
    mov  [edi+2],al
325
    add  edi,3
326
    sub  esi,3
327
    loop m4l2
328
    popa
329
    add  esi,50*3
330
    add  edi,50*3
331
    loop m4l1
332
 
333
 
334
    ; mario_5
335
 
336
    mov  edi,mario_5
337
    mov  esi,mario_2+49*3
338
    mov  ecx,70
339
  m5l1:
340
    pusha
341
    mov  ecx,50
342
  m5l2:
343
    mov  eax,[esi]
344
    mov  [edi],ax
345
    shr  eax,16
346
    mov  [edi+2],al
347
    add  edi,3
348
    sub  esi,3
349
    loop m5l2
350
    popa
351
    add  esi,50*3
352
    add  edi,50*3
353
    loop m5l1
354
 
355
 
356
    ; mario_6
357
 
358
    mov  edi,mario_6
359
    mov  esi,mario_3+49*3
360
    mov  ecx,70
361
  m6l1:
362
    pusha
363
    mov  ecx,50
364
  m6l2:
365
    mov  eax,[esi]
366
    mov  [edi],ax
367
    shr  eax,16
368
    mov  [edi+2],al
369
    add  edi,3
370
    sub  esi,3
371
    loop m6l2
372
    popa
373
    add  esi,50*3
374
    add  edi,50*3
375
    loop m6l1
376
 
377
 
378
    popa
379
 
380
    ret
381
 
382
 
383
 
384
advance_mario:
385
 
386
    pusha
387
 
388
    mov  eax,[marioxy]      ; wherey ?
389
    and  eax,65535
390
    add  eax,40+21
391
    xor  edx,edx
392
    mov  ebx,40
393
    div  ebx
394
    mov  [marioy],eax
395
 
396
    mov  eax,[marioxy]      ; wherex ?
397
    shr  eax,16
398
    add  eax,20
399
    xor  edx,edx
400
    mov  ebx,40
401
    div  ebx
402
    mov  [mariox],eax
403
 
404
 
405
 
406
    cmp  byte [leftright],byte 1    ; go left
407
    jnz  noleft
408
    mov  eax,[marioxy]
409
    xor  edx,edx
410
    shr  eax,16
411
    sub  eax,7
412
    mov  ebx,40
413
    div  ebx
414
    add  eax,field+7*12
415
    cmp  [eax],byte ' '
416
    jz   mgoleft
417
    mov  byte [leftright],byte 2
418
    jmp  noleft
419
  mgoleft:
420
    mov  eax,[marioxy]
421
    sub  eax,6*65536
422
    mov  [marioxy],eax
423
  noleft:
424
 
425
 
426
 
427
    cmp  byte [leftright],byte 4    ; go right
428
    jnz  noright
429
    mov  eax,[marioxy]
430
    xor  edx,edx
431
    shr  eax,16
432
    add  eax,54
433
    mov  ebx,40
434
    div  ebx
435
    add  eax,field+7*12
436
    cmp  byte [eax],byte ' '
437
    jz   mgoright
438
    mov  byte [leftright],byte 3
439
    jmp  noright
440
  mgoright:
441
    mov  eax,[marioxy]
442
    add  eax,6*65536
443
    mov  [marioxy],eax
444
  noright:
445
 
446
 
447
 
448
 
449
    cmp  [velocity],dword 0x100    ; jump up ?
450
    jbe  nojumpup
451
    mov  ebx,[velocity]
452
    sub  ebx,1
453
    cmp  ebx,0x100
454
    jnz  no0x100
455
    mov  [velocity],dword 0xff
456
    jmp  nojumpup
457
  no0x100:
458
    mov  [velocity],ebx
459
    sub  ebx,0x100-1
460
    mov  eax,[marioxy]
461
    sub  ax,bx
462
    mov  [marioxy],eax
463
  nojumpup:
464
 
465
    call mario_environment
466
 
467
    cmp  [velocity],dword 0x100    ; jump -> down ?
468
    jge  nojumpdown
469
    mov  eax,[marioy]
470
    cmp  eax,[mario_below]
471
    jb   yesgd
472
    mov  [velocity],dword 0xff
473
    mov  eax,[marioxy]
474
    mov  eax,[mario_below]
475
    sub  eax,1
476
    mov  ebx,40
477
     mul  ebx
478
     sub  eax,10
479
    mov  word [marioxy],ax
480
    jmp  nojumpdown
481
  yesgd:
482
    mov  ebx,[velocity]
483
    sub  ebx,1
484
    mov  [velocity],ebx
485
    mov  eax,[marioxy]
486
    add  ax,0xff
487
    sub  ax,bx
488
    mov  [marioxy],eax
489
  nojumpdown:
490
 
491
 
492
    popa
493
 
494
    ret
495
 
496
 
497
marioy dd 0x0
498
 
499
mariox dd 0x0
500
 
501
mario_below dd 5
502
 
503
 
504
mario_environment:
505
 
506
     pusha
507
 
508
     mov  eax,[marioy]
509
     mov  ebx,12
510
     mul  ebx
511
     add  eax,[mariox]
512
     add  eax,field
513
 
514
     cmp  [eax],byte ' '
515
     jz   me_ok
516
 
517
     mov  eax,[marioy]
518
     mov  [mario_below],eax
519
 
520
     popa
521
     ret
522
 
523
   me_ok:
524
 
525
     mov  [mario_below],dword 100
526
 
527
     popa
528
     ret
529
 
530
 
531
mario_delay:
532
 
533
    pusha
534
 
2752 leency 535
    mov  eax,5		;pause
1806 yogev_ezra 536
    mov  ebx,2
537
    int  0x40
538
 
539
    popa
540
    ret
541
 
542
 
543
 
544
draw_mario:
545
 
546
    pusha
547
 
548
    mov  eax,[mariomem]
549
    cmp  eax,[marioxy]
550
    jnz  dm1
2752 leency 551
 
1806 yogev_ezra 552
    call mario_delay
2752 leency 553
 
1806 yogev_ezra 554
    popa
555
 
556
    ret
557
 
558
  dm1:
559
 
560
    mov  eax,[marioxy]
561
    mov  [mariomem],eax
562
 
563
 
564
    cmp  byte [leftright],byte 1   ; go left
565
    jnz  no_m_left
566
    jmp  m_left
567
  no_m_left:
568
 
569
    cmp  byte [leftright],byte 4   ; go right
570
    jnz  no_m_right
571
    jmp  m_right
572
  no_m_right:
573
 
574
    cmp  byte [leftright],byte 2   ; stand left
575
    jnz  no_r_still
576
    mov  eax,7
577
    mov  ebx,mario_green
578
    mov  ecx,50*65536+70
579
    mov  edx,[marioxy]
580
    int  0x40
581
    call advance_mario
582
    mov  eax,7
583
    mov  ebx,mario_1
584
    mov  ecx,50*65536+70
585
    mov  edx,[marioxy]
586
    int  0x40
587
    call mario_delay
588
    popa
589
    ret
590
  no_r_still:
591
 
592
    cmp  byte [leftright],byte 3   ; stand right
593
    jnz  no_l_still
594
    mov  eax,7
595
    mov  ebx,mario_green
596
    mov  ecx,50*65536+70
597
    mov  edx,[marioxy]
598
    int  0x40
599
    call advance_mario
600
    mov  eax,7
601
    mov  ebx,mario_4
602
    mov  ecx,50*65536+70
603
    mov  edx,[marioxy]
604
    int  0x40
605
    call mario_delay
606
 
607
    popa
608
    ret
609
  no_l_still:
610
 
611
    popa
612
    ret
613
 
614
 
615
 
616
 
617
  m_left:
618
 
619
    mov  eax,7
620
    mov  ebx,mario_green
621
    mov  ecx,50*65536+70
622
    mov  edx,[marioxy]
623
    int  0x40
624
    call advance_mario
625
    mov  eax,7
626
    mov  ebx,mario_1
627
    mov  ecx,50*65536+70
628
    mov  edx,[marioxy]
629
    int  0x40
630
    call mario_delay
631
 
632
    mov  eax,7
633
    mov  ebx,mario_green
634
    mov  ecx,50*65536+70
635
    mov  edx,[marioxy]
636
    int  0x40
637
    call advance_mario
638
    mov  eax,7
639
    mov  ebx,mario_2
640
    mov  ecx,50*65536+70
641
    mov  edx,[marioxy]
642
    int  0x40
643
    call mario_delay
644
 
645
    mov  eax,7
646
    mov  ebx,mario_green
647
    mov  ecx,50*65536+70
648
    mov  edx,[marioxy]
649
    int  0x40
650
    call advance_mario
651
    mov  eax,7
652
    mov  ebx,mario_3
653
    mov  ecx,50*65536+70
654
    mov  edx,[marioxy]
655
    int  0x40
656
    call mario_delay
657
 
658
    mov  eax,7
659
    mov  ebx,mario_green
660
    mov  ecx,50*65536+70
661
    mov  edx,[marioxy]
662
    int  0x40
663
    call advance_mario
664
    mov  eax,7
665
    mov  ebx,mario_2
666
    mov  ecx,50*65536+70
667
    mov  edx,[marioxy]
668
    int  0x40
669
    call mario_delay
670
 
671
    popa
672
 
673
    ret
674
 
675
  m_right:
676
 
677
 
678
    mov  eax,7
679
    mov  ebx,mario_green
680
    mov  ecx,50*65536+70
681
    mov  edx,[marioxy]
682
    int  0x40
683
    call advance_mario
684
    mov  eax,7
685
    mov  ebx,mario_4
686
    mov  ecx,50*65536+70
687
    mov  edx,[marioxy]
688
    int  0x40
689
    call mario_delay
690
 
691
    mov  eax,7
692
    mov  ebx,mario_green
693
    mov  ecx,50*65536+70
694
    mov  edx,[marioxy]
695
    int  0x40
696
    call advance_mario
697
    mov  eax,7
698
    mov  ebx,mario_5
699
    mov  ecx,50*65536+70
700
    mov  edx,[marioxy]
701
    int  0x40
702
    call mario_delay
703
 
704
    mov  eax,7
705
    mov  ebx,mario_green
706
    mov  ecx,50*65536+70
707
    mov  edx,[marioxy]
708
    int  0x40
709
    call advance_mario
710
    mov  eax,7
711
    mov  ebx,mario_6
712
    mov  ecx,50*65536+70
713
    mov  edx,[marioxy]
714
    int  0x40
715
    call mario_delay
716
 
717
    mov  eax,7
718
    mov  ebx,mario_green
719
    mov  ecx,50*65536+70
720
    mov  edx,[marioxy]
721
    int  0x40
722
    call advance_mario
723
    mov  eax,7
724
    mov  ebx,mario_5
725
    mov  ecx,50*65536+70
726
    mov  edx,[marioxy]
727
    int  0x40
728
    call mario_delay
729
 
730
    popa
731
 
732
    ret
733
 
734
 
735
 
736
 
737
 
738
draw_window:
739
 
740
    pusha
741
 
742
    mov       eax,12                    ; tell os about redraw
743
    mov       ebx,1
744
    int       0x40
745
 
746
    mov       eax,0                     ; define and draw window
747
    mov       ebx,80*65536+480+1
748
    mov       ecx,20*65536+382
2752 leency 749
    mov       edx,0x5466AA88
750
    mov       edi,title
1806 yogev_ezra 751
    int       0x40
752
 
753
    mov       eax,12                    ; tell os about redraw end
754
    mov       ebx,2
755
    int       0x40
756
 
757
    popa
758
 
759
    ret
760
 
761
 
762
; DATA SECTION
763
 
764
filename:
765
    db  'MARIOALLBMP'
766
 
2752 leency 767
title:
768
    db 'SUPER MARIO - USE ARROW KEYS', 0
1806 yogev_ezra 769
 
770
field:
771
 
772
    db  '1          1'
773
    db  '1          1'
774
    db  '111      111'
775
    db  '1          1'
776
    db  '1          1'
777
    db  '1  111111  1'
778
    db  '1          1'
779
    db  '1          1'
780
    db  '222222222222'
781
 
782
xxyy        dd 0x0
783
 
784
marioxy     dd 0x0
785
 
786
mariomem    dd 0x0
787
 
788
leftright   dd 0x0
789
 
790
velocity    dd 0x0
791
 
792
 
793
I_END:
794