git @ Cat's Eye Technologies BefOS / master src / kernel / buffedit.s
master

Tree @master (Download .tar.gz)

buffedit.s @masterraw · history · blame

;--- BEGIN ---------------------------------------------------;

;--- CONSTANTS -----------------------------------------------;

;--- DATA ----------------------------------------------------;

SEGMENT	.data

bufptr:		dw 0000h	; current byte in the current page
lastmove:	dw BufRight	; last direction cursor moved

;--- BSS -----------------------------------------------------;

SEGMENT	.bss

;--- CODE ----------------------------------------------------;

SEGMENT	.text

		;;--------------------------------------------;
		;; Retrieve the value of the currently selected
		;; byte in the page buffer.
		;; cl: * -> byte from buffer
		;; di: * -> GARBAGE
ReadByte:	mov	di, [bufptr]
		mov	cl, [cbuffer + di]
		ret


		;;--------------------------------------------;
		;; Poke a byte into the current position in
		;; the page buffer and display it on screen.
		;; cl: byte to poke ->
		;; si: * -> position on screen
		;; ch: * -> attribute on screen
		;; bx: * -> GARBAGE
WriteByte:	mov	si, [bufptr]
		mov	[cbuffer + si], cl
		mov	bx, si
		shl	bx, 1
		add	bx, [hoffs]
		mov	si, bx
		mov	ch, 71h		; TODO - get from colour buffer
		mov	[es:si], cx
		ret


BufHome:	mov	[bufptr], word 0
		jmp	MoveCursor


Advance:	mov	ax, [lastmove]
		jmp	ax



BufRight:	mov	[lastmove], word BufRight
		;	FALLTHROUGH
BufHopRight:	inc	word [bufptr]
		mov	ax, 2000
		mov	bx, [hoffs]
		shr	bx, 1
		sub	ax, bx
		cmp	[bufptr], ax
		jne	.Return
		mov	[bufptr], word 0
.Return:	jmp	MoveCursor


BufLeft:	mov	[lastmove], word BufLeft
		;	FALLTHROUGH
BufHopLeft:	dec	word [bufptr]
		cmp	word [bufptr], 0ffffh
		jne	.Return
		mov	ax, 2000
		mov	bx, [hoffs]
		shr	bx, 1
		sub	ax, bx
		dec	ax
		mov	[bufptr], ax
.Return:	jmp	MoveCursor


BufUp:		mov	[lastmove], word BufUp
		;	FALLTHROUGH
BufHopUp:	sub	word [bufptr], 80
		cmp	word [bufptr], 0
		jge	.Return
		mov	ax, 2000
		mov	bx, [hoffs]
		shr	bx, 1
		sub	ax, bx
		add	[bufptr], ax
.Return:	jmp	MoveCursor


BufDown:	mov	[lastmove], word BufDown
		;	FALLTHROUGH
BufHopDown:	add	[bufptr], word 80
		mov	ax, 2000
		mov	bx, [hoffs]
		shr	bx, 1
		sub	ax, bx
		cmp	[bufptr], ax
		jl	.Return
		sub	[bufptr], ax
.Return:	jmp	MoveCursor


		; just like BufDown except invokes a scroll if on bottom line.
LineFeed:	add	[bufptr], word 80
		mov	ax, 2000
		mov	bx, [hoffs]
		shr	bx, 1
		sub	ax, bx
		cmp	[bufptr], ax
		jl	.Return
		sub	[bufptr], word 80	; back to where we once belonged

		; get top line of screen = hoffs/160
		mov	ax, bx
		mov	bx, 80
		xor	dx, dx		; Zero high!
		div	bx

		xor	cx, cx
		mov	ch, al

		; scroll area on screen

		mov	ax, 0601h
		mov	bh, 27h		; todo: better attribute... need var
		mov	dx, 184fh	; (79,24)
		int	10h		; scroll it

.Return:	jmp	MoveCursor


LeftMarg:	mov	ax, [bufptr]
		mov	bx, 80
		xor	dx, dx		; Zero high!
		div	bx

		xor	ah, ah
		shl	ax, 4
		mov	bx, ax
		shl	bx, 2
		add	ax, bx

		mov	[bufptr], ax

		jmp	MoveCursor


		; MoveCursor - moves cursor to reflect bufptr.
		;   ax=DESTROYED
		;   bx=DESTROYED
		;   dx=DESTROYED
MoveCursor:	xor	dx, dx
		mov	ax, [bufptr]
		mov	bx, [hoffs]
		shr	bx, 1
		add	ax, bx			; TODO: abstract
		mov	bx, 80
		div	bx

		mov	dh, al

		mov	ah, 02h
		mov	bh, 00h

		int	10h			; cursor gotoxy
		jmp	UpdateCurByte

MoveCrsr:	mov	[bufptr], cx
		jmp	MoveCursor

		;;--------------------------------------------;
		;; Find a given byte in the buffer.
		;; Searches from bufptr backwards.
		;; al: byte to seek ->
		;; bx: * -> position in buffer or $ffff if not found
BufFind:	mov	bx, [bufptr]
.Top:		cmp	[cbuffer + bx], al
		je	.Done
		cmp	bx, 0
		je	.NotFound
		dec	bx
		jmp	.Top
.NotFound:	mov	bx, 0ffffh
.Done:		ret

;--- END -----------------------------------------------------;