#include "portab.h" #include "obdefs.h" #include "define.h" #include "gemdefs.h" #include "osbind.h" struct bpb /* siehe auch BIOS:rwabs.c fuer weitere Informationen */ { WORD recsiz, clsiz, clsizb, rdlen, fsiz, fatrec, datrec, numcl, bflags; }; int contrl[12]; /* AES Kontroll Felder */ int intin[128]; int ptsin[128]; int intout[128]; int ptsout[128]; typedef LONG (*PFL)(); /* Zeiger auf Funktion, die ein lang-Adresse liefer */ typedef WORD (*PFW)(); /* Zeiger auf Funktion, die ein Wort liefert */ PFL getbpb; /* Zeiger auf die Originalfunktion getbpb */ PFW mediach; /* Zeiger auf die Originalfunktion mediach */ PFL rwabs; /* Zeiger auf die Originalfunktion rwabs */ struct bpb rdiskbpb = { 512,2,1024,7,5,6,18,351,0 }; /* gleiche Struktur wie bei 3,5 Zoll SSDD Disketten */ int data[184320]; /* gleiche groesse des Speicherplatzes wie 3,5 SSDD */ /* Daten fuer die ersten beiden Tracks der Diskette */ int fdata[0x50]={ 0x0000,0x4e4e,0x4e4e,0x4e4e,0xe1d1,0x2300,0x0202,0x0100, 0x0270,0x00d0,0x02f8,0x0500,0x0900,0x0100,0x0000,0x4e4e, 0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e, 0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0xf5f5,0xf5fe,0x4f00,0x0102, 0xf74e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e, 0x4e4e,0x4e4e,0x4e4e,0x4e00,0x0000,0x0000,0x0000,0x0000, 0x0000,0x00f5,0xf5f5,0xfbe5,0xe5e5,0xe5e5,0xe5e5,0xe5e5, 0x5241,0x4d2d,0x4449,0x534b,0x3532,0x3008,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 }; LONG RDgetbpb(dev) /* neue RAM DISK getbpb Funktion */ WORD dev; { if(dev != 3) return((*getbpb)(dev)); /* fals nicht RAM DISK */ else return(&rdiskbpb); /* fals RAM DISK */ } WORD RDmediach(dev) /* neue RAM DISK mediach Funktion */ WORD dev; { if(dev != 3) return((*mediach)(dev)); /* fals nicht RAM DISK */ else return(0); /* RAM DISK aendert Disk nicht */ } LONG RDrwabs(rw,buf,count,recno,dev) /* neue RAM DISK rwabs Funktion */ WORD rw; int *buf; WORD count,recno,dev; { int i; int *p; if (dev != 3) return((*rwabs)(rw,buf,count,recno,dev)); /* fals nicht RAM DISK */ else { if (rw > 1) /* RAM DISK wird nicht gewechselt */ rw -=2; while(count>0) { p = &data[((long) recno) * 256l]; if(rw==0) for(i=0;i<256;i++) *buf++ = *p++; else for(i=0;i<256;i++) *p++ = *buf++; count--; recno++; } return(0l); } } install() { long *bpbvect = 0x472; long *rwvect = 0x476; long *mcvect = 0x47e; long *devset = 0x4c2; getbpb = (PFL) *bpbvect; /* speichere alte Vektoren */ mediach = (PFW) *mcvect; rwabs = (PFL) *rwvect; *bpbvect = RDgetbpb; /* installiere neue Vektoren */ *mcvect = RDmediach; *rwvect = RDrwabs; *devset = (*devset) | (0x08l); } sleep() { int i; while (1) { i=evnt_timer(60000,0); /* warte 60 sec ueber Timer */ Bconout(2,7); /* Beep als Lebenszeichen */ } } main() { appl_init(); /* AES init fuer AES Routinen */ format(); /* 'Formatiere' RAM DISK */ xbios(38,install); /* Installiere Vektoren in SP Mode */ sleep(); /* Accessories enden niemals */ } format() { long i; for(i=0;i<0x100;data[i++]=0xe5e5); /* loesche RAM DISK */ for(i=0;i<0x40l;data[i]=fdata[i++]); /* schreibe ersten Track */ data[0xffl]=0x2F72; for(i=0x0100;i<0x1200l;data[i++]=0x0000); data[0x0100l]=0xf7ff; data[0x0101l]=0xff00; data[0x0600l]=0xf7ff; data[0x0601l]=0xff00; for(i=0;i<0x10l;i++) /* schreibe zweiten Track */ data[0x0b00l+i]=fdata[0x40l+i]; }