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