Changes

Jump to: navigation, search

PROTRACKER372 PTTFC H

1,097 bytes added, 02:56, 8 March 2020
no edit summary
pttfc C��BK�L�бssgC��BK�L�б ssg=0 ;в компиляторе пока не поддерживается ;TODO begin&end только в одном канале newtfm=1 ;0=revision A, 1=revision C IFN ?tfcinclude ;IMER=#5B5B IMTAB=#BE00 ENDIF IF0 newtfm-1 statuschip0=%11111000 statuschip1=%11111001 ELSE IF0 newtfm-2 ;US031DX statuschip0=%11111110 statuschip1=%11111111 ELSE ;newtfm=0 statuschip0=%11111100 statuschip1=%11111101 ENDIF ENDIF MACRO WaitStatus IFN newtfm-2 ;OUT (C),D ;statuschip0/1 INF JP M,$-2 ENDIF ENDM ;не нужен? MACRO ssgprewait WaitStatus ENDM ;или этот не нужен? MACRO ssgpostwait WaitStatus ENDM IFN ?tfcinclude MACRO HALTER LOCAL PUSH DE,HL LD HL,23672 LD DE,3095;0 LD A,(HL) DEC DE ;INC CP (HL) JP Z,$-2 ;23t ;DE=(Tframe-Tplayer)/30 ;если >30000t ;(т.е. осталось < номинала), то левота ;LD HL,304 ;7000t ;LD HL,435 ;10000t ;LD HL,652 ;15000t LD HL,1739 ;40000t ;LD HL,2174 ;50000t ;LD HL,3043 ;70000t OR A SBC HL,DE ;CY: DE>HL JC halterskip LD HL,sum LD A,(HL) ADD A,E LD (HL),A INC HL LD A,(HL) ADC A,D LD (HL),A INC HL LD A,(HL) ADC A,0 LD (HL),A INC HL LD A,(HL) ADC A,0 LD (HL),A LD HL,(min) OR A SBC HL,DE ;CY: old min < JC $+6 LD (min),DE LD HL,(max) OR A SBC HL,DE ;NC: old max >= JNC $+6 LD (max),DE LD HL,(frames) INC HL LD (frames),HL JR halterQ halterskip LD HL,0 LD A,(HL) ADD A,E LD (HL),A INC HL LD A,(HL) ADC A,D LD (HL),A INC HL LD A,(HL) ADC A,0 LD (HL),A INC HL LD A,(HL) ADC A,0 LD (HL),A LD HL,(min) OR A SBC HL,DE ;CY: old min < JC $+6 LD (0),DE LD HL,(max) OR A SBC HL,DE ;NC: old max >= JNC $+6 LD (0),DE LD HL,(badframes) INC HL LD (badframes),HL halterQ POP HL,DE ENDL ENDM ORG #6000 begin GO LD SP,#6000 GOFREE LD (QUITSP),SP IM 1 LD HL,#4000 LD DE,#4001 LD BC,6911 LD (HL),L LDIR LD A,#46 LD (PR88col),A LD DE,#4000 LD HL,tTITLE CALL PRMSG LD DE,#4060 CALL PRMSG LD DE,#40C0 CALL PRMSG LD HL,tfmmuz IFN ssg LD BC,#32 ELSE LD BC,#22 ENDIF ADD HL,BC LD A,7 LD (PR88col),A LD DE,#4020 CALL PRMSG LD DE,#4080 CALL PRMSG LD DE,#40E0 CALL PRMSG EI HALT LD HL,IMTAB LD BC,256 LD D,H,E,B LD (HL),IMER LD A,H LDIR LD I,A IM 2 LD HL,tfmmuz CALL tfmini HALT ;wait 1000t - не мин и не макс LD B,1000/13 DJNZ $ LOOP HALTER nehalt LD A,2 OUT (-2),A CALL tfm LD A,0 OUT (-2),A LD A,#7F IN A,(-2) RRA JP_JPC JP LOOP QUIT QUITSP=$+1 LD SP,0 CALL tfmshut LD B,D WaitStatus LD A,#FF ;выкл. FM OUT (C),SPA
IM 1
  LD HL,#4000 LD DE,#4001 LD BC,6911 LD (HL),L LDIR LD A,#46 LD (PR88col),A LD DE,#4000 LD HL,tTITLE CALL PRMSG LD DE,#4060 CALL PRMSG LD DE,#40C0 CALL PRMSG LD HL,tfmmuz IFN ssg LD BC,#32 ELSE LD BC,#22 ENDIF ADD HL,BC LD A,7 LD (PR88col),A LD DE,#4020 CALL PRMSG LD DE,#4080 CALL PRMSG LD DE,#40E0 CALL PRMSG  EI HALT LD HL,IMTAB LD BC,256 LD D,H,E,B LD (HL),IMER LD A,H LDIR LD I,A IM 2  LD HL,tfmmuz CALL tfmini HALT ;wait 1000t - не мин и не макс LD B,1000/13 DJNZ $LOOP HALTERnehalt LD A,2 OUT (-2),A CALL tfm LD A,0 OUT (-2),A LD A,#7F IN A,(-2) RRA JP_JPC JP LOOPQUITQUITSP=$+1 LD SP,0 CALL tfmshut LD B,D WaitStatus LD A,#FF ;выкл. FM OUT (C),A IM 1 LD HL,(min) CALL MUL23 LD DE,#5000 CALL PR12345 LD HL,(max) CALL MUL23 LD DE,#5020 CALL PR12345 LD HL,(sum) LD DE,(sum+2) LD BC,(frames) CALL DIV3216 CALL MUL23 LD DE,#5040 CALL PR12345 LD HL,(frames) LD DE,#5060 CALL PR12345 LD HL,(badframes) LD DE,#5080 PR12345 LD BC,10000 CALL PRDIG LD BC,1000 CALL PRDIG LD BC,100 CALL PRDIG LD C,10 CALL PRDIG LD C,1 PRDIG LD A,"0"-1 OR A INC A SBC HL,BC JNC $-3 ADD HL,BC PR88 PUSH HL ADD A,A LD L,A LD H,15 ADD HL,HL ADD HL,HL PUSH DE DUP 8 LD A,(HL),(DE),A INC L,D EDUP ORG $-1 LD A,D RRA RRA RRA AND 3 ADD A,88 LD D,A PR88col=$+1 LD A,0 LD (DE),A POP DE INC E POP HL RET NZ LD A,D ADD A,8 LD D,A RET PRCR LD A,E AND #E0 ADD A,32 LD E,A RET NC LD A,D ADD A,8 LD D,A RET PRCRMSG INC HL ;skip LF CALL PRCRPRMSG LD A,(HL) INC HL OR A RET Z CP 13 JZ PRCRMSG CALL PR88 JR PRMSG MUL23 LD B,H,C,L ADD HL,HL ADD HL,BC ;3 ADD HL,HL ADD HL,HL ADD HL,HL ;24 SBC HL,BC ;23 RET  DIV3216;DEHL/BC -> HL LD A,B OR C JNZ $+3 INC BC LD IX,-1DIV32160 INC IX OR A SBC HL,BC JNC $+3 DEC DE BIT 7,D JZ DIV32160 PUSH IX
POP HL
RET NZ LD A,D ADD A,8 LD D,A RET PRCR LD A,E AND #E0 ADD A,32 LD E,A RET NC LD A,D ADD A,8 LD D,A RET PRCRMSG INC HL ;skip LF CALL PRCR PRMSG LD A,(HL) INC HL OR A RET Z CP 13 JZ PRCRMSG CALL PR88 JR PRMSG MUL23 LD B,H,C,L ADD HL,HL ADD HL,BC ;3 ADD HL,HL ADD HL,HL ADD HL,HL ;24 SBC HL,BC ;23 RET DIV3216 ;DEHL/BC -> HL LD A,B OR C JNZ $+3 INC BC LD IX,-1 DIV32160 INC IX OR A SBC HL,BC JNC $+3 DEC DE BIT 7,D JZ DIV32160 PUSH IX POP HL RET tTITLE DB "Track name:",0 DB "Author:",0 DB "Message:",0 ENDIF tfmplayer tfmini EXD LD HL,9 ADD HL,DE LD A,(HL) INC HL CP 50 LD A,201 JZ $+4 LD A,62 LD (tfm60hz),A EXX LD HL,tfminitab IFN ssg LD BC,#14FD ELSE LD BC,#06FD ENDIF tfmini0 LD DE,tfminiHL LDI LDI EXX LD A,(HL) INC HL PUSH HL LD H,(HL) LD L,A ADD HL,DE tfminiHL=$+1 LD (0),HL POP HL INC HL EXX DJNZ tfmini0 XOR A LD (blkcntA),A LD (blkcntB),A LD (blkcntC),A LD (blkcntD),A LD (blkcntE),A LD (blkcntF),A IFN ssg LD (blkcntT0),A LD (blkcntTA),A LD (blkcntMA),A LD (blkcntTB),A LD (blkcntMB),A LD (blkcntTC),A LD (blkcntMC),A LD (blkcntT1),A LD (blkcntTD),A LD (blkcntMD),A LD (blkcntTE),A LD (blkcntME),A LD (blkcntTF),A LD (blkcntMF),A ENDIF DEC A LD (skipA),A LD (skipB),A LD (skipC),A LD (skipD),A LD (skipE),A LD (skipF),A IFN ssg LD (skipT0),A LD (skipTA),A LD (skipMA),A LD (skipTB),A LD (skipMB),A LD (skipTC),A LD (skipMC),A LD (skipT1),A LD (skipTD),A LD (skipMD),A LD (skipTE),A LD (skipME),A LD (skipTF),A LD (skipMF),A ENDIF tfmshut LD DE,#FFBF LD C,#FD CALL selChip0 CALL tfminiPP CALL selChip1 CALL tfminiPP LD B,D OUT (C),D ;fm off RET tfminiPP XOR A EXA LD A,#0D ;SSG regClrS CALL WRITEREG DEC A JP P,regClrS LD A,#B3 regClrZ CP #4F JR NZ,$+4 LD A,#3F ;skip TL, чтобы не было щелчка CALL WRITEREG DEC A CP #30 JR NC,regClrZ LD A,#0F ;max speed EXA LD A,#8F ;RR regClrR CALL WRITEREG DEC A JP M,regClrR ; LD A,#F0 ; EXA ; LD A,#28 ;key ; CALL WRITEREG ;key on A ; EXA ; INC A ;#F1 ; EXA ; CALL WRITEREG ;key on B ; EXA ; INC A ;#F2 ; EXA ; CALL WRITEREG ;key on C XOR A EXA LD A,#28 ;key CALL WRITEREG ;key off A EXA INC A ;#01 EXA CALL WRITEREG ;key off B EXA INC A ;#02 EXA CALL WRITEREG ;key off C DEC A ;#27 ;channel 3 mode CALL WRITEREG ;normal mode LD A,#7F ;тишина EXA LD A,#4F ;TL regClrT CALL WRITEREG DEC A CP #40 JR NC,regClrT ;LD A,#2F ;любое ;EXA LD A,#2F CALL WRITEREG ;без этого частота левая ;LD A,#2D ;любое ;EXA LD A,#2D ;без этого частота левая WRITEREG ;A=REG ;A'=VALUE LD B,D WaitStatus OUT (C),A ;reg EXA WaitStatus LD B,E OUT (C),A ;value EXA RET tfminitab DW addrA DW addrB DW addrC DW addrD DW addrE DW addrF IFN ssg DW addrT0 DW addrTA DW addrMA DW addrTB DW addrMB DW addrTC DW addrMC DW addrT1 DW addrTD DW addrMD DW addrTE DW addrME DW addrTF DW addrMF ENDIF selChip0 LD A,statuschip0 LD B,D OUT (C),A RET selChip1 LD A,statuschip1 LD B,D OUT (C),A RET OUTA PUSH BC LD BC,32765 OUT (C),A POP BC RET tfm LD DE,#FFBF LD C,#FD LD B,D LD A,statuschip0 OUT (C),A CALL tfmA CALL tfmB CALL tfmC LD B,D LD A,statuschip1 OUT (C),A CALL tfmD CALL tfmE CALL tfmF ;SSG ;CALL SSG ; tfm60hz cnt60=$+1 LD A,6 DEC A JNZ $+4 LD A,6 LD (cnt60),A JZ tfm RET MACRO TestKeyOff LOCAL JP P,noffX EXA LD B,D ;%11111xxx LD A,#28 WaitStatus OUT (C),A IF0 \0 XOR A ELSE LD A,\0 ENDIF WaitStatus LD B,E ;#BF OUT (C),A EXA noffX ENDL ENDM MACRO TestFreq LOCAL RRA JNC nofrqX EXA LD B,D ;%11111xxx LD A,#A4+\1 WaitStatus OUT (C),A
LD A,(HL)
INC HL
CP 50 LD (tfmhigh\0),A,201 JZ $+4 WaitStatus LD AB,62E ;#BF LD OUT (tfm60hzC),A EXX LD HLB,tfminitabD ;%11111xxx IFN ssg LD BCA,#14FDA0+\1 ELSE WaitStatus LD BC OUT (C),#06FD ENDIF tfmini0 LD DE,tfminiHL LDI LDI EXX A
LD A,(HL)
INC HL
PUSH HL
LD H,(HL)
LD L,A
ADD HL,DE
tfminiHL=$+1
LD (0),HL
POP HL
INC HL
EXX
DJNZ tfmini0
XOR A
LD (blkcntA),A
LD (blkcntB),A
LD (blkcntC),A
LD (blkcntD),A
LD (blkcntE),A
LD (blkcntF),A
IFN ssg
LD (blkcntT0),A
LD (blkcntTA),A
LD (blkcntMA),A
LD (blkcntTB),A
LD (blkcntMB),A
LD (blkcntTC),A
LD (blkcntMC),A
LD (blkcntT1),A
LD (blkcntTD),A
LD (blkcntMD),A
LD (blkcntTE),A
LD (blkcntME),A
LD (blkcntTF),A
LD (blkcntMF),A
ENDIF
DEC A
LD (skipA),A
LD (skipB),A
LD (skipC),A
LD (skipD),A
LD (skipE),A
LD (skipF),A
IFN ssg
LD (skipT0),A
LD (skipTA),A
LD (skipMA),A
LD (skipTB),A
LD (skipMB),A
LD (skipTC),A
LD (skipMC),A
LD (skipT1),A
LD (skipTD),A
LD (skipMD),A
LD (skipTE),A
LD (skipME),A
LD (skipTF),A
LD (skipMF),A
ENDIF
tfmshut
LD DE,#FFBF
LD C,#FD
CALL selChip0
CALL tfminiPP
CALL selChip1
CALL tfminiPP
LD B,D
OUT (C),D ;fm off
RET
tfminiPP
XOR A
EXA
LD A,#0D ;SSG
regClrS CALL WRITEREG
DEC A
JP P,regClrS
LD A,#B3
regClrZ CP #4F
JR NZ,$+4
LD A,#3F ;skip TL, чтобы не было щелчка
CALL WRITEREG
DEC A
CP #30
JR NC,regClrZ
LD A,#0F ;max speed
EXA
LD A,#8F ;RR
regClrR CALL WRITEREG
DEC A
JP M,regClrR
; LD A,#F0
; EXA
; LD A,#28 ;key
; CALL WRITEREG ;key on A
; EXA
; INC A ;#F1
; EXA
; CALL WRITEREG ;key on B
; EXA
; INC A ;#F2
; EXA
; CALL WRITEREG ;key on C
XOR A
EXA
LD A,#28 ;key
CALL WRITEREG ;key off A
EXA
INC A ;#01
EXA
CALL WRITEREG ;key off B
EXA
INC A ;#02
EXA
CALL WRITEREG ;key off C
DEC A ;#27 ;channel 3 mode
CALL WRITEREG ;normal mode
 
LD A,#7F ;тишина
EXA
LD A,#4F ;TL
regClrT CALL WRITEREG
DEC A
CP #40
JR NC,regClrT
;LD A,#2F ;любое
;EXA
LD A,#2F
CALL WRITEREG ;без этого частота левая
;LD A,#2D ;любое
;EXA
LD A,#2D
;без этого частота левая
WRITEREG
;A=REG
;A'=VALUE
LD B,D
WaitStatus
OUT (C),A ;reg
EXA
WaitStatus
LD B,E
OUT (C),A ;value
EXA
RET
tfminitab
DW addrA
DW addrB
DW addrC
DW addrD
DW addrE
DW addrF
IFN ssg
DW addrT0
DW addrTA
DW addrMA
DW addrTB
DW addrMB
DW addrTC
DW addrMC
DW addrT1
DW addrTD
DW addrMD
DW addrTE
DW addrME
DW addrTF
DW addrMF
ENDIF
selChip0
LD A,statuschip0
LD B,D
OUT (C),A
RET
 
selChip1
LD A,statuschip1
LD B,D
OUT (C),A
RET
 
OUTA
PUSH BC
LD BC,32765
OUT (C),A
POP BC
RET
 
tfm
LD DE,#FFBF
LD C,#FD
LD B,D
LD A,statuschip0
OUT (C),A
CALL tfmA
CALL tfmB
CALL tfmC
LD B,D
LD A,statuschip1
OUT (C),A
CALL tfmD
CALL tfmE
CALL tfmF
;SSG
;CALL SSG
;
tfm60hz
cnt60=$+1
LD A,6
DEC A
JNZ $+4
LD A,6
LD (cnt60),A
JZ tfm
RET
 
MACRO TestKeyOff
LOCAL
JP P,noffX
EXA
LD B,D ;%11111xxx
LD A,#28
WaitStatus
OUT (C),A
IF0 \0
XOR A
ELSE
LD A,\0
ENDIF
WaitStatus
LD B,E ;#BF
OUT (C),A
EXA
noffX
ENDL
ENDM
 
MACRO TestFreq
LOCAL
RRA
JNC nofrqX
EXA
LD B,D ;%11111xxx
LD A,#A4+\1
WaitStatus
OUT (C),A
LD A,(HL)
INC HL
LD (tfmhigh\0),A
WaitStatus
LD B,E ;#BF
OUT (C),A
LD B,D ;%11111xxx
LD A,#A0+\1
WaitStatus
OUT (C),A
LD A,(HL)
INC HL
LD (tfmlow\0),A
WaitStatus
LD B,E ;#BF
OUT (C),A
EXA
nofrqX
ENDL
ENDM
 
MACRO TestOutRegs
LOCAL
AND #1F
CALL NZ,regsX
ENDL
ENDM
 
MACRO KeyOn
LD B,D ;%11111xxx
LD A,#28
WaitStatus
OUT (C),A
LD A,#F0+\0
WaitStatus
LD B,E ;#BF
OUT (C),A
ENDM
 
;%11111111,-disp8 = данные кадра лежат по смещению -disp8
;%111ttttt = skip 32..2 frames
;%110ddddd = slide d-16
;%11010000,frames,-disp16 = repeat block (skips = 1 frame)
;%10111111,-disp16 = данные кадра лежат по смещению -disp16
;%10NNNNNf = keyoff,[freq,]0..30 regs, keyon
;%01111111 = end
;%01111110 = begin
;%01NNNNNf = keyoff,[freq,]0..31 regs
;%00NNNNNf = [freq,]0..30 regs
bb=%01111110
be=%01111111
MACRO MacroTFM
block\0
LD A,(HL) ;N frames
;1 now, N-1 later
;skip command is used as 1 frame
INC HL
LD (blkcnt\0),A
LD B,(HL)
INC HL
LD C,(HL) ;disp
INC HL
LD (blkretaddr\0),HL
ADD HL,BC
LD C,#FD
JP tfmframe\0
OLDfar\0
LD B,(HL)
INC HL
OLDnear\0
LD C,(HL)
INC HL
PUSH HL
ADD HL,BC
LD C,#FD
CALL tfmframe\0
POP HL
LD (addr\0),HL
RET
HLskiper\0
JZ OLDfar\0
CP %11100000
JC slide\0
LD B,A
CP #FF
JZ OLDnear\0
LD (addr\0),HL
skiper\0 LD (skip\0),A
RET
slide\0
;A=-64..-33
ADD A,48
;A=-16..15
JZ block\0
tfmlow\0=$+1
ADD A,0
LD (tfmlow\0),A
LD (addr\0),HL LD B,D ;%11111xxxtfmhigh\0=$+2 LD HL,#A4+\1 WaitStatus OUT (C),L WaitStatus LD B,E ;#BF OUT (C),H LD B,D ;%11111xxx LD L,#A0+\1 WaitStatus OUT (C),L WaitStatus LD B,E ;#BF OUT (C),A RET  begin\0 LD (loopaddr\0),HL JP tfmframe\0end\0loopaddr\0=$+1 LD HL,0 JP tfmframe\0tfm\0skip\0=$+1 LD A,-1 INC A JNZ skiper\0addr\0=$+1 LD HL,0blkcnt\0=$+1 OR 0 JZ tfmframe\0 DEC A LD (blkcnt\0),A JNZ tfmframe\0blkretaddr\0=$+1 LD HL,0tfmframe\0 LD A,(HL) INC HL CP bb JZ begin\0 CP be JZ end\0 CP E ;#BF JNC HLskiper\0 TestKeyOff \1 OR A PUSH AF TestFreq \0,\1 TestOutRegs LD (addr\0),HL POP AF RET P KeyOn \1 RET ENDM  regsX LD B,D ;%11111xxx WaitStatus OUTI ;reg WaitStatus LD B,E ;#BF OUTI ;value DEC A JNZ regsX ;в turbo JR=JP RET   MacroTFM A,0 MacroTFM B,1 MacroTFM C,2 MacroTFM D,0 MacroTFM E,1 MacroTFM F,2 IFN ssgSSG LD D,32 LD A,(ssgmaskA) LD E,A CALL ssgT0 CALL ssgTA CALL ssgMA CALL ssgTB CALL ssgMB CALL ssgTC CALL ssgMC LD A,E LD (ssgmaskA),A LD BC,#FFFD LD DE,#FFBF LD A,statuschip0
OUT (C),A
EXA nofrqX ENDL ENDM MACRO TestOutRegs LOCAL AND #1F CALL NZ,regsX ENDL ENDM MACRO KeyOn LD B,D ;%11111xxx LD HLA,#28 WaitStatus OUT (C),ssglowAA CALL OUTSSG LD A,#F0+\0 WaitStatus LD DB,E ;#BF OUT (C),A ENDM ;%11111111,-disp8 = данные кадра лежат по смещению -disp8 ;%111ttttt = skip 32..2 frames ;%110ddddd = slide d-16 ;%11010000,frames,-disp16 = repeat block (skips = 1 frame) ;%10111111,-disp16 = данные кадра лежат по смещению -disp16 ;%10NNNNNf = keyoff,[freq,]0..30 regs, keyon ;%01111111 = end ;%01111110 = begin ;%01NNNNNf = keyoff,[freq,]0..31 regs ;%00NNNNNf = [freq,]0..30 regs bb=%01111110 be=%01111111 MACRO MacroTFM block\0 LD A,(ssgmaskDHL);N frames ;1 now, N-1 later ;skip command is used as 1 frame INC HL LD E(blkcnt\0),A LD B,(HL) INC HL LD C,(HL) ;disp INC HL LD (blkretaddr\0),HL ADD HL,BC LD C,#FD JP tfmframe\0 OLDfar\0 LD B,(HL) INC HL OLDnear\0 LD C,(HL) INC HL PUSH HL ADD HL,BC LD C,#FD CALL ssgT1tfmframe\0 POP HL LD (addr\0),HL RET HLskiper\0 JZ OLDfar\0 CP %11100000 JC slide\0 LD B,A CP #FF JZ OLDnear\0 LD (addr\0),HL skiper\0 LD (skip\0),A RET slide\0 CALL ssgTD;A=-64..-33 CALL ssgMD ADD A,48 CALL ssgTE;A=-16..15 CALL ssgME JZ block\0 CALL ssgTF tfmlow\0=$+1 CALL ssgMF ADD A,0 LD (tfmlow\0),A LD (addr\0),EHL LD B,D ;%11111xxx tfmhigh\0=$+2 LD HL,#A4+\1 WaitStatus OUT (ssgmaskDC),AL WaitStatus LD BCB,E ;#FFFDBF OUT (C),H LD DEB,D ;%11111xxx LD L,#FFBFA0+\1 WaitStatus OUT (C),L WaitStatus LD AB,statuschip1E ;#BF
OUT (C),A
LD HL,ssglowD RET OUTSSG DUP 13 begin\0 LD B(loopaddr\0),D ;%11111xxxHL ssgprewait JP tfmframe\0 OUT (C),L ;reg end\0 ssgpostwait loopaddr\0=$+1 LD BHL,E ;#BF0 JP tfmframe\0 OUTI ;value tfm\0 EDUP skip\0=$+1 LD A,(HL)-1 OR INC A RET Z JNZ skiper\0 addr\0=$+1 LD BHL,D0 ssgprewait blkcnt\0=$+1 OR 0 JZ tfmframe\0 DEC A OUT LD (Cblkcnt\0),LA ssgpostwait JNZ tfmframe\0 LD B,E blkretaddr\0=$+1 OUT (C),A LD (HL),0 RET tfmframe\0 LD A,(HL) INC HL;tone channel: CP bb;1 1 1 HIGHTONE5 - set hightone, read lowtone JZ begin\0 CP be;1 1 JZ end\0 N, disp16 - LZ CP E ;1 #BF JNC HLskiper\0 TestKeyOff \1 N, disp8 - LZ;1 OR A PUSH AF TestFreq \0 0 SKIP5 - skip 32..,\1 frames; TestOutRegs LD (addr\0 dTONE7 - tone+=(dTONE7-64)),HL;begin=#A0 POP AF;end=#C0 RET P KeyOn \1 MACRO ToneSSG RET farT\0 ENDM regsX LD B,(HL)D ;%11111xxx INC HL WaitStatusnearT\0 OUTI ;reg WaitStatus LD CB,(HL)E ;#BF INC HL OUTI ;value ; DEC A = N frames JNZ regsX ;1 nowв turbo JR=JP RET MacroTFM A, N-1 later0 ;skip command is used as MacroTFM B,1 frame LD (blkcntT\0) MacroTFM C,A2 LD (blkretaddrT\ MacroTFM D,0) MacroTFM E,HL1 ADD HL MacroTFM F,BC2 JP frameT\0IFN ssgmarkT\0 SSG ADD A LD D,D32 JC sethighT\0 ADD LD A,D(ssgmaskA) JZ endT\0 JC farT\0 LD BE,-1 ADD A,D JZ beginT\0 CALL ssgT0 JC nearT\0 CALL ssgTA CALL ssgMA CALL ssgTB CALL ssgMB CALL ssgTC CALL ssgMC LD A,E LD (addrT\0ssgmaskA),HLA LD BC,#FFFD LD DE,#FFBFskiperT\0 LD A,statuschip0 OUT (skipT\0C),A RET LD HL,ssglowA CALL OUTSSG beginT\0 LD D,32 LD A,(loopaddrT\0ssgmaskD),HL JP frameT\0 LD E,AendT\0 CALL ssgT1loopaddrT\0=$+1 CALL ssgTD LD HL,0 JP frameT\0 CALL ssgMD CALL ssgTE CALL ssgMEssgT\0 CALL ssgTFskipT\0=$+1 CALL ssgMF LD A,-1E INC LD (ssgmaskD),A JNZ skiperT\0addrT\0=$+1 LD HLBC,0#FFFDblkcntT\0=$+1 LD DE,#FFBF OR 0 JZ frameT\0 DEC LD A,statuschip1 LD OUT (blkcntT\0C),A JNZ frameT\0blkretaddrT\0=$+1 LD HL,0ssglowDframeT\0 OUTSSG LD ADUP 13 LD B,D ;%11111xxx ssgprewait OUT (HLC),L ;reg INC HL ssgpostwait OR A LD B,E ;#BF JP M,markT\0 OUTI ;value SUB 64EDUP ; LD A=-63..63 LD ,(addrT\0HL),HL OR A RET Z LD HLB,ssglow\0D ADD A ssgprewait OUT (C),L ssgpostwait LD B,E OUT (HLC),A LD (HL),A0 RET sethighT\0 LD (ssghigh\0),A ;tone channel: LD A,(HL) ;1 1 1 HIGHTONE5 - set hightone, read lowtone INC HL LD (ssglow\ ;1 1 0) N,Adisp16 - LZ LD (addrT\ ;1 0) 1 N,HL RET ENDM disp8 - LZ ;1 0 0 SKIP5 - skip 32..1 frames ;NM=TM=0 is incompatible with volume set dTONE7 - tone+=(dTONE7-64) ;mask channel:begin=#A0 ;1 end=#C0 1 1 MACRO ToneSSG NOISE5 - set noisefarT\0 LD B, continue(HL) INC HL;1 1 nearT\0 LD C,(HL) INC HL ;A = Nframes ;1 now, disp16 N- LZ1 later ;1 skip command is used as 1 frame LD (blkcntT\0 1 N), disp8 - LZA;1 0 0 SKIP5 - skip 32..1 frames; LD (blkretaddrT\0 TM NM ...),HL ;0 ADD HL,BC JP frameT\0 v3 v2 v1 v0 - env OFF (this byte to vol reg)markT\0 ;1 1 e2 e1 e0 - ini env (type 8..F)ADD A, ;env ON (this byte to vol reg)D ;1 JC sethighT\0 ? ? ? - env ON (this byte to vol reg);begin=#A0 ADD A,D;end=#C0 JZ endT\0  MACRO MaskSSGfarM JC farT\0 LD B,(HL)-1 INC HL ADD A,D JZ beginT\0nearM JC nearT\0 LD C,(HLaddrT\0) INC ,HL ;A = N frames ;1 now, N-1 later ;skip command is used as 1 frame skiperT\0 LD (blkcntMskipT\0),A RET beginT\0 LD (blkretaddrMloopaddrT\0),HL ADD HL,BC JP frameMframeT\0markM endT\0 ADD A,D JC setnoiseM\ loopaddrT\0=$+1 ADD A LD HL,D0 JZ endM JP frameT\0 JC farM ssgT\0 skipT\0=$+1 LD BA,-1 ADD INC A,D JZ beginM JNZ skiperT\0 JC nearM addrT\0=$+1 LD (addrM\HL,0),HLskiperM blkcntT\0 LD (skipM\=$+1 OR 0),A RET  beginM JZ frameT\0 DEC A LD (loopaddrMblkcntT\0),HLA JP frameM JNZ frameT\0endM\0loopaddrM blkretaddrT\0=$+1 LD HL,0 JP frameM frameT\0ssgM\0skipM\0=$+1 LD A,-1(HL) INC HL OR A JNZ skiperM JP M,markT\0addrM\0=$+1 SUB 64 LD HL,0;A=-63..63blkcntM LD (addrT\0=$+1),HL OR 0 JZ frameM LD HL,ssglow\0 DEC ADD A,(HL) LD (blkcntM\0HL),A JNZ frameM RET sethighT\0blkretaddrM LD (ssghigh\0=$+1 LD HL),0AframeM\0 LD A,(HL) INC HL OR LD (ssglow\0),A JP M,markM\0 LD (addrMaddrT\0),HL LD (ssgvol\0),A RET ENDM BIT 4,A JZ nenvM\ ;NM=TM=0is incompatible with volume set BIT 3,A ;mask channel: JZ nenvM\0 ;1 1 1 NOISE5 - set noise, continue LD (ssgenv\ ;1 1 0) N,AnenvM\disp16 - LZ ;1 0 1 N, disp8 - LZ RLA RLA JNC $+4 ;1 0 0 SKIP5 - skip 32..1 frames SET \1+3,E ;noisemask (3,4,5) OFF RLA RET NC0 TM NM ... SET \1,E ;tonemask (0,1,2) v3 v2 v1 v0 - env OFF RET setnoiseM\0 LD (ssgnoise\0this byte to vol reg),A JP frameM\0 ;1 1 e2 e1 e0 - ini env (type 8..F), ENDM  ToneSSG 0 ;env ON (this byte to vol reg)ToneSSG AMaskSSG A, ;1 0 ? ? ? - env ON (this byte to vol reg)ToneSSG BMaskSSG B,1ToneSSG C ;begin=#A0MaskSSG C,2 ;end=#C0ToneSSG 1 ToneSSG D MACRO MaskSSGMaskSSG D, farM\0ToneSSG EMaskSSG E LD B,1(HL)ToneSSG F INC HL nearM\0MaskSSG F LD C,2  DS .(-$HL)ssglowA DB 0 INC HLssghighA DB 0 ;A = N framesssglowB DB 0 ;1 now, N-1 laterssghighB DB 0 ;skip command is used as 1 framessglowC DB LD (blkcntM\0),AssghighC DB LD (blkretaddrM\0),HLssgnoiseA ADD HL,BCssgnoiseB JP frameM\0ssgnoiseC DB markM\0ssgmaskA ADD A,DssgmaskB JC setnoiseM\0ssgmaskC DB 0 ADD A,DssgvolA DB JZ endM\0ssgvolB DB JC farM\0ssgvolC DB 0 LD B,-1ssglow0 DB 0 ADD A,Dssghigh0 DB JZ beginM\0ssgenvAssgenvBssgenvC DB JC nearM\0 DS . LD (-$addrM\0),HLssglowD DB skiperM\0ssghighD DB LD (skipM\0),AssglowE DB 0 RET ssghighE DB 0 ssglowF DB beginM\0ssghighF DB LD (loopaddrM\0),HLssgnoiseDssgnoiseEssgnoiseF DB JP frameM\0ssgmaskDssgmaskEssgmaskF DB endM\0ssgvolD DB loopaddrM\0=$+1ssgvolE DB LD HL,0ssgvolF DB JP frameM\0ssglow1 DB ssgM\0ssghigh1 DB skipM\0=$+1ssgenvDssgenvE LD A,-1 INC AssgenvF DB JNZ skiperM\0 ENDIF ;ssg DISPLAY "player size addrM\0=",$-tfmplayer+1 IFN ?tfcinclude LD HL,0min DW - blkcntM\0=$+1max DW OR 0sum DS 4 JZ frameM\0 DEC Aframes DW LD (blkcntM\0),Abadframes DW JNZ frameM\0 blkretaddrM\0=$+1 ;ORG #C000tfmmuz LD HL,0 INCBIN "t*.t" frameM\0DISPLAY $ ;ORG IMER DS . LD A,(-$HL) DS '$ INC HLIMER OR A PUSH AF JP M,markM\0 INC LD (IY+62addrM\0),HL POP AF LD (ssgvol\0),A EI BIT 4,A RET JZ nenvM\0end BIT 3,A ORG #5CDD JZ nenvM\0 DB "ducktaleB" INCLUDE "B:m2hr*" LD (ssgenv\0),#C0A ORG $ nenvM\0 CALL 8026 RLA RLA JP NC,nenado JNC $+4 LD A SET \1+3,218 E ;JPC LD noisemask (JP_JPC3,4,5),AOFF JP GOFREE RLA ENDIF RET NCdrT SET \0)1,HLE ;tonemask (0,1,2) OFF RET ENDM setnoiseM\0 ;NM=TM= LD (ssgnoise\0 is incompatible with volume set),A JP frameM\0 ENDM ToneSSG 0 ToneSSG A; MaskSSG A,0 ToneSSG B MaskSSG B,1 ToneSSG C MaskSSG C,2 ToneSSG 1 ToneSSG D MaskSSG D,0 ToneSSG E MaskSSG E,1 ToneSSG F MaskSSG F,2 DS .(-$) ssglowA DB 0 ssghighA DB 0 ssglowB DB 0 ssghighB DB 0 ssglowC DB 0 ssghighC DB 0 ssgnoiseA ssgnoiseB ssgnoiseC DB 0 ssgmaskA ssgmaskB ssgmaskC DB 0 ssgvolA DB 0 ssgvolB DB 0 ssgvolC DB 0 ssglow0 DB 0 ssghigh0 DB 0 ssgenvA ssgenvB ssgenvC DB 0 DS .(-$) ssglowD DB 0 ssghighD DB 0 ssglowE DB 0 ssghighE DB 0 ssglowF DB 0 ssghighF DB 0 ssgnoiseD ssgnoiseE ssgnoiseF DB 0 ssgmaskD ssgmaskE ssgmaskF DB 0 ssgvolD DB 0 ssgvolE DB 0 ssgvolF DB 0 ssglow1 DB 0 ssghigh1 DB 0 ssgenvD ssgenvE ssgenvF DB 0 ENDIF ;ssg DISPLAY "player size=",$-tfmplayer IFN ?tfcinclude min DW -1 max DW 0 sum DS 4 frames DW 0 badframes DW 0 ;ORG #C000 tfmmuz INCBIN "t*.t" DISPLAY $ ;ORG IMER DS .(-$) DS '$ IMER PUSH AF INC (IY+62) POP AF EI RET end ORG #5CDD DB "ducktaleB" INCLUDE "B:m2hr*",#C0 ORG $ CALL 8026 JP NC,nenado LD A,218 ;JPC LD (JP_JPC),A JP GOFREE ENDIF drT\0),HL RET ENDM ;NM=TM=0 is incompatible with volume set ;mask channel:;1 1 1 NOISE5 - set noise, continuechannel: ;1 1 1 NOISE5 - set noise, continue ;1 1 0 N, disp16 - LZ;1 1 0 N, disp16 - LZ;1 0 1 N, disp8 - L

Navigation menu