home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
modiromppu
/
modiromppu.iso
/
PROGRAMS
/
ORGPACKS
/
SADT2.ZIP
/
QDPLAY.ASM
< prev
next >
Wrap
Assembly Source File
|
1995-05-28
|
42KB
|
1,810 lines
Dosseg
;
; Quick 'n' Dirty play for Surprise! Adlib Tracker SA2 files (version 9)
;
.Model Small
.Stack 40H
.286
locals
.Data
NoAdlib db 7,"No Adlib found!$"
.Code
include memtools.blk
locals
.286
fname db 130 dup (0)
fsong dw ?
Okt1 equ 0010000000000000B
Okt2 equ 0010010000000000B
Okt3 equ 0010100000000000B
Okt4 equ 0010110000000000B
Okt5 equ 0011000000000000B
Okt6 equ 0011010000000000B
Okt7 equ 0011100000000000B
Okt8 equ 0011110000000000B
_patternorder equ 966
_songlength equ 1096
_restart equ 1097
_bpm equ 1098
_arpeggio equ 1100
_acommands equ 1356
_trackorder equ 1612
_channels equ 2188
_trackdata equ 2190
Adwrite macro r,w
mov dx,388h
mov al,r
out dx,al
call waitlong
mov dx,389h
mov al,w
out dx,al
endm
NoteTab dw 0 ; dummy note
dw Okt1+343,Okt1+363,Okt1+385,Okt1+408,Okt1+432,Okt1+458
dw Okt1+485,Okt1+514,Okt1+544,Okt1+577,Okt1+611,Okt1+647 ; Oktave3
dw Okt2+343,Okt2+363,Okt2+385,Okt2+408,Okt2+432,Okt2+458
dw Okt2+485,Okt2+514,Okt2+544,Okt2+577,Okt2+611,Okt2+647 ; Oktave3
dw Okt3+343,Okt3+363,Okt3+385,Okt3+408,Okt3+432,Okt3+458
dw Okt3+485,Okt3+514,Okt3+544,Okt3+577,Okt3+611,Okt3+647 ; Oktave3
dw Okt4+343,Okt4+363,Okt4+385,Okt4+408,Okt4+432,Okt4+458
dw Okt4+485,Okt4+514,Okt4+544,Okt4+577,Okt4+611,Okt4+647 ; Oktave4
dw Okt5+343,Okt5+363,Okt5+385,Okt5+408,Okt5+432,Okt5+458
dw Okt5+485,Okt5+514,Okt5+544,Okt5+577,Okt5+611,Okt5+647 ; Oktave5
dw Okt6+343,Okt6+363,Okt6+385,Okt6+408,Okt6+432,Okt6+458
dw Okt6+485,Okt6+514,Okt6+544,Okt6+577,Okt6+611,Okt6+647 ; Oktave6
dw Okt7+343,Okt7+363,Okt7+385,Okt7+408,Okt7+432,Okt7+458
dw Okt7+485,Okt7+514,Okt7+544,Okt7+577,Okt7+611,Okt7+647 ; Oktave7
dw Okt8+343,Okt8+363,Okt8+385,Okt8+408,Okt8+432,Okt8+458
dw Okt8+485,Okt8+514,Okt8+544,Okt8+577,Okt8+611,Okt8+647; ; Oktave8
dw 16 dup (Okt8+647)
InsTab dw 32 dup (0)
Register_map db 0,1,2,8,9,10,16,17,18
Vibratotab db 0, 24, 49, 74, 97,120,141,161
db 180,197,212,224,235,244,250,253
db 255,253,250,244,235,224,212,197
db 180,161,141,120, 97, 74, 49, 24
arpeggio_table db 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
channel_active db 9 dup (0)
channel_ins db 9 dup (0)
channel_note db 9 dup (0)
channel_note2 db 9 dup (0)
channel_vol2 db 9 dup (0) ; connector
channel_vol db 9 dup (0) ; carrier
channel_vpos db 9 dup (0)
channel_vspeed db 9 dup (0)
channel_vdepth db 9 dup (0)
channel_eff dw 9 dup (0)
channel_freq dw 9 dup (0)
channel_fshift dw 9 dup (0)
channel_pdest dw 9 dup (0)
channel_pspeed dw 9 dup (0)
channel_aspeed db 9 dup (0)
channel_acurpos db 9 dup (0)
channel_acursp db 9 dup (0)
channel_vsubt db 9 dup (0)
channel_segment db 9 dup (0)
mainvol db 64 ; 64 = max, 0 = min
count db 0
Register_bypass db 246 dup (0)
current_pos db 9 dup (0)
current_speed db 9 dup (6)
s_count db 9 dup (0)
current_line db 9 dup (0)
work_pattern dw 9 dup (_trackorder)
position_jump db 9 dup (0)
new_position db 9 dup (0)
break_pos db 9 dup (0)
pattern_break db 9 dup (0)
polling db 1
segments dw 9 dup (0)
stopped db 9 dup (1)
segnum dw 0
current_bpm dw 0
waitlong proc
;
; waits 23.3 ys
;
rept 35
in al,dx
endm
ret
waitlong endp
Fastwrite proc
cmp cs:Register_bypass[bx],ah
je f_w_1
mov cs:Register_bypass[bx],ah
mov dx,388h
mov al,bl
out dx,al
call waitlong
mov dx,389h
mov al,ah
out dx,al
f_w_1:
ret
Fastwrite endp
WriteThrough proc
mov cs:Register_bypass[bx],ah
mov dx,388h
mov al,bl
out dx,al
call waitlong
mov dx,389h
mov al,ah
out dx,al
ret
WriteThrough endp
empty proc
ret
empty endp
general_ret:
sti
ret
TestAdlib proc
;
; Checks for adlib
; carry flag:
; 1...........no Adlib detected
; 0...........Adlib found (yeah!)
;
Adwrite 1,0
Adwrite 4,60H
Adwrite 4,80H
mov dx,388h
in al,dx
and al,11100000b
mov bl,al
Adwrite 2,0ffH
Adwrite 4,00100001b
mov cx,6
t_a_1:
call waitlong
loop t_a_1
mov dx,388h
in al,dx
and al,11100000b
mov bh,al
Adwrite 4,60H
Adwrite 4,80H
cmp bl,0
jne t_a_2
cmp bh,11000000b
jne t_a_2
clc
ret
t_a_2:
stc
mov ax,4
ret
TestAdlib endp
Init_Adlib proc
mov bx,1
mov cx,245
I_a_1:
mov ah,0
call WriteThrough
inc bx
loop I_a_1
mov bx,1
mov ah,00100000b
call WriteThrough
mov bx,8
mov ah,01000000B
call WriteThrough
mov bx,0bdh
mov ah,11000000B
call WriteThrough
lea bx,InsTab
mov ax,5
mov cx,31
I_a_3:
mov cs:[bx],ax
add bx,2
add ax,15
loop I_a_3
mov mainvol,64
clc
ret
Init_Adlib endp
Init_Adlib_Tables proc
;
; Initialisiert Tabellen, etc.
;
mov si,0
mov bx,0
mov cx,9
@@l1:
mov stopped [si],1
mov channel_active [si],0
mov channel_ins [si],0
mov channel_note [si],0
mov channel_note2 [si],0
mov channel_vol [si],0
mov channel_vol2 [si],0
mov channel_vpos [si],0
mov channel_vspeed [si],0
mov channel_vdepth [si],0
mov channel_eff [bx],0
mov channel_freq [bx],0
mov channel_fshift [bx],0
mov channel_pdest [bx],0
mov channel_pspeed [bx],0
mov channel_aspeed [si],0
mov channel_acurpos [si],0
mov channel_acursp [si],0
mov channel_vsubt [si],0
mov current_speed [si],6
mov current_line [si],0
mov break_pos [si],0
mov pattern_break [si],0
mov position_jump [si],0
inc si
add bx,2
jumps
loop @@l1
nojumps
mov mainvol,64
ret
Init_Adlib_Tables endp
DefineBoth proc
add bl,cl
lodsw
mov ch,ah
mov ah,al
call Fastwrite ; Connector
add bl,3
mov ah,ch
call Fastwrite ; Carrier
ret
DefineBoth endp
CalcVol proc
sub al,63
neg al
mov dl,mainvol
mul dl
shr ax,6
sub al,63
neg al
ret
calcvol endp
Set_Volume proc
mov di,bx
mov bx,40h
add bl,Register_map[di] ; bl = KSL / TL offset
mov cx,ax
mov al,ch
and al,63
mov channel_vol2[di],al
call calcvol
mov ah,al
mov al,register_bypass[bx]
and al,11000000b
or ah,al
call Fastwrite
s_v_1:
add bl,3
mov al,cl
and al,63
mov channel_vol[di],al
call calcvol
mov ah,al
mov al,register_bypass[bx]
and al,11000000b
or ah,al
jmp Fastwrite
Set_Volume endp
calc_freq_up proc
mov dx,cx
mov di,cx
and dx,0011110000000000b
and cx,1023
add cx,ax
cmp cx,647
jl @@fu_ok
mov ax,di
@@fu_2:
and ax,0001110000000000b
cmp ax,0001110000000000b
jne @@next_okt
mov cx,di
jmp @@fu_ok
@@next_okt:
sar cx,1
add ax,0000010000000000b
and di,0010000000000000b
or ax,di
mov dx,ax
cmp cx,647
jg @@fu_2
@@fu_ok:
or cx,dx
ret
calc_freq_up endp
calc_freq_down proc
mov dx,cx
mov di,cx
and dx,0011110000000000b
and cx,1023
sub cx,ax
cmp cx,343
jg @@fd_ok
mov ax,di
@@fd_2:
and ax,0001110000000000b
cmp ax,0
jne @@prev_okt
mov cx,di
jmp @@fd_ok
@@prev_okt:
sal cx,1
sar ah,2
dec ah
sal ah,2
and di,0010000000000000b
or ax,di
mov dx,ax
cmp cx,343
jl @@fd_2
@@fd_ok:
or cx,dx
ret
calc_freq_down endp
Frequenz_up2 proc
shl bp,1
mov cx,cs:channel_freq[bp]
shr bp,1
call calc_freq_up
add bx,0a0h
mov ah,cl
call Fastwrite
add bx,10h
mov ah,register_bypass[bx]
and ah,32
and ch,31
or ah,ch
call Fastwrite
ret
Frequenz_up2 endp
Frequenz_down2 proc
shl bp,1
mov cx,cs:channel_freq[bp]
shr bp,1
add bx,0a0h
call calc_freq_down
mov ah,cl
call Fastwrite
add bx,10h
mov ah,register_bypass[bx]
and ah,32
and ch,31
or ah,ch
call Fastwrite
ret
Frequenz_down2 endp
Release_note proc
add bx,0b0h
mov ah,register_bypass[bx]
test ah,32
jz @@released
and ah,255-32
jmp WriteThrough
@@released:
ret
release_note endp
Retrig_note proc
add bx,0b0h
mov ah,register_bypass[bx]
test ah,32
jnz @@still_on
or ah,32
call WriteThrough
@@released:
ret
@@still_on:
mov bx,bp
call release_note
mov bx,bp
jmp retrig_note
retrig_note endp;
Play_Note2 proc
pusha
call release_note
sub bx,10h
xor ch,ch
mov si,cx
shl si,1
add si,offset NoteTab
mov cx,cs:[si]
mov ah,cl
call Fastwrite
add bx,10h
mov ah,ch
call WriteThrough
mov bx,bp
shl bx,1
mov channel_freq[bx],cx
mov channel_fshift[bx],0
popa
ret
play_note2 endp
Set_Freq proc
add bx,0a0h
mov ah,cl
call Fastwrite
add bx,10h
mov ah,register_bypass[bx]
and ah,32
and ch,31
or ah,ch
call FastWrite
mov bx,bp
shl bx,1
mov channel_freq[bx],cx
ret
Set_Freq endp
Init_Instrument2 proc
pusha
mov bl,ch
dec bl
xor bh,bh
shl bx,1
mov si,cs:instab[bx]
;--- spec. arpeggio init ----------------------------------
mov bx,si
add si,11
lodsb
mov cs:channel_acurpos[bp],al
lodsb
cmp al,0
jne @@alok
inc al
@@alok:
mov cs:channel_acursp[bp],0
mov cs:channel_aspeed[bp],al
@@no_spec:
mov si,bx
;----------------------------------------------------------
mov bx,bp
mov cl,bl
mov bx,0c0h
add bl,cl
lodsb
mov ah,al
mov ch,al
call Fastwrite
mov bx,bp
add bx,offset Register_map
mov cl,cs:[bx]
mov bx,20h
call DefineBoth
mov bx,60h
call DefineBoth
mov bx,80h
call DefineBoth
mov bx,0e0h
call DefineBoth
mov bx,40h
add bl,cl
lodsw
mov cx,ax
mov di,bp
mov al,byte ptr channel_vol2[di]
mov ah,byte ptr channel_vol[di]
and ax,0011111100111111b
and cx,1100000011000000b
or ax,cx
or cx,ax
and al,63
call calcvol
mov ah,al
and cl,11000000b
or ah,cl
call Fastwrite
add bl,3
mov al,ch
and al,63
call calcvol
mov ah,al
and ch,11000000b
or ah,ch
call Fastwrite
popa
ret
@@seperate_vol:
ret
Init_Instrument2 endp
select_wave proc
mov bl,register_map[bx]
xor bh,bh
add bx,0e0h
mov ah,cl
dec ah
js @@none1
call fastwrite
@@none1:
add bx,3
mov ah,ch
dec ah
js @@none2
jmp fastwrite
@@none2:
ret
select_wave endp
Mute_voice proc
push bx
mov dl,register_map[bx]
mov cl,dl
add dl,60h
mov bl,dl
mov di,bx
mov ah,0ffh
call fastwrite
mov bx,di
add bx,3
mov ah,0ffh
call fastwrite
mov bx,di
add bx,20h
mov ah,0ffh
call fastwrite
mov bx,di
add bx,23h
mov ah,0ffh
call fastwrite
pop bx
add bx,0b0h
mov di,bx
mov ah,032
call fastwrite
mov bl,cl
add bx,40h
mov ah,register_bypass[bx]
or ah,63
call fastwrite
mov ah,0
mov bx,di
jmp fastwrite
m_v:
ret
Mute_voice endp
Clear_All_Voices proc
mov cx,9
mov bp,0
c_a_v_2:
push cx
mov bx,bp
call mute_voice
inc bp
pop cx
loop c_a_v_2
ret
Clear_All_Voices endp
Set_Main_Volume proc
cmp bl,64
jbe s_m_v_ok
mov ax,0
stc
ret
s_m_v_ok:
cmp mainvol,bl
je s_m_v_end
mov mainvol,bl
mov si,0
mov cx,9
s_m_v_1:
cmp channel_active[si],0
je s_m_v_2
mov di,si
add di,offset channel_vol2
mov bx,40h
add bl,register_map[si]
mov al,cs:[di]
call calcvol
mov ah,al
mov al,register_bypass[bx]
and al,11000000b
or ah,al
call Fastwrite
add bl,3
add di,9
mov al,cs:[di]
call calcvol
mov ah,al
mov al,register_bypass[bx]
and al,11000000b
or ah,al
call Fastwrite
s_m_v_2:
inc si
loop s_m_v_1
s_m_v_end:
ret
Set_Main_Volume endp
shift_helper proc
mov bx,bp
cmp ax,0
jl @@down
call calc_freq_up
jmp @@doit
@@down:
neg ax
call calc_freq_down
@@doit:
add bx,0a0h
mov ah,cl
call Fastwrite
add bx,10h
mov al,register_bypass[bx]
and al,32
mov ah,ch
and ah,11011111b
or ah,al
call Fastwrite
mov bx,bp
shl bx,1
mov channel_freq[bx],cx
ret
shift_helper endp
effect_arpeggio proc
mov cl,cs:channel_note2[bp]
mov bl,byte ptr count
xor bh,bh
mov bl,byte ptr arpeggio_table[bx]
cmp bl,0
je @@arp_found
cmp bl,1
jne @@arp2
shr ah,4
add cl,ah
jmp @@arp_found
@@arp2:
and ah,15
add cl,ah
@@arp_found:
cmp cl,96
jbe @@note_ok
mov cl,96
@@note_ok:
xor ch,ch
mov bx,cx
shl bx,1
mov cx,word ptr notetab[bx]
mov bx,bp
call set_freq
ret
effect_arpeggio endp
effect_slide_up proc
mov bx,bp
shl bx,1
mov al,ah
xor ah,ah
add word ptr channel_fshift[bx],ax
mov ax,word ptr channel_fshift[bx]
mov bl,byte ptr cs:channel_note2[bp]
xor bh,bh
shl bx,1
mov cx,word ptr notetab[bx]
call shift_helper
ret
effect_slide_up endp
effect_slide_down proc
mov bx,bp
shl bx,1
mov al,ah
xor ah,ah
sub word ptr channel_fshift[bx],ax
mov ax,word ptr channel_fshift[bx]
mov bl,byte ptr cs:channel_note2[bp]
xor bh,bh
shl bx,1
mov cx,word ptr notetab[bx]
call shift_helper
ret
effect_slide_down endp
effect_portamento proc
cmp count,0
ja @@not_first
mov bx,bp
shl bx,1
cmp ah,0
je @@no_new_speed
mov al,ah
xor ah,ah
mov word ptr channel_pspeed[bx],ax
@@no_new_speed:
mov bl,byte ptr cs:channel_note[bp]
cmp bl,0
je @@not_first
xor bh,bh
shl bx,1
mov dx,word ptr notetab[bx]
mov bx,bp
shl bx,1
mov word ptr channel_pdest[bx],dx
@@not_first:
jmp execute_portamento
effect_portamento endp
execute_portamento proc
mov bx,bp
add bx,0a0h
mov al,byte ptr register_bypass[bx]
add bx,10h
mov ah,byte ptr register_bypass[bx]
mov bx,bp
shl bx,1
mov dx,word ptr channel_pdest[bx]
mov cx,word ptr channel_pspeed[bx]
cmp ax,dx
jumps
je @@kill_porta
ja @@pdown
@@up:
nojumps
mov bx,bp
mov ax,cx
push dx
add bx,0b0h
mov ch,byte ptr register_bypass[bx]
sub bx,10h
mov cl,byte ptr register_bypass[bx]
call calc_freq_up
pop dx
mov bx,cx
mov ax,dx
and bx,0011100000000000b
and ax,0011100000000000b
cmp bx,ax
jb @@puok
mov bx,cx
mov ax,dx
and bx,0000011111111111b
and ax,0000011111111111b
cmp bx,ax
jb @@puok
mov cx,dx
@@puok:
mov bx,bp
call set_freq
ret
@@pdown:
mov bx,bp
mov ax,cx
push dx
add bx,0b0h
mov ch,byte ptr register_bypass[bx]
sub bx,10h
mov cl,byte ptr register_bypass[bx]
call calc_freq_down
pop dx
mov bx,cx
mov ax,dx
and bx,0011100000000000b
and ax,0011100000000000b
cmp bx,ax
ja @@pdok
mov bx,cx
mov ax,dx
and bx,0000011111111111b
and ax,0000011111111111b
cmp bx,ax
ja @@pdok
mov cx,dx
@@pdok:
mov bx,bp
call set_freq
@@kill_porta:
ret
execute_portamento endp
effect_vibrato proc
cmp count,0
ja @@not_first
cmp ah,0
je @@not_first
mov al,ah
and al,15
shr ah,4
mov cs:channel_vspeed[bp],ah
mov cs:channel_vdepth[bp],al
mov dl,ah
jmp do_vibrato
@@not_first:
jmp execute_vibrato
effect_vibrato endp
execute_vibrato proc
mov dl,cs:channel_vspeed[bp]
mov al,cs:channel_vdepth[bp]
do_vibrato:
mov bl,cs:channel_vpos[bp]
xor bh,bh
add bl,dl
mov cs:channel_vpos[bp],bl
mov dh,bl
and bx,1fh
mov dl,byte ptr vibratotab[bx]
mul dl
rol ax,1
xchg ah,al
and ah,1
test dh,32
jne @@vibup
jmp @@vibdown
@@vibup:
mov bx,bp
call frequenz_up2
ret
@@vibdown:
mov bx,bp
call frequenz_down2
ret
execute_vibrato endp
effect_volume_slide proc
cmp count,0
jne @@just_vslide
mov dl,ah
cmp dl,16
jb @@dlok
shr dl,4
neg dl
@@dlok:
mov bx,bp
shl bx,1
mov byte ptr channel_eff[bx+1],dl
mov ah,dl
mov byte ptr cs:channel_vsubt[bp],0
@@just_vslide:
mov dl,ah
mov dh,byte ptr cs:channel_vsubt[bp]
add dh,dl
mov ch,dh
sar ch,2
mov ah,byte ptr cs:channel_vol2[bp]
mov al,byte ptr cs:channel_vol[bp]
add ah,ch
add al,ch
cmp al,0
jge @@alok
xor al,al
@@alok:
cmp ah,0
jge @@ahok
xor ah,ah
@@ahok:
cmp ah,63
jb @@ahok2
mov ah,63
@@ahok2:
cmp al,63
jb @@alok2
mov al,63
@@alok2:
sal ch,2
sub dh,ch
mov byte ptr cs:channel_vsubt[bp],dh
mov bx,bp
call set_volume
ret
effect_volume_slide endp
effect_portamento_volume_slide proc
call effect_volume_slide
call execute_portamento
ret
effect_portamento_volume_slide endp
effect_vibrato_volume_slide proc
call effect_volume_slide
call execute_vibrato
ret
effect_vibrato_volume_slide endp
effect_release_note proc
mov bx,bp
call release_note
mov bx,bp
shl bx,1
mov word ptr channel_eff[bx],0
ret
effect_release_note endp
effect_position_jump proc
mov bx,segnum
mov position_jump[bx],1
mov al,ah
xor ah,ah
mov cs:new_position[bx],al
mov cs:break_pos[bx],0
mov cs:pattern_break[bx],1
mov bx,bp
shl bx,1
mov word ptr channel_eff[bx],0
ret
effect_position_jump endp
effect_set_volume proc
cmp ah,63
jb @@ahok
mov ah,63
@@ahok:
mov al,63
sub al,ah
mov ah,al
mov bx,bp
call set_volume
ret
effect_set_volume endp
effect_pattern_break proc
mov bx,segnum
mov cs:pattern_break[bx],1
mov bx,ax
mov al,ah
shr al,4
mov cl,10
mul cl
and bh,0fh
add al,bh
xor ah,ah
mov cs:break_pos[bx],al
mov bx,bp
shl bx,1
mov word ptr channel_eff[bx],0
ret
effect_pattern_break endp
effect_set_speed proc
mov bx,segnum
cmp ah,0
ja @@ahok
mov ah,1
@@ahok:
cmp ah,31
ja @@high_speed
mov current_speed[bx],ah
jmp @@aout
@@high_speed:
cmp polling,1
je @@aout
mov bl,ah
xor bh,bh
cmp bx,50
ja @@bxok
mov bx,50
@@bxok:
; mov current_bpm,bx
; add bx,3
cli
mov dx,2dh
mov ax,8426h
div bx
push ax
mov al,54
out 43h,al
pop ax
out 40h,al
xchg ah,al
out 40h,al
sti
@@aout:
mov bx,bp
shl bx,1
mov word ptr channel_eff[bx],0
ret
effect_set_speed endp
spec_arpeggio proc
pusha
cmp byte ptr cs:channel_acurpos[bp],0
jumps
je @@no_arp
dec byte ptr cs:channel_acursp[bp]
jg @@no_arp
nojumps
mov al,byte ptr cs:channel_acurpos[bp]
xor ah,ah
mov di,ax
mov al,byte ptr ds:[_acommands+di]
cmp al,254
jb @@no_verw
cmp al,255
jne @@no_end
mov byte ptr cs:channel_acurpos[bp],0
jmp @@no_arp
@@no_end:
mov al,byte ptr ds:[_arpeggio+di]
mov di,ax
mov byte ptr cs:channel_acurpos[bp],al
mov al,byte ptr ds:[_acommands+di]
@@no_verw:
cmp al,0
je @@no_command
cmp al,44
ja @@no_wave
xor ah,ah
mov bl,10
div bl
xchg al,ah
mov cx,ax
mov bx,bp
call select_wave
jmp @@no_command
@@no_wave:
cmp al,253
jne @@no_release
mov bx,bp
call release_note
@@no_release:
cmp al,252
jne @@no_setvol
mov ah,byte ptr ds:[_arpeggio+di]
call effect_set_volume
@@no_setvol:
cmp al,251
jne @@no_retrig_vol
mov ah,byte ptr ds:[_arpeggio+di]
call effect_set_volume
mov bx,bp
call retrig_note
jmp @@no_half
@@no_retrig_vol:
@@no_command:
mov al,byte ptr ds:[_arpeggio+di]
cmp al,100
ja @@abs_note_found
mov ah,byte ptr cs:channel_note[bp]
add al,ah
jmp @@note_check
@@abs_note_found:
sub al,99
@@note_check:
cmp al,96
jbe @@note_found
mov al,96
@@note_found:
xor ah,ah
mov byte ptr cs:channel_note2[bp],al
mov bx,ax
shl bx,1
mov cx,word ptr notetab[bx]
mov bx,bp
shl bx,1
mov ax,word ptr channel_fshift[bx]
call shift_helper
@@no_half:
mov al,byte ptr cs:channel_aspeed[bp]
mov byte ptr cs:channel_acursp[bp],al
inc byte ptr cs:channel_acurpos[bp]
@@no_arp:
popa
ret
spec_arpeggio endp
do_volume proc
pusha
mov bl,al
dec bl
xor bh,bh
shl bx,1
mov si,word ptr InsTab[bx]
add si,9
mov al,[si]
mov ah,al
mov al,[si+1]
and ax,3F3FH
mov bx,bp
call set_volume
dov2:
popa
ret
do_volume endp
calc_work_pattern proc
xor ah,ah
mov bp,ax
add bp,_patternorder
mov al,ds:[bp]
mov dx,ax
shl dx,3
add ax,dx
add ax,_trackorder
mov work_pattern[bx],ax
ret
calc_work_pattern endp
effect_calls dw offset effect_arpeggio ; 0
dw offset effect_slide_up ; 1
dw offset effect_slide_down ; 2
dw offset effect_portamento ; 3
dw offset effect_vibrato ; 4
dw offset effect_portamento_volume_slide ; 5
dw offset effect_vibrato_volume_slide ; 6
dw offset empty ; 7
dw offset effect_release_note ; 8
dw offset empty ; 9
dw offset effect_volume_slide ; A
dw offset effect_position_jump ; B
dw offset effect_set_volume ; C
dw offset effect_pattern_break ; D
dw offset empty ; E
dw offset effect_set_speed ; F
_eff db 0
_para db 0
play_line proc
mov cx,9
mov bp,0
@@l1:
push cx
cmp byte ptr cs:channel_active[bp],1
je @@play
jmp @@no_effect
@@play:
mov bl,cs:channel_segment[bp]
xor bh,bh
mov segnum,bx
mov al,s_count[bx]
mov count,al
shl bx,1
mov dx,cs:segments[bx]
mov ds,dx
shr bx,1
cmp al,0
jumps
jne @@effects
nojumps
xor ah,ah
mov al,current_line[bx]
mov si,ax
shl si,1
add si,ax
shl bx,1
mov bx,work_pattern[bx]
add bx,bp
mov al,[bx]
cmp al,0
jumps
je @@no_effect
nojumps
dec ax
mov bx,192
mul bx
add si,ax
add si,_trackdata
cmp count,0
jbe @@do_note
jmp @@effects
@@do_note:
lodsb
mov cl,al
lodsb
mov ah,al
lodsb
mov _para,al
mov ch,ah
and ch,15
mov _eff,ch
and ah,0f0h
shr cl,1
rcr ah,4
mov al,ah
mov ch,al
jcxz @@nothing_there
cmp al,0
je @@no_ins
mov byte ptr cs:channel_ins[bp],al
call do_volume
@@no_ins:
cmp cl,0
je @@nothing_there
mov byte ptr cs:channel_note[bp],cl
mov byte ptr cs:channel_note2[bp],cl
cmp _eff,3
je @@nothing_there
mov ch,byte ptr cs:channel_ins[bp]
call init_instrument2
mov bx,bp
mov byte ptr cs:channel_vpos[bp],0
call play_note2
@@nothing_there:
mov al,_eff
mov ah,_para
mov bx,bp
shl bx,1
mov word ptr channel_eff[bx],ax
@@effects:
call spec_arpeggio
mov bx,bp
shl bx,1
mov ax,word ptr channel_eff[bx]
mov bx,ax
cmp bx,0
je @@no_effect
xor bh,bh
shl bx,1
mov bx,effect_calls[bx]
call bx
@@no_effect:
inc bp
pop cx
jumps
loop @@l1
nojumps
mov cx,9
xor bx,bx
xor si,si
@@l2:
mov ax,segments[bx]
cmp ax,0
je @@fuck_off
cmp stopped[si],1
je @@fuck_off
mov ds,ax
inc s_count[si]
mov al,current_speed[si]
cmp s_count[si],al
jl @@no_advance
mov s_count[si],0
inc current_line[si]
cmp current_line[si],64
je @@advance
cmp pattern_break[si],1
je @@advance
jmp @@no_advance
@@advance:
inc current_pos[si]
mov al,current_pos[si]
cmp al,ds:[_songlength]
jb @@norestart
mov al,ds:[_restart]
@@norestart:
cmp position_jump[si],0
je @@noposjump
mov al,new_position[si]
@@noposjump:
mov current_pos[si],al
call calc_work_pattern
mov al,break_pos[si]
mov current_line[si],al
mov break_pos[si],0
mov pattern_break[si],0
mov position_jump[si],0
@@no_advance:
@@fuck_off:
inc si
add bx,2
jumps
loop @@l2
nojumps
clc
ret
play_line endp
test_device proc
call testadlib
ret
test_device endp
oldone_got db 0
init_device proc
call init_adlib
call init_adlib_tables
cmp oldone_got,0
jne @@got
call getold
@@got:
mov oldone_got,1
clc
ret
init_device endp
stop_all proc
cli
call clear_all_voices
call init_adlib
call init_adlib_tables
sti
cmp oldone_got,0
je @@not
call setold
@@not:
call reset_clock_ticks
clc
ret
stop_all endp
load_song proc
;
; bl = num (0..8)
; dx = segment
;
xor bh,bh
cmp bx,8
ja @@err
mov si,bx
shl si,1
cmp segments[si],0
jne @@err
mov ds,dx
mov ax,ds:[_channels]
xor si,si
mov cx,9
@@l1:
shl ax,1
jnc @@nop
cmp channel_active[si],0
jne @@err
@@nop:
inc si
loop @@l1
mov ax,ds:[_channels]
xor si,si
mov cx,9
@@l2:
shl ax,1
jnc @@nop2
mov channel_active[si],0
mov channel_segment[si],bl
@@nop2:
inc si
loop @@l2
mov stopped[bx],1
shl bx,1
mov segments[bx],dx
mov ax,ds:[_BPM]
mov current_bpm,ax
@@noerr:
clc
ret
@@err:
stc
ret
load_song endp
unload_song proc
;
; bl = num (0..8)
;
xor bh,bh
cmp bx,8
ja merr
mov si,bx
shl si,1
cmp segments[si],0
je merr
mov dx,segments[si]
mov segments[si],0
mov ds,dx
mov ax,ds:[_channels]
xor si,si
mov cx,9
@@l1:
shl ax,1
jnc @@nop
cmp channel_active[si],0
je merr
cmp channel_segment[si],bl
jne merr
@@nop:
inc si
loop @@l1
mov ax,ds:[_channels]
xor si,si
mov cx,9
@@l2:
shl ax,1
jnc @@nop2
mov channel_active[si],0
mov channel_segment[si],0
pusha
mov bx,si
call mute_voice
popa
@@nop2:
inc si
loop @@l2
mov stopped[bx],1
shl bx,1
mov segments[bx],0
noerr:
clc
ret
merr:
stc
ret
unload_song endp
start_song proc
;
; bl = num
;
xor bh,bh
cmp bl,8
ja merr
shl bx,1
mov ax,segments[bx]
cmp ax,0
je merr
mov ds,ax
mov al,0
push bx
call calc_work_pattern
pop bx
shr bx,1
mov current_line[bx],0
mov current_speed[bx],6
mov pattern_break[bx],0
mov current_pos[bx],0
mov s_count[bx],0
mov position_jump[bx],0
mov stopped[bx],0
mov ax,ds:[_channels]
xor si,si
mov cx,9
@@l2:
shl ax,1
jnc @@nop2
mov channel_active[si],1
@@nop2:
inc si
loop @@l2
clc
ret
start_song endp
play_independent proc
mov polling,0
mov ax,current_bpm
mov ah,al
cli
mov bp,0
call effect_set_speed
call setnew
sti
ret
play_independent endp
service_calls dw offset test_device ; 0
dw offset init_device ; 1
dw offset load_song ; 2
dw offset unload_song ; 3
dw offset start_song ; 4
dw offset play_line ; 5
dw offset play_independent ; 6
dw offset set_main_volume ; 7
dw offset empty ; 8
dw offset empty ; 9
dw offset stop_all ; 10
adlib proc
push ds
cmp al,10
jg @@finish
xor ah,ah
mov si,ax
shl si,1
mov bp,service_calls[si]
call bp
pop ds
ret
@@finish:
pop ds
stc
ret
adlib endp
;-------------------------------------------------------------------------------
old08_seg dw ?
old08_offs dw ?
GetOld PROC
mov ah,35h
mov al,8
int 21h
mov ax,es
mov old08_seg,ax
mov old08_offs,bx
ret
GetOld ENDP
SetOld PROC
mov ax,old08_seg
mov ds,ax
mov dx,old08_offs
mov ah,25h
mov al,8
int 21h
ret
SetOld ENDP
SetNew PROC
push cs
push cs
pop ds
lea dx,new08
mov ah,25h
mov al,8
int 21h
pop ds
ret
SetNew ENDP
New08 PROC
pusha
push ds
push es
call play_line
mov al,20h
out 20h,al
pop es
pop ds
popa
iret
New08 ENDP
Reset_Clock_Ticks PROC
cli
mov al,54
out 43h,al
mov al,0
out 40h,al
out 40h,al
sti
ret
Reset_Clock_Ticks ENDP
;-------------------------------------------------------------------------------
usage db 'Usage: qdplay <filename>',13,10,'$'
bad_use:
push cs
pop ds
mov ah,9
lea dx,usage
int 21h
mov ah,4ch
int 21h
get_file proc
mov ah,62h
int 21h
mov ds,bx
mov si,80h
lodsb
xor ah,ah
mov cx,ax
jcxz bad_use
dec cx
jcxz bad_use
push cs
pop es
inc si
lea di,fname
rep movsb
ret
get_file endp
vol db 64
start:
call setfree ; init memory..
call get_file
push cs
pop ds
lea dx,fname
lea di,fsong
call loadseg
mov al,1
call adlib ; init
mov bl,0
push fsong
pop dx
mov al,2
call adlib ; loadsong
mov al,4
mov bl,0
call adlib ; startsong
mov al,6
call adlib ; play using timer interrupt...
again:
sti
mov ah,11
int 21h
cmp al,0
je again
mov ah,8
int 21h
cmp al,'+'
jne @@no_p
cmp vol,64
jge again
inc vol
mov bl,vol
mov al,7
call adlib
jmp again
@@no_p:
cmp al,'-'
jne @@no_m
cmp vol,0
jle again
dec vol
mov bl,vol
call set_main_volume ; change main volume
jmp again
@@no_m:
mov al,10
call adlib ; end of all
end_of_all:
mov ax,4c00H
int 21H
end start
; ▄▀▀▀▀▀▀▀▀▓▀▀▀▀▀▀▀▀▓ ▓▀▀▀▀▀▀▀▀▀▓▄▄
; ▓ ▄█▓▀▀▀▀ ▄████▄ ▀▀█ █ ▒▓█ ▒▓█ █
; █ ▀▀▀▀█▄ ▐██ ██▌ ▓ █ ▓██ ▓██▀▀ █▄▄
; █ ▄▄▌ ██▌ ██▓ ███ ▓ █ ▓██ ▓██ ▐▄▄ ■▓
; █ ██▓ ███ ██▓ ███ ▓▄▓ ███ ███ ███ █
; █ ██▓ ███ ███▄▄███ ▄▄▄▄███ ███ ███ █
; █ ███ ██▓ ███ ██▓ ▐██ ██▓ ███ ██▓ █
; █ ███ ██▓ ███ ██▓ ███ ██▓ ███ ██▓ █
; ▐▌▐██▒ ██▓ ███▒ ██▓ ███▒ ██▓ ▐██▒ ██▓ █
; █ ▀█▓▄█▓▒ ███▓ █▓▒ ▀██▓▄█▓▒ ▀█▓▄█▓▒ █
; ▓■▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▓▄▄▄▄▄▄▄▄▓ v2.00 - Quick'n'Dirty Play