home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPMHELP / HELPER.LBR / HELPER.MZC / HELPER.MAC
Text File  |  2000-06-30  |  7KB  |  412 lines

  1. ;INTERACTIVE TEXT PRESENTER
  2. ;JULY 2, 1988
  3.  
  4.  
  5. ;TO TURN THIS INTO A PROGRAM, TACK TEXT FILE ON TO END OF IT AND
  6. ;THEN TACK A ZERO BYTE ON TO END OF TEXT FILE.
  7. ;
  8. ;E.G. PIP PROG.COM=HELPER.COM,FILE.TXT,0.DAT
  9. ;
  10. ;WHERE 0.DAT IS A 1-SECTOR FILE CONTAINING A 0 FOLLOWED BY A ^Z
  11.  
  12.     .Z80
  13.     ASEG
  14.  
  15. BDOS    EQU    5
  16.  
  17. ;CHARACTER THAT INTRODUCES COMMANDS
  18. ;MUST NOT BE USED FOR OTHER PURPOSES IN TEXT FILE.
  19. ;CAN BE ANY 7-BIT CHAR OTHER THAN 0 OR ^Z
  20.  
  21. CMARK    EQU    '~'
  22.  
  23.     ORG    100H
  24.  
  25.     LD    (SPSAVE),SP
  26.     LD    SP,TSTACK
  27.     LD    A,23
  28.     LD    (LINES),A
  29. ;CLEAR STACKS AND GO TO TOP OF TEXT
  30. START:    LD    HL,USTACK
  31.     LD    (USTAKP),HL
  32.     LD    HL,LSTACK
  33.     LD    (LSTAKP),HL
  34.     LD    DE,TEXT
  35. ;OUTPUTTING TEXT.  READ NEXT CHAR AND CHECK FOR COMMAND
  36. MAIN:    LD    A,(DE)
  37.     INC    DE
  38.     OR    A
  39.     JP    Z,EXIT
  40.     AND    7FH
  41.     CP    CMARK
  42.     JR    Z,DOCMD
  43.     CP    '^'
  44.     JR    Z,PUTCTL
  45. MAIN1:    CALL    PUTCHR
  46.     CP    10
  47.     JR    NZ,MAIN
  48. ;AUTO-PAUSE EVERY 23 LINES
  49.     LD    HL,LINES
  50.     DEC    (HL)
  51.     JR    NZ,MAIN
  52.     CALL    PAUSE
  53.     JR    MAIN
  54. ;CONVERT NEXT CHARACTER TO CONTROL EQUIVALENT
  55. PUTCTL:    LD    A,(DE)
  56.     INC    DE
  57.     CP    '^'
  58.     JR    Z,MAIN1
  59.     AND    31
  60.     JR    MAIN1
  61. ;PROCESS COMMAND
  62. DOCMD:    LD    A,(DE)
  63.     INC    DE
  64.     CP    CMARK
  65.     JR    Z,MAIN1        ;LITERAL
  66.     CALL    TOUPPR
  67. ;QUIT-LEAVE PROGRAM
  68.     CP    'Q'
  69.     JP    Z,EXIT
  70. ;LABEL-IGNORE IT HERE
  71.     CP    'L'
  72.     JR    NZ,DOCM1
  73.     CALL    SKIPNL
  74.     JR    MAIN
  75. ;SWITCH
  76. DOCM1:    CP    'S'
  77.     JP    Z,DOSWIT
  78. ;PAUSE-FORCE PAUSE UNLESS WE JUST FINISHED AN AUTO-PAUSE
  79.     CP    'P'
  80.     JR    NZ,DOCM2
  81.     LD    A,(LINES)
  82.     CP    23
  83.     JR    Z,DOCM3
  84.     CALL    PAUSE
  85. DOCM3:    JR    MAIN
  86. ;TOP-RESTART
  87. DOCM2:    CP    'T'
  88.     JP    Z,START
  89. ;USE-PICK UP DESTINATION, STACK CURRENT POSITION AND BRANCH
  90.     CP    'U'
  91.     JR    NZ,DOCM4
  92.     CALL    GETLBL
  93.     LD    HL,(USTAKP)
  94.     LD    (HL),E
  95.     INC    HL
  96.     LD    (HL),D
  97.     INC    HL
  98.     LD    (USTAKP),HL
  99.     JR    DOCM5
  100. ;GOTO-PICK UP LABEL AND BRANCH
  101. DOCM4:    CP    'G'
  102.     JR    NZ,DOCM6
  103.     CALL    GETLBL
  104. DOCM5:    CALL    DOGOTO
  105.     JR    CMDEND
  106. ;RETURN-UNSTACK POSITION AND RESUME READING
  107. DOCM6:    CP    'R'
  108.     JR    NZ,DOCM7
  109.     LD    HL,(USTAKP)
  110.     DEC    HL
  111.     LD    D,(HL)
  112.     DEC    HL
  113.     LD    E,(HL)
  114.     LD    (USTAKP),HL
  115.     JR    CMDEND
  116. ;CASE OR DEFAULT-IF WE SEE THEM HERE, WE NEED TO SKIP TILL END OF
  117. ;CURRENT SWITCH SECTION
  118. DOCM7:    CP    'C'
  119.     JP    Z,SKSWIT
  120.     CP    'D'
  121.     JP    Z,SKSWIT
  122. ;END-RESUME AFTER IT
  123.     CP    'E'
  124.     JR    NZ,DOCM8
  125.     CALL    SKIPNL
  126.     JR    CMDEND
  127. ;ECHO LAST RESPONSE
  128. DOCM8:    CP    'O'
  129.     JR    NZ,DOCM9
  130.     CALL    OTRESP
  131.     JR    CMDEND
  132. ;BEGIN LOOP
  133. DOCM9:    CP    'B'
  134.     JR    NZ,DOCM10
  135.     DEC    DE        ;STACK POSITION OF COMMAND
  136.     DEC    DE
  137.     LD    HL,(LSTAKP)
  138.     LD    (HL),E
  139.     INC    HL
  140.     LD    (HL),D
  141.     INC    HL
  142.     LD    (LSTAKP),HL
  143.     INC    DE
  144.     INC    DE
  145.     JR    CMDEND
  146. ;REPEAT LOOP (AGAIN)
  147. DOCM10:    CP    'A'
  148.     JR    NZ,DOCM11
  149.     LD    HL,(LSTAKP)
  150.     DEC    HL
  151.     LD    D,(HL)
  152.     DEC    HL
  153.     LD    E,(HL)
  154.     LD    (LSTAKP),HL
  155.     JR    CMDEND
  156. ;EXIT FROM LOOP
  157. DOCM11:    CP    'X'
  158.     JR    NZ,CMDEND
  159.     LD    HL,CNEST
  160.     LD    (HL),1
  161. SKLOOP:    CALL    SKIPCM
  162.     CP    'B'
  163.     JR    NZ,SKLOP1
  164.     INC    (HL)
  165.     JR    SKLOOP
  166. SKLOP1:    CP    'A'
  167.     JR    NZ,SKLOOP
  168.     DEC    (HL)
  169.     JR    NZ,SKLOP1
  170. CMDEND:    JP    MAIN
  171. ;PROCESS SWITCH COMMAND.  FIRST GET RESPONSE
  172. DOSWIT:    CALL    GPRMPT
  173.     LD    HL,CNEST
  174.     LD    (HL),1
  175. ;SKIP OVER TEXT UNTIL WE SEE A CASE COMMAND THAT MATCHES RESPONSE
  176. ;OR A DEFAULT COMMAND.  SKIP OVER NESTED SWITCH SECTIONS
  177. DOSW1:    CALL    SKIPCM
  178.     CP    'S'
  179.     JR    NZ,DOSW3
  180.     INC    (HL)
  181.     JR     DOSW1
  182. DOSW3:    CP    'E'
  183.     JR    NZ,DOSW4
  184.     DEC    (HL)
  185.     JR    NZ,DOSW1
  186. ;IF WE SEE END COMMAND WITHOUT MATCHING ANYTHING, RESUME DISPLAY
  187. DOSW6:    CALL    SKIPNL
  188.     JP    MAIN
  189. DOSW4:    CP    'D'
  190.     JR    NZ,DOSW5
  191.     LD    A,(HL)
  192.     CP    1
  193.     JR    NZ,DOSW1
  194.     JR    DOSW6
  195. DOSW5:    CP    'C'
  196.     JR    NZ,DOSW1
  197.     LD    A,(HL)
  198.     CP    1
  199.     JR    NZ,DOSW1
  200. ;SEE IF RESPONSE MATCHES THIS CASE
  201.     PUSH    HL
  202.     LD    HL,RESPNS
  203.     CALL    MATSTR
  204.     POP    HL
  205.     JR    NZ,DOSW1
  206.     JP    MAIN
  207. ;SKIP TO END OF CURRENT SWITCH SECTION, DEALING WITH NESTED
  208. ;SWITCH SECTIONS
  209. SKSWIT:    LD    HL,CNEST
  210.     LD    (HL),1
  211. SKSW1:    CALL    SKIPCM
  212.     CP    'S'
  213.     JR    NZ,SKSW2
  214.     INC    (HL)
  215.     JR    SKSW1
  216. SKSW2:    CP    'E'
  217.     JR    NZ,SKSW1
  218.     DEC    (HL)
  219.     JR    NZ,SKSW1
  220.     CALL    SKIPNL
  221.     JP    MAIN
  222.  
  223. ;LEAVE PROGRAM
  224.  
  225. EXIT:    LD    SP,(SPSAVE)
  226.     RET
  227.  
  228. ;SKIP PAST END OF CURRENT LINE
  229.  
  230. SKIPNL:    LD    A,(DE)
  231.     INC    DE
  232. ;CHECK FOR RUNNING OFF THE END
  233.     OR    A
  234.     JP    Z,EXIT
  235.     CP    10
  236.     JR    NZ,SKIPNL
  237.     RET
  238.  
  239. ;OUTPUT A CHARACTER
  240.  
  241. PUTCHR:    PUSH    AF
  242.     PUSH    DE
  243.     LD    E,A
  244.     LD    C,2
  245.     CALL    BDOS
  246.     POP    DE
  247.     POP    AF
  248.     RET
  249.  
  250. ;SKIP TEXT UNTIL A COMMAND SEEN.  RETURN COMMAND LETTER
  251.  
  252. SKIPCM:    LD    A,(DE)
  253.     INC    DE
  254.     OR    A
  255.     JP    Z,EXIT
  256.     CP    CMARK
  257.     JR    NZ,SKIPCM
  258.     LD    A,(DE)
  259.     INC    DE
  260. TOUPPR:    CP    'a'
  261.     JR    C,TOUPP1
  262.     CP    '{'
  263.     JR    NC,TOUPP1
  264.     AND    5FH
  265. TOUPP1:    RET
  266.  
  267. ;SEARCH FOR A LABEL IN TEXT, STARTING AT TOP
  268.  
  269. DOGOTO:    LD    DE,TEXT
  270. DOGO1:    CALL    SKIPCM
  271.     CP    'L'
  272.     JR    NZ,DOGO1
  273.     LD    HL,GOLAB
  274.     CALL    MATSTR
  275.     JR    NZ,DOGO1
  276.     RET
  277.  
  278. ;EXTRACT TARGET LABEL FROM TEXT
  279.  
  280. GETLBL:    LD    HL,GOLAB
  281. GETLB1:    LD    A,(DE)
  282.     LD    (HL),A
  283.     INC    DE
  284.     INC    HL
  285.     CP    13
  286.     JR    NZ,GETLB1
  287.     INC    DE
  288.     RET
  289.  
  290. ;COMPARE TEXT WITH STRING POINTED TO BY HL.  RETURN Z IF MATCH,
  291. ;NZ IF NO MATCH.  IN EITHER CASE, POINT TO START OF LINE AFTER
  292. ;MATCHING TEXT
  293.  
  294. MATSTR:    LD    A,(DE)
  295.     CALL    TOUPPR
  296.     LD    B,A
  297.     LD    A,(HL)
  298.     CALL    TOUPPR
  299.     CP    B
  300.     JR    NZ,MATST1
  301.     INC    HL
  302.     INC    DE
  303.     CP    13
  304.     JR    NZ,MATSTR
  305.     INC    DE
  306.     XOR    A
  307.     RET
  308. MATST1:    CALL    SKIPNL
  309.     LD    A,1
  310.     OR    A
  311.     RET
  312.  
  313. ;SHOW "MORE" MESSAGE, WAIT FOR ANY KEY.
  314. ;USES BACKSPACES INSTEAD OF RETURNS TO AVOID MESSING UP
  315. ;TABBED TEXT.  RESETS LINE COUNT WHEN DONE.
  316.  
  317. PAUSE:    PUSH    DE
  318.     LD    DE,P1STR
  319.     LD    C,9
  320.     CALL    BDOS
  321. PAUS1:    LD    C,6
  322.     LD    E,255
  323.     CALL    BDOS
  324.     OR    A
  325.     JR    Z,PAUS1
  326.     PUSH    AF
  327.     LD    DE,P2STR
  328.     LD    C,9
  329.     CALL    BDOS
  330.     POP    AF
  331.     POP    DE
  332.     CP    3
  333.     JP    Z,EXIT
  334.     LD    A,23
  335.     LD    (LINES),A
  336.     RET
  337.  
  338. P1STR:    DB    '[any key]',8,8,8,8,8,8,8,8,8,'$'
  339. P2STR:    DB    '         ',8,8,8,8,8,8,8,8,8,'$'
  340.  
  341. ;GET RESPONSE TO PROMPT
  342.  
  343. GPRMPT:    PUSH    DE
  344.     LD    DE,RESBUF
  345.     LD    C,10
  346.     CALL    BDOS
  347.     LD    A,(RESCNT)
  348.     LD    E,A
  349.     LD    D,0
  350.     LD    HL,RESPNS
  351.     ADD    HL,DE
  352.     LD    (HL),13
  353.     LD    A,10
  354.     CALL    PUTCHR
  355.     LD    A,23        ;RESET LINE COUNT
  356.     LD    (LINES),A
  357.     POP    DE
  358.     RET
  359.  
  360. ;ECHO MOST RECENT RESPONSE
  361.  
  362. OTRESP:    LD    HL,RESPNS
  363. OTRES1:    LD    A,(HL)
  364.     CP    13
  365.     RET    Z
  366.     PUSH    HL
  367.     CALL    PUTCHR
  368.     POP    HL
  369.     INC    HL
  370.     JR    OTRES1
  371. ;VARIABLES
  372.  
  373. ;RESPONSE BUFFER (SET UP FOR BDOS READ BUFFER FUNCTION)
  374. RESBUF:    DB    16
  375. RESCNT:    DS    1
  376. RESPNS:    DS    16
  377.  
  378. ;STACK FOR "USE" COMMAND NESTING
  379. USTAKP:    DS    2
  380. USTACK:    DS    16
  381.  
  382. ;STACK FOR LOOP NESTING
  383. LSTAKP:    DS    2
  384. LSTACK:    DS    16
  385.  
  386. ;SCREEN LINE COUNTER
  387. LINES:    DS    1
  388.  
  389. ;NESTING LEVEL FOR CASE SKIPPING
  390. CNEST:    DS    1
  391.  
  392. ;TARGET LABEL FOR GOTO AND USE COMMANDS
  393. GOLAB:    DS    16
  394.  
  395. ;PLACE TO KEEP CCP STACK
  396. SPSAVE:    DS    2
  397.  
  398. ;LOCAL STACK
  399.     DS    32
  400. TSTACK:
  401.  
  402. ;ACTUAL TEXT GETS TAGGED ON HERE.  FORCE IT TO BEGIN AT NEAREST
  403. ;RECORD BOUNDARY SO PIP DOESN'T LEAVE JUNK IN BETWEEN
  404.  
  405.     IFE    $ MOD 128
  406. TEXT    EQU    $
  407.     ELSE
  408. TEXT    EQU    ($+128) AND NOT 127
  409.     ENDIF
  410.  
  411.     END
  412.