This program is designated for demonstration and testing of some macros defined in libraries sort16.htm and cpuext16.htm : LodD, StoD, StoH, LodH, ShellSort.
EUROASM UNICODE=Off
tmac16 PROGRAM Format=MZ,Width=16,IconFile=,Entry=Main:
INCLUDE dosapi.htm, cpuext%^WIDTH.htm, sort%^WIDTH.htm
Main: PROC
MOV AX,PARA# [DATA]
MOV DS,AX
MOV ES,AX
StdOutput ="This program %^PROGRAM will test macros from EuroAssembler libraries",Eol=Yes
StdOutput ="cpuext%^WIDTH.htm, sort%^WIDTH.htm.",Eol=Yes
StdOutput ="Enter one or more comma-separated signed decimal integer numbers",Eol=Yes
StdOutput =" in the range -32768..+32767, for instance",Eol=Yes
StdOutput =" 12345, -12,0,-32768, +32767, 54321",Eol=Yes
StdOutput ="-------------------------------------------------",Eol=Yes
StdInput Raw
MOV DI,Raw
MOV SI,DI
MOV CX,SIZE# Inp
MOV AL,','
REPNE SCASB
JNE .10:
DEC DI
.10: DEC DI
CMP DI,SI
JNA .20:
CMPB [DI],' '
JBE .10:
.20: SUB DI,SI
MOV CX,DI
INC CX
MOV DI,Inp
REP MOVSB
StdOutput ="The first entered number:",Eol=Yes
StdOutput Inp, Size=DI,Eol=Yes
StdOutput ="Conversion from decimal to binary and back with macros LodD and StoD:",Eol=Yes
LodD Inp
JC .Abort:
MOV [Bin],AX
StoD Dec
JC .Abort:
StdOutput Dec,Eol=Yes
StdOutput ="Conversion from binary to hexadecimal with macro StoH Align=Left:",Eol=Yes
MOV AX,[Bin]
StoH Hex,Align=Left
JC .Abort:
StdOutput ="0x",Hex,Eol=Yes
StdOutput ="Conversion from binary to hexadecimal with macro StoH Align=Right,Size=4:",Eol=Yes
MOV AX,[Bin]
StoH Hex,Align=Right
JC .Abort:
StdOutput ="0x",Hex,Eol=Yes
MOV SI,Raw
MOV DI,Raw + SIZE# Raw
.30: DEC DI
CMP DI,SI
JNA .40:
CMPB [DI],' '
JBE .30:
.40: SUB DI,SI
INC DI ; Netto size of the stripped list.
StdOutput ="Entered array of numbers:",Eol=Yes
StdOutput SI,Size=DI,Eol=Yes
MOV DX,DI ; Netto size of the stripped list.
ADD DX,SI ; SI..DX is the list of decimal numbers.
SUB BX,BX ; BX will keep the number of entered numbers.
MOV DI,Tab ; Loaded numbers will be stored to Tab.
DEC SI
.50: INC SI
.60: CMP SI,DX ; Find the next number (it begins with sign or digit).
JNB .80: ; End of list.
LODSB
CMP AL,'+'
JE .70:
CMP AL,'-'
JE .70:
CMP AL,'0'
JB .60:
CMP AL,'9'
JA .60:
.70: DEC SI
LodD SI
JC .50: ; Ignore incorrect numbers.
STOSW
INC BX
JMP .60:
.80: StdOutput ="Unsorted array of entered numbers:",Eol=Yes
CALL .PrintTab:
ShellSort Tab, BX, 2, .Ascending:
StdOutput ="Sorted ascending array of entered numbers:",Eol=Yes
CALL .PrintTab:
ShellSort Tab, BX, 2, .Descending:
StdOutput ="Sorted descending array of entered numbers:",Eol=Yes
CALL .PrintTab:
.End: TerminateProgram
.Abort: StdOutput Eol=Yes
StdOutput =B"Aborted, macro returned CF.",Eol=Yes
TerminateProgram, Errorlevel=8
.Ascending: PROC ; Sort callback for comparing two signed integers at SI,DI.
MOV AX,[SI]
MOV DX,[DI]
CMP DX,AX
CLC
JNL .Done: ; Jump if both records are in order. No carry.
MOV [SI],DX ; Otherwise swap them and return CF.
MOV [DI],AX
STC
.Done: RET
ENDP .Ascending:
.Descending:PROC ; Sort callback for comparing two signed integers at SI,DI.
MOV AX,[SI]
MOV DX,[DI]
CMP DX,AX
CLC
JNG .Done: ; Jump if both records are in order. No carry.
MOV [SI],DX ; Otherwise swap them and return CF.
MOV [DI],AX
STC
.Done: RET
ENDP .Descending:
.PrintTab: PROC ; Display EBX numbers in Tab.
MOV CX,BX
MOV SI,Tab
.Next: LODSW
StoD Dec
MOV AX,','
STOSW ; Terminate the decimal number with comma and NUL.
StdOutput Dec
LOOP .Next:
StdOutput Eol=Yes
RET
ENDP .PrintTab:
ENDP Main:
Bin: DW 0 ; The first entered number in binary form.
Tab: DD 128* WORD ; Table of entered numbers in binary form.
Raw: DB 128*BYTE 0 ; Entered array of decimal numbers.
Inp: DB 32*BYTE 0 ; The first number, stripped from white spaces.
Dec: DB 32*BYTE 0 ; The first number in decimal notation.
Hex: DB 4*BYTE 0 ; The first number in hexdecimal notation.
DB 0 ; Zero terminator.
ENDPROGRAM tmac16