;------------------------------------
;
; very simple screen-saver
; flat assembler version
;
;------------------------------------

org 100h
use16

  ; main code

	; fill pallete with black

	mov	di,buf
	mov	al,16
	mov	cx,64000
	rep	stosb

	; set video mode

	mov	ax,13h
	int	10h

	; set text mode

	mov	ax,1130h
	mov	bh,3
	int	10h

	; paint

  _loop:
	mov	di,buf
	mov	ax,[y]
	mov	bx,320
	mul	bx
	add	ax,[x]
	add	di,ax

	; text color is gold

	mov	ax,0A4A4h
	xor	bx,bx

  _next_ltr:
	mov	dh,8
	movzx	si,[bx+szSlogan]
	shl	si,3

  _ltr_row:
	mov	dl,80h

  _ltr_col:
	test	[es:bp+si],dl
	jz	@F
	mov	word [ds:di],ax
	mov	word [ds:di+320],ax
  @@:
	add	di,2
	shr	dl,1
	jnz	_ltr_col

	inc	si
	add	di,624
	dec	dh
	jne	_ltr_row

	sub	di,5104
	inc	bx
	cmp	bx,10 ; slogan length
	jb	_next_ltr

	cmp	[x],160 ; 200 - slogan length * 30
	jne	@F
	mov	[xinc],-1
	jmp	_add_x

  @@:
	cmp	[x],0
	jne	_add_x
	mov	[xinc],1

  _add_x:
	mov	ax,[xinc]
	add	[x],ax

	cmp	[y],184
	jne	@F
	mov	[yinc],-1
	jmp	_add_y

  @@:
	cmp	[y],0
	jne	_add_y
	mov	[yinc],1

  _add_y:
	mov	ax,[yinc]
	add	[y],ax

	; retrace

	mov	dx,03DAh

  @@:
	in	al,dx
	test	al,8
	jz	@B

	; paint only text

	push	es
	mov	ax,0a000h
	mov	es,ax
	xor	di,di
	mov	si,buf
	mov	cx,64000

  _scan:
	lodsb
	stosb
	cmp	al,16
	je	@F
	mov	al,16
  @@:
	mov	[ds:si-1],al
	dec	cx
	jne	_scan
	pop	es

	; exit only if escape is pressed

	in	al,60h
	dec	al
	jne	_loop

	; restore video mode

	mov	ax,3
	int	10h

	; out simple text and exit

	mov	dx,szAbout
	mov	ah,9
	int	21h
	int	20h

  ; constants

  szSlogan	db "i am saver"
  szAbout	db "Very simple screen-saver",24h
  x		dw 0
  y		dw 0
  xinc		dw 0
  yinc		dw 0
  buf		rb 64000 ; 320x200

; eof