| 
   
 x86 programming for Ms Dos
      Computers in CGA , EGA and VGA
      
        
          | The IBM 8086 took the world by storm! 
 Although inferior to the 68000 - the x86 soon took over, and is the
            basis for all the computers we have today...
 
 Starting with the 8086, and soon moving to the 286, 386 and so on...
            each iteration has added more commands and power, and along the way
            the PC has gained functionality...
 
 
 
 | 
 | 
 |  |  
 
      
        
          | In these tutorials, we'll take a look at the early  basic
            machines, and learn how we can use Assembly to write games that can
            be used in MSDos via DosBox! 
 We'll cover 3 graphics modes...
 
 
 
              
                
                  | CGA | 320x200 4 color (Cyan,Magenta,White or Green,Red,Yellow) |  
                  | EGA | 320x200 16 color fixed palette |  
                  | VGA | 320x200 256 color palette |  
 |  |  
 
      
        
          |  | 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 guideMASM - Microsoft's
      Dos based assembler
 80x86 IBM PC and Compatible Computers - Programming guide
 8086/186 - Intel CPU manual
 
ChibiAkumas Tutorials 8086 Hello World Series8086 Simple Samples 8086 Platform Specific Lessons8086 SuckHunt SeriesCGA color Palette 
      
      
        
          | 
 | Palette 0 Dark | Palette 0 Bright
 | Palette 1 Dark | Palette 1 Bright |  
          | 0 | 
 | 
 | 
 | 
 |  
          | 1 | 
 | 
 | 
 | 
 |  
          | 2 | 
 | 
 | 
 | 
 |  
          | 3 | 
 | 
 | 
 | 
 |  EGA color Palette
 
 The EGA system uses 16 colors - it's 320x200 can only use a palette of 16
    colors (the same colors!)
 
 Each color has a logical number from 0-16, and a Hardware number (used for
    palette definitions) from 0-63
 
 
 
      
        
          | 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 |  Screen Layouts
 
 CGA is a 2bpp screen mode, it's memory is at B800:0000h
 
 EGA use 4 bitplanes, it's address is A000:0000... to change the bitplanes
      we need to OUT to 03C4h
 
 VGA is a 8bpp screen mode, it's memory is at A000:0000h
 
 
 
          
      
        
          | 
 | 
 | 
 | 
 | 
 | 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
   
 
 |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Buy my Assembly programming book
 on Amazon in Print or Kindle!
 
 
  
 
  
 
  
 Available worldwide!
 Search 'ChibiAkumas' on
 your local Amazon website!
 Click here for more info!
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Buy my Assembly programming book
 on Amazon in Print or Kindle!
 
 
  
 
  
 
  
 Available worldwide!
 Search 'ChibiAkumas' on
 your local Amazon website!
 Click here for more info!
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Buy my Assembly programming book
 on Amazon in Print or Kindle!
 
 
  
 
  
 
  
 Available worldwide!
 Search 'ChibiAkumas' on
 your local Amazon website!
 Click here for more info!
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 |