home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug017.ark / MINOL.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  13.3 KB  |  857 lines

  1.     ORG    116Q
  2. MEMEND    EQU    2FFFH
  3. OS    EQU    8800H
  4. OUT    EQU    4
  5. CRLF    EQU    1
  6. INPUT    EQU    2
  7. RESET    EQU    0
  8. CR    EQU    13
  9. MINOL:    MVI    A,']'    ;OUTPUT PROMPT
  10.     RST    OUT
  11.     CALL    INPTXT    ;GET INPUT LINE
  12.     LXI    H,TXT    ;POINT TO INPUT TEXT WITH HL
  13.     MOV    A,M
  14.     CALL    CHEKN    ;CHECK FOR LABEL
  15.     JNC    DIRECT    ;IF NO LABEL, GO EXECUTE COMMAND
  16. FND:    INX    H    ;POINT TO FIRST NON-NUMERIC CHAR
  17.     MOV    A,M
  18.     CALL    CHEKN
  19.     JC    FND
  20.     CALL    MKBIN    ;CONVERT ASCII LABEL TO BINARY
  21.     LXI    D,PROG    ;THIS SECTION EDITS LINES OF THE PROGRAM
  22. ZIP:    LDAX    D
  23.     CPI    CR
  24.     INX    D
  25.     JNZ    ZIP
  26.     LDAX    D    ;LOOK AT LINE NUMBER
  27.     CPI    -1
  28.     JZ    INSRT
  29.     STC
  30.     CMC
  31.     CMP    B
  32.     JC    ZIP    ;POINT TO LINE NUMBER GREATER THAN OR
  33. INSRT:    MOV    A,M    ;OR EQUAL TO ENTERED LABEL
  34.     CPI    CR
  35.     JZ    EKIL    ;IF LABEL ALONE, DELETE LINE
  36.     MVI    C,2
  37. IHR:    INX    H    ;COUNT LENGTH OF LINE AND ADD 2
  38.     MOV    A,M
  39.     INR    C
  40.     CPI    CR
  41.     JNZ    IHR
  42. OHIO:    LDAX    D    ;IF LINE ENTERED ALREADY EXISTS, FIRST
  43.     CMP    B    ;DELETE THE OLD ONE, THEN INSERT NEW 
  44.     JNZ    IBYH
  45. PZIY:    PUSH    D
  46.     CALL    KILLINE
  47.     POP    D
  48. IBYH:    MOV    H,D    ;HL POINTS TO FIRST LOCATION WHERE NEW
  49.     MOV    L,E    ;LINE WILL BE PLACED
  50.     PUSH    D    ;SAVE POSITION IN STACK
  51. EHR:    INX    D
  52.     LDAX    D
  53.     CPI    -1
  54.     JNZ    EHR    ;CONTINUE UNTIL DE POINTS TO END OF FILE
  55.     MOV    A,C    ;LENGTH OF NEW LINE IN A
  56.     MOV    B,D
  57.     MOV    C,E
  58. HBY:    INX    D
  59.     INX    H
  60.     PUSH    PSW
  61.     MOV    A,E
  62.     CPI    MEMEND AND 0FFH    ;MEMORY LIMIT
  63.     JNZ    HII
  64.     MOV    A,D
  65.     CPI    MEMEND SHR 8
  66.     JZ    ERR6    ;OUT OF MEMORY ERROR
  67. HII:    POP    PSW
  68.     DCR    A
  69.     JNZ    HBY    ;INCREMENT UNTIL DE POINTS TO NEW 
  70. UPDT:    LDAX    B    ;END-OF-FILE POSITION, AND HL POINTS
  71.     STAX    D    ;TO WHERE FILE UPDATING BEGINS
  72.     MOV    A,E    ;BC POINTS TO END-OF-FILE
  73.     CMP    L
  74.     JNZ    NHR
  75.     MOV    A,D
  76.     CMP    H
  77.     JZ    NET
  78. NHR:    DCX    B
  79.     DCX    D
  80.     JMP    UPDT    ;RELOCATE FILE LEAVING SPACE FOR NEW LINE
  81. NET:    POP    D    ;RETRIEVE POINTER
  82.     LXI    H,TXT
  83. IFD:    INX    H
  84.     MOV    A,M
  85.     CALL    CHEKN
  86.     JC    IFD    ;POINT TO FIRST NON-NUMERIC CHARACTER
  87.     LDA    BIN    ;PUT LINE NUMBER IN A
  88.     STAX    D    ;STORE LINE NUMBER IN FILE
  89. NTAT:    INX    D    ;STORE LINE TEXT IN FILE
  90.     MOV    A,M
  91.     STAX    D
  92.     INX    H
  93.     CPI    CR
  94.     JNZ    NTAT
  95.     RST    RESET    ;GO BACK TO MONITOR SECTION
  96. EKIL:    CALL    KILLINE    ;DELETE LINE
  97.     RST    RESET
  98. KILLINE: LDAX D    ;DELETE A LINE
  99.     CMP    B
  100.     RNZ    ;IF DELETING A LINE THAT DOES NOT EXIST,RETURN
  101.     MOV    H,D
  102.     MOV    L,E
  103. BBL:    INX    H
  104.     MOV    A,M
  105.     CPI    CR
  106.     JNZ    BBL    ;POINT TO NEXT LINE
  107. ARK:    INX    H    ;RELOCATE FILE, DELETING LINE
  108.     MOV    A,M
  109.     STAX    D
  110.     CPI    -1
  111.     RZ
  112.     INX    D
  113.     JMP    ARK
  114. DIRECT: RST    CRLF    ;DIRECT EXECUTION OF A STATEMENT
  115.     XRA    A
  116.     STA    LNE    ;SET LNE (CURRENT LINE NO.) = 0
  117.     JMP    EXEC    ;EXECUTE STATEMENT
  118. RUN:    LXI    H,PROG    ;RUN STATEMENT: START FROM BEGINNING OF 
  119. LPUB:    MOV    A,M    ;PROGRAM. GET NEXT STATEMENT
  120.     CPI    ':'
  121.     INX    H
  122.     JZ    EXEC    ;IF NOT A NEW LINE, GO EXECUTE STATEMENT
  123.     CPI    CR
  124.     JNZ    LPUB
  125. BIB:    MOV    A,M
  126.     CPI    -1
  127.     JZ    RESET    ;IF STATEMENT NO. = 377 (END OF PROGRAM),
  128.     STA    LNE    ; GO BACK TO MONITOR
  129.     INX    H    ;IF NOT 377, STORE CURRENT LINE NO. AT LNE
  130. EXEC:    CALL    INT    ;CHECK FOR KEYBOARD INTERRUPT
  131.     INX    H
  132.     MOV    A,M
  133.     CPI    '='    ;CHECK FOR = IN SECOND COLUMN (ASSIGNMENT)
  134.     JZ    LET
  135.     DCX    H
  136.     MOV    A,M
  137.     CPI    '('    ;IF ( IN FIRST COLUMN (MEMORY LOCATION
  138.     JZ    LET    ; ASSIGNMENT) GO TO LET
  139.     CPI    'C'    ;CHECK FOR 'C'
  140.     JNZ    GSM    ;IF NOT, GO ON
  141.     INX    H
  142.     MOV    A,M
  143.     CPI    'A'
  144.     JZ    CALL    ;CALL STATEMENT
  145.     CPI    'L'
  146.     JZ    CLR    ;CLEAR STATEMENT
  147.     JMP    ERR3    ;IF NEITHER, REPORT ERROR
  148. GSM:    CPI    'E'    ;CHECK FOR 'E' AS IN END
  149.     JZ    RESET
  150.     CPI    'G'
  151.     JZ    GOTO
  152.     CPI    '"'    ;CHECK FOR " INDICATING REM STATEMENT
  153.     JZ    LPUB
  154.     CPI    'N'
  155.     JZ    NEW
  156.     CPI    'P'
  157.     JZ    PR
  158.     CPI    'O'
  159.     JZ    OS    ;ADDRESS OF USER'S MONITOR
  160.     CPI    'R'
  161.     JZ    RUN
  162.     CPI    'I'
  163.     JNZ    LS
  164.     INX    H
  165.     MOV    A,M
  166.     CPI    'N'
  167.     JZ    IN
  168.     CPI    'F'
  169.     JZ    IF
  170.     JMP    ERR3
  171. LS:    CPI    'L'
  172.     JNZ    ERR3
  173.     INX    H
  174.     MOV    A,M
  175.     CPI    'E'
  176.     JZ    LET
  177.     CPI    'I'
  178.     JZ    LIST
  179.     JMP    ERR3
  180. LET:    MOV    A,M    ;LET STATEMENT EXECUTOR
  181.     CALL    TERM    ;FIND '='
  182.     JC    ERR5    ;REPORT ERROR IF NO '=' BEFORE CR OR ':'
  183.     CPI    '='
  184.     INX    H
  185.     JNZ    LET
  186.     LXI    D,EXPR    ;TRANSFER EXPRESSION TEXT TO 
  187. MRENX:    MOV    A,M    ;EXPRESSION BUFFER
  188.     STAX    D
  189.     CALL    TERM
  190.     INX    H
  191.     INX    D
  192.     JNC    MRENX
  193.     CALL    EXPRS
  194. SERCH:    MOV    A,M    ;GO BACK BEFORE '='
  195.     CPI    '='
  196.     DCX    H
  197.     JNZ    SERCH
  198.     MOV    A,M
  199.     CALL    CHEKLTR
  200.     JNC    INLET    ;IF NOT VARIABLE, GET MEMORY ADDRESS
  201.     CALL    GETADR
  202.     MOV    A,C
  203.     STAX    D    ;STORE IN VARIABLE
  204.     JMP    LPUB    ;NEXT STATEMENT
  205. INLET:    CPI    ')'
  206.     JNZ    ERR4
  207. JHR:    DCX    H
  208.     MOV    A,M
  209.     CPI    '('
  210.     JNZ    JHR
  211.     MOV    A,C
  212.     PUSH    PSW
  213.     CALL    VAL    ;GET MEMORY LOCATION IN BC
  214.     POP    PSW
  215.     STAX    B
  216.     JMP    LPUB
  217. PR:    INX    H    ;PR STATEMENT EXECUTOR
  218.     INX    H    ;SKIP ASSUMED CHARACTERS
  219.     MOV    A,M
  220.     CALL    TERM    ;IF BLANK PRINT, GO TO CR
  221.     JC    DCR
  222. NXTE:    CPI    '"'    ;CHECK FOR LITERAL
  223.     JNZ    VAR    ;IF NOT, GO ON
  224. HR:    INX    H    ;PRINT TEXT UNTIL " FOUND
  225.     MOV    A,M
  226.     CPI    '"'
  227.     JZ    MRENO
  228.     CALL    TERM    ;IF TERMINATOR BEFORE CLOSING QUOTE, ERROR
  229.     JC    ERR5
  230.     RST    OUT
  231.     JMP    HR
  232. MRENO:    INX    H
  233.     MOV    A,M
  234.     CALL    TERM    ;IF END OF STATEMENT WITHOUT SEMICOLON, DO CR
  235.     JC    DCR
  236.     CPI    ';'
  237.     JNZ    ERR5
  238.     INX    H
  239.     MOV    A,M
  240.     CALL    TERM    ;IF TERM AFTER SEMICOLON, DO NOT PRINT CR
  241.     JC    NCR
  242.     JMP    NXTE
  243. DCR:    RST    CRLF
  244. NCR:    JMP    LPUB
  245. VAR:    CPI    '$'
  246.     JZ    STR    ;CHECK IF STRING
  247.     LXI    D,EXPR
  248.     MVI    A,' '    ;OUTPUT LEADING SPACE
  249.     RST    OUT
  250. ER:    MOV    A,M    ;TRANSFER EXPRESSION TEXT FROM PROGRAM TEXT
  251.     STAX    D    ; TO EXPRESSION BUFFER
  252.     INX    H
  253.     INX    D
  254.     CALL    TERM
  255.     JC    HRX
  256.     CPI    ';'
  257.     JNZ    ER
  258. HRX:    DCX    H
  259.     DCX    D
  260.     MVI    A,CR
  261.     STAX    D
  262.     CALL    EXPRS
  263.     MOV    B,C
  264.     CALL    PBINBCD    ;PRINT EXPRESSION'S VALUE
  265.     MVI    A,' '
  266.     RST    OUT
  267.     JMP    MRENO+1
  268. STR:    INX    H
  269.     CALL    VAL    ;GET START ADDRESS OF STRING IN BC AND PRINT
  270. MRE:    LDAX    B
  271.     RST    OUT
  272.     CPI    -1
  273.     INX    B
  274.     JNZ    MRE
  275.     INX    H
  276.     JMP    MRENO+1
  277. IN:    INX    H    ;INPUT STATEMENT
  278.     IN    -1
  279.     CPI    0    ;IF SENSE SWITCHES DOWN, PRINT '?'
  280.     JNZ    EAHR
  281.     MVI    A,'?'
  282.     RST    OUT
  283.     MVI    A,' '
  284.     RST    OUT
  285. EAHR:    MOV    A,M
  286.     CALL    CHEKLTR    ;CHECK FOR VARIABLE
  287.     JC    LVB
  288.     CPI    '$'    ;CHECK FOR INPUT STRING
  289.     JZ    STRIN
  290.     CPI    '('    ;CHECK FOR SINGLE MEMORY LOCATION
  291.     JNZ    ERR4
  292.     CALL    VALDE    ;GET LOCATION IN DE
  293.     PUSH    H
  294.     JMP    HS
  295. LVB:    PUSH    H
  296.     CALL    GETADR    ;GET ADDRESS OF LETTER VARIABLE
  297. HS:    PUSH    D
  298. IHERE:    CALL    INPTXT    ;INPUT A LINE
  299.     RST    CRLF
  300.     LXI    H,TXT
  301.     MOV    A,M
  302.     CALL    CHEKN    ;CHECK FOR A NUMBER
  303.     JNC    LETR
  304. FD:    INX    H
  305.     MOV    A,M
  306.     CALL    CHEKN
  307.     JC    FD    ;POINT TO FIRST NON-NUMERIC CHAR
  308.     PUSH    B
  309.     CALL    MKBIN    ;CONVERT ASCII INPUT DATA TO BINARY
  310.     POP    B
  311. LETR:    POP    D
  312.     STAX    D    ;PUT A IN VARIABLE
  313. CHK:    POP    H
  314.     INX    H
  315.     MOV    A,M
  316.     CPI    ','    ;CHECK FOR MORE INPUT VARIABLES
  317.     JZ    IN
  318.     CALL    TERM
  319.     JC    LPUB
  320.     JMP    ERR5
  321. STRIN:    INX    H    ;INPUT STRING
  322.     CALL    VAL    ;GET FIRST MEMORY LOCATION IN BC
  323.     PUSH    H
  324.     PUSH    B
  325.     CALL    INPXT
  326.     POP    B
  327.     RST    CRLF
  328.     LXI    H,TXT
  329. LD:    MOV    A,M    ;STORE TEXT BEGINNING AT SPECIFIED LOC
  330.     CPI    CR
  331.     JZ    TE
  332.     STAX    B
  333.     INX    B
  334.     INX    H
  335.     JMP    LD
  336. TE:    MVI    A,-1    ;STORE 377 AT END OF STRING
  337.     STAX    B
  338.     JMP    CHK
  339. CLR:    LXI    D,VARSTOR    ;CLEAR EXECUTOR    VAR STORAGE
  340. LCR:    XRA    A
  341.     STAX    D
  342.     INX    D
  343.     MOV    A,E
  344.     CPI    VAREND    ;LAST VARIABLE LOCATION
  345.     JNZ    LCR
  346.     JMP    LPUB
  347. CALL:    NOP    ;SKIP ASSUMED CHARACTERS
  348.     INX    H
  349.     INX    H
  350.     INX    H
  351.     CALL    VAL    ;GET ADDRESS IN BC
  352.     PUSH    H
  353.     PUSH    D
  354.     LXI    D,RET    ;LOAD DE WITH RETURN ADDRESS
  355.     PUSH    D    ;PUSH RETURN ADDRESS ONTO STACK
  356.     MOV    H,B
  357.     MOV    L,C
  358.     PCHL    ;JUMP TO USER'S SUBROUTINE
  359. RET:    POP    D
  360.     POP    H
  361.     JMP    LPUB
  362. NEW:    LXI    D,PROG    ;'NEW' PROCESSOR
  363.     MVI    A,CR    ;INITIALIZE PROGRAM AREA
  364.     STAX    D
  365.     INX    D
  366.     MVI    A,-1
  367.     STAX    D
  368.     RST    RESET
  369. INT:    PUSH    PSW    ;THIS ROUTINE CHECKS FOR CONTROL C
  370.     IN    10H
  371.     CPI    3    ;CONTROL C
  372.     JZ    BREAK
  373.     POP    PSW
  374.     RET
  375. BREAK:    POP    D
  376.     POP    D
  377.     POP    D
  378.     POP    D
  379.     RST    CRLF
  380.     LXI    D,BRKMSG
  381.     CALL    PRNTXT
  382.     JMP    ATX
  383. GOTO:    INX    D    ;GOTO EXECUTOR
  384.     INX    H    ;SKIP ASSUMED CHARACTERS
  385.     INX    H
  386.     INX    H
  387.     LXI    D,EXPR    ;CALCULATE VALUE OF EXPRESSION
  388. RME:    MOV    A,M
  389.     STAX    D
  390.     CALL    TERM
  391.     INX    H
  392.     INX    D
  393.     JNC    RME
  394.     CALL    EXPRS
  395.     MOV    B,C
  396.     MOV    A,C
  397.     CPI    0    ;??????????!!!!CPI 0 ????
  398.     JNZ    JUMP
  399.     LXI    H,TXT
  400.     JMP    DIRECT
  401. JUMP:    LXI    H,PROG    ;GOTO EXPRESSION
  402. DUP:    MOV    A,M
  403.     CPI    CR
  404.     INX    H
  405.     JNZ    DUP
  406.     MOV    A,M
  407.     CPI    -1
  408.     JZ    ERR1
  409.     CMP    B
  410.     JNZ    DUP
  411.     JMP    BIB
  412. ERRMSG: DB    '!ERR ',-1
  413. AT:    DB    ' AT ',-1
  414. BRKMSG: DB    'BREAK',-1
  415. BIN:    DB    0
  416. LNE:    DW    0    ;CURRENT LINE NUMBER
  417. ACT:    PUSH    B    ;GETS THE VALUE OF A MEMORY LOCATION
  418.     XCHG
  419.     CALL    VAL    ;PART OF THE EXPRS SUBROUTINE TO FOLLOW
  420.     XCHG
  421.     LDAX    B
  422.     POP    B
  423.     MOV    B,A
  424. NXGT:    INX    D
  425.     JMP    GETNET
  426. NOTEQ:    MOV    A,E    ;IF TWO EXPRESSIONS ARE NOT EQUAL, EXECUTE
  427.     CMP    C    ;STATEMENT (PART OF IF STATEMENT EXECUTOR
  428.     JNZ    EXEC    ;TO FOLLOW)
  429.     JMP    LPUB
  430. VALDE:    CALL    VAL
  431.     MOV    D,B
  432.     MOV    E,C
  433.     RET
  434. EXPRS:    PUSH    H    ;CALCULATES THE VALUE OF AN EXPRESSION
  435.     LXI    D,EXPR-1    ;STORED IN MEMORY
  436.     MVI    C,0    ;DE IS THE CURSOR
  437. RETPT:    LDAX    D
  438.     CALL    TERM    ;CHECK FOR END OF EXPRESSION
  439.     JNC    GOMOR
  440.     POP    H
  441.     RET
  442. GOMOR:    PUSH    PSW    ;SAVE OPERATION ON STACK
  443.     INX    D    ;GET TERM/FACTOR
  444.     LDAX    D
  445.     CPI    47Q    ;SINGLE CHARACTER VALUE
  446.     JZ    ASC
  447.     CPI    '('    ;MEMORY LOCATION
  448.     JZ    ACT
  449.     CPI    '!'    ;RANDOM NUMBER
  450.     JZ    RND
  451.     CALL    CHEKN
  452.     JC    CONSTANT    ;CONSTANT (NUMBER)
  453.     CALL    CHEKLTR
  454.     JNC    ERR5
  455.     INX    D
  456. IVAR:    PUSH    D    ;VARIABLE
  457.     CALL    GETADR
  458.     LDAX    D
  459.     MOV    B,A
  460.     POP    D
  461. GETNET: POP    PSW    ;RETRIEVE OPERATION
  462.     CPI    '+'
  463.     JZ    ADD
  464.     CPI    '-'
  465.     JZ    SUB
  466.     CPI    '*'
  467.     JZ    MULT
  468.     CPI    '/'
  469.     JZ    DIV
  470.     JMP    ERR5
  471. ADD:    MOV    A,C    ;ADD C=C+B
  472.     ADD    B
  473.     MOV    C,A
  474.     JMP    RETPT
  475. SUB:    MOV    A,C    ;C=C-B
  476.     SUB    B
  477.     MOV    C,A
  478.     JMP    RETPT
  479. MULT:    MOV    A,C    ;C=C*B
  480.     DCR    B
  481. GBK:    ADD    C
  482.     DCR    B
  483.     JNZ    GBK
  484.     MOV    C,A
  485.     JMP    RETPT
  486. DIV:    MOV    A,C    ;C=C/B
  487.     MVI    C,0
  488. CTUE:    INR    C    
  489.     SUB    B
  490.     JZ    ZER
  491.     JC    MIN
  492.     JMP    CTUE
  493. MIN:    DCR    C
  494. ZER:    JMP    RETPT
  495. CONSTANT: INX D
  496.     LDAX    D
  497.     CALL    CHEKN
  498.     JC    CONSTANT
  499.     XCHG
  500.     CALL    SURE
  501.     XCHG
  502.     MOV    B,A
  503.     JMP    GETNET
  504. ASC:    INX    D
  505.     LDAX    D
  506.     MOV    B,A
  507.     INX    D
  508.     JMP    NXGT
  509. RND:    LXI    H,SH+3
  510.     MVI    B,8
  511.     MOV    A,M
  512. RTOP:    RLC
  513.     RLC
  514.     RLC
  515.     XRA    M
  516.     RAL
  517.     RAL
  518.     DCR    L
  519.     DCR    L
  520.     DCR    L
  521.     MOV    A,M
  522.     RAL
  523.     MOV    M,A
  524.     INR    L
  525.     MOV    A,M
  526.     RAL
  527.     MOV    M,A
  528.     INR    L
  529.     MOV    A,M
  530.     RAL    
  531.     MOV    M,A
  532.     INR    L
  533.     MOV    A,M
  534.     RAL
  535.     MOV    M,A
  536.     INR    B
  537.     JNZ    RTOP
  538.     MOV    B,A
  539.     JMP    NXGT
  540. SH:    DB    21Q,231Q,132Q,351Q    ;SEED
  541. INPTXT: MVI    C,0    ;INPUT A LINE OF 72 CHARACTERS
  542. INPXT:    LXI    H,TXT-1
  543. INO:    RST    INPUT
  544. HRER:    MOV    B,A
  545.     MOV    A,C
  546.     CPI    0    ;??????!!!!! CPI 0 ???
  547.     MOV    A,B
  548.     JNZ    MID
  549.     CPI    ' '
  550.     JZ    INO    ;DO NOT ACCEPT SPACE IF OUTSIDE QUOTES
  551. MID:    CPI    '"'
  552.     JNZ    GOON
  553.     MOV    A,C
  554.     CPI    0    ;??????!!!!! CPI 0 ?
  555.     JZ    MRF
  556.     MVI    C,0
  557.     JMP    GOON
  558. MRF:    MVI    C,3
  559. GOON:    CPI    14Q    ;IF CONTROL L REDO LINE
  560.     JNZ    HRD
  561.     MVI    A,'\'
  562.     RST    OUT
  563.     RST    CRLF
  564.     JMP    INPTXT
  565. HRD:    CPI    CR
  566.     JNZ    CHM
  567.     JMP    HELP
  568. CHM:    CPI    23Q    ;IF CONTROL S GO BACK A CHARACTER
  569.     JNZ    CTN
  570.     MVI    A,'_'
  571.     RST    OUT
  572.     DCX    H
  573.     JMP    INO
  574. CTN:    MOV    A,L
  575.     CPI    TXTEND
  576.     JZ    ERR2    ;IF OVER 72 CHARACTERS REPORT ERROR
  577.     INX    H
  578. STOR:    MOV    M,B
  579.     JMP    INO
  580. ERR1:    MVI    B,'1'
  581.     JMP    ERR
  582. ERR2:    MVI    B,'2'
  583.     JMP    ERR
  584. ERR3:    MVI    B,'3'
  585.     JMP    ERR
  586. ERR4:    MVI    B,'4'
  587.     JMP    ERR
  588. ERR5:    MVI    B,'5'
  589.     JMP    ERR
  590. ERR6:    MVI    B,'6'
  591. ERR:    RST    CRLF    ;PRINT 'ERR' MESSAGE
  592.     LXI    D,ERRMSG
  593.     CALL    PRNTXT
  594.     MOV    A,B
  595.     RST    OUT
  596. ATX:    LXI    D,AT
  597.     CALL    PRNTXT
  598.     LDA    LNE
  599.     MOV    B,A
  600.     CALL    PBINBCD
  601.     RST    0
  602. MKBIN:    PUSH    D    ;GET VALUE OF ASCII NUMBERS
  603.     DCX    H
  604.     MOV    A,M
  605.     SUI    '0'
  606.     MOV    B,A
  607.     DCX    H
  608.     MOV    A,M
  609.     CALL    CHEKN
  610.     JC    STOC
  611.     MVI    C,0
  612.     MVI    E,0    ;!!!!! SAVE A BYTE--USE MOV E,C
  613.     JMP    INK2
  614. STOC:    SUI    '0'
  615.     MOV    C,A
  616. ENT:    DCX    H
  617.     MOV    A,M
  618.     CALL    CHEKN
  619.     JC    STOE
  620.     MVI    E,0
  621.     JMP    INK3
  622. STOE:    MOV    A,M
  623.     SUI    '0'
  624.     MOV    E,A
  625. INK3:    INX    H
  626. INK2:    INX    H
  627.     INX    H
  628.     CALL    BCDBIN
  629.     MOV    A,B
  630.     STA    BIN
  631.     POP    D
  632.     RET
  633. GETADR: PUSH    H    ;GET ADDRESS OF VARIABLE
  634.     LXI    D,VARSTOR
  635.     SUI    'A'
  636.     MVI    H,0
  637.     MOV    L,A
  638.     DAD    D
  639.     XCHG
  640.     POP    H
  641.     RET
  642. PRNTXT: LDAX    D    ;PRINT TEXT POINTED BY DE
  643.     CPI    -1
  644.     RZ
  645.     RST    OUT
  646.     INX    D
  647.     JMP    PRNTXT
  648. CHEKLTR:    STC    ;CHECK IF CHAR IS A LETTER
  649.     CMC
  650.     CPI    'A'
  651.     JC    NOTAP
  652.     STC
  653.     CPI    'Z'+1
  654.     RET
  655. NOTAP:    CMC
  656.     RET
  657. VARSTOR: DS    27    ;VARIABLE STORAGE
  658. VAREND: DS    1
  659. TERM:    CPI    CR    ;CHECK FOR STATEMENT TERMINATOR
  660.     JZ    YES
  661.     CPI    ':'
  662.     JZ    YES
  663.     STC
  664.     CMC    ;!!!!! THIS CAN BE DONE WITH ORA A
  665.     RET
  666. YES:    STC
  667.     RET
  668. CHEKN:    STC
  669.     CMC    ;!!!!!!!!! USE ORA A HERE
  670.     CPI    '0'
  671.     JC    NOTA
  672.     STC
  673.     CPI    '9'+1
  674. NOT:    RET
  675. NOTA:    CMC
  676.     RET
  677. BCDBIN: MVI    A,10    ;BCD TO BINARY ROUTINE
  678.     ADD    B
  679.     MOV    B,A
  680.     DCR    C
  681.     JNZ    BCDBIN
  682. SEC:    MOV    C,E
  683.     MOV    A,E
  684.     CPI    -1
  685. THI:    RZ
  686.     MVI    A,100
  687.     ADD    B
  688.     MOV    B,A
  689.     DCR    C
  690.     JMP    THI
  691. LIST:    LXI    D,PROG+1    ;LIST COMMAND
  692. NEXN:    LDAX    D
  693.     CPI    -1
  694.     JZ    LPUB
  695.     MOV    B,A
  696.     CALL    PBINBCD
  697.     MVI    A,' '
  698.     RST    OUT
  699.     INX    D
  700.     LDAX    D
  701. OU:    RST    OUT
  702.     CPI    CR
  703.     JNZ    MREN
  704.     INX    D
  705.     RST    CRLF
  706.     JMP    NEXN
  707. MREN:    INX    D
  708.     LDAX    D
  709.     JMP    OU
  710. PBINBCD: PUSH B    ;PRINT BINARY NUMBER
  711.     PUSH    D
  712.     MVI    D,0
  713.     MOV    C,D
  714.     MOV    A,B
  715. IFIR:    SUI    100
  716.     JC    ISEC
  717.     INR    C
  718.     JMP    IFIR
  719. ISEC:    MVI    B,100
  720.     ADD    B
  721.     MOV    B,A
  722.     MVI    A,'0'
  723.     ADD    C
  724.     CPI    '0'
  725.     JZ    NP
  726.     RST    OUT
  727. COM:    MVI    C,0
  728.     MOV    A,B
  729. ITHR:    SUI    10
  730.     JC    FOR
  731.     INR    C
  732.     JMP    ITHR
  733. FOR:    MVI    B,10
  734.     ADD    B
  735.     MOV    B,A
  736.     MVI    A,'0'
  737.     ADD    C
  738.     CPI    '0'
  739.     JZ    INU
  740. IPR:    RST    OUT
  741. DPR:    MVI    A,'0'
  742.     ADD    B
  743.     RST    OUT
  744.     POP    D
  745.     POP    B
  746.     RET
  747. NP:    MVI    D,1
  748.     JMP    COM
  749. INU:    MOV    C,A
  750.     XRA    A
  751.     CMP    D
  752.     MOV    A,C
  753.     JNZ    DPR
  754.     JMP    IPR
  755. SURE:    PUSH    B    ;SAVES BC AND CALLS MKBIN
  756.     CALL    MKBIN
  757.     POP    B
  758.     RET
  759. HELP:    INX    H    ;ADDS 377 TERMINATOR AT END OF INPUT TEXT
  760.     MOV    M,B
  761.     INX    H
  762.     MVI    M,-1
  763.     RET
  764. IF:    LXI    D,EXPR    ;IF STATEMENT
  765. NGO:    INX    H    ;FIRST EXPRESSION
  766.     MOV    A,M
  767.     CPI    43Q    ;# SIGN
  768.     JZ    COMP
  769.     CPI    '='
  770.     JZ    COMP
  771.     CPI    '<'
  772.     JZ    COMP
  773.     CALL    TERM
  774.     JC    ERR5
  775.     STAX    D
  776.     INX    D
  777.     JMP    NGO
  778. COMP:    PUSH    PSW
  779.     MVI    A,CR
  780.     STAX    D
  781.     CALL    EXPRS
  782.     PUSH    B
  783.     LXI    D,EXPR
  784. NXTVR:    INX    H    ;SECOND EXPRESSION
  785.     MOV    A,M
  786.     CPI    ';'
  787.     JZ    PHI
  788.     CALL    TERM
  789.     JC    ERR5
  790.     STAX    D
  791.     INX    D
  792.     JMP    NXTVR
  793. PHI:    INX    H
  794.     MVI    A,CR
  795.     STAX    D
  796.     CALL    EXPRS
  797.     POP    D
  798.     POP    PSW
  799.     CPI    43Q    ;CHECK RELATIONAL OPERATOR    (# SIGN HERE)
  800.     JZ    NOTEQ
  801.     CPI    '<'
  802.     JZ    LESSTH
  803. EQU:    MOV    A,E    ;CHECK IF =
  804.     CMP    C
  805.     JZ    EXEC
  806.     JMP    LPUB
  807. LESSTH: MOV    A,E    ;CHECK IF <
  808.     CMP    C
  809.     JNC    LPUB
  810.     JMP    EXEC
  811. VAL:    PUSH    D    ;GET ADDRESS OF MEMORY LOCATION
  812.     LXI    D,EXPR
  813. SHME:    INX    H
  814.     MOV    A,M
  815.     STAX    D
  816.     CALL    TERM
  817.     INX    D
  818.     JC    ERR5
  819.     CPI    ','
  820.     JNZ    SHME
  821.     DCX    D
  822.     MVI    A,CR
  823.     STAX    D
  824.     CALL    EXPRS
  825.     PUSH    B
  826.     LXI    D,EXPR
  827. MIG:    INX    H
  828.     MOV    A,M
  829.     STAX    D
  830.     CALL    TERM
  831.     INX    D
  832.     JC    ERR5
  833.     CPI    ')'
  834.     JNZ    MIG
  835.     DCX    D
  836.     MVI    A,CR
  837.     STAX    D
  838.     CALL    EXPRS
  839.     MOV    A,C
  840.     POP    B
  841.     MOV    B,C
  842.     MOV    C,A
  843.     POP    D
  844.     RET
  845.     DB    '+'
  846. EXPR:    DS    31    ;EXPRESSION BUFFER
  847. TXT:    DS    72    ;LINE BUFFER (INPUT TEXT)
  848. TXTEND: DS    1
  849.     ORG    3400Q
  850. PROG:    DB    CR,-1
  851.     END    MINOL
  852.