;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