mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-01 03:53:33 +00:00
9e3e985ae5
Here's some screenshots of an emulator tui program that was compiled on Linux, then scp'd it to Windows, Mac, and FreeBSD. https://justine.storage.googleapis.com/blinkenlights-cmdexe.png https://justine.storage.googleapis.com/blinkenlights-imac.png https://justine.storage.googleapis.com/blinkenlights-freebsd.png https://justine.storage.googleapis.com/blinkenlights-lisp.png How is this even possible that we have a nontrivial ui binary that just works on Mac, Windows, Linux, and BSD? Surely a first ever achievement. Fixed many bugs. Bootstrapped John McCarthy's metacircular evaluator on bare metal in half the size of Altair BASIC (about 2.5kb) and ran it in emulator for fun and profit.
116 lines
2.8 KiB
C
116 lines
2.8 KiB
C
#ifndef COSMOPOLITAN_TOOL_BUILD_LIB_ENDIAN_H_
|
|
#define COSMOPOLITAN_TOOL_BUILD_LIB_ENDIAN_H_
|
|
#include "libc/dce.h"
|
|
#include "libc/str/str.h"
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
#if __BYTE_ORDER__ + 0 == 1234
|
|
|
|
#define Read8(P) \
|
|
({ \
|
|
uint8_t *Ptr = (P); \
|
|
*Ptr; \
|
|
})
|
|
|
|
#define Read16(P) \
|
|
({ \
|
|
uint16_t Res; \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(&Res, Ptr, 2); \
|
|
Res; \
|
|
})
|
|
|
|
#define Read32(P) \
|
|
({ \
|
|
uint32_t Res; \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(&Res, Ptr, 4); \
|
|
Res; \
|
|
})
|
|
|
|
#define Read64(P) \
|
|
({ \
|
|
uint64_t Res; \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(&Res, Ptr, 8); \
|
|
Res; \
|
|
})
|
|
|
|
#define Write8(P, B) \
|
|
do { \
|
|
uint8_t *Ptr = (P); \
|
|
*Ptr = (B); \
|
|
} while (0)
|
|
|
|
#define Write16(P, V) \
|
|
do { \
|
|
uint16_t Val = (V); \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(Ptr, &Val, 2); \
|
|
} while (0)
|
|
|
|
#define Write32(P, V) \
|
|
do { \
|
|
uint32_t Val = (V); \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(Ptr, &Val, 4); \
|
|
} while (0)
|
|
|
|
#define Write64(P, V) \
|
|
do { \
|
|
uint64_t Val = (V); \
|
|
uint8_t *Ptr = (P); \
|
|
memcpy(Ptr, &Val, 8); \
|
|
} while (0)
|
|
|
|
#else
|
|
|
|
forceinline uint16_t Read8(const uint8_t p[hasatleast 1]) {
|
|
return p[0];
|
|
}
|
|
|
|
forceinline uint16_t Read16(const uint8_t p[hasatleast 2]) {
|
|
return p[0] | p[1] << 010;
|
|
}
|
|
|
|
forceinline uint32_t Read32(const uint8_t bytes[hasatleast 4]) {
|
|
return (uint32_t)bytes[0] << 000 | (uint32_t)bytes[1] << 010 |
|
|
(uint32_t)bytes[2] << 020 | (uint32_t)bytes[3] << 030;
|
|
}
|
|
|
|
forceinline uint64_t Read64(const uint8_t bytes[hasatleast 8]) {
|
|
return (uint64_t)bytes[0] << 000 | (uint64_t)bytes[1] << 010 |
|
|
(uint64_t)bytes[2] << 020 | (uint64_t)bytes[3] << 030 |
|
|
(uint64_t)bytes[4] << 040 | (uint64_t)bytes[5] << 050 |
|
|
(uint64_t)bytes[6] << 060 | (uint64_t)bytes[7] << 070;
|
|
}
|
|
|
|
forceinline void Write8(unsigned char p[hasatleast 1], uint8_t x) {
|
|
p[0] = x >> 000;
|
|
}
|
|
|
|
forceinline void Write16(unsigned char p[hasatleast 2], uint16_t x) {
|
|
p[0] = x >> 000;
|
|
p[1] = x >> 010;
|
|
}
|
|
|
|
forceinline void Write32(unsigned char p[hasatleast 4], uint64_t x) {
|
|
p[0] = x >> 000;
|
|
p[1] = x >> 010;
|
|
p[2] = x >> 020;
|
|
p[3] = x >> 030;
|
|
}
|
|
|
|
forceinline void Write64(unsigned char p[hasatleast 8], uint64_t x) {
|
|
p[0] = x >> 000;
|
|
p[1] = x >> 010;
|
|
p[2] = x >> 020;
|
|
p[3] = x >> 030;
|
|
p[4] = x >> 040;
|
|
p[5] = x >> 050;
|
|
p[6] = x >> 060;
|
|
p[7] = x >> 070;
|
|
}
|
|
|
|
#endif /* ENDIAN */
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_TOOL_BUILD_LIB_ENDIAN_H_ */
|