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 / CPM / MISC / INSIDCPM.LBR / PROG.LQB / PROG.LIB
Text File  |  2000-06-30  |  2KB  |  98 lines

  1. ;
  2. ;  PROGRAM ENTRY MACRO: build local STACK, save CCP's stack
  3. ;  on it.  Handle return to CCP if main returns here.
  4. ;
  5. PROLOG    MACRO    ?SIZE,?MAIN
  6.     LOCAL    STKSIZE
  7.       IF  NUL  ?SIZE
  8. STKSIZE    SET    16
  9.       ELSE
  10. STKSIZE    SET    ?SIZE
  11.       ENDIF
  12.     ORG    100H    ; start at TPA
  13.     LXI    H,0
  14.     DAD    SP    ; HL = CCP stack ptr
  15.     LXI    SP,STDSTACK  ; set our stack ptr
  16.     PUSH    H    ; save CCP ptr for exit
  17.       IF  NUL  ?MAIN
  18.     CALL    MAIN    ; call mainline code
  19.       ELSE
  20.     CALL    ?MAIN    ; call mainline code
  21.       ENDIF
  22. ;
  23. ;  on normal EXIT, MAIN line will return to here
  24. ;
  25. EPILOG    POP    H    ; recover CCP's stack ptr,
  26.     SPHL        ; ..activate it, and
  27.     RET        ; ..return to CCP
  28. ;
  29.     DS    2*STKSIZE ; reserve stack space
  30. STDSTACK EQU    $
  31.     ENDM
  32. ;
  33. ;
  34. ;  PROGRAM ENTRY MACRO for complex programs: find bottom of
  35. ;  CCP and set stack there, call MAIN with HL = END of storage.
  36. ;
  37. PROLOG2    MACRO    ?MAIN
  38.     ORG    100H    ; start at TPA
  39.     LHLD    BDOS+1    ; HL --> BDOS
  40.     SPHL        ; stack starts under BDOS
  41.     LXI    D,0-128    ; negative stack size
  42.     DAD    D    ; HL --> stack bottom
  43.     DCX    H    ; HL --> last usable byte
  44.       IF  NUL  ?MAIN
  45.     CALL    MAIN    ; call mainline code
  46.       ELSE
  47.     CALL    ?MAIN    ; call mainline code
  48.       ENDIF
  49. ;
  50. ;  ON any exit, control will return here
  51. ;
  52. EPILOG    JMP    BOOT    ; do a warm start
  53. ;
  54. ;  ERROR EXIT to issue message addressed by DE, erase
  55. ;  active SUBMIT file (if any).
  56. ;
  57. ERROREXIT EQU    $
  58.     MVI    C,9    ; print line to '$'
  59.     CALL    BDOS
  60. ;
  61. ;  ERROR EXIT to terminate SUBMIT only
  62. ;
  63. ERROROUT EQU    $
  64.     LXI    D,SUBMITFCB
  65.     MVI    C,19    ; erase file in FCB
  66.     CALL    BDOS
  67.     JMP    EPILOG    ; exit by single point
  68. ;
  69. ;  FCB used for erasing SUBMIT file 'A:$$$.SUB' -- ONLY
  70. ;  first 16 bytes are significant
  71. ;
  72. SUBMITFCB EQU    $
  73.     DB    1,'$$$     SUB',0,0,0,0
  74.     ENDM
  75. ;
  76. ;
  77. ;  SERVICE MACRO: call BDOS for a service, saving
  78. ;  all registers except A and sometimes HL.  Load
  79. ;  DE register with parameter if one is given.
  80. ;
  81. SERVICE    MACRO    ?S,?DE
  82.     PUSH    B    ; save BC and..
  83.     PUSH    D    ; ..DE always
  84.   IF (?S NE 12) AND (?S NE 24) AND (?S NE 27) AND (?S NE 29) AND (?S NE 31)
  85.     PUSH    H    ; save HL when BDOS doesn't return it
  86.   ENDIF
  87.   IF NOT NUL ?DE
  88.     LXI    D,?DE    ; load parameter
  89.   ENDIF
  90.     MVI    C,?S    ; set service number
  91.     CALL    0005H    ; and call BDOS
  92.   IF (?S NE 12) AND (?S NE 24) AND (?S NE 27) AND (?S NE 29) AND (?S NE 31)
  93.     POP    H    ; restore HL if it doesn't have the result
  94.   ENDIF
  95.     POP    D    ; restore DE..
  96.     POP    B    ; and BC, always
  97.     ENDM
  98.