CPCWiki forum

General Category => Programming => Topic started by: nitrofurano on 12:31, 25 March 16

Title: how can we play sound in assembly using i/o ports only?
Post by: nitrofurano on 12:31, 25 March 16
hi!
i'm trying to play sound on cpc in assembly using i/o ports only, and getting no success at all... :S


i tried:




    ld bc,$f782
    out (c),c
    ld bc,$f407
    out (c),c
    ld bc,$f638
    out (c),c
    ld bc,$f400
    out (c),c
    ld bc,$f6FE
    out (c),c
    ld bc,$f408
    out (c),c
    ld bc,$f60F
    out (c),c



and




    ld b,$F4
    out (c),c
    ld bc,$F607
    out (c),c
    ld bc,$F600
    out (c),c
    ld b,$F4
    out (c),c
    ld bc,$F638
    out (c),c
    ld bc,$F600
    out (c),c
    ld b,$F4
    out (c),c
    ld bc,$F600
    out (c),c
    ld bc,$F600
    out (c),c
    ld b,$F4
    out (c),c
    ld bc,$F6FE
    out (c),c
    ld bc,$F600
    out (c),c
    ld b,$F4
    out (c),c
    ld bc,$F608
    out (c),c
    ld bc,$F600
    out (c),c
    ld b,$F4
    out (c),c
    ld bc,$F60F
    out (c),c
    ld bc,$F600
    out (c),c


any idea? and thanks in advance!

(btw, please don't suggest me to use firmware routines, sound queues, etc. - i really just want to use i/o ports directly only - i'm all focused on multitargeting/multiplatform development (trying to cover all z80-based machines that uses ay-3-891x), since if i could access ay-3-891x directly on ZX-Spectrum and MSX, it seems totally nonsense for me if i couldn't do the same on CPC )


Title: Re: how can we play sound in assembly using i/o ports only?
Post by: arnoldemu on 13:17, 25 March 16

    ld bc,$F407 ;;<< register
    out (c),c
ld bc,&f6c0 ;;<<<<<< select register
out (c),c ;; <<<<<<<
    ld bc,$F600
    out (c),c ;; << back to inactive
    ld bc,$F438 ;; << data
    out (c),c
ld bc,&f680 ;; << write data to register
out (c),c
    ld bc,$F600
    out (c),c


Note the F6c0, f680 for select register and write register. Data goes to f4 not f6.
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: arnoldemu on 13:18, 25 March 16
Quote from: arnoldemu on 13:17, 25 March 16

    ld bc,$F407 ;;<< register
    out (c),c
ld bc,&f6c0 ;;<<<<<< select register
out (c),c ;; <<<<<<<
    ld bc,$F600
    out (c),c ;; << back to inactive
    ld bc,$F438 ;; << data
    out (c),c
ld bc,&f680 ;; << write data to register
out (c),c
    ld bc,$F600
    out (c),c


Note the F6c0, f680 for select register and write register. Data goes to f4 not f6.

This writes 38 to register 07. Repeat the same pattern for all registers you want to write.
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: nitrofurano on 13:39, 25 March 16
working excellently! thanks, @arnoldemu (http://www.cpcwiki.eu/forum/index.php?action=profile;u=122) ! :)
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: arnoldemu on 13:43, 25 March 16
Quote from: nitrofurano on 13:39, 25 March 16
working excellently! thanks, @arnoldemu (http://www.cpcwiki.eu/forum/index.php?action=profile;u=122) ! :)
you're welcome :)
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: nitrofurano on 14:19, 25 March 16
thanks! and here is the bonus on the feedback, my very humble code made on ZX-Basic Compiler seems to play embedded .vgm files (almost) fine! :) (the bug is from my side, that i couldn't figure out exactly what is happening, might be something getting misinterpreted from the code i made) - the idea is to, later, convert files from VortexTracker into something similar to .vgm (perhaps a more optimized file, since .vgm is usually relatively huge because redundant data), and play there in similar way (humbly saying, might be quite useful for game development, at least for me! :) )
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: nitrofurano on 22:39, 25 March 16
btw, it's interesting that ay-3-891x runs in a lower frequency on CPC than on ZX-Spectrum and MSX - for the 440hz (A-4 in germanic notation), it seems that on the 12bit (frequency values between 0 and 4095) frequency area used in the 6 first registers, it's 142 on CPC, and 254 on ZX-Spectrum and MSX - is there any documentation or frequency table describing/confirming that?
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: jsa on 21:27, 31 March 16

If I recall right these things are clocked bit differently in all of those.

In MSX AY frequency is ~1.79 MHz contrary to Amstrad 1MHz. -> 142*1.79 = 254.18.
On ZX AY frequency is 1.77 so values should differ between ZX and MSX as well.







Title: Re: how can we play sound in assembly using i/o ports only?
Post by: Bryce on 22:19, 31 March 16
The pitch difference between 1.77MHz and 1.79MHz AYs would be less 5Hz. Would you really notice a difference between 440Hz and 444Hz if you didn't have them playing at the same time in front of you?

Bryce.
Title: Re: how can we play sound in assembly using i/o ports only?
Post by: jsa on 08:25, 03 April 16
I would not notice. But someone with "golden ears" might.  ;D . But then again why analyze music with "scope".


Title: Re: how can we play sound in assembly using i/o ports only?
Post by: trabitboy on 08:50, 06 April 16
Quote from: nitrofurano on 13:39, 25 March 16
working excellently! thanks, @arnoldemu (http://www.cpcwiki.eu/forum/index.php?action=profile;u=122) ! :)

Hi !
I'm trying direct AY access too, and couldn't help but see the source of your test is included :o )
It doesn't seem to be winape syntax, is it pasmo?

edit: my bad, just understood by looking at the .sh
instructive :)
Powered by SMFPacks Menu Editor Mod