tags:

views:

116

answers:

1

How to convert this to use VC++ and MASM

static __inline__ void io_wait(void)
{
  asm volatile("jmp 1f;1:jmp 1f;1:");
}

I know asm changes to __asm and we remove the volatile but whats next?

I am trying to create the function to place in the code below

#define PIC1  0x20
#define PIC2  0xA0
#define PIC1_COMMAND PIC1
#define PIC1_DATA (PIC1+1)
#define PIC2_COMMAND PIC2
#define PIC2_DATA (PIC2+1)
#define PIC_EOI  0x20

#define ICW1_ICW4 0x01  /* ICW4 (not) needed */
#define ICW1_SINGLE 0x02  /* Single (cascade) mode */
#define ICW1_INTERVAL4 0x04  /* Call address interval 4 (8) */
#define ICW1_LEVEL 0x08  /* Level triggered (edge) mode */
#define ICW1_INIT 0x10  /* Initialization - required! */

#define ICW4_8086 0x01  /* 8086/88 (MCS-80/85) mode */
#define ICW4_AUTO 0x02  /* Auto (normal) EOI */
#define ICW4_BUF_SLAVE 0x08  /* Buffered mode/slave */
#define ICW4_BUF_MASTER 0x0C  /* Buffered mode/master */
#define ICW4_SFNM 0x10  /* Special fully nested (not) */

void remap_pics(int pic1, int pic2)
{
    UCHAR a1, a2;

    a1=ReadPort8(PIC1_DATA);
    a2=ReadPort8(PIC2_DATA);

    WritePort8(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4);
    io_wait();
    WritePort8(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4);
    io_wait();
    WritePort8(PIC1_DATA, pic1);
    io_wait();
    WritePort8(PIC2_DATA, pic2);
    io_wait();
    WritePort8(PIC1_DATA, 4);
    io_wait();
    WritePort8(PIC2_DATA, 2);
    io_wait();

    WritePort8(PIC1_DATA, ICW4_8086);
    io_wait();
    WritePort8(PIC2_DATA, ICW4_8086);
    io_wait();

    WritePort8(PIC1_DATA, a1);
    WritePort8(PIC2_DATA, a2);
}
+1  A: 

I think you'll have better luck by telling us what you're trying to do with this code. Neither of the platforms supported by VC++ will wait for IO completion by executing an unconditional jump.

Nevertheless, given your example, I see several problems you need to address first:

  1. "1f" needs to have a suffix indicating that it's hexadecimal. In VC++ you can use either C-style (0x1f) or assembly style (1fh) suffixes in inline assembly
  2. it seems that you've got two "1" labels. Besides the fact that two labels of the same name are going to collide, I believe VC++ doesn't support label names containing only digits
  3. 1fh is a strange address to jump to. In Real mode it's IRQ area, in Protected mode it's inside the first page, which most of the OSes keep not-present to catch NULL dereference.

Barring that, your code can be translated to VC++ should look like this:

__asm {
    jmp 1fh
a1:
    jmp 1fh
b1:
}

But this will not get you anything useful. So please state what you're trying to accomplish

Rom