    STRUCT S_SymbOS_icon_header
type        BYTE    2
sizex       BYTE    8
sizey       BYTE    8
    ENDS

    STRUCT S_SymbOS_exe_header
codelen     WORD                ;Length of the code area (OS will place this area everywhere)
datalen     WORD                ;Length of the data area (screen manager data; OS will place this area inside a 16k block of one 64K bank)
tranlen     WORD                ;Length of the transfer area (stack, message buffer, desktop manager data; placed between #c000 and #ffff of a 64K bank)
datadr:
origin      WORD                ;Original origin of the assembler code      ; POST address data area
trnadr:
relcount    WORD                ;Number of entries in the relocator table   ; POST address transfer area
prztab:
stacksize   WORD                ;Length of the stack in bytes               ; POST table processes or timer IDs (4*1)
            BLOCK   2, 0        ;*reserved* (2 bytes)
bnknum      BLOCK   1, 0        ;*reserved* (1 byte)                        ; POST 64K ram bank (1-8), where the application is located
name        TEXT    25          ;program name (24+1[0] chars)
flags       BYTE                ;flags (+1=16colour icon available)
icon16      WORD                ;file offset of 16colour icon
            BLOCK   5, 0        ;*reserved* (5 bytes)
memtab:                         ;"SymExe10" SymbOS executable file identification ; POST table reserved memory areas
identifier  TEXT    8, { "SymExe10" }
codex       WORD                ;additional memory for code area (will be reserved directly behind the loaded code area)
datex       WORD                ;additional memory for data area (see above)
trnex       WORD                ;additional memory for transfer area (see above)
            BLOCK   26, 0       ;*reserviert* (26 bytes)
appId:
osver       WORD                ;required OS version (1.0)
        ;Application icon (small version), 8x8 pixel, SymbOS graphic format
iconsm      S_SymbOS_icon_header { 2, 8, 8 }
icobsmdat   TEXT    16
        ;Application icon (big version), 24x24 pixel, SymbOS graphic format
iconbg      S_SymbOS_icon_header { 6, 24, 24 }
icobbgdat   TEXT    144

    ENDS

    ASSERT 256 == S_SymbOS_exe_header
    ASSERT 6 == S_SymbOS_exe_header.datadr
    ASSERT 8 == S_SymbOS_exe_header.trnadr
    ASSERT 10 == S_SymbOS_exe_header.prztab
    ASSERT 14 == S_SymbOS_exe_header.bnknum

;additional memory areas; 8 memory areas can be registered here, each entry consists of 5 bytes
;00  1B  Ram bank number (1-8; if 0, the entry will be ignored)
;01  1W  Address
;03  1W  Length
    ASSERT 48 == S_SymbOS_exe_header.memtab

;Application ID
    ASSERT 88 == S_SymbOS_exe_header.appId

;Main process ID is at (S_SymbOS_exe_header.appId+1) (offset 89), but it is not easy
;to create such label if "osver" is WORD type, that would need "union"-like feature
;that's unlikely to happen, it's more reasonable to define osver as two bytes then.

    OUTPUT "multi_line_initializer.bin"
    ORG     #1000

exeHeader   S_SymbOS_exe_header {
    #1234                   ; implicit delimiter at end (newline) (new line is next value)
    #2345,                  ; explicit delimiter (comma) is valid only *AFTER* value
    #3456
    #1011
    #0203                   ; relocate_count
    #0405                   ; stack size
    { "MyName" }            ; name
    #AA, #ACAB,             ; flags, 16col icon offset
    ,                       ; keep default identifier
    #0102, #0304, #0506     ; code/data/transfer extra memory
    #0708                   ; OS ver

    ; small icon
    ,                       ; type + size sub-structure (default values)

    {

        #31,#F5,#23,#3F,#56,#6E,#47,#6E,#8F,#EA,#FF,#AE,#74,#E2,#77,#EE

    }

    ; big icon (144 bytes of data)
    {}, {
        #00,#00,#D0,#B0,#60,#C0,#00,#10,#60,#D0,#B0,#60,#00,#31,#F6,#FD,
        #FB,#F4,#00,#31,#FF,#FF,#FF,#FC,#00,#73,#FF,#FF,#FF,#FA,#00,#73,
        #FF,#FF,#FF,#FA,#00,#F7,#F0,#F0,#F7,#B6,#00,#F7,#FF,#FF,#FF,#F6,
        #10,#FE,#F0,#F0,#FE,#3E,#10,#FF,#FF,#FF,#FE,#3E,#31,#FF,#FF,#FF,
        #FD,#FE,#31,#FF,#FF,#FF,#ED,#3A,#73,#FF,#FF,#FF,#CB,#3A,#73,#FF,
        #FF,#FF,#FB,#FE,#F7,#FF,#FF,#FF,#87,#32,#F7,#FF,#FF,#FF,#87,#32,
        #70,#F0,#F0,#F0,#FF,#FE,#00,#21,#0F,#0F,#0E,#32,#00,#21,#0F,#0F,
        #0E,#32,#00,#31,#FF,#FF,#FF,#FE,#00,#21,#0F,#0F,#0C,#32,#00,#20,#00,#00,#00,#76,#00,#10,#FF,#FF,#FF,#EC,#00,#00,#F0,#F0,#F0,#C0
    }



    ; these empty lines before final "}" are intentional

}
        daa     ; first line after multi-line struct init (make sure it gets into listing!)

test2   S_SymbOS_icon_header {
    1,
    2, 3
}

    STRUCT S_test3
b1  byte    'b'
icon    S_SymbOS_icon_header {
    4,
    5, 6
}
b2  byte    'e'
    ENDS

test3a  S_test3

test3b  S_test3 {
    'B',
    { 7,
        8, 9 },
    'E'
}

    STRUCT S_test4
icon    S_SymbOS_icon_header {
    10,
    11, 12
}
    ENDS

test4a  S_test4

test4b  S_test4 {
    { 13,
        14, 15 }
}

    OUTEND

test4err    S_SymbOS_icon_header {
    1,,, ; missing }
