; =====================================================================================================================
; = Asm2Html - ASM to HTML Converter - (C) 1999 Teraphy / Phrozen Crew - http://teraphy.cjb.net
; =====================================================================================================================

.486
.model		flat, stdcall
; -------- Include Files and Libraries --------------------------------------------------------------------------------
include		windows.inc
include		elib32.inc
includelib	elib32.lib
include		kernel32.inc
includelib	kernel32.lib
include		user32.inc
includelib	user32.lib
; -------- Initialised Data -------------------------------------------------------------------------------------------
.data
PrgVersion	EQU <"1.3">
szUsage		db CrLf
		db "Asm2Html [Options] Infile Outfile [@SetupScheme]", CrLf
		db CrLf
		db "/Bxxxx        Set Background Color", CrLf
		db "/Txxxx        Set Text Color", CrLf
		db "/Cxxxx        Set Comment Color", CrLf
		db "/CENTER       Center in document", CrLf
		db "/NOCENTER     Do not Center in document", CrLf, 0
szBackDef	db "WHITE",0
szTextDef	db "BLACK",0
szCommentDef	db "RED",0
szFontStart	db "<FONT COLOR=%s>",0
sFontEnd	db "</FONT>"
sFontEndSize	EQU $-sFontEnd
szFileHeader	db "<!-- Asm2Html v", PrgVersion, "  (C) 1999 Teraphy <http://teraphy.cjb.net> -->", CrLf
		db "<HTML><HEAD><TITLE>%s</TITLE></HEAD><BODY BGCOLOR=%s TEXT=%s>",CrLf,0
sCenterHead	db "<CENTER><TABLE BORDER=0>",CrLf
sCenterHeadSize	EQU $-sCenterHead
sPreHead	db "<PRE>"
sPreEnd		db "</PRE>"
sCenterEnd	db "</CENTER></TABLE>"
sCenterEndSize	EQU $-sCenterEnd
sFileEnding	db "</BODY></HTML>"
sFileEndingSize	EQU $-sFileEnding
sCrLf		db CrLf
sLT		db "&lt;"
sGT		db "&gt;"
sAMP		db "&amp;"
szINI		db "asm2html.ini",0
szSectionDef	db "standard",0
szKeyBack	db "backcolor",0
szKeyText	db "textcolor",0
szKeyComment	db "commentcolor",0
szKeyCenter	db "center",0
szCenter	db "/CENTER",0
szNoCenter	db "/NOCENTER",0
bCenter		db -1
bBackCol	db 0
bTextCol	db 0
bComCol		db 0
szFalse		db "false",0
szTrue		db "true",0
; -------- UnInitialised Data -----------------------------------------------------------------------------------------
.data?
szSection	db 50 dup (?)
szBackColor	db 50 dup (?)
szTextColor	db 50 dup (?)
szCommentColor	db 50 dup (?)
szBuffer	db 512 dup (?)
szBuffer2	db 128 dup (?)
szInFile	db 128 dup (?)
szOutFile	db 128 dup (?)
hInFile		dd ?
hOutFile	dd ?
dSize		dd ?
hMem		dd ?
dLines		dd ?
bNoComment	db ?
bytes_read	dd ?
; -------- Program Code -----------------------------------------------------------------------------------------------
.code
Start:
; -------- Print Message ----------------------------------------------------------------------------------------------
	PrintM	"Asm2Html v", PrgVersion, "    (C) 1999 Teraphy / PhrozenCrew",CrLf
; -------- Get Defaults -----------------------------------------------------------------------------------------------
	invoke	lstrcpy, addr szBackColor, addr szBackDef
	invoke	lstrcpy, addr szTextColor, addr szTextDef
	invoke	lstrcpy, addr szCommentColor, addr szCommentDef
	invoke	lstrcpy, addr szSection, addr szSectionDef
	mov	byte ptr szBuffer2, 0
; -------- Get Arguments ----------------------------------------------------------------------------------------------
	invoke	GetNrOfArgs
	.IF	eax < 2
		invoke	Print, addr szUsage
		Exit	-1
	.ENDIF
	xor	ebx,ebx
	.WHILE ebx != eax
		push	eax
		inc	ebx
		invoke	GetCLineArg, addr szBuffer, ebx
		.IF byte ptr szBuffer == '/'
			invoke	StrUpr, addr szBuffer, addr szBuffer
			invoke	lstrcmp, addr szBuffer, addr szCenter
			.IF eax == 0
				mov	bCenter, 1
				jmp	@F
			.ENDIF
			invoke	lstrcmp, addr szBuffer, addr szNoCenter
			.IF eax == 0
				mov	bCenter, 0
				jmp	@F
			.ENDIF
			.IF word ptr szBuffer == 'B/'
				invoke	lstrcpy, addr szBackColor, addr szBuffer+2
				mov	bBackCol, 1
			.ELSEIF word ptr szBuffer == 'T/'
				invoke	lstrcpy, addr szTextColor, addr szBuffer+2
				mov	bTextCol, 1
			.ELSEIF word ptr szBuffer == 'C/'
				invoke	lstrcpy, addr szCommentColor, addr szBuffer+2
				mov	bComCol, 1
			.ENDIF
			@@:
		.ELSEIF byte ptr szBuffer == '@'
			invoke	lstrcpy, addr szSection, addr szBuffer+1
		.ELSEIF byte ptr szBuffer2 == 0
			invoke	lstrcpy, addr szInFile, addr szBuffer
			mov	byte ptr szBuffer2, 1
		.ELSE
			invoke	lstrcpy, addr szOutFile, addr szBuffer
		.ENDIF
		pop	eax
	.ENDW
; -------- Get Setup from INI File ------------------------------------------------------------------------------------
	.IF bBackCol == 0
		invoke	GetPrivateProfileString, addr szSection, addr szKeyBack, addr szBackColor, \
						 addr szBackColor, 49, addr szINI
	.ENDIF
	.IF bTextCol == 0
		invoke	GetPrivateProfileString, addr szSection, addr szKeyText, addr szTextColor, \
						 addr szTextColor, 49, addr szINI
	.ENDIF
	.IF bComCol == 0
		invoke	GetPrivateProfileString, addr szSection, addr szKeyComment, addr szCommentColor, \
						 addr szCommentColor, 49, addr szINI
	.ENDIF
	invoke	GetPrivateProfileString, addr szSection, addr szKeyCenter, addr szCenter, \
					 addr szBuffer2, 49, addr szINI
	.IF byte ptr szBuffer2 == 't' && bCenter == -1
		mov	bCenter, 1
	.ELSEIF bCenter == -1
		mov	bCenter, 0
	.ENDIF
; -------- Write Setup to INI File ------------------------------------------------------------------------------------
	invoke	WritePrivateProfileString, addr szSection, addr szKeyBack, addr szBackColor, addr szINI
	invoke	WritePrivateProfileString, addr szSection, addr szKeyText, addr szTextColor, addr szINI
	invoke	WritePrivateProfileString, addr szSection, addr szKeyComment, addr szCommentColor, addr szINI
	.IF bCenter == 0
		invoke	WritePrivateProfileString, addr szSection, addr szKeyCenter, addr szFalse, addr szINI
	.ELSE
		invoke	WritePrivateProfileString, addr szSection, addr szKeyCenter, addr szTrue, addr szINI
	.ENDIF
; -------- Open Input File --------------------------------------------------------------------------------------------
	invoke	CreateFile, addr szInFile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
	.IF eax == INVALID_HANDLE_VALUE
		PrintM	"Error: Input File Not Found"
		Exit	-1
	.ENDIF
	mov	hInFile, eax
; -------- Create Output File -----------------------------------------------------------------------------------------
	invoke	CreateFile, addr szOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
	.IF eax == INVALID_HANDLE_VALUE
		PrintM	"Error: Could'nt Create Output File"
		Exit	-1
	.ENDIF
	mov	hOutFile,eax
; -------- Allocate Memory --------------------------------------------------------------------------------------------
	invoke	GetFileSize, hInFile, NULL
	mov	dSize, eax
	inc	eax
	invoke	GlobalAlloc, GPTR, eax
	mov	hMem, eax
; -------- Read Input File --------------------------------------------------------------------------------------------
	invoke	ReadFile, hInFile, hMem, dSize, addr bytes_read, NULL
	mov	eax,hMem
	add	eax,dSize
	mov	byte ptr [eax],0
; -------- Write File Header ------------------------------------------------------------------------------------------
	invoke	wsprintf, addr szBuffer, addr szFileHeader, addr szInFile, addr szBackColor, addr szTextColor
	invoke	lstrlen, addr szBuffer
	invoke	WriteFile, hOutFile, addr szBuffer, eax, addr bytes_read, NULL
	.IF bCenter == 1
		invoke	WriteFile, hOutFile, addr sCenterHead, sCenterHeadSize, addr bytes_read, NULL
	.ENDIF
	invoke	WriteFile, hOutFile, addr sPreHead, 5, addr bytes_read, NULL
; -------- Process File -----------------------------------------------------------------------------------------------
	invoke	GetNrOfLines, hMem
	mov	dLines, eax
	mov	ebx,1
	.WHILE ebx != dLines
		mov	bNoComment, 0
		push	ebx
		invoke	ReadLine, addr szBuffer, hMem, ebx
		mov	esi, offset szBuffer
		@@:
			lodsb
			.IF al == 0
				jmp	@F
			.ELSEIF al == ';' && bNoComment == 0
				invoke	wsprintf, addr szBuffer2, addr szFontStart, addr szCommentColor
				invoke	lstrlen, addr szBuffer2
				invoke	WriteFile, hOutFile, addr szBuffer2, eax, addr bytes_read, NULL
				dec	esi
				invoke	lstrlen, esi
				invoke	WriteFile, hOutFile, esi, eax, addr bytes_read, NULL
				invoke	WriteFile, hOutFile, addr sFontEnd, sFontEndSize, addr bytes_read, NULL
				inc	esi
				jmp	@F
			.ELSEIF al == '<'
				invoke	WriteFile, hOutFile, addr sLT, 4, addr bytes_read, NULL
			.ELSEIF al == '>'
				invoke	WriteFile, hOutFile, addr sGT, 4, addr bytes_read, NULL
			.ELSEIF al == '&'
				invoke	WriteFile, hOutFile, addr sAMP, 5, addr bytes_read, NULL
			.ELSEIF al == 22h || al == 27h
				.IF bNoComment == 0
					inc	bNoComment
				.ELSE
					mov	bNoComment, 0
				.ENDIF
				jmp	@WriteChar
			.ELSE
			@WriteChar:
				mov	byte ptr szBuffer2, al
				invoke	WriteFile, hOutFile, addr szBuffer2, 1, addr bytes_read, NULL
			.ENDIF
			jmp	@B
		@@:
		invoke	WriteFile, hOutFile, addr sCrLf, 2, addr bytes_read, NULL
		pop	ebx
		inc	ebx
	.ENDW
; -------- Write File Ending & Free Memory ----------------------------------------------------------------------------
	invoke	GlobalFree, hMem
	invoke	WriteFile, hOutFile, addr sPreEnd, 6, addr bytes_read, NULL
	.IF bCenter == 1
		invoke	WriteFile, hOutFile, addr sCenterEnd, sCenterEndSize, addr bytes_read, NULL
	.ENDIF
	invoke	WriteFile, hOutFile, addr sFileEnding, sFileEndingSize, addr bytes_read, NULL
; -------- Show Complete Message, Close Handles and Exit --------------------------------------------------------------
	PrintM	"Completed Sucessfully!"
	invoke	CloseHandle, hInFile
	invoke	CloseHandle, hOutFile
	Exit	0
end Start