diff --git a/programs/develop/libraries/newlib/cmd1.sed b/programs/develop/libraries/newlib/cmd1.sed new file mode 100644 index 0000000000..fd6ec99944 --- /dev/null +++ b/programs/develop/libraries/newlib/cmd1.sed @@ -0,0 +1 @@ +s|[^ ][A-Za-z0-9_]*|_&,'&',\\| \ No newline at end of file diff --git a/programs/develop/libraries/newlib/cmd2.sed b/programs/develop/libraries/newlib/cmd2.sed new file mode 100644 index 0000000000..8c262a24c5 --- /dev/null +++ b/programs/develop/libraries/newlib/cmd2.sed @@ -0,0 +1 @@ +s|\|| \ No newline at end of file diff --git a/programs/develop/libraries/newlib/crt/crt3.c b/programs/develop/libraries/newlib/crt/crt3.c index cae70a9e92..b058119e69 100644 --- a/programs/develop/libraries/newlib/crt/crt3.c +++ b/programs/develop/libraries/newlib/crt/crt3.c @@ -38,6 +38,8 @@ void __main (){}; void* get_entry_point(void *raw); +void _pei386_runtime_relocator (void){}; + void __attribute__((noreturn)) __crt_startup (void) { @@ -45,11 +47,12 @@ __crt_startup (void) void *img; void __attribute__((noreturn)) (*entry)(void *img); +// _pei386_runtime_relocator(); + img = load_libc(); if(img == NULL) { - asm("int3"); asm ("int $0x40" ::"a"(-1)); }; diff --git a/programs/develop/libraries/newlib/crt/crtdll.c b/programs/develop/libraries/newlib/crt/crtdll.c index dcec5b3dda..c4aad958d5 100644 --- a/programs/develop/libraries/newlib/crt/crtdll.c +++ b/programs/develop/libraries/newlib/crt/crtdll.c @@ -22,7 +22,7 @@ struct app_hdr int reserved; void *__idata_start; void *__idata_end; - void (*main)(int argc, char **argv, char **envp); + int (*main)(int argc, char **argv, char **envp); }; int _argc; @@ -117,9 +117,9 @@ libc_crt_startup (void *libc_base) _argv = arg; - header->main(_argc, _argv, NULL); + retval = header->main(_argc, _argv, NULL); done: - _exit (retval); + exit (retval); } diff --git a/programs/develop/libraries/newlib/pe/crtloader.c b/programs/develop/libraries/newlib/pe/crtloader.c index dac296d9ee..4063598039 100644 --- a/programs/develop/libraries/newlib/pe/crtloader.c +++ b/programs/develop/libraries/newlib/pe/crtloader.c @@ -39,7 +39,7 @@ static inline int IsPowerOf2(uint32_t val) return (val & (val - 1)) == 0; } -int validate_pe(void *raw, size_t raw_size, int is_exec) +int validate_pe(void *raw, size_t raw_size) { PIMAGE_DOS_HEADER dos; PIMAGE_NT_HEADERS32 nt; @@ -63,15 +63,9 @@ int validate_pe(void *raw, size_t raw_size, int is_exec) if(nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) return 0; - if(is_exec && (nt->FileHeader.Characteristics & IMAGE_FILE_DLL)) - return 0; - if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) return 0; - if( is_exec && nt->OptionalHeader.ImageBase != 0) - return 0; - if(nt->OptionalHeader.SectionAlignment < 4096) { if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment) @@ -214,7 +208,7 @@ void* load_libc() // printf("libc.dll raw %p, size %d\n", raw_img, raw_size); - if(validate_pe(raw_img, raw_size, 0) != 0) + if(validate_pe(raw_img, raw_size) != 0) { // printf("invalide libc.dll\n"); img_base = create_image(raw_img); diff --git a/programs/develop/libraries/newlib/pe/loader.c b/programs/develop/libraries/newlib/pe/loader.c index 009143ad54..4f0e69fb9e 100644 --- a/programs/develop/libraries/newlib/pe/loader.c +++ b/programs/develop/libraries/newlib/pe/loader.c @@ -686,7 +686,7 @@ module_t* load_library(const char *name) memcpy(path+dllpath->path_len, libname, len); path[len+dllpath->path_len]=0; - printf("%s\n", path); +// printf("%s\n", path); img_base = load_lib_internal(path); diff --git a/programs/develop/libraries/newlib/pe/pe.h b/programs/develop/libraries/newlib/pe/pe.h index b32b894fc7..edd886538b 100644 --- a/programs/develop/libraries/newlib/pe/pe.h +++ b/programs/develop/libraries/newlib/pe/pe.h @@ -106,12 +106,12 @@ typedef struct _IMAGE_NT_HEADERS typedef struct _IMAGE_SECTION_HEADER { - BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; + BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; - DWORD VirtualSize; - } Misc; + DWORD VirtualSize; + } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; diff --git a/programs/develop/libraries/newlib/sdk/app.inc b/programs/develop/libraries/newlib/sdk/app.inc new file mode 100644 index 0000000000..1bd89fe739 --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/app.inc @@ -0,0 +1,283 @@ + + +include 'import32.inc' +include 'proc32.inc' + +use32 +org 0x0 + + db 'MENUET02' + dd 0x01 + dd __start + dd __iend + dd __bssend + dd __stack + dd __cmdline + dd __pgmname + dd 0x0 + dd __idata_start + dd __idata_end + dd main + +IMAGE_DOS_SIGNATURE equ 0x5A4D +IMAGE_NT_SIGNATURE equ 0x00004550 +IMAGE_FILE_MACHINE_I386 equ 0x014c +IMAGE_NT_OPTIONAL_HDR32_MAGIC equ 0x10B +IMAGE_NT_HEADERS32_SIZE equ 0xF8 + + +__start: + +.e_lfanew equ 0x3C + +.FileHeader.NumberOfSections equ 0x06 + +.OptionalHeader.ImageBase equ 0x34 +.SectionAlignment equ 0x38 +.FileAlignment equ 0x3C + +.OptionalHeader.SizeOfImage equ 0x50 +.OptionalHeader.SizeOfHeaders equ 0x54 + +.VirtualAddress equ 0x0C +.SizeOfRawData equ 0x10 +.PointerToRawData equ 0x14 + +.OptionalHeader.RelocDataDirectory.VirtualAddress equ 0xA0 +.OptionalHeader.RelocDataDirectory.Size equ 0xA4 + +.SizeOfBlock equ 0x04 + + + mov eax, 68 + mov ebx, 12 + mov ecx, STACK_SIZE + add ecx, 4095 + and ecx, -4096 + int 0x40 + test eax, eax + jz .exit + + add ecx, eax + mov [fs:8], eax + mov [fs:12], ecx + mov esp, ecx + + sub esp, 1024 + mov eax, 9 + mov ebx, esp + mov ecx, -1 + int 0x40 + + mov eax, [ebx+30] + mov [fs:0], eax + add esp, 1024 + + mov eax, 68 + mov ebx, 27 + mov ecx, libc_path + int 0x40 + test eax, eax + jz .exit + + push edx + push eax + +.validate_pe: + + cmp edx, 0x3F + jbe .exit + cmp word [eax], IMAGE_DOS_SIGNATURE + jne .exit + + mov edx, [eax+.e_lfanew] + test edx, edx + jz .exit + + add edx, eax ;edx = nt header + jb .exit + + cmp dword [edx], IMAGE_NT_SIGNATURE + jnz .exit + + cmp word [edx+0x04], IMAGE_FILE_MACHINE_I386 + jnz .exit + + cmp word [edx+0x18], IMAGE_NT_OPTIONAL_HDR32_MAGIC + jnz .exit + + mov ecx, [edx+.SectionAlignment] + cmp ecx, 4095 + ja .l1 + + cmp ecx, [edx+.FileAlignment] + jne .exit + + jmp @F +.l1: + cmp ecx, [edx+.FileAlignment] + jb .exit +@@: + test ecx, ecx + jz .exit + + lea eax, [ecx-1] + test ecx, eax + jnz .exit + + mov ecx, [edx+.FileAlignment] + test ecx, ecx + jz .exit + + lea ebx, [ecx-1] + test ecx, ebx + jnz .exit + + cmp word [edx+.FileHeader.NumberOfSections], 96 + ja .exit + +.create_image: + + mov ecx, [edx+.OptionalHeader.SizeOfImage] + mov eax, 68 + mov ebx, 12 + int 0x40 + + mov ebp, eax + test eax, eax + jz .exit_2 + + mov ecx, [edx+.OptionalHeader.SizeOfHeaders] + mov esi, [esp] + mov edi, eax + shr ecx, 2 ;copy header + rep movsd + + lea eax, [edx+IMAGE_NT_HEADERS32_SIZE] ;eax = MAGE_SECTION_HEADER + movzx ebx, word [edx+.FileHeader.NumberOfSections] + test ebx, ebx + jz @F + +.copy_loop: + mov ecx, [eax+.SizeOfRawData] + test ecx, ecx + jz .next_section + + mov esi, [eax+.PointerToRawData] + test esi, esi + jz .next_section + + add esi, [esp] + mov edi, [eax+.VirtualAddress] + add edi, ebp + shr ecx, 2 + rep movsd + ;copy section +.next_section: + add eax, 0x28 + dec ebx + jnz .copy_loop +@@: + push edx + + mov esi, [edx+.OptionalHeader.RelocDataDirectory.Size] + test esi, esi + jz .call_libc + + mov ebx, ebp + sub ebx, [edx+.OptionalHeader.ImageBase] ;delta + mov edx, [edx+.OptionalHeader.RelocDataDirectory.VirtualAddress] + lea ecx, [ebp+edx] ;IMAGE_BASE_RELOCATION + mov eax, [ecx+.SizeOfBlock] + test eax, eax + jz .unmap_relocs + + mov esi, ebx + shr esi, 16 + push esi +align 4 +.loop_block: + sub eax, 8 + lea edx, [ecx+8] ;entry + shr eax, 1 + jz .next_block + lea edi, [ecx+eax*2+8] ;last entry +align 4 +.loop_reloc: + + mov si, [edx] + mov eax, esi + and eax, 0FFFh + add eax, [ecx] ;offset + shr si, 12 ;reloc type + dec si + jnz @F + +.type_1: + mov esi, [esp] + add [eax+ebp], si + jmp .next_entry +@@: + dec si + jnz @F + +.type_2: + add [eax+ebp], bx + jmp .next_entry +@@: + dec si + jnz .next_entry + +.type_3: + add [eax+ebp], ebx +.next_entry: + add edx, 2 + cmp edx, edi + jne .loop_reloc +.next_block: + add ecx, [ecx+.SizeOfBlock] + mov eax, [ecx+.SizeOfBlock] + test eax, eax + jnz .loop_block + + add esp, 4 + pop edx + mov esi, [edx+.OptionalHeader.RelocDataDirectory.Size] + mov edx, [edx+.OptionalHeader.RelocDataDirectory.VirtualAddress] + +.unmap_relocs: + mov ebx, 26 + mov eax, 68 + mov ecx, ebp + int 0x40 + +.call_libc: + + push ebp + mov edx, [ebp+0x3C] + add ebp, [ebp+edx+0x28] + + call ebp + +.exit_2: +.exit: + or eax, -1 + int 0x40 + +libc_path db '/kolibrios/lib/libc.dll',0 + + + + + + + + + + + + + + + + diff --git a/programs/develop/libraries/newlib/sdk/hello.asm b/programs/develop/libraries/newlib/sdk/hello.asm new file mode 100644 index 0000000000..bfd3ac3bdc --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/hello.asm @@ -0,0 +1,30 @@ + +STACK_SIZE equ 4096 + +include "app.inc" + +align 8 +main: + cinvoke _printf, msg_hello + ret + +msg_hello db 'Hello world!',0x0D,0x0A,0 + +align 16 +__idata_start: + + library libc,'libc.dll' + +include 'libc.inc' + + + +__idata_end: + +__iend: + +__cmdline: rb 256 +__pgmname: rb 1024 + rb 16 +__stack: +__bssend: diff --git a/programs/develop/libraries/newlib/sdk/import32.inc b/programs/develop/libraries/newlib/sdk/import32.inc new file mode 100644 index 0000000000..5c86f7227b --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/import32.inc @@ -0,0 +1,68 @@ + +; Macroinstructions for making import section + +macro library [name,string] + { common + import.data: + forward + local _label + if defined name#.redundant + if ~ name#.redundant + dd name#.lookup,0,0, _label, name#.address + end if + end if + name#.referred = 1 + common + dd 0,0,0,0,0 + forward + if defined name#.redundant + if ~ name#.redundant + _label db string,0 + rb $ and 1 + end if + end if } + +macro import name,[label,string] + { common + rb (- $) and 3 + if defined name#.referred + name#.lookup: + forward + if used label + if string eqtype '' + local _label + dd _label + else + dd 80000000h + string + end if + end if + common + if $ > name#.lookup + name#.redundant = 0 + dd 0 + else + name#.redundant = 1 + end if + name#.address: + forward + if used label + if string eqtype '' + label dd _label + else + label dd 80000000h + string + end if + end if + common + if ~ name#.redundant + dd 0 + end if + forward + if used label & string eqtype '' + _label dw 0 + db string,0 + rb $ and 1 + end if + common + end if } + +macro api [name] {} diff --git a/programs/develop/libraries/newlib/sdk/libc.inc b/programs/develop/libraries/newlib/sdk/libc.inc new file mode 100644 index 0000000000..452ab1fa00 --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/libc.inc @@ -0,0 +1,674 @@ +import libc,\ + __Balloc,'_Balloc',\ + __Bfree,'_Bfree',\ + __Exit,'_Exit',\ + ___ChkTTYIOMode,'__ChkTTYIOMode',\ + ___GetIOMode,'__GetIOMode',\ + ___SetIOMode,'__SetIOMode',\ + ___SetIOMode_nogrow,'__SetIOMode_nogrow',\ + ___allocPOSIXHandle,'__allocPOSIXHandle',\ + ___any_on,'__any_on',\ + ___ascii_mbtowc,'__ascii_mbtowc',\ + ___ascii_wctomb,'__ascii_wctomb',\ + ___assert_func,'__assert_func',\ + ___b2d,'__b2d',\ + ___call_exitprocs,'__call_exitprocs',\ + ___copybits,'__copybits',\ + ___cpu_features_init,'__cpu_features_init',\ + ___ctype_load_locale,'__ctype_load_locale',\ + ___ctype_ptr__,'__ctype_ptr__',\ + ___d2b,'__d2b',\ + ___dorand48,'__dorand48',\ + ___dtoa,'__dtoa',\ + ___emutls_get_address,'__emutls_get_address',\ + ___emutls_register_common,'__emutls_register_common',\ + ___errno,'__errno',\ + ___fp_lock_all,'__fp_lock_all',\ + ___fp_unlock_all,'__fp_unlock_all',\ + ___fpclassifyd,'__fpclassifyd',\ + ___fpclassifyf,'__fpclassifyf',\ + ___freePOSIXHandle,'__freePOSIXHandle',\ + ___getOSHandle,'__getOSHandle',\ + ___get_current_ctype_locale,'__get_current_ctype_locale',\ + ___gethex,'__gethex',\ + ___gettzinfo,'__gettzinfo',\ + ___growPOSIXHandles,'__growPOSIXHandles',\ + ___grow_iomode,'__grow_iomode',\ + ___gthread_once,'__gthread_once',\ + ___hexdig_init,'__hexdig_init',\ + ___hexnan,'__hexnan',\ + ___hi0bits,'__hi0bits',\ + ___i2b,'__i2b',\ + ___ieee754_acos,'__ieee754_acos',\ + ___ieee754_acosf,'__ieee754_acosf',\ + ___ieee754_acosh,'__ieee754_acosh',\ + ___ieee754_acoshf,'__ieee754_acoshf',\ + ___ieee754_asin,'__ieee754_asin',\ + ___ieee754_asinf,'__ieee754_asinf',\ + ___ieee754_atan2,'__ieee754_atan2',\ + ___ieee754_atan2f,'__ieee754_atan2f',\ + ___ieee754_atanh,'__ieee754_atanh',\ + ___ieee754_atanhf,'__ieee754_atanhf',\ + ___ieee754_cosh,'__ieee754_cosh',\ + ___ieee754_coshf,'__ieee754_coshf',\ + ___ieee754_exp,'__ieee754_exp',\ + ___ieee754_expf,'__ieee754_expf',\ + ___ieee754_fmod,'__ieee754_fmod',\ + ___ieee754_fmodf,'__ieee754_fmodf',\ + ___ieee754_gamma_r,'__ieee754_gamma_r',\ + ___ieee754_gammaf_r,'__ieee754_gammaf_r',\ + ___ieee754_hypot,'__ieee754_hypot',\ + ___ieee754_hypotf,'__ieee754_hypotf',\ + ___ieee754_j0,'__ieee754_j0',\ + ___ieee754_j0f,'__ieee754_j0f',\ + ___ieee754_j1,'__ieee754_j1',\ + ___ieee754_j1f,'__ieee754_j1f',\ + ___ieee754_jn,'__ieee754_jn',\ + ___ieee754_jnf,'__ieee754_jnf',\ + ___ieee754_lgamma_r,'__ieee754_lgamma_r',\ + ___ieee754_lgammaf_r,'__ieee754_lgammaf_r',\ + ___ieee754_log,'__ieee754_log',\ + ___ieee754_log10,'__ieee754_log10',\ + ___ieee754_log10f,'__ieee754_log10f',\ + ___ieee754_logf,'__ieee754_logf',\ + ___ieee754_pow,'__ieee754_pow',\ + ___ieee754_powf,'__ieee754_powf',\ + ___ieee754_rem_pio2,'__ieee754_rem_pio2',\ + ___ieee754_rem_pio2f,'__ieee754_rem_pio2f',\ + ___ieee754_remainder,'__ieee754_remainder',\ + ___ieee754_remainderf,'__ieee754_remainderf',\ + ___ieee754_scalb,'__ieee754_scalb',\ + ___ieee754_scalbf,'__ieee754_scalbf',\ + ___ieee754_sinh,'__ieee754_sinh',\ + ___ieee754_sinhf,'__ieee754_sinhf',\ + ___ieee754_sqrt,'__ieee754_sqrt',\ + ___ieee754_sqrtf,'__ieee754_sqrtf',\ + ___ieee754_y0,'__ieee754_y0',\ + ___ieee754_y0f,'__ieee754_y0f',\ + ___ieee754_y1,'__ieee754_y1',\ + ___ieee754_y1f,'__ieee754_y1f',\ + ___ieee754_yn,'__ieee754_yn',\ + ___ieee754_ynf,'__ieee754_ynf',\ + ___infinity,'__infinity',\ + ___infinityf,'__infinityf',\ + ___infinityld,'__infinityld',\ + ___init_mode,'__init_mode',\ + ___io_mode,'__io_mode',\ + ___isinfd,'__isinfd',\ + ___isinff,'__isinff',\ + ___isnand,'__isnand',\ + ___isnanf,'__isnanf',\ + ___kernel_cos,'__kernel_cos',\ + ___kernel_cosf,'__kernel_cosf',\ + ___kernel_rem_pio2,'__kernel_rem_pio2',\ + ___kernel_rem_pio2f,'__kernel_rem_pio2f',\ + ___kernel_sin,'__kernel_sin',\ + ___kernel_sinf,'__kernel_sinf',\ + ___kernel_standard,'__kernel_standard',\ + ___kernel_tan,'__kernel_tan',\ + ___kernel_tanf,'__kernel_tanf',\ + ___libc_getenv,'__libc_getenv',\ + ___lo0bits,'__lo0bits',\ + ___locale_charset,'__locale_charset',\ + ___locale_cjk_lang,'__locale_cjk_lang',\ + ___locale_mb_cur_max,'__locale_mb_cur_max',\ + ___locale_msgcharset,'__locale_msgcharset',\ + ___lshift,'__lshift',\ + ___malloc_lock,'__malloc_lock',\ + ___malloc_unlock,'__malloc_unlock',\ + ___mb_cur_max,'__mb_cur_max',\ + ___mbtowc,'__mbtowc',\ + ___mcmp,'__mcmp',\ + ___mdiff,'__mdiff',\ + ___mlocale_changed,'__mlocale_changed',\ + ___mprec_bigtens,'__mprec_bigtens',\ + ___mprec_tens,'__mprec_tens',\ + ___mprec_tinytens,'__mprec_tinytens',\ + ___multadd,'__multadd',\ + ___multiply,'__multiply',\ + ___mutex_lock,'__mutex_lock',\ + ___nlocale_changed,'__nlocale_changed',\ + ___pow5mult,'__pow5mult',\ + ___ratio,'__ratio',\ + ___register_exitproc,'__register_exitproc',\ + ___s2b,'__s2b',\ + ___sccl,'__sccl',\ + ___sclose,'__sclose',\ + ___seofread,'__seofread',\ + ___setOSHandle,'__setOSHandle',\ + ___set_handles,'__set_handles',\ + ___sflags,'__sflags',\ + ___sflush_r,'__sflush_r',\ + ___sfmoreglue,'__sfmoreglue',\ + ___sfp,'__sfp',\ + ___sfp_lock_acquire,'__sfp_lock_acquire',\ + ___sfp_lock_release,'__sfp_lock_release',\ + ___sfvwrite_r,'__sfvwrite_r',\ + ___shrink_iomode,'__shrink_iomode',\ + ___signbitd,'__signbitd',\ + ___signbitf,'__signbitf',\ + ___sigtramp,'__sigtramp',\ + ___sigtramp_r,'__sigtramp_r',\ + ___sinit,'__sinit',\ + ___sinit_lock_acquire,'__sinit_lock_acquire',\ + ___sinit_lock_release,'__sinit_lock_release',\ + ___smakebuf_r,'__smakebuf_r',\ + ___sprint_r,'__sprint_r',\ + ___sread,'__sread',\ + ___srefill_r,'__srefill_r',\ + ___srget,'__srget',\ + ___srget_r,'__srget_r',\ + ___sseek,'__sseek',\ + ___ssprint_r,'__ssprint_r',\ + ___ssrefill_r,'__ssrefill_r',\ + ___ssvfiscanf_r,'__ssvfiscanf_r',\ + ___ssvfscanf_r,'__ssvfscanf_r',\ + ___strtok_r,'__strtok_r',\ + ___submore,'__submore',\ + ___svfiscanf,'__svfiscanf',\ + ___svfiscanf_r,'__svfiscanf_r',\ + ___svfscanf,'__svfscanf',\ + ___svfscanf_r,'__svfscanf_r',\ + ___swbuf,'__swbuf',\ + ___swbuf_r,'__swbuf_r',\ + ___swrite,'__swrite',\ + ___swsetup_r,'__swsetup_r',\ + ___thread_startup,'__thread_startup',\ + ___tz_lock,'__tz_lock',\ + ___tz_unlock,'__tz_unlock',\ + ___tzcalc_limits,'__tzcalc_limits',\ + ___ulp,'__ulp',\ + ___wctomb,'__wctomb',\ + __assert,'_assert',\ + __atoi_r,'_atoi_r',\ + __atol_r,'_atol_r',\ + __buf_findstr,'_buf_findstr',\ + __calloc_r,'_calloc_r',\ + __cleanup,'_cleanup',\ + __cleanup_r,'_cleanup_r',\ + __close_r,'_close_r',\ + __ctype_,'_ctype_',\ + __daylight,'_daylight',\ + __diprintf_r,'_diprintf_r',\ + __dprintf_r,'_dprintf_r',\ + __dtoa_r,'_dtoa_r',\ + __exit,'_exit',\ + __f_atan2,'_f_atan2',\ + __f_atan2f,'_f_atan2f',\ + __f_exp,'_f_exp',\ + __f_expf,'_f_expf',\ + __f_frexp,'_f_frexp',\ + __f_frexpf,'_f_frexpf',\ + __f_ldexp,'_f_ldexp',\ + __f_ldexpf,'_f_ldexpf',\ + __f_llrint,'_f_llrint',\ + __f_llrintf,'_f_llrintf',\ + __f_llrintl,'_f_llrintl',\ + __f_log,'_f_log',\ + __f_log10,'_f_log10',\ + __f_log10f,'_f_log10f',\ + __f_logf,'_f_logf',\ + __f_lrint,'_f_lrint',\ + __f_lrintf,'_f_lrintf',\ + __f_lrintl,'_f_lrintl',\ + __f_pow,'_f_pow',\ + __f_powf,'_f_powf',\ + __f_rint,'_f_rint',\ + __f_rintf,'_f_rintf',\ + __f_rintl,'_f_rintl',\ + __f_tan,'_f_tan',\ + __f_tanf,'_f_tanf',\ + __fclose_r,'_fclose_r',\ + __fdopen_r,'_fdopen_r',\ + __fflush_r,'_fflush_r',\ + __fgetc_r,'_fgetc_r',\ + __fgets_r,'_fgets_r',\ + __findenv,'_findenv',\ + __fiprintf_r,'_fiprintf_r',\ + __fiscanf_r,'_fiscanf_r',\ + __fopen_r,'_fopen_r',\ + __fprintf_r,'_fprintf_r',\ + __fputc_r,'_fputc_r',\ + __fputs_r,'_fputs_r',\ + __fputwc_r,'_fputwc_r',\ + __fread_r,'_fread_r',\ + __free_r,'_free_r',\ + __freopen_r,'_freopen_r',\ + __fscanf_r,'_fscanf_r',\ + __fseek_r,'_fseek_r',\ + __fseeko_r,'_fseeko_r',\ + __fstat_r,'_fstat_r',\ + __ftell_r,'_ftell_r',\ + __ftello_r,'_ftello_r',\ + __fwalk,'_fwalk',\ + __fwalk_reent,'_fwalk_reent',\ + __fwrite_r,'_fwrite_r',\ + __gettimeofday,'_gettimeofday',\ + __gettimeofday_r,'_gettimeofday_r',\ + __global_impure_ptr,'_global_impure_ptr',\ + __grow_handles,'_grow_handles',\ + __init_signal,'_init_signal',\ + __init_signal_r,'_init_signal_r',\ + __isatty,'_isatty',\ + __isatty_r,'_isatty_r',\ + __kill_r,'_kill_r',\ + __localeconv_r,'_localeconv_r',\ + __lseek_r,'_lseek_r',\ + __malloc_r,'_malloc_r',\ + __mbrtowc_r,'_mbrtowc_r',\ + __mbtowc_r,'_mbtowc_r',\ + __mktm_r,'_mktm_r',\ + __mprec_log10,'_mprec_log10',\ + __open_r,'_open_r',\ + __printf_r,'_printf_r',\ + __putc_r,'_putc_r',\ + __putchar_r,'_putchar_r',\ + __puts_r,'_puts_r',\ + __raise_r,'_raise_r',\ + __read,'_read',\ + __read_r,'_read_r',\ + __realloc_r,'_realloc_r',\ + __remove_r,'_remove_r',\ + __rename_r,'_rename_r',\ + __seed48_r,'_seed48_r',\ + __setlocale_r,'_setlocale_r',\ + __sfread_r,'_sfread_r',\ + __signal_r,'_signal_r',\ + __siprintf_r,'_siprintf_r',\ + __sniprintf_r,'_sniprintf_r',\ + __snprintf_r,'_snprintf_r',\ + __sprintf_r,'_sprintf_r',\ + __srand48_r,'_srand48_r',\ + __sscanf_r,'_sscanf_r',\ + __strdup_r,'_strdup_r',\ + __strerror_r,'_strerror_r',\ + __strndup_r,'_strndup_r',\ + __strtod_r,'_strtod_r',\ + __strtol_r,'_strtol_r',\ + __strtoll_r,'_strtoll_r',\ + __strtoul_r,'_strtoul_r',\ + __strtoull_r,'_strtoull_r',\ + __sungetc_r,'_sungetc_r',\ + __svfiprintf_r,'_svfiprintf_r',\ + __svfprintf_r,'_svfprintf_r',\ + __system_r,'_system_r',\ + __tempnam_r,'_tempnam_r',\ + __times_r,'_times_r',\ + __timezone,'_timezone',\ + __tls_map,'_tls_map',\ + __tmpfile_r,'_tmpfile_r',\ + __tmpnam_r,'_tmpnam_r',\ + __towctrans_r,'_towctrans_r',\ + __tzname,'_tzname',\ + __ungetc_r,'_ungetc_r',\ + __user_strerror,'_user_strerror',\ + __vasniprintf_r,'_vasniprintf_r',\ + __vasnprintf_r,'_vasnprintf_r',\ + __vdiprintf_r,'_vdiprintf_r',\ + __vdprintf_r,'_vdprintf_r',\ + __vfiprintf_r,'_vfiprintf_r',\ + __vfiscanf_r,'_vfiscanf_r',\ + __vfprintf_r,'_vfprintf_r',\ + __vfscanf_r,'_vfscanf_r',\ + __vscanf_r,'_vscanf_r',\ + __vsnprintf_r,'_vsnprintf_r',\ + __vsprintf_r,'_vsprintf_r',\ + __vsscanf_r,'_vsscanf_r',\ + __wcrtomb_r,'_wcrtomb_r',\ + __wctomb_r,'_wctomb_r',\ + __wctrans_r,'_wctrans_r',\ + __wctype_r,'_wctype_r',\ + __write_r,'_write_r',\ + _abort,'abort',\ + _abs,'abs',\ + _acos,'acos',\ + _acosf,'acosf',\ + _acosh,'acosh',\ + _acoshf,'acoshf',\ + _asctime,'asctime',\ + _asctime_r,'asctime_r',\ + _asin,'asin',\ + _asinf,'asinf',\ + _asinh,'asinh',\ + _asinhf,'asinhf',\ + _atan,'atan',\ + _atan2,'atan2',\ + _atan2f,'atan2f',\ + _atanf,'atanf',\ + _atanh,'atanh',\ + _atanhf,'atanhf',\ + _atof,'atof',\ + _atoi,'atoi',\ + _atol,'atol',\ + _bsearch,'bsearch',\ + _calloc,'calloc',\ + _cbrt,'cbrt',\ + _cbrtf,'cbrtf',\ + _ceil,'ceil',\ + _ceilf,'ceilf',\ + _clearerr,'clearerr',\ + _clock,'clock',\ + _close,'close',\ + _copysign,'copysign',\ + _copysignf,'copysignf',\ + _cos,'cos',\ + _cosf,'cosf',\ + _cosh,'cosh',\ + _coshf,'coshf',\ + _create_file,'create_file',\ + _create_image,'create_image',\ + _create_thread,'create_thread',\ + _ctime,'ctime',\ + _ctime_r,'ctime_r',\ + _debugwrite,'debugwrite',\ + _delete_file,'delete_file',\ + _difftime,'difftime',\ + _diprintf,'diprintf',\ + _div,'div',\ + _dprintf,'dprintf',\ + _drem,'drem',\ + _dremf,'dremf',\ + _entry,'entry',\ + _envz_get,'envz_get',\ + _erf,'erf',\ + _erfc,'erfc',\ + _erfcf,'erfcf',\ + _erff,'erff',\ + _exit,'exit',\ + _exp,'exp',\ + _exp10,'exp10',\ + _exp10f,'exp10f',\ + _exp2,'exp2',\ + _exp2f,'exp2f',\ + _expf,'expf',\ + _expm1,'expm1',\ + _expm1f,'expm1f',\ + _fabs,'fabs',\ + _fabsf,'fabsf',\ + _fclose,'fclose',\ + _fdim,'fdim',\ + _fdimf,'fdimf',\ + _fdopen,'fdopen',\ + _fflush,'fflush',\ + _fgetc,'fgetc',\ + _fgets,'fgets',\ + _fileno,'fileno',\ + _finite,'finite',\ + _finitef,'finitef',\ + _fiprintf,'fiprintf',\ + _fiscanf,'fiscanf',\ + _floor,'floor',\ + _floorf,'floorf',\ + _fma,'fma',\ + _fmaf,'fmaf',\ + _fmax,'fmax',\ + _fmaxf,'fmaxf',\ + _fmin,'fmin',\ + _fminf,'fminf',\ + _fmod,'fmod',\ + _fmodf,'fmodf',\ + _fopen,'fopen',\ + _fprintf,'fprintf',\ + _fputc,'fputc',\ + _fputs,'fputs',\ + _fputwc,'fputwc',\ + _fread,'fread',\ + _free,'free',\ + _freopen,'freopen',\ + _frexp,'frexp',\ + _frexpf,'frexpf',\ + _fscanf,'fscanf',\ + _fseek,'fseek',\ + _fseeko,'fseeko',\ + _fstat,'fstat',\ + _ftell,'ftell',\ + _ftello,'ftello',\ + _fwrite,'fwrite',\ + _gamma,'gamma',\ + _gamma_r,'gamma_r',\ + _gammaf,'gammaf',\ + _gammaf_r,'gammaf_r',\ + _get_entry_point,'get_entry_point',\ + _get_fileinfo,'get_fileinfo',\ + _get_proc_address,'get_proc_address',\ + _getenv,'getenv',\ + _gettimeofday,'gettimeofday',\ + _gmtime,'gmtime',\ + _gmtime_r,'gmtime_r',\ + _hypot,'hypot',\ + _hypotf,'hypotf',\ + _ilogb,'ilogb',\ + _ilogbf,'ilogbf',\ + _infinity,'infinity',\ + _infinityf,'infinityf',\ + _init_global_reent,'init_global_reent',\ + _init_loader,'init_loader',\ + _init_reent,'init_reent',\ + _isalnum,'isalnum',\ + _isalpha,'isalpha',\ + _isascii,'isascii',\ + _isblank,'isblank',\ + _iscntrl,'iscntrl',\ + _isdigit,'isdigit',\ + _isgraph,'isgraph',\ + _isinf,'isinf',\ + _isinff,'isinff',\ + _islower,'islower',\ + _isnan,'isnan',\ + _isnanf,'isnanf',\ + _isprint,'isprint',\ + _ispunct,'ispunct',\ + _isspace,'isspace',\ + _isupper,'isupper',\ + _iswalnum,'iswalnum',\ + _iswalpha,'iswalpha',\ + _iswblank,'iswblank',\ + _iswcntrl,'iswcntrl',\ + _iswctype,'iswctype',\ + _iswdigit,'iswdigit',\ + _iswgraph,'iswgraph',\ + _iswlower,'iswlower',\ + _iswprint,'iswprint',\ + _iswpunct,'iswpunct',\ + _iswspace,'iswspace',\ + _iswupper,'iswupper',\ + _iswxdigit,'iswxdigit',\ + _isxdigit,'isxdigit',\ + _j0,'j0',\ + _j0f,'j0f',\ + _j1,'j1',\ + _j1f,'j1f',\ + _jn,'jn',\ + _jnf,'jnf',\ + _ldexp,'ldexp',\ + _ldexpf,'ldexpf',\ + _lgamma,'lgamma',\ + _lgamma_r,'lgamma_r',\ + _lgammaf,'lgammaf',\ + _lgammaf_r,'lgammaf_r',\ + _libc_crt_startup,'libc_crt_startup',\ + _link_app,'link_app',\ + _link_image,'link_image',\ + _llrint,'llrint',\ + _llrintf,'llrintf',\ + _llrintl,'llrintl',\ + _llround,'llround',\ + _llroundf,'llroundf',\ + _load_library,'load_library',\ + _loader_env,'loader_env',\ + _localeconv,'localeconv',\ + _localtime,'localtime',\ + _localtime_r,'localtime_r',\ + _log,'log',\ + _log10,'log10',\ + _log10f,'log10f',\ + _log1p,'log1p',\ + _log1pf,'log1pf',\ + _log2,'log2',\ + _log2f,'log2f',\ + _logb,'logb',\ + _logbf,'logbf',\ + _logf,'logf',\ + _longjmp,'longjmp',\ + _lrint,'lrint',\ + _lrintf,'lrintf',\ + _lrintl,'lrintl',\ + _lround,'lround',\ + _lroundf,'lroundf',\ + _lseek,'lseek',\ + _malloc,'malloc',\ + _matherr,'matherr',\ + _mbrtowc,'mbrtowc',\ + _mbtowc,'mbtowc',\ + _memalign,'memalign',\ + _memchr,'memchr',\ + _memcmp,'memcmp',\ + _memcpy,'memcpy',\ + _memmove,'memmove',\ + _memset,'memset',\ + _mktime,'mktime',\ + _modf,'modf',\ + _modff,'modff',\ + _nan,'nan',\ + _nanf,'nanf',\ + _nearbyint,'nearbyint',\ + _nearbyintf,'nearbyintf',\ + _nextafter,'nextafter',\ + _nextafterf,'nextafterf',\ + _open,'open',\ + _path_list,'path_list',\ + _pow,'pow',\ + _pow10,'pow10',\ + _pow10f,'pow10f',\ + _powf,'powf',\ + _printf,'printf',\ + _putc,'putc',\ + _putchar,'putchar',\ + _puts,'puts',\ + _qsort,'qsort',\ + _raise,'raise',\ + _rand,'rand',\ + _rand_r,'rand_r',\ + _read,'read',\ + _read_file,'read_file',\ + _realloc,'realloc',\ + _remainder,'remainder',\ + _remainderf,'remainderf',\ + _remove,'remove',\ + _remquo,'remquo',\ + _remquof,'remquof',\ + _rename,'rename',\ + _rint,'rint',\ + _rintf,'rintf',\ + _rintl,'rintl',\ + _round,'round',\ + _roundf,'roundf',\ + _scalb,'scalb',\ + _scalbf,'scalbf',\ + _scalbln,'scalbln',\ + _scalblnf,'scalblnf',\ + _scalbn,'scalbn',\ + _scalbnf,'scalbnf',\ + _seed48,'seed48',\ + _set_file_size,'set_file_size',\ + _setjmp,'setjmp',\ + _setlocale,'setlocale',\ + _setvbuf,'setvbuf',\ + _signal,'signal',\ + _significand,'significand',\ + _significandf,'significandf',\ + _sin,'sin',\ + _sincos,'sincos',\ + _sincosf,'sincosf',\ + _sinf,'sinf',\ + _sinh,'sinh',\ + _sinhf,'sinhf',\ + _siprintf,'siprintf',\ + _sniprintf,'sniprintf',\ + _snprintf,'snprintf',\ + _sprintf,'sprintf',\ + _sqrt,'sqrt',\ + _sqrtf,'sqrtf',\ + _srand,'srand',\ + _srand48,'srand48',\ + _sscanf,'sscanf',\ + _stpcpy,'stpcpy',\ + _stpncpy,'stpncpy',\ + _strcasecmp,'strcasecmp',\ + _strcasestr,'strcasestr',\ + _strcat,'strcat',\ + _strchr,'strchr',\ + _strcmp,'strcmp',\ + _strcoll,'strcoll',\ + _strcpy,'strcpy',\ + _strcspn,'strcspn',\ + _strdup,'strdup',\ + _strerror,'strerror',\ + _strftime,'strftime',\ + _strlen,'strlen',\ + _strncasecmp,'strncasecmp',\ + _strncat,'strncat',\ + _strncmp,'strncmp',\ + _strncpy,'strncpy',\ + _strndup,'strndup',\ + _strnlen,'strnlen',\ + _strpbrk,'strpbrk',\ + _strrchr,'strrchr',\ + _strsep,'strsep',\ + _strspn,'strspn',\ + _strstr,'strstr',\ + _strtod,'strtod',\ + _strtof,'strtof',\ + _strtok,'strtok',\ + _strtok_r,'strtok_r',\ + _strtol,'strtol',\ + _strtoll,'strtoll',\ + _strtoul,'strtoul',\ + _strtoull,'strtoull',\ + _strupr,'strupr',\ + _system,'system',\ + _tan,'tan',\ + _tanf,'tanf',\ + _tanh,'tanh',\ + _tanhf,'tanhf',\ + _tempnam,'tempnam',\ + _tgamma,'tgamma',\ + _tgammaf,'tgammaf',\ + _time,'time',\ + _tls_alloc,'tls_alloc',\ + _tmpfile,'tmpfile',\ + _tmpnam,'tmpnam',\ + _toascii,'toascii',\ + _tolower,'tolower',\ + _toupper,'toupper',\ + _towctrans,'towctrans',\ + _towlower,'towlower',\ + _towupper,'towupper',\ + _trunc,'trunc',\ + _truncf,'truncf',\ + _ungetc,'ungetc',\ + _user_alloc,'user_alloc',\ + _validate_pe,'validate_pe',\ + _vasniprintf,'vasniprintf',\ + _vasnprintf,'vasnprintf',\ + _vdiprintf,'vdiprintf',\ + _vdprintf,'vdprintf',\ + _vfiprintf,'vfiprintf',\ + _vfiscanf,'vfiscanf',\ + _vfprintf,'vfprintf',\ + _vfscanf,'vfscanf',\ + _vscanf,'vscanf',\ + _vsnprintf,'vsnprintf',\ + _vsprintf,'vsprintf',\ + _vsscanf,'vsscanf',\ + _wcrtomb,'wcrtomb',\ + _wctrans,'wctrans',\ + _wctype,'wctype',\ + _write,'write',\ + _write_file,'write_file',\ + _y0,'y0',\ + _y0f,'y0f',\ + _y1,'y1',\ + _y1f,'y1f',\ + _yn,'yn',\ + _ynf,'ynf' diff --git a/programs/develop/libraries/newlib/sdk/proc32.inc b/programs/develop/libraries/newlib/sdk/proc32.inc new file mode 100644 index 0000000000..762826cbbb --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/proc32.inc @@ -0,0 +1,301 @@ + +; Macroinstructions for defining and calling procedures + +macro stdcall proc,[arg] ; directly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call proc } + +macro invoke proc,[arg] ; indirectly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call [proc] } + +macro ccall proc,[arg] ; directly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call proc + if size@ccall + add esp,size@ccall + end if } + +macro cinvoke proc,[arg] ; indirectly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call [proc] + if size@ccall + add esp,size@ccall + end if } + +macro proc [args] ; define procedure + { common + match name params, args> + \{ define@proc name, \{ prologue name,flag,parmbytes,localbytes,reglist \} + virtual at parmbase@proc + match =,args, params \{ defargs@proc args \} + match =args@proc args, args@proc params \{ defargs@proc args \} + parmbytes = $-(parmbase@proc) + end virtual + name # % = parmbytes/4 + all@vars equ + current = 0 + macro locals + \{ virtual at localbase@proc+current + macro label def \\{ match . type,def> \\\{ deflocal@proc .,label, \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + macro finish@proc + \{ localbytes = current + match close:reglist, close@proc: \\{ close name,flag,parmbytes,localbytes,reglist \\} + end if \} } + +macro defargs@proc [arg] + { common + if ~ arg eq + forward + local ..arg,current@arg + match argname:type, arg + \{ current@arg equ argname + label ..arg type + argname equ ..arg + if qqword eq type + dd ?,?,?,?,?,?,?,? + else if dqword eq type + dd ?,?,?,? + else if tbyte eq type + dd ?,?,? + else if qword eq type | pword eq type + dd ?,? + else + dd ? + end if \} + match =current@arg,current@arg + \{ current@arg equ arg + arg equ ..arg + ..arg dd ? \} + common + args@proc equ current@arg + forward + restore current@arg + common + end if } + +macro deflocal@proc name,def,[val] { name def val } + +macro deflocal@proc name,def,[val] + { common + match vars, all@vars \{ all@vars equ all@vars, \} + all@vars equ all@vars name + forward + local ..var,..tmp + ..var def val + match =?, val \{ ..tmp equ \} + match any =?, val \{ ..tmp equ \} + match any (=?), val \{ ..tmp equ \} + match =label, def \{ ..tmp equ \} + match tmp : value, ..tmp : val + \{ tmp: end virtual + initlocal@proc ..var,def value + virtual at tmp\} + common + match first rest, ..var, \{ name equ first \} } + +struc label type { label . type } + +macro initlocal@proc name,def + { virtual at name + def + size@initlocal = $ - name + end virtual + position@initlocal = 0 + while size@initlocal > position@initlocal + virtual at name + def + if size@initlocal - position@initlocal < 2 + current@initlocal = 1 + load byte@initlocal byte from name+position@initlocal + else if size@initlocal - position@initlocal < 4 + current@initlocal = 2 + load word@initlocal word from name+position@initlocal + else + current@initlocal = 4 + load dword@initlocal dword from name+position@initlocal + end if + end virtual + if current@initlocal = 1 + mov byte [name+position@initlocal],byte@initlocal + else if current@initlocal = 2 + mov word [name+position@initlocal],word@initlocal + else + mov dword [name+position@initlocal],dword@initlocal + end if + position@initlocal = position@initlocal + current@initlocal + end while } + +macro endp + { purge ret,locals,endl + finish@proc + purge finish@proc + restore regs@proc + match all,args@proc \{ restore all \} + restore args@proc + match all,all@vars \{ restore all \} } + +macro local [var] + { common + locals + forward done@local equ + match varname[count]:vartype, var + \{ match =BYTE, vartype \\{ varname rb count + restore done@local \\} + match =WORD, vartype \\{ varname rw count + restore done@local \\} + match =DWORD, vartype \\{ varname rd count + restore done@local \\} + match =PWORD, vartype \\{ varname rp count + restore done@local \\} + match =QWORD, vartype \\{ varname rq count + restore done@local \\} + match =TBYTE, vartype \\{ varname rt count + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + rq count*2 + restore done@local \\} + match =QQWORD, vartype \\{ label varname qqword + rq count*4 + restore done@local \\} + match =XWORD, vartype \\{ label varname xword + rq count*2 + restore done@local \\} + match =YWORD, vartype \\{ label varname yword + rq count*4 + restore done@local \\} + match , done@local \\{ virtual + varname vartype + end virtual + rb count*sizeof.\#vartype + restore done@local \\} \} + match :varname:vartype, done@local:var + \{ match =BYTE, vartype \\{ varname db ? + restore done@local \\} + match =WORD, vartype \\{ varname dw ? + restore done@local \\} + match =DWORD, vartype \\{ varname dd ? + restore done@local \\} + match =PWORD, vartype \\{ varname dp ? + restore done@local \\} + match =QWORD, vartype \\{ varname dq ? + restore done@local \\} + match =TBYTE, vartype \\{ varname dt ? + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + dq ?,? + restore done@local \\} + match =QQWORD, vartype \\{ label varname qqword + dq ?,?,?,? + restore done@local \\} + match =XWORD, vartype \\{ label varname xword + dq ?,? + restore done@local \\} + match =YWORD, vartype \\{ label varname yword + dq ?,?,?,? + restore done@local \\} + match , done@local \\{ varname vartype + restore done@local \\} \} + match ,done@local + \{ var + restore done@local \} + common + endl } diff --git a/programs/develop/libraries/newlib/sdk/struct.inc b/programs/develop/libraries/newlib/sdk/struct.inc new file mode 100644 index 0000000000..789dd17976 --- /dev/null +++ b/programs/develop/libraries/newlib/sdk/struct.inc @@ -0,0 +1,240 @@ + +; Macroinstructions for defining data structures + +macro struct name + { virtual at 0 + fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common define field@struct .,db, + fields@struct equ fields@struct,field@struct \} + struc dw [val] \{ \common define field@struct .,dw, + fields@struct equ fields@struct,field@struct \} + struc du [val] \{ \common define field@struct .,du, + fields@struct equ fields@struct,field@struct \} + struc dd [val] \{ \common define field@struct .,dd, + fields@struct equ fields@struct,field@struct \} + struc dp [val] \{ \common define field@struct .,dp, + fields@struct equ fields@struct,field@struct \} + struc dq [val] \{ \common define field@struct .,dq, + fields@struct equ fields@struct,field@struct \} + struc dt [val] \{ \common define field@struct .,dt, + fields@struct equ fields@struct,field@struct \} + struc rb count \{ define field@struct .,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rw count \{ define field@struct .,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rd count \{ define field@struct .,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rp count \{ define field@struct .,dp,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rq count \{ define field@struct .,dq,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rt count \{ define field@struct .,dt,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro db [val] \{ \common \local anonymous + define field@struct anonymous,db, + fields@struct equ fields@struct,field@struct \} + macro dw [val] \{ \common \local anonymous + define field@struct anonymous,dw, + fields@struct equ fields@struct,field@struct \} + macro du [val] \{ \common \local anonymous + define field@struct anonymous,du, + fields@struct equ fields@struct,field@struct \} + macro dd [val] \{ \common \local anonymous + define field@struct anonymous,dd, + fields@struct equ fields@struct,field@struct \} + macro dp [val] \{ \common \local anonymous + define field@struct anonymous,dp, + fields@struct equ fields@struct,field@struct \} + macro dq [val] \{ \common \local anonymous + define field@struct anonymous,dq, + fields@struct equ fields@struct,field@struct \} + macro dt [val] \{ \common \local anonymous + define field@struct anonymous,dt, + fields@struct equ fields@struct,field@struct \} + macro rb count \{ \local anonymous + define field@struct anonymous,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rw count \{ \local anonymous + define field@struct anonymous,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rd count \{ \local anonymous + define field@struct anonymous,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rp count \{ \local anonymous + define field@struct anonymous,dp,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rq count \{ \local anonymous + define field@struct anonymous,dq,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rt count \{ \local anonymous + define field@struct anonymous,dt,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name tail,fields@struct, \\{ if $ + display 'Error: definition of ',\\`name,' contains illegal instructions.',0Dh,0Ah + err + end if \\} + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + define fields@\\#name fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + virtual + db `name + load initial@struct byte from 0 + if initial@struct = '.' + display 'Error: name of structure should not begin with a dot.',0Dh,0Ah + err + end if + end virtual + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + label name#.#type + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ \\local \\..base + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label \\..base + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common label . at \\..base \\\} + \\} + macro name value \\{ + match any, fields@struct \\\{ \\\local anonymous + fields@struct equ fields@struct,anonymous,name, \\\} + match , fields@struct \\\{ + forward + match , value \\\\{ type def \\\\} + match any, value \\\\{ \\\\local ..field + ..field = $ + type value + if ~ field eq . + rb sizeof.#name#field - ($-..field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,parent,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + virtual at parent#.#name + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ - parent#.#name + rb sizeof.#parent#field - ($ - parent#.#name) + end if + else + virtual at parent#.#name + label parent#.#type + type def + end virtual + label name#.#type at parent#.#name + if sizeof.#type > $ - parent#.#name + rb sizeof.#type - ($ - parent#.#name) + end if + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} + macro name [value] \{ \common \local ..anonymous + ..anonymous name value \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + label parent#.#type + rb sizeof.#type + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} + macro name value \{ \local ..anonymous + ..anonymous name \} }