Subversion Repositories NedoOS

Rev

Details | Last modification | View Log

Rev Author Line No. Line
761 alone 1
;Universal PT2'n'PT3 Turbo Sound player for ZX Spectrum
2
;(c)2004-2007 S.V.Bulba <vorobey@mail.khstu.ru>
3
;Specially for AlCo
4
;http://bulba.untergrund.net/ (http://bulba.at.kz/)
5
 
6
;Release number
7
Release EQU "0"
8
 
9
;Conditional assembly
10
;1) Current position counters at (Vars1+0) and (Vars2+0)
11
CurPosCounter=0
12
;2) Allow channels allocation bits at (START+10)
13
ACBBAC=0
14
;3) Allow loop checking and disabling
15
LoopChecker=0
16
;4) Insert official identificator
17
Id=1
18
;5) Set IY for correct return to ZX Basic
19
Basic=0
20
 
21
;Features
22
;--------
23
;-Can be compiled at any address (i.e. no need rounding ORG
24
; address).
25
;-Variables (VARS) can be located at any address (not only after
26
; code block).
27
;-INIT subprogram checks PT3-module version and rightly
28
; generates both note and volume tables outside of code block
29
; (in VARS).
30
;-Two portamento (spc. command 3xxx) algorithms (depending of
31
; PT3 module version).
32
;-New 1.XX and 2.XX special command behaviour (only for PT v3.7
33
; and higher).
34
;-Any Tempo value are accepted (including Tempo=1 and Tempo=2).
35
;-TS modes: 2xPT3, 2xPT2 and PT v3.7 TS standard.
36
;-Fully compatible with Ay_Emul PT3 and PT2 players codes.
37
;-See also notes at the end of this source code.
38
 
39
;Limitations
40
;-----------
41
;-Can run in RAM only (self-modified code is used).
42
;-PT2 position list must be end by #FF marker only.
43
 
44
;Warning!!! PLAY subprogram can crash if no module are loaded
45
;into RAM or INIT subprogram was not called before.
46
 
47
;Call MUTE or INIT one more time to mute sound after stopping
48
;playing 
49
 
50
        ;ORG #C000
51
 
52
;Test codes (commented)
53
;       LD A,32 ;SinglePT3(TS if TSPT3.7),ABC,Looped
54
;       LD (START+10),A
55
;       LD HL,#8000 ;Mod1
56
;       LD DE,#A000 ;Mod2 (optional)
57
;       CALL START+3
58
;       EI
59
;_LP    HALT
60
;       CALL START+5
61
;       XOR A
62
;       IN A,(#FE)
63
;       CPL
64
;       AND 15
65
;       JR Z,_LP
66
;       JR START+8
67
 
68
TonA    EQU 0
69
TonB    EQU 2
70
TonC    EQU 4
71
Noise   EQU 6
72
Mixer   EQU 7
73
AmplA   EQU 8
74
AmplB   EQU 9
75
AmplC   EQU 10
76
Env     EQU 11
77
EnvTp   EQU 13
78
 
79
;Entry and other points
80
;START initialize playing of modules at MDLADDR (single module)
81
;START+3 initialization with module address in HL and DE (TS)
82
;START+5 play one quark
83
;START+8 mute
84
;START+10 setup and status flags
85
 
86
START
87
        LD HL,module;MDLADDR ;DE - address of 2nd module for TS
88
        JR INIT
89
        JP PLAY
90
        JR MUTE
91
SETUP   DB %00100000 ;set bit0, if you want to play without looping
92
             ;(optional);
93
             ;set bit1 for PT2 and reset for PT3 before
94
             ;calling INIT;
95
             ;bits2-3: %00-ABC, %01-ACB, %10-BAC (optional);
96
             ;bits4-5: %00-no TS, %01-2 modules TS, %10-
97
             ;autodetect PT3 TS-format by AlCo (PT 3.7+);
98
             ;Remark: old PT3 TS-format by AlCo (PT 3.6) is not
99
             ;documented and must be converted to new standard.
100
             ;bit6 is set each time, when loop point of 2nd TS
101
             ;module is passed (optional).
102
             ;bit7 is set each time, when loop point of 1st TS
103
             ;or of single module is passed (optional).
104
 
105
;Identifier
106
        IF Id
107
        DB "=UniPT2/PT3/TS-Player r.",Release,"="
108
        ENDIF
109
 
110
        IF LoopChecker
111
CHECKLP LD HL,SETUP
112
        BIT 0,(IY-100+VRS.ModNum)
113
        JR Z,CHL1
114
        SET 6,(HL)
115
        JR CHL2
116
CHL1    SET 7,(HL)
117
CHL2    BIT 0,(HL)
118
        RET Z
119
        POP HL
120
        INC (IY-100+VRS.DelyCnt)
121
        INC (IY-100+VRS.ChanA+CHP.NtSkCn)
122
        XOR A
123
        LD (IY-100+VRS.AYREGS+AmplA),A
124
        LD (IY-100+VRS.AYREGS+AmplB),A
125
        LD (IY-100+VRS.AYREGS+AmplC),A
126
        RET
127
        ENDIF
128
 
129
MUTE    XOR A
130
        LD H,A
131
        LD L,A
132
        LD (VARS1+VRS.AYREGS+AmplA),A
133
        LD (VARS1+VRS.AYREGS+AmplB),HL
134
        LD (VARS2+VRS.AYREGS+AmplA),A
135
        LD (VARS2+VRS.AYREGS+AmplB),HL
136
        JP ROUT
137
 
138
INIT
139
;HL - AddressOfModule
140
;DE - AddresOf2ndModule
141
        PUSH DE
142
        PUSH HL
143
        LD HL,VARS
144
        LD (HL),0
145
        LD DE,VARS+1
146
        LD BC,VAR0END-VARS-1
147
        LDIR
148
        INC HL
149
        LD (VARS1+VRS.AdInPtA),HL ;ptr to zero
150
        LD (VARS2+VRS.AdInPtA),HL
151
 
152
        POP HL
153
        LD IY,VARS1+100
154
        LD A,(START+10)
155
        AND 2
156
        JP NZ,I_PT2
157
 
158
        CALL INITPT3
159
        LD HL,(e_-SamCnv-2)*256+#18
160
        LD (SamCnv),HL
161
        LD A,#BA
162
        LD (OrnCP),A
163
        LD (SamCP),A
164
        LD A,#7B
165
        LD (OrnLD),A
166
        LD (SamLD),A
167
        LD A,#87
168
        LD (SamClc2),A
169
        POP HL
170
        ;Use version and ton table of 1st module
171
        LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
172
        SUB #30
173
        JR C,L20
174
        CP 10
175
        JR C,L21
176
L20     LD A,6
177
L21     LD (Version),A
178
        PUSH AF ;VolTable version
179
        CP 4
180
        LD A,(IX+99-100) ;TONE TABLE NUMBER
181
        RLA
182
        AND 7
183
        PUSH AF ;NoteTable number
184
 
185
        LD IY,VARS2+100
186
        LD A,(START+10)
187
        AND 48
188
        JR Z,NOTS
189
        CP 16
190
        JR Z,TwoPT3s
191
        LD A,(Version)
192
        CP 7
193
        JR C,NOTS
194
        LD A,(IX+98-100) ;ALCO TS MARKER
195
        CP #20
196
        JR Z,NOTS
197
        LD HL,VARS1
198
        LD DE,VARS2
199
        LD BC,VRS
200
        LDIR
201
        SET 1,(IY-100+VRS.ModNum)
202
        LD C,A
203
        ADD A,A
204
        ADD A,C
205
        SUB 2
206
        LD (TSSub),A
207
        JR AlCoTS_
208
TwoPT3s CALL INITPT3
209
AlCoTS_ LD A,1
210
        LD (is_ts),A
211
        SET 0,(IY-100+VRS.ModNum)
212
 
213
NOTS    LD BC,PT3PD
214
        LD HL,0
215
        LD DE,PT3EMPTYORN
216
        JR INITCOMMON
217
 
218
I_PT2   CALL INITPT2
219
        LD HL,#51CB
220
        LD (SamCnv),HL
221
        LD A,#BB
222
        LD (OrnCP),A
223
        LD (SamCP),A
224
        LD A,#7A
225
        LD (OrnLD),A
226
        LD (SamLD),A
227
        LD A,#80
228
        LD (SamClc2),A
229
        POP HL
230
        LD A,5
231
        LD (Version),A
232
        PUSH AF
233
        LD A,2
234
        PUSH AF
235
 
236
        LD A,(START+10)
237
        AND 48
238
        JR Z,NOTS2
239
 
240
        LD IY,VARS2+100
241
        LD A,1
242
        LD (is_ts),A
243
        SET 0,(IY-100+VRS.ModNum)
244
        CALL INITPT2
245
 
246
NOTS2   LD BC,PT2PD
247
        LD HL,#8687
248
        LD DE,PT2EMPTYORN
249
 
250
INITCOMMON
251
 
252
        IF Basic
253
        LD IY,#5C3A
254
        ENDIF
255
 
256
        LD (PTDEC),BC
257
        LD (PsCalc),HL
258
        PUSH DE
259
 
260
;note table data depacker
261
;(c) Ivan Roshin
262
        LD DE,T_PACK
263
        LD BC,T1_+(2*49)-1
264
TP_0    LD A,(DE)
265
        INC DE
266
        CP 15*2
267
        JR NC,TP_1
268
        LD H,A
269
        LD A,(DE)
270
        LD L,A
271
        INC DE
272
        JR TP_2
273
TP_1    PUSH DE
274
        LD D,0
275
        LD E,A
276
        ADD HL,DE
277
        ADD HL,DE
278
        POP DE
279
TP_2    LD A,H
280
        LD (BC),A
281
        DEC BC
282
        LD A,L
283
        LD (BC),A
284
        DEC BC
285
        SUB (#F8*2)&#ff
286
        JR NZ,TP_0
287
 
288
        INC A
289
        LD (VARS1+VRS.DelyCnt),A
290
        LD (VARS2+VRS.DelyCnt),A
291
        LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn
292
        LD (VARS1+VRS.ChanA+CHP.NtSkCn),HL
293
        LD (VARS1+VRS.ChanB+CHP.NtSkCn),HL
294
        LD (VARS1+VRS.ChanC+CHP.NtSkCn),HL
295
        LD (VARS2+VRS.ChanA+CHP.NtSkCn),HL
296
        LD (VARS2+VRS.ChanB+CHP.NtSkCn),HL
297
        LD (VARS2+VRS.ChanC+CHP.NtSkCn),HL
298
        POP HL
299
        LD (VARS1+VRS.ChanA+CHP.OrnPtr),HL
300
        LD (VARS1+VRS.ChanB+CHP.OrnPtr),HL
301
        LD (VARS1+VRS.ChanC+CHP.OrnPtr),HL
302
        LD (VARS2+VRS.ChanA+CHP.OrnPtr),HL
303
        LD (VARS2+VRS.ChanB+CHP.OrnPtr),HL
304
        LD (VARS2+VRS.ChanC+CHP.OrnPtr),HL
305
 
306
        POP AF
307
 
308
;NoteTableCreator (c) Ivan Roshin
309
;A - NoteTableNumber*2+VersionForNoteTable
310
;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
311
 
312
        LD HL,NT_DATA
313
        LD D,0
314
        ADD A,A
315
        LD E,A
316
        ADD HL,DE
317
        LD E,(HL)
318
        INC HL
319
        SRL E
320
        SBC A,A
321
        AND #A7 ;#00 (NOP) or #A7 (AND A)
322
        LD (L3),A
323
        EX DE,HL
324
        LD BC,T1_
325
        ADD HL,BC
326
 
327
        LD A,(DE)
328
        ADD A,T_&#ff
329
        LD C,A
330
        ADC A,T_/256
331
        SUB C
332
        LD B,A
333
        PUSH BC
334
        LD DE,NT_
335
        PUSH DE
336
 
337
        LD B,12
338
L1      PUSH BC
339
        LD C,(HL)
340
        INC HL
341
        PUSH HL
342
        LD B,(HL)
343
 
344
        PUSH DE
345
        EX DE,HL
346
        LD DE,23
347
        LD IXH,8
348
 
349
L2      SRL B
350
        RR C
351
L3      DB #19  ;AND A or NOP
352
        LD A,C
353
        ADC A,D ;=ADC 0
354
        LD (HL),A
355
        INC HL
356
        LD A,B
357
        ADC A,D
358
        LD (HL),A
359
        ADD HL,DE
360
        DEC IXH
361
        JR NZ,L2
362
 
363
        POP DE
364
        INC DE
365
        INC DE
366
        POP HL
367
        INC HL
368
        POP BC
369
        DJNZ L1
370
 
371
        POP HL
372
        POP DE
373
 
374
        LD A,E
375
        CP TCOLD_1&#ff
376
        JR NZ,CORR_1
377
        LD A,#FD
378
        LD (NT_+#2E),A
379
 
380
CORR_1  LD A,(DE)
381
        AND A
382
        JR Z,TC_EXIT
383
        RRA
384
        PUSH AF
385
        ADD A,A
386
        LD C,A
387
        ADD HL,BC
388
        POP AF
389
        JR NC,CORR_2
390
        DEC (HL)
391
        DEC (HL)
392
CORR_2  INC (HL)
393
        AND A
394
        SBC HL,BC
395
        INC DE
396
        JR CORR_1
397
 
398
TC_EXIT
399
 
400
        POP AF
401
 
402
;VolTableCreator (c) Ivan Roshin
403
;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
404
                           ;5.. - 2.x,3.5x..3.6x..VTII1.0)
405
 
406
        CP 5
407
        LD HL,#11
408
        LD D,H
409
        LD E,H
410
        LD A,#17
411
        JR NC,M1
412
        DEC L
413
        LD E,L
414
        XOR A
415
M1      LD (M2),A
416
 
417
        LD IX,VT_+16
418
 
419
        LD C,#F
420
INITV2  PUSH HL
421
 
422
        ADD HL,DE
423
        EX DE,HL
424
        SBC HL,HL
425
 
426
        LD B,#10
427
INITV1  LD A,L
428
M2      DB #7D
429
        LD A,H
430
        ADC A,0
431
        LD (IX),A
432
        INC IX
433
        ADD HL,DE
434
        DJNZ INITV1
435
 
436
        POP HL
437
        LD A,E
438
        CP #77
439
        JR NZ,M3
440
        INC E
441
M3      DEC C
442
        JR NZ,INITV2
443
 
444
        JP ROUT
445
 
446
INITPT3 CALL SETMDAD
447
        PUSH HL
448
        LD DE,100
449
        ADD HL,DE
450
        LD A,(HL)
451
        LD (IY-100+VRS.Delay),A
452
        PUSH HL
453
        POP IX
454
        ADD HL,DE
455
        CALL SETCPPT
456
        LD E,(IX+102-100)
457
        INC HL
458
 
459
        IF CurPosCounter
460
        LD (IY-100+VRS.PosSub),L
461
        ENDIF
462
 
463
        ADD HL,DE
464
        CALL SETLPPT
465
        POP DE
466
        LD L,(IX+103-100)
467
        LD H,(IX+104-100)
468
        ADD HL,DE
469
        CALL SETPTPT
470
        LD HL,169
471
        ADD HL,DE
472
        CALL SETORPT
473
        LD HL,105
474
        ADD HL,DE
475
 
476
SETSMPT LD (IY-100+VRS.SamPtrs),L
477
        LD (IY-100+VRS.SamPtrs+1),H
478
        RET
479
 
480
INITPT2 LD A,(HL)
481
        LD (IY-100+VRS.Delay),A
482
        PUSH HL
483
        PUSH HL
484
        PUSH HL
485
        INC HL
486
        INC HL
487
        LD A,(HL)
488
        INC HL
489
        CALL SETSMPT
490
        LD E,(HL)
491
        INC HL
492
        LD D,(HL)
493
        POP HL
494
        AND A
495
        SBC HL,DE
496
        CALL SETMDAD
497
        POP HL
498
        LD DE,67
499
        ADD HL,DE
500
        CALL SETORPT
501
        LD E,32
502
        ADD HL,DE
503
        LD C,(HL)
504
        INC HL
505
        LD B,(HL)
506
        LD E,30
507
        ADD HL,DE
508
        CALL SETCPPT
509
        LD E,A
510
        INC HL
511
 
512
        IF CurPosCounter
513
        LD (IY-100+VRS.PosSub),L
514
        ENDIF
515
 
516
        ADD HL,DE
517
        CALL SETLPPT
518
        POP HL
519
        ADD HL,BC
520
 
521
SETPTPT LD (IY-100+VRS.PatsPtr),L
522
        LD (IY-100+VRS.PatsPtr+1),H
523
        RET
524
 
525
SETMDAD LD (IY-100+VRS.MODADDR),L
526
        LD (IY-100+VRS.MODADDR+1),H
527
        RET
528
 
529
SETORPT LD (IY-100+VRS.OrnPtrs),L
530
        LD (IY-100+VRS.OrnPtrs+1),H
531
        RET
532
 
533
SETCPPT LD (IY-100+VRS.CrPsPtr),L
534
        LD (IY-100+VRS.CrPsPtr+1),H
535
        RET
536
 
537
SETLPPT LD (IY-100+VRS.LPosPtr),L
538
        LD (IY-100+VRS.LPosPtr+1),H
539
        RET
540
 
541
SETENBS LD (IY-100+VRS.EnvBase),L
542
        LD (IY-100+VRS.EnvBase+1),H
543
        RET
544
 
545
SETESLD LD (IY-100+VRS.CurESld),L
546
        LD (IY-100+VRS.CurESld+1),H
547
        RET
548
 
549
GETIX   PUSH IY
550
        POP IX
551
        ADD IX,DE
552
        RET
553
 
554
PTDECOD CALL GETIX
555
PTDEC   EQU $+1
556
        JP #C3C3
557
 
558
;PT2 pattern decoder
559
PD2_SAM CALL SETSAM
560
        JR PD2_LOOP
561
 
562
PD2_EOff LD (IX-12+CHP.Env_En),A
563
        JR PD2_LOOP
564
 
565
PD2_ENV LD (IX-12+CHP.Env_En),16
566
        LD (IY-100+VRS.AYREGS+EnvTp),A
567
        LD A,(BC)
568
        INC BC
569
        LD L,A
570
        LD A,(BC)
571
        INC BC
572
        LD H,A
573
        CALL SETENBS
574
        JR PD2_LOOP
575
 
576
PD2_ORN CALL SETORN
577
        JR PD2_LOOP
578
 
579
PD2_SKIP INC A
580
        LD (IX-12+CHP.NNtSkp),A
581
        JR PD2_LOOP
582
 
583
PD2_VOL RRCA
584
        RRCA
585
        RRCA
586
        RRCA
587
        LD (IX-12+CHP.Volume),A
588
        JR PD2_LOOP
589
 
590
PD2_DEL CALL C_DELAY
591
        JR PD2_LOOP
592
 
593
PD2_GLIS SET 2,(IX-12+CHP.Flags)
594
        INC A
595
        LD (IX-12+CHP.TnSlDl),A
596
        LD (IX-12+CHP.TSlCnt),A
597
        LD A,(BC)
598
        INC BC
599
        LD (IX-12+CHP.TSlStp),A
600
        ADD A,A
601
        SBC A,A
602
        LD (IX-12+CHP.TSlStp+1),A
603
        SCF
604
        JR PD2_LP2
605
 
606
PT2PD   AND A
607
 
608
PD2_LP2 EX AF,AF'
609
 
610
PD2_LOOP LD A,(BC)
611
        INC BC
612
        ADD A,#20
613
        JR Z,PD2_REL
614
        JR C,PD2_SAM
615
        ADD A,96
616
        JR C,PD2_NOTE
617
        INC A
618
        JR Z,PD2_EOff
619
        ADD A,15
620
        JP Z,PD_FIN
621
        JR C,PD2_ENV
622
        ADD A,#10
623
        JR C,PD2_ORN
624
        ADD A,#40
625
        JR C,PD2_SKIP
626
        ADD A,#10
627
        JR C,PD2_VOL
628
        INC A
629
        JR Z,PD2_DEL
630
        INC A
631
        JR Z,PD2_GLIS
632
        INC A
633
        JR Z,PD2_PORT
634
        INC A
635
        JR Z,PD2_STOP
636
        LD A,(BC)
637
        INC BC
638
        LD (IX-12+CHP.CrNsSl),A
639
        JR PD2_LOOP
640
 
641
PD2_PORT RES 2,(IX-12+CHP.Flags)
642
        LD A,(BC)
643
        INC BC
644
        INC BC ;ignoring precalc delta to right sound
645
        INC BC
646
        SCF
647
        JR PD2_LP2
648
 
649
PD2_STOP LD (IX-12+CHP.TSlCnt),A
650
        JR PD2_LOOP
651
 
652
PD2_REL LD (IX-12+CHP.Flags),A
653
        JR PD2_EXIT
654
 
655
PD2_NOTE LD L,A
656
        LD A,(IX-12+CHP.Note)
657
        LD (PrNote+1),A
658
        LD (IX-12+CHP.Note),L
659
        XOR A
660
        LD (IX-12+CHP.TSlCnt),A
661
        SET 0,(IX-12+CHP.Flags)
662
        EX AF,AF'
663
        JR NC,NOGLIS2
664
        BIT 2,(IX-12+CHP.Flags)
665
        JR NZ,NOPORT2
666
        LD (LoStep),A
667
        ADD A,A
668
        SBC A,A
669
        EX AF,AF'
670
        LD H,A
671
        LD L,A
672
        INC A
673
        CALL SETPORT
674
NOPORT2 LD (IX-12+CHP.TSlCnt),1
675
NOGLIS2 XOR A
676
 
677
 
678
PD2_EXIT LD (IX-12+CHP.PsInSm),A
679
        LD (IX-12+CHP.PsInOr),A
680
        LD (IX-12+CHP.CrTnSl),A
681
        LD (IX-12+CHP.CrTnSl+1),A
682
        JP PD_FIN
683
 
684
;PT3 pattern decoder
685
PD_OrSm LD (IX-12+CHP.Env_En),0
686
        CALL SETORN
687
PD_SAM_ LD A,(BC)
688
        INC BC
689
        RRCA
690
 
691
PD_SAM  CALL SETSAM
692
        JR PD_LOOP
693
 
694
PD_VOL  RRCA
695
        RRCA
696
        RRCA
697
        RRCA
698
        LD (IX-12+CHP.Volume),A
699
        JR PD_LP2
700
 
701
PD_EOff LD (IX-12+CHP.Env_En),A
702
        LD (IX-12+CHP.PsInOr),A
703
        JR PD_LP2
704
 
705
PD_SorE DEC A
706
        JR NZ,PD_ENV
707
        LD A,(BC)
708
        INC BC
709
        LD (IX-12+CHP.NNtSkp),A
710
        JR PD_LP2
711
 
712
PD_ENV  CALL SETENV
713
        JR PD_LP2
714
 
715
PD_ORN  CALL SETORN
716
        JR PD_LOOP
717
 
718
PD_ESAM LD (IX-12+CHP.Env_En),A
719
        LD (IX-12+CHP.PsInOr),A
720
        CALL NZ,SETENV
721
        JR PD_SAM_
722
 
723
PT3PD   LD A,(IX-12+CHP.Note)
724
        LD (PrNote+1),A
725
        LD L,(IX-12+CHP.CrTnSl)
726
        LD H,(IX-12+CHP.CrTnSl+1)
727
        LD (PrSlide+1),HL
728
 
729
PD_LOOP LD DE,#2010
730
PD_LP2  LD A,(BC)
731
        INC BC
732
        ADD A,E
733
        JR C,PD_OrSm
734
        ADD A,D
735
        JR Z,PD_FIN
736
        JR C,PD_SAM
737
        ADD A,E
738
        JR Z,PD_REL
739
        JR C,PD_VOL
740
        ADD A,E
741
        JR Z,PD_EOff
742
        JR C,PD_SorE
743
        ADD A,96
744
        JR C,PD_NOTE
745
        ADD A,E
746
        JR C,PD_ORN
747
        ADD A,D
748
        JR C,PD_NOIS
749
        ADD A,E
750
        JR C,PD_ESAM
751
        ADD A,A
752
        LD E,A
753
        LD HL,#ffff&(SPCCOMS+#FF20-#2000)
754
        ADD HL,DE
755
        LD E,(HL)
756
        INC HL
757
        LD D,(HL)
758
        PUSH DE
759
        JR PD_LOOP
760
 
761
PD_NOIS LD (IY-100+VRS.Ns_Base),A
762
        JR PD_LP2
763
 
764
PD_REL  RES 0,(IX-12+CHP.Flags)
765
        JR PD_RES
766
 
767
PD_NOTE LD (IX-12+CHP.Note),A
768
        SET 0,(IX-12+CHP.Flags)
769
        XOR A
770
 
771
PD_RES  LD (PDSP_+1),SP
772
        LD SP,IX
773
        LD H,A
774
        LD L,A
775
        PUSH HL
776
        PUSH HL
777
        PUSH HL
778
        PUSH HL
779
        PUSH HL
780
        PUSH HL
781
PDSP_   LD SP,#3131
782
 
783
PD_FIN  LD A,(IX-12+CHP.NNtSkp)
784
        LD (IX-12+CHP.NtSkCn),A
785
        RET
786
 
787
C_PORTM LD A,(BC)
788
        INC BC
789
;SKIP PRECALCULATED TONE DELTA (BECAUSE
790
;CANNOT BE RIGHT AFTER PT3 COMPILATION)
791
        INC BC
792
        INC BC
793
        EX AF,AF'
794
        LD A,(BC) ;SIGNED TONE STEP
795
        INC BC
796
        LD (LoStep),A
797
        LD A,(BC)
798
        INC BC
799
        AND A
800
        EX AF,AF'
801
        LD L,(IX-12+CHP.CrTnSl)
802
        LD H,(IX-12+CHP.CrTnSl+1)
803
 
804
;Set portamento variables
805
;A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl
806
 
807
SETPORT RES 2,(IX-12+CHP.Flags)
808
        LD (IX-12+CHP.TnSlDl),A
809
        LD (IX-12+CHP.TSlCnt),A
810
        PUSH HL
811
        LD DE,NT_
812
        LD A,(IX-12+CHP.Note)
813
        LD (IX-12+CHP.SlToNt),A
814
        ADD A,A
815
        LD L,A
816
        LD H,0
817
        ADD HL,DE
818
        LD A,(HL)
819
        INC HL
820
        LD H,(HL)
821
        LD L,A
822
        PUSH HL
823
PrNote  LD A,#3E
824
        LD (IX-12+CHP.Note),A
825
        ADD A,A
826
        LD L,A
827
        LD H,0
828
        ADD HL,DE
829
        LD E,(HL)
830
        INC HL
831
        LD D,(HL)
832
        POP HL
833
        SBC HL,DE
834
        LD (IX-12+CHP.TnDelt),L
835
        LD (IX-12+CHP.TnDelt+1),H
836
        POP DE
837
Version EQU $+1
838
        LD A,#3E
839
        CP 6
840
        JR C,OLDPRTM ;Old 3xxx for PT v3.5-
841
PrSlide LD DE,#1111
842
        LD (IX-12+CHP.CrTnSl),E
843
        LD (IX-12+CHP.CrTnSl+1),D
844
LoStep  EQU $+1
845
OLDPRTM LD A,#3E
846
        EX AF,AF'
847
        JR Z,NOSIG
848
        EX DE,HL
849
NOSIG   SBC HL,DE
850
        JP P,SET_STP
851
        CPL
852
        EX AF,AF'
853
        NEG
854
        EX AF,AF'
855
SET_STP LD (IX-12+CHP.TSlStp+1),A
856
        EX AF,AF'
857
        LD (IX-12+CHP.TSlStp),A
858
        LD (IX-12+CHP.COnOff),0
859
        RET
860
 
861
C_GLISS SET 2,(IX-12+CHP.Flags)
862
        LD A,(BC)
863
        INC BC
864
        LD (IX-12+CHP.TnSlDl),A
865
        AND A
866
        JR NZ,GL36
867
        LD A,(Version) ;AlCo PT3.7+
868
        CP 7
869
        SBC A,A
870
        INC A
871
GL36    LD (IX-12+CHP.TSlCnt),A
872
        LD A,(BC)
873
        INC BC
874
        EX AF,AF'
875
        LD A,(BC)
876
        INC BC
877
        JR SET_STP
878
 
879
C_SMPOS LD A,(BC)
880
        INC BC
881
        LD (IX-12+CHP.PsInSm),A
882
        RET
883
 
884
C_ORPOS LD A,(BC)
885
        INC BC
886
        LD (IX-12+CHP.PsInOr),A
887
        RET
888
 
889
C_VIBRT LD A,(BC)
890
        INC BC
891
        LD (IX-12+CHP.OnOffD),A
892
        LD (IX-12+CHP.COnOff),A
893
        LD A,(BC)
894
        INC BC
895
        LD (IX-12+CHP.OffOnD),A
896
        XOR A
897
        LD (IX-12+CHP.TSlCnt),A
898
        LD (IX-12+CHP.CrTnSl),A
899
        LD (IX-12+CHP.CrTnSl+1),A
900
        RET
901
 
902
C_ENGLS LD A,(BC)
903
        INC BC
904
        LD (IY-100+VRS.Env_Del),A
905
        LD (IY-100+VRS.CurEDel),A
906
        LD A,(BC)
907
        INC BC
908
        LD L,A
909
        LD A,(BC)
910
        INC BC
911
        LD H,A
912
        LD (IY-100+VRS.ESldAdd),L
913
        LD (IY-100+VRS.ESldAdd+1),H
914
        RET
915
 
916
C_DELAY LD A,(BC)
917
        INC BC
918
        LD (IY-100+VRS.Delay),A
919
        LD HL,VARS2+VRS.ModNum ;if AlCo_TS
920
        BIT 1,(HL)
921
        RET Z
922
        LD (VARS1+VRS.Delay),A
923
        LD (VARS1+VRS.DelyCnt),A
924
        LD (VARS2+VRS.Delay),A
925
        RET
926
 
927
SETENV  LD (IX-12+CHP.Env_En),E
928
        LD (IY-100+VRS.AYREGS+EnvTp),A
929
        LD A,(BC)
930
        INC BC
931
        LD H,A
932
        LD A,(BC)
933
        INC BC
934
        LD L,A
935
        CALL SETENBS
936
        XOR A
937
        LD (IX-12+CHP.PsInOr),A
938
        LD (IY-100+VRS.CurEDel),A
939
        LD H,A
940
        LD L,A
941
        JP SETESLD
942
 
943
SETORN  ADD A,A
944
        LD E,A
945
        LD D,0
946
        LD (IX-12+CHP.PsInOr),D
947
        LD L,(IY-100+VRS.OrnPtrs)
948
        LD H,(IY-100+VRS.OrnPtrs+1)
949
        ADD HL,DE
950
        LD E,(HL)
951
        INC HL
952
        LD D,(HL)
953
        LD L,(IY-100+VRS.MODADDR)
954
        LD H,(IY-100+VRS.MODADDR+1)
955
        ADD HL,DE
956
        LD (IX-12+CHP.OrnPtr),L
957
        LD (IX-12+CHP.OrnPtr+1),H
958
C_NOP   RET
959
 
960
SETSAM  ADD A,A
961
        LD E,A
962
        LD D,0
963
        LD L,(IY-100+VRS.SamPtrs);
964
        LD H,(IY-100+VRS.SamPtrs+1);
965
        ADD HL,DE
966
        LD E,(HL)
967
        INC HL
968
        LD D,(HL)
969
        LD L,(IY-100+VRS.MODADDR)
970
        LD H,(IY-100+VRS.MODADDR+1)
971
        ADD HL,DE
972
        LD (IX-12+CHP.SamPtr),L
973
        LD (IX-12+CHP.SamPtr+1),H
974
        RET
975
 
976
;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
977
SPCCOMS DW C_NOP
978
        DW C_GLISS
979
        DW C_PORTM
980
        DW C_SMPOS
981
        DW C_ORPOS
982
        DW C_VIBRT
983
        DW C_NOP
984
        DW C_NOP
985
        DW C_ENGLS
986
        DW C_DELAY
987
        DW C_NOP
988
        DW C_NOP
989
        DW C_NOP
990
        DW C_NOP
991
        DW C_NOP
992
        DW C_NOP
993
 
994
CHREGS  CALL GETIX
995
        XOR A
996
        LD (Ampl),A
997
        BIT 0,(IX+CHP.Flags)
998
        PUSH HL
999
        JP Z,CH_EXIT
1000
        LD (CSP_+1),SP
1001
        LD L,(IX+CHP.OrnPtr)
1002
        LD H,(IX+CHP.OrnPtr+1)
1003
        LD SP,HL
1004
        POP DE
1005
        LD H,A
1006
        LD A,(IX+CHP.PsInOr)
1007
        LD L,A
1008
        ADD HL,SP
1009
        INC A
1010
                ;PT2    PT3
1011
OrnCP   INC A   ;CP E   CP D
1012
        JR C,CH_ORPS
1013
OrnLD   DB 1    ;LD A,D LD A,E
1014
CH_ORPS LD (IX+CHP.PsInOr),A
1015
        LD A,(IX+CHP.Note)
1016
        ADD A,(HL)
1017
        JP P,CH_NTP
1018
        XOR A
1019
CH_NTP  CP 96
1020
        JR C,CH_NOK
1021
        LD A,95
1022
CH_NOK  ADD A,A
1023
        EX AF,AF'
1024
        LD L,(IX+CHP.SamPtr)
1025
        LD H,(IX+CHP.SamPtr+1)
1026
        LD SP,HL
1027
        POP DE
1028
        LD H,0
1029
        LD A,(IX+CHP.PsInSm)
1030
        LD B,A
1031
        ADD A,A
1032
SamClc2 ADD A,A ;or ADD A,B for PT2
1033
        LD L,A
1034
        ADD HL,SP
1035
        LD SP,HL
1036
        LD A,B
1037
        INC A
1038
                ;PT2    PT3
1039
SamCP   INC A   ;CP E   CP D
1040
        JR C,CH_SMPS
1041
SamLD   DB 1    ;LD A,D LD A,E
1042
CH_SMPS LD (IX+CHP.PsInSm),A
1043
        POP BC
1044
        POP HL
1045
 
1046
;Convert PT2 sample to PT3
1047
                ;PT2            PT3
1048
SamCnv  POP HL  ;BIT 2,C        JR e_
1049
        POP HL 
1050
        LD H,B
1051
        JR NZ,$+8
1052
        EX DE,HL
1053
        AND A
1054
        SBC HL,HL
1055
        SBC HL,DE
1056
        LD D,C
1057
        RR C
1058
        SBC A,A
1059
        CPL
1060
        AND #3E
1061
        RR C
1062
        RR B
1063
        AND C
1064
        LD C,A
1065
        LD A,B
1066
        RRA
1067
        RRA
1068
        RR D
1069
        RRA
1070
        AND #9F
1071
        LD B,A
1072
 
1073
e_      LD E,(IX+CHP.TnAcc)
1074
        LD D,(IX+CHP.TnAcc+1)
1075
        ADD HL,DE
1076
        BIT 6,B
1077
        JR Z,CH_NOAC
1078
        LD (IX+CHP.TnAcc),L
1079
        LD (IX+CHP.TnAcc+1),H
1080
CH_NOAC EX DE,HL
1081
        EX AF,AF'
1082
        ADD A,NT_&#ff
1083
        LD L,A
1084
        ADC A,NT_/256
1085
        SUB L
1086
        LD H,A
1087
        LD SP,HL
1088
        POP HL
1089
        ADD HL,DE
1090
        LD E,(IX+CHP.CrTnSl)
1091
        LD D,(IX+CHP.CrTnSl+1)
1092
        ADD HL,DE
1093
CSP_    LD SP,#3131
1094
        EX (SP),HL
1095
        XOR A
1096
        OR (IX+CHP.TSlCnt)
1097
        JR Z,CH_AMP
1098
        DEC (IX+CHP.TSlCnt)
1099
        JR NZ,CH_AMP
1100
        LD A,(IX+CHP.TnSlDl)
1101
        LD (IX+CHP.TSlCnt),A
1102
        LD L,(IX+CHP.TSlStp)
1103
        LD H,(IX+CHP.TSlStp+1)
1104
        LD A,H
1105
        ADD HL,DE
1106
        LD (IX+CHP.CrTnSl),L
1107
        LD (IX+CHP.CrTnSl+1),H
1108
        BIT 2,(IX+CHP.Flags)
1109
        JR NZ,CH_AMP
1110
        LD E,(IX+CHP.TnDelt)
1111
        LD D,(IX+CHP.TnDelt+1)
1112
        AND A
1113
        JR Z,CH_STPP
1114
        EX DE,HL
1115
CH_STPP SBC HL,DE
1116
        JP M,CH_AMP
1117
        LD A,(IX+CHP.SlToNt)
1118
        LD (IX+CHP.Note),A
1119
        XOR A
1120
        LD (IX+CHP.TSlCnt),A
1121
        LD (IX+CHP.CrTnSl),A
1122
        LD (IX+CHP.CrTnSl+1),A
1123
CH_AMP  LD A,(IX+CHP.CrAmSl)
1124
        BIT 7,C
1125
        JR Z,CH_NOAM
1126
        BIT 6,C
1127
        JR Z,CH_AMIN
1128
        CP 15
1129
        JR Z,CH_NOAM
1130
        INC A
1131
        JR CH_SVAM
1132
CH_AMIN CP -15
1133
        JR Z,CH_NOAM
1134
        DEC A
1135
CH_SVAM LD (IX+CHP.CrAmSl),A
1136
CH_NOAM LD L,A
1137
        LD A,B
1138
        AND 15
1139
        ADD A,L
1140
        JP P,CH_APOS
1141
        XOR A
1142
CH_APOS CP 16
1143
        JR C,CH_VOL
1144
        LD A,15
1145
CH_VOL  OR (IX+CHP.Volume)
1146
        ADD A,VT_&#ff
1147
        LD L,A
1148
        ADC A,VT_/256
1149
        SUB L
1150
        LD H,A
1151
        LD A,(HL)
1152
CH_ENV  BIT 0,C
1153
        JR NZ,CH_NOEN
1154
        OR (IX+CHP.Env_En)
1155
CH_NOEN LD (Ampl),A
1156
        BIT 7,B
1157
        LD A,C
1158
        JR Z,NO_ENSL
1159
        RLA
1160
        RLA
1161
        SRA A
1162
        SRA A
1163
        SRA A
1164
        ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW
1165
        BIT 5,B
1166
        JR Z,NO_ENAC
1167
        LD (IX+CHP.CrEnSl),A
1168
NO_ENAC ADD A,(IY-100+VRS.AddToEn) ;BUG IN PT3 - NEED WORD HERE
1169
        LD (IY-100+VRS.AddToEn),A
1170
        JR CH_MIX
1171
NO_ENSL RRA
1172
        ADD A,(IX+CHP.CrNsSl)
1173
        LD (IY-100+VRS.AddToNs),A
1174
        BIT 5,B
1175
        JR Z,CH_MIX
1176
        LD (IX+CHP.CrNsSl),A
1177
CH_MIX  LD A,B
1178
        RRA
1179
        AND #48
1180
CH_EXIT OR (IY-100+VRS.AYREGS+Mixer)
1181
        RRCA
1182
        LD (IY-100+VRS.AYREGS+Mixer),A
1183
        POP HL
1184
        XOR A
1185
        OR (IX+CHP.COnOff)
1186
        RET Z
1187
        DEC (IX+CHP.COnOff)
1188
        RET NZ
1189
        XOR (IX+CHP.Flags)
1190
        LD (IX+CHP.Flags),A
1191
        RRA
1192
        LD A,(IX+CHP.OnOffD)
1193
        JR C,CH_ONDL
1194
        LD A,(IX+CHP.OffOnD)
1195
CH_ONDL LD (IX+CHP.COnOff),A
1196
        RET
1197
 
1198
PLAY_   XOR A
1199
        LD (IY-100+VRS.AddToEn),A
1200
        LD (IY-100+VRS.AYREGS+Mixer),A
1201
        DEC A
1202
        LD (IY-100+VRS.AYREGS+EnvTp),A
1203
        DEC (IY-100+VRS.DelyCnt)
1204
        JP NZ,PL2
1205
        DEC (IY-100+VRS.ChanA+CHP.NtSkCn)
1206
        JR NZ,PL1B
1207
        LD C,(IY-100+VRS.AdInPtA)
1208
        LD B,(IY-100+VRS.AdInPtA+1)
1209
        LD A,(BC)
1210
        AND A
1211
        JR NZ,PL1A
1212
        LD D,A
1213
        LD (IY-100+VRS.Ns_Base),A
1214
        LD L,(IY-100+VRS.CrPsPtr)
1215
        LD H,(IY-100+VRS.CrPsPtr+1)
1216
        INC HL
1217
        LD A,(HL)
1218
        INC A
1219
        JR NZ,PLNLP
1220
 
1221
        IF LoopChecker
1222
        CALL CHECKLP
1223
        ENDIF
1224
 
1225
        LD L,(IY-100+VRS.LPosPtr)
1226
        LD H,(IY-100+VRS.LPosPtr+1)
1227
        LD A,(HL)
1228
        INC A
1229
PLNLP   CALL SETCPPT
1230
        DEC A
1231
        BIT 1,(IY-100+VRS.ModNum)
1232
        JR Z,NoAlCo
1233
TSSub   EQU $+1
1234
        SUB #D6
1235
        CPL
1236
NoAlCo
1237
                ;PT2            PT3
1238
PsCalc  DEC A   ;ADD A,A        NOP
1239
        DEC A   ;ADD A,(HL)     NOP
1240
        ADD A,A
1241
        LD E,A
1242
        RL D
1243
 
1244
        IF CurPosCounter
1245
        LD A,L
1246
        SUB (IY-100+VRS.PosSub)
1247
        LD (IY-100+VRS.CurPos),A
1248
        ENDIF
1249
 
1250
        LD L,(IY-100+VRS.PatsPtr)
1251
        LD H,(IY-100+VRS.PatsPtr+1)
1252
        ADD HL,DE
1253
        LD E,(IY-100+VRS.MODADDR)
1254
        LD D,(IY-100+VRS.MODADDR+1)
1255
        LD (PSP_+1),SP
1256
        LD SP,HL
1257
        POP HL
1258
        ADD HL,DE
1259
        LD B,H
1260
        LD C,L
1261
        POP HL
1262
        ADD HL,DE
1263
        LD (IY-100+VRS.AdInPtB),L
1264
        LD (IY-100+VRS.AdInPtB+1),H
1265
        POP HL
1266
        ADD HL,DE
1267
        LD (IY-100+VRS.AdInPtC),L
1268
        LD (IY-100+VRS.AdInPtC+1),H
1269
PSP_    LD SP,#3131
1270
PL1A    LD DE,VRS.ChanA+12-100
1271
        CALL PTDECOD
1272
        LD (IY-100+VRS.AdInPtA),C
1273
        LD (IY-100+VRS.AdInPtA+1),B
1274
 
1275
PL1B    DEC (IY-100+VRS.ChanB+CHP.NtSkCn)
1276
        JR NZ,PL1C
1277
        LD DE,VRS.ChanB+12-100
1278
        LD C,(IY-100+VRS.AdInPtB)
1279
        LD B,(IY-100+VRS.AdInPtB+1)
1280
        CALL PTDECOD
1281
        LD (IY-100+VRS.AdInPtB),C
1282
        LD (IY-100+VRS.AdInPtB+1),B
1283
 
1284
PL1C    DEC (IY-100+VRS.ChanC+CHP.NtSkCn)
1285
        JR NZ,PL1D
1286
        LD DE,VRS.ChanC+12-100
1287
        LD C,(IY-100+VRS.AdInPtC)
1288
        LD B,(IY-100+VRS.AdInPtC+1)
1289
        CALL PTDECOD
1290
        LD (IY-100+VRS.AdInPtC),C
1291
        LD (IY-100+VRS.AdInPtC+1),B
1292
 
1293
PL1D    LD A,(IY-100+VRS.Delay)
1294
        LD (IY-100+VRS.DelyCnt),A
1295
 
1296
PL2     LD DE,VRS.ChanA-100
1297
        LD L,(IY-100+VRS.AYREGS+TonA)
1298
        LD H,(IY-100+VRS.AYREGS+TonA+1)
1299
        CALL CHREGS
1300
        LD (IY-100+VRS.AYREGS+TonA),L
1301
        LD (IY-100+VRS.AYREGS+TonA+1),H
1302
Ampl    EQU $+1
1303
        LD A,#3E
1304
        LD (IY-100+VRS.AYREGS+AmplA),A
1305
        LD DE,VRS.ChanB-100
1306
        LD L,(IY-100+VRS.AYREGS+TonB)
1307
        LD H,(IY-100+VRS.AYREGS+TonB+1)
1308
        CALL CHREGS
1309
        LD (IY-100+VRS.AYREGS+TonB),L
1310
        LD (IY-100+VRS.AYREGS+TonB+1),H
1311
        LD A,(Ampl)
1312
        LD (IY-100+VRS.AYREGS+AmplB),A
1313
        LD DE,VRS.ChanC-100
1314
        LD L,(IY-100+VRS.AYREGS+TonC)
1315
        LD H,(IY-100+VRS.AYREGS+TonC+1)
1316
        CALL CHREGS
1317
        LD (IY-100+VRS.AYREGS+TonC),L
1318
        LD (IY-100+VRS.AYREGS+TonC+1),H
1319
        LD A,(Ampl)
1320
        LD (IY-100+VRS.AYREGS+AmplC),A
1321
 
1322
        LD A,(IY-100+VRS.Ns_Base)
1323
        ADD (IY-100+VRS.AddToNs)
1324
        LD (IY-100+VRS.AYREGS+Noise),A
1325
 
1326
        LD A,(IY-100+VRS.AddToEn)
1327
        LD E,A
1328
        ADD A,A
1329
        SBC A,A
1330
        LD D,A
1331
        LD L,(IY-100+VRS.EnvBase)
1332
        LD H,(IY-100+VRS.EnvBase+1)
1333
        ADD HL,DE
1334
        LD E,(IY-100+VRS.CurESld)
1335
        LD D,(IY-100+VRS.CurESld+1)
1336
        ADD HL,DE
1337
        LD (IY-100+VRS.AYREGS+Env),L
1338
        LD (IY-100+VRS.AYREGS+Env+1),H
1339
 
1340
        XOR A
1341
        OR (IY-100+VRS.CurEDel)
1342
        RET Z
1343
        DEC (IY-100+VRS.CurEDel)
1344
        RET NZ
1345
        LD A,(IY-100+VRS.Env_Del)
1346
        LD (IY-100+VRS.CurEDel),A
1347
        LD L,(IY-100+VRS.ESldAdd)
1348
        LD H,(IY-100+VRS.ESldAdd+1)
1349
        ADD HL,DE
1350
        JP SETESLD
1351
 
1352
PLAY    LD IY,VARS1+100
1353
        CALL PLAY_
1354
        LD A,(is_ts)
1355
        AND A
1356
        JR Z,PL_nts
1357
        LD IY,VARS2+100
1358
        CALL PLAY_
1359
PL_nts
1360
        IF Basic
1361
        LD IY,#5C3A
1362
        ENDIF
1363
 
1364
ROUT    LD BC,#FFFD
1365
        LD A,(is_ts)
1366
        AND A
1367
        JR Z,r_nts ;keep old standard
1368
        OUT (C),B
1369
r_nts   EX AF,AF'
1370
 
1371
        IF ACBBAC
1372
        LD IX,VARS1+VRS.AYREGS
1373
        ELSE
1374
        LD HL,VARS1+VRS.AYREGS
1375
        ENDIF
1376
 
1377
        CALL ROUT_
1378
        EX AF,AF'
1379
        RET Z
1380
        LD B,D
1381
        CPL
1382
        OUT (C),A
1383
 
1384
        IF ACBBAC
1385
        LD IX,VARS2+VRS.AYREGS
1386
        ELSE
1387
        LD HL,VARS2+VRS.AYREGS
1388
        ENDIF
1389
 
1390
ROUT_
1391
        IF ACBBAC
1392
        LD A,(SETUP)
1393
        AND 12
1394
        JR Z,ABC
1395
        ADD A,CHTABLE
1396
        LD E,A
1397
        ADC A,CHTABLE/256
1398
        SUB E
1399
        LD D,A
1400
        LD B,0
1401
        PUSH IX
1402
        POP HL
1403
        LD A,(DE)
1404
        INC DE
1405
        LD C,A
1406
        ADD HL,BC
1407
        LD A,(IX+TonB)
1408
        LD C,(HL)
1409
        LD (IX+TonB),C
1410
        LD (HL),A
1411
        INC HL
1412
        LD A,(IX+TonB+1)
1413
        LD C,(HL)
1414
        LD (IX+TonB+1),C
1415
        LD (HL),A
1416
        LD A,(DE)
1417
        INC DE
1418
        LD C,A
1419
        ADD HL,BC
1420
        LD A,(IX+AmplB)
1421
        LD C,(HL)
1422
        LD (IX+AmplB),C
1423
        LD (HL),A
1424
        LD A,(DE)
1425
        INC DE
1426
        LD (RxCA1),A
1427
        XOR 8
1428
        LD (RxCA2),A
1429
        LD A,(DE)
1430
        AND (IX+Mixer)
1431
        LD E,A
1432
        LD A,(IX+Mixer)
1433
RxCA1   DB #E6
1434
        AND %010010
1435
        OR E
1436
        LD E,A
1437
        LD A,(IX+Mixer)
1438
        AND %010010
1439
RxCA2   OR E
1440
        OR E
1441
        LD (IX+Mixer),A
1442
ABC
1443
        ENDIF
1444
 
1445
        XOR A
1446
        LD DE,#FFBF
1447
 
1448
        IF ACBBAC
1449
        LD BC,#FFFD
1450
        PUSH IX
1451
        POP HL
1452
        ENDIF
1453
 
1454
LOUT    OUT (C),A
1455
        LD B,E
1456
        OUTI
1457
        LD B,D
1458
        INC A
1459
        CP 13
1460
        JR NZ,LOUT
1461
        OUT (C),A
1462
        LD A,(HL)
1463
        AND A
1464
        RET M
1465
        LD B,E
1466
        OUT (C),A
1467
        RET
1468
 
1469
        IF ACBBAC
1470
CHTABLE EQU $-4
1471
        DB 4,5,15,%001001,0,7,7,%100100
1472
        ENDIF
1473
 
1474
NT_DATA DB (T_NEW_0-T1_)*2
1475
        DB TCNEW_0-T_
1476
        DB (T_OLD_0-T1_)*2+1
1477
        DB TCOLD_0-T_
1478
        DB (T_NEW_1-T1_)*2+1
1479
        DB TCNEW_1-T_
1480
        DB (T_OLD_1-T1_)*2+1
1481
        DB TCOLD_1-T_
1482
        DB (T_NEW_2-T1_)*2
1483
        DB TCNEW_2-T_
1484
        DB (T_OLD_2-T1_)*2
1485
        DB TCOLD_2-T_
1486
        DB (T_NEW_3-T1_)*2
1487
        DB TCNEW_3-T_
1488
        DB (T_OLD_3-T1_)*2
1489
        DB TCOLD_3-T_
1490
 
1491
T_
1492
 
1493
TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
1494
        DB #18+1,#24+1,#3C+1,0
1495
TCOLD_1 DB #5C+1,0
1496
TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
1497
        DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
1498
TCNEW_3 DB #56+1
1499
TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
1500
TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
1501
        DB #BC+1,#BE+1,0
1502
TCNEW_1 EQU TCOLD_1
1503
TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
1504
        DB #BA+1,#BC+1,#BE+1,0
1505
 
1506
PT3EMPTYORN EQU $-1
1507
        DB 1,0
1508
 
1509
;first 12 values of tone tables (packed)
1510
 
1511
T_PACK  DB #06EC*2/256,(#06EC*2)&#ff
1512
        DB #0755-#06EC
1513
        DB #07C5-#0755
1514
        DB #083B-#07C5
1515
        DB #08B8-#083B
1516
        DB #093D-#08B8
1517
        DB #09CA-#093D
1518
        DB #0A5F-#09CA
1519
        DB #0AFC-#0A5F
1520
        DB #0BA4-#0AFC
1521
        DB #0C55-#0BA4
1522
        DB #0D10-#0C55
1523
        DB #066D*2/256,(#066D*2)&#ff
1524
        DB #06CF-#066D
1525
        DB #0737-#06CF
1526
        DB #07A4-#0737
1527
        DB #0819-#07A4
1528
        DB #0894-#0819
1529
        DB #0917-#0894
1530
        DB #09A1-#0917
1531
        DB #0A33-#09A1
1532
        DB #0ACF-#0A33
1533
        DB #0B73-#0ACF
1534
        DB #0C22-#0B73
1535
        DB #0CDA-#0C22
1536
        DB #0704*2/256,(#0704*2)&#ff
1537
        DB #076E-#0704
1538
        DB #07E0-#076E
1539
        DB #0858-#07E0
1540
        DB #08D6-#0858
1541
        DB #095C-#08D6
1542
        DB #09EC-#095C
1543
        DB #0A82-#09EC
1544
        DB #0B22-#0A82
1545
        DB #0BCC-#0B22
1546
        DB #0C80-#0BCC
1547
        DB #0D3E-#0C80
1548
        DB #07E0*2/256,(#07E0*2)&#ff
1549
        DB #0858-#07E0
1550
        DB #08E0-#0858
1551
        DB #0960-#08E0
1552
        DB #09F0-#0960
1553
        DB #0A88-#09F0
1554
        DB #0B28-#0A88
1555
        DB #0BD8-#0B28
1556
        DB #0C80-#0BD8
1557
        DB #0D60-#0C80
1558
        DB #0E10-#0D60
1559
        DB #0EF8-#0E10
1560
 
1561
;vars from here can be stripped
1562
;you can move VARS to any other address
1563
 
1564
VARS
1565
 
1566
is_ts   DB 0
1567
 
1568
;ChannelsVars
1569
        STRUCT  CHP
1570
;reset group
1571
PsInOr  DB 0
1572
PsInSm  DB 0
1573
CrAmSl  DB 0
1574
CrNsSl  DB 0
1575
CrEnSl  DB 0
1576
TSlCnt  DB 0
1577
CrTnSl  DW 0
1578
TnAcc   DW 0
1579
COnOff  DB 0
1580
;reset group
1581
 
1582
OnOffD  DB 0
1583
 
1584
;IX for PTDECOD here (+12)
1585
OffOnD  DB 0
1586
OrnPtr  DW 0
1587
SamPtr  DW 0
1588
NNtSkp  DB 0
1589
Note    DB 0
1590
SlToNt  DB 0
1591
Env_En  DB 0
1592
Flags   DB 0
1593
 ;Enabled - 0, SimpleGliss - 2
1594
TnSlDl  DB 0
1595
TSlStp  DW 0
1596
TnDelt  DW 0
1597
NtSkCn  DB 0
1598
Volume  DB 0
1599
        ENDS
1600
 
1601
        STRUCT  VRS
1602
 
1603
;IF not works in STRUCT in SjASM :(
1604
;       IF CurPosCounter
1605
CurPos  DB 0
1606
PosSub  DB 0
1607
;       ENDIF
1608
 
1609
ModNum  DB 0 ;bit0: ChipNum
1610
             ;bit1: 1-reversed patterns order (AlCo TS)
1611
 
1612
ChanA   DS CHP
1613
ChanB   DS CHP
1614
ChanC   DS CHP
1615
 
1616
;GlobalVars
1617
MODADDR DW 0
1618
OrnPtrs DW 0
1619
SamPtrs DW 0
1620
PatsPtr DW 0
1621
AdInPtA DW 0
1622
AdInPtB DW 0
1623
AdInPtC DW 0
1624
CrPsPtr DW 0
1625
LPosPtr DW 0
1626
Delay   DB 0
1627
DelyCnt DB 0
1628
ESldAdd DW 0
1629
CurESld DW 0
1630
Env_Del DB 0
1631
CurEDel DB 0
1632
Ns_Base DB 0
1633
AddToNs DB 0
1634
AddToEn DB 0
1635
EnvBase DW 0
1636
AYREGS  DS 14
1637
        ENDS
1638
 
1639
VARS1   DS VRS
1640
VARS2   DS VRS
1641
 
1642
VT_     EQU $-16
1643
        DS 256-16 ;CreatedVolumeTableAddress
1644
 
1645
T1_     EQU VT_+16 ;Tone tables data depacked here
1646
 
1647
T_OLD_1 EQU T1_
1648
T_OLD_2 EQU T_OLD_1+24
1649
T_OLD_3 EQU T_OLD_2+24
1650
T_OLD_0 EQU T_OLD_3+2
1651
T_NEW_0 EQU T_OLD_0
1652
T_NEW_1 EQU T_OLD_1
1653
T_NEW_2 EQU T_NEW_0+24
1654
T_NEW_3 EQU T_OLD_3
1655
 
1656
PT2EMPTYORN EQU VT_+31 ;1,0,0 sequence
1657
 
1658
NT_     DS 192 ;CreatedNoteTableAddress
1659
 
1660
VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1
1661
 
1662
VARSEND EQU $
1663
 
1664
;MDLADDR EQU $
1665
 
1666
;Release 0 steps:
1667
;04/21/2007
1668
;Works start (PTxPlay adaptation); first beta.
1669
;04/22/2007
1670
;Job finished; beta-testing.
1671
;04/23/2007
1672
;PT v3.7 TS mode corrected (after AlCo remarks).
1673
;04/29/2007
1674
;Added 1.XX and 2.XX special commands interpretation for PT3
1675
;modules of v3.7+.
1676
 
1677
;Size (minimal build for ZX Spectrum):
1678
;Code block #908 bytes
1679
;Variables #2BF bytes (can be stripped)
1680
;Total size #908+#2BF=#BC7 (3015) bytes