Metropoli BBS
VIEWER: gus.asm MODE: TEXT (ASCII)
	Jumps
	.286

_Stack	Segment Para Stack 'Stack'

	db	100h dup (0)

_Stack	ends

Extrn	MainVolume:Word,ChanOn:Word,PatternRow:Word,RealRow:Word,OrderLen:Byte
Extrn	PlayingPattern:Word,RealPPattern:Word,Time:DWord,SampChans:Byte
Extrn	Bar:Byte,NumChans:Word,BasePort:Word,ErrorCode:Word
Extrn	LoadMod:Far,ClearMem:Far,StartPlaying:Far,StopPlaying:Far,Init:Far
Extrn	InitDevice:Far

_Code	Segment	Para 'Code'

	assume	cs:_Code

	ModToRead	db 70 dup (0)
	CommandLine	db 127 dup (0)
	KeySeg		dw 0
	KeyOfs		dw 0
	Key		db 0
	CommandLineC	db 0,'',0Dh
	Error		db '    Internal Error. Restart the computer and try again.$'
	OutOfMem	db '    Not enough memory!$'
	WrongName	db '    File or path not found!$'
	Docs		db 13,10
			db '    Module Player v1.5   (C) Robert Adolfsson (Cascada) 1993.',13,10
			db 13,10
			db '    For Advanced Gravis UltraSound',13,10
			db '    Supports Noisetracker/Soundtracker/StarTrecker (AmigaTrackers)',13,10
			db '             FastTracker 4,6 or 8 channels/OctaComposer (PCTrackers)',13,10
			db 13,10
			db '    Syntax: GUSPLAY <[Path]Filename.ext> /baseport.',13,10
			db '    Where baseport is a three digit hexadecimal number (Def=220).',13,10
			db '$'

Palette		db 63,00,00
		db 56,00,08
		db 48,00,16
		db 40,00,24
		db 32,00,32
		db 24,00,40
		db 16,00,48
		db 08,00,56
		db 00,00,63
		db 63,63,00
		db 63,26,00
		db 48,63,00
		db 00,63,00
		db 00,00,00
		db 00,00,00
		db 63,63,63

Pic	db '        Modplay v1.5  for Gravis Ultrasound   (C) Robert Adolfsson CASCADA      '
	db '                                                                                '
	db '                                                                                '
	db '      Position    /         Row   /64       Time   :      MainVolume   /64      '
	db '                                                                                '
	db '  PgUp/PgDn : Change position.  1-8 : Turn channels on/off.  +/- : MainVolume   '
	db '  D : Dosshell                                                                  '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '
	db '                                                                                '

	db 80 dup (0Fh)
	db 80 dup (19h)
	db 80 dup (29h)
	db 80 dup (39h)
	db 80 dup (49h)
	db 80 dup (59h)
	db 80 dup (69h)
	db 80 dup (79h)
	db 80 dup (80h)
	db 80 dup (7Ah)
	db 80 dup (69h)
	db 80 dup (5Bh)
	db 80 dup (4Ch)
	db 80 dup (5Ch)
	db 80 dup (6Ch)
	db 80 dup (7Ch)
	db 80 dup (89h)
	db 80 dup (70h)
	db 80 dup (6Ah)
	db 80 dup (59h)
	db 80 dup (4Bh)
	db 80 dup (3Ch)
	db 80 dup (2Ch)
	db 80 dup (1Ch)
	db 80 dup (0Ch)

EvenData
PrintTable	db 0,0,0,0
		Rept 127
		db 0,0,0,0
		EndM
BarTable	dw 8 dup (0)
ComSpec		db 128 dup (0)
PSPAdress	dw 0
OldSS		dw 0
OldSP		dw 0
Environment	dw 0		; Environment segment.
		dw 0,0		; Commandline segment and offset.
		dw 0,0		; First FCB segment and offset.
		dw 0,0		; Second FCB segment and offset.

SetPalReg	Macro	P,R,G,B

	mov	dx,3C8h
	mov	al,P
	out	dx,al
	inc	dx
	mov	al,R
	out	dx,al
	mov	al,G
	out	dx,al
	mov	al,B
	out	dx,al

		EndM

Even

Begin:
	mov	cs:[PSPAdress],es
	push	es
	call	GetFileName
	pop	ds
	call	GetComSpec
	mov	ax,cs
	mov	ds,ax
	mov	ax,4A00h
	mov	bx,18129/16+1
	int	21h
	jnc	NoStop
	mov	ah,9
	push	cs
	pop	ds
	mov	dx,offset cs:[Error]
	int	21h
	jmp	Stop
NoStop:

	call	InitDevice
	call	Init
	mov	dx,cs
	mov	ds,dx
	mov	dx,offset cs:[ModToRead]
	call	LoadMod
	jnc	NoErrorLoad
	mov	ax,seg MainVolume
	mov	ds,ax
	cmp	ds:[ErrorCode],1
	jne	NoFile
	mov	dx,offset cs:[WrongName]
NoFile:
	cmp	ds:[ErrorCode],3
	jne	NoMem
	mov	dx,offset cs:[OutOfMem]
NoMem:
	push	cs
	pop	ds
	mov	ah,9
	int	21h
	jmp	Stop
NoErrorLoad:

	mov	di,cs
	mov	es,di
	mov	di,offset cs:[PrintTable]
	mov	cx,128
	mov	al,30h
	mov	ah,30h
	mov	bl,30h
	mov	bh,30h
FillPTable:
	mov	es:[di],al
	mov	es:[di+1],ah
	mov	es:[di+2],bl
	mov	es:[di+3],bh
	add	di,4
	inc	al
	cmp	al,3Ah
	jb	NoWrapCount
	mov	al,30h
	inc	ah
	cmp	ah,3Ah
	jb	NoWrapCount
	mov	ah,30h
	inc	bl
	cmp	bl,3Ah
	jb	NoWrapCount
	mov	bl,30h
	inc	bh
NoWrapCount:
	loop	FillPTable

	call	StartPlaying

FromDosShell:
	mov	ax,3509h
	int	21h
	mov	cs:[KeySeg],es
	mov	cs:[KeyOfs],bx
	mov	ax,2509h
	mov	dx,cs
	mov	ds,dx
	mov	dx,offset cs:[KeyInt]
	int	21h

	mov	bl,0
	mov	ax,1003h
	int	10h

	MOV	AH,0
SETPAL:
	MOV	DX,3DAH
	IN	AL,DX
	MOV	DX,3C0H
	MOV	AL,AH
	OUT	DX,AL
	JMP	$+2
	OUT	DX,AL
	INC	AH
	CMP	AH,16
	JB	SETPAL

	MOV	DX,3DAH
	IN	AL,DX
	MOV	DX,3C0h
	MOV	AL,20H
	OUT	DX,AL

	mov	si,cs
	mov	ds,si
	mov	si,offset cs:[Palette]
	mov	dx,3C8h
	mov	al,0
	out	dx,al
	inc	dx
	mov	cx,16*3
rep	outsb

	cld
	mov	di,0B800h
	mov	es,di
	mov	di,0
	mov	cx,2000
	mov	si,cs
	mov	ds,si
	mov	si,offset cs:[Pic]
LoadPic:
	movsb
	mov	al,ds:[si+2000-1]
	stosb
	loop	LoadPic

	call	ProgramChars

	mov	di,0A000h
	mov	es,di

	cld
	mov	cx,9
FillCharLoop:
	push	cx
	mov	di,256
	sub	di,cx
	shl	di,5
	neg	cx
	add	cx,9
	shl	cx,1
	mov	bx,16
	sub	bx,cx
	mov	al,0h
rep	stosb
	mov	al,3Eh
	mov	cx,bx
rep	stosb
	sub	di,32+16
	pop	cx
	loop	FillCharLoop

	mov	di,0B800h
	mov	es,di

	call	NoProgramChars

	mov	ax,seg MainVolume
	mov	ds,ax

	mov	cx,ds:[NumChans]
	cmp	cx,6
	je	SixChans
	cmp	cx,8
	je	EigthChans
	mov	cs:[BarTable],17*80*2+01*2
	mov	cs:[BarTable+2],17*80*2+21*2
	mov	cs:[BarTable+4],17*80*2+41*2
	mov	cs:[BarTable+6],17*80*2+61*2
	jmp	FourChans
SixChans:
	mov	cs:[BarTable],8*80*2+21*2
	mov	cs:[BarTable+2],8*80*2+41*2
	mov	cs:[BarTable+4],17*80*2+01*2
	mov	cs:[BarTable+6],17*80*2+21*2
	mov	cs:[BarTable+8],17*80*2+41*2
	mov	cs:[BarTable+10],17*80*2+61*2
	jmp	FourChans
EigthChans:
	mov	cs:[BarTable],8*80*2+01*2
	mov	cs:[BarTable+2],8*80*2+21*2
	mov	cs:[BarTable+4],8*80*2+41*2
	mov	cs:[BarTable+6],8*80*2+61*2
	mov	cs:[BarTable+8],17*80*2+01*2
	mov	cs:[BarTable+10],17*80*2+21*2
	mov	cs:[BarTable+12],17*80*2+41*2
	mov	cs:[BarTable+14],17*80*2+61*2
FourChans:

	mov	di,19
	mov	dx,3
	mov	bh,0
	mov	bl,ds:[OrderLen]
	call	PrintVal

	mov	ah,2
	mov	bh,0
	mov	dh,25
	mov	dl,0
	int	10h

	mov	ax,Seg MainVolume
	mov	ds,ax
	mov	ax,0B800h
	mov	es,ax

DoLoop:
	mov	dx,3DAh
Test1:
	in	al,dx
	test	al,8
	jnz	Test1
Test2:
	in	al,dx
	test	al,8
	jz	Test2
	mov	ax,Seg MainVolume
	mov	ds,ax
	mov	di,0B800h
	mov	es,di
	mov	di,69
	mov	dx,3
	mov	bx,ds:[MainVolume]
	call	PrintSec
	mov	di,15
	mov	dx,3
	mov	bx,ds:[RealPPattern]
	call	PrintVal
	mov	di,32
	mov	dx,3
	mov	bx,ds:[RealRow]
	inc	bx
	call	PrintSec
	mov	ax,Word Ptr cs:[Time]
	mov	dx,Word Ptr cs:[Time+2]
	mov	bx,1000
	div	bx
	mov	dx,0
	mov	bx,60
	div	bx
	mov	bx,ax
	mov	si,dx
	mov	dx,3
	mov	di,49
	call	PrintSec
	mov	bx,si
	mov	dx,3
	mov	di,52
	call	PrintSec

	cld
	mov	si,offset ds:[SampChans]
	mov	cx,ds:[NumChans]

BarLoop:
	push	cx
	mov	di,ds:[NumChans]
	sub	di,cx
	shl	di,1
	mov	di,cs:[BarTable+di]

	mov	bx,Word Ptr ds:[si.Bar]
	mov	cx,63
	sub	cx,bx
	shr	cx,3
	cmp	cx,0
	je	NoSuddBar
	cmp	bx,0
SuddIt:
	mov	al,32
	Rept	18
	stosb
	inc	di
	EndM
	add	di,160-2*18
	loop	SuddIt
NoSuddBar:
	mov	cx,bx
	and	bx,7
	neg	bl
	dec	bl
	mov	al,bl
	Rept	18
	stosb
	inc	di
	EndM
	add	di,160-2*18
	shr	cx,3
	cmp	cx,0
	je	NoFillBar
	mov	al,255-8
FillSecond:
	Rept	18
	stosb	
	inc	di
	EndM
	add	di,160-2*18
	loop	FillSecond
NoFillBar:

	sub	ds:[si.Bar],1
	jnc	NoWBar
	mov	ds:[si.Bar],0
NoWBar:

	pop	cx
	add	si,52
	dec	cx
	jnz	BarLoop

EndPrintVals:
	cmp	cs:[Key],20h
	jne	NoDosShell
	mov	cs:[Key],0
	pusha
	push	ds
	push	es
	cli
	mov	cs:[OldSS],ss
	mov	cs:[OldSP],sp
	sti
	mov	ax,2509h
	mov	ds,cs:[KeySeg]
	mov	dx,cs:[KeyOfs]
	int	21h
	mov	ax,3
	int	10h
	mov	cs:[Environment],0
	mov	cs:[Environment+2],Offset cs:[CommandLineC]
	mov	Word Ptr cs:[Environment+4],cs
	mov	cs:[Environment+6],5Ch
	mov	ax,cs:[PSPAdress]
	mov	Word Ptr cs:[Environment+8],ax
	mov	cs:[Environment+10],6Ch
	mov	Word Ptr cs:[Environment+12],ax
	mov	bx,cs
	mov	ds,bx
	mov	es,bx
	mov	bx,offset cs:[Environment]
	mov	dx,offset cs:[ComSpec]
	mov	ax,4B00h
	int	21h
	cli
	mov	ss,cs:[OldSS]
	mov	sp,cs:[OldSP]
	sti
	pop	es
	pop	ds
	popa
	jmp	FromDosShell
NoDosShell:
	cmp	cs:[Key],1
	jne	DoLoop
	
	mov	ax,2509h
	mov	ds,cs:[KeySeg]
	mov	dx,cs:[KeyOfs]
	int	21h
	call	StopPlaying
	call	ClearMem
	mov	ax,3
	int	10h
Stop:
	mov	ax,4C00h
	int	21h

GetComSpec	Proc	Near

	mov	ds,ds:[2Ch]
	mov	si,0
FindComSpec:
	lodsb
	cmp	al,0
	jne	NoTestEnd
	lodsb
	cmp	al,0
	je	EndSearchEnv
NoTestEnd:
	cmp	al,'C'
	jne	FindComSpec
	lodsb
	cmp	al,'O'
	jne	FindComSpec
	lodsb
	cmp	al,'M'
	jne	FindComSpec
	lodsb
	cmp	al,'S'
	jne	FindComSpec
	lodsb
	cmp	al,'P'
	jne	FindComSpec
	lodsb
	cmp	al,'E'
	jne	FindComSpec
	lodsb
	cmp	al,'C'
	jne	FindComSpec
	mov	di,offset cs:[ComSpec]
	inc	si
LetsMoveIt:
	lodsb
	cmp	al,0
	je	EndSearchEnv
	mov	cs:[di],al
	inc	di
	jmp	LetsMoveIt
EndSearchEnv:
	ret

GetComSpec	EndP

ProgramChars	Proc	Near

	mov	dx,3C4h
	mov	ax,0100h
	out	dx,ax
	mov	ax,0402h
	out	dx,ax
	mov	ax,0704h
	out	dx,ax
	mov	ax,0300h
	out	dx,ax

	mov	dx,3CEh
	mov	ax,0204h
	out	dx,ax
	mov	ax,0005h
	out	dx,ax
	mov	ax,0006h
	out	dx,ax
	ret

ProgramChars	EndP

NoProgramChars	Proc	Near

	mov	dx,3C4h
	mov	ax,0100h
	out	dx,ax
	mov	ax,0302h
	out	dx,ax
	mov	ax,0304h
	out	dx,ax
	mov	ax,0300h
	out	dx,ax

	mov	dx,3CEh
	mov	ax,0004h
	out	dx,ax
	mov	ax,1005h
	out	dx,ax
	mov	ax,0E06h
	out	dx,ax
	ret

NoProgramChars	EndP

PrintChar	Proc	Near

	shl	di,1
	shl	dx,5
	add	di,dx
	shl	dx,2
	add	di,dx
	stosb
	ret

PrintChar	EndP

PrintVal	Proc	Near

	cld
	shl	di,1
	shl	dx,5
	add	di,dx
	shl	dx,2
	add	di,dx
	shl	bx,2
	mov	al,cs:[PrintTable+bx+2]
	stosb
	inc	di
	mov	al,cs:[PrintTable+bx+1]
	stosb
	inc	di
	mov	al,cs:[PrintTable+bx]
	stosb
	ret

PrintVal	EndP

PrintSec	Proc	Near

	cld
	shl	di,1
	shl	dx,5
	add	di,dx
	shl	dx,2
	add	di,dx
	shl	bx,2
	mov	al,cs:[PrintTable+bx+1]
	stosb
	inc	di
	mov	al,cs:[PrintTable+bx]
	stosb
	ret

PrintSec	EndP

KeyInt		Proc	Near

	push	ax
	push	ds
	mov	ax,Seg MainVolume
	mov	ds,ax
	in	al,60h
	cmp	al,127
	ja	NoKey
	mov	cs:[Key],al
NoKey:
	cmp	al,74
	jne	NoVolDown
	sub	[MainVolume],1
	jns	NoVolDown
	mov	[MainVolume],0
NoVolDown:
	cmp	al,78
	jne	NoVolUp
	add	[MainVolume],1
	cmp	[MainVolume],64
	jbe	NoVolUp
	mov	[MainVolume],64
NoVolUp:
	cmp	al,81
	jne	NoChangePatt1
	mov	[PatternRow],64
NoChangePatt1:
	cmp	al,73
	jne	NoChangePatt2
	mov	[PatternRow],64
	sub	[PlayingPattern],2
	jns	NoChangePatt2
	mov	[PlayingPattern],0
NoChangePatt2:
	cmp	al,2
	jne	NoChan1OnOff
	xor	[ChanOn],00000001b
NoChan1OnOff:
	cmp	al,3
	jne	NoChan2OnOff
	xor	[ChanOn],00000010b
NoChan2OnOff:
	cmp	al,4
	jne	NoChan3OnOff
	xor	[ChanOn],00000100b
NoChan3OnOff:
	cmp	al,5
	jne	NoChan4OnOff
	xor	[ChanOn],00001000b
NoChan4OnOff:
	cmp	al,6
	jne	NoChan5OnOff
	xor	[ChanOn],00010000b
NoChan5OnOff:
	cmp	al,7
	jne	NoChan6OnOff
	xor	[ChanOn],00100000b
NoChan6OnOff:
	cmp	al,8
	jne	NoChan7OnOff
	xor	[ChanOn],01000000b
NoChan7OnOff:
	cmp	al,9
	jne	NoChan8OnOff
	xor	[ChanOn],10000000b
NoChan8OnOff:
	in	al,61h
	or	al,80h
	out	61h,al
	and	al,7Fh
	out	61h,al
	mov	al,20h
	out	20h,al
	pop	ds
	pop	ax
	iret

KeyInt		EndP

GetFileName	Proc	Near

	push	bx
	push	di
	mov	di,offset cs:[CommandLine]
	mov	bx,82h
	mov	al,es:[bx-2]
	cmp	al,0
	jne	TestNext
	jmp	NoCmdLine
TestNext:
	mov	al,es:[bx]
	cmp	al,0
	jne	GetIt
	jmp	NoCmdLine

GetIt:
	mov	al,es:[bx]
	inc	bx
	mov	cs:[di],al
	inc	di
	cmp	al,0Dh
	je	GotIt
	jmp	GetIt
GotIt:
	mov	di,offset cs:[CommandLine]
	mov	bx,offset cs:[ModToRead]
MoveName:
	mov	al,cs:[di]
	inc	di
	cmp	al,0Dh
	jne	NotYetCommand
	jmp	EndMoveName
NotYetCommand:
	cmp	al,32
	je	CheckCommands
	mov	cs:[bx],al
	inc	bx
	jmp	MoveName
CheckCommands:
	mov	al,cs:[di]
	inc	di
	cmp	al,0Dh
	je	EndMoveName
	cmp	al,'/'
	jne	NoNewBase
	mov	bh,0
	mov	bl,cs:[di]
	cmp	bl,'A'
	jb	UsSub1
	sub	bl,'A'
	add	bl,10
	jmp	NoUsSub1
UsSub1:
	sub	bl,30h
NoUsSub1:
	mov	ah,bl
	mov	bl,cs:[di+1]
	cmp	bl,'A'
	jb	UsSub2
	sub	bl,'A'
	add	bl,10
	jmp	NoUsSub2
UsSub2:
	sub	bl,30h
NoUsSub2:
	shl	bl,4
	mov	al,bl
	mov	bl,cs:[di+2]
	cmp	bl,'A'
	jb	UsSub3
	sub	bl,'A'
	add	bl,10
	jmp	NoUsSub3
UsSub3:
	sub	bl,30h
NoUsSub3:
	add	ax,bx
	mov	bx,Seg MainVolume
	mov	ds,bx
	mov	ds:[BasePort],ax
	add	di,3
NoNewBase:
	jmp	CheckCommands
EndMoveName:
	pop	di
	pop	bx
	ret

GetFileName	Endp

NoCmdLine:

	mov	ah,9
	push	cs
	pop	ds
	mov	dx,offset cs:[Docs]
	int	21h
	mov	ax,4C00h
	int	21h

_Code		EndS

	End	Begin
[ RETURN TO DIRECTORY ]