Download src/xiaomao/xiaomao-v86.patch from HelloSun/dosllm: direct link, hf CLI and curl.
- Browser
- Download file 3.38 kB
-
https://huggingface.co/spaces/HelloSun/dosllm/resolve/main/src/xiaomao/xiaomao-v86.patch
- Command line
-
hf download hf://spaces/HelloSun/dosllm/src/xiaomao/xiaomao-v86.patch
-
curl -L -o xiaomao-v86.patch https://huggingface.co/spaces/HelloSun/dosllm/resolve/main/src/xiaomao/xiaomao-v86.patch
3.38 kB
| --- a/src/xiaomao.c | |
| +++ b/src/xiaomao.c | |
| * Additional terms under GPLv3 section 7(b): the author attribution "HelloSun" and this copyright | |
| * notice must be preserved in all copies and modified versions, including the notice the program | |
| * displays when it starts. See LICENSE. | |
| + * MODIFIED VERSION: adapted to the v86 emulator by the DOS LLM project (see xiaomao-v86.patch): the shadow | |
| + * text buffer is at A800:0000 instead of B800:0000. Original work: HelloSun, Copyright (C) 2026 HelloSun, first version 1.0 (2026-10-25). | |
| * | |
| * Design (the classic "Chinese system" approach): | |
| * The text screen is kept as an ordinary 80x25 text-mode shadow in memory at | |
| #define COLS 80 | |
| #define ROWS 25 | |
| +/* v86 patch: v86's VGA planes are exactly 64 KB and do not wrap the 128 KB aperture the way DOSBox does, | |
| + * so the shadow text lives at A800:0000 (plane offset 8000h, inside a 64 KB A0000 window, GC6=05h) instead of B800. */ | |
| +#define SHADOW_SEG 0xA800u | |
| #define GFX_BASE 0x0000u | |
| #define PAINT_OFF 0x6000u /* painted copy (ch/attr) in the shadow window */ | |
| #define KIND_OFF 0x7000u /* painted kinds */ | |
| #define BDA8(o) (*(u8 far *)MK_FP(0x40, (o))) | |
| #define BDA16(o) (*(u16 far *)MK_FP(0x40, (o))) | |
| -#define SHADOW ((u16 far *)MK_FP(0xB800, 0)) | |
| +#define SHADOW ((u16 far *)MK_FP(SHADOW_SEG, 0)) | |
| /* ---- VGA helpers ---- */ | |
| static void gcw(unsigned i, unsigned v) { outp(0x3CE, i); outp(0x3CF, v); } | |
| int cvis, cur_on, dirty_any; | |
| u16 cur[COLS], old[COLS]; | |
| u8 kd[COLS], ok[COLS], dr[COLS]; | |
| - u16 far *pt = (u16 far *)MK_FP(0xB800, PAINT_OFF); | |
| - u8 far *pk = (u8 far *)MK_FP(0xB800, KIND_OFF); | |
| + u16 far *pt = (u16 far *)MK_FP(SHADOW_SEG, PAINT_OFF); | |
| + u8 far *pk = (u8 far *)MK_FP(SHADOW_SEG, KIND_OFF); | |
| if (!text_active) return; | |
| if (!force && tick == last_tick) return; | |
| last_tick = tick; | |
| crtc(0x11, p); | |
| } | |
| outp(0x3C4, 2); outp(0x3C5, 0x0F); /* map mask: all planes */ | |
| - gcw(0, 0); gcw(1, 0); gcw(3, 0); gcw(4, 0); gcw(5, 0); gcw(6, 0x01); gcw(8, 0xFF); /* 128K aperture: A000 = picture, B800 = shadow */ | |
| - for (i = 0; i < COLS * ROWS; i++) { ((u16 far *)MK_FP(0xB800, PAINT_OFF))[i] = 0xFFFF; ((u8 far *)MK_FP(0xB800, KIND_OFF))[i] = 0xFF; } | |
| + gcw(0, 0); gcw(1, 0); gcw(3, 0); gcw(4, 0); gcw(5, 0); gcw(6, 0x05); gcw(8, 0xFF); /* 64K aperture at A0000: A000 = picture (0000-7CFF), A800 = shadow (8000-FFFF) */ | |
| + for (i = 0; i < COLS * ROWS; i++) { ((u16 far *)MK_FP(SHADOW_SEG, PAINT_OFF))[i] = 0xFFFF; ((u8 far *)MK_FP(SHADOW_SEG, KIND_OFF))[i] = 0xFF; } | |
| BDA8(0x49) = 3; BDA16(0x4A) = COLS; BDA16(0x4C) = 0x1000; BDA16(0x4E) = 0; | |
| BDA8(0x84) = ROWS - 1; BDA8(0x85) = 16; BDA16(0x60) = 0x0D0E; | |
| BDA16(0x10) = (BDA16(0x10) & ~0x30u) | 0x20; | |
| xms_ok = 1; | |
| save_vectors(); | |
| rom16 = (u8 far *)get_rom_font(); | |
| - for (i = 0; i < COLS * ROWS; i++) saved[i] = ((u16 far *)MK_FP(0xB800, 0))[i]; | |
| + for (i = 0; i < COLS * ROWS; i++) saved[i] = ((u16 far *)MK_FP(0xB800, 0))[i]; /* the REAL text screen before we switch to graphics */ | |
| crow = BDA8(0x51); ccol = BDA8(0x50); | |
| enter_text(); | |
| for (i = 0; i < COLS * ROWS; i++) SHADOW[i] = (saved[i] & 0xF000) ? (u16)((saved[i] & 0xFF) | 0x0700) : saved[i]; | |