Alignment issues mean we can't access 16-bit CP/M structure elements directly.

This commit is contained in:
David Given 2019-06-11 22:33:25 +02:00
parent 0607529df2
commit 784fc67596

View file

@ -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;