--- /dev/null
+uses
+ DOS,DPMI,
+ A2player,TimerInt,ParserIO,StringIO,TxtScrIO,
+ UNPK_LIB;
+
+const
+ _timer_xpos = 198;
+ _timer_ypos = 5;
+ _timer_color = 1;
+ _decay_bar_xpos = 10;
+ _decay_bar_ypos = 140;
+ _decay_bar_palette_start = 250;
+ _progress_xpos = 8;
+ _progress_ypos = 155;
+ _progress_color = 251;
+ _fname_xpos = 8;
+ _fname_ypos = 170;
+ _fname_color = 255;
+ _pos_str_xpos = 8;
+ _pos_str_ypos = 186;
+ _pos_str_color = 252;
+
+const
+ decay_bar_rise: Real = 10.0;
+ decay_bar_fall: Real = 0.50;
+ adjust_tracks: Boolean = TRUE;
+ accurate_conv: Boolean = TRUE;
+ fix_c_note_bug: Boolean = TRUE;
+ window_top: Byte = 8;
+ modname: array[1..15] of String[39] = ('/´DLiB TR/´CK3R ][ module',
+ '/´DLiB TR/´CK3R ][ G3 module',
+ '/´DLiB TR/´CK3R ][ tiny module',
+ '/´DLiB TR/´CK3R ][ G3 tiny module',
+ 'Amusic module',
+ 'XMS-Tracker module',
+ 'BoomTracker 4.0 module',
+ 'Digital-FM module',
+ 'HSC AdLib Composer / HSC-Tracker module',
+ 'MPU-401 tr\92kkîr module',
+ 'Reality ADlib Tracker module',
+ 'Scream Tracker 3.x module',
+ 'FM-Kingtracker module',
+ 'Surprise! AdLib Tracker module',
+ 'Surprise! AdLib Tracker 2.0 module');
+var
+ songdata_source: String;
+ songdata_title: String;
+ load_flag: Byte;
+ fkey: Word;
+ index,last_order: Byte;
+ dirinfo: SearchRec;
+
+var
+ buf1: array[0..PRED(SizeOf(tVARIABLE_DATA))] of Byte;
+ buf2: array[0..PRED(65535)] of Byte;
+ buf3: array[0..PRED(65535)] of Byte;
+ buf4: array[0..PRED(65535)] of Byte;
+ temp_screen: array[0..PRED(8192)] of Byte;
+ correction: Integer;
+ entries,
+ entries2: Byte;
+ temp,temp2: Byte;
+ dos_memavail: Word;
+ _ParamStr: array[0..255] of String;
+
+const
+ jukebox: Boolean = FALSE;
+
+const
+ kBkSPC = $0e08;
+ kESC = $011b;
+ kENTER = $1c0d;
+
+procedure ResetF(var f: File);
+
+var
+ fattr: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:ResetF_RW';
+ GetFAttr(f,fattr);
+ If (fattr AND ReadOnly = ReadOnly) then FileMode := 0;
+ {$i-}
+ Reset(f,1);
+ {$i+}
+end;
+
+procedure BlockReadF(var f: File; var data; size: Longint; var bytes_read: Longint);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:BlockReadF';
+ {$i-}
+ BlockRead(f,data,size,bytes_read);
+ {$i+}
+ If (IOresult <> 0) then bytes_read := 0;
+end;
+
+procedure SeekF(var f: File; fpos: Longint);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:SeekF';
+ {$i-}
+ Seek(f,fpos);
+ {$i+}
+end;
+
+procedure CloseF(var f: File);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CloseF';
+ {$i-}
+ Close(f);
+ {$i+}
+ If (IOresult <> 0) then ;
+end;
+
+function min(value: Word; minimum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,minimum
+ jae @@1
+ mov ax,minimum
+@@1:
+end;
+
+function max(value: Word; maximum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,maximum
+ jbe @@1
+ mov ax,maximum
+@@1:
+end;
+
+function concw(lo,hi: Byte): Word; assembler;
+asm
+ mov al,lo
+ mov ah,hi
+end;
+
+function keypressed: Boolean; assembler;
+asm
+ mov ah,01h
+ int 16h
+ mov al,TRUE
+ jnz @@1
+ mov al,FALSE
+@@1:
+end;
+
+function is_4op_mode: Boolean; assembler;
+asm
+ mov al,byte ptr [songdata.flag_4op]
+ or al,al
+ jz @@1
+ mov al,TRUE
+@@1:
+end;
+
+function is_4op_chan(chan: Byte): Boolean; assembler;
+asm
+ mov al,byte ptr [songdata.flag_4op]
+ mov ah,chan
+ test al,1
+ jz @@1
+ cmp ah,1
+ jb @@1
+ cmp ah,2
+ ja @@1
+ mov al,TRUE
+ jmp @@7
+@@1: test al,2
+ jz @@2
+ cmp ah,3
+ jb @@2
+ cmp ah,4
+ ja @@2
+ mov al,TRUE
+ jmp @@7
+@@2: test al,4
+ jz @@3
+ cmp ah,5
+ jb @@3
+ cmp ah,6
+ ja @@3
+ mov al,TRUE
+ jmp @@7
+@@3: test al,8
+ jz @@4
+ cmp ah,10
+ jb @@4
+ cmp ah,11
+ ja @@4
+ mov al,TRUE
+ jmp @@7
+@@4: test al,10h
+ jz @@5
+ cmp ah,12
+ jb @@5
+ cmp ah,13
+ ja @@5
+ mov al,TRUE
+ jmp @@7
+@@5: test al,20h
+ jz @@6
+ cmp ah,14
+ jb @@6
+ cmp ah,15
+ ja @@6
+ mov al,TRUE
+ jmp @@7
+@@6: mov al,FALSE
+@@7:
+end;
+
+{$i structrs.inc}
+{$i iloaders.inc}
+
+const
+ _picture_mode: Boolean = FALSE;
+
+var
+ vmem: array[0..PRED(320*200)] of Byte;
+ fade_buf,fade_buf2: tFADE_BUF;
+ vstate: tVIDEO_STATE;
+
+procedure _refresh_decay_bar(xpos,ypos: Word; height,width,level: Byte); assembler;
+asm
+ mov edi,0a0000h
+ lea edx,dword ptr [_picture_palette]
+ add edx,6
+ lea esi,dword ptr [_picture_bitmap]
+ add esi,6
+ movzx eax,ypos
+ mov ebx,320
+ mul ebx
+ movzx ebx,xpos
+ add eax,ebx
+ add edi,eax
+ cmp level,BYTE_NULL
+ jnz @@1
+ mov level,0
+ jmp @@2
+@@1: cmp level,2
+ jae @@2
+ mov level,2
+@@2: movzx ecx,width
+ jecxz @@10
+@@3: push ecx
+ push edi
+ movzx ecx,height
+ jecxz @@9
+@@4: movzx ebx,height
+ sub ebx,ecx
+ movzx eax,level
+ cmp ebx,eax
+ jnae @@5
+ mov ebx,edi
+ sub ebx,0a0000h
+ add ebx,esi
+ movzx eax,byte ptr [ebx]
+ jmp @@8
+@@5: movzx eax,height
+ push edx
+ xor edx,edx
+ sub eax,ecx
+ mov ebx,5
+ div ebx
+ mov eax,edx
+ pop edx
+ cmp eax,3
+ jbe @@6
+ mov ebx,edi
+ sub ebx,0a0000h
+ add ebx,esi
+ movzx eax,byte ptr [ebx]
+ jmp @@8
+@@6: or eax,eax
+ jnz @@7
+ xor eax,eax
+ jmp @@8
+@@7: add eax,_decay_bar_palette_start
+ cmp level,2
+ jnbe @@8
+ mov eax,250
+@@8: mov byte ptr [edi],al
+ sub edi,320
+ loop @@4
+@@9: pop edi
+ pop ecx
+ inc edi
+ loop @@3
+@@10:
+end;
+
+const
+ _decay_bars_initialized: Boolean = FALSE;
+ _decay_bars_nm_tracks: Byte = 0;
+
+var
+ _old_decay_bar_value: array[1..25] of Byte;
+
+procedure decay_bars_refresh;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:decay_bars_refresh';
+ If NOT _decay_bars_initialized then
+ For temp := 1 to 25 do
+ _old_decay_bar_value[temp] := BYTE_NULL;
+
+ For temp := 1 to 25 do
+ begin
+ If (decay_bar[temp].dir = 1) then
+ decay_bar[temp].lvl := decay_bar[temp].lvl+
+ decay_bar[temp].dir*(decay_bar_rise/IRQ_freq*100)
+ else
+ decay_bar[temp].lvl := decay_bar[temp].lvl+
+ decay_bar[temp].dir*(decay_bar_fall/IRQ_freq*100);
+
+ If (decay_bar[temp].lvl < 0) then decay_bar[temp].lvl := 0;
+ If (decay_bar[temp].lvl > decay_bar[temp].max_lvl) then
+ begin
+ decay_bar[temp].dir := -1;
+ If (decay_bar[temp].lvl > 63) then
+ decay_bar[temp].lvl := 63;
+ end;
+
+ If (_old_decay_bar_value[temp] <> Round(decay_bar[temp].lvl*4/3)) then
+ begin
+ _refresh_decay_bar(_decay_bar_xpos+PRED(temp)*12,_decay_bar_ypos,
+ Round(63*4/3),10,
+ Round(decay_bar[temp].lvl*4/3));
+ _old_decay_bar_value[temp] := Round(decay_bar[temp].lvl*4/3);
+ end;
+ end;
+end;
+
+procedure toggle_picture_mode;
+
+var
+ index: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:toggle_picture_mode';
+ If NOT _picture_mode then
+ begin
+ _picture_mode := NOT _picture_mode;
+ GetVideoState(vstate);
+ fade_speed := 16;
+ fade_buf.action := first;
+ VgaFade(fade_buf,fadeOut,delayed);
+ For index := 1 to 20 do WaitRetrace;
+ asm mov ax,13h; int 10h end;
+
+ For index := 1 to 20 do WaitRetrace;
+ For index := 0 to 255 do
+ SetRGBitem(index,tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].r,
+ tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].g,
+ tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].b);
+ fade_speed := 16;
+ fade_buf.action := first;
+ VgaFade(fade_buf2,fadeOut,fast);
+
+ Move(MEM[Ofs(_picture_bitmap)+6],MEM[$0a0000],320*200);
+ VgaFade(fade_buf2,fadeIn,delayed);
+ external_irq_hook := decay_bars_refresh;
+ end
+ else begin
+ external_irq_hook := NIL;
+ _picture_mode := NOT _picture_mode;
+ _decay_bars_initialized := FALSE;
+ VgaFade(fade_buf2,fadeOut,delayed);
+
+ SetVideoState(vstate,FALSE);
+ VgaFade(fade_buf2,fadeOut,fast);
+ For index := 1 to 20 do WaitRetrace;
+ Move(vstate.screen,MEM[$0b8000],SizeOf(vstate.screen));
+
+ For index := 1 to 20 do WaitRetrace;
+ VgaFade(fade_buf,fadeIn,delayed);
+ end;
+end;
+
+procedure wtext(xstart,ystart: Word; txt: String; color: Byte);
+
+var
+ x,y: Word;
+ temp,i,j,b: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:wtext';
+ If NOT _picture_mode then EXIT;
+ Move(MEM[Ofs(_picture_bitmap)+6+320*ystart],vmem[320*ystart],(8+1)*320);
+ x := xstart+1;
+ y := ystart+1;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 7 do
+ begin
+ b := tCHAR8x8(MEM[Ofs(_font8x8)+6])[txt[temp]][j];
+ For i := 7 downto 0 do
+ If (b OR (1 SHL i) = b) then
+ vmem[x+7-i+(y+j)*320] := 0
+ end;
+ Inc(x,8);
+ end;
+
+ x := xstart;
+ y := ystart;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 7 do
+ begin
+ b := tCHAR8x8(MEM[Ofs(_font8x8)+6])[txt[temp]][j];
+ For i := 7 downto 0 do
+ If (b OR (1 SHL i) = b) then
+ vmem[x+7-i+(y+j)*320] := color;
+ end;
+ Inc(x,8);
+ end;
+
+ Move(vmem[320*ystart],MEM[$0a0000+320*ystart],(8+1)*320);
+end;
+
+procedure wtext2(xstart,ystart: Word; txt: String; color: Byte);
+
+const
+ _double: array[0..15] of Byte = (0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7);
+
+var
+ x,y: Word;
+ temp,i,j,b: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:wtext2';
+ If NOT _picture_mode then EXIT;
+ Move(MEM[Ofs(_picture_bitmap)+6+320*ystart],vmem[320*ystart],(16+1)*320);
+ x := xstart+1;
+ y := ystart+1;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 15 do
+ begin
+ b := tCHAR8x16(MEM[Ofs(_font8x16)+6])[txt[temp]][j];
+ For i := 15 downto 0 do
+ If (b OR (1 SHL _double[i]) = b) then
+ vmem[x+15-i+(y+j)*320] := 0
+ end;
+ Inc(x,16);
+ end;
+
+ x := xstart;
+ y := ystart;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 15 do
+ begin
+ b := tCHAR8x16(MEM[Ofs(_font8x16)+6])[txt[temp]][j];
+ For i := 15 downto 0 do
+ If (b OR (1 SHL _double[i]) = b) then
+ vmem[x+15-i+(y+j)*320] := color;
+ end;
+ Inc(x,16);
+ end;
+
+ Move(vmem[320*ystart],MEM[$0a0000+320*ystart],(16+1)*320);
+end;
+
+procedure C3Write(str: String; atr1,atr2,atr3: Byte);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CWrite';
+ If _picture_mode then EXIT;
+ ShowC3Str(MEM[$0b8000],WhereX,WhereY,str,atr1,atr2,atr3);
+ GotoXY(1,WhereY);
+end;
+
+procedure C3WriteLn(str: String; atr1,atr2,atr3: Byte);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:C3WriteLn';
+ ShowC3Str(Ptr(v_seg,v_ofs)^,WhereX,WhereY,
+ str,
+ atr1,atr2,atr3);
+ WriteLn;
+end;
+
+procedure CWriteLn(str: String; atr1,atr2: Byte);
+
+var
+ temp: Word;
+ attr,posx,posy: Byte;
+ color2: Boolean;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CWriteLn';
+ If _picture_mode then EXIT;
+ color2 := FALSE;
+ attr := atr1;
+ posx := WhereX;
+ posy := WhereY;
+
+ For temp := 1 to Length(str) do
+ If (str[temp] <> '~') then
+ begin
+ MEM[$0b8000+(posx-1+(posy-1)*MaxCol) SHL 1] := BYTE(str[temp]);
+ MEM[$0b8000+(posx-1+(posy-1)*MaxCol) SHL 1+1] := attr;
+ If (posx < MaxCol) then Inc(posx)
+ else begin
+ posx := 1;
+ Inc(posy);
+ If (posy > MaxLn) then
+ begin
+ asm
+ mov ah,06h
+ mov al,1
+ mov bh,07h
+ mov ch,window_top
+ mov cl,1
+ mov dh,MaxLn
+ mov dl,MaxCol
+ dec ch
+ dec cl
+ dec dh
+ dec dl
+ int 10h
+ end;
+ Dec(posy);
+ end;
+ end;
+ end
+ else begin
+ color2 := NOT color2;
+ If color2 then attr := atr2 else attr := atr1;
+ end;
+
+ Inc(posy);
+ If (posy > MaxLn) then
+ begin
+ asm
+ mov ah,06h
+ mov al,1
+ mov bh,07h
+ mov ch,window_top
+ mov cl,1
+ mov dh,MaxLn
+ mov dl,MaxCol
+ dec ch
+ dec cl
+ dec dh
+ dec dl
+ int 10h
+ end;
+ Dec(posy);
+ end;
+
+ posx := 1;
+ GotoXY(posx,posy);
+end;
+
+function __progress_str(value: Byte): String;
+
+var
+ result: String;
+
+begin
+ result := '';
+ Repeat
+ If (value > 4) then
+ begin
+ result := result+#4;
+ Dec(value,4);
+ end;
+ If (value <= 4) and (value <> 0) then
+ result := result+CHR(0+value)
+ until (value <= 4);
+ __progress_str := result;
+end;
+
+function _progress_str: String;
+begin
+ If (songdata.patt_len = 0) then EXIT;
+ If (entries <> 0) then
+ _progress_str :=
+ ExpStrR(__progress_str(
+ Round(4*38/entries*(current_order-correction+
+ 1/songdata.patt_len*(current_line+1)))),38,#0)
+ else _progress_str := ExpStrR('',38,#0);
+end;
+
+function _timer_str: String;
+begin
+ _timer_str := ExpStrL(Num2str(song_timer DIV 60,10),2,'0')+':'+
+ ExpStrL(Num2str(song_timer MOD 60,10),2,'0')+'.'+
+ Num2str(song_timer_tenths DIV 10,10);
+end;
+
+function _position_str: String;
+begin
+ If (songdata.patt_len = 0) then EXIT;
+ If (entries <> 0) then
+ _position_str :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' '+
+ '['+ExpStrL(Num2str(Round(100/entries*(current_order-correction+
+ 1/songdata.patt_len*(current_line+1))),10),3,'0')+'%] '+
+ '['+_timer_str+']'+' '
+ else _position_str :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' '+
+ '['+ExpStrL('',3,'0')+'%] '+
+ '['+_timer_str+']'+' ';
+end;
+
+function _position_str2: String;
+begin
+ _position_str2 :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' ';
+end;
+
+procedure fade_out;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:fade_out';
+ For temp := overall_volume downto 0 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 10) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\11\10',_pos_str_color);
+ C3Write(DietStr(_position_str+'\11\10',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ end;
+end;
+
+function _gfx_mode: Boolean;
+
+var
+ result: Boolean;
+ temp: Byte;
+
+begin
+ result := FALSE;
+ For temp := 1 to ParamCount do
+ If (Lower(_ParamStr[temp]) = '/gfx') then
+ begin
+ result := TRUE;
+ BREAK;
+ end;
+ _gfx_mode := result;
+end;
+
+procedure _list_title;
+begin
+ If iVGA then
+ begin
+ CWriteLn('',$07,0);
+ CWriteLn(' subz3ro''s',$09,0);
+ CWriteLn(' ÄÂÄ ÄÄ',$09,0);
+ CWriteLn(' /´DLiB³R/´CK3R ³³ G3 PLAYER',$09,0);
+ CWriteLn(' ³ ³ ÄÄ 0.43',$09,0);
+ CWriteLn('',$07,0);
+ end
+ else begin
+ WriteLn;
+ WriteLn(' subz3ro''s');
+ WriteLn(' ÄÂÄ ÄÄ');
+ WriteLn(' /´DLiB³R/´CK3R ³³ G3 PLAYER');
+ WriteLn(' ³ ³ ÄÄ 0.43');
+ WriteLn;
+ end;
+end;
+
+var
+ old_exit_proc: procedure;
+
+procedure new_exit_proc;
+begin
+ If (ErrorAddr <> NIL) then
+ begin
+ stop_playing;
+ TimerDone;
+ opl3exp($0004);
+ opl3exp($0005);
+ FreeMem(pattdata,PATTERN_SIZE*max_patterns);
+
+ asm
+ mov ax,03h
+ xor bh,bh
+ int 10h
+ mov MaxCol,80
+ mov MaxLn,25
+ end;
+
+ WriteLn('ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ');
+ WriteLn('Û ABNORMAL PROGRAM TERMiNATiON Û');
+ WriteLn('ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß');
+ WriteLn('ERROR_ID #'+Num2str(ExitCode,10)+' at '+ExpStrL(Num2str(LONGINT(ErrorAddr),16),8,'0'));
+ WriteLn(_debug_str_);
+ WriteLn;
+ WriteLn('Please send this information with brief description');
+ WriteLn('what you were doing with the program when this error was encountered');
+ WriteLn('to following email address:');
+ WriteLn;
+ WriteLn('subz3ro@hotmail.com');
+
+ ErrorAddr := NIL;
+ HALT(ExitCode);
+ end
+ else
+ ExitProc := @old_exit_proc;
+end;
+
+begin
+ For temp := 0 to 255 do
+ _ParamStr[temp] := ParamStr(temp);
+
+ If NOT _gfx_mode then
+ begin
+ If iVGA then CleanScreen(MEM[$0b8000]);
+ GotoXY(1,1);
+ _list_title;
+ end;
+
+ asm
+ mov bx,0ffffh
+ mov ah,48h
+ int 21h
+ mov dos_memavail,bx
+ end;
+
+ If (dos_memavail*16 DIV 1024 < 120) then
+ begin
+ If _gfx_mode then _list_title;
+ WriteLn('ERROR(1) - Insufficient DOS memory!');
+ HALT(1);
+ end;
+
+ If NOT iVGA then
+ begin
+ WriteLn('ERROR(2) - Insufficient video equipment!');
+ HALT(2);
+ end;
+
+ For temp := 1 to ParamCount do
+ If (Lower(_ParamStr[temp]) = '/jukebox') then
+ jukebox := TRUE;
+
+ index := 0;
+ If (ParamCount = 0) then
+ begin
+ If _gfx_mode then _list_title;
+ CWriteLn('Syntax: '+BaseNameOnly(_ParamStr[0])+' files|wildcards [files|wildcards{...}]',$07,0);
+ CWriteLn('',$07,0);
+ CWriteLn('Command-line options:',$07,0);
+ CWriteLn(' /jukebox play modules w/ no repeat',$07,0);
+ CWriteLn(' /gfx graphical interface',$07,0);
+ HALT;
+ end;
+
+ @old_exit_proc := ExitProc;
+ ExitProc := @new_exit_proc;
+
+ If _gfx_mode then
+ toggle_picture_mode;
+
+ Repeat
+ If NOT (index <> 0) then
+ begin
+ CWriteLn(FilterStr(DietStr('úù-Ä--ùú úù-ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ--ùú úù-ÄÄÄ--ùú úù-ÄÄ-Äùú',
+ PRED(MaxCol)),
+ '.',' '),$01,0);
+ CWriteLn( ' ~[~SPACE~]~ Fast-Forward ~[~\11Ä~]~ Restart ~[~\11ÄÙ~]~ Next ~[~ESC~]~ Quit',$09,$01);
+ CWriteLn(FilterStr(DietStr('úù-ÄÄÄÄÄÄÄÄÄÄ--ùú úù-ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-Äùú',
+ PRED(MaxCol)),
+ '.',' '),$01,0);
+
+ CWriteLn('',$07,0);
+ window_top := WhereY;
+ end;
+
+ Inc(index);
+ If (_ParamStr[index][1] <> '/') then
+ begin
+ FindFirst(_ParamStr[index],AnyFile-VolumeID-Directory,dirinfo);
+ If (DosError <> 0) then
+ begin
+ CWriteLn(DietStr('ERROR(2) - No such file "'+
+ Lower(_ParamStr[index])+'"',
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ While NOT (DosError <> 0) do
+ begin
+ If (PathOnly(_ParamStr[index]) <> '') then
+ songdata_source := Upper(PathOnly(_ParamStr[index])+dirinfo.name)
+ else songdata_source := Upper(dirinfo.name);
+
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ wtext2(_fname_xpos,_fname_ypos,NameOnly(songdata_source),_fname_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,'Loading...',_pos_str_color);
+
+ C3Write(DietStr('Loading "'+songdata_source+'" (please wait)',
+ PRED(MaxCol)),$07,0,0);
+ For temp := 1 to 10 do WaitRetrace;
+
+ limit_exceeded := FALSE;
+ load_flag := BYTE_NULL;
+
+ _decay_bars_initialized := FALSE;
+ a2m_file_loader;
+ If (load_flag = BYTE_NULL) then a2t_file_loader;
+ If (load_flag = BYTE_NULL) then amd_file_loader;
+ If (load_flag = BYTE_NULL) then cff_file_loader;
+ If (load_flag = BYTE_NULL) then dfm_file_loader;
+ If (load_flag = BYTE_NULL) then mtk_file_loader;
+ If (load_flag = BYTE_NULL) then rad_file_loader;
+ If (load_flag = BYTE_NULL) then s3m_file_loader;
+ If (load_flag = BYTE_NULL) then fmk_file_loader;
+ If (load_flag = BYTE_NULL) then sat_file_loader;
+ If (load_flag = BYTE_NULL) then sa2_file_loader;
+ If (load_flag = BYTE_NULL) then hsc_file_loader;
+ If (load_flag = BYTE_NULL) or
+ (load_flag = $7f) then
+ begin
+ CWriteLn(DietStr(ExpStrR('ERROR(3) - Invalid module ('+songdata_source+')',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ last_order := 0;
+ entries := 0;
+ If limit_exceeded then
+ begin
+ CWriteLn(DietStr(ExpStrR('ERROR(1) - Insufficient memory!',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ count_order(entries);
+ correction := calc_following_order(0);
+ entries2 := entries;
+ If (correction <> -1) then Dec(entries,correction)
+ else entries := 0;
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ temp2 := PRED(WhereY);
+
+ If (entries = 0) then
+ begin
+ If NOT _picture_mode then GotoXY(1,temp2);
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$08,0);
+ CWriteLn(DietStr(ExpStrR(''+NameOnly(songdata_source)+' [stopped] ['+
+ ExpStrL(Num2str(TRUNC(time_playing) DIV 60,10),2,'0')+
+ ':'+ExpStrL(Num2str(TRUNC(time_playing) MOD 60,10),2,'0')+']',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ start_playing;
+ set_overall_volume(63);
+ _decay_bars_nm_tracks := songdata.nm_tracks;
+ _decay_bars_initialized := TRUE;
+
+ Repeat
+ If (overall_volume = 63) then
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ C3Write(DietStr(_position_str+' ',PRED(MaxCol)),$0f,0,0);
+ end;
+
+ If (PORT[$60] = $39) { SPACE pressed } then
+ begin
+ If (overall_volume > 32) then
+ For temp := 63 downto 32 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 20) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\10\10',_pos_str_color);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ C3Write(DietStr(_position_str+'\10\10',PRED(MaxCol)),$0f,0,0);
+ end;
+ end
+ else begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\10\10',_pos_str_color);
+ C3Write(DietStr(_position_str+'\10\10',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ fast_forward := TRUE;
+ end
+ else If (PORT[$60] = $0b9) { SPACE released } then
+ begin
+ fast_forward := FALSE;
+ If (overall_volume < 63) then
+ For temp := 32 to 63 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 20) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ C3Write(DietStr(_position_str+' ',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ end;
+ end;
+
+ If keypressed then asm xor ax,ax; int 16h; mov fkey,ax end
+ else fkey := $0ffff;
+ MEMW[0:$041c] := MEMW[0:$041a];
+
+ If jukebox and (last_order <> current_order) then
+ begin
+ If (last_order > current_order) and
+ (last_order = PRED(entries2)) then BREAK
+ else last_order := current_order;
+ end;
+
+ If (fkey = kBkSPC) then
+ begin
+ fade_out;
+ stop_playing;
+ set_overall_volume(63);
+ start_playing;
+ end;
+ until (fkey = kENTER) or
+ (fkey = kESC);
+
+ fade_out;
+ stop_playing;
+ If NOT _picture_mode then GotoXY(1,temp2);
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$08,0);
+ CWriteLn(DietStr(ExpStrR(''+NameOnly(songdata_source)+' [stopped] ['+
+ ExpStrL(Num2str(TRUNC(time_playing) DIV 60,10),2,'0')+
+ ':'+ExpStrL(Num2str(TRUNC(time_playing) MOD 60,10),2,'0')+']',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ If (fkey = kESC) then BREAK;
+ FindNext(dirinfo);
+ end;
+ end;
+ until (index = ParamCount);
+
+ If _picture_mode then toggle_picture_mode;
+ MEMW[0:$041c] := MEMW[0:$041a];
+ FreeMem(pattdata,PATTERN_SIZE*max_patterns);
+ ExitProc := @old_exit_proc;
+ HALT(0);
+end.