Subversion Repositories NedoOS

Rev

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

Rev Author Line No. Line
213 alone 1
       IF corr_coord
2
CORR_COORD
3
       LD A,L
4
       OR A
5
       jr NZ,$+3
6
       INC L
7
       INC A
8
       jr NZ,$+3
9
       DEC L
10
       LD A,H
11
       OR A
12
       jr NZ,$+3
13
       INC H
14
       INC A
15
       RET NZ
16
       DEC H
17
        RET
18
       ENDIF
19
 
775 alone 20
RAYPREPXY
21
;TODO  न   뢠!!!
2222 alone 22
       IF !atm && optfast
213 alone 23
        LD HL,(IMcurDX)
24
        LD A,H
25
        OR L
26
        LD HL,(IMcurDY)
27
        OR H
28
        OR L
29
        LD A,lowmaxscale
30
        jr Z,$+4
31
        LD A,0;-1
32
        LD (foptfast),A
33
       ENDIF
34
IMcurXx=$+1
35
        LD HL,#0F80 ;#0580
2222 alone 36
IMcurYy=$+1
37
        LD de,#0180+(map&#FF00) ;#A580
38
        LD A,(IMavision+1)
39
RAYPREPXY_hldea
40
        ex af,af' ;'
213 alone 41
       IF corr_coord
42
        CALL CORR_COORD
43
       ENDIF
44
        LD (curXx),HL
2222 alone 45
        ex de,hl
213 alone 46
       IF corr_coord
47
        CALL CORR_COORD
48
       ENDIF
49
        LD (curYy),HL
2222 alone 50
        ex af,af' ;'
213 alone 51
       LD (curangle),A
52
        SUB 32
53
        LD L,A
54
        LD H,0
55
        ADD HL,HL
56
        ADD HL,HL
57
        LD A,L
58
        LD (avision4L),A
59
        LD A,H
60
        LD (avision4H),A
61
        LD HL,(cury-1)
62
        LD A,(curx)
63
        LD L,A
64
        LD (cur00yx),HL
65
        LD (cur01yx),HL
66
      ;LD A,L ;᭮ ࠢ
67
       CPL ;1-᭮ ࠢ
68
       LD L,A
69
        LD (cur10yx),HL
70
        LD (cur11yx),HL
71
       CPL ;᭮ ࠢ
2222 alone 72
        LD L,H
73
        ld H,A
213 alone 74
        LD (cur00xy),HL
75
        LD (cur01xy),HL
76
       LD A,L ;1-᭮ ࠢ
77
       CPL ;᭮ ࠢ
78
       LD L,A
79
        LD (cur10xy),HL
80
        LD (cur11xy),HL
81
        LD HL,(curX)
82
        LD A,(curY)
83
        LD H,A
84
       ;LD (curYX),HL
85
        LD (ray00yx_YX),HL
86
        LD (ray01yx_YX),HL
87
        LD (ray10yx_YX),HL
88
        LD (ray11yx_YX),HL
89
        LD (ray00xy_YX),HL
90
        LD (ray01xy_YX),HL
91
        LD (ray10xy_YX),HL
92
        LD (ray11xy_YX),HL
93
        SET mapdifbit,L
94
        LD (ray00xy_YX2),HL
95
        LD (ray01xy_YX2),HL
96
        LD (ray10xy_YX2),HL
97
        LD (ray11xy_YX2),HL
775 alone 98
        ret
99
SCAN
100
        call RAYPREPXY
213 alone 101
 
765 alone 102
        ;TODO ⮡ 㧭,   뢠,   ⬥  ᠬ  (  ஭)
103
 
213 alone 104
      IF interpolate == 0
105
 
106
       IF lores
107
        LD L,0;2*(32-scrwid)
775 alone 108
        LD HY,SCRWIDPIX;scrwid*4
213 alone 109
       ELSE
110
        LD L,0;4*(32-scrwid)
775 alone 111
        LD HY,SCRWIDPIX;scrwid*8
213 alone 112
       ENDIF
113
RAY0
2222 alone 114
        ;LD A,L
115
        ;LD (cura),A
116
        CALL RAYCASTl
213 alone 117
       LD HL,(cura)
118
        LD H,distbuf/256+2
775 alone 119
        LD (HL),C ;dist (scale#)
213 alone 120
        DEC H
121
        LD (HL),B ;texx
122
        DEC H
123
        RRCA ;CY=0
1912 alone 124
        LD A,(DE) ;ID(YX)
1917 alone 125
         ;ld a,0xc0
213 alone 126
        LD (HL),A ;ID
127
        INC L
128
        DEC HY
129
        JP NZ,RAY0
130
 
131
      ELSE ;interpolate
132
main_step=interpolate;16
133
         ;oldscan=RAYCAST(0)
134
        XOR A
135
        LD L,A
2222 alone 136
        ;LD (cura),A
137
        CALL RAYCASTl
213 alone 138
        EXX
139
         ;main_a=main_step-1
140
        LD L,main_step-1
775 alone 141
       ;IF lores
142
       ; LD HY,scrwid*4/main_step
143
       ;ELSE 
144
       ; LD HY,scrwid*8/main_step
145
       ;ENDIF 
146
       ld hy,SCRWIDPIX/main_step
213 alone 147
         ;repeat {
148
;L=main_a
149
;BCDE'=oldscan
150
;BCDE=newscan
151
RAY0
152
         ;newscan=RAYCAST(main_a)
2222 alone 153
        ;LD A,L
154
        ;LD (cura),A
155
        CALL RAYCASTl
213 alone 156
       LD HL,(cura)
157
         ;INTERPOLATE_SUB(main_a, main_step, oldscan, newscan)
158
        LD A,main_step
159
        LD H,distbuf/256+2
775 alone 160
        LD (HL),C ;dist (scale#)
213 alone 161
        DEC H
162
        LD (HL),B ;texx
163
        DEC H
164
        RRCA ;CY=0
165
        CALL INTERPOLATE_SUB
1912 alone 166
        LD A,(DE) ;ID(YX)
1917 alone 167
         ;ld a,0xc0
213 alone 168
        LD (HL),A ;ID
169
         ;oldscan=newscan
170
        LD A,L
171
        EXX
172
         ;main_a+=main_step
173
        ADD A,main_step
174
        LD L,A
175
         ;} until(main_a>255)
176
        DEC HY
177
        JP NZ,RAY0
178
      ENDIF ;interpolate
179
        RET
180
 
181
;((b+f)/2)^2-b^2/4-f^2/4
182
;a=e
183
       MACRO MULPOS
184
        LD H,tsqr2/256
185
        ADD A,C
186
        RRA
187
        LD L,A
188
        LD A,(HL)
189
        INC H
190
        LD L,C
191
        SUB (HL)
192
        LD L,E
193
        SUB (HL)
194
       ENDM
195
 
196
       MACRO DIVPOS
197
        SRL C
198
       DUP 7
199
        ADD A,C
200
        jr NC,$+3
201
        SUB C
202
        RL B
203
        ADD A,A
204
       EDUP
205
        ADD A,C
206
        LD A,B
207
        RLA
208
       ENDM
209
 
210
       MACRO DIVNEG
211
        SRL C
212
       DUP 7
213
        SUB C
214
        jr NC,$+3
215
        ADD A,C
216
        RL B
217
        ADD A,A
218
       EDUP
219
        SUB C
220
        LD A,B
221
        RLA
222
       ENDM
223
 
224
 
225
;Y  
2222 alone 226
RAYCASTl
227
        ld a,l
228
        ld (cura),a
213 alone 229
;L=(cura)=㣮  ࠭
230
; ABCDEHLIX
772 alone 231
        ld a,(doortimer)
766 alone 232
        ld ly,a
213 alone 233
        LD H,tda/256
234
        LD A,(HL)
235
avision4L=$+1
236
        ADD A,0
237
        LD (rayrealangle),A
238
        LD L,A
239
avision4H=$+1
240
        ADC A,0
241
        SUB L ;a1..0 = 0..3 ~ sector 1..4
242
       ;LD H,tctg/256 ;-pi/4..+pi/4
243
       INC H
244
        LD C,(HL) ;ystep or xstep
245
        LD HX,-1 ;IX=dist*cos
246
        RRA
247
        jr NC,ray13
248
        RRA
249
        JP NC,ray2
250
        JP ray4
251
ray13   RRA
252
        JP NC,ray1
253
        JP ray3
254
 
255
        macro INCR num ;0..5 = bcdehl
763 alone 256
        db 0x04+(8*(num))
213 alone 257
        endm
258
 
259
        macro DECR num ;0..5 = bcdehl
763 alone 260
        db 0x05+(8*(num))
213 alone 261
        endm
262
 
763 alone 263
;RAY 1,1,H,D,y,x
264
       MACRO RAY mainplus,secplus,maindirhlreg,maindirdereg,maindir,secdir
213 alone 265
;mainplus=\0 ;᭮ ࠢ ⥫쭮
266
;secplus=\1 ;筮 ࠢ ⥫쭮
763 alone 267
;\2=᭮ ࠢ  hl (YX)
268
;\4=᭮ ࠢ  de (yx)
269
;\6=᭮ ࠢ (0=x, 1=y)
270
;\7=筮 ࠢ (0=x, 1=y)
271
;c= 蠣
213 alone 272
        LD A,E ;᭮ ࠢ
273
        LD LX,A ;IX=dist*cos
763 alone 274
        MULPOS ;a = a*c
275
      IF secplus ;筮 ࠢ ⥫쭮
213 alone 276
        ADD A,D ;筮 ࠢ
763 alone 277
        LD B,A ;texx
213 alone 278
ray0176_YX=$+1
763 alone 279
        LD HL,0 ;hl = ᭮ ⥭
213 alone 280
       IF maindir != 0 ;"\6\6"-"xx"
281
ray0176_YX2=$+1
763 alone 282
        LD DE,0 ;set mapdifbit ;.. y, 筮 x
213 alone 283
       ELSE
763 alone 284
        LD D,H ;.. x, 筮 y
213 alone 285
        ld E,L
763 alone 286
       ENDIF ;de = 筠 ⥭
287
        jr NC,2f;raynshort\0\1\7\6 ;筮  祭  ..
288
        INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
213 alone 289
        LD A,(DE)
766 alone 290
         add a,a
291
         cp ID_DOOR*2;128+(22*2)
763 alone 292
         jr z,9f
766 alone 293
         ld a,(de)
213 alone 294
        RLA
764 alone 295
        jp C,1f;raysec\0\1\7\6 ;室  筮 ⥭
763 alone 296
9
297
        INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
213 alone 298
2;raynshort\0\1\7\6
299
       IF maindir != 1 ;"\6\6"-"yy"
300
        SET mapdifbit,L
301
       ENDIF
763 alone 302
      ELSE ;筮 ࠢ ⥫쭮
213 alone 303
        LD L,A
304
        LD A,D ;筮 ࠢ
305
        SUB L
763 alone 306
        LD B,A ;texx
213 alone 307
ray0176_YX=$+1
763 alone 308
        LD HL,0 ;hl = ᭮ ⥭
213 alone 309
       IF maindir != 0 ;"\6\6"-"xx"
310
ray0176_YX2=$+1
763 alone 311
        LD DE,0 ;set mapdifbit ;.. y, 筮 x
213 alone 312
       ELSE
763 alone 313
        LD D,H ;.. x, 筮 y
213 alone 314
        ld E,L
763 alone 315
       ENDIF ;de = 筠 ⥭
316
        jr NC,2f;raynshort\0\1\7\6 ;筮  祭  ..
213 alone 317
        LD A,(DE)
766 alone 318
         add a,a
319
         cp ID_DOOR*2;128+(22*2)
763 alone 320
         jr z,9f
766 alone 321
         ld a,(de)
213 alone 322
        RLA
764 alone 323
        jp C,1f;raysec\0\1\7\6 ;室  筮 ⥭
763 alone 324
9
325
;த  ᭮ ࠢ
326
        DECR maindirhlreg^1 ;secdirhlreg
327
        DECR maindirdereg^1 ;secdirdereg
213 alone 328
2;raynshort\0\1\7\6
329
       IF maindir != 1 ;"\6\6"-"yy"
330
        SET mapdifbit,L
331
       ENDIF
763 alone 332
      ENDIF
333
; (⪨) 蠣 祭, ⥯  묨 蠣  横
213 alone 334
3;raynsec=$;\0\1\7\6
335
        INC HX
336
       IF mainplus ;᭮ ࠢ ⥫쭮
337
        INCR maindirhlreg;INC \2 ;h/l
338
       ENDIF
339
        LD A,(HL)
766 alone 340
         add a,a
341
         cp ID_DOOR*2;128+(22*2)
342
         jp z,4f;doorhlq ; 
343
         ld a,(hl)
213 alone 344
        RLA
763 alone 345
        JP C,rayhlq ;b=texx ;室  ᭮ ⥭
764 alone 346
13
213 alone 347
       IF mainplus ;᭮ ࠢ ⥫쭮
348
        INCR maindirdereg;INC \4 ;d/e
349
       ELSE
350
        DECR maindirhlreg
351
        DECR maindirdereg
352
       ENDIF
763 alone 353
        LD A,B ;texx
213 alone 354
       IF secplus ;筮 ࠢ ⥫쭮
763 alone 355
        ADD A,C ; 蠣
213 alone 356
       ELSE
763 alone 357
        SUB C ; 蠣
213 alone 358
       ENDIF
763 alone 359
        LD B,A ;texx
360
        jr NC,3b;raynsec;\0\1\7\6 ;筮  祭  ..
764 alone 361
12
213 alone 362
       IF secplus ;筮 ࠢ ⥫쭮
763 alone 363
        INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
213 alone 364
       ENDIF
365
        LD A,(DE)
766 alone 366
         add a,a
367
         cp ID_DOOR*2;128+(22*2)
764 alone 368
         jr z,5f
766 alone 369
         ld a,(de)
213 alone 370
        RLA
764 alone 371
        jp C,1f;raysec\0\1\7\6 ;室  筮 ⥭
763 alone 372
9
213 alone 373
       IF secplus ;筮 ࠢ ⥫쭮
763 alone 374
        INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
213 alone 375
       ELSE        ;筮 ࠢ ⥫쭮
763 alone 376
        DECR maindirhlreg^1 ;secdirhlreg
377
        DECR maindirdereg^1 ;secdirdereg
213 alone 378
       ENDIF
379
        JP 3b;raynsec;\0\1\7\6
380
 
764 alone 381
7 ;  㡠 , ᫨   ( ᫥饩 ⥭  !!!)
382
        LD A,B ;texx
383
       IF secplus ;筮 ࠢ ⥫쭮
384
        ADD A,C ; 蠣
385
       ELSE
386
        SUB C ; 蠣
387
       ENDIF
388
        LD B,A ;texx
389
        jr C,12b;raynsec;\0\1\7\6 ;筮  祭  ..
390
;3;raynsec=$;\0\1\7\6
391
        INC HX
392
       IF mainplus ;᭮ ࠢ ⥫쭮
393
        INCR maindirhlreg;INC \2 ;h/l
394
       ENDIF
395
        jr 13b ;⠥,  ⥭ । , த  筮
396
 
763 alone 397
;   筮 蠣
398
5
766 alone 399
        ld a,(de)
400
        rla
401
        jr nc,$+5 ; 
402
        ld ly,0
763 alone 403
       IF secplus ;筮 ࠢ ⥫쭮
404
        INCR maindirhlreg^1 ;secdirhlreg;INC \3 ;l/h
405
       ELSE        ;筮 ࠢ ⥫쭮
406
        DECR maindirhlreg^1 ;secdirhlreg
407
        DECR maindirdereg^1 ;secdirdereg
408
       ENDIF
409
        INC HX
764 alone 410
        bit 7,B ;texx
763 alone 411
       IF secplus ;筮 ࠢ ⥫쭮
764 alone 412
        jp z,rayhlq ; ᭮ ⥭  
763 alone 413
       ELSE
764 alone 414
        jp nz,rayhlq ; ᭮ ⥭  
763 alone 415
       ENDIF
764 alone 416
        ;ld b,10 ;ᯫ譮 㡮 (0=ᯫ譮 )
417
        ;jp z,rayhlq
418
 
419
       IF secplus ;筮 ࠢ ⥫쭮
420
        INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
421
       ENDIF
422
        ;jp rayhlq ; , 室  ᭮ ⥭
423
         ;dec hx
424
         ld a,b ;texx
425
         add a,128
426
         ;ld b,a
427
        ;jr 1f ;jr C,8f;raysec\0\1\7\6 ;室  筮 ⥭
428
        ;LD A,B
429
       IF secplus ;筮 ࠢ ⥫쭮
430
        SUB C
431
       else
432
        ADD A,C
433
       endif
434
;a=texx  
1985 alone 435
        ex de,hl;EXD 
764 alone 436
        ;ex de,hl
437
        ;jp rayhlq ; , 室  ᭮ ⥭
438
        push bc
439
       IF secplus ;筮 ࠢ ⥫쭮
440
        DIVPOS ;texx(a)/step(c),  b,c
441
       ELSE
442
        DIVNEG ;texx(a)/step(c),  b,c
443
       ENDIF
444
        pop bc
445
       IF mainplus ;᭮ ࠢ ⥫쭮
446
        CPL
765 alone 447
         ;push hl
448
         ;ld hl,timer
449
         add a,ly;(hl)
764 alone 450
         jr c,6f ;b=texx, 室  . ⥭ ( )
451
        LD B,A ;b=texx
765 alone 452
        sub ly;(hl)
453
         ;pop hl
764 alone 454
       ELSE
765 alone 455
         ;push hl
456
         ;ld hl,timer
457
         add a,ly;(hl)
764 alone 458
         jr c,6f ;室  . ⥭ ( )
459
        LD B,A ;b=texx
765 alone 460
        sub ly;(hl)
764 alone 461
        CPL
765 alone 462
         ;pop hl
764 alone 463
       ENDIF
464
         dec hx
465
        JP raydeq ;c,de  
466
6 ;室  . ⥭ ( )
765 alone 467
        ;pop hl
764 alone 468
        ex de,hl
469
        jp rayhlq ;b=texx
470
 
763 alone 471
;   ᭮ 蠣
472
4
766 alone 473
        bit 7,(HL)
474
        jr z,$+5 ; 
475
        ld ly,0
765 alone 476
;஢,   , ⮣ 室  13b (.. । )
477
       IF mainplus ;᭮ ࠢ ⥫쭮
478
        DECR maindirhlreg;INC \4 ;d/e
479
       ELSE
480
        INCR maindirhlreg
481
       ENDIF
482
        ld a,(hl)
483
       IF mainplus ;᭮ ࠢ ⥫쭮
484
        INCR maindirhlreg;INC \4 ;d/e
485
       ELSE
486
        DECR maindirhlreg
487
       ENDIF
766 alone 488
         add a,a
489
         cp ID_DOOR*2;128+(22*2)
490
        jp z,13b ; , , । 
765 alone 491
;
763 alone 492
        srl c ; 蠣
493
       IF mainplus ;᭮ ࠢ ⥫쭮
494
        INCR maindirdereg;INC \4 ;d/e
495
       ELSE
496
        DECR maindirhlreg
497
        DECR maindirdereg
498
       ENDIF
499
        LD A,B ;texx
500
       IF secplus ;筮 ࠢ ⥫쭮
501
        ADD A,C ; 蠣
764 alone 502
        LD B,A ;texx
503
        SUB C ; 蠣
763 alone 504
       ELSE
505
        SUB C ; 蠣
764 alone 506
        LD B,A ;texx
507
        ADD A,C ; 蠣
763 alone 508
       ENDIF
764 alone 509
        jr c,2f
510
        ex af,af' ;'
765 alone 511
        ld a,ly;(timer)
764 alone 512
        add a,b
513
        ld b,a
514
        jr nc,11f ;  ᭮ ࠢ
515
        ex af,af' ;'
516
        ld b,a ;texx  
517
        sla c ; 蠣  
518
        jp 7b ; 
519
11      
520
        jp doorhlq;3b;raynsec;\0\1\7\6 ;筮  祭  ..
521
2;   ᭮ 蠣 - 室  筮 ⥭
763 alone 522
       IF secplus ;筮 ࠢ ⥫쭮
523
        INCR maindirdereg^1 ;secdirdereg;INC \5 ;e/d
524
       ENDIF
764 alone 525
 
763 alone 526
;筠 ⥭  蠣 
527
        sla c ; 蠣  
764 alone 528
        jr 8f
763 alone 529
 
530
;筠 ⥭
213 alone 531
1;raysec\0\1\7\6
532
        LD A,B
533
       IF secplus ;筮 ࠢ ⥫쭮
534
        SUB C
764 alone 535
       else
536
        ADD A,C
537
       endif
538
8
539
;a=texx  
1985 alone 540
        ex de,hl;EXD 
764 alone 541
       IF secplus ;筮 ࠢ ⥫쭮
542
        DIVPOS ;texx(a)/step(c)
213 alone 543
       ELSE
764 alone 544
        DIVNEG ;texx(a)/step(c)
213 alone 545
       ENDIF
546
       IF mainplus ;᭮ ࠢ ⥫쭮
547
        CPL
548
        LD B,A ;b=texx
549
       ELSE
550
        LD B,A ;b=texx
551
        CPL
552
       ENDIF
553
        JP raydeq
554
       ENDM
555
 
556
;mainplus=\0 ;᭮ ࠢ ⥫쭮
557
;secplus=\1 ;筮 ࠢ ⥫쭮
558
;\2=᭮ ࠢ  hl = 4..5
559
;\4=᭮ ࠢ  de = 2..3
560
;\6=᭮ ࠢ
561
;\7=筮 ࠢ
763 alone 562
;c = ystep or xstep (蠣  筮 ࠢ) ᥣ ⥫
563
;HX=-1 ;IX=dist*cos
213 alone 564
;ᥩ l=angle
565
ray1
566
        BIT 7,L
567
        JP NZ,ray1b
763 alone 568
        ;RAY 1,1,L,E,x,y ;1a
213 alone 569
cur11yx=$+1
570
        LD DE,0
763 alone 571
        RAY 1,1,5,3,0,1;x,y ;1a
213 alone 572
;cur11yx=cur0176
573
ray11yx_YX=ray0176_YX
574
;ray11yx_YX2=ray0176_YX2
575
ray1b
763 alone 576
        ;RAY 1,1,H,D,y,x ;1b
213 alone 577
cur11xy=$+1
578
        LD DE,0
763 alone 579
        RAY 1,1,4,2,1,0;y,x ;1b
213 alone 580
;cur11xy=cur0176
581
ray11xy_YX=ray0176_YX
582
ray11xy_YX2=ray0176_YX2
583
ray2
584
        BIT 7,L
585
        JP NZ,ray2b
763 alone 586
        ;RAY 1,0,H,D,y,x ;2a
213 alone 587
cur10xy=$+1
588
        LD DE,0
763 alone 589
        RAY 1,0,4,2,1,0;y,x ;2a
213 alone 590
;cur10xy=cur0176
591
ray10xy_YX=ray0176_YX
592
ray10xy_YX2=ray0176_YX2
593
ray2b
763 alone 594
        ;RAY 0,1,L,E,x,y ;2b
213 alone 595
cur01yx=$+1
596
        LD DE,0
763 alone 597
        RAY 0,1,5,3,0,1;x,y ;2b
213 alone 598
;cur01yx=cur0176
599
ray01yx_YX=ray0176_YX
600
;ray01yx_YX2=ray0176_YX2
601
ray3
602
        BIT 7,L
603
        JP NZ,ray3b
763 alone 604
        ;RAY 0,0,L,E,x,y ;3a
213 alone 605
cur00yx=$+1
606
        LD DE,0
763 alone 607
        RAY 0,0,5,3,0,1;x,y ;3a
213 alone 608
;cur00yx=cur0176
609
ray00yx_YX=ray0176_YX
610
;ray00yx_YX2=ray0176_YX2
611
ray3b
763 alone 612
        ;RAY 0,0,H,D,y,x ;3b
213 alone 613
cur00xy=$+1
614
        LD DE,0
763 alone 615
        RAY 0,0,4,2,1,0;y,x ;3b
213 alone 616
;cur00xy=cur0176
617
ray00xy_YX=ray0176_YX
618
ray00xy_YX2=ray0176_YX2
619
ray4
620
        BIT 7,L
621
        JP NZ,ray4b
763 alone 622
        ;RAY 0,1,H,D,y,x ;4a
213 alone 623
cur01xy=$+1
624
        LD DE,0
763 alone 625
        RAY 0,1,4,2,1,0;y,x ;4a
213 alone 626
;cur01xy=cur0176
627
ray01xy_YX=ray0176_YX
628
ray01xy_YX2=ray0176_YX2
629
ray4b
763 alone 630
        ;RAY 1,0,L,E,x,y ;4b
213 alone 631
cur10yx=$+1
632
        LD DE,0
763 alone 633
        RAY 1,0,5,3,0,1;x,y ;4b
213 alone 634
;cur10yx=cur0176
635
ray10yx_YX=ray0176_YX
636
;ray10yx_YX2=ray0176_YX2
637
 
763 alone 638
doorhlq
639
        ld a,128
640
        jr raydeq
764 alone 641
rayhlq_texxaxorb
642
        xor b
643
        ld b,a
213 alone 644
rayhlq
645
        XOR A
646
raydeq
647
;b=texx
648
;hl=YX
649
;dist*cos=ix+a
650
 
651
       PUSH HL
652
        ADD A,LX
653
        LD L,A
654
        ADC A,HX
655
        SUB L
656
        LD H,A
657
;HL=dist*cos=128..#3fff
658
;ਢ  128..255
659
        LD DE,#000
660
        LD A,L
661
        jr Z,TOLOGRLQ
662
       DUP 5;6
663
        INC D
664
        SRL H
665
        RRA
666
        jr Z,TOLOGRLE
667
       EDUP
668
TOLOGRLQ ;
1977 alone 669
       if antizalom;debug
670
       cp 64
671
       jr nc,$+4
672
       ld a,64
673
       else
213 alone 674
        OR A
675
        JP M,$+5 ;>=128
676
        LD A,128 ;<128
1977 alone 677
       endif
213 alone 678
TOLOGRLE ;
679
        LD L,A ;128..255
680
       ;D=0..5
681
        LD H,tlogd/256
682
;2.  cos
683
rayrealangle=$+1
684
        LD A,(tlogcos) ;0..63
685
        ADD A,(HL) ;log(dist/2^N) = 128..255 for arg>=128
1977 alone 686
       IF antizalom;debug
213 alone 687
       jr NC,$+3
688
       INC D
689
       ENDIF
690
 
691
;3.㬭  corrdist(scrX) - 砥 k/⠡
692
;(᮪頥 ﭨ    sqrt(2) ࠧ)
693
;corrdist(scrX)=1/sqrt(1+scrX^2),  scrX=-1..+1
694
;   ⠡ ⠡஢
695
cura=$+1
696
        LD HL,tcorrlogd ;L=scrX=0..255="-127.5..127.5"
697
        SUB (HL) ;64..128
1977 alone 698
       IF antizalom;debug
213 alone 699
       jr NC,DEBBP
700
       DEC D
701
       JP P,DEBBP
702
       INC D
703
       XOR A
704
DEBBP ;
705
       ENDIF
706
        LD L,A
707
        LD H,tlogd2sca/256
708
         SRA D
709
         RR E ;DE=+0,+#80,..+#300
710
        ADD HL,DE
1977 alone 711
       IF 0;debug
213 alone 712
        BIT 7,(HL)
713
        jr NZ,$
714
       ENDIF
775 alone 715
        LD C,(HL) ;dist(scale#)=63..1;127..1
213 alone 716
                  ;todo linear scale, recalc in DRAWWALLS
717
         SCF
435 alone 718
         RR B ;texx=0x80..0xFF
213 alone 719
       IF scale64
435 alone 720
        SRL B ;texx=0x40..0x7F
213 alone 721
       ENDIF
722
       POP DE
723
        RET
724
 
725
       IF interpolate
726
       IF 0
727
I_SUB_INTERt ;
728
        POP HL  ;
729
        PUSH HL ;de
730
        LD A,D
731
        SUB H
732
        jr NZ,holeny
733
        LD A,E
734
        SUB L
735
        JP Z,I_SUB_INTER ;த ⥭
736
        DEC A
737
        CP 3
738
        jr C,nhole
739
        JP isubneq
740
holeny ;
741
        DEC A
742
        CP 3
743
        jr NC,isubneq
744
        LD A,E
745
        CP L
746
        jr NZ,isubneq
747
nhole ;
748
       ENDIF
749
I_SUB_INTER
750
         ; rightscan=Middlescan
751
        LD A,C
752
        EXX
753
        ADD A,C
754
        RRA
755
        LD C,A ;dist
756
        EXX
757
        LD A,B
758
        EXX
759
        ADD A,B
760
        RRA
761
        LD B,A ;texx
762
I_SUB_SCANQ ;
763
         ;INTERPOLATE_SUB(a-step, step, leftscan, rightscan);r=M
764
       PUSH HL ;step,a
765
        LD A,L
766
        SUB H
767
        LD L,A ;a-step
768
        LD A,H
769
        LD H,distbuf/256+2
770
        LD (HL),C ;dist
771
        DEC H
772
        LD (HL),B ;texx
773
        DEC H
774
        RRCA
775
        CALL NC,INTERPOLATE_SUB
1917 alone 776
        LD A,(DE) ;ID
777
         ;ld a,0xc0
213 alone 778
        LD (HL),A ;ID
779
         ;leftscan=rightscan ;=Middlescan
780
        EXX
781
       POP HL ;step,a
782
         ;pop(rightscan)
435 alone 783
        POP DE
784
        pop BC
213 alone 785
         ;INTERPOLATE_SUB(a, step, leftscan, rightscan) ;l=M,r=R
786
         ;scan[a]=rightscan
787
         ;if (step==1) exit
788
        LD A,H
789
        LD H,distbuf/256+2
790
        LD (HL),C ;dist
791
        DEC H
792
        LD (HL),B ;texx
793
        DEC H
794
        RRCA
795
        RET C
796
INTERPOLATE_SUB
797
;L=a
798
;A=step/2                 ;not preserved
799
;BCDE'=leftscan ;(a-step) ;not preserved
800
;BCDE=rightscan ;(a)
801
;CY=0
802
       EXA
1917 alone 803
        LD A,(DE) ;ID
213 alone 804
        LD (HL),A ;ID ;texx,dist are written already
805
       EXA
806
         ;step=step/2
807
        LD H,A
808
         ;push(rightscan)
435 alone 809
        PUSH BC
810
        push DE
213 alone 811
         ;if(rightscan.yx==leftscan.yx)
812
     ;LD A,(DE)
813
        EXX
814
     ;EXD
815
     ;XOR (HL)
816
     ;EXD
817
     ;JP Z,I_SUB_INTERt
818
        POP HL  ;
819
        PUSH HL ;de
820
        ;OR A
821
        SBC HL,DE ;CY=0
822
        JP Z,I_SUB_INTER
823
isubneq
824
         ; rightscan=RAYCAST(a-step)
825
        EXX
826
        PUSH HL
827
        LD A,L
828
        SUB H
829
        LD L,A ;a-step
2222 alone 830
        ;LD (cura),A
831
        CALL RAYCASTl
213 alone 832
        POP HL
833
        JP I_SUB_SCANQ
834
         ;else - see above
835
       ENDIF ;interpolate
836
 
837
 
838
;============================
839
       IF sprites
775 alone 840
DOSORTSPRITES=1
1903 alone 841
;CURSPRITES_RECSZ=5;4
775 alone 842
 
213 alone 843
SCANMONS
844
        LD A,(curX)
845
        SUB viewrange
846
        LD (scmonX),A
847
        LD A,(curY)
848
        SUB viewrange
849
        LD (scmonY),A
850
       LD HL,cursprites
775 alone 851
      if DOSORTSPRITES
213 alone 852
       LD (HL),0 ;end of sprites
775 alone 853
      endif
213 alone 854
       LD (scaneof),HL
855
        LD HL,MONSTRS+1 ;1+砫 ⠡.஢/।⮢
775 alone 856
        ld hx,-1 ;monster index
857
       jp SCMONS0 ;横 ᪠-  ஢/।⮢
213 alone 858
SCMONNx
859
        LD A,L
860
        ADD A,8
861
        LD L,A
862
        JR C,SCMxIH
863
SCMONS0
775 alone 864
       inc hx ;monster index
865
        LD A,(HL) ;X
213 alone 866
        INC A
867
       RET Z
868
scmonX=$+1
869
        SUB 0
870
        CP viewrange*2+1
871
        JP NC,SCMONNx
435 alone 872
        INC L
873
        inc L
213 alone 874
        LD A,(HL)
875
scmonY=$+1
876
        SUB 0
877
        CP viewrange*2+1
878
        JR C,SCMONY
879
        LD A,L
880
        ADD A,6
881
        LD L,A
882
        JP NC,SCMONS0
883
SCMxIH  INC H
884
        JP SCMONS0
435 alone 885
SCMONY  DEC L
886
        dec L
887
        dec L
213 alone 888
        LD C,(HL)
889
        INC L
890
        LD B,(HL) ;Xx
891
        INC L
892
        LD E,(HL)
893
        INC L
894
        LD D,(HL) ;Yy
895
        INC L
775 alone 896
   PUSH HL
213 alone 897
        PUSH BC
2021 alone 898
       ld a,(IMavision+1)
899
       sub (hl) ;DIR
1985 alone 900
       inc l ;skip DIR (TODO use)
901
       LD L,(HL) ;TYPE*8+phase
902
       ld H,0
440 alone 903
        LD BC,MONSTAB-8
213 alone 904
        ADD HL,BC
2021 alone 905
      if doublescr
906
       ;a=mydir-objdir. ᫨  128, ᬮ  .  0 -  .  64 - ?
907
        sub 32
908
        rlca
909
        rlca
910
        rlca
911
        and 6
912
        add a,ZOMBIEMANrotate-ZOMBIEMANgo
913
       ld c,a ;mydir-objdir
914
      endif
1985 alone 915
       LD A,(HL) ;ID ⥪ ( ᨬ  䠧)
2002 alone 916
       ld lx,a ;!=0
2021 alone 917
      if doublescr
918
       ld a,l
919
       cp 0xff&(3*8+0 + (MONSTAB-8))
920
       jr z,goside_phase1
921
       cp 0xff&(3*8+1 + (MONSTAB-8))
922
       ;jr z,goside_phase2
923
       jr nz,nogoside
924
goside_phase2
925
goside_phase1
926
        ld b,0
927
        add hl,bc
928
        ld a,(hl)
929
        ld lx,a
930
nogoside
931
      endif
213 alone 932
        POP BC
933
;calculate sprite position
934
        LD HL,(curYy)
2222 alone 935
        SBC HL,DE ;dYy  ஭ ப
1985 alone 936
        ex de,hl;EXD 
213 alone 937
        LD HL,(curXx)
2222 alone 938
        SBC HL,BC ;dXx  ஭ ப
939
       ;ld a,(curangle)
213 alone 940
        CALL OBJMUL
941
       ;BC=dist
942
       ;DE=xscr
943
       IF lores
944
        SRA D
945
        RR E
946
       ENDIF
947
        LD HL,pixperchr*scrwid/2-256
948
        SBC HL,DE
949
        INC H
950
       jr NZ,SCANnSPR ;X out of screen
951
       IF lores
952
        BIT 7,L
953
       jr NZ,SCANnSPR ;X out of screen
954
       ENDIF
955
;write data to cursprites
775 alone 956
;ID 8 (0=end)
957
;dist 16
958
;xscr 8
959
;monster index
960
       if DOSORTSPRITES == 0
961
        LD A,L ;xscr
962
scaneof=$+1
963
        ld hl,0
964
        ld e,lx
965
        ld (hl),e ;id
966
        inc l
967
        ld (hl),c
968
        inc l
969
        ld (hl),b ;bc=dist
970
        inc l
971
        ld (hl),a ;xscr
972
        inc l
973
       if CURSPRITES_RECSZ == 5
974
       ld a,hx
975
       ld (hl),a ;monster index
976
       inc l
977
       endif
978
        ld (hl),0
979
        ld (scaneof),hl
980
       else
981
 
213 alone 982
       PUSH BC
983
        EXX
984
       POP BC
775 alone 985
        LD HL,cursprites+((-(CURSPRITES_RECSZ-2))&0xff)
213 alone 986
SCANsort0
775 alone 987
       if CURSPRITES_RECSZ == 5
435 alone 988
        INC L
775 alone 989
       endif
990
        INC L
435 alone 991
        inc L
213 alone 992
        LD A,(HL)
993
        OR A
994
        jr Z,SCANins
995
        INC L
996
        LD E,(HL)
997
        INC L
775 alone 998
        LD D,(HL) ;de=dist
1985 alone 999
        ex de,hl;EXD 
213 alone 1000
        SBC HL,BC
1985 alone 1001
        ex de,hl;EXD 
213 alone 1002
        jr NC,SCANsort0
435 alone 1003
        DEC L
1004
        dec L
213 alone 1005
SCANins
1006
       PUSH BC
1007
scaneof=$+1
1008
        LD DE,0
1009
        LD A,E
1010
        SUB L
1011
        INC A ;bytes to move
1012
        LD C,A
1013
        LD B,0
440 alone 1014
        LD H,D
1015
        ld L,E
213 alone 1016
        LD A,E
775 alone 1017
        ADD A,CURSPRITES_RECSZ;4
213 alone 1018
        LD E,A
1019
        LD (scaneof),A
1020
        LDDR
1021
        INC HL
1022
       POP BC
440 alone 1023
       LD A,lx;1
1024
;A=ID ⥪
213 alone 1025
;BC'=dist
1026
;L'=xscr
1027
        LD (HL),A
1028
        INC L
1029
        LD (HL),C
1030
        INC L
1031
        LD (HL),B
1032
        INC L
1033
        EXX
1034
        LD A,L
1035
        EXX
1036
        LD (HL),A ;xscr
1037
        INC L
775 alone 1038
       if CURSPRITES_RECSZ == 5
1039
       ld a,hx
1040
       ld (hl),a ;monster index
1041
       inc l
1042
       endif
213 alone 1043
        EXX
775 alone 1044
       endif
213 alone 1045
SCANnSPR ;
775 alone 1046
 
1047
   POP HL
435 alone 1048
        INC L
1049
        inc L
1050
        inc L
1051
        inc HL
213 alone 1052
       INC L
1053
        JP SCMONS0
1054
 
1055
DRAWSPRITES
775 alone 1056
;ID 8 (0=end)
1057
;dist 16
1058
;xscr 8
1059
;monster index
213 alone 1060
        LD IY,cursprites
1061
DRAWSPRITES0 ;
775 alone 1062
        LD A,(IY) ;id
213 alone 1063
        OR A
1064
        RET Z
1065
        INC IY
1066
        LD C,(IY)
1067
        INC IY
775 alone 1068
        LD B,(IY) ;bc=dist
213 alone 1069
        INC IY
440 alone 1070
;A=ID
1071
        EXX
1962 alone 1072
         LD D,a ;ID ( )
440 alone 1073
        EXX
2002 alone 1074
 
775 alone 1075
        LD L,(IY) ;xscr
213 alone 1076
        INC IY
775 alone 1077
       if CURSPRITES_RECSZ == 5
1078
        INC IY
1079
       endif
213 alone 1080
;L=xscr
1081
;BC=dist
2222 alone 1082
        call disttoscale
1083
;de=dist, c=scale#
1084
       if atm
1085
        ld a,l ;xscr
1086
        ld h,d
1087
        ld l,e
1088
        srl h
1089
        rr l
1090
        add hl,de
1091
        ex de,hl ;de = de * 1.5
1092
        ld l,a ;xscr
1093
       else
1094
       IF loresspr
1095
        SLA E
1096
        RL D
1097
       ENDIF
1098
        SLA E
1099
        RL D ;DE=texx step = de * 4
1100
       endif
1101
 
1102
       IF loresspr_hires|optresspr
1103
       RES 0,L
1104
       ENDIF
1105
        LD H,distbuf/256+2 ;ID,texx,dist
1106
        LD A,C ;scale#
1107
        CP (HL)
1108
         if !atm
1109
         ld hx,0xc0 ;TODO
1110
         endif
1111
        CALL NC,DRAWSPRITE ;object center is visible ;TODO ᨬ   業
1112
        JP DRAWSPRITES0
1113
 
1114
disttoscale
1115
;bc=dist
1116
;out: de=dist, c=scale#
1117
;keep l=xscr
213 alone 1118
        INC B
1119
        DJNZ gFILLNCLOSE
448 alone 1120
        LD A,108;64 ; ⮣ ᫠  ⮫쪮 ਭ ࠩ  ᨬ쭮 ਡ,   ᨬ쭠  ( ࠭祭 ⨬ ᫮  ࠢ , ஢) ;108   ATM ࠭, 128   8  ᭨
213 alone 1121
        CP C
2062 alone 1122
         ;jr nc,DRAWSPRITES0 ;  㬥蠥 ;TODO 㬥 ⫨ ࠣ  
213 alone 1123
        jr C,$+3
439 alone 1124
        LD C,A ;ࠩ ᫨誮 !!! 㬥訬
213 alone 1125
gFILLNCLOSE
1126
       PUSH BC ;dist
1127
;ਢ  128..255
1128
        LD DE,#000
1129
        INC B
1130
        DEC B
1131
        LD A,C
1132
        jr Z,MOTOLOGRLQ
1133
       DUP 5;6
1134
        INC D
1135
        SRL B
1136
        RRA
1137
        jr Z,MOTOLOGRLE
1138
       EDUP
1139
MOTOLOGRLQ ;
448 alone 1140
        ;OR A
1141
        ;JP M,$+5 ;>=128
1142
        ;LD A,128 ;<128
1143
        ;;cp 96
1144
        ;;jr nc,$+4
1145
        ;;ld a,96 ;ࠩ ᫨誮 !!! 㢥稬 dist  㬥襭 
213 alone 1146
MOTOLOGRLE ;
1147
        LD C,A ;128..255 ;D=0..5
1148
        LD B,tlogd/256
1149
        LD A,(BC) ;log(dist) = 128..255 for arg>=128
448 alone 1150
       if atm==0
1151
       SUB 16;64                 ;0..127 for arg=64..127 ;???
1152
       endif
213 alone 1153
        LD C,A                ;0 for arg<64
1154
        LD B,tlogd2sca/256
1155
         SRA D
1156
         RR E ;DE=+0,+#80,..+#300
1985 alone 1157
        ex de,hl;EXD 
213 alone 1158
        ADD HL,BC
448 alone 1159
        LD C,(HL) ;scale#
1985 alone 1160
        ex de,hl;EXD 
213 alone 1161
      ;
1162
       POP DE ;dist
2222 alone 1163
        ret
213 alone 1164
 
1918 alone 1165
;㬭
1166
;A=+-0.7
1167
;HL=A*DE
1168
    ;A ࠭!!!
1169
MULT
1170
        LD HL,0
1171
MULTADD
1172
        RLCA
1173
        JR NC,MULTPLU
1174
        DUP 6
1175
        SRA D
1176
        RR E
1177
        RLCA
1178
        JR C,$+4
1179
        SBC HL,DE
1180
        EDUP
1181
        RLCA
1182
        RET C
1183
        SRA D
1184
        RR E
1185
         OR A
1186
        SBC HL,DE
1187
        RET
1188
MULTPLU DUP 6
1189
        SRA D
1190
        RR E
1191
        RLCA
1192
        JR NC,$+3
1193
        ADD HL,DE
1194
        EDUP
1195
        RLCA
1196
        RET NC
1197
        SRA D
1198
        RR E
1199
        ADD HL,DE
1200
        RET
1201
 
213 alone 1202
OBJMULQ
1203
        POP AF ;X
1204
       LD D,#40 ;X out of screen
1205
        RET
2222 alone 1206
; ⭮⥫ न ꥪ (dXx=HL, dYy=DE)
213 alone 1207
; न  ࠭ (DE=xscr, BC=ﭨ)
1208
OBJMUL
1209
        PUSH HL ;X
1210
       PUSH DE ;Y
1211
       PUSH HL ;X
2222 alone 1212
        LD HL,(curangle) ;L=業 鸞 (⠭  RAYPREPXY_hldea)
1213
       ;ld l,a
213 alone 1214
        LD C,(HL) ;sin=蠣  Y
1215
        LD A,-64
1216
        SUB L
1217
        LD L,A
1218
        LD B,(HL) ;-COS=蠣  X
1219
   ;Bc=DXdy=COSsin
1220
        LD A,C
1221
        CPL
1222
        CALL MULT ;HL=A*DE=-sin*Y
1223
       POP DE ;X
1224
        LD A,B
1225
        CALL MULTADD ;HL=-COS*X-sin*Y=d(ﭨ  ꥪ)
1226
       POP DE ;Y
1227
        BIT 7,H
1228
        jr NZ,OBJMULQ ;᫨ ﭨ<0, ꥪ  ᯨ=>exit
1229
        LD (_OBJd1),HL
1230
        CALL MULT;A=B=-COS, HL=-COS*Y
1231
       POP DE ;X
1232
        LD A,C
1233
        CALL MULTADD ;HL=-COS*Y+sin*X=xscr*d
1985 alone 1234
        ex de,hl;EXD 
213 alone 1235
_OBJd1=$+1
1236
        LD BC,0 ;BC=d ;᫥ MONDIV 稬 DE=xscr
1918 alone 1237
        ;jp MONDIV
1238
       ENDIF ;sprites
213 alone 1239
;
1240
;DE=+-7.8;BC=+7.8
1241
;DE=DE/BC=+-8.7/2
1242
    ;BC ࠭!!!
437 alone 1243
MONDIV
213 alone 1244
        LD H,0
1245
        LD A,D
1246
        SLA E
1247
        RLA
1248
        JP C,MONDIVNEG ;᫨ <0
1249
        LD L,A
1250
        INC E
1251
        LD A,E
1252
       DUP 7
1253
        SBC HL,BC
1254
        JR NC,$+3
1255
        ADD HL,BC
1256
        RLA
1257
        ADC HL,HL
1258
       EDUP
1259
        CPL
1260
        LD D,A
1261
       DUP 7
1262
        SBC HL,BC
1263
        JR NC,$+3
1264
        ADD HL,BC
1265
        RLA
1266
        ADD HL,HL
1267
       EDUP
1268
        SBC HL,BC
1269
        JR NC,$+3
1270
        ADD HL,BC
1271
        RLA
1272
        CPL
1273
        LD E,A
1274
        RET
1275
;᫨ <0
1276
MONDIVNEG
1277
        CPL
1278
        LD L,A
1279
        SBC A,A
1280
        XOR E
1281
       DUP 7
1282
        SBC HL,BC
1283
        JR NC,$+3
1284
        ADD HL,BC
1285
        RLA
1286
        ADC HL,HL
1287
       EDUP
1288
        LD D,A
1289
       DUP 7
1290
        SBC HL,BC
1291
        JR NC,$+3
1292
        ADD HL,BC
1293
        RLA
1294
        ADD HL,HL
1295
       EDUP
1296
        SBC HL,BC
1297
        JR NC,$+3
1298
        ADD HL,BC
1299
        RLA
1300
        LD E,A
1301
        RET