;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Info Line Module - Playing info updates / other messages ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Jumps .386 include switch.inc ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Externals ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Segment Glbl BYTE Public 'Code' Extrn CurrentMode:Byte EndS Extrn I_ShowSamplePlay:Far Extrn I_ShowInstrumentPlay:Far Extrn S_UpdateScreen:Far Extrn S_DrawString:Far Extrn S_SetDirectMode:Far Extrn S_GetDestination:Far Extrn Music_GetPlayMode:Far Extrn Music_Poll:Far Extrn Music_GetSlaveChannelInformationTable:Far IF NETWORKENABLED Extrn Network_Poll:Far ENDIF Extrn PE_ShowOrder:Far Extrn PE_FillSpeedTempo:Far Extrn PE_GetMaxOrder:Far Extrn Glbl_TutorialHandler:Far ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Globals ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Global UpdateInfoLine:Far Global IdleUpdateInfoLine:Far Global ClearInfoLine:Far Global SetInfoLine:Far, SetInfoLine2:Far Global StartClock:Far Global GlobalStartTime:Far Public ShowUsageTime Public InitTimerHandler Public UnInitTimerHandler Public GetTimerCounter ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Segment InfoLine DWORD Public 'Code' USE16 Assume CS:InfoLine, DS:InfoLine CREATENEWLOGFILE EQU 0 include debug.inc ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Variables ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SLAVECHANNELSIZE = 128 OldTimerHandler DD 0 TimerCounter DD 0 PlaybackTimer DD 0 InfoLineText DD 0 InfoLineDelay DW 0 InfoLineVariable DW 0 ; Colouring for ZaStaR ; PatternPlayMsg DB "Playing, Pattern: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", Row: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FDh, "D", 0FFh, 13, " ", 0 ; SongPlayMsg DB "Playing, Order: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FDh, "D, Pattern: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", Row: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FDh, "D", 0FFh, 6, " ", 0 NoSoundDriverMsg DB "Error: No sound driver loaded.", 0 PatternPlayMsg DB "Playing, Pattern: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", Row: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, " Channels", 0FFh, 10, " ", 0 SongPlayMsg DB "Playing, Order: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", Pattern: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", Row: ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, "/", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, ", ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, " Channels", 0FFh, 10, " ", 0 ChannelMsg DB "Playing, ", 0FEh, 23h, 0FDh, "D", 0FEh, 20h, " Channels", 0 EmptyMsg DB 0 TimeMsg DB " Time ", 0FDh, "D:" Minutes DB "00:" Seconds DB "00", 0 DisplayChannelMsg DB 0 ShowUsageTime DB 1 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Functions ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Proc TimerInterruptHandler Sub CS:InfoLineDelay, 1 AdC CS:InfoLineDelay, 0 Inc CS:TimerCounter Jmp [CS:OldTimerHandler] EndP TimerInterruptHandler ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitTimerHandler Far Push DS Trace " - Installing new timer interrupt" Xor AX, AX Mov DS, AX Mov AX, CS ShL EAX, 16 Mov AX, Offset TimerInterruptHandler ClI XChg EAX, [DS:20h] Mov [CS:OldTimerHandler], EAX StI Pop DS Ret EndP InitTimerHandler ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UninitTimerHandler Far Push DS Xor AX, AX Mov DS, AX Mov EAX, [CS:OldTimerHandler] ClI Mov [DS:20h], EAX StI Pop DS Ret EndP UninitTimerHandler ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc FillToEOL Push ES Mov AX, ' ' + 2000h Call S_GetDestination UpdateInfoLineEOL: Cmp DI, (61+9*80)*2 JAE UpdateInfoLineEOL2 StosW Jmp UpdateInfoLineEOL UpdateInfoLineEOL2: Pop ES Ret EndP FillToEOL ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UpdateInfoLine Far Push DS Push SI Push Glbl Pop DS Assume DS:Glbl Cmp CurrentMode, 200 JAE UpdateInfoLineEnd2 Push CS Pop DS Mov DI, (2+9*80)*2 Cmp InfoLineDelay, 0 JE UpdateInfoLine1 ; Mov CX, InfoLineDelay ; JCXZ UpdateInfoLine1 ; ; Dec InfoLineDelay UpdateInfoLine2: LDS SI, InfoLineText Mov CX, DS JCXZ UpdateInfoLineEnd Mov AX, CS:InfoLineVariable Push AX Mov AH, 20h Call S_DrawString Call FillToEOL Pop AX Call Music_GetPlayMode ; Call ShowTime Jmp UpdateInfoLine6 UpdateInfoLine1: ; ****** Call Music_GetSlaveChannelInformationTable ; DS:SI points to tables ; CX = numchannels. Xor DI, DI ; DI = counter of ; currently act. ; channels. CountChannels1: Mov AX, [SI] Test AH, 8 JNZ CountChannels2 And AX, 1 Add DI, AX CountChannels2: Add SI, SLAVECHANNELSIZE Loop CountChannels1 Push CS Pop DS ; ****** Call Music_GetPlayMode ; AX = playmode ; BX = row ; CX = pattern ; DX = order ; SI = max row. Push AX Push DI Cmp AX, 1 JB UpdateInfoLineChanMsg Push SI Push BX ; BX = row Push CX ; CX = pattern JE UpdateInfoLine3 JA UpdateInfoLine4 UpdateInfoLineChanMsg: Mov SI, Offset ChannelMsg Cmp DI, 1 JA UpdateInfoLineChanMsg2 Mov SI, Offset EmptyMsg UpdateInfoLineChanMsg2: Mov DI, (2+9*80)*2 Mov AH, 20h Call S_DrawString Call FillToEOL Pop AX Pop AX Mov DisplayChannelMsg, 1 Jmp UpdateInfoLine7 UpdateInfoLineEnd: Call ShowTime UpdateInfoLineEnd2: Pop SI Pop DS Mov AX, 1 Ret UpdateInfoLine3: Mov DI, (2+9*80)*2 Mov SI, Offset PatternPlayMsg Mov AH, 20h Call S_DrawString Call FillToEOL Add SP, 8 Jmp UpdateInfoLine5 UpdateInfoLine4: Call PE_GetMaxOrder Push AX Push DX Mov DI, (2+9*80)*2 Mov SI, Offset SongPlayMsg Mov AH, 20h Call S_DrawString Call FillToEOL Add SP, 12 UpdateInfoLine5: Pop AX UpdateInfoLine6: ; Cmp AX, 2 ; JNE UpdateInfoLine7 UpdateInfoLine7: Call ShowTime Call UpdatePointers Pop SI Pop DS Mov AX, 1 Ret EndP UpdateInfoLine Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc IdleUpdateInfoLine Far Call Music_Poll IF TUTORIAL ELSE Mov AL, 1 Call S_SetDirectMode ENDIF Call UpdateInfoLine IF TUTORIAL Call Glbl_TutorialHandler ENDIF IF TUTORIAL Call S_UpdateScreen ELSE Mov AL, 0 Call S_SetDirectMode ENDIF IF NETWORKENABLED Jmp Network_Poll ELSE Xor AX, AX Ret ENDIF EndP IdleUpdateInfoLine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ClearInfoLine Far Mov DWord Ptr [CS:InfoLineText], 0 Ret EndP ClearInfoLine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetInfoLine Far ; DS:SI points to msg. Mov CS:InfoLineDelay, 20 SetInfoLineChain: Mov Word Ptr [CS:InfoLineText], SI Mov Word Ptr [CS:InfoLineText+2], DS Mov Word Ptr [CS:InfoLineVariable], AX Ret EndP SetInfoLine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetInfoLine2 Far ; DS:SI points to msg. Mov CS:InfoLineDelay, BX Jmp SetInfoLineChain EndP SetInfoLine2 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UpdatePointers ; BX = row, CX = pattern Mov SI, Glbl Mov DS, SI Assume DS:Glbl Mov AH, CurrentMode ; And AH, AH ; JZ UpdatePointers6 Push AX Push BX Push CX ; Call S_GetDestination ; Get ES. Call PE_FillSpeedTempo Pop CX Pop BX Pop AX UpdatePointers6: ; Cmp AH, 2 ; JNE UpdatePointers1 ; ; Cmp AL, 1 ; JB UpdatePointersEnd ; ; Call PE_ShowPatternRow ; Ret ; ; UpdatePointers1: Cmp AL, 2 ; Playmode. JNE UpdatePointers3 Cmp AH, 11 JE UpdatePointers2 Cmp AH, 21 JNE UpdatePointers3 UpdatePointers2: Call PE_ShowOrder Ret UpdatePointers3: Cmp AH, 3 JNE UpdatePointers4 Call I_ShowSamplePlay Ret UpdatePointers4: Cmp AH, 4 JNE UpdatePointers5 Call I_ShowInstrumentPlay Ret UpdatePointers5: UpdatePointersEnd: Ret EndP UpdatePointers Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ShowTime PushA Push DS Push CS Pop DS Assume DS:InfoLine Cmp AX, 2 Mov EAX, [TimerCounter] JE ShowTime3 Cmp ShowUsageTime, 0 JE ShowTime2 Jmp ShowTime4 ShowTime3: Sub EAX, [PlaybackTimer] ShowTime4: Mov EDX, 3600 Mul EDX ShRD EAX, EDX, 16 ShR EDX, 16 JNZ ShowTime2 ; EAX = number of seconds Mov EBX, 60 Div EBX ; EAX = minutes, EDX = seconds Push EDX Xor EDX, EDX Div EBX ; EAX = hours, EDX = minutes Pop ECX Push AX ; Hours on stack, CX = seconds, DX = min Mov BL, 10 Mov AX, DX Div BL Add AX, 3030h Mov [Word Ptr Minutes], AX Mov AX, CX Div BL Add AX, 3030h Mov [Word Ptr Seconds], AX Mov SI, Offset TimeMsg Mov DI, (62+9*80)*2 Mov AH, 20h Call S_DrawString Pop AX ; To clear stack ShowTime2: Pop DS PopA Ret EndP ShowTime Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc StartClock Far Push EAX Mov EAX, CS:TimerCounter Mov [CS:PlaybackTimer], EAX Pop EAX Ret EndP StartClock ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetTimerCounter Far Mov EAX, [CS:TimerCounter] Ret EndP GetTimerCounter ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ EndS ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ End