U:;$^
:TOP;
       @       EXTRN@  ?MSG;
       @       EXTRN@  ?BOOT,?INIT,?ENDING;
       @       COMMON@ /IOCTRL/;
       .ER@:@  DB@     0;
       .AC@:@  DB@     0;
       .IAV@:@ DW@     0,0,0,0,0,0;
       @       COMMON@ /      / ;
:BEGINMAIN(AC,IAV);
       @       DSEG;
       .ERASER.@: DB@  0;
       @       CSEG;
?SETAC@:@       MVI@    A,1;
       @       RM;
       @       RZ;
       @       XRA@    A;
       @       RET;
?INTCK@:@       MVI@    B,1;
       @       LDAX@   D;
       @       CMP@    M;
       @       JNZ@    @$+8;
       @       INX@    H;
       @       INX@    D;
       @       LDAX@   D;
       @       XRA@    M;
       @       RZ;
       @       MOV@    A,B;
       @       RET;

?START@:@       LXI@    SP,?STACK;
@       CALL@   ?INIT;
:PARAMETER K$$=$$$;
K^P1C^P2C@      EQU@    ^V3S^V4*^V5*^!0N;
:MS '$$$$$$$$$';
@       CALL@   ?MSG;
@       DB@     '^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C';
:GOSUB $$;
       @       CALL@   ..^P1C^P2C;
:GOTO $$;
       @       JMP@    ?LL0^P1C^P2C;
:$$=+000;
       @       XRA@    A;
       @       STA@    .^P1C^P2C;
:I$$=+00000;
       @       LXI@    H,0;
       @       SHLD@   .I^P1C^P2C;
:I$$=+K$$;
       @       LXI@    H,.K^P3C^P4C;
       @       SHLD@   .I^P1C^P2C;
:PACK(I$$,$$,$$);
       @       LDA@    .^P5C^P6C;
       @       MOV@    L,A;
       @       LDA@    .^P3C^P4C;
       @       MOV@    H,A;
       @       SHLD@   .I^P1C^P2C;
:UNPACK(I$$,$$,$$);
       @       LHLD@   .I^P1C^P2C;
       @       MOV@    A,L;
       @       STA@    .^P3C^P4C;
       @       MOV@    A,H;
       @       STA@    .^P5C^P6C;
:CALL I$$;
       @       LXI@    H,@$+8;
       @       PUSH@   H;
       @       LHLD@   .I^P1C^P2C;
       @       PCHL;
:$$=+K$$;
       @       MVI@    A,.K^P3C^P4C;
       @       STA@    .^P1C^P2C;
:$$='$';
       @       MVI@    A,'^P3C';
       @       STA@    .^P1C^P2C;
:$$=+$$$;
       @       MVI@    A,^V3S^V4*^V5*^!0N;
       @       STA@    .^P1C^P2C;
:I$$=+$$$$$;
       @       LXI@    H,^V3S^V4*^V5*^V6*^V7*^!0N;
       @       SHLD@   .I^P1C^P2C;
:$$=$$;
       @       LDA@    .^P3C^P4C;
       @       STA@    .^P1C^P2C;
:$$++;
       @       LXI@    H,.^P1C^P2C;
       @       INR@    M;
:$$--;
       @       LXI@    H,.^P1C^P2C;
       @       DCR@    M;
:I$$=$$;
       @       LHLD@   .^P3C^P4C;
       @       MVI@    H,0;
       @       SHLD@   .I^P1C^P2C;
:$$=I$$;
       @       LDA@    .I^P3C^P4C;
       @       STA@    .^P1C^P2C;
:I$$=I$$;
       @       LHLD@   .I^P3C^P4C;
       @       SHLD@   .I^P1C^P2C;
:$$=$$($$);
       @       LHLD@   .^P5C^P6C;
       @       MVI@    H,0;
       @       LXI@    D,.^P3C^P4C;
       @       DAD@    D;
       @       MOV@    A,M;
       @       STA@    .^P1C^P2C;
:I$$=I$$($$);
       @       LHLD@   .^P5C^P6C;
       @       MVI@    H,0;
       @       LXI@    D,.I^P3C^P4C;
       @       DAD@    H;
       @       DAD@    D;
       @       LXI@    D,.I^P1C^P2C;
       @       MOV@    A,M;
       @       STAX@   D;
       @       INX@    D;
       @       INX@    H;
       @       MOV@    A,M;
       @       STAX@   D;
:$$=$$(I$$);
       @       LHLD@   .I^P5C^P6C;
       @       LXI@    D,.^P3C^P4C;
       @       DAD@    D;
       @       MOV@    A,M;
       @       STA@    .^P1C^P2C;
:I$$=I$$(I$$);
       @       LHLD@   .I^P5C^P6C;
       @       LXI@    D,.I^P3C^P4C;
       @       DAD@    H;
       @       DAD@    D;
       @       MOV@    E,M;
       @       INX@    H;
       @       MOV@    D,M;
       @       XCHG;
       @       SHLD@   .I^P1C^P2C;
:$$($$)=$$;
       @       LHLD@   .^P3C^P4C;
       @       MVI@    H,0;
       @       LXI@    D,.^P1C^P2C;
       @       DAD@    D;
       @       LDA@    .^P5C^P6C;
       @       MOV@    M,A;
:I$$($$)=I$$;
       @       LHLD@   .^P3C^P4C;
       @       MVI@    H,0;
       @       DAD@    H;
       @       LXI@    D,.I^P1C^P2C;
       @       DAD@    D;
       @       LXI@    D,.I^P5C^P6C;
       @       LDAX@   D;
       @       MOV@    M,A;
       @       INX@    D;
       @       INX@    H;
       @       LDAX@   D;
       @       MOV@    M,A;
:$$(I$$)=$$;
       @       LHLD@   .I^P3C^P4C;
       @       LXI@    D,.^P1C^P2C;
       @       DAD@    D;
       @       LDA@    .^P5C^P6C;
       @       MOV@    M,A;
:I$$(I$$)=I$$;
       @       LHLD@   .I^P3C^P4C;
       @       LXI@    D,.I^P1C^P2C;
       @       DAD@    H;
       @       DAD@    D;
       @       XCHG;
       @       LHLD@   .I^P5C^P6C;
       @       MOV@    A,L;
       @       STAX@   D;
       @       INX@    D;
       @       MOV@    A,H;
       @       STAX@   D;
:$$=$$+$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       ADD@    M;
       @       STA@    .^P1C^P2C;
:$$=$$-$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       SUB@    M;
       @       STA@    .^P1C^P2C;
:$$=$$&$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       ANA@    M;
       @       STA@    .^P1C^P2C;
:$$=$$?$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       ORA@    M;
       @       STA@    .^P1C^P2C;
:I$$++;
       @       LHLD@   .I^P1C^P2C;
       @       INX@    H;
       @       SHLD@   .I^P1C^P2C;
:I$$--;
       @       LHLD@   .I^P1C^P2C;
       @       DCX@    H;
       @       SHLD@   .I^P1C^P2C;
:I$$=-I$$;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?ICOMP;
       @       EXTRN@  ?ICOMP;
       @       SHLD@   .I^P1C^P2C;
:I$$=I$$+I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       DAD@    D;
       @       SHLD@   .I^P1C^P2C;
:I$$=I$$-I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?ISUB;
       @       EXTRN@  ?ISUB;
       @       SHLD@   .I^P1C^P2C;
:I$$=I$$*I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?IMUL;
       @       EXTRN@  ?IMUL;
       @       SHLD@   .I^P1C^P2C;
:I$$=I$$/I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?IDIV;
       @       EXTRN@  ?IDIV;
       @       SHLD@   .I^P1C^P2C;
:$$=$$==$$;
       @       LXI@    H,.^P3C^P4C;
       @       LDA@    .^P5C^P6C;
       @       CMP@    M;
       @       JZ@     @$+5;
       @       XRA@    A;
       @       LXI@    B,013EH;
       @       STA@    .^P1C^P2C;
:$$=$$!=$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       CMP@    M;
       @       JNZ@    @$+5;
       @       XRA@    A;
       @       LXI@    B,013EH;
       @       STA@    .^P1C^P2C;
:$$=$$<=$$;
       @       LXI@    H,.^P5C^P6C;
       @       LDA@    .^P3C^P4C;
       @       CMP@    M;
       @       CALL@   ?SETAC;
       @       STA@    .^P1C^P2C;
:$$=$$<!$$;
       @       LDA@    .^P3C^P4C;
       @       LXI@    H,.^P5C^P6C;
       @       CMP@    M;
       @       RAL;
       @       ANI@    1;
       @       STA@    .^P1C^P2C;
:$$=!$$;
       @       LDA@    .P3C^P4C;
       @       CMA;
       @       ANI@    1;
       @       STA@    .^P1C^P2C;
:$$=I$$==I$$;
       @       LXI@    D,.I^P5C^P6C;
       @       LHLD@   .I^P3C^P4C;
       @       LDAX@   D;
       @       XRA@    L;
       @       JNZ@    @$+12;
       @       INX@    D;
       @       LDAX@   D;
       @       XRA@    H;
       @       JNZ@    @$+6;
       @       MVI@    A,1;
       @       LXI@    B,003EH;
       @       STA@    .^P1C^P2C;
:$$=I$$!=I$$;
       @       LXI@    D,.I^P5C^P6C;
       @       LXI@    H,.I^P3C^P4C;
       @       CALL@   ?INTCK;
       @       STA@    .^P1C^P2C;
:$$=I$$<=I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?CDEHL;
       @       EXTRN@  ?CDEHL;
       @       CALL@   ?SETAC;
       @       STA@    .^P1C^P2C;
:$$=I$$<!I$$;
       @       LHLD@   .I^P5C^P6C;
       @       XCHG;
       @       LHLD@   .I^P3C^P4C;
       @       CALL@   ?CDEHL;
       @       EXTRN@  ?CDEHL;
       @       RAL;
       @       ANI@    1;
       @       STA@    .^P1C^P2C;
:CASE $$;
       ^!0P^!9P^!8P
       @       JMP@    .XC^P0N;
       @       ORG@    @$-^P9N;
       .UP^P8N@:@      LXI@    H,.ERASER.;
       @       LDA@    .^P1C^P2C;
       @       CMP@    M;
       @       JNZ@    .UP^U1S^S8N^N0S^P0S;
:ASSOCIATE FCB $ WITH I$$;
       @       LXI@    D,?IFCB+((^P1C-1)*36);
       @       LXI@    H,.I^P2C^P3C;
       @       CALL@   ?ATACH;
       @       EXTRN@  ?ATACH,?IFCB;
:WRITE $$;
       @       LDA@    .^P1C^P2C;
       @       CALL@   ?WRNXT;
       @       EXTRN@  ?WRNXT;
:CLOSE $$;
       @       LXI@    H,.^P1C^P2C;
       @       CALL@   ?BCLOF;
       @       EXTRN@  ?BCLOF;
:STOP $;
       @       MVI@    A,^P1C;
       @       CALL@   ?ISTOP;
       @       EXTRN@  ?ISTOP;
:OPEN $$ FOR $$ AT I$$;
       @       LXI@    D,.^P1C^P2C;
       @       LDA@    .^P3C^P4C;
       @       LHLD@   .I^P5C^P6C;
       @       CALL@   ?IOPEN;
       @       EXTRN@  ?IOPEN;
:ENDSUB;
       @       RET;
:RETURN;
       @       RET;
:EXTERNAL PROCEDURE $$;
       @       CALL@   ..$$;
       @       EXTRN@  ..$$;
:READ $$ FROM $$;
       @       LXI@    H,.^P1C^P2C;
       @       LXI@    D,.^P3C^P4C;
       @       CALL@   ?BREAD;
       @       EXTRN@  ?BREAD;
:WRITE $$ INTO $$;
       @       LDA@    .^P1C^P2C;
       @       LXI@    D,.^P3C^P4C;
       @       CALL@   ?BWRIT;
       @       EXTRN@  ?BWRIT;
:ENDMAIN;
       @       CALL@   ?ENDING;
       @       JMP@    ?BOOT;
:LOC $$;
       ?LL0^P1C^P2C@:;
:CHOOSE ON $$;
       @       LDA@    .^P1C^P2C;
       @       STA@    .ERASER.;
       ^U0S; GENERATE LABEL FOR ENDCHOOSE OR DEFAULT
       ^N3S; PUT A 3 ON THE STACK TO KILL JUMP WITH AN ORG
       ^U1S; PUT .UP LABEL ON THE STACK
:DEFAULT;
       ^!0P^!9P^!8P
       @       JMP@    .XC^P0N;
       @       ORG@    $-^P9N;
       .UP^P8N@:;
       ^P0S
:ENDCHOOSE;
       .XC^!0N@:;
:WHILE;
       ^U0S.X^S0N@:;
:ON $$;
       @       LDA@    .^P1C^P2C;
       @       ORA@    A;
       @       JZ@     .W^S0N;
:ENDWHILE;
       @       JMP@    .X^S0N;
       .W^!0N@:;
:SUB $$;
       ..^P1C^P2C@:;
:IF $$;
       @       LDA@    .^P1C^P2C;
       @       ORA@    A;

       @       JZ@     .F^U0S^S0N;
:ELSE;
       @       JMP@    .F^U0P^P0N^!9P;
       .F^P9N@:;
       ^P0S
:ENDIF;
       .F^!0N@:;
:BYTE $$;
       .^P1C^P2C@:@    DS@     1;
:INT I$$;
       .I^P1C^P2C@:@   DS@     2;
:BYTE $$($$$$$);
       .^P1C^P2C@:@    DS@     ^V3S^V4*^V5*^V6*^V7*^!0N;
:BYTE $$($$$);
       .^P1C^P2C@:@    DS@     ^V3S^V4*^V5*^!0N;
:INT I$$($$$$$);
       .I^P1C^P2C@:@   DS@     2*^V3S^V4*^V5*^V6*^V7*^!0N;
:INT I$$($$$);
       .I^P1C^P2C@:@   DS@     2*^V3S^V4*^V5*^!0N;
:BOTTOM;
       @       DSEG;
       @       DS@     60;
       ?STACK@:@       DW@     0;
       @       END@    ?START;
:READBUF $$;
       @       LXI@    D,.^P1C^P2C;
       @       CALL@   ?RDBUF;
       @       EXTRN@  ?RDBUF;
:WRITEBUF $$;
       @       LXI@    D,.^P1C^P2C;
       @       CALL@   ?WRBUF;
       @       EXTRN@  ?WRBUF;
:READ $$;
       @       CALL@   ?RNX;
       @       EXTRN@  ?RNX;
       @       STA@    .^P1C^P2C;
:LOCAL VARIABLES;
       @       DSEG;
:ENDLOCAL;
       @       CSEG;
:EXTERNAL PROCEDURE NAME $$;
       @       PUBLIC@ ..^P1C^P2C;
       @       CSEG;
       ..^P1C^P2C@:;
:PROCEDURE END;
       @       RET;
       @       END;