Newer
Older
ubix / src / sys / drivers / fdc.c
@reddawg reddawg on 11 May 2002 1 KB Floppy Support
/**************************************************************************************
 Copyright (c) 2002
      The UbixOS Project

 $Id$
**************************************************************************************/

#include <drivers/fdc.h>
#include <drivers/8259.h>
#include <ubixos/gdt.h>
#include <ubixos/idt.h>
#include <ubixos/types.h>
#include <ubixos/io.h>

static volatile BOOL done = FALSE;

void initFloppy() {
  setVector(floppyIsr, mVec+6, (dInt+dPresent+dDpl1));
  enableIrq(6);
  }

asm(
  ".globl floppyIsr      \n"
  "floppyIsr:            \n"
  "  pusha               \n"
  "  pushw %ds           \n"
  "  pushw %es           \n"
  "  pushw %ss           \n"
  "  pushw %ss           \n"
  "  popw %ds            \n"
  "  popw %es            \n"
  "  call floppyIsrhndlr \n"
  "  popw %es            \n"
  "  popw %ds            \n"
  "  popa                \n"
  "  iret                \n"
  );

void floppyIsrhndlr() {
  done = TRUE;
  outportByte(0x20,0x20);
  }

void sendByte(int byte) {
  volatile int msr;
  int tmo;
  for (tmo=0;tmo<128;tmo++) {
    msr = inportByte(fdcMsr);
    if ((msr & 0xc0) == 0x80) {
      outportByte(fdcData,byte);
      return;
      }
    inportByte(0x80);
    }
  }

int getByte() {
  volatile int msr;
  int tmo;
  for (tmo=0;tmo<128;tmo++) {
    msr = inportByte(fdcMsr);
    if ((msr & 0xd0) == 0xd0) {
      return inportByte(fdcData);
      }
    inportByte(0x80);
    }
  return(-1);
  }