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 / BBSING / PBBS / PREG451.LBR / PREG451.MZC / PREG451.MAC
Text File  |  2000-06-30  |  20KB  |  674 lines

  1.     TITLE    PREG.MAC v4.51                Jul 30/89
  2.  
  3. ; Filename    PREG45.MAC
  4. ; Author    Terry Pinto
  5. ; Language    Z-80 Assembler
  6. ; Last Update    May 02/89
  7. ; By        Terry Pinto
  8.  
  9. ; Following are two examples of the assembly and linking process using
  10. ; two of the more popular assemblers today. Make sure that you set the
  11. ; appropriate equate in PBBSEQU.HDR.
  12.  
  13. ; Assembly/Link - Using M80/L80
  14. ;    M80 =PREGnn/N
  15. ;    L80 /P:100,PREGnn,PBBSUBS,SYSLIB/S,PREGnn/N/E
  16. ;
  17. ;              Using SLR180
  18. ;    SLR PREGnn
  19. ;    SLRNKP PREGnn,/A:100,PREGnn,PBBSUBS,SYSLIB/S,/E
  20.  
  21. ; PREG is a registration program designed to be used in conjunction with
  22. ; the Public Bulletin Board System (PBBS). On signon, PREG will get the
  23. ; users profile and check the registration flag, bit 0 of FBYTE, and if
  24. ; set will abort and return control to the operating system displaying
  25. ; a message (if SIGN is set YES) reporting that the user's registration
  26. ; has been validated. The entire signon process is bypassed if SIGN is
  27. ; set to yes rendering PREG transparent to the user. If PREG finds that
  28. ; the registration bit is not set, the user is forced to complete this
  29. ; registration. The user is asked if they wish to register at this time
  30. ; and if they select NO, the call is terminated and the registration bit
  31. ; is not set. This will force the user through this proceedure on every
  32. ; call until they complete their registration. The text at label WELC
  33. ; should relay this information to the user. When the user elects to
  34. ; continue with the registration process, they will be asked to supply
  35. ; additional information about themselves. The questions asked can be
  36. ; changed to suit the needs of the system. Pay close attention to the
  37. ; information requarding these changes should and be necessary. When the 
  38. ; user does not elect to fill out the registration, PREG exits through 
  39. ; the error handler defined as ERRFIL in the PBBSDB.HDR file.
  40. ;
  41. ; The registration database is set up so that you can  configure it as you 
  42. ; see fit. The default settings are those used on my system and I've found 
  43. ; that they work quite well. The only important thing to remember is that 
  44. ; each record is limited to 128 bytes in length. You will need to edit the 
  45. ; fields defined under REQ to suit your systems needs. Only the data will 
  46. ; be saved in the data base and each field is a fixed length. If you are 
  47. ; at all familiar with dBASE, you will be able to read this file in as an 
  48. ; ASCII file with the SDF clause...
  49. ;
  50. ; example:
  51. ;         CREATE filename              ALL FIELDS DEFINED AS CHARACTER
  52. ;            USE filename
  53. ;         APPEND FROM filename.ext SDF
  54. ; This will read in the entire registration database and allow you to 
  55. ; utilize the powers of dBASE to sort or index the database and generate
  56. ; printouts based on whichever data you think is necessary. For instance,
  57. ; if you have a 500 name user base and a few of the fields you keep in 
  58. ; your database are NAME, ADDRESS, CITY, STATE, ZIP and a YES/NO field
  59. ; called DONATION, you could generate mailing labels of all those users
  60. ; that saw fit to donate to the upkeep of your system and send them a 
  61. ; personalized thank you note.
  62. ;
  63. ; NOTE: While this method will read in the registration database and allow
  64. ; you to index, sort and otherwise manipulate your registration database, it
  65. ; IS NOT recommended that you re-write the database back out to an ASCII disk
  66. ; file. Due to some inconsistancies in the way DBASE II handles the EOF marker,
  67. ; some file corruption can occur. The above proceedure will not alter your
  68. ; original registration database. 
  69.  
  70. ; PREG is used as part of:
  71.  
  72. ;        The Public Bulletin Board System
  73. ;        Author: Ian Cottrell
  74. ;            44 Lindhurst Cres
  75. ;            Ottawa, ON, Canada
  76. ;            K2G 0T7
  77. ;            The Information Centre RCP/M
  78. ;            (613) 952-2289 (300/1200/2400)
  79. ;------------------------------------------------------------------
  80.  
  81. ;    PBBS represents many hours of design,  coding and debugging.
  82. ;    However,  I do not believe in SHAREWARE.   So,    if you    find
  83. ;    PBBS  of  value to you and wish to pay for it in  some    way,
  84. ;    please consider a small contribution ($50 suggested) to your
  85. ;    local  Cancer Society in both of our names (thus creating  a
  86. ;    new  class of software - charityware!).   Then send a little
  87. ;    note telling me what you did and we will both feel good!  In
  88. ;    any case,  please share this program with others, it is free
  89. ;    and no form of remuneration may be accepted by anyone except
  90. ;    its author.
  91.  
  92. ;     Version 4.50     05/02/89    Initial release of PREG
  93. ;    Version 4.51    07/30/89    Removed ':' after labels in
  94. ;                    SIGN: EQU YES and STACK: EQU $
  95. ;                    to maintain M80 compatibility.
  96.  
  97. ;-------------------------------------------------------------------------
  98. ; NOTE: This file MUST be linked to PBSUB416.REL
  99. ;-------------------------------------------------------------------------
  100.  
  101.     EXT    F$OPEN,F$MOPEN,F$WRITE,F$CLOSE,F$APPEND,F$APPL
  102.     EXT    R$READ,R$WRITE
  103.     EXT    PFN2
  104.  
  105.     INCLUDE    PBBSEQU.HDR    ; PBBS configuration equates
  106.  
  107.      IF    M80        ; M80
  108.     .Z80            ; Needed for M80
  109.     ASEG
  110.     ORG    100H
  111.      ENDIF            ; M80
  112.  
  113.     JP    START        ; Jump around header and data
  114.  
  115. Z3IDEN:    DB    'Z3ENV'        ; Z3 Identifier
  116. Z3TYPE:    DB    1        ; Z3 Environment (external)
  117. Z3EADR:    DW    0000        ; Z3 Environment (address)
  118. Z3LOAD:    DW    0000        ; Z3 load address
  119.  
  120. ; Version name, date and levels
  121.  
  122. VNAME::    DB    'PREG '        ; Name
  123. VERDAT::DB    '89/'        ; Year
  124.     DB    '07/'        ; Month
  125.     DB    '30 '        ; Day
  126.     DB    'v',0        ; Status
  127.  
  128. VER::    DB    4        ; Version
  129. VERR::    DB    51        ; Revision
  130.  
  131. AUTHOR::DB    '  by:  Terry Pinto',CR,LF,0
  132.  
  133.     INCLUDE    PBBSDB.HDR    ; PBBS configuration strings, etc
  134.  
  135.     INCLUDE    BDOSHDR.MAC    ; Time and date conversions
  136.  
  137. BELL    EQU    7        ; bell character
  138. GETUSR    EQU    32        ; get user
  139. GETDRV    EQU    25        ; get drive
  140. REGLEN    EQU    128        ; length of registration record
  141.  
  142. ; ------------------------------------------------------------------------
  143. ; USER CONFIGURATION SECTION - EDIT AS NECESSARY!
  144. ; ------------------------------------------------------------------------
  145. ; Setting CNFRM to yes will display the maximum length of user input with
  146. ; underlines. This will give the user guidelines to the maximum allowable
  147. ; input expected. Setting to NO will disable this display.
  148. ;
  149. ; Example:           Name: TERRY PINTO___________________   (Max input 30)
  150. ; (CNFRM - YES)   Address: 14385 SW WALKER RD. B3________   (Max input 30)
  151. ;                  CitySt: BEAVERTON OR_______              (Max input 20)
  152. ;                     Zip: 97006                            (Max input  5)
  153. ;               Telephone: 503 644-0900                     (Max input 12)
  154. ;                     Age: 39                               (Max input  2)
  155. ;                     Sex: M                                (Max input  1)
  156.  
  157. CNFRM    EQU    YES        ; YES to show maximum allowable input
  158.  
  159. ; Setting of the LVL2 equate will bypass all activity of PREG for users
  160. ; above level 2 access. If you only want to present your first time users
  161. ; with the registration program, then set LVL2 to YES. Although PREG will
  162. ; check the registration bit in FBYTE and produce the same results, this
  163. ; activity takes a little longer time. Some SYSOPs may elect to speed up
  164. ; their systems by eliminating this check.
  165.  
  166. LVL2    EQU    NO        ; YES to run for access level 2 only
  167.  
  168. ; The signon message for this program can be controlled by this equate. If
  169. ; you set SIGN to NO the system will not display any signon message. If the
  170. ; settings for CREDIT and VERSION in the PBBSEQU.HDR file are also set to
  171. ; NO, PVER will be totally transparant to the user if they are already 
  172. ; validated by the system.
  173.  
  174. SIGN    EQU    YES        ; yes to display signon message
  175.  
  176. ; This next message will be part of the signon message. This part will
  177. ; be the actual request you issue for the information. 
  178.  
  179. WELC:    DB    CR,LF,'To apply for registration to APRAS, it is necessary'
  180.     DB    CR,LF,'for you to supply all of the additional information.'
  181.     DB    CR,LF,'If you fail to supply the information requested, it'
  182.     DB    CR,LF,'will result in your application being denied and your'
  183.     DB    CR,LF,'call being terminated. The information requested is'
  184.     DB    CR,LF,'for our records and will be kept confidential.'
  185.     DB    CR,LF,0
  186.  
  187. ; This next block contains all of the text sent to the user requesting
  188. ; your information. Edit so that they will make sense on your system.
  189. ; There is no restriction on the length of each statement as long as
  190. ; each is terminated with a binary 0. Each text is preceeded with the
  191. ; maximum length of input allowed. These lengths are reflected in the
  192. ; DS statements below.
  193.  
  194. RNAM:    DB    30,'     Name: ',0    ; text for field 1
  195. RADD:    DB    30,'  Address: ',0    ; text for field 2
  196. RCIT:    DB    20,' City, St: ',0    ; text for field 3
  197. RZIP:    DB     5,'      Zip: ',0    ; text for field 4
  198. RPHN:    DB    12,'Telephone: ',0    ; text for field 5
  199. RAGE:    DB     2,'      Age: ',0    ; text for field 6
  200. RSEX:    DB     1,'      Sex: ',0    ; text for field 7
  201.  
  202. NAME:    DS    30        ; field 1 length
  203. ADDR:    DS    30        ; field 2 length
  204. CITY:    DS    20        ; field 3 length
  205. ZIP:    DS    5        ; field 4 length
  206. TPHONE:    DS    12        ; field 5 length
  207. AGE:    DS    2        ; field 6 length
  208. SEX:    DS    1        ; field 7 length
  209.  
  210. ; The next statement defines the total length of the record and should
  211. ; always be the FILELENGTH-(LASTFIELD+1)-FIRSTFIELD.
  212.  
  213. RXTRA:    DS    REGLEN-(SEX+1-NAME)
  214.  
  215. ; ------------------------------------------------------------------------
  216. ; END OF USER CONFIGURATION SECTION - MAKE NO CHANGES FROM HERE ON!
  217. ; ------------------------------------------------------------------------
  218.  
  219. ; Check for BYE presence
  220.  
  221. START:     LD    E,241        
  222.     LD    C,BEXIST
  223.     CALL    BDOS        ; See if BYE5 is active
  224.     CP    77
  225.     JR    Z,CBBS        ; Check for PBBS operation
  226.     CALL    PRINT        ; Else, abort
  227.     DB    CR,LF,'BYE5 not available, aborting...',CR,LF,0
  228.     JP    EXIT        ; Restore D/U and exit
  229.  
  230. CBBS:    LD    A,(REENTR)    ; Get re-entry byte
  231.     OR    A        ; See if set
  232.     JR    NZ,BEGIN    ; if yes - start program
  233.     CALL    PRINT        ; If not - abort
  234.     DB    CR,LF,'User record not available, aborting...',CR,LF,0
  235.     JP    EXIT        ; Restore D/U and exit
  236.  
  237. ; Preserve system stack, and initialize program stack
  238.  
  239. BEGIN:    LD    (CCPSTK),SP    ; Save the return address
  240.     LD    SP,STACK    ; Install our stack
  241.  
  242.      IF    LVL2         
  243.     LD    A,(LOCK)    ; get user access level
  244.     CP    2        ; are they above level 2
  245.     JP    NZ,EXIT1    ; if yes - exit
  246.      ENDIF            ; LVL2
  247.  
  248. ; Save current drive/user
  249.  
  250.     LD    E,0FFH         
  251.     LD    C,GETUSR
  252.     CALL    BDOS        ; Get current user
  253.     LD    (OLDUSR),A    ; Save it
  254.     LD    C,GETDRV
  255.     CALL    BDOS        ; Get current drive
  256.     LD    (OLDDRV),A    ; Save it
  257.  
  258. ; Everything ok, let's begin
  259.  
  260. SIGNON:    
  261.      IF    SIGN
  262.     CALL    PVER        ; print program signon and version number
  263.  
  264.      IF    CREDITS
  265.     LD    HL,AUTHOR    ; point to author credits
  266.     CALL    PRINTM        ;  and display them
  267.      ELSE
  268.     CALL    PCRLF
  269.      ENDIF            ; CREDITS
  270.      ENDIF            ; SIGN
  271.  
  272. ; Now we log into the drive/user areas defined in the PBBSEQU.HDR file
  273. ; as the SYSDRV and SYSUSR.
  274.  
  275.     LD    A,SYSDRV    ; log into system drive
  276.     LD    E,A
  277.     LD    C,LOGDRV
  278.     CALL    SPBDOS
  279.     LD    A,SYSUSR    ; log into system user area
  280.     LD    E,A
  281.     LD    C,LOGUSR
  282.     CALL    SPBDOS
  283.  
  284. ; Routine to get the active user's record back into memory to be used as 
  285. ; source material for the user's name, city/state and telephone number.
  286. ; The use of this information will eliminate the need to duplicate input
  287. ; on the part of the user. It will also insure the accuracy of both the
  288. ; registration and user databases.
  289.  
  290.     LD    DE,USER        ; point to USERS.PBS FCB
  291.     CALL    F$OPEN        ; open file
  292.     JP    NZ,FOERR    ; file error routines
  293.  
  294. FOPEN:    CALL    SDMA        ; set DMA address
  295.     LD    DE,USER        ; point to USERS.PBS FCB
  296.     LD    HL,(USREC)    ; get users record number
  297.     CALL    R$READ        ; read user record into memory
  298.     JP    NZ,RERR
  299.     CALL    F$CLOSE        ; close user file
  300.     JP    NZ,FCERR
  301.     LD    HL,TBUFF    ; point to TBUFF
  302.     LD    DE,AVAIL     ; point to AVAIL (memory buffer)
  303.     LD    BC,USRLEN    ; length of user file record
  304.     LDIR            ; move data to memory buffer
  305.  
  306.     LD    A,(FBYTE)    ; get user flag byte
  307.     BIT    0,A        ; test registration bit
  308.     JP    Z,ALREG        ; if not set - continue with registration
  309.  
  310.      IF    SIGN
  311.     LD    HL,UNAME    ; point to user name
  312.     CALL    PRINTN        ;  and display it
  313.     CALL    PRINT
  314.     DB    ' - Registration Validated',cr,lf,0
  315.      ENDIF            ; SIGN
  316.     JP    EXIT
  317.  
  318. ; Open registration file for append with the last record in memory. Update
  319. ; the end-of-file marker and then get the next record for input. If the 
  320. ; file is not found it will be created.
  321.  
  322. ALREG:    LD    DE,REGS        ; point to FCB    
  323.     CALL    F$APPL        ; open for append with last record in memory
  324.     JR    NZ,NEOF        ; file not found
  325.  
  326.     LD    HL,NOEND    ; point to bytes for not end of file
  327.     LD    DE,TBUFF+125    ; position in buffer
  328.     LD    BC,3        ; length of no end of file
  329.     LDIR            ; move bytes
  330.     LD    DE,REGS        ; point to REGISTER.LIB FCB
  331.     CALL    F$WRITE        ; write record
  332.     JP    NZ,FWERR
  333.     CALL    F$CLOSE        ; close file
  334.     JP    NZ,FCERR
  335.  
  336. NEOF:    LD    HL,WELC        ; point to welcome message
  337.     CALL    PRINTM        ;  and display it
  338.     CALL    PCRLF    
  339.     CALL    PRINT        ; ask user if they want to register now
  340.     DB    'Would you like to register now? (Y/n) ',0
  341.     CALL    GETCH        ; get user input
  342.     CALL    CAPS        ; capitolize input
  343.     CALL    ECHO        ; echo input to display
  344.     CP    'N'        ; did user say NO
  345.     JP    Z,ERROR        ; if yes - exit and terminate call
  346.  
  347.     LD    A,' '        ; initialize buffer at NAME to spaces
  348.     LD    HL,NAME        ;  for proper field alignment
  349.     LD    BC,REGLEN    ; length of registration record
  350. CLBUF:    LD    (HL),A        ; clear buffer byte
  351.     INC    HL        ; point to next byte
  352.     DJNZ    CLBUF        ; continue until done
  353.  
  354. ;-------------------------------------------------------------------------
  355. ; Display request text, get response from user and save input in buffer
  356.  
  357. GETIN:    CALL    PCRLF1
  358.  
  359. ; Field for NAME displays a method for getting the information from the
  360. ; user record and moving it into the registration buffer automatically
  361. ; displaying the data to the user.
  362.  
  363.     LD    HL,RNAM        ; point to field 1 text
  364.     LD    A,(HL)        ; get length
  365.     LD    B,A        ;  and place in B
  366.     INC    HL        ; point to text
  367.     CALL    PRINTM        ;  and display it
  368.      IF    CNFRM
  369.     CALL    PRLINE
  370.      ENDIF            ; CNFRM
  371.     LD    HL,UNAME    ; point to user name
  372.     CALL    PRINTL        ;  and display it
  373.     CALL    PCRLF    
  374.     LD    HL,RNAM        ; print request for name
  375.     LD    A,(HL)        ; get length
  376.     LD    B,A        ;  and place in B
  377.     LD    HL,UNAME    ; point to user name
  378.     LD    DE,NAME        ; point to name buffer
  379.     CALL    MOVEBF        ; move data and padd with ' '
  380.  
  381. ; Field for ADDRESS displays a method for displaying the request text and
  382. ; getting the input from the user.
  383.  
  384.     LD    HL,RADD        ; print request for address
  385.     LD    DE,ADDR
  386.     CALL    DSPLY
  387.     LD    HL,ADDR
  388.  
  389.     LD    HL,RCIT
  390.     LD    A,(HL)
  391.     LD    B,A
  392.     INC    HL
  393.     CALL    PRINTM
  394.      IF    CNFRM
  395.     CALL    PRLINE
  396.      ENDIF            ; CNFRM
  397.     LD    HL,CITST
  398.     CALL    PRINTL
  399.     CALL    PCRLF
  400.     LD    HL,RCIT        ; print request for city
  401.     LD    A,(HL)
  402.     LD    B,A
  403.     LD    HL,CITST
  404.     LD    DE,CITY
  405.     CALL    MOVEBF
  406.  
  407.     LD    HL,RZIP        ; print request for zip
  408.     LD    DE,ZIP
  409.     CALL    DSPLY
  410.     LD    HL,ZIP
  411.  
  412.     LD    HL,RPHN
  413.     LD    A,(HL)
  414.     LD    B,A
  415.     INC    HL
  416.     CALL    PRINTM
  417.      IF    CNFRM
  418.     CALL    PRLINE
  419.      ENDIF            ; CNFRM
  420.     LD    HL,PHONE
  421.     CALL    PRINTL
  422.     CALL    PCRLF
  423.     LD    HL,RPHN        ; print request for telephone number
  424.     LD    A,(HL)
  425.     LD    B,A
  426.     LD    HL,PHONE
  427.     LD    DE,TPHONE
  428.     CALL    MOVEBF
  429.  
  430.     LD    HL,RAGE        ; print request for age
  431.     LD    DE,AGE
  432.     CALL    DSPLY
  433.     LD    HL,AGE
  434.  
  435.     LD    HL,RSEX        ; print request for sex (don't laugh!!)
  436.     LD    DE,SEX
  437.     CALL    DSPLY
  438.     LD    HL,SEX
  439.  
  440. ;-------------------------------------------------------------------------
  441.  
  442. LDONE:    CALL    PCRLF
  443.     CALL    PRINT        ; get user confirmation
  444.     DB    'Is the above information correct? (Y/n) ',0
  445.     CALL    GETCH        
  446.     CALL    CAPS
  447.     CALL    ECHO
  448.     CP    'N'        ; if not correct - restart registration
  449.     JP    Z,GETIN
  450.     CALL    PRINT
  451.     DB    CR,LF,LF,'Updating Registration Files >>> ',CR,LF,0
  452.  
  453. ; Open file registration file and position for save
  454.  
  455. ROPEN:    LD    DE,REGS        ; point to FCB
  456.     CALL    F$APPEND    ; open file for append
  457.     JP    Z,SETD        ; NZ set if file not found
  458.     CALL    F$MOPEN        ; open file (create if does not exist)
  459.     JP    NZ,FOERR
  460.  
  461. ; Move data to TBUFF. SYSLIB routines default to an FCB of 80H unless
  462. ; a SETDMA is used to change it.
  463.  
  464. SETD:    LD    HL,NAME        ; point to buffer
  465.     LD    DE,TBUFF    ; point to TBUFF
  466.     LD    BC,REGLEN    ; length of record 
  467.     LDIR            ; move data to TBUFF
  468.  
  469.      LD    HL,ENDOF    ; get end of file marker
  470.     LD    DE,TBUFF+125    ; point to last three bytes in file
  471.     LD    BC,3        ; length of end of file marker
  472.     LDIR            ; mark end of file
  473.  
  474. ; Write record to file
  475.  
  476. RPUT:    LD    DE,REGS        ; point to FCB
  477.     CALL    F$WRITE        ; write data from TBUFF to file
  478.     JP    NZ,FWERR
  479.     CALL    F$CLOSE        ; close file
  480.     JP    NZ,FCERR
  481.  
  482.     LD    DE,USER        ; open user file 
  483.     CALL    F$OPEN        
  484.     JP    NZ,FOERR
  485.     LD    HL,(USREC)    ; current user record number
  486.     CALL    R$READ        ; read record
  487.     JP    NZ,RERR
  488.     LD    A,(FBYTE)    ; get registration bit 
  489.     SET    0,A        ; set
  490.     LD    (FBYTE),A    ;  and save
  491.     LD    HL,AVAIL    ; move to TBUFF for write
  492.     LD    DE,TBUFF
  493.     LD    BC,USRLEN
  494.     LDIR
  495.     LD    HL,(USREC)    ; current user record number
  496.     LD    DE,USER        ; point to FCB
  497.     CALL    R$WRITE        ; write buffer to file
  498.     JP    NZ,RERR
  499.     CALL    F$CLOSE        ; close file
  500.     JP    NZ,FCERR
  501.  
  502. EXIT:    LD    A,(OLDDRV)    ; load into system drive
  503.     LD    E,A
  504.     LD    C,LOGDRV
  505.     CALL    SPBDOS
  506.     LD    A,(OLDUSR)    ; load into system user area
  507.     LD    E,A
  508.     LD    C,LOGUSR
  509.     CALL    SPBDOS
  510. EXIT1:    LD    SP,(CCPSTK)
  511.     JP    0
  512.  
  513. GETINP:    CALL    PRINT
  514.     DB    CR,LF,'You MUST supply ALL of the information requested',0 
  515.     RET
  516.  
  517. ; Subroutines
  518.  
  519. DSPLY:    PUSH    DE
  520.     LD    A,(HL)        ; get length of input
  521.     PUSH    AF        ; save input length on stack
  522.     LD    B,A        ; place in B
  523.     INC    HL        ; point to message
  524.     CALL    PRINTM        ; display request for input  
  525.      IF    CNFRM
  526.     CALL    PRLINE
  527.      ENDIF            ; CNFRM
  528.     POP    AF        ; restore input length from stack
  529.     LD    B,A        ; initialize INPUT routine for maximum input
  530.     LD    A,0        ; set INPUT to echo input to screen
  531.     LD    D,A        ; set INPUT to no-wrap
  532.     LD    C,20H        ; set INPUT to force upper case
  533.     CALL    INPUT        ; get user input
  534.     CP    0        ; get length of input
  535.     JR    NZ,INOK        ; if non-zero, there was input
  536.     CALL    GETINP        ; else - display error message
  537.     POP    BC        ; clear return address from stack
  538.     JP    GETIN        ; restart input
  539. INOK:    POP    DE           
  540.     LD    C,A        ; place length of input in BC
  541.     LD    B,0
  542.     LDIR            ; move input
  543.     CALL    PCRLF
  544.     RET
  545.  
  546. ; Move data to buffer and pad with ' '
  547.  
  548. MOVEBF:    LD    A,(HL)        ; get first byte
  549.     CP    0        ; is it a 0
  550.     JR    NZ,FILLBF    ; if not - save it
  551.     LD    A,' '        ; if yes - replace with ' '
  552. FILLBF:    LD    (DE),A        ; place in buffer
  553.     INC    HL        ; advance pointers
  554.     INC    DE
  555.     DJNZ    MOVEBF        ; continue until done
  556.     RET
  557.  
  558. ; Display line at the length of user input
  559.  
  560. PRLINE:    PUSH    HL
  561.     PUSH    DE
  562.     PUSH    BC
  563.     LD    A,'_'
  564.     CALL    LNE
  565.     POP    BC
  566.     PUSH    BC
  567.     LD    A,BS
  568.     CALL    LNE
  569.     POP    BC
  570.     POP    DE 
  571.     POP    HL
  572.     RET
  573.  
  574. LNE:    CALL    ECHO
  575.     DJNZ    LNE        
  576.     RET
  577.  
  578. ; Check input buffer for supplied data
  579.  
  580. SDMA:    LD    C,SETDMA
  581.     LD    DE,TBUFF
  582.     CALL    BDOS
  583.     RET
  584.  
  585. ; File error routines
  586.  
  587. FCERR:    INC    DE
  588.     CALL     PFN2
  589.     CALL    PRINT
  590.     DB    ' -> Error in Closing File',bell,0
  591.     JP    EXIT
  592.  
  593. FWERR:    INC    DE
  594.     CALL    PFN2
  595.     CP    1
  596.     JR    NZ,FW2
  597.     CALL    PRINT
  598.     DB    ' -> Error in Extending File',bell,0
  599.     JP    EXIT
  600. FW2:    CP    2
  601.     JR    NZ,FW3
  602.     CALL    PRINT
  603.     DB    ' -> End of Disk Data',bell,0
  604.     JP    EXIT
  605. FW3:    CP     0FFH
  606.     JR    NZ,FWU
  607.     CALL    PRINT
  608.     DB    ' -> No More Directory Space',bell,0
  609.     JP    EXIT
  610. FWU:    CALL    PRINT
  611.     DB     ' -> Unknown File Error',bell,0
  612.     JP    EXIT
  613.  
  614. FOERR:    INC    DE
  615.     CALL    PFN2
  616.     CALL    PRINT
  617.     DB    ' -> File Not Opened',bell,0
  618.     JP    EXIT
  619.  
  620. RERR:    INC    DE
  621.     CALL    PFN2
  622.     CP    1
  623.     JR    NZ,RR3
  624.     CALL    PRINT
  625.     DB    ' -> Attempt to Read Unwritten Record',bell,0
  626.     JP    EXIT
  627. RR3:    CP    3
  628.     JR    NZ,RR4
  629.     CALL    PRINT
  630.     DB    ' -> Could Not Close Current Extent',bell,0
  631.     JP    EXIT
  632. RR4:    CP      4
  633.     JR    NZ,RR5
  634.     CALL    PRINT
  635.     DB    ' -> Attempt to Read Unwritten Extent',bell,0
  636.     JP    EXIT
  637. RR5:    CP    5
  638.     JR    NZ,RR6
  639.     CALL    PRINT
  640.     DB    ' -> Directory Full',bell,0
  641.     JP    EXIT
  642. RR6:    CP    6
  643.     JP    NZ,FWU
  644.     CALL    PRINT
  645.     DB    ' -> Attempt to Read Beyond End of Disk',bell,0
  646.     JP    EXIT
  647.  
  648. ; Data section
  649.  
  650. USER:    DB    0        ; 0=search on default drive
  651.     DB    'USERS   '    ; file name
  652.     DB    'PBS'        ; file type
  653.     DS    24
  654.  
  655. REGS:    DB    0        ; 0=search on default drive
  656.     DB    'REGISTER'    ; file name
  657.     DB    'LIB'        ; file type
  658.     DS    24
  659.  
  660. ENDOF:    DB    0DH,0AH,1AH    ; marker for end of file
  661. NOEND:    DB    20H,0DH,0AH    ; not end of file
  662. TNAME:    DS    30        ; temporary name storage
  663. TCITST:    DS    30        ; temporary city-state storage
  664. TTPHNE:    DS    12        ; temporary telephone storage
  665. OLDDRV:    DB    0        ; storage for original drive
  666. OLDUSR:    DB    0        ; storage for original user
  667. REC:    DW    0        ; registration record number
  668. CCPSTK:    DW    0        ; storage for original stack address
  669.     DS    64          
  670. STACK    EQU    $
  671.  
  672.     END
  673.