This source PF generates EuroAssembler output object file in program format COM.
pfcom PROGRAM FORMAT=COFF,MODEL=FLAT,WIDTH=32 INCLUDEHEAD "euroasm.htm" ; Interface (structures, symbols and macros) of other modules.
pfcom HEAD ; Start module interface.
ENDHEAD pfcom ; End of module interface.
DS:0 points to 256 bytes long Program Segment Prefix (PSP).
PROGRAM FILEALIGN= (default=0),PROGRAM SECTIONALIGN= (default=0),SEGMENT ALIGN= (default=16).PURPOSE=BSS|STACK), their contents is not emitted to image file at all.
However, if some initialized data or code follows, BSS|STACK segment is emitted as zero-initialized data.
PfcomCompile Procedure OutputStream, Pgm
MOV EBX,[%Pgm]
Invoke PgmCreateImplicitGroups::,EBX
Invoke RelocSort::,EBX
Invoke PgmOrderSegments::,EBX
Invoke SssGetSegm::,EBX,sssPurposeCODE
JC .E7723:
; Check program entry.
Invoke PgmEvalEntry::,EBX
LEA EDI,[EBX+PGM.EntryExp]
Invoke ExpReportError::,EDI
JBE .10:
; Entry was explicitly specified. Check if it is 256.
CMP EAX,[EDI+EXP.Seg]
JNE .E7723:
CMPD [EDI+EXP.Low],100h
JE .10:
.E7723:Msg '7723',EAX ; Program format COM requires fixed entry point at [!1S]:100h.
.10: MOV [EDI+EXP.Seg],EAX
MOVD [EDI+EXP.Low],100h
MOVD [EDI+EXP.High],0
MOVD [EDI+EXP.Status],'A'
; Check program ImageBase.
SUB EAX,EAX
CMP [EBX+PGM.Pgmopt+PGMOPT.ImageBaseLow],EAX
Msg cc=NZ,'7724' ; Program format COM requires fixed Imagebase=0.
MOV [EBX+PGM.Pgmopt+PGMOPT.ImageBaseLow],EAX
MOV [EBX+PGM.Pgmopt+PGMOPT.ImageBaseHigh],EAX
Invoke PgmLinkImage::,EBX,0
Invoke PgmConcatenateImage::,EBX
BufferRetrieve EAX
ADD ESI,256
SUB ECX,256
JNB .80:
Msg '9341' ; Internal error: invalid COM file size.
.80: StreamStore [%OutputStream],ESI,ECX
EndProcedure PfcomCompile
PfcomLoadPgm Procedure BasePgm, ObjBegin, ObjSize, FileNamePtr
Msg '8534',Dict_FormatCOM::,[%FileNamePtr] ; Format !1S of file "!2$" is not linkable.
EndProcedure PfcomLoadPgm
ENDPROGRAM pfcom