Subversion Repositories Kolibri OS

Rev

Rev 2752 | Go to most recent revision | Details | 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
 
106
    mov  eax,11                  ; check if os wants to say something
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
127
 
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
 
163
 
164
 
165
    jmp  wait_for_event
166
 
167
  button:
168
 
169
    mov  eax,0xffffffff          ; close this program
170
    int  0x40
171
 
172
    ; end of program
173
 
174
 
175
load_graph:
176
 
177
    pusha
178
 
179
    mov  eax,6        ; 6 = open file
180
    mov  ebx,filename
181
    mov  ecx,0
182
    mov  edx,0xFFFFFF
183
    mov  esi,loadp
184
    mov  edi,0                     ; floppy
185
    int  0x40
186
 
187
    ; empty
188
 
189
    mov  edi,empty
190
    mov  ecx,40*40
191
    mov  eax,0x00500f
192
    cld
193
  emptyl:
194
    mov  [edi],eax
195
    add  edi,3
196
    loop emptyl
197
 
198
    mov  [width],40*3
199
    mov  [width_move],20
200
    mov  [sub_esi],150*3+2
201
    mov  [add_edi],40*3*2
202
    mov  [imul_esi],20*3
203
    mov  [base],loadp+18*3+3*150*34+3*98-1
204
 
205
    mov  esi,0
206
    mov  edi,build_1
207
    call convert
208
 
209
    mov  esi,1
210
    mov  edi,build_2
211
    call convert
212
 
213
 
214
 
215
    ; build_3
216
 
217
    mov  edi,build_3
218
    mov  esi,loadp+18*3+230*3+3*300*69
219
    mov  ecx,40
220
  build_3l:
221
    pusha
222
    mov  ecx,3*40
223
    cld
224
    rep  movsb
225
    popa
226
    sub  esi,300*3
227
    add  edi,40*3
228
    loop build_3l
229
 
230
    mov  [width],50*3
231
    mov  [width_move],25
232
    mov  [sub_esi],150*3+2
233
    mov  [add_edi],50*3*2
234
    mov  [imul_esi],25*3
235
    mov  [base],loadp+18*3+3*150*34+68
236
 
237
    mov  esi,0
238
    mov  edi,mario_1
239
    call convert
240
 
241
    mov  esi,1
242
    mov  edi,mario_2
243
    call convert
244
 
245
    mov  esi,2
246
    mov  edi,mario_3
247
    call convert
248
 
249
    jmp  mario_mirror
250
 
251
 
252
convert:
253
 
254
    imul esi,[imul_esi]
255
    add  esi,[base] ; loadp+18*3+3*150*34+68
256
 
257
    mov  ecx,70
258
  mario_1l:
259
    pusha
260
    mov  ecx,[width_move]
261
  putpix:
262
    mov  eax,[esi]
263
    mov  [edi+00],ax
264
    mov  [edi+03],ax
265
    mov  ebx,[width]
266
    mov  [edi+ebx],ax
267
    add  ebx,3
268
    mov  [edi+ebx],ax
269
    shr  eax,16
270
    mov  [edi+02],al
271
    dec  ebx
272
    mov  [edi+ebx],al
273
    mov  [edi+05],al
274
    add  ebx,3
275
    mov  [edi+ebx],al
276
    add  esi,3
277
    add  edi,6
278
    loop putpix
279
    popa
280
    sub  esi,[sub_esi]
281
    add  edi,[add_edi]
282
    loop mario_1l
283
 
284
    ret
285
 
286
sub_esi  dd 0x0
287
add_edi  dd 0x0
288
imul_esi dd 0x0
289
base     dd 0x0
290
width    dd 0x0
291
width_move dd 0x0
292
 
293
 
294
 
295
mario_mirror:
296
 
297
 
298
    ; mario_green
299
 
300
    mov  edi,mario_green
301
    mov  ecx,70*50
302
  mario_greenl:
303
    mov  [edi],dword 0x00500f
304
    add  edi,3
305
    loop mario_greenl
306
 
307
 
308
 
309
    ; mario_4
310
 
311
    mov  edi,mario_4
312
    mov  esi,mario_1+49*3
313
    mov  ecx,70
314
  m4l1:
315
    pusha
316
    mov  ecx,50
317
  m4l2:
318
    mov  eax,[esi]
319
    mov  [edi],ax
320
    shr  eax,16
321
    mov  [edi+2],al
322
    add  edi,3
323
    sub  esi,3
324
    loop m4l2
325
    popa
326
    add  esi,50*3
327
    add  edi,50*3
328
    loop m4l1
329
 
330
 
331
    ; mario_5
332
 
333
    mov  edi,mario_5
334
    mov  esi,mario_2+49*3
335
    mov  ecx,70
336
  m5l1:
337
    pusha
338
    mov  ecx,50
339
  m5l2:
340
    mov  eax,[esi]
341
    mov  [edi],ax
342
    shr  eax,16
343
    mov  [edi+2],al
344
    add  edi,3
345
    sub  esi,3
346
    loop m5l2
347
    popa
348
    add  esi,50*3
349
    add  edi,50*3
350
    loop m5l1
351
 
352
 
353
    ; mario_6
354
 
355
    mov  edi,mario_6
356
    mov  esi,mario_3+49*3
357
    mov  ecx,70
358
  m6l1:
359
    pusha
360
    mov  ecx,50
361
  m6l2:
362
    mov  eax,[esi]
363
    mov  [edi],ax
364
    shr  eax,16
365
    mov  [edi+2],al
366
    add  edi,3
367
    sub  esi,3
368
    loop m6l2
369
    popa
370
    add  esi,50*3
371
    add  edi,50*3
372
    loop m6l1
373
 
374
 
375
    popa
376
 
377
    ret
378
 
379
 
380
 
381
advance_mario:
382
 
383
    pusha
384
 
385
    mov  eax,[marioxy]      ; wherey ?
386
    and  eax,65535
387
    add  eax,40+21
388
    xor  edx,edx
389
    mov  ebx,40
390
    div  ebx
391
    mov  [marioy],eax
392
 
393
    mov  eax,[marioxy]      ; wherex ?
394
    shr  eax,16
395
    add  eax,20
396
    xor  edx,edx
397
    mov  ebx,40
398
    div  ebx
399
    mov  [mariox],eax
400
 
401
 
402
 
403
    cmp  byte [leftright],byte 1    ; go left
404
    jnz  noleft
405
    mov  eax,[marioxy]
406
    xor  edx,edx
407
    shr  eax,16
408
    sub  eax,7
409
    mov  ebx,40
410
    div  ebx
411
    add  eax,field+7*12
412
    cmp  [eax],byte ' '
413
    jz   mgoleft
414
    mov  byte [leftright],byte 2
415
    jmp  noleft
416
  mgoleft:
417
    mov  eax,[marioxy]
418
    sub  eax,6*65536
419
    mov  [marioxy],eax
420
  noleft:
421
 
422
 
423
 
424
    cmp  byte [leftright],byte 4    ; go right
425
    jnz  noright
426
    mov  eax,[marioxy]
427
    xor  edx,edx
428
    shr  eax,16
429
    add  eax,54
430
    mov  ebx,40
431
    div  ebx
432
    add  eax,field+7*12
433
    cmp  byte [eax],byte ' '
434
    jz   mgoright
435
    mov  byte [leftright],byte 3
436
    jmp  noright
437
  mgoright:
438
    mov  eax,[marioxy]
439
    add  eax,6*65536
440
    mov  [marioxy],eax
441
  noright:
442
 
443
 
444
 
445
 
446
    cmp  [velocity],dword 0x100    ; jump up ?
447
    jbe  nojumpup
448
    mov  ebx,[velocity]
449
    sub  ebx,1
450
    cmp  ebx,0x100
451
    jnz  no0x100
452
    mov  [velocity],dword 0xff
453
    jmp  nojumpup
454
  no0x100:
455
    mov  [velocity],ebx
456
    sub  ebx,0x100-1
457
    mov  eax,[marioxy]
458
    sub  ax,bx
459
    mov  [marioxy],eax
460
  nojumpup:
461
 
462
    call mario_environment
463
 
464
    cmp  [velocity],dword 0x100    ; jump -> down ?
465
    jge  nojumpdown
466
    mov  eax,[marioy]
467
    cmp  eax,[mario_below]
468
    jb   yesgd
469
    mov  [velocity],dword 0xff
470
    mov  eax,[marioxy]
471
    mov  eax,[mario_below]
472
    sub  eax,1
473
    mov  ebx,40
474
     mul  ebx
475
     sub  eax,10
476
    mov  word [marioxy],ax
477
    jmp  nojumpdown
478
  yesgd:
479
    mov  ebx,[velocity]
480
    sub  ebx,1
481
    mov  [velocity],ebx
482
    mov  eax,[marioxy]
483
    add  ax,0xff
484
    sub  ax,bx
485
    mov  [marioxy],eax
486
  nojumpdown:
487
 
488
 
489
    popa
490
 
491
    ret
492
 
493
 
494
marioy dd 0x0
495
 
496
mariox dd 0x0
497
 
498
mario_below dd 5
499
 
500
 
501
mario_environment:
502
 
503
     pusha
504
 
505
     mov  eax,[marioy]
506
     mov  ebx,12
507
     mul  ebx
508
     add  eax,[mariox]
509
     add  eax,field
510
 
511
     cmp  [eax],byte ' '
512
     jz   me_ok
513
 
514
     mov  eax,[marioy]
515
     mov  [mario_below],eax
516
 
517
     popa
518
     ret
519
 
520
   me_ok:
521
 
522
     mov  [mario_below],dword 100
523
 
524
     popa
525
     ret
526
 
527
 
528
mario_delay:
529
 
530
    pusha
531
 
532
    mov  eax,5
533
    mov  ebx,2
534
    int  0x40
535
 
536
    popa
537
    ret
538
 
539
 
540
 
541
draw_mario:
542
 
543
    pusha
544
 
545
    mov  eax,[mariomem]
546
    cmp  eax,[marioxy]
547
    jnz  dm1
548
 
549
    call mario_delay
550
 
551
    popa
552
 
553
    ret
554
 
555
  dm1:
556
 
557
    mov  eax,[marioxy]
558
    mov  [mariomem],eax
559
 
560
 
561
    cmp  byte [leftright],byte 1   ; go left
562
    jnz  no_m_left
563
    jmp  m_left
564
  no_m_left:
565
 
566
    cmp  byte [leftright],byte 4   ; go right
567
    jnz  no_m_right
568
    jmp  m_right
569
  no_m_right:
570
 
571
    cmp  byte [leftright],byte 2   ; stand left
572
    jnz  no_r_still
573
    mov  eax,7
574
    mov  ebx,mario_green
575
    mov  ecx,50*65536+70
576
    mov  edx,[marioxy]
577
    int  0x40
578
    call advance_mario
579
    mov  eax,7
580
    mov  ebx,mario_1
581
    mov  ecx,50*65536+70
582
    mov  edx,[marioxy]
583
    int  0x40
584
    call mario_delay
585
    popa
586
    ret
587
  no_r_still:
588
 
589
    cmp  byte [leftright],byte 3   ; stand right
590
    jnz  no_l_still
591
    mov  eax,7
592
    mov  ebx,mario_green
593
    mov  ecx,50*65536+70
594
    mov  edx,[marioxy]
595
    int  0x40
596
    call advance_mario
597
    mov  eax,7
598
    mov  ebx,mario_4
599
    mov  ecx,50*65536+70
600
    mov  edx,[marioxy]
601
    int  0x40
602
    call mario_delay
603
 
604
    popa
605
    ret
606
  no_l_still:
607
 
608
    popa
609
    ret
610
 
611
 
612
 
613
 
614
  m_left:
615
 
616
    mov  eax,7
617
    mov  ebx,mario_green
618
    mov  ecx,50*65536+70
619
    mov  edx,[marioxy]
620
    int  0x40
621
    call advance_mario
622
    mov  eax,7
623
    mov  ebx,mario_1
624
    mov  ecx,50*65536+70
625
    mov  edx,[marioxy]
626
    int  0x40
627
    call mario_delay
628
 
629
    mov  eax,7
630
    mov  ebx,mario_green
631
    mov  ecx,50*65536+70
632
    mov  edx,[marioxy]
633
    int  0x40
634
    call advance_mario
635
    mov  eax,7
636
    mov  ebx,mario_2
637
    mov  ecx,50*65536+70
638
    mov  edx,[marioxy]
639
    int  0x40
640
    call mario_delay
641
 
642
    mov  eax,7
643
    mov  ebx,mario_green
644
    mov  ecx,50*65536+70
645
    mov  edx,[marioxy]
646
    int  0x40
647
    call advance_mario
648
    mov  eax,7
649
    mov  ebx,mario_3
650
    mov  ecx,50*65536+70
651
    mov  edx,[marioxy]
652
    int  0x40
653
    call mario_delay
654
 
655
    mov  eax,7
656
    mov  ebx,mario_green
657
    mov  ecx,50*65536+70
658
    mov  edx,[marioxy]
659
    int  0x40
660
    call advance_mario
661
    mov  eax,7
662
    mov  ebx,mario_2
663
    mov  ecx,50*65536+70
664
    mov  edx,[marioxy]
665
    int  0x40
666
    call mario_delay
667
 
668
    popa
669
 
670
    ret
671
 
672
  m_right:
673
 
674
 
675
    mov  eax,7
676
    mov  ebx,mario_green
677
    mov  ecx,50*65536+70
678
    mov  edx,[marioxy]
679
    int  0x40
680
    call advance_mario
681
    mov  eax,7
682
    mov  ebx,mario_4
683
    mov  ecx,50*65536+70
684
    mov  edx,[marioxy]
685
    int  0x40
686
    call mario_delay
687
 
688
    mov  eax,7
689
    mov  ebx,mario_green
690
    mov  ecx,50*65536+70
691
    mov  edx,[marioxy]
692
    int  0x40
693
    call advance_mario
694
    mov  eax,7
695
    mov  ebx,mario_5
696
    mov  ecx,50*65536+70
697
    mov  edx,[marioxy]
698
    int  0x40
699
    call mario_delay
700
 
701
    mov  eax,7
702
    mov  ebx,mario_green
703
    mov  ecx,50*65536+70
704
    mov  edx,[marioxy]
705
    int  0x40
706
    call advance_mario
707
    mov  eax,7
708
    mov  ebx,mario_6
709
    mov  ecx,50*65536+70
710
    mov  edx,[marioxy]
711
    int  0x40
712
    call mario_delay
713
 
714
    mov  eax,7
715
    mov  ebx,mario_green
716
    mov  ecx,50*65536+70
717
    mov  edx,[marioxy]
718
    int  0x40
719
    call advance_mario
720
    mov  eax,7
721
    mov  ebx,mario_5
722
    mov  ecx,50*65536+70
723
    mov  edx,[marioxy]
724
    int  0x40
725
    call mario_delay
726
 
727
    popa
728
 
729
    ret
730
 
731
 
732
 
733
 
734
 
735
draw_window:
736
 
737
    pusha
738
 
739
    mov       eax,12                    ; tell os about redraw
740
    mov       ebx,1
741
    int       0x40
742
 
743
    mov       eax,0                     ; define and draw window
744
    mov       ebx,80*65536+480+1
745
    mov       ecx,20*65536+382
746
    mov       edx,0x0000500f
747
    mov       esi,0x8066AA88
748
    mov       edi,0x00559977
749
    int       0x40
750
 
751
    mov       eax,dword 0x00000004
752
    mov       ebx,8*65536+8
753
    mov       ecx,dword 0x00cccccc
754
    mov       edx,text
755
    mov       esi,textlen-text
756
    int       0x40
757
 
758
    mov       eax,8
759
    mov       ebx,(481-19)*65536+12     ; button start x & size
760
    mov       ecx,5*65536+12            ; button start y & size
761
    mov       edx,1                     ; button number
762
    mov       esi,0x00229911            ; button color
763
    int       0x40
764
 
765
    mov       eax,12                    ; tell os about redraw end
766
    mov       ebx,2
767
    int       0x40
768
 
769
    popa
770
 
771
    ret
772
 
773
 
774
; DATA SECTION
775
 
776
 
777
filename:
778
    db  'MARIOALLBMP'
779
 
780
text:
781
    db 'SUPER MARIO - USE ARROW KEYS'
782
textlen:
783
 
784
xx  db 'x'
785
 
786
field:
787
 
788
    db  '1          1'
789
    db  '1          1'
790
    db  '111      111'
791
    db  '1          1'
792
    db  '1          1'
793
    db  '1  111111  1'
794
    db  '1          1'
795
    db  '1          1'
796
    db  '222222222222'
797
 
798
xxyy        dd 0x0
799
 
800
marioxy     dd 0x0
801
 
802
mariomem    dd 0x0
803
 
804
leftright   dd 0x0
805
 
806
velocity    dd 0x0
807
 
808
 
809
I_END:
810