Fredrick
Fredrick

Reputation: 513

Inline io wait using MASM

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);
}

Upvotes: 1

Views: 621

Answers (2)

agr
agr

Reputation: 1

Seems GNU gas syntax, jmp 1f means jump to label 1 forward.

static __inline__ void io_wait(void)
{
#ifdef __GNUC__
  asm volatile("jmp 1f;1:jmp 1f;1:");
#else
  /* MSVC x86 supports inline asm */
  __asm {
    jmp a1
  a1:
    jmp b1
  b1:
  }
#endif
}

Upvotes: 0

Rom
Rom

Reputation: 4199

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

Upvotes: 1

Related Questions