Initial commit. Import of documentation, keyboard, network and VSound code.

Other code still needs cleaning up a bit before importing
This commit is contained in:
Jeffrey Lim @ Vision 2014-03-23 13:30:03 +08:00
commit d9384e6207
56 changed files with 26693 additions and 0 deletions

279
InternalDocumentation/CHANNEL.TXT Executable file
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

143
InternalDocumentation/MMTECH.TXT Executable file
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...

126
InternalDocumentation/NETWORK.TXT Executable file
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.

233
InternalDocumentation/OBJECT.TXT Executable file
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
Keyboard/BE.ASM Executable 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
Keyboard/CA.ASM Executable 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
Keyboard/CH.ASM Executable 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
Keyboard/DE.ASM Executable 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
Keyboard/DK.ASM Executable 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
Keyboard/ES.ASM Executable 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
Keyboard/FI.ASM Executable 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
Keyboard/FR.ASM Executable 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
Keyboard/IT.ASM Executable 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
Keyboard/KEYBOARD.TXT Executable 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
Keyboard/NO.ASM Executable 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
Keyboard/PO.ASM Executable 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
Keyboard/SE.ASM Executable 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
Keyboard/UK.ASM Executable 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
Keyboard/US.ASM Executable 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

130
Network/DEBUG.INC Executable 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
Network/DRHEAD.INC Executable 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
Network/EXECOM.COM Executable file

Binary file not shown.

3583
Network/IPX.ASM Executable file

File diff suppressed because it is too large Load Diff

5
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
Network/NETDRIVE.ASM Executable 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
Network/REQPROC.INC Executable 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
Network/USERNAME.INC Executable 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
Network/VTABLE.INC Executable file
View File

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

14
README.md Normal file
View File

@ -0,0 +1,14 @@
# 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`

39
ReleaseDocumentation/BUGS.TXT Executable file
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...

595
ReleaseDocumentation/CONTRIB.TXT Executable file
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? :)

577
ReleaseDocumentation/DRIVERS.TXT Executable file
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.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

33
ReleaseDocumentation/FILES.TXT Executable file
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 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

143
ReleaseDocumentation/FILTERS.TXT Executable file
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

572
ReleaseDocumentation/HINTS.TXT Executable file
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

261
ReleaseDocumentation/IMPULSE.FAQ Executable file
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.

2199
ReleaseDocumentation/IT.TXT Executable file

File diff suppressed because it is too large Load Diff

BIN
ReleaseDocumentation/IT256.ICO Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

901
ReleaseDocumentation/ITTECH.TXT Executable file
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

400
ReleaseDocumentation/MIDI.TXT Executable file
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.

72
ReleaseDocumentation/README.TXT Executable file
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

296
ReleaseDocumentation/SUMMARY.TXT Executable file
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

592
ReleaseDocumentation/UPDATE.TXT Executable file
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.

BIN
Tutorial/IT_TUTORIAL.EXE Executable file

Binary file not shown.

BIN
Tutorial/TUTE.IT Executable file

Binary file not shown.

511
VSound/Server/SERVER.C Executable file
View File

@ -0,0 +1,511 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <dsound.h>
#include <process.h>
/*
Registry keys:
BufferSize : in kb. maximum of 64
BufferThreshold : in kb. maximum of 32
BufferType : 0->2 for DualBuffer,QuadBuffer,OctBuffer
MixSpeed : in Hz, maximum of 48000.
*/
// Registry values.
static int BufferSize = 24;
static int BufferThreshold = 21;
static int BufferType = 2;
static int MixSpeed = 44100;
// Registry Key stuff.
const char *RegistryKey = "Software\\Jeffrey Lim\\Impulse Tracker VSound Server";
const char *RegistryKeyBufferSize = "BufferSize";
const char *RegistryKeyBufferThreshold = "BufferThreshold";
const char *RegistryKeyBufferType = "BufferType";
const char *RegistryKeyMixSpeed = "MixSpeed";
// Other stuff.
const static LPCTSTR lpszAppName = "VSound Server";
const static LPCTSTR lpszTitleBar = "Impulse Tracker VSound Server";
static HRESULT hr;
static void *BufferUpdateThreadHandle;
static int BufferUpdateThreadID;
static int Quitting = 0;
static HANDLE NotifyEventHandle;
static LPDIRECTSOUND lpDS;
static LPDIRECTSOUNDBUFFER lpPDSB, lpSDSB;
static PCMWAVEFORMAT pcmwf =
{
{
WAVE_FORMAT_PCM,
2,
44100,
4*44100,
4
},
16
};
HINSTANCE g_hInst;
HWND g_hWnd;
char TextBuffer[80];
static short int ServerPort = 0x401;
static short int DataPort = 0x402;
static int SoundBufferSize;
static int SoundBufferBlockSize;
static int SoundBufferBlockMask;
char *BufferTypes[] =
{
"DualBuffer",
"QuadBuffer",
"OctBuffer"
};
const char *ServerID = "ITSERVER";
const char *NoServer =
"Unable to find VSound.VxD\n" \
"\n" \
"Please read the documentation on how to setup VSound.VxD";
const char *ServerActive =
"VSound server is active.\n" \
"\n"
"Please shut down Impulse Tracker first";
void __cdecl trace(char *Message, ...)
{
va_list argptr;
va_start(argptr, Message);
vsprintf(TextBuffer, Message, argptr);
PostMessage(g_hWnd, WM_PAINT, 0, 0);
}
static void VSound_Reset()
{
_outp(ServerPort, 0);
}
static void VSound_Identify()
{
int i, j;
char ServerString[60];
short int TempValues[2];
char *BufferInfo = (char*) (&TempValues);
sprintf(ServerString, "DirectSound VSoundServer 1.0, %dkb %s", BufferSize, BufferTypes[BufferType]);
j = strlen(ServerString);
for(i = 0; i < 8; i++) _outp(ServerPort, ServerID[i]);
for(i = 0; i < j; i++) _outp(ServerPort, ServerString[i]);
for( ; i < 60; i++) _outp(ServerPort, ' ');
TempValues[0] = BufferThreshold * 1024;
TempValues[1] = MixSpeed;
for(i = 0; i < 4; i++) _outp(ServerPort, BufferInfo[i] ^ 0xFF);
}
static int VSound_Detect()
{
int i;
char Buffer[8];
for(i = 0; i < 8; i++) Buffer[i] = _inp(ServerPort);
return memcmp(ServerID, Buffer, sizeof(Buffer)) == 0;
}
static int VSound_Connected()
{
if(!Quitting) return _inp(ServerPort);
else return 0;
}
static void Error(char *Message)
{
VSound_Reset();
MessageBox(g_hWnd, Message, "VSound Server Error!", MB_OK);
exit(1);
}
static void CheckHResult(char *Message)
{
if(hr) Error(Message);
}
DWORD WINAPI BufferUpdateThread(void *Parameter)
{
int UpdatePosition = 0;
int PlayPosition;
int Len1, Len2;
void *Buf1, *Buf2;
int LastBlock;
int Active = 0;
/*
hr = SetThreadPriority(BufferUpdateThreadHandle, THREAD_PRIORITY_TIME_CRITICAL);
if(!hr)
{
trace("Error code: %d", GetLastError());
Error("SetThreadPriority failed");
return;
}
hr = SetPriorityClass((HANDLE) BufferUpdateThreadID, REALTIME_PRIORITY_CLASS);
if(!hr) {
trace("Error code: %d", GetLastError());
Error("SetPriorityClass failed");
return;
}
*/
while(1)
{
int CurrentBlock;
int NumberOfBlocks;
WaitForMultipleObjects(1, // count of object handle array
&NotifyEventHandle, // Handle of event created to signal buffer position updates
FALSE, // return if at least one event is signalled
INFINITE);
hr = lpSDSB->lpVtbl->GetCurrentPosition(lpSDSB, &PlayPosition, NULL);
CheckHResult("GetCurrentPosition failed");
CurrentBlock = PlayPosition / SoundBufferBlockSize;
NumberOfBlocks = (CurrentBlock - LastBlock) & SoundBufferBlockMask;
if(NumberOfBlocks == 0) continue;
hr = lpSDSB->lpVtbl->Lock(lpSDSB, UpdatePosition, NumberOfBlocks*SoundBufferBlockSize, &Buf1, &Len1, &Buf2, &Len2, 0);
CheckHResult("Lock failed");
if(VSound_Connected() != Active)
{
Active = ~Active;
if(Active)
trace("Server active");
else
trace("Server ready");
}
// Update buffer here.
__asm
{
Push EDI
Mov DX, [DataPort]
Mov EDI, [Buf1]
Mov ECX, [Len1]
Rep InsB
Mov EDI, [Buf2]
Mov ECX, [Len2]
Rep InsB
Pop EDI
}
hr = lpSDSB->lpVtbl->Unlock(lpSDSB, Buf1, Len1, Buf2, Len2);
CheckHResult("Unlock failed");
LastBlock = CurrentBlock;
UpdatePosition = LastBlock*SoundBufferBlockSize;
}
return 0;
}
void VSound_InitDSound()
{
int i, NumberOfNotifications;
DSBUFFERDESC DSBDesc;
DSBPOSITIONNOTIFY DSBPositionNotify[8];
LPDIRECTSOUNDNOTIFY lpDSNotify;
int Len1, Len2;
char *Buf1, *Buf2;
NumberOfNotifications = 2 << BufferType;
SoundBufferSize = BufferSize*1024;
SoundBufferBlockSize = SoundBufferSize / NumberOfNotifications;
SoundBufferBlockMask = NumberOfNotifications - 1;
trace("CreateEvemt");
NotifyEventHandle = CreateEvent(NULL, // Security attributes
FALSE, // Manual reset = FALSE
FALSE, // Signal initial state = FALSE
NULL); // Name
if(!NotifyEventHandle) Error("CreateEvent failed");
trace("DirectSoundCreate");
hr = DirectSoundCreate(NULL, &lpDS, NULL);
CheckHResult("DirectSoundCreate failed");
trace("SetCooperativeLevel");
hr = lpDS->lpVtbl->SetCooperativeLevel(lpDS, GetActiveWindow(), DSSCL_PRIORITY);
CheckHResult("SetCooperativeLevel failed");
trace("CreateSoundBuffer (Primary)");
memset(&DSBDesc, 0, sizeof(DSBUFFERDESC)); // Zero it out.
DSBDesc.dwSize = sizeof(DSBUFFERDESC);
DSBDesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
DSBDesc.dwBufferBytes = 0;
DSBDesc.lpwfxFormat = NULL;
hr = lpDS->lpVtbl->CreateSoundBuffer(lpDS, &DSBDesc, &lpPDSB, NULL);
CheckHResult("CreateSoundBuffer (Primary) failed");
trace("SetFormat");
pcmwf.wf.nSamplesPerSec = MixSpeed;
pcmwf.wf.nAvgBytesPerSec = MixSpeed * 4;
hr = lpPDSB->lpVtbl->SetFormat(lpPDSB, (void*) &pcmwf);
CheckHResult("SetFormat failed");
memset(&DSBDesc, 0, sizeof(DSBUFFERDESC)); // Zero it out.
DSBDesc.dwSize = sizeof(DSBUFFERDESC);
DSBDesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY |
DSBCAPS_GETCURRENTPOSITION2 |
DSBCAPS_STICKYFOCUS |
DSBCAPS_LOCSOFTWARE;
DSBDesc.dwBufferBytes = SoundBufferSize;
DSBDesc.lpwfxFormat = (void*) &pcmwf;
trace("CreateSoundBuffer (Secondary)");
hr = lpDS->lpVtbl->CreateSoundBuffer(lpDS, &DSBDesc, &lpSDSB, NULL);
CheckHResult("CreateSoundBuffer (Secondary) failed");
trace("QueryInterface");
hr = lpSDSB->lpVtbl->QueryInterface(lpSDSB, &IID_IDirectSoundNotify, &lpDSNotify);
CheckHResult("Error obtaining DirectSoundNotify interface");
trace("SetNotificationPositions");
for(i = 0; i < NumberOfNotifications; i++)
{
DSBPositionNotify[i].dwOffset = i*SoundBufferBlockSize;
DSBPositionNotify[i].hEventNotify = NotifyEventHandle;
}
hr = lpDSNotify->lpVtbl->SetNotificationPositions(lpDSNotify, NumberOfNotifications, DSBPositionNotify);
CheckHResult("SetNotificationPositions failed");
trace("Lock (Clear)");
hr = lpSDSB->lpVtbl->Lock(lpSDSB, 0, 0, &Buf1, &Len1, &Buf2, &Len2, DSBLOCK_ENTIREBUFFER);
CheckHResult("Lock failed");
trace("Clearing buffer");
memset(Buf1, 0, Len1);
trace("Unlock (Clear)");
hr = lpSDSB->lpVtbl->Unlock(lpSDSB, Buf1, Len1, Buf2, Len2);
CheckHResult("Unlocked failed");
trace("Creating sound thread");
BufferUpdateThreadHandle = CreateThread(NULL, // Security atributes
0, // Stack size
BufferUpdateThread, // Pointer to thread starting function
0, // Parameter to new thread
0, // Creation flags
&BufferUpdateThreadID);
hr = SetThreadPriority(BufferUpdateThreadHandle, THREAD_PRIORITY_TIME_CRITICAL);
if(!hr) Error("SetThreadPriority failed");
// Set process to realtime priority.
/*
hr = SetPriorityClass((DWORD) _getpid(), REALTIME_PRIORITY_CLASS);
if(!hr) Error("SetPriorityClass failed");
*/
trace("Play");
hr = lpSDSB->lpVtbl->Play(lpSDSB, 0, 0, DSBPLAY_LOOPING);
CheckHResult("Play failed");
VSound_Identify();
trace("Server ready");
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT Paint;
RECT Rectangle;
GetClientRect(hWnd, &Rectangle);
InvalidateRect(hWnd, &Rectangle, TRUE);
hDC = BeginPaint(hWnd, &Paint);
SetBkMode(hDC, TRANSPARENT);
Rectangle.left += 5;
Rectangle.right -= 5;
DrawText(hDC, TextBuffer, strlen(TextBuffer), &Rectangle, DT_VCENTER | DT_SINGLELINE | DT_LEFT);
EndPaint(hWnd, &Paint);
return 0;
}
break;
case WM_DESTROY:
case WM_CLOSE:
if(VSound_Connected())
{
MessageBox(hWnd, ServerActive, "Error!", MB_OK);
return 0;
}
VSound_Reset();
Quitting = 1;
PostQuitMessage(0);
}
return DefWindowProc(hWnd, Message, wParam, lParam);
}
int GetRegistryInteger(const char *KeyName, int Default)
{
HKEY hkey;
int ReturnValue;
int Size = 4;
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
RegistryKey,
0,
(LPTSTR) lpszAppName,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
NULL
) == ERROR_SUCCESS)
{
if((hr = RegQueryValueEx(hkey, KeyName, 0, 0, (LPBYTE) &ReturnValue, &Size)) == ERROR_SUCCESS)
{
RegCloseKey(hkey);
return ReturnValue;
}
RegSetValueEx(hkey, KeyName, 0, REG_DWORD, (LPBYTE) &Default, sizeof(Default));
RegCloseKey(hkey);
return Default;
}
Error("Unable to access Windows registry");
}
void SetRegistryInteger(const char *KeyName, int Value)
{
HKEY hkey;
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
RegistryKey,
0,
(LPTSTR) lpszAppName,
0,
KEY_ALL_ACCESS,
NULL,
&hkey,
NULL
) == ERROR_SUCCESS)
{
RegSetValueEx(hkey, KeyName, 0, REG_DWORD, (LPBYTE) &Value, sizeof(Value));
RegCloseKey(hkey);
}
}
void GetRegistry()
{
BufferSize = GetRegistryInteger(RegistryKeyBufferSize, 24);
if(BufferSize < 4 || BufferSize > 64)
{
BufferSize = 24;
SetRegistryInteger(RegistryKeyBufferSize, BufferSize);
}
BufferThreshold = GetRegistryInteger(RegistryKeyBufferThreshold, 21);
if(BufferThreshold < 2 || BufferThreshold > 32)
{
BufferThreshold = BufferSize >> 1;
SetRegistryInteger(RegistryKeyBufferThreshold, BufferThreshold);
}
BufferType = GetRegistryInteger(RegistryKeyBufferType, 2);
if(BufferType < 0 || BufferType > 2)
{
BufferType = 2;
SetRegistryInteger(RegistryKeyBufferType, BufferType);
}
MixSpeed = GetRegistryInteger(RegistryKeyMixSpeed, 44100);
if(MixSpeed < 11025) MixSpeed = 11025;
if(MixSpeed > 64000) MixSpeed = 64000;
SetRegistryInteger(RegistryKeyMixSpeed, MixSpeed);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASSEX wc;
g_hInst = hInstance;
// Window Class parameters.
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);;
wc.hbrBackground= (HBRUSH) (COLOR_WINDOW);
wc.lpszMenuName = lpszAppName;
wc.lpszClassName= lpszAppName;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hIconSm = NULL;
if(RegisterClassEx(&wc))
{
// Create window.
g_hWnd = CreateWindow(
lpszAppName,
lpszTitleBar,
WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
280,
50,
NULL,
NULL,
hInstance,
NULL
);
if(g_hWnd)
{
// Lets first see if the VSound server exists.
if(!VSound_Detect())
{
trace("Connect to VSound.VxD failed");
MessageBox(NULL, NoServer, "Error!", MB_OK);
exit(1);
}
GetRegistry();
VSound_InitDSound();
while( GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
}
return 1;
}

1156
VSound/VXD/DEBUG.INC Executable file

File diff suppressed because it is too large Load Diff

3
VSound/VXD/MVSOUND.BAT Executable file
View File

@ -0,0 +1,3 @@
ml -Fl -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 vsound.asm
link /VXD /NOD /OUT:VSOUND.VxD /MAP:VSOUND.MAP /DEF:VSOUND.DEF vsound
copy vsound.vxd \windows\system\itvsound.vxd

139
VSound/VXD/SHELL.INC Executable file
View File

@ -0,0 +1,139 @@
;****************************************************************************
; *
; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY *
; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *
; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR *
; PURPOSE. *
; *
; Copyright (C) 1993-95 Microsoft Corporation. All Rights Reserved. *
; *
;****************************************************************************
ifndef _SHELL_H
_SHELL_H EQU 1
ifndef Not_VxD
Begin_Service_Table SHELL
SHELL_Service SHELL_Get_Version, LOCAL
SHELL_Service SHELL_Resolve_Contention, LOCAL
SHELL_Service SHELL_Event, LOCAL
SHELL_Service SHELL_SYSMODAL_Message, LOCAL
SHELL_Service SHELL_Message, LOCAL
ifndef WIN30COMPAT
SHELL_Service SHELL_GetVMInfo, LOCAL
endif
ifndef WIN31COMPAT
SHELL_Service _SHELL_PostMessage, LOCAL
SHELL_Service _SHELL_ShellExecute
SHELL_Service _SHELL_PostShellMessage
SHELL_Service SHELL_DispatchRing0AppyEvents, LOCAL
SHELL_Service SHELL_Hook_Properties, LOCAL
SHELL_Service SHELL_Unhook_Properties, LOCAL
SHELL_Service SHELL_Update_User_Activity, LOCAL
SHELL_Service _SHELL_QueryAppyTimeAvailable, LOCAL
SHELL_Service _SHELL_CallAtAppyTime, LOCAL
SHELL_Service _SHELL_CancelAppyTimeEvent
SHELL_Service _SHELL_BroadcastSystemMessage, LOCAL
SHELL_Service _SHELL_HookSystemBroadcast, LOCAL
SHELL_Service _SHELL_UnhookSystemBroadcast, LOCAL
SHELL_Service _SHELL_LocalAllocEx, LOCAL
SHELL_Service _SHELL_LocalFree, LOCAL
SHELL_Service _SHELL_LoadLibrary, LOCAL
SHELL_Service _SHELL_FreeLibrary, LOCAL
SHELL_Service _SHELL_GetProcAddress, LOCAL
SHELL_Service _SHELL_CallDll, LOCAL
SHELL_Service _SHELL_SuggestSingleMSDOSMode
SHELL_Service SHELL_CheckHotkeyAllowed
SHELL_Service _SHELL_GetDOSAppInfo
endif
End_Service_Table SHELL
ifndef WIN31COMPAT
SBH_CALL_ORDER_DEFAULT EQU 0
SBH_CALL_ORDER_REGISTRY EQU 30000000H
SBH_CALL_ORDER_CONFIGMG EQU 40000000H
endif
MB_OK EQU 00H
MB_OKCANCEL EQU 01H
MB_ABORTRETRYIGNORE EQU 02H
MB_YESNOCANCEL EQU 03H
MB_YESNO EQU 04H
MB_RETRYCANCEL EQU 05H
MB_ICONHAND EQU 10H
MB_ICONEXCLAMATION EQU 30H
MB_ICONASTERISK EQU 40H
MB_DEFBUTTON1 EQU 00H
MB_DEFBUTTON2 EQU 100H
MB_DEFBUTTON3 EQU 200H
MB_APPLMODAL EQU 00H
MB_SYSTEMMODAL EQU 1000H
MB_NOFOCUS EQU 8000H
MB_ASAP EQU 80000000H
MB_NOWINDOW EQU 40000000H
MB_HANGSYS EQU 20000000H
ifndef WIN31COMPAT
MB_APPYTIME EQU 10000000H
endif
IDOK EQU 1
IDCANCEL EQU 2
IDABORT EQU 3
IDRETRY EQU 4
IDIGNORE EQU 5
IDYES EQU 6
IDNO EQU 7
SE_WP_PrtScBoost EQU 00100000H
SE_WP_PrtScBoostBit EQU 20
SE_WP_DispUpdBoost EQU 00200000H
SE_WP_DispUpdBoostBit EQU 21
ifndef WIN31COMPAT
SPM_UM_DoNotWaitForCrit EQU 00020000H
SPM_UM_DoNotWaitForCritBit EQU 17
SPM_UM_AlwaysSchedule EQU 00080000H
SPM_UM_AlwaysScheduleBit EQU 19
endif
SGVMI_Windowed EQU 00000004H
SGVMI_ALTTABdis EQU 00000020H
SGVMI_ALTESCdis EQU 00000040H
SGVMI_ALTSPACEdis EQU 00000080H
SGVMI_ALTENTERdis EQU 00000100H
SGVMI_ALTPRTSCdis EQU 00000200H
SGVMI_PRTSCdis EQU 00000400H
SGVMI_CTRLESCdis EQU 00000800H
SGVMI_HasHotKey EQU 00004000H
SGVMI_Polling EQU 00001000H
SGVMI_FastPaste EQU 00020000H
SGVMI_NoHMA EQU 00002000H
SGVMI_XMS_Lock EQU 00010000H
SGVMI_EMS_Lock EQU 00008000H
SGVMI_V86_Lock EQU 00040000H
SGVMI_ClsExit EQU 40000000H
endif
ifndef WIN31COMPAT
ifndef Not_VxD
LMEM_FIXED EQU 0000H
LMEM_ZEROINIT EQU 0040H
LPTR EQU (LMEM_FIXED OR LMEM_ZEROINIT)
LMEM_STRING EQU 00010000H
LMEM_OEM2ANSI EQU 00020000H
QAAFL_APPYAVAIL EQU 00000001H
QAAFL_APPYNOW EQU 00000002H
CAAFL_RING0 EQU 00000001H
CAAFL_TIMEOUT EQU 00000002H
endif
SHEXPACKET STRUC
shex_dwTotalSize DD ?
shex_dwSize DD ?
shex_ibOp DD ?
shex_ibFile DD ?
shex_ibParams DD ?
shex_ibDir DD ?
shex_dwReserved DD ?
shex_nCmdShow DD ?
SHEXPACKET ENDS
SGDAIF_COMPARENAME EQU 0
SGDAIF_TESTAPPBIT EQU 1
SGDAIF_LASTVALID EQU 1
SGDAIR_SUCCESS EQU 0
SGDAIR_NOMATCH EQU 1
SGDAIR_BADFUNCTION EQU 2
endif
endif

4074
VSound/VXD/VMM.INC Executable file

File diff suppressed because it is too large Load Diff

679
VSound/VXD/VSOUND.ASM Executable file
View File

@ -0,0 +1,679 @@
PAGE 58,132
.386p
;
; Client has:
; States -> state is set by writing to port
; data is retrieved by reading from port
;
; State 0: Get Identification "ITVXDDRV"
; State 1: Get Server string (64 bytes)
; State 2: Get buffer used
; State 3: Reset Client
; State 4: Get debug value
; State 5: Get TSC
;
;
; Server interface:
; Write 0 to reset
; If read, returns "ITSERVER", else 01h if Server has been validated.
; Needs to receive "ITSERVER" to validate.
; If validated, receives server string of max 64 bytes, no 0 permitted.
;
.XLIST
INCLUDE VMM.Inc
INCLUDE Debug.Inc
INCLUDE Shell.inc
.LIST
VSound_Client_Address EQU 400h
VSound_Server_Address EQU 401h
VSound_Data_Address EQU 402h
VSOUND_CLIENTSTATES EQU 7
VSOUND_BUFFERSIZE EQU (64*1024)
;******************************************************************************
; V I R T U A L D E V I C E D E C L A R A T I O N
;******************************************************************************
Declare_Virtual_Device VSOUND, 1, 0, VSOUND_Control, Undefined_Device_ID ,,,
;******************************************************************************
; L O C A L D A T A
;******************************************************************************
VxD_LOCKED_DATA_SEG
VSound_Data DB VSOUND_BUFFERSIZE Dup (0)
VSound_HeadPointer DD 0
VSound_TailPointer DD 0
VSound_Client DD 0
VSound_Server DD 0
VSound_ClientCallback DD 0
VSound_ID DB "ITVXDDRV"
VSound_State DD 0
VSound_BufferUsed DD 0
VSound_StatePos DD 0
VSound_ServerID DB "ITSERVER"
VSound_ServerInPos DD 0
VSound_ServerOutPos DD 0
VSound_ServerValid DD 0
VSound_DebugValue DD 0
VSound_TimeStamp1 DD 0
VSound_TimeStamp2 DD 0
VSound_InTable DD Offset32 VSound_Identification
DD Offset32 VSound_GetServerString
DD Offset32 VSound_GetBufferUsed
DD Offset32 VSound_GetDebugValue
DD Offset32 VSound_Get0
DD Offset32 VSound_GetDebugValue
DD Offset32 VSound_GetTSC
VSound_OutTable DD Offset32 VSound_Out_ResetStatePos
DD Offset32 VSound_Out_ResetStatePos
DD Offset32 VSound_Out_GetBufferUsed
DD Offset32 VSound_Out_ResetClient
DD Offset32 VSound_Out_SetCallbackAddress
DD Offset32 VSound_Out_ResetStatePos
DD Offset32 VSound_Out_GetTSC
VSound_ServerString DB 64 Dup (0)
VxD_LOCKED_DATA_ENDS
;******************************************************************************
; I N I T I A L I Z A T I O N C O D E
;******************************************************************************
VxD_IDATA_SEG
Begin_Vxd_IO_Table IO_Table
Vxd_IO VSound_Client_Address, VSound_Client_Hook
Vxd_IO VSound_Server_Address, VSound_Server_Hook
Vxd_IO VSound_Data_Address, VSound_Data_Hook
End_Vxd_IO_Table IO_Table
VxD_IDATA_ENDS
VxD_ICODE_SEG
;******************************************************************************
;
; VSOUND_Device_Init
;
; DESCRIPTION:
;
; This routine is called during Windows startup. It needs to
; install the I/O handler for our device, and set up the system
; VM as the default owner.
;
;
;==============================================================================
BeginProc VSOUND_Device_Init
Xor EAX, EAX
Mov VSound_Client, EAX ; no current owner
Mov VSound_Server, EAX ; no current owner
Mov VSound_ClientCallback, EAX ; No callback
Mov EDI, OFFSET32 IO_Table
VMMCall Install_Mult_IO_Handlers
Ret
EndProc VSOUND_Device_Init
VxD_ICODE_ENDS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VxD_CODE_SEG
;******************************************************************************
;
; VSOUND_Destroy_VM
;
; DESCRIPTION:
;
; This routine is called when a VM is destroyed. We need to check
; to see if the VM in question is the current owner of the device.
;
;==============================================================================
BeginProc VSOUND_Destroy_VM
Xor EAX, EAX
Cmp EBX, VSound_Client ; Destroying device owner?
JNE Short VDM_Client
Mov VSound_Client, EAX
Mov VSound_ClientCallback, EAX
VDM_Client:
Cmp EBX, VSound_Server
JNE VDM_Server
Mov VSound_Server, EAX
Mov VSound_ServerValid, EAX
VDM_Server:
ClC
Ret
EndProc VSOUND_Destroy_VM
VxD_CODE_ENDS
;******************************************************************************
VxD_LOCKED_CODE_SEG
;******************************************************************************
;
; VSound_Control
;
; DESCRIPTION:
;
; This is a call-back routine to handle the messages that are sent
; to VxD's to control system operation.
;
;==============================================================================
BeginProc VSound_Control
Control_Dispatch Device_Init, VSound_Device_Init
Control_Dispatch Destroy_VM, VSound_Destroy_VM
ClC
Ret
EndProc VSound_Control
VxD_LOCKED_CODE_ENDS
VxD_CODE_SEG
;*****************************************************************************
;
; VSound_Client_Hook
;
; DESCRIPTION:
;
; This routine is called for every I/O access to our port. First,
; it checks to see if the VM issuing the I/O is the current owner.
; If not, it displays a dialog box so the user can decide what to
; do.
;
;*****************************************************************************
VSound_Identification:
Pop EAX
Push ECX
Mov ECX, VSound_StatePos
Mov AL, [VSound_ID+ECX]
Inc ECX
And ECX, 7
Mov VSound_StatePos, ECX
Pop ECX
Ret
VSound_GetServerString:
Pop EAX
Push ECX
Mov ECX, VSound_StatePos
Mov AL, [VSound_ServerString+ECX]
Inc ECX
And ECX, 63
Mov VSound_StatePos, ECX
Pop ECX
Ret
VSound_GetBufferUsed:
Pop EAX
Push ECX
Mov ECX, VSound_StatePos
Xor ECX, 1
Mov AL, [Byte Ptr VSound_BufferUsed+ECX]
Mov VSound_StatePos, ECX
Pop ECX
Ret
VSound_GetTSC:
Pop EAX
Push ECX
Mov ECX, VSound_StatePos
Mov AL, [Byte Ptr VSound_TimeStamp1+ECX]
Inc ECX
And ECX, 7
Mov VSound_StatePos, ECX
Pop ECX
Ret
VSound_Get0:
Xor AL, AL
Pop ECX
Ret
VSound_GetDebugValue:
Pop EAX
Push ECX
Mov ECX, VSound_StatePos
Mov AL, [Byte Ptr VSound_DebugValue+ECX]
Inc ECX
And ECX, 3
Mov VSound_StatePos, ECX
Pop ECX
Ret
BeginProc VSound_Client_Hook
;---------------------------------------------------------------------
; Resolve Contention
;---------------------------------------------------------------------
Push EAX
Mov EAX, VSound_Client
Cmp VSound_ServerValid, 0
JE NoValidServer
Cmp EAX, EBX ; Is the request from the
JE Process_IO ; current owner?
Test EAX, EAX ; Was there a previous owner?
JZ New_Owner
NoValidServer:
Pop EAX
Dispatch_Byte_IO Fall_Through, <SHORT Blocked_IO>
Mov AL, 80h
Blocked_IO:
Ret
New_Owner:
Mov VSound_Client, EBX
Mov VSound_ClientCallback, 0
Process_IO:
Pop EAX
Dispatch_Byte_IO Fall_Through, <SHORT VSound_Out>
Push EAX
Mov EAX, VSound_State
Cmp EAX, VSOUND_CLIENTSTATES
JAE VSound_Unknown
Jmp [VSound_InTable+EAX*4]
VSound_Unknown:
Pop EAX
Xor AL, AL
Ret
VSound_Out:
Push EAX
Mov Byte Ptr VSound_State, AL
And EAX, 0FFh
Cmp EAX, VSOUND_CLIENTSTATES
JAE VSound_Out_Nothing
Jmp [VSound_OutTable+EAX*4]
VSound_Out_GetTSC:
DB 0Fh
DB 31h ; RdTSC
Mov VSound_TimeStamp1, EAX
Mov VSound_TimeStamp2, EDX
Jmp VSound_Out_ResetStatePos
VSound_Out_GetBufferUsed:
Mov EAX, VSound_TailPointer
Sub EAX, VSound_HeadPointer
And EAX, VSOUND_BUFFERSIZE-1
Mov VSound_BufferUsed, EAX
VSound_Out_ResetStatePos:
Mov VSound_StatePos, 0
VSound_Out_Nothing:
Pop EAX
Ret
VSound_Out_ResetClient:
Xor EAX, EAX
Mov VSound_Client, EAX
Mov VSound_ClientCallback, EAX
Pop EAX
Ret
VSound_Out_SetCallbackAddress:
Mov AX, [EBP+CLIENT_REG_STRUC.CLIENT_CS]
ShL EAX, 16
Mov AX, [EBP+CLIENT_REG_STRUC.CLIENT_BX]
Mov VSound_ClientCallback, EAX
Pop EAX
Ret
EndProc VSound_Client_Hook
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;--------------------------------------------------------------------
BeginProc VSound_Server_Hook
Push EAX
Mov EAX, VSound_Server
Cmp EAX, EBX ; Is the request from the
JE Process_Server_IO ; current owner?
Test EAX, EAX ; Was there a previous owner?
JZ New_Server
Pop EAX
Dispatch_Byte_IO Fall_Through, <SHORT Server_Blocked_IO>
Mov AL, 80h
Server_Blocked_IO:
Ret
New_Server:
Mov VSound_Server, EBX
Process_Server_IO:
Pop EAX
Dispatch_Byte_IO Fall_Through, <SHORT VSound_Server_Out>
Cmp VSound_ServerValid, 1
JE VSound_Server_Validated
Mov ECX, VSound_ServerInPos
Mov AL, [VSound_ServerID+ECX]
Inc ECX
And ECX, 7
Mov VSound_ServerInPos, ECX
Ret
VSound_Server_Validated:
Mov ECX, VSound_Client
Add ECX, 0FFFFFFFFh
SBB AL, AL ; Returns 0 if not connected, 0FFh if connected
Ret
VSound_Server_Out:
Test AL, AL ; Reset?
JZ VSound_Server_Reset
Mov ECX, VSound_ServerOutPos
Cmp VSound_ServerValid, 1
JE VSound_ReceiveServerString
Cmp [VSound_ServerID+ECX], AL
JE VSound_ValidByte
Mov VSound_ServerOutPos, 0
Ret
VSound_ValidByte:
Inc ECX
And ECX, 7
Mov VSound_ServerOutPos, ECX
JNZ VSound_ServerNotValidated
Mov VSound_ServerValid, 1
VSound_ServerNotValidated:
Ret
VSound_ReceiveServerString:
Mov [VSound_ServerString+ECX], AL
Inc ECX
And ECX, 63
Mov VSound_ServerOutPos, ECX
Ret
VSound_Server_Reset:
Xor ECX, ECX
Mov VSound_Server, ECX
Mov VSound_ServerValid, ECX
Mov VSound_ServerInPos, ECX
Mov VSound_ServerOutPos, ECX
Ret
EndProc VSound_Server_Hook
;---------------------------------------------------------------------
BeginProc VSound_Data_Hook
Cmp EBX, VSound_Server
JE VSound_Data_Server
Cmp EBX, VSound_Client
JE VSound_Data_Client
Ret
VSound_Data_Client:
Cmp CX, String_IO or Rep_IO or Byte_Output
JNE Data_Client_Simulate
PushAD
Push ES
PushF
ClI
Push DS
Pop ES
ShR ECX, 16 ; ECX = segment.
Mov EAX, [EBP+CLIENT_REG_STRUC.CLIENT_ECX]
ShL ECX, 4
Mov ESI, [EBP+CLIENT_REG_STRUC.CLIENT_ESI]
And ESI, 0FFFFh
Mov EDI, VSound_TailPointer
Add ESI, ECX ; ESI = data source.
And EAX, 0FFFFh ; EAX = byte count
Test EAX, 3 ; Must be multiple of 4 bytes
JNZ VSound_DataClientExit
LEA EDX, [EDI+EAX]
Add EDI, Offset VSound_Data
Cmp EDX, VSOUND_BUFFERSIZE
JB VSound_DataClient1
Mov ECX, VSOUND_BUFFERSIZE
LEA EAX, [EDX-VSOUND_BUFFERSIZE]
Sub ECX, VSound_TailPointer
ShR ECX, 2
Rep MovsD
Mov EDI, Offset VSound_Data
VSound_DataClient1:
ShR EAX, 2
And EDX, VSOUND_BUFFERSIZE-1
Mov ECX, EAX
Mov VSound_TailPointer, EDX
Rep MovsD
VSound_DataClientExit:
PopF
Pop ES
PopAD
Data_Client_Simulate:
Ret
VSound_Data_Server:
;
; The server will only receive data if:
; 1) A Rep InsB instruction is used. No other instruction will work
; 2) The ECX count is a multiple of 4
; 3) The ECX count must be less than BUFFERSIZE
Cmp CX, String_IO or Rep_IO or Addr_32_IO or Byte_Input
JNE Data_Server_Simulate
PushAD
Push ES
PushF
ClI
ShR ECX, 16
Mov ES, CX
Mov EAX, [EBP+CLIENT_REG_STRUC.CLIENT_ECX]
Mov EDI, [EBP+CLIENT_REG_STRUC.CLIENT_EDI]
Test EAX, 3
JNZ VSound_DataServerExit
Cmp EAX, VSOUND_BUFFERSIZE
JAE VSound_DataServerExit
; Want minimum of bytes available and bytes requested
Mov ESI, VSound_HeadPointer
Mov EBX, VSound_TailPointer
Sub EBX, ESI
And EBX, VSOUND_BUFFERSIZE-1 ; EBX = bytes available
; EAX = bytes requested
Cmp EBX, EAX
JB VSound_DataServer1
Mov EBX, EAX
VSound_DataServer1: ; EBX = bytes to transfer
Sub EAX, EBX ; EAX = bytes to zero
LEA EDX, [ESI+EBX]
ShR EBX, 2 ; EBX = dwords to transfer
Add ESI, Offset VSound_Data
Cmp EDX, VSOUND_BUFFERSIZE ; Does it span the buffer boundary?
JB VSound_DataServer2
LEA EBX, [EDX-VSOUND_BUFFERSIZE]
Mov ECX, VSOUND_BUFFERSIZE
ShR EBX, 2
Sub ECX, VSound_HeadPointer
ShR ECX, 2
Rep MovsD
Mov ESI, Offset VSound_Data
VSound_DataServer2:
ShR EAX, 2
Mov ECX, EBX
Rep MovsD
Mov ECX, EAX
And EDX, VSOUND_BUFFERSIZE-1
Xor EAX, EAX
Mov VSound_HeadPointer, EDX
Rep StosD
; ECX = 0
Mov EBX, VSound_Client
Cmp VSound_ClientCallback, ECX
JE VSound_DataServerExit
Test EBX, EBX
JZ VSound_DataServerExit
Mov EBP, [EBX+CB_S.CB_Client_Pointer]
VMMCall Set_Execution_Focus
JC VSound_DataServerExit
Push_Client_State
VMMCall Begin_Nest_V86_Exec
MovZX EDX, Word Ptr [VSound_ClientCallback]
MovZX ECX, Word Ptr [VSound_ClientCallback+2]
VMMCall Simulate_Far_Call
VMMCall Resume_Exec
VMMCall End_Nest_Exec
Pop_Client_State
VSound_DataServerExit:
PopF
Pop ES
PopAD
Data_Server_Simulate:
Ret
EndProc VSound_Data_Hook
;---------------------------------------------------------------------
VxD_CODE_ENDS
END

38
VSound/VXD/VSOUND.DEF Executable file
View File

@ -0,0 +1,38 @@
;****************************************************************************
; *
; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY *
; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *
; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR *
; PURPOSE. *
; *
; Copyright (C) 1993-95 Microsoft Corporation. All Rights Reserved. *
; *
;****************************************************************************
VXD VSOUND
DESCRIPTION 'VSOUND Impulse Tracker Virtual Soundcard driver for for Microsoft Windows'
SEGMENTS
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_ITEXT CLASS 'ICODE' DISCARDABLE
_IDATA CLASS 'ICODE' DISCARDABLE
_PTEXT CLASS 'PCODE' NONDISCARDABLE
_PDATA CLASS 'PDATA' NONDISCARDABLE SHARED
_STEXT CLASS 'SCODE' RESIDENT
_SDATA CLASS 'SCODE' RESIDENT
_DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
_RCODE CLASS 'RCODE'
EXPORTS
VSOUND_DDB @1