;$%@0 (+-*/)
       $;
TRIM @10%
^IND@76 ^TRIM@86%
STM @81%
%
$;
       @10%
% ------ CHANGE SPACE TO TAB
       $;
@10%
%
               $;
@10%
%
                       $;
@10%
%
STM BYTE $;
@10:    DS      1@F1%
%
STM BYTE $($);
@10:    DS      @24@F1%
%
STM INT I$;
I@10:   DW      0@F1%
%
STM INT I$($);
I@10:   DS      @24*2@F1%
%
STM GOSUB $;
       CALL    ..@10@F1%
%
STM I$=I$;
       LHLD    .I@20@F1%
       SHLD    .I@10@F1%
%
STM $=+000;
       XRA     A@F1%
       STA     .@10@F1%
%
STM I$=+K$;
       LXI     H,.K@20@F1%
       SHLD    .I@10@F1%
%
STM $=+K$;

       MVI     A,.K@20@F1%
       STA     .@10@F1%
%
STM I$=+$;
       LXI     H,@24@F13%
       SHLD    .I@10@F13%
%
STM I$=I$(I$);
       LXI     D,.I@20@F1%
       LHLD    .I@30@F1%
       DAD     H@F1%
       DAD     D@F1%
       XCHG@F1%
       LXI     H,.I@10@F1%
       LDAX    D@F1%
       MOV     M,A@F1%
       INX     D@F1%
       INX     H@F1%
       LDAX    D@F1%
       MOV     M,A@F1%
%
STM I$=I$($);
       LXI     D,.I@20@F1%
       LDA     .@30@F1%
       ADD     A@F1%
       MOV     L,A@F1%
       MVI     H,0@F1%
       DAD     D@F1%
       XCHG@F1%
       LDAX    D@F1%
       MOV     L,A@F1%
       INX     D@F1%
       LDAX    D@F1%
       MOV     H,A@F1%
       SHLD    .I@10@F1%
%
STM I$($)=I$;
       LXI     D,.I@10@F1%
       LDA     .@20@F1%
       ADD     A@F1%
       MOV     L,A@F1%
       MVI     H,0@F1%
       DAD     D@F1%
       XCHG@F1%
       LHLD    .I@30@F1%
       MOV     A,L@F1%
       STAX    D@F1%
       INX     D@F1%
       MOV     A,H@F1%
       STAX    D@F1%
%
STM $(I$)=$;
       LHLD    .I@20@F1%
       LXI     D,.@10@F1%
       DAD     D@F1%
       LDA     .@30@F1%
       MOV     M,A@F1%
%
STM $=$(I$);
       LHLD    .I@30@F1%
       LXI     D,.@20@F1%
       DAD     D@F1%
       MOV     A,M@F1%
       STA     .@10@F1%
%
STM $=$($);
       LHLD    .@30@F1%
       MVI     H,0@F1%
       LXI     D,.@20@F1%
       DAD     D@F1%
       MOV     A,M@F1%
       STA     .@10@F1%
%
STM $=I$;
       LDA     .I@20@F1%
       STA     .@10@F1%
%
STM I$=$;
       LHLD    .@20@F1%
       MVI     H,0@F1%
       SHLD    .I@10@F1%
%
STM $=$;
       LDA     .@20@F1%
       STA     .@10@F1%
%
STM MS '$';
       CALL    ?MSG@F13%
       DB      '@10'@F1%
       EXTRN   ?MSG@F13%
%
STM I$=I$+I$;
       LHLD    .I@30@F1%
       XCHG@F1%
       LHLD    .I@20@F1%
       DAD     D@F1%
       SHLD    .I@10@F1%
%
STM I$=I$*I$;
       LHLD    .I@20@F1%
       XCHG@F1%
       LHLD    .I@30@F1%
       CALL    ?IMUL@F13%
       EXTRN   ?IMUL@F13%
       SHLD    .I@10@F1%
%
STM I$=I$/I$;
       LHLD    .I@30@F1%
       XCHG@F1%
       LHLD    .I@20@F1%
       CALL    ?IDIV@F13%
       EXTRN   ?IDIV@F13%
       SHLD    .I@10@F1%
%
STM I$=-I$;
       LHLD    .I@20@F13%
       CALL    ?ICOMP@F13%
       EXTRN   ?ICOMP@F13%
       SHLD    .I@10@F13%
%
STM I$=I$-I$;
       LHLD    .I@30@F1%
       XCHG@F1%
       LHLD    .I@20@F1%
       CALL    ?ISUB@F13%
       EXTRN   ?ISUB@F13%
       SHLD    .I@10@F13%
%
STM $=I$<=I$;
       LHLD    .I@30@F13%
       XCHG@F13%
       LHLD    .I@20@F13%
       CALL    ?CDEHL@F13%
       EXTRN   ?CDEHL@F13%
       CALL    ?SETAC@F13%
       STA     .@10@F13%
%
STM $=I$<!I$;
       LHLD    .I@30@F13%
       XCHG@F13%
       LHLD    .I@20@F13%
       CALL    ?CDEHL@F13%
       EXTRN   ?CDEHL@F13%
       RAL@F13%
       ANI     1@F13%
       STA     .@10@F13%
%
STM $=$<=$;
       LXI     H,.@30@F1%
       LDA     .@20@F1%
       CMP     M@F1%
       CALL    ?SETAC@F1%
       STA     .@10@F1%
%
STM $=$<!$;
       LDA     .@20@F1%
       LXI     H,.@30@F1%
       CMP     M@F1%
       RAL@F13%
       ANI     1@F13%
       STA     .@10@F1%
%
STM $=!$;
       LDA     .@20@F13%
       CMA@F13%
       ANI     1@F13%
       STA     .@10@F13%
%
STM ENDMAIN$;
       CALL    ?ENDING@F1%
       JMP     ?BOOT@F13%
%
STM ON $;
       LDA     .@10@F13%
       ORA     A@F13%
POP%
^CSI@96         JZ      ?BL0@91@F13%
PUSH @91%
%
STM I$--;
       LHLD    .I@10@F13%
       DCX     H@F13%
       SHLD    .I@10@F13%
%
STM I$(I$)=I$;
       LXI     D,.I@10@F13%
       LHLD    .I@20@F13%
       DAD     H@F1%
       DAD     D@F13%
       XCHG@F13%
       LHLD    .I@30@F13%
       MOV     A,L@F13%
       STAX    D@F13
       INX     D@F13%
       MOV     A,H@F13%
       STAX    D@F13%
%
STM $--;
       LXI     H,.@10@F13%
       DCR     M@F13%
%
STM $($)=$;
       LDA     .@20@F13%
       MVI     H,0@F13%
       LXI     D,.@10@F13%
       MOV     L,A@F13%
       DAD     D@F13%
       LDA     .@30@F13%
       MOV     M,A@F13%
%
STM $=$==$;
       LXI     H,.@20@F13%
       LDA     .@30@F13%
       CMP     M@F13%
       JZ      $+5@F1%
       XRA     A@F13%
       LXI     B,013EH@F1%
       STA     .@10@F13% ; SAVE RESULTANT
%
STM $=I$!=I$;
       LXI     D,.I@30@F1%
       LXI     H,.I@20@F1%
       MVI     B,1@F1%
       LDAX    D@F1%
       XRA     M@F1%
       JNZ     $+10@F1%
       INX     H@F1%
       INX     D@F1%
       LDAX    D@F1%
       XRA     M@F1%
       JZ      $+4@F1%
       MOV     A,B@F1%
       STA     .@10@F1%
%
STM $=$!=$;
       LXI     H,.@30@F13%
       LDA     .@20@F13%
       XRA     M@F13%
       JNZ     $+5@F1%
       XRA     A@F13%
       LXI     B,013EH@F1%
       STA     .@10@F13%
%
STM $=I$==I$;
       LXI     B,.I@30@F13%
       LHLD    .I@20@F13%
       LDAX    B@F13%
       XRA     L@F13%
       JNZ     $+12@F1%
       INX     B@F13%
       LDAX    B@F13%
       XRA     H@F13%
       JNZ     $+6@F1%
       MVI     A,1@F13%
       LXI     B,003EH@F1%
       STA     .@10@F13%
%
STM $='$';
       MVI     A,'@20'@F13%
       STA     .@10@F13%
%
STM $=$+$;
       LXI     H,.@20@F1%
       LDA     .@30@F1%
       ADD     M@F1%
       STA     .@10@F1%
%
STM $=$-$;
       LXI     H,.@30@F1%
       LDA     .@20@F1%
       SUB     M@F1%
       STA     .@10@F1%
%
STM $=$&$;
       LXI     H,.@30@F1%
       LDA     .@20@F1%
       ANA     M@F1%
       STA     .@10@F1%
%
STM $=$?$;
       LXI     H,.@30@F1%
       LDA     .@20@F1%
       ORA     M@F1%
       STA     .@10@F1%
%
STM LOC $;
?LL0@10:%@F13%
%
STM GOTO $;
       JMP     ?LL0@10@F13%
%
STM SUB $;
.@10:@F1%
%
STM I$++;
       LHLD    .I@10@F1%
       INX     H@F1%
       SHLD    .I@10@F1%
%
STM IF $;       IF STATEMENT
       LDA     .@10@F13%       ; GENERATE LDA X
       ORA     A@F13%          ; GENERATE SET FLAGS
PUSH @01%
       JZ      ?FI0@01@F13%    ; GENERATE JZ   ?FI0XX
% ----- END OF IF STATEMENT
STM ELSE$;
POP%
^CSI@96 .ELSE @91%
%
ELSE$;
       JMP     ?FI0@01@F13%
^CSI@96 ?FI0@91:@F13%
PUSH @01%
%
STM ENDIF$;
POP%
^CSI@96 ?FI0@91:@F13%
%
STM CHOOSE ON $;
       LDA     .@10@F13%
       STA     .ERASER.@F1%
PUSH @01%       ; ENDCHOOSE LABEL
PUSH C%
% ------ END OF CHOOSE ON
STM CASE $;     ; CASE STATEMENT (UGH@)
POP%    ; POP INDICATOR OF PREVIOUS STATEMENT OFF STACK
^CSI@96 .IF @91=C SKIP 6%       ; IF FIRST TIME THRU CASE
POP%    ; GET ENDCHOOSE OR DEFAULT LABEL
^CSI@96         JMP     ?XC0@91@F13%    ; GENERATE JMP
LET ^ELB=@91%   ; SAVE LABEL FOR LATER
POP%    ; GET ADDRESS OF JUMP TO NEXT CASE OR DEFAULT
^CSI@96 ?CA0@91:        LDA     .@10@F13% ; GENERATE LD
SKIP 3% ; JUMP ACROSS FIRST TIME CODE
       LDA     .@10@F13%       ; GET PARAMETER OF CASE
POP%    ; GET LABEL OF ENDCHOOSE
^CSI@96 .LET ^ELB=@91% ; SAVE LABEL
PUSH @02% ; SET UP LABEL FOR JNZ CASE N+1 OR DEFAULT
       LXI     H,.ERASER.@F1%
       CMP     M@F13%  ; OUTPUT COMPARE
       JNZ     ?CA0@02@F13% ; OUTPUT JUMP CASE N+1 OR DEFAULT
^ELB@96 .PUSH @91% ; PUT END LABEL BACK ON STACK
PUSH S%         ; SAY NOT FIRST TIME THRU
%
STM DEFAULT$;   ; DEFAULT STATEMENT
POP%    ; POP INDICATOR OFF STACK (YOU WONT NEED IT NOW)
POP%    ; GET ENDCHOOSE LABEL FROM STACK
^CSI@96 .LET ^ELB=@91% ; SAVE ENDLABEL
       JMP     ?XC0@91@F13%
POP%    ; GET THIS LABEL
^CSI@96 ?CA0@91:        ; DEFAULT CLAUSE@F13%
^ELB@96 .PUSH @91%      ; PUT ENDCHOOSE LABEL ON STACK
PUSH D%
%
STM ENDCHOOSE$; ; END OF MULTIPATH BRANCH
POP%
^CSI@96 .LET ^ELB=@91% ; TYPE OF ENDING (D OR S)
POP%
^CSI@96 ?XC0@91:@F13% ; OUTPUT ENDING OF CHOOSE ON
IF ^ELB==D SKIP 3% ; SKIP OVER ENDING FOR NON-DEFAULT CASE
POP%
^CSI@96 ?CA0@91:@F1%
; DEFAULT END@F1%
%
STM $++;
       LXI     H,.@10@F1%
       INR     M@F1%
%
STM ENDSUB$;
       RET@F1%
%
STM PARAMETER K$=$;
K@10    EQU     @24@F1%
%
STM STOP $;
       MVI     A,@10@F13%
       CALL    ?ISTOP@F1%
       EXTRN   ?ISTOP@F1%
%
STM RETURN;
       RET     @F13%
%
STM OPEN $ FOR $ AT $;
       LXI     D,.@10@F13%
       LDA     .@20@F13%
       LHLD    .@30@F13%
       CALL    ?IOPEN@F13%
       EXTRN   ?IOPEN@F13%
%
STM CLOSE $;
       LXI     H,.@10@F13%
       CALL    ?BCLOF@F13%
       EXTRN   ?BCLOF@F13%
%
STM READ $ FROM $
       LXI     D,.@20@F13%
       LXI     H,.@10@F13%
       CALL    ?BREAD@F13%
       EXTRN   ?BREAD@F13%
%
STM WRITE $ INTO $
       LXI     D,.@20@F13%
       LDA     .@10@F13%
       CALL    ?BWRIT@F13%
       EXTRN   ?BWRIT@F13%
%
STM PACK (I$,$,$);
       LDA     .@30@F13%
       MOV     L,A@F13%
       LDA     .@20@F13%
       MOV     H,A@F13%
       SHLD    .I@10@F13%
%
STM $=+$;
       MVI     A,@24@F1%
       STA     .@10@F1%
%
STM BOTTOM;
       COMMON  /IOCTRL/@F13%
ER:     DB      0@F13%
AC:     DB      0@F1%
IAV:    DS      12@F1%
       DSEG@F13%
       DS      40@F13%
?STACK: DS      2@F13%
       END     START@F13%
%
STM BEGINMAIN ($,$);
ERASER.: DB     0
       CSEG@F13%
?SETAC: MVI     A,1@F1%
       RM              ; RETURN ON MINUS@F1%
       RZ              ; RETURN ON ZERO (AC=1)@F1%
       XRA     A       ; NON-ZERO NON-CARRY@F1%
       RET@F1%
START:  LXI     SP,?STACK@F13%
       CALL    ?INIT@F1%
       LXI     B,.@10@F1%
       LXI     D,.@20@F1%
%
STM FINIS$;
. END OF PIDGIN COMPILATION@F15%
@F0%
%
STM TOP$;
.PIDGIN FOR THE 8080 COPYRIGHT (C) A. L. BENDER, M. D.@F15%
       EXTRN   ?INIT,?ENDING,?BOOT@F1%
       DB      'COPYRIGHT (C) 1981 A. L. BENDER, M. D.'@F1%
       DSEG@F13%
%
STM UNPACK (I$,$,$);
       LHLD    .I@10@F13%
       MOV     A,L@F13%
       STA     .@30@F13%
       MOV     A,H@F13%
       STA     .@20@F13%
%
STM CALL I$;
       LXI     H,$+8@F1%
       PUSH    H@F1%
       LHLD    .I@10@F1%
       PCHL@F1%
%
STM ASSOCIATE FCB $ WITH $;
       LXI     D,?IFCB+((@10-1)*36)@F1%
       LXI     H,.@20@F1%
       CALL    ?ATACH@F1%
       EXTRN   ?ATACH,?IFCB@F1%
%
STM READBUF $;
       LXI     D,.@10@F13%
       CALL    ?RDBUF@F13%
       EXTRN   ?RDBUF@F13%
%
STM WRITEBUF $;
       LXI     D,.@10@F13%
       CALL    ?WRBUF@F13%
       EXTRN   ?WRBUF@F13%
%
STM READ $;
       CALL    ?RNX@F1%
       EXTRN   ?RNX@F1%
       STA     .@10@F1%
%
STM WRITE $;
       LDA     .@10@F1%
       CALL    ?WRNXT@F1%
       EXTRN   ?WRNXT@F1%
%
STM WHILE$;
PUSH @01%
?TL0@01:%@F13%
%
STM ENDWHILE$;
POP%
^CSI@96 @91@96%
^CSI@96         JMP     ?TL0@91@F13%
?BL0@91:@F13%
%
PUSH $;
LET ^CSP=^CSP+1%
^CSP@96 .STO ^CS@91=@10%
% - END OF PUSH
POP;
^CSP@96 .IF @91<1 SKIP 3%
^CS@91@86 .STO ^CSI=@81%
LET ^CSP=^CSP-1%
@F9%
STO ^CSI=*%
@FE%
% - END OF POP
STO $=$;
@F3%
% -END OF STORE
LET $=$;
@24@26 @F3%
% -END OF LET
SKIP $;
@F4%
% - END OF SKIP
IF $=$ SKIP $;
@F50%
%
IF $-=$ SKIP $;
@F51%
%
IF $<$ SKIP $;
@F6-%
%
IF $==$ SKIP $;
@F60%
%
IF $<>$ SKIP $;
@F61%
%
DUMP STACK;
^DBG@56 .IF @51=T SKIP 1%
@F9%
LET ^CNT=^CSP%
^CSP@16 @11@F7%
^CNT@26 ^CS@21@36%
^CS@21  "@31"@F14%
LET ^CNT=^CNT-1%
@F8%
^LEV@46%
^LEV    =@41@F14%
%
DEBUG;
STO ^DBG=T%
%
UNBUG;
STO ^DBG=F%
%
IF $>$ SKIP $;
@F6+%
%
CAT $,$;
@11@20@26  @F3%
% - END CONCATENATION
TRIM  $;
TRIM @10%
%
TRIM    $;
TRIM @10%
%
TRIM $;
STO ^TRIM=@10%
%
XSTM $;
INCLEV%
TRIM @10%
^TRIM@26 .YSTM @21%
%
YSTM %
%
YSTM ;@%
%
INCLEV;
LET ^LEV=^LEV+1%
CAT ^IND, | %
%
DECLEV;
^LEV@16 .IF @11<1 SKIP 2%
LET ^LEV=^LEV-1%
^IND@26 .UND @21%
% --------
UND  $ | ;
STO ^IND=@10%
% --------
TOS;
^CSP@96 .IF @91<1 SKIP 2%
^CS@91@86 .STO ^CSI=@81%
@F9%
STO ^CSI=*%
%
CONSOLE;
5@F2%
%%
LET ^ERR=0;
LET ^IOS=0;
LET ^LEV=0;
STO ^IND=;
LET ^CSP=0;
STO ^DBG=F
STO ^ELB=;
LET ^WPL=0;
STO ^CS0=*;
STO ^SOP=;
STO ^DOP=;