;
;   DEBUG BOARD for APPLICATIONS and KERNEL DEVELOPMENT
;
;   See f63
;
;   Compile with FASM for Menuet
;
WRITE_LOG  equ 1

include 'lang.inc'

   use32
   org	  0x0
   db	  'MENUET01'		  ; 8 byte id
   dd	  0x01			  ; header version
   dd	  START 		  ; start of code
   dd	  I_END 		  ; size of image
   dd	  mem			; memory for app
   dd	  mem			; esp
   dd	  filename , 0x0	  ; I_Param , I_Icon
include '../../../macros.inc'
include '../../../debug.inc'
purge newline
MAXSTRINGS = 16
TMP = 80*(MAXSTRINGS+1)
;------------------------------------------------------------------------------
START:				; start of execution
	mov	edi,filename
	cmp	[edi],byte 0
	jnz	param
	mov	esi,default_filename
@@:
	lodsb
	stosb
	test	al,al
	jnz	@b
param:

; allow user to see messages written before start
;	mov	ecx,4096
;flush:
;	mcall	63,2
;	loop	flush

	mov	ecx,TMP
	xor	eax,eax
	mov	edi,[targ]
	rep	stosb

	mov	[tmp1],'x'
	mov	[tmp2],'x'

	mcall	14
	and	eax,0xffff0000
	sub	eax,399 shl 16
	add	eax,399
	mov	[xstart],eax
	mcall	48,3,sc,sizeof.system_colors
if WRITE_LOG
	mov	esi,filename
	call	CreateFile
end if
;------------------------------------------------------------------------------
red:
	call draw_window
;------------------------------------------------------------------------------
still:
	mcall	23,1		; wait here for event
	cmp	eax,1			; redraw request ?
	je	red

	cmp	eax,2			; key in buffer ?
	je	key

	cmp	eax,3			; button in buffer ?
	je	button

	mcall	63,2
	cmp	ebx,1
	jne	still

new_data:
if WRITE_LOG
	pusha
	mov	[tmp],al
	mov	edx,tmp
	mov	ecx,1
	mov	esi,filename
.write_to_logfile:
	call	WriteToFile
	cmp	eax,5
	jne	@f
	mov	esi,filename
	mov	[filepos],0
	call	CreateFile
	jnc	.write_to_logfile
@@:
	inc	[filepos]
	popa
end if
	mov	ebp,[targ]
.no4:
	cmp	al,13
	jne	no13
	and	[ebp-8],dword 0
	jmp	new_check
;------------------------------------------
no13:
	cmp	al,10
	jne	no10
	and	[ebp-8],dword 0
	inc	dword [ebp-4]
	cmp	[ebp-4],dword MAXSTRINGS
	jbe	.noypos
	mov	[ebp-4],dword MAXSTRINGS
	lea	esi,[ebp+80]
	mov	edi,ebp
	mov	ecx,80*(MAXSTRINGS)
	cld
	rep	movsb

	mov	esi,[ebp-4]
	imul	esi,80
	add	esi,[ebp-8]
	add	esi,ebp
	mov	ecx,80
	xor	al,al
	rep	stosb
.noypos:
	mov	[targ],text2
	and	[krnl_cnt],0
	jmp	new_check
;------------------------------------------
no10:
	cmp	ebp,text1
	je	add2
	mov	ecx,[krnl_cnt]
	cmp	al,[krnl_msg+ecx]
	jne	.noknl
	inc	[krnl_cnt]
	cmp	[krnl_cnt],4
	jne	new_check
	mov	[targ],text1
.noknl:
	mov	ebp,[targ]
	jecxz	.add
	push	eax
	mov	esi,krnl_msg
.l1:
	lodsb
	call	add_char
	loop	.l1
	pop	eax
.add:
	and	[krnl_cnt],0
add2:
	call	add_char

new_check:
	mcall	63,2
	cmp	ebx,1
	je	new_data
	call	draw_text
	jmp	still
;------------------------------------------------------------------------------
key:
	mcall	2
	cmp	ah,' '
	je	button.noclose
	jmp	still
;------------------------------------------------------------------------------
button:
	mcall	17	; get id
	cmp	ah,1		; button id=1 ?
	jne	.noclose
	or	eax,-1 		; close this program
	mcall
.noclose:
	xor	[vmode],1
	jmp	red
;------------------------------------------------------------------------------
add_char:
	push	esi
	mov	esi,[ebp-4]
	imul	esi,80
	add	esi,[ebp-8]
	mov	[ebp+esi],al
	inc	dword[ebp-8]
	cmp	dword[ebp-8],80
	jb	.ok
	mov	dword[ebp-8],79
.ok:
	pop	esi
	ret
;------------------------------------------------------------------------------
;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************
draw_window:
	mcall	12,1	; 1, start of draw
	xor	eax,eax		     ; function 0 : define and draw window
	mov	ecx,MAXSTRINGS*10+45	   ; [y start] *65536 + [y size]
;	mov	edx,[sc.work]		   ; color of work area RRGGBB,8->color gl
	mov	edx,0xffffff
	or	edx,0x14000000
	xor	esi,esi
	mcall	,[xstart],,,,title
	mov	ebx,296 shl 16+5*6
	mcall	8,,<5,12>,3,[sc.work]
	mov	edx,[vmode]
	lea	edx,[edx*4+duk]
	mcall	4,<300,8>,,,4
	call	draw_text
	mcall	12,2	; 2, end of draw
	ret
;------------------------------------------------------------------------------
draw_text:
	mov	ebx,15*65536+30	   ; draw info text with function 4
;	mov	ecx,[sc.work_text]
	xor	ecx,ecx
	or	ecx,0x40000000
;	mov	edi,[sc.work]
	mov	edi,0xffffff
	mov	edx,text1
	cmp	[vmode],0
	je	.kern
	mov	edx,text2
.kern:
	push	ebx ecx edx
	mcall	9,procinfo,-1
	mov	eax,[ebx+42]
	xor	edx,edx
	mov	ebx,6
	div	ebx
	pop	edx ecx ebx
	mov	esi,80
	cmp	eax,esi
	ja	@f
	mov	esi,eax
@@:
	cmp	esi,5
	ja	@f
	mov	esi,5
@@:
	sub	esi,4
	mov	eax,4
newline:
	mcall
	add	ebx,10
	add	edx,80
	cmp	[edx],byte 'x'
	jne	newline
	ret
;------------------------------------------------------------------------------
if WRITE_LOG
;********************************************
;*  input:  esi = pointer to the file name  *
;********************************************

CreateFile:
	pusha
	mov	dword [InfoStructure],2		; create file
	mov	dword [InfoStructure+4],0	; reserved
	mov	dword [InfoStructure+8],0	; reserved
	mov	dword [InfoStructure+12],0	; 0 bytes to write (just create)
	mov	dword [InfoStructure+16],0	; NULL data pointer (no data)
	mov	dword [InfoStructure+20],0	; reserved
	mov	dword [InfoStructure+21],esi	; pointer to the file name
	mcall	70, InfoStructure
	test	eax,eax
	jz	.out
	stc
.out:
	popa
	ret
;------------------------------------------------
;********************************************
;*  input:  esi = pointer to the file name  *
;*          edx = pointer to data buffer    *
;*          ecx = data length               *
;********************************************

WriteToFile:
	push	ebx
	mov	dword [InfoStructure],3		; write to file
	mov	eax,  [filepos]
	mov	dword [InfoStructure+4],eax	; lower position addr
	mov	dword [InfoStructure+8],0	; upper position addr (0 for FAT)
	mov	dword [InfoStructure+12],ecx	; number of bytes to write
	mov	dword [InfoStructure+16],edx	; pointer to data buffer
	mov	dword [InfoStructure+20],0	; reserved
	mov	dword [InfoStructure+21],esi	; pointer to the file name
	mcall	70, InfoStructure
	clc
	test	eax,eax
	jz	.out
	stc
.out:
	pop      ebx
	ret
;--------------------------------------------------
InfoStructure:
	dd 0x0	; subfunction number
	dd 0x0	; position in the file in bytes
	dd 0x0	; upper part of the position address
	dd 0x0	; number of bytes to read
	dd 0x0	; pointer to the buffer to write data
	db 0
	dd 0	; pointer to the filename

filepos	dd 0
default_filename db '/sys/boardlog.txt',0
tmp	db 0
end if
;------------------------------------------------------------------------------
krnl_msg db 'K : '
duk db 'KernUser'

; DATA AREA

; 11,11 > 0,-1
; 5,11  > 0,-1
if lang eq ru
 title	db '��᪠ �⫠��� � ᮮ�饭��',0
else if lang eq it
 title	db 'Notifiche e informazioni generiche per il debug',0
else if lang eq ge
 title	db 'Allgemeines debug- & nachrichtenboard',0
else
 title	db 'General debug & message board',0
end if
krnl_cnt	dd 0
vmode		dd 1
targ		dd text2
;------------------------------------------------------------------------------
I_END:
;------------------------------------------------------------------------------
offs	dd ?
flag	rb 1
	rd 2
;x1pos	dd ?
;y1pos	dd ?
text1	rb 80*(MAXSTRINGS+1)
tmp1	db ?
	rd 2
;x2pos	dd ?
;y2pos	dd ?
text2	rb 80*(MAXSTRINGS+1)
tmp2	db ?
xstart	dd ?

sc system_colors

i_end:

filename	rb 256
;------------------------------------------------------------------------------
align 4
procinfo:
	rb 1024
;------------------------------------------------------------------------------
align 4
stackbuf	rb 2000h
;------------------------------------------------------------------------------
mem: