;****************************************************************** ;* octode 2k16 HECTOR version * ;* 8ch beeper engine by utz 05'2016 * ;* Hector assistance by yo_fr * ;* www.irrlichtproject.de * ;****************************************************************** ;SP set to start of current buffer/ptn row ;(addBuffer) - add cntr 1-3 ;DE - add cntr 4 ;HL - accu 1-3, jump val ;HL' - add cntr 5 ;DE' - add cntr 6 ;BC/BC' - base counters ;IX - add cntr 7 ;IY - add cntr 8 ;A - vol.add ;A',I - timer ;should use 34*8=272t POFF EQU 0 PON EQU #ff ; NMOS EQU 1 ; CMOS EQU 2 ; ; OUTHI equ #41ed ; OUTLO equ #71ed ; ; IF Z80=NMOS ;values for NMOS Z80 ; PCTRL equ #10fe ; PCTRL_B equ #10 ; ENDIF ; IF Z80=CMOS ;values for CMOS Z80 ; PCTRL equ #00fe ; PCTRL_B equ #00 ; ENDIF org #4200 ;org origin init ; ei ;detect kempston ; halt ; in a,(#1f) ; inc a ; jr nz,_skip ; ld (maskKempston),a ; _skip ; di ; exx ; push hl ;preserve HL' for return to BASIC ; exx ld (oldSP),sp ld hl,musicData ld (seqpntr),hl ;****************************************************************** rdseq seqpntr equ $+1 ld sp,0 xor a pop hl ;pattern pointer to HL or h ld (seqpntr),sp jr nz,rdptn0 ;jp exit ;uncomment to disable looping ld sp,loop ;get loop point jr rdseq+3 ;****************************************************************** updateTimer0 nop ld (#1800),a updateTimer ld a,i ;9 dec a ;4 jp z,readNextRow ;10 ld i,a ;9 xor a ;4 ex af,af' ;4 jp (hl) ;4 ;44 TODO: adjust timings! ; updateTimerX ; ld a,i ;9 ; dec a ;4 ; jp z,readNextRow ;10 ; ld i,a ;9 ; xor a ;4 ; ex af,af' ;4 ; ld a,(hl) ;7 ;timing ; dw OUTLO ;12 ; xor a ;4 ; nop ;4 ; jp (hl) ;4 addBuffer ds 6 ;****************************************************************** exit oldSP equ $+1 ld sp,0 ; pop hl ; exx ei ret ;****************************************************************** rdptn0 ld (patpntr),hl readNextRow ; in a,(#1f) ;read joystick ; maskKempston equ $+1 ; and #1f ; ld c,a ; in a,(#fe) ;read kbd ; cpl ; or c ; and #1f ; jp nz,exit ld de,0 ;clear add counters 1-4 ld sp,addBuffer+6 push de push de push de patpntr equ $+1 ;fetch pointer to pattern data ld sp,0 pop af jr z,rdseq ld i,a ;timer jr c,drumNoise jp pe,drumKick jp m,drumSnare drumRet pop hl ;fetch row buffer addr ld (patpntr),sp ld sp,hl ;row buffer addr -> SP xor a ;timer lo exx ld h,a ;clear add counters 5-8 ld l,a ld d,a ld e,a ld ix,0 ld iy,0 exx ex af,af' ; xor a ; ld bc,PCTRL jp core0 drumNoise ld hl,#35d1 ;10 drumX ex de,hl ;4 ;DE = 0, so now HL = 0 pop bc ;10 ;duty in C, B = 0 _dlp add hl,de ;11 ld a,h ;4 cp c ;4 sbc a,a ;4 and #80 ;7 ;out (#fe),a ;11 ld (#1800),a ;13 nop rlc h ;8 djnz _dlp ;13/8 - 62*256 = 15872 ld d,b ;4 ;reset DE ld e,b ;4 ld a,#d6 ;7 ;adjust row length ex af,af' ;4 jp drumRet ;10 ;15933/15943 ~ 41,5 sound loop iterations drumKick ld hl,1 jr drumX drumSnare ld hl,5 jr drumX ;********************************************************************************************* IF (LOW($))!=0 org 256*(1+(HIGH($))) ENDIF core0 ;volume 0, 0t basec equ HIGH($) ld a,POFF ;7 ld (#1800),a ;13__ ;switch sound off xor a ;4 ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ;rotate bit 7 into volume accu, part 2 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL xor a ;4 ;ld a,POFF, also reset volume accu ld l,a ;4 ds 26,#e3 ;494 ;timing (ex (sp),hl) ld a,0 ;7 ;timing ds 2 ;8 ;timing ex af,af' ;4 ;check if timer has expired dec a ;4 dec a ;4 jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ;timing jp (hl) ;4 ;jump to next frame ;----------------- ;--1088 IF ((HIGH($)) > (HIGH(core0))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core1 ;vol 1 - 34t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ;ld a,POFF ret nz ;5 ;timing, branch never taken ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ld (#1800),a ;13__34 ;switch sound off ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ex de,hl ;4 ;DE is ch4 accu ld b,a ;4 ;preserve volume accu ld a,r ;9 ;timing ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ;ld a,POFF ret nz ;5 ;timing, branch never taken ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ld (#1800),a ;13__34 ;switch sound off ld a,b ;4 ;retrieve volume accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 ld b,a ;4 ld a,r ;9 ;timing ld a,r ;9 ;timing ds 2 ;8 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,r ;9 ;timing ds 2 ;8 xor a ;4 ;ld a,POFF ld (#1800),a ;13__34 ld a,b ;4 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 jp _x ;10 ;----------------- ;--272 _x ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,r ;9 ;timing ds 2 ;8 xor a ;4 ;ld a,POFF, also reset volume accu ld (#1800),a ;13__34 ld l,a ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ds 2 ;8 ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ds 8 ;32 ;timing (to match updateTimer length) jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core1))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core2 ;vol 2 - 68t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ;ld a,POFF ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld a,0 ;7 ;timing ld a,0 ;7 ;timing ld (#1800),a ;13__68 ;switch sound off ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ex de,hl ;4 ;DE is ch4 accu ld b,a ;4 ;preserve volume accu ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 jr _xx ;12 ;timing _xx jr _y ;12 ;timing _y jr _z ;12 ;timing _z ld a,0 ;7 ;timing, ld a,POFF ld (#1800),a ;13__68 ;switch sound off ld a,b ;4 ;retrieve volume accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 jr _aa6 ;12 ;timing _aa6 jr _bb6 ;12 ;timing _bb6 jr _cc6 ;12 ;timing _cc6 nop ;4 ld b,a ;4 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ld a,r ;9 ;timing nop ;4 xor a ;4 ;ld a,POFF ld (#1800),a ;13__68 ld a,b ;4 pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ex (sp),hl ;19 ;timing ex (sp),hl ;19 nop ;4 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ld a,r ;9 ;timing nop ;4 xor a ;4 ;ld a,POFF, also reset volume accu ld (#1800),a ;13__68 ld l,a ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 jr _dd ;12 ;timing _dd ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ds 8 ;32 ;timing (to match updateTimer length) jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core2))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core3 ;vol 3 - 102t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ;ld a,POFF ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 jr _xxx ;12 ;timing _xxx ld (#1800),a ;13__102 ;switch sound off rla ;4 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 inc hl ;6 ;timing ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ld b,a ;4 ;preserve volume accu ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,b ;4 ld (_rs1),a ;13 xor a ;4 ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 ld a,0 ;7 ;timing ds 2 ;8 ld (#1800),a ;13__102 ;switch sound off _rs1 equ $+1 ld a,0 ;7 ;retrieve volume accu adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 jr _aaa ;12 ;timing _aaa jr _bb ;12 ;timing _bb jr _cc ;12 ;timing _cc nop ;4 ld b,a ;4 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ld a,r ;9 ;timing xor a ;4 ;ld a,POFF ld (#1800),a ;13__102 ld a,b ;4 pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ds 2 ;8 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ld a,r ;9 ;timing xor a ;4 ;ld a,POFF, also reset volume accu ld (#1800),a ;13__102 ld l,a ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 nop ;4 jr _dd7 ;12 ;timing _dd7 ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ds 8 ;32 ;timing (to match updateTimer length) jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core3))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core4 ;vol 4 - 136t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ;ld a,POFF ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 jr _x8 ;12 ;timing _x8 ds 2 ;8 ld (#1800),a ;13__136 ;switch sound off rla ;4 ;rotate bit 7 into volume accu, part 2 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 inc hl ;6 ;timing ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 ld b,0 ;7 ;timing ld b,a ;4 ;preserve volume accu ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,b ;4 rl h ;8 adc a,0 ;7 ld (_rs10),a ;13 xor a ;4 ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 exx ;4 ld a,0 ;7 ;timing ld a,0 ;7 ;timing jr _aa2 ;12 ;timing _aa2 nop ;4 ld (#1800),a ;13__136 ;switch sound off _rs10 equ $+1 ld a,0 ;7 ;retrieve volume accu adc a,0 ;7 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 jp _bb10 ;10 ;timing _bb10 ld b,a ;4 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,b ;4 ;retrieve vol accu ld (_rs2),a ;13 ;preserve vol accu ld a,r ;9 ;timing xor a ;4 ;ld a,POFF pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 pop bc ;10 ex (sp),hl ;19 ;timing ex (sp),hl ;19 nop ;4 ld (#1800),a ;13__136 _rs2 equ $+1 ld a,0 ;7 ;retrieve vol accu adc a,0 ;7 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL jr _cc11 ;12 _cc11 jp _dd11 ;10 ;----------------- ;--272 _dd11 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 xor a ;4 ;ld a,POFF, also reset volume accu ret nz ;5 ;timing ld (#1800),a ;13__136 ld l,a ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ds 2 ;8 ;timing jr _z0 ;12 ;timing _z0 ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ds 8 ;32 ;timing (to match updateTimer length) jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core4))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core5 ;vol 5 - 170t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ;rotate bit 7 into volume accu, part 2 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld b,a ;4 ;preserve volume accu xor a ;4 ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ld (#1800),a ;13__170 ;switch sound off ld a,b ;4 ;retrieve volume accu inc hl ;6 ;timing ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ld b,a ;4 ;preserve volume accu ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex af,af' ;4 ;update timer dec a ;4 ex af,af' ;4 ld a,b ;4 ;retrieve volume accu ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ld (_rs12),a ;13 ;preserve volume accu ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 xor a ;4 ld a,0 ;7 ;timing ld (#1800),a ;13__170 ;switch sound off _rs12 equ $+1 ld a,0 ;7 ;retrieve volume accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 jr _aa3 ;12 ;timing _aa3 jr _bb3 ;12 ;timing _bb3 jr _cc3 ;12 ;timing _cc3 jr _dd3 ;12 ;timing _dd3 ld b,a ;4 ;preserve volume accu ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ld a,b ;4 ;retrieve vol accu pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 ld (_rs23),a ;13 ;preserve volume accu ld a,r ;9 ;timing xor a ;4 ld (#1800),a ;13__170 _rs23 equ $+1 ld a,0 ;7 ;retrieve vol accu add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ex (sp),hl ;19 ;timing ex (sp),hl ;19 ld a,r ;9 ;timing ld a,r ;9 ;timing ds 2 ;8 ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ds 2 ;8 ;timing jr _zz3 ;12 ;timing _zz3 xor a ;4 ;ld a,POFF, also reset volume accu ld l,a ;4 ret nz ;5 ;timing jp _ee3 ;10 _ee3 ld (#1800),a ;13__170 ld a,r ;9 ;timing ld a,r ;9 ;timing nop ;4 ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core5))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core6 ;vol 6 - 204t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ;rotate bit 7 into volume accu, part 2 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld b,a ;4 ;preserve volume accu ld a,r ;9 ;timing xor a ;4 ld (#1800),a ;13__204 ;switch sound off ld a,b ;4 ;retrieve volume accu ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ld b,a ;4 ;preserve volume accu ld a,r ;9 ;timing ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex af,af' ;4 ;update timer dec a ;4 dec a ;4 ex af,af' ;4 ld a,b ;4 ;retrieve volume accu ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ld (_rs16),a ;13 ;preserve volume accu xor a ;4 ld a,0 ;7 ;timing ld a,0 ;7 ;timing ld (#1800),a ;13__204 ;switch sound off ex (sp),hl ;19 ;timing ex (sp),hl ;19 ;timing jp _aa4 ;10 ;timing ;----------------- ;--272 _aa4 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on _rs16 equ $+1 ld a,0 ;7 ;retrieve volume accu pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 ld (_rs29),a ;13 ;preserve volume accu ld a,r ;9 ;timing ld a,r ;9 ;timing jr _bb15 ;12 _bb15 jp _cc15 ;10 _cc15 xor a ;4 ld (#1800),a ;13__204 jr _dd15 ;12 ;timing _dd15 jr _ee15 ;12 ;timing _ee15 inc hl ;6 ;timing _rs29 equ $+1 ld a,0 ;7 ;retrieve vol accu add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ;timing ex (sp),hl ;19 nop ;4 ;timing jr _zz11 ;12 ;timing _zz11 xor a ;4 ;ld a,POFF, also reset volume accu ld l,a ;4 ret nz ;5 ;timing jp _yy22 ;10 _yy22 ld (#1800),a ;13__204 ex af,af' ;4 ;check if timer has expired jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ld a,r ;9 ;timing ld a,r ;9 ;timing ds 2 ;8 jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core6))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core7 ;vol 7 - 238t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ;rotate bit 7 into volume accu, part 2 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ld b,a ;4 ;preserve volume accu xor a ;4 jr _aa5 ;12 _aa5 ld (#1800),a ;13__238 ;switch sound off ld a,0 ;7 ;timing ld a,0 ;7 ;timing ;------------------ ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex af,af' ;4 ;update timer dec a ;4 dec a ;4 ex af,af' ;4 ld a,b ;4 ;retrieve volume accu ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ld (_rs19),a ;13 ;preserve volume accu ex (sp),hl ;19 ;timing ex (sp),hl ;19 ;timing xor a ;4 jp _x6 ;10 ;timing _x6 ld (#1800),a ;13__238 ;switch sound off ld a,0 ;7 ;timing ld a,0 ;7 ;timing ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on _rs19 equ $+1 ld a,0 ;7 ;retrieve volume accu pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 xor a ;4 ld (#1800),a ;13__238 ld a,0 ;7 ;timing ld a,0 ;7 ;timing ;----------------- ;--272 ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ld a,r ;9 ;timing xor a ;4 ;ld a,POFF, also reset volume accu ld l,a ;4 ex af,af' ;4 ;check if timer has expired jp z,updateTimer0 ;10 ;and update if necessary ex af,af' ;4 ld (#1800),a ;13__204 jp _ff00 ;10 ;timing _ff00 jp (hl) ;4 ;jump to next frame ;----------------- ;--272 IF ((HIGH($)) > (HIGH(core7))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* org 256*(1+(HIGH($))) core8 ;vol 8 - 272t ld a,PON ;7 ld (#1800),a ;13__ ;switch sound on xor a ;4 ld hl,(addBuffer) ;16 ;get ch1 accu pop bc ;10 ;get ch1 base freq add hl,bc ;11 ;add them up ld (addBuffer),hl ;16 ;store ch1 accu rl h ;8 ;rotate bit 7 into volume accu rla ;4 ;rotate bit 7 into volume accu, part 2 ld hl,(addBuffer+2) ;16 ;as above, for ch2 pop bc ;10 add hl,bc ;11 ld (addBuffer+2),hl ;16 rl h ;8 adc a,0 ;7 ld hl,(addBuffer+4) ;16 ;as above for ch3 pop bc ;10 add hl,bc ;11 ld (addBuffer+4),hl ;16 rl h ;8 adc a,0 ;7 ex de,hl ;4 ;DE is ch4 accu pop bc ;10 ;add base freq as usual add hl,bc ;11 ex de,hl ;4 ld b,d ;4 ;get bit 7 of ch4 accu without modifying the accu itself rl b ;8 adc a,0 ;7 exx ;4 pop bc ;10 ;get base freq ch5 add hl,bc ;11 ;HL' is ch5 accu ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 ;DE' is accu ch6 pop bc ;10 add hl,bc ;11 ld b,h ;4 rl b ;8 adc a,0 ;7 ex de,hl ;4 pop bc ;10 add ix,bc ;15 ;IX is accu ch7 ld b,ixh ;8 rl b ;8 adc a,0 ;7 pop bc ;10 add iy,bc ;15 ;IY is accu ch8 ld b,iyh ;8 rl b ;8 adc a,0 ;7 exx ;4 ld hl,-16 ;10 ;point SP to beginning of pattern row again add hl,sp ;11 ld sp,hl ;6 add a,basec ;7 ;calculate which core to use for next frame ld h,a ;4 ;and put the value in HL xor a ;4 ;ld a,POFF, also reset volume accu ld l,a ;4 ds 26,#e3 ;494 ;timing (ex (sp),hl) ld a,0 ;7 ;timing ds 2 ;8 ;timing ex af,af' ;4 ;check if timer has expired dec a ;4 dec a ;4 jp z,updateTimer ;10 ;and update if necessary ex af,af' ;4 ex (sp),hl ;19 ;timing ex (sp),hl ;19 ;timing jp (hl) ;4 ;jump to next frame ;----------------- ;--1088 IF ((HIGH($)) > (HIGH(core8))) .ERROR page boundary crossed ENDIF ;********************************************************************************************* musicData include "C:\Users\APILOG\Desktop\new_conv\VB_HectorSD_3.2\Source ASM\music.asm"