Alignment issues mean we can't access 16-bit CP/M structure elements directly.
This commit is contained in:
parent
0607529df2
commit
784fc67596
|
@ -3,6 +3,9 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* EM requires 2-byte alignment, even on the i80, so we can't declare these
|
||||||
|
* structures to contain uint16_ts. Use U16() to access them. */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t dr;
|
uint8_t dr;
|
||||||
|
@ -13,8 +16,7 @@ typedef struct
|
||||||
uint8_t rc;
|
uint8_t rc;
|
||||||
uint8_t d[16];
|
uint8_t d[16];
|
||||||
uint8_t cr;
|
uint8_t cr;
|
||||||
uint16_t r;
|
uint8_t r[3];
|
||||||
uint8_t r2;
|
|
||||||
}
|
}
|
||||||
FCB;
|
FCB;
|
||||||
|
|
||||||
|
@ -34,29 +36,27 @@ typedef struct
|
||||||
uint8_t ex;
|
uint8_t ex;
|
||||||
uint8_t s[2];
|
uint8_t s[2];
|
||||||
uint8_t rc;
|
uint8_t rc;
|
||||||
union
|
uint8_t al[16];
|
||||||
{
|
|
||||||
uint8_t al8[16];
|
|
||||||
uint16_t al16[8];
|
|
||||||
}
|
|
||||||
al;
|
|
||||||
}
|
}
|
||||||
DIRE;
|
DIRE;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16_t spt; /* number of 128-byte sectors per track */
|
uint8_t spt[2]; /* number of 128-byte sectors per track */
|
||||||
uint8_t bsh; /* block shift; 3=1kB, 4=2kB, 5=4kB etc */
|
uint8_t bsh; /* block shift; 3=1kB, 4=2kB, 5=4kB etc */
|
||||||
uint8_t blm; /* block mask; 0x07=1kB, 0x0f=2kB, 0x1f=4k etc */
|
uint8_t blm; /* block mask; 0x07=1kB, 0x0f=2kB, 0x1f=4k etc */
|
||||||
uint8_t exm; /* extent mask */
|
uint8_t exm; /* extent mask */
|
||||||
uint16_t dsm; /* maximum block number */
|
uint8_t dsm[2]; /* maximum block number */
|
||||||
uint16_t drm; /* maximum directory entry number */
|
uint8_t drm[2]; /* maximum directory entry number */
|
||||||
uint16_t al; /* directory allocation bitmap */
|
uint8_t al[2]; /* directory allocation bitmap */
|
||||||
uint16_t cks; /* checksum vector size */
|
uint8_t cks[2]; /* checksum vector size */
|
||||||
uint16_t off; /* number of reserved tracks */
|
uint8_t off[2]; /* number of reserved tracks */
|
||||||
}
|
}
|
||||||
DPB;
|
DPB;
|
||||||
|
|
||||||
|
/* Access an unaligned field (see above). */
|
||||||
|
#define U16(ptr) (*(uint16_t*)(ptr))
|
||||||
|
|
||||||
extern FCB cpm_fcb; /* primary FCB */
|
extern FCB cpm_fcb; /* primary FCB */
|
||||||
extern FCB cpm_fcb2; /* secondary FCB (special purpose) */
|
extern FCB cpm_fcb2; /* secondary FCB (special purpose) */
|
||||||
extern uint8_t cpm_iobyte;
|
extern uint8_t cpm_iobyte;
|
||||||
|
|
Loading…
Reference in a new issue