home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug012.ark / ZPILOT.Z80 < prev   
Text File  |  1984-04-29  |  7KB  |  342 lines

  1.     ;Z-80 PILOT
  2. BDOS:    EQU    5
  3. SFCB:    EQU    5CH
  4. FTYP:    EQU    65H
  5. FTYP1:    EQU    66H
  6. FEXT:    EQU    68H    ; EXTENT
  7. FNR:    EQU    7CH    ; RECORD NUMBER
  8. OSLVL:    EQU    0    ; RETURN TO CP/M
  9. ;
  10. ;
  11. ;    READ IN PILOT SOURCE FILE
  12. ;        <NAME>.PLT
  13. ;
  14.     ORG    100H    ; FOR CP/M
  15.     LD    SP,WORK
  16.     LD    A,'P'
  17.     LD    (FTYP),A
  18.     LD    BC,'TL'
  19.     LD    (FTYP1),BC    ; FTYPE:='PLT'
  20.     XOR    A
  21.     LD    (FEXT),A    ; EXTENT:=0
  22.     LD    (FNR),A        ; RECORD NO:=0
  23. ;
  24.     LD    C,15
  25.     LD    DE,SFCB
  26.     CALL    BDOS    ; OPEN FILE
  27.     CP    255    ; IF =255 THEN FILE NOT FOUND
  28.     JR    NZ,RDLPX
  29.     LD    DE,HUH
  30.     LD    C,9
  31.     CALL    BDOS
  32.     JP    0    ; GO BYE-BYE
  33. ;
  34. HUH:    DB    'HUH - NO FILE .PLT $'
  35. ;
  36. ;
  37. RDLPX:    LD    DE,WORK
  38. RDLP:    PUSH    DE
  39.     LD    C,26    ; SET DMA ADDRESS
  40.     CALL    BDOS
  41.     LD    DE,SFCB
  42.     LD    C,20    ; READ RECORD
  43.     CALL    BDOS
  44.     POP    DE
  45.     LD    HL,128
  46.     ADD    HL,DE
  47.     EX    DE,HL    ; DMA ADR:=DMA ADR+128
  48. ;
  49.     OR    A
  50.     JR    Z,RDLP
  51. ;
  52.     LD    HL,WORK
  53. ;
  54.     ;COMMAND TABLE
  55. PILOT:    LD B,':'
  56.     LD C,EOF
  57.     CALL ADVANC    ;INCREMENT LINE POINTER
  58.     JP NZ,OSLVL    ;END OF PROGRAM
  59.     LD (MARKER),HL
  60. BACKUP:    DEC HL
  61.     LD A,(HL)
  62.     CP ' '
  63.     JR Z,BACKUP
  64.     CP 'E'
  65.     JP Z,OSLVL
  66.     CP 'J'
  67.     JR Z,JUMP
  68.     CP 'M'
  69.     JR Z,MATCH
  70.     CP 'N'
  71.     JR Z,NO
  72.     CP 'R'    ;REMARK
  73.     JR Z,NXTLIN
  74.     CP 'Y'
  75.     JR Z,YES
  76.     CP 'A'
  77.     JR Z,ACCEPT    ;UNRECOG & NULL COMMANDS
  78.     JR TYPE        ;ARE TAKEN TO BE "TYPE"
  79. ;
  80.     ;COMMANDS
  81. NO:    EXX
  82.     SUB A
  83.     CP B
  84.     EXX    ;IF THE MATCH FLAG IS OFF
  85.     JR Z,BACKUP    ;EXECUTE CURRENT COMMAND
  86.     JR NXTLIN    ;ELSE GO TO THE NEXT LINE
  87. ;
  88. YES:    EXX
  89.     SUB A
  90.     CP B
  91.     EXX    ;IF THE MATCH FAG IS ON
  92.     JR NZ,BACKUP    ;EXECUTE CURRENT COMMAND
  93.     JR NXTLIN    ;ELSE GO THE NEXT LINE
  94. ;
  95. JUMP:    CALL TEXT    ;PUT HL ON THE LABEL
  96.     LD DE,LABEL    ;AND DE ON LABEL BUFFER
  97.     LD A,'*'
  98.     CALL SEARCH    ;SEEK *LABEL IN THE TEXT
  99.     JR Z,PILOT
  100.  
  101.     LD E,'*'    ;MESSAGE *
  102.     LD    C,2    ; IF LABEL WAS NOT FOUND
  103.     CALL    BDOS
  104.     JR NXTLIN
  105. ;
  106. TYPE:    LD    HL,(MARKER)
  107. ;
  108. NXTCHR:    INC    HL
  109.     PUSH    HL
  110.     LD    E,(HL)
  111.     LD    C,2    ; OUTPUT NEXT CHAR
  112.     CALL    BDOS
  113.     POP    HL
  114.     LD    A,(HL)
  115.     CP    ASCICR
  116.     JR    NZ,NXTCHR    ; UNTIL CR
  117. ;
  118.     LD    E,LF    ; ALSO DO LF
  119.     LD    C,2
  120.     CALL    BDOS
  121. ;
  122. NXTLIN:    LD HL,(MARKER)
  123.     JR PILOT    ;RETURN FOR NEXT INSTRUCTIONS
  124. ;
  125. MATCH:    CALL TEXT    ;ROLL UP TO
  126. NXTSTR:    LD (STRING),HL    ;FIRST CARACTER IN MATCH
  127.     EX DE,HL    ;SPIKE DE
  128.     EXX
  129.     SUB A
  130.     LD B,A        ;RESET THE MATCH FLAG
  131.     EXX
  132.     LD HL,RESPNS
  133.     LD B,ASCICR
  134.     LD C,','    ;SEEK THE MATCH STRING
  135.     CALL FIND    ;IN THE RESPONSE BUFFER
  136.     JR NZ,MORE    ;IF FAIL, SEEK NEXT STRING
  137.     EXX
  138.     INC A
  139.     LD B,A        ;SET MATCH FLAG FOR HIT
  140.     EXX
  141.     JR NXTLIN
  142. MORE:    EX DE,HL
  143. ADV:    LD A,(HL)    ;ROLL UP TO NEXT STRING
  144.     CP ASCICR    ;END THE OF MATCH STRINGS
  145.     JR Z,NXTLIN
  146.     CP ','    ;STRING DELIMITER
  147.     INC HL
  148.     JR NZ,ADV
  149.     JR NXTSTR
  150. ;
  151. ACCEPT:            ;GET INPUT LINE FROM USER
  152.     LD    E,'>'
  153.     LD    C,2
  154.     CALL    BDOS    ; SEND ACCEPT PROMPT
  155. ;
  156.     LD    C,10
  157.     LD    DE,IBUF
  158.     CALL    BDOS    ; READ LINE/BUFFERED
  159.     LD    E,LF
  160.     LD    C,2
  161.     CALL    BDOS    ; ADD LINE FEED
  162.     LD    HL,INPUT
  163.     LD    A,(IBUF1)
  164.     LD    E,A
  165.     LD    D,0
  166.     ADD    HL,DE
  167.     LD    (HL),ASCICR    ; FLAG END OF LINE WITH CR
  168. ;
  169.     LD HL,INPUT    ;SOURCE IS INPUT BUFFER
  170. ;        TO RETURN TO CP/M USE CTRL-C
  171.     LD DE,RESPNS    ;TARGET IS RESPONSE BUFFER
  172.     LD BC,LINLIM    ;TRANSFER USER'S INPUT
  173.     LDIR        ;TO THE RESPONSE BUFFER
  174. LABELX:    LD HL,(MARKER)    
  175. LABELA:    DEC HL        ;CHECK FOR LABEL
  176.     LD A,(HL)
  177.     CP ASCICR    ;IF THERE IS NO LABEL
  178.     JR Z,NXTLIN    ;RETURN FOR NEXT INSTRUCT
  179.     CP '*'        ;LABEL DESIGNATOR
  180.     JR NZ,LABELA
  181.     INC HL        ;SOURCE IS THE LABEL
  182.     LD DE,LABEL    ;TARGET IS LABEL BUFFER
  183.     LD A,'\'    ;LABEL REFERENCE MARK
  184.     CALL SEARCH    ;IF ACCEPT HAS NO LABEL
  185.     JR NZ,NXTLIN    ;RETURN FOR NEXT INSTRUCT
  186.     ;DELET/LABEL FROM TEXT
  187.     PUSH HL        ;START OF TAIL = /LABEL+1
  188.     LD E,EOF    ;END-OF-TAIL MARK
  189.     CALL SPAN    ;LENGTH OF TAIIIL IS IN BC
  190.     LD (TALSIZ),BC
  191.     POP HL        ;SOURCE IS START OF TAIL
  192.     LD DE,(POINTR)    ;TARGET IS START OF /LABEL
  193.     PUSH DE
  194.     LDIR        ;CLOSE UP TAIL OVER /LABEL
  195.     DEC DE
  196.     PUSH DE        ;CURRENT BOTTOM
  197.     ;MEASURE LENGTH OF RESPONSE
  198.     LD HL,RESPNS
  199.     LD E,ASCICR
  200.     CALL SPAN
  201.     POP HL        ;CURRENT BOTTOM
  202.     DEC BC    ;ACCOUNT FOR CR
  203.     PUSH BC        ;LENGTH OF RESPONSE IN BC
  204.     ; MOVE TAIL OUT OF BC BYTES
  205.     PUSH HL
  206.     ADD HL,BC
  207.     EX DE,HL    ;TARGET IS THE NEW BOTTOM
  208.     POP HL        ;TARGET IS THE OLD BOTTOM
  209.     LD BC,(TALSIZ)    ;LENGTH OF TAIL IS IN BC
  210.     LDDR        ;MOVE OUT THE TAIL
  211.     ; MOVE RESPONSE INTO TEXT
  212.     POP BC        ;LENGTH OF RESPONSE IN BC
  213.     POP DE        ;TARGET IS START OF INSERT
  214.     LD HL,RESPNS    ;SOURCE IS RESPONSE BUFFER
  215.     LDIR
  216.     ; TRUNCATE LINE IF TOO LONG
  217. BACK:    DEC DE
  218.     LD A,(DE)
  219.     CP ':'    ;CARRY DE BACK TO MARKER
  220.     JR NZ,BACK
  221.     LD BC,LINLIM+1    ;CUNT UP ONE LINE LENGTH
  222. ROLLUP:    INC DE
  223.     LD A,(DE)
  224.     CP ASCICR
  225.     JR Z,LABELX    ;SUBSTITUTION COMPLETED
  226.     DJNZ ROLLUP
  227. ROLLBK:    DEC DE
  228.     LD A,(DE)
  229.     CP ' '
  230.     JR NZ,ROLLBK
  231.     ; INSERT CR: IN TEXT AT END OF FIRST LINE
  232.     LD A,ASCICR
  233.     LD (DE),A    ;SALVAGE TAIL AS :NEW LINE
  234.     EX DE,HL    ;PUT HL ON THE TAIL
  235.     LD E,EOF
  236.     CALL SPAN    ;LENGTH OF TAIL IS IN BC
  237.     PUSH HL        ;SOURCE IS THE OLD BOTTOM
  238.     INC HL
  239.     EX DE,HL    ;TARGET IS OLD BOTTOM + 1
  240.     POP HL
  241.     LDDR        ;MOVE OUT TEXT BY 1 BYTE
  242.     LD A,':'    ;SET A MARKER ON RESIDUUM
  243.     LD (HL),A
  244.     ; LOOK FOR /LABEL AGAIN & REPEAT UNTIL EOF
  245.     JR LABELX
  246. ;
  247.     ; SUBROUTINES
  248. ADVANC:    INC HL
  249. ADVNCE:    LD A,(HL)
  250.     CP C        ; TERMINATOR IN C
  251.     JR Z,NOFIND
  252.     CP B        ;ROLL HL UP TO CHAR IN B
  253.     JR NZ,ADVANC
  254.     RET
  255. NOFIND:    INC A        ;SET NZ CONDITION FOR FAIL
  256.     RET
  257. ;
  258. SEARCH:    LD (DE),A    ;ENTRY FROM JUMP & ACCEPT
  259.     LD (STRING),DE
  260.     INC DE        ;START LABEL BUFFER WITH
  261.     LD BC,6        ;SPECIAL CHARACTER
  262.     LDIR        ;* IF JUMP, / IF ACCEPT
  263.     LD A,' '    ;LABEL TO LABEL BUFFER
  264.     LD (DE),A    ;ADD BLANK FOR A DELIMITER
  265.     LD B,EOF
  266.     LD    C,A    ; SEARCH ENTIRE TEXT
  267.     LD    HL,WORK    ; FROM TOP TO BOTTOM
  268. FIND:    LD (POINTR),HL    ;ENTRY FROM MATCH
  269.     LD    A,B
  270.     CP    (HL)
  271.     JR    Z,FAIL    ; FAIL
  272.     LD    DE,(STRING)
  273.     LD    A,(DE)
  274.     CP    (HL)
  275.     INC    HL
  276.     JR    NZ,FIND    ; FIND MATCH ON FIRST CHAR
  277. MATCHX:    INC    DE    ; THEN CHECK FOR MATCH
  278.     LD    A,(DE)    ; IN REST OF STRING
  279.     CP    C
  280.     JR    Z,END    ; HIT
  281.     CP    ASCICR
  282.     JR    Z,END    ; HIT
  283.     CP    (HL)
  284.     INC    HL
  285.     JR    Z,MATCHX
  286.     LD    HL,(POINTR)
  287.     INC    HL
  288.     JR    FIND
  289. FAIL:    INC    A    ; SET NZ COND. FOR FAIL
  290.     RET
  291. ;
  292. END:    BIT     MTCHFL,B    ; TEST IF IN SEARCH
  293.     RET    Z    ; RETURN IF IN MATCH
  294.     LD    A,(HL)
  295.     CP    ' '    ; PREVENTS CONFUSION
  296.     RET    Z
  297.     CP    ','    ; OF LABEL SUCH AS
  298.     RET    Z
  299.     CP    '.'    ; ANT & ANTLER
  300.     RET    Z
  301.     CP    ASCICR
  302.     JR    NZ,FIND
  303.     RET        ; RETURN Z CONDITION IF HIT
  304. ;
  305. SPAN:    LD    BC,1
  306. COUNT:    INC    HL
  307.     INC    BC
  308.     LD    A,(HL)    ; RETURN LENGTH BC STRING
  309.     CP    E
  310.     JR    NZ,COUNT
  311.     RET
  312. ;
  313. TEXT:    LD    HL,(MARKER)    ; STARTING AT THE :
  314. BLANKS:    INC    HL
  315.     LD    A,(HL)    ; ROOLS HL UP TO THE FIRST
  316.     CP    ' '
  317.     JR    Z,BLANKS    ; WORD IN THE TEXT LINE
  318.     RET
  319. ;
  320. ;
  321. ;    CONSTANTS
  322. ;
  323. MTCHFL:    EQU    7
  324. LINLIM:    EQU    81
  325. LF:    EQU    10
  326. ASCICR:    EQU    13
  327. EOF:    EQU    01AH
  328. ;
  329. ;    WORKSPACE
  330. ;
  331. LABEL:    DS    6
  332. TALSIZ:    DS    2
  333. MARKER:    DS    2
  334. POINTR:    DS    2
  335. STRING:    DS    2
  336. RESPNS:    DS    1
  337. IBUF:    DB    80    ; FLAG BUFFER LENGTH
  338. IBUF1:    DB    0    ; ACTUAL LINE LEN.
  339. INPUT:    DS    80    ; ACTUAL BUFFER 
  340.     DS    50    ; STACK AREA
  341. WORK:    EQU    $    
  342.