initial commit

This commit is contained in:
'mr software' 2024-01-30 11:24:04 -08:00
commit ed75530a63
291 changed files with 248669 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
it/*.OBJ
it/*.DRV
it/*/*.OBJ
it/*/*.DRV

8
README.md Normal file
View File

@ -0,0 +1,8 @@
# dos porting vm
### le contenu
- `*.c` - main source
- `r.bat` - configures dosbox path for building impulse tracker
- `it` - impulse tracker source. bsd license, cloned from https://github.com/herrnst/impulsetracker
- `tasm` - assembler required to build impulse tracker

BIN
it/.DS_Store vendored Normal file

Binary file not shown.

4
it/.hgignore Normal file
View File

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

107
it/DEBUG.INC Normal file
View File

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

1147
it/IT.ASM Normal file

File diff suppressed because it is too large Load Diff

BIN
it/IT.EXE Normal file

Binary file not shown.

1554
it/IT.MAP Normal file

File diff suppressed because it is too large Load Diff

BIN
it/ITMIDI.CFG Normal file

Binary file not shown.

10940
it/IT_DISK.ASM Normal file

File diff suppressed because it is too large Load Diff

4485
it/IT_DISPL.ASM Normal file

File diff suppressed because it is too large Load Diff

1126
it/IT_D_INF.INC Normal file

File diff suppressed because it is too large Load Diff

771
it/IT_D_RI.INC Normal file
View File

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

1498
it/IT_D_RIS.INC Normal file

File diff suppressed because it is too large Load Diff

2889
it/IT_D_RM.INC Normal file

File diff suppressed because it is too large Load Diff

1785
it/IT_D_WM.INC Normal file

File diff suppressed because it is too large Load Diff

973
it/IT_EMS.ASM Normal file
View File

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

168
it/IT_ERR.ASM Normal file
View File

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

5950
it/IT_F.ASM Normal file

File diff suppressed because it is too large Load Diff

612
it/IT_FOUR.ASM Normal file
View File

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

1026
it/IT_G.ASM Normal file

File diff suppressed because it is too large Load Diff

1552
it/IT_H.ASM Normal file

File diff suppressed because it is too large Load Diff

9023
it/IT_I.ASM Normal file

File diff suppressed because it is too large Load Diff

1812
it/IT_K.ASM Normal file

File diff suppressed because it is too large Load Diff

559
it/IT_L.ASM Normal file
View File

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

664
it/IT_M.ASM Normal file
View File

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

3652
it/IT_MDATA.ASM Normal file

File diff suppressed because it is too large Load Diff

1028
it/IT_MMTSR.ASM Normal file

File diff suppressed because it is too large Load Diff

1412
it/IT_MOUSE.ASM Normal file

File diff suppressed because it is too large Load Diff

1031
it/IT_MSG.ASM Normal file

File diff suppressed because it is too large Load Diff

7481
it/IT_MUSIC.ASM Normal file

File diff suppressed because it is too large Load Diff

2945
it/IT_M_EFF.INC Normal file

File diff suppressed because it is too large Load Diff

2722
it/IT_NET.ASM Normal file

File diff suppressed because it is too large Load Diff

8902
it/IT_OBJ1.ASM Normal file

File diff suppressed because it is too large Load Diff

12312
it/IT_PE.ASM Normal file

File diff suppressed because it is too large Load Diff

140
it/IT_PE_V.INC Normal file
View File

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

1685
it/IT_S.ASM Normal file

File diff suppressed because it is too large Load Diff

90
it/IT_TIMER.INC Normal file
View File

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

519
it/IT_TUTE.ASM Normal file
View File

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

226
it/IT_VESA.ASM Normal file
View File

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

View File

@ -0,0 +1,279 @@
Host Channel Structure
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿
0000:³ Flags ³Msk³Nte³Ins³Vol³Cmd&Val³OCm&Val³VCm&Val³MCh³MPr³Nt2³Smp³
ÃÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄ´
0010:³DKL³EFG³O00³I00³J00³M00³N00³P00³Q00³T00³S00³OxH³W00³VCE³GOE³SFx³ GOE = Gxx
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÁÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄ´ with old
0020:³HCN³CUC³VSe³LTr³SCOffst³PLR³PLC³PWF³PPo³PDp³PSp³LPn³LVi³CP ³CV ³ effects
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄ´
0030:³VCh³TCD³Too³RTC³Porta Frequency³VWF³VPo³VDp³VSp³TWF³TPo³TDp³TSp³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
0040:³ Misc Effect Data............................................. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Flags:
þ Update Mode
ù 2 Bits (0-3)
ú 0: Don't update effect
ú 1: Update effect if channel is on
ú 2: Always update effect
þ Channel On
ù 1 Bit (4)
ú 0: Channel is off
ú 1: Channel is on
þ Channel Cut ; No longer implemented
ù 1 Bit (8)
ú 0: No Channel Cut command
ú 1: Channel Cut command issued
þ Slide in progress (Commands G/L)
ù 1 Bit (16)
ú 0: No slide in progress
ú 1: Slide in progress
þ Freeplay note (ie. Don't check channel on/off)
ù 1 Bit (32)
ú 0: Not freeplay -> Check channel
ú 1: Freeplay -> Don't check channel
+64 = row updated.
+ 128 = Apply random volume
+256 Volume column effect requires updating if channel on
+512 Volume column effect requires updating always.
+32768 = Dont' touch in interrupt!
þ Decoding Data
ù Msk, Nte, Ins, Vol, Cmd&Val, ONt, OIn, OVl, OCm&Val
Msk = Read mask: Bit 0 or 4 = Note read
Bit 1 or 5 = Instrument read
Bit 2 or 6 = Volume read
Bit 3 or 7 = Command/Command Value read
þ Smp & Nt2
ù Sample Number (zero based) and Note (after translation if using inst.)
þ CP. = Channel Pan
þ CV. = Channel Volume
þ SCN = Slave Channel Number
þ CUC = Command Update Count. For playmode 0
þ SCOffst = Slave channel number offset
þ VWF = Vibrato wave form
þ TWF = Tremelo wave form
þ PWF = Panning wave form
PLR = Pattern loop row
PLC = pattern loop count.
VSe = Volume set
LVi = Last vibrato.
LTr = Last tremelo.
Dir = Porta direction
RTC = Retrig count
Too = tremor on/off ; on = 1
TCD = tremor count down
OxH = High order Offset for yxx00h
VCh = Volume change (For Command D)
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Slave Channel Structure
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000:³ Flags ³ Device specific...............³LpM³LpD³ Left Volume ³
ÃÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄÁÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
0010:³ Frequency ³ Frequency Set ³Bit³ViP³ViDepth³ RVol/MIDIFSet ³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
0020:³FV ³Vol³VS ³CVl³SVl³FP ³FadeOut³DCT³DCA³Pan³PS ³OldSampleOffset³
ÃÄÄÄÁÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÁÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÁÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄ´
0030:³InsOffs³Nte³Ins³SmpOffs³Smp³FPP³HCOffst³HCN³NNA³MCh³MPr³ MBank ³
ÃÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÅÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÁÄÄÄÅÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄ´
0040:³ Loop Beginning³ Loop End ³SmpErr.³16bVol ³ Sample Offset ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ´
0050:³VEnvelopeValue ³VEnvelopeDelta ³VEnvPos³CurVEnN³NextVET³filtera³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
0060:³PEnvelopeValue ³PEnvelopeDelta ³PEnvPos³CurVEnN³NextPET³filterb³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
0070:³PtEnvelopeValue³PtEnvelopeDelta³PtEvPos³CurPtEN³NxtPtET³filterc³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ
For MIDI, [SI+0Bh] = Pattern note
Reqd values: VEnvValue (DWord), VEnvDelta (DWord), VEnvPos (Word), NextVEnvNode
PEnvValue (DWord), PEnvDelta (DWord), PEnvPos (Word), NextPEnvNode
PtEnvValue (DWord), PtEnvDelta (DWord), PtEnvPos (Word), NextPtEnv
Reqd flags: VolEnvOn, PEnvOn, PtEnvOn
FP = final pan.
FPP = final playing pan, taking into account reverse.
MBank also doubled as Filter freq, resonance
Flags:
þ Channel On
ù 1 Bit (1)
ú 0: Channel is off
ú 1: Channel is on
þ Recalculate panning (2)
þ Note Off (ie. Sustain)
ù 1 Bit (4)
ú 0: No Note Off command (ie. Sustain on)
ú 1: Note Off command issued (ie. Sustain off)
þ FadeOut
ù 1 Bit (8)
ú 0: No FadeOut command
ú 1: Apply FadeOut
þ Recalculate volume
ù 1 Bit (16)
ú 0: Volume doesn't need to be calculated
ú 1: Volume needs to be recalculated
þ Frequency change
ù 1 Bit (32)
ú 0: Frequency has NOT changed
ú 1: Frequency HAS changed
þ Recalculate Final volume...
ù 1 Bit (64)
ú 0: Final volume does not need to be calculated
ú 1: Final volume DOES need to be calculated.
þ Central pan...
ù 1 Bit (128)
ú 0: Use whatever is given.
ú 1: Always use central pan (for sample list/instrument list)
þ New note!
ù 1 Bit (256)
ú 0: No new note
ú 1: New note to play.
þ Note stop (cut) ; IMPORTANT FOR GUS!!!
ù 1 Bit (512)
ú 0: note NOT cut
ú 1: Note CUT
þ Loop changed. (1024)
þ Channel muted (2048) ; 2^11
þ Vol Envelope on (4096) ; 1000h
þ Pan Envelope on (8192) ; 2000h
þ Pitch Envelope on (16384) ; 4000h
þ Pan value changed ; 8000h
Recalculate final pan
LpM
þ LoopMode
ù 0: No Loop
ù 8: Forwards Loop
ù 24: Ping Pong Loop ; Values are just for GUS convenience
LpD
þ LoopDirection (for ping pong), ; 0 = forwards, 1 = backwards.
þ FadeOut = Fadeout Count (0-255)
þ CVl = Channel Volume
þ HCN = Host Channel Number. +128 if "disowned"
þ Smp = Sample number
þ Pan: 0->64, 100 = Surround, >= 128 = muted.
þ FnV: Final Volume
þ Bit: 2 = 16, 0 = 8.
þ ViD: Vibrato Depth
þ ViS: Vibrato Speed
þ VEP: Volume Envelope position
þ VEV: Volume Envelope value
þ Ins: Instrument number (0 based, 0FFh if none)
þ Smp: Sample number (0 based)
þ Frequency = Final note frequency. Incorportes vibrato
þ Frequency Set = Calculated Frequency of note. Calculated once when played
Altered by effects E,F,G,L
þ VS = Volume Set. Similar to Frequency Set. Affected by D,K,L
þ Vol = Volume. Altered by effects R,I
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Sound Blaster Output Structure
0 1 2 3 4 5 6 7 8 9
ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂ
0000:³(Flags)³ Skip Value ³Vol³ x ³MixMode³
ÃÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÅ
For non-looped samples, 44h is LENGTH.
Sound Blaster Pro Output Structure
0 1 2 3 4 5 6 7 8 9
ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂ
0000:³(Flags)³ Skip Value ³LVl³RVl³MixMode³
ÃÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÅ
Skip Value
þ 16.16 bit fixed point
Vol/LVl/RVl
þ Output Volume / Left Volume / Right Volume
ù Accounts for:
ú Channel Volume
ú Global Volume
ú Sample Global Volume
ú Fade Out
MMd: 0 If Left only
1 If right only
2 if Left = Right
3 if Panned
4 if Surround
5 if position update.
+32 for 16 bit samples
+8 for looped
+24 for ping pong.
UltraSound Output Structure
0 1 2 3 4 5 6 7 8 9
ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂ
0000:³(Flags)³LastVol³Freqval³ ³
ÃÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅ
Frequency Value used in dynamic GUS drivers
AWE32 Output Structure
0 1 2 3 4 5 6 7 8 9
ÚÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂ
0000:³(Flags)³ x ³ x ³ Freqvalue ³ ³
ÃÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅ
Frequency Value used in floating point AWE32 drivers
SAM Output Structure
0 1 2 3 4 5 6 7 8 9
ÚÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂ
0000:³(Flags)³opn³ x ³ ³ ³ ³ ³ ³
ÃÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÅ
opn = 1 if voice is opened, 0 if not.

View File

@ -0,0 +1,54 @@
Configuration file for IT.EXE
Offset Length Meaning
0 70 Module directory
70 70 Sample directory
140 70 Instrument directory
210 1 Keyboard style <not used any more!>
211 3*16 Palette information
259 50 Display window setup
Structure is 6*8 bytes, followed by 1 word = number of windows
Structure of each 8 byte record is:
Word: Method. (0 = volume bars, 1 = 5 track view, etc)
Byte: Top channel
Byte: Top line on screen
Word: Length of window
Word: Display memory offset of top left of window.
309 217 bytes so far Pattern edit setup.
Offset (W = word, B = byte)
309 W - MUST be 0 (key signatures not defined)
311 W - number of channels to edit (5, but recalculated
whenever the screen changes)
313 B - Row hilight minor (eg. every 4)
314 B - Row hilight major (eg. every 16)
315 B - Edit mask. Bit 0 = edit ins, 1 = edit vol, 2 = edit FX
316 B - View division (1= show divisions)
317 W - Number of 'viewed' channels
319 100W - Channel viewmethods. First word = channel
Second word = method
Methods: 0 = full edit
1 = compressed edit
2 = extra compressed edit
3 = 3-character selective edit
4 = 2 character selective edit
0FFFFh indicates end of list
519 B - View-channel cursor tracking (1 = on)
520 B - Effect/Effectvalue link (1 = on)
521 B - Flags. Bit 0 = centralise cursor
Bit 1 = hilight current row
Bit 2 = fast volume changes
Bit 3 = MIDI Quantize to tick
Bit 4 = MIDI program base 1
Bit 5 = MIDI record note-offs
Bit 6 = MIDI record velocity
Bit 7 = MIDI Record aftertouch
522 B - MIDIAmplification
523 B - MIDICentral note
524 W - Fast volume amplification

View File

@ -0,0 +1,143 @@
Here's something that might help you... I wrote it quite fast but it should
be accurate ;) However, there's probably a lot of stuff here that you don't
need/understant for now... but keep all this, you'll need it soon ;)
--> This is NOT the "official" Tehcnical stuff....
File Header:
offset type/size comment
------ --------- ---------------------------------
0 char[8] Signature: 'ziRCONia'
8 word file header size (from offset 10, not counting this
word)
10 word version 0xyyzh (x.yy) (displayed in hex. no conversion)
z: 0 nothing
1-0eh revision a to n (-may- be useful...)
0fh Beta
12 word number of blocks within file
14 dword total length of unpacked file
18 dword file offset where is located the "block offset table"
22 word dummy... must currently be 0ffffH
The block offset table is simply N_of_Block dwords which are the
absolute position of each block in the file. Each of those blocks have
the following header:
0 dword unpacked size
4 dword compressed size
8 dword XOR check (see note below)
12 word number of "sub-blocks" (nblk)
14 word flags (see below)
16 word number of translation table entry } for compression
18 word start number of bit } don't mind them
for now...
20 sub-block[nblk] Sub-blocks of data info.
each sub-block has the following info:
0 dword absolute position in uncompressed file
4 dword size of uncompressed block
all "nblk" sub-block info are stored right after the block header.
Those small blocks are only non-contiguous blocks of the "same type"
grouped together within one bigger block for better compression.
- XOR check: instead of implementing a CRC, I coded a XOR check.
How it works: a dword variable is set to 0, and XORed
with every complete 4 bytes of the original data of the
"bigblock". Remaining bytes (i.e, size of bigblock is
not a multiple of 4) are simply ignored. This is only
to implement a minimal check of destination when
decompressing.
- Flags: this is a 16 bits field:
15 14 13 12 11 10 9 8
ÚÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ¿
³ 0 ³ 0 ³ 0 ³ 0 ³ 0 ³ 0 ³Abs16³ M/S ³
ÀÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÙ
7 6 5 4 3 2 1 0
ÚÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ¿
³ R ³ T y p e ³ R ³ 8/16³Delta³Comp.³
ÀÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÙ
bits marked as "0" MUST be 0 (they are reserved for future
extensions...) Every "1" must be considered as invalid or
unsupported feature (compressed by a newer version of MMCMP)
bits marked as "R" are reserved (used during compression processing
and they don't mean much within the file...) No check should be
performed on those bits.
- Comp.: 0: not compressed
1: compressed
- Delta: 0: data is not changed
1: data is Delta (every byte or word is the difference
between itself and the previous one. First byte or word
is compared to 0.
- 8/16: 0: 8 bits compression scheme
1: 16 bits compression scheme
- M/S: 0: mono
1: stereo (not implemented yet) MUST BE 0
- Abs16 Whithin compression algorithm, 16 bits samples are
converted to deltas and transformed a bit so there's
no negative numbers. However, some trackers already
convert data to deltas, but there's still the little
transformation to do.
0: don't do it
1: do it
Note: This bit IS NOT checked if Delta bit is 1, but
should be 0 in this case. May only be set if
Delta bit is 0.
- Type: This field doesn't really serve any purpose ;) but
helping identify type of data in this block. There's
no strict identifier but the following block types are
used by MMCMP (warning: do not expect the following to
always be true... data of different types for us (e.g
instrument header and sample header) may be interpreted
as the same type of block (they are contiguous, or
similar, etc...) for better compression.) The three
bits are stored in the order you would expect (MSB at
left, LSB at right)
0: Module identifier: the firsts bytes of a module
(this type must NOT be used for anything else...)
1: Module header: anything useful in the header, which
is not in block-type 0 (actually not used by MMCMP)
2: instrument header
3: sample header
4: patterns
5: sample
6: no definition yet...
7: remaining (every part of the module that hasn't
been thrown into the "block list" (i.e probably
don't fit under any block types...)
Note that MMCMP sorting scheme puts block of type 0
first and type 7 last. This is also some sort of
priority. As for now, know that block of type 0 is
UNIQUE and is the FIRST.
Scanning files:
1. Check if installed and disable MMTSR
2. Open module
3. Check signature. If not 'ziRCONia' jump to 11
4. read "block offset table" offset field (dword at offset 18)
(and any other info you would like to read)
5. jump to this position within the file
6. read the first entry of the table (position of block 0)
7. jump to this position within the file
8. read the block header.
9. If block-type field is not 0, jump to 6 and read the next entry
instead. (the first block should be of type 0. If not, there's
probably no block of this type...)
10.Read the uncompressed data (it should not have the compressed flag
set)
11.reenable MMTSR if installed
12.Do what you would do with the header info and close module if you
wish...

View File

@ -0,0 +1,126 @@
Network protocol for Impulse Tracker
Impulse Tracker will only interface with similar versions of IT.
Block format
Offset Size Meaning
0 Word Block type
2 Word Block length
4 Data Basic data, depending on block type.
x+[2] Word CRC Check
Block types
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 0 - Acknowledge receipt - targeted
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Word Block type received
2 Word Status
Status: Bit 0 = Off = OK, On = resend
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 1 - Ping
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 String "Impulse Tracker 2.?? Ping Packet"
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 2 - Pattern data packet - global
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Byte Pattern number
1 Byte Row
2 Byte Column
3 Byte Data mask
4 Varies Data
Data mask
Bit 0: Note
Bit 1: Instrument
Bit 2: Volume
Bit 3: Effect
Bit 4: Effect data
Absence of information does NOT imply clearing.
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 3 - Pattern data block packet - global
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Byte Pattern number
1 Byte Block width
2 Byte Block height
3 Varies Data
Data is a block_width * block_height array as structured:
Data mask:
Bit 0: Note
Bit 1: Instrument
Bit 2: Volume
Bit 3: Effect
Bit 4: Effect data
Absence of information DOES imply clearing.
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 4 - "Song Segment variable" modification - global
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Word Offset in SongSegment
2 Word Length of data
4 Varies Data
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 5 - Sample data - global
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Word Sample number
4 DWord Offset in sample
8 Varies Data
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Block type 6 - Chat packet - targeted/global
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Offset Size Meaning
0 Word Length of data
2 Varies Data
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Functions required of the drivers
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Initialise - basic setup code. Return error if driver unavailable in current
environment.
Connect Interface - provides connection interface, sets up a tracking
connection, returns a handle
Management Interface - provides management interface for connection,
status information etc.
Disconnect - shut down a tracking connection to a particular handle
MaximumPacketSize - returns the maximum size in bytes that the driver can
process at any time.
Send data - given handle (0 = send to all), data packet (a maximum size as
returned by MaximumPacketsize)
Receive data poll - called frequently by the main program to check for
incoming data. Approx. 2nd highest priority (after
sound driver IRQ)
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Functions provided to the drivers
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
ProcessDataReveived - called when any data is received.
UnloadDriver - remove driver from memory (when no connections exist any longer)
Alert - when data is not being transferred.

View File

@ -0,0 +1,233 @@
Object Types
Type 0: Box
Offset 0: DW 0
Offset 2-5: DB Left/Top/Right/Bottom coordinates
Offset 6: DB Style.
Style Variables
0: Thin box, dark all around
1: Thin box, light all around
2: Thick box, dark all around
3: Thick box, light all around
4: Thin box, 'Up'
5: Thin box, 'Down'
6: Thick box, 'Up'
7: Thick box, 'Down'
8: Within thin box, 'Up'
9: Within thin box, 'Down'
10: Within thick box, 'Up'
11: Within thick box, 'Down'
12: Within thin box, dark }
13: Within thin box, light } Empty boxes.
14: Within thick box, dark }
15: Within thick box, light }
+16 = empty within.
Type 1: Text
Offset 0: DW 1
Offset 2,3: DB X/Y coordinates
Offset 4: DB Colour
Offset 5: [Text]
Type 2: Button
Offset 0: DW 2
Offset 2-9: DW Up/Down/Left/Right associations
Offset 10: DW ButtonUsageType
Offset 12-15: [UsageType Data]
Offset 16: DW ButtonEffectType
Offset 18-27: [ButtonEffectType Data]
Offset 28-31: DB Left/Top/Right/Bottom coordinates
Offset 32: DB Button Style (refer to box style)
Offset 33: DB Button flags
Bit 0: Up/Down flag (0=up, 1=down)
Bit 1:
Offset 34: [Button Text]
ButtonUsageType Variable
0: Normal press-release buttons
Data: None
1: Toggle press/release buttons
Data: None
2: Radio button effect (one of selection)
Data: DW Min list range, Max list range
ButtonEffectType
0: Return Value
Data: DW Return Value
1: New Object List
Data: DD DWord Ptr ObjectList
2: Call Function
Data: DD DWord Ptr Function
3: Set Button variable
Data: DW VariableOffset
DW Value
4: Jump to Function
Data DD DWord Ptr Function
5: Set variable
Data DD DWord Ptr Function, returning ES:DI with mem location
DW Value to set it to/check for
DW 2 * Value to pass to function
6: Check variable, and jump to function
Data DD DWord Ptr Function, returning ES:DI with mem location
DW Value to set it to/check for
DD Function to jump to
Type 3: Empty
Type 4: Empty
Type 5: Select Direct Screen
Offset 0: DW 5
Offset 2: DB Mode (0=Buffered, 1=Direct)
Type 6: Redefine Characters
Offset 0: DW 6
Offset 2: DW FirstCharacterToDefine
Offset 4: DW NumberOfCharactersToDefine
Offset 6: [CharacterDefinitionTable]
Type 7: Empty
Type 8: Call Far Function
Offset 0: DW 8
Offset 2: DD DWord Ptr (Pre)Function
Type 9: Thumb bar
Offset 0: DW 9
Offset 2: DB X/Y coordinates
Offset 4: DW MinRange, MaxRange
Offset 8: DW WriteData1, WriteData2
Offset 12: DW Up/Down/Tab/Shift-Tab associations
DW PgUp/PgDn
WriteData1:
0:Panning
1:GetPEVariables
2:Sample Variables
3:GetMusicVariables (Song)
4:Channel Volume settings
5:LoadSampleVariables
6:InstrumentVariables
7:Screen Variables (eg. palette)
8:Inst (segment) variable
9:Driver segment, WriteData2 = offset
Type 10: Infoline
Offset 0: DW 10
Offset 2: [Text]
Type 11: Set help context
Offset 0: DW 11
Offset 2: DW HelpContextNumber
Type 12: OrderListData
Offset 0: DW 12
Offset 2: DB X/Y coordinates
Offset 4: DW Length of list (vertical)
Offset 6-9: DW Left/Right associations
Type 13: 3 Num Entry
Offset 0: DW 13
Offset 2: DB X/Y coordinates
Offset 4: DW Ptr Info 1
Offset 6: DW Ptr Info 2
Offset 8: DD DWord Ptr CheckFunction (0=none)
Offset 12: DW Up/Down/Right/Left associations
Ptr Info 1:
0: Instrument header. Ptr Info 2 = offset
Type 14: Scalable Thumb bar
Offset 0: DW 14
Offset 2: DB X/Y coordinates
Offset 4: DW MinRange, MaxRange
Offset 8: DW WriteData1, WriteData2
Offset 12: DW Up/Down/Tab/Shift-Tab associations
DW PgUp/PgDn
Offset 24 DW DisplayLength
WriteData1:
0:Panning
1:GetPEVariables
2:Sample Variables
3:GetMusicVariables (Song)
4:Channel Volume settings
5:LoadSampleVariables
6:InstrumentVariables
7:Screen Variables (eg. palette)
8:Inst (segment) variable
9:Driver segment, WriteData2 = offset
Type 15: Call Far Function 2
Offset 0: DW 15
Offset 2: DD DWord Ptr PreFunction
Offset 6: DD DWord Ptr DrawFunction
Offset 10: DD DWord Ptr Postfunction
Type 16: String Input
Offset 0: DW 16
Offset 2: DB X/Y coordinates
Offset 4: DW LocationFunctionNumber1, LocationFunctionNumber2
Offset 8: DW Size (Length, including terminating null)
Offset 10: DD DWord Ptr FunctionOnEnter (0 = no function)
Offset 14: DW Up/Down/Tab/Shift-Tab associations
LocationFunctionNumber1
0: Disk segment, LFN2 = Offset
1: SamplePtr.
2: Instrument segment, LFN2 = Offset
3: Load Sample Ptr.
4: Music (song) segment, LFN2 = offset
5: Function segment, LFN2 = offset
6: Instrument Ptr.
Type 17: Toggle
Offset 0: DW 17
Offset 2: DB X/Y coordinates
Offset 4: DW Ptr Info 1
Offset 6: DW Ptr Info 2
Offset 8: DB Bit Toggle
Offset 9: DW Up/Down/Right/Left associations
Ptr Info 1:
0: Sample header. Ptr Info 2 = offset in header.
1: Pattern segment (code). Ptr Info 2 = offset.
2: Music (song) segment. Ptr Info 2 = offset
3: Load sample header. Ptr info 2 = offset in header.
4: Instrument header. Ptr Info 2 = offset in header.
Type 18: 5NumEntry
Offset 0: DW 18
Offset 2: DB X/Y coordinates
Offset 4: DW Ptr Info 1
Offset 6: DW Ptr Info 2
Offset 8: DD DWord Ptr CheckFunction (0=none)
Offset 12: DW Up/Down/Right/Left associations
Ptr Info 1:
0: Sample header. Ptr Info 2 = offset.
1: Sample load header. Ptr Info 2 = offset.
2: Inst Segment (for sample resize).
Main menu return values.
0: Function not handled
1: Redraw screen
2: Goto prefunction
3: Goto keyboard input
4: Handled, return value.
5: New list in CX:DX, SI contains new action
;------------
Special string data:
; 0 = End of string
; 13 = Next line
; 10 = Toggle character sets
; 0FFh, x, n = repeat character n 'x' times
; 0FEh, x = set colour to x
; 0FDh, 'D' = show decimal number
; 0FDh, 'X' = show hex number
; 0FDh, 'S' = show signed number
; 0FDh, 'L' = show long number

637
it/Keyboard/BE.ASM Normal file
View File

@ -0,0 +1,637 @@
.model tiny
.code
;ÄÄ Copyrights ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; Impulse Tracker v2.14 *BELGIAN* Keyboard Definition File
; Copyright (C) 1998, SiDEWiNDER / DiMENSiON X
;
; You can use this source code as a base for your own keyboard driver, if you
; want to. (BUT NOT FOR A BELGIAN ONE OFCOURSE!!!!!)
;
; Read BE.TXT for more details!!
;
;ÄÄ Contact ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; My Email: sidewind@mail.dma.be
; My Homepage: http://fly.to/SiDEWiNDER
; DiMENSiON X WHQ: http://travel.to/DiMENSiON.X
;
;ÄÄ Assembling ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; &
DB 0
DW '&'
DB 3 ; 1
DW '1'
DB 7 ; |
DW '|'
DB 0FFh
DB 3 ;
DB 0
DW ''
DB 3 ; 2
DW '2'
DB 7 ; @
DW '@'
DB 0FFh
DB 4 ; "
DB 0
DW '"'
DB 3 ; 3
DW '3'
DB 7 ; #
DW '#'
DB 0FFh
DB 5 ; '
DB 0
DW ''''
DB 3 ; 4
DW '4'
DB 0FFh
DB 6 ; (
DB 0
DW '('
DB 3 ; 5
DW '5'
DB 0FFh
DB 7 ; paragraph, translated into $, should be OK...
DB 0
DW '$'
DB 3 ; 6
DW '6'
DB 7 ; ^
DW '^'
DB 0FFh
DB 8 ; Š
DB 0
DW 'Š'
DB 3 ; 7
DW '7'
DB 0FFh
DB 9 ; !
DB 0
DW '!'
DB 3 ; 8
DW '8'
DB 0FFh
DB 10 ; ‡
DB 0
DW '‡'
DB 3 ; 9
DW '9'
DB 7 ; {
DW '{'
DB 0FFh
DB 11 ; …
DB 0
DW '…'
DB 3 ; 0
DW '0'
DB 7 ; }
DW '}'
DB 0FFh
DB 12 ; )
DB 0
DW ')'
DB 3 ; ø
DW 'ø'
DB 0FFh
DB 13 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 17 ; Z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; (sirconflexe)-dead-key...
DB 0
DW '^'
DB 3 ; (trema)-dead-key...
DW 'ù'
DB 7 ; [
DW '['
DB 0FFh
DB 27 ; $
DB 0
DW '$'
DB 3 ; *
DW '*'
DB 7 ; ]
DW ']'
DB 0FFh
DB 30 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; M
DB 1
DW 'M'
DB 2 ; m
DW 'm'
DB 0FFh
DB 40 ; —
DB 0
DW '—'
DB 3 ; %
DW '%'
DB 7 ; `
DW '`'
DB 0FFh
DB 41 ; ý
DB 0
DW 'ý'
DB 0FFh
DB 43 ; æ
DB 0
DW 'æ'
DB 3 ; œ
DW 'œ'
DB 7 ; '
DW ''''
DB 0FFh
DB 44 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; ,
DB 0
DW ','
DB 1
DW '?'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ;
DB 0
DW ';'
DB 3 ; .
DW '.'
DB 0FFh
DB 52 ; :
DB 0
DW ':'
DB 3 ; /
DW '/'
DB 0FFh
DB 53 ; =
DB 0
DW '='
DB 3 ; +
DW '+'
DB 7 ; ~
DW '~'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7 ; \
DW '\'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

609
it/Keyboard/CA.ASM Normal file
View File

@ -0,0 +1,609 @@
.model tiny
.code
;
; Canadian french keyboard layout for IT by Delta X
; En passant: Salut … tous les fran‡ais dans le monde!! :)
;
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; @
DW '"'
DB 7
DW '@'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '/'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; ^
DW '?'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '&'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; *
DW '*'
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; (
DW '('
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; )
DW ')'
DB 0FFh
DB 12 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 13 ; =
DB 0
DW '='
DB 3 ; +
DW '+'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; [
DB 0
DW '['
DB 3 ; {
DW '{'
DB 7
DW '['
DB 0FFh
DB 27 ; ]
DB 0
DW ']'
DB 3 ; }
DW '}'
DB 7
DW ']'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ;
DB 0
DW ';'
DB 3 ; :
DW ':'
DB 7
DW '~'
DB 0FFh
DB 40 ; '
DB 0
DW "`"
DB 3 ; "
DW "'"
DB 7
DW '{'
DB 0FFh
DB 41 ; `
DB 0
DW '#'
DB 3 ; ~
DW '|'
DB 7
DW '\'
DB 0FFh
DB 43 ; \
DB 0
DW '<'
DB 3 ; |
DW '>'
DB 7
DW '}'
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW "'"
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW '>'
DB 0FFh
DB 53 ; /
DB 0
DW ''
DB 3
DW '<27>'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

620
it/Keyboard/CH.ASM Normal file
View File

@ -0,0 +1,620 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; +
DW '+'
DB 7 ;|
DW '|'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 7 ;@
DW '@'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; *
DW '*'
DB 7
DW '#' ;#
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; ‡
DW '‡'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 7
DW 'ª'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; /
DW '/'
DB 7
DW 'Ý'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '½'
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 0FFh
DB 12 ; '
DB 0
DW "'"
DB 3 ; ?
DW '?'
DB 7
DW 'ï'
DB 0FFh
DB 13 ; ^
DB 0
DW '^'
DB 3 ; `
DW '`'
DB 7 ; ~
DW '~'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; Š
DB 0
DW 'Š'
DB 3 ; <20>
DW '<27>'
DB 7 ;[
DW '['
DB 0FFh
DB 27 ; ù
DB 0
DW 'ù'
DB 3 ; !
DW '!'
DB 7 ; ]
DW ']'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ;
DB 0
DW ''
DB 3 ; ”
DW '”'
DB 0FFh
DB 40 ; …
DB 0
DW "…"
DB 3 ; „
DW '„'
DB 7 ;{
DW '{'
DB 0FFh
DB 41 ; $
DB 0
DW '$'
DB 3 ; œ
DW 'œ'
DB 7 ;}
DW '}'
DB 0FFh
DB 43 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7 ; \
DW '\'
DB 0FFh
DB 44 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; /
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

616
it/Keyboard/DE.ASM Normal file
View File

@ -0,0 +1,616 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '/'
DB 7
DW '{' ; {
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '[' ; [
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 7
DW ']' ; ]
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 7
DW '}' ; }
DB 0FFh
DB 12 ; á
DB 0
DW 'á'
DB 3 ; ?
DW '?'
DB 7
DW '\' ; \
DB 0FFh
DB 13 ; '
DB 0
DW "'"
DB 3 ; `
DW "`"
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 7 ; Alt-Gr-Q (Alt-Ctrl-Q)
DW '@'
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1ah
DB 5 ; Alt-Z
DW 2c00h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; š
DB 0
DW 'š'
DB 3 ; <20>
DW '<27>'
DB 0FFh
DB 27 ; +
DB 0
DW '+'
DB 3 ; *
DW '*'
DB 7
DW '~' ; ~
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ™
DB 0
DW '™'
DB 3 ; ”
DW '”'
DB 0FFh
DB 40 ; Ž
DB 0
DW "Ž"
DB 3 ; „
DW '„'
DB 0FFh
DB 41
DB 0
DW "^"
DB 3
DW "ø"
DB 0FFh
DB 43 ; #
DB 0
DW '#'
DB 3 ; '
DW "'"
DB 0FFh
DB 44 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7
DW '|'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

616
it/Keyboard/DK.ASM Normal file
View File

@ -0,0 +1,616 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 7
DW "@" ; @
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 7
DW 'œ'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW 'Ï'
DB 7
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '/'
DB 7
DW '{' ; {
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '[' ; [
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 7
DW ']' ; ]
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 7
DW '}' ; }
DB 0FFh
DB 12 ; +
DB 0
DW '+'
DB 3 ; ?
DW '?'
DB 0FFh
DB 13 ; '
DB 0
DW "ï"
DB 3 ; `
DW "`"
DB 7
DW '|' ; |
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Z
DW 19h
DB 5 ; Alt-Z
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; <20>
DB 0
DW '<27>'
DB 3 ; †
DW '†'
DB 0FFh
DB 27 ; .
DB 0
DW 'ù'
DB 3 ; ~
DW '^'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ™
DB 0
DW '™'
DB 3 ; ”
DW '”'
DB 0FFh
DB 40 ; Ž
DB 0
DW "Ž"
DB 3 ; „
DW '„'
DB 0FFh
DB 41
DB 0
DW "«"
DB 3
DW "õ"
DB 0FFh
DB 43 ; *
DB 0
DW "'"
DB 3 ; '
DW "*"
DB 0FFh
DB 44 ; Y
DB 1
DW 'Z'
DB 2 ; y
DW 'z'
DB 4 ; Ctrl-Y
DW 1ah
DB 5 ; Alt-Y
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 43 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7
DW '\'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

620
it/Keyboard/ES.ASM Normal file
View File

@ -0,0 +1,620 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 5 ; |
DW '|'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 5 ; @
DW '@'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; ú
DW 'ú'
DB 5 ; #
DW '#'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 5 ; ~
DW '~'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 5 ; ª
DW 'ª'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; /
DW '/'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 0FFh
DB 12 ; '
DB 0
DW "'"
DB 3 ; ?
DW '?'
DB 0FFh
DB 13 ; ­
DB 0
DW '­'
DB 3 ; ¨
DW '¨'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; `
DB 0
DW '`'
DB 3 ; ^
DW '^'
DB 5 ; [
DW '['
DB 0FFh
DB 27 ; +
DB 0
DW '+'
DB 3 ; *
DW '*'
DB 5 ; ]
DW ']'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ¤
DB 0
DW '¤'
DB 3 ; ¥
DW '¥'
DB 0FFh
DB 40 ; '
DB 0
DW "'"
DB 3 ; ù
DW 'ù'
DB 5 ; {
DW '{'
DB 0FFh
DB 41 ; §
DB 0
DW '§'
DB 3 ; ¦
DW '¦'
DB 5 ; \
DW '\'
DB 0FFh
DB 43 ; ‡
DB 0
DW '‡'
DB 3 ; €
DW '€'
DB 5 ; }
DW '}'
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3 ; ;
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3 ; :
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

618
it/Keyboard/FI.ASM Normal file
View File

@ -0,0 +1,618 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 7
DW "@" ; @
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 7
DW 'œ'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW 'Ï'
DB 7
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; /
DW '/'
DB 7
DW '{' ; {
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '[' ; [
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 7
DW ']' ; ]
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 7
DW '}' ; }
DB 0FFh
DB 12 ; +
DB 0
DW '+'
DB 3 ; ?
DW '?'
DB 7 ; \
DW '\'
DB 0FFh
DB 13 ; '
DB 0
DW "ï"
DB 3 ; `
DW "`"
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; <20>
DB 0
DW '<27>'
DB 3 ; †
DW '†'
DB 0FFh
DB 27 ; .
DB 0
DW 'ù'
DB 3 ; ^
DW '^'
DB 7 ; ~
DW '~'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ™
DB 0
DW '™'
DB 3 ; ”
DW '”'
DB 0FFh
DB 40 ; Ž
DB 0
DW "Ž"
DB 3 ; „
DW '„'
DB 0FFh
DB 41
DB 0
DW "`"
DB 3
DW "«"
DB 0FFh
DB 43 ; '
DB 0
DW "'"
DB 3 ; *
DW "*"
DB 0FFh
DB 44 ; Z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2 ; m
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3 ; ;
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3 ; :
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7
DW '|'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

613
it/Keyboard/FR.ASM Normal file
View File

@ -0,0 +1,613 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '&'
DB 3 ; !
DW '1'
DB 0FFh
DB 3 ; 2
DB 0
DW ''
DB 3 ; "
DW '2'
DB 7
DW "~" ; @
DB 0FFh
DB 4 ; 3
DB 0
DW '"'
DB 3 ; #
DW '3'
DB 7
DW "#"
DB 0FFh
DB 5 ; 4
DB 0
DW "'"
DB 3 ; $
DW '4'
DB 7
DW '{'
DB 0FFh
DB 6 ; 5
DB 0
DW '('
DB 3 ; %
DW '5'
DB 7
DW '['
DB 0FFh
DB 7 ; 6
DB 0
DW '-'
DB 3 ; &
DW '6'
DB 7
DW '|'
DB 0FFh
DB 8 ; 7
DB 0
DW 'Š'
DB 3 ;
DW '7'
DB 7
DW '`' ;
DB 0FFh
DB 9 ; 8
DB 0
DW '_'
DB 3 ;
DW '8'
DB 7
DW '\' ;
DB 0FFh
DB 10 ; 9
DB 0
DW '‡'
DB 3 ;
DW '9'
DB 7
DW '^' ;
DB 0FFh
DB 11 ; 0
DB 0
DW '…'
DB 3 ; =
DW '0'
DB 7
DW '@' ; }
DB 0FFh
DB 12 ; +
DB 0
DW ')'
DB 3 ; ?
DW 'ø'
DB 7
DW ']'
DB 0FFh
DB 13 ; '
DB 0
DW "="
DB 3 ; `
DW "+"
DB 7
DW '}'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'A'
DB 2 ; q
DW 'a'
DB 4 ; Ctrl-Q
DW 1h
DB 5 ; Alt-Q
DW 1E00h
DB 0FFh
DB 17 ; W
DB 1
DW 'Z'
DB 2 ; w
DW 'z'
DB 4 ; Ctrl-W
DW 19h
DB 5 ; Alt-W
DW 1500h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Z
DW 19h
DB 5 ; Alt-Z
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; <20>
DB 0
DW '^'
DB 3 ; †
DW 'ù'
DB 0FFh
DB 27 ; .
DB 0
DW '$'
DB 3 ; ~
DW 'œ'
DB 0FFh
DB 30 ; A
DB 1
DW 'Q'
DB 2 ; a
DW 'q'
DB 4 ; Ctrl-A
DW 11h
DB 5 ; Alt-A
DW 1000h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ™
DB 1
DW 'M'
DB 2 ; ”
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 40 ; Ž
DB 0
DW "—"
DB 3 ; „
DW '%'
DB 0FFh
DB 41 ; '
DB 0
DW "*"
DB 3 ; *
DW "æ"
DB 0FFh
DB 43 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 0FFh
DB 44 ; Y
DB 1
DW 'W'
DB 2 ; y
DW 'w'
DB 4 ; Ctrl-Y
DW 17h
DB 5 ; Alt-Y
DW 1100h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 0
DW ','
DB 3
DW '?'
DB 0FFh
DB 51 ; ,
DB 0
DW ';'
DB 3
DW '.'
DB 0FFh
DB 52 ; .
DB 0
DW ':'
DB 3
DW '/'
DB 0FFh
DB 53 ; -
DB 0
DW '!'
DB 3
DW '!'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

588
it/Keyboard/IT.ASM Normal file
View File

@ -0,0 +1,588 @@
.model tiny
.code
; FIXED Italian keyboard configuration file for Impulse Tracker 2
; fixed by DjM of Digital Things (DiT)
; why: Italian keyboard has no '`' key; with this configuration file
; note off command can be entered with '\' key (like in FastTracker 2)
; or with the similar ' (apostrophe) key
; to type \ and ' in message editor, use Right Alt + key
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; Chr(156)
DW 9Ch
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; /
DW '/'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 0FFh
DB 12 ; ' used as `
DB 0
DW '`'
DB 3 ; ?
DW '?'
DB 7 ; to type ' in message editor
DW 27h
DB 0FFh
DB 13 ; Chr(141)
DB 0
DW 8Dh
DB 3 ; ^
DW '^'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; Chr(138)
DB 0
DW 8Ah
DB 3 ; Chr(130)
DW 82h
DB 7 ; [
DW '['
DB 0FFh
DB 27 ; +
DB 0
DW '+'
DB 3 ; *
DW '*'
DB 7 ; ]
DW ']'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; Chr(149)
DB 0
DW 95h
DB 3 ; Chr(135)
DW 87h
DB 7 ; @
DW '@'
DB 0FFh
DB 40 ; Chr(133)
DB 0
DW 85h
DB 3 ; Chr(248)
DW 0F8h
DB 7 ; #
DW '#'
DB 0FFh
DB 41 ; \ used as `
DB 0
DW "`"
DB 3 ; |
DW "|"
DB 7 ; to type \ in message editor
DW '\'
DB 0FFh
DB 43 ; Chr(151)
DB 0
DW 97h
DB 3 ; Chr(21)
DW 15h
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 83 ; keypad .
DB 8
DW '.'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

12
it/Keyboard/KEYBOARD.TXT Normal file
View File

@ -0,0 +1,12 @@
This ZIP contains several different keyboard configurations for Impulse
Tracker. To use a particular configuration file, copy the appropriate file
to KEYBOARD.CFG
eg. to use a German keyboard configuration (DE.KBD), do
COPY DE.KBD KEYBOARD.CFG
Make sure that KEYBOARD.CFG is in the same directory as IT.EXE
An example of how to create your own keyboard file is included in the form
of US.ASM

614
it/Keyboard/NO.ASM Normal file
View File

@ -0,0 +1,614 @@
.model tiny
.code
; This keyboard configuration created by Benjamin Bruheim
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 7
DW "@" ; @
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 7
DW 'œ'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW 'Ï'
DB 7
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '/'
DB 7
DW '{' ; {
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '[' ; [
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 7
DW ']' ; ]
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 7
DW '}' ; }
DB 0FFh
DB 12 ; +
DB 0
DW '+'
DB 3 ; ?
DW '?'
DB 0FFh
DB 13 ; '
DB 0
DW "\"
DB 3 ; `
DW "`"
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-y
DW 19h
DB 5 ; Alt-y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; †
DB 0
DW '†'
DB 3 ; <20>
DW '<27>'
DB 0FFh
DB 27 ; .
DB 0
DW 'ù'
DB 3 ; ~
DW '^'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ;
DB 0
DW ""
DB 3 ; <20>
DW "<22>"
DB 0FFh
DB 40 ;
DB 0
DW ""
DB 3 ;
DW ""
DB 0FFh
DB 41
DB 0
DW "|"
DB 3
DW "õ"
DB 0FFh
DB 43 ; '
DB 0
DW "'"
DB 3 ; *
DW "*"
DB 0FFh
DB 44 ; Z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-z
DW 1ah
DB 5 ; Alt-z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

610
it/Keyboard/PO.ASM Normal file
View File

@ -0,0 +1,610 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2
DB 0
DW '1'
DB 3
DW '!'
DB 0FFh
DB 3
DB 0
DW '2'
DB 3
DW '"'
DB 5
DW '@'
DB 0FFh
DB 4
DB 0
DW '3'
DB 3
DW '#'
DB 0FFh
DB 5
DB 0
DW '4'
DB 3
DW '$'
DB 0FFh
DB 6
DB 0
DW '5'
DB 3
DW '%'
DB 0FFh
DB 7
DB 0
DW '6'
DB 3
DW '&'
DB 0FFh
DB 8
DB 0
DW '7'
DB 3
DW '/'
DB 5
DW '{'
DB 0FFh
DB 9
DB 0
DW '8'
DB 3
DW '('
DB 5
DW '['
DB 0FFh
DB 10
DB 0
DW '9'
DB 3
DW ')'
DB 5
DW ']'
DB 0FFh
DB 11
DB 0
DW '0'
DB 3
DW '='
DB 5
DW '}'
DB 0FFh
DB 12
DB 0
DW ''''
DB 3
DW '?'
DB 0FFh
DB 13
DB 0
DW '<'
DB 3
DW '>'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26
DB 0
DW '+'
DB 3
DW '*'
DB 0FFh
DB 27
DB 0
DW ''''
DB 3
DW '`'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39
DB 0
DW 'c' ; porque o ‡ nao funciona no IT
DB 3
DW 'C' ; porque o € nao funciona no IT
DB 0FFh
DB 40
DB 0
DW "o" ; porque o § nao funciona no IT
DB 3
DW 'a' ; porque o ¦ nao funciona no IT
DB 0FFh
DB 41
DB 0
DW '\'
DB 3
DW '|'
DB 0FFh
DB 43
DB 0
DW '~'
DB 3
DW '^'
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; a new key generated by me, for
DB 0 ; the Portuguese keyboard.
DW '<' ; It's located between the
DB 3 ; LShift and the Z key...
DW '>'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

612
it/Keyboard/SE.ASM Normal file
View File

@ -0,0 +1,612 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 7
DW "@" ; @
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 7
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; &
DW '&'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '/'
DB 7
DW '{' ; {
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; (
DW '('
DB 7
DW '[' ; [
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; )
DW ')'
DB 7
DW ']' ; ]
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; =
DW '='
DB 7
DW '}' ; }
DB 0FFh
DB 12 ; +
DB 0
DW '+'
DB 3 ; ?
DW '?'
DB 0FFh
DB 13 ; '
DB 0
DW "'"
DB 3 ; `
DW "`"
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Z
DW 19h
DB 5 ; Alt-Z
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; <20>
DB 0
DW '<27>'
DB 3 ; †
DW '†'
DB 0FFh
DB 27 ; .
DB 0
DW '.'
DB 3 ; ~
DW '~'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ™
DB 0
DW '™'
DB 3 ; ”
DW '”'
DB 0FFh
DB 40 ; Ž
DB 0
DW "Ž"
DB 3 ; „
DW '„'
DB 0FFh
DB 41
DB 0
DW "^"
DB 3
DW "+"
DB 0FFh
DB 43 ; *
DB 0
DW '*'
DB 3 ; '
DW "'"
DB 0FFh
DB 44 ; Y
DB 1
DW 'Z'
DB 2 ; y
DW 'z'
DB 4 ; Ctrl-Y
DW 1ah
DB 5 ; Alt-Y
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW ';'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW ':'
DB 0FFh
DB 53 ; -
DB 0
DW '-'
DB 3
DW '_'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 43 ; <
DB 0
DW '<'
DB 3 ; >
DW '>'
DB 7
DW '|'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

596
it/Keyboard/UK.ASM Normal file
View File

@ -0,0 +1,596 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; "
DW '"'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; œ
DW 'œ'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; ^
DW '^'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '&'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; *
DW '*'
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; (
DW '('
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; )
DW ')'
DB 0FFh
DB 12 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 13 ; =
DB 0
DW '='
DB 3 ; +
DW '+'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; [
DB 0
DW '['
DB 3 ; {
DW '{'
DB 0FFh
DB 27 ; ]
DB 0
DW ']'
DB 3 ; }
DW '}'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ;
DB 0
DW ';'
DB 3 ; :
DW ':'
DB 0FFh
DB 40 ; '
DB 0
DW "'"
DB 3 ; @
DW '@'
DB 0FFh
DB 41
DB 0
DW "`"
DB 0FFh
DB 43 ; #
DB 0
DW '#'
DB 3 ; ~
DW '~'
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW '<'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW '>'
DB 0FFh
DB 53 ; /
DB 0
DW '/'
DB 3
DW '?'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 86 ; \
DB 0
DW '\'
DB 3 ; |
DW '|'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

598
it/Keyboard/US.ASM Normal file
View File

@ -0,0 +1,598 @@
.model tiny
.code
; to create the file:
; TASM <filename>
; TLINK /TDC <filename>
; REN <filename>.COM KEYBOARD.CFG
;
; Structure is:
; Keycode (1 byte)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; Condition (1 byte)
; Return value (1 word)
; .
; .
; .
; 0FFh <-- end of condition/return value list
;
; Keycode is the value in the keypress table in IT on Ctrl-F1 (remember the
; values on the keypress table are in HEX..)
;
; Condition is one of the following
; 0 = requires NO Shift/Ctrl/Alt/...,
; 1 = if Shift and key while caps lock OFF *OR* CAPS lock ON, no ctrl/alt
; 2 = if Shift and key while caps lock ON *OR* CAPS lock OFF, no ctrl/alt
; 3 = if Shift
; 4 = if Ctrl
; 5 = if left/right Alt
; 6 = if Left Alt
; 7 = if Right Alt
; 8 = if Numlock on, no ctrl/alt
; 9 = if Numlock off, no ctrl/alt
; 0FFh = end of list.
;
; Return value is the character, or a DOS character value
ORG 100h
FileStart:
FileLength DW Offset EndKeyboardTable - Offset StartKeyboardTable
StartKeyboardTable:
DB 2 ; 1
DB 0
DW '1'
DB 3 ; !
DW '!'
DB 0FFh
DB 3 ; 2
DB 0
DW '2'
DB 3 ; @
DW '@'
DB 0FFh
DB 4 ; 3
DB 0
DW '3'
DB 3 ; #
DW '#'
DB 0FFh
DB 5 ; 4
DB 0
DW '4'
DB 3 ; $
DW '$'
DB 0FFh
DB 6 ; 5
DB 0
DW '5'
DB 3 ; %
DW '%'
DB 0FFh
DB 7 ; 6
DB 0
DW '6'
DB 3 ; ^
DW '^'
DB 0FFh
DB 8 ; 7
DB 0
DW '7'
DB 3 ; &
DW '&'
DB 0FFh
DB 9 ; 8
DB 0
DW '8'
DB 3 ; *
DW '*'
DB 0FFh
DB 10 ; 9
DB 0
DW '9'
DB 3 ; (
DW '('
DB 0FFh
DB 11 ; 0
DB 0
DW '0'
DB 3 ; )
DW ')'
DB 0FFh
DB 12 ; -
DB 0
DW '-'
DB 3 ; _
DW '_'
DB 0FFh
DB 13 ; =
DB 0
DW '='
DB 3 ; +
DW '+'
DB 0FFh
DB 14 ; Backspace
DB 4 ; Ctrl-Backspace
DW 127
DB 0FFh
DB 15 ; Tab
DB 3 ; ShiftTab
DW 0F00h
DB 0FFh
DB 16 ; Q
DB 1
DW 'Q'
DB 2 ; q
DW 'q'
DB 4 ; Ctrl-Q
DW 11h
DB 5 ; Alt-Q
DW 1000h
DB 0FFh
DB 17 ; W
DB 1
DW 'W'
DB 2 ; w
DW 'w'
DB 4 ; Ctrl-W
DW 17h
DB 5 ; Alt-W
DW 1100h
DB 0FFh
DB 18 ; E
DB 1
DW 'E'
DB 2 ;e
DW 'e'
DB 4 ; Ctrl-E
DW 5
DB 5 ; Alt-E
DW 1200h
DB 0FFh
DB 19 ; R
DB 1
DW 'R'
DB 2 ; r
DW 'r'
DB 4 ; Ctrl-R
DW 12h
DB 5 ; Alt-R
DW 1300h
DB 0FFh
DB 20 ; T
DB 1
DW 'T'
DB 2 ; t
DW 't'
DB 4 ; Ctrl-T
DW 14h
DB 5 ; Alt-T
DW 1400h
DB 0FFh
DB 21 ; Y
DB 1
DW 'Y'
DB 2 ; y
DW 'y'
DB 4 ; Ctrl-Y
DW 19h
DB 5 ; Alt-Y
DW 1500h
DB 0FFh
DB 22 ; U
DB 1
DW 'U'
DB 2 ; u
DW 'u'
DB 4 ; Ctrl-U
DW 15h
DB 5 ; Alt-U
DW 1600h
DB 0FFh
DB 23 ; I
DB 1
DW 'I'
DB 2 ; i
DW 'i'
DB 4 ; Ctrl-I
DW 9
DB 5 ; Alt-I
DW 1700h
DB 0FFh
DB 24 ; O
DB 1
DW 'O'
DB 2 ; o
DW 'o'
DB 4 ; Ctrl-O
DW 0Fh
DB 5 ; Alt-O
DW 1800h
DB 0FFh
DB 25 ; P
DB 1
DW 'P'
DB 2 ; p
DW 'p'
DB 4 ; Ctrl-P
DW 10h
DB 5 ; Alt-P
DW 1900h
DB 0FFh
DB 26 ; [
DB 0
DW '['
DB 3 ; {
DW '{'
DB 0FFh
DB 27 ; ]
DB 0
DW ']'
DB 3 ; }
DW '}'
DB 0FFh
DB 30 ; A
DB 1
DW 'A'
DB 2 ; a
DW 'a'
DB 4 ; Ctrl-A
DW 1
DB 5 ; Alt-A
DW 1E00h
DB 0FFh
DB 31 ; S
DB 1
DW 'S'
DB 2 ; s
DW 's'
DB 4 ; Ctrl-S
DW 13h
DB 5 ; Alt-S
DW 1F00h
DB 0FFh
DB 32 ; D
DB 1
DW 'D'
DB 2 ; d
DW 'd'
DB 4 ; Ctrl-D
DW 4
DB 5 ; Alt-D
DW 2000h
DB 0FFh
DB 33 ; F
DB 1
DW 'F'
DB 2 ; f
DW 'f'
DB 4 ; Ctrl-F
DW 6
DB 5 ; Alt-F
DW 2100h
DB 0FFh
DB 34 ; G
DB 1
DW 'G'
DB 2 ; g
DW 'g'
DB 4 ; Ctrl-G
DW 7
DB 5 ; Alt-G
DW 2200h
DB 0FFh
DB 35 ; H
DB 1
DW 'H'
DB 2 ; h
DW 'h'
DB 4 ; Ctrl-H
DW 8
DB 5 ; Alt-H
DW 2300h
DB 0FFh
DB 36 ; J
DB 1
DW 'J'
DB 2 ; j
DW 'j'
DB 4 ; Ctrl-J
DW 0Ah
DB 5 ; Alt-J
DW 2400h
DB 0FFh
DB 37 ; K
DB 1
DW 'K'
DB 2 ; k
DW 'k'
DB 4 ; Ctrl-K
DW 0Bh
DB 5 ; Alt-K
DW 2500h
DB 0FFh
DB 38 ; L
DB 1
DW 'L'
DB 2 ; l
DW 'l'
DB 4 ; Ctrl-L
DW 0Ch
DB 5 ; Alt-L
DW 2600h
DB 0FFh
DB 39 ; ;
DB 0
DW ';'
DB 3 ; :
DW ':'
DB 0FFh
DB 40 ; '
DB 0
DW "'"
DB 3 ; "
DW '"'
DB 0FFh
DB 41 ; `
DB 0
DW '`'
DB 3 ; ~
DW '~'
DB 0FFh
DB 43 ; \
DB 0
DW '\'
DB 3 ; |
DW '|'
DB 0FFh
DB 44 ; z
DB 1
DW 'Z'
DB 2 ; z
DW 'z'
DB 4 ; Ctrl-Z
DW 1Ah
DB 5 ; Alt-Z
DW 2C00h
DB 0FFh
DB 45 ; X
DB 1
DW 'X'
DB 2 ; x
DW 'x'
DB 4 ; Ctrl-X
DW 1Ah
DB 5 ; Alt-X
DW 2D00h
DB 0FFh
DB 46 ; C
DB 1
DW 'C'
DB 2 ; c
DW 'c'
DB 4 ; Ctrl-C
DW 3
DB 5 ; Alt-C
DW 2E00h
DB 0FFh
DB 47 ; V
DB 1
DW 'V'
DB 2 ; v
DW 'v'
DB 4 ; Ctrl-V
DW 16h
DB 5 ; Alt-V
DW 2F00h
DB 0FFh
DB 48 ; B
DB 1
DW 'B'
DB 2 ; b
DW 'b'
DB 4 ; Ctrl-B
DW 2
DB 5 ; Alt-B
DW 3000h
DB 0FFh
DB 49 ; N
DB 1
DW 'N'
DB 2 ; n
DW 'n'
DB 4 ; Ctrl-N
DW 0Eh
DB 5 ; Alt-N
DW 3100h
DB 0FFh
DB 50 ; M
DB 1
DW 'M'
DB 2
DW 'm'
DB 4 ; Ctrl-M
DW 0Dh
DB 5 ; Alt-M
DW 3200h
DB 0FFh
DB 51 ; ,
DB 0
DW ','
DB 3
DW '<'
DB 0FFh
DB 52 ; .
DB 0
DW '.'
DB 3
DW '>'
DB 0FFh
DB 53 ; /
DB 0
DW '/'
DB 3
DW '?'
DB 0FFh
DB 55 ; XT/AT printscreen, Enhanced keyboard *
DB 0
DW '*'
DB 0FFh
DB 57 ; Spacebar
DB 0
DW ' '
DB 3
DW ' '
DB 0FFh
DB 71 ; Keypad 7
DB 8
DW '7'
DB 10
DW 7
DB 0FFh
DB 72 ; Keypad 8
DB 8
DW '8'
DB 10
DW 8
DB 0FFh
DB 73 ; Keypad 9
DB 8
DW '9'
DB 10
DW 9
DB 0FFh
DB 74 ; Grey -
DB 0
DW '-'
DB 0FFh
DB 75 ; Keypad 4
DB 8
DW '4'
DB 10
DW 4
DB 0FFh
DB 76 ; Keypad 5
DB 8
DW '5'
DB 10
DW 5
DB 0FFh
DB 77 ; Keypad 6
DB 8
DW '6'
DB 10
DW 6
DB 0FFh
DB 78 ; Grey +
DB 0
DW '+'
DB 0FFh
DB 79 ; Keypad 1
DB 8
DW '1'
DB 10
DW 1
DB 0FFh
DB 80 ; Keypad 2
DB 8
DW '2'
DB 10
DW 2
DB 0FFh
DB 81 ; Keypad 3
DB 8
DW '3'
DB 10
DW 3
DB 0FFh
DB 82 ; Keypad 0
DB 8
DW '0'
DB 10
DW 0
DB 0FFh
DB 83
DB 8
DW '.'
DB 0FFh
DB 128+35h ; Grey /
DB 0
DW '/'
DB 0FFh
DB 0FFh
EndKeyboardTable:
End FileStart

25
it/LICENSE.TXT Normal file
View File

@ -0,0 +1,25 @@
Copyright © 2014, Jeffrey Lim. All Rights Reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

9
it/MAKEFILE.MAK Normal file
View File

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

32
it/NETWORK.INC Normal file
View File

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

130
it/Network/DEBUG.INC Normal file
View File

@ -0,0 +1,130 @@
;
; 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
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
Mov CX, 82
Mov DX, SI
Int 21h
Mov AH, 3Eh
Int 21h
WriteDebugFileEnd:
Pop DS
PopA
Ret
EndP WriteDebugFile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
Local X, Y
PushF
Push SI
Jmp Y
X:
DB LogMessage
DB 80-($-Offset X) Dup (0)
DB 0Dh, 0Ah
Y:
Mov SI, Offset X
Call WriteDebugFile
Pop SI
PopF
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ELSE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ENDIF
IF SCREENTRACEENABLED
ScreenTrace Macro Value
Mov Byte Ptr [FS:0], Value
EndM
ScreenTraceStart Macro
Push FS
Push 0B800h
Pop FS
EndM
ScreenTraceEnd Macro
Pop FS
EndM
ELSE
ScreenTrace Macro Value
EndM
ScreenTraceStart Macro
EndM
ScreenTraceEnd Macro
EndM
ENDIF

19
it/Network/DRHEAD.INC Normal file
View File

@ -0,0 +1,19 @@
NUMREQUIREDVARIABLES EQU 16 ; Number of bytes required from IT.EXE by Driver
NUMREQUIREDFUNCTIONS EQU 32 ; Number of functions (DD Offsets) required by
; Network driver
NUMPROVIDEDVARIABLES EQU 16 ; Number of bytes provided from driver to IT.EXE
NUMPROVIDEDFUNCTIONS EQU 16 ; Number of functions (DW Offsets) provided by
; Network driver
ID DB "Impulse Tracker Network Driver"
DB 26
DB (62 - ($-Offset ID)) Dup (0)
DB 13, 10
DriverID DB DRIVERIDSTRING
DB (62 - ($ - Offset DriverID)) Dup (0)
LengthOfDriver DW Offset EndDriver - Offset StartDriver

BIN
it/Network/EXECOM.COM Executable file

Binary file not shown.

3583
it/Network/IPX.ASM Normal file

File diff suppressed because it is too large Load Diff

5
it/Network/MIPX.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /la /ut310 ipx
tlink /3 ipx
execom ipx itipx.net
copy itipx.net ..

47
it/Network/NETDRIVE.ASM Normal file
View File

@ -0,0 +1,47 @@
.386P
Segment DriverHeader PARA Public 'Code' Use16
Assume CS:Driver, DS:Nothing
;***** Driver Header *******
include drhead.inc
EndS
Segment Driver PARA Public 'Code' Use16
Assume CS:Driver, DS:Nothing
ORG 0
StartDriver:
include vtable.inc
;******** Required ProcedureTable *************
include reqproc.inc
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
EndDriver:
;******** Provided Variable Table *************
ProvidedVariableStart:
DB NUMPROVIDEDVARIABLES-($-ProvidedVariableStart) Dup (0)
;******** Provided Procedure Table *************
ProvidedTableStart:
DW Offset Initialise
DW Offset Shutdown
DW Offset DriverScreen
DW Offset Update
DW Offset ConnectionStatus
ProvidedTableEnd:
DW NUMPROVIDEDFUNCTIONS-(ProvidedTableEnd-ProvidedTableStart)/2 Dup (0)
EndS
End

32
it/Network/REQPROC.INC Normal file
View File

@ -0,0 +1,32 @@
ProcedureTableStart Label
IT_UnloadDriver DD ?
IT_FunctionHandler DD ?
IT_FunctionDivider DD ?
IT_ReceiveData DD ?
IT_SendData DD ?
IT_EstablishConnection DD ?
IT_GotoHomeDirectory DD ?
IT_GetTime DD ?
IT_SetInfoLine DD ?
IT_DrawHeader DD ?
IT_FillHeader DD ?
IT_S_GetDestination DD ?
IT_S_DrawString DD ?
IT_S_SaveScreen DD ?
IT_S_RestoreScreen DD ?
IT_GetCurrentMode DD ?
IT_NewConnection DD ?
IT_DecodeUserName DD ?
DD NUMREQUIREDFUNCTIONS - ($-ProcedureTableStart)/4 Dup (0)

6
it/Network/USERNAME.INC Normal file
View File

@ -0,0 +1,6 @@
UserName DB 0FFh, 014h, 04Fh, 0F0h, 047h, 0C8h, 09Fh, 0DCh, 063h, 000h, 03Fh, 0FCh, 0AEh, 0FCh, 0AEh, 0FCh
IPXLocalAddress Label
UserKey DW 0141Eh
IPXNetworkAddress DW 0 ; Combines with previous line
IPXNodeAddress DW 0, 0, 0
IPXSocket DW 0

10
it/Network/VTABLE.INC Normal file
View File

@ -0,0 +1,10 @@
VariableTableStart Label
GlobalKeyList DD ?
IdleUpdateInfoLine DD ?
DiskDataArea DW ? ; Segment
DB NUMREQUIREDVARIABLES-($-VariableTableStart) Dup (0)

1703
it/PE_TRANS.INC Normal file

File diff suppressed because it is too large Load Diff

138
it/README.md Normal file
View File

@ -0,0 +1,138 @@
Impulse Tracker
===============
Full source code for Impulse Tracker, including sound drivers, network drivers,
and some supporting documentation
 
Pre-Requisite Software
----------------------
To build Impulse Tracker, you will need:
- Turbo Assembler v4.1
- Turbo Link v3.01
- Borland MAKE v4.0
- A DOS environment
 
Once you have these, building IT.EXE should be just a single call to `MAKE`
Sound drivers are build individually via M\*.BAT files inside the SoundDrivers
subdirectory
 
Quick File Overview
-------------------
- IT.ASM:
Startup routines
- IT\_DISK.ASM:
Disk IO Routines. Uses IT\_D\_\*.INC files
- IT\_DISPL.ASM:
Display routines for the Playback Screen (F5)
- IT\_EMS.ASM:
EMS memory handling routines
- IT\_F.ASM:
Collection of functions used by the object model
- IT\_FOUR.ASM:
Fast Fourier routines. Used by the graphic equalizer (Alt-F12).
Not available on all all sound cards
- IT\_G.ASM:
Global key handler functions
- IT\_H.ASM:
Help Module (F1)
- IT\_I.ASM:
Sample list (F3) and Instrument list (F4) module
- IT\_K.ASM:
Keyboard module
- IT\_L.ASM:
Information line code
- IT\_M.ASM:
Main message loop/dispatcher
- IT\_MDATA.ASM:
Global music variable data
- IT\_MMTSR.ASM:
Sample compression/decompression routines
- IT\_MOUSE.ASM:
Mouse handling code
- IT\_MSG.ASM:
Message editor module (Shift-F9)
- IT\_MUSIC.ASM:
Module playback code. Also uses IT\_M\_EFF.INC
- IT\_NET.ASM:
Network code
- IT\_OBJ1.ASM:
UI object definitions
- IT\_PE.ASM:
Pattern Editor module (F2)
- IT\_S.ASM:
Screen functions, including character generation
- IT\_TUTE.ASM:
Interactive Tutorial module
- IT\_VESA.ASM:
VESA code for graphic equalizer
- SWITCH.INC:
High level switches for the program
Frequently Asked Questions
--------------------------
Q: "What are all those funny characters in the source code?"
A: I wrote the original source code using DOS characters, with characters drawing borders/boxes in
comments in the source code. In the interests of posterity, I have left the code intact as it was.
Q: "Why didn't you use STRUCs or ENUMs" in your ASM source?
A: Simply because I didn't know about them at the time. I wish I did. There's a InternalDocumentation
folder that I've included in the repository that details what some of the magic numbers appearing
through the code might mean.
Q: "Flow in some functions seems to jump all over the place. Why?"
A: The original code was compatible all the way back to an 8086 machine. 8086 would allow you to do
conditional jumps only within +/-128 bytes, so I spent too much time shuffling code around to meet
this restriction. When I shifted away from this 8086 restriction, I never went back to update the
code that was mutilated by it.
 
License
-------
License for this source code is pending.

View File

@ -0,0 +1,39 @@
OK.. here's a list of the known problems - please don't write to me about them!
1) Apparently, many problems have been encountered with QEMM... I really
don't know what's going wrong here at the moment (I haven't had any
experience with QEMM myself), but try using the following line in your
CONFIG.SYS file. If this still doesnt' work, I would recommend that you
steer clear of QEMM if possible for the meantime.
DEVICE=<path>\QEMM.SYS DMA=64, HANDLES=255
2) With the GUS, 16-bit samples > 256k will *NOT* be played correctly. This is
due to a 'quirk' of the GUS - something that I don't know how to easily fix.
This does *NOT* occur with 8-bit samples. (This is the same problem that
you'll find in FastTracker II also)
3) The "Active Channels" indication is *NOT* always 100% accurate (it's
even affected by stuff played in muted channels.....) Also, on a GUS or
AWE32, the program requires the hardware to provide the 'end of note
indication', whereas the mixing routines are calculated internally...
hence, if the hardware provides the indication a little later than expected,
another channel is allocated - what this means is that the value as played
on wavetable cards *MAY* differ from the value played on software-mixed
cards. This difference is minor (ie. 2 channels at most, unless you *TRY*
to setup a special situation)
4) There is no 'enforce Amiga limits' option in IT (Which was in ST3) so
pitches of notes exceeding the Amiga limit will not be suitably played.
5) If your system behaves unexpectedly in IT, it *MAY* be necessary to
specify the complete parameter list on the command line. This should NOT
be a problem in most cases, but it has been known to occur.
6) In Windows '95, if you shell to DOS when using SB on a high IRQ, then
playback may stop! I've got no idea as to why this happens, but it seems
to restore itself after loading another module (on a SB16)
7) If you Shell to DOS with insufficient memory available, WEIRD things may
occur...

View File

@ -0,0 +1,595 @@
To all of the following people listed, I offer my heartfelt thanks.
Impulse Tracker would not be the same without them.
---------------------------------
Demosongs for Impulse Tracker
---------------------------------
IT1.00 - "Firestorm" - Chris Jarvis
IT1.01 - "Pale Dreams" - Chris Jarvis
IT1.03 - "Firepower" - Chris Jarvis
IT1.05 - "Sidewalk" - Chris Jarvis
IT1.06 - "Creation of Gaia" - Sherman Wu (ZaStaR)
IT2.00 - "Fallen World" - Chris Jarvis
IT2.01 - "A Hidden Fate" - Chris Jarvis
IT2.04 - "Winter's Dream" - Andy Sega (Necros)
IT2.08 - "Acid Dreams" - Liam Widdowson (Legend)
IT2.14 - "Blue Flame" - Chris Jarvis
-----------------------------------------
Additional Coding for Impulse Tracker
-----------------------------------------
Impulse Tracker Font Customiser - Sherman Wu (ZaStaR)
Impulse Tracker Text Importer - Sherman Wu (ZaStaR)
Music Module Compression - Emmanual Giasson (Zirconia)
Keyboard Configuration files - Stefan Kucharik (Eliot)
----------------------
Website Management
----------------------
USA Site - Shawn Mativetsky (Shawn202)
http://www.noisemusic.org/it
UK Site - Andi Simpson (Imminent)
http://www.mixbbs.demon.co.uk
European Site - Joost Baaij (CH:ilm)
(no longer operational)
Spanish Site - Javier Gutierrez
http://www.musica.org/impulse
Music and Tracking Site - Matthias Ziegs (MAZ)
http://www.maz-sound.com
IT Resource Central - Matthew Gardner
http://www.unidev.com/~logic/music/it
----------------------
Documentation Help
----------------------
ASCII Logos - Ze`ev Nissan (Cruel Creator)
FILE_ID.DIZ - Ze`ev Nissan (Cruel Creator)
MIDI Output documentation - Andre Pang (Ozone)
--------------------------------------------------------------------------------
Hardware Thanks
(Sorted alphabetically by company name)
---------------------------------------
Company: Advanced Micro Devices (AMD)
Received: Interwave Board
Website: http://www.amd.com
Notes: AMD has discontinued the production of the Interwave chips.
Nonetheless, thank-you to Christopher Cox for his excellent service.
---------------------------------------
Company: Creative Laboratories
Received: Sound Blaster AWE32
Website: http://www.creaf.com
---------------------------------------
Company: Hanmesoft / Hoontech, Korea
Received: Sound Track '97
Sound Track '97 PCI
Website: http://www.hoontech.com
Notes: The Sound Track '97 PCI is the worlds first fully SBPro and WSS
compatible PCI card and has some of the best features ever seen
on a soundcard! For bangs per buck, it's hard to beat one of these!
Thanks go to Haejin Park and to Seungho Pak!
---------------------------------------
Company: Synergy Advanced Technology (Taiwan)
Received: ViperMAX
Website: http://www.synergy.ca/pctoybox
Notes: For a fully compatible Gravis UltraSound card with perfect Sound
Blaster compatibility, check out the ViperMAX cards - providing
the best of two worlds without the troubles of PnP.
Special thanks go to James Hsu, Synergy Advanced Technology.
---------------------------------------
Company: TerraTec International
Received: AudioSystem EWS64XL
SoundSystem Maestro 32/96
SoundSystem Maestro 16/96
SoundSystem Gold 16/96
SoundSystem Base1
Website: http://www.terratec.de
Notes: Terratec produces extremely high quality soundcards to cover
everyone's needs - check out their high end EWS64XL cards!
Thanks go to the entire Terratec Team, especially Kay Bruns,
Wim Roegels and Sascha Kamps - 3 of the team that I've had
the pleasure to come in contact with!
--------------------------------------------------------------------------------
Contributions
-----------------
(sorted in alphabetical order, listing is Full Name / Alias / Country + notes)
Name Alias Country Notes
-------------------------------------------------------------------------------
<Withheld> Dire Portugal
<Withheld> KjWise Iceland
Egor Abramov Russia
Habib Al-Assaad
Tony Allen UK MEGA HUGE contribution, thanks!
Simon Altman P'Wolverine Australia
Tal Amir Israel
Asbjoern Andersen Mystical Denmark
Steven Anderson USA Big contribution, thanks!
Mikael Andersson Sweden
Thomas Andersson Divion Sweden
Peter Andries Belgium
Jose Angel Spain
Tor Erik Arntzen Norway
Nicolas Arrouet Onix4MAN France
Patrick Arzul Sth Africa Big contribution, thanks!
Tal Asa
Peter Askel”f Sweden
Hans-Joachim Backe Germany
Martin Bahner Norway
Erick Baker USA Big contribution, thanks!
Rodger Ballard Saqquara USA
Brandon Bannerman Catspaw USA
John Barger USA MEGA HUGE contribution, thanks!!
Alex Barnell England
Matthew Barnes USA
Jayson Barrons USA
Claus Bartels Germany
Jonathan Bartlett
Michael Baumann Germany
David Benjamin USA
Brian Bennetts Daedalus USA
Vaughan Bentley South Africa
John Bergman USA Big contribution, thanks!
Jeff Best Australia
Allen Bettilyon Tremlo USA
Bastiaan Bijl Thanatos Netherlands
Mike Blaine
Christian Bode Germany
Lembrecht Bodo Germany
Fabian Boes Germany
Vicente Beltran Boil Razz Spain
Zozo Bogyo Hungary Big contribution, thanks!
Nathan Bonfiglio Ash Please contact me!
Eman Borg Malta
Gianluca Bove Yello '73 Italy
Martin Boverhof Netherlands
Alexander Brandon Siren USA
Yannis Brown Yannis Australia
Remko Brugman Digistorm Netherlands
Michael Buchholtz Germany Big contribution, thanks!
J”rg Burbach Germany
Mike Burrell MikPos Canada
Clay Busker USA Big contribution, thanks!
Jeremy Butcher Netherlands
Robert Buecker III USA
Gunnar Buettner Germany
Jim Cairns Canada
Rimas Campe USA
Mike Cantelon Foolish Bird Canada
Isaac Carrasco Spain Big contribution, thanks!
Edward Cashin USA
Zach Cappelletti Shams Kitz USA
Michael Carlsson Silverstance Sweden
Christopher Castiglione USA
Nilton Catsillo Chile
Hector Chang ZoneSeek Canada Big contribution, thanks!
Eric Charlent Spher-X France
Eric Chavanon France
Andy Chen USA
Charles Cho Deadsoul USA Big contribution, thanks!
Kenny Chou USA
Rick Christy GrymmJack USA
Rogier Claessens Netherlands Big contribution, thanks!
Jeff Clement Canada
David Clipperton Canada
Mike Cody USA
Shoshi Cohen Israel
Caleb Coppock USA Big contribution, thanks!
Ben Cormier Canada
David Cornish Australia Big contribution, thanks!
Martin Cosgrave UK
Antony Cowderoy UK
David Cox-Espenlaub USA
Matt Cramer USA
Jim Crawford Pfister USA
Dan Cunningham Pentatonic USA Big contribution, thanks!
Daniel Cunningham Ireland
David Cuny USA
Nicholas Dahlin Denmark
Chad Dahlquist
Christopher Daniel USA
Tristan Daniel Jesus2099 France
Thomas Daniels III USA MEGA HUGE contribution, thanks!
Ben Dany
Tulio Guimaraes da Silva Brazil HUGE contribution, thanks!
Dave Davis USA
Tomer Dayan Israel
Fabio De Araujo Neves Brazil
Benoit De Greift Eagle Belgium
David Dean Sector4 Australia
Pierre Decourcelles France Big contribution, thanks!
Barthelemy Defossez France
Guy Detienne Belgium
John Dietzel USA
John Di Giacomo USA
Luciano Di Lucrezia Spectrum Big contribution, thanks!
Nick Dinges Germany
Robin Dittwald Satixu Germany
Siem Doodeman Netherlands
Asaf Dor
Stephen Dredge Australia
Andrew Dun Australia
Dave Dunger Australia
Andrew Durk USA
Florian Dvorski Thunk Germany
Brendan Ebel USA
Adam Ebringer Australia
Michael Edwards UK
John Ehmann Canada
Richard Eijkenbroek Netherlands
Michael Elis Isreal
Garrett Ellis USA
Irad Eshel Israel
Scott Esposto USA
Alexander Ewering Internal Germany
Gary Feinmesser England
Nick Feldman UK
Jim Fergusson USA
Robin Fernandes France
Dan Fetherstonhaugh England
Reuben Firmin Rubz Scotland Big contribution, thanks!
Kyle Fischer USA
Edward Flick USA
Brad Folkens USA
Adam Frank USA
Andrew Franks Derelict USA
Graham Freeman Australia
Calvin French Canada
Joseph Freund Australia
David Friberg USA
Matt Friedly Subliminal USA
Richard Funke Norway
James Furness UK
Robert Gage Australia
Miles Gannett USA
Peter Gaywood UK
Christopher General Canada
Giovanni Giampieri Italy Big contribution, thanks!
Slavko Glamocanin Slovenia
Owen Godwin USA
Markus Goetz Cookie Jar Germany Big contribution, thanks!
John Goforth USA
David Goodale Canada
Ferdinand Gozum DJ USA
Jeff Graham USA HUGE contribution, thanks!
Joseph Graham BrianXavier USA
Micah Greenlay USA
Lorenzo Grifi Italy
Sebastian Grillmaier Wayfinder Germany
Moritz Grimm Maxx Germany
Karsten Grombach Germany Big contribution, thanks!
Ariel Gross Stalker USA HUGE contribution, thanks!
Sylvian Guiraud France Big contribution, thanks!
Joe Hahn USA
Peter Hajba Skaven Finland
Doris Hamburger USA
Tim Hamers Netherlands
David Hamilton England
Eric Hamilton Dilvish USA Big contribution, thanks!
John Harris USA
Todd Hartley Tronster USA
Ian Haskin SiN Canada
John Hastie USA
Joshua Hastey Ith USA
Thomas Havelka USA
David Hays D-Range USA
Axel Hedfors Sweden
Brett Helgeson Australia Big contribution, thanks!
Greg Heo Canada Big contribution, thanks!
Liam Hesse Lemm England
Anthony Hicks USA
Robert Hilpert Germany MEGA HUGE contribution, thanks!
Erik Hjelmvik Tweety Sweden
Jason Hlisic isotone Australia Big contribution, thanks!
John Hobson USA
Rune Holm TitanStar Norway
Krystal Holstein USA Big contribution, thanks!
Alexandre Holzhey Brazil
Aake Honkaniemi PAH Finland Big contribution, thanks!
Raymon Hoving Finland
Troy Howard USA Big contribution, thanks!
Ben Howell Rhythm USA
Shu Hung Canada Big contribution, thanks!
Ryan Hunt Pinion USA
David Hunter USA
Steve Hunter UK Big contribution, thanks!
Samuel Hurst Australia
Kohan Ikin Australia
Sam Izzo Jestyr Australia
Shane Jackson MetaMan Canada
Keith Jagielski USA
Daniel Janiak Redrick Slovakia Big contribution, thanks!
Marko Janssen Netherlands
Simon Jarosch Vivid Germany
Chris Jarvis Australia
Dave Jeavons Realclean Australia HUGE contribution, thanks!
James Jeen Australia
Joshua Jersild USA
Jan Jirak Czechoslovakia
Robert Johnson Xenopraxis
Mischa Jonker Netherlands
Ben Just Australia Big contribution, thanks!
Jaakko Kaivosoja Finland
Steffen Kamprath Germany
Frank Kane USA
Ben Kapper Netherlands
Ilpo Karkkainen Griffin Finland
Tero Karkinen Finland
Thomas Karolczak Mindflyer XS
Cole Kelley USA
Keith Kelly Syrinx USA
Mehran Khalili Screamager Luxembourg
Leonard Khiroug USA
Richard Kidwell USA
Thomas Kim USA
David Klande Germany
Martin Kleinman Brain Netherlands
Martin Klossek Germany
Bart Knol Armadon Netherlands
Stephen Knowles USA
Odd Henry Knutsen Netherlands
Henning Koch Germany
Alexander Koenig Germany
David Kondrad USA
Zaf Korbetis Australia Big contribution, thanks!
Evan Korzon USA
Christopher Kowalski USA
Kristof Kowalski Cyntax Australia
Kevin Krebs Canada
Bert Kroes Netherlands
Peter Kunath Germany MEGA HUGE contribution, thanks!
Rich La Bonte Flatrich USA
Michael Ladanyi Canada
Brian J LaMattina USA
Perttu Lamminm„ki Finland
William Lamy willbe France
Adam Langdon-Thomas UK
Janet Lankester USA
Patrick Lea Australia
Jon Leahy UK HUGE contribution, thanks!
Steven LeBeau USA
Eliot Lee PrOtoCoL USA Big contribution, thanks!
Nicolas Leveille Knos France
Buzz Libre USA
Rik Ling USA
Randy Locklair USA MEGA HUGE contribution, thanks!
Michael Loftus USA MEGA HUGE contribution, thanks!
Kris Long USA
Jerome Majewski USA HUGE contribution, thanks!
Sami M„kinen Finland
Don Manton Canada
Peter Mares South Africa
Anthony Marin Verminator USA
Norman Mark Nothing More Canada
Alexander Martin Germany
Mike Ma'rton Hungary
Akos Matte Bat & Cyborg Hungary
Lucas Higa Mattsson Sweden
Nicola McAleer Ireland
Brad McKinnon EtherWizard USA Big contribution, thanks!
Ray McManus USA
Keith McNally Canada
Glen McNiece Australia
Vincent Meijer Netherlands
Mitchell Menghi Australia
David Menkes Behemoth USA
Mike Merker Canada
Jonathan Mesiano-Crookston Canada
Christopher Micali Zephyr USA
John Michael-Lloyd USA Big contribution, thanks!
Chris Michetti Canada
Pekka Mikkola Finland
Alex Milla Spain
Matthew Miller Australia HUGE contribution, thanks!
Tracey Miller Australia Big contribution, thanks!
Matthew Mitchell USA Big contribution, thanks!
Chun-Yan Miu Hong Kong
Mauro Molinari DjM Italy
Lutz M”ller Germany
Jo Moore USA
Freddy Mousseau France
Marten Mons Netherlands
F. Edmund Mueller USA
Markus Mueller G42 Germany Big contribution, thanks!
Paul Munson Canada
Aaron Murray USA
Eric Nadeau Canada
Riley Nagler USA
Tirone Nel South Africa
Frank Nentwich Germany
Mikkel Nordberg Denmark HUGE contribution, thanks!
Gary Norris USA
Fumihiro Odaki Japan
Michiyasu Odaki Japan
John O'Laughlin USA
Anthony Oetzmann AiRON Germany
Xavier Orengo USA
Frido Otten Cybertron Netherlands Big contribution, thanks!
Olli Paasovaara Finland
Robert Pain UK
Jonathan Pak Maelstrom Australia
Andre Pang Ozone Australia
Adam Parker USA
Jourden Parks AllenKray USA
Kiran Patil USA Big contribution, thanks!
Stefan Pavlov
Christian Pfaff Germany Big contribution, thanks!
Jean-Luc Pedneault Canada
Nick Pelling UK
P-J Perrussel-Morin CyberNitrox France Big contribution, thanks!
Chaim Peter-Chester USA
Claus Peterson Denmark Big contribution, thanks!
Felix Petrescu Waka X Romania
Henri Pihkala Estonia
Jason Phelps USA Big contribution, thanks!
Miklavz Pirnat
Eddie Plaskur Mexican Beans Australia
Harout Pogossian HP
Eric Pomerleau O'Realitea Canada
Pascal Q. Porcupine Spikey USA Big contribution, thanks!
William Price USA
Alexander Rahm Germany HUGE contribution, thanks!
Hazhir Ranjram Balk USA
Alessandro Rascazzo Antitesi Italy
Pasi Rastas Finland
Justin Ray Zinc Canada
Tobias Reckhard Jester Germany
Jimmy Redfern Jimmy Ireland
Justin Reid Stein USA
Viktor Rez Hungary
Owyn Richen
Dan Richters USA Big contribution, thanks!
Jay Ridley Australia
Michael Riegel USA
Todd Rieger USA Big contribution, thanks!
James Rimmer USA
Brendan Robert USA
Jeff Robinson USA
Josh Rodman K8to USA MEGA HUGE contribution, thanks!
Jens Roeben Germany
Nick Rose Phantasm Canada
Ryan Ross Canada
Benjamin Rumbaugh USA
Keijo Ruonamaa Gze Finland
Geert Rutten Loonatic Netherlands
Hannu Salonen Salomon Finland
Kevin Salt Netherlands
Mark Sanders USA
Denis dos Santos Brazil
Adi Sapir Doc Israel
Janne Savolainen Finland
Ben Saylor USA Big contribution, thanks!
Konrad Schandera iCEWiND GERMANY
H.R. Scheper-Keuter Josuf Netherlands
Gerben Schmidt Netherlands
Martin Schmidt Germany
Daniel Schwab Germany
Wolfgang Schwarz Germany Big contribution, thanks!
Matthew Scott USA
Kristian Sergiejew Poland
Saurin Shah Nebula USA
Jarrod Sharp Australia
Dan Shaw USA
Ryan Shaw USA
Shaul Shentai Israel HUGE contribution, thanks!
Philip Shipley USA
Oren Shomron Isreal
Josh Silvey USA
Morten Skarstad Norway
Peter Skeide Norway MEGA HUGE contribution, thanks!
Steven Slater Canada
Martijn Sneijder Netherlands
Trond Smevik Poke Norway
Greg Smith Canada
Zachary Smith Dr. Zachary USA
Christoph S”llner AGENT S Germany
Scott Sorenson USA
Nicolas Soudee Zoner USA Big contribution, thanks!
Michael Soutar MSoutar Australia
Kasper Souren Netherlands
Patrick Stacey Australia
Nick Stanfield UK
Andrew Ryan Stinnett USA
Ian Stocker RabiteMan USA Big contribution, thanks!
Mark Straver Moonchild Netherlands
Jer Sypult USA
Charles Tabourot France
Ravon Tamar RavEon Israel
Patrice Tarabbia Mercure France
Jason Le Sueur Tatum USA Big contribution, thanks!
Thor Teague USA
Michael Teehan USA Big contribution, thanks!
Michel ten Voorde Netherlands
Franck Theuex France Big contribution, thanks!
Michael Thomas USA
Sebastian Thomas Scotland
Jaymz Thompson
Philip Thompson UK
Franz Thues Germany
Gabriele Tittarelli T.S.P. Italy
Jason Tracer Electric Keet USA
Nash Trajkowski Australia
Eric Tremblay DeltaX Canada
Brad Turcotte Canada
Michael Twarkowsky Germany
Asbjorn Ulsberg Norway
Martin Underwood UK
Jani V„is„nen Finland
Mathew Valente TSSF Canada
David Van Dromme Stormlord Belgium
Ryan Van Eerdewijk Canada
Marti Van Lin
Erik Van Hengstum Netherlands
Ernst Van Rossum Netherlands
Filip Van Schoor Cantaloup Belgium
Jan Van Stiphout
Maarten Van Strien Crystal Score Netherlands
Jos vd Geest Netherlands
Oscar Vela Spain
Markus Visti Finland
Ganesh Viswanathan Genosha India
Benjamin Vogt Australia
Edwin Volkmer Netherlands
Vincent Voois Vv Netherlands MEGA HUGE contribution, thanks!
Fredrik Von Braun Sweden
Arno Vryman Netherlands
Petri Vuorio Finland
Ben Waddington Australia Big contribution, thanks!
Gerd Wagner Germany
Chris Wallace CTS USA
Thomas Walter Subsonic Australia
Adrian Ward England HUGE contribution, thanks!
Timothy Weller Flukey USA
Bill Wells USA
Mike Wells USA
Inyoung Whang USA
Jemi White Australia
Brian Wickman CD USA
Liam Widdowson Legend Australia
Gene Wie Psibelius USA Big contribution, thanks!
David Wiernicki Perisoft USA Big contribution, thanks!
John Williams Jackal USA
John Wilson USA
Tobias Wilton Sweden Big contribution, thanks!
Mathias Wintzer
Marco Wotschadlo Germany
Doug Wright Netriangle USA
Fuming Wu Adi Taiwan
Takeshi Yamamoto Japan Huge contribution, thanks!
Shane Yates AlphaRISC Australia
David Zearing USA
Daniel Zegiel USA
Matthias Ziegs MAZ Germany
... where's your name? :)

View File

@ -0,0 +1,577 @@
Notes about the sound drivers
Be sure to check the driver screen (Shift-F5) of your soundcard!
I often get asked what soundcard I believe is the best.
My favourite soundcard is the SBLive! produced by Creative Labs.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Driver Summary
Driver Def/Max Quick- Stereo Bits Mixing Rate/Resolution
Channels select MIDI In/Out available?
VSound Driver 64/256 Auto Yes 16 8kHz to 64kHz
VSound Driver MMX 128/256 Auto Yes 16 8kHz to 64kHz
For more details on the VSound drivers, check ITVSOUND.TXT
PC Speaker 64/256 /S1 No 5-7 12->44kHz
DAC on LPT 64/256 No 8 12->44kHz
GUS, Hardware * 32/32 /S7 Yes 16 19->44kHz (A)
GUSMAX, Software * 64/256 Yes 16 8->64kHz
Interwave, Hardware * 32/32 /S8 Yes 16 44kHz, MIDI In + Out
Sound Blaster 1.0 * 64/256 /S2 No 8 12kHz->22kHz
Sound Blaster 2.0 * 64/256 /S3 No 8 12kHz->44kHz
Sound Blaster Pro * 64/256 /S4 Yes 8 6kHz->22kHz (B)
No 8 12kHz->44kHz (B)
Sound Blaster 16 * 64/256 /S5 Yes 16 12kHz->44kHz, MIDI In
Sound Blaster AWE 32* 30/30 Yes 16 44kHz, MIDI In + Out
Pro Audio Spectrum 64/256 /S9 Yes 8 12->44kHz
Pro Audio Spectrum 16 64/256 /S10 Yes 16 12->44kHz
Windows Sound System * 64/256 /S11 Yes 16 8->64kHz
ESS 1868 AudioDrive * 64/256 /S12 Yes 16 22->56.8kHz, MIDI In
ESS 1688 AudioDrive 64/256 Yes 16 8->48kHz
EWS64 Codec * 64/256 /S13 Yes 16 8->48kHz
Ensoniq SoundscapeVIVO* 64/256 /S14 Yes 16 8->48kHz
SoundTrack PCI * 64/256 Yes 16 8->48kHz
MPU401 MIDI Driver - /S19 - - MIDI In + Out
Disk Writer * 256/256 /S20 Yes 16 8->64kHz
* = Driver will play in the background of Windows '95
Notes
A) Depends on number of channels used. The hiquality GUS driver reinitialises
the GUS continually to use as few channels as necessary. Some GUS cards
cannot cope with this and you will need to use the alternative ITGUSLO.DRV
instead.
B) The mixing rate of the SBPro depends on whether playback is stereo or mono
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PC Speaker (ITPCSPKR.DRV)
Nothing much else to say here, except... GET A SOUND CARD! :)
Note: On the info page, using the 'variables' display WILL distort
PC Speaker output. Also, it has been found that the Info Page
screens and the Pattern Editor cause a noticeably higher amount
of hiss through the speaker.
Note: This driver *MAY NOT* work on laptop's piezo-electric speakers.
Note: No driver screen available.
Note: Not for use with Win95
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DAC on LPT 1/2 Drivers
These drivers are almost exactly the same as the PC speaker drivers,
with only minor modifications.
To use these, run IT /sITLPT1.DRV or IT /sITLPT2.DRV - depending on
which LPT you have your DAC plugged into.
Note: If you're interested in building your own parallel port DAC,
check out: http://www.dnc.net/users/collver/dac.htm
or: ftp://ftp.informatik.hu-berlin.de/pub/os/linux/hu-sound/
Note: No driver screen available.
Note: On the info page, using the 'variables' display WILL distort
PC Speaker output. Also, it has been found that the Info Page
screens and the Pattern Editor cause a noticeably higher amount
of hiss through the speaker.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Gravis UltraSound, Hardware mixing (ITGUS.DRV)
This file actually contains two drivers in one file. The first is
accessed just by using IT (with no command line parameters, or with
/s7 for Gravis UltraSound). This is equivalent to the original
internal driver that came with previous versions of Impulse Tracker.
The second driver is selected by providing the correct IRQ for the
GF1 chip. (The second-to-last number of your ULTRASND environment
variable). This is an IRQ driven routine, which means that it'll
work in the background of Windows '95. But note that the timing for
this is NOT as accurate as the timing in the first driver. There is
also a possibility that multitasking OSs can sometimes (although
rarely) cause some settings to the GUS to be missed (which will cause
a note to play unexpectedly). This can be fixed just by restarting
playback. There is NO check for the correctness of the IRQ provided.
Note that the IRQ driven routine doesn't seem to work on all
computers either.. :(
The Gravis UltraSound *CANNOT* cope with 16-bit samples greater than
256k-bytes. This is equivalent to 128k-length samples. Also, 16-bit
samples cannot cross 256k boundaries on the GUS, meaning that the
amount of memory you have on the card may decrease by more than you
expect when you load a 16-bit sample.
You cannot choose the mixing rate for the GUS - the mixing rate is
dependent on the number of channels playing. This driver continuously
reinitialises the GUS to use as few channels as possible. You can
further restrict the number of channels used with /Lxx on the command
line of Impulse Tracker.
Gravis UltraSound 2, Hardware mixing (ITGUS2.DRV)
If the first Gravis UltraSound driver clicks continuously when nothing
is supposed to be playing, use this driver ("IT /sITGUS2.DRV").
This driver file also contains two drivers - check above on how to
access the second driver.
Gravis UltraSound Lo-freq, Hardware mixing (ITGUSLO.DRV)
Only use this driver if notes do *NOT* finish playing off correctly
on your GUS. ("IT /sITGUSLO.DRV" or copy ITGUSLO.DRV over ITGUS.DRV)
This driver does not try to continuously reinitialise the card to use
a minimum number of channels like the above two drivers do.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Gravis Ultrasound MAX - Software mixing (ITGUSMAX.DRV)
This device has ONLY been included because it works for SOME people.
It has NEVER worked under Win95 with GUS drivers installed as far as
I know. If it doesn't work for you - I'm sorry, you'll have to use
the hardware drivers. Don't write to me and complain if they don't
work for you - you probably won't get a reply.
To use this driver, you MUST specify your GUSMAX's Codec IRQ *AND*
DMA on the command line as:
IT /sITGUSMAX.DRV /i<irq> /d<dma>
If you want to specify a port (which should be auto-detected OK),
the port is of the Codec, NOT the GUS's Base Address.
(ie. 32Ch NOT 220h)
Note: After some testing, it *seems* that you'll need an ULTRINIT
of version 2.28a or above to use this driver...
Here's part of an EMail that I received from Jarkko Seppanen on how he got
ITGUSMAX.DRV working:
I just found a weird way to make the GUS MAX software mixer to work (for me,
at least). I normally use DMA 6 for playback and DMA 7 for recording. I was
playing around with IT and trying to get the driver to work and changed
both DMAs to 1. And for my surprise it started to work. Next I tried it
with both DMAs 6, with the same result. But the funny thing is, when I
first play a song with both DMAs the same and then change them back to the
original (6 and 7), it still works. I'm using IT v2.11 with ultrinit v2.31.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
InterWave Driver - Hardware mixing (ITIW.DRV)
(This includes GUS PnP, GUS PnP Pro, WavExtreme 32 Pro + more)
You *NEED* to have RAM onboard your soundcard to use this driver,
otherwise your Interwave card will NOT be detected.
This file actually contains two drivers in one file. The first is
accessed just by using IT (with no command line parameters, or with
/s8 for AMD Interwave IC). This is similar to the original internal
GUS driver that came with previous versions of Impulse Tracker.
The second driver is selected by providing the correct IRQ for the
Interwave chip. (This is the value given in Windows'95/settings/
control panel/system/Interwave SYNTH/IRQ). This is an IRQ driven
routine, which means that it'll work in the background of Windows '95.
But note that the timing for this is NOT as accurate as the timing in
the first driver. There is also a possibility that multitasking OSs
can sometimes (although rarely) cause some settings to the GUS to be
missed (which will cause a note to play unexpectedly). This can be
fixed just by restarting playback (or reinitialising in severe cases).
There is NO check for the correctness of the IRQ provided.
The Interwave driver contains handlers for two different memory modes
on the Interwave - the more memory efficient mode is where the amount
of ram is directly compatible with the interwave, the second is where
the DRAM configuration is NOT directly compatible with the interwave
and the driver has to handle the RAM slightly more explicitly, which
causes the loss of memory-usage efficiency.
Here are the modes directly compatible with the interwave:
Bank 0 Bank 1 Bank 2 Bank 3 Total
256Kb 0 0 0 256Kb
256Kb 256Kb 0 0 512Kb
256Kb 256Kb 256Kb 256Kb 1MB
256Kb 1MB 0 0 1.25MB
256Kb 1MB 1MB 1MB 3.25MB
256Kb 256Kb 1MB 0 1.5MB
256Kb 256Kb 1MB 1MB 2.5MB
1MB 0 0 0 1MB
1MB 1MB 0 0 2MB
1MB 1MB 1MB 1MB 4MB
4MB 0 0 0 4MB
* 4MB 4MB 0 0 8MB
* 4MB 4MB 4MB 4MB 16MB
* These modes cannot be handled by the first driver, so are actually
handled in the second mode.
The mixing rate for the Interwave driver is fixed at 44100Hz
(CD quality)
Bug warning: If the sound does NOT play properly, you may need to
run IWINIT before running Impulse Tracker
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Sound Blaster 1.0 driver (ITSB.DRV)
The Sound Blaster has a mixing range of 12000->21739 Hz. You CANNOT
hear any stereo (or surround) effects with this driver, because the
Sound Blaster does NOT support stereo.
Hardware detection routines are used for Address (eg. 220h),
environment is checked for IRQ and DMA.
Command line arguments for IRQ and DMA are NOT checked but assumed
correct IF this driver is explicitly selected
(IT /s2 or IT /sITSB.DRV).
Sound Blaster 2.0 driver (ITSB2.DRV)
The Sound Blaster 2 driver is basically the same as the Pro driver
with stereo options removed... (ie SB2 cannot do stereo). The
mixing range is from 12000 to 43478 Hz.
Hardware detection routines are used for Address (eg. 220h),
environment is checked for IRQ and DMA.
Command line arguments for IRQ and DMA are NOT checked but assumed
correct IF this driver is explicitly selected (IT /s3 or
IT /sITSB2.DRV).
Sound Blaster Pro driver (ITSBPRO.DRV)
The Sound Blaster Pro has a mixing range of 12000->43478 in mono mode,
or 6000->21739 in stereo mode.
Hardware detection routines are used for Address (eg. 220h),
environment is checked for IRQ and DMA.
Command line arguments for IRQ and DMA are NOT checked but assumed
correct IF this driver is explicitly selected
(IT /s4 or IT /sITSBPRO.DRV).
Sound Blaster 16 driver (ITSB16.DRV, ITSB16B.DRV, ITSB16C.DRV)
The Sound Blaster 16 has a mixing range of 12000->45454 in either mono
or stereo modes.
If you specify this driver ( IT /s5 or IT /sITSB16.DRV ) AND an IRQ
or DMA, IT will try to *FORCE* the SB16 to use the IRQ/DMA.
eg. On my system, I have my SB16 configured to IRQ 2, DMA 5, but I
can force it to use IRQ 7, DMA 0 with IT /s5 /i7 /d0
Hardware detection routines are used for all Address, IRQ and DMA.
Note: If you select either of the 32-bit mixing modes, then volumes
between 0->32768 are used internally instead of 0->128.
The second driver, ITSB16B.DRV is a cut down version of the main
driver which does NOT have the advanced mixing options - the only
benefit of this is that it requires less memory. To use this, type:
"IT /sITSB16B.DRV". If you want to have this file automatically used
just copy it over ITSB16.DRV.
To get MIDI input, I had to do this in Win95:
Goto "My Computer", right click -> properties -> device manager ->
sound, video and multimedia -> SB16/AWE32 DSP
Now go to the "resources" tab, and unclick "Use automatic settings"
Either:
1) Change your MIDI port from 300h to 330h or
2) Select a 'basic configuration' which doesn't include the MIDI port
( 3) Get an updated driver from Creative Labs, if they've fixed it )
Click OK, then click OK on the warning message.
There is a good chance that it should work now. I believe this is a
bug in the older Win95 SB16 drivers. (I *know* that the SB16 driver
I have prevents MIDI in DOS boxes and is the cause of these problems
because if I remove it, MIDI works flawlessly in DOS boxes in in Win95)
;---------- ITSB16C.DRV --------
I finally managed to encounter a computer which wouldn't accept IT's
old SB16 drivers - and hence I created ITSB16C.DRV.
If you run ITSB16.DRV and the playback cursor does NOT move, then
you MUST close your Win95 box (or restart your computer), *then* run:
IT /sITSB16C.DRV
This driver is similar to ITSB16B.DRV in that it is a cut down
version of the full SB16 driver, but this one also has the MIDI
input disabled (which seems to be causing all the problems on the
cards which just won't 'play')
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Sound Blaster AWE 32 drivers (ITAWE32.DRV, ITAWE32B.DRV)
The Sound Blaster AWE 32 driver directly uses the EMU8000 synth chip.
This synth chip has several limitations which you should be aware of:
ù It can only use 16-bit samples.
8 bit samples are automatically converted by IT (so that's not a
problem), but your free memory may decrease by double of what you
expect. (eg. you will need at least 1MB of memory to load 512k
of 8 bit samples)
ù It doesn't support ping pong loops or no loops.
IT will automatically expand ping pong loops and will pad non-looped
samples with silence, but this makes sample sustain loops impossible
to implement fully. It also means that ping pong looped samples
could take up to double the memory of forwards looped samples.
Sustain loops will NOT operate on the AWE32 driver. Instead, they
will be treated as NORMAL loops.
If you change the loop type from none->forwards or
forwards->ping pong or ping pong->none, you WILL need to reload
the samples each time (Ctrl-G). If you change the loop points on
a sample, you *will* have to reload the samples (Ctrl-G)
ù Has a limited frequency range - from the programming information,
it seems that it is impossible to play a note at above 176kHz.
This equates to any notes 2 octaves above middle C (or higher) for
a sample at 44kHz. If a note is not played because of this
frequency limitation, a message will show at the top of the screen
indicating that the frequency range has been exceeded.
Note: The Address used for the SB AWE 32 is the address of the EMU8000,
NOT the address of your SB. (for command line params, eg A660)
Note: This driver is NOT used as a default, as many users would benefit
more from the SB16 driver. (I recommend having at least 2MB
of memory if you want to use this driver). Run "IT /s6" if you
do want to use this driver.
Note: This driver can operate in Win95. In this mode, it uses a
different mechanism which allows the playing of music in the
background, but timing is *NOT* as accurate here (accurate to
around 100 milli seconds as opposed to 800 nano seconds per
frame)
Note: The second driver, ITAWE32B.DRV, is for people who do *NOT* have
a floating point unit (ie. 386, 486SX computers). ITAWE32.DRV
is preferred as it requires less memory.
To access ITAWE32B.DRV, run "IT /sITAWE32B.DRV"
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Pro Audio Spectrum (ITPAS.DRV)
Pro Audio Spectrum 16 (ITPAS16.DRV)
BIG thanks to Pelusa for VITAL programming information for this!!
BIG thanks to MZ/PoP for lending me a PAS16 to stuff around with!!
Note: These drivers will *NOT* work in the background of Win95,
although they will work fine in the foreground.
Note: You NEED to have the MVSOUND.SYS driver installed for these
to operate or a Window's system driver.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Windows Sound System (ITWSS.DRV, ITWSS2.DRV)
Again, BIG thanks to Pelusa for VITAL programming information for this!
ITWSS is a 16-bit driver, with output frequencies ranging from 8kHz to
64kHz (!). Mixing speeds above 48kHz *MAY* not work on all Windows
Sound System Cards.
ITWSS.DRV is a completely IRQ driven routine. Although this may not be
compatible with *ALL* soundcards, it permits background playback in
Windows'95 and is FAR MORE EFFICIENT than ITWSS2.DRV. ITWSS2.DRV should
be used if ITWSS doesn't operate properly.
Note: There is *NO* autodetection on IRQ/DMA. You *will* need to set
these on the command line if they are not IRQ7/DMA1.
If you *DO* specify IRQ and/or DMA, then it must be DMA 0, 1 or 3,
and IRQ 7, 9 10 or 11. Impulse Tracker will attempt to SET the DMA/IRQ
of your WSS card to these values, in a similar manner to how the SB16
driver operates.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ESS ES1868 AudioDrive (ITES1868.DRV)
The drivers for the ESS ES1868 AudioDrive use the PnP registers to
detect/configure this soundcard. If you have disabled the PnP on the
card the driver may not work...
The default mixing rate is 44kHz, although the card can handle up to 56kHz
Thanks go out to Diablo for pointing me in the right direction to find
the programming information and Andrew Lee for lending me a card to
program with!
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ESS ES1688 AudioDrive (ITES1688.DRV)
This driver was written for Synergy ViperMAX / GUS Extreme soundcards,
so that the codec may be used to write songs > 1MB large.
Thanks go to James Hsu / Synergy for providing me with a card to work on.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
EWS64 XL Codec (ITEWSCOD.DRV)
Like the ESS ES1868 Audiodrive, this card uses the PnP registers to
detect/configure the soundcard. The default mixing rate is set at 48kHz
Big thanks go out to the entire TerraTec team for providing me with a
card to use - especially Kay "Mod4Win" Bruns.
Notes:
þ The settings within the EWS64 Codec driver are saved upon exiting.
þ The "Reverb Types" are:
0: Room1
1: Room2
2: Room3
3: Hall1
4: Hall2
5: Plate
6: Delay
7: Pan Delay
The parameter "Reverb Feedback" only has meaning for Reverb Types Delay
and Pan Delay (6 and 7)
þ The "Chorus Types" are:
0: Chorus1
1: Chorus2
2: Chorus3
4: Feedback Chorus
5: Flanger
6: Short Delay
7: Feedback Delay
Note: Chorus will only work with EWS64 XL rev 1.1 or greater
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Ensoniq SoundscapeVIVO (ITVIVO.DRV)
The drivers for the Ensoniq SoundscapeVIVO use the PnP registers to
detect/configure this soundcard. If you have disabled the PnP on the
card the driver may not work...
The default mixing rate is 48kHz.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Sound Track PCI Codec (ITSTCODE.DRV)
This driver uses the PCI registers to autodetect the card. Unfortunately
this does not always seem to be the correct value, hence you may have to
override the parameters on the command line. (The computer *MAY* hang if
the correct values are not available!)
Sound Track 97 PCI and Sound Track 42 PCI cards are handled by this driver.
The 'extra' settings of reverb, chorus, echo, equalizer and surround are
not available on the ST42 cards. SRS settings are available.
Notes:
þ The settings within the ST97 PCI Codec driver are saved upon exiting.
þ The "Reverb Types" are:
0: Room1
1: Room2
2: Room3
3: Hall1
4: Hall2
5: Plate
6: Delay
7: Pan Delay
The parameter "Reverb Feedback" only has meaning for Reverb Types Delay
and Pan Delay (6 and 7)
þ The "Chorus Types" are:
0: Chorus1
1: Chorus2
2: Chorus3
4: Feedback Chorus
5: Flanger
6: Short Delay
7: Feedback Delay
Huge thanks go to Hanmesoft Corporation for providing me with this awesome
card to work on! (check out http://www.hoontech.com)
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MPU401 MIDI Driver
The MPU401 MIDI driver provides a MIDI Driver to support MIDI Input and
MIDI Output on general soundcards. It does NOT support sample playback
at all. Trying to play a sample will result in the note being 'terminated'
immediately.
To use this driver, you may need to provide the MIDI port on the command
line;
eg. "IT /s19 /a360"
Addresses 330h and 300h are checked if a port is NOT specified.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Disk Writer
The ITWAV.DRV included with distribution IT is a mono-only
example device. To use it, run IT /sITWAV.DRV or IT /s20
The full ITWAV.DRV file which *IS* capable of stereo output
is NOT available for public distribution. Contact me if you
wish to obtain this - it will NOT be made available without
some sort of (monetary) agreement (US$30 for non-profit use)
Details
þ 16 bit Stereo/Mono output
þ 22kHz to 64kHz output frequency
þ 16 bit quadratic spline interpolation (65536x 'oversampling')
þ 32 bit mixing
þ Logarithmic volume ramping with 32768 internal volumes levels.
þ Sample cut click removal techniques
þ Resonant filtering
To use the disk writer, run: "IT /sITWAV.DRV" or "IT /s20".
The files will be created in the same directory as IT.EXE,
and will be of .WAV format. You can change the destination
directory on the diskwriter's driver screen (Shift-F5.)
It is greatly suggested to use a disk cache to improve the
writing speed.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

View File

@ -0,0 +1,33 @@
Impulse Tracker Version 2.14
In the Impulse Tracker ZIP, you should find the following files:
IT.EXE - The whole program!
IT.TXT - User's manual to Impulse Tracker
IT.DOC - User's manual in Microsoft Word format
CONTRIB.TXT - List of contributions - where's your name??
DRIVERS.TXT - List of sound drivers for Impulse Tracker + various notes.
If you have a question related to sound quality, sound cards
or sound card specific questions, check this DOC first.
UPDATE.TXT - History of Impulse Tracker.
HINTS.TXT - Just a little compilation of hints for new composers.
FILE_ID.DIZ - Compulsory description file :)
FILES.TXT - You should know what this is by now!
BUGS.TXT - A list of a few known things that are wrong.
SUMMARY.TXT - A convenient, small reference that I recommend ANYONE to
print out.
MIDI.TXT - MIDI Out information written by Andre Pang
(Ozone/Vault)
IMPULSE.FAQ - Frequently Asked Questions file.
ITMIDI.CFG - Basic configuration file for MIDI Output
KEYBOARD.ZIP - Alternative keyboard definition files + source to create
your own
*.DRV - Sound driver files for Impulse Tracker
If you do distribute this program (and please do!), then I would be most
grateful if you keep ALL of the files intact.
- Jeffrey Lim
(Pulse)

View File

@ -0,0 +1,12 @@
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Impulse Tracker v2.14 ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³þ MOD, 669, S3M, MTM, XM, IT supported ³
³þ 8/16 bit samples, ping pong loops ³
³þ 64 Channel/256 Tracks, Full panning ³
³þ Volume/Pan/Frequency envelopes ³
³þ Huge variety of soundcards supported ³
³þ Huge variety of sample formats supported³
³þ 10 Stage pattern editing undo buffer ³
³þ Internal message editor ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

View File

@ -0,0 +1,143 @@
Impulse Tracker and Resonant Filters
Wanna know how to get resonant filters working in IT? Read on.
Implementation
--------------
So far, resonant filters have only been coded into the MMX drivers - so any
soundcard which has an MMX driver for IT will support resonant filters. Of
course, this means that your computer has to have MMX before you can run them.
To hear resonant filtering, you'll first need to select "Filtered" mixing on
Shift-F5.
Do NOT write to me about non MMX resonant filtering.
Resonant filters CANNOT be included with hardware GUS / Interwave drivers. The
reason is because these chips do not support resonant filtering in their mixing
algorithms.
The AWE 32 driver has *approximate* support to IT's software resonant
filtering. Songs written using resonant filters on the AWE32 will not sound
exactly the same with other drivers.
The diskwriter has all resonant filtering code, of course. (No MMX required)
Note that the only external player to have resonant filtering implemented is
MikIT. If you use any other player to play your songs that use resonant
filtering (including earlier versions of IT), they will not be played
correctly.
First note
----------
If you do use filtering in your songs, you probably should embed your MIDI
Output configuration into the .IT file. This makes the file slightly bigger,
but it ensures that your song will be played correctly on any filter-capable
driver on any computer. This is selected by turning the "Embed MIDI Data"
on the MIDI screen (Shift-F1) to "on".
Simple filters
--------------
For most users, this is all that you will need to know.
The default configuration for IT (copy ITMIDI.CFG to your IT directory) will
recognise Z00->Z7F as set filter cutoff frequency and Z80->Z8F as set filter
resonance.
Z00 is the lowest filter cutoff, Z7F is the highest filter cutoff
Z80 is the least resonance, Z8F is the highest resonance
If you wish to reconfigure the resonant filters or perhaps create some extra
shortcuts, then read below!
How the drivers recognise filters
---------------------------------
The drivers know what to filter by intercepting MIDI messages. This does NOT
mean that filters will require any sort of MIDI equipment, just that the
mechanism to instruct the driver to filter a particular note within IT itself
is made via the MIDI interface.
The instructions that the drivers understand so far are:
F0 F0 00 <value> - Set filter cutoff frequency to <value>
F0 F0 01 <value> - Set Q factor (resonance) of filter to <value>
In each of these cases, <value> is between 00 and 7Fh. Values above 7Fh are
ignored. Note that if filter cutoff is set to 7F and Q is set to 0, then no
filters are applied.
How to tell the drivers these Instructions
------------------------------------------
OK.. so how can we tell the drivers these instructions?
For a full explanation, check MIDI.TXT - a short explanation is provided here.
First of all, go to the MIDI Output configuration screen in IT. Do this by
pressing Shift-F1, then clicking on the "MIDI Output Configuration" button.
You will see several MIDI configurations, then SF0->SFF then Z80-ZFF (that
bottom window is scrollable).
Using Z80 to ZFF
----------------
Z80->ZFF are the easiest to explain.. so I'll explain them first.
If you type in "F0 F0 01 3F" next to Z80 (make sure that you have the letters
in upper case), then whenever you use Z80 in a pattern, "F0 F0 01 3F" will be
sent to the driver. If you refer back to what instructions the driver
understands, you'll see that this means "Set filter resonance to 3F".
A few more examples:
Z81 = F0 F0 00 40 - set filter cutoff frequency to 40h
Z82 = F0 F0 01 20 - set filter resonance to 20h
Z83 = F0 F0 00 10 - set filter cutoff frequency to 10h
Using SF0->SFF
--------------
SF0->SFF are slightly more difficult to explain.. but hopefully a few examples
will make their usage clear.
When you use Z00 to Z7F in a pattern, they do not directly translate in the
same way as the Z80->ZFF do. Instead, they set a variable internally called
'z' that gets substituted into one of the SFx commands.
Example 1 - If you set SF0 = F0 F0 00 z (on the MIDI Output configuration)
Then using Z01 will cause "F0 F0 00 01" to be sent.
Z01 = F0 F0 00 01 - Set filter cutoff frequency to 1, as above.
Z10 = F0 F0 00 10 - Set filter cutoff frequency to 10h
Z30 = F0 F0 00 30 - Set filter cutoff frequency to 30h
Z50 = F0 F0 00 50 - Set filter cutoff frequency to 50h
Example 2 - If you define:
SF0 = F0 F0 00 z
SF1 = F0 F0 01 z
Then:
SF0 - Set Zxx to use SF0
Z30 = F0 F0 00 30 - Set filter cutoff frequency to 30h
Z50 = F0 F0 00 50 - Set filter cutoff frequency to 50h
SF1 - Set Zxx to use SF1
Z20 = F0 F0 01 20 - Set filter resonance to 20h
Z3F = F0 F0 01 3F - Set filter resonance to 3Fh
Z50 = F0 F0 01 50 - Set filter resonance to 50h
SF0 - Set Zxx to use SF0
Z30 = F0 F0 00 30 - Set filter cutoff frequency to 30h
Z10 = F0 F0 00 10 - Set filter cutoff frequency to 10h
SF1 - Set Zxx to use SF1
Z20 = F0 F0 01 20 - Set filter resonance to 20h
Z30 = F0 F0 01 30 - Set filter resonance to 30h
Note that the default startup configuration for each channel is SF0, so the
first SF0 in example 2 is unnecessary.
Resetting the Filters
---------------------
Since the filters are driver related (and IT.EXE really doesn't know about
their existance), they are not reset automatically when you stop/play a song.
If a MIDI Reset (FFh), MIDI Start (FAh) or MIDI Stop (FCh) message is
received, then the driver will reset all of it's internal tables. The default
configuration will send both MIDI Reset and MIDI Stop commands.
Final Notes
-----------
Umm.. Enjoy :)
- Jeffrey Lim

View File

@ -0,0 +1,572 @@
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for Composers
-- Pulse
Well, I'm not the best person to ask for hints, but here are a few anyway.
1) Never release your first song. There are very few people who are gifted
enough to really make a quality song the first time - it's all practice
and experience! Once you *HAVE* finished a song, listen to it a couple
of days after... see whether you can view it from another point of view.
2) For channel echoes, use the Mxx command in a second column - this will
save you from adjusting volume related effects (ie. you can leave all the
Dxx commands alone, and it'll sound right)
3) Don't be afraid to create multiple instruments from the same sample! The
reason for why I created instruments the way I did was so that you could
have different *articulations* of the same sample. You can achieve this
by playing around with the envelopes, fadeout, NNA - whatever.
4) Listen to other tracked music. Try and learn how other composers have
achieved the sound they did. Experiment yourself.
5) Start by writing music that *YOU* really like listening to - don't try and
write am orchestral piece if you don't listen to it - it'll show.
6) Take the time to tune all your samples as accurately as possible! To do
this, play a long, clear, looped sample, then move to another channel
(using '.') and tune ALL your other samples to this one sample (so they
all have the same reference). Many potentially excellent modules have
been spoilt because they were poorly tuned. Of course, this doesn't
count the cases where samples are intentionally slightly sharp or flat
for effect (which should be the rarity instead of a rule).
7) Try to avoid having too many samples at central panning - if you modify
the initial panning - you should be able to 'fill' out the sound with
very little extra effort. Or perhaps if you use instruments, you may
want to play around with instrument's default panning...
Pitch pan separation also provides a very convenient way to achieve a
nice pan.
8) To find the 'perfect' loop:
a) If you have a GUS/IW, first turn the loop off, then reload all GUS
samples (so that their entire waveform is loaded).
b) Now, select either a forwards or ping pong loop. Only select forwards
if you have a sample which has the same amplitude at both ends. If
you have a sample which has vibrato incorporated into the sample, then
you'll probably find ping pong loops inappropriate. If the sample has
an obvious reoccuring shape to it's waveform, try to account for that
when you select your initial guess at a loop.
c) Play a note at a MUCH higher pitch than you'd normally play it at.
Then, hold down '+' (or '-') on on of the loop boundaries to find a
region of lowest clicking. Then adjust it carefully (one byte at a
time) until you find the best loop location. You will normally need
to change both beginning and end points of a ping pong loop to find
a nice loop, whereas forwards loops usually only require either loop
end or beginning to be modified.
d) Now that you have a decent loop at this pitch, decrease the pitch
(typically by an octave)
e) Repeat steps (c) and (d) until you have a nice loop at the pitch that
that sample is played at.
f) Once you've finished and if you're using a GUS, press Ctrl-G (to
reload the Gravis' samples) and do a final check that you have an
appropriate loop.
This method works very well MOST of the time - don't forget that the '+'
and '-' keys can be used to easily modify the loop - and the changed loop
is taken into account when you change it (ie. you don't need to replay the
sample).
9) If you want to make a song realistic, try to imagine how the instrument
would be played. Pretend you are a musician when you write a part..
Also, if you use an instrument such as a piano, try to use more than a
single piano note - a real piano will ALWAYS have more than one note
playing at a time - use some chords, etc.
10) For a nice fill to the sound, try to balance the usage of low and high
frequencies. Songs with too much bass and too little treble sound rough,
songs with too much treble and too little bass sound insubstantial.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for New Composers
-- John Hawksley (a.k.a. Greebo)
1) Listen!
2) Spend a day figuring out every feature of the tracker.
Yes, I'm talking about all the effects and all the keys.
ST3 is widely acknowledged to be a bitch to learn, but is (sorry,
*was*) the most powerful tracker out. Once you have all the
keys and functions sorted, you'll be ripping around IT's in
no time. You can leave the advanced instrument stuff for now.
3) Listen to other tracks, find out how the nice-sounding bits are
done. (ie look at the effects and volume/pan column).
4) Be different. A lot of .MODs are in the same style. Sure, if you
like this and feel comfortable with it, then go for it! But if you
want to create a new feel -- do that too. People are always ready
to try new styles. I personaly enjoy arranging (that covers
a lot of styles) but you might like composing rock tracks, for
instance. So do it!
5) Samples. Be selective. Sort all your samples into directories.
If you have an editor, the trim thein sample; try to remove the
noise or click at the start. Remember -- samples are the building
blocks from which we craft music. If the samples are bad,
the music will be too.
6) Tune the samples! When you rip a sample or create one yourself
try to do it at the same pitch, or tune it (using the speed value)
so that everything is uniform. This will save much hair-pulling
later as you try to figure out why half the piece seems to be
in G# major and half is in Dflat minor.
6) Chords. Originaly, people used to sample whole chords to save
sample space. Now we've got this wonderful IT with it's gazillions
of channels. From ST3 onwards, I have been contructing chords
from notes because I had the space to do so. The sound is better
and is more of a professional approach.
However (there's always a 'but'): be very careful! If you decide
to construct a chord rather than use a single sample, some
musicianship is required. Simple major chords are easy, but
inversions really add to a piece. If you are able to do it this
way (look at some piano parts to any of my stuff, for instance),
you'll get s professional, crafted sound. But it does take
a long time before you'll get a smooth flowing part.
7) Saving. Okay, so IT hasn't crashed on me yet, but when (if) it
does, I'm not going to loose an hours work. Save regularly.
Never use IT or ST3 under the GUI in 95 and under Windows 3.1;
I found that occaisionaly, windows would do some swapping while
ST3 was saving and the module would be corrupt; but ST3 said
it was saved ok. Lesson learnt.
8) Releasing. FTP sites are hard to come by these days. Probably
the best method of release is to uuencode your work and
post it to alt.binaries.sounds.mods newsgroup.
Hope these are of some help. Remember to visit the Mod Resource Web
at http://www.armory.com/~greebo/mod.html
I can be contacted at greebo@armory.com.
Good luck!
John H.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for Composers
-- ToalNkor / Realtech
TIP FOR LOADING EITHER LEFT OR RIGHT CHANNEL OF A STEREO SAMPLE :
Load the sample as usual and then follow these steps :
If you want the LEFT channel : Just divide the length by 2
by using Ctrl-F. This will delete one byte out of two, and therefore
only the "first" sample (the left one) will remain !
If you want the RIGHT channel : Cut the first and last byte of the
sample (By looping it and using Ctrl-B and Ctrl-L). If the original
sample sise was X, then the actual size should be X-2. From now on,
just follow the same indications as for the left channel and tadaa...
your Right channel sample is ready for use !
After all these operations, dont't forget to multiply the mixfrequency
by two to get the original samplingfrequency back !
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for New Composers
-- StereoMan
1) The easiest way to produce flanging like effect is to play same sample in
two channels (they must have exactly the same pan-position) and lower or
higher the playing frequency of one of the samples - ie:
1 2 2 (1 is same)
³... .. .. Xpp³... .. .. Xpp³ ³... .. .. Xpp³
³xxx ii xx ...³xxx ii xx EE1³ or ³xxx ii xx u11³
³... .. .. ...³... .. .. ...³ ³... .. .. u00³
u00 and so on.
<pp> has the same value in the two channels.
<ii> is your instrument number.
<xxx> is the note you play the sample in.
2) You can use the above mentioned effect, but instead of having the channels
with the same pan position you can put them as Left and Right (full) ie:
³... .. .. X00³... .. .. XFF|
. . .
this will give you a smooth three dimensional sound.
Note: This effect has not been tested on SurrounD equipment - the results
are li'l unpredictable.
3) Quite a good way to make reverb-like-echos is shown below:
Let's say You have some sequence playing in one channel. Put the same into
another channel and insert one or two (or more) rows before the beginning.
Now set all volumes to zero (alt-v) and clear volumes which are not
associated with notes (alt-w). Then apply a Dx0 effect (x=1..4 or more)
for example:
³n1. i. .. ...³... .. .. ...³ The results are very good.
³n2. i. .. ...³n1. i. 00 D20³ Once you get used to this you can
³... .. .. ...³n2. i. 00 D..³ achieve !very! smooth sound.
³n3. i. .. ...³... .. .. D..³
³... .. .. ...³n3. i. 00 D..³ The samples must not be too short
³n4 i. .. ...³... .. .. D..³ so Dx0 can take effect.
³... .. .. ...³n4. i. 00 D..³
4) If you make the above channels with different pan positions (x22 and xDD)
or (x80, s91) - the results are stunning :)
5) Take your time to read the whole help (yes, the whole of it) - you'll
be surprised to find what hides under your keyboard :)
6) Make your tunes as small as possible. People are not quite happy to find
they have a 3 or 4 Megs of crap on their already full HD drives.
Remember: the smaller = the easiest to spread.
7) NEVER start tracking if you're not into the right mood to track. You'll
only loose time and perhaps make another crappy tune.
8) Funny, but I've found that making your own color scheme truly inspires!
9) Experiment! Play around with the effects, envelopes and NNAs. They all
make music sound more realistic!
George Marinov a.k.a. StereoMan - <georgehm@bse.bg>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for composers
-- Ilpo Karkkainen
- If you listen only one kind of music, it will shut your mind from others. Be
versatile. When you listen lots of different kinds of music styles, it also
makes your composing a lot more wider and colorful.
- When listening to music generally, try to sometimes consentrate to something
specific, for example backing vocals or drums. It helps you realize the whole.
It's also good to try listen what different notes there are in a chord that
you hear. At least to me, it has been very helful in chord progression.
- Details make the whole. Use them wisely, though. Too much details make the
song sound bad. I've noticed that in some of my songs.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Onix4MAN's hints
1) CLEANING A WAV FILE UNDER IT.
2) CREATING NEW SAMPLES WITH IT.
3) 3 (4?) METHODS TO MAKE YOUR MODS SOUND MORE SPACIAL..
1) CLEANING A BAD SAMPLE UNDER IT:
-----------------------------------
To clean up samples that click at their start (or end) because the waveform
has an error at its start (still or end), without going under a wav-editor:
-turn on Loop
-start the loop at 100 bytes for samples > 10000 kb
50 bytes for samples < 10000 kb
-then do 'ALT-B': Pre-Loop Cut Sample
-then turn off the loop
-do the same at the end of the sample with 'ALT-L' if the wav clicks
at its end
The numbers of bytes given is OK for often met clicks, if your
sample is really bad, just increase it... ;)
2) CREATING NEW SAMPLES WITH IT:
--------------------------------
-You simply have to edit one pattern composed of several samples.
(eg. Compose a Break-Beat on that pattern)
-Put this pattern at order 000.
-Save this module.
-Restart IT in Disk-Writer mode.
-Load your module.
-Play it: it is now being written as a wav file on your disk.
-Restart IT normally.
-Load that new sample and use hint 1) if it has a blank at its end to
shorten it.
3) 3 (4?) METHODS TO MAKE YOUR MODS SOUND MORE SPACIAL..:
---------------------------------------------------------
-Let's start with the 4th method: it's the Surround.. :)
But if your card can't afford surround.. Use one of the 3 following
methods:
These methods are in fact three times the same but with 3 different way.
I'm sure you knew at least the first (and probably the 2nd too) ;)
These 3 methods require 2 channels.
For the 2 firsts, you have to set the panning of the Sample/Instrument
somewhere (in 'Order list and panning' or on the Sample List [F3], but
you'll have to load twice the sample, or on the Instrument List [F4],
or on the Pattern Editor itself [F2], but you busy the volume column or
the command column..)
In the following examples, I've set the Panning in the Volume column
(press the key below Escape to do this)
a) row CHANNEL 1 CHANNEL 2
000 C-5 01 00 .00 ... .. .. .00
001 ... .. .. .00 C-5 01 64 .00
002 ... .. .. .00 ... .. .. .00
b) row CHANNEL 1 CHANNEL 2
000 C-5 01 00 .00 C-5 01 64 SDx
001 ... .. .. .00 ... .. .. .00
With 'x < Speed Value' This second method is more precise!
You can even write SD0 (ie. 0 as x)
c) The last method is the more interesting if you knew the others,
because it does waste your volume column neither the command
column! So they remain free for other effects! :)
* This time, you have to be controlled by Instruments (F12 to select
this).
* Then you will need exactly the too same instruments:
- On F4 Screen, select a blank lign and type 'Alt-P'
- Type the lign where your instrument is... Validate!..
* Then push the panning button:
-set the pan to 00 for your first instrument
-set the pan to 64 for your second instrument
* Then FOR ONLY ONE of those 2 instruments:
Press the Pitch Button and go to edit the envelop:
-First node: tick 00 ;)
value 00
-Second node: tick 01
value 'Whatever_you_want', (-)1 or (-)2 suggested
-Last (3rd) node: tick 02
value 00
Doing this, you've created a delay between your 2 instruments.
To end, place them on the same row on the pattern editor (F2):
row CHANNEL 1 CHANNEL 2
000 C-5 01 .. .00 C-5 02 .. .00
001 ... .. .. .00 ... .. .. .00
Notes:
======
*) You don't have to set the pan to its maximum (00 and 64/FF).
You had better do it for one of your smp/inst. And then, for another
choose 16 and 48 (decimal), or...
*) The third method works because we do not hear the pitch change
in most cases since it is quite quick, but I suggest you do not
use this method for a piano because it's an example where you'll
hear the pitch change and it will sound very ugly: BAAaah! ;)
But it work with Violin and many others.
It may also depend on the speed of your song (time between ticks)..
- Nicolas ARROUET (Onix4MAN) o4m@mail.cpod.fr
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for new composers.
- Nacho Segura
About quality of sound, cognitive science, a more convenient composing, sound
experiments and degrees of freedom.
1) Some composers (trackers) recommend to work with 128 rows and half the
speed (the less the faster). It's supposed that this gives you more control over
the tracks, but that's not totally true.
- The track doubles its length, so you see the half. You have to move
more times and jump more lines every time. Is it important? Register in a
sheet (or two) how many times do you jump through the pattern.
- I've examined several songs that use this technique, and this is my
conclusion: THEY DON'T NEED IT!!! Even lines are empty or have
effects.
The small amount of control gained doesn't compensate the ergonomical
problems. The easiest the best, less interferences between you and the music.
Rookies could think that it only makes you be slower. This is a problem, but
it's not THE PROBLEM. When you forget twelve times what the hell did you write
in top of the pattern and in which track you'll understand...
2) Work. Lots of trackers are proud to say that they are very fast. That's not a
virtue, it means less work, less variety, a shorter melody, much less chords, no
harmony, sounds not perfectly adjusted, and the most important thing:
Repetitions until the Eternity. You haved lasted two months writing this four
minutes long song? Show me what you did, I'm really interested!
3) Discover Scroll-Lock. Load a song, press play, see what happens with the
cursor... and press some notes.
Cool!!! Isn't it?
4) Never use 8-bits or low-quality samples if you can avoid it. The quality of a
song depends on the quality of sounds. "More memory than expected" is better
than "crappier than expected".
5) Analogic synthetised instruments can produce strange interactions. An
example: WARMPAD.PAT (a Gravis Patch) sounds really nice, but this chord
produces a strange noise that doesn't exists when we play the same notes
separately: C-3, D#-3 and F-3. Upper octaves don t provocate this phenomenon.
NOTE: There are several versions of Gravis patches.
6) Use a global volume as high as possible. It not only gives you a better
signal-to-noise relation. It also gives to IT more degrees of freedom for
volume fades.
Make an experiment: Plug the headphones directly to your soundcard, set the
global volume to 5-8 and make a fade out from 64 to 0 (don't use envelopes,
make it in the volume comlumn of the pattern). You should listen the volume
JUMPING (not sliding, jumping!). In Scream Tracker is even worse.
7) Don't be messy allocating tracks (channels, columns... you know). All the
percussion grouped in adjacent tracks, the chord grouped, an empty column (or
more) separating every group of instruments, so you can write fastly this new
idea appeared two seconds ago, without having to go to "Track 21". It also
allows you to write and remix fastly. Everything has its own place and you can
disorder and reallocate patterns without knowing if that loop has been cut, or
where do I have to put a NoteCut command (^^^) to shutdown the analogic
looped bass. It seems more complex when you begin (pattern is wider), but it's
much better, easier to use.
8) Print the manual and bind it. And when you have done this, RTFM (you
know, READ THE #%&@$# MANUAL!!). You'll be surprised.
9) Make an economic contribution. I think he has worked hardly and Impulse
Tracker is the only tracker that gives tracker songs a proffesional sound and
accoustic. Don't be apologized for sending eight dollars. Is better than zero.
Even if you don't want the ITWAV.DRV you should contribute, at least with a
simbolic quantity. He has won it.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for composers
-- Joakim "Acoustic" Back
1) Dont use the same bassline, piano chords or whatever the whole song.
Remember that a real drummer wont just sit there like a drummachine,
nature will make him tap sometimes and he realy wants to make
some fills sometimes.
2) Feel the music. You dont use hammering industrial drums in a soft,
smooth gentle song. And dont place a soft panflute in a blasting
hardcore song.
3) Use the right volume. Keeping the volume low on an instrument and then
suddenly higher creates a feel of power and rush. Use it.
4) There are different ways to make a solo stand out.
a) high volume. Having a high volume will instantly keep it in the
focus. Be aware that to high volume will make it stand out to much
and maybe not fit in the picture anymore.
b) high or low pitch. If you have a lot low and middle note instruments
the solo will be clear and bright as high pitched. As said in other
hints, keeping the others too low or too high will sound terrible.
5) If you play the piano and have a midi keyboard - use the midi support!
This will make you see that you play the piano with a lot more feeling
than when you track a song with the computer-keyboard.
6) Accept failure. Dont get all angry just because your song went totaly
nuts. This happends all the time. Your songs will be better and better
the more you use IT.
7) Use IT alot! Play around with IT, make crazy songs. This will make you
learn ITs features and ways to make nice effects. You wont understand IT
by reading the effects from Axx to Zxx, or reading hints like these, but
mostly by using the effects and using IT, only training will get you to
the top. IT is like a sport, people that dont use it, dont get a thing
about it, but when you get the hang of it, its going to flow.
8) Learn IT in steps. Begin with some simple samples and a few patterns,
then learn a few simple effects like Exx and Fxx. When you have learned
them, go to a new step. Wait with the instruments (F4).
9) Make a keychart. Write down some of the keys on a piece of paper, after
a few days you will probably know most of them. When you know almost
all you will understand that using only the keyboard is MUCH faster than
the mouse.
Thanks for reading, I hope it will help you somehow.
/ Acoustic
n98joab@tycho.helsingborg.se
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hints for Composers
- Maarten Van Stien
- Crystal Score / The Black Lotus
He! ye like simple solutions? Here's one!
You might have used the diskwriter for simple drumloops! You also might have
loaded the wav in programs like Soundforge (the king!) to add nice nice stuff
like reverb, eq, dynamics etc...
As you might guess when you write one period containing a drumloop and you
add reverb, then the start of the sample doesn't have reverb at all, while the
end of the drumloop as tons of reverb. Apart from the fact that it sounds lame
in most cases, LOOPING the sample sounds like hell! So what you do is
diskwriting the same loop twice or more. Then add reverb in your sample editor
and you'll notice that the second period contains the 'reverb' of the first
period. This second period can be looped perfectly. As long as you know where
to find the looping-points!
Now, for simple drumloops with a little bit of reverb it's dead simple.
But for complex loops with TONS of reverb/delay/crap&more it might be quit
difficult!
Solution:
* make an extra .IT with the same BPM/frames as your drumloop .IT
* add a simple, short and immediatly-starting sample at the beginning of each
period (in most cases: on pos 000, 016, 032, 048 etc.). These are some sorta
metronome instruments I guess..
* diskwrite
* find the first sample of the 'metronome-instruments' in a sample editor.
* add markers at that place.
* Mute/Silence the samples so that your metronome-wav ONLY contains markers
* copy your complex drumloops or whatever-loops in mem. like ctrl-c
* MIX to the metronome wav.
Now you have markers in your complex drumloops! And if you did the above stuff
right, you have perfect loops!
Make sure the metronome-samples start immediatly! Otherwise use the offset
command (C-4 10 63 O10) or something..
ok.. have a nice diskwrite!
Crystal Score/The Black Lotus
Maarten.Vanstrien@student-kmt.hku.nl

View File

@ -0,0 +1,261 @@
*** PLEASE take the time to check quickly through this document BEFORE ***
*** you write to me. If the answer to your questions lies within here, ***
*** do NOT expect a reply at all. ***
This document is currently incomplete.
1. Getting Impulse Tracker working.
1.1 Requirements to run IT
1.2 Insufficient memory messages
1.3 "Mix data not allocated"
1.4 Video characters scrambled
1.5 Impulse Tracker often hangs
1.6 Files won't load/take a long time to load!
1.7 Impulse Tracker doesn't support my soundcard!
1.8 The sound breaks up/computer slows down when playing songs!
1.9 Microsoft Windows and Impulse Tracker
2. Using Impulse Tracker
2.1 Loading external samples
3. Miscellaneous
3.1 What are these CACHE.ITS and CACHE.ITI files??
3.2 Distribution sites.
4. Future versions of Impulse Tracker - Not written yet
1.1 Requirements of IT
------------------------------
NOTE WIN95 USERS -> READ LATER
------------------------------
Impulse Tracker requires a 386+ PC and > 500k of memory. Impulse
Tracker uses EMS memory. To setup EMS memory, use the following lines
in your CONFIG.SYS file:
DEVICE=<path>\HIMEM.SYS
DEVICE=<path>\EMM386.EXE RAM H=255
Do *NOT* have "NOEMS" or "FRAME=NONE" on the same line as EMM386.EXE
Also shove these lines in, if they're not already there:
DOS=HIGH,UMB <--- just to get yourself a little more memory
STACKS=0,0 <--- Some computers require this to prevent crashing
I cannot guarantee that IT will work with QEMM, but Leszek Clapinski
wrote to me with this advice (thanks!):
In your config.sys, use:
DEVICE=<path>\QEMM386.SYS DMA=64 HANDLES=255 FORCEEMS
Then use "IT -P2"
I recommend that you also devicehigh and Load-high (LH) as many
possible drivers, so that you have more conventional memory to play
around with.
-----------
Win95 Users
-----------
If you are a Win95 user, you're probably best off not having HIMEM.SYS
*OR* EMM386.EXE in your CONFIG.SYS file. If you *do* have EMM386,
make sure you do NOT have "noems" as a parameter.
Win95's internal EMS handling routines *DO* automatically provide
the optimum environment for IT, so you should be able to ignore the
settings given above.
1.2 Insufficient memory messages
If you get Insufficient Memory messages at the soundcard
initialisation, read section 1.3
If you do not have enough conventional memory, the program will
exit to DOS almost immediately. If you *JUST* have enough conventional
memory, then there may not be enough memory left over to load the
sound driver(s) ( -> No sound card detected )
1.3 "Mix Data not allocated" messages
All non-wavetable cards require extra *conventional* memory to be
allocated in order for them to run appropriately. The amount requires
differs between the drivers and depends also on the mixing speed (the
higher the mix speed, the more memory required). If you get this
message, try to free up some conventional memory.
1.4 Video character's scrambled
Some video cards (esp Matrox cards) did not follow the VGA register
standard correctly. Impulse Tracker tries to detecting whether
you have such a card, but if this is not successful, run IT /v2
for Matrox compatibility mode.
1.5 Impulse Tracker often hangs
Impulse Tracker may not operate securely in anything other than
DOS and Windows 95 (these are the two systems that IT has been
extensively tested on) - QEMM/Command shells (eg 4DOS/NDOS) have
been known to cause errors in many situations.
Aside from these, if Impulse Tracker hangs on you, please write to
me immediately, with a full description of what happens/how you can
make it happen. (Including the version of IT that you use!)
If you get a blank screen when you run Impulse Tracker, try using
command line parameters to specify your soundcard and port/irq/dma.
The autodetect procedures seem pretty reliable, but there's a chance
that they may be interfering/interacting with unexpected hardware.
1.6 Files won't load/take a long time to load!
Some music modules are actually compressed with a program called
MMCMP. Under normal conditions, these files can be decompressed
automatically, under the following situations, they _cannot_:
1) You do NOT have EMM386 loaded - the decompression routines
require EMS memory, so if you do not have EMS, you cannot
load these files.
2) You are running Impulse Tracker through Windows 3.xx -
Windows 3.xx prevents programs from doing certain things...
including the setup routines that the decompressor requires
to run - so these files cannot be loaded under Windows 3.xx
These files will take longer to load, as they are compressed and are
decompressed to disk first.
1.7 Impulse Tracker doesn't support my soundcard!
There may be two reasons for this:
1) Impulse Tracker really doesn't support your soundcard.
2) Impulse Tracker supposedly does support your soundcard but
you can't get it to work.
1) Solution: Convince your soundcard manufacturer to send me a sound
card to play with AS WELL AS all the programming information.
Alternatively, find a soundcard that Impulse Tracker *DOES*
support - you can pick up some decent soundcards really cheaply.
2) First of all, check that you have enough memory. If you have
a low amount of FreeMem once you load Impulse Tracker, it probably
means that there wasn't enough memory to load the sound driver file
which will automatically cause a detect failure.
Unfortunately, not all 100% compatible (esp "100% SBPro compatible")
soundcards are REALLY 100% compatible. If the drivers do not detect
your soundcard, then try specifying full command line parameters.
If it still doesn't work, then I'm sorry - there's nothing I can do
about this. Hassle your sound card manufacturer to make decent
eqiupment.
Impulse Tracker uses SB cards in a different *MODE* of playback
from most programs so that they are more efficient and also so
that they can operate in the background of Windows 95. So just
because your soundcard works in another program, it doesn't mean
that it's 100% compatible. (this is for all of you who may think
"But this card works in other programs, why doesn't it work in IT?")
For Sound Blaster cards, make sure you have the BLASTER environment
variable set in order for IT to detect your card reliably
(SB16/AWE32 excluded, as these use hardware routines).
1.8 The sound breaks up/computer slows down when playing songs!
(This section only deals with software mixed cards, ie. almost
every soundcard except native GUS, Interwave and EMU8000)
Sound output from the computer requires HEAVY computation - up to
64 thousand calculations per second PER NOTE playing. If your computer
is unable to keep up with this, the sound will have very obvious
chunks in it and your computer will slow down noticeably.
Solutions:
1) If you're running Impulse Tracker under windows, you may find
that running it from a DOS bootup provides a SIGNIFICANT increase
the capabilities of your computer in this respect (3x faster
in DOS than Win95 for me)
2) Limit the number of notes you can have simultaneously via the
command line (/Lxx) - eg. "IT /L32" will limit playback to
32 simultaneous notes maximum.
3) Lower the number of calculations required per second per note.
This is done by changing the "mixing speed" via the command line:
eg: "IT /m32000" will cause 32000 calculations per second per note
to be made. "IT /m22000" will cause 22000 calculations per second
per note to be made. Check drivers.txt to find the range of
mixing speed values that your soundcard can manage.
4) Get a faster computer :)
1.9 Microsoft Windows and Impulse Tracker
Microsoft Windows 3.xx and Impulse Tracker is a definite no-no.
I do NOT guarantee ANYTHING under this configuration. I probably
also will not fixup any problems that occur in Impulse Tracker
that only occur under Windows 3.xx
Microsft Windows '95 and Impulse Tracker *SHOULD* work fine.
If no sound card can be detected under Windows '95, check first that
you have no other program using your soundcard (or another DOS window
still open that used your soundcard).
Only certain soundcards can play in the background of Windows '95 for
technical reasons. Please read the relevant section of DRIVERS.DOC
for your soundcard.
Some people have found that Impulse Tracker will hang after a few
minutes under Windows '95. Disabling virtual memory may solve this
problem. To disable Virtual Memory, right click on My Computer,
Properties, Performance, Virtual Memory and check the "disable" box.
2.1 Loading external samples
To load in another sample so that you can use it in your composition,
go to the sample-list page (F3), then press "Enter". You will be
taken to the "load sample" screen, where you can test out and select
samples from a wide variety of formats. This includes:
.IFF, .WAV, .S3I, .ITS, .RAW, and TX Wave .Wxx formats.
You can even load samples DIRECTLY OUT of other modules. In the sample
loader, navigate to a drive/directory which contains modules, and you
will see that they can opened as 'libraries.' So far, support for
external sample loading from modules is available for:
.MOD, .MTM, .S3M, .XM, .669, .PTM, .FAR and of course, .IT
.PAT and .KRZ instruments can also be loaded as sample libraries at
the moment.
3.1 What are these CACHE.ITS and CACHE.ITI files?
Whenever you load a sample or instrument, Impulse Tracker has to
load all the files to find out their contents, to determine
parameters such as sample format, bit fields, etc. CACHE.ITS and
CACHE.ITI are files created by Impulse Tracker so that on subsequent
usage, this information can be loaded almost instantaneously from
a single file, rather than having to reload all the information
again.
These may be deleted without disrupting program usage, but they will
be recreated when you attempt to load samples/instruments from the
directory.
3.2 Distribution Sites
To get the latest versions of IT on the web, check out:
USA Site - Shawn Mativetsky (Shawn202)
http://www.noisemusic.org/it
UK Site - Andi Simpson (Imminent)
http://www.mixbbs.demon.co.uk
Spanish Site - Javier Gutierrez
http://www.musica.org/impulse
Music and Tracking Site - Matthias Ziegs (MAZ)
http://www.maz-sound.com
IT Resource Central - Matthew Gardner
http://www.unidev.com/~logic/music/it
Please don't write to me to become a distribution site - the sites
above should be sufficient, and I don't think it is necessary to
have BBS distributions since the use of the internet has become
so widespread.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,901 @@
Impulse Header Layout
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000: ³'I'³'M'³'P'³'M'³ Song Name, max 26 characters, includes NULL ³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ´
0010: ³.......................................................³PHiligt³
ÃÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
0020: ³OrdNum ³InsNum ³SmpNum ³PatNum ³ Cwt/v ³ Cmwt ³ Flags ³Special³
ÃÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄ´
0030: ³GV ³MV ³IS ³IT ³Sep³PWD³MsgLgth³Message Offset ³ Reserved ³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
0040: ³ Chnl Pan (64 bytes)...........................................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
0080: ³ Chnl Vol (64 bytes)...........................................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
00C0: ³ Orders, Length = OrdNum ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
xxxx: ³ 'Long' Offset of instruments, Length = InsNum*4 (1) ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
xxxx: ³ 'Long' Offset of samples headers, Length = SmpNum*4 (2) ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
xxxx: ³ 'Long' Offset of patterns, Length = PatNum*4 (3) ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
(1) Offset = 00C0h+OrdNum
(2) Offset = 00C0h+OrdNum+InsNum*4
(3) Offset = 00C0h+OrdNum+InsNum*4+SmpNum*4
Note that if the (long) offset to a pattern = 0, then the
pattern is assumed to be a 64 row empty pattern.
PHiliht = Pattern row hilight information. Only relevant for pattern
editing situations.
Cwt: Created with tracker.
Impulse Tracker y.xx = 0yxxh
Cmwt: Compatible with tracker with version greater than value.
(ie. format version)
OrdNum: Number of orders in song.
InsNum: Number of instruments in song
SmpNum: Number of samples in song
PatNum: Number of patterns in song
Flags: Bit 0: On = Stereo, Off = Mono
Bit 1: Vol0MixOptimizations - If on, no mixing occurs if
the volume at mixing time is 0 (redundant v1.04+)
Bit 2: On = Use instruments, Off = Use samples.
Bit 3: On = Linear slides, Off = Amiga slides.
Bit 4: On = Old Effects, Off = IT Effects
Differences:
- Vibrato is updated EVERY frame in IT mode, whereas
it is updated every non-row frame in other formats.
Also, it is two times deeper with Old Effects ON
- Command Oxx will set the sample offset to the END
of a sample instead of ignoring the command under
old effects mode.
- (More to come, probably)
Bit 5: On = Link Effect G's memory with Effect E/F. Also
Gxx with an instrument present will cause the
envelopes to be retriggered. If you change a
sample on a row with Gxx, it'll adjust the
frequency of the current note according to:
NewFrequency = OldFrequency * NewC5 / OldC5;
Bit 6: Use MIDI pitch controller, Pitch depth given by PWD
Bit 7: Request embedded MIDI configuration
(Coded this way to permit cross-version saving)
Special: Bit 0: On = song message attached.
Song message:
Stored at offset given by "Message Offset" field.
Length = MsgLgth.
NewLine = 0Dh (13 dec)
EndOfMsg = 0
Note: v1.04+ of IT may have song messages of up to
8000 bytes included.
Bit 1: Reserved
Bit 2: Reserved
Bit 3: MIDI configuration embedded
Bit 4-15: Reserved
GV: Global volume. (0->128) All volumes are adjusted by this
MV: Mix volume (0->128) During mixing, this value controls
the magnitude of the wave being mixed.
IS: Initial Speed of song.
IT: Initial Tempo of song
Sep: Panning separation between channels (0->128, 128 is max sep.)
PWD: Pitch wheel depth for MIDI controllers
Chnl Vol: Volume for each channel. Ranges from 0->64
Chnl Pan: Each byte contains a panning value for a channel. Ranges from
0 (absolute left) to 64 (absolute right). 32 = central pan,
100 = Surround sound.
+128 = disabled channel (notes will not be played, but note
that effects in muted channels are
still processed)
Orders: This is the order in which the patterns are played.
Valid values are from 0->199.
255 = "---", End of song marker
254 = "+++", Skip to next order
Old Impulse Instrument Format (cmwt < 200h)
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000: ³'I'³'M'³'P'³'I'³ DOS FileName (12345678.123) ³
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄ´
0010: ³00h³Flg³VLS³VLE³SLS³SLE³ x ³ x ³FadeOut³NNA³DNC³TrkVers³NoS³ x ³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄ´
0020: ³ Instrument Name, max 26 bytes, includes NUL...................³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
0030: ³.......................................³ x ³ x ³ x ³ x ³ x ³ x ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
0040: ³ Note-Sample/Keyboard Table, Length = 240 bytes................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
0130: ³ Volume envelope (200 bytes)...................................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
01F8: ³ Node points (25x2 bytes)......³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Total length of old instrument header is 554 bytes.
Flg: Bit 0. On = Use volume envelope
Bit 1. On = Use volume loop
Bit 2. On = Use sustain volume loop
VLS: Volume loop start (node number)
VLE: Volume loop end (node number)
SLS: Sustain loop start (node number)
SLE: Sustain loop end (node number)
FadeOut: Ranges between 0 and 64, but the fadeout "Count" is 512.
Fade applied when:
1) Note fade NNA is selected and triggered (by another note)
2) Note off NNA is selected with no volume envelope
or volume envelope loop
3) Volume envelope end is reached
DNC: Duplicate note check (0 = Off, 1 = On)
NNA: New note action:
0 = Note cut
1 = Note continue
2 = Note off
3 = Note fade
TrkVers: Tracker version used to save the instrument. This is only
used in the instrument files.
NoS: Number of samples associated with instrument. This is only
used in the instrument files.
Note-Sample/Keyboard Table.
Each note of the instrument is first converted to a sample number
and a note (C-0 -> B-9). These are stored as note/sample pairs
(note first, range 0->119 for C-0 to B-9, sample ranges from
1-99, 0=no sample)
Volume envelope: Values from 0->64, 0FFh indicating end of envelope.
(after which note fade applies)
Node data: Tick THEN magnitude
Impulse Instrument Format
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000: ³'I'³'M'³'P'³'I'³ DOS FileName (12345678.123) ³
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄ´
0010: ³00h³NNA³DCT³DCA³FadeOut³PPS³PPC³GbV³DfP³RV ³RP ³TrkVers³NoS³ x ³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄ´
0020: ³ Instrument Name, max 26 bytes, includes NUL...................³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄ´
0030: ³.......................................³IFC³IFR³MCh³MPr³MIDIBnk³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄ´
0040: ³ Note-Sample/Keyboard Table, Length = 240 bytes................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄ´
0130: ³ Envelopes.....................................................³
ÃÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
NNA = New Note Action
0 = Cut 1 = Continue
2 = Note off 3 = Note fade
DCT = Duplicate Check Type
0 = Off 1 = Note
2 = Sample 3 = Instrument
DCA: Duplicate Check Action
0 = Cut
1 = Note Off
2 = Note fade
FadeOut: Ranges between 0 and 128, but the fadeout "Count" is 1024
See the Last section on how this works.
Fade applied when:
1) Note fade NNA is selected and triggered (by another note)
2) Note off NNA is selected with no volume envelope
or volume envelope loop
3) Volume envelope end is reached
PPS: Pitch-Pan separation, range -32 -> +32
PPC: Pitch-Pan center: C-0 to B-9 represented as 0->119 inclusive
GbV: Global Volume, 0->128
DfP: Default Pan, 0->64, &128 => Don't use
RV: Random volume variation (percentage)
RP: Random panning variation (panning change - not implemented yet)
MCh = MIDI Channel
MPr = MIDI Program (Instrument)
TrkVers: Tracker version used to save the instrument. This is only
used in the instrument files.
NoS: Number of samples associated with instrument. This is only
used in the instrument files.
Note-Sample/Keyboard Table.
Each note of the instrument is first converted to a sample number
and a note (C-0 -> B-9). These are stored as note/sample byte pairs
(note first, range 0->119 for C-0 to B-9, sample ranges from
1-99, 0=no sample)
Envelope layout
Envelopes: 3 structures, first for volume (130h), second for
panning (182h), third for pitch (1D4h).
Each is structured as such:
0 1 2 3 4 5 6.......
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄ¿
xxxx: ³Flg³Num³LpB³LpE³SLB³SLE³ Node points, 25 sets, 75 bytes....³ x ³
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÅÄÄÄ´
Flg: Bit 0: Envelope on/off, 1 = on, 0 = off
Bit 1: Loop on/off, 1 = on, 0 = off
Bit 2: SusLoop on/off, 1 = on, 0 = off
Num = Number of node points
LpB = Loop beginning SLB = Sustain loop beginning
LpE = Loop end SLE = Sustain loop end
Node point = 1 byte for y-value
(0->64 for vol, -32->+32 for panning or pitch)
1 word (2 bytes) for tick number (0->9999)
Total length of an instrument is 547 bytes, but 554 bytes are
written, just to simplify the loading of the old format. (Hence
there are 7 'wasted' bytes per instrument)
Impulse Sample Format
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000: ³'I'³'M'³'P'³'S'³ DOS Filename (12345678.123) ³
ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
0010: ³00h³GvL³Flg³Vol³ Sample Name, max 26 bytes, includes NUL.......³
ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄ´
0020: ³.......................................................³Cvt³DfP³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄ´
0030: ³ Length ³ Loop Begin ³ Loop End ³ C5Speed ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
0040: ³ SusLoop Begin ³ SusLoop End ³ SamplePointer ³ViS³ViD³ViR³ViT³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ
The cache file has the following pieces of information added on:
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0050: ³ File Size ³ Date ³ Time ³Fmt³...........................³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Fmt. 0 = unchecked. 1 = directory, 2 = it sample, 3 = st sample
GvL: Global volume for instrument, ranges from 0->64
Flg: Bit 0. On = sample associated with header.
Bit 1. On = 16 bit, Off = 8 bit.
Bit 2. On = stereo, Off = mono. Stereo samples not supported yet
Bit 3. On = compressed samples.
Bit 4. On = Use loop
Bit 5. On = Use sustain loop
Bit 6. On = Ping Pong loop, Off = Forwards loop
Bit 7. On = Ping Pong Sustain loop, Off = Forwards Sustain loop
Vol: Default volume for instrument
Length: Length of sample in no. of samples NOT no. of bytes
LoopBeg: Start of loop (no of samples in, not bytes)
Loop End: Sample no. AFTER end of loop
C5Speed: Number of bytes a second for C-5 (ranges from 0->9999999)
SusLBeg: Start of sustain loop
SusLEnd: Sample no. AFTER end of sustain loop
SmpPoint: 'Long' Offset of sample in file.
ViS: Vibrato Speed, ranges from 0->64
ViD: Vibrato Depth, ranges from 0->64
ViT: Vibrato waveform type.
0=Sine wave
1=Ramp down
2=Square wave
3=Random (speed is irrelevant)
ViR: Vibrato Rate, rate at which vibrato is applied (0->64)
The depth of the vibrato at any point is worked out in the following
way:
Every processing cycle, the following occurs:
1) Mov AX, [SomeVariableNameRelatingToVibrato]
2) Add AL, Rate
3) AdC AH, 0
4) AH contains the depth of the vibrato as a fine-linear slide.
5) Mov [SomeVariableNameRelatingToVibrato], AX ; For the next
; cycle.
For those that don't understand assembly, then the depth is
basically the running-sum of the rate divided by 256.
Sample vibrato uses a table 256-bytes long
Convert - bits other than bit 0 are used internally for the loading
of alternative formats.
Bit 0:
Off: Samples are unsigned } IT 2.01 and below use unsigned samples
On: Samples are signed } IT 2.02 and above use signed samples
Bit 1:
Off: Intel lo-hi byte order for 16-bit samples } Safe to ignore
On: Motorola hi-lo byte order for 16-bit samples } these values...
Bit 2: }
Off: Samples are stored as PCM values }
On: Samples are stored as Delta values }
Bit 3: }
On: Samples are stored as byte delta values }
(for PTM loader) }
Bit 4: }
On: Samples are stored as TX-Wave 12-bit values }
Bit 5: }
On: Left/Right/All Stereo prompt }
Bit 6: Reserved
Bit 7: Reserved
DfP - Default Pan. Bits 0->6 = Pan value, Bit 7 ON to USE (opposite of inst)
Impulse Pattern Format
0 1 2 3 4 5 6 7 8 9 A B C D E F
ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
0000: ³Length ³ Rows ³ x ³ x ³ x ³ x ³ Packed data................ ³
ÃÄÄÄÂÄÄÄÅÄÄÄÂÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ´
Length: Length of packed pattern, not including the 8 byte header
Note that the pattern + the 8 byte header will ALWAYS
be less than 64k
Rows: Number of rows in this pattern (Ranges from 32->200)
Patterns are unpacked by the following pseudocode... (this may look
horrible, but in practise, it's just as convenient as the S3M
pattern format for playback (but not for display))
GetNextChannelMarker:
Read byte into channelvariable.
if(channelvariable = 0) then end of row
Channel = (channelvariable-1) & 63 ; Channel is 0 based.
if(channelvariable & 128) then read byte into maskvariable
else maskvariable = previousmaskvariable for current channel
if(maskvariable & 1), then read note. (byte value)
// Note ranges from 0->119 (C-0 -> B-9)
// 255 = note off, 254 = notecut
// Others = note fade (already programmed into IT's player
// but not available in the editor)
if(maskvariable & 2), then read instrument (byte value)
// Instrument ranges from 1->99
if(maskvariable & 4), then read volume/panning (byte value)
// Volume ranges from 0->64
// Panning ranges from 0->64, mapped onto 128->192
// Prepare for the following also:
// 65->74 = Fine volume up
// 75->84 = Fine volume down
// 85->94 = Volume slide up
// 95->104 = Volume slide down
// 105->114 = Pitch Slide down
// 115->124 = Pitch Slide up
// 193->202 = Portamento to
// 203->212 = Vibrato
Effects 65 is equivalent to D0F, 66 is equivalent to D1F -> 74 = D9F
Similarly for 75-84 (DFx), 85-94 (Dx0), 95->104 (D0x).
(Fine) Volume up/down all share the same memory (NOT shared with Dxx
in the effect column tho).
Pitch slide up/down affect E/F/(G)'s memory - a Pitch slide
up/down of x is equivalent to a normal slide by x*4
Portamento to (Gx) affects the memory for Gxx and has the equivalent
slide given by this table:
SlideTable DB 1, 4, 8, 16, 32, 64, 96, 128, 255
Vibrato uses the same 'memory' as Hxx/Uxx.
if(maskvariable & 8), then read command (byte value) and commandvalue
// Valid ranges from 0->31 (0=no effect, 1=A, 2=B, 3=C, etc.)
if(maskvariable & 16), then note = lastnote for channel
if(maskvariable & 32), then instrument = lastinstrument for channel
if(maskvariable & 64), then volume/pan = lastvolume/pan for channel
if(maskvariable & 128), then {
command = lastcommand for channel and
commandvalue = lastcommandvalue for channel
}
Goto GetNextChannelMarker
Mathematics
Abbreviations:
FV = Final Volume (Ranges from 0 to 128). In versions 1.04+, mixed output
devices are reduced further to a range from 0 to 64 due to lack of
memory.
Vol = Volume at which note is to be played. (Ranges from 0 to 64)
SV = Sample Volume (Ranges from 0 to 64)
IV = Instrument Volume (Ranges from 0 to 128)
CV = Channel Volume (Ranges from 0 to 64)
GV = Global Volume (Ranges from 0 to 128)
VEV = Volume Envelope Value (Ranges from 0 to 64)
In Sample mode, the following calculation is done:
FV = Vol * SV * CV * GV / 262144 ; Note that 262144 = 2^18
; So bit shifting can be done.
In Instrument mode the following procedure is used:
1) Update volume envelope value. Check for loops / end of envelope.
2) If end of volume envelope (ie. position >= 200 or VEV = 0FFh), then turn
on note fade.
3) If notefade is on, then NoteFadeComponent (NFC) = NFC - FadeOut
; NFC should be initialised to 1024 when a note is played.
4) FV = Vol * SV * IV * CV * GV * VEV * NFC / 2^41
Linear slides work like this:
Final frequency = Original frequency * 2^(SlideValue/768)
(I used a lookup table for the multipliers here)
For command Exx, SlideValue = -4*EffectValue
For command EEx, SlideValue = -EffectValue
For command Fxx, SlideValue = 4*EffectValue
For command FEx, SlideValue = EffectValue
Note that sample vibrato always uses Linear slides.
Notes about effects (as compared to other module formats)
C This is now in *HEX*. (Used to be in decimal in ST3)
E/F/G/H/U You need to check whether the song uses Amiga/Linear slides.
H/U Vibrato in Impulse Tracker is two times finer than in
any other tracker and is updated EVERY tick.
If "Old Effects" is *ON*, then the vibrato is played in the
normal manner (every non-row tick and normal depth)
E/F/G These commands ALL share the same memory.
Oxx Offsets to samples are to the 'xx00th' SAMPLE. (ie. for
16 bit samples, the offset is xx00h*2)
Oxx past the sample end will be ignored, unless "Old Effects"
is ON, in which case the Oxx will play from the end of the
sample.
Yxy This uses a table 4 times larger (hence 4 times slower) than
vibrato or tremelo. If the waveform is set to random, then
the 'speed' part of the command is interpreted as a delay.
If you read through this document and there are ANY points which you have
troubles with (and have to try out), then let me know - because someone
else will have the same questions - and I'd like to make this DOC as easy
to understand as possible.
For Panning....
Here's the rough procedure used:
NotePan = ChannelPan
if InstrumentPan=On then NotePan = InstrumentPan
NotePan = NotePan+(InstrumentNote-PPCenter)*PPSeparation/8
Pitch Envelopes
Each value on the envelope equates to half a semitone. This is interpolated
64 times for smooth pitch sliding. Positive values indicate a pitch variation
UP of x semitones, negative values indicate a pitch variation down.
General Info
The player in Impulse Tracker 'allocates' channels to notes whenever they
are *PLAYED*. In sample mode, the allocation is simple:
Virtual Channel (number) = 'Host' channel (number)
In instrument mode, the following procedure is used:
Check if channel is already playing ---Yes--> set 'background' flag on.
| 'Trigger' NNA. If NNA=cut,
No then use this virtual
| channel.
| |
|<------------------ else -----------------/
|
v
Search and find the first non-active virtual channel.
|
Non-active channel found? ----Yes----> Use this for playback.
|
No
|
v
Search through and find the channel of lowest volume that is in the #
'background' (ie. no longer controlled directly) #
| #
Background channel found? ----Yes----> Use this for playback. #
| #
No #
| #
v #
Return error - the note is *NOT* allocated a channel, and hence is not #
played. #
This is actually quite a simple process... just that it's another of
those 'hassles' to have to write...
### Note: This is by far the simplest implementation of congestion
resolution. IT 2.03 and above have a greatly enhanced
method which more selectively removes the most insignificant
channel. Obviously, there is no best way to do this - I
encourage you to experiment and find new algorithms for
yourself.
Internal Tables
FineSineData Label Byte
DB 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23
DB 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
DB 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
DB 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
DB 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
DB 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
DB 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
DB 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2
DB 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
DB -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
DB -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
DB -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
DB -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
DB -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
DB -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
DB -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
FineRampDownData Label Byte
DB 64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56
DB 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48
DB 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40
DB 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32
DB 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24
DB 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16
DB 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8
DB 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0
DB 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8
DB -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16
DB -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24
DB -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32
DB -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40
DB -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48
DB -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56
DB -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64
FineSquareWave Label Byte
DB 128 Dup (64), 128 Dup (0)
EmptyPattern Label
DW 64, 64, 0, 0
DB 64 Dup (0)
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PitchTable Label DWord ; Values are 16.16 bit
DW 2048, 0, 2170, 0, 2299, 0, 2435, 0, 2580, 0, 2734, 0 ; C-0
DW 2896, 0, 3069, 0, 3251, 0, 3444, 0, 3649, 0, 3866, 0 ;>B-0
DW 4096, 0, 4340, 0, 4598, 0, 4871, 0, 5161, 0, 5468, 0 ; C-1
DW 5793, 0, 6137, 0, 6502, 0, 6889, 0, 7298, 0, 7732, 0 ;>B-1
DW 8192, 0, 8679, 0, 9195, 0, 9742, 0, 10321, 0, 10935, 0
DW 11585, 0, 12274, 0, 13004, 0, 13777, 0, 14596, 0, 15464, 0
DW 16384, 0, 17358, 0, 18390, 0, 19484, 0, 20643, 0, 21870, 0
DW 23170, 0, 24548, 0, 26008, 0, 27554, 0, 29193, 0, 30929, 0
DW 32768, 0, 34716, 0, 36781, 0, 38968, 0, 41285, 0, 43740, 0
DW 46341, 0, 49097, 0, 52016, 0, 55109, 0, 58386, 0, 61858, 0
DW 0, 1, 3897, 1, 8026, 1, 12400, 1, 17034, 1, 21944, 1
DW 27146, 1, 32657, 1, 38496, 1, 44682, 1, 51236, 1, 58179, 1
DW 0, 2, 7794, 2, 16051, 2, 24800, 2, 34068, 2, 43888, 2
DW 54292, 2, 65314, 2, 11456, 3, 23828, 3, 36936, 3, 50823, 3
DW 0, 4, 15588, 4, 32103, 4, 49600, 4, 2601, 5, 22240, 5
DW 43048, 5, 65092, 5, 22912, 6, 47656, 6, 8336, 7, 36110, 7
DW 0, 8, 31176, 8, 64205, 8, 33663, 9, 5201, 10, 44481, 10
DW 20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
DW 0, 16, 62352, 16, 62875, 17, 1790, 19, 10403, 20, 23425, 21
DW 41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
FineLinearSlideUpTable Label ; Values are 16.16 bit
DW 0, 1, 59, 1, 118, 1, 178, 1, 237, 1 ; 0->4
DW 296, 1, 356, 1, 415, 1, 475, 1, 535, 1 ; 5->9
DW 594, 1, 654, 1, 714, 1, 773, 1, 833, 1 ; 10->14
DW 893, 1 ; 15
LinearSlideUpTable Label ; Value = 2^(Val/192), Values are 16.16 bit
DW 0, 1, 237, 1, 475, 1, 714, 1, 953, 1 ; 0->4
DW 1194, 1, 1435, 1, 1677, 1, 1920, 1, 2164, 1 ; 5->9
DW 2409, 1, 2655, 1, 2902, 1, 3149, 1, 3397, 1 ; 10->14
DW 3647, 1, 3897, 1, 4148, 1, 4400, 1, 4653, 1 ; 15->19
DW 4907, 1, 5157, 1, 5417, 1, 5674, 1, 5932, 1 ; 20->24
DW 6190, 1, 6449, 1, 6710, 1, 6971, 1, 7233, 1 ; 25->29
DW 7496, 1, 7761, 1, 8026, 1, 8292, 1, 8559, 1 ; 30->34
DW 8027, 1, 9096, 1, 9366, 1, 9636, 1, 9908, 1 ; 35->39
DW 10181, 1, 10455, 1, 10730, 1, 11006, 1, 11283,1 ; 40->44
DW 11560, 1, 11839, 1, 12119, 1, 12400, 1, 12682,1 ; 45->49
DW 12965, 1, 13249, 1, 13533, 1, 13819, 1, 14106,1 ; 50->54
DW 14394, 1, 14684, 1, 14974, 1, 15265, 1, 15557,1 ; 55->59
DW 15850, 1, 16145, 1, 16440, 1, 16737, 1, 17034,1 ; 60->64
DW 17333, 1, 17633, 1, 17933, 1, 18235, 1, 18538,1 ; 65->69
DW 18842, 1, 19147, 1, 19454, 1, 19761, 1, 20070,1 ; 70->74
DW 20379, 1, 20690, 1, 21002, 1, 21315, 1, 21629,1 ; 75->79
DW 21944, 1, 22260, 1, 22578, 1, 22897, 1, 23216,1 ; 80->84
DW 23537, 1, 23860, 1, 24183, 1, 24507, 1, 24833,1 ; 85->89
DW 25160, 1, 25488, 1, 25817, 1, 26148, 1, 26479,1 ; 90->94
DW 26812, 1, 27146, 1, 27481, 1, 27818, 1, 28155,1 ; 95->99
DW 28494, 1, 28834, 1, 29175, 1, 29518, 1, 29862,1 ; 100->104
DW 30207, 1, 30553, 1, 30900, 1, 31248, 1, 31599,1 ; 105->109
DW 31951, 1, 32303, 1, 32657, 1, 33012, 1, 33369,1 ; 110->114
DW 33726, 1, 34085, 1, 34446, 1, 34807, 1, 35170,1 ; 115->119
DW 35534, 1, 35900, 1, 36267, 1, 36635, 1, 37004,1 ; 120->124
DW 37375, 1, 37747, 1, 38121, 1, 38496, 1, 38872,1 ; 125->129
DW 39250, 1, 39629, 1, 40009, 1, 40391, 1, 40774,1 ; 130->134
DW 41158, 1, 41544, 1, 41932, 1, 42320, 1, 42710,1 ; 135->139
DW 43102, 1, 43495, 1, 43889, 1, 44285, 1, 44682,1 ; 140->144
DW 45081, 1, 45481, 1, 45882, 1, 46285, 1, 46690,1 ; 145->149
DW 47095, 1, 47503, 1, 47917, 1, 48322, 1, 48734,1 ; 150->154
DW 49147, 1, 49562, 1, 49978, 1, 50396, 1, 50815,1 ; 155->159
DW 51236, 1, 51658, 1, 52082, 1, 52507, 1, 52934,1 ; 160->164
DW 53363, 1, 53793, 1, 54224, 1, 54658, 1, 55092,1 ; 165->169
DW 55529, 1, 55966, 1, 56406, 1, 56847, 1, 57289,1 ; 170->174
DW 57734, 1, 58179, 1, 58627, 1, 59076, 1, 59527,1 ; 175->179
DW 59979, 1, 60433, 1, 60889, 1, 61346, 1, 61805,1 ; 180->184
DW 62265, 1, 62727, 1, 63191, 1, 63657, 1, 64124,1 ; 185->189
DW 64593, 1, 65064, 1, 0, 2, 474, 2, 950, 2 ; 190->194
DW 1427, 2, 1906, 2, 2387, 2, 2870, 2, 3355, 2 ; 195->199
DW 3841, 2, 4327, 2, 4818, 2, 5310, 2, 5803, 2 ; 200->204
DW 6298, 2, 6795, 2, 7294, 2, 7794, 2, 8296, 2 ; 205->209
DW 8800, 2, 9306, 2, 9814, 2, 10323, 2, 10835,2 ; 210->214
DW 11348, 2, 11863, 2, 12380, 2, 12899, 2, 13419,2 ; 215->219
DW 13942, 2, 14467, 2, 14993, 2, 15521, 2, 16051,2 ; 220->224
DW 16583, 2, 17117, 2, 17653, 2, 18191, 2, 18731,2 ; 225->229
DW 19273, 2, 19817, 2, 20362, 2, 20910, 2, 21460,2 ; 230->234
DW 22011, 2, 22565, 2, 23121, 2, 23678, 2, 24238,2 ; 235->239
DW 24800, 2, 25363, 2, 25929, 2, 25497, 2, 27067,2 ; 240->244
DW 27639, 2, 28213, 2, 28789, 2, 29367, 2, 29947,2 ; 245->249
DW 30530, 2, 31114, 2, 31701, 2, 32289, 2, 32880, 2 ; 250->254
DW 33473, 2, 34068, 2 ; 255->256
FineLinearSlideDownTable Label ; Values are 0.16 bit
DW 65535, 65477, 65418, 65359, 65300, 65241, 65182, 65359 ; 0->7
DW 65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 ; 8->15
LinearSlideDownTable Label ; Values are 0.16 bit
DW 65535, 65300, 65065, 64830, 64596, 64364, 64132, 63901 ; 0->7
DW 63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 ; 8->15
DW 61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 ; 16->23
DW 60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 ; 24->31
DW 58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 ; 32->39
DW 56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 ; 40->47
DW 55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 ; 48->55
DW 53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 ; 56->63
DW 52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 ; 64->71
DW 50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 ; 72->79
DW 49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 ; 80->87
DW 47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 ; 88->95
DW 46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 ; 96->103
DW 45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 ;104->111
DW 43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 ;112->119
DW 42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 ;120->127
DW 41285, 41136, 40988, 40840, 40639, 40566, 40400, 40253 ;128->135
DW 40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 ;136->143
DW 38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 ;144->151
DW 37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 ;152->159
DW 36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 ;160->167
DW 35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 ;168->175
DW 34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 ;176->183
DW 33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 ;184->191
DW 32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 ;192->199
DW 31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 ;200->207
DW 30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 ;208->215
DW 30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 ;216->223
DW 29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 ;224->231
DW 28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 ;232->239
DW 27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 ;240->247
DW 26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 ;248->255
DW 26008 ; 256
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Effect Info
Here's about all the info I can think of for effects. "Process" variables are
variables used internally by effects to control the direction of playback..
This section has not been completed yet.
First, here is the rough flow chart for processing information, it's not fully
detailed, but all of the important steps are outlined.
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Set note volume to volume set for each channel ³
³ Set note frequency to frequency set for each channel ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³
ÚÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Decrease tick counter ³ Yes
³ Is tick counter 0 ? ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÀÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
³ ³
No ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ÚÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Tick counter = Tick counter set ³
³ Update effects for each ³ ³ (the current 'speed') ³
³ channel as required. ³ ³ Decrease Row counter. ³
³ ³ ³ Is row counter 0? ³
ÀÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³ No ³ ³
³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ Yes
³ ³ ³
³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³ Call update-effects for ³ ³ Row counter = 1 ³
³ ³ each channel. ³ ³ ³
³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ Increase ProcessRow ³
³ ³ ³ Is ProcessRow > NumberOfRows? ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÙ
³ Yes ³ ³ No
³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³
³ ³ ProcessRow = BreakRow ³ ³
³ ³ BreakRow = 0 ³ ³
³ ³ Increase ProcessOrder ³ ³
³ ³ while Order[ProcessOrder] = 0xFEh, ³ ³
³ ³ increase ProcessOrder ³ ³
³ ³ if Order[ProcessOrder] = 0xFFh, ³ ³
³ ³ ProcessOrder = 0 ³ ³
³ ³ CurrentPattern = Order[ProcessOrder] ³ ³
³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
³ ³ ³
³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³ ³
³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³ CurrentRow = ProcessRow ³
³ ³ Update Pattern Variables (includes jumping to ³
³ ³ the appropriate row if requried and getting ³
³ ³ the NumberOfRows for the pattern) ³
³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³ ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³
ÚÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ Yes ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Instrument mode? ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ Update Envelopes as required ³
ÀÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ Update fadeout as required ³
³ ³ Calculate final volume if req ³
³ No (Sample mode) ³ Calculate final pan if req ³
³ ³ Process sample vibrato if req ³
ÚÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³ Calculate final volume if required ³ ³
³ Calculate final pan if requried ³ ³
³ Process sample vibrato if required ³ ³
ÀÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
³ ³
³ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Output sound!!! ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Axx Set Tempo
if (xx != 0) {
Maxtick = xx;
Currenttick = xx;
}
Bxx Jump to Order
ProcessOrder = xx - 1;
ProcessRow = 0xFFFE; // indicates new pattern internally for IT...
Cxx Break to Row
BreakRow = xx;
ProcessRow = 0xFFFE;
Dxx Volume slide down
if (xx == 0) then xx = last xx for (Dxx/Kxx/Lxx) for this channel.
Order of testing: Dx0, D0x, DxF, DFx
Dx0 Set effect update for channel enabled if channel is ON.
If x = F, then slide up volume by 15 straight away also (for S3M compat)
Every update, add x to the volume, check and clip values > 64 to 64
D0x Set effect update for channel enabled if channel is ON.
If x = F, then slide down volume by 15 straight away also (for S3M)
Every update, subtract x from the volume, check and clip values < 0 to 0
DxF Add x to volume straight away. Check and clip values > 64 to 64
DFx Subtract x from volume straight away. Check and clip values < 0 to 0
Hxy Vibrato
if (x != 0) {
speed = 4*x;
}
if (y != 0) {
depth = y * 4;
if(OldEffects) depth <<= 1;
}
Set effect update for channel enabled if channel is ON.
Goto InitVibrato (explained later)
Ixy Tremor, ontime x, offtime y
if (x != 0) {
ontime = x;
if (oldeffects) ontime++;
}
if (y != 0) {
offtime = y;
if (oldeffects) offtime++;
}
Nxx Channel volume slide down
if (xx == 0) then xx = last Nxx for this channel.
Order of testing: Nx0, N0x, NxF, NFx
Nx0 Set effect update for channel enabled.
Every update, add x to the volume, check and clip values > 64 to 64
N0x Set effect update for channel enabled.
Every update, subtract x from the volume, check and clip values < 0 to 0
NxF Add x to volume straight away. Check and clip values > 64 to 64
NFx Subtract x from volume straight away. Check and clip values < 0 to 0
Uxy Fine Vibrato
if (x != 0) {
speed = 4*x;
}
if (y != 0) {
depth = y;
if(OldEffects) depth <<= 1;
}
Set effect update for channel enabled if channel is ON.
Goto InitVibrato (explained later)
Wxx Global volume slide down
if (xx == 0) then xx = last Wxx for this channel.
Order of testing: Wx0, W0x, WxF, WFx
Wx0 Set effect update for channel enabled.
Every update, add x to the volume, check and clip values > 128 to 128
W0x Set effect update for channel enabled.
Every update, subtract x from the volume, check and clip values < 0 to 0
WxF Add x to volume straight away. Check and clip values > 128 to 128
WFx Subtract x from volume straight away. Check and clip values < 0 to 0
.. sorry this is incomplete..

View File

@ -0,0 +1,70 @@
What is VSound?
---------------
VSound is a virtual sound driver for Impulse Tracker. It actually uses
Microsoft's DirectSound to provide output on ANY soundcard supported by
Windows '95 or Windows '98. It does NOT support Windows NT.
It does take a little effort to setup and doesn't perform quite as well
as the native drivers, so if you have a SB16, ESS or some other card
directly supported by IT, don't bother messing around VSound. If you have
a SBPro compatible card, some PCI card or anything else that isn't being
used to its maximum capabilities, then give these files a try.
How to use these files
----------------------
You MUST have DirectX installed. It was written with the DirectX6 SDK,
although I'm pretty sure DirectSound 5 is sufficient.
1. Copy ITVSOUND.VXD into your Windows\System directory
(normally C:\WINDOWS\SYSTEM)
Note that the file may NOT show up in Window's Explorer since they have
a system extension (.VXD). Use DOS, or enable (unhide) system files in
your Explorer configuration.
2. In your Windows directory (normally C:\WINDOWS), edit your SYSTEM.INI file
and include the line:
device=itvsound.vxd
anywhere in the [386Enh] section
3. Reboot your computer
4. Run Server.EXE
5. Run "IT"
Configuring the driver
----------------------
The driver can be configured by modifying Window's Registry by running
"regedit" (which comes with Windows). The variables can be found at:
"KHEY_LOCAL_MACHINE\Software\Jeffrey Lim\Impulse Tracker VSound Server"
The 4 variables are:
BufferSize - The size of the DirectSound buffer in kb.
Permitted ranges from 4 to 64, default 24
BufferThreshold - The size of the buffer that IT tries to maintain in kb.
Permitted ranges from 2 to 32, default 21
BufferType - 0 = DualBuffer (BufferSize is logically split into 2 sections)
1 = QuadBuffer (BufferSize is logically split into 4 sections)
2 = OctBuffer (BufferSize is logically split into 8 sections)
(recommended, default)
MixSpeed - Mixing rate to be used in Hz.
Permitted ranges from 11025 to 64000, default 44100
You will need to restart the server before these changes take effect.
Known Problems
--------------
1. This driver only works with Win95 and Win98, NOT WinNT (I'll try a WinNT
driver sometime).
2. There is an obvious latency due to the size of the buffers and the delay
that is inherent to DirectSound. Reducing the BufferSize and BufferThreshold
values can reduce this latency, however, smaller values can also cause the
sound to break up.
Try using the values:
1. BufferSize=16, BufferThreshold=14, BufferType=2, MixSpeed=44100

View File

@ -0,0 +1,400 @@
-------------------------------------
## Impulse Tracker MIDI Supplement ##
-------------------------------------
Introduction
============
The biggest new addition to Impulse Tracker 2.12 has been support for
sending data out through the MIDI protocol. Earlier versions of Impulse
Tracker (IT) have had support for incoming MIDI data, so it was possible to
play on a 'MIDIfied' keyboard and have IT 'track' all the notes down in the
pattern in realtime.
MIDI out, however, is a completely different ballgame. You in fact don't
have to read this supplement at all if you wish to get MIDI working, but in
order to gain full usage of MIDI out, you will have to read this in order
to understand how IT's MIDI support fully works
MIDI Support & Soundcards (Modified by Pulse)
=============================================
At present, the only sound devices IT supports for MIDI output are the AMD
InterWave and the Creative Labs Sound Blaster AWE32. Support for other
soundcards is via the generic MPU401 driver. To use this driver, you must
run "IT /S19 /A<address>" where <address> is the address of your MPU401
compatible card (eg. "IT /S19 /A330"). Note that the generic MPU401 driver
does *NOT* support sample playback at all.
MIDI And AWE32 Soundcards (Pulse)
---------------------------------
I have found that the Windows '95 drivers for the AWE32 are somewhat buggy.
On my computer, I can use MIDI In/Out in Impulse Tracker *IF* I disable the
MIDI support within Windows '95. Otherwise, it is simply not recognised. To
disable the MIDI support in Windows '95, right click on "My Computer",
"Properties", "Device Configuration", "Sound, Video & Game Controllers".
Double click on "Creative Labs SB16 or AWE32" and go to the resources.
Uncheck the "Use Automatic Settings" box if it is set and change the basic
configuration to one that does NOT include the MIDI Ports 300h or 330h.
(For example, Basic Configuration 0 has only 220h, 5, 1, 5 on my computer
and IT works fine in a DOS Box)
Enabling MIDI
=============
To enable MIDI output, you must first have IT on Instrument control mode
rather than Sample control mode. To do this, press F12 to go to the Song
Variables screen and switch control to 'Instruments' if you haven't already
done so.
MIDI & Instruments
==================
MIDI Channel
------------
New to the Pitch section of the Instrument screen (press F4 and select the
"Pitch" button) are the sliders "MIDI Channel", "MIDI Program" and "MIDI
Bank". Once the MIDI Channel value for that instrument is set to a value
other than zero, IT will send out MIDI data whenever that instrument is
encountered in a pattern, on that particular MIDI Channel. What data IT
actually sends through the MIDI port will be a note on command, although
this will be discussed in more detail later.
MIDI Program/MIDI Bank
----------------------
The MIDI Program and MIDI Bank sliders work in a similar manner to each
other. If they have a value set to -1, IT will not transmit a program change
message nor a bank change message for that instrument. If you specifically
set a MIDI Program for that instrument, IT will send a 'program change'
message along with the 'note on' message.
The MIDI Bank instrument setting is also the same; IT will not send a bank
change message if the MIDI Bank slider is set to Off (ie: has a value of
-01). If the MIDI Bank setting is active for that instrument, IT will send
it along with the note on message as well.
Summary
-------
IT will always send a 'note on' command for a particular MIDI channel
whenever a MIDI instrument is encountered in the pattern. (A MIDI instrument
is simply an instrument where the MIDI Channel value has been set to
something other than "Off"). IT will also send a program change command and/or
a bank change command along with the note on command if they are set active.
More Advanced MIDI
==================
How MIDI Works
--------------
MIDI is not a file format (like IT is a module format) nor is it even a file
layout. MIDI is a computer protocol (or language) which is used to
communicate between devices . You may like to think of it as a network,
where the MIDI cables are the cables you lay between computers, and MIDI is
the network protocol (such as Novell NetWare, Windows Networking or TCP/IP)
used to communicate between the sound devices. When an instrument is said to
be 'MIDI compliant', that means that it has support for the MIDI protocol
and understands MIDI messages.
The .MID file format is simply a way to store these messages. It is a
collection of MIDI data, and when a .MID file is run through a MIDI player,
all the MIDI player does is send the data in the .MID file out through the
computer's MIDI port. In a network analogy, if you can imagine that every
single transaction run through the network was being logged to a file on
your hard disk; that every single byte was being recorded to a logfile, this
is what a .MID file is.
An example of MIDI Communication in IT
--------------------------------------
You've read above that when IT encounters a MIDI instrument in the
patterndata, it sends a 'note on' command, which is defined in the MIDI
protocol to be 'Play this note on this MIDI channel at this particular
velocity'. (Velocity is similar to volume ). If you play a MIDI instrument
which is mapped to MIDI channel 2 at C-5 with a velocity of 64, the actual
data which IT sends out to the MIDI port resembles something like this (in
hex):
Note On with parameters;
MIDI Channel: 2
Note: C-5
Velocity: 64
Data that IT sends out (hex): 91 3C 40
Data that IT sends out (decimal): 145 60 64
We'll run through each of these three bytes step by step.
The first byte (91 in hex, or 91h) is the actual 'Note on' command. It tells
the receiving MIDI device that the data which follows is part of the 'note
on' data. An analogy which trackers may find useful is the effect column.
There, you have an effect command and effect data; for example, the effect
'G20' can be split up into two parts--'G' and '20'. The 'G' part is the
actual effect command which tells IT that you wish to perform a portamento,
and the '20' part is the effect data, or in this case the spe ed at which
the portamento should occur. In this MIDI example, the '9' is the MIDI
command and the '1 3C 40' is the rest of the data for that command.
Now, the second digit (1 in our example) specifies the MIDI channel. MIDI
channels are 0-based; that is, if you want to send to MIDI channel 6, IT
specifies 05 for the actual data. MIDI channel 10 is 09h, MIDI channel 14 is
0Dh, etc. Here we're sending to MIDI channel 2, so the value sent out over
MIDI is 01h.
The second byte (3Ch) is actually the note to send (C-5 here). In MIDI, all
command (parameter) data is between a scale of 00h-7Fh (or 0-127 in
decimal). Notes are transmitted the same way - via numbers. If you imagine
C-1 is sent with a value of 00h, C#1 i s 01h, D-2 is 02h, etc, then the note
we want to play, C-5, has a value of 3Ch (60 decimal).
Now the first and second bytes are done with, the third byte should be
fairly easy to understand. This byte represents the velocity at which the
note should be played. In our case, we want a velocity of 64, which
translates to 40h, and so this is the value which is sent out.
So to recap, we have three bytes for the note on command, "91 3C 40".
Byte 1: 91 == Note on command (on MIDI channel #2)
Byte 2: 3C == Note on data (Note to play, C-5)
Byte 3: 40 == Note on data (Velocity of 64 decimal)
Configuring IT's MIDI out data
------------------------------
Keeping the above example in mind, press Shift-F1 to get to IT's MIDI screen
and press the 'MIDI Output Configuration' button. This will take you to IT's
MIDI out engine. Now, if you examine the 'Note On' field, it reads:
9c n v
This can be correlated to our above example of '91 3C 40'. Now, the 'c n v'
in the Note On field corresponds to 'channel', 'note' and 'velocity'. Think
of them as variables; IT will substitute the appropriate channel, note and
velocity values which it encounters in the MIDI instrument information
and/or patterndata.
If you now actually defined a MIDI instrument to play on MIDI channel 2, and
you played it in a pattern at C-5 with velocity 64, all IT does is read the
'Note On' field from the MIDI configuration screen and substitute '1' for
'c', '3C' (C-5) for 'n' and '64' for 'v'. Therefore, IT will read '9c n v'
and replace it with '91 3C 40'.
In any of the MIDI output fields, lowercase letters represent variables (or
subsitutions which IT should make) and uppercase letters or numbers are
constants which IT writes to the MIDI port directly without any change.
Therefore, these fields are case se nsitive--for the note on command, '9c n
v' is blatantly different to '9C n v'. 9c represents 'send byte 09 followed
by the MIDI channel byte', whereas 9C represents 'send the byte 9C'.
In short, 0-9 and A-F are treated as hexadecimal constants and will be
passed through directly. Lowercase letters will be treated as variables and
substituted accordingly. Note that variables are regarded as 'full bytes' by
themselves and are never part of an actual byte sequence except for the
variable 'c', so '9n' is exactly the same as '09 n' or '9 n'; all of them
will expand to the sequence '09 <MIDI note byte>'. 'c' is the only value
that takes on a nibble (4-byte) value, due to the MIDI protocol definition.
This means that 9c will actually become one byte when expanded, with the
lower digit representing the channel.
IT MIDI Variables
-----------------
c: MIDI channel
This is simply the MIDI channel of which the instrument is set
to, 0-based. Note that this is the only nibble sized variable.
m: note value (instrument)
A value from 00-7Fh representing the note to be played, where
C-5 is 60h. This is the note entered in the pattern, not the
translated value.
n: note value (sample)
A value from 00-7Fh representing the note to be played, where
C-5 is 60h. This is the note after instrument translations have
been applied.
o: Offset value
Extra parameter than can be sent via Oxx commands.
v: velocity
The MIDI velocity of the note.
u: volume
Volume is similar to velocity, except that velocity does not
take the volume envelope and fadeout values into account, whereas the
'u' volume variable does.
x: pan set
Sends a MIDI panning value. This does not take into account
panning envelopes.
y: calculated pan
Sends a MIDI panning value which does take into account
panning envelopes.
a: high byte of bank select
b: low byte of bank select
These commands are only really useful in the bank change
field.
z: macro data
(See section on macros for full explanation).
Configuring MIDI Output for Your Keyboard
-----------------------------------------
In the basic IT distribution, the only fields which have any data are 'Note
on', 'Note Off' and 'Program Change'. The reason for this is that these are
the only commands which are set as standards by MIDI. MIDI commands such as
Change Pan, Bank Select , e tc all differ from synth to synth. There's not
much which can be done to solve this, you will have to look up your synth's
manual to find out the exact MIDI commands it needs to issue a panning
change, bank select, etc.
Some values which you may wish to try, however, will be:
Change pan: Bc 0A x
Bank select: Bc 0 a 20 b
These may or may not work. If they do, then great, but if they don't, you
will have to actually RTFM *gasp* in order to get these other commands
working.
Effect Commands & Macros
========================
Now that IT's MIDI engine is understood and the basis of MIDI communication
has been laid down, perhaps the most powerful function of IT's MIDI engine,
macros, will be explained.
Standard Effects
----------------
Firstly, at the moment there is NO support for standard IT effect commands
(such as pitch slide, portamento, vibrato etc) to work via MIDI. This may or
may not be implemented in future. Currently, however, if you perform an E01
effect on a note, nothing w ill happen as far as the MIDI aspect of the
instrument is concerned.
Macro Effects - SFx
-------------------
The SFx command, previously used in the .MOD format as "FunkRepeat", has
been changed in IT to allow for the functioning of MIDI macros. The unused
Zxx command will also now play a part in MIDI functioning.
To understand how this works, it's best to take an example into account. At
the beginning of this supplement, the MIDI sequence '91 3C 40' was used
which was a Note On, MIDI channel #2 played at C-5 with a velocity of 64.
This was represented in IT's MIDI configuration as '9c n v', so it made the
appropriate substitutions to '91 3C 40'.
The Macro Setup section of IT's MIDI Output Configuration screen can be used
to define your own custom MIDI command/data sequences. These can be
absolutely anything you like, from a MIDI SysEx command to a Note On
command. In fact, to start off, we'll tak e a Note On sequence as an example
and we will attempt to emulate the same '91 3C 40' bytes, except that we'll
make this sequence ourselves rather than letting IT do the work for us.
How SFx and Zxx commands relate
-------------------------------
Firstly, remember that IT substitutes values when it encounters variables.
If you glance at the above section on IT MIDI Variables, you'll notice that
the 'z' variable represents macro data. Now that this '91 3C 40' sequence
has been driven into our he ads, try setting the SF0 macro field on IT's
MIDI Output Configuration screen to '91 3C z'.
Remember that the third byte in the MIDI sequence (40 in our normal
example) is the velocity to send with the Note On message. The SF0 macro
field you've just defined means that IT will read any Zxx effects and
replace the 'z' variable in the SF0 macro with the 'xx' value from the Zxx
effect. To enable the macro, simply put in a SF0 along with a Note On in the
pattern data. Now, all values from Z00 to Z7F will substitute for 'z'
accordingly. So, to show that our SF0 sequence will reproduce the exact same
thing as our Note On command:
C-5 01 SF0 (this will play the note on command as usual, and
specify that the SF0 macro sequence should be
hooked to Zxx effects).
... .. ...
... .. ...
... .. ...
... .. Z40 (this will trigger our SF0 sequence with a 'z'
value of 40h).
The above patterndata should produce a note on event at row 0 in the
pattern, and again at row 4. Now, try replacing the Z40 effect with Z7F and
IT will substitute 'z' with '7F', or a velocity of 7Fh (127 decimal) in our
SF0 sequence. The result should be that you'll hear a Note On with velocity
64 on row 0, and a Note On with velocity 127 on row 4; ie: the second note
triggered will be twice as loud. The The sequence that IT will send will be
'91 3C 7F'.
SFx commands summary
--------------------
Our example above of using a 'note on' command sequence for an SFx effect is
rather pointless, since IT does this effect itself. However, it has
hopefully served its purpose by demonstrating how effects work.
The SFx commands, as you can see, can be redefined to absolutely any MIDI
data at all. This can be something simple like a pitch slide, a complex
SysEx 'set filter to aftertouch' command, or whatever you like. The
possibilities are endless and are only li mited by what your synth can do;
IT's SFx/Zxx combination is customisable enough to handle nearly any MIDI
data you wish to output.
If you wish to take advantage of these commands, you will have to look up
the manual for your synth and get stuck into the MIDI/SysEx section. Please
do not come to any IT support people asking for help on this subject because
every synth is different.
Z80 -> ZFF commands
-------------------
The Z80 to ZFF commands are also macro sequences, but they have no 'z'
variable to substitute for. They are not 'hooked' to any SFx effects, they
are straight, direct macro sequences. For example, if you have a MIDI
controllable effects unit (such as an Alesis MidiVerb), you may wish to
assign the Z80 command to set a up a certain value for the reverb delay
length. Later in the song, you can issue a Z81 command to change the reverb
delay or turn it off altogether.
To summarise, the Z80 to ZFF commands are similar to SFx macro sequences,
but they do not have any extra parameters (whereas the SFx macro's 'z'
variables are controlled by Z00 to Z7F).
Contact Information
===================
If there are any problems with this textfile, email ozone@post1.com or
pulse@cyburbia.net.au
__/\___/\_/\____/\____/\ .. . Andre Pang % vault ...:
/ /__ / \_ \_ __) :.. mailto:ozone@post1.com . ....:
( : / (__: ) | | _)_ : . http://www.mindflux.com.au/ .:
\___( ______/|__;__|_____| :. irc: #trax (irc.neato.org) ..:
\/ - #ozone

View File

@ -0,0 +1,71 @@
Networked Impulse Tracker
What is Networked Impulse Tracker?
----------------------------------
Networked Impulse Tracker is simply that - a session of Impulse Tracker where
multiple composers can all edit the same song at the same time! It may sound
a little bizarre, but networked sessions can be both extremely fun and
productive.
Requirements
------------
1. Impulse Tracker, 7 Apr 99 or later
2. Impulse Tracker Network driver file. (*.NET)
3. Some form of network supported by the network driver file.
To Use
------
To initiate a Network session, Press Shift-ESC. A list of available drivers
will be shown. Select one with Enter.
ITIPX.NET
---------
ITIPX.NET is an IPX Network driver for Impulse Tracker. It is recommended that
this is used over a LAN (ie. you will need a network card in your computer).
Although Kali will work (IPX over the internet), performance will probably be
unacceptable for most people through a modem.
The IPX driver *will not be stable* under Win95. Upgrade to Win98.
To install IPX to run under Windows, go to Start Menu->Settings->Control Panel.
Select Network, and under the Configuration Tab, press Add, then select
Protocol->Microsoft->IPX/SPX Compatible Protocol
The IPX driver will list the available sessions in the left hand box. Select
a session to join by pressing Enter.
The Username that the IPX driver transmits is associated with each driver file.
The public distribution identifies itself as "Unregistered". Different
usernames are availble for US$10 each. Payment can be made via Kagi at
http://order.kagi.com/?4ZM
Please specify a username, maximum length 15 characters, or else one will be
chosen for you. Updated versions of the driver, if made, will be provided free
of charge. However, changing your username will still cost $10.
'Normal' usage of this driver should run quite stably. However, if you try hard
to make it crash, I'm sure you will be able to.
Note that connections will be automatically dropped if queued packets fail to
be transmitted for more than 10 seconds.
General Notes
-------------
Impulse Tracker supports a maximum of 4 users per session. Extra users will
be automatically discarded.
Many functions have been disabled under network mode. You will receive warning
messages in these cases.
Do *NOT* use hardware mixed drivers for networked sessions. This specifically
means the AWE32, GUS and Interwave drivers. Since networked sessions can
change samples 'behind your back', these drivers will not update correctly.

View File

@ -0,0 +1,72 @@
This package contains 6 files
1. IT.EXE - This can be considered IT214 Patch #4. Includes a few bugfixes
and some minor enhancements. Registered users should use their
own IT.EXE
2. ITVSOUND.MMX - Virtual Sound Driver for Impulse Tracker. This is a MMX
driver and will not work on non MMX computers.
3. ITVSOUND.DRV - Virtual Sound Driver for Impulse Tracker. This is a non-MMX
driver and should work on all computers.
4. ITVSOUND.VXD - Driver to connect ITVSOUND.MMX to the server.
5. SERVER.EXE - Windows server to connect to DirectSound
6. README.TXT - This file.
How to use these files
----------------------
You MUST have DirectX installed. It was written with the DirectX6 SDK,
although I'm pretty sure DirectSound 5 is sufficient.
1. Copy ITVSOUND.VXD into your Windows\System directory
(normally C:\WINDOWS\SYSTEM)
2. In your Windows directory (normally C:\WINDOWS), edit your SYSTEM.INI file
and include the line:
device=itvsound.vxd
anywhere in the [386Enh] section
3. Reboot your computer
4. Run Server.EXE
5. Run "IT"
Configuring the driver
----------------------
The driver can be configured by modifying Window's Registry by running
"regedit" (which comes with Windows). The variables can be found at:
"KHEY_LOCAL_MACHINE\Software\Jeffrey Lim\Impulse Tracker VSound Server"
The 4 variables are:
BufferSize - The size of the DirectSound buffer in kb.
Permitted ranges from 4 to 64, default 24
BufferThreshold - The size of the buffer that IT tries to maintain in kb.
Permitted ranges from 2 to 32, default 21
BufferType - 0 = DualBuffer (BufferSize is logically split into 2 sections)
1 = QuadBuffer (BufferSize is logically split into 4 sections)
2 = OctBuffer (BufferSize is logically split into 8 sections)
(recommended, default)
MixSpeed - Mixing rate to be used in Hz.
Permitted ranges from 11025 to 64000, default 44100
You will need to restart the server before these changes take effect.
Known Problems
--------------
1. This driver only works with Win95 and Win98, NOT WinNT (I'll try a WinNT
driver sometime).
2. There is an obvious latency due to the size of the buffers and the delay
that is inherent to DirectSound. Reducing the BufferSize and BufferThreshold
values can reduce this latency, however, smaller values can also cause the
sound to break up.
Try using the values:
1. BufferSize=16, BufferThreshold=14, BufferType=2, MixSpeed = 44100

View File

@ -0,0 +1,296 @@
Summary Information - Command Line
-SFilename.Drv - Set soundcard driver
-Sxx Quick set sound card
0 = No Sound
1 = PC Speaker
2 = Sound Blaster 1.xx
3 = Sound Blaster 2.xx
4 = Sound Blaster Pro
5 = Sound Blaster 16
6 = Sound Blaster AWE 32
7 = Gravis UltraSound
8 = Interwave IC
9 = Pro Audio Spectrum
10 = Pro Audio Spectrum 16
11 = Windows Sound System
12 = ESS ES1868 AudioDrive
13 = EWS64 XL Codec
19 = Generic MPU401 driver
20 = Disk writer device
-Axxx Set sound card's address (hexadecimal)
-D# Set DMA channel (decimal)
-I## Set IRQ number (decimal)
-M##### Set mixing speed (decimal)
-L### Limit number of channels
-C Control playback in DOS Shell (with Grey +/-, Right Alt & Right Ctrl)
-F Disable file-colour distinctions
-K Exchange F1 and F11 keys
-Px Pattern memory allocation strategy.
-P0 = Try to store patterns in conventional memory first, EMS is
only used once conventional memory runs out.
Not recommended, but those of you who use IT in Windows 3.xx
should try this option if you get EMS errors. (I recommend
that you don't use IT under Windows 3.xx at all)
-P1 = Use one block of EMS for all patterndata.
This is the most memory efficient of all the pattern
storage modes - (this is also the default)
-P2 = Use EMS blocks for each pattern
This is a VERY wasteful but 'safe' memory allocation scheme.
-R Reverse channels (flip left-right), same as Alt-R on the info page.
-T1 Disable usage time indication
-T2 Enable timeslice release
-V1 Override VGA detection/Matrox detection.
-V2 Force matrox compatibility mode (use with -v1)
-V3 Wait for vertical retraces
-X1 Disable internal MMTSR
-X2 Disable mouse
-X3 Disable drive map detection
-X4 Disable cache file creation
Summary Information - Effects, alphabetically
Volume Column Effects
Ax - Volume slide up
Bx - Volume slide down
Cx - Fine volume slide up
Dx - Fine volume slide down
Ex - Pitch slide down
Fx - Pitch slide up
Gx - Portament to
Hx - Vibrato with speed x
General Effects
Axx - Set speed (set number of frames per row)
Bxx - Jump to order
Cxx - Break to row xx of (next) pattern
Dxy - Volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Exx - Pitch slide down by xx
EFx - Fine pitch slide down by x
EEx - Extra fine pitch slide down by x
Fxx - Pitch slide up by xx
FFx - Fine pitch slide down by x
FEx - Extra fine pitch slide down by x
Gxx - Portamento to note with speed xx
Hxy - Vibrato with speed x, depth y
Ixy - Tremor with ontime x, offtime y
Jxy - Arpeggio with halftones x and y
Kxy - Dual command: H00 and Dxy
Lxy - Dual command: G00 and Dxy
Mxx - Set channel volume to xx (0->40h)
Nxy - Channel volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Oxx - Set sample offset to xx00h
Pxy - Panning slide, x=0 right; y=0 left; x=F fine right; y=F fine left
Qxy - Retrigger note every y frames with volume modifier x
Values for x:
0: (nothing) 4: -8 8: (nothing) C: +8
1: -1 5: -16 9: +1 D: +16
2: -2 6: *2/3 A: +2 E: *3/2
3: -4 7: *1/2 B: +4 F: *2
Rxy - Tremelo with speed x, depth y
S3x - Set vibrato waveform
S4x - Set tremelo waveform
S5x - Set panbrello waveform
Waveforms for x in S3x, S4x and S5x:
0 = Sine 2 = Square
1 = Ramp down 3 = Random
S6x - Pattern delay for x frames
S7x - Instrument functions
Values for x in S7x:
0: Past note cut 5: Set NNA to note off
1: Past note off 6: Set NNA to note fade
2: Past note fade 7: Turn off volume envelope
3: Set NNA to note cut 8: Turn on volume envelope
4: Set NNA to continue
S8x - Set pan position
S91 - Set surround sound
SB0 - Set loopback point
SBx - Loop x times to loopback point
SCx - Note cut after x frames
SDx - Note delay for x frames
SEx - Pattern delay for x rows
SFx - Select parameterised MIDI Macro
T0x - Tempo slide down by x
T1x - Tempo slide up by x
Txx - Set tempo (20h->0FFh)
Uxy - Fine vibrato with speed x, depth y
Vxx - Set global volume to xx (0->80h)
Wxx - Global volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Xxx - Set panning position (0->0FFh)
Yxy - Panbrello with speed x, depth y
Zxx - MIDI Macro - check MIDI.TXT
Summary Information - Effects, categorically
Note: Not all effects are listed here.
Speed Control
Axx - Set speed
T0x - Tempo slide down by x
T1x - Tempo slide up by x
Txx - Set tempo (20h->0FFh)
S6x - Pattern delay for x frames
SEx - Pattern delay for x rows
Position Control
Bxx - Jump to order
Cxx - Break to row xx of (next) pattern
SB0 - Set pattern loopback point
SBx - Loop pattern x times
Volume Control
Ax - Volume slide up
Bx - Volume slide down
Cx - Fine volume slide up
Dx - Fine volume slide down
Dxy - Volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Ixy - Tremor with ontime x, offtime y
Mxx - Set channel volume to xx (0->40h)
Nxy - Channel volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Vxx - Set global volume to xx (0->80h)
Wxx - Global volume slide, x=0 down; y=0 up; x=F fine down; y=F fine up
Rxy - Tremelo with speed x, depth y
S4x - Set tremelo waveform
Panning Control
Xxx - Set panning position (0->0FFh)
S8x - Set pan position
S91 - Set surround sound
Pxy - Panning slide, x=0 right; y=0 left; x=F fine right; y=F fine left
Yxy - Panbrello with speed x, depth y
S5x - Set panbrello waveform
Pitch Control
Exx - Pitch slide down by xx
EFx - Fine pitch slide down by x
EEx - Extra fine pitch slide down by x
Ex - Pitch slide down
Fxx - Pitch slide up by xx
FFx - Fine pitch slide up by x
FEx - Extra fine pitch slide up by x
Fx - Pitch slide up
Gxx - Portamento to note with speed xx
Gx - Portamento to
Hxy - Vibrato with speed x, depth y
Hx - Vibrato with speed x
Uxy - Fine vibrato with speed x, depth y
S3x - Set vibrato waveform
Jxy - Arpeggio with halftones x and y
Summary Information - Pattern Editor 1
Data Entry
Alt-0 -> Alt-9 Set skipvalue to 0-9
. (period) Clear field(s)
1 Note cut (^^^)
` Note off (ÍÍÍ) / panning toggle (in volume column)
Spacebar Use last (default) note/instrument/volume/effect/effectvalue
³ ³ ³³ ³ ³ ³ ³³ ³³ ³ ³ ³ ³³ ³ ³ ³ ³³ ³³ ³ ³ ³ ³³ ³ ³
³ ³ ³³ ³ ³ ³ ³³ ³³ ³ ³ ³ ³³ ³ ³ ³ ³³ ³³ ³ ³ ³ ³³ ³ ³
³ ³S³³D³ ³ ³G³³H³³J³ ³ ³2³³3³ ³ ³5³³6³³7³ ³ ³9³³0³ ³
³ ÀÂÙÀÂÙ ³ ÀÂÙÀÂÙÀÂÙ ³ ÀÂÙÀÂÙ ³ ÀÂÙÀÂÙÀÂÙ ³ ÀÂÙÀÂÙ ³
³ Z³ X³ C³ V³ B³ N³ M³ Q³ W³ E³ R³ T³ Y³ U³ I³ O³ P³
ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ
Pattern selection
+, - Next/Previous pattern (*)
Shift +, - Next/Previous 4 patterns (*)
Ctrl +, - Next/Previous order's pattern (*)
Miscellaneous
Enter Get default note/instrument/volume/effect
'<' or Ctrl-Up Decrease instrument
'>' or Ctrl-Down Increase instrument
Grey '/' Decrease octave
Grey '*' Increase octave
',' (comma) Toggle edit mask for current field
Ins/Del Insert/Delete a row to/from current channel
Alt-Ins/Del Insert/Delete an entire row from pattern (*)
Alt-N Toggle Multichannel
2*Alt-N Multichannel selection menu
Alt-Enter Store pattern data
Alt-Backspace Revert pattern data (*)
Ctrl-Backspace Undo - any function with (*) can be undone.
Ctrl-F2 Set (multiple) pattern length
Cursor Control
Up/Down Move up/down by the skipvalue
Ctrl-Home/End Move up/down by 1 row
Alt-Up/Down Slide pattern up/down by 1 row
Alt-Left/Right Move forwards/backwards one channel
Ctrl-Left/Right Move left/right between track columns
Tab/Shift-Tab Move forwards/backwards to note column
PgUp/PgDn Move up/down by n lines (n=Row hilight major)
Ctrl-PgUp/PgDn Move to top/bottom of pattern
Home Move to start of column/start of line/start of pattern
End Move to end of column/end of line/end of pattern
Backspace Move to previous position (accounts for Multichannel)
Ctrl-C Toggle centralise cursor option.
Track View Functions
Alt-T Cycle current track's view
Alt-R Remove all track views
Alt-H Toggle track-view divisions
Ctrl-0 Deselect current track
Ctrl-1 - Ctrl-5 View current track in scheme 1-5
Ctrl-Left/Right Move left/right between track columns
Left-Ctrl &
Left-Shift 1-4 Quick setup view scheme (and enable cursor-tracking)
Ctrl-T Toggle view-channel cursor tracking
Summary Information - Pattern Editor 2
Block functions.
Shift-Movement Mark block
Alt-B Mark beginning of block
Alt-E Mark end of block
Alt-D Quick mark n/2n/4n/... lines (n=Row Hilight Major)
Alt-L Mark entire column/pattern
Alt-U Unmark block/release clipboard
Alt-Q Raise notes by a semitone (*)
Alt-A Lower notes by a semitone (*)
Alt-S Set instrument (*)
Alt-V Set volume/panning (*)
Alt-W Wipe volume/panning not associated with a note/instrument (*)
Alt-K Slide volume/panning column (*)
2*Alt-K Wipe all volume/panning controls (*)
Alt-J Volume amplifier (*) / Fast Volume attenuate (*)
Alt-Z Cut block (*)
Alt-X Slide effect value (*)
2*Alt-X Wipe all effect & effect value data (*)
Alt-C Copy block into clipboard
Alt-P Paste data from clipboard (*)
Alt-O Overwrite with data from clipboard (*)
Alt-M Mix data from clipboard with pattern data (*)
Alt-F Double block length (*)
Alt-G Halve block length (*)
Alt-I Select template mode / Fast volume amplify (*)
Ctrl-J Toggle fast volume amplification with Alt-J/Alt-I
Playback functions
4 Play note under cursor
8 Play row
Ctrl-F6 Play pattern from current row
Ctrl-F7 Set/Clear playback mark (for use with F7)
Alt-F9 Toggle current channel on/off
Alt-F10 Solo current channel on/off

View File

@ -0,0 +1,592 @@
Contributors Additions
- IT215 file format saving. Note that this is an alternative compression
format and is often better, but not always. Public releases of IT214
Patch 1 and later can read IT215 compressed files. There is also a
version of MikIT that can read IT215 compression.
- Sample sorting enabled. On the sample/instrument list screens, files will
be priority sorted alphabetically if you don't move the cursor. If you
do move the cursor, then you can force a resort once all the files have
been loaded by pressing Alt-S.
- Reordering of order list with Alt-R while on the order list screen
(easier to try it out, than to try to explain it)
- Row lock in pattern editor if holding shift - very useful for chords
(ie. use Shift+note)
- 10 configurable 'preset' envelopes slots
- Extra instrument filter controls (under pitch menu).
- Alt-W on the sample list saves as .WAV format, not .RAW
- Individual Sample/Instrument solo.
- Personalised Network username
Contributions of US$30 or more
- Stereo Diskwriter
- MIDI .IT -> .MID converter
Bug fixes to Network version
- Correct data transmitted on:
1. Pattern Undo (Ctrl-Backspace)
2. Block Mix (Alt-M)
- EMS Error 83h during network sessions
IT214 Network
- This includes the first version of Networked Impulse Tracker. Check
NETWORK.TXT for more information.
- ITSB16B.MMX for SBLive! users which shouldn't require reinitialisation.
IT214 Patch 4 - This release has been made entirely for the VSOUND drivers,
which will allow you to setup IT to run under Windows '95/'98
with *ANY* soundcard. Check ITVSOUND.TXT for more information.
- Addition: Included command line option /V3 to wait for vertical retrace.
- Addition: Included command line option /X4 to disable cache file creation.
- Bug fix: Several fixes to the MIDI Out implementation
- Bug fix: S3M saver sometimes caused crash problems and pattern errors
- Bug fix: SCx and Qxx commands and will work with MIDI Out instruments
- Bug fix: 64 channel view doesn't skip channels with only volume-effects
- Driver news: 4-band EQ in diskwriter
Minor miscellaneous upgrades
Fixes to MMX drivers that clicked on 0 volume (oops)
Clarification (only because I saw some arguments on usenet)
- the MMX drivers use 32-bit precision mixing, not 16-bit.
IT214 Patch 3 - Merry XMas guys!
- If anyone who has contributed has NOT received an EMail from me, please
write to me! I've sent out EMails to every one of you.. but a few
addresses have changed.. or I could have accidentally missed you (huge
apologies if so)
- Bug fix: IFF loader <incorrect info given to me before>
- Bug fix: XM modules with no patterns won't crash IT. (Apologies to the
GroovyCompo Organisers - for those interested in online music
tracking competitions, check http://www.groove.org)
- Bug fix: CACHE files stored on CDROMs will now work, irrespective of
their datestamp. Thanks to Humanoid/Prophecy for the Morbid Minds
CD on which I could finally test these routines!
- Bug fix: Obscure bug on instrument list under rare circumstances causing
playing notes to do weird things.
- Driver news: Updated driver format (incompatible with previous ITs)
Resonant filters - check FILTERS.TXT for information.
This stuff has been released basically so that contributors
can distribute their songs that use filters..
- MMX drivers implemented.
- WAV driver - time accuracy improved
- can specify destination directory (on shift-F5)
- handles resonant filters
IT214 Patch 2
- Bug Fix: 16-bit samples of an exact multiple of 32768 bytes in size were
getting corrupted on saving.
- Bug fix: MIDI Macros (unparameterised) were somehow disabled somewhere
after IT212.. now reenabled
IT214 Patch 1
- Bug fix: EMM4.0 mode reenabled
- Bug fix: Volume envelopes were skipping some ticks (sounded too fast)
- Bug fix: Slight problems with the wav writer fixed
- Bug fix: S3M saving bug fixed (was introduced in IT214 due to a 'bug
report')
- Other miscellaneous fixups
IT214 - Version jump to make sure samples don't get screwed up by the
prerelease (IT213) loader. This is the FINAL public release. Apart
from bugfixes/new soundcard drivers, don't expect to see anything in
the future...
- Samples are now compressed on the fly when saved and loaded from disk.
Note that this is NOT the same as using MMCMP.
- Several unimportant (debug) procedures removed to make slightly more
memory available.
- Driver news: Diskwriter interpolation changed from quadratic spline
to cubic spline. (Requires a FPU)
IT213 Update
- Modification: Sample panning reset to override instrument panning due to
demand.
- Update: .IFF loader updated. Should deal with almost any .IFF file now.
- Update: EMS Stability improved
- Update: Several miscellaneous changes
- Update: If old effects is *ON*, then a looped volume envelope will NOT
include the last node (for XM compat)
- Update: More memory available (Help text was manually compressed)
- Row hilight information is now stored within the .IT module..
- Automatic MIDI Pitch wheel handling. Vibrato, pitch slides, portamentos
all handled.
<Note: REQUIRES a FPU.. the program will hang if you enable this on
Shift-F1 and you don't have a FPU (486DX+ chips have FPUs)>
- MIDI Configuration can be embedded into .IT files.
(Option is on Shift-F1)
- Driver news: Terratec EWS64 XL Codec software mixing driver
Terratec Maestro 32/96 Codec software mixing driver
Terratec Maestro 16/96 Codec software mixing driver
Ensoniq SoundscapeVIVO Codec software mixing driver
Sound Track PCI Codec software mixing driver
ES1688 Audiodrive Codec software mixing driver (for ViperMAX)
MPU401 generic driver.
Direct to Disk writer now uses logarithmic volume ramping
and quadratic spline interpolation
Read DRIVERS.TXT for information on all of these.
IT212 Update - Special thanks go out to all those that did stability testing
of the beta versions of IT212.
- Bug fix: "Available Samples" in the instrument loading screen will be
correct if you're loading an instrument from within a module.
- Bug fix: Sample files will store default pan values.
- Bug fix: Trying to show pattern data past the end of a pattern will
not crash IT anymore. This could have occurred before if the
number of rows in a pattern were reduced during playback, then
switching to the info page.
- Bug fix: Deleting samples/instruments "within" a module has been disabled
(as it should be), so that the module itself cannot be deleted.
- Bug fix: Default sample pan will override instrument pan whether "Old
Effects" is on or off.
- .669 Loader, since Snowman is collecting 'em :)
This loader hasn't been extensively tested, maily because Composd.Exe
will not run on my machine (64MB is "Not enough extended memory" ?!?! ).
Most songs should play though.. Please don't bug me to update the loader
any further - you won't get a reply.
- *Much* better memory handling for patterns. EMM386 parameter H=255
should not be required in MOST cases now (you will only need it if
you use a large number of samples (ie. > 50) ). You should also have
more FreeMem to work with. Beta testers have noted that QEMM shows even
more stability problems in this version than previous versions - please
avoid QEMM as it DOES cause crashing for as yet unknown reasons. The old
memory allocation routines can still be found if you have EMS problems by
using /P2 on the command line.
- Keyboard handling on instrument lists has been improved to handle
multiple keypresses/releases. (but not on sample list due to usability)
- Default volume display in *NORMAL* (5 channel) pattern editor if you press
Ctrl-V. If you use a custom font, you will need to upgrade your font set
with FONTUPGR to see this properly.
Example:
C-4 01 .. ... <-- what volume is this??
Press Ctrl-V:
C-4 01 [32] ... <-- it'll show that the default volume of
sample/instrument 1 is 32.
Alt-K has been upgraded to 'pick up' these default values. (So that you
can also slide from volume 0 to the sample's default without having to
explicitly key in the value).
- Automatic filename extension replacement on Ctrl-S, so that if you press
Ctrl-S after loading a .MOD, .669, .MTM or .XM, the filename will be
automatically modified to have a .IT extension.
- CDRom check for CACHE.IT? files. If you burn a CDRom of samples or
instruments, include the CACHE.ITI and CACHE.ITS files from IT211+ and
they should accelerate loading of sample and instrument names on all
future versions of IT.
< Not tested, since I can't :( >
- 64 channel miniview on the info page. (note: doesn't show all fields)
- Note dots added on the info page.
(You may have to update your info page settings by re-saving all prefs)
- Changed the old Alt-C on the instrument list to Alt-W (wipe data)
New Alt-C removes the instrument name and filename, but does NOT
remove the instrument parameters (like the Alt-C on the sample list)
- MIDI OUTPUT!
Fully configurable output
16 parameterised macros
128 constant macros
Check MIDI.TXT for details. (Big thanks to Ozone for writing this)
- Soundcard Driver news
þ Inserted a new algorithm into the direct-to-disk writer to remove
clicks at the end of samples in cases of Note Cut commands, Note Cut NNA
and instantaneous sample changes in sample mode. For those who have
sent me money and would like to receive the upgrade, EMail me.
þ ESS ES1868 AudioDrive driver. This will NOT support any other ESS
chipsets than the ES1868. Do not write to me asking for support for
other ESS chips unless you are willing to buy me a card (or send me
the money to do so). This driver supports mixing rates up to 56.8kHz
(16 bit, stereo) and it also supports MIDI In.
þ AWE32 driver update: More accurate tempo control and less clicks under
Win95
þ TB Tropez users: I received an EMail telling me that the GUSMAX drivers
were working fully with the TB Tropez cards! See how
it works...
þ Sound drivers for the ST97 and EWS64 coming... as soon as I get them
working....
Other news: It seems that some people really don't care how much work
I've put into IT - Warez versions of the full ITWAV.DRV
are being sought after. Let me make this clear: Distribution
of the full version of ITWAV.DRV is NOT appreciated and if I
ever find the full version anywhere, IT will no longer be
publically released.
IT211 Update - Not so much this time, as I have been working full time, so
since IT has been sitting on my HDD without changes for a
couple of weeks, I decided to release the update anyway.
- Saving a song with Ctrl-S or from the menu will not prompt about
'overwriting' the file.
- Compatibility Gxx volume fadeout fixed.
- Matrox autodetection fixed to set mouse cursor properly also.
- You can press 'L' or 'R' on the "load stereo sample" prompt to select
left or right channels.
- Increased file-header 'load-buffer' so that more Sound Forge .WAV files
should be recognised.
- Bug fix to: swap samples/instruments, insert/remove sample/instrument
and update instrument *could* have caused the current
editing pattern to skip being modified.
- Bug fix: Pressing delete on a non-note column in template mode should
work as expected.
- Note: If you delete your old IT.CFG files and run IT afresh, you'll
get an extra 'line' on the infopage to work with.
- .KRZ sample-library loader. Note that this does NOT support multiple
.KR* files (ie. .KR1, .KR2, .KR3). To use these files, you will have
to run MERGEKRZ.EXE (supplied) to create a single .KRZ file.
(BIG thanks to Markus Jonnson for the info!)
- .PAT sample-library loader.
- Creating a 'host instrument' after loading a sample will first attempt
to use an instrument of the same number as the sample before finding
the first empty instrument.
- Holding down Caps Lock in the pattern editor will allow you to play
notes without entering them into the patterns.
Driver modifications
- Bug fix for SB16 drivers which caused patterns not to 'play'. For those
that still have troubles with the SB16 driver, read DRIVERS.TXT
- For those of you who couldn't get the GUSMAX driver working, check out
DRIVERS.TXT also :)
- The ITWAV.DRV file now writes proper .WAV files instead of .RAW
- ITAWE32.DRV uses floating point calculations to reduce memory usage.
ITAWE32B.DRV (the old driver) still exists for people who don't have
math coprocessors
IT210 Update - some MAJOR fixes here.
- Approximate song length on Ctrl-P. Note that *some* soundcards will
require reinitialisation after this (almost all won't). The time given
is the 'ideal' time for the playback of the song and should correspond
*exactly* to GUS/AWE non-IRQ playback times.
- A few more player bug fixes for XM compatibility
- IT won't crash if you try to load instruments from an 'empty' drive
(eg. disk not inserted or no files present)
- In the pattern editor, Insert/Delete, Note Cut/Note Off/Note Delete
are all 'template aware' - they will span more than 1 channel if
you are editing in template mode and the template has height 1.
Also, 'picking up' data with Enter will turn off Template mode's except
for "Template-Notes Only"
- Volume column effects Ex/Fx/Gx in combination with effect Jxx should
operate as expected now.
- Deleting a file on the instrument list will update the instrument cache
file appropriately.
- Sample/Instrument cache file time check fixed.
- Slight modification to the handling of SBx commands to prevent
infinite loops.
- Simple crash recovery mechanism should you ever encounter a problem.
(You shouldn't need it!) This is on Ctrl-Alt-Del in DOS or
Ctrl-Alt-Ins in Windows. It is not guaranteed to work, but if it works
once, then I guess that the amount of time I spent on it was worth it
(~10 minutes).
For the technically minded lot, what it does is it tries to 'kick start'
the tracker again directly from the keyboard interrupt handler.
- Loading a stereo WAV file will cause a pop-up menu to appear to select
loading the left or right channels.
- GUSMAX users interested in using software mixing, check out DRIVERS.TXT
- Memory corruption error found and fixed which produced 3-sets of invalid
values in the order list/instruments (main reason for this release!)
IT209 Update
************************* FONT FILES REQUIRE UPDATING *********************
If you have your own custom font file, you will need to change character
number 184 to 190. If you have used one of the 'standard' font sets, you
will need to run ITF and grab an updated file. Failure to do so will just
make the sample page look stuffed - You have been warned :)
***************************************************************************
Many Many MANY miscellaneous fixes to the XM loader and playback routines
-> XM support should be *MUCH* better now.
Volume effects have been debugged... hopefully :)
Some major errors fixed around (ie. dumping to DOS from the Instrument
screen, Pattern's not updating in memory correctly (which went wrong in
IT208) )
Added default sample pan to the sample list (default instrument pan WILL
override this if present). Note that using default pan is the equivalent
of using a 'set pan' effect on that row - the channel will be set to the
default sample pan.
You can change whether the info page displays sample names or instrument
names by pressing 'i'
IT208 Update
So much so quickly? Well, I had exams. And when I have exams, I code, 'cos
it's better than having to study :)
************************* FONT FILES REQUIRE UPDATING *********************
If you have your own custom font file, you will need to change character
number 184 to. If you have used one of the 'standard' font sets, you will
need to run ITF and grab an updated file. Failure to do so will just make
the info page and 10-channel editor look stuffed - You have been warned :)
***************************************************************************
- Bug fix: Keyboard configuration files could have cause MAJOR problems...
fixed!
- Bug fix: Some files with the .MOD ID "CH" which actually were NOT MODs
were being identified as "Fast Tracker 2" modules.
(You may have to delete your CACHE.ITS files to force IT to
refresh it's data)
- Bug fixes: MIDI input won't corrupt input on the order list
MIDI input won't interfere with button presses
MIDI input won't insert effect SDF into patterns when recording
where inappropriate.
- Old Left Ctrl+Shift-1 'removed', Left-Ctrl+Shift 1->4 still work - and
have been updated.
PROPER 10-channel editing mode available (complete with half sized cursors!)
as well as some minor logic improvements. (Try Left-Ctrl+Shift 2)
- ";" and "'" made to change the samples/instrument in the pattern editor
as '<' and '>' do - just much easier to do so on American keyboards.
- Dragging mouse nodes past boundaries is more accurate.
- "Channel details" display (on the infopage) *can* show the 64th channel
(oops in IT207)
- Matrox bug autodetection (Many thanks to Csaba Pankaczy for working with
me on this!)
- Message system hooked to a timer (ie. all those messages that appear
towards the top of the screen).. so that they will last a consistent
amount of time (independent of machine).
- Player Improvement: NNA mechanism will eliminate channels on two extra
conditions now (no difference to playback, but should
maximise channel usage)
- Improvement: Persistence of cache files through different sessions of IT
- ie. once the sample/instrument cache files are created, they
are NOT recreated unless necessary.
- Root "\" directory has replaced "." directory on all loading screens.
- Several Template input related functions improved. Also, Block-Cut in
template mode won't overwrite your clipboard if you're working with
templates.
- Template: "Notes only" added. This is different from the other templates
in that it will NOT copy the template's instruments, volumes or effects.
Instead, it will change it's instrument/volume/effect according to the
last used instrument/volume/effect, and will insert whatever is speicfied
by the edit mask.
- Addition: Volume Column effects, Ax, Bx, Cx, Dx, Ex, Fx, Gx and Hx!!!!
Ax = Fine volume slide up by x
Bx = Fine volume slide down by x
Cx = Volume slide up by x
Dx = Volume slide down by x
Ex = Pitch slide down by x
Fx = Pitch slide up by x
Gx = Portamento to note with speed x
Hx = Vibrato with depth x
Note that the pitch/portamento scale here is DIFFERENT from the standard
effect slideup/down
* Note that if you use these in your songs, IT < 2.08 will NOT play them
* correctly... (in fact, it'll probably play it extremely painfully)
- Alt Up/Down/Ins/Del added to the note translation table.
- Minor modifications around the tracker
- Windows Sound System Driver! (Operates at mixing rates up to 64kHz!)
Impulse Tracker has the greatest soundcard support of any tracker by far!
- Old Effects will 'unlink' the memory of Gxx from Exx/Fxx
- XM LOADING!!!!!!!!!!
Don't write to me complaining about incompatibilities - I am aware of
lots of them and you probably won't get a reply. :) *MOST* songs should
have a near perfect conversion tho...
- Big safety feature!! Playback dying because of overload? Bad NNA selection?
F8 *should* stop playback immediately now! (in DOS).
In Windows '95, there may be a noticeable stall before playback stops
(ie. several seconds), or it may not function at all...
IT207 update
- Some bug fixes to MIDI input.
- Ctrl-PgUp/PgDn on the sample list will redraw the waveforms
- Jxx memory should work fine (The memory didn't operate if the channel
wasn't active before)
- Template limits should be correctly applied. (ie. clipped within
C-0 and B-9)
- Going to a pattern from the Info Page ('G') will also go to the
current order playing.
- MIDI input can be enabled/disabled in the pattern editor with
Alt-Scroll Lock
- MOD in-module sample library loop points fixed.
- Envelope drawing algorithm slightly more tolerant of corrupt information
- Mouse envelope routines slightly improved for more accurate handling of
nodes.
- Added Message editor to main menu.
- Added 10 channel view to the info page (you may need to reset your info-
page settings and "save your preferences")
- Squished up the info page view to get a couple of extra lines! :)
- Ctrl-F7 on the order list will set the next pattern to play (at request
of ChuckB) - for DJ use
- Due to Win95's unstable disk-EMS routines, if you load a MMTSRed sample,
instrument or module (sample library), playback *will* stop to prevent
corruption of samples currently in memory.
- Notes in templates of height 1 will be played back in the pattern editor
(very useful for "multi sample" note entry)
- Added effects T0x and T1x for Tempo slide down and tempo slide up.
- Added .IT and .XM *INSTRUMENT* library support. Note that .ITs that
aren't in instrument mode or have no instruments will NOT be shown on
the instrument loader list.
- Added Alt-Ins and Alt-Del on the sample and instrument lists to add
in samples/instruments
**** NOTE: /Sx command line parameters have been changed around just for
neatness. CHECK SUMMARY.TXT FOR NEW /Sx VALUES OR RUN "IT /?" ***
IT 2.06
- Update: Yet another update to the EMS routines.. for those of you who
couldn't be bothered to read the FAQ.
Also new command line switch:
/Px - Set pattern memory allocation strategy.
Check SUMMARY.TXT for info on this.
- Minor update: The 10-stage undo buffer will now use EMS memory under most
circumstances.
- Minor update: S3M and IT loader routines slightly modified for more
efficient memory usage.
- Minor update: "Song modified" flag logic slightly modified.
- Minor update: .WAV loader slightly improved. (should read any 8 or 16-bit
format.)
- Minor Addition: IT will now release time slices to multitasking OS/s
if you specify /T2 on the command line.
If you are using the MIDI input capabilities of IT, you
SHOULD NOT enable this (timing gets effected badly)
- Minor Addition: Set pattern length command on Ctrl-F2 (can set multiple
patterns)
- Minor Addition: Command line switch /T1 to disable "usage time" indication
- Addition: TX Wave loader for .W?? samples (eg. from Kosmic's sample dirs)
Note: These are actually 12-bit samples, which are converted to
16-bit at load time.
- Addition: .MOD sample library loader.
This "only" recognises the following MOD Identifications -
"M.K.", "M!K!", "FLT4", "FLT8", "4CHN", "6CHN", "8CHN"
And FT2's extended MOD identification, "xxCH"
If you have an "Old Amiga-MOD format" MOD (which doesn't have an
ID), then you'll have to save it as another format if you want
to rip directly from it.
So sample library support in total:
.MOD, .669, .FAR, .MTM, .S3M, .PTM, .XM, .IT
- Addition: Intelligent MIDI Input for SB16 and Interwave cards!
MIDI options screen is on Shift-F1 (those of you who have IT.CFG
from older versions of IT *WILL* need to visit this screen at
least once if you want to use MIDI - "Save All Preferences" will
save these settings)
In the pattern editor, Ctrl-Z is "Change MIDI playback trigger."
Normally, it is quite difficult to start at a row/pattern with
MIDI - this options allow you to control whether a pattern or
song should START playing when you play the first note.
(IT will play either from the start of the current pattern or
the song starting from the current row depending on your choice)
Once this is done, the trigger is immediately unset, so you will
have to setup this trigger again if you want to use it.
Note that this *will* turn on pattern tracing. To disable it,
use Scroll-Lock.
****** NOTE ******
SB16's MIDI input is somewhat 'iffy'. If you stop receiving
MIDI input, you need to reinit the soundcard (Ctrl-I) (possibly
several times). I don't know why it does this. Dont' write
to me about it, 'cos I have spent MANY MANY hours on this little
problem and I don't want to know about it. Also, in Win95, I
found it necessary to change my SB16's configuration to EXCLUDE
the MIDI port (and I used a Microsoft MPU401 driver instead),
otherwise MIDI input was ignored.
Sorry, no GUS MIDI at the moment, as I couldn't get it working.
Please do NOT write to me about this, you will not get a reply.
An updated GUS driver will be released if/when I get it working.

44
it/SWITCH.INC Normal file
View File

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

2116
it/SoundDrivers/AD1816.ASM Executable file

File diff suppressed because it is too large Load Diff

56
it/SoundDrivers/AMD3DI.MIX Executable file
View File

@ -0,0 +1,56 @@
; 8-bit interpolated mixing routine, 4 samples at a time. Rearranged
; MM7 contains volume as packed floating point
; MM6 contains offset as packed integer offset
; MM5 = DeltaOffset
; MM7 = RVol|LVol
; MM6 = (1-Offset2)|Offset2|(1-Offset1)|Offset1
MovD MM0, [SampleBlock1] ; MM0 = x|x|x|x|S2H|S2L|S1H|S1L
MovQ MM2, MM6
PSRAW MM2, 1
PUnpckLBW MM0, MM0 ; MM0 = S2H|S2L|S1H|S1L
PAddW MM6, MM5
PMAddWD MM0, MM2 ; MM0 = IS2|IS1
MovD MM1, [SampleBlock2] ; MM1 = x|x|x|x|S4H|S4L|S3H|S3L
MovQ MM2, MM6
PUnpckLBW MM1, MM1 ; MM1 = S4H|S4L|S3H|S3L
PSRAW MM2, 1
PI2FD MM0, MM0 ; MM0 = FIS2|FIS1
PMAddWD MM1, MM2 ; MM1 = IS4|IS3
MovQ MM2, MM0
PUnpckLDQ MM0, MM0 ; MM0 = FIS1|FIS1
PUnpckHDQ MM2, MM2 ; MM2 = FIS2|FIS2
PI2FD MM1, MM1 ; MM1 = FIS4|FIS3
PFMul MM0, MM7 ; MM0 = R1|L1
PAddW MM6, MM5
PFMul MM2, MM7 ; MM2 = R2|L2
MovQ MM3, MM1
PFAdd MM0, [Buffer1]
PUnpckLDQ MM1, MM1 ; MM1 = FIS3|FIS3
PFAdd MM2, [Buffer2]
PUnpckHDQ MM3, MM3 ; MM3 = FIS4|FIS4
PFMul MM1, MM7
MovQ [Buffer1], MM0
PFMul MM3, MM7
PFAdd MM1, [Buffer3]
MovQ [Buffer2], MM2
PFAdd MM3, [Buffer4]
MovQ [Buffer3], MM1
MovQ [Buffer4], MM3

304
it/SoundDrivers/AMD3DNI.MIX Executable file
View File

@ -0,0 +1,304 @@
; 8-bit non interpolated mixing routine, 8 samples at a time. Not rearranged
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovD MM0, [SampleBlock1] ; Low 4 bytes contain samples 1-4
MovD MM1, [SampleBlock2] ; Low 4 bytes contain samples 5-8
PUnpckLBW MM0, MM0 ; MM0 = S4|S3|S2|S1
PUnpckLBW MM1, MM1 ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
MovQ MM3, MM1
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PI2FD MM2, MM2 ; MM2 = FS4|FS3
PI2FD MM3, MM3 ; MM3 = FS8|FS7
MovQ MM4, MM0
MovQ MM5, MM2
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM0, MM7 ; MM0 = R1|L1
PFMul MM4, MM7 ; MM4 = R2|L2
PFMul MM2, MM7 ; MM2 = R3|L3
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM0, [Buffer1]
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
PFAdd MM5, [Buffer4]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
MovQ [Buffer3], MM2
MovQ [Buffer4], MM5
MovQ MM0, MM1
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFMul MM0, MM7
PFMul MM1, MM7
PFMul MM2, MM7
PFMul MM3, MM7
PFAdd MM0, [Buffer5]
PFAdd MM1, [Buffer6]
PFAdd MM2, [Buffer7]
PFAdd MM3, [Buffer8]
MovQ [Buffer5], MM0
MovQ [Buffer6], MM1
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3
;-----------------------------------------------------------------------------
; Rearranged to improve pairing
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovD MM0, [SampleBlock1] ; Low 4 bytes contain samples 1-4
MovD MM1, [SampleBlock2] ; Low 4 bytes contain samples 5-8
PUnpckLBW MM0, MM0 ; MM0 = S4|S3|S2|S1
PUnpckLBW MM1, MM1 ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
MovQ MM3, MM1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
PI2FD MM1, MM1 ; MM1 = FS6|FS5
MovQ MM4, MM0
PI2FD MM2, MM2 ; MM2 = FS4|FS3
MovQ MM5, MM2
PI2FD MM3, MM3 ; MM3 = FS8|FS7
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PFMul MM0, MM7 ; MM0 = R1|L1
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PFMul MM4, MM7 ; MM4 = R2|L2
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM2, MM7 ; MM2 = R3|L3
PFAdd MM0, [Buffer1]
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
PFAdd MM5, [Buffer4]
MovQ [Buffer3], MM2
MovQ MM0, MM1
MovQ [Buffer4], MM5
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PFMul MM0, MM7
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PFMul MM1, MM7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFAdd MM0, [Buffer5]
PFMul MM2, MM7
PFAdd MM1, [Buffer6]
PFMul MM3, MM7
MovQ [Buffer5], MM0
PFAdd MM2, [Buffer7]
MovQ [Buffer6], MM1
PFAdd MM3, [Buffer8]
MovQ [Buffer7], MM2 ; These will be rearranged to match
MovQ [Buffer8], MM3 ; the next iteration.
; 16-bit non interpolated mixing routine, 8 samples at a time. Not rearranged
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovQ MM0, [SampleBlock1] ; MM0 = S4|S3|S2|S1
MovQ MM1, [SampleBlock2] ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
MovQ MM3, MM1
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PI2FD MM2, MM2 ; MM2 = FS4|FS3
PI2FD MM3, MM3 ; MM3 = FS8|FS7
MovQ MM4, MM0
MovQ MM5, MM2
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM0, MM7 ; MM0 = R1|L1
PFMul MM4, MM7 ; MM4 = R2|L2
PFMul MM2, MM7 ; MM2 = R3|L3
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM0, [Buffer1]
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
PFAdd MM5, [Buffer4]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
MovQ [Buffer3], MM2
MovQ [Buffer4], MM5
MovQ MM0, MM1
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFMul MM0, MM7
PFMul MM1, MM7
PFMul MM2, MM7
PFMul MM3, MM7
PFAdd MM0, [Buffer5]
PFAdd MM1, [Buffer6]
PFAdd MM2, [Buffer7]
PFAdd MM3, [Buffer8]
MovQ [Buffer5], MM0
MovQ [Buffer6], MM1
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3
;-----------------------------------------------------------------------------
; Rearranged to improve pairing
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovQ MM0, [SampleBlock1] ; MM0 = S4|S3|S2|S1
MovQ MM1, [SampleBlock2] ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
MovQ MM3, MM1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
MovQ MM4, MM0
PI2FD MM2, MM2 ; MM2 = FS4|FS3
MovQ MM5, MM2
PI2FD MM3, MM3 ; MM3 = FS8|FS7
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PFMul MM0, MM7 ; MM0 = R1|L1
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PFMul MM4, MM7 ; MM4 = R2|L2
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFAdd MM0, [Buffer1]
PFMul MM2, MM7 ; MM2 = R3|L3
PFAdd MM4, [Buffer2]
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM2, [Buffer3]
MovQ [Buffer1], MM0
PFAdd MM5, [Buffer4]
MovQ [Buffer2], MM4
MovQ MM0, MM1
MovQ [Buffer3], MM2
MovQ MM2, MM3
MovQ [Buffer4], MM5
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PFMul MM0, MM7
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PFMul MM1, MM7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFAdd MM0, [Buffer5]
PFMul MM2, MM7
PFAdd MM1, [Buffer6]
PFMul MM3, MM7
MovQ [Buffer5], MM0
PFAdd MM2, [Buffer7]
MovQ [Buffer6], MM1
PFAdd MM3, [Buffer8]
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3

4310
it/SoundDrivers/AWE32B.ASM Executable file

File diff suppressed because it is too large Load Diff

3961
it/SoundDrivers/AWE32DRV.ASM Executable file

File diff suppressed because it is too large Load Diff

2070
it/SoundDrivers/BASE1.ASM Executable file

File diff suppressed because it is too large Load Diff

101
it/SoundDrivers/DEBUG.INC Executable file
View File

@ -0,0 +1,101 @@
;
; 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
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
Mov CX, 82
Mov DX, SI
Int 21h
Mov AH, 3Eh
Int 21h
WriteDebugFileEnd:
Pop DS
PopA
Ret
EndP WriteDebugFile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
Local X, Y
PushF
Push SI
Jmp Y
X:
DB LogMessage
DB 80-($-Offset X) Dup (0)
DB 0Dh, 0Ah
Y:
Mov SI, Offset X
Call WriteDebugFile
Pop SI
PopF
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ELSE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ENDIF

113
it/SoundDrivers/DMA.INC Executable file
View File

@ -0,0 +1,113 @@
DMAData Label Byte
; Port/Mask, Port/Clear, Port/DMAMode, Address, Page, Count, Port/Mask
DB 0Ah, 4, 0Ch, 0, 0Bh, 58h, 87h, 0, 1, 0Ah, 0
DB 0Ah, 5, 0Ch, 0, 0Bh, 59h, 83h, 2, 3, 0Ah, 1
DB 0Ah, 6, 0Ch, 0, 0Bh, 5Ah, 81h, 4, 5, 0Ah, 2
DB 0Ah, 7, 0Ch, 0, 0Bh, 5Bh, 82h, 6, 7, 0Ah, 3
DB 0D4h, 4, 0D8h, 0, 0D6h, 58h, 8Fh, 0C0h, 0C2h, 0D4h, 0
DB 0D4h, 5, 0D8h, 0, 0D6h, 59h, 8Bh, 0C4h, 0C6h, 0D4h, 1
DB 0D4h, 6, 0D8h, 0, 0D6h, 5Ah, 89h, 0C8h, 0CAh, 0D4h, 2
DB 0D4h, 7, 0D8h, 0, 0D6h, 5Bh, 8Ah, 0CCh, 0CEh, 0D4h, 3
ActualDMAPtr Label DWord
ActualDMAOffset DW 0
ActualDMASegment DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetDMA ; BX:AX points to DMA buffer
; DL = DMA Channel
; DI = DMA Size
PushA
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov ActualDMASegment, BX
Mov ActualDMAOffset, AX
Mov CH, BH
ShR CH, 4
ShL BX, 4
Add BX, AX
AdC CH, 0
Mov SI, BX ; CH:BH:BL contains 24 bit DMA address
Neg SI
Cmp SI, DI
JA SetDMA1
Add ActualDMAOffset, SI
Add BX, SI
AdC CH, 0
SetDMA1:
Cmp DL, 3
JBE SetDMA2
ShR DI, 1
Push CX
ShR CH, 1
Pop CX
RCR BX, 1
SetDMA2:
Mov AL, 11
Mul DL
Mov SI, AX
Add SI, Offset DMAData
Xor DX, DX
LodsB ; Set mask
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Clear Ptrs
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Set Mode
Mov DL, AL
LodsB
Out DX, AL
LodsB
Mov DL, AL ; DL = page port
Mov AL, CH
Out DX, AL
LodsB
Mov DL, AL ; DL = address port
Mov AL, BL
Out DX, AL
Mov AL, BH
Out DX, AL
LodsB
Mov DL, AL ; DL = count port
Mov AX, DI
Dec AX
Out DX, AL
Mov AL, AH
Out DX, AL
LodsB ; Reset mask
Mov DL, AL
LodsB
Out DX, AL
Pop DS
PopA
Ret
EndP SetDMA
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Some files were not shown because too many files have changed in this diff Show More