dsforth: moved 8x8 printer to separate include (and made it configurable); added...
[urasm.git] / samples / pt3player / pt3plr.zas
blob88c1f9383b8e5a18507c87bbca817a859eda6720
1 ;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
2 ;(c)2004,2007 S.V.Bulba <vorobey@mail.khstu.ru>
3 ;http://bulba.untergrund.net (http://bulba.at.kz)
5   MODULE PT3Player
6 ;Call MUTE or INIT one more time to mute sound after stopping
7 ;playing
9         ;ORG #C000
11 ;Test codes (commented)
12 ;       CALL START
13 ;       EI
14 ;_LP    HALT
15 ;       CALL START+5
16 ;       XOR A
17 ;       IN A,(#FE)
18 ;       CPL
19 ;       AND 15
20 ;       JR Z,_LP
21 ;       JR START+8
23 TonA    EQU 0
24 TonB    EQU 2
25 TonC    EQU 4
26 Noise   EQU 6
27 Mixer   EQU 7
28 AmplA   EQU 8
29 AmplB   EQU 9
30 AmplC   EQU 10
31 Env     EQU 11
32 EnvTp   EQU 13
34 ;Entry and other points
35 ;START initialization
36 ;START+3 initialization with module address in HL
37 ;START+5 play one quark
38 ;START+8 mute
39 ;START+10 setup and status flags
40 ;START+11 pointer to current position value in PT3 module;
41 ;After INIT (START+11) points to Postion0-1 (optimization)
43 ;START
44 ;        LD HL,MDLADDR
45 InitHL:
46         JR INIT
48 PlayOneRow:
49         JP PLAY
51 Mute:
52         JR MUTE
54 SetLoopOn:
55         PUSH HL
56         LD   HL,SetupFlags
57         RES  0,(HL)
58         POP  HL
59         RET
61 SetLoopOff:
62         PUSH HL
63         LD   HL,SetupFlags
64         SET  0,(HL)
65         POP  HL
66         RET
68 GetLoopMode:  ; NZ: looping disabled
69         PUSH HL
70         LD   HL,SetupFlags
71         BIT  0,(HL)
72         POP  HL
73         RET
75 IsLoopPassed: ; NZ: yes
76         PUSH HL
77         LD   HL,SetupFlags
78         BIT  7,(HL)
79         POP  HL
80         RET
82 ResetLoopPassed:
83         PUSH HL
84         LD   HL,SetupFlags
85         RES  7,(HL)
86         POP  HL
87         RET
89 SetupFlags   DB 0 ;set bit0 to 1, if you want to play without looping
90              ;bit7 is set each time, when loop point is passed
91 CrPsPtr DW 0
93 CHECKLP LD HL,SetupFlags
94         SET 7,(HL)
95         BIT 0,(HL)
96         RET Z
97         POP HL
98         LD HL,DelyCnt
99         INC (HL)
100         LD HL,ChanA+CHP.NtSkCn
101         INC (HL)
102 MUTE    XOR A
103         LD H,A
104         LD L,A
105         LD (AYREGS+AmplA),A
106         LD (AYREGS+AmplB),HL
107         JP ROUT_A0
109 INIT
110 ;HL - AddressOfModule
112         LD (MODADDR),HL
113         LD (MDADDR2),HL
114         PUSH HL
115         LD DE,100
116         ADD HL,DE
117         LD A,(HL)
118         LD (Delay),A
119         PUSH HL
120         POP IX
121         ADD HL,DE
122         LD (CrPsPtr),HL
123         LD E,(IX+102-100)
124         ADD HL,DE
125         INC HL
126         LD (LPosPtr),HL
127         POP DE
128         LD L,(IX+103-100)
129         LD H,(IX+104-100)
130         ADD HL,DE
131         LD (PatsPtr),HL
132         LD HL,169
133         ADD HL,DE
134         LD (OrnPtrs),HL
135         LD HL,105
136         ADD HL,DE
137         LD (SamPtrs),HL
138         LD HL,SetupFlags
139         RES 7,(HL)
141 ;note table data depacker
142         LD DE,T_PACK
143         LD BC,T1_+(2*49)-1
144 TP_0    LD A,(DE)
145         INC DE
146         CP 15*2
147         JR NC,TP_1
148         LD H,A
149         LD A,(DE)
150         LD L,A
151         INC DE
152         JR TP_2
153 TP_1    PUSH DE
154         LD D,0
155         LD E,A
156         ADD HL,DE
157         ADD HL,DE
158         POP DE
159 TP_2    LD A,H
160         LD (BC),A
161         DEC BC
162         LD A,L
163         LD (BC),A
164         DEC BC
165         SUB 0+(#F8*2)%256
166         JR NZ,TP_0
168         LD HL,VARS
169         LD (HL),A
170         LD DE,VARS+1
171         LD BC,VAR0END-VARS-1
172         LDIR
173         INC A
174         LD (DelyCnt),A
175         LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn
176         LD (ChanA+CHP.NtSkCn),HL
177         LD (ChanB+CHP.NtSkCn),HL
178         LD (ChanC+CHP.NtSkCn),HL
180         LD HL,EMPTYSAMORN
181         LD (AdInPtA),HL ;ptr to zero
182         LD (ChanA+CHP.OrnPtr),HL ;ornament 0 is "0,1,0"
183         LD (ChanB+CHP.OrnPtr),HL ;in all versions from
184         LD (ChanC+CHP.OrnPtr),HL ;3.xx to 3.6x and VTII
186         LD (ChanA+CHP.SamPtr),HL ;S1 There is no default
187         LD (ChanB+CHP.SamPtr),HL ;S2 sample in PT3, so, you
188         LD (ChanC+CHP.SamPtr),HL ;S3 can comment S1,2,3; see
189                                     ;also EMPTYSAMORN comment
191         LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
192         SUB #30
193         JR C,L20
194         CP 10
195         JR C,L21
196 L20     LD A,6
197 L21     LD (Version),A
198         PUSH AF
199         CP 4
200         LD A,(IX+99-100) ;TONE TABLE NUMBER
201         RLA
202         AND 7
204 ;NoteTableCreator (c) Ivan Roshin
205 ;A - NoteTableNumber*2+VersionForNoteTable
206 ;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
208         LD HL,NT_DATA
209         PUSH DE
210         LD D,B
211         ADD A,A
212         LD E,A
213         ADD HL,DE
214         LD E,(HL)
215         INC HL
216         SRL E
217         SBC A,A
218         AND #A7 ;#00 (NOP) or #A7 (AND A)
219         LD (L3),A
220         EX DE,HL
221         POP BC ;BC=T1_
222         ADD HL,BC
224         LD A,(DE)
225         ADD A,T_%256
226         LD C,A
227         ADC A,T_/256
228         SUB C
229         LD B,A
230         PUSH BC
231         LD DE,NT_
232         PUSH DE
234         LD B,12
235 L1      PUSH BC
236         LD C,(HL)
237         INC HL
238         PUSH HL
239         LD B,(HL)
241         PUSH DE
242         EX DE,HL
243         LD DE,23
244         LD IXH,8
246 L2      SRL B
247         RR C
248 L3      DB #19  ;AND A or NOP
249         LD A,C
250         ADC A,D ;=ADC 0
251         LD (HL),A
252         INC HL
253         LD A,B
254         ADC A,D
255         LD (HL),A
256         ADD HL,DE
257         DEC IXH
258         JR NZ,L2
260         POP DE
261         INC DE
262         INC DE
263         POP HL
264         INC HL
265         POP BC
266         DJNZ L1
268         POP HL
269         POP DE
271         LD A,E
272         CP TCOLD_1%256
273         JR NZ,CORR_1
274         LD A,#FD
275         LD (NT_+#2E),A
277 CORR_1  LD A,(DE)
278         AND A
279         JR Z,TC_EXIT
280         RRA
281         PUSH AF
282         ADD A,A
283         LD C,A
284         ADD HL,BC
285         POP AF
286         JR NC,CORR_2
287         DEC (HL)
288         DEC (HL)
289 CORR_2  INC (HL)
290         AND A
291         SBC HL,BC
292         INC DE
293         JR CORR_1
295 TC_EXIT
297         POP AF
299 ;VolTableCreator (c) Ivan Roshin
300 ;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
301                            ;5.. - 3.5x..3.6x..VTII1.0)
303         CP 5
304         LD HL,#11
305         LD D,H
306         LD E,H
307         LD A,#17
308         JR NC,M1
309         DEC L
310         LD E,L
311         XOR A
312 M1      LD (M2),A
314         LD IX,VT_+16
315         LD C,#10
317 INITV2  PUSH HL
319         ADD HL,DE
320         EX DE,HL
321         SBC HL,HL
323 INITV1  LD A,L
324 M2      DB #7D
325         LD A,H
326         ADC A,0
327         LD (IX),A
328         INC IX
329         ADD HL,DE
330         INC C
331         LD A,C
332         AND 15
333         JR NZ,INITV1
335         POP HL
336         LD A,E
337         CP #77
338         JR NZ,M3
339         INC E
340 M3      LD A,C
341         AND A
342         JR NZ,INITV2
344         JP ROUT_A0
346 ;pattern decoder
347 PD_OrSm LD (IX-12+CHP.Env_En),0
348         CALL SETORN
349         LD A,(BC)
350         INC BC
351         RRCA
353 PD_SAM  ADD A,A
354 PD_SAM_ LD E,A
355         LD D,0
356 SamPtrs EQU $+1
357         LD HL,#2121
358         ADD HL,DE
359         LD E,(HL)
360         INC HL
361         LD D,(HL)
362 MODADDR EQU $+1
363         LD HL,#2121
364         ADD HL,DE
365         LD (IX-12+CHP.SamPtr),L
366         LD (IX-12+CHP.SamPtr+1),H
367         JR PD_LOOP
369 PD_VOL  RLCA
370         RLCA
371         RLCA
372         RLCA
373         LD (IX-12+CHP.Volume),A
374         JR PD_LP2
376 PD_EOff LD (IX-12+CHP.Env_En),A
377         LD (IX-12+CHP.PsInOr),A
378         JR PD_LP2
380 PD_SorE DEC A
381         JR NZ,PD_ENV
382         LD A,(BC)
383         INC BC
384         LD (IX-12+CHP.NNtSkp),A
385         JR PD_LP2
387 PD_ENV  CALL SETENV
388         JR PD_LP2
390 PD_ORN  CALL SETORN
391         JR PD_LOOP
393 PD_ESAM LD (IX-12+CHP.Env_En),A
394         LD (IX-12+CHP.PsInOr),A
395         CALL NZ,SETENV
396         LD A,(BC)
397         INC BC
398         JR PD_SAM_
400 PTDECOD LD A,(IX-12+CHP.Note)
401         LD (PrNote+1),A
402         LD L,(IX-12+CHP.CrTnSl)
403         LD H,(IX-12+CHP.CrTnSl+1)
404         LD (PrSlide+1),HL
406 PD_LOOP LD DE,#2010
407 PD_LP2  LD A,(BC)
408         INC BC
409         ADD A,E
410         JR C,PD_OrSm
411         ADD A,D
412         JR Z,PD_FIN
413         JR C,PD_SAM
414         ADD A,E
415         JR Z,PD_REL
416         JR C,PD_VOL
417         ADD A,E
418         JR Z,PD_EOff
419         JR C,PD_SorE
420         ADD A,96
421         JR C,PD_NOTE
422         ADD A,E
423         JR C,PD_ORN
424         ADD A,D
425         JR C,PD_NOIS
426         ADD A,E
427         JR C,PD_ESAM
428         ADD A,A
429         LD E,A
430         LD HL,0+(SPCCOMS+#FF20-#2000)&0xFFFF
431         ADD HL,DE
432         LD E,(HL)
433         INC HL
434         LD D,(HL)
435         PUSH DE
436         JR PD_LOOP
438 PD_NOIS LD (Ns_Base),A
439         JR PD_LP2
441 PD_REL  RES 0,(IX-12+CHP.Flags)
442         JR PD_RES
444 PD_NOTE LD (IX-12+CHP.Note),A
445         SET 0,(IX-12+CHP.Flags)
446         XOR A
448 PD_RES  LD (PDSP_+1),SP
449         LD SP,IX
450         LD H,A
451         LD L,A
452         PUSH HL
453         PUSH HL
454         PUSH HL
455         PUSH HL
456         PUSH HL
457         PUSH HL
458 PDSP_   LD SP,#3131
460 PD_FIN  LD A,(IX-12+CHP.NNtSkp)
461         LD (IX-12+CHP.NtSkCn),A
462         RET
464 C_PORTM RES 2,(IX-12+CHP.Flags)
465         LD A,(BC)
466         INC BC
467 ;SKIP PRECALCULATED TONE DELTA (BECAUSE
468 ;CANNOT BE RIGHT AFTER PT3 COMPILATION)
469         INC BC
470         INC BC
471         LD (IX-12+CHP.TnSlDl),A
472         LD (IX-12+CHP.TSlCnt),A
473         LD DE,NT_
474         LD A,(IX-12+CHP.Note)
475         LD (IX-12+CHP.SlToNt),A
476         ADD A,A
477         LD L,A
478         LD H,0
479         ADD HL,DE
480         LD A,(HL)
481         INC HL
482         LD H,(HL)
483         LD L,A
484         PUSH HL
485 PrNote  LD A,#3E
486         LD (IX-12+CHP.Note),A
487         ADD A,A
488         LD L,A
489         LD H,0
490         ADD HL,DE
491         LD E,(HL)
492         INC HL
493         LD D,(HL)
494         POP HL
495         SBC HL,DE
496         LD (IX-12+CHP.TnDelt),L
497         LD (IX-12+CHP.TnDelt+1),H
498         LD E,(IX-12+CHP.CrTnSl)
499         LD D,(IX-12+CHP.CrTnSl+1)
500 Version EQU $+1
501         LD A,#3E
502         CP 6
503         JR C,OLDPRTM ;Old 3xxx for PT v3.5-
504 PrSlide LD DE,#1111
505         LD (IX-12+CHP.CrTnSl),E
506         LD (IX-12+CHP.CrTnSl+1),D
507 OLDPRTM LD A,(BC) ;SIGNED TONE STEP
508         INC BC
509         EX AF,AF'
510         LD A,(BC)
511         INC BC
512         AND A
513         JR Z,NOSIG
514         EX DE,HL
515 NOSIG   SBC HL,DE
516         JP P,SET_STP
517         CPL
518         EX AF,AF'
519         NEG
520         EX AF,AF'
521 SET_STP LD (IX-12+CHP.TSlStp+1),A
522         EX AF,AF'
523         LD (IX-12+CHP.TSlStp),A
524         LD (IX-12+CHP.COnOff),0
525         RET
527 C_GLISS SET 2,(IX-12+CHP.Flags)
528         LD A,(BC)
529         INC BC
530         LD (IX-12+CHP.TnSlDl),A
531         AND A
532         JR NZ,GL36
533         LD A,(Version) ;AlCo PT3.7+
534         CP 7
535         SBC A,A
536         INC A
537 GL36    LD (IX-12+CHP.TSlCnt),A
538         LD A,(BC)
539         INC BC
540         EX AF,AF'
541         LD A,(BC)
542         INC BC
543         JR SET_STP
545 C_SMPOS LD A,(BC)
546         INC BC
547         LD (IX-12+CHP.PsInSm),A
548         RET
550 C_ORPOS LD A,(BC)
551         INC BC
552         LD (IX-12+CHP.PsInOr),A
553         RET
555 C_VIBRT LD A,(BC)
556         INC BC
557         LD (IX-12+CHP.OnOffD),A
558         LD (IX-12+CHP.COnOff),A
559         LD A,(BC)
560         INC BC
561         LD (IX-12+CHP.OffOnD),A
562         XOR A
563         LD (IX-12+CHP.TSlCnt),A
564         LD (IX-12+CHP.CrTnSl),A
565         LD (IX-12+CHP.CrTnSl+1),A
566         RET
568 C_ENGLS LD A,(BC)
569         INC BC
570         LD (Env_Del),A
571         LD (CurEDel),A
572         LD A,(BC)
573         INC BC
574         LD L,A
575         LD A,(BC)
576         INC BC
577         LD H,A
578         LD (ESldAdd),HL
579         RET
581 C_DELAY LD A,(BC)
582         INC BC
583         LD (Delay),A
584         RET
586 SETENV  LD (IX-12+CHP.Env_En),E
587         LD (AYREGS+EnvTp),A
588         LD A,(BC)
589         INC BC
590         LD H,A
591         LD A,(BC)
592         INC BC
593         LD L,A
594         LD (EnvBase),HL
595         XOR A
596         LD (IX-12+CHP.PsInOr),A
597         LD (CurEDel),A
598         LD H,A
599         LD L,A
600         LD (CurESld),HL
601 C_NOP   RET
603 SETORN  ADD A,A
604         LD E,A
605         LD D,0
606         LD (IX-12+CHP.PsInOr),D
607 OrnPtrs EQU $+1
608         LD HL,#2121
609         ADD HL,DE
610         LD E,(HL)
611         INC HL
612         LD D,(HL)
613 MDADDR2 EQU $+1
614         LD HL,#2121
615         ADD HL,DE
616         LD (IX-12+CHP.OrnPtr),L
617         LD (IX-12+CHP.OrnPtr+1),H
618         RET
620 ;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
621 SPCCOMS DW C_NOP
622         DW C_GLISS
623         DW C_PORTM
624         DW C_SMPOS
625         DW C_ORPOS
626         DW C_VIBRT
627         DW C_NOP
628         DW C_NOP
629         DW C_ENGLS
630         DW C_DELAY
631         DW C_NOP
632         DW C_NOP
633         DW C_NOP
634         DW C_NOP
635         DW C_NOP
636         DW C_NOP
638 CHREGS  XOR A
639         LD (Ampl),A
640         BIT 0,(IX+CHP.Flags)
641         PUSH HL
642         JP Z,CH_EXIT
643         LD (CSP_+1),SP
644         LD L,(IX+CHP.OrnPtr)
645         LD H,(IX+CHP.OrnPtr+1)
646         LD SP,HL
647         POP DE
648         LD H,A
649         LD A,(IX+CHP.PsInOr)
650         LD L,A
651         ADD HL,SP
652         INC A
653         CP D
654         JR C,CH_ORPS
655         LD A,E
656 CH_ORPS LD (IX+CHP.PsInOr),A
657         LD A,(IX+CHP.Note)
658         ADD A,(HL)
659         JP P,CH_NTP
660         XOR A
661 CH_NTP  CP 96
662         JR C,CH_NOK
663         LD A,95
664 CH_NOK  ADD A,A
665         EX AF,AF'
666         LD L,(IX+CHP.SamPtr)
667         LD H,(IX+CHP.SamPtr+1)
668         LD SP,HL
669         POP DE
670         LD H,0
671         LD A,(IX+CHP.PsInSm)
672         LD B,A
673         ADD A,A
674         ADD A,A
675         LD L,A
676         ADD HL,SP
677         LD SP,HL
678         LD A,B
679         INC A
680         CP D
681         JR C,CH_SMPS
682         LD A,E
683 CH_SMPS LD (IX+CHP.PsInSm),A
684         POP BC
685         POP HL
686         LD E,(IX+CHP.TnAcc)
687         LD D,(IX+CHP.TnAcc+1)
688         ADD HL,DE
689         BIT 6,B
690         JR Z,CH_NOAC
691         LD (IX+CHP.TnAcc),L
692         LD (IX+CHP.TnAcc+1),H
693 CH_NOAC EX DE,HL
694         EX AF,AF'
695         LD L,A
696         LD H,0
697         LD SP,NT_
698         ADD HL,SP
699         LD SP,HL
700         POP HL
701         ADD HL,DE
702         LD E,(IX+CHP.CrTnSl)
703         LD D,(IX+CHP.CrTnSl+1)
704         ADD HL,DE
705 CSP_    LD SP,#3131
706         EX (SP),HL
707         XOR A
708         OR (IX+CHP.TSlCnt)
709         JR Z,CH_AMP
710         DEC (IX+CHP.TSlCnt)
711         JR NZ,CH_AMP
712         LD A,(IX+CHP.TnSlDl)
713         LD (IX+CHP.TSlCnt),A
714         LD L,(IX+CHP.TSlStp)
715         LD H,(IX+CHP.TSlStp+1)
716         LD A,H
717         ADD HL,DE
718         LD (IX+CHP.CrTnSl),L
719         LD (IX+CHP.CrTnSl+1),H
720         BIT 2,(IX+CHP.Flags)
721         JR NZ,CH_AMP
722         LD E,(IX+CHP.TnDelt)
723         LD D,(IX+CHP.TnDelt+1)
724         AND A
725         JR Z,CH_STPP
726         EX DE,HL
727 CH_STPP SBC HL,DE
728         JP M,CH_AMP
729         LD A,(IX+CHP.SlToNt)
730         LD (IX+CHP.Note),A
731         XOR A
732         LD (IX+CHP.TSlCnt),A
733         LD (IX+CHP.CrTnSl),A
734         LD (IX+CHP.CrTnSl+1),A
735 CH_AMP  LD A,(IX+CHP.CrAmSl)
736         BIT 7,C
737         JR Z,CH_NOAM
738         BIT 6,C
739         JR Z,CH_AMIN
740         CP 15
741         JR Z,CH_NOAM
742         INC A
743         JR CH_SVAM
744 CH_AMIN CP -15
745         JR Z,CH_NOAM
746         DEC A
747 CH_SVAM LD (IX+CHP.CrAmSl),A
748 CH_NOAM LD L,A
749         LD A,B
750         AND 15
751         ADD A,L
752         JP P,CH_APOS
753         XOR A
754 CH_APOS CP 16
755         JR C,CH_VOL
756         LD A,15
757 CH_VOL  OR (IX+CHP.Volume)
758         LD L,A
759         LD H,0
760         LD DE,VT_
761         ADD HL,DE
762         LD A,(HL)
763 CH_ENV  BIT 0,C
764         JR NZ,CH_NOEN
765         OR (IX+CHP.Env_En)
766 CH_NOEN LD (Ampl),A
767         BIT 7,B
768         LD A,C
769         JR Z,NO_ENSL
770         RLA
771         RLA
772         SRA A
773         SRA A
774         SRA A
775         ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW
776         BIT 5,B
777         JR Z,NO_ENAC
778         LD (IX+CHP.CrEnSl),A
779 NO_ENAC LD HL,AddToEn
780         ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE.
781                    ;FIX IT IN NEXT VERSION?
782         LD (HL),A
783         JR CH_MIX
784 NO_ENSL RRA
785         ADD A,(IX+CHP.CrNsSl)
786         LD (AddToNs),A
787         BIT 5,B
788         JR Z,CH_MIX
789         LD (IX+CHP.CrNsSl),A
790 CH_MIX  LD A,B
791         RRA
792         AND #48
793 CH_EXIT LD HL,AYREGS+Mixer
794         OR (HL)
795         RRCA
796         LD (HL),A
797         POP HL
798         XOR A
799         OR (IX+CHP.COnOff)
800         RET Z
801         DEC (IX+CHP.COnOff)
802         RET NZ
803         XOR (IX+CHP.Flags)
804         LD (IX+CHP.Flags),A
805         RRA
806         LD A,(IX+CHP.OnOffD)
807         JR C,CH_ONDL
808         LD A,(IX+CHP.OffOnD)
809 CH_ONDL LD (IX+CHP.COnOff),A
810         RET
812 PLAY    XOR A
813         LD (AddToEn),A
814         LD (AYREGS+Mixer),A
815         DEC A
816         LD (AYREGS+EnvTp),A
817         LD HL,DelyCnt
818         DEC (HL)
819         JR NZ,PL2
820         LD HL,ChanA+CHP.NtSkCn
821         DEC (HL)
822         JR NZ,PL1B
823 AdInPtA EQU $+1
824         LD BC,#0101
825         LD A,(BC)
826         AND A
827         JR NZ,PL1A
828         LD D,A
829         LD (Ns_Base),A
830         LD HL,(CrPsPtr)
831         INC HL
832         LD A,(HL)
833         INC A
834         JR NZ,PLNLP
835         CALL CHECKLP
836 LPosPtr EQU $+1
837         LD HL,#2121
838         LD A,(HL)
839         INC A
840 PLNLP   LD (CrPsPtr),HL
841         DEC A
842         ADD A,A
843         LD E,A
844         RL D
845 PatsPtr EQU $+1
846         LD HL,#2121
847         ADD HL,DE
848         LD DE,(MODADDR)
849         LD (PSP_+1),SP
850         LD SP,HL
851         POP HL
852         ADD HL,DE
853         LD B,H
854         LD C,L
855         POP HL
856         ADD HL,DE
857         LD (AdInPtB),HL
858         POP HL
859         ADD HL,DE
860         LD (AdInPtC),HL
861 PSP_    LD SP,#3131
862 PL1A    LD IX,ChanA+12
863         CALL PTDECOD
864         LD (AdInPtA),BC
866 PL1B    LD HL,ChanB+CHP.NtSkCn
867         DEC (HL)
868         JR NZ,PL1C
869         LD IX,ChanB+12
870 AdInPtB EQU $+1
871         LD BC,#0101
872         CALL PTDECOD
873         LD (AdInPtB),BC
875 PL1C    LD HL,ChanC+CHP.NtSkCn
876         DEC (HL)
877         JR NZ,PL1D
878         LD IX,ChanC+12
879 AdInPtC EQU $+1
880         LD BC,#0101
881         CALL PTDECOD
882         LD (AdInPtC),BC
884 Delay   EQU $+1
885 PL1D    LD A,#3E
886         LD (DelyCnt),A
888 PL2     LD IX,ChanA
889         LD HL,(AYREGS+TonA)
890         CALL CHREGS
891         LD (AYREGS+TonA),HL
892         LD A,(Ampl)
893         LD (AYREGS+AmplA),A
894         LD IX,ChanB
895         LD HL,(AYREGS+TonB)
896         CALL CHREGS
897         LD (AYREGS+TonB),HL
898         LD A,(Ampl)
899         LD (AYREGS+AmplB),A
900         LD IX,ChanC
901         LD HL,(AYREGS+TonC)
902         CALL CHREGS
903 ;       LD A,(Ampl) ;Ampl = AYREGS+AmplC
904 ;       LD (AYREGS+AmplC),A
905         LD (AYREGS+TonC),HL
907         LD HL,(Ns_Base_AddToNs)
908         LD A,H
909         ADD A,L
910         LD (AYREGS+Noise),A
912 AddToEn EQU $+1
913         LD A,#3E
914         LD E,A
915         ADD A,A
916         SBC A,A
917         LD D,A
918         LD HL,(EnvBase)
919         ADD HL,DE
920         LD DE,(CurESld)
921         ADD HL,DE
922         LD (AYREGS+Env),HL
924         XOR A
925         LD HL,CurEDel
926         OR (HL)
927         JR Z,ROUT_A0
928         DEC (HL)
929         JR NZ,ROUT
930 Env_Del EQU $+1
931         LD A,#3E
932         LD (HL),A
933 ESldAdd EQU $+1
934         LD HL,#2121
935         ADD HL,DE
936         LD (CurESld),HL
938 ROUT    XOR A
939 ROUT_A0 LD DE,#FFBF
940         LD BC,#FFFD
941         LD HL,AYREGS
942 LOUT    OUT (C),A
943         LD B,E
944         OUTI
945         LD B,D
946         INC A
947         CP 13
948         JR NZ,LOUT
949         OUT (C),A
950         LD A,(HL)
951         AND A
952         RET M
953         LD B,E
954         OUT (C),A
955         RET
957 NT_DATA DB (T_NEW_0-T1_)*2
958         DB TCNEW_0-T_
959         DB (T_OLD_0-T1_)*2+1
960         DB TCOLD_0-T_
961         DB (T_NEW_1-T1_)*2+1
962         DB TCNEW_1-T_
963         DB (T_OLD_1-T1_)*2+1
964         DB TCOLD_1-T_
965         DB (T_NEW_2-T1_)*2
966         DB TCNEW_2-T_
967         DB (T_OLD_2-T1_)*2
968         DB TCOLD_2-T_
969         DB (T_NEW_3-T1_)*2
970         DB TCNEW_3-T_
971         DB (T_OLD_3-T1_)*2
972         DB TCOLD_3-T_
976 TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
977         DB #18+1,#24+1,#3C+1,0
978 TCOLD_1 DB #5C+1,0
979 TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
980         DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
981 TCNEW_3 DB #56+1
982 TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
983 TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
984         DB #BC+1,#BE+1,0
985 TCNEW_1 EQU TCOLD_1
986 TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
987         DB #BA+1,#BC+1,#BE+1,0
989 EMPTYSAMORN EQU $-1
990         DB 1,0,#90 ;delete #90 if you don't need default sample
992 ;first 12 values of tone tables (packed)
994 T_PACK  DB #06EC*2/256,(#06EC*2)%256
995         DB #0755-#06EC
996         DB #07C5-#0755
997         DB #083B-#07C5
998         DB #08B8-#083B
999         DB #093D-#08B8
1000         DB #09CA-#093D
1001         DB #0A5F-#09CA
1002         DB #0AFC-#0A5F
1003         DB #0BA4-#0AFC
1004         DB #0C55-#0BA4
1005         DB #0D10-#0C55
1006         DB #066D*2/256,(#066D*2)%256
1007         DB #06CF-#066D
1008         DB #0737-#06CF
1009         DB #07A4-#0737
1010         DB #0819-#07A4
1011         DB #0894-#0819
1012         DB #0917-#0894
1013         DB #09A1-#0917
1014         DB #0A33-#09A1
1015         DB #0ACF-#0A33
1016         DB #0B73-#0ACF
1017         DB #0C22-#0B73
1018         DB #0CDA-#0C22
1019         DB #0704*2/256,(#0704*2)%256
1020         DB #076E-#0704
1021         DB #07E0-#076E
1022         DB #0858-#07E0
1023         DB #08D6-#0858
1024         DB #095C-#08D6
1025         DB #09EC-#095C
1026         DB #0A82-#09EC
1027         DB #0B22-#0A82
1028         DB #0BCC-#0B22
1029         DB #0C80-#0BCC
1030         DB #0D3E-#0C80
1031         DB #07E0*2/256,(#07E0*2)%256
1032         DB #0858-#07E0
1033         DB #08E0-#0858
1034         DB #0960-#08E0
1035         DB #09F0-#0960
1036         DB #0A88-#09F0
1037         DB #0B28-#0A88
1038         DB #0BD8-#0B28
1039         DB #0C80-#0BD8
1040         DB #0D60-#0C80
1041         DB #0E10-#0D60
1042         DB #0EF8-#0E10
1044 ;vars from here can be stripped
1045 ;you can move VARS to any other address
1047 VARS
1049 ;ChannelsVars
1050 ; STRUCT  CHP
1051 ;reset group
1052 CHP.PsInOr EQU 0
1053 CHP.PsInSm EQU 1
1054 CHP.CrAmSl EQU 2
1055 CHP.CrNsSl EQU 3
1056 CHP.CrEnSl EQU 4
1057 CHP.TSlCnt EQU 5
1058 CHP.CrTnSl EQU 6
1059 CHP.TnAcc  EQU 8
1060 CHP.COnOff EQU 10
1061 ;reset group
1063 CHP.OnOffD EQU 11
1065 ;IX for PTDECOD here (+12)
1066 CHP.OffOnD EQU 12
1067 CHP.OrnPtr EQU 13
1068 CHP.SamPtr EQU 15
1069 CHP.NNtSkp EQU 17
1070 CHP.Note EQU 18
1071 CHP.SlToNt EQU 19
1072 CHP.Env_En EQU 20
1073 CHP.Flags EQU 21
1074  ;Enabled - 0,SimpleGliss - 2
1075 CHP.TnSlDl EQU 22
1076 CHP.TSlStp EQU 23
1077 CHP.TnDelt EQU 25
1078 CHP.NtSkCn EQU 27
1079 CHP.Volume EQU 28
1080 ; ENDS
1081 CHP EQU 29
1083 ChanA   DS CHP,0
1084 ChanB   DS CHP,0
1085 ChanC   DS CHP,0
1087 ;GlobalVars
1088 DelyCnt DB 0
1089 CurESld DW 0
1090 CurEDel DB 0
1091 Ns_Base_AddToNs
1092 Ns_Base DB 0
1093 AddToNs DB 0
1095 AYREGS
1097 VT_     DS 256,0 ;CreatedVolumeTableAddress
1099 EnvBase EQU VT_+14
1101 T1_     EQU VT_+16 ;Tone tables data depacked here
1103 T_OLD_1 EQU T1_
1104 T_OLD_2 EQU T_OLD_1+24
1105 T_OLD_3 EQU T_OLD_2+24
1106 T_OLD_0 EQU T_OLD_3+2
1107 T_NEW_0 EQU T_OLD_0
1108 T_NEW_1 EQU T_OLD_1
1109 T_NEW_2 EQU T_NEW_0+24
1110 T_NEW_3 EQU T_OLD_3
1112 NT_     DS 192,0 ;CreatedNoteTableAddress
1114 ;local var
1115 Ampl    EQU AYREGS+AmplC
1117 VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1
1119 VARSEND EQU $
1121 ;MDLADDR EQU $
1123   ENDMODULE