If you want to learn 8086 get the Cheatsheet! it has all the 8086 commands, It will help you get started with ASM programming, and let you quickly look up commands when you get confused! |
Useful Documents
MASM61PROGUIDE
- Microsoft Assembler guide
MASM - Microsoft's
Dos based assembler
80x86 IBM PC and Compatible Computers - Programming guide
8086/186 - Intel CPU manual
ChibiAkumas Tutorials
Lesson H1 - Hello World on MS Dos |
Lesson H3 - Hello World on MS Dos via Native Tools (MASM 6.11) [DOS] |
Lesson S1 - Sprite drawing and Simple key movement in MS DOS |
Lesson P1 - Bitmap graphics on DOS with CGA [DOS] |
Lesson P2 - Bitmap graphics on DOS with EGA [DOS] |
Lesson P3 - Bitmap graphics on DOS with VGA [DOS] |
Lesson P5 - Key reading in DOS [DOS] |
Lesson
P7 - Mouse
reading in MS DOS |
Lesson P8 - Beeper speaker on MS DOS! [DOS] |
Lesson P9 - Adlib/Soundblaster sound with MS DOS! [DOS] |
Lesson SuckShoot1 - Suck Shoot on the 8086 [DOS] |
Lesson SuckShoot4 - Suck Shoot on the 8086 with CGA [DOS] |
CGA color Palette
Palette 0 Dark | Palette 0 Bright |
Palette 1 Dark | Palette 1 Bright | |
0 | ||||
1 | ||||
2 | ||||
3 |
0 - 0 | 1 - 1 | 2 - 2 | 3 - 3 | 4 - 4 | 5 - 5 | 6 - 20 | 7 - 7 |
8 - 56 | 9 - 57 | 10 - 58 | 11 - 59 | 12 - 60 | 13 - 61 | 14 - 62 | 15 - 63 |
Bits | ||||||||||||
Screen Mode | Bits per pixel | Pixels per byte | Address | Plane Mask | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
CGA - 4 | 2 bpp | 4 | B800:0000h | b1 | b0 | b1 | b0 | b1 | b0 | b1 | b0 | |
EGA - 13 | 4 bitplanes | 8 | A000:0000h | out 03c4h,0102h | p0-b7 | p0-b6 | p0-b5 | p0-b4 | p0-b3 | p0-b2 | p0-b1 | p0-b0 |
out 03c4h,0202h | p1-b7 | p1-b6 | p1-b5 | p1-b4 | p1-b3 | p1-b2 | p1-b1 | p1-b0 | ||||
out 03c4h,0302h | p2-b7 | p2-b6 | p2-b5 | p2-b4 | p2-b3 | p2-b2 | p2-b1 | p2-b0 | ||||
out 03c4h,0402h | p3-b7 | p3-b6 | p3-b5 | p3-b4 | p3-b3 | p3-b2 | p3-b1 | p3-b0 | ||||
out 03c4h,0F02h | All-b7 | All-b6 | All-b5 | All-b4 | All-b3 | All-b2 | All-b1 | All-b0 | ||||
VGA | 8bpp | 1 | A000:0000h | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
Beeper Sound Ports
Port | Modes | Purpose | Bits | Notes |
0040 | RW | PIT counter 0, counter divisor (XT, AT, PS/2) | CCCCCCCC | Send L/H Pair |
0041 | RW | PIT counter 1, RAM refresh counter (XT, AT) | CCCCCCCC | Send L/H Pair |
0042 | RW | PIT counter 2, cassette & speaker (XT, AT, PS/2) | CCCCCCCC | Send L/H Pair |
0043 | RW | PIT mode port, control word register for counters 0-2 | CCAAMMMS | C=Counter select (0-2), A=counter Access, M=counter Mode (0-5), S=counter Style (0=16 bit 1=BCD) |
0061 | W | PPI Programmable Peripheral Interface 8255 (XT only) | ----PPST | P= parity checks S=Speaker enable T=speaker Timer enable |
0061 | R | KB controller port B control register (ISA, EISA) | EETDPPST | E=errors T=Timer D=Detect P= parity checks S=Speaker enable T=speaker Timer enable |
Adlib OPL2 Registers
The ADLIB sound card usesd OPL2, which is also supported by the full SoundBlaster range, it uses a range of registers to make its sounds, each sound channel is formed by a combination of two Operators
NOTE: OPL3 doubled the number of registers, with an 'Advanced' set... for simplicity (and my sanity) we'll just be covering the basic OPL2 set, which are supported by OPL3 as well!
There are a total of up to 9 sound channels... each sound is the
combination of two "OP signals"... we should set both to get a sound
from a channel! How the OPs are combined is defined by bit 0 of
registers C0h-C8h... see the pdf documents for more info.
Channel Signal | 1 | 2 | 3 | 4 | 5 | 6 | 7 (Ryt) |
8 (Ryt) |
9 (Ryt) |
|||||||||
OP1 Slot 1 Signal | 1 | 2 | 3 | 7 | 8 | 9 | 13 | 14 | 15 | |||||||||
OP2 Slot 2 Signal | 4 | 5 | 6 | 10 | 11 | 12 | 16 | 17 | 18 | |||||||||
Register settings for slot |
20 | 21 | 22 | 28 | 29 | 2A | 30 | 31 | 32 | |||||||||
23 | 24 | 25 | 2B | 2C | 2D | 33 | 34 | 35 | ||||||||||
40 | 41 | 42 | 48 | 49 | 4A | 50 | 51 | 52 | ||||||||||
43 | 44 | 45 | 4B | 4C | 4D | 53 | 54 | 55 | ||||||||||
60 | 61 | 62 | 68 | 69 | 6A | 70 | 71 | 72 | ||||||||||
63 | 64 | 65 | 6B | 6C | 6D | 73 | 74 | 75 | ||||||||||
80 | 81 | 82 | 88 | 89 | 8A | 90 | 91 | 92 | ||||||||||
83 | 84 | 85 | 8B | 8C | 8D | 93 | 94 | 95 | ||||||||||
E0 | E1 | E2 | E8 | E9 | EA | F0 | F1 | F2 | ||||||||||
E3 | E4 | E5 | EB | EC | ED | F3 | F4 | F5 | ||||||||||
Register settings for the channel |
A0 | A1 | A2 | A3 | A4 | A5 | A6 | A7 | A8 | |||||||||
B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8 | ||||||||||
C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
Channels 7,8,9 can be toggled as Rhythm effects by setting bit 5 of 0BDh to 1
In this mode bits 0-4 of 0BDh will 'fire' the effects... each
effect uses some of the signal slots, the registers for this slot will
need to be set up as usual
BDh bits %DDRBSTCH
R=Rhythm enabled (channel 7-9 no longer normal FM sound)
Bit / Rhythm sound |
OP / Signal Slots used |
B=Bass | 13 & 16 |
S=Snare | 17 |
T=Tom | 15 |
C=Cymbal | 18 |
H=Hihat | 14 |
Sound over time
The OPs define how the sound level changes over time... K-On and K-Off mimic the way piano keys work.. when the key is struck the sound will start (Attack), and fade slowly (Decay) to a constant tone (Sustain), when the key is lifted, it will fade quickly (Release)
Adlib OPL2 Registers and bits
Register | Details | Bits | Details |
01h | Test | --WDDDDD | W=Wave select Enable (opl2) / D=Test Data |
02h | Timer 1 Setting 80-20.4us | TTTTTTTT | T=Timer |
03h | Timer 2 Setting 320-82 us | TTTTTTTT | T=Timer |
04h | Timer 1/2 control | RMM---SS | R=Reset M=Mask S=? |
08h | Speech Synth / Keyboard Split NoteSel | CS------ | C=CSM Speech synth mode / S=note Select |
20h - 35h | Multi / Key Scale Rate / EG-Type Tone / Vibrato / AM modulation | AVEKMMMM | A=AM V=VIB E=EG-Typ K=KSR M=Multiple |
40h - 55h | Total Level / Key Scale Level | KKTTTTTT | K=KeyScaleLevel T=Total Level (0=loud) |
60h - 75h | Decay Rate / Attack Rate | AAAADDDD | A=Attack (0=slow) D=Decay (0=slow) |
88h - 95h | Release Rate / Sustain Level | SSSSRRRR | S=Sustain (0=loud) R=Release (0=slow) |
A0h - A8h | F number | FFFFFFFF | F=Fnumber L |
B0h - B8h | Block / K-ON | --KBBBFF | F=Fnumber H B=Block K=K-on |
BDh | Rhythm mode (Chn 7-9) / Vibrato Depth / AM Depth | DDRBSTCH | D=Depth
(AM/VIB) R=Rhythm B=Bass(13,16) S=Snare(17) T=Tom(15) C=Cymbal(18) H=Hihat(14) |
C0h - C8h | FeedBack factor / C=Connection sine/fm | ----FFFC | F=Feedback
C=Connection (Op combination mode) |
E0h - F5h | Wave Select | ------WW | WW=Wave Select |
(Address port Read) | Status Reg | IFF----- | I=IRQ F=Flag |
Useful ADLIB docs:
yamaha_ymf262
- OPL3 Manual (Adlib Gold / SB16)
YM3812 - OPL2
Manual (adlib)
ym3625 -
OPL(1) manual
Soundblaster -
Soundblaster programming guide
Adlib
Programming - Adlib programming guide