diff options
| author | mrb0nk500 <b0nk@b0nk.xyz> | 2020-12-04 15:20:28 -0500 | 
|---|---|---|
| committer | mrb0nk500 <b0nk@b0nk.xyz> | 2020-12-04 15:20:28 -0500 | 
| commit | 96393257a43ac52f2b911594d106741245dec5f0 (patch) | |
| tree | 6b9d11c50ed3cd1920444c4dd0ee4027814ef4bd /programs/sub-suite/shift_line.c | |
| parent | 83ce1151ee1f06ae6b1c5c1018cc2489494e5ea4 (diff) | |
- Started work on writing the new version of the
  assembler.
- Did alot of stuff in the emulator.
- Did alot of stuff in the SuB Suite.
Diffstat (limited to 'programs/sub-suite/shift_line.c')
| -rw-r--r-- | programs/sub-suite/shift_line.c | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/programs/sub-suite/shift_line.c b/programs/sub-suite/shift_line.c new file mode 100644 index 0000000..255d21b --- /dev/null +++ b/programs/sub-suite/shift_line.c @@ -0,0 +1,79 @@ +#include <stdint.h> + +const uint8_t bits[8] = { +	0x80, +	0x40, +	0x20, +	0x10, +	0x08, +	0x04, +	0x02, +	0x01 +}; + +int maxcol = 80; +int scr_str = 0; +int scr_row = 0; +int scr_col = 0; +uint8_t bitabl[16]; + +uint8_t bitpos(unsigned int row, uint8_t *mask) { +	uint8_t bit = row & 7; +	*mask = bits[bit]; +	return row >> 3; + +} + +void setbit(unsigned int row) { +	uint8_t mask; +	uint8_t byte = bitpos(row, &mask); +	bitabl[byte] |= mask; +} + +void clrbit(unsigned int row) { +	uint8_t mask; +	uint8_t byte = bitpos(row, &mask); +	bitabl[byte] &= ~mask; +} + +int find_end(char *str, int start) { +	int i; +	for (i = start; str[i]; i++); +	return i; +} + +void shift_line(char *str, int cursor, int left) { +	/*int cursor = ((scr_row+scr_str)*maxcol)+scr_col;*/ +	int end = find_end(str, cursor); +	if (left) { +		int i = end-1; +		int j = end; +		for (; i > cursor; i--, j--) { +			if (i < 0) { +				i = 0; +				str[i] = 0; +				break; +			} +			str[j] = str[i]; +			str[i] = 0; + +		} +		/*str[i+1] = (!str[i+1]) ? ' ' : str[i+1];*/ +		end = find_end(str, i+2); +		/*str[i+1] = (str[i+1] == ' ') ? 0 : str[i+1];*/ +		if ((end/maxcol) > scr_row) { +			setbit(end/maxcol); +		} +	} else { +		int i = cursor; +		int j = cursor-1; +		for (; str[i]; i++, j++) { +			str[j] = str[i]; +			str[i] = 0; +		} +		end = find_end(str, i); +		if ((end % maxcol) == 0 && (end/maxcol) > scr_row) { +			clrbit(end/maxcol); +		} +	} +} | 
