diff options
Diffstat (limited to 'utils.h')
| -rw-r--r-- | utils.h | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -0,0 +1,60 @@ +/* + * CHU - driver for CH375 in disk mode + * Copyright (C) 2024 Javier S. Pedro + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + + +#ifndef UTILS_H +#define UTILS_H + +#include <stdint.h> + +static inline __segment get_cs(void); +#pragma aux get_cs = "mov ax, cs" value [ax] modify exact [] nomemory + +static inline __segment get_ds(void); +#pragma aux get_ds = "mov ax, ds" value [ax] modify exact [] nomemory + +static void load_ds_from_cs(void); +#pragma aux load_ds_from_cs = \ + "push cs" \ + "pop ds" \ + __modify __exact [] + +#define SWAPNC_32(w) (\ + (((w) & 0x000000FFUL) << 24) |\ + (((w) & 0x0000FF00UL) << 8) |\ + (((w) & 0x00FF0000UL) >> 8) |\ + (((w) & 0xFF000000UL) >> 24)\ + ) + +static inline uint16_t div(uint32_t dividend, uint16_t divisor); +#pragma aux div = \ + "div bx" \ + __parm [dx ax] [bx] \ + __value [ax] \ + __modify __exact [dx ax] + +static inline uint32_t mul(uint16_t a, uint16_t b); +#pragma aux mul = \ + "mul dx" \ + __parm [ax] [dx] \ + __value [dx ax] \ + __modify __exact [dx ax] + + + +#endif // UTILS_H |
