: : Hi! : : : : Do somebody have a link for some codes so I can make music in assebley? : : : : : : What operating system? : What hardware? : Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor? : : Assembly is a very detail oriented language. Your questions need to be likewise. : : : (shameless self plug) : Here's links to 2 .wav players that work in DOS: : http://www.programmersheaven.com/search/download.asp?FileID=30034 : http://www.programmersheaven.com/search/download.asp?FileID=23237 : : -jeff! : Hi!
Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help. We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?) I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult.
: : : Hi! : : : : : : Do somebody have a link for some codes so I can make music in assebley? : : : : : : : : : : What operating system? : : What hardware? : : Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor? : : : : Assembly is a very detail oriented language. Your questions need to be likewise. : : : : : : (shameless self plug) : : Here's links to 2 .wav players that work in DOS: : : http://www.programmersheaven.com/search/download.asp?FileID=30034 : : http://www.programmersheaven.com/search/download.asp?FileID=23237 : : : : -jeff! : : : Hi! : : Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help. : We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?) : I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult. : : :
ok,do i understand it right?you want create a disk which plays a song when booting from it?
a good oldschool way to play simple sounds is the adlib,which should be supported by most today cards(is this still true?hard to test this under todays XP-enviroments).this chip let you create a ton by specifing frequency,length,vibrato and few other sound-parameters to make the sound instruments-like.you can setup a guitar-like sound,too.
i assume you have some basic assembly-knowledge,this is surely not that hard to do,but you need some assembly-practice to code.i suggest you try to write this code under win9x and not XP.XP will not allow you to control the adlib directly.search this site or the web for adlib,there should be good descriptions for this chip or send me a private message
when you played your first notes successfully you can try to change your code to a bootable version.
: : : : Hi! : : : : : : : : Do somebody have a link for some codes so I can make music in assebley? : : : : : : : : : : : : : : What operating system? : : : What hardware? : : : Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor? : : : : : : Assembly is a very detail oriented language. Your questions need to be likewise. : : : : : : : : : (shameless self plug) : : : Here's links to 2 .wav players that work in DOS: : : : http://www.programmersheaven.com/search/download.asp?FileID=30034 : : : http://www.programmersheaven.com/search/download.asp?FileID=23237 : : : : : : -jeff! : : : : : Hi! : : : : Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help. : : We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?) : : I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult. : : : : : : : : ok,do i understand it right?you want create a disk which plays a song when booting from it? : : a good oldschool way to play simple sounds is the adlib,which should be supported by most today cards(is this still true?hard to test this under todays XP-enviroments).this chip let you create a ton by specifing frequency,length,vibrato and few other sound-parameters to make the sound instruments-like.you can setup a guitar-like sound,too. : : i assume you have some basic assembly-knowledge,this is surely not that hard to do,but you need some assembly-practice to code.i suggest you try to write this code under win9x and not XP.XP will not allow you to control the adlib directly.search this site or the web for adlib,there should be good descriptions for this chip or send me a private message : : when you played your first notes successfully you can try to change your code to a bootable version. : : : Ummmm... I'm a noob... What's the syntax? or the INT? or the sub-function? Or a link to tutorial site?
: [green] : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days. : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html : : [/green] : : : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing...
: : [green] : : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days. : : : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html : : : : [/green] : : : : : : : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing... :
[green] Are talking about the instructions 'out' and 'in' for port access? [/green]
: : : [green] : : : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days. : : : : : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html : : : : : : [/green] : : : : : : : : : : : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing... : : : : [green] : Are talking about the instructions 'out' and 'in' for port access? : [/green] : : YES! YES! YES! That's what I pertaining to! Here's the story:
I'm new to Assembly Language. Then our teacher gave us an assignment to make a program that produce sounds using TASM. All I could understand for today is the "INT xxh" and "MOV AH, xxh" thing (or some like STOSB). Hope you could help me...
: : : : [green] : : : : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days. : : : : : : : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html : : : : : : : : [/green] : : : : : : : : : : : : : : : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing... : : : : : : : [green] : : Are talking about the instructions 'out' and 'in' for port access? : : [/green] : : : : : YES! YES! YES! That's what I pertaining to! Here's the story: : : I'm new to Assembly Language. Then our teacher gave us an assignment to make a program that produce sounds using TASM. All I could understand for today is the "INT xxh" and "MOV AH, xxh" thing (or some like STOSB). Hope you could help me... :
[green] Those instruction aren't difficult to learn. They both can either take a immediate operand of size byte or for ports greater than 255 you must use the dx register.
[code] in = in from port out= out to port
mov dx, 1234 mov al, 32 out dx, al ;send the number 32 to port 1234
or
mov al, 32 out 42, al ;send the number 32 to port 42
mov dx, 1234 in al, dx ;copy byte in port 1234 to al
or
in al, 42 ;copy byte in port 42 to al [/code]
What I suggest you do is at least download the instruction set reference from intel. That will give you a full explanation on how to use the instructions. [/green]
[code] ; ; PIANO.ASM [ - For DOS - ] ; Simple PC Speaker Piano Keyboard ; Freeware from Evenbit ; ; .model tiny .code org 100h
main: jmp start ; stor dw 0 ;our memory location storage ; ; Turn the cursor off. ; start: call curs_off ;go turn off cursor ; ; Get a keypress from the user, and act accordingly. ; (We're checking U.S. keyboard scan codes here.) ; get_key: mov ah,0 ;function 0 - wait for keypress int 16h ;call ROM BIOS keyboard services cmp ah,1 ;ESC key pressed? je exit ;yes, so go exit cmp ah,02h je tone_1 cmp ah,03h je tone_2 cmp ah,04h je tone_3 cmp ah,05h je tone_4 cmp ah,06h je tone_5 cmp ah,07h je tone_6 cmp ah,08h je tone_7 cmp ah,09h je tone_8 cmp ah,0ah je tone_9 cmp ah,0bh je tone_0 ; jmp get_key ;go get another keypress ; exit: call curs_on ;go turn cursor on int 20h ;exit to DOS ; tone_1: mov ax, 272 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_2: mov ax, 294 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_3: mov ax, 314 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_4: mov ax, 330 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_5: mov ax, 350 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_6: mov ax, 370 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_7: mov ax, 392 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_8: mov ax, 419 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_9: mov ax, 440 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress tone_0: mov ax, 475 mov stor, ax call sounder ;go generate the tone jmp get_key ;go get another keypress
; ;**************************************** ; Our sub-routines start here. ;**************************************** ; ; Turn cursor off. ; curs_off: mov ch,10h ;set bits to turn cursor off mov ah,1 ;function 1 - cursor control int 10h ;call ROM BIOS video services ret ;return to caller ; ; Turn cursor on. ; curs_on: mov cx,0506h ;set bits to turn cursor on mov ah,1 ;function 1 - cursor control int 10h ;call ROM BIOS video services ret ;return to caller ; ; Generate sound through the PC speaker. ; [red] sounder: mov al,10110110b ;load control word out 43h,al ;send it mov ax,stor ;tone frequency out 42h,al ;send LSB mov al,ah ;move MSB to AL out 42h,al ;save it in al,61h ;get port 61 state or al,00000011b ;turn on speaker out 61h,al ;speaker on now call delay ;go pause a little bit and al,11111100b ;clear speaker enable out 61h,al ;speaker off now call clr_keyb ;go clear the keyboard buffer ret ;return to caller [/red] delay: mov ah,00h ;function 0 - get system timer tick int 01Ah ;call ROM BIOS time-of-day services add dx,4 ;add our delay value to DX mov bx,dx ;store result in BX pozz: int 01Ah ;call ROM BIOS time-of-day services cmp dx,bx ;has the delay duration passed? jl pozz ;no, so go check again ret ;return to caller ; ; Clear the keyboard buffer. ; clr_keyb: push es ;preserve ES push di ;preserve DI mov ax,40h ;BIOS segment in AX mov es,ax ;transfer to ES mov ax,1Ah ;keyboard head pointer in AX mov di,ax ;transfer to DI mov ax,1Eh ;keyboard buffer start in AX mov es: word ptr [di],ax ;transfer to head pointer inc di ;bump pointer to... inc di ;...keyboard tail pointer mov es: word ptr [di],ax ;transfer to tail pointer pop di ;restore DI pop es ;restore ES ret ;return to caller ; end main end [/code]
When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program.
Here I learn something: (I'm referring to the RED code)
1.) OUT is putting something to the port while IN is getting something to the port.
2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?).
3.) Then the STOR was sent to AX (What will be put to AH and AL?).
4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?)
5.) What are these things:
[code] or al,00000011b ;turn on speaker and al,11111100b ;clear speaker enable [/code]
What's the meaning or OR and AND commands?
QUESTIONS: I summarized all here:
1.) Is countdown value the same with frequency?
2.) If I put 475 to AX, what will be put in AH and AL?
3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency?
4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2)
5.) What's the meaning or OR and AND commands?
6.) I tried to find some manuals in Intel Processor in http://www.intel.com/ but all I could see is Processors and it's specs... Where can I get an Intel Documentation?
: [b][red]This message was edited by pmcastillo at 2005-10-12 5:37:21[/red][/b][hr] : I DID IT! I DID IT! I DID IT! I tried to find some sample source code from the Internet and I found this : I've found it from : http://www.talkaboutprogramming.com/group/alt.lang.asm/messages/73981.html : : [code] : ; : ; PIANO.ASM [ - For DOS - ] : ; Simple PC Speaker Piano Keyboard : ; Freeware from Evenbit : ; : ; : .model tiny : .code : org 100h : : main: jmp start : ; : stor dw 0 ;our memory location storage : ; : ; Turn the cursor off. : ; : start: : call curs_off ;go turn off cursor : ; : ; Get a keypress from the user, and act accordingly. : ; (We're checking U.S. keyboard scan codes here.) : ; : get_key: : mov ah,0 ;function 0 - wait for keypress : int 16h ;call ROM BIOS keyboard services : cmp ah,1 ;ESC key pressed? : je exit ;yes, so go exit : cmp ah,02h : je tone_1 : cmp ah,03h : je tone_2 : cmp ah,04h : je tone_3 : cmp ah,05h : je tone_4 : cmp ah,06h : je tone_5 : cmp ah,07h : je tone_6 : cmp ah,08h : je tone_7 : cmp ah,09h : je tone_8 : cmp ah,0ah : je tone_9 : cmp ah,0bh : je tone_0 : ; : jmp get_key ;go get another keypress : ; : exit: : call curs_on ;go turn cursor on : int 20h ;exit to DOS : ; : tone_1: : mov ax, 272 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_2: : mov ax, 294 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_3: : mov ax, 314 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_4: : mov ax, 330 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_5: : mov ax, 350 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_6: : mov ax, 370 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_7: : mov ax, 392 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_8: : mov ax, 419 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_9: : mov ax, 440 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_0: : mov ax, 475 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : : : : ; : ;**************************************** : ; Our sub-routines start here. : ;**************************************** : ; : ; Turn cursor off. : ; : curs_off: : mov ch,10h ;set bits to turn cursor off : mov ah,1 ;function 1 - cursor control : int 10h ;call ROM BIOS video services : ret ;return to caller : ; : ; Turn cursor on. : ; : curs_on: : mov cx,0506h ;set bits to turn cursor on : mov ah,1 ;function 1 - cursor control : int 10h ;call ROM BIOS video services : ret ;return to caller : ; : ; Generate sound through the PC speaker. : ; : [red] : sounder: : mov al,10110110b ;load control word : out 43h,al ;send it : mov ax,stor ;tone frequency : out 42h,al ;send LSB : mov al,ah ;move MSB to AL : out 42h,al ;save it : in al,61h ;get port 61 state : or al,00000011b ;turn on speaker : out 61h,al ;speaker on now : call delay ;go pause a little bit : and al,11111100b ;clear speaker enable : out 61h,al ;speaker off now : call clr_keyb ;go clear the keyboard buffer : ret ;return to caller : [/red] : delay: : mov ah,00h ;function 0 - get system timer tick : int 01Ah ;call ROM BIOS time-of-day services : add dx,4 ;add our delay value to DX : mov bx,dx ;store result in BX : pozz: : int 01Ah ;call ROM BIOS time-of-day services : cmp dx,bx ;has the delay duration passed? : jl pozz ;no, so go check again : ret ;return to caller : ; : ; Clear the keyboard buffer. : ; : clr_keyb: : push es ;preserve ES : push di ;preserve DI : mov ax,40h ;BIOS segment in AX : mov es,ax ;transfer to ES : mov ax,1Ah ;keyboard head pointer in AX : mov di,ax ;transfer to DI : mov ax,1Eh ;keyboard buffer start in AX : mov es: word ptr [di],ax ;transfer to head pointer : inc di ;bump pointer to... : inc di ;...keyboard tail pointer : mov es: word ptr [di],ax ;transfer to tail pointer : pop di ;restore DI : pop es ;restore ES : ret ;return to caller : ; : end main : end : [/code] : : When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program. : : : Here I learn something: (I'm referring to the RED code) : : 1.) OUT is putting something to the port while IN is getting something to the port. : : 2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?). : : 3.) Then the STOR was sent to AX (What will be put to AH and AL?). : : 4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?) : : 5.) What are these things: : : [code] : or al,00000011b ;turn on speaker : and al,11111100b ;clear speaker enable : [/code] : : What's the meaning or OR and AND commands? : : QUESTIONS: I summarized all here: : : 1.) Is countdown value the same with frequency? : : 2.) If I put 475 to AX, what will be put in AH and AL? : : 3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency? : : 4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2) : : 5.) What's the meaning or OR and AND commands? : : 6.) I tried to find some manuals in Intel Processor in http://www.intel.com/ but all I could see is Processors and it's specs... Where can I get an Intel Documentation? : You could make it bootable with this program http://alexfru.chat.ru/epm.html#bootprog
: [code] : ; : ; PIANO.ASM [ - For DOS - ] : ; Simple PC Speaker Piano Keyboard : ; Freeware from Evenbit : ; : ; : .model tiny : .code : org 100h : : main: jmp start : ; : stor dw 0 ;our memory location storage : ; : ; Turn the cursor off. : ; : start: : call curs_off ;go turn off cursor : ; : ; Get a keypress from the user, and act accordingly. : ; (We're checking U.S. keyboard scan codes here.) : ; : get_key: : mov ah,0 ;function 0 - wait for keypress : int 16h ;call ROM BIOS keyboard services : cmp ah,1 ;ESC key pressed? : je exit ;yes, so go exit : cmp ah,02h : je tone_1 : cmp ah,03h : je tone_2 : cmp ah,04h : je tone_3 : cmp ah,05h : je tone_4 : cmp ah,06h : je tone_5 : cmp ah,07h : je tone_6 : cmp ah,08h : je tone_7 : cmp ah,09h : je tone_8 : cmp ah,0ah : je tone_9 : cmp ah,0bh : je tone_0 : ; : jmp get_key ;go get another keypress : ; : exit: : call curs_on ;go turn cursor on : int 20h ;exit to DOS : ; : tone_1: : mov ax, 272 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_2: : mov ax, 294 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_3: : mov ax, 314 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_4: : mov ax, 330 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_5: : mov ax, 350 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_6: : mov ax, 370 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_7: : mov ax, 392 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_8: : mov ax, 419 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_9: : mov ax, 440 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : tone_0: : mov ax, 475 : mov stor, ax : call sounder ;go generate the tone : jmp get_key ;go get another keypress : : : : ; : ;**************************************** : ; Our sub-routines start here. : ;**************************************** : ; : ; Turn cursor off. : ; : curs_off: : mov ch,10h ;set bits to turn cursor off : mov ah,1 ;function 1 - cursor control : int 10h ;call ROM BIOS video services : ret ;return to caller : ; : ; Turn cursor on. : ; : curs_on: : mov cx,0506h ;set bits to turn cursor on : mov ah,1 ;function 1 - cursor control : int 10h ;call ROM BIOS video services : ret ;return to caller : ; : ; Generate sound through the PC speaker. : ; : [red] : sounder: : mov al,10110110b ;load control word : out 43h,al ;send it : mov ax,stor ;tone frequency : out 42h,al ;send LSB : mov al,ah ;move MSB to AL : out 42h,al ;save it : in al,61h ;get port 61 state : or al,00000011b ;turn on speaker : out 61h,al ;speaker on now : call delay ;go pause a little bit : and al,11111100b ;clear speaker enable : out 61h,al ;speaker off now : call clr_keyb ;go clear the keyboard buffer : ret ;return to caller : [/red] : delay: : mov ah,00h ;function 0 - get system timer tick : int 01Ah ;call ROM BIOS time-of-day services : add dx,4 ;add our delay value to DX : mov bx,dx ;store result in BX : pozz: : int 01Ah ;call ROM BIOS time-of-day services : cmp dx,bx ;has the delay duration passed? : jl pozz ;no, so go check again : ret ;return to caller : ; : ; Clear the keyboard buffer. : ; : clr_keyb: : push es ;preserve ES : push di ;preserve DI : mov ax,40h ;BIOS segment in AX : mov es,ax ;transfer to ES : mov ax,1Ah ;keyboard head pointer in AX : mov di,ax ;transfer to DI : mov ax,1Eh ;keyboard buffer start in AX : mov es: word ptr [di],ax ;transfer to head pointer : inc di ;bump pointer to... : inc di ;...keyboard tail pointer : mov es: word ptr [di],ax ;transfer to tail pointer : pop di ;restore DI : pop es ;restore ES : ret ;return to caller : ; : end main : end : [/code] : : When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program. : : : Here I learn something: (I'm referring to the RED code) : : 1.) OUT is putting something to the port while IN is getting something to the port.
[green] Correct [/green]
: 2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?). [green] This only sets up the speaker for sound generation [/green] : : 3.) Then the STOR was sent to AX (What will be put to AH and AL?). [green] If you look at the tone section depending on the tone the frequency is stored to [red]stor[/red]. [/green] : 4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?) [green] No, port 42h is 8bit but you must send a 16bit value to it so how do you do that? You send the LSB(Least Significant Byte) and then the MSB(Most Significant Byte). Since the instruction 'out' can only take a 8bit value from AL, you must plug in the LSB into AL first and send it then plug in the MSB into AL next and send it [/green]
: : 5.) What are these things: : : [code] : or al,00000011b ;turn on speaker : and al,11111100b ;clear speaker enable : [/code] [green] The 1st one makes sure bits 1 and 0 are on no matter what. The second clears bits 1 and 0 because anything 'anded' with 0 is false. [/green]
: What's the meaning or OR and AND commands? [green] 'Or' is to set bits 'on' and 'and' is usually used to check a bit for truth or clear bits. [/green]
: QUESTIONS: I summarized all here: : : 1.) Is countdown value the same with frequency? [green] No [/green] : 2.) If I put 475 to AX, what will be put in AH and AL? [green] [code] Register AX=AH+AL
AX AH + AL =475 0000 0001 1101 1011 [/code] [/green] : 3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency? [green] No, its just a frequency value from 0-65536 [/green]
: 4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2) [green] I explained why you must send 2 bytes to this port earlier [/green]
: 5.) What's the meaning or OR and AND commands? [green] Already answered [/green]
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation".
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB).
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value"
4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code:
[code] (1) in al,61h ;get port 61 state (2) or al,00000011b ;turn on speaker (3) out 61h,al ;speaker on now (4) call delay ;go pause a little bit (5) and al,11111100b ;clear speaker enable (6) out 61h,al ;speaker off now [/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports?
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation".
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB).
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value"
4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code:
[code] (1) in al,61h ;get port 61 state (2) or al,00000011b ;turn on speaker (3) out 61h,al ;speaker on now (4) call delay ;go pause a little bit (5) and al,11111100b ;clear speaker enable (6) out 61h,al ;speaker off now [/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports?
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation". [green] Correct from what I have read. [/green]
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB). [green] In regards to register AX then AL would be the LSB and AH would be the MSB. But LSB and MSB could also mean 'bit' which is what it usually means. [/green]
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value" [green] yep [/green] 4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code: [code]
(1) in al,61h ;get port 61 state (2) or al,00000011b ;turn on speaker (3) out 61h,al ;speaker on now (4) call delay ;go pause a little bit (5) and al,11111100b ;clear speaker enable (6) out 61h,al ;speaker off now [/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports? [green] (1)You must get the state of which that port is in to know whats in it and to do that you must use a 'in' instruction to read the port and then modify the bits 0 and 1 while leaving the other bits unchanged. [/green]
Looks like alot but its alot of the same stuff just a little different for each variation. Thats the bulk of what you will use in your programming. [/green]
QUESTIONS I'M JUST CURIOUS ABOUT:
1.) If I typed "IN AL,61H", what would be the value of AL? [green] Whatever the state of that port is at the time. Could be different from time to time. The only concern for you here is to make sure bits 0 and 1 are enabled. The other bits are useless to you and should be untouched and left alone in their current state. [/green]
Comments
:
: Do somebody have a link for some codes so I can make music in assebley?
:
:
What operating system?
What hardware?
Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor?
Assembly is a very detail oriented language. Your questions need to be likewise.
(shameless self plug)
Here's links to 2 .wav players that work in DOS:
http://www.programmersheaven.com/search/download.asp?FileID=30034
http://www.programmersheaven.com/search/download.asp?FileID=23237
-jeff!
: :
: : Do somebody have a link for some codes so I can make music in assebley?
: :
: :
:
: What operating system?
: What hardware?
: Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor?
:
: Assembly is a very detail oriented language. Your questions need to be likewise.
:
:
: (shameless self plug)
: Here's links to 2 .wav players that work in DOS:
: http://www.programmersheaven.com/search/download.asp?FileID=30034
: http://www.programmersheaven.com/search/download.asp?FileID=23237
:
: -jeff!
:
Hi!
Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help.
We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?)
I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult.
: : :
: : : Do somebody have a link for some codes so I can make music in assebley?
: : :
: : :
: :
: : What operating system?
: : What hardware?
: : Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor?
: :
: : Assembly is a very detail oriented language. Your questions need to be likewise.
: :
: :
: : (shameless self plug)
: : Here's links to 2 .wav players that work in DOS:
: : http://www.programmersheaven.com/search/download.asp?FileID=30034
: : http://www.programmersheaven.com/search/download.asp?FileID=23237
: :
: : -jeff!
: :
: Hi!
:
: Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help.
: We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?)
: I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult.
:
:
:
ok,do i understand it right?you want create a disk which plays a song when booting from it?
a good oldschool way to play simple sounds is the adlib,which should be supported by most today cards(is this still true?hard to test this under todays XP-enviroments).this chip let you create a ton by specifing frequency,length,vibrato and few other sound-parameters to make the sound instruments-like.you can setup a guitar-like sound,too.
i assume you have some basic assembly-knowledge,this is surely not that hard to do,but you need some assembly-practice to code.i suggest you try to write this code under win9x and not XP.XP will not allow you to control the adlib directly.search this site or the web for adlib,there should be good descriptions for this chip or send me a private message
when you played your first notes successfully you can try to change your code to a bootable version.
: : : :
: : : : Do somebody have a link for some codes so I can make music in assebley?
: : : :
: : : :
: : :
: : : What operating system?
: : : What hardware?
: : : Do you want to just play music on something like a soundblaster, or actually MAKE music like with a midi editor?
: : :
: : : Assembly is a very detail oriented language. Your questions need to be likewise.
: : :
: : :
: : : (shameless self plug)
: : : Here's links to 2 .wav players that work in DOS:
: : : http://www.programmersheaven.com/search/download.asp?FileID=30034
: : : http://www.programmersheaven.com/search/download.asp?FileID=23237
: : :
: : : -jeff!
: : :
: : Hi!
: :
: : Thanks a lot for replying, I'll try to make it clearer. I just got a home-exame at school, where the teacher want us to get the computer to play an easy song. For that I need some notes (A, C, E osv) like playing a gitar? I know this must sound very crazy but I realy need help.
: : We are going to make it on a boot-disket, the computer have intel-cpu and the os is XP(but do the os mather?)
: : I'll also admitt that I'm verry new to assembly so please don't tell me that it's to dificult.
: :
: :
: :
:
: ok,do i understand it right?you want create a disk which plays a song when booting from it?
:
: a good oldschool way to play simple sounds is the adlib,which should be supported by most today cards(is this still true?hard to test this under todays XP-enviroments).this chip let you create a ton by specifing frequency,length,vibrato and few other sound-parameters to make the sound instruments-like.you can setup a guitar-like sound,too.
:
: i assume you have some basic assembly-knowledge,this is surely not that hard to do,but you need some assembly-practice to code.i suggest you try to write this code under win9x and not XP.XP will not allow you to control the adlib directly.search this site or the web for adlib,there should be good descriptions for this chip or send me a private message
:
: when you played your first notes successfully you can try to change your code to a bootable version.
:
:
:
Ummmm... I'm a noob... What's the syntax? or the INT? or the sub-function? Or a link to tutorial site?
Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days.
http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html
[/green]
: Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days.
:
: http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html
:
: [/green]
:
:
:
Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing...
: : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days.
: :
: : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html
: :
: : [/green]
: :
: :
: :
: Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing...
:
[green]
Are talking about the instructions 'out' and 'in' for port access?
[/green]
: : : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days.
: : :
: : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html
: : :
: : : [/green]
: : :
: : :
: : :
: : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing...
: :
:
: [green]
: Are talking about the instructions 'out' and 'in' for port access?
: [/green]
:
:
YES! YES! YES!
I'm new to Assembly Language. Then our teacher gave us an assignment to make a program that produce sounds using TASM. All I could understand for today is the "INT xxh" and "MOV AH, xxh" thing (or some like STOSB). Hope you could help me...
: : : : Might be an easier task to do it with the PC speaker being a novice even though the PC speaker is inferior now days.
: : : :
: : : : http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html
: : : :
: : : : [/green]
: : : :
: : : :
: : : :
: : : Ummmm.... I'm using TASM 2.0... Can't understand, especially the "OUT" thing...
: : :
: :
: : [green]
: : Are talking about the instructions 'out' and 'in' for port access?
: : [/green]
: :
: :
: YES! YES! YES!
:
: I'm new to Assembly Language. Then our teacher gave us an assignment to make a program that produce sounds using TASM. All I could understand for today is the "INT xxh" and "MOV AH, xxh" thing (or some like STOSB). Hope you could help me...
:
[green]
Those instruction aren't difficult to learn. They both can either take a immediate operand of size byte or for ports greater than 255 you must use the dx register.
[code]
in = in from port
out= out to port
mov dx, 1234
mov al, 32
out dx, al ;send the number 32 to port 1234
or
mov al, 32
out 42, al ;send the number 32 to port 42
mov dx, 1234
in al, dx ;copy byte in port 1234 to al
or
in al, 42 ;copy byte in port 42 to al
[/code]
What I suggest you do is at least download the instruction set reference from intel. That will give you a full explanation on how to use the instructions.
[/green]
I DID IT! I DID IT! I DID IT! I tried to find some sample source code from the Internet and I found this : I've found it from : http://www.talkaboutprogramming.com/group/alt.lang.asm/messages/73981.html
[code]
;
; PIANO.ASM [ - For DOS - ]
; Simple PC Speaker Piano Keyboard
; Freeware from Evenbit
;
;
.model tiny
.code
org 100h
main: jmp start
;
stor dw 0 ;our memory location storage
;
; Turn the cursor off.
;
start:
call curs_off ;go turn off cursor
;
; Get a keypress from the user, and act accordingly.
; (We're checking U.S. keyboard scan codes here.)
;
get_key:
mov ah,0 ;function 0 - wait for keypress
int 16h ;call ROM BIOS keyboard services
cmp ah,1 ;ESC key pressed?
je exit ;yes, so go exit
cmp ah,02h
je tone_1
cmp ah,03h
je tone_2
cmp ah,04h
je tone_3
cmp ah,05h
je tone_4
cmp ah,06h
je tone_5
cmp ah,07h
je tone_6
cmp ah,08h
je tone_7
cmp ah,09h
je tone_8
cmp ah,0ah
je tone_9
cmp ah,0bh
je tone_0
;
jmp get_key ;go get another keypress
;
exit:
call curs_on ;go turn cursor on
int 20h ;exit to DOS
;
tone_1:
mov ax, 272
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_2:
mov ax, 294
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_3:
mov ax, 314
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_4:
mov ax, 330
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_5:
mov ax, 350
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_6:
mov ax, 370
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_7:
mov ax, 392
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_8:
mov ax, 419
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_9:
mov ax, 440
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
tone_0:
mov ax, 475
mov stor, ax
call sounder ;go generate the tone
jmp get_key ;go get another keypress
;
;****************************************
; Our sub-routines start here.
;****************************************
;
; Turn cursor off.
;
curs_off:
mov ch,10h ;set bits to turn cursor off
mov ah,1 ;function 1 - cursor control
int 10h ;call ROM BIOS video services
ret ;return to caller
;
; Turn cursor on.
;
curs_on:
mov cx,0506h ;set bits to turn cursor on
mov ah,1 ;function 1 - cursor control
int 10h ;call ROM BIOS video services
ret ;return to caller
;
; Generate sound through the PC speaker.
;
[red]
sounder:
mov al,10110110b ;load control word
out 43h,al ;send it
mov ax,stor ;tone frequency
out 42h,al ;send LSB
mov al,ah ;move MSB to AL
out 42h,al ;save it
in al,61h ;get port 61 state
or al,00000011b ;turn on speaker
out 61h,al ;speaker on now
call delay ;go pause a little bit
and al,11111100b ;clear speaker enable
out 61h,al ;speaker off now
call clr_keyb ;go clear the keyboard buffer
ret ;return to caller
[/red]
delay:
mov ah,00h ;function 0 - get system timer tick
int 01Ah ;call ROM BIOS time-of-day services
add dx,4 ;add our delay value to DX
mov bx,dx ;store result in BX
pozz:
int 01Ah ;call ROM BIOS time-of-day services
cmp dx,bx ;has the delay duration passed?
jl pozz ;no, so go check again
ret ;return to caller
;
; Clear the keyboard buffer.
;
clr_keyb:
push es ;preserve ES
push di ;preserve DI
mov ax,40h ;BIOS segment in AX
mov es,ax ;transfer to ES
mov ax,1Ah ;keyboard head pointer in AX
mov di,ax ;transfer to DI
mov ax,1Eh ;keyboard buffer start in AX
mov es: word ptr [di],ax ;transfer to head pointer
inc di ;bump pointer to...
inc di ;...keyboard tail pointer
mov es: word ptr [di],ax ;transfer to tail pointer
pop di ;restore DI
pop es ;restore ES
ret ;return to caller
;
end main
end
[/code]
When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program.
Here I learn something: (I'm referring to the RED code)
1.) OUT is putting something to the port while IN is getting something to the port.
2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?).
3.) Then the STOR was sent to AX (What will be put to AH and AL?).
4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?)
5.) What are these things:
[code]
or al,00000011b ;turn on speaker
and al,11111100b ;clear speaker enable
[/code]
What's the meaning or OR and AND commands?
QUESTIONS: I summarized all here:
1.) Is countdown value the same with frequency?
2.) If I put 475 to AX, what will be put in AH and AL?
3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency?
4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2)
5.) What's the meaning or OR and AND commands?
6.) I tried to find some manuals in Intel Processor in http://www.intel.com/ but all I could see is Processors and it's specs... Where can I get an Intel Documentation?
: I DID IT! I DID IT! I DID IT! I tried to find some sample source code from the Internet and I found this : I've found it from : http://www.talkaboutprogramming.com/group/alt.lang.asm/messages/73981.html
:
: [code]
: ;
: ; PIANO.ASM [ - For DOS - ]
: ; Simple PC Speaker Piano Keyboard
: ; Freeware from Evenbit
: ;
: ;
: .model tiny
: .code
: org 100h
:
: main: jmp start
: ;
: stor dw 0 ;our memory location storage
: ;
: ; Turn the cursor off.
: ;
: start:
: call curs_off ;go turn off cursor
: ;
: ; Get a keypress from the user, and act accordingly.
: ; (We're checking U.S. keyboard scan codes here.)
: ;
: get_key:
: mov ah,0 ;function 0 - wait for keypress
: int 16h ;call ROM BIOS keyboard services
: cmp ah,1 ;ESC key pressed?
: je exit ;yes, so go exit
: cmp ah,02h
: je tone_1
: cmp ah,03h
: je tone_2
: cmp ah,04h
: je tone_3
: cmp ah,05h
: je tone_4
: cmp ah,06h
: je tone_5
: cmp ah,07h
: je tone_6
: cmp ah,08h
: je tone_7
: cmp ah,09h
: je tone_8
: cmp ah,0ah
: je tone_9
: cmp ah,0bh
: je tone_0
: ;
: jmp get_key ;go get another keypress
: ;
: exit:
: call curs_on ;go turn cursor on
: int 20h ;exit to DOS
: ;
: tone_1:
: mov ax, 272
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_2:
: mov ax, 294
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_3:
: mov ax, 314
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_4:
: mov ax, 330
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_5:
: mov ax, 350
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_6:
: mov ax, 370
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_7:
: mov ax, 392
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_8:
: mov ax, 419
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_9:
: mov ax, 440
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_0:
: mov ax, 475
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
:
:
:
: ;
: ;****************************************
: ; Our sub-routines start here.
: ;****************************************
: ;
: ; Turn cursor off.
: ;
: curs_off:
: mov ch,10h ;set bits to turn cursor off
: mov ah,1 ;function 1 - cursor control
: int 10h ;call ROM BIOS video services
: ret ;return to caller
: ;
: ; Turn cursor on.
: ;
: curs_on:
: mov cx,0506h ;set bits to turn cursor on
: mov ah,1 ;function 1 - cursor control
: int 10h ;call ROM BIOS video services
: ret ;return to caller
: ;
: ; Generate sound through the PC speaker.
: ;
: [red]
: sounder:
: mov al,10110110b ;load control word
: out 43h,al ;send it
: mov ax,stor ;tone frequency
: out 42h,al ;send LSB
: mov al,ah ;move MSB to AL
: out 42h,al ;save it
: in al,61h ;get port 61 state
: or al,00000011b ;turn on speaker
: out 61h,al ;speaker on now
: call delay ;go pause a little bit
: and al,11111100b ;clear speaker enable
: out 61h,al ;speaker off now
: call clr_keyb ;go clear the keyboard buffer
: ret ;return to caller
: [/red]
: delay:
: mov ah,00h ;function 0 - get system timer tick
: int 01Ah ;call ROM BIOS time-of-day services
: add dx,4 ;add our delay value to DX
: mov bx,dx ;store result in BX
: pozz:
: int 01Ah ;call ROM BIOS time-of-day services
: cmp dx,bx ;has the delay duration passed?
: jl pozz ;no, so go check again
: ret ;return to caller
: ;
: ; Clear the keyboard buffer.
: ;
: clr_keyb:
: push es ;preserve ES
: push di ;preserve DI
: mov ax,40h ;BIOS segment in AX
: mov es,ax ;transfer to ES
: mov ax,1Ah ;keyboard head pointer in AX
: mov di,ax ;transfer to DI
: mov ax,1Eh ;keyboard buffer start in AX
: mov es: word ptr [di],ax ;transfer to head pointer
: inc di ;bump pointer to...
: inc di ;...keyboard tail pointer
: mov es: word ptr [di],ax ;transfer to tail pointer
: pop di ;restore DI
: pop es ;restore ES
: ret ;return to caller
: ;
: end main
: end
: [/code]
:
: When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program.
:
:
: Here I learn something: (I'm referring to the RED code)
:
: 1.) OUT is putting something to the port while IN is getting something to the port.
:
: 2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?).
:
: 3.) Then the STOR was sent to AX (What will be put to AH and AL?).
:
: 4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?)
:
: 5.) What are these things:
:
: [code]
: or al,00000011b ;turn on speaker
: and al,11111100b ;clear speaker enable
: [/code]
:
: What's the meaning or OR and AND commands?
:
: QUESTIONS: I summarized all here:
:
: 1.) Is countdown value the same with frequency?
:
: 2.) If I put 475 to AX, what will be put in AH and AL?
:
: 3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency?
:
: 4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2)
:
: 5.) What's the meaning or OR and AND commands?
:
: 6.) I tried to find some manuals in Intel Processor in http://www.intel.com/ but all I could see is Processors and it's specs... Where can I get an Intel Documentation?
:
You could make it bootable with this program
http://alexfru.chat.ru/epm.html#bootprog
: ;
: ; PIANO.ASM [ - For DOS - ]
: ; Simple PC Speaker Piano Keyboard
: ; Freeware from Evenbit
: ;
: ;
: .model tiny
: .code
: org 100h
:
: main: jmp start
: ;
: stor dw 0 ;our memory location storage
: ;
: ; Turn the cursor off.
: ;
: start:
: call curs_off ;go turn off cursor
: ;
: ; Get a keypress from the user, and act accordingly.
: ; (We're checking U.S. keyboard scan codes here.)
: ;
: get_key:
: mov ah,0 ;function 0 - wait for keypress
: int 16h ;call ROM BIOS keyboard services
: cmp ah,1 ;ESC key pressed?
: je exit ;yes, so go exit
: cmp ah,02h
: je tone_1
: cmp ah,03h
: je tone_2
: cmp ah,04h
: je tone_3
: cmp ah,05h
: je tone_4
: cmp ah,06h
: je tone_5
: cmp ah,07h
: je tone_6
: cmp ah,08h
: je tone_7
: cmp ah,09h
: je tone_8
: cmp ah,0ah
: je tone_9
: cmp ah,0bh
: je tone_0
: ;
: jmp get_key ;go get another keypress
: ;
: exit:
: call curs_on ;go turn cursor on
: int 20h ;exit to DOS
: ;
: tone_1:
: mov ax, 272
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_2:
: mov ax, 294
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_3:
: mov ax, 314
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_4:
: mov ax, 330
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_5:
: mov ax, 350
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_6:
: mov ax, 370
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_7:
: mov ax, 392
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_8:
: mov ax, 419
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_9:
: mov ax, 440
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
: tone_0:
: mov ax, 475
: mov stor, ax
: call sounder ;go generate the tone
: jmp get_key ;go get another keypress
:
:
:
: ;
: ;****************************************
: ; Our sub-routines start here.
: ;****************************************
: ;
: ; Turn cursor off.
: ;
: curs_off:
: mov ch,10h ;set bits to turn cursor off
: mov ah,1 ;function 1 - cursor control
: int 10h ;call ROM BIOS video services
: ret ;return to caller
: ;
: ; Turn cursor on.
: ;
: curs_on:
: mov cx,0506h ;set bits to turn cursor on
: mov ah,1 ;function 1 - cursor control
: int 10h ;call ROM BIOS video services
: ret ;return to caller
: ;
: ; Generate sound through the PC speaker.
: ;
: [red]
: sounder:
: mov al,10110110b ;load control word
: out 43h,al ;send it
: mov ax,stor ;tone frequency
: out 42h,al ;send LSB
: mov al,ah ;move MSB to AL
: out 42h,al ;save it
: in al,61h ;get port 61 state
: or al,00000011b ;turn on speaker
: out 61h,al ;speaker on now
: call delay ;go pause a little bit
: and al,11111100b ;clear speaker enable
: out 61h,al ;speaker off now
: call clr_keyb ;go clear the keyboard buffer
: ret ;return to caller
: [/red]
: delay:
: mov ah,00h ;function 0 - get system timer tick
: int 01Ah ;call ROM BIOS time-of-day services
: add dx,4 ;add our delay value to DX
: mov bx,dx ;store result in BX
: pozz:
: int 01Ah ;call ROM BIOS time-of-day services
: cmp dx,bx ;has the delay duration passed?
: jl pozz ;no, so go check again
: ret ;return to caller
: ;
: ; Clear the keyboard buffer.
: ;
: clr_keyb:
: push es ;preserve ES
: push di ;preserve DI
: mov ax,40h ;BIOS segment in AX
: mov es,ax ;transfer to ES
: mov ax,1Ah ;keyboard head pointer in AX
: mov di,ax ;transfer to DI
: mov ax,1Eh ;keyboard buffer start in AX
: mov es: word ptr [di],ax ;transfer to head pointer
: inc di ;bump pointer to...
: inc di ;...keyboard tail pointer
: mov es: word ptr [di],ax ;transfer to tail pointer
: pop di ;restore DI
: pop es ;restore ES
: ret ;return to caller
: ;
: end main
: end
: [/code]
:
: When you run the program, you'll just press (0-9) and the sound will produce, while ESC exits the program.
:
:
: Here I learn something: (I'm referring to the RED code)
:
: 1.) OUT is putting something to the port while IN is getting something to the port.
[green]
Correct
[/green]
: 2.) (10110110b = 182 = B6h) was sent to port 43h. According to http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html, Port 43h is a System Timer 2, is used to control sound generation. And the number that was inputed to it is countdown value (is it the same with frequency?).
[green]
This only sets up the speaker for sound generation
[/green]
:
: 3.) Then the STOR was sent to AX (What will be put to AH and AL?).
[green]
If you look at the tone section depending on the tone the frequency is stored to [red]stor[/red].
[/green]
: 4.) Then "something" (because I don't know what went to AL) was sent to Port 42h. It said Port 42h is used to set the LOW and HIGH byte (What is it? Is it the peaks and bottoms of the frequency?). Twice... (Can't understand this thing, will the second value OVERWRITE the first value?)
[green]
No, port 42h is 8bit but you must send a 16bit value to it so how do you do that? You send the LSB(Least Significant Byte) and then the MSB(Most Significant Byte). Since the instruction 'out' can only take a 8bit value from AL, you must plug in the LSB into AL first and send it then plug in the MSB into AL next and send it
[/green]
:
: 5.) What are these things:
:
: [code]
: or al,00000011b ;turn on speaker
: and al,11111100b ;clear speaker enable
: [/code]
[green]
The 1st one makes sure bits 1 and 0 are on no matter what. The second clears bits 1 and 0 because anything 'anded' with 0 is false.
[/green]
: What's the meaning or OR and AND commands?
[green]
'Or' is to set bits 'on' and 'and' is usually used to check a bit for truth or clear bits.
[/green]
: QUESTIONS: I summarized all here:
:
: 1.) Is countdown value the same with frequency?
[green]
No
[/green]
: 2.) If I put 475 to AX, what will be put in AH and AL?
[green]
[code]
Register AX=AH+AL
AX
AH + AL =475
0000 0001 1101 1011
[/code]
[/green]
: 3.) Is the LOW and HIGH byte the peaks and bottoms of the frequency?
[green]
No, its just a frequency value from 0-65536
[/green]
: 4.) If I sent two values in a port, will the second value OVERWRITE the first one? (Co'z that's my understanding, AX = VALUE1 then AX = VALUE 2, therefore AX is VALUE2)
[green]
I explained why you must send 2 bytes to this port earlier
[/green]
: 5.) What's the meaning or OR and AND commands?
[green]
Already answered
[/green]
: 6.) I tried to find some manuals in Intel Processor in http://www.intel.com/ but all I could see is Processors and it's specs... Where can I get an Intel Documentation?
:
[/green]
http://www.fh-bochum.de/fb3/meva-lab/docu/
Download the intel vol 1 and 2. Vol 3 is for system programming which you don't need yet. Also, download the dosints.pdf.
[/green]
OK, NOW I LEARNED:
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation".
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB).
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value"
4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code:
[code]
(1) in al,61h ;get port 61 state
(2) or al,00000011b ;turn on speaker
(3) out 61h,al ;speaker on now
(4) call delay ;go pause a little bit
(5) and al,11111100b ;clear speaker enable
(6) out 61h,al ;speaker off now
[/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports?
I tried to visit: http://www.fh-bochum.de/fb3/meva-lab/docu/ for documentations but it's "server down" (maybe). I also tried to visit http://www.intel.com/ and download the Instruction Set and WHOA! 1000+ pages! And quite yet complicated.
[green]
QUESTIONS I'M JUST CURIOUS ABOUT:
1.) If I typed "IN AL,61H", what would be the value of AL?
2.) Where can I find a documentation about Ports?
[/green]
BTW, thanks for your support you've been a great help for me...
OK, NOW I LEARNED:
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation".
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB).
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value"
4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code:
[code]
(1) in al,61h ;get port 61 state
(2) or al,00000011b ;turn on speaker
(3) out 61h,al ;speaker on now
(4) call delay ;go pause a little bit
(5) and al,11111100b ;clear speaker enable
(6) out 61h,al ;speaker off now
[/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports?
I tried to visit: http://www.fh-bochum.de/fb3/meva-lab/docu/ for documentations but it's "server down" (maybe). I also tried to visit http://www.intel.com/ and download the Instruction Set and WHOA! 1000+ pages! And quite yet complicated.
[green]
QUESTIONS I'M JUST CURIOUS ABOUT:
1.) If I typed "IN AL,61H", what would be the value of AL?
2.) Where can I find a documentation about Ports?
[/green]
BTW, thanks for your support you've been a great help for me...
OK, NOW I LEARNED:
1.) To make it simple, sending B6h to Port 43h "sets up the speaker for sound generation".
[green]
Correct from what I have read.
[/green]
2.) The LSB (Least Significant Byte) and the MSB (Most Significant Byte) is almost the same as AL(LSB) and AH(MSB).
[green]
In regards to register AX then AL would be the LSB and AH would be the MSB. But LSB and MSB could also mean 'bit' which is what it usually means.
[/green]
3.) The reason why Port 42h needs two values is because "Port 42 is 8bit, but it needs 16bit value"
[green]
yep
[/green]
4.) "OR" and "AND" commands are Bit Wise Operators, they are used to manipulate bits (at first I thought it was like "C", the "Logical" Operators). So in the code:
[code]
(1) in al,61h ;get port 61 state
(2) or al,00000011b ;turn on speaker
(3) out 61h,al ;speaker on now
(4) call delay ;go pause a little bit
(5) and al,11111100b ;clear speaker enable
(6) out 61h,al ;speaker off now
[/code]
(1) It gets the state value of the port (I'm curious, then what is the value of AL now?), then (2) it changes it values to set to turn on the speaker, then (3) it sends it back again, then (4) just delay for a moment, then (5) it changes the value again to set to turn the speaker off, then (6) send it back again to "shut" it down. Ryt? Is there any site that I could have a documentation of Ports?
[green]
(1)You must get the state of which that port is in to know whats in it and to do that you must use a 'in' instruction to read the port and then modify the bits 0 and 1 while leaving the other bits unchanged.
[/green]
I tried to visit: http://www.fh-bochum.de/fb3/meva-lab/docu/ for documentations but it's "server down" (maybe). I also tried to visit http://www.intel.com/ and download the Instruction Set and WHOA! 1000+ pages! And quite yet complicated.
[green]
Hmm the link works for me. Yes the manuals are very large but only concern yourself with the instruction set explanations.
Read up on these instructions X=b-byte, w-word, d-dword
add, sub, mul, div, stosX, lodsX, xor, and, or, not, neg, shr, shl, rol, ror, in, out, insX, outsX, rep, lea, mov, jxx, jmp, cld, std, clc, stc, call, ret, cli, and sti.
Looks like alot but its alot of the same stuff just a little different for each variation. Thats the bulk of what you will use in your programming.
[/green]
QUESTIONS I'M JUST CURIOUS ABOUT:
1.) If I typed "IN AL,61H", what would be the value of AL?
[green]
Whatever the state of that port is at the time. Could be different from time to time. The only concern for you here is to make sure bits 0 and 1 are enabled. The other bits are useless to you and should be untouched and left alone in their current state.
[/green]
2.) Where can I find a documentation about Ports?
[green]
http://www.clipx.net/norton.php
good site
[/green]
BTW, thanks for your support you've been a great help for me...