aboutsummaryrefslogtreecommitdiff
path: root/devtools/tasmrecover/dreamweb/sblaster.asm
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2011-06-05 11:00:00 +0200
committerWillem Jan Palenstijn2011-06-05 11:00:00 +0200
commit72148570de56e5c42e2fe8091e9b466610e49785 (patch)
treee90423f516d3f89ebf68564d1547839d419d14b0 /devtools/tasmrecover/dreamweb/sblaster.asm
parent5b7754e3f095eb8a469dd4b7de5a6379f8e13c27 (diff)
downloadscummvm-rg350-72148570de56e5c42e2fe8091e9b466610e49785.tar.gz
scummvm-rg350-72148570de56e5c42e2fe8091e9b466610e49785.tar.bz2
scummvm-rg350-72148570de56e5c42e2fe8091e9b466610e49785.zip
DREAMWEB: Add original Dreamweb assembly sources
They have been released under the GPL with permission from Neil Dodwell. Note that the version of these sources that was added in 9599894a4b2f79672fc3e2ca5a93ef9c7d457c08 has been tweaked to prepare for processing by tasmrecover.
Diffstat (limited to 'devtools/tasmrecover/dreamweb/sblaster.asm')
-rw-r--r--devtools/tasmrecover/dreamweb/sblaster.asm1293
1 files changed, 1293 insertions, 0 deletions
diff --git a/devtools/tasmrecover/dreamweb/sblaster.asm b/devtools/tasmrecover/dreamweb/sblaster.asm
new file mode 100644
index 0000000000..9eb9afc08f
--- /dev/null
+++ b/devtools/tasmrecover/dreamweb/sblaster.asm
@@ -0,0 +1,1293 @@
+;Copyright (c) 1990-2011 by Neil Dodwell
+;Released with permission from Neil Dodwell under GPLv2
+;See LICENSE file for full license text
+; Creative Reality Sound Blaster Drivers . (C) 1994 Creative Reality
+
+; Very sparsly commented.
+
+
+
+;These drivers are not stand alone. We had them as an integral part of the
+;game.
+;
+;Put interupt no. into SOUNDINT, base address (eg 220h) into SOUNDBASEADD.
+;If interupt is 255 then no card is assumed.
+;
+;Call soundstartup at beginning of program to test card and initialise.
+;
+;This code assumes that EMS has been initialised
+;Emm page frame is in variable EMMPAGEFRAME. Handle is in EMMHANDLE.
+;
+;Call loadsample with a filename in CS:DX (ie. in the code somewhere)
+;
+;To play a sample call playchannel0 or playchannel1 with sound no. in al.
+;
+;Call endsample to restore interupts and halt sound.
+;
+;
+
+
+
+
+;------------------------------------------- Initial sound set up and end ---
+
+Loadspeech proc near
+
+ cmp soundint,255
+ jz dontbother8
+
+ call cancelch1
+
+ mov speechloaded,0
+ call createname
+
+ mov speechlength,0
+ mov dx,offset cs:speechfilename
+ call openfilenocheck
+ jc dontbother8
+
+ mov bx,speechemmpage
+
+moreloadspeech: push dx bx
+
+ push es di bx
+ mov al,2
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror
+ mov ds,emmpageframe
+ pop bx di es
+ inc bx
+ push es di
+ mov al,3
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror
+ mov ds,emmpageframe
+ mov es,emmpageframe
+ mov di,8000h
+ mov cx,4000h
+ mov ax,0
+ rep stosw
+ pop di es
+
+ mov cx,8000h
+ mov dx,8000h
+ call readfromfile
+ mov cl,11
+ shr ax,cl
+ add speechlength,ax
+ pop bx dx
+ add bx,2
+ cmp ax,0
+ jnz moreloadspeech
+ call closefile
+
+ mov es,sounddata2
+ mov di,50*6
+ mov ax,speechemmpage
+ mov [es:di],al
+ mov ax,0
+ mov [es:di+1],ax
+ mov ax,speechlength
+ mov [es:di+3],ax
+ mov speechloaded,1
+dontbother8: ret
+
+speechfilename: db "SPEECH\"
+speechfile: db "R24C0005.RAW",0
+
+ endp
+
+
+
+Createname proc near
+
+ push ax
+ mov di,offset cs:speechfile
+ mov byte ptr [cs:di+0],dl ;"R"
+ mov [cs:di+3],cl
+
+ mov al,dh ;reallocation
+ mov ah,"0"-1
+findten: inc ah
+ sub al,10
+ jnc findten
+ mov [cs:di+1],ah
+ add al,10+"0"
+ mov [cs:di+2],al
+ pop ax
+
+ mov cl,"0"-1
+thousandsc: inc cl
+ sub ax,1000
+ jnc thousandsc
+ add ax,1000
+ mov [cs:di+4],cl
+ mov cl,"0"-1
+hundredsc: inc cl
+ sub ax,100
+ jnc hundredsc
+ add ax,100
+ mov [cs:di+5],cl
+ mov cl,"0"-1
+tensc: inc cl
+ sub ax,10
+ jnc tensc
+ add ax,10
+ mov [cs:di+6],cl
+ add al,"0"
+ mov [cs:di+7],al
+ ret
+
+ endp
+
+
+
+
+
+
+Loadsample proc near
+
+ cmp soundint,255
+ jz dontbother
+
+ call openfile
+ call readheader
+ mov bx,[es:di]
+ push es di bx
+ mov ds,sounddata
+ pop cx
+ mov dx,0
+ call readfromfile
+ pop di es
+
+ add di,2
+ mov bx,0
+ mov dx,[es:di]
+ add dx,1
+ shr dx,1
+
+ mov soundemmpage,0
+
+moreload: push dx bx
+
+ push es di bx
+ mov al,2
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror
+ mov ds,emmpageframe
+ pop bx di es
+ inc bx
+ push es di
+ mov al,3
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror
+ mov ds,emmpageframe
+ pop di es
+
+ mov cx,8000h
+ mov dx,8000h
+ call readfromfile
+ pop bx dx
+ add bx,2
+ add soundemmpage,2
+ dec dx
+ jnz moreload
+ ;inc soundemmpage
+ call closefile
+dontbother: ret
+
+emmerror: mov gameerror,7
+ jmp quickquit2
+
+ endp
+
+
+
+
+
+
+Loadsecondsample proc near
+
+ cmp soundint,255
+ jz dontbother9
+
+ cmp ch0playing,12
+ jc ch0oksecond
+ cmp ch0playing,255
+ jz ch0oksecond
+ call cancelch0
+ ;mov cx,100
+ ;call hangon
+ jmp ch0oksecond
+justcancel: call cancelch0
+ch0oksecond: cmp ch1playing,12
+ jc ch1oksecond
+ call cancelch1
+
+ch1oksecond: call openfile
+ call readheader
+ mov bx,[es:di]
+ push es di bx
+ mov ds,sounddata2
+ pop cx
+ mov dx,0
+ call readfromfile
+
+ mov cx,100
+ mov di,0
+ mov es,sounddata2
+ mov bx,soundemmpage
+adjustemmpage: mov al,[es:di]
+ add al,bl
+ mov [es:di],al
+ add di,6
+ loop adjustemmpage
+
+ pop di es
+
+ add di,2
+ mov bx,soundemmpage
+ mov speechemmpage,bx
+ mov dx,[es:di]
+ add dx,1
+ shr dx,1
+
+moreload2: push dx bx
+
+ push es di bx
+ mov al,2
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror2
+ mov ds,emmpageframe
+ pop bx di es
+ inc bx
+ push es di
+ mov al,3
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ cmp ah,0
+ jnz emmerror2
+ mov ds,emmpageframe
+ pop di es
+
+ mov cx,8000h
+ mov dx,8000h
+ call readfromfile
+ pop bx dx
+ add bx,2
+ add speechemmpage,2
+ dec dx
+ jnz moreload2
+ call closefile
+dontbother9: ret
+
+emmerror2: mov gameerror,7
+ jmp quickquit2
+
+ endp
+
+
+
+
+
+
+Soundstartup proc near
+
+ cmp soundint,255
+ jz dontbother2
+
+ mov dx,soundbaseadd
+ add dx,0eh
+ mov DSP_status,dx
+ mov dx,soundbaseadd
+ add dx,0ch
+ mov DSP_write,dx
+
+ mov al,1
+ mov dx,soundbaseadd
+ add dx,0006h
+ out dx,al
+ push ax ax ax ax ax ax ax ax
+ pop ax ax ax ax ax ax ax ax
+ mov al,0
+ out dx,al
+
+ mov dx,DSP_status
+ mov cx,2000
+waitinit: in al,dx
+ and al,128
+ jz waitinit
+ mov dx,soundbaseadd
+ add dx,000ah
+ in al,dx
+ cmp al,0aah
+ jz dspready
+ loop waitinit
+ mov gameerror,2
+ jmp quickquit
+
+dspready: call trysoundalloc
+
+ cli
+ mov ah,40h ;set sample rate
+ call out22c
+ mov ah,210 ;of 22050Hz
+ call out22c
+ sti
+
+ call checksoundint
+
+ mov ah,35h
+ mov al,soundint
+ add al,8
+ int 21h
+ mov oldsoundintseg,es ; Save es:bx to temp memory
+ mov oldsoundintadd,bx
+ push cs
+ pop ds
+ mov dx,offset cs:dmaend
+ mov ah,25h
+ mov al,soundint
+ add al,8
+ int 21h ; Set to new
+
+ call enablesoundint
+
+ mov al,sounddmachannel
+ xor ah,ah
+ mov bx,offset cs:dmaaddresses
+ add bx,ax
+ mov al,[cs:bx]
+ mov dmaaddress,al
+
+ mov ah,0d1h ;speaker on
+ call out22c
+ mov ah,0d0h
+ call out22c
+
+dontbother2: ret
+
+dmaaddresses db 87h,83h,81h,82h
+
+ endp
+
+
+
+
+
+Trysoundalloc proc near
+
+ cmp needsoundbuff,1
+ jz gotsoundbuff
+ inc soundtimes
+ mov bx,(16384+2048)/16
+ call allocatemem
+ mov soundbuffer,ax
+ push ax
+ mov al,ah
+ mov cl,4
+ shr al,cl
+ mov soundbufferpage,al
+ pop ax
+ mov cl,4
+ shl ax,cl
+ mov soundbufferad,ax
+ cmp ax,0b7ffh
+ jnc soundfail
+
+ mov es,soundbuffer
+ mov di,0
+ mov cx,16384/2
+ mov ax,7f7fh
+ rep stosw
+ mov needsoundbuff,1
+ ret
+
+soundfail: mov es,soundbuffer
+ call deallocatemem
+gotsoundbuff: ret
+
+ endp
+
+
+
+
+
+
+Setsoundoff proc near
+
+ cmp soundint,255
+ jz dontbother28
+ mov soundbufferwrite,0
+ cli
+ call setupPIT
+ mov soundbufferwrite,4096
+ call startdmablock
+ sti
+dontbother28: ret
+
+ endp
+
+
+
+
+
+
+Checksoundint proc near
+
+ mov ah,0d3h ;speaker off
+ call out22c
+
+ mov testresult,0
+ mov ah,35h
+ mov al,soundint
+ add al,8
+ int 21h
+ mov oldsoundintseg,es
+ mov oldsoundintadd,bx
+ push cs
+ pop ds
+ mov dx,offset cs:interupttest
+ mov ah,25h
+ mov al,soundint
+ add al,8
+ int 21h
+
+ call enablesoundint
+
+ mov ah,0f2h
+ call out22c
+
+ mov cx,20
+ call hangon
+
+ call disablesoundint
+
+ mov dx,oldsoundintseg
+ mov ds,dx
+ mov dx,oldsoundintadd ;Restore old interupt vector
+ mov ah,25h
+ mov al,soundint
+ add al,8
+ int 21h
+
+ cmp testresult,1
+ jz interuptworked
+ mov gameerror,6 ;interupt wrong
+ jmp quickquit ;exit to DOS with error
+
+interuptworked: ret
+
+ endp
+
+
+
+
+
+Enablesoundint proc near
+
+ mov dx,21h ; Enable int?
+ in al,dx
+ mov currentirq,al
+ mov ah,11111110b
+ mov cl,soundint
+ rol ah,cl
+ and al,ah
+ out dx,al
+ ret
+
+ endp
+
+
+
+
+
+Disablesoundint proc near
+
+ mov al,soundint
+ mov dx,21h
+ mov al,currentirq
+ out dx,al
+ ret
+
+ endp
+
+
+
+
+Interupttest proc near
+
+ cli
+ push ax dx
+ mov testresult,1
+ mov dx,DSP_status
+ in al,dx
+ mov al,20h
+ out 20h,al
+ pop dx ax
+ iret
+
+ endp
+
+
+
+
+
+Soundend proc near
+
+ cmp soundint,255
+ jz dontbother3
+
+ call getridofPIT
+
+ mov ah,0d0h
+ call out22c
+
+ call disablesoundint
+
+ mov ds,oldsoundintseg ;for keys
+ mov dx,oldsoundintadd ;Restore old interupt vector
+ mov ah,25h
+ mov al,soundint
+ add al,8
+ int 21h
+
+dontbother3: ret
+
+ endp
+
+
+
+
+
+Out22c proc near
+
+ mov dx,DSP_write
+notclear: in al,dx
+ or al,al
+ js notclear
+ mov al,ah
+ out dx,al
+ ret
+
+ endp
+
+
+
+
+
+;---------------------------------------------------------------------------
+
+
+
+
+Playchannel0 proc near ;al=sound no
+ ;ah=times to repeat
+ cmp soundint,255
+ jz dontbother4
+
+ push es ds bx cx di si
+
+ mov ch0playing,al
+ mov es,sounddata
+ cmp al,12
+ jc notsecondbank
+ mov es,sounddata2
+ sub al,12
+notsecondbank: mov ch0repeat,ah
+ mov ah,0
+ add ax,ax
+ mov bx,ax
+ add ax,ax
+ add bx,ax
+
+ mov al,[es:bx]
+ mov ah,0
+ mov ch0emmpage,ax
+ mov ax,[es:bx+1]
+ mov ch0offset,ax
+ mov ax,[es:bx+3]
+ mov ch0blockstocopy,ax
+
+ cmp ch0repeat,0
+ jz nosetloop
+ mov ax,ch0emmpage
+ mov ch0oldemmpage,ax
+ mov ax,ch0offset
+ mov ch0oldoffset,ax
+ mov ax,ch0blockstocopy
+ mov ch0oldblockstocopy,ax
+
+nosetloop: pop si di cx bx ds es
+
+dontbother4: ret
+
+ endp
+
+
+
+
+
+
+
+Playchannel1 proc near ;al=sound no
+
+ cmp soundint,255
+ jz dontbother5
+ cmp ch1playing,7
+ jz dontbother5
+ push es ds bx cx di si
+
+ mov ch1playing,al
+ mov es,sounddata
+ cmp al,12
+ jc notsecondbank1
+ mov es,sounddata2
+ sub al,12
+notsecondbank1: mov ah,0
+ add ax,ax
+ mov bx,ax
+ add ax,ax
+ add bx,ax
+
+ mov al,[es:bx]
+ mov ah,0
+ mov ch1emmpage,ax
+ mov ax,[es:bx+1]
+ mov ch1offset,ax
+ mov ax,[es:bx+3]
+ mov ch1blockstocopy,ax
+
+ pop si di cx bx ds es
+
+dontbother5: ret
+
+ endp
+
+
+
+
+
+
+
+
+Makenextblock proc near
+
+ call volumeadjust
+
+ call loopchannel0
+ cmp ch1blockstocopy,0
+ jz mightbeonlych0
+ cmp ch0blockstocopy,0
+ jz mightbeonlych1
+
+ dec ch0blockstocopy
+ dec ch1blockstocopy
+ call bothchannels
+ ret
+
+mightbeonlych1: mov ch0playing,255
+ cmp ch1blockstocopy,0
+ jz notch1only
+ dec ch1blockstocopy
+ call channel1only
+notch1only: ret
+
+mightbeonlych0: mov ch1playing,255
+ cmp ch0blockstocopy,0
+ jz notch0only
+ dec ch0blockstocopy
+ call channel0only
+ ret
+notch0only: mov es,soundbuffer
+ mov di,soundbufferwrite
+ mov cx,1024
+ mov ax,7f7fh
+ rep stosw
+ and di,16384-1
+ mov soundbufferwrite,di
+ ret
+
+ endp
+
+
+
+
+Volumeadjust proc near
+
+ mov al,volumedirection
+ cmp al,0
+ jz volok
+ mov al,volume
+ cmp al,volumeto
+ jz volfinish
+ add volumecount,64
+ jnz volok
+ mov al,volume
+ add al,volumedirection
+ mov volume,al
+ ret
+volfinish: mov volumedirection,0
+volok: ret
+
+ endp
+
+
+
+Loopchannel0 proc near
+
+ cmp ch0blockstocopy,0
+ jnz notloop
+ cmp ch0repeat,0
+ jz notloop
+ cmp ch0repeat,255
+ jz endlessloop
+ dec ch0repeat
+endlessloop: mov ax,ch0oldemmpage
+ mov ch0emmpage,ax
+ mov ax,ch0oldoffset
+ mov ch0offset,ax
+ mov ax,ch0blockstocopy
+ add ax,ch0oldblockstocopy
+ mov ch0blockstocopy,ax
+ ret
+notloop: ret
+
+ endp
+
+
+
+
+
+
+
+Cancelch0 proc near
+
+ mov ch0repeat,0
+ mov ch0blockstocopy,0
+ mov ch0playing,255
+ ret
+
+ endp
+
+
+
+Cancelch1 proc near
+
+ mov ch1blockstocopy,0
+ mov ch1playing,255
+ ret
+
+ endp
+
+
+
+
+Channel0only proc near
+
+ call saveems
+ mov al,0
+ mov bx,ch0emmpage
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+
+ mov es,soundbuffer
+ mov ds,emmpageframe
+ mov di,soundbufferwrite
+ mov si,ch0offset
+
+ call channel0tran
+ call restoreems
+
+ and di,16384-1
+ mov soundbufferwrite,di
+ and si,16384-1
+ mov ch0offset,si
+ cmp si,0
+ jnz notch0endofpage0
+ inc ch0emmpage
+notch0endofpage0: ret
+
+ endp
+
+
+
+
+Channel1only proc near
+
+ call saveems
+ mov al,1
+ mov bx,ch1emmpage
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+
+ mov es,soundbuffer
+ mov ds,emmpageframe
+ mov di,soundbufferwrite
+ mov si,ch1offset
+ add si,16384
+
+ mov cx,1024
+ rep movsw
+ call restoreems
+
+ and di,16384-1
+ mov soundbufferwrite,di
+ and si,16384-1
+ mov ch1offset,si
+ cmp si,0
+ jnz notch1endofpage1
+ inc ch1emmpage
+notch1endofpage1: ret
+
+ endp
+
+
+
+
+
+Channel0tran proc near
+
+ cmp volume,0
+ jnz lowvolumetran
+ mov cx,1024
+ rep movsw
+ ret
+
+lowvolumetran: mov cx,1024
+ mov bh,volume
+ mov bl,0
+ add bx,16384-256
+volloop: lodsw
+ mov bl,al
+ mov al,[es:bx]
+ mov bl,ah
+ mov ah,[es:bx]
+ stosw
+ loop volloop
+ ret
+
+
+ endp
+
+
+
+
+
+
+
+
+Bothchannels proc near ;rather slow routine
+ ;to mix two channels
+
+ call saveems
+ mov al,0
+ mov bx,ch0emmpage
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+ mov al,1
+ mov bx,ch1emmpage
+ mov dx,emmhandle
+ mov ah,44h
+ int 67h
+
+ mov es,soundbuffer
+ mov ds,emmpageframe
+ mov di,soundbufferwrite
+ mov si,ch0offset
+ mov bx,ch1offset
+ add bx,16384
+ mov cx,2048
+ mov dh,128
+ mov dl,255
+
+ call domix
+ call restoreems
+
+ and di,16384-1
+ mov soundbufferwrite,di
+
+ mov si,ch0offset
+ add si,2048
+ and si,16384-1
+ mov ch0offset,si
+ cmp si,0
+ jnz notbothendofpage0
+ inc ch0emmpage
+notbothendofpage0: mov si,ch1offset
+ add si,2048
+ and si,16384-1
+ mov ch1offset,si
+ cmp si,0
+ jnz notbothendofpage1
+ inc ch1emmpage
+notbothendofpage1: ret
+
+ endp
+
+
+
+Saveems proc near
+
+ mov ah,4eh
+ mov al,0
+ mov es,soundbuffer
+ mov di,16384+2048-256
+ int 67h
+ ret
+
+ endp
+
+
+Restoreems proc near
+
+ push si di
+ mov ah,4eh
+ mov al,1
+ mov ds,soundbuffer
+ mov si,16384+2048-256
+ int 67h
+ pop di si
+ ret
+
+ endp
+
+
+
+Domix proc near
+
+ cmp volume,0
+ jnz lowvolumemix
+
+slow: lodsb
+ mov ah,[bx]
+ inc bx
+ cmp al,dh
+ jnc toplot
+
+botlot: cmp ah,dh
+ jnc nodistort
+ add al,ah
+ js botok
+ xor al,al
+ stosb
+ loop slow
+ jmp doneit
+botok: xor al,dh
+ stosb
+ loop slow
+ jmp doneit
+
+toplot: cmp ah,dh
+ jc nodistort
+ add al,ah
+ jns topok
+ mov al,dl
+ stosb
+ loop slow
+ jmp doneit
+topok: xor al,dh
+ stosb
+ loop slow
+ jmp doneit
+
+nodistort: add al,ah
+ xor al,dh
+ stosb
+ loop slow
+ jmp doneit
+
+
+lowvolumemix: lodsb
+ push bx
+ mov bh,volume
+ add bh,63
+ mov bl,al
+ mov al,[es:bx]
+ pop bx
+
+ mov ah,[bx]
+ inc bx
+ cmp al,dh
+ jnc toplotv
+
+botlotv: cmp ah,dh
+ jnc nodistortv
+ add al,ah
+ js botokv
+ xor al,al
+ stosb
+ loop lowvolumemix
+ jmp doneit
+botokv: xor al,dh
+ stosb
+ loop lowvolumemix
+ jmp doneit
+
+toplotv: cmp ah,dh
+ jc nodistortv
+ add al,ah
+ jns topokv
+ mov al,dl
+ stosb
+ loop lowvolumemix
+ jmp doneit
+topokv: xor al,dh
+ stosb
+ loop lowvolumemix
+ jmp doneit
+
+nodistortv: add al,ah
+ xor al,dh
+ stosb
+ loop lowvolumemix
+doneit: ret
+
+
+ endp
+
+
+
+
+
+
+
+Dmaend proc near
+
+ cli
+ push ax cx dx
+ call startdmablock
+ mov dx,DSP_status
+ in al,dx
+ mov al,20h
+ out 20h,al
+ pop dx cx ax
+ iret
+
+ endp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Startdmablock proc near
+
+ mov al,sounddmachannel ;cx=length
+ or al,4 ;bx=offset
+ out 0ah,al
+ xor al,al
+ out 0ch,al
+
+ mov al,48h
+ or al,sounddmachannel
+ out 0bh,al
+
+ mov cx,soundbufferad
+ xor dh,dh
+ mov dl,sounddmachannel
+ shl dl,1
+ mov al,cl
+ out dx,al
+ mov al,ch
+ out dx,al
+
+ mov dl,dmaaddress
+ mov al,soundbufferpage ;hardware page
+ out dx,al
+
+ mov dl,sounddmachannel
+ shl dl,1
+ inc dl
+ mov cx,16384-1
+ mov al,cl
+ out dx,al
+ mov al,ch
+ out dx,al
+
+ mov al,sounddmachannel
+ out 0ah,al ;dmac programmed
+
+ mov dx,DSP_write
+notclear1: in al,dx
+ or al,al
+ js notclear1
+ mov al,14h
+ out dx,al
+notclear2: in al,dx
+ or al,al
+ js notclear2
+ mov al,cl
+ out dx,al
+notclear3: in al,dx
+ or al,al
+ js notclear3
+ mov al,ch
+ out dx,al
+
+ ret
+
+
+ endp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SetupPIT proc near
+
+ mov ah,35h
+ mov al,8
+ int 21h
+ mov oldint8seg,es ; Save es:bx to temp memory
+ mov oldint8add,bx
+ push cs
+ pop ds
+ mov dx,offset cs:PITinterupt
+ mov ah,25h
+ mov al,8
+ int 21h ; Set to new
+
+ mov al,34h
+ out 43h,al
+ mov al,0h
+ out 40h,al
+ mov al,0dah
+ out 40h,al
+ ret
+
+ endp
+
+
+
+
+
+
+Getridofpit proc near
+
+ cmp oldint8seg,-1
+ jz noresetPIT
+ mov dx,oldint8add
+ mov ax,oldint8seg
+ mov ds,ax
+ mov ah,25h
+ mov al,8
+ int 21h
+ mov al,34h
+ out 43h,al
+ mov al,0
+ out 40h,al
+ mov al,0
+ out 40h,al
+noresetPIT: ret
+
+ endp
+
+
+
+
+
+
+PITinterupt proc near
+
+ cli
+ push ax dx cx
+
+ xor dh,dh
+ mov dl,sounddmachannel
+ shl dl,1
+ in al,dx
+ mov cl,al
+ in al,dx
+ mov ch,al
+ sub cx,soundbufferad
+ mov ax,soundbufferwrite
+ sub ax,cx
+ and ax,3fffh
+ sti
+ cmp ax,8192
+ jnc mustgo
+ cmp ax,2048
+ jnc nopitflip
+
+mustgo: push bx si di es ds
+ call makenextblock
+ pop ds es di si bx
+
+nopitflip: cli
+ mov al,20h
+ out 20h,al
+ pop cx dx ax
+ iret
+
+ endp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ \ No newline at end of file