Initial import of IT.EXE source files
This commit is contained in:
parent
d637fa0762
commit
2939e690a2
|
@ -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
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
||||||
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
REGISTERNAME EQU "Unregistered"
|
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue