?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
 
510 alone 4
EGA=0
5
 
124 alone 6
nextfigx=4
7
nextfigy=8
8
 
73 Alone 9
fieldwid=10
10
fieldhgt=23
11
fieldx=16-fieldwid/2
12
fieldy=0
13
centerfield=fieldx+(fieldwid/2)
14
coordsEndPlayField=(fieldx*2-1)+(256*fieldy)
15
coordsBeginPlayField=(fieldx-1)+(256*fieldy)
16
coordsDropFig=(coordsBeginPlayField+coordsEndPlayField)/2
17
fieldmarginsymbol='x'
124 alone 18
dangerattr1=0x38+2 ;red
19
dangerattr2=0x38+4 ;green
20
dangerattr3=0x38+1 ;blue
73 Alone 21
scoreattr=dangerattr3
22
wallattr=dangerattr1
124 alone 23
emptyattr=0x38
73 Alone 24
 
510 alone 25
attrs=0x3800 ;0x600
26
 
73 Alone 27
;fieldEx=32
28
;fieldEy=24
29
centr=0x0b0b;(fieldEx/2)+(256*fieldEy/2)
30
 
116 alone 31
dir_r=key_right;;#09
32
dir_l=key_left;#08
33
dir_u=key_up;#0b
34
dir_d=key_down;#0a
73 Alone 35
 
36
        org PROGSTART
37
begin
583 alone 38
        OS_HIDEFROMPARENT
73 Alone 39
        ld e,3 ;6912
40
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
41
 
510 alone 42
        ;OS_GETSCREENPAGES
344 alone 43
;de=࠭ 0- ࠭ (d=), hl=࠭ 1- ࠭ (h=)
510 alone 44
        ;ld a,d
45
        ;SETPG16K
73 Alone 46
 
510 alone 47
        call setpgs_scr
48
 
73 Alone 49
        call cls
50
        call prfield
51
        call newfig
510 alone 52
        call copybuftoscr
124 alone 53
 
73 Alone 54
        ld a,(curfalldelay)
55
        ld (falldelaycount),a
124 alone 56
 
510 alone 57
gameloop_newfig
58
        call setpgs_scr
59
 
124 alone 60
        call newfig
61
 
62
        ld bc,nextfigy*256 + nextfigx
344 alone 63
        ld de,prfig_pixel_cleanout ;de= 楤
124 alone 64
        ld hl,nextfig
65
        ld a,(nextfigcolor)
66
        call prfig_hl_a
73 Alone 67
 
124 alone 68
        call collide ;nz=collision
69
        jr nz,gameover
134 dimkam 70
        ld a,1
71
        ld (figmoved),a
124 alone 72
 
73 Alone 73
gameloop
510 alone 74
        call setpgs_scr
75
        call copybuftoscr
76
 
73 Alone 77
        ld bc,(curxy) ;bc=yx 
344 alone 78
        ld de,prfig_pixel ;de= 楤
134 dimkam 79
figmoved=$+1
80
        ld a,0
81
        or a
82
        call nz,prfig
83
        xor a
84
        ld (figmoved),a
85
        ld (figcleared),a
86
 
73 Alone 87
        call prscore
88
 
89
        YIELD ;call delay
90
 
134 dimkam 91
        xor a
92
        ld (downneeded),a
93
 
73 Alone 94
        call storeposition
95
        GET_KEY
116 alone 96
         cp key_esc
73 Alone 97
         jr z,quit
510 alone 98
         cp key_redraw
99
         push af
100
         call z,redraw
101
         pop af
102
;a=key
344 alone 103
        call controlkey ; न 䨣 (⠭ downneeded  down)
134 dimkam 104
 
105
        ld a,(figmoved)
106
        or a
107
        jr z,nokey
108
 
109
        call undraw_oldfig_ifneeded
73 Alone 110
        call collide
344 alone 111
        call nz,restoreposition ;⬥塞  न, ᫨  ⠢ 䨣
134 dimkam 112
nokey
113
 
114
        call movedownifneeded
115
        ld a,(figmoved)
116
        or a
117
        jr z,nocollidedown
118
 
119
        call undraw_oldfig_ifneeded
73 Alone 120
        call collide
134 dimkam 121
        jr nz,figureonground
122
nocollidedown
123
        jr gameloop
124
figureonground
73 Alone 125
        call stopfig
134 dimkam 126
        jp gameloop_newfig
124 alone 127
gameover
510 alone 128
        jr $
73 Alone 129
        ld hl,endtext
130
        ld bc,centr
131
        call prtext
132
gameoverloop
133
        YIELD
134
        GET_KEY
116 alone 135
        cp key_esc
73 Alone 136
        jr nz,gameoverloop
137
quit
138
        QUIT
139
 
510 alone 140
copybuftoscr
141
        ld hl,attrs
142
        ld de,0x5800
143
        ld bc,0x300
144
        ldir
145
        ret
146
 
147
redraw
148
        call setpgs_scr
149
        ;jr $
150
        ;call cls
151
        ld e,0
152
        OS_CLS
153
        call copybuftoscr
154
        call prfield
155
;TODO  ⥪饥  
156
;TODO   䨣
157
        ret
158
 
159
setpgs_scr
160
        if EGA
555 alone 161
        ld a,(user_scr0_low) ;ok
510 alone 162
        SETPG32KLOW
555 alone 163
        ld a,(user_scr0_high) ;ok
510 alone 164
        SETPG32KHIGH
165
        else
555 alone 166
        ld a,(user_scr0_high) ;ok
510 alone 167
        SETPG16K
168
        endif
169
        ret
170
 
171
 
73 Alone 172
storeposition
173
        ld bc, 4
174
        ld hl, curfig
175
        ld de, oldcurfig
176
        ldir
177
        ld hl,(curxy)
178
        ld (oldcurxy),hl
179
        ret
180
 
181
restoreposition
182
        ld hl,(oldcurxy)
183
        ld (curxy),hl
184
        ld bc, 4
185
        ld de, curfig
186
        ld hl, oldcurfig
187
        ldir
188
        ret
189
 
134 dimkam 190
undraw_oldfig_ifneeded
191
        ld bc,(oldcurxy) ;bc=yx 
344 alone 192
        ld de,prfig_clearpixel ;de= 楤
134 dimkam 193
        ld hl,oldcurfig
194
figcleared=$+1
195
        ld a,0
196
        or a
197
        call z,prfig_hl
198
        ld a,1
199
        ld (figcleared),a
200
        ret
201
 
73 Alone 202
collide
203
;nz=collision
204
        ld bc,(curxy) ;bc=yx 
344 alone 205
        ld de,prfig_checkpixel ;de= 楤
73 Alone 206
        call prfig
207
        ld a,hx
208
        or a
209
        ret
210
 
211
stopfig
212
        ld bc,(oldcurxy) ;bc=yx 
344 alone 213
        ld de,prfig_pixel ;de= 楤
73 Alone 214
        call prfig
215
 
216
        ld hl,dellineslist
217
        ld bc,fieldx+(256*fieldy)
218
        ld ix,fieldhgt ;hx=0
219
finddellines0
220
        push bc
221
        ld (hl),b
222
        call calcattraddr
344 alone 223
        call checkfilledline ;nz  ᦥ
73 Alone 224
        jr z,finddellines_nofire
225
        inc hl
226
        inc hx
227
finddellines_nofire
228
        pop bc
229
        inc b ;y
230
        dec lx
231
        jr nz,finddellines0
232
        ld (hl),#ff
233
 
234
        ld c,hx
235
        ld b,0
236
        ld hl,scoreadds
237
        add hl,bc
238
        add hl,bc
239
        ld c,(hl)
240
        inc hl
241
        ld b,(hl)
242
        ld hl,(curscore)
243
        add hl,bc
244
        ld (curscore),hl
245
 
246
        ld hl,dellineslist
247
firelines0
248
        ld a,(hl)
249
        cp #ff
250
        jr z,firelinesq
251
        inc hl
252
        ld b,a ;y
253
        ld c,fieldx
254
        ld a,emptyattr
255
        ld (curattr),a
256
        ld e,fieldwid
257
firelines1
258
        ld a,' '
259
        call prcharxy
260
        inc c
261
        dec e
262
        jr nz,firelines1
263
        ld c,fieldx
264
        ld a,b ;y
265
        dec a
266
        push hl
344 alone 267
        call shiftblock ;bc=  㣮, a=⢮ ᤢ ப
73 Alone 268
        pop hl
269
        jr firelines0
270
firelinesq
124 alone 271
        ret
272
 
73 Alone 273
newfig  
124 alone 274
        ld hl,nextfig
275
        ld de,curfig
276
        ld bc,4
277
        ldir
278
        ld a,(nextfigcolor)
279
        ld (curfigcolor),a
280
 
73 Alone 281
        ld c,nfigs
282
        call rnd
283
        add a,a
284
        add a,a
285
        ld c,a
286
        ld b,0
287
        ld hl,figs
288
        add hl,bc
124 alone 289
        ld de,nextfig
73 Alone 290
        ld  c,4
291
        ldir
292
        ld c,4
293
        call rnd
294
        add a,2 ;red...
295
        add a,a
296
        add a,a
297
        add a,a
124 alone 298
        ld (nextfigcolor),a
299
 
73 Alone 300
        ld hl,coordsDropFig
301
        ld (curxy),hl
302
        ret
303
 
304
shiftblock
344 alone 305
;bc=  㣮, a=⢮ ᤢ ப
73 Alone 306
shiftblockline
307
        push af
308
        call calcscraddr
344 alone 309
        ex de,hl ;hl= ⥪饩 ப
73 Alone 310
        dec b ;y
344 alone 311
        call calcscraddr ;de= ।饩 ப
312
        ex de,hl ;de= ⥪饩 ப, hl= ।饩 ப
73 Alone 313
        push bc
314
        ld a,8
315
shiftblockline0
316
        ld bc,fieldwid
317
        push de
318
        push hl
319
        ldir
320
        pop hl
321
        pop de
322
        inc h
323
        inc d
324
        dec a
325
        jr nz,shiftblockline0
326
        dec h
327
        dec d
328
        call calcattraddr_fromscr
329
        ex de,hl
330
        call calcattraddr_fromscr
331
        ex de,hl
332
        ld bc,fieldwid
333
        ldir
334
        pop bc
335
        pop af
336
        dec a
337
        jr nz,shiftblockline
338
        ret
339
 
340
checkfilledline
341
;de=attraddr
342
        ld b,fieldwid
343
checkfilledline0
344
        ld a,(de)
345
        inc de
346
        cp emptyattr
347
        ret z
348
        djnz checkfilledline0
349
        ret ;nz
350
 
134 dimkam 351
movedownifneeded
352
downneeded=$+1
353
        ld a,0
354
        or a
355
        jr nz,movedownok
73 Alone 356
        ld a,(falldelaycount)
357
        dec a
344 alone 358
        jr nz, falldelaycount_q ;᫨  0,  室
134 dimkam 359
movedownok
360
        ld a,1
361
        ld (figmoved),a
73 Alone 362
        ld a,(curfalldelay)
363
        ld bc,(curxy)
364
        inc b
365
        ld (curxy),bc
366
falldelaycount_q
367
        ld (falldelaycount),a  
368
        ret
369
 
370
controlkey
371
        cp dir_u
372
        jr z,rotfig
373
        ld bc,(curxy)
374
        dec c
375
        cp dir_l
134 dimkam 376
        jr z,moveok
73 Alone 377
        inc c
378
        inc c
379
        cp dir_r
134 dimkam 380
        jr z,moveok
73 Alone 381
        dec c
382
        cp dir_d
134 dimkam 383
        ret nz
384
        ld a,1
385
        ld (downneeded),a
386
        ret
387
moveok
73 Alone 388
        ld (curxy),bc      
134 dimkam 389
        ld a,1
390
        ld (figmoved),a
73 Alone 391
        ret    
392
 
393
rotfig
394
        ld bc,(curfig)
395
        ld de,(curfig+2)
396
        ld hl,curfig
397
        ld lx,4
398
rotfig_lines
399
        xor a
400
        rr c
401
        rla
402
        rr b
403
        rla
404
        rr e
405
        rla
406
        rr d
407
        rla
408
        ld (hl),a
409
        inc hl
410
        dec lx  
411
        jr nz, rotfig_lines
134 dimkam 412
        ld a,1
413
        ld (figmoved),a
73 Alone 414
        ret
415
 
416
rnd
417
;0..c-1
418
        ld a,r
419
rnd0
420
        sub c
421
        jr nc,rnd0
422
        add a,c
423
        ret
424
 
425
cls
426
        ld hl,#4000
427
        ld de,#4001
428
        ld bc,#17ff
429
        ld (hl),0;#ff
430
        ldir
510 alone 431
        ld hl,attrs;#5800
432
        ld de,attrs+1;#5801
73 Alone 433
        ld (hl),emptyattr
434
        ld bc,767
435
        ldir
510 alone 436
        call copybuftoscr
73 Alone 437
        ret
438
 
439
prfield
440
        ld a,wallattr
441
        ld (curattr),a
442
        ld bc,fieldx-1+256*(fieldy+fieldhgt) ;bottom
443
        ld e,fieldwid+2
444
prfieldhor0
445
        ld a,fieldmarginsymbol
446
        call prcharxy
447
        inc c
448
        dec e
449
        jr nz,prfieldhor0
450
        ld bc,coordsBeginPlayField ;left
451
        call prfieldver
452
        ld bc,coordsEndPlayField ;right
453
prfieldver
454
        ld e,fieldhgt
455
prfieldver0
456
        ld a,fieldmarginsymbol
457
        call prcharxy
458
        inc b
459
        dec e
460
        jr nz,prfieldver0
461
        ret
462
 
463
prtext
344 alone 464
;bc=न
73 Alone 465
;hl=text
466
        ld a,emptyattr
467
        ld (curattr),a
468
        ld a,(hl)
469
        or a
470
        ret z
471
        call prcharxy
472
        inc hl
473
        inc c
474
        jr prtext
475
 
476
prscore
477
        ld hl,(curscore)
478
        ld de,#4000
479
prnum
480
        ld bc,1000
481
        call prdig
482
        ld bc,100
483
        call prdig
484
        ld bc,10
485
        call prdig
486
        ld bc,1
487
prdig
488
        ld a,'0'-1
489
prdig0
490
        inc a
491
        or a
492
        sbc hl,bc
493
        jr nc,prdig0
494
        add hl,bc
495
        ;push hl
496
        ;call prchar
497
        ;pop hl
498
        ;ret
499
 
500
prchar
501
;a=code
502
;de=screen
503
        push de
504
        push hl
505
        call prcharin
506
        pop hl
507
        pop de
508
        inc e
509
        ret
510
 
511
calcscraddr
512
;de=#4000 + (y&#18)+((y*32)&#ff+x)
513
        ld a,b ;y
514
        and #18
515
        add a,#40
516
        ld d,a
517
        ld a,b ;y
518
        add a,a ;*2
519
        add a,a ;*4
520
        add a,a ;*8
521
        add a,a ;*16
522
        add a,a ;*32
523
        add a,c ;x
524
        ld e,a
525
        ret
526
 
527
calcattraddr
528
        call calcscraddr
529
        ;call calcattraddr_fromscr
530
calcattraddr_fromscr
531
;de=#5800 + (y&#18)/8+((y*32)&#ff+x)
532
        ld a,d
533
        ;sub #40
534
        rra
535
        rra
536
        rra
537
        and 3
510 alone 538
        add a,attrs/256;#58
73 Alone 539
        ld d,a ;de=attraddr
540
        ret
541
 
542
prcharxy
543
;a=code
544
;bc=yx
545
        push bc
546
        push de
547
        push hl
548
        push af
549
        call calcscraddr
550
        pop af
551
        push de
552
        call prcharin
553
        pop de
554
        call calcattraddr_fromscr
555
curattr=$+1
556
        ld a,0
557
        ld (de),a
558
        pop hl
559
        pop de
560
        pop bc
561
        ret
562
 
563
prcharin
564
        ld l,a
565
        ld h,0
566
        add hl,hl
567
        add hl,hl
568
        add hl,hl
569
        ld bc,font-256;#3c00
570
        add hl,bc
571
        ld b,8
572
prchar0
573
        ld a,(hl) ;font
574
        ld (de),a ;scr
575
        inc hl
576
        inc d ;+256
577
        djnz prchar0
578
        ret
579
 
580
;text
581
;        db "Hello world!",0
582
endtext
583
        db "Game over!",0
584
curxy
585
        dw 0
586
oldcurxy
587
        dw 0
588
 
589
 
590
prfig
591
;bc=yx 
344 alone 592
        ld hl,curfig ;hl=㪠⥫  䨣
134 dimkam 593
prfig_hl
124 alone 594
curfigcolor=$+1
595
        ld a,6
596
prfig_hl_a
344 alone 597
;hl=㪠⥫  䨣
598
;de= 楤
124 alone 599
        ld lx,a
344 alone 600
        ld hx,0 ;lx=ਡ, hx=0
73 Alone 601
        ld (prfig_calladdr),de
602
        ld e,4
603
prfig_lines
604
        push de
605
        ld d,(hl) ;%0000????
606
        inc hl
607
        rlc d
608
        rlc d
609
        rlc d
610
        rlc d ;%????0000
611
        push bc
612
        ld e,4
613
prfig_pixels
614
        rl d
615
prfig_calladdr=$+1
124 alone 616
        call prfig_pixel
73 Alone 617
        inc c ;x
618
        dec e
619
        jr nz,prfig_pixels
620
        pop bc
621
        inc b ;y
622
        pop de
623
        dec e
624
        jr nz,prfig_lines
625
        ret
626
 
124 alone 627
;bc=yx
73 Alone 628
prfig_pixel
124 alone 629
        ret nc
73 Alone 630
        push bc
631
        push de
632
        push hl
633
        ld a,lx
634
        ld (curattr),a
635
        ld a,'X'
636
        call prcharxy
637
        pop hl
638
        pop de
639
        pop bc
640
        ret
124 alone 641
prfig_pixel_cleanout
642
        push bc
643
        push de
644
        push hl
645
        ld a,emptyattr
646
        ld (curattr),a
647
        ld a,' '
648
        jr nc,prfig_pixel_cleanout_ok
649
        ld a,lx
650
        ld (curattr),a
651
        ld a,'X'
652
prfig_pixel_cleanout_ok
653
        call prcharxy
654
        pop hl
655
        pop de
656
        pop bc
657
        ret
73 Alone 658
prfig_checkpixel
124 alone 659
        ret nc
73 Alone 660
        push bc
661
        push de
662
        push hl
663
        call calcattraddr
664
        ld a,(de)
665
        cp emptyattr
666
        jr z,checkpixelempty
667
        inc hx
668
checkpixelempty  
669
        pop hl
670
        pop de
671
        pop bc
672
        ret
673
prfig_clearpixel
674
;bc=yx
124 alone 675
        ret nc
73 Alone 676
        push bc
677
        push de
678
        push hl
679
        ld a,emptyattr
680
        ld (curattr),a
681
        ld a,' '
682
        call prcharxy
683
        pop hl
684
        pop de
685
        pop bc
686
        ret
687
 
688
figs
344 alone 689
;
73 Alone 690
        db %0000
691
        db %0110
692
        db %0110
693
        db %0000
344 alone 694
;
73 Alone 695
        db %0100
696
        db %0100
697
        db %0100
698
        db %0100
344 alone 699
;ᠯ ࠢ
73 Alone 700
        db %0100
701
        db %0100
702
        db %0110
703
        db %0000
344 alone 704
;ᠯ 
73 Alone 705
        db %0010
706
        db %0010
707
        db %0110
708
        db %0000
344 alone 709
;1
73 Alone 710
        db %0000
711
        db %0011
712
        db %0110
713
        db %0000
344 alone 714
;2
73 Alone 715
        db %0000
716
        db %1100
717
        db %0110
718
        db %0000
77 Alone 719
;T
720
        db %0000
721
        db %1110
722
        db %0100
723
        db %0000
73 Alone 724
nfigs=($-figs)/4
725
curfig
726
        ds 4
727
oldcurfig
728
        ds 4        
124 alone 729
nextfig
730
        ds 4
73 Alone 731
 
732
scoreadds
733
        dw 0
734
        dw 10 ;1 line
735
        dw 30 ;2 lines
736
        dw 50 ;3 lines
737
        dw 100 ;4 lines
738
 
739
falldelaycount
740
        db 0
741
curfalldelay
742
        db 16
743
curscore
744
        dw 0
124 alone 745
nextfigcolor
746
        db 0
73 Alone 747
 
124 alone 748
 
73 Alone 749
dellineslist
344 alone 750
        ds 4+1 ;max 4  + #ff
73 Alone 751
 
260 alone 752
;oldtimer
753
;        dw 0
73 Alone 754
 
755
        ;align 256
756
font
757
        incbin "zx.fnt"
758
 
759
end
760
 
289 dimkam 761
        ;display "End=",end
73 Alone 762
        ;display "Free after end=",/d,#c000-end
289 dimkam 763
        ;display "Size ",/d,end-begin," bytes"
73 Alone 764
 
765
        savebin "tetris.com",begin,end-begin
766
 
767
        ;LABELSLIST "..\us\user.l"