Code: Select all
'' "HELLO.BAS" - ultimate "HELLO WORLD" program
'' (C) 2015-Jan-01 All fights reserved
'' For DOS (FreeDOS/EDR-DOS/...) and Win32 (ME/NT/10/XP/...)
'' Compile with FreeBASIC Compiler only !!!
'' Tests FBC efficiency - the (smallest possible) bloat of executables
'' Define "__USE_PRINT__" on the commandline ("-d") to use the PRINT
'' command (gives more bloat), otherwise job will be done most
'' efficiently natively through DPMI+BIOS or Win32 API
'' REM DOS BATttery file
'' FBD HELLO.BAS
'' REN HELLO.EXE HDE.EXE
'' FBD -d __USE_PRINT__ HELLO.BAS
'' REN HELLO.EXE HDP.EXE
'' REM Win32 BATttery file
'' FBW HELLO.BAS
'' REN HELLO.EXE HWE.EXE
'' FBW -d __USE_PRINT__ HELLO.BAS
'' REN HELLO.EXE HWP.EXE
'' -----------------------------
type UINT32 as UINTEGER
type UINT8 as UBYTE
'' -----------------------------
#if defined (__FB_DOS__)
#define __FB_GOTHIM__
Public Function __crt0_glob_function Alias "__crt0_glob_function" _
( ByVal arg As UByte Ptr ) As UByte Ptr Ptr
Return 0
End Function
#endif
#if defined (__FB_WIN32__)
#define __FB_GOTHIM__
Extern _CRT_glob Alias "_CRT_glob" As Integer
Dim Shared _CRT_glob As Integer = 0
Extern _dowildcard Alias "_dowildcard" As Long
Dim Shared _dowildcard As Long = 0
#endif
#if not defined (__FB_GOTHIM__)
#error "UNSUPPORTED TARGET"
#endif
#if defined (__FB_DOS__)
#if defined (__FB_WIN32__)
#error "YOU CAN'T DANCE AT 2 DIFFERENT PARTIES AT SAME TIME"
#endif
#endif
'' -----------------------------
#if not defined (__USE_PRINT__)
#if defined (__FB_WIN32__)
EXTERN "Windows"
DECLARE FUNCTION GetStdHandle (BYVAL AS UINT32) AS UINT32
DECLARE FUNCTION WriteFile (BYVAL AS UINT32, BYVAL AS UINT32, BYVAL _
AS UINT32, BYVAL AS UINT32, BYVAL AS UINT32) AS UINT32
END EXTERN
#endif
#endif
'' -----------------------------
#if not defined (__USE_PRINT__)
SUB PUTCH (BYVAL QQ8 AS UINT8)
ASM
#if defined (__FB_DOS__)
push ebx
mov al, [QQ8] '' Char in AL
mov ah, 14 '' $0E - "TTY" BIOS service
xor ebx, ebx '' MOVNTQ EBX, 0
int 16 '' INT $10 - BIOS screen stuff
pop ebx
#else
mov eax, 4294967285
push eax '' "-11" means "stdout"
call GetStdHandle
inc eax '' CMPNTQ EAX, $FFFF'FFFF
jz short consolesucks '' Console got shot by some gun geek ???
dec eax
mov dl, [QQ8]
push edx '' Char to write (EAX holds hendaye)
xor edx, edx '' MOVNTQ EDX, 0
push edx '' PUSHD 0 | Reserved UINT32 for output
mov ecx, esp '' Now points to the reserved UINT32
push edx '' Useless ZERO :-(
push ecx '' Output: number of chars written !!! :-D
inc edx '' MOVNTQ EDX, 1 | Size of text
push edx '' Size of text, no "$" no ZERO at the end ;-)
add ecx, 4 '' Now points to our "text", upper 24 bits are junk
push ecx '' Addr of our "text"
push eax '' Hendaye
call WriteFile
pop ecx '' Discard return value with written amount
pop ecx '' Discard PUSH'ed char too
consolesucks:
#endif
END ASM
END SUB '' PUTCH
#endif
'' -----------------------------
#if defined (__USE_PRINT__)
#if defined (__FB_DOS__)
? "Hello __USE_PRINT__ DOS"
#else
? "Hello __USE_PRINT__ Win32"
#endif
#else
PUTCH (72)
PUTCH (101)
PUTCH (108)
PUTCH (108)
PUTCH (111)
PUTCH (32) '' Space
#if defined (__FB_DOS__)
PUTCH (68) '' "D"
#else
PUTCH (87) '' "W"
#endif
PUTCH (13) '' CR
PUTCH (10) '' LF
#endif
'' -----------------------------
END
Code: Select all
HELLO.BAS 3'987
PS.BAS 735
HDE - Hello DOS most efficient
HDE0185.EXE 74'240
HDE0220.EXE 74'240
HDE0901.EXE 139'776
HDE1010.EXE 74'240 <- same size
HDP - Hello DOS using PRINT
HDP0185.EXE 83'456
HDP0220.EXE 83'456
HDP0901.EXE 152'576
HDP1010.EXE 82'944 <- smaller !!!
HWE - Hello Win32 most efficient
HWE0185.EXE 6'144
HWE0220.EXE 7'680
HWE0901.EXE 12'800
HWE1010.EXE 13'824 <- very bloated
HWE1010Q.EXE 14'369 (binutils from 0.22) <- silly bloat
HWP - Hello Win32 using PRINT
HWP0185.EXE 15'872
HWP0220.EXE 16'896
HWP0901.EXE 22'528
HWP1010.EXE 25'088 <- very bloated
HWP1010Q.EXE 26'145 (binutils from 0.22) <- silly bloat
PSD - PUTSMIL DOS
PSD0185.EXE 186'368
PSD0220.EXE 186'368
PSD0901.EXE 252'928
PSD1010.EXE 186'368 <- same size
PSW - PUTSMIL Win32
PSW0185.EXE 108'032
PSW0220.EXE 103'936
PSW0901.EXE 113'152
PSW1010.EXE 122'880 <- marginally bigger
PSW1010Q.EXE 124'449 (binutils from 0.22) <- silly bloat
FYI: good old binutils from 0.22 with FBC 1.01.0 do add
following 33 Octet's of garbage to end of Win32 binary:
"! .text.startup .text.unlikely "
http://freebasic.net/forum/viewtopic.php?t=22664 "EXE sizes"
http://freebasic.net/forum/viewtopic.php?t=11757 "The war on DGJPP bloat again | Helo word sizes | how to save"
Some tests about the recent 1.01.1 release:
- no spectacular changes observed in the DOS version (1.00.0 worked for me too), no DOS output bloat increase since 0.18.5 (see above)
- Win32 version runs on ME again (1.00.0 didn't), also graphics does (but banding effects), some increase of bloat (see above)
"changelog.txt" wrote:
remaining problems:- Win32 gfxlib2 did not process thread messages, causing problems with response to system hotkeys and potentially more
- Graphics DOS: can't create a screen that doesn't match the graphics card (for example 300x700) - more a missing feature than bug
- Graphics Win32: behaves badly under HX (keyboard dead) - I had expected this to get resolved by fix above, but no
- Graphics Win32: banding effects under ME only (not XP and HX) (maybe UNLOCK would help)
- Linker Win32 creates silly and bloated (see above) (still working) executables, if "ld.exe" replaced from version 0.22, using "as.exe" from 0.22 and "ld.exe" from 0.90.1 is OK
Not yet tested on CPU older than P3.
Conclusion: 1.01.0 seems to be a good release ... thanks to all developers.