;RUNFILE.ASM    Ver 1.0         27 Nov 1983
;
;Phil Cary, W5TYF
;Mesilla Valley RCP/M, Las Cruces, NM
;(505) 522-8856
;
;The following is an application of the technique described in CPMCHAIN.DOC
;
;The purpose of this program is to aid the user who is unfamiliar with your
;system in running the message program.  It gives a message reminding the
;user of the correct filename, and then chains to that program.
;
;Since there are at least four major message systems(CBBS, MINICBBS, RBBS,
;and MINIRBBS) plus some others like my own MSGSYS, this will take the guess
;work out of the user's attempts to run your message system.
;
;To use this aid, fill in the name of the message program you are using below,
;change the message texts as desired, change the defdrv/usr equates as
;required and assemble.  Then rename the COM file to one of the above and
;copy it into the drive/area of your message system.  Rename the COM file
;again to another possibility from above and copy again.  Continue until you
;think you have covered all bases.
;
;BDOS functions

wrcon:  equ     2               ;console output
printf: equ     9               ;print string
bdos:   equ     5               ;bdos call
openf:  equ     15              ;open file
readf:  equ     20              ;read sequential
dmaf:   equ     26              ;set dma address
usrset: equ     32              ;set user area

;Misc equates

cr:     equ     0dh
lf:     equ     0ah

       org     100h

       jmp     start           ;skip over following data

;############################################################################

;CHANGE THE FOLLOWING TO MEET YOUR REQUIREMENTS

defdrv: equ     'F'-'@'         ;drive containing message system COM file
defusr: equ     0               ;user area  "        "      "     "    "

runfil: db      'MSGSYS  '      ;filename for your message system COM file,
; eight chars-->>^^^^^^^^<<     ;...MINICBBS, RBBS, MINICBBS, CBBS, etc.

;Remind the user of the name of your message program

opnmsg: db      cr,lf
       db      'Message program here is MSGSYS',cr,lf
       db      'Chaining to MSGSYS.....',cr,lf,'$'

errmsg: db      cr,lf
       db      'Chain error! Warmbooting.  Enter MSGSYS please.$'

;#############################################################################

start:  mvi     c,8             ;first move the filename above into fcb below
       lxi     h,runfil        ;location of filename
       lxi     d,fcb+1         ;destination
       call    move            ; 8 bytes

       mvi     c,usrset        ;Set up set user function
       mvi     e,defusr        ;desired user area
       call    bdos            ;..do it

       lxi     d,opnmsg        ;print the reminder
       call    prnmsg

       lhld    bdos+1          ;start of BDOS address
       lxi     b,-codeln       ;subtract length of code to be moved
       dad     b               ;..to make room at top of TPA
       shld    jmpr+1          ;fill in jump address below
       push    h               ;save code address for RET
       xchg                    ;..and use to calculate final location of fcb
       lxi     h,fcb-loader    ;distance between start of loader and fcb
       dad     d               ;add address computed above
       shld    fcbr+1          ;and put in LXI below for eventual file read
       push    h               ;save FCB destination address
       lxi     h,loader        ;point to start of loader
       mvi     c,codeln        ;length of loader
       call    move            ;destination still in DE from above
       pop     d               ;recover FCB address( saved as push h above )
       mvi     c,openf
       call    bdos            ;open file
       inr     a
       jz      error           ;signal if error
       pop     h               ;recover start of loader
       sphl                    ;point stack to top of
       push    h               ;start of loader and save address again
       lxi     h,100h          ;point to start of TPA for set DMA below
       ret                     ;to address on stack which is start of loader

loader: push    h               ;DMA address at start of TPA
       xchg                    ;put in DE for DMA set
       mvi     c,dmaf
       call    bdos            ;set DMA address

fcbr:   lxi     d,$-$           ;address of moved fcb filled in earlier
       mvi     c,readf
       call    bdos            ;read next record
       ora     a               ;check for end of file
       jnz     100h            ;EOF -> start TPA
       pop     h               ;recover
       lxi     d,128           ;...and bump DMA address
       dad     d

jmpr:   jmp     $-$             ;jump to loader address filled in earlier

fcb:    db      defdrv          ;drive code
       ds      8               ;room for filename
       db      'COM'           ;file type
       db      0,0,0,0,0,0     ;Zero out remaining 24 bytes of fcb
       db      0,0,0,0,0,0
       db      0,0,0,0,0,0
       db      0,0,0,0,0,0

codeln: equ     $-loader

move:   ; c = # bytes, hl = source, de = destination
       mov     a,m
       stax    d
       inx     h
       inx     d
       dcr     c
       jnz     move
       ret

error:  lxi     d,errmsg
       call    prnmsg
       jmp     0

; Write a string of characters to the CRT
;
prnmsg: mvi     c,printf
       call    bdos
       ret

       end