?login_element?

Subversion Repositories NedoOS

Rev

Rev 555 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
73 Alone 1
        DEVICE ZXSPECTRUM128
2
        include "../../_sdk/sys_h.asm"
3
 
4
EGA=1
5
 
6
        if EGA
7
attrs=0x3800 ;0x600
8
attrs_sz=0x600
9
fieldwid=38
10
fieldhgt=23
11
        else
12
attrs=0x5800
13
attrs_sz=0x300
14
fieldwid=30
15
fieldhgt=22
16
        endif
17
 
18
STACK=0x4000
19
 
20
 
21
dangerattr1=#38+2 ;red
22
dangerattr2=#38+4 ;green
23
dangerattr3=#38+1 ;blue
24
scoreattr=dangerattr3
25
wallattr=dangerattr1
26
snakeattr=dangerattr2
27
rabbitattr=#40+#30 ;bright yellow
28
emptyattr=#38
29
 
30
snakecoordssize=fieldwid*fieldhgt*2;768*2
31
 
116 alone 32
dir_r=key_right;cs8;#09
33
dir_l=key_left;cs5;#08
34
dir_u=key_up;cs7;#0b
35
dir_d=key_down;cs6;#0a
73 Alone 36
 
37
        org PROGSTART
38
begin
39
        ld sp,STACK
583 alone 40
        OS_HIDEFROMPARENT
73 Alone 41
 
42
        if EGA
43
        ld e,0
44
        else
45
        ld e,3
46
        endif
47
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
48
 
510 alone 49
        ;OS_GETSCREENPAGES
344 alone 50
;de=࠭ 0- ࠭ (d=), hl=࠭ 1- ࠭ (h=)
510 alone 51
        ;if EGA
52
        ;ld a,e
53
        ;SETPG32KLOW
54
        ;ld a,d
55
        ;SETPG32KHIGH
56
        ;else
57
        ;ld a,d
58
        ;SETPG16K
59
        ;endif
73 Alone 60
 
61
        ld hl,attrs
62
        ld de,attrs+1
63
        ld bc,attrs_sz-1
64
        ld (hl),emptyattr
65
        ldir
510 alone 66
 
67
        call redraw
73 Alone 68
 
69
        ld hl,#0101
70
        ld (snakecoords),hl
71
        ;ld bc,#0a1e
72
        ;call prrabbit
73
        call genrabbit
74
gameloop
510 alone 75
        call setpgs_scr
76
 
73 Alone 77
        if EGA
78
        ld bc,0*256+18
79
        call calcscraddr
80
        else
81
        ld de,#4000+14
82
        endif
83
        ld hl,(curlength)
84
        call prnum
85
        call delay
86
        GET_KEY
116 alone 87
         cp key_esc
73 Alone 88
         jr z,quit
510 alone 89
         cp key_redraw
90
         push af
91
         call z,redrawall
92
         pop af
93
;a=key
73 Alone 94
        call getkey
95
        call shrink
96
        call proldheadastail
344 alone 97
        call move_grow ;bc= न 
73 Alone 98
        push bc
99
        call collide_rabbit_startgrow
100
        call collide_walls_self ;Z=collision
101
        pop bc
102
        jr z,gameover
103
        call prhead
104
        jp gameloop
105
 
510 alone 106
redrawall
107
        call redraw
108
        call prsnake
109
        call getheadcoords
110
        call prhead
111
rabbitxy=$+1
112
        ld bc,0
113
        jp prrabbit
114
redraw
115
        call setpgs_scr
116
        call cls        
117
        jp prfield
118
 
119
setpgs_scr
555 alone 120
        ld a,(user_scr0_low) ;ok
510 alone 121
        SETPG32KLOW
555 alone 122
        ld a,(user_scr0_high) ;ok
510 alone 123
        SETPG32KHIGH
124
        ret
125
 
126
redrawgameover
127
        call redrawall
73 Alone 128
gameover
129
        ld hl,endtext
130
        if EGA
131
        ld bc,0x0b0f
132
        else
133
        ld bc,0x0b0b
134
        endif
135
        call prtext
136
gameoverloop
137
        YIELD
138
        GET_KEY
510 alone 139
        cp key_redraw
140
        jr z,redrawgameover
116 alone 141
        cp key_esc
73 Alone 142
        jr nz,gameoverloop
143
quit
144
        QUIT
145
 
146
rnd
147
;0..c-1
148
        ld a,r
149
rnd0
150
        sub c
151
        jr nc,rnd0
152
        add a,c
153
        ret
154
 
155
collide_rabbit_startgrow
156
        call getheadcoords
157
        ;call calcscraddr
158
        call calcattraddr;_fromscr
159
        ;de=attraddr (head)
160
        ld a,(de)
161
        cp rabbitattr
162
        ret nz
163
        ld a,5
164
        ld (curgrow),a
165
        ;call genrabbit
166
        ;ret
167
 
168
genrabbit
169
        ld c,fieldhgt
170
        call rnd
171
        inc a
172
        ld b,a
173
        ld c,fieldwid
174
        call rnd
175
        inc a
176
        ld c,a
177
 
344 alone 178
;genrabbit, ᫨   墮:
73 Alone 179
        ;call calcscraddr
180
        call calcattraddr;_fromscr
181
        ;de=attraddr (rabbit)
182
        ld a,(de)
183
        cp emptyattr
184
        jr nz,genrabbit
510 alone 185
        ld (rabbitxy),bc
73 Alone 186
 
187
prrabbit
188
;bc=yx
189
        ld a,rabbitattr
190
        ld (curattr),a
191
        ;ld a,'Y'
192
        ;jp prcharxy
193
        ld hl,tilerabbit
194
        jp prtilexy
195
 
196
collide_walls_self
197
;out: Z=collision
198
        call getheadcoords
199
        ;call calcscraddr
200
        call calcattraddr;_fromscr
201
        ;de=attraddr (head)
202
        ld a,(de)
203
        cp dangerattr1
204
        ret z
205
        cp dangerattr2
206
        ret
207
 
208
delay
209
        ld b,5
210
delay0
211
        push bc
212
        YIELD
213
        pop bc
214
        djnz delay0
215
        ret
216
 
217
getkey
218
        cp dir_l
219
        jr z,getkey_ok
220
        cp dir_r
221
        jr z,getkey_ok
222
        cp dir_u
223
        jr z,getkey_ok
224
        cp dir_d
225
        ret nz;jr z,getkey_ok
226
getkey_ok
227
        ld (curdirection),a
228
        ret
229
 
230
shrink
231
        ld a,(curgrow)
232
        or a
233
        jr z,nogrow
234
        dec a
235
        ld (curgrow),a
236
        ret;jr growq
237
nogrow
238
        ld bc,(snakecoords)
239
        call cltail
240
        ld hl,snakecoords+2
241
        ld de,snakecoords
242
        ld bc,snakecoordssize-2
243
        ldir
244
        ld hl,(curlength)
245
        dec hl
246
        ld (curlength),hl
247
;growq
248
        ret
249
 
510 alone 250
prsnake
251
        ld hl,snakecoords
252
        ld bc,(curlength)
253
prsnake0
254
        push bc
255
        push hl
256
        ld c,(hl)
257
        inc hl
258
        ld b,(hl)
259
        call prtailelement
260
        pop hl
261
        pop bc
262
        inc hl
263
        cpi
264
        jp pe,prsnake0
265
        ret
266
 
73 Alone 267
getheadcoords
344 alone 268
        ld hl,(curlength) ;  
73 Alone 269
        add hl,hl
270
        ld bc,snakecoords
271
        add hl,bc
272
        ld c,(hl)
273
        inc hl
274
        ld b,(hl)
275
        inc hl
276
        ret
277
 
278
move_grow
344 alone 279
;out: bc= न         
73 Alone 280
        call getheadcoords
344 alone 281
;bc= न         
73 Alone 282
        ld a,(curdirection)
283
        dec c
284
        cp dir_l
285
        jr z,moveq
286
        inc c
287
        inc c
288
        cp dir_r
289
        jr z,moveq
290
        dec c
291
        inc b
292
        cp dir_d
293
        jr z,moveq
294
        dec b
295
        dec b
296
moveq
344 alone 297
;bc= न         
73 Alone 298
        ld (hl),c
299
        inc hl
300
        ld (hl),b
301
        ld hl,(curlength)
302
        inc hl
303
        ld (curlength),hl
304
        ret
305
 
306
curgrow
307
        db 7
308
curdirection
309
        db dir_r
310
curlength
344 alone 311
        dw 0 ;  
73 Alone 312
 
313
cls
314
        if EGA
315
        ld e,0
316
        OS_CLS
317
        else
318
        ld hl,#4000
319
        ld de,#4001
320
        ld bc,#17ff
321
        ld (hl),0;#ff
322
        ldir
323
        ld hl,#5800
324
        ld de,#5801
325
        ld (hl),emptyattr
326
        ld bc,767
327
        ldir
328
        endif
329
        ret
330
 
331
prfield
332
        ld a,wallattr
333
        ld (curattr),a
334
        ld bc,#0000
335
        ld e,fieldwid+2
336
        call prfieldhor ;top
337
        ld bc,256*(fieldhgt+1);#1700
338
        ld e,fieldwid+2
339
        call prfieldhor ;bottom
340
        ld bc,#0100
341
        ld e,fieldhgt
342
        call prfieldver ;left
343
        ld bc,#0100+(fieldwid+1);#011f
344
        ld e,fieldhgt
345
        ;call prfieldver ;right
346
        ;ret
347
prfieldver
348
;bc=yx
349
;e=len
350
prfieldver0
351
        ;ld a,fieldmarginsymbol
352
        ;call prcharxy
353
        ld hl,tilebrick
354
        call prtilexy
355
        inc b
356
        dec e
357
        jr nz,prfieldver0
358
        ret
359
 
360
prfieldhor
361
;bc=yx
362
;e=len
363
prfieldhor0
364
        ;ld a,fieldmarginsymbol
365
        ;call prcharxy
366
        ld hl,tilebrick
367
        call prtilexy
368
        inc c
369
        dec e
370
        jr nz,prfieldhor0
371
        ret
372
 
373
proldheadastail
374
        call getheadcoords
510 alone 375
prtailelement
73 Alone 376
;bc=yx
377
        ld a,snakeattr
378
        ld (curattr),a
379
        ;ld a,'O'
380
        ;jp prcharxy
381
        ld hl,tilesnake
382
        jp prtilexy
383
 
384
prhead
385
;bc=yx
386
        ld a,snakeattr
387
        ld (curattr),a
388
        ;ld a,'O'
389
        ;jp prcharxy
390
        ld hl,tilesnakehead
391
        jp prtilexy
392
 
393
cltail
394
;bc=yx
395
        ld a,emptyattr
396
        ld (curattr),a
397
        ;ld a,' '
398
        ;jp prcharxy
399
        ld hl,tileempty
400
        jp prtilexy
401
 
402
prtext
344 alone 403
;bc=न
73 Alone 404
;hl=text
405
        ld a,emptyattr
406
        ld (curattr),a
407
        ld a,(hl)
408
        or a
409
        ret z
410
        call prcharxy
411
        inc hl
412
        inc c
413
        jr prtext
414
 
415
prnum
416
        ld bc,1000
417
        call prdig
418
        ld bc,100
419
        call prdig
420
        ld bc,10
421
        call prdig
422
        ld bc,1
423
prdig
424
        ld a,'0'-1
425
prdig0
426
        inc a
427
        or a
428
        sbc hl,bc
429
        jr nc,prdig0
430
        add hl,bc
431
        ;push hl
432
        ;call prchar
433
        ;pop hl
434
        ;ret
435
prchar
436
;a=code
437
;de=screen
438
        push de
439
        push hl
440
        call prcharin
441
        pop hl
442
        pop de
443
        inc e
444
        ret
445
 
446
calcscraddr
447
;bc=yx
344 alone 448
;  bc
73 Alone 449
        if EGA
450
        ex de,hl
451
        ld a,c ;x
452
        ld l,b ;y
453
        ld h,0
454
        ld b,h
455
        ld c,l
456
        add hl,hl
457
        add hl,hl
458
        add hl,bc ;*5
459
         add hl,hl
460
         add hl,hl
461
         add hl,hl ;*40
462
         add hl,hl
463
         add hl,hl
464
         add hl,hl
465
        add a,l
466
        ld l,a
467
        ld a,h
468
        adc a,0x80
469
        ld h,a
470
        ex de,hl
471
        else
472
;de=#4000 + (y&#18)+((y*32)&#ff+x)
473
        ld a,b ;y
474
        and #18
475
        add a,#40
476
        ld d,a
477
        ld a,b ;y
478
        add a,a ;*2
479
        add a,a ;*4
480
        add a,a ;*8
481
        add a,a ;*16
482
        add a,a ;*32
483
        add a,c ;x
484
        ld e,a
485
        endif
486
        ret
487
 
488
calcattraddr
489
;bc=yx
344 alone 490
;  bc
73 Alone 491
        if EGA
492
;de=attrs + (y&#18)/4+((y*64)&#ff+x)
493
        ld a,b
494
        rrca
495
        rrca
496
        ld d,a
497
        and 0xc0
498
        add a,c
499
        ld e,a
500
        sub c
501
        xor d
502
        add a,attrs/256
503
        ld d,a ;de=attraddr
504
        else
505
;de=#5800 + (y&#18)/8+((y*32)&#ff+x)
506
        ld a,b
507
        rrca
508
        rrca
509
        rrca
510
        ld d,a
511
        and 0xe0
512
        add a,c
513
        ld e,a
514
        sub c
515
        xor d
516
        add a,attrs/256;#58
517
        ld d,a ;de=attraddr
518
        endif
519
        ret
520
 
521
prtilexy
522
;hl=tile
523
;bc=yx
524
        push de
525
        push bc
526
        call calcscraddr
527
        ;push de
528
        call prcharin_go
529
        ;pop de
530
        pop bc
531
        call calcattraddr;_fromscr
532
        ld a,(curattr)
533
        ld (de),a
534
        pop de
535
        ret
536
 
537
prcharxy
538
;a=code
539
;bc=yx
540
        push de
541
        push hl
542
        push bc
543
        push af
544
        ;jr $
545
        call calcscraddr
546
        pop af
547
        ;push de
548
        call prcharin
549
        ;pop de
550
        pop bc
551
        call calcattraddr;_fromscr
552
curattr=$+1
553
        ld a,0
554
        ld (de),a
555
        pop hl
556
        pop de
557
        ret
558
 
559
prcharin
560
        if EGA
561
        sub 32
562
        ld l,a
563
        ld h,0
564
         add hl,hl
565
         add hl,hl
566
         add hl,hl
567
         add hl,hl
568
         add hl,hl
569
        ;ld bc,font-(32*32)
570
        ;add hl,bc
571
        ld a,h
572
        add a,font/256
573
        ld h,a
574
prcharin_go1
575
        ex de,hl
576
 
577
        if 1==1
578
        ld bc,40
579
        push hl
580
        push hl
581
        dup 8
582
        ld a,(de) ;font
583
        ld (hl),a ;scr
584
        inc de
585
        add hl,bc
586
        edup
587
        pop hl
588
        set 6,h
589
        ;ld d,font/256
590
        dup 8
591
        ld a,(de) ;font
592
        ld (hl),a ;scr
593
        inc de
594
        add hl,bc
595
        edup
596
        pop hl
597
        set 5,h
598
        push hl
599
        ;ld d,font/256
600
        dup 8
601
        ld a,(de) ;font
602
        ld (hl),a ;scr
603
        inc de
604
        add hl,bc
605
        edup
606
        pop hl
607
        set 6,h
608
        ;ld d,font/256
609
        dup 8
610
        ld a,(de) ;font
611
        ld (hl),a ;scr
612
        inc de
613
        add hl,bc
614
        edup
615
 
616
        else
617
        ld bc,40-0x6000
618
        dup 8
619
        ld a,(de) ;font
620
        inc de
621
        ld (hl),a ;scr
622
        set 6,h
623
        ld a,(de) ;font
624
        inc de
625
        ld (hl),a ;scr
626
        res 6,h
627
        set 5,h
628
        ld a,(de) ;font
629
        inc de
630
        ld (hl),a
631
        set 6,h
632
        ld a,(de) ;font
633
        inc de
634
        ld (hl),a ;scr
635
        ;res 6,h
636
        ;res 5,h
637
        add hl,bc
638
        edup
639
        endif
640
 
641
        ret
642
        else
643
        ld l,a
644
        ld h,0
645
        add hl,hl
646
        add hl,hl
647
        add hl,hl
648
        ld bc,font-256;#3c00
649
        add hl,bc
650
        endif
651
 
652
        if EGA
653
        if 1==1
654
prcharin_go=prcharin_go1
655
        else
656
prcharin_go
657
        ex de,hl
658
        ld bc,40
659
        dup 8
660
        ld a,(de) ;font
661
        ld (hl),a ;scr
662
        set 5,h
663
        ld (hl),a
664
        res 5,h
665
        inc de
666
        add hl,bc
667
        edup
668
        endif
669
        else
670
prcharin_go
671
        ld b,8
672
prchar0
673
        ld a,(hl) ;font
674
        ld (de),a ;scr
675
        inc hl
676
        inc d ;+256
677
        djnz prchar0
678
        endif
679
        ret
680
 
681
        macro cols data
682
_l=data/16
683
_r=data&15
684
        db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
685
        endm
686
 
687
        macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
688
        cols d0
689
        cols d1
690
        cols d2
691
        cols d3
692
        cols d4
693
        cols d5
694
        cols d6
695
        cols d7
696
        endm
697
 
698
tileempty
699
        if EGA
700
        ds 32
701
        else
702
        ds 8
703
        endif
704
 
705
tilebrick
706
        if EGA
707
        cols8 #00,#22,#aa,#22,#00,#22,#2a,#22
708
        cols8 #00,#20,#20,#20,#00,#22,#aa,#22
709
        cols8 #00,#22,#2a,#22,#00,#22,#aa,#22
710
        cols8 #00,#22,#aa,#22,#00,#20,#20,#20
711
        else
712
        db %00000000
713
        db %11101111
714
        db %00101000
715
        db %11101111
716
        db %00000000
717
        db %11111110
718
        db %10000010
719
        db %11111110
720
        endif
721
 
722
tilesnake
723
        if EGA
724
        cols8 #00,#00,#04,#4c,#4c,#4c,#04,#00
725
        cols8 #00,#44,#cc,#cc,#cc,#cc,#cc,#44
726
        cols8 #00,#40,#c4,#cc,#cc,#cc,#c4,#40
727
        cols8 #00,#00,#00,#40,#40,#40,#00,#00
728
        else
729
        db %00000000
730
        db %00111000
731
        db %01000100
732
        db %10000010
733
        db %10000010
734
        db %10000010
735
        db %01000100
736
        db %00111000
737
        endif
738
 
739
tilesnakehead
740
        if EGA
741
        cols8 #00,#00,#04,#4c,#4c,#4c,#04,#00
742
        cols8 #00,#44,#cc,#fc,#cc,#22,#cc,#44
743
        cols8 #00,#40,#c4,#fc,#cc,#2c,#c4,#40
744
        cols8 #00,#00,#00,#40,#40,#40,#00,#00
745
        else
746
        db %00000000
747
        db %00111000
748
        db %01000100
749
        db %10101010
750
        db %10000010
751
        db %10111010
752
        db %01000100
753
        db %00111000
754
        endif
755
 
756
tilerabbit
757
        if EGA
758
        cols8 #00,#77,#7f,#7f,#07,#07,#07,#00
759
        cols8 #00,#00,#70,#70,#f7,#0f,#f2,#77
760
        cols8 #00,#07,#7f,#7f,#f7,#07,#f7,#70
761
        cols8 #00,#70,#70,#70,#00,#00,#00,#00
762
        else
763
        db %00000000
764
        db %11000110
765
        db %10101010
766
        db %10101010
767
        db %01101100
768
        db %01010100
769
        db %01101100
770
        db %00111000
771
        endif
772
 
773
endtext
774
        db "GAME OVER!",0
775
 
260 alone 776
;oldtimer
777
;        dw 0
73 Alone 778
 
779
        if EGA
780
        align 256
781
font
782
        incbin "fontgfx"
783
        else
784
font
785
        incbin "zx.fnt"
786
        endif
787
 
788
snakecoords
344 alone 789
;y,x (  )
73 Alone 790
        ;ds snakecoordssize
791
 
792
end
793
 
289 dimkam 794
        ;display "End=",end
73 Alone 795
        ;display "Free after end=",/d,#c000-end
289 dimkam 796
        ;display "Size ",/d,end-begin," bytes"
73 Alone 797
 
798
        savebin "snake.com",begin,end-begin
799
 
800
        ;LABELSLIST "..\us\user.l"