Initial import of IT.EXE source files

This commit is contained in:
Jeffrey Lim @ Vision 2014-10-19 19:00:17 +08:00
parent d637fa0762
commit 2939e690a2
42 changed files with 93048 additions and 0 deletions

4
.hgignore Normal file
View File

@ -0,0 +1,4 @@
syntax:glob
*.EXE
*.OBJ
*.MAP

107
DEBUG.INC Normal file
View File

@ -0,0 +1,107 @@
;
; Debug macro. To write to the file, use "Trace <logmessage>"
;
IF TRACEENABLED
IF CREATENEWLOGFILE
FirstTime DB 0
ENDIF
LogFileName DB "Logfile.Txt", 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc WriteDebugFile
PushA
Push DS
Push CS
Pop DS
Push CX
Mov DX, Offset LogFileName
IF CREATENEWLOGFILE
Cmp DS:FirstTime, 0
JNE WriteDebugFile1
Mov AH, 3Ch
Xor CX, CX
Int 21h
JC WriteDebugFileEnd
Mov DS:FirstTime, 1
XChg AX, BX
Jmp WriteDebugFile2
WriteDebugFile1:
ENDIF
Mov AX, 3D02h
Int 21h
JC WriteDebugFileEnd
XChg AX, BX
Mov AX, 4202h
Xor CX, CX
Xor DX, DX
Int 21h ; Move to end of file
WriteDebugFile2:
Mov AH, 40h
Pop CX
Push CX
Mov DX, SI
Int 21h
Mov AH, 3Eh
Int 21h
WriteDebugFileEnd:
Pop CX
Pop DS
PopA
Ret
EndP WriteDebugFile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
Local X, Y
PushF
Push CX
Push SI
Jmp Y
X:
DB LogMessage
DB 0Dh, 0Ah
Y:
Mov CX, Offset Y - Offset X
Mov SI, Offset X
Call WriteDebugFile
Pop SI
Pop CX
PopF
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ELSE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ENDIF

1147
IT.ASM Normal file

File diff suppressed because it is too large Load Diff

BIN
ITMIDI.CFG Normal file

Binary file not shown.

10940
IT_DISK.ASM Normal file

File diff suppressed because it is too large Load Diff

4485
IT_DISPL.ASM Normal file

File diff suppressed because it is too large Load Diff

1126
IT_D_INF.INC Normal file

File diff suppressed because it is too large Load Diff

771
IT_D_RI.INC Normal file
View File

@ -0,0 +1,771 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Load Instrument module
;
; Instrument in .ITI format has to be placed at DS:64000
; Sample headers have to be placed at DS:0
;
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc LoadITInstrument
Mov DX, 64000
Mov CX, 554 ; Length of instrument header
Mov AH, 3Fh
Int 21h
Cmp Word Ptr [DS:64000+1Ch], 200h
JAE LoadITInstrument1
Mov SI, DX
Call ConvertOldInstrument
LoadITInstrument1:
Mov AX, [DS:64000+1Eh] ; AX = number of samples
Mov DX, 80
Mul DX ; Clears DX, AX = size in bytes
Mov CX, AX
; Xor DX, DX
; Mov CX, DI
JCXZ LoadITInstrument2
Mov AH, 3Fh
Int 21h ; All sample headers are loaded too.
; Step 2 done.
LoadITInstrument2:
Ret
EndP LoadITInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InstrumentNameOffset DW 0
XISampleOffset DD 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc LoadXIInstrument ; Must preserve DS, BX
Push DS
Pop ES
Mov DX, 63000
Mov CX, 298 ; Length of instrument header
Mov AH, 3Fh
Int 21h
Mov AX, [DS:63000+296] ; NoS
Mov CS:NumInstrumentSamples, AX
Mov CS:InstrumentNameOffset, 63000+21
Mov CS:XISampleOffset, 298
; Now to transfer data across
; to 64000 in ITI format
LoadXIChain:
Mov DI, 64000
Mov EAX, 'IPMI' ; Header
StosD
Xor AX, AX
Mov CX, 8
Rep StosW ; Filename, NNA, DCA, DCT
Mov AX, [DS:63000+272]
Add AX, 15
ShR AX, 5
Cmp AX, 256
JB LoadXIInstrumentFdOut
Mov AX, 256
LoadXIInstrumentFdOut:
StosW ; Fadeout
Mov AX, 60*256
StosW ; PPC and PPS
Mov AX, 128+32*256
StosW ; GBV and DfP
Xor AX, AX
StosW
StosW
Mov AX, CS:NumInstrumentSamples
StosW
Xor AX, AX
Mov SI, CS:InstrumentNameOffset
Mov CX, 22/2
Rep MovsW
Mov CX, 5
Rep StosW ; Clear up end of inst name
; Translation table
Mov CX, 12 ; First 12 entries empty
Xor AX, AX
LoadXIInstrument1:
StosW
Inc AX
Loop LoadXIInstrument1
Mov SI, 63000+66
Mov CX, 96
LoadXIInstrument2:
Mov AH, [SI]
Inc AH
StosW
Inc AX
Inc SI
Loop LoadXIInstrument2
Mov CX, 12 ; Last 12 entries empty
Xor AH, AH
LoadXIInstrument3:
StosW
Inc AX
Loop LoadXIInstrument3
; Now for volume envelope
Mov AL, [DS:63000+266] ; Flags
Mov CL, AL
Mov AH, AL
And AX, 402h
ShR AH, 1
ShL AL, 1
Or AL, AH
And CL, 1
Or AL, CL
Mov AH, [DS:63000+258] ; No of vol env nodes
Cmp AH, 12
JB NumXIVolNodes1
Mov AH, 12
NumXIVolNodes1:
StosW
Mov AX, [DS:63000+261] ; Vol loop start+end
StosW
Mov AL, [DS:63000+260] ; Vol Sustain point
Mov AH, AL
StosW
; OK. now process volume env points
Mov CX, 12
LoadXIInstrument4:
Mov AL, [SI+2]
Cmp AL, 64
JB LoadXICheckVolBound1
Mov AL, 64
LoadXICheckVolBound1:
StosB
MovsW
LodsW
Loop LoadXIInstrument4
Mov CX, 13*3+1
Xor AX, AX
Rep StosB
; Now for panning envelope
LoadXIInstrument5:
Mov AL, [DS:63000+267] ; Flags
Mov CL, AL
Mov AH, AL
And AX, 402h
ShR AH, 1
ShL AL, 1
Or AL, AH
And CL, 1
Or AL, CL
Mov AH, [DS:63000+259] ; No of pan env nodes
Cmp AH, 12
JB NumXIPanNodes1
Mov AH, 12
NumXIPanNodes1:
StosW
Mov AX, [DS:63000+264] ; Pan loop start+end
StosW
Mov AL, [DS:63000+263] ; Pan Sustain point
Mov AH, AL
StosW
; OK. now process panning env points
Mov CX, 12
Xor AH, AH
LoadXIInstrument6:
Mov AL, [SI+2]
Cmp AL, 64
JB LoadXICheckPanBound
Mov AL, 64
LoadXICheckPanBound:
Sub AL, 32
StosB
MovsW
LodsW ; Add SI, 2
Loop LoadXIInstrument6
Mov CX, 13*3+1
Xor AX, AX
Rep StosB
; Now for pitch envelope
Mov AX, 2*256 ; 2 node points
StosW
Xor AX, AX
StosW
StosW
; First node is 0, 0, second node is 0, 99
StosW
StosW
Mov AX, 99
StosW
Mov CX, 75-6
Xor AX, AX
Rep StosB
Cmp Byte Ptr [DS:64000+131h], 2
JAE LoadXIInstrumentVolEnvelopeCheck1
Mov Byte Ptr [DS:64000+131h], 2
Mov Word Ptr [DS:64000+136h], 64
Mov Word Ptr [DS:64000+138h], 64*256
Mov Word Ptr [DS:64000+13Ah], 100
LoadXIInstrumentVolEnvelopeCheck1:
Cmp Byte Ptr [DS:64000+183h], 2
JAE LoadXIInstrumentPanEnvelopeCheck1
Mov Byte Ptr [DS:64000+183h], 2
Xor AX, AX
Mov [DS:64000+188h], AX
Mov [DS:64000+18Ah], AX
Mov Word Ptr [DS:64000+18Ch], 100
LoadXIInstrumentPanEnvelopeCheck1:
; OK. instrument done.
; Now have to load samples
; Bytes to load = 40*NoS
Mov AX, 40
Mul Word Ptr [DS:64000+1Eh]
Mov CX, AX
Mov DX, 62000
Mov AH, 3Fh
Int 21h
Mov EDX, CS:XISampleOffset ; EDX = offset in file
Add DX, CX
Xor DI, DI
Mov SI, 62000
Mov CX, [DS:64000+1Eh]
LoadXISample1:
Push CX
Mov EAX, 'SPMI'
StosD
Xor AX, AX
Mov CX, 6
Rep StosW
Mov AX, 64*256
StosW
; Flg
LoadXISample2:
Mov AH, [SI+12] ; Default volume
Mov AL, 0
Cmp DWord Ptr [SI], 0 ; Length = 0?
JE LoadXISample4
Mov AL, 1
Mov CL, [SI+14]
Test CL, 10h
JZ LoadXISample3
Or AL, 2 ; 16-bit sample
LoadXISample3:
And CL, 3
JZ LoadXISample4 ; No loop
; CL = 1 or 2
Cmp DWord Ptr [SI+8], 1
JBE LoadXISample4
Or AL, 10h ; Loop
Dec CX
ShL CL, 6
Or AL, CL
LoadXISample4:
StosW
Push SI
; Copy sample name
Add SI, 18
Mov CX, 22/2
Rep MovsW
Xor AX, AX
StosW
StosW
Pop SI
; Conversion flags, default pan
Mov AL, 5
Mov AH, [SI+15] ; Pan
ShR AH, 2
AdC AH, 80h
StosW
Mov EAX, [SI]
Call LoadXISample5
Mov EAX, [SI+4]
Call LoadXISample5
Mov EAX, [SI+4]
Add EAX, [SI+8]
Call LoadXISample5
; C5speed..
Push ES
Push DI
Call Music_GetPitchTable ; Returns ES:DI
Mov AL, [SI+16] ; Relative note number
Add AL, 60 ; AL = note multiplier
And AX, 0FFh
ShL AX, 2
Add DI, AX
Mov ECX, [ES:DI]
Mov AL, [SI+13] ; Finetune, -128->+127
SAR AL, 4 ; Finetune = -8->+7
And AX, 0Fh
Add AX, AX
Mov DI, AX
MovZX EAX, [CS:FineTuneTable+DI]
Pop DI
Pop ES
Push EDX
Mul ECX
ShRD EAX, EDX, 16
Pop EDX
StosD ; C5freq
Xor AX, AX
StosW
StosW
StosW
StosW
Mov EAX, EDX
Add EDX, [SI]
StosD
Xor AX, AX
StosW
StosW
Pop CX
Add SI, 40
Loop LoadXISample1
Ret
LoadXISample5:
Cmp EAX, 4177910
JB LoadXISample6
Mov EAX, 4177910
LoadXISample6:
Test Byte Ptr [SI+14], 10h
JZ LoadXISample7
ShR EAX, 1
LoadXISample7:
StosD
RetN
EndP LoadXIInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc LoadInITInstrument
Mov AH, 3Fh
Mov CX, 2000
Mov DX, 62000
Int 21h ; Read header into 62000
Mov AX, 4200h
Mov CX, Word Ptr [CS:LoadInstrumentOffset+2]
Mov DX, Word Ptr [CS:LoadInstrumentOffset]
Int 21h ; Goto location
Mov AH, 3Fh ; Load instrument data
Mov CX, 554
Mov DX, 64000
Int 21h
Cmp Word Ptr [DS:62000+2Ah], 200h
JAE LoadInITInstrument1
Mov SI, 64000
Call ConvertOldInstrument
LoadInITInstrument1: ; Convert Note table and load
; Sample headers.
Mov SI, 64000+41h
Xor CX, CX
LoadInITInstrument2:
Mov DI, [SI]
And DI, 0FFh ; DI = sample number
JZ LoadInITInstrument3
Cmp DI, [DS:62000+24h] ; Sample exists?
JA LoadInITInstrument3
Cmp Byte Ptr [CS:InstrumentTable+DI], 0
JNE LoadInITInstrument3
Inc CX ; CL = sample number
Mov [CS:InstrumentTable+DI], CL
Push SI
Push CX
Add DI, [DS:62000+22h]
ShL DI, 2
Add DI, [DS:62000+20h]
Add DI, 62000+0C0h-4 ; Samples are 0 based, not 1
Mov AX, 4200h ; Move to offset of sample
Mov CX, [DI+2]
Mov DX, [DI]
Int 21h
Pop AX
Push AX
Dec AX
Mov CX, 80
Mul CX
Mov DX, AX
Mov AH, 3Fh
Int 21h ; Load sample header.
Pop CX
Pop SI
LoadInITInstrument3:
Add SI, 2
Cmp SI, 64000+41h+120*2
JB LoadInITInstrument2
Mov [DS:64000+1Eh], CX
; Process translation table
Mov SI, 64000+41h
LoadInITInstrument4:
Mov DI, [SI]
And DI, 0FFh
Mov AL, [CS:InstrumentTable+DI]
Mov [SI], AL
Add SI, 2
Cmp SI, 64000+41h+120*2
JB LoadInITInstrument4
Mov DI, Offset InstrumentTable
Xor AX, AX
Mov CX, 50
Rep StosW
Ret
EndP LoadInITInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc LoadInXMInstrument
Mov AX, 4200h
Mov CX, Word Ptr [CS:LoadInstrumentOffset+2]
Mov DX, Word Ptr [CS:LoadInstrumentOffset]
Int 21h ; Goto location
Mov AH, 3Fh
Mov CX, 4
Mov DX, 63000
Int 21h
Mov AH, 3Fh
Mov CX, [DS:63000]
Sub CX, 4
Mov DX, 63033+4
Int 21h
Mov AX, [DS:63033+27]
Mov CS:NumInstrumentSamples, AX
Mov CS:InstrumentNameOffset, 63033+4
Mov AX, 4201h
Xor CX, CX
Xor DX, DX
Int 21h ; DX:AX = fileoffset
Mov Word Ptr [CS:XISampleOffset], AX
Mov Word Ptr [CS:XISampleOffset+2], DX
Push DS
Pop ES
Jmp LoadXIChain
EndP LoadInXMInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TransferInstrumentName
Mov AX, 48
Mul CS:NumInstruments
Inc CS:NumInstruments
Mov DI, AX
Push DS
Push CS
Pop DS
Mov AL, CL
StosB
Mov SI, Offset InInstrumentFileName
Mov CX, 14
Rep MovsB
Mov EAX, LoadInstrumentOffset
Mov [ES:DI+44-15], EAX
Pop DS
Ret
EndP TransferInstrumentName
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; 'InstrumentTable' scratchpad
LoadInstrumentOffset DD 0
NumInstrumentSamples DW 0
Proc LoadITInModuleInstrument
Mov AH, 3Fh
Mov CX, 2000
Mov DX, 63000
Int 21h
Xor BP, BP
Push ES
Push CS ; Clear InstrumentTable
Pop ES
Mov DI, Offset InstrumentTable
Mov CX, 100
Xor AL, AL
Rep StosB
Pop ES
LoadITInModuleInstrument1:
Cmp BP, [DS:63000+22h] ; InsNum
JB LoadITInmoduleInstrument2
Ret
LoadITInModuleInstrument2:
Mov SI, BP
ShL SI, 2
Inc BP
Add SI, [DS:63000+20h]
Add SI, 63000+0C0h
Mov AX, 4200h ; Move file pointer.
Mov CX, [SI+2]
Mov DX, [SI]
Mov Word Ptr [CS:LoadInstrumentOffset], DX
Mov Word Ptr [CS:LoadInstrumentOffset+2], CX
Int 21h
Mov AH, 3Fh
Mov CX, 554
Mov DX, 62000
Int 21h
Mov SI, 62000+41h
LoadITInModuleInstrument3:
LodsW
And AX, 0FFh
Mov DI, AX
Cmp AL, 100
JAE LoadITInModuleInstrument5
Mov [CS:InstrumentTable+DI], 1
LoadITInModuleInstrument5:
Cmp SI, 62000+41h+120*2
JB LoadITInModuleInstrument3
; Now to count samples
; and clear table.
Mov DI, 99
Xor DX, DX ; DX = number of samples.
LoadITInModuleInstrument4:
Cmp Byte Ptr [CS:InstrumentTable+DI], 1
JNE LoadITInModuleInstrument6
Inc DX
Mov Byte Ptr [CS:InstrumentTable+DI], 0
LoadITInModuleInstrument6:
Dec DI
JNZ LoadITInModuleInstrument4
Test DX, DX
JZ LoadITInModuleInstrument1
Push DX
Mov CL, 5 ; In-Module .IT Instrument
Call TransferInstrumentName
Mov SI, 62000+20h
Mov CX, 25
Rep MovsB
Pop AX
StosW
Xor AX, AX
StosW
Jmp LoadITInModuleInstrument1
EndP LoadITInModuleInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc LoadXMInModuleInstrument
Call LoadXMHeader ; Reads to first instrument
Xor BP, BP
LoadXMInModuleInstrument1:
Cmp BP, [DS:64000+72]
JB LoadXMInModuleInstrument2
Ret
LoadXMInModuleInstrument2:
Inc BP
Mov AX, 4201h
Xor CX, CX
Xor DX, DX
Int 21h ; Get current file location
Mov Word Ptr [CS:LoadInstrumentOffset], AX
Mov Word Ptr [CS:LoadInstrumentOffset+2], DX
Mov AH, 3Fh
Mov CX, 4
Mov DX, 63000
Int 21h ; Read instrument size field
Mov AH, 3Fh
Mov CX, [DS:63000]
Sub CX, 4
Mov DX, 63004
Int 21h
Mov AX, [DS:63000+27] ; Number of samples
Test AX, AX
JZ LoadXMInModuleInstrument1
Mov CX, 40
Mul CX
Mov CX, AX
Mov AH, 3Fh
Mov DX, 62000
Int 21h ; OK sample headers read
; into DS:62000
Mov CL, 6 ; In-Module .XM Instrument
Call TransferInstrumentName
Mov SI, 63004
Mov CX, 22
Rep MovsB
Xor AX, AX
StosB
StosW
Mov AX, [DS:63000+27]
Mov CX, AX
StosW
Xor AX, AX
StosW
Xor EDX, EDX
Mov SI, 62000
LoadXMInModuleInstrument3:
Add EDX, [SI]
Add SI, 40
Dec CX
JNZ LoadXMInModuleInstrument3
SHLD ECX, EDX, 16
Mov AX, 4201h
Int 21h
; Advance file pointers..
Jmp LoadXMInModuleInstrument1
EndP LoadXMInModuleInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

1498
IT_D_RIS.INC Normal file

File diff suppressed because it is too large Load Diff

2889
IT_D_RM.INC Normal file

File diff suppressed because it is too large Load Diff

1785
IT_D_WM.INC Normal file

File diff suppressed because it is too large Load Diff

973
IT_EMS.ASM Normal file
View File

@ -0,0 +1,973 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ EMS Module ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
include switch.inc
; Memory structure for patterns:
; Memory Block Header
; Memory data
;
; Block Header
; Offset 0: DWord - Number of bytes in block (not including header)
; Offset 4: Word - Segment of last block, 0 if first
; Offset 6: Word - Segment of next block, 0 if last
; Offset 8: Byte - 0 = Unused, 1 = Used
; Offset 9-0Fh: Not used
; Offset 10h Data
Jumps
.386
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Segment Object1 BYTE Public 'Data'
Extrn EMSErrorValue:Word
Extrn EMSErrorValue2:Word
Extrn EMSErrorValue3:Word
Extrn EMSErrorValue4:Word
Extrn EMSErrorValue5:Word
Extrn EMSErrorValue6:Word
Extrn EMSErrorValue7:Word
Extrn EMSErrorValue8:Word
EndS
Extrn M_Object1List:Far
Extrn O1_EMSWarningMessage
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Globals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Global E_AllocateEMS:Far
Global E_InitEMS:Far
Global E_UnInitEMS:Far
Global E_GetFreeEMS:Far
Global E_ReleaseEMS:Far
Global E_MapEMSMemory:Far, E_MapAvailableEMSMemory:Far
Global E_GetEMSPageFrame:Far
Global E_EMSAvailable:Far
Global E_SaveEMSPageFrame:Far
Global E_RestoreEMSPageFrame:Far
Global E_AllocateBlockEMS:Far, E_ReleaseBlockEMS:Far
Global E_MapAlignedBlockEMS:Far
Global E_GetEMSVersion:Far
Global E_GetInternalEMSHandle:Far
IF EMSDEBUG
Global E_DumpEMSMemory:Far
ENDIF
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Segment EMS WORD Public 'Code' USE16
Assume CS:EMS, DS:Nothing
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
CREATENEWLOGFILE EQU 0
include debug.inc
EMSDetectString DB "EMMXXXX0" ; Identification string
EMSHandlesRemaining DW 0
EMSAvailable DW 0 ; Assume that it's not avail.
EMSPageFrame DW 0
EMSHandle DW 0
EMSVersion DB 0
DB 0
IF EMSDEBUG
EMSDumpName DB "EMSDump", 0
ENDIF
EMSCorrespondenceList Label Word
Page0 DB 0, 0
DW 0
Page1 DB 0, 0
DW 1
Page2 DB 0, 0
DW 2
Page3 DB 0, 0
DW 3
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Proc E_InitEMS Far
Push DS
Push ES
Trace " - Determining EMS presence"
Xor AX, AX
Mov DS, AX
Mov AX, [DS:019Eh] ; Get interrupt vector for Int 67h
And AX, AX ; Is Segment = 0?
JZ E_InitEMS1
Mov ES, AX
Mov DI, 0Ah ; Offset into driver of identification string
Push CS
Pop DS
Assume DS:EMS
Mov SI, Offset EMSDetectString
Mov CX, 8/2
RepE CmpsW
JNE E_InitEMS1
; EMM driver is present
Mov AH, 40h ; Get manager status
Int 67h ; Returns AH=0 -> no error
And AH, AH
JNZ E_InitEMS1
Trace " - Determining EMS Page Frame"
Mov AH, 41h ; Get page frame segment
Int 67h ; AH if successful, with BX=segment
And AH, AH
JNZ E_InitEMS1
Mov EMSPageFrame, BX
Trace " - Determining EMS Version"
Mov AH, 46h ; Get EMS version
Int 67h
Test AH, AH
JNZ E_InitEMS1
Mov EMSVersion, AL
Trace " - Allocating EMS block"
Mov AH, 43h
Mov BX, 8
Int 67h
Test AH, AH
JNZ E_InitEMS1
Mov EMSHandle, DX
Mov AX, 4400h
Xor BX, BX
Int 67h ; Map first page
Mov ES, EMSPageFrame
Xor DI, DI
Mov EAX, 8*16*1024-16
StosD ; Amount of memory free
Xor EAX, EAX ; No previous block, no next block
StosD
Xor AX, AX ; Unused block
StosW
Mov EMSAvailable, 1
; OK.. now to get number of EMS
; handles available..
Trace " - Determining number of free EMS handles"
Cmp EMSVersion, 40h
JB E_InitEMSBelow4
Mov AX, 5402h
Int 67h ; BX = total number of pages.
Test AH, AH
JNZ E_InitEMSBelow4
Mov DX, BX
Mov AH, 4Bh
Int 67h
Test AH, AH
JNZ E_InitEMSBelow4
Sub DX, BX
Mov EMSHandlesRemaining, DX
Jmp E_InitEMS1
E_InitEMSBelow4:
Mov CX, 256 ; Allocate 256 MAX
E_InitEMS2:
Mov AH, 43h
Mov BX, 1
Int 67h
Test AH, AH
JNZ E_InitEMS3
Inc EMSHandlesRemaining
Push DX
Loop E_InitEMS2
E_InitEMS3:
Mov CX, EMSHandlesRemaining ; Now to dealloc them
Test CX, CX
E_InitEMS4:
JZ E_InitEMS1
Mov AH, 45h
Pop DX
Int 67h
Dec CX
Jmp E_InitEMS4
E_InitEMS1:
Pop ES
Pop DS
Ret
EndP E_InitEMS
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_GetFreeEMS Far ; Returns kb free..
Push BX
Push DX
Cmp EMSAvailable, 0
JE E_GetFreeEMS2 ; No EMM driver?
Mov AH, 42h ; Get page counts
Int 67h
And AH, AH ; AH=0 -> no error
JNZ E_GetFreeEMS2 ; BX = free pages
Mov AX, BX
ShL AX, 4
Jmp E_GetFreeEMS1
E_GetFreeEMS2:
Xor AX, AX
E_GetFreeEMS1:
Pop DX
Pop BX
Ret
EndP E_GetFreeEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_ReleaseEMS Far ; AX = handle.
Push AX
Push DX
Mov DX, AX
Mov AH, 45h ; Deallocate memory.
Int 67h
And AH, AH ; AH = 0 -> no error
JZ E_ReleaseEMS1
Call EMSWarning
E_ReleaseEMS1:
Inc CS:EMSHandlesRemaining
Pop DX
Pop AX
Ret
EndP E_ReleaseEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc EMSWarning
PushAD
Push DS
Push ES
Mov BX, Object1
Mov DS, BX
Assume DS:Object1
Mov Byte Ptr EMSErrorValue, AH
Mov EMSErrorValue2, CX
Mov EMSErrorValue3, DX
Mov AX, Word Ptr CS:EMSVersion
Mov EMSErrorValue8, AX
Mov AL, CS:Page0
Mov Byte Ptr EMSErrorValue4, AL
Mov AL, CS:Page1
Mov Byte Ptr EMSErrorValue5, AL
Mov AL, CS:Page2
Mov Byte Ptr EMSErrorValue6, AL
Mov AL, CS:Page3
Mov Byte Ptr EMSErrorValue7, AL
Mov DI, Offset O1_EMSWarningMessage
Mov CX, 2
Call M_Object1List
Pop ES
Pop DS
PopAD
Ret
EndP EMSWarning
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_MapAvailableEMSMemory Far
; AX = handle.
Push AX BX DX
Mov DX, AX
Xor AL, AL
Xor BX, BX
E_MapAvailableEMSMemory1:
Mov AH, 44h
Int 67h
Test AH, AH
JNZ E_MapAvailableEMSMemory2
Inc AX
Inc BX
Cmp AL, 3
JBE E_MapAvailableEMSMemory1
E_MapAvailableEMSMemory2:
Pop DX BX AX
Ret
EndP E_MapAvailableEMSMemory
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_MapEMSMemory Far ; CL = total pages in handle
; CH = starting (base) page.
; DX = handle
Push AX
Push BX
Push CX
Sub CL, CH
JBE E_MapEMSMemory002
Cmp CL, 4
JB E_MapEMSMemory003
Mov CL, 4
E_MapEMSMemory003:
IF EMSUSE41
Cmp CS:EMSVersion, 40h
JAE E_MapEMSMemoryV4_1
ENDIF
Xor BX, BX
E_MapEMSMemory001:
Mov AL, CL
Dec AX
Mov BL, AL
Add BL, CH
Mov AH, 44h
Int 67h
And AH, AH
JNZ E_MapEMSMemory004
Dec CL
JNZ E_MapEMSMemory001
Jmp E_MapEMSMemory002
IF EMSUSE41
E_MapEMSMemoryV4_1:
Push DS
Push SI
PushF
CLI
Push CS
Pop DS
Assume DS:EMS
Mov Page0, CH
Inc CH
Mov Page1, CH
Inc CH
Mov Page2, CH
Inc CH
Mov Page3, CH
Mov AX, 5000h
Xor CH, CH
Mov SI, Offset EMSCorrespondenceList
Int 67h
PopF
Pop SI
Pop DS
Assume DS:Nothing
Test AH, AH
JZ E_MapEMSMemory002
ENDIF
E_MapEMSMemory004:
; Call EMSWarning
E_MapEMSMemory002:
Pop CX
Pop BX
Pop AX
E_MapEMSMemoryExit:
Ret
EndP E_MapEMSMemory
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_UnInitEMS Far
Cmp EMSAvailable, 0
JE E_UnInitEMS1
Mov AX, EMSHandle
Call E_ReleaseEMS
E_UnInitEMS1:
Ret
EndP E_UnInitEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_GetEMSPageFrame Far
Mov AX, CS:EMSPageFrame
Ret
EndP E_GetEMSPageFrame
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_MapAlignedBlockEMS Far ; Given AX, Return DS:SI
Push CX DX
Mov SI, AX
Mov CX, AX
ShL SI, 4
Mov CL, 8
ShR CH, 2
And SI, 03FFFh
Mov DX, CS:EMSHandle
Call E_MapEMSMemory
Mov DS, CS:EMSPageFrame
Pop DX CX
Ret
EndP E_MapAlignedBlockEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_AllocateBlockEMS Far ; EAX = number of bytes
; Destroys EMS page frame
; Returns AX = segment address
; Carry set if fail, clear if
; successful
ClI
Push EBX ECX EDX ESI EDI DS ES
Cmp CS:EMSAvailable, 0
JE AllocateBlockQuitError
Mov ESI, EAX
Add ESI, 0Fh
And ESI, Not 0Fh
Mov DS, CS:EMSPageFrame
Xor EDI, EDI ; EDI = current offset
Mov CX, 0008h ; Starting page = 0, Max page = 8
AllocateBlockEMS2:
Mov DX, CS:EMSHandle
Call E_MapEMSMemory
AllocateBlockEMS1:
Cmp Byte Ptr [DI+8], 0 ; Used?
JNE AllocateBlockEMSNext
Cmp ESI, [DI]
JA AllocateBlockEMSNext
Mov AX, DI
And AX, 3FFFh
Add AX, SI
JC AllocateBlockQuitError ; Can't fit it in!
; OK. this block will do
Mov Byte Ptr [DI+8], 1 ; This block used
Mov EBX, [DI] ; Size of block
Mov [DI], ESI ; New size of this block
Mov EAX, [DI+4] ; To get next in HEAX
Mov ECX, EDI ; ECX = Current offset
ShR ECX, 4 ; ECX = Segment reference
Mov AX, CX ; AX = segment, HEAX = next seg
Sub EBX, ESI ; Bytes in next block
JZ AllocateBlockPerfectEnd
Sub EBX, 16
LEA ESI, [ESI+EDI+16] ; ESI = position of split block
Push ESI
ShR ESI, 4 ; SI = segment of split block
Mov [DI+6], SI ; Store pointer to next block
Pop EDI ; EDI = position of split block
Mov ECX, EDI ; ECX = position of split block
ShR ECX, 6
And CH, Not 3
Mov CL, 8
Call E_MapEMSMemory
Mov [DI], EBX ; bytes in block
Mov [DI+4], EAX ; Last block & Next block
Mov Byte Ptr [DI+8], 0 ; Unused block
Push AX
Mov AX, [DI+6]
Test AX, AX
JZ NoNextBlockSplit
Call E_MapAlignedBlockEMS ; DS:SI Pointing to next
ShR EDI, 4
Mov [SI+4], DI
NoNextBlockSplit:
Pop AX
ClC
Jmp AllocateBlockQuit
AllocateBlockPerfectEnd:
; Mov Word Ptr [DI+6], 0 ; Last block.
ClC
Jmp AllocateBlockQuit
AllocateBlockEMSNext:
Mov CX, [DI+6] ; Next segment
And ECX, 0FFFFh
JZ AllocateBlockQuitError
; Check EDI and ECX for the same frame.. if the same, then skip updating (E)DI
; and only update DI
ShLD EAX, EDI, 16 ; AL = 64k frame
Mov EDI, ECX
ShR CH, 4
ShL EDI, 4
Cmp AL, CH
JE AllocateBlockEMS1
ShL CH, 2
Mov CL, 8
Jmp AllocateBlockEMS2
AllocateBlockQuitError:
StC
AllocateBlockQuit:
Pop ES DS EDI ESI EDX ECX EBX
StI
Ret
EndP E_AllocateBlockEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_ReleaseBlockEMS Far ; Given AX = 'segment'.
ClI
Push EAX EBX DS SI
Mov BX, AX ; BX = current segment
Call E_MapAlignedBlockEMS
; DS:SI points to structure.
Mov Byte Ptr [DS:SI+8], 0 ; This block unused.
; Release later block first, if possible
Mov AX, [DS:SI+6]
Test AX, AX
JZ E_ReleaseBlockEMSNoneAfter ; Nope, this is the
; last block.
Call E_MapAlignedBlockEMS ; OK, DS:0 points to next block
Mov EAX, [DS:SI+4] ; HEAX = next block, AX = last block
Mov EBX, [DS:SI] ; Free memory
Cmp Byte Ptr [DS:SI+8], 0 ; Used?
JNE E_ReleaseBlockAfterEnd
Call E_MapAlignedBlockEMS
Add EBX, 16
Add [DS:SI], EBX
Push AX
Mov AX, [DS:SI+4]
Mov [DS:SI+4], EAX
Pop AX
Jmp E_ReleaseBlockEMSBefore
E_ReleaseBlockAfterEnd:
Call E_MapAlignedBlockEMS
Jmp E_ReleaseBlockEMSBefore
E_ReleaseBlockEMSNoneAfter:
Mov AX, BX
E_ReleaseBlockEMSBefore:
Test AX, AX
JZ E_ReleaseBlockFinished
Mov EAX, [DS:SI+4]
Mov EBX, [DS:SI]
Call E_MapAlignedBlockEMS
Cmp Byte Ptr [DS:SI+8], 0
JNE E_ReleaseBlockPreviousFailed
Push AX
Mov AX, [DS:SI+4] ; Last field
Mov [DS:SI+4], EAX ; Next field written
Add EBX, 16
Add [DS:SI], EBX
Pop AX
Jmp E_ReleaseBlockFinished
E_ReleaseBlockPreviousFailed:
Mov AX, [DS:SI+6]
E_ReleaseBlockFinished:
Mov BX, AX
Call E_MapAlignedBlockEMS ; DS:SI points to 'base' block
Mov AX, [SI+6] ; Next
Test AX, AX
JZ E_ReleaseBlockCleanup
Call E_MapAlignedblockEMS
Mov [SI+4], BX
E_ReleaseBlockCleanup:
Pop SI DS EBX EAX
StI
Ret
EndP E_ReleaseBlockEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_AllocateEMS Far ; EAX = number of bytes
; Returns AX with handle
; 0 if no handle allocated
; given carry = essential
; no carry = spare EMS
Push EBX
Push ECX
Push EDX
Mov DX, CS:EMSHandlesRemaining
JC E_AllocateEMS3
Cmp DX, 10
JB E_AllocateEMS2
E_AllocateEMS3:
Test DX, DX
JZ E_AllocateEMS1
Cmp CS:EMSAvailable, 0
JE E_AllocateEMS2
Mov EBX, EAX
Add EBX, 16*1024-1
SHR EBX, 14
Mov AH, 43h
Int 67h
Test AH, AH
JNZ E_AllocateEMS2
Dec CS:EMSHandlesRemaining
Jmp E_AllocateEMS1
E_AllocateEMS2:
Xor DX, DX
E_AllocateEMS1:
Mov AX, DX
Pop EDX
Pop ECX
Pop EBX
Ret
EndP E_AllocateEMS
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_EMSAvailable Far ; Returns Zero flag set if no EMS
Cmp CS:EMSAvailable, 0
Ret
EndP E_EMSAvailable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Comment ~
Proc E_SavePageFrame Far ; Given DX = Handle
Public E_SavePageFrame
Push AX
Push DX
Mov AH, 47h
Int 67h
Test AH, AH
JZ E_SavePageFrame1
Call EMSWarning
E_SavePageFrame1:
Pop DX
Pop AX
Ret
EndP E_SavePageFrame
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_RestorePageFrame Far ; Given DX = Handle
Public E_RestorePageFrame
Push AX
Push DX
Mov AH, 48h
Int 67h
Test AH, AH
JZ E_RestorePageFrame1
Call EMSWarning
E_RestorePageFrame1:
Pop DX
Pop AX
Ret
EndP E_RestorePageFrame
~
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_SaveEMSPageFrame Far
Cmp CS:EMSAvailable, 0
JE E_SaveEMSPageFrame1
Push AX
Push DX
Mov DX, CS:EMSHandle
Mov AH, 47h
Int 67h
; Cmp AH, 1
; Test AH, AH
; JZ E_SaveEMSPageFrame2
; Call EMSWarning
And AH, AH
JZ E_SaveEMSPageFrame2
StC
E_SaveEMSPageFrame2:
Pop DX
Pop AX
E_SaveEMSPageFrame1:
Ret
EndP E_SaveEMSPageFrame
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_RestoreEMSPageFrame Far
Cmp CS:EMSAvailable, 0
JE E_RestoreEMSPageFrame1
Push AX
Push DX
Mov DX, EMSHandle
Mov AH, 48h
Int 67h
Pop DX
Pop AX
E_RestoreEMSPageFrame1:
Ret
EndP E_RestoreEMSPageFrame
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_GetEMSVersion Far
Mov AL, CS:EMSVersion
Ret
EndP E_GetEMSVersion
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc E_GetInternalEMSHandle Far
Mov AX, CS:EMSHandle
Ret
EndP E_GetInternalEMSHandle
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
IF EMSDEBUG
Proc E_DumpEMSMemory Far
Push CS
Pop DS
Assume DS:EMS
Mov AH, 3Ch
Xor CX, CX
Mov DX, Offset EMSDumpName
Int 21h
Mov BX, AX
Mov CX, 8
Mov DX, EMSHandle
Call E_MapEMSMemory
Mov AH, 40h
Mov CX, 32768
Mov DS, EMSPageFrame
Xor DX, DX
Int 21h
Mov AH, 40h
Mov DX, 32768
Mov CX, DX
Int 21h
Mov CX, 408h
Mov DX, CS:EMSHandle
Call E_MapEMSMemory
Mov AH, 40h
Mov CX, 32768
Xor DX, DX
Int 21h
Mov AH, 40h
Mov DX, 32768
Mov CX, DX
Int 21h
Mov AH, 3Eh
Int 21h
Xor AX, AX
Ret
EndP E_DumpEMSMemory
Assume DS:Nothing
ENDIF
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
EndS
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
End

168
IT_ERR.ASM Normal file
View File

@ -0,0 +1,168 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Critical Error handler. ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Jumps
.386
include switch.inc
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Globals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Global Error_InitHandler:Far
Global Error_UnInitHandler:Far
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Segment Error BYTE Public 'Code' USE16
Assume CS:Error
CREATENEWLOGFILE EQU 0
include debug.inc
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
OldHandlerOffset DW ?
OldHandlerSegment DW ?
ErrorMsgs Label Word
DW Offset Error0
DW Offset Error1
DW Offset Error2
DW Offset Error3
DW Offset Error4
DW Offset Error5
DW Offset Error6
DW Offset Error7
DW Offset Error8
DW Offset Error9
DW Offset ErrorA
DW Offset ErrorB
DW Offset UnknownError
DW Offset UnknownError
DW Offset UnknownError
DW Offset ErrorF
Error0 DB "Write protect error", 0
Error1 DB "Unknown unit error", 0
Error2 DB "Drive not ready error", 0
Error3 DB "Unknown command error", 0
Error4 DB "Data integrity error", 0
Error5 DB "Bad request structure length error", 0
Error6 DB "Seek error", 0
Error7 DB "Unknown media type error", 0
Error8 DB "Sector not found error", 0
Error9 DB "Printer error", 0
ErrorA DB "Read fault error", 0
ErrorB DB "General failure error", 0
ErrorF DB "Invalid disk change error", 0
UnknownError DB "Unknown critical error", 0
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Proc ErrorHandler Far
PushA
Push DS
Push ES
Push CS
Pop DS
Assume DS:Error
Mov BX, DI
And BX, 0FFh
Cmp BX, 0Fh
JBE ErrorHandler1
Mov SI, Offset UnknownError
Jmp ErrorHandler2
ErrorHandler1:
Add BX, BX
Mov SI, [ErrorMsgs+BX]
ErrorHandler2:
Mov AH, 20h
Mov DI, 0B800h
Mov ES, DI
Mov DI, (2+49*80)*2
ErrorHandler3:
LodsB
And AL, AL
JZ ErrorHandler4
StosW
Jmp ErrorHandler3
ErrorHandler4:
Pop ES
Pop DS
PopA
Xor AX, AX
IRet
EndP ErrorHandler
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Error_InitHandler Far
Push ES
Trace " - Installing error handler"
Xor AX, AX
Mov ES, AX
Mov AX, CS
ShL EAX, 16
Mov AX, Offset ErrorHandler
XChg [ES:90h], EAX
Mov DWord Ptr CS:OldHandlerOffset, EAX
Pop ES
Ret
EndP Error_InitHandler
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Error_UnInitHandler Far
Push ES
Xor AX, AX
Mov ES, AX
Mov EAX, DWord Ptr CS:OldHandlerOffset
Mov [ES:90h], EAX
Pop ES
Ret
EndP Error_UnInitHandler
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
EndS
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
End

5950
IT_F.ASM Normal file

File diff suppressed because it is too large Load Diff

612
IT_FOUR.ASM Normal file
View File

@ -0,0 +1,612 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Fast Fourier Transform Module ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Jumps
.386P
.387
include switch.inc
IF SPECTRUMANALYSER
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Segment Object1 BYTE Public 'Data'
EndS
Segment DiskData PARA Public 'Data'
EndS
Extrn O1_FourierDisplay:Far
Extrn M_Object1List:Far
Extrn Music_GetWaveForm:Far
Extrn S_InitScreen:Far
Extrn S_SetDirectMode:Far
Global MouseUpdateEnable:Far, MouseUpdateDisable:Far
Extrn VESA_Detect:Far
Extrn VESA_SetMode:Far
Extrn VESA_SetBlock:Far
Extrn InitMouse:Far, UnInitMouse:Far
Extrn S_DefineSmallNumbers:Far
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Segment Infopage BYTE Public 'Code' USE16
Assume CS:Infopage, DS:Nothing, ES:Nothing
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Fourier_CreateTable Far ; Fills in ES:16384
Public Fourier_CreateTable
Mov DI, 20480
Xor CX, CX
Fourier_CreateTable1:
Mov DX, 11
Xor AX, AX
Mov BX, CX
Fourier_CreateTable2:
ShR BX, 1
AdC AX, AX
Dec DX
JNZ Fourier_CreateTable2
ShL AX, 3
StosW
Inc CX
Cmp CX, 2048
JB Fourier_CreateTable1
Ret
EndP Fourier_CreateTable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Const1_2048 DD 3C000000h
ConstHalf DD 3F000000h
Steps DW 0
CurrentOffset DW 0
Proc Fourier_Transform Far
Public Fourier_Transform
; Given DS:16384->DS:20480 = 2048 16-bit signed int samples
; Given DS:20480->24576 = relocation table
; Given DS:0->DS:16384 = working area
; Returns: DS:24576 -> 16-bit table of frequencies. (first 1024)
Push DiskData
Pop DS
Push DS
Pop ES
Mov CX, 2048 ; Prepare 2048 samples
Mov SI, 16384
Xor EDX, EDX
Fourier_TransformRelocate1:
FILd Word Ptr [SI]
Mov DI, [SI+4096]
LodsW ; Add SI, 2
Mov [DI+4], EDX
FStP DWord Ptr [DI]
Dec CX
JNZ Fourier_TransformRelocate1
; Samples relocated - now for transform
Mov CX, 1
Fourier_Transform1:
Mov [DS:24576], CX ; Store count
FLdZ
FLd1 ; CurrentPhase.r, CurrentPhase.i
FLdPi
FChs
FIDiv Word Ptr [DS:24576] ; -Pi/Step
FSinCos ; deltaphase.r, deltaphase.i, currentphase.r, currentphase.i
Xor DX, DX
Fourier_Transform2:
Mov SI, DX ; SI = k
Mov DI, CX ; DI = k+i
Mov BX, CX ; BX = i*2
Add DI, DX
ShL SI, 3 ; SI = k*8
ShL DI, 3 ; DI = (k+i)*8
ShL BX, 4 ; BX = i*8*2
Fourier_Transform3:
FLd DWord Ptr [DI]
FMul ST, ST(3) ; cr*sr
FLd DWord Ptr [DI+4]
FMul ST, ST(4) ; cr*si, cr*sr, dr, di, cr, ci
FLd DWord Ptr [DI]
FMul ST, ST(6)
FLd DWord Ptr [DI+4]
FMul ST, ST(7) ; ci*si, ci*sr, cr*si, cr*sr, dr, di, cr, ci
FXCh
FAddP ST(2), ST
FSubP ST(2), ST ; tempi, tempr, dr, di, cr, ci
FLd DWord Ptr [SI+4] ; ri, tempi, tempr, dr, di, cr, ci
FAdd ST, ST(1)
FLd DWord Ptr [SI]
FAdd ST, ST(3) ; rr, ri, tempi, tempr, dr, di, cr, ci
FXCh ST(3) ; tempr, ri, tempi, rr, dr, di, cr, ci
FSubR DWord Ptr [SI] ; kr, ri, tempi, rr, dr, di, cr, ci
FXCh ST(2)
FSubR DWord Ptr [SI+4] ; ki, ri, kr, rr, dr, di, cr, ci
FXCh ST(3) ; rr, ri, kr, ki, dr, di, cr, ci
FStP DWord Ptr [SI]
FStP DWord Ptr [SI+4]
FStP DWord Ptr [DI]
FStP DWord Ptr [DI+4]
Add SI, BX
Add DI, BX
Cmp SI, 16384
JB Fourier_Transform3
; Left with deltaphase.r, deltaphase.i, currentphase.r, currentphase.i
FLd ST ; d.r, d.r, d.i, c.r, c.i
FMul ST, ST(3) ; d.r*c.r, d.r, d.i, c.r, c.i
FXCh ST(3) ; c.r, d.r, d.i, d.r*c.r, c.i
FMul ST, ST(2) ; c.r*d.i, d.r, d.i, d.r*c.r, c.i
FLd ST(2) ; d.i, c.r*d.i, d.r, d.i, d.r*c.r, c.i
FMul ST, ST(5) ; d.i*c.i, c.r*d.i, d.r, d.i, d.r*c.r, c.i
FSubP ST(4), ST ; c.r*d.i, d.r, d.i, newr, c.i
FXCh ST(4) ; c.i, d.r, d.i, newr, c.r*d.i
FMul ST, ST(1) ; c.i*d.r, d.r, d.i, newr, c.r*d.i
FAddP ST(4), ST ; d.r, d.i, newr, newi
Inc DX
Cmp DX, CX
JB Fourier_Transform2
FComPP
FComPP
ShL CX, 1
Cmp CX, 2048
JB Fourier_Transform1
; Cleanup code.
Mov CX, 1024
Xor SI, SI
Mov DI, 24576
FLd CS:Const1_2048
; FMul ST, ST ; Include if no sqrt
; FMul ST, ST
Fourier_CalculateMagnitudes1: ; Could be interleaved, but speed isn't
; *really* a problem.
FLd DWord Ptr [SI]
FMul ST, ST
FLd DWord Ptr [SI+4]
FMul ST, ST
FAdd
FSqrt
FMul ST, ST(1)
FStP DWord Ptr [DI]
Add SI, 8
Add DI, 4
Dec CX
JNZ Fourier_CalculateMagnitudes1
FStP ST
Ret
EndP Fourier_Transform
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
FourierPalette DB 0
Proc Fourier_ChangePalette Far
Public Fourier_ChangePalette
Xor [CS:FourierPalette], 1
Call Fourier_SetPalette
Mov AX, 1
Ret
EndP Fourier_ChangePalette
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Fourier_SetPalette
Mov DX, 3C8h
Xor AL, AL
Out DX, AL
Inc DX
Cmp [CS:FourierPalette], 0
JE Fourier_PaletteB
Mov CX, 64
Fourier_PaletteA1:
Xor AL, AL
Out DX, AL
Out DX, AL
Mov AL, 64
Sub AL, CL
ShR AL, 1
Out DX, AL
Loop Fourier_PaletteA1
Mov CX, 64
Fourier_PaletteA2:
Xor AL, AL
Out DX, AL
Mov BL, 64
Sub BL, CL
ShR BL, 1
Mov AL, BL
Out DX, AL
Mov AL, BL
Add AL, 32
Out DX, AL
Loop Fourier_PaletteA2
Mov CX, 128
Fourier_PaletteA3:
Mov AL, 128
Sub AL, CL
ShR AL, 1
Out DX, AL
ShR AL, 1
Add AL, 32
Out DX, AL
Mov AL, 63
Out DX, AL
Loop Fourier_PaletteA3
Ret
Fourier_PaletteB:
Mov CX, 32
Xor BX, BX
Fourier_PaletteB1:
Xor AL, AL
Out DX, AL
Out DX, AL
Mov AL, BL
Out DX, AL
Add BX, 2
Loop Fourier_PaletteB1
Mov CX, 32
Xor BL, BL
Fourier_PaletteB2:
Mov AL, BL
Out DX, AL
Xor AL, AL
Out DX, AL
Mov AL, 63
Out DX, AL
Add BX, 2
Loop Fourier_PaletteB2
Mov CX, 32
Fourier_PaletteB3:
Mov AL, 63
Out DX, AL
Xor AL, AL
Out DX, AL
Mov AL, CL
Add AL, AL
Dec AL
Out DX, AL
Loop Fourier_PaletteB3
Mov CX, 32
Xor BX, BX
Fourier_PaletteB4:
Mov AL, 63
Out DX, AL
Mov AL, BL
Out DX, AL
Xor AL, AL
Out DX, AL
Add BX, 2
Loop Fourier_PaletteB4
Mov CX, 128
Xor BX, BX
Fourier_PaletteB5:
Mov AL, 63
Out DX, AL
Out DX, AL
Mov AL, BL
ShR AL, 1
Out DX, AL
Inc BX
Loop Fourier_PaletteB5
Ret
EndP Fourier_SetPalette
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ScreenWidth DW 0
ScreenHeight DW 0
Proc Fourier_Start Far
Public Fourier_Start
Push DiskData
Pop ES
Xor DI, DI
Mov CX, 32768
Xor AX, AX
Rep StosW ; Clear data area first.
Call Fourier_CreateTable
Mov AL, 1 ; Prevent S_Update calls.
Call S_SetDirectMode
Call VESA_Detect
JC Fourier_End
Mov AX, 107h
Fourier_NextMode:
Call VESA_SetMode ; Returns CX = width, DX = height
JNC Fourier_ModeOK
Sub AL, 2
JC Fourier_End
Jmp Fourier_NextMode
Fourier_ModeOK:
Mov ScreenWidth, CX
Mov ScreenHeight, DX
Call Fourier_SetPalette
Mov CurrentOffset, 0
Call UnInitMouse
Mov DI, Offset O1_FourierDisplay
Xor CX, CX
Call M_Object1List
Fourier_End:
Call S_InitScreen
Call InitMouse
Call S_DefineSmallNumbers
Ret
EndP Fourier_Start
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Fourier_PreDrawScreen Far
Public Fourier_PreDrawScreen
Ret
EndP Fourier_PreDrawScreen
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ControlWord DW 003Fh
Proc Fourier_DrawScreen Far
Public Fourier_DrawScreen
FLdCW [CS:ControlWord]
Push DiskData
Pop ES
Mov DI, 16384
Call Music_GetWaveForm
JC Fourier_DrawScreen1
Push ES
Pop DS
Call Fourier_Transform ; Have table at DS:0
Mov CX, 1024
Mov SI, 24576
Fourier_ConvertToInteger:
FLd DWord Ptr [SI]
FIStP DWord Ptr [SI]
Mov EDX, [SI]
ShR EDX, 6
Cmp EDX, 255
JB Fourier_DrawScreen3
Mov DL, 255
Fourier_DrawScreen3:
Mov [SI], DL
Add SI, 4
Loop Fourier_ConvertToInteger
Xor AX, AX
Call VESA_SetBlock
Push 0A000h
Pop ES
Mov DI, CurrentOffset
Mov CX, ScreenHeight
Sub CX, 64
Mov BX, ScreenWidth
LEA SI, [24576+ECX*4]
Fourier_DrawScreen2:
Mov DL, [SI]
Mov [ES:DI], DL
Sub SI, 4
Add DI, BX
JNC Fourier_DrawScreen4
Inc AX
Call VESA_SetBlock
Fourier_DrawScreen4:
Dec CX
JNZ Fourier_DrawScreen2
Mov AX, CurrentOffset
Inc AX
Xor DX, DX
Div BX
Mov CurrentOffset, DX
; Now to draw volume bars.
Mov CX, 64
And EBX, 0FFFFh
Mov BP, BX
Xor EDI, EDI
Cmp BP, 1024
JB Fourier_DrawBars2
Mov DI, BX
Mov BP, 1024
Sub DI, BP
ShR DI, 1
Fourier_DrawBars2:
Fourier_DrawBars1:
Push BX
Push CX
Push EDI
Xor EAX, EAX
Mov AX, ScreenHeight
Sub AX, CX
Mul EBX ; EAX = offset.
Add EAX, EDI
Mov DI, AX
ShR EAX, 16
Call VESA_SetBlock
Mov DX, BP
Mov BL, CL
Dec BL
ShL BL, 2 ; BL = 0->256
Push AX
Mov SI, 24580
Fourier_DrawBars3:
Cmp BL, Byte Ptr [SI]
SBB AL, AL
Mov [ES:DI], AL
Add DI, 1
JNC Fourier_DrawBars4
Pop AX
Inc AX
Call VESA_SetBlock
Push AX
Fourier_DrawBars4:
Add SI, 4
Dec DX
JNZ Fourier_DrawBars3
Pop AX
Pop EDI
Pop CX
Pop BX
Loop Fourier_DrawBars1
Fourier_DrawScreen1:
Ret
EndP Fourier_DrawScreen
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Fourier_IdleList Far
Public Fourier_IdleList
Mov AX, 1
Ret
EndP Fourier_IdleList
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Fourier_PostFunction Far
Public Fourier_PostFunction
Cmp CX, 101h
JE Fourier_PostFunction2
Fourier_PostFunction1:
Xor AX, AX
Ret
Fourier_PostFunction2:
Mov AX, 4
Ret
EndP Fourier_PostFunction
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
EndS
ENDIF
End

1026
IT_G.ASM Normal file

File diff suppressed because it is too large Load Diff

1552
IT_H.ASM Normal file

File diff suppressed because it is too large Load Diff

9023
IT_I.ASM Normal file

File diff suppressed because it is too large Load Diff

1812
IT_K.ASM Normal file

File diff suppressed because it is too large Load Diff

559
IT_L.ASM Normal file
View File

@ -0,0 +1,559 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ 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

664
IT_M.ASM Normal file
View File

@ -0,0 +1,664 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Main Module ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Jumps
.386
include switch.inc
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Segment Object1 BYTE Public 'Data' USE16
EndS
Extrn F_DrawStringInput:Far
Extrn F_PreStringInput:Far
Extrn F_PostStringInput:Far
Extrn F_Nothing:Far
Extrn F_DrawBoxObject:Far
Extrn F_DrawTextObject:Far
Extrn F_PostExitObject:Far
Extrn F_SetDirectMode:Far
Extrn F_CharacterDefinitions:Far
Extrn F_DrawButtonObject:Far
Extrn F_PreButtonObject:Far
Extrn F_PostButtonObject:Far
Extrn F_CallFarFunction:Far
Extrn F_DrawThumbBar:Far
Extrn F_DrawScalableThumbBar:Far
Extrn F_PreThumbBar:Far
Extrn F_PreScalableThumbBar:Far
Extrn F_PostThumbBar:Far
Extrn F_PostScalableThumbBar:Far
Extrn F_DrawInfoLine:Far
Extrn F_CallFarPreFunction:Far
Extrn F_CallFarPostFunction:Far
Extrn F_DrawToggle:Far
Extrn F_PreToggle:Far
Extrn F_PostToggle:Far
Extrn F_Draw5Num:Far
Extrn F_Pre5Num:Far
Extrn F_Post5Num:Far
Extrn F_Draw3Num:Far
Extrn F_Pre3Num:Far
Extrn F_Post3Num:Far
Extrn Glbl_TutorialHandler:Far
Extrn H_SetHelpContext:Far
Extrn K_GetKey:Far
Extrn K_InitKeyBoard:Far
Extrn K_UnInitKeyBoard:Far
Extrn K_IsKeyWaiting:Far
Extrn K_IsAnyKeyDown:Far
Extrn PE_DrawOrderList:Far
Extrn PE_PreOrderList:Far
Extrn PE_PostOrderList:Far
Extrn S_Set80x25Mode:Far
Extrn S_SetPalette:Far
Extrn S_RedefineCharacters:Far
Extrn S_DrawBox:Far
Extrn S_ClearScreen:Far
Extrn S_UpdateScreen:Far
; Extrn MouseDirectEnable:Far, MouseDirectDisable:Far
Extrn MouseSaveEvents:Far, MouseRestoreEvents:Far
Extrn MouseInput:Far, MouseClearEvents:Far
Extrn GetKeyboardLock:Far, MIDIBufferEmpty:Far
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Globals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Global M_FunctionDivider:Far
Global M_FunctionHandler:Far
Global M_Object1List:Far
Global M_Object1ListDefault:Far
Public ReleaseTimeSlice
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Segment Main DWORD Public 'Code' USE16
Assume CS:Main, DS:Nothing
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DrawObjectList Label DWord
DD DWord Ptr F_DrawBoxObject ; 0
DD DWord Ptr F_DrawTextObject ; 1
DD DWord Ptr F_DrawButtonObject ; 2
DD DWord Ptr F_Nothing ; Empty obj number, 3
DD DWord Ptr F_Nothing ; 4
DD DWord Ptr F_SetDirectMode ; 5
DD DWord Ptr F_CharacterDefinitions ; 6
DD DWord Ptr F_Nothing ; Empty obj number 7
DD DWord Ptr F_CallFarFunction ; 8
DD DWord Ptr F_DrawThumbBar ; 9
DD DWord Ptr F_DrawInfoLine ; 10
DD DWord Ptr H_SetHelpContext ; 11
DD DWord Ptr PE_DrawOrderList ; 12
DD DWord Ptr F_Draw3Num ; 13
DD DWord Ptr F_DrawScalableThumbBar ; 14
DD DWord Ptr F_CallFarFunction ; 15
DD DWord Ptr F_DrawStringInput ; 16
DD DWord Ptr F_DrawToggle ; 17
DD DWord Ptr F_Draw5Num ; 18
PreFunctionList Label DWord
DD DWord Ptr F_Nothing ; 0
DD DWord Ptr F_Nothing ; 1
DD DWord Ptr F_PreButtonObject ; 2
DD DWord Ptr F_Nothing ; 3
DD DWord Ptr F_Nothing ; 4
DD DWord Ptr F_Nothing ; 5
DD DWord Ptr F_Nothing ; 6
DD DWord Ptr F_Nothing ; 7
DD DWord Ptr F_Nothing ; 8
DD DWord Ptr F_PreThumbBar ; 9
DD DWord Ptr F_Nothing ; 10
DD DWord Ptr F_Nothing ; 11
DD DWord Ptr PE_PreOrderList ; 12
DD DWord Ptr F_Pre3Num ; 13
DD DWord Ptr F_PreScalableThumbBar ; 14
DD DWord Ptr F_CallFarPreFunction ; 15
DD DWord Ptr F_PreStringInput ; 16
DD DWord Ptr F_PreToggle ; 17
DD DWord Ptr F_Pre5Num ; 18
PostFunctionList Label DWord
DD DWord Ptr F_Nothing ; 0
DD DWord Ptr F_Nothing ; 1
DD DWord Ptr F_PostButtonObject ; 2
DD DWord Ptr F_Nothing ; 3
DD DWord Ptr F_PostExitObject ; 4
DD DWord Ptr F_Nothing ; 5
DD DWord Ptr F_Nothing ; 6
DD DWord Ptr F_Nothing ; 7
DD DWord Ptr F_Nothing ; 8
DD DWord Ptr F_PostThumbBar ; 9
DD DWord Ptr F_Nothing ; 10
DD DWord Ptr F_Nothing ; 11
DD DWord Ptr PE_PostOrderList ; 12
DD DWord Ptr F_Post3Num ; 13
DD DWord Ptr F_PostScalableThumbBar ; 14
DD DWord Ptr F_CallFarPostFunction ; 15
DD DWord Ptr F_PostStringInput ; 16
DD DWord Ptr F_PostToggle ; 17
DD DWord Ptr F_Post5Num ; 18
GlobalKeyList DD ?
ReleaseTimeSlice DB 0
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Proc M_FunctionDivider Far ; Given DS:SI points to list
; Carry set if none found
Push BX
M_FunctionDivider1: ; 0 = Direct comparison
; 1 = Key comparison
; 2 = Alt, 3 = Ctrl, 4 = Shift
; 5 = capital key comparison
; 6 = MIDI message
LodsB
Test AL, AL
JS M_FunctionDivider4 ; End of list
Mov BX, CX
JZ M_FunctionDivider2 ; If AL = 0
Cmp AL, 2
JE M_FunctionDivider8
JB M_FunctionDivider5
Cmp AL, 4
JB M_FunctionDivider18
JE M_FunctionDivider10 ; If AL = 4
Cmp AL, 6
JB M_FunctionDividerCAPS
M_FunctionDividerMIDI:
Test CL, CL
JNZ M_FunctionDivider9
Mov BX, CX
And BX, 0F000h
Jmp M_FunctionDividerCheck
M_FunctionDividerCAPS:
Mov BX, DX
Cmp BX, 'a'
JB M_FunctionDivider6
Cmp BX, 'z'
JA M_FunctionDivider9
Sub BL, 32
M_FunctionDivider6:
Cmp BX, 'A'
JB M_FunctionDivider9
Cmp BX, 'Z'
JA M_FunctionDivider9
Jmp M_FunctionDivider2
M_FunctionDivider5:
Mov BX, DX ; If al = 1...
Jmp M_FunctionDivider2
M_FunctionDivider8:
Test CH, 60h
JZ M_FunctionDivider9
And BX, 1FFh
Jmp M_FunctionDivider2
M_FunctionDivider18:
Test CH, 18h ; Ctrl
JZ M_FunctionDivider9
And BX, 1FFh
Jmp M_FunctionDivider2
M_FunctionDivider10:
Test CH, 6
JZ M_FunctionDivider9
And BX, 1FFh
M_FunctionDivider2:
Test CL, CL
JZ M_FunctionDivider9
M_FunctionDividerCheck:
LodsW
Cmp AX, BX
JE M_FunctionDivider3
LodsW
Jmp M_FunctionDivider1
M_FunctionDivider9:
LodsW
LodsW
Jmp M_FunctionDivider1
M_FunctionDivider3:
DB 85h ; ClC
M_FunctionDivider4: ;
StC ;
Pop BX
Ret
EndP M_FunctionDivider
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M_FunctionHandler Far
ARG ObjectList:DWord
Push BP
Mov BP, SP
Call MouseSaveEvents
M_FunctionHandler1: ; Draw all objects in list
Call GetKeyboardLock
Cmp AL, 2
JE MouseInput1
Call MouseClearEvents
LDS SI, ObjectList ; DS:SI points to object list
Add SI, 6 ; Skip pass list header
Xor AX, AX
M_FunctionHandler2:
Cmp Word Ptr [SI], 0 ; DS:SI points to an offset of
JE M_FunctionHandler4 ; an object
M_FunctionHandler3:
Push AX ; AX = object number
Push DS
Push SI
Push BP
LES DI, ObjectList ; ES:DI points to object list
Mov SI, [SI] ; DS:SI points to object
Mov BX, [SI] ; BX = object type
Mov CL, 2
ShL BX, CL
Call DWord Ptr [DrawObjectList+BX]
Pop BP
Pop SI ; DS:SI Points to an offset of
Pop DS ; an object
Pop AX
Inc AX
Add SI, 2 ; Advance Pointer
Jmp M_FunctionHandler2 ; Next Object
M_FunctionHandler4: ; Call Prefunction for object
LDS SI, ObjectList ; DS:SI points to object list
Mov AX, [SI] ; AX = Active object number
LEA SI, [ESI+EAX*2+6] ; Skip pas list header (+6)
; AX = object number
Cmp Word Ptr [SI], 0 ; if list doesn't point to
JE M_FunctionHandler21 ; anything, don't call prefunc
M_FunctionHandler20:
Mov SI, [SI] ; DS:SI points to object
Mov BX, [SI] ; BX = object type
ShL BX, 2
Push BP
Call DWord Ptr [PreFunctionList+BX]
Pop BP
M_FunctionHandler21:
IF TUTORIAL
Call Glbl_TutorialHandler
ENDIF
Call S_UpdateScreen
M_FunctionHandler5: ; Input...
; Call K_IsAnyKeyDown
; And AL, AL
; JNZ M_KeyBoardInput1
MouseInput1:
Call MouseInput ; returns 0 if nothing
; 1 if input (BX, CX, DX set)
; 2 if no input, but keyboard
; locked
Cmp AX, 1
JB M_KeyBoardInput1
JA M_FunctionHandler6 ; IdleList
; Handle postobject, of
; object BX
Mov AX, DI
Cmp BX, 0FFFFh
JE M_FunctionHandler23
LES DI, ObjectList ; ES:DI points to object list
Push ES
Pop DS
Mov [DI], BX ; Object number in BX.
LEA BX, [EBX*2+EDI+6] ; ES:BX points to offset of
; active object.
Mov SI, [BX] ; DS:SI points to object
Mov SI, [SI] ; SI = object type of active obj
ShL SI, 2
Push BP
Call DWord Ptr [PostFunctionList+SI]
Pop BP
Jmp M_FunctionHandler23
M_KeyBoardInput1:
Call MIDIBufferEmpty
JAE M_FunctionHandler8
Call K_IsKeyWaiting
Test AX, AX
JNZ M_FunctionHandler8
; Check for mouse info...
M_FunctionHandler6: ; IdleList
Cmp CS:ReleaseTimeSlice, 0
JE NoReleaseTimeSlice
Mov AX, 1680h
Int 2Fh
NoReleaseTimeSlice:
; StI
LDS SI, ObjectList ; DS:SI points to object list
Add SI, 2 ; DS:SI points to idle list
Cmp Word Ptr [SI], 0
JE M_FunctionHandler5 ; If Offset of IdleList = 0,
; check for another key
M_FunctionHandler7:
Mov SI, [SI]
Xor BX, BX ; Clear flag.
M_FunctionHandler19:
Cmp Word Ptr [SI], 0
JNE M_FunctionHandler18
Cmp Word Ptr [SI+2], 0
JE M_FunctionHandler29
M_FunctionHandler18:
Push SI
Push BX
Push DS
Push BP
Call DWord Ptr [SI]
Pop BP
Pop DS
Pop BX
Cmp AX, 5
JE M_FunctionHandlerIdleCommand
Pop SI
Add SI, 4
Or BX, AX
Jmp M_FunctionHandler19
M_FunctionHandlerIdleCommand:
Pop AX ; Pull off SI from the stack
Mov AX, DI
Jmp M_FunctionHandler10
; Mov SI, 1
; Jmp M_FunctionHandler16
M_FunctionHandler29:
Test BX, BX
JZ M_FunctionHandler5
Jmp M_FunctionHandler1
M_FunctionHandler8:
Call K_GetKey ; CX = Keyboard Input Data
; DX = Translated Input Data
; else MIDI input if CL = 0
M_FunctionHandler9:
LES DI, ObjectList ; ES:DI points to object list
Push ES
Pop DS
Mov BX, [DI] ; BX = active object number
LEA BX, [EDI+EBX*2+6] ; ES:BX points to offset of
; active object.
Xor AX, AX
Cmp Word Ptr [BX], 0
JE M_FunctionHandler23
M_FunctionHandler22:
Mov SI, [BX] ; DS:SI points to object
Mov SI, [SI] ; SI = object type of active obj
ShL SI, 2
Push BP
Call DWord Ptr [PostFunctionList+SI]
Pop BP
M_FunctionHandler23:
Push DS
Push SI
LDS SI, ObjectList
Add SI, 4
Mov SI, [SI]
Mov Word Ptr CS:GlobalKeyList+2, DS
Mov Word Ptr CS:GlobalKeyList, SI
Pop SI
Pop DS
; Xor BX, BX ; Extra key list starts at 0
M_FunctionHandler10:
Cmp AX, 1
JB M_FunctionHandler11 ; If AX = 0
JE M_FunctionHandler1 ; Redraw screen if AX = 1
Cmp AX, 3
JB M_FunctionHandler4 ; Goto preobject if AX = 2
JE M_FunctionHandler5 ; Get next input
Cmp AX, 5 ; New list
JE M_FunctionHandler16
JA M_FunctionHandler11 ; If > 5
Call MouseRestoreEvents
Pop BP
Ret 4
M_FunctionHandler16:
Mov Word Ptr Offset ObjectList, DX
Mov Word Ptr Offset ObjectList+2, CX
Mov AX, SI
Jmp M_FunctionHandler10
M_FunctionHandler11:
LDS SI, CS:GlobalKeyList
Cmp Word Ptr [SI], 0
JE M_FunctionHandler4
M_FunctionHandler12:
LodsB
Mov BX, DX
Cmp AL, 1
JE M_FunctionHandler13 ; Keycode compare (1)
Mov BX, CX
JB M_FunctionHandler13 ; Scancode compare (0)
And BX, 1FFh
Cmp AL, 3
JB M_FunctionHandlerAlt ; Alt-keycode compare (2)
JE M_FunctionHandlerCtrl ; Ctrl-keycode compare (3)
Cmp AL, 5
JB M_FunctionHandlerForced ; Always call function (4)
JE M_FunctionHandlerNewListNear ; Chain to new list (5)
Cmp AL, 7
JB M_FunctionHandlerShift ; Shift-keycode compare (6)
JE M_FunctionHandlerNewListFar ; Chain to far list (7)
Cmp AL, 9
JB M_FunctionHandlerCapCheck ; Capitalised keycode (8)
JE M_FunctionHandlerMIDI ; MIDI message (9)
; Jmp M_FunctionHandler1
Jmp M_FunctionHandler4 ; Undefined compare..
; ; -> end of list
M_FunctionHandlerAlt:
Test CH, 60h
JZ M_FunctionHandler14
Jmp M_FunctionHandler13
M_FunctionHandlerCtrl:
Test CH, 18h
JZ M_FunctionHandler14
Jmp M_FunctionHandler13
M_FunctionHandlerShift:
Test CH, 6h
JZ M_FunctionHandler14
Jmp M_FunctionHandler13
M_FunctionHandlerNewListNear:
LodsW
Mov Word Ptr CS:GlobalKeyList, AX
Jmp M_FunctionHandler11
M_FunctionHandlerNewListFar:
LodsD
Mov CS:GlobalKeyList, EAX
Jmp M_FunctionHandler11
M_FunctionHandlerForced:
LodsW
Jmp M_FunctionHandler26
M_FunctionHandlerCapCheck: ; Capital OK? (8)
Mov BX, DX
Cmp BX, 'A'
JB M_FunctionHandler14
Cmp BX, 'z'
JA M_FunctionHandler14
Cmp BX, 'a'
JB M_FunctionHandlerCapCheck1
Sub BL, 32
M_FunctionHandlerCapCheck1:
Jmp M_FunctionHandler13
M_FunctionHandlerMIDI:
Test CL, CL
JNZ M_FunctionHandler14
Mov BX, CX
And BX, 0F000h
Jmp M_FunctionHandlerCheck
M_FunctionHandler13:
Test CL, CL
JZ M_FunctionHandler14
M_FunctionHandlerCheck:
LodsW
Cmp BX, AX
JNE M_FunctionHandler14
M_FunctionHandler26:
LES DI, ObjectList ; ES:DI points to object list
Push BP
Call DWord Ptr [SI]
Pop BP
Jmp M_FunctionHandler15
M_FunctionHandler14:
Xor AX, AX
M_FunctionHandler15:
Add Word Ptr CS:GlobalKeyList, 7
Jmp M_FunctionHandler10
EndP M_FunctionHandler
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M_Object1ListDefault Far ; Reqs: DI = offset of list
Mov CX, 0FFFFh
Proc M_Object1List Far ; Reqs.. CX = inital object.
; Reqs.. DI = offset of list
Mov AX, Object1
Push AX
Mov ES, AX
Push DI
Cmp CX, 0FFFFh
JE M_Object1List1
Mov Word Ptr [ES:DI], CX
M_Object1List1:
Call M_FunctionHandler
Ret
EndP M_Object1List
EndP M_Object1ListDefault
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
EndS
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
End

3652
IT_MDATA.ASM Normal file

File diff suppressed because it is too large Load Diff

1028
IT_MMTSR.ASM Normal file

File diff suppressed because it is too large Load Diff

1412
IT_MOUSE.ASM Normal file

File diff suppressed because it is too large Load Diff

1031
IT_MSG.ASM Normal file

File diff suppressed because it is too large Load Diff

7481
IT_MUSIC.ASM Normal file

File diff suppressed because it is too large Load Diff

2945
IT_M_EFF.INC Normal file

File diff suppressed because it is too large Load Diff

2722
IT_NET.ASM Normal file

File diff suppressed because it is too large Load Diff

8902
IT_OBJ1.ASM Normal file

File diff suppressed because it is too large Load Diff

12312
IT_PE.ASM Normal file

File diff suppressed because it is too large Load Diff

140
IT_PE_V.INC Normal file
View File

@ -0,0 +1,140 @@
;
; Pattern edit view functions
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Draw_3Note Near ; Given AL = note.
Cmp AL, NONOTE
JB Draw_3Note2
Mov CL, AL
Mov AL, 173 ; '.'
JE Draw_3Note1
Mov AL, '^'
Cmp CL, 0FEh
JE Draw_3Note1
Mov AL, 'Í'
Cmp CL, 0FFh
JE Draw_3Note1
Mov AL, '!'
Draw_3Note1:
Mov AH, CH
StosW
StosW
StosW
Ret
Draw_3Note2:
Push SI
AAM 12 ; AH = octave, AL = note
Mov CL, AH
And AX, 0FFh
LEA SI, [EBX+EAX*2]
Mov AH, CH
SegCS LodsB
StosW
SegCS LodsB
StosW
Mov AL, CL
Add AL, 30h
StosW
Pop SI
Ret
EndP Draw_3Note
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Draw_2Note Near ; Given AL = note.
Cmp AL, NONOTE
JB Draw_2Note2
Mov DL, AL
Mov AL, 173 ; '.'
JE Draw_2Note1
Mov AL, '^'
Cmp DL, 0FEh
JE Draw_2Note1
Mov AL, 'Í'
Cmp DL, 0FFh
JE Draw_2Note1
Mov AL, '!'
Draw_2Note1:
Mov AH, CH
StosW
StosW
Ret
Draw_2Note2:
Push SI
AAM 12 ; AH = octave, AL = note
Mov CL, AH
And AX, 0FFh
LEA SI, [EBX+EAX*2]
SegCS LodsW
Cmp AH, '-'
JNE Draw_2Note3
Add AL, 'a'-'A'
Draw_2Note3:
Mov AH, CH
StosW
Mov AL, CL
Add AL, 30h
StosW
Pop SI
Ret
EndP Draw_2Note
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Draw_2Instrument
Test AL, AL
JNZ Draw_2Instrument1
Mov AL, 173 ; '.'
Mov AH, CH
StosW
StosW
Ret
Draw_2Instrument1:
AAM 10
Add AX, '00'
Mov CL, AL
Mov AL, AH
Mov AH, CH
StosW
Mov AL, CL
StosW
Ret
EndP Draw_2Instrument

1685
IT_S.ASM Normal file

File diff suppressed because it is too large Load Diff

90
IT_TIMER.INC Normal file
View File

@ -0,0 +1,90 @@
Proc GetCurrentTime
Push DS
Push ES
Push CS
Pop DS
Assume DS:Disk
Cmp TimerData, 0
JE GetCurrentTimeEnd
Mov ES, TimerData
Mov DI, NumTimerData
ShL DI, 3
Mov AH, 2Ah
Int 21h ; Get Date
Mov AX, CX ; Now to get date in yyyyyyym mmmddddd
Sub AX, 1980
ShL AX, 9 ; Year
Or AL, DL ; Day
Xor DL, DL
ShR DX, 3
Or AX, DX ; Month
StosW
Mov AH, 2Ch
Int 21h ; Get time
Mov AX, CX ; Now to get time in hhhhhmmm mmmsssss
ShL AL, 2 ; AX = ...hhhhh mmmmmm..
ShL AX, 3 ; AX = hhhhhmmm mmm.....
ShR DH, 1 ; DH = ...sssss
Or AL, DH
StosW
GetCurrentTimeEnd:
Pop ES
Pop DS
Ret
EndP GetCurrentTime
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc CheckTimerData
Assume DS:Disk
Cmp TimerData, 0
JNE CheckTimerData1
Mov NumTimerData, 0
Mov AH, 48h
Mov BX, 1
Int 21h
JC CheckTimerData1
Mov TimerData, AX
Call GetCurrentTime
CheckTimerData1:
Ret
EndP CheckTimerData
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ReleaseTimerData
Mov AX, CS:TimerData
Test AX, AX
JZ ReleaseTimerData1
Mov ES, AX
Mov AH, 49h
Int 21h
Xor AX, AX
ReleaseTimerData1:
Mov CS:TimerData, AX
Mov CS:NumTimerData, AX
Ret
EndP ReleaseTimerData
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

519
IT_TUTE.ASM Normal file
View File

@ -0,0 +1,519 @@
Jumps
.386
include switch.inc
IF TUTORIAL
Extrn S_DrawBox:Far
Extrn S_DrawString:Far
Extrn Music_GetSongSegment:Far
Extrn Music_GetPlayMode:Far
Extrn PE_GetLastInstrument:Far ; Returns BX = LastInst-1
Segment Pattern BYTE Public 'Code'
Extrn PatternDataArea:Word
Extrn LastKeyBoard1:Word
Extrn LastKeyBoard2:Word
EndS
Segment Disk Byte Public 'Code' USE16
Extrn SamplesInModule:Byte
Extrn InSampleFileName:Byte
EndS
Public Glbl_TutorialHandler
Segment Glbl BYTE Public 'Code' USE16
Assume CS:Glbl, DS:Nothing, GS:Pattern
Extrn CurrentMode:Byte
TutorialState DW 0
; TutorialInfo structure:
; DW Offset function
; DB x, y (top left)
; DB x, y (bottom right)
; DB colour
; DB Message, 0
TutorialFunctionArray Label Word
DW Offset Tute_State0
DW Offset Tute_State1
DW Offset Tute_State2
DW Offset Tute_State3
DW Offset Tute_State4
DW Offset Tute_State5
DW Offset Tute_State6
DW Offset Tute_State7
DW Offset Tute_State8
DW Offset Tute_State9
DW Offset Tute_State10
DW Offset Tute_State1
DW Offset Tute_State12
DW Offset Tute_State2
DW Offset Tute_State14
DW Offset Tute_State5
DW Offset Tute_State16
DW Offset Tute_State9
DW Offset Tute_State18
DW Offset Tute_State19
DW Offset Tute_StateEnd
MAXTUTESTATE = ($-Offset TutorialFunctionArray)/2
TutorialInfoArray Label Word
DW Offset TutorialDisplayState0
DW Offset TutorialDisplayState1
DW Offset TutorialDisplayState2
DW Offset TutorialDisplayState3
DW Offset TutorialDisplayState4
DW Offset TutorialDisplayState5
DW Offset TutorialDisplayState6
DW Offset TutorialDisplayState7
DW Offset TutorialDisplayState8
DW Offset TutorialDisplayState9
DW Offset TutorialDisplayState10
DW Offset TutorialDisplayState11
DW Offset TutorialDisplayState12
DW Offset TutorialDisplayState13
DW Offset TutorialDisplayState14
DW Offset TutorialDisplayState15
DW Offset TutorialDisplayState16
DW Offset TutorialDisplayState17
DW Offset TutorialDisplayState18
DW Offset TutorialDisplayState19
DW Offset TutorialDisplayState20
DW Offset TutorialDisplayStatexx
TutorialDisplayState0 DB 0, 40, 79, 49
DB 0FFh, 20, " Welcome to the Impulse Tracker Tutorial!", 13, 13
DB "This tutorial was designed to provide you with a basic understanding of how", 13
DB "this program works. Everything that you learn here is exactly the same as in", 13
DB "the main program. By the end of this tutorial, you should be able to compose", 13
DB "your own modules!", 13, 13
DB "Good luck! (Press Enter to continue)", 0
TutorialDisplayState1 DB 0, 0, 79, 4
DB "This is the load-module screen that Impulse Tracker will normally begin with.", 13
DB "As we will start a song afresh, switch to the sample list screen by pressing", 13
DB "F3.", 0
TutorialDisplayState2 DB 36, 1, 78, 13
DB "There are two basic elements to an", 13
DB "Impulse Tracker module: patterns and", 13
DB "samples. Samples provide all the 'real'", 13
DB "sound information to the program. These", 13
DB "sounds can be instruments, voices, WAV", 13
DB "files - anything you like! IT understands", 13
DB "a wide variety of sound files and even", 13
DB "allows you to take sounds directly from", 13
DB "other modules. Since there are no samples", 13
DB "currently loaded, press Enter to switch", 13
DB "to the load sample screen.", 0
TutorialDisplayState3 DB 0, 0, 79, 5
DB "A file called TUTE.IT was included with this tutorial. You should be able to", 13
DB "see it highlighted in the listing below. IT will hilight any file that it", 13
DB "recognises as a sound file. You can also navigate through your directories", 13
DB "from this menu. Select TUTE.IT and step into it by pressing Enter.", 0
TutorialDisplayState4 DB 2, 28, 45, 39
DB "Here you can see a list of all the samples", 13
DB "that are contained within TUTE.IT. To have", 13
DB "a listen to how they sound, press the down", 13
DB "arrow once to hilight the first sample and", 13
DB "press 'Q'. Try moving to the other samples", 13
DB "and playing them. Try pressing 'W', 'E',", 13
DB "'R'. You will notice that the samples are", 13
DB "played at a different pitch. Once you've", 13
DB "heard all of the samples, select the Bass", 13
DB "Drum and press Enter.", 0
TutorialDisplayState5 DB 36, 14, 78, 20
DB "OK! You have now loaded the Bass Drum", 13
DB "into memory. This means that you can use", 13
DB "it in your songs. Lets do that now!", 13, 13
DB "Press F2 to go to the pattern editor.", 0
TutorialDisplayState6 DB 33, 16, 78, 19
DB "The pattern editor is where you set out the", 13
DB "notes that you want to play. Press 'Q'", 0
TutorialDisplayState7 DB 33, 16, 78, 35
DB "So what does this mean?", 13, 13
DB "C-5 01 ", 173, 173, " .00", 13, 13
DB "C-5 means to play the note C at octave 5.", 13
DB "01 means to use sample number 1.", 13, 13
DB "If this doesn't make sense now, don't worry!", 13
DB "All of this will be explained later in this", 13
DB "tutorial.", 13, 13
DB "For now, try to enter a Bass Drum every four", 13
DB "rows in Channel 1 (ie. on row 4, 8, 12, ...)", 13, 13
DB "Continue to use 'Q' to enter the notes. The", 13
DB "arrow keys may be of assistance. If you make", 13
DB "a mistake, use the '.' key to blank out the", 13
DB "entry.", 0
TutorialDisplayState8 DB 33, 16, 78, 21
DB "OK, that's enough!", 13, 13
DB "Lets take a listen to what you've done.", 13
DB "Press F6 to play what you've entered.", 0
TutorialDisplayState9 DB 33, 16, 78, 23
DB "As the pattern is played to you, you will", 13
DB "notice that a cursor on the left hand side", 13
DB "of the screen indicates the current playback", 13
DB "position. Press F6 to watch that again.", 13, 13
DB "When you're ready, press F8 to stop playback", 0
TutorialDisplayState10 DB 33, 16, 78, 25
DB "To finish off the task of entering the Bass", 13
DB "Drum, move up one row to row 16 and press", 13
DB "Alt-4. This will cause the cursor to step", 13
DB "4 rows after every note that you enter", 13
DB "instead of 1.", 13, 13
DB "Hold down 'Q' until Channel 1 has a Bass", 13
DB "Drum every 4 rows until row 60.", 0
TutorialDisplayState11 DB 33, 16, 78, 21
DB "Now we'll add in a snare drum. Before we do", 13
DB "that though, set the cursor step back to", 13
DB "a single row at a time. Press Alt-1, then", 13
DB "F3 to go back to the sample list.", 0
TutorialDisplayState12 DB 36, 14, 78, 18
DB "To load a sample into the second sample", 13
DB "slot, first press the down arrow a single", 13
DB "time so that sample two is hilighted.", 0
TutorialDisplayState13 DB 36, 14, 72, 17
DB "Now press Enter to call up the Load", 13
DB "Sample screen.", 0
TutorialDisplayState14 DB 7, 25, 42, 28
DB "Select the Snare Drum and load it", 13
DB "(by pressing Enter).", 0
TutorialDisplayState15 DB 36, 14, 74, 17
DB "And now return to the Pattern Editor", 13
DB "(F2)", 0
TutorialDisplayState16 DB 36, 16, 78, 24
DB "Press Ctrl-PgUp to move to the top of", 13
DB "the pattern and enter a snare drum in", 13
DB "every 4th row starting at line 2.", 13
DB 13
DB "Use C-5 again, and to make it easier, you", 13
DB "can set the skip to 4 once you've moved", 13
DB "to line 2.", 0
TutorialDisplayState17 DB 34, 16, 78, 19
DB "Have a listen to what you've just created!", 13
DB "(Press F6)", 0
TutorialDisplayState18 DB 36, 16, 78, 28
DB "As part of this tutorial, we'll try out", 13
DB "one of the block functions that IT", 13
DB "offers. Our goal is to halve the speed", 13
DB "at which this plays just by modifying", 13
DB "the pattern data. IT has two functions", 13
DB "that will automatically halve or double", 13
DB "the length of a hilighted block.", 13, 13
DB "First, hilight channel 1.", 13
DB "Move to the top of the channel first", 13
DB "by pressing Ctrl-PgUp, then press Alt-L", 0
TutorialDisplayState19 DB 36, 16, 78, 26
DB "Alt-L is a function which will mark the", 13
DB "entire channel that your cursor is", 13
DB "currently on. Pressing it twice will", 13
DB "mark the entire pattern. For now, we", 13
DB "only need the first channel so you do", 13
DB "not need to press it a second time.", 13
DB 13
DB "Now that the block is marked, press", 13
DB "Alt-G to actually double the block size!", 0
TutorialDisplayState20 DB 36, 16, 78, 33
DB "Uhhh. Ooops!! That was supposed to be", 13
DB "Alt-F. No matter - the automatic undo", 13
DB "in IT will be able to recover our data.", 13
DB "(Yes, we could just double it twice and", 13
DB "everything would be perfectly fine, but", 13
DB "this is meant to teach you about IT,", 13
DB "right? [smile])", 13
DB 13
DB "Whenever you do a block function in IT", 13
DB "the contents of the entire pattern is", 13
DB "saved first. IT will store up to 10 of", 13
DB "these in memory so that you can recover", 13
DB "from any mistakes that you make.", 13
DB 13
DB "Press Ctrl-Backspace to pull up the", 13
DB "undo menu.", 0
TutorialDisplayStatexx DB 33, 16, 78, 21
DB "Incomplete...", 0
TuteFileName DB "TUTE.IT"
BassDrumText DB "Bass Drum"
SnareDrumText DB "Snare Drum"
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State0
Cmp AL, 9
Ret
EndP Tute_State0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State1
Cmp AL, 3
Ret
EndP Tute_State1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State2
Cmp AL, 13
Ret
EndP Tute_State2
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State3
Push Disk
Pop ES
Assume ES:Disk
Cmp ES:SamplesInModule, 1
JNE Tute_State3a
Mov DI, Offset InSampleFileName
Mov SI, Offset TuteFileName
Mov CX, 7
RepE CmpsB
Tute_State3a:
Ret
EndP Tute_State3
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State4
Call Music_GetSongSegment
Mov ES, AX
Mov DI, [ES:64912]
Mov SI, Offset BassDrumText
Add DI, 14h
Mov CX, 9
RepE CmpSB
Ret
EndP Tute_State4
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State5
Cmp AL, 2
Ret
EndP Tute_State5
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State6
Cmp Word Ptr [FS:0], 13Ch
Ret
EndP Tute_State6
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State7
Cmp Word Ptr [FS:320*16], 13Ch
Ret
EndP Tute_State7
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State8
Call Music_GetPlayMode
Cmp AX, 1
Ret
EndP Tute_State8
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State9
Call Music_GetPlayMode
Test AX, AX
Ret
EndP Tute_State9
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State10
Cmp Word Ptr [FS:60*320], 13Ch
Ret
EndP Tute_State10
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State12
Call PE_GetLastInstrument
Cmp BX, 1
Ret
EndP Tute_State12
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State14
Call Music_GetSongSegment
Mov ES, AX
Mov DI, [ES:64914]
Mov SI, Offset SnareDrumText
Add DI, 14h
Mov CX, 10
RepE CmpSB
Ret
EndP Tute_State14
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_StateEnd
Inc AX ; Ensure zero flag is not set.
Ret
EndP Tute_StateEnd
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State16
Cmp Word Ptr [FS:62*320], 23Ch
Ret
EndP Tute_State16
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State18
Cmp [Word Ptr GS:LastKeyboard1+2], 2600h
Ret
EndP Tute_State18
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Tute_State19
Cmp [Word Ptr GS:LastKeyboard1+2], 2200h
Ret
EndP Tute_State19
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Glbl_TutorialHandler Far
PushAD
Push DS
Push CS
Pop DS
Assume DS:Glbl
Push Pattern
Pop GS
Mov FS, [GS:PatternDataArea]
Assume FS:Nothing
Mov BX, [TutorialState]
Mov AL, CurrentMode
LEA SI, [EBX+EBX]
Push BX
Call [TutorialFunctionArray+SI]
Pop BX
JNE Glbl_TutorialHandler1
Inc BX
Glbl_TutorialHandler1:
Mov [TutorialState], BX
Cmp BX, MAXTUTESTATE
JAE Tute_TuteFinished
Xor AX, AX
LEA SI, [EBX+EBX]
Mov SI, [TutorialInfoArray+SI]
LodsB
Push AX
LodsB
Push AX
LodsB
Push AX
LodsB
Push AX
Mov AL, 30
Push AX
Call S_DrawBox
Add SP, 10
Mov AL, 80
Mul Byte Ptr [SI-3] ; y*80
Add AL, Byte Ptr [SI-4]
AdC AH, 0
LEA DI, [EAX+EAX]
Add DI, (80+1)*2
Mov AH, 13h
Call S_DrawString
Tute_TuteFinished:
Pop DS
PopAD
Ret
EndP Glbl_TutorialHandler
Assume DS:Nothing, FS:Nothing
EndS
ENDIF
End

226
IT_VESA.ASM Normal file
View File

@ -0,0 +1,226 @@
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Vesa Module ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³ Functions provided: ³
;³ DetectVESA ³
;³ SetVESAMode ³
;³ ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³ DetectVESA ³
;³ - No parameters required ³
;³ - Detects the presence of a VESA driver ³
;³ - Returns carry SET if no VESA driver found ³
;³ - Returns carry CLEAR if VESA driver found ³
;³ - All registers preserved ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³ SetVESAMode ³
;³ - Requires AX = VESA Mode ³
;³ - Returns carry SET if VESA Mode isn't supported ³
;³ - Returns carry CLEAR if VESA mode change OK ³
;³ - All registers preserved ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³ VESAGetInfo ³
;³ - Requires AX = VESA Mode to get information on ³
;³ - Returns carry SET if VESA Mode isn't supported ³
;³ - Returns carry clear if information is OK ³
;³ - Returns ES:DI to Table, all other registers preserved ³
;³ ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Jumps
.386P
include switch.inc
IF SPECTRUMANALYSER
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Globals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Segment Vesa BYTE Public 'Code' USE16
Assume CS:Vesa, DS:Nothing
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
VESAInformationTable Label
VESASignature DB 4 Dup (0)
VESAVersion DW 0
VESAOEMStringPrt DD 0
VESACapabilities DD 0
VESAVideoModePtr DD 0
VESATotalMemory DW 0
DB 256-($-VESAInformationTable) Dup(0)
VESAModeInformationTable Label
DB 256-($-VESAModeInformationTable) Dup (0)
ModeInformationStructure Struc
ModeAtributes DW ?
WindowAAtributes DB ?
WindowBAttributes DB ?
WindowGranularity DW ?
WindowSize DW ?
WindowASegment DW ?
WindowBSegment DW ?
WindowFunction DD ?
BytesPerScanLine DW ?
XResolution DW ?
YResolution DW ?
XCharacterSize DB ?
YCharacterSize DB ?
NumberOfPlanes DB ?
BitsPerPixel DB ?
NumberOfBanks DB ?
MemoryModel DB ?
BankSize DB ?
NumberOfImagePages DB ?
Reserved DB ?
RedMaskSize DB ?
RedFieldPosition DB ?
GreenMaskSize DB ?
GreenFieldPosition DB ?
BlueMaskSize DB ?
BlueFieldPosition DB ?
RSVDMaskSize DB ?
DirectColourModeInfo DB ?
ModeInformationStructure EndS
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Proc VESA_Detect Far
Public VESA_Detect
PushA
Push ES
Mov AX, 4F00h
Push CS
Pop ES
Mov DI, Offset VESAInformationTable
Int 10h
Cmp AX, 4Fh
JNE DetectVESA1
Cmp [DWord Ptr ES:DI], "ASEV" ; 'VESA' identification
JNE DetectVESA1
DB 85h
DetectVESA1:
StC
Pop ES
PopA
Ret
EndP VESA_Detect
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc VESA_SetMode Far
Public VESA_SetMode
PushA
Push DS
Push ES
Call VESA_GetInfo
JC VESA_SetMode3
Mov BX, AX
Mov AX, 4F02h ; Set Mode
Int 10h
Cmp AX, 4Fh
JE VESA_SetMode3
StC
VESA_SetMode3:
Pop ES
Pop DS
PopA
Mov CX, [VESAModeInformationTable.XResolution]
Mov DX, [VESAModeInformationTable.YResolution]
Ret
EndP VESA_SetMode
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc VESA_GetInfo
Public VESA_GetInfo
Push AX
Push CX
Mov CX, AX
Push CS
Pop ES
Mov DI, Offset VESAModeInformationTable
Mov AX, 4F01h
Int 10h
Cmp AX, 4Fh
JE VESA_GetInfo1
StC
VESA_GetInfo1:
Pop CX
Pop AX
Ret
EndP VESA_GetInfo
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc VESA_SetBlock Far ; Gives access to a 64kb block
Public VESA_SetBlock ; Given AX = block number.
PushA
Push AX
Mov AX, 64
Xor DX, DX
Div Word Ptr [VESAModeInformationTable.WindowGranularity]
Mov DX, AX
Pop AX
Mul DX
Mov DX, AX
Xor BX, BX
Call DWord Ptr [VESAModeInformationTable.WindowFunction]
PopA
Ret
EndP VESA_SetBlock
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
EndS
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
ENDIF
End

9
MAKEFILE.MAK Normal file
View File

@ -0,0 +1,9 @@
IT.EXE: IT.OBJ IT_DISK.OBJ IT_DISPL.OBJ IT_EMS.OBJ IT_ERR.OBJ IT_F.OBJ IT_G.OBJ IT_H.OBJ \
IT_I.OBJ IT_K.OBJ IT_L.OBJ IT_M.OBJ IT_NET.OBJ IT_MSG.OBJ IT_MUSIC.OBJ IT_NET.OBJ IT_OBJ1.OBJ IT_PE.OBJ IT_S.OBJ \
IT_TUTE.OBJ IT_MMTSR.OBJ IT_MOUSE.OBJ IT_MDATA.OBJ IT_FOUR.OBJ IT_VESA.OBJ
tlink /3 /s /v @source.lst
.ASM.OBJ:
# TASM /Zi /m /uT310 /jSMART $*.asm
TASM /m /uT310 /jSMART $*.asm

32
NETWORK.INC Normal file
View File

@ -0,0 +1,32 @@
IF NETWORKENABLED
Extrn Network_GetSendQueue:Far
Extrn Network_FinishedSendQueue:Far
Extrn Network_AddWordToQueue:Far
Extrn Network_EnsureNoNetwork:Far
Extrn Network_SendSampleHeader:Far
Extrn Network_SendInstrumentHeader:Far
Extrn Network_QueueSampleData:Far
Extrn Network_SendSongDataInformation:Far
NETWORK_PARTIALPATTERNOBJECT EQU 0
NETWORK_ENTIREPATTERNOBJECT EQU 1
NETWORK_REQUESTPATTERNOBJECT EQU 2
NETWORK_SONGDATAOBJECT EQU 3
NETWORK_INSTRUMENTHEADEROBJECT EQU 4
NETWORK_SAMPLEHEADEROBJECT EQU 5
NETWORK_SETPATTERNLENGTH EQU 6
NETWORK_DELETESAMPLEOBJECT EQU 7
EnsureNoNetwork EQU Call Network_EnsureNoNetwork
NetworkSendSample EQU Call Network_SendSampleHeader
NetworkSendInstrument EQU Call Network_SendInstrumentHeader
ELSE
EnsureNoNetwork EQU ;
NetworkSendSample EQU ;
NetworkSendInstrument EQU ;
ENDIF

1703
PE_TRANS.INC Normal file

File diff suppressed because it is too large Load Diff

44
SWITCH.INC Normal file
View File

@ -0,0 +1,44 @@
TRACEENABLED EQU 0
TUTORIAL = 0
EMSUSE41 = 0
SHOWVERSION = 0
SHOWREGISTERNAME = 1
USE32BITSCREENCOPY = 0
SORTENABLED = 1
DDCOMPRESS = 1
ORDERSORT = 1
FILTERENVELOPES = 1
CHORDENTRY = 1
SPECTRUMANALYSER = 1
SAVESAMPLEWAV = 1
ENABLEPRESETENVELOPES = 1
ENABLESOLO = 1
DEFAULTFORMAT = 3 ; 0 = IT214, 1 = S3M, 2 = IT2xx, 3 = IT215
USEFPUCODE = 1 ; For IT_MUSIC, this will change from LUT to FPU code
OLDDRIVER = 0
MUSICDEBUG = 0
EMSDEBUG = 0
MEMORYDEBUG = 0
ENABLEINT3 = 0 ; For debugging.
TIMERSCREEN = 1
NETWORKENABLED = 1
SHOWPATTERNLENGTH = 0
IF TUTORIAL
SORTENABLED = 1
DDCOMPRESS = 1
ENDIF
TRACKERVERSION = 217h ; Still have to change text in IT.ASM, IT_F.ASM

1
USERNAME.INC Normal file
View File

@ -0,0 +1 @@
REGISTERNAME EQU "Unregistered"

22
WAVSWITC.INC Normal file
View File

@ -0,0 +1,22 @@
REGISTERED = 1
VOLUMERAMP = 1
DOUBLEVOLUME = 0
DITHEROUTPUT = 1
USECLICKFADETHRESHHOLD= 0
CLICKFADETHRESHHOLD = 4096
RAMPSPEED = 8
RAMPCOMPENSATE = 255
CUBICINTERPOLATION = 1
QUADRATICINTERPOLATION = 0
LINEARINTERPOLATION = 0
POINTSAMPLED = 0
INTELOPTIMISED = 0
FileID DW 0

1
source.lst Normal file
View File

@ -0,0 +1 @@
it it_disk it_displ it_ems it_err it_f it_g it_h it_i it_k it_l it_m it_music it_net it_obj1 it_pe it_s it_mouse It_MMTSR It_msg IT_TUTE it_mdata it_four it_vesa