home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Large Pack of OldSkool DOS MOD Trackers
/
cdfm.zip
/
DFMPM.BAK
< prev
next >
Wrap
Text File
|
1997-07-06
|
96KB
|
2,602 lines
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; DFM32 PMODE 2.5 Conversion
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; Uses memory at and above 9FDD0
.386p
; SBSFXS0 = 1
; SBSFXS1 = 1
; SBSFXM0 = 1
; SBSFXM1 = 1
; FMSFX0 = 1
; FMSFX1 = 1
; PCSFX0 = 1
; PCSFX1 = 1
FMNOTE = 1
SBNOTE = 1
; ADJSMP = 1
DBUFLEN equ 380
SBRATE equ 0d2h
SBPRATE equ 0e9h
code32 segment para public use32
assume cs:code32, ds:code32, ss:code32
include pmode.inc
public _dfmcounter, _dfmfunc, _scard, _sbirq, _sbport, _dspout
public _pcsfxtblptr, _fmsfxtblptr, _sbsfxtblptr, _sbsfxchl, _sbsfxchh
public _sbsfxch, _fmsfxchl, _fmsfxchh, _fmsfxch
public muztempo, muzordern, muzorderl, muzordptr, muzpatoffptr
public muzsbinsptr, muzfminsptr, muzpatbase, modebitmap, _voicehit
public nodetectsb
public muzorderc
public _install_dfm, _uninstall_dfm, _detect_scard
public _stopsmp, _stopmuzik, _setmuzik, _muzik, _phademuzik, _mixahead
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; DATA
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
sbcvol db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6
db -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5
db -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5
db 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
db -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8
db -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6
db -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
db 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
db -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9
db -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8
db -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -7
db -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6
db -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3
db -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2
db 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6
db 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
db 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8
db 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
db -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11
db -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10
db -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8
db -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5
db -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4
db 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7
db 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
db 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10
db 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11
db -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13
db -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11
db -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9
db -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8
db -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6
db -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3
db 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5
db 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
db 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8
db 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10
db 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12
db 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13
db -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -15, -15, -15, -15
db -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -13, -13
db -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11
db -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -9, -9
db -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5
db -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7
db 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9
db 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11
db 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
db 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15
db -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -17, -17, -17, -17, -17, -16
db -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -15, -15, -15, -14, -14, -14
db -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12
db -12, -12, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10
db -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -7
db -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5
db -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3
db -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2
db 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4
db 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6
db 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8
db 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11
db 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13
db 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15
db 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17
db -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18
db -18, -18, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16
db -15, -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -13, -13, -13
db -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11
db -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -8, -8, -8
db -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6
db -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -3, -3, -3
db -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2
db 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7
db 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9
db 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12
db 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14
db 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17
db 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19
db -22, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, -21, -20, -20, -20, -20
db -20, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -17, -17
db -17, -17, -17, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -15, -15, -14
db -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12
db -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9
db -9, -9, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6
db -6, -6, -6, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -3
db -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2
db 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5
db 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8
db 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10
db 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13
db 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16
db 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19
db 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21
db -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22, -22
db -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19
db -18, -18, -18, -18, -18, -18, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16
db -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13
db -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10
db -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8
db 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11
db 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14
db 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17
db 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20
db 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23
db -26, -26, -26, -26, -26, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -23
db -23, -23, -23, -23, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, -20, -20
db -20, -20, -20, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -17, -17, -17
db -17, -17, -16, -16, -16, -16, -16, -15, -15, -15, -15, -15, -14, -14, -14, -14
db -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10
db -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -7, -7
db -7, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -4
db -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3
db 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6
db 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9
db 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12
db 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16
db 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19
db 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22
db 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25
db -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25
db -25, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22
db -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -19, -19, -19, -18, -18
db -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16, -16, -15, -15, -15, -15
db -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11
db -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -8, -8
db -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4
db -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3
db 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6
db 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10
db 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13
db 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17
db 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20
db 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24
db 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27
db -30, -30, -30, -30, -30, -29, -29, -29, -29, -28, -28, -28, -28, -27, -27, -27
db -27, -27, -26, -26, -26, -26, -25, -25, -25, -25, -24, -24, -24, -24, -23, -23
db -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -21, -20, -20, -20, -20, -19
db -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16
db -15, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -13, -13, -12, -12, -12
db -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8
db -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4
db -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3
db 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7
db 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11
db 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14
db 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18
db 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22
db 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26
db 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29
db -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -30, -29, -29, -29, -29
db -28, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -25
db -24, -24, -24, -24, -23, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -21
db -20, -20, -20, -20, -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17
db -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -13, -13
db -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9
db -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5
db -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3
db 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7
db 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11
db 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15
db 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19
db 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23
db 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27
db 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31
sbpvol db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8
db -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6
db -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
db 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
db -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11
db -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10
db -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8
db -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5
db -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2
db -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4
db 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7
db 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
db 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10
db 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11
db -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -15, -15, -15, -15
db -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -13, -13
db -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11
db -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -9, -9
db -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5
db -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3
db -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7
db 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9
db 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11
db 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
db 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15
db -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18
db -18, -18, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16
db -15, -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -13, -13, -13
db -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11
db -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -8, -8, -8
db -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6
db -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -3, -3, -3
db -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2
db 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7
db 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9
db 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12
db 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14
db 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17
db 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19
db -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22, -22
db -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19
db -18, -18, -18, -18, -18, -18, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16
db -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13
db -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10
db -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7
db -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -4, -4, -4
db -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8
db 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11
db 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14
db 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17
db 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20
db 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23
db -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25
db -25, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22
db -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -19, -19, -19, -18, -18
db -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16, -16, -15, -15, -15, -15
db -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11
db -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -8, -8
db -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4
db -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3
db 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6
db 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10
db 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13
db 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17
db 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20
db 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24
db 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27
db -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -30, -29, -29, -29, -29
db -28, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -25
db -24, -24, -24, -24, -23, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -21
db -20, -20, -20, -20, -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17
db -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -13, -13
db -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9
db -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5
db -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1
db 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3
db 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7
db 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11
db 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15
db 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19
db 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23
db 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27
db 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31
db -36, -36, -36, -36, -35, -35, -35, -35, -34, -34, -34, -33, -33, -33, -33, -32
db -32, -32, -31, -31, -31, -31, -30, -30, -30, -29, -29, -29, -29, -28, -28, -28
db -27, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -24, -24, -24, -24, -23
db -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -20, -19, -19, -19
db -18, -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -15, -15, -15, -15, -14
db -14, -14, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10
db -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5
db -5, -5, -4, -4, -4, -4, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1
db 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4
db 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
db 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13
db 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17
db 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 21, 22
db 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26
db 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31
db 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35
db -40, -40, -40, -40, -39, -39, -39, -38, -38, -38, -37, -37, -37, -36, -36, -36
db -35, -35, -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31
db -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -26
db -25, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -21, -21
db -20, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16
db -15, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11
db -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6
db -5, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1
db 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
db 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9
db 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14
db 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19
db 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24
db 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29
db 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34
db 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39
db -44, -44, -44, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -40, -39
db -39, -39, -38, -38, -38, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, -34
db -33, -33, -33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28
db -28, -28, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -23, -23
db -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17
db -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12
db -11, -11, -11, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6
db -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1
db 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5
db 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10
db 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16
db 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21
db 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27
db 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32
db 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38
db 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43
db -48, -48, -48, -47, -47, -47, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43
db -42, -42, -42, -41, -41, -41, -40, -40, -39, -39, -39, -38, -38, -38, -37, -37
db -36, -36, -36, -35, -35, -35, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31
db -30, -30, -30, -29, -29, -29, -28, -28, -27, -27, -27, -26, -26, -26, -25, -25
db -24, -24, -24, -23, -23, -23, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19
db -18, -18, -18, -17, -17, -17, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13
db -12, -12, -12, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7
db -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1
db 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5
db 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11
db 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17
db 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23
db 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29
db 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35
db 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41
db 42, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47
db -52, -52, -52, -51, -51, -50, -50, -50, -49, -49, -48, -48, -48, -47, -47, -46
db -46, -46, -45, -45, -44, -44, -44, -43, -43, -42, -42, -42, -41, -41, -40, -40
db -39, -39, -39, -38, -38, -37, -37, -37, -36, -36, -35, -35, -35, -34, -34, -33
db -33, -33, -32, -32, -31, -31, -31, -30, -30, -29, -29, -29, -28, -28, -27, -27
db -26, -26, -26, -25, -25, -24, -24, -24, -23, -23, -22, -22, -22, -21, -21, -20
db -20, -20, -19, -19, -18, -18, -18, -17, -17, -16, -16, -16, -15, -15, -14, -14
db -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -7
db -7, -7, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -1, -1
db 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6
db 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12
db 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19
db 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25
db 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32
db 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38
db 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45
db 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51
db -56, -56, -56, -55, -55, -54, -54, -53, -53, -53, -52, -52, -51, -51, -50, -50
db -49, -49, -49, -48, -48, -47, -47, -46, -46, -46, -45, -45, -44, -44, -43, -43
db -42, -42, -42, -41, -41, -40, -40, -39, -39, -39, -38, -38, -37, -37, -36, -36
db -35, -35, -35, -34, -34, -33, -33, -32, -32, -32, -31, -31, -30, -30, -29, -29
db -28, -28, -28, -27, -27, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -22
db -21, -21, -21, -20, -20, -19, -19, -18, -18, -18, -17, -17, -16, -16, -15, -15
db -14, -14, -14, -13, -13, -12, -12, -11, -11, -11, -10, -10, -9, -9, -8, -8
db -7, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -1
db 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6
db 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13
db 14, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20
db 21, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27
db 28, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34
db 35, 35, 35, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41
db 42, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 46, 47, 47, 48, 48
db 49, 49, 49, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 55, 55
db -60, -60, -60, -59, -59, -58, -58, -57, -57, -56, -56, -55, -55, -54, -54, -53
db -53, -53, -52, -52, -51, -51, -50, -50, -49, -49, -48, -48, -47, -47, -46, -46
db -45, -45, -45, -44, -44, -43, -43, -42, -42, -41, -41, -40, -40, -39, -39, -38
db -38, -38, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -31, -31
db -30, -30, -30, -29, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23
db -23, -23, -22, -22, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -16, -16
db -15, -15, -15, -14, -14, -13, -13, -12, -12, -11, -11, -10, -10, -9, -9, -8
db -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1
db 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7
db 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14
db 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22
db 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29
db 30, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37
db 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44
db 45, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52
db 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59
db -64, -64, -63, -63, -62, -62, -61, -61, -60, -60, -59, -59, -58, -58, -57, -57
db -56, -56, -55, -55, -54, -54, -53, -53, -52, -52, -51, -51, -50, -50, -49, -49
db -48, -48, -47, -47, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -41, -41
db -40, -40, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33
db -32, -32, -31, -31, -30, -30, -29, -29, -28, -28, -27, -27, -26, -26, -25, -25
db -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17
db -16, -16, -15, -15, -14, -14, -13, -13, -12, -12, -11, -11, -10, -10, -9, -9
db -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1
db 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7
db 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15
db 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23
db 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31
db 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39
db 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47
db 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55
db 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63
sbnotefreq dw 24, 25, 27, 29, 30, 32, 34, 36, 38, 41, 43, 46
dw 49, 51, 55, 58, 61, 65, 69, 73, 77, 82, 87, 92
dw 98, 103, 110, 116, 123, 130, 138, 146, 155, 164, 174, 185
dw 196, 207, 220, 233, 247, 261, 277, 293, 311, 329, 349, 370
dw 392, 415, 440, 466, 494, 523, 554, 587, 622, 659, 699, 740
voice struc
poff dd 0
addx dd ?
end dd ?
lbeg dd ?
lend dd ?
vol db ?
notem dd ?
freqf dw ?
freqw db ?
ends
_dfmcounter db 0 ; counter
_dfmfunc dd _ret ; function to call on every tick
_scard db 0 ; soundcard option bits
_sbirq db ? ; IRQ of SB
_sbport dw ? ; SB base port + 0Ch
_dspout db 0 ; DSP out in progress (for single digital)
_pcsfxtblptr dd ? ; ptr to PC SFX table
_fmsfxtblptr dd ? ; ptr to FM SFX table
_sbsfxtblptr dd ? ; ptr to SB SFX table
_sbsfxchl db 0 ; SB mixing SFX channel low limit
_sbsfxchh db 0 ; SB mixing SFX channel high limit
_sbsfxch db 0 ; SB mixing SFX current channel
_fmsfxchl db 0 ; FM mixing SFX channel low limit
_fmsfxchh db 0 ; FM mixing SFX channel high limit
_fmsfxch db 0 ; FM mixing SFX current channel
from_irq dd ? ; jump to from IRQ entry
from_sbout dd ? ; jump to from sb muzik output sequence
from_fmout dd ? ; jump to from fm muzik output sequence
from_sequence dd ? ; jump to from muzik sequencing
v0 voice <>
v1 voice <>
v2 voice <>
v3 voice <>
dhoutaddx dw ? ; digital current hard out addx
dsoutaddx dd ? ; digital current soft out addx
dmaolen dd ? ; DMA straight out length to go
dmaoaddx dw ? ; DMA out addx low 16 bits
dmaopage db ? ; DMA out page
fmnotefreq dw 343, 364, 386, 409, 433, 459, 486, 515, 546, 579, 613, 650
fmoperoff db 20h,21h,22h,23h,24h,25h,28h,29h,2ah,2bh,2ch,2dh,30h,31h,32h,33h,34h,35h
fmoper1 db 0,1,2,6,7,8,12,13,14
fmoper2 db 3,4,5,9,10,11,15,16,17
fmoldv1 db 18 dup(?)
fmoldv2 db 18 dup(?)
fmsyntv db 18 dup(?)
fmlasti db 18 dup(?)
fmlastv db 18 dup(?)
fmschedn db 18 dup(?)
fmschedi db 18 dup(?)
fmschedv db 18 dup(?)
;fmvoltbl db 3fh,3bh,37h,33h, 2eh,2ah,26h,22h
; db 1dh,19h,15h,11h, 0ch,08h,04h,00h
fmvoltbl db 38h,30h,28h,20h, 18h,14h,10h,0ch
db 0ah,08h,06h,04h, 03h,02h,01h,00h
muzdelay db ? ; muzik delay till next note
muztempoc db ? ; muzik tempo counter
muztempo db ? ; muzik master tempo
muzorderc db ? ; muzik current order
muzordern db ? ; muzik number of orders
muzorderl db ? ; muzik loop to order
muzcurptr dd ? ; muzik ptr to current place
muzordptr dd ? ; muzik ptr to order list
muzpatoffptr dd ? ; muzik ptr to pattern offsets
muzsbinsptr dd ? ; muzik ptr to SB instrument table
muzfminsptr dd ? ; muzik ptr to FM instrument data
muzpatbase dd ? ; muzik ptr to patterns base
muzspecial db 60h ; muzik special terminate byte
sequencetbl dd sequencenote,sequencevol,sequencewait,sequencebreak
mixedahead db ? ; number of buffers mixed ahead
mixaheadtbl dd sequencenote,sequencevol,mixaheadwait,mixaheadbreak
mixcall dd ?
nodetectsb db 0 ; allow SB detection?
fmport dw ? ; FM port base addx (388||220||240)
pcsfxptr dd ? ; ptr to current PCSFX out
modebitmap db ? ; output mode bitmap, bits:
; 0 - sb single out allowable
; 1 - muzik playing
; 2 - dont play digital muzik
; 3 - digital mixing is in use
; 4 - allow FM stereo output
; 5 - buffer is mixed ahead
detected db 0 ; already detected soundcard?
installed db 0 ; already installed driver?
installfm db ? ; install FM driver?
installsb db ? ; install SB driver?
installmixtbl dd installsbm,installsbs
phademul db ?
phadeon db ?
phadefmvols db 9 dup(?)
phadedelay db ?
phadedelayc db ?
_voicehit db 13 dup(0)
_rmirqbuf db 21 dup(0) ;******************************
_rmirqvect dd ? ;******************************
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; BASIC DRIVER AND LOW CODE
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;─────────────────────────────────────────────────────────────────────────────
fmportout: ; FM portout, AH to reg AL at DX
push ax
out dx,al
db 6 dup(0ech)
inc edx
mov al,ah
out dx,al
dec edx
db 35 dup(0ech)
pop ax
ret
;─────────────────────────────────────────────────────────────────────────────
writedsp: ; write AH to DSP on DX
in al,dx
or al,al
js $-3
mov al,ah
out dx,al
ret
;─────────────────────────────────────────────────────────────────────────────
writedspt: ; write AH to DSP on DX within time
push ecx
mov ecx,400000h
writedsptl0:
in al,dx
or al,al
jns short writedsptf0
loop writedsptl0
pop ecx
stc
ret
writedsptf0:
mov al,ah
out dx,al
pop ecx
clc
ret
;─────────────────────────────────────────────────────────────────────────────
resetdsp: ; reset DSP on DX then read
sub dl,6
mov al,1
out dx,al
push ecx
mov ecx,4000h
resetdl1:
in al,dx
loop resetdl1
pop ecx
xor al,al
out dx,al
add dl,6
;─────────────────────────────────────────────────────────────────────────────
readdspt: ; read AL from DSP on DX within time
push ecx
mov ecx,400000h
add dl,2
readdsptl0:
in al,dx
or al,al
js short readdsptf0
loop readdsptl0
sub dl,2
pop ecx
stc
ret
readdsptf0:
sub dl,4
in al,dx
add dl,2
pop ecx
clc
ret
;─────────────────────────────────────────────────────────────────────────────
init_FMchip: ; init FM chip on DX
mov ax,02001h
call fmportout
mov ax,0bdh
call fmportout
mov ax,8
call fmportout
reset_FMchip: ; reset FM chip on DX entry
mov ax,0b0h
init_FMchipl0:
call fmportout
inc al
cmp al,0b9h
jb init_FMchipl0
xor ebx,ebx
mov ah,3fh
init_FMchipl1:
mov al,fmoperoff[ebx]
add al,20h
call fmportout
inc ebx
cmp ebx,18
jb init_FMchipl1
ret
;─────────────────────────────────────────────────────────────────────────────
fmsettimbre: ; set timbre at ESI to FM voice AL at DX
add bl,al ; BL=offset in tables
movzx edi,bl
movzx ebp,al
add al,0c0h
mov ah,[esi]
mov fmsyntv[edi],ah
call fmportout
movzx ebx,ds:fmoper1[ebp]
mov al,fmoperoff[ebx]
mov ah,[esi+1]
call fmportout
add al,20h
mov ah,[esi+2]
mov fmoldv1[edi],ah
call fmportout
add al,20h
mov ah,[esi+3]
call fmportout
add al,20h
mov ah,[esi+4]
call fmportout
add al,60h
mov ah,[esi+5]
call fmportout
movzx ebx,ds:fmoper2[ebp]
mov al,fmoperoff[ebx]
mov ah,[esi+6]
call fmportout
add al,20h
mov ah,[esi+7]
mov fmoldv2[edi],ah
call fmportout
add al,20h
mov ah,[esi+8]
call fmportout
add al,20h
mov ah,[esi+9]
call fmportout
add al,60h
mov ah,[esi+10]
jmp fmportout
;─────────────────────────────────────────────────────────────────────────────
fmsetvolume: ; set volume AH to FM voice AL at DX
add bl,al ; BL=offset in tables
movzx edi,bl
movzx ebp,al
mov ch,ah
mov ah,fmoldv2[edi]
and ah,0c0h
or ah,ch
mov fmoldv2[edi],ah
movzx ebx,ds:fmoper2[ebp]
mov al,fmoperoff[ebx]
add al,20h
call fmportout
test fmsyntv[edi],1
jz fmsetvolumed
mov ah,fmoldv1[edi]
and ah,11000000b
or ah,ch
mov fmoldv1[edi],ah
movzx ebx,ds:fmoper1[ebp]
mov al,fmoperoff[ebx]
add al,20h
call fmportout
fmsetvolumed:
ret
;─────────────────────────────────────────────────────────────────────────────
fmplaynote: ; play note BX on FM voice AL at DX
add al,0b0h
xor ah,ah
call fmportout
sub al,10h
mov ah,bl
call fmportout
add al,10h
mov ah,bh
or ah,20h
jmp fmportout
;═════════════════════════════════════════════════════════════════════════════
irq: ; basic IRQ entry
push ax
mov al,20h
out 20h,al
sti
pop ax
cld
pushad
push ds
push es
mov ax,cs:_seldata
mov ds,ax
mov es,ax
; push edi
; @rlp edi,0b8000h
; inc byte ptr [edi]
; pop edi
and modebitmap,0dfh
cmp phadeon,0
jne short irqphade
irqphaded:
jmp from_irq
irqphade: ; phade muzik routine
dec phadedelayc
jnz irqphaded
mov al,phadedelay
mov phadedelayc,al
sub phademul,1
jc short irqphaded2
mov ebx,offset v0.vol
mov ecx,4
irqphadel0:
mov al,[ebx]
sub al,1
adc al,0
mov [ebx],al
add ebx,size voice
loop irqphadel0
mov esi,offset phadefmvols
mov edi,esi
xor ebx,ebx
mov ecx,9
irqphadel1:
lodsb
sub al,1
adc al,0
stosb
movzx eax,al
mov al,fmvoltbl[eax]
mov fmschedv[ebx],al
cmp fmschedn[ebx],-1
jne short irqphadel1c
mov fmschedn[ebx],-2
irqphadel1c:
inc ebx
loop irqphadel1
jmp from_irq
irqphaded2:
call _stopmuzik
jmp from_irq
;═════════════════════════════════════════════════════════════════════════════
sbsingleirq: ; Single output IRQ
push ax
push bx
push ecx
push dx
push ds
mov ax,cs:_seldata
mov ds,ax
mov dx,_sbport
add dl,2
in al,dx
sub dl,2
xor al,al
cmp dmaolen,0
je sbsingleirqd
mov al,5
out 0ah,al
mov ecx,0ffffh
mov bx,dmaoaddx
sub cx,bx
cmp ecx,dmaolen
jbe short sbsingleirqf1
mov ecx,dmaolen
dec ecx
sbsingleirqf1:
mov al,bl
out 2,al
mov al,bh
out 2,al
mov al,cl
out 3,al
mov al,ch
out 3,al
mov al,dmaopage
out 83h,al
mov al,1
out 0ah,al
mov ah,14h
call writedsp
mov ah,cl
call writedsp
mov ah,ch
call writedsp
inc ecx
mov al,1
sub dmaolen,ecx
jz sbsingleirqd
inc dmaopage
mov dmaoaddx,0
sbsingleirqd:
mov _dspout,al
pop ds
pop dx
pop ecx
pop bx
mov al,20h
out 20h,al
pop ax
iretd
;═════════════════════════════════════════════════════════════════════════════
sbnout: ; SB mono out module
mov dx,_sbport
add dl,2
in al,dx
sub dl,2
mov al,5
out 0ah,al
mov ax,dhoutaddx
add ax,DBUFLEN*2
jnc short sbnoutf0
sub ax,DBUFLEN*6
sbnoutf0:
mov dhoutaddx,ax
out 2,al
mov al,ah
out 2,al
mov al,LOW(DBUFLEN-1)
out 3,al
mov al,HIGH(DBUFLEN-1)
out 3,al
mov ah,14h
call writedsp
mov ah,LOW(DBUFLEN-1)
call writedsp
mov ah,HIGH(DBUFLEN-1)
call writedsp
mov al,1
out 0ah,al
jmp from_sbout
;═════════════════════════════════════════════════════════════════════════════
sbpout: ; SBP stereo out module
mov dx,_sbport
add dl,2
in al,dx
sub dl,2
mov al,5
out 0ah,al
mov ax,dhoutaddx
add ax,DBUFLEN*2
jnc short sbpoutf0
sub ax,DBUFLEN*6
sbpoutf0:
mov dhoutaddx,ax
out 2,al
mov al,ah
out 2,al
mov al,LOW((DBUFLEN*2)-1)
out 3,al
mov al,HIGH((DBUFLEN*2)-1)
out 3,al
mov ah,48h
call writedsp
mov ah,LOW((DBUFLEN*2)-1)
call writedsp
mov ah,HIGH((DBUFLEN*2)-1)
call writedsp
mov ah,91h
call writedsp
mov al,1
out 0ah,al
jmp from_sbout
;═════════════════════════════════════════════════════════════════════════════
fmmout: ; FM mono sound out routine
xor ebp,ebp
mov dx,fmport
fmmoutl0:
cmp ds:fmschedn[ebp],0feh ; note or volume change scheduled?
ja fmmoutl0c
je fmmoutl0f0
mov al,ds:fmschedi[ebp] ; instrument different?
cmp al,ds:fmlasti[ebp]
je short fmmoutl0f1
mov ds:fmlasti[ebp],al ; change instrument
movzx esi,al
imul esi,11
add esi,muzfminsptr
mov bl,[esi+7]
and bl,3fh
mov ds:fmlastv[ebp],bl
mov eax,ebp
xor bl,bl
push ebp
call fmsettimbre
pop ebp
fmmoutl0f1:
mov ah,ds:fmschedv[ebp] ; volume different?
cmp ah,ds:fmlastv[ebp]
je short fmmoutl0f2
mov ds:fmlastv[ebp],ah ; set new volume
mov ebx,ebp
mov al,bl
xor bl,bl
push ebp
call fmsetvolume
pop ebp
fmmoutl0f2: ; play note
mov al,ds:fmschedn[ebp]
movzx ecx,al
and cl,0fh
mov bx,fmnotefreq[ecx*2]
mov ecx,ebp
and cx,3
add bx,cx
and al,70h
shr al,2
or bh,al
mov eax,ebp
call fmplaynote
mov ds:fmschedn[ebp],0ffh
fmmoutl0c:
inc ebp
cmp ebp,9
jb fmmoutl0
jmp from_fmout
fmmoutl0f0: ; volume change only
mov eax,ebp
mov ah,ds:fmschedv[ebp]
cmp ah,ds:fmlastv[ebp]
je short fmmoutl0c
mov ds:fmlastv[ebp],ah
xor bl,bl
push ebp
call fmsetvolume
pop ebp
jmp short fmmoutl0c
;═════════════════════════════════════════════════════════════════════════════
sequence: ; actual muzik sequencing
test modebitmap,2 ; muzik playing?
jz sequencedone
dec muztempoc ; yup, decrement tempo and delay
jnz sequencedone
mov al,muztempo
mov muztempoc,al
dec muzdelay
jnz sequencedone
cmp mixedahead,2
setnc al
shl al,5
or modebitmap,al
mov esi,muzcurptr ; time to sequence again
sequenceml:
lodsb
movzx ebx,al
shr bl,5
and al,1fh
push offset sequenceml
jmp sequencetbl[ebx*4]
sequencebreak: ; break pattern
mov al,muzorderc
inc al
cmp al,muzordern
jb short sequencebreakf0
mov al,muzorderl
sequencebreakf0:
mov muzorderc,al
movzx ebx,al
add ebx,muzordptr
mov al,[ebx]
movzx ebx,al
shl ebx,2
add ebx,muzpatoffptr
movzx esi,word ptr [ebx]
add esi,muzpatbase
ret
sequencenote: ; a note
movzx ebp,al
cmp al,3
ja sequencenotefm
test modebitmap,24h ; sb muzik allowed?
stc
jnz sequenceskip
movzx ebx,al
imul ebx,size voice
lodsb
mov ah,al
movzx ecx,al
and al,0fh
and cl,70h
shr cl,2
lea ecx,[ecx*2+ecx]
add cl,al
movzx ecx,sbnotefreq[ecx*2]
mov v0[ebx].notem,ecx
dec ch
mov v0[ebx].freqw,ch
xor ch,ch
mov v0[ebx].freqf,cx
lodsb
mov ch,al
and al,0fh
mov dx,ax
shr dx,15
mul phademul
shr al,4
mov ds:_voicehit[ebp],al
mov v0[ebx].vol,al
shrd cx,dx,4
movzx ecx,ch
shl ecx,4
add ecx,muzsbinsptr
mov eax,[ecx]
mov v0[ebx].addx,eax
mov eax,[ecx+4]
mov v0[ebx].end,eax
mov eax,[ecx+8]
mov v0[ebx].lbeg,eax
mov eax,[ecx+12]
mov v0[ebx].lend,eax
ret
sequencenotefm:
sub al,4
movzx ebx,al
lodsb
mov ah,al
and al,7fh
mov fmschedn[ebx],al
mov fmschedn[ebx+9],al
lodsb
mov ch,al
and al,0fh
mov dx,ax
shr dx,15
mul phademul
shr al,4
mov ds:_voicehit[ebp],al
mov ds:phadefmvols[ebp-4],al
movzx eax,al
mov al,fmvoltbl[eax]
mov fmschedv[ebx],al
shrd cx,dx,4
mov fmschedi[ebx],ch
ret
sequencevol: ; a volume change
movzx ebp,al
cmp al,3
ja short sequencevolfm
test modebitmap,4 ; sb muzik allowed?
clc
jnz short sequenceskip
movzx ebx,al
imul ebx,size voice
lodsb
mul phademul
shr al,4
mov v0[ebx].vol,al
ret
sequencevolfm: ; fm volume change
sub al,4
movzx ebx,al
lodsb
mul phademul
shr al,4
mov ds:phadefmvols[ebp-4],al
movzx eax,al
mov al,fmvoltbl[eax]
mov fmschedn[ebx],-2
mov fmschedv[ebx],al
ret
sequencewait: ; delay command
lodsb
mov muzdelay,al
mov muzcurptr,esi
add esp,4
sequencedone: ; done
jmp from_sequence
sequenceskip: ; no sb muzik allowed, skip bytes
adc esi,1
ret
;═════════════════════════════════════════════════════════════════════════════
mix: ; digital mix routine
dec mixedahead
jnz mixdone
inc mixedahead
push offset mixdone
mixgo:
mov edi,dsoutaddx ; Actual mixing
add di,DBUFLEN*2
jnc short mixf0
sub di,DBUFLEN*6
mixf0:
mov dsoutaddx,edi
sub edi,_code32a
mov ebx,edi
mov eax,80808080h
db 0b9h ; MOV ECX,MIXFILLLEN, DBUFLEN/4 || DBUFLEN/2
mixfilllen dd ? ;
rep stosd
mov edi,ebx
mov ebp,offset v0
mix2l0:
push edi
add edi,ds:[ebp].poff
mov esi,ds:[ebp].addx
mov edx,DBUFLEN
mix2l1:
mov ecx,edx
cmp esi,ds:[ebp].lend
jb short mix2l1f0
mov esi,ds:[ebp].lbeg
mix2l1f0:
cmp esi,ds:[ebp].end
jae mix2l0c
mov ebx,ecx ; beginning of logic
imul ebx,ds:[ebp].notem
shr ebx,8
add ebx,esi
mov eax,ds:[ebp].end
cmp eax,ds:[ebp].lend
jbe short mix2l1f2
mov eax,ds:[ebp].lend
mix2l1f2:
cmp eax,ebx
jae short mix2l1f1
sub eax,esi
shl eax,8
xor edx,edx
div ds:[ebp].notem
sub edx,1
cmc
adc eax,0
mov edx,ecx
mov ecx,eax
mix2l1f1:
movzx ebx,ds:[ebp].vol
shl bx,8
db 81h,0c3h ; ADD EBX,MIXVOLADDX
mixvoladdx dd ? ;
sub edx,ecx
push edx
sub cx,DBUFLEN
neg cx
db 6bh,0c9h ; IMUL CX,MIXRLEN
mixrlen db ? ;
mov eax,offset mixrout
add eax,ecx
mov mixcall,eax
mov cx,ds:[ebp].freqf
movsx edx,ds:[ebp].freqw
xor eax,eax
call mixcall
mov ds:[ebp].freqf,cx
pop edx
or edx,edx
jnz mix2l1
mix2l0c:
pop edi
mov ds:[ebp].addx,esi
add ebp,size voice
cmp ebp,offset v3
jbe mix2l0
ret
mixdone:
;═════════════════════════════════════════════════════════════════════════════
pcsfx: ; PC SFX routine
mov esi,pcsfxptr
or esi,esi
jz short irqdone
lodsb
or al,al
jnz short pcsfxf0
mov pcsfxptr,0
in al,61h
and al,0fch
out 61h,al
jmp short irqdone
pcsfxf0:
mov ah,al
xor al,al
out 42h,al
mov al,ah
jmp $+2
out 42h,al
mov pcsfxptr,esi
;═════════════════════════════════════════════════════════════════════════════
irqdone: ; IRQ done
inc _dfmcounter
call _dfmfunc
pop es
pop ds
; mov al,20h
; out 20h,al
popad
iretd
;-----------------------------------------------------------------------------
mixrout: ; mixing matrix
db DBUFLEN*sbpmixmatrixlen+1 dup(?)
;-----------------------------------------------------------------------------
sbnmixmatrix:
lodsb
mov al,[ebx+eax]
add [edi],al
inc edi
add ch,cl
adc esi,edx
sbnmixmatrixlen equ $-sbnmixmatrix
;-----------------------------------------------------------------------------
sbpmixmatrix:
lodsb
mov al,[ebx+eax]
add [edi],al
add edi,2
add ch,cl
adc esi,edx
sbpmixmatrixlen equ $-sbpmixmatrix
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; SETUP AND OTHER CODE
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Detect soundcard in system
; In:
; None
; Out:
; AL - soundcard option bits:
; 0 - FM found
; 1 - FM is stereo (only if bit 0 is set)
; 2 - digital SB found
; 3 - SB is stereo (only if bit 2 is set)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_detect_scard:
cmp detected,0 ; already got soundcard?
jne short detect_scard_skip
mov detected,1
pushad ; save some stuff
pushf
cli
in al,21h
push ax
mov al,0ffh
out 21h,al
cmp nodetectsb,0
jne short detect_scardf0
call detect_SB ; is SB present?
jc short detect_scardf0
or _scard,4
call detect_SBP ; is SBP present?
jc short detect_scardf0
or _scard,8
detect_scardf0: ; is adlib present?
mov dx,388h
call detect_FMchip
jnz short detect_scard_done
or _scard,1
detect_scard_done:
pop ax ; restore stuff and return scard
out 21h,al
popf
popad
detect_scard_skip: ; if already detected skip
mov al,_scard
ret
;─────────────────────────────────────────────────────────────────────────────
detect_FMchip: ; detect FM chip on DX
mov ax,6004h
call fmportout
mov ax,8004h
call fmportout
in al,dx
and al,0e0h
mov cl,al
mov ax,0ff02h
call fmportout
mov ax,2104h
call fmportout
push cx
mov ecx,800
loop $
pop cx
in al,dx
and al,0e0h
mov ch,al
mov ax,6004h
call fmportout
mov ax,08004h
call fmportout
sub cx,0c000h
ret
;─────────────────────────────────────────────────────────────────────────────
detect_SB: ; detect SB port and IRQ
mov dx,_sbport
detect_SBl0:
mov ah,0d3h
call writedspt
call resetdsp
jc short detect_SBl0c
mov ah,0e0h
call writedspt
jc short detect_SBl0c
mov ah,0c6h
call writedspt
jc short detect_SBl0c
call readdspt
jc short detect_SBl0c
cmp al,39h
je short detect_SBl0d
detect_SBl0c:
add dl,10h
cmp dl,7ch
jb detect_SBl0
stc
ret
detect_SBl0d:
clc ; yup, SB here
ret
;─────────────────────────────────────────────────────────────────────────────
detect_SBP: ; detect an SBP...
mov dx,_sbport
sub dl,8
mov al,0eh
out dx,al
inc edx
in al,dx
or al,2
jmp short $+2
out dx,al
jmp short $+2
in al,dx
test al,2
jnz short detect_SBPf0
detect_SBPno:
stc ; no sbp
ret
detect_SBPf0:
and al,0fdh
out dx,al
jmp short $+2
in al,dx
test al,2
jnz detect_SBPno
clc ; yup, SBP
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Install muzik/SFX driver(s)
; In:
; AL - bitmap of what to install:
; 0,1 - FM muzik/SFX driver to install: 0-none,1-mono,2-stereo
; 2,3 - digital muzik/SFX driver to install: 0-none,1-single,2-mono,3-stereo
; 4 - block out digital muzik
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_install_dfm:
call _uninstall_dfm
mov installed,1
pushad
pushf
cli
mov ah,al ; break up and store install request
and al,3
mov installfm,al
mov al,ah
shr al,2
and al,3
mov installsb,al
test ah,10h
setnz al
shl al,2
mov modebitmap,al
mov fmport,388h
call _detect_scard
; pushad ;***********************
; @rlp edi,0b8000h ;***********************
; mov byte ptr [edi+2],al ;***********************
; popad ;***********************
test al,1 ; init FM chips if any
jz short instdfmf0
test al,2
jnz short instdfmf1
mov dx,388h
jmp short instdfmf2
instdfmf1:
mov dx,_sbport
sub dl,0ch
call init_FMchip
add dl,2
instdfmf2:
call init_FMchip
instdfmf0:
call _stopmuzik
mov ah,_scard
mov al,installfm ; adjust FM request bitmap to _scard
or al,al
jz short instarfmd
test ah,1
jnz short instarfmf0
xor al,al
jmp short instarfmd
instarfmf0:
cmp al,1
je short instarfmd
test ah,2
jnz short instarfmf1
mov al,1
jmp short instarfmd
instarfmf1:
or modebitmap,10h
mov dx,_sbport
sub dl,0ch
mov fmport,dx
instarfmd:
mov installfm,al
mov al,installsb ; adjust SB request bitmap to _scard
or al,al
jz short instarsbd
test ah,4
jnz short instarsbf0
xor al,al
jmp short instarsbd
instarsbf0:
cmp al,3
jb short instarsbd
test ah,8
jnz short instarsbd
mov al,2
instarsbd:
mov installsb,al
cmp al,1 ; set appropriate mode bits
setz ah
or modebitmap,ah
cmp al,1
seta ah
shl ah,3
or modebitmap,ah
mov ebp,offset from_irq ; trace and set irq route
mov ah,installfm
cmp al,2
jb short insttrcf0
je short insttrcf1
mov dword ptr ds:[ebp],offset sbpout
jmp short insttrcf2
insttrcf1:
mov dword ptr ds:[ebp],offset sbnout
insttrcf2:
mov ebp,offset from_sbout
insttrcf0:
cmp ah,1
jb short insttrcf3
mov dword ptr ds:[ebp],offset fmmout
insttrcf5:
mov ebp,offset from_fmout
jmp short insttrcf7
insttrcf3:
cmp al,2
jb short insttrcf6
test modebitmap,4
jnz short insttrcf6
insttrcf7:
mov dword ptr ds:[ebp],offset sequence
mov ebp,offset from_sequence
insttrcf6:
mov dword ptr ds:[ebp],offset pcsfx
cmp al,2
jb short insttrcd
mov dword ptr ds:[ebp],offset mix
insttrcd:
cmp al,1 ; install single SB irq if needed
jne short instdfmf3
call installmisc0
push eax edx edi
mov edx,offset sbsingleirq
call _setirqvect
mov edi,offset _rmirqbuf
call _rmpmirqset
mov _rmirqvect,eax
pop edi edx eax
instdfmf4: ; install IRQ0 call IRQ routine
mov al,036h
out 43h,al
mov al,0c4h
out 40h,al
mov al,51h
jmp short $+2
out 40h,al
in al,21h
and al,0feh
jmp short $+2
out 21h,al
push edx eax edi
mov bl,0
mov edx,offset irq
call _setirqvect
mov edi,offset _rmirqbuf
call _rmpmirqset
mov _rmirqvect,eax
pop edi eax edx
jmp short instdfmf5
instdfmf3:
cmp al,2
jb short instdfmf4
movzx ebp,al ; install mono or stereo mixing IRQ
sub ebp,2
call installmisc0
push edx edi eax
mov edx,offset irq
call _setirqvect
mov edi,offset _rmirqbuf
call _rmpmirqset
mov _rmirqvect,eax
pop eax edi edx
; mov ah,40h
; call writedsp
call cs:installmixtbl[ebp*4]
mov edi,0a0000h-6*DBUFLEN
mov dhoutaddx,di
lea eax,[edi+2*DBUFLEN]
mov dsoutaddx,eax
sub edi,_code32a
mov ecx,DBUFLEN*3
mov ax,8080h
rep stosw
mov al,9
out 83h,al
mov mixedahead,1
instdfmf5:
mov al,0b6h ; reset PC squeeker output timer
out 43h,al
xor al,al
out 42h,al
jmp short $+2
out 42h,al
test modebitmap,8
jz short instdfmd
sti
mov dx,_sbport ; init mixing IRQ
mov ah,0f2h
call writedsp
instdfmd:
popf
popad
ret
;-----------------------------------------------------------------------------
installmisc0: ; misc 0
mov dx,_sbport
call resetdsp
mov ah,0d1h
call writedsp
mov cl,_sbirq
mov bl,cl
mov ah,0feh
rol ah,cl
in al,21h
and al,ah
jmp short $+2
out 21h,al
xor al,al
out 0ch,al
mov al,49h
out 0bh,al
ret
;-----------------------------------------------------------------------------
installsbm: ; install SB mono mixing
rept 5 ;***********************
mov ah,40h ;***********************
call writedsp ;***********************
mov ah,SBRATE ;***********************
call writedsp ;***********************
endm ;***********************
mov mixrlen,sbnmixmatrixlen
mov edx,DBUFLEN
mov edi,offset mixrout
installsbmml:
mov esi,offset sbnmixmatrix
mov ecx,sbnmixmatrixlen
rep movsb
dec edx
jnz installsbmml
mov al,0c3h
stosb
mov mixvoladdx,offset sbcvol
mov mixfilllen,DBUFLEN/4
mov v0.poff,0
mov v2.poff,0
ret
;-----------------------------------------------------------------------------
installsbs: ; install SB stereo mixing
rept 5 ;***********************
mov ah,40h ;***********************
call writedsp ;***********************
mov ah,SBPRATE ;***********************
call writedsp ;***********************
endm ;***********************
sub dl,8
mov al,0eh
out dx,al
inc edx
mov al,2
jmp short $+2
out dx,al
mov mixrlen,sbpmixmatrixlen
mov edx,DBUFLEN
mov edi,offset mixrout
installsbsml:
mov esi,offset sbpmixmatrix
mov ecx,sbpmixmatrixlen
rep movsb
dec edx
jnz installsbsml
mov al,0c3h
stosb
mov mixvoladdx,offset sbpvol
mov mixfilllen,DBUFLEN/2
mov v0.poff,1
mov v2.poff,1
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Uninstall all drivers
; In:
; None
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_uninstall_dfm:
cmp installed,0
je _ret
mov installed,0
call _stopmuzik
push ax
push cx
push dx
pushf
cli
in al,61h ; shuddap pc squeeker
and al,0fch
out 61h,al
test modebitmap,1 ; uninstall SB handler.?
jnz short uninstallf1
test modebitmap,8
jz short uninstallf0
mov _dspout,1
mov dx,_sbport
sub dl,8
mov al,0eh
out dx,al
inc edx
jmp short $+2
xor al,al
out dx,al
uninstallf1:
call stopsmp2
mov dx,_sbport
mov ah,0d3h
call writedsp
mov ah,1
mov cl,_sbirq
shl ah,cl
in al,21h
or al,ah
jmp short $+2
out 21h,al
uninstallf0:
test modebitmap,8 ; uninstall IRQ0 handler.?
jnz short uninstalld
in al,21h
or al,1
jmp short $+2
out 21h,al
mov al,36h
out 43h,al
xor al,al
out 40h,al
jmp short $+2
out 40h,al
uninstalld:
popf
pop dx
pop cx
pop ax
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Set muzik at block
; In:
; EDX -> 670 muzik block
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_muzik:
test _scard,1
jz _ret
call _stopmuzik
push eax
push ebx
push edx
pushf
cli
mov al,[edx]
mov muztempo,al
mov al,[edx+5]
mov muzorderl,al
lea ebx,[edx+10]
mov muzordptr,ebx
movzx eax,byte ptr [edx+1]
mov muzordern,al
add ebx,eax
mov muzpatoffptr,ebx
mov al,[edx+2]
lea ebx,[ebx+eax*4]
mov muzsbinsptr,ebx
mov al,[edx+3]
shl eax,4
add ebx,eax
mov muzfminsptr,ebx
movzx eax,byte ptr [edx+4]
imul eax,11
add ebx,eax
mov muzpatbase,ebx
mov ebx,dword ptr [edx+6]
add ebx,edx
mov al,[edx+3]
mov edx,muzsbinsptr
or al,al
jz short muzikd
muzikl0:
mov [edx],ebx
add [edx+8],ebx
add [edx+12],ebx
add ebx,[edx+4]
mov [edx+4],ebx
add edx,10h
dec al
jnz muzikl0
muzikd:
mov muzdelay,1
mov muztempoc,1
mov muzorderc,-1
mov muzcurptr,offset muzspecial
or modebitmap,2
mov phademul,10h
mov phadeon,0
popf
pop edx
pop ebx
pop eax
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Set muzik as U want
; In:
; all muz ptrs and values are set
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_setmuzik:
call _stopmuzik
pushf
cli
mov muzdelay,1
mov muztempoc,1
; mov muzorderc,-1
mov muzcurptr,offset muzspecial
or modebitmap,2
mov phademul,10h
mov phadeon,0
popf
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Stop muzik and shut off all sound/muzik output
; In:
; None
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_stopmuzik:
push ax
push ebx
push dx
pushf
cli
mov dx,fmport
test _scard,1
jz short stopmuzikf0
call reset_FMchip
test _scard,2
jz short stopmuzikf0
add dl,2
call reset_FMchip
stopmuzikf0:
and modebitmap,0fdh
mov ebx,offset v0
stopmuzikl0:
mov [ebx].addx,0
mov [ebx].end,0
mov [ebx].lend,-1
add ebx,size voice
cmp ebx,offset v3
jbe stopmuzikl0
xor ebx,ebx
stopmuzikl1:
mov fmlasti[ebx],-1
mov fmlastv[ebx],-1
mov fmschedn[ebx],-1
mov fmschedi[ebx],-1
mov fmschedv[ebx],-1
inc ebx
cmp ebx,18
jb stopmuzikl1
popf
pop dx
pop ebx
pop ax
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Phade muzik
; In:
; AL - speed of phade (lower is faster)
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_phademuzik:
mov phadeon,1
mov phadedelay,al
mov phadedelayc,al
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Mix ahead for IRQ
; In:
; None
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_mixahead:
pushf
test modebitmap,8
jz mixaheadd
cli
mov al,mixedahead
cmp al,1
ja mixaheadd
inc al
mov mixedahead,al
pushad
test modebitmap,2 ; muzik playing?
jz mixaheadf0
cmp muztempoc,1
jne mixaheadf0
cmp muzdelay,1
jne mixaheadf0
sti
mov esi,muzcurptr ; time to sequence again
and modebitmap,0dfh
mixaheadml:
lodsb
movzx ebx,al
shr bl,5
and al,1fh
cmp bl,1
ja short mixaheadf2
cmp al,3
ja short mixaheadf1
mixaheadf2:
push offset mixaheadml
jmp mixaheadtbl[ebx*4]
mixaheadf1:
cmp bl,1
adc esi,1
jmp mixaheadml
mixaheadbreak: ; break pattern
mov al,muzorderc
inc al
cmp al,muzordern
jb short mixaheadbreakf0
mov al,muzorderl
mixaheadbreakf0:
movzx ebx,al
add ebx,muzordptr
mov al,[ebx]
movzx ebx,al
shl ebx,2
add ebx,muzpatoffptr
movzx esi,word ptr [ebx]
add esi,muzpatbase
ret
mixaheadwait:
add esp,4
mixaheadf0:
sti
call mixgo
popad
mixaheadd:
popf
ret
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
; SFX AND AUX CODE
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
ifdef FMNOTE
public _fmnote
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Play an FM note
; In:
; AL - channel
; AH - note
; BL - volume
; EDX -> timbre data
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_fmnote:
test _scard,1
jz _ret
push ax
push dx
push esi
push edi
push ebp
pushf
cli
push ebx
movzx edi,al
mov fmlasti[edi],-1
mov esi,edx
mov dx,fmport
test modebitmap,10h
jnz short fmnotes
cmp al,8
ja short fmnoted
push ax
xor bl,bl
jmp short fmnotef2
fmnotes:
shr al,1
setc bl
push ax
mov bh,bl
shl bh,1
add dl,bh
movzx ebx,bl
lea ebx,[ebx*8+ebx]
fmnotef2:
push bx
call fmsettimbre
pop bx
mov al,[esp]
movzx esi,byte ptr [esp+2]
mov ah,fmvoltbl[esi]
call fmsetvolume
pop ax
movzx esi,ah
mov edi,esi
and si,0fh
mov bx,fmnotefreq[esi*2]
and di,70h
shl di,6
or ebx,edi
call fmplaynote
fmnoted:
pop ebx
popf
pop ebp
pop edi
pop esi
pop dx
pop ax
ret
endif
ifdef SBNOTE
public _sbnote
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Play a note on SB mixing system
; In:
; AL - channel
; AH - note (low 4 bits are note, high 3 are octave)
; BL - volume
; ECX - loop begin
; EDX - loop end
; ESI -> sample
; EBP - end of sample
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_sbnote:
test modebitmap,8
jz _ret
push eax
push bx
push edi
pushf
cli
movzx edi,al
imul edi,size voice
mov v0[edi].addx,esi
mov v0[edi].end,ebp
mov v0[edi].vol,bl
mov v0[edi].lbeg,ecx
mov v0[edi].lend,edx
movzx eax,ah
mov ebx,eax
and bl,0fh
and al,70h
shr al,2
lea eax,[eax*2+eax]
add eax,ebx
mov ax,sbnotefreq[eax*2]
mov word ptr v0[edi].notem,ax
dec ah
mov v0[edi].freqw,ah
xor ah,ah
mov v0[edi].freqf,ax
popf
pop edi
pop bx
pop eax
ret
endif
ifdef PCSFX0
public _pcsfxd
ifdef PCSFX1
public _pcsfx
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; PC SFX set routine
; In:
; AL - FX number to play
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_pcsfx:
push eax
push edx
mov edx,_pcsfxtblptr
cmp al,byte ptr [edx]
jae short pcsfxd
movzx eax,al
mov edx,[edx+eax*4+1]
call _pcsfxd
pcsfxd:
pop edx
pop eax
ret
endif
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Output a direct PC fect direct
; In:
; EDX -> PC sound fect data
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_pcsfxd:
push ax
pushf
cli
xor al,al
out 42h,al
mov al,[edx]
inc edx
out 42h,al
mov pcsfxptr,edx
in al,61h
or al,3
out 61h,al
popf
pop ax
ret
endif
ifdef FMSFX0
public _fmsfxd
ifdef FMSFX1
public _fmsfx
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Set an FM fect from table
; In:
; AL - FX number to play
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_fmsfx:
test _scard,1
jz _ret
push ax
push edx
push esi
push ebp
mov ebp,_fmsfxtblptr
cmp al,byte ptr ds:[ebp]
jae fmsfxd
movzx esi,al
mov esi,ds:[ebp+esi*4+5]
mov ebp,ds:[ebp+1]
fmsfxml:
lodsb
cmp al,-1
je short fmsfxd
movzx edx,al
imul edx,13
add edx,ebp
mov ax,[edx+11]
call _fmsfxd
jmp fmsfxml
fmsfxd:
pop ebp
pop esi
pop edx
pop ax
ret
endif
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Output a FM fect direct
; In:
; AX - FM frequency (13 bits)
; EDX -> timbre data for fect
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_fmsfxd:
test _scard,1
jz _ret
push ebx
push dx
push esi
push edi
push ebp
pushf
cli
push ax
mov al,_fmsfxch
mov ah,_fmsfxchl
cmp al,ah
jae short fmsfxdf0
mov al,ah
fmsfxdf0:
cmp al,_fmsfxchh
jbe short fmsfxdf1
mov al,ah
fmsfxdf1:
movzx edi,al
inc al
mov _fmsfxch,al
mov fmlasti[edi],-1
mov esi,edx
mov dx,fmport
test modebitmap,10h
jnz short fmsfxds
cmp al,8
ja short fmsfxdd
push ax
xor bl,bl
jmp short fmsfxdf2
fmsfxds:
shr al,1
setc bl
push ax
mov bh,bl
shl bh,1
add dl,bh
movzx ebx,bl
lea ebx,[ebx*8+ebx]
fmsfxdf2:
call fmsettimbre
pop ax
mov bx,[esp]
call fmplaynote
fmsfxdd:
pop ax
popf
pop ebp
pop edi
pop esi
pop dx
pop ebx
ret
endif
ifdef SBSFXM0
public _sbsfxmd
ifdef SBSFXM1
public _sbsfxm
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Set an SB mixing fect from table
; In:
; AL - FX number to play
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_sbsfxm:
push ax
push bx
push ecx
push edx
push esi
push ebp
mov edx,_sbsfxtblptr
cmp al,byte ptr [edx]
jae short sbsfxmd
movzx ecx,al
movzx ax,byte ptr [edx+ecx*2+5]
shl ax,4
movzx esi,byte ptr [edx+ecx*2+6]
shl esi,2
add esi,[edx+1]
mov esi,[esi]
mov ebp,[esi]
add esi,4
add ebp,esi
mov bl,0fh
xor ecx,ecx
mov edx,-1
call _sbsfxmd
sbsfxmd:
pop ebp
pop esi
pop edx
pop ecx
pop bx
pop ax
ret
endif
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; SB SFX mixing set direct out
; In:
; AX - high and low speed
; BL - volume
; ECX - loop begin
; EDX - loop end
; ESI -> sample
; EBP - end of sample
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_sbsfxmd:
test modebitmap,8
jz _ret
push edi
pushf
cli
push ax
mov al,_sbsfxch
mov ah,_sbsfxchl
cmp al,ah
jae short sbsfxmdf0
mov al,ah
sbsfxmdf0:
cmp al,_sbsfxchh
jbe short sbsfxmdf1
mov al,ah
sbsfxmdf1:
movzx edi,al
inc al
mov _sbsfxch,al
mov ax,[esp]
imul edi,size voice
mov v0[edi].addx,esi
mov v0[edi].end,ebp
mov v0[edi].vol,bl
mov v0[edi].lbeg,ecx
mov v0[edi].lend,edx
mov word ptr v0[edi].notem,ax
dec ah
mov v0[edi].freqw,ah
xor ah,ah
mov v0[edi].freqf,ax
pop ax
popf
pop edi
ret
endif
ifdef SBSFXS0
public _sbsfxsd
ifdef SBSFXS1
public _sbsfxs
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; SB SFX single set routine
; In:
; AL - FX number to play
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_sbsfxs:
push bx
push ecx
push edx
mov edx,_sbsfxtblptr
cmp al,byte ptr [edx]
jae short sbsfxsd
movzx ecx,al
mov bl,[edx+ecx*2+5]
movzx ecx,byte ptr [edx+ecx*2+6]
shl ecx,2
add ecx,[edx+1]
mov edx,[ecx]
mov ecx,[edx]
add edx,4
call _sbsfxsd
sbsfxsd:
pop edx
pop ecx
pop bx
ret
endif
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Play digital sample at EDX direct using single out
; In:
; EDX -> digital data (must be in low mem)
; ECX - length
; BL - sampling rate (as for SB)
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_sbsfxsd:
test modebitmap,1
jz _ret
call _stopsmp
push eax
push bx
push edx
mov dmaolen,ecx
add edx,_code32a
mov dmaoaddx,dx
shr edx,16
mov dmaopage,dl
mov dx,_sbport
mov ah,40h
call writedsp
mov ah,bl
call writedsp
mov ah,0f2h
call writedsp
pop edx
pop bx
pop eax
ret
endif
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Stop digital output
; In:
; None
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_stopsmp:
test modebitmap,1
jz _ret
stopsmp2:
jmp _ret ;88888888888888888888888888888888888
pushf
push ax
push dx
mov dx,_sbport
stopsmpl:
sti
cmp _dspout,0
je short stopsmpd
cli
in al,dx
or al,al
jns stopsmpl
in al,dx
or al,al
js $-3
mov al,0d0h
out dx,al
mov al,5
out 0ah,al
add dl,2
in al,dx
mov _dspout,0
sti
stopsmpd:
pop dx
pop ax
popf
ret
ifdef ADJSMP
public _adjsmp
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Halve volume of digital sample
; In:
; ECX - length of sample
; EDX -> sample
; Out:
; None
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_adjsmp:
push ax
push ecx
push edx
adjsmpml:
mov al,[edx]
shr al,1
add al,40h
mov [edx],al
inc edx
loop adjsmpml
pop edx
pop ecx
pop ax
ret
endif
code32 ends
end