home *** CD-ROM | disk | FTP | other *** search
- ;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
-