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

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