Subversion Repositories NedoOS

Rev

Rev 2049 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
213 alone 1
 
2
       IF crosshair
2049 alone 3
       MACRO XORN n
213 alone 4
        LD A,(HL)
2080 alone 5
        ;and 0xff-n
6
        XOR n ;��㥬 � xor-����!
213 alone 7
        LD (HL),A
8
       ENDM
9
 
10
CROSSHAIR
1908 alone 11
        LD HL,scrbuf+((scrwid/2)<<8)+(scrhgtpix/2)
213 alone 12
        XORN #0F
13
        DEC H
14
        XORN #78
15
        INC L
16
        XORN #78
17
        INC H
18
        XORN #0F
2080 alone 19
        LD L,0xff&(scrbuf+(scrhgtpix/2)-7)
213 alone 20
        XORN #80
2080 alone 21
        LD L,0xff&(scrbuf+(scrhgtpix/2)-3)
213 alone 22
        XORN #80
2080 alone 23
        LD L,0xff&(scrbuf+(scrhgtpix/2)+4)
213 alone 24
        XORN #80
2080 alone 25
        LD L,0xff&(scrbuf+(scrhgtpix/2)+8)
213 alone 26
        XORN #80
27
        RET
28
       ENDIF ;crosshair
29
 
30
CHECKHEIGHTS
31
        LD HL,distbuf+#200 ;dist
32
        LD DE,scrbufflag
1908 alone 33
        LD BC,(scrwid<<8)+lowmaxscale
213 alone 34
checkheights0
35
        LD A,C;lowmaxscale
36
_=pixperchr
37
       DUP pixperchr
38
_=_-1
39
        CP (HL)
40
       IF debug
41
       CALL npp
42
       ENDIF
43
        INC L
44
        jr C,checkhigh-_
45
       EDUP
46
        XOR A
47
        JP checklow
48
       DUP pixperchr
49
        INC L
50
       EDUP
51
checkhigh ;A<>0 <128
52
checklow ;A=0
53
        LD (DE),A
54
        INC D
55
        DJNZ checkheights0
56
        RET
57
 
58
       IF debug
59
npp
60
       PUSH AF
61
       PUSH HL
62
        jr C,NNN
63
        LD HL,nlow
64
        INC (HL)
65
        INC HL
66
        jr Z,$-2
67
NNN
68
        LD HL,nstolb
69
        INC (HL)
70
        INC HL
71
        jr Z,$-2
72
       POP HL
73
       POP AF
74
        RET
75
nlow
76
        DS 4
77
nstolb
78
        DS 4
79
       ENDIF
80
 
435 alone 81
       if atm == 0
213 alone 82
CLSCRBUF
83
        LD H,scrbuf/256
84
        LD BC,scrwid*256+(0xff&scrbufflag)
85
        XOR A
86
        LD D,A
87
        ld E,A
88
clscrbuf0 ;
89
        LD L,C;scrbufflag
90
        CP (HL)
91
        jr NZ,clscrhigh
92
        LD L,0xff&(lowscrbuf+lowscrhgtpix)
93
        LD SP,HL
94
       IF (0xff&(scrbuf+scrhgtpix)) == 0
95
        INC H
96
       ENDIF
97
        JP clscrlow
98
clscrhigh
99
        LD L,0xff&(scrbuf+scrhgtpix)
100
       IF (0xff&(scrbuf+scrhgtpix)) == 0
101
        INC H
102
       ENDIF
103
        LD SP,HL
104
       DUP scrhgtpix/2
105
        PUSH DE
106
       EDUP
107
clscrlow=$-(lowscrhgtpix/2)-1 ;EORFILL could corrupt a word
108
       IF 0xff&(scrbuf+scrhgtpix)
109
        INC H
110
       ENDIF
111
        DJNZ clscrbuf0
112
clscrbufsp=$+1
113
        LD SP,0
114
        RET
435 alone 115
       endif
213 alone 116
 
117
       if atm == 0
118
EORFILL
119
       IF doublescr
120
        LD A,(newscr)
121
        SUB 1
122
        SBC A,A
123
        AND #80
124
        XOR scrtop/256
125
        LD (curscrtopH),A
126
        ADD A,+(lowscrtop/256)-(scrtop/256)
127
        LD (curlowscrtopH),A
128
        ADD A,+(attrtop/256)-(lowscrtop/256)
129
        LD (curattrtopH),A
130
        LD (curattrtopH2),A
131
       ENDIF
132
        LD L,scrtop&0xff
133
        LD C,32
134
        EXX
135
        LD H,scrbuf/256
136
        LD DE,+((scrbuf&0xff)*256)+(0xff&lowscrbuf)
137
        LD BC,+(scrwid*256)+(0xff&scrbufflag)
138
eorfill0 ;
139
        LD L,C;scrbufflag
140
        LD A,(HL)
141
        OR A
142
        JP Z,eorfilllow
143
eorfillhigh
144
        LD L,D;scrbuf
145
        LD SP,HL
146
        EXX
147
;EOR-fill �⮫�� �� ��࠭:
148
curscrtopH=$+1
149
        LD H,scrtop/256 ;#40
150
       JP M,eorcopy
151
        LD A,L
152
        AND 31
153
       IF scrtop&#E0
154
        ADD A,scrtop&#E0
155
       ENDIF
156
        LD L,A
157
        LD B,-7 ;BC,#F920
158
        XOR A
159
_=scrtop/32
160
      DUP scrhgt ;8
161
       DUP 4
162
        POP DE
163
        XOR E
164
        LD (HL),A
165
        INC H
166
        XOR D
167
        LD (HL),A
168
        INC H
169
       EDUP
170
        ORG $-1
171
__=$
172
        ADD HL,BC
173
_=_+1
174
       IF (_&7) == 0
175
        ORG __
176
        LD B,0 ;BC=#0020
177
        ADD HL,BC
178
        LD B,-7
179
       ENDIF
180
      EDUP
181
        ORG __
182
eorcopyQ
183
;attrs after pixels for no flickering
184
        LD A,L
185
        AND 31
186
       IF attrtop&#E0
187
        ADD A,attrtop&#E0
188
       ENDIF
189
        LD L,A
190
curattrtopH=$+1
191
        LD H,attrtop/256
192
        LD A,colour
193
        CP (HL)
194
        jr Z,eorfillok
195
        LD B,0 ;BC=32
196
       DUP (scrhgt-lowscrhgt)/2
197
        LD (HL),A
198
        ADD HL,BC
199
       EDUP
200
        ORG $-1
201
        LD DE,32*(lowscrhgt+1)
202
        ADD HL,DE
203
       DUP (scrhgt-lowscrhgt)/2
204
        LD (HL),A
205
        ADD HL,BC
206
       EDUP
207
        ORG $-1
208
eorfillok ;
209
        INC L
210
        EXX
211
        INC H
212
        DEC B
213
        JP NZ,eorfill0
214
eorfillsp=$+1
215
        LD SP,0
216
        RET
217
 
218
eorfilllow
1962 alone 219
       ;ex af,af' ;'
213 alone 220
        LD L,E;lowscrbuf
221
        LD SP,HL
222
        EXX
223
;EOR-fill ������� �⮫�� �� ��࠭:
224
        LD A,L
225
        AND 31
226
       IF attrtop&#E0
227
        ADD A,attrtop&#E0
228
       ENDIF
1962 alone 229
        LD L,A ;᭠砫� ������� ��ਡ�⠬� ����
213 alone 230
curattrtopH2=$+1
231
        LD H,attrtop/256
232
        LD A,ceilingcolour
233
        CP (HL)
1962 alone 234
        jr Z,eorfilllownattr ;㦥 ��������
213 alone 235
        LD B,0 ;BC=32
236
       DUP (scrhgt-lowscrhgt)/2
237
        LD (HL),A
238
        ADD HL,BC
239
       EDUP
240
        ORG $-1
1908 alone 241
        LD DE,32*(lowscrhgt+1) ;
242
        ADD HL,DE              ;����� add hl,bc:inc h (TODO)
213 alone 243
        LD A,floorcolour
244
       DUP (scrhgt-lowscrhgt)/2
245
        LD (HL),A
246
        ADD HL,BC
247
       EDUP
248
        ORG $-1
249
eorfilllownattr ;
250
        LD A,L
251
        AND 31
252
       IF lowscrtop&#E0
253
        ADD A,lowscrtop&#E0
254
       ENDIF
255
        LD L,A
256
curlowscrtopH=$+1
257
        LD H,lowscrtop/256
1962 alone 258
       ;branch to eorcopylow (������� �� �ந�室��)
259
       ;ex af,af' ;'
260
       ;JP M,eorcopylow
213 alone 261
 
262
        LD B,-7 ;BC,#F920
263
        XOR A
264
_=lowscrtop/32
265
      DUP lowscrhgt
266
       DUP 4
267
        POP DE
268
        XOR E
269
        LD (HL),A
270
        INC H
271
        XOR D
272
        LD (HL),A
273
        INC H
274
       EDUP
275
        ORG $-1
276
__=$
277
        ADD HL,BC
278
_=_+1
279
       IF (_&7) == 0
280
        ORG __
281
        LD B,0 ;BC=#0020
282
        ADD HL,BC
283
        LD B,-7
284
       ENDIF
285
      EDUP
286
        ORG __
287
        JP eorfillok
288
 
289
eorcopy
290
        LD A,L
291
        AND 31
292
       IF scrtop&#E0
293
        ADD A,scrtop&#E0
294
       ENDIF
295
        LD L,A
296
        LD B,-7 ;BC,#F920
297
        XOR A
298
_=scrtop/32
299
      DUP scrhgt ;8
300
       DUP 4
301
        POP DE
302
        LD (HL),E
303
        INC H
304
        LD (HL),D
305
        INC H
306
       EDUP
307
        ORG $-1
308
__=$
309
        ADD HL,BC
310
_=_+1
311
       IF (_&7) == 0
312
        ORG __
313
        LD B,0 ;BC=#0020
314
        ADD HL,BC
315
        LD B,-7
316
       ENDIF
317
      EDUP
318
        ORG __
319
        JP eorcopyQ
320
 
1962 alone 321
       if 0
213 alone 322
eorcopylow
323
        LD B,-7 ;BC,#F920
324
        XOR A
325
_=lowscrtop/32
326
      DUP lowscrhgt
327
       DUP 4
328
        POP DE
329
        LD (HL),E
330
        INC H
331
        LD (HL),D
332
        INC H
333
       EDUP
334
        ORG $-1
335
__=$
336
        ADD HL,BC
337
_=_+1
338
       IF (_&7) == 0
339
        ORG __
340
        LD B,0 ;BC=#0020
341
        ADD HL,BC
342
        LD B,-7
343
       ENDIF
344
      EDUP
345
        ORG __
346
        JP eorfillok
1962 alone 347
       endif
213 alone 348
 
349
DHL
350
        INC H
351
        LD A,H
352
        AND 7
353
        RET NZ
354
        LD A,L
355
        ADD A,32
356
        LD L,A
357
        RET C
358
        LD A,H
359
        SUB 8
360
        LD H,A
361
        RET
362
       endif
363
 
364
       IF atm == 0
365
DRAWWALLS
366
        LD HY,DWJP/256
367
        LD L,0
368
       ;LD DE,distbuf+3
369
        EXX
370
        LD D,scrbuf/256
371
       IF lores == 0
372
        LD C,#80
373
       ELSE
374
        LD C,#C0
375
       ENDIF
376
        LD B,scrwid
377
DW0 ;
378
        EXX
379
        LD H,distbuf/256 ;D ;+3
1917 alone 380
        LD a,(hl);D,(HL) ;ID
381
       RRCA
382
       ADD A,A ;䫠� ��ઠ�쭮�� � CY ;TODO �ᮢ��� �஢�� ⠪, �⮡� �� ����拉 ����� �� �뫨 ����ઠ���, ���� - �� ��ઠ��� (⮣�� � ��ઠ�쭮��� �� �㦭� �㤥� �࠭���?)
383
       set 7,a ;(keep CY) ������ ������� ID_DOOR (������ ����� < 128)
384
       ld d,a
1958 alone 385
 
386
       if doublescr
1974 alone 387
       push af ;SETPG ����� CY
1958 alone 388
       bit 6,d
389
       set 6,d
390
       ld a,0x10
391
       jr nz,$+4
392
       ld a,0x10+pgtmp
393
       call SETPG
1974 alone 394
       pop af
1958 alone 395
       endif
396
 
1917 alone 397
       ;cp 0xc0
398
       ;jr c,$
1982 alone 399
       ;cp 0xc0+(texturesinpg*2)
1917 alone 400
       ;jr nc,$
401
        ;ld d,0xc0+(2*9)
1912 alone 402
       ;IF debug
403
       ; LD A,D
404
       ; CP -20
405
       ; jr NC,$+4
406
       ; LD D,-20
407
       ;ENDIF 
213 alone 408
        INC H
1917 alone 409
        LD a,(hl);E,(HL) ;texx
410
       jr NC,$+3
411
       CPL ;��ઠ�쭠�
412
      AND 0x3F ;
413
      or 0x40;0x80  ;TODO 㦥 � ray?
414
      ld e,a
213 alone 415
        INC H
416
        LD A,(DE)
417
        INC D
418
       LD C,A ;+4
419
        LD A,(DE)
420
       LD B,A ;+4
421
       LD A,(BC) ;-12
422
       LD LY,A
423
        LD HX,B
424
        LD LX,C
425
        LD A,(HL) ;dist
426
        INC L
427
        EXX
428
       IF 0
429
;#06..#2B = 38
430
;#2C,#2E..#56 = 22
431
;#58,#5C..#64 = 4
432
;=64 scales
433
       CP #06 ;max=#06
434
       jr NC,$+4
435
       LD A,#06
436
       CP #67
437
       jr C,$+4
438
       LD A,#67
439
       CP #2C ;min=#28
440
       jr C,$+4
441
       AND #FE
442
       CP #58 ;min=#50
443
       jr C,$+4
444
       AND #FC
445
       ENDIF
446
        LD L,A
447
       IF optres
448
foptfast=$+1
449
        CP lowmaxscale
450
        jr NC,DW0high
451
DW0low ;
452
       LD B,C
453
       ENDIF
454
;d=�⮫���
455
;c=��⬠᪠ �⮫��
456
;ix=���� ��䨪� �⮫��
457
;l=scale
458
       ;LD A,(IX) ;(18-N)*7
459
       ;LD LY,A
460
        JP (IY)
461
       IF optres
462
DW0high ;
463
        LD A,C
464
        AND %10101010
465
        jr Z,DW0low
466
        RRCA
467
       LD B,A
468
        OR C
469
        LD C,A
470
        EXX
471
        INC L
472
        EXX
473
        JP (IY)
474
       ENDIF
475
        DISPLAY "DWJP=",$
476
      ;IF .$+(16*7+1)&256
435 alone 477
        align 256 ;DS .(-$)
213 alone 478
      ;ENDIF
479
DWJP
480
_=17
481
       DUP 17
482
        LD H,(IX+_) ;Y � ⥪����
483
        LD E,(HL) ;-Y*N
484
        LD A,(DE)
485
        XOR C ;xor!
486
        LD (DE),A
487
_=_-1
488
       EDUP
489
       IF optres
490
       ;LD A,C ;%11000000
491
       ;RRCA   ;%01100000
492
       ;AND C  ;%01000000
493
       ;JP Z,$+4
494
       ;LD C,A
495
       LD C,B
496
       ENDIF
497
        RRC C
498
       IF lores
499
        RRC C
500
       ENDIF
501
        JP NC,DW0
502
        INC D
503
       IF optres
504
        LD A,D
505
        CP scrbuf/256+scrwid
506
       ELSE
507
        DEC B
508
       ENDIF
509
        JP NZ,DW0
510
        RET
435 alone 511
       endif ;~atm
213 alone 512
 
435 alone 513
       if atm
213 alone 514
DWCLSALL
1965 alone 515
        LD D,ceilingcolourbyte;%11111111
213 alone 516
        LD HL,#4000+36
517
        CALL DWCLS
518
        LD HL,#6000+36
519
        CALL DWCLS
1965 alone 520
        LD D,floorcolourbyte;%11110110
213 alone 521
        LD HL,#4000+(108*40)+36
522
        CALL DWCLS
523
        LD HL,#6000+(108*40)+36
524
       ;CALL DWCLS
525
DWCLS
526
       LD A,(timer)
527
       PUSH HL
528
       PUSH AF
529
        LD (dwclsp),SP
530
        LD BC,40
531
       ;LD D,B ;=0
532
        LD E,D
435 alone 533
        LD A,scrhgt/2-8
213 alone 534
DWCL0   LD SP,HL
535
        DUP 16;20
536
        PUSH DE
537
        EDUP
538
        ADD HL,BC
539
        DEC A
540
        JP NZ,DWCL0
541
dwclsp=$+1
542
        LD SP,0
543
       POP AF
544
       LD HL,timer
545
       CP (HL)
546
       POP HL
547
       RET Z
548
;int detected - clear left
549
        LD BC,-34
550
        ADD HL,BC
551
       LD A,D
552
        LD DE,39
435 alone 553
        LD B,scrhgt/2-8
213 alone 554
DWCL1   LD (HL),D
555
        INC HL
556
        LD (HL),D
557
        ADD HL,DE
558
        DJNZ DWCL1
559
       LD D,A ;keep D
560
        RET
561
 
562
DRAWWALLS
563
;A=0..1 - ����� ��⯫���
564
        LD (dwloopsp),SP
565
        LD BC,40
566
        LD IX,DWLOOP0
567
        EXX
568
        LD E,A ;0..1
569
        LD H,tID/256
570
        ;LD BC,#3FF7 ;(����� ���� ���� + ���)
571
        JP DWLOOPGO
572
DWLOOP0
438 alone 573
        LD SP,SPOIL6BSTACK;-2 ;����� ������
213 alone 574
        EXX
575
        LD A,E
576
        ADD A,2 ;�⮡� �� ������� ���. ��࠭� ����� �⮫���
577
        CP scrwid*4
578
        jr NC,DWLOOPQ
579
        LD E,A
580
DWLOOPGO
581
        LD D,distbuf/256
582
        LD A,(DE) ;ID
583
       RRCA
763 alone 584
       ADD A,A ;䫠� ��ઠ�쭮�� � CY ;TODO �ᮢ��� �஢�� ⠪, �⮡� �� ����拉 ����� �� �뫨 ����ઠ���, ���� - �� ��ઠ��� (⮣�� � ��ઠ�쭮��� �� �㦭� �㤥� �࠭���?)
765 alone 585
       ;set 7,a ;������ ������� ID_DOOR (������ ����� < 128)
213 alone 586
        INC D
587
        LD L,A
588
        LD A,(HL)
434 alone 589
      ;ld (pg8000),a
1620 alone 590
      SETPG8000 ;OUT (C),A ;pg[ID]
213 alone 591
        INC L
592
        LD A,(DE) ;texx=#40..#7F
593
       jr NC,$+3
594
       CPL ;��ઠ�쭠�
435 alone 595
      AND 0x3F ;
596
      or 0x80  ;TODO 㦥 � ray?
213 alone 597
        LD HY,A
598
        INC D
599
        LD A,(HL) ;laddr[ID] = #02/#42/#82/#C2
600
        LD LY,A
435 alone 601
        LD A,(DE) ;scale = 0..0x3f
213 alone 602
        EXX
603
        LD E,(IY-2)
604
        LD D,(IY-1) ;INT-PROOF
435 alone 605
       ADD A,A ;
606
       ADD A,A ;�� ���௮��樨 ����� ��ࠡ���� scale ����� ⠡���� tlogd2sca
607
       ;NC
213 alone 608
        LD L,A
609
        LD H,tscaljps/256
610
        EXX
611
        LD A,E
435 alone 612
        rra;SRL A
213 alone 613
        SRL A ;CY=0 ��� +0, CY=1 ��� +#2000
614
        EXX
615
        LD SP,IY
616
        JP (HL)
617
DWLOOPQ
618
dwloopsp=$+1
619
        LD SP,0
620
        RET
435 alone 621
       ENDIF ;atm
213 alone 622
 
623
;=====================
624
       IF sprites
625
 
626
       IF optresspr
627
DRAWSPRITEloresspr_hires
628
        SLA E
629
        RL D
630
       LD B,H
631
        LD C,L ;x
632
        PUSH IX
633
        POP HL
634
        LD L,#FF ;texx LSB
1982 alone 635
        ;LD LX,A ;scale
213 alone 636
        EXX
637
         LD C,LX ;scale
638
        EXX
435 alone 639
 
640
;find left visible margin of sprite
213 alone 641
        INC C
642
       INC C
643
DRAWLl0 DEC C ;x
644
       DEC C
645
        jr Z,DRAWLl0Q
646
       LD A,(BC)
647
       CP LX
648
       jr NC,DRAWLlQ
649
        ADD HL,DE ;DE>0
650
       LD A,#FF ;texxright
651
        CP H
652
        JP P,DRAWLl0
653
        JR DRAWLlQ
654
DRAWLl0Q ;x=0
655
       LD A,(BC)
656
       CP LX
657
       jr NC,DRAWLlQ
658
        ADD HL,DE ;DE>0
659
        DEC C ;x
660
       DEC C
661
DRAWLlQ ;H,C out of range
435 alone 662
 
663
;scan sprite to the right and keep H=texx in stack
213 alone 664
        INC C ;x in range
665
       INC C
666
        XOR A
667
        SUB E
668
        LD E,A
669
        SBC A,D
670
        SUB E
671
        LD D,A
672
        LD HX,1;B,1 ;sprite width counter
673
DRAWRl0
674
       LD A,(BC)
675
       CP LX
676
       jr NC,DRAWRlQ
677
        ADD HL,DE ;DE<0
678
       LD A,#7F ;texxleft-1
679
        CP H ;texxleft
680
        jr NC,DRAWRlQ
681
       PUSH HL ;H in range
682
        INC HX;B
683
        INC C ;x
684
       INC C
685
        JP NZ,DRAWRl0
686
DRAWRlQ ;H,C out of range
435 alone 687
 
213 alone 688
        DEC HX;B
689
       RET Z ;width=0, stack is empty
435 alone 690
 
213 alone 691
        DEC C ;x in range
692
       DEC C
693
        LD A,C ;x
694
        RRA
695
        RRA
696
        RRA
697
        AND 31
698
        ADD A,scrbuf/256
699
        LD D,A
700
        LD A,C
701
        RRA
702
        AND 3
703
        INC A
704
        LD B,A
705
        LD A,#03
706
        RRCA
707
        RRCA
708
        DJNZ $-2
709
        LD C,A
710
        CPL
711
        LD B,A
712
;D=scrbuf/256
713
;B=running 0
714
;C=running 1
715
 ;D'=ID
716
 ;C'=scale
717
        LD A,7 ;rlca
718
        JP SDRAWPATCH ;SDRAW0
719
       ENDIF
720
 
721
DRAWSPRITE
435 alone 722
;don't spoil iy!
723
;a=scale# = 0..0x3f
724
;H=distbuf/256+2 ;ID,texx,dist
725
;l=x
726
;DE=texx step
440 alone 727
;HX=texxmid
728
 ;D'=ID (�� atm)
2002 alone 729
 
730
        LD LX,A ;scale
731
 
732
      if atm
733
        exx
734
        ld a,d
735
        add a,a
736
        jr nc,$+4
737
         ld a,16*2 ;������ ��� go2
738
        ;push af
739
        add a,a
740
        ld hl,tsprites;-4
741
        add a,l
742
        ld l,a
743
        jr nc,$+3
744
         inc h
745
        ld a,(hl)
746
;        ld (drawspritepg),a
747
;drawspritepg=$+1
748
;       ld a,(ttexpgs+NTEXPGS)
749
        ld b,ttexpgs/256
750
        ld c,a
751
        ld a,(bc)
1620 alone 752
      SETPGC000
2002 alone 753
        inc hl
754
        ld a,(hl)
755
       LD HX,a;#80+22;#C0 ;texx_center
756
       ;ld hx,22/2
757
        inc hl
758
        ld a,(hl)
759
        ld (drawspritetexxleft),a
760
        inc hl
761
        ld a,(hl)
762
        ld (drawspritetexxright),a
1958 alone 763
        exx
2002 alone 764
        ;pop af
765
      endif
766
 
767
      if !atm
768
       exx
769
       ld a,d ;ID
770
       add a,a
771
       push af
772
      if doublescr
773
      and (spritesinpg*2-1)*2
774
      else
775
      and (spritesinpg-1)*2
776
      endif
777
       add a,0xc0+(texturesinpg*2);0xea
778
       ld d,a      
779
        if doublescr
1982 alone 780
        cp 0xc0+(texturesinpg*2)+(spritesinpg*2)
1958 alone 781
        jr c,$+4
1982 alone 782
        sub spritesinpg*2 ;NC
1958 alone 783
        ld d,a
784
        exx
785
        ld a,0x10
786
        jr c,$+4
787
        ld a,0x10+pgtmp
2002 alone 788
        call SETPG      
789
        endif
1958 alone 790
        pop af
2002 alone 791
        jr nc,DRAWSPRITE_nomirror
792
         XOR A
793
         SUB E
794
         LD E,A
795
         SBC A,D
796
         SUB E
797
         LD D,A ;6912 only!
798
DRAWSPRITE_nomirror
799
      endif
435 alone 800
 
1982 alone 801
 
2002 alone 802
        if FATMONSTERS
1996 alone 803
        push hl
1982 alone 804
        XOR A
805
        SUB E
1996 alone 806
        LD l,A
1982 alone 807
        SBC A,D
1996 alone 808
        SUB l
809
        LD h,A
810
        sra d
811
        rr e
812
        sra d
813
        rr e
814
        add hl,de
815
        ex de,hl
816
        pop hl
2002 alone 817
        else
818
         XOR A
819
         SUB E
820
         LD E,A
821
         SBC A,D
822
         SUB E
823
         LD D,A
1982 alone 824
        endif
825
 
213 alone 826
       IF optresspr
2002 alone 827
        ld a,lx ;scale
213 alone 828
        CP lowmaxscale
829
        JP NC,DRAWSPRITEloresspr_hires
830
       ENDIF
831
       LD B,H
832
        LD C,L ;x
440 alone 833
         ld a,hx ;texxmid
834
         ld h,a
835
         LD L,0xFF ;texx LSB
435 alone 836
        if atm==0
213 alone 837
        EXX
838
         LD C,LX ;scale
839
        EXX
435 alone 840
        endif
841
 
440 alone 842
;find left visible margin of sprite
843
;TODO fix �ய�饭� ������� 0
844
;TODO �ᮢ��� ���� �� 業�� �� ���� ��� �ࠢ� �ࠥ� ��࠭�
438 alone 845
 
213 alone 846
        INC C
847
       IF loresspr_hires
848
       INC C
849
       ENDIF
850
DRAWL0  DEC C ;x
851
       IF loresspr_hires
852
       DEC C
853
       ENDIF
854
        jr Z,DRAWL0Q
855
       LD A,(BC)
856
       CP LX
857
       jr NC,DRAWLQ
440 alone 858
;        ADD HL,DE ;DE>0
859
;         jr c,DRAWLQ
860
;       ld a,h
861
;drawspritetexxright=$+1
862
;       cp 44/2 ;0xFF ;texxright
863
;       JP C,DRAWL0
864
        ADD HL,DE ;DE<0
1909 alone 865
         if atm
440 alone 866
         jr NC,DRAWLQtexx0
867
       ld a,h
868
drawspritetexxleft=$+1
869
       cp 0 ;texxleft
870
        jr NC,DRAWL0
1909 alone 871
         else
872
        ld a,0xff ;texxright ;TODO
873
        cp h
874
        jp p,DRAWL0
875
         endif
440 alone 876
DRAWLQtexx0
213 alone 877
        JR DRAWLQ
440 alone 878
;         or a
879
;         sbc hl,de ;������
880
;        JR DRAWLQ
213 alone 881
DRAWL0Q ;x=0
882
       LD A,(BC)
883
       CP LX
884
       jr NC,DRAWLQ
885
        ADD HL,DE ;DE>0
886
        DEC C ;x
887
       IF loresspr_hires
888
       DEC C
889
       ENDIF
890
DRAWLQ ;H,C out of range
435 alone 891
 
892
;scan sprite to the right and keep H=texx in stack
213 alone 893
        XOR A
894
        SUB E
895
        LD E,A
896
        SBC A,D
897
        SUB E
898
        LD D,A
440 alone 899
 
900
        INC C ;x in range
901
       IF loresspr_hires
902
       INC C
903
       ENDIF
904
 
213 alone 905
        LD HX,1;B,1 ;sprite width counter
1909 alone 906
        if atm
440 alone 907
       LD A,(BC)
908
       CP LX
909
       jr NC,DRAWRQ
910
       add hl,de ;��ࢮ� ᫮����� �� �஢��塞!
911
       jp DRAWR0GO
1909 alone 912
        endif
440 alone 913
 
213 alone 914
DRAWR0
915
       LD A,(BC)
916
       CP LX
917
       jr NC,DRAWRQ
440 alone 918
;        ADD HL,DE ;DE<0
919
;         jr NC,DRAWRQ
920
;       ld a,h
921
;drawspritetexxleft=$+1
922
;       cp 0 ;texxleft
923
;        jr C,DRAWRQ
924
        ADD HL,DE ;DE>0
1909 alone 925
        if atm
440 alone 926
         jr c,DRAWRQ
927
DRAWR0GO
928
       ld a,h
929
drawspritetexxright=$+1
930
       cp 44/2 ;0xFF ;texxright
1909 alone 931
        else
932
        ld a,0x7f ;texxleft-1
933
        cp h
934
        endif
440 alone 935
       JP NC,DRAWRQ
213 alone 936
       PUSH HL ;H in range
937
        INC HX;B
938
        INC C ;x
939
       IF loresspr_hires
940
       INC C
941
       ENDIF
942
       IF lores
943
        JP P,DRAWR0
944
       ELSE
945
        JP NZ,DRAWR0
946
       ENDIF
947
DRAWRQ ;H,C out of range
435 alone 948
 
213 alone 949
        DEC HX;B
950
       RET Z ;width=0, stack is empty
435 alone 951
 
213 alone 952
        DEC C ;x in range
953
       IF loresspr_hires
954
       DEC C
955
       ENDIF
435 alone 956
 
957
       if atm
958
;de=f(scale#,x)
959
;scr=f(x)
960
        push bc
961
;lx=scale# = 0..63
437 alone 962
 
963
        LD hl,tscales_rev
964
        ld a,lx
965
        add a,a
966
        add a,l
967
        ld l,a
968
        jr nc,$+3
969
        inc h
970
        LD C,(HL)
971
        INC HL
972
        LD B,(HL) ;BC=scale
973
        ld (drawsprscalebc),bc ;蠣 �� ⥪����(+7.8) = 64/hgt = 1/scale
974
 
435 alone 975
        LD hl,tscales
976
        ld a,lx
977
        add a,a
978
        add a,l
979
        ld l,a
980
        jr nc,$+3
981
        inc h
982
        LD C,(HL)
983
        INC HL
437 alone 984
        LD B,(HL) ;BC=scale(+7.8) = 1/4(hgt=16) ... 4.0(hgt=256) ;hgt=64*scale
435 alone 985
;bc=scale
986
        call scale2ytop
987
;out: de=Y, lx=y
988
 
437 alone 989
        if 1==0
435 alone 990
        srl b
991
        rr c
992
        srl b
993
        rr c
994
        ld h,d
995
        ld l,e
996
        add hl,bc ;ylow
997
        ld a,h
998
        or a
999
        ld a,l
1000
        jr nz,prsprtoolow
1001
        cp scrhgt
1002
        jr c,$+4
1003
prsprtoolow
1004
        ld a,scrhgt
437 alone 1005
        endif
435 alone 1006
 
1007
        inc d
1008
        dec d
1009
        jr Z,drawsprnottoohigh
1010
        ld de,0
1011
drawsprnottoohigh
1012
 
437 alone 1013
        ;sub e
1014
        ;ld (drawsprscale),a ;ॠ�쭮� �᫮ �뢮����� ��ப (TODO ᤥ���� ��ଠ�쭮 � �㬮�)
435 alone 1015
 
1016
        ;LD A,D
1017
        ;OR A
1018
        ;jr NZ,drawsprTOP
1019
        ;LD A,E
1020
        ;CP Ytop
1021
        ;jr C,drawsprTOP
1022
        CALL YtoADDR
1023
;        JR drawsprnTOP
1024
;drawsprTOP
1025
;        LD DE,scrtop
1026
;drawsprnTOP
1027
 
1028
        pop bc
1029
        LD A,C ;xright!
1030
        ;RRA 
1031
        RRA
1032
        rra
1033
        jr nc,$+4
798 alone 1034
         set 5,d
435 alone 1035
        and 31
1036
        add a,e
1037
        ld e,a
1038
        jr nc,$+3
798 alone 1039
         inc d
435 alone 1040
 
798 alone 1041
        ld a,(getuser_scr_high_patch)
1042
        ld (SDRAW0_scrpgaddr),a
1043
        ld (SDRAW0_scrpgaddr2),a
1044
        ld (SDRAW0_scrpgaddr3),a
1045
        ld hl,(getuser_scr_low_patch)
1046
        xor l
1047
        ld (SDRAW0_scrpgaddrxor),a
1048
 
1049
        ;call getuser_scr_low
1050
        ;ld (SDRAW0_scrpg),a ;TODO from x
1051
        ;ld (SDRAW0_low),a
1052
        ;ld h,a
1053
        ;call getuser_scr_high
1054
        ;xor h
1055
        ;ld (SDRAW0_high_xor_low),a
435 alone 1056
 
1057
       else
213 alone 1058
        LD A,C ;x
1059
        RRA
1060
        RRA
1061
       IF lores == 0
1062
        RRA
1063
       ENDIF
1064
        AND 31
1065
        ADD A,scrbuf/256
1066
        LD D,A
1067
        LD A,C
1068
       IF loresspr_hires
1069
        RRA
1070
       ENDIF
1071
       IF loresspr
1072
        AND 3
1073
       ELSE
1074
        AND 7
1075
       ENDIF
1076
        INC A
1077
        LD B,A
1078
       IF loresspr == 0
1079
        LD A,#01
1080
       ELSE
1081
        LD A,#03
1082
       ENDIF
1083
DRAWRR0 RRCA
1084
       IF loresspr
1085
        RRCA
1086
       ENDIF
1087
        DJNZ DRAWRR0
1088
        LD C,A
1089
        CPL
1090
        LD B,A
435 alone 1091
;D=scrbuf/256, B=running 0, C=running 1 (~atm)
1092
       endif ;~atm
1093
 
213 alone 1094
 ;D'=ID
435 alone 1095
 ;C'=scale#
1096
       IF optresspr ;~atm
213 alone 1097
        XOR A
435 alone 1098
 
213 alone 1099
SDRAWPATCH
1100
        LD (sdrawrlca),A
1101
       ENDIF
435 alone 1102
 
1103
       if atm==0
1104
SDRAW0
1105
;EOR-fill the column, then draw sprite column (pop hl from the stack, H=texx)
1106
;D=scrbuf/256, B=running 0, C=running 1 (~atm)
213 alone 1107
        LD H,D
435 alone 1108
        LD L,scrbufflag&0xff
213 alone 1109
       BIT 7,(HL)
1110
       JP NZ,SDRAWnX ;already filled
1111
        LD (HL),H ;>=128: eorcopy
1112
       EXX
1113
       LD A,C
1114
       EXX
1115
       CP lowmaxscale
1116
       jr NC,SDRAWXhigh
435 alone 1117
        LD L,lowscrbuf&0xff
213 alone 1118
        LD E,lowscrhgt/2-1
1119
        XOR A
1120
SDRAWXlow1 ;
1121
       DUP 16
1122
        XOR (HL)
1123
        LD (HL),A
1124
        INC L
1125
       EDUP
1126
        DEC E
1127
        JP P,SDRAWXlow1
1962 alone 1128
        LD A,+(scrhgt-lowscrhgt)/2
213 alone 1129
SDRAWXlow2 ;
1130
       DUP 8
1131
        LD (HL),E ;-1
1132
        INC L
1133
       EDUP
1134
        DEC A
1135
        JP NZ,SDRAWXlow2
1136
        JP SDRAWnX
1137
SDRAWXhigh
435 alone 1138
        LD L,scrbuf&0xff
213 alone 1139
        LD E,scrhgt/2
1140
        XOR A
1141
SDRAWX ;
1142
       DUP 16
1143
        XOR (HL)
1144
        LD (HL),A
1145
        INC L
1146
       EDUP
1147
        DEC E
1148
        JP NZ,SDRAWX
1149
SDRAWnX ;
435 alone 1150
 
213 alone 1151
SDRAW1 ;pixel column
1152
        EXX
1153
;D=ID
435 alone 1154
;C=scale#
213 alone 1155
       POP HL
1156
         LD L,H ;texx
1157
       IF scale64
1158
       SRL L
1159
       ENDIF
1160
        LD H,D
1161
        LD A,(HL)
1162
        INC H
1163
        LD H,(HL)
1164
        LD L,A ;HL=spr
1165
;D'=scrbuf/256
1166
;B'=running 0
1167
;C'=running 1
1168
        JP SCALESPRITEGO
1169
 
435 alone 1170
       else ;~atm
1171
;��㥬 �ࠢ� ������
1172
SDRAW0
798 alone 1173
SDRAW0_scrpgaddr2=$+1
1174
        ld hl,user_scr0_high ;ok
1175
        ld a,l
1176
        jr SDRAW0go
1177
SDRAW0loop
435 alone 1178
;de=screen
1179
;D'=ID
1180
;C'=scale#
798 alone 1181
SDRAW0_scrpgaddr=$+1
1182
        ld hl,user_scr0_high ;ok
1183
        ld a,l
1184
SDRAW0_scrpgaddr3=$+1
1185
        cp 0
1186
        jr nz,SDRAW0go
1187
        bit 5,d
1188
        res 5,d
1189
        jr nz,SDRAW0go
1190
        set 5,d
1191
        dec de
1192
SDRAW0go
1193
SDRAW0_scrpgaddrxor=$+1
1194
        xor 0
1195
        ld (SDRAW0_scrpgaddr),a
1196
        ld a,(hl)
1197
 
435 alone 1198
       POP HL
1620 alone 1199
        SETPG4000
435 alone 1200
;4000: screen
438 alone 1201
;c000: texture (㦥 ���⠢���� � ��砫� DRAWSPRITE)
448 alone 1202
;8000: scaler (TODO)
798 alone 1203
       ld a,h ;texx=#00..#FF
435 alone 1204
 
437 alone 1205
        push de
438 alone 1206
        exx
1207
        pop hl
1208
        push hl
1209
        ld bc,40
1210
        ld e,IMPOSSIBLECOLOR
1211
        exx
437 alone 1212
 
438 alone 1213
        ld hl,0xc000
1214
        ld e,a
437 alone 1215
drawsprscalebc=$+1
798 alone 1216
        ld bc,0        
435 alone 1217
drawspr00
438 alone 1218
        ld d,h
437 alone 1219
        ld a,(de)
438 alone 1220
        exx
1221
        cp e;IMPOSSIBLECOLOR
437 alone 1222
        jr z,$+3
1223
         ld (hl),a
438 alone 1224
        add hl,bc
1225
        exx
1226
        add hl,bc
437 alone 1227
        jp nc,drawspr00 ;/m
435 alone 1228
 
437 alone 1229
        pop de
435 alone 1230
 
1231
        DEC HX;B ;todo E'?
798 alone 1232
        JP nz,SDRAW0loop
1233
        ret
435 alone 1234
       endif ;atm
1235
 
1236
        if atm == 0
1237
 
213 alone 1238
;�뢮� �ࠩ⮢: y,yEND1,yEND0
1239
;y=yEND1: �ய�� �ᮢ���� ������
1240
 ;0 ����� ⠪�� ��������� �� ����/��� �஬�� � ����讬 ����⠡�
1241
;y=#C0, yEND1=#FF: ����� ⥪����� - ��� ᯥ樠���� Y,
1242
 ;����� � ⠡��� ᮮ⢥������ ����⠭�� �� �� ����⠡�
1243
  ;����� ����, ����⠭��� �� ������-� ����⠡�?
1244
;yEND0=yEND1: �ய�� �ᮢ���� �㫥�
1245
 ;0 ����� ⠪�� ��������� �� ����/��� �஬�� � ����讬 ����⠡�
1246
maxlinehgt=59
435 alone 1247
        align 256 ;DS .(-$)
213 alone 1248
 
1249
;��㣫� ����: �ய�� �ᮢ���� �㫥�
1250
        JP EXXSCALESPRITE1
435 alone 1251
        DS 0xff&(-(4*maxlinehgt)-$)
213 alone 1252
SCALESPRITE0DRAW
1253
;�ᮢ���� �㫥� (AND B)
1254
       DUP maxlinehgt ;MAX=62(59 � SCALESPRITELOOP)
1255
                      ;����訥 ������ ������ �㡨�� �� ���
1256
        LD A,(DE)
1257
        AND B
1258
        LD (DE),A
1259
        DEC E
1260
       EDUP
1261
EXXSCALESPRITE1
1262
;��㣫� ����
1263
        DISPLAY $,"=#XX00"
1962 alone 1264
        EXX
213 alone 1265
        INC L
1266
SCALESPRITEGO
1267
;HL=spr
1268
;D=ID
1269
;C=scale
1270
;D'=scrbuf/256
1271
;(HL'=tempjp)
1272
;B'=running 0
1273
;C'=running 1
1274
        LD B,(HL) ;Y � ⥪���� ��� #C0(�⠥� 0)
1275
        INC L
1962 alone 1276
        LD A,(BC) ;Y*N (0 � ���� ⥪�����)
213 alone 1277
        EXX
1278
        LD E,A
1279
;SCALESPRITE1GO
1280
        EXX
1281
        LD B,(HL) ;Y2 � ⥪���� (<=Y) ��� #FF(�⠥� 1)
1282
        INC L
1962 alone 1283
        LD A,(BC) ;Y2*N (1 � ���� ⥪�����)
213 alone 1284
        EXX
1285
        SUB E
1286
        ADD A,A
1287
        ADD A,A
1982 alone 1288
        LD L,A ;(=4 � ���� ⥪�����)
213 alone 1289
        LD H,SCALESPRITE1DRAW/256
1290
        JP (HL) ;��㥬 ������� ��� ��室��
435 alone 1291
        align 256 ;DS .(-$)
213 alone 1292
;��㣫� ����: �ய�� �ᮢ���� ������
1293
        JP EXXSCALESPRITE0
1294
        NOP
1982 alone 1295
;ᯥ栤�� 4: ����� ⥪�����
213 alone 1296
;��� � �������: #C0(�⠥� 0),#FF(�⠥� 1)
1297
SDRAW0SKIPQ
1298
        DEC HX;B ;todo E'?
1299
        RET Z
1300
        LD A,C
1301
        RLCA
1302
       IF loresspr|optresspr
1303
sdrawrlca=$
1304
        RLCA
1305
       ENDIF
1306
        LD C,A
1307
        CPL
1308
        LD B,A
1309
        JP NC,SDRAW1
1310
        DEC D
1311
        JP SDRAW0
1312
       DISPLAY $
435 alone 1313
        DS 0xff&(-(4*maxlinehgt)-$)
213 alone 1314
       DISPLAY "=",$
1315
SCALESPRITE1DRAW
1316
;�ᮢ���� ������ (OR C)
1317
       DUP maxlinehgt ;MAX=63
1318
                      ;����訥 ������ ������ �㡨�� �� ���
1319
        LD A,(DE)
1320
        OR C
1321
        LD (DE),A
1322
        DEC E
1323
       EDUP
1324
       ;ORG $-1
1325
EXXSCALESPRITE0
1326
        EXX
1327
;��㣫� ����
1328
        LD B,(HL) ;Y3 � ⥪���� (<=Y2)
1329
        LD A,(BC) ;Y3*N
1330
        EXX
1331
        SUB E
1332
        ADD A,A
1333
        ADD A,A
1334
        LD L,A
1335
        LD H,SCALESPRITE0DRAW/256
1336
        JP (HL) ;��㥬 �㫨
1337
 
1338
       IF 0
1339
testsprite
1340
        DB #F0,#EF,#E7
1341
        DB #D2,#D0,#C4
1342
        DB #C0,#FF
1343
       ENDIF
1344
 
435 alone 1345
       endif ;~atm
1346
 
213 alone 1347
       ENDIF ;sprites