home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug029.ark / EDIT.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  23.4 KB  |  1,291 lines

  1.     TITLE    'EDIT - SUPER EDITOR FOR CP/M'
  2. ;
  3.         ORG 0100H
  4. ;
  5. DFCB1    EQU    5CH    ;FIRST DEFAULT FCB
  6. DFCB2    EQU    6CH    ;SECOND DEFAULT FCB
  7. ;
  8.     XRA    A        ;CLEAR FLAGS
  9.     STA    SWFLG
  10.     STA    EOFFLG
  11.     LXI    SP,STACK    ;SET UP A STACK
  12.     LHLD    1
  13.     LXI    B,3    ;SET UP CONSOLE VECTORS
  14.     DAD    B
  15.     SHLD    CSTS1        ;STATUS VECTOR
  16.     INX    H    
  17.     INX    H    
  18.     INX    H    
  19.     SHLD    CONIN1        ;CONSOLE INPUT VECTOR
  20.     LXI    H,DFCB1+1    ;MAKE SURE THERE'S A FILENAME
  21.     MOV    A,M
  22.     CPI    020H    
  23.     JNZ    HAVNAM    
  24.     MVI    C,9    ;OTHERWISE, DIE WITH ERROR
  25.     LXI    D,NSFMSG
  26.     CALL    5
  27.     RST    0    
  28. HAVNAM:
  29.     LXI    D,IFCB    ;MOVE FIRST FILENAME TO OUR INPUT FCB
  30.     LXI    H,DFCB1
  31.     LXI    B,0CH
  32.     CALL    MOVE    
  33.     LXI    D,IFCB    ;TRY TO OPEN IT
  34.     CALL    OPENF    
  35.     INR    A    
  36.     LDA    DFCB2
  37.     JNZ    OPNDST    
  38.     LXI    D,NEWMSG    ;OPEN FAILED - SAY 'NEW FILE'
  39.     MVI    C,9
  40.     CALL    5
  41.     LXI    H,DFCB1    ;AND CREATE THE FILE
  42.     LXI    D,OFCB
  43.     LXI    B,0CH
  44.     CALL    MOVE    
  45.     LXI    H,SWFLG
  46.     MVI    M,0FFH    ;SET 'CREATE' FLAG
  47.     INX    H    
  48.     MVI    M,01AH    ;SET 'END OF FILE' FLAG
  49.     LDA    DFCB1
  50. OPNDST:
  51.     STA    OFCB        ;SET DESTINATION DRIVE #
  52.     LXI    D,OFCB1    ;COPY NAME FROM FIRST FILE
  53.     CALL    MOVNAM        ;TO OUR OUTPUT FCB
  54.     LXI    D,OFCB    ;CREATE THE OUTPUT FILE
  55.     CALL    MAKFIL    
  56.     JMP    MAIN        ;NOW GO EDIT IT
  57. CONIN:
  58.     CALL    0    ;CONSOLE INPUT
  59. CONIN1    EQU    $-2    ;WHERE TO DROP IN THE ADDRESS
  60.     ANI    07FH        ;STRIP PARITY BIT
  61.     RET        
  62. CONOUT:
  63.     PUSH    B        ;CONSOLE OUTPUT
  64.     PUSH    D        ;SAVE ALL REGS
  65.     PUSH    H    
  66.     MOV    E,C        ;THEN CALL CP/M
  67.     MVI    C,2
  68.     CALL    5
  69.     POP    H        ;RESTORE REGS
  70.     POP    D    
  71.     POP    B    
  72.     RET        
  73. CSTS:
  74.     JMP    0    ;CONSOLE STATUS (BREAK TEST)
  75. CSTS1    EQU    $-2    ;WHERE TO DROP IN THE ADDRESS
  76. GETTOP:
  77.     PUSH    H        ;DETERMINE TOP OF USEABLE RAM
  78.     LHLD    6    ;BY LOOKING AT THE BDOS VECTOR
  79.     DCX    H        ;MINUS ONE
  80.     MOV    B,H    
  81.     MOV    A,L
  82.     POP    H    
  83.     RET        
  84. GETBYT:
  85.     LDA    EOFFLG    ;READ A BYTE FROM THE INPUT FILE
  86.     ORA    A        ;FIRST CHECK END-OF-FILE
  87.     MVI    A,01AH
  88.     RNZ        
  89.     PUSH    B        ;NOW WE KNOW WE'VE GOT SOMETHING
  90.     PUSH    D    
  91.     PUSH    H    
  92. GTBYT1:
  93.     LXI    H,INFCNT    ;CHECK BYTE COUNT IN BUFFER
  94.     INR    M        ;WILL SET MINUS IF AT END
  95.     JM    READF        ; WHICH SAYS TO READ SOME MORE
  96.     MOV    C,M        ;OTHERWISE, ADD COUNT TO BUFFER
  97.     MVI    B,0    ;      ADDRESS, GIVING ADDRESS OF
  98.     LXI    H,INBUF    ;      NEXT BYTE
  99.     DAD    B
  100.     MOV    A,M    ;FETCH THE BYTE
  101.     CPI    01AH    ;MAKE SURE IT'S NOT EOF
  102.     JNZ    L01B6    
  103. L01B3:
  104.     STA    EOFFLG    ;WE READ AN EOF, SO SET THE FLAG
  105. L01B6:
  106.     ANI    07FH        ;STRIP THE PARITY BIT
  107.     POP    H        ;RESTORE REGS
  108.     POP    D    
  109.     POP    B    
  110.     RET            ;AND EXIT
  111. READF:
  112.     LXI    H,INFCNT    ;COME HERE TO READ NEXT BUFFER
  113.     MVI    M,0FFH    ;FIRST RIG THE COUNT SO NEXT INR WILL
  114.     LXI    D,INBUF    ;  GIVE US BYTE ZERO
  115.     MVI    C,01AH    ;ISSUE 'SET DMA ADDRESS' CALL TO CP/M
  116.     CALL    5
  117.     LXI    D,IFCB    ;ISSUE 'READ' CALL TO CP/M
  118.     MVI    C,014H
  119.     CALL    5
  120.     DCR    A        ;A=1 MEANS EOF
  121.     JNZ    GTBYT1        ;OTHERWISE, PROCESS BYTE
  122.     MVI    A,01AH    ;GOT EOF - SEND BACK EOF CHARACTER
  123.     JMP    L01B3    
  124. PUTBYT:
  125.     PUSH    H        ;WRITE A BYTE TO THE OUTPUT FILE
  126.     PUSH    D    
  127.     PUSH    B    
  128.     LXI    H,OUFCNT    ;BUMP OUTPUT BUFFER COUNT
  129.     INR    M        ;GOES NEGATIVE AFTER 128 BYTES
  130.     CM    WRITEF        ;  WHICH SAYS TO FLUSH BUFFER BEFORE CONTINUING
  131.     MOV    C,M    
  132.     MVI    B,0    ;ADD BYTE COUNT TO BUFFER BASE ADDRESS
  133.     LXI    H,OUTBUF    ;GIVING ADDRESS OF NEXT BYTE
  134.     DAD    B
  135.     POP    B        ;CHARACTER WAS IN C AT ENTRY
  136.     PUSH    B        ;SO REFRESH IT
  137.     MOV    M,C        ;AND STORE IN BUFFER
  138.     MOV    A,C        ;WAS IT AN EOF?
  139.     CPI    01AH
  140.     JNZ    L0218    
  141.     MVI    A,RET    ;WE WROTE AN EOF, SO DISABLE WRITE ROUTINE
  142.     STA    PUTBYT        ;BY MAKING FIRST INSTRUCTION 'RET'
  143.     LXI    H,OUFCNT    ;NOW FLUSH LAST OUTPUT BUFFER
  144.     CALL    WRITEF    
  145.     MVI    C,010H    ;CLOSE THE OUTPUT FILE
  146.     LXI    D,OFCB
  147.     CALL    5
  148.     LXI    H,IFCB1    ;MOVE INPUT NAME TO SECOND HALF OF
  149.     LDA    OFCB        ;OUTPUT FCB, IN PREPARATION
  150.     LXI    D,OFCBRN    ;FOR RENAME OPERATION
  151.     STAX    D
  152.     INX    D
  153.     LXI    B,0BH
  154.     CALL    MOVE    
  155. L0218:
  156.     POP    B        ;RESTORE REGISTERS AND EXIT
  157.     POP    D    
  158.     POP    H    
  159.     RET        
  160. WRITEF:
  161.     MVI    M,0    ;COME HERE TO FLUSH OUTPUT BUFFER
  162.     MVI    C,01AH    ;  CLEAR BYTE COUNT
  163.     LXI    D,OUTBUF    ;ISSUE 'SET DMA ADDRESS' TO CP/M
  164.     CALL    5
  165.     LXI    D,OFCB    ;ISSUE 'WRITE' TO CP/M
  166.     MVI    C,015H
  167.     CALL    5
  168.     LXI    H,OUFCNT    ;POINT TO BYTE COUNT (PUTBYT NEEDS IT)
  169.     CPI    2    ;TEST FOR 'NO SPACE' ERROR (A=2)
  170.     RNZ            ;NO ERROR - RETURN
  171.     LXI    D,NSPMSG    ;SCREAM ABOUT ERROR
  172.     MVI    C,9
  173.     CALL    5
  174.     LXI    D,OFCB    ;CLOSE OUTPUT FILE (SAVE WHAT WE CAN)
  175.     MVI    C,010H
  176.     CALL    5
  177. BYEBYE:
  178.     LDA    SWFLG    ;EXIT FROM EDITOR - FIRST CHECK CREATE FLAG
  179.     ORA    A    
  180.     JNZ    0    ;NO CREATE
  181.     LXI    D,IFCB    ;YES CREATE - WE MUST CLOSE IT
  182.     MVI    C,010H
  183.     CALL    5
  184.     RST    0        ;THEN EXIT
  185. MAKFIL:    ;PERFORM ALL STEPS OF CREATING A FILE
  186.     PUSH    D        ;MAKE AN OUTPUT FILE
  187.     MVI    C,013H    ;FIRST DELETE OLD ONE
  188.     CALL    5
  189.     POP    D    
  190.     PUSH    D    
  191.     MVI    C,016H    ;THEN CREATE NEW ONE
  192.     CALL    5
  193.     POP    D        ;FALL INTO OPEN ROUTINE
  194. OPENF:
  195.     MVI    C,0FH    ;OPEN THE FILE WITH FCB AT (DE)
  196.     JMP    5
  197. MOVNAM:
  198.     LXI    H,DFCB1+1    ;COPY NAME FIELD ONLY
  199.     LXI    B,8    ;FROM FIRST DEFAULT FCB
  200. MOVE:
  201.     DCX    B    ;MOVE M(HL) TO M(DE) UNTIL BC=0
  202.     INR    C
  203.     INR    B
  204. MOVELP:
  205.     MOV    A,M
  206.     STAX    D
  207.     INX    H    
  208.     INX    D
  209.     DCR    C
  210.     JNZ    MOVELP    
  211.     DCR    B
  212.     JNZ    MOVELP    
  213.     RET        
  214. FILL:
  215.     MOV    M,B        ;FILL M(HL) WITH (B)
  216.     INX    H    
  217.     DCR    C    ;UNTIL C=0
  218.     JNZ    FILL    
  219.     RET        
  220. NEWMSG:
  221.     DB    13,10,'NEW FILE$'
  222. NSPMSG:
  223.     DB    13,10,'NO MORE DISK SPACE$'
  224. NSFMSG:
  225.     DB    13,10,'NO SOURCE FILE SPECIFIED$'
  226. INFCNT:
  227.     DB    7FH    ;BYTE COUNT IN INPUT BUFFER
  228. IFCB:
  229.     DB    0        ;INPUT FILE CONTROL BLOCK
  230. IFCB1:
  231.     DS    8
  232.     DB    'ASM'
  233.     DB    0,0,0,0
  234. IFCBRN:
  235.     DS    16
  236.     DB    0
  237. INBUF:
  238.     DS    128    ;INPUT BUFFER (1 SECTOR LONG)
  239. OUFCNT:
  240.     DB    255    ;BYTE COUNT IN OUTPUT BUFFER
  241. OFCB:
  242.     DB    0        ;OUTPUT FILE CONTROL BLOCK
  243. OFCB1:
  244.     DS    8
  245.     DB    '$$$'
  246.     DB    0,0,0,0
  247. OFCBRN:
  248.     DS    16
  249.     DB    0
  250. OUTBUF:
  251.     DS    128    ;OUTPUT BUFFER (1 SECTOR)
  252. SIGNON:
  253.     DB    13,10,'SUPER CP/M EDITOR',13,10
  254. ILGMSG:
  255.     DB    '" ILLEGAL IN THIS CONTEXT',13,10
  256. CNFMSG:
  257.     DB    13,10,'CANNOT FIND "'
  258. ISFMSG:
  259.     DB    13,10,'ITERATION STACK FAULT'
  260. BRKMSG:
  261.     DB    13,10,'*BREAK*',13,10
  262. CRLF:
  263.     MVI    C,0DH    ;PRINT CARRIAGE RETURN, LINE FEED
  264.     CALL    PCHAR    
  265.     MVI    C,0AH
  266. PCHAR:
  267.     PUSH    D        ;PRINT A CHARACTER
  268.     PUSH    H        ;WITH FULL FORMATTING
  269.     MOV    A,C        ;(EXPAND TABS AND CTRL CHARS)
  270.     SUI    9    
  271.     JNZ    PCHAR1        ;IF A TAB, WRITE SPACE INSTEAD
  272.     MVI    C,020H
  273. PCHAR1:
  274.     SUI    1        ;GIVES FF & CARRY IF A TAB
  275.     SBB    A    ;GIVES FF IF TAB, ZERO OTHERWISE
  276.     MOV    B,A        ;SAVE FOR LATER
  277.     LDA    LINPOS    ;CHECK CURRENT COLUMN NUMBER
  278.     ANI    7        ;LOW 3 BITS ONLY
  279.     CMA            ;DERIVE SPACES TO NEXT TAB STOP
  280.     ADI    8    
  281.     ANA    B        ;MASK WITH FLAG, (ZERO IF NO TAB)
  282.     MOV    B,A        ;SAVE RESULT AS REPEAT COUNT
  283.     MOV    A,C        ;LOOK AGAIN AT CHARACTER TO PRINT
  284.     SUI    0DH        ;CARRIAGE RETURN?
  285.     JNZ    PCHAR2    
  286.     STA    LINPOS    ;IF CARRIAGE RETURN, CLEAR COLUMN COUNT
  287. PCHAR2:
  288.     PUSH    B        ;SAVE CHARACTER
  289.     CALL    CONOUT        ;PRINT IT
  290.     POP    B        ;GET IT BACK
  291.     MOV    A,C    
  292.     CPI    020H        ;IF CONTROL CHARACTER, DON'T
  293.     JC    PCHAR3        ;  INCREMENT COLUMN COUNTER
  294.     LDA    LINPOS
  295.     INR    A    
  296.     STA    LINPOS
  297. PCHAR3:
  298.     DCR    B    ;NOW TEST REPEAT COUNT (0 UNLESS TAB)
  299.     JP    PCHAR2        ;PRINT AGAIN IF NECESSARY
  300.     POP    H        ;RESTORE REGS
  301.     POP    D    
  302.     RET            ;AND EXIT
  303. CPHLDE:
  304.     MOV    A,H        ;COMPARE (HL)::(DE)
  305.     SUB    D
  306.     RNZ        
  307.     MOV    A,L
  308.     SUB    E
  309.     RET        
  310. MESSBC:
  311.     MOV    H,B        ;PRINT MESSAGE AT M(BC)
  312.     MOV    L,C        ; FOR LENGTH (DE)
  313. MESSHL:
  314.     MOV    C,M    
  315.     INX    H    
  316.     CALL    PCHAR    
  317.     CALL    BRKCHK    
  318.     MOV    A,D    
  319.     ORA    E    
  320.     RZ        
  321.     DCX    D
  322.     JMP    MESSHL    
  323. BRKCHK:
  324.     CALL    CSTS        ;TEST FOR BREAK CHARACTER
  325.     ORA    A    
  326.     RZ        
  327.     CALL    CONIN    
  328.     ORA    A    
  329.     RNZ        
  330.     JMP    BREAK    
  331. INCCMD:
  332.     LDA    ITRLVL    ;MOVE COMMAND POINTER TO NEXT COMMAND
  333.     ORA    A        ;ONLY IF NO ITERATIONS ARE
  334.     RNZ            ;IN PROGRESS
  335.     LHLD    CMDFPT    
  336.     XCHG            ;COMMAND FORWARD POINTER -> DE
  337.     LHLD    MAXMEM        ;TOP OF RAM -> HL
  338.     DCX    H        ;BACK OFF BY 1 BYTE
  339.     SHLD    CMDFPT        ;CMDFPT WILL NOW POINT TO SECOND CHAR OF COMMAND
  340.     PUSH    H        ;SAVE IT
  341.     LXI    H,CMDPTR    ;GET POINTER TO END OF COMMAND
  342.     MOV    A,E        ;SUBTRACT FORWARD POINTER TO
  343.     SUB    M    ;       GET LENGTH OF COMMAND STRING
  344.     INX    H    
  345.     MOV    C,A    
  346.     MOV    A,D    
  347.     SBB    M
  348.     MOV    B,A    
  349.     JC    INCCDN        ;IF LENGTH GOES NEGATIVE, QUIT
  350.     INX    B    ;NOW WE KNOW WE REALLY HAVE SOMETHING LEFT
  351.     XCHG            ;OLD FWD PNTR -> HL
  352.     POP    D        ;NEW FWD PNTR -> DE
  353. CMDMOV:
  354.     MOV    A,M    ;PACK DOWN USED-UP PARTS OF COMMAND
  355.     STAX    D    ; TO MAKE MORE ROOM FOR TEXT
  356.     DCX    H    
  357.     DCX    D
  358.     DCX    B
  359.     MOV    A,B    
  360.     ORA    C    
  361.     JNZ    CMDMOV    
  362.     PUSH    D        ;DE IS NOW NEW END POINTER
  363. INCCDN:
  364.     POP    H        ;GET END POINTER
  365.     INX    H    
  366.     SHLD    CMDPTR        ;AND SAVE IT
  367.     RET        
  368. GETCMD:
  369.     MVI    C,'*'    ;PROMPT FOR A COMMAND STRING
  370.     CALL    PCHAR    
  371.     LHLD    MAXMEM        ;STORED UPSIDE DOWN
  372.     SHLD    CMDPTR        ; SO THAT COMMAND BUFFER
  373.     DCX    H        ; GROWS TOWARDS TEXT BUFFER
  374.     SHLD    CMDFPT    
  375.     XRA    A    
  376.     STA    PRVCHR
  377.     STA    ITRLVL    ;CLEAR PREVIOUS CHARACTER AND ITERATION LEVE
  378. GETCML:
  379.     CALL    CONIN        ;LOOP, FETCHING CMD CHARS
  380.     STA    CURCHR    ;SAVE AS CURRENT CHARACTER
  381.     ORA    A        ;BREAK?
  382.     JZ    BREAK    
  383.     LHLD    MAXMEM        ;TOP OF RAM -> DE
  384.     XCHG        
  385.     LHLD    CMDPTR        ;CMD STACK PTR -> HL
  386.     CPI    012H    ;CONTROL-R?
  387.     JNZ    RUBOUT    
  388.     CALL    CRLF        ;CONTROL-R MEANS RE-ECHO BUFFER
  389.     CALL    CPHLDE        ;MAKE SURE THERE'S WHAT TO ECHO
  390.     JZ    GETCMD    
  391. CNTLR:
  392.     CALL    CPHLDE        ;DONE YET?
  393.     JZ    GETCML    
  394.     DCX    D    ;NO, FETCH NEXT CHARACTER
  395.     LDAX    D
  396.     CPI    01BH    ;CHANGE ESCAPE TO DOLLAR SIGN
  397.     JNZ    RNOTES    
  398.     MVI    A,'$'
  399. RNOTES:
  400.     MOV    C,A        ;PRINT CHARACTER
  401.     CALL    PCHAR    
  402.     JMP    CNTLR        ;AND GET SOME MORE
  403. RUBOUT:
  404.     CPI    07FH    ;WAS A RUBOUT TYPED?
  405.     JNZ    STCMCH    
  406.     CALL    CPHLDE        ;TEST FOR EMPTY BUFFER
  407.     JZ    CMDOVR    
  408.     MOV    A,M    ;GET LAST COMMAND CHARACTER
  409.     CPI    01BH    ;CONVERT ESCAPE TO DOLLAR SIGN
  410.     JNZ    DELNES    
  411.     MVI    A,'$'
  412. DELNES:
  413.     MOV    C,A        ;PRINT THE CHARACTER
  414.     CALL    PCHAR    
  415.     XRA    A        ;CLEAR 'PREVIOUS CHAR' FLAG
  416.     STA    PRVCHR
  417.     LHLD    CMDPTR        ;BACK UP COMMAND POINTER
  418.     INX    H        ;  TO ACCOUNT FOR DELETED CHAR
  419.     SHLD    CMDPTR    
  420.     JMP    GETCML        ;LOOP BACK FOR NEXT INPUT
  421. CMDOVR:
  422.     CALL    CRLF        ;DELETED PAST BEGINNING - SEND CRLF
  423.     JMP    GETCMD        ;AND RE-PROMPT
  424. STCMCH:
  425.     LHLD    CMDPTR        ;HERE TO STORE COMMAND CHAR
  426.     LXI    D,-20    ;MAKE SURE THERE'S ROOM
  427.     DAD    D
  428.     XCHG        
  429.     LHLD    TXTTOP    
  430.     CALL    CPHLDE    
  431.     JC    HVROOM    
  432.     MVI    C,7    ;NO RAM LEFT - PRINT A BELL
  433.     CALL    PCHAR    
  434.     JMP    GETCML        ;AND HOPE NEXT CHAR IS RUBOUT
  435. HVROOM:
  436.     LDA    CURCHR    ;GET CURRENT CHARACTER
  437.     CPI    0DH    ;TEST FOR CARRIAGE RETURN
  438.     JNZ    CHKALT    
  439.     LHLD    CMDPTR        ;STORE CARRIAGE RETURN
  440.     DCX    H    
  441.     SHLD    CMDPTR    
  442.     MVI    C,0DH
  443.     MOV    M,C        ;IN COMMAND BUFFER
  444.     CALL    PCHAR        ;ECHO IT
  445.     MVI    A,0AH    ;ECHO AND STORE A LINEFEED BEHIND IT
  446. CHKALT:
  447.     CPI    07DH    ;CONVERT ALTMODE TO ESCAPE
  448.     JNZ    NOALT    
  449.     MVI    A,01BH
  450. NOALT:
  451.     STA    CURCHR    ;SAVE CURRENT CHAR
  452.     CPI    01BH    ;IS IT AN ESCAPE?
  453.     MOV    C,A        ;IF ESCAPE, ECHO '$' INSTEAD
  454.     JNZ    ECHOCM    
  455.     MVI    C,'$'
  456. ECHOCM:
  457.     CALL    PCHAR        ;ECHO THE COMMAND CHARACTER
  458.     LHLD    CMDPTR        ;BUMP COMMAND STACK POINTR
  459.     DCX    H    
  460.     SHLD    CMDPTR    
  461.     LDA    CURCHR    ;STORE CURRENT CHAR IN COMMAND BUFFER
  462.     MOV    M,A    
  463.     CPI    01BH    ;IF CURRENT IS ESCAPE, WHAT WAS PREVIOUS?
  464.     JNZ    SETPRV    
  465.     LDA    PRVCHR    ;IF PREV WAS ALSO ESCAPE, SEND CRLF
  466.     CPI    01BH    ;AND RETURN
  467.     JZ    CRLF    
  468. SETPRV:
  469.     MOV    A,M    ;MAKE CURRENT CHARACTER PREVIOUS CHAR
  470.     STA    PRVCHR
  471.     JMP    GETCML        ;AND GO GET SOME MORE
  472. GETCDC:
  473.     LHLD    CMDPTR        ;FETCH NEXT CHARACTER FROM COMMAND STRING
  474.     XCHG            ;END OF COMMAND -> DE
  475.     LHLD    CMDFPT        ;CURRENT POINTER -> HL
  476.     CALL    CPHLDE        ;COMMAND EXHAUSTED?
  477.     CC    GETCMD        ;READ ANOTHER COMMAND IF NEEDED
  478.     LXI    H,CHRTYP    ;INITIALIZE CHARACTER TYPE TO 'OTHER'
  479.     MVI    M,2
  480.     LHLD    CMDFPT    
  481.     MOV    A,M    ;GET COMMAND CHARACTER
  482.     CPI    'A'    
  483.     JC    GETCD1        ;SET FLAG FOR ALPHA OR NUMERIC
  484.     CPI    'Z'+1        ;IF ALPHABETIC, CHRTYP=0
  485.     JNC    GETCDN    
  486.     LXI    H,CHRTYP
  487.     MVI    M,0
  488. GETCD1:
  489.     CPI    '0'        ;IF NUMERIC, CHRTYP=1
  490.     JC    GETCDN    
  491.     CPI    '9'+1    
  492.     JNC    GETCDN    
  493.     LXI    H,CHRTYP
  494.     MVI    M,1
  495. GETCDN:
  496.     LHLD    CMDFPT        ;ADVANCE COMMAND FORWARD PNTR
  497.     DCX    H    
  498.     SHLD    CMDFPT    
  499.     RET        
  500. GETNUM:
  501.     LDA    CURCMC        ;PARSE A NUMBER FROM THE COMMAND
  502.     CPI    '-'        ; STRING
  503.     JNZ    CKPLUS        ;SET MINUS FLAG IF WE SEE A MINUS
  504.     LXI    H,MINUS
  505.     MVI    M,0FFH
  506.     CALL    GETCDC        ;AND GET NEXT CHAR
  507.     STA    CURCMC        ;INTO 'CURRENT CMD CHAR'
  508.     JMP    CNVNUM    
  509. CKPLUS:
  510.     CPI    '+'        ;SWALLOW A PLUS SIGN IF PRESENT
  511.     JNZ    CNVNUM    
  512.     CALL    GETCDC    
  513.     STA    CURCMC    
  514. CNVNUM:
  515.     LXI    H,0
  516. CNVLUP:
  517.     LDA    CHRTYP        ;TEST FOR NUMERIC
  518.     CPI    1
  519.     JNZ    CNVDON        ;QUIT IF NOT NUMERIC
  520.     MOV    D,H        ;MULTIPLY HL BY 10
  521.     MOV    E,L    
  522.     DAD    H    
  523.     DAD    H    
  524.     DAD    D
  525.     DAD    H    
  526.     LDA    CURCMC        ;CONVERT DIGIT TO NUMBER
  527.     SUI    '0'    
  528.     MOV    E,A        ;AND ADD IT TO HL
  529.     MVI    D,0
  530.     DAD    D
  531.     PUSH    H        ;BUMP TO NEXT CMD CHAR
  532.     CALL    GETCDC    
  533.     POP    H    
  534.     STA    CURCMC        ;MAKE IT CURRENT
  535.     JMP    CNVLUP        ;AND GO CONVERT IT
  536. CNVDON:
  537.     SHLD    ITRCNT        ;COMPLETED NUMBER BECOMES ITERATION COUNT
  538.     LDA    MINUS        ;MINUS ZERO BECOMES MINUS ONE
  539.     RRC    
  540.     RNC        
  541.     MOV    A,H    
  542.     ORA    L    
  543.     RNZ        
  544.     INX    H    
  545.     SHLD    ITRCNT    
  546.     RET            ;DONE
  547. SKPLIN:
  548.     LHLD    ITRCNT        ;SKIP FORWARD OR BACKWARD
  549.     MOV    B,H        ; (ITRCNT) LINES
  550.     MOV    C,L        ;(ITRCNT) -> BC
  551.     LHLD    TXTTOP        ;END OF TEXT -> HL
  552.     MVI    A,TXTBUF AND 255    ;END=BEG? (BUFF EMPTY)
  553.     SUB    L
  554.     MOV    D,A    
  555.     MVI    A,TXTBUF/256
  556.     SBB    H
  557.     ORA    D    
  558.     RZ            ;IF EMPTY, QUIT
  559.     XCHG            ;END OF TEXT -> DE
  560.     LHLD    TXTPTR        ;CURRENT POSN -> HL
  561.     MOV    A,B        ;ITRCNT=0 MEANS BACKWARD SKIP
  562.     ORA    C    
  563.     INX    B    ;ANYWAY, WE ALWAYS WANT ITRCNT+1
  564.     JZ    SKPBAK        ;TO ACCOUNT FOR CURRENT LINE
  565.     LDA    MINUS        ;ITRCNT#0, SO CHECK SIGN FLAG
  566.     RRC    
  567.     JNC    SKPFWD        ;TO DECIDE WHICH WAY TO SKIP
  568. SKPBAK:
  569.     INX    B    ;BACKWARD SKIP - ITRCNT+2 -> BC
  570.     CALL    CPHLDE        ;ARE WE AT END OF TEXT?
  571.     JNZ    SKPBA1    
  572.     LXI    D,TXTBUF    ;IS END ALSO BEGINNING?
  573.     CALL    CPHLDE    
  574.     JZ    SKPBA1        ;IF SO, BACK OFF SO WE FIND EOF
  575.     DCX    H        ;  ON FIRST TEST
  576. SKPBA1:
  577.     MVI    D,0FFH    ;SEARCH FOR EITHER FF (END OF TEXT)
  578.     MVI    E,0AH    ;OR LINEFEED
  579. SKPBA2:
  580.     DCX    B    ;DECREMENT ITERATION COUNT
  581.     MOV    A,B        ;DONE YET?
  582.     ORA    C    
  583.     JZ    SKPBA4        ;YUP
  584. SKPBA3:
  585.     MOV    A,M    ;TEST NEXT CHARACTER
  586.     CMP    D        ;END OF BUFFER?
  587.     JZ    SKPBDN    
  588.     CMP    E        ;LINEFEED?
  589.     DCX    H    
  590.     JNZ    SKPBA3        ;BUMP POINTER AND TRY AGAIN
  591.     JMP    SKPBA2        ;FOUND ONE, MORE ITERATIONS?
  592. SKPBA4:
  593.     INX    H        ;FOUND RIGHT NUMBER OF LF'S - 
  594. SKPBDN:
  595.     INX    H        ;CORRECT POINTER TO BE AFTER LAST LF
  596.     RET        
  597. SKPFWD:
  598.     MVI    D,0FFH    ;HERE TO SKIP FORWARD - SEARCH FOR END OF BUFFER
  599.     MVI    E,0AH    ;OR LINEFEED
  600. SKPFW1:
  601.     DCX    B    ;DECREMENT ITERATION COUNT
  602.     MOV    A,B        ;DONE YET?
  603.     ORA    C    
  604.     RZ        
  605. SKPFW2:
  606.     MOV    A,M    ;TEST NEXT CHARACTER
  607.     CMP    D        ;END OF BUFFER?
  608.     RZ        
  609.     CMP    E        ;LINEFEED
  610.     INX    H        ;BUMP POINTER
  611.     JNZ    SKPFW2        ;TRY NEXT IF NO MATCH
  612.     JMP    SKPFW1        ;CHECK ITERATION COUNT IF MATCH
  613. SEARCH:
  614.     LXI    H,TARGLN    ;SEARCH FOR A CHARACTER STRING
  615.     MVI    M,0    ;SET TARGET STRING LENGTH TO ZERO
  616. GTARGT:
  617.     LXI    B,TARGST    ;COPY STRING FROM COMMAND BUFFER
  618.     LHLD    TARGLN        ;INTO TARGET BUFFER AND UPDATE
  619.     DAD    B    ;      TARGET LENGTH
  620.     PUSH    H    
  621.     CALL    GETCDC    
  622.     POP    H    
  623.     MOV    M,A    
  624.     SUI    01BH        ;END COPY ON AN ESCAPE CHAR
  625.     JZ    DOSEAR        ;AND GO DO THE SEARCH
  626.     LXI    H,TARGLN
  627.     MOV    A,M
  628.     SUI    020H        ;TARGET BUFFER OVERFLOW?
  629.     JNC    GTARGT        ;NO
  630.     INR    M        ;IF YES, IGNORE EXTRA CHARS
  631.     JMP    GTARGT    
  632. DOSEAR:
  633.     LHLD    TXTPTR        ;ACTUALLY PERFORM THE SEARCH
  634.     XCHG            ;TEXT POINTER -> DE
  635.     DCX    D    ;BACK OFF ONE TO ACCOUNT FOR ALGORITHM
  636. SEARL1:
  637.     LXI    H,TARGST    ;RESET TARGET STRING POINTER
  638. SEARL2:
  639.     INX    D    ;FETCH CHARACTER FROM TEXT BUFFER
  640.     LDAX    D
  641.     CPI    0FFH    ;END OF BUFFER?
  642.     JZ    SEARER        ;IF END, GIVE NOTICE
  643.     CMP    M        ;COMPARE BUFFER TO TARGET
  644.     JNZ    SEARL2        ;NO MATCH, TRY NEXT
  645.     MOV    B,D        ;MATCHED FIRST CHAR, SAVE ITS POSN
  646.     MOV    C,E    
  647. SEARL3:
  648.     INX    H        ;SEE IF REST OF STRING MATCHES
  649.     INX    D    ;      BUMP BOTH TARGET AND BUFFER
  650.     LDAX    D    ;FETCH NEXT FROM BUFFER
  651.     CMP    M        ;MATCH?
  652.     JZ    SEARL3        ;YUP, KEEP GOING
  653.     MOV    A,M    ;NO MATCH, BUT MAYBE IT'S A 'DONT CARE'
  654.     CPI    07CH        ;'OR BAR' IS DONT CARE CHAR
  655.     JZ    SEARL3    
  656.     CPI    01BH    ;NEITHER MATCH NOR DONT CARE, BUT WE MAY BE DONE
  657.     MOV    D,B        ;PREPARE FOR RETRY BY RESTORING
  658.     MOV    E,C        ;BUFFER POINTER
  659.     RZ            ;LAST TARGET WAS ESCAPE: WE'RE DONE
  660.     LDAX    D    ;TEST FOR END OF BUFFER
  661.     CPI    0FFH
  662.     JZ    SEARER        ;IF END, ERROR
  663.     JMP    SEARL1        ;ELSE RESTORE TARGET PTR AND CONTINUE
  664. SEARER:
  665.     STC            ;NOT FOUND - SET CARRY FOR ERROR
  666.     RET        
  667. NOFIND:
  668.     LXI    B,CNFMSG    ;SAY 'CAN NOT FIND...'
  669.     LXI    D,0EH
  670.     CALL    MESSBC    
  671.     LDA    TARGLN        ;ECHO TARGET STRING AS WELL
  672.     ORA    A    
  673.     JZ    ENDQUO    
  674.     LXI    B,TARGST
  675.     MOV    E,A    
  676.     DCR    E    ;DECREMENT LENGTH TO AVOID TERMINATING ESCAPE
  677.     MVI    D,0
  678.     CALL    MESSBC    
  679. ENDQUO:
  680.     MVI    C,022H    ;TERMINATING QUOTE AND CRLF
  681.     CALL    CONOUT    
  682.     CALL    CRLF    
  683.     JMP    BREAK    
  684. PACK:
  685.     LHLD    SPLBEG        ;PACK DOWN TEXT BUFFER AFTER
  686.     XCHG            ; A DELETE-TYPE OPERATION
  687.     LHLD    TXTPTR        ;BEG. OF SPLIT -> DE; CURR POS. -> HL
  688.     MOV    A,E        ;IF EQUAL, NO PACK REQUIRED
  689.     SUB    L
  690.     MOV    C,A    
  691.     MOV    A,D    
  692.     SBB    H
  693.     ORA    C    
  694.     RZ        
  695.     LXI    H,SPLEND    ;OTHERWISE, LENGTH OF SPLIT -> BC
  696.     MOV    A,M
  697.     SUB    E
  698.     INX    H    
  699.     MOV    C,A    
  700.     MOV    A,M
  701.     SBB    D
  702.     MOV    B,A    
  703.     JC    PACKDN        ;IF SPLIT LENGTH=0, QUIT
  704.     INX    B    ;ADJUST LENGTH
  705.     LHLD    SPLBEG        ;START OF SPLIT -> DE
  706.     XCHG        
  707.     LHLD    TXTPTR        ;CURRENT POINTER -> HL
  708. PACKLP:
  709.     LDAX    D    ;PACK A CHAR FROM SPLIT
  710.     MOV    M,A        ;TOWARDS CURRENT POINTER
  711.     INX    D    ;BUMP POINTERS
  712.     INX    H    
  713.     DCX    B    ;MORE TO PACK?
  714.     MOV    A,B    
  715.     ORA    C    
  716.     JNZ    PACKLP    
  717.     DCX    H        ;SET END OF TEXT MARKER AT NEW END OF BUFFER
  718.     MVI    M,0FFH
  719.     SHLD    TXTTOP        ;STORE NEW END VALUE
  720.     JMP    INCCMD        ;GO REPACK COMMAND BUFFER
  721. PACKDN:
  722.     LHLD    TXTTOP        ;DELETE ONLY COVERED ONE CHAR
  723.     DCX    H        ;SO JUST RESET END OF BUFFER
  724.     SHLD    TXTTOP    
  725.     MVI    M,0FFH    ;AND MARK IT
  726.     JMP    INCCMD        ;AND GO PACK COMMAND BUFFER
  727. MAIN:
  728.     LXI    SP,STACK    ;MAIN PROGRAM STARTS HERE
  729.     LXI    B,SIGNON    ;PRINT SIGNON MESSAGE
  730.     LXI    D,014H
  731.     CALL    MESSBC    
  732.     CALL    GETTOP        ;SET TOP OF RAM
  733.     MOV    L,A    
  734.     MOV    H,B    
  735.     SHLD    MAXMEM    
  736.     LXI    H,-1
  737.     SHLD    FENCE    ;MARK ENDS OF BUFFER
  738.     LXI    H,TXTBUF
  739.     SHLD    TXTPTR        ;INITIALIZE CURRENT POINTER
  740.     SHLD    TXTTOP        ;AND END POINTER
  741. CMDLUP:
  742.     CALL    GETCMD        ;GET FIRST COMMAND STRING
  743. FOREVR:
  744.     CALL    NXTCMD        ;PROCESS COMMANDS FOREVER
  745.     JMP    FOREVR    
  746. NXTCMD:
  747.     LHLD    TXTPTR        ;MAKE SPLIT POINTERS MATCH
  748.     SHLD    SPLBEG        ;ACTUAL BUFFER POINTERS
  749.     LHLD    TXTTOP    
  750.     SHLD    SPLEND    
  751.     LXI    H,MINUS    ;CLEAR MINUS FLAG
  752.     MVI    M,0
  753.     LXI    H,1    ;DEFAULT TO ONE ITERATION
  754.     SHLD    ITRCNT    
  755.     CALL    GETCDC        ;GET NEXT CHAR FROM COMMAND STRING
  756.     STA    CURCMC        ;SAVE IT
  757.     CPI    '-'        ;IF + OR -,
  758.     JZ    CPUSH        ;  THEN GET A NUMBER
  759.     CPI    '+'    
  760.     JZ    CPUSH    
  761.     LDA    CHRTYP        ;IF NUMERIC, ALSO GET A NUMBER
  762.     CPI    1
  763.     JNZ    NOTNUM    
  764. CPUSH:
  765.     CALL    GETNUM        ;GET NUMBER INTO ITRCNT
  766. NOTNUM:
  767.     LDA    CURCMC        ;GET CURRENT CHARACTER
  768.     CPI    '<'        ;START OF ITERATION?
  769.     LXI    H,ITRLVL    ;PREPARE TO STACK AN ITERATION
  770.     MVI    B,0
  771.     JNZ    CPOP    
  772.     INR    M        ;INCREMENT ITERATION STACK COUNT
  773.     MOV    C,M        ;AND FETCH IT
  774.     MVI    A,8    ;STACK OVERFLOW? (8 LEVELS MAX.)
  775.     CMP    M    
  776.     JNC    PUSHIT    
  777.     LXI    B,ISFMSG    ;GIVE STACK FAULT MESSAGE
  778.     LXI    D,016H
  779.     CALL    MESSBC    
  780.     JMP    BREAK        ;AND FAKE A BREAK
  781. PUSHIT:
  782.     LHLD    CMDFPT        ;PUT COMMAND FORWARD POINTER ONTO ITS STACK
  783.     XCHG        
  784.     LXI    H,ITRPST
  785.     DAD    B
  786.     DAD    B
  787.     MOV    M,E    
  788.     INX    H    
  789.     MOV    M,D    
  790.     LHLD    ITRCNT        ;PUT ITERATION COUNT ONTO ITS STACK
  791.     XCHG        
  792.     LXI    H,ITRCST
  793.     DAD    B
  794.     DAD    B
  795.     MOV    M,E    
  796.     INX    H    
  797.     MOV    M,D    
  798.     RET            ;GO BACK FOR NEXT COMMAND
  799. CPOP:
  800.     CPI    '>'        ;END OF ITERATION?
  801.     JNZ    DISPAT    
  802.     MOV    C,M        ;CHECK ITERATION LEVEL
  803.     MOV    A,C    
  804.     ORA    A        ;IF ZERO, IGNORE
  805.     JZ    DISPAT    
  806.     LXI    H,ITRCST    ;POINT TO ITERATION COUNT ON
  807.     DAD    B    ;       CURRENT LEVEL
  808.     DAD    B
  809.     MOV    A,M
  810.     SUI    1        ;DECREMENT IT
  811.     MOV    M,A    
  812.     INX    H    
  813.     MOV    A,M
  814.     SBI    0    
  815.     MOV    M,A    
  816.     DCX    H        ;CURRENT LEVEL'S COUNT=0?
  817.     ORA    M    
  818.     JZ    DRPSTK        ;IF YES, DROP ITERATION STACKS
  819.     LXI    H,ITRPST    ;OTHERWISE, RESTORE COMMAND PTR
  820.     DAD    B    ;        FOR THIS LEVEL
  821.     DAD    B
  822.     MOV    E,M    
  823.     INX    H    
  824.     MOV    D,M    
  825.     XCHG        
  826.     SHLD    CMDFPT    
  827.     RET        
  828. DRPSTK:
  829.     LXI    H,ITRLVL    ;DECREMENT ITERATION LEVEL
  830.     DCR    M    
  831.     RET        
  832. DISPAT:    ;****COMMAND DISPATCHER***
  833.     LDA    CHRTYP        ;IF WE GET HERE WITH OTHER
  834.     ORA    A        ;THAN A LETTER, IT'S AN ERROR
  835.     JNZ    CMDERR    
  836.     LDA    CURCMC        ;CONVERT LETTER TO DISPATCH
  837.     SUI    'A'        ;  TABLE INDEX
  838.     MOV    L,A    
  839.     MVI    H,0
  840.     DAD    H    
  841.     LXI    D,DSPTBL    ;INDEX TO RIGHT TABLE ENTRY
  842.     DAD    D
  843.     MOV    E,M    
  844.     INX    H    
  845.     MOV    D,M    
  846.     XCHG        
  847.     PCHL            ;AND DISPATCH TO IT
  848. ACMD:    ;*****APPEND COMMAND*****
  849.     LHLD    ITRCNT    
  850.     MOV    B,H    
  851.     MOV    C,L    
  852. APPLIM:
  853.     LHLD    CMDPTR    
  854.     LXI    D,-40
  855.     DAD    D
  856.     XCHG        
  857.     LHLD    TXTTOP    
  858. APPEND:
  859.     CALL    CPHLDE    
  860.     JNC    FLGEND    
  861. ACMLUP:
  862.     CALL    GETBYT    
  863.     ORA    A    
  864.     JZ    ACMLUP    
  865.     CPI    07FH
  866.     JZ    ACMLUP    
  867.     CPI    01AH
  868.     JZ    FLGEND    
  869.     MOV    M,A    
  870.     INX    H    
  871.     CPI    0AH
  872.     JNZ    APPEND    
  873.     DCX    B
  874.     MOV    A,B    
  875.     ORA    C    
  876.     JNZ    APPEND    
  877. FLGEND:
  878.     SHLD    TXTTOP    
  879.     MVI    M,0FFH
  880.     RET        
  881. BCMD:
  882.     LXI    H,TXTBUF
  883.     SHLD    TXTPTR    
  884.     RET        
  885. CCMD:
  886.     CALL    MOVPTR    
  887.     SHLD    TXTPTR    
  888.     RET        
  889. MOVPTR:
  890.     LDA    MINUS    
  891.     RRC    
  892.     LHLD    TXTPTR    
  893.     XCHG        
  894.     LHLD    ITRCNT    
  895.     JNC    CPLUS    
  896.     MOV    A,E    
  897.     SUB    L
  898.     MOV    E,A    
  899.     MOV    A,D    
  900.     SBB    H
  901.     MOV    D,A    
  902.     LXI    H,TXTBUF
  903.     CALL    CPHLDE    
  904.     RNC        
  905.     XCHG        
  906.     RET        
  907. CPLUS:
  908.     DAD    D
  909.     XCHG        
  910.     LHLD    TXTTOP    
  911.     CALL    CPHLDE    
  912.     RC        
  913.     XCHG        
  914.     RET        
  915. DCMD:
  916.     CALL    MOVPTR    
  917.     LDA    MINUS    
  918.     RRC    
  919.     XCHG        
  920.     LXI    H,TXTPTR
  921.     JC    DELSET    
  922.     LXI    H,SPLBEG
  923. DELSET:
  924.     MOV    M,E    
  925.     INX    H    
  926.     MOV    M,D    
  927.     JMP    PACK    
  928. ECMD:
  929.     LXI    H,TXTBUF
  930. ECMLUP:
  931.     MOV    A,M
  932.     CPI    0FFH
  933.     JZ    CPREST    
  934.     MOV    C,A    
  935.     CALL    PUTBYT    
  936.     INX    H    
  937.     JMP    ECMLUP    
  938. CPREST:
  939.     CALL    GETBYT    
  940.     CPI    01AH
  941.     MOV    C,A    
  942.     PUSH    PSW    
  943.     CALL    PUTBYT    
  944.     POP    PSW    
  945.     JNZ    CPREST    
  946.     MVI    C,01AH
  947.     CALL    PUTBYT    
  948.     LDA    SWFLG
  949.     ORA    A    
  950.     JNZ    0
  951.     LXI    D,IFCB
  952.     PUSH    D    
  953.     MVI    C,010H
  954.     CALL    5
  955.     POP    H    
  956.     LXI    D,IFCBRN
  957.     PUSH    D    
  958.     LXI    B,9
  959.     CALL    MOVE    
  960.     XCHG        
  961.     MVI    M,'B'
  962.     INX    H    
  963.     MVI    M,'A'
  964.     INX    H    
  965.     MVI    M,'K'
  966.     INX    H    
  967.     LXI    B,015H
  968.     CALL    FILL    
  969.     POP    D    
  970.     MVI    C,013H
  971.     CALL    5
  972.     LXI    D,IFCB
  973.     MVI    C,017H
  974.     CALL    5
  975.     LXI    D,OFCB
  976.     MVI    C,017H
  977.     CALL    5
  978.     RST    0    
  979. FCMD:
  980.     CALL    SEARCH    
  981.     JC    NOFIND    
  982. FCMD1:
  983.     LHLD    TARGLN    
  984.     DAD    D
  985.     SHLD    TXTPTR    
  986.     RET        
  987. ICMD:
  988.     CALL    GETCDC    
  989.     CPI    01BH
  990.     JZ    PACK    
  991.     LHLD    CMDFPT    
  992.     INX    H    
  993.     SHLD    CMDFPT    
  994. ICMD1:
  995.     CALL    INCCMD    
  996.     LXI    B,-20
  997.     LHLD    CMDPTR    
  998.     DAD    B
  999.     XCHG        
  1000.     LHLD    SPLEND    
  1001.     CALL    CPHLDE    
  1002.     JNC    BREAK    
  1003.     XCHG        
  1004.     PUSH    H    
  1005.     LXI    H,SPLBEG
  1006.     MOV    A,E    
  1007.     SUB    M
  1008.     MOV    C,A    
  1009.     INX    H    
  1010.     MOV    A,D    
  1011.     SBB    M
  1012.     MOV    B,A    
  1013.     POP    H    
  1014.     JC    L09CE    
  1015.     PUSH    D    
  1016.     PUSH    H    
  1017.     LHLD    CMDFPT    
  1018.     LXI    D,0
  1019. GTISIZ:
  1020.     MOV    A,M
  1021.     CPI    01BH
  1022.     JZ    GOTSIZ    
  1023.     INX    D
  1024.     DCX    H    
  1025.     JMP    GTISIZ    
  1026. GOTSIZ:
  1027.     LHLD    TXTPTR    
  1028.     DAD    D
  1029.     DAD    B
  1030.     INX    B
  1031.     XCHG        
  1032.     POP    H    
  1033.     CALL    CPHLDE    
  1034.     JNC    L09B5    
  1035.     XCHG        
  1036. L09B5:
  1037.     POP    H    
  1038.     CALL    CPHLDE    
  1039.     JNC    L09D1    
  1040.     XCHG        
  1041.     SHLD    TXTTOP    
  1042.     SHLD    SPLEND    
  1043. L09C3:
  1044.     LDAX    D
  1045.     MOV    M,A    
  1046.     DCX    D
  1047.     DCX    H    
  1048.     DCX    B
  1049.     MOV    A,B    
  1050.     ORA    C    
  1051.     JNZ    L09C3    
  1052.     INX    H    
  1053. L09CE:
  1054.     SHLD    SPLBEG    
  1055. L09D1:
  1056.     LHLD    TXTPTR    
  1057.     XCHG        
  1058.     LHLD    SPLBEG    
  1059.     MOV    A,L
  1060.     SUB    E
  1061.     MOV    C,A    
  1062.     MOV    A,H    
  1063.     SBB    D
  1064.     MOV    B,A    
  1065.     LHLD    CMDFPT    
  1066. L09E1:
  1067.     MOV    A,M
  1068.     CPI    01BH
  1069.     DCX    H    
  1070.     JZ    L09F1    
  1071.     STAX    D
  1072.     INX    D
  1073.     DCX    B
  1074.     MOV    A,B    
  1075.     ORA    C    
  1076.     JNZ    L09E1    
  1077.     MOV    A,M
  1078. L09F1:
  1079.     SHLD    CMDFPT    
  1080.     XCHG        
  1081.     SHLD    TXTPTR    
  1082.     CPI    01BH
  1083.     JNZ    ICMD1    
  1084.     CALL    INCCMD    
  1085.     JMP    PACK    
  1086. KCMD:
  1087.     CALL    SKPLIN    
  1088.     SHLD    SPLBEG    
  1089.     XCHG        
  1090.     LHLD    TXTPTR    
  1091.     CALL    CPHLDE    
  1092.     JC    PACK    
  1093.     SHLD    SPLBEG    
  1094.     XCHG        
  1095.     SHLD    TXTPTR    
  1096.     JMP    PACK    
  1097. LCMD:
  1098.     CALL    SKPLIN    
  1099.     SHLD    TXTPTR    
  1100.     RET        
  1101. NCMD:
  1102.     CALL    SEARCH    
  1103. NCMD1:
  1104.     JNC    FCMD1    
  1105.     LXI    D,-120
  1106.     LHLD    CMDPTR    
  1107.     DAD    D
  1108.     XCHG        
  1109.     LHLD    TXTTOP    
  1110.     CALL    CPHLDE    
  1111.     JC    NAPP    
  1112.     LXI    H,032H
  1113.     SHLD    ITRCNT    
  1114.     CALL    WCMD    
  1115. NAPP:
  1116.     LHLD    TXTTOP    
  1117.     PUSH    H    
  1118.     LXI    B,1
  1119.     CALL    APPLIM    
  1120.     POP    H    
  1121.     CPI    01AH
  1122.     JZ    NOFIND    
  1123.     SHLD    TXTPTR    
  1124.     LHLD    TXTTOP    
  1125.     SHLD    SPLEND    
  1126.     CALL    DOSEAR    
  1127.     JMP    NCMD1    
  1128. QCMD:
  1129.     LXI    D,OFCB
  1130.     MVI    C,010H
  1131.     CALL    5
  1132.     LXI    D,OFCB
  1133.     MVI    C,013H
  1134.     CALL    5
  1135.     JMP    BYEBYE    
  1136. SCMD:
  1137.     CALL    SEARCH    
  1138.     JC    NOFIND    
  1139.     LHLD    TARGLN    
  1140.     DAD    D
  1141.     SHLD    SPLBEG    
  1142.     XCHG        
  1143.     SHLD    TXTPTR    
  1144.     JMP    ICMD    
  1145. TCMD:
  1146.     CALL    SKPLIN    
  1147.     XCHG        
  1148.     LHLD    TXTPTR    
  1149.     MOV    A,L
  1150.     SUB    E
  1151.     MOV    L,A    
  1152.     MOV    A,H    
  1153.     SBB    D
  1154.     MOV    H,A    
  1155.     XCHG        
  1156.     JNC    TCMD1    
  1157.     LHLD    TXTPTR    
  1158.     MOV    A,D    
  1159.     CMA        
  1160.     MOV    D,A    
  1161.     MOV    A,E    
  1162.     CMA        
  1163.     MOV    E,A    
  1164.     INX    D
  1165. TCMD1:
  1166.     MOV    B,H    
  1167.     MOV    C,L    
  1168.     MOV    A,D    
  1169.     ORA    E    
  1170.     DCX    D
  1171.     JNZ    MESSBC    
  1172.     RET        
  1173. WCMD:
  1174.     LXI    H,MINUS
  1175.     MVI    M,0
  1176.     LXI    H,TXTBUF
  1177.     SHLD    TXTPTR    
  1178.     CALL    SKPLIN    
  1179.     SHLD    SPLBEG    
  1180.     XCHG        
  1181.     LXI    H,TXTBUF
  1182. WCMDL:
  1183.     CALL    CPHLDE    
  1184.     JNC    PACK    
  1185.     MOV    C,M    
  1186.     INX    H    
  1187.     CALL    PUTBYT    
  1188.     JMP    WCMDL    
  1189. ZCMD:
  1190.     LHLD    TXTTOP    
  1191.     SHLD    TXTPTR    
  1192.     RET        
  1193. DSPTBL:
  1194.     DW    ACMD
  1195.     DW    BCMD
  1196.     DW    CCMD
  1197.     DW    DCMD
  1198.     DW    ECMD
  1199.     DW    FCMD
  1200.     DW    CMDERR
  1201.     DW    CMDERR
  1202.     DW    ICMD
  1203.     DW    CMDERR
  1204.     DW    KCMD
  1205.     DW    LCMD
  1206.     DW    CMDERR
  1207.     DW    NCMD
  1208.     DW    CMDERR
  1209.     DW    CMDERR
  1210.     DW    QCMD
  1211.     DW    CMDERR
  1212.     DW    SCMD
  1213.     DW    TCMD
  1214.     DW    CMDERR
  1215.     DW    CMDERR
  1216.     DW    WCMD
  1217.     DW    CMDERR
  1218.     DW    CMDERR
  1219.     DW    ZCMD
  1220. CMDERR:
  1221.     LDA    CURCMC    
  1222.     CPI    ' '+1    
  1223.     RC        
  1224.     CALL    CRLF    
  1225.     MVI    C,'"'
  1226.     CALL    CONOUT    
  1227.     LXI    H,CURCMC
  1228.     MOV    C,M    
  1229.     CALL    PCHAR    
  1230.     LXI    B,ILGMSG
  1231.     LXI    D,1AH
  1232. BRKOUT:
  1233.     LXI    SP,STACK
  1234.     CALL    MESSBC    
  1235.     JMP    CMDLUP    
  1236. TARGLN:
  1237.     DW    0
  1238. BREAK:
  1239.     LXI    B,BRKMSG
  1240.     LXI    D,0AH
  1241.     JMP    BRKOUT    
  1242.     DS    50
  1243. STACK    EQU    $
  1244. CMDPTR:
  1245.     DW    0
  1246. TXTPTR:
  1247.     DW    0
  1248. TXTTOP:
  1249.     DW    0
  1250. SPLBEG:
  1251.     DW    0
  1252. SPLEND:
  1253.     DW    0
  1254. CMDFPT:
  1255.     DW    0
  1256. MAXMEM:
  1257.     DW    0
  1258. CURCMC:
  1259.     DB    0    
  1260. CHRTYP:
  1261.     DB    0    
  1262. ITRCNT:
  1263.     DW    0
  1264. MINUS:
  1265.     DB    0
  1266. LINPOS:
  1267.     DS    1
  1268. SWFLG:
  1269.     DS    1
  1270. EOFFLG:
  1271.     DS    1
  1272. ITRLVL:
  1273.     DS    1
  1274. TARGST:
  1275.     DS    31
  1276. ITRPST:
  1277.     DS    16
  1278. ITRCST:
  1279.     DS    16
  1280. L0BC3:
  1281.     DS    2
  1282. CURCHR:
  1283.     DS    1
  1284. PRVCHR:
  1285.     DS    1
  1286. FENCE:
  1287.     DS    1
  1288. TXTBUF    EQU    $
  1289.         END
  1290.  
  1291.