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 / PACKET / RLI120.ARK / USR.MAC < prev    next >
Text File  |  1987-01-17  |  19KB  |  905 lines

  1. ; USR.MAC - 1/17/87 - The MailBox users file.
  2.  
  3.     .z80
  4.     maclib    TNC.LIB
  5.  
  6.     entry    opnusr,clsusr,getusr,updusr,eusr1,eusr2,lstusr,untusr,untusz
  7.     entry    filusr,conusr,prtcon,rdusr,uslst,uscnt,ufcb,ubfcb,mxusr
  8.     entry    uspath,ushbbs,usdate,ustime,usmnr,usname,usport,setnam
  9.     entry    ussetx,usseth
  10.     entry    usopt,usobbs,usoexp,usoloc,usosys,usoexa,usoexb
  11.     entry    um1,um2,um3,um4,um5,um6,um7,um8,um9,um9a,um10,um11,um12
  12.     entry    um13,um14,um15,um16,um17,dname,shpath
  13.  
  14.     external    pgst,pghd,pgck,pgdn
  15.     external    mnr,mcall,ocall,scall,curtime,date,time
  16.     external    inibak,fcb1,fcb2,fcb3,opt1,opt2,parse,logtxt
  17.     external    setb7,getbuf,f1l,f1st,f2l,f2st,f3l,f3st
  18.     external    mtnc,stnc,bindec,numb,@move,@fill,@upper
  19.     external    wfcb,tobuf,@ntobuf,@closew,@openn
  20.     external    @outch,@prtx,@cmp,@mcmd,movcal,iscall,erwhat
  21.     external    @src,@srct,@srcl,@srcn,@srcw,@srcc,@srcf
  22.     external    ercant,erdone,erexst,erfind,waitc,muldec
  23.     external    tnca,tncb,addcr0,getcmd,cmd,cmdlen,cmdtyp,$memry
  24.  
  25.     asciictl
  26.     bdosdef
  27.     tncdefs
  28.     dseg
  29.  
  30. ; File control blocks.
  31.  
  32. ufcb:    ds    fcbsize
  33. urec    equ    ufcb+33
  34. ubfcb:    ds    fcbsize
  35.  
  36. ; User file structure.
  37. ; File header record.
  38. ; Note that the byte corresponding to usopt MUST be zero.
  39.  
  40. ushdr:
  41. uscnt:    dw    0        ; # users known
  42. usver:    db    5        ; File version
  43. usldt:    ds    6        ; Date of last compress
  44. usltm:    ds    4        ; Time of last compress
  45. uslmnr:    ds    2        ; Message number at last compress
  46. uschg:    db    false        ; True if file has changed
  47.     rept    112
  48.     db    0
  49.     endm
  50.  
  51. ; One record per user.
  52.  
  53. ; Bits in usopt are:
  54.  
  55. usoloc    equ    1        ; Local user
  56. usobbs    equ    2        ; Is a BBS
  57. usoexp    equ    4        ; Is expert user
  58. usodel    equ    8        ; Deleted record
  59. usosys    equ    10h        ; User may become sysop
  60. usoexa    equ    20h        ; User excluded on port A
  61. usoexb    equ    40h        ; User excluded on port B
  62.  
  63.  
  64. pathl    equ    81        ; Max chars in 8 digi + cr + 0
  65. usunul    equ    5        ; Unused (yet)
  66.  
  67. usrec:
  68. uscall:    db    '      '    ; Users call
  69. usdate:    db    '000000'    ; Date last login
  70. ustime:    db    '0000'        ; Time last login
  71. usmnro    equ    $-usrec        ; Offset to msg number
  72. usmnr:    dw    0        ; First msg to see next time
  73. usssid:    ds    1        ; SSID most recent connect
  74. uspriv:    ds    1        ; Unused now
  75. usname:    rept    12
  76.     db    ' '
  77.     endm
  78. usopto    equ    $-usrec        ; Offset to usopt
  79. usopt:    ds    1        ; Optional features
  80. usport:    ds    1        ; TNC port A or B
  81. uspath:    ds    pathl        ; Path
  82. uslogd:    dw    2        ; Count of logins
  83. ushbbs:    db    '      '    ; Call of users home bbs
  84. usunu:    rept    usunul
  85.     db    0
  86.     endm
  87.  
  88. um1:    ds    2
  89. um2:    ds    2
  90. um3:    ds    2
  91. um4:    ds    2
  92. um5:    ds    2
  93. um6:    ds    2
  94. um7:    ds    2
  95. um8:    ds    2
  96. um9:    ds    2
  97. um9a:    ds    2
  98. um10:    ds    2
  99. um11:    ds    2
  100. um12:    ds    2
  101. um13:    ds    2
  102. um14:    ds    2
  103. um15:    ds    2
  104. um16:    ds    2
  105. um17:    ds    2
  106. dname:    ds    2
  107. first:    ds    1
  108. uslst:    ds    2        ; Address of user calls list
  109. mxusr:    ds    2        ; Max users in users list.
  110. ver:    ds    1
  111. cnt:    ds    2
  112. ptr:    ds    2        ; Record number of current user record
  113.     cseg
  114.  
  115. movncr:    ld    a,(de)
  116.     cp    cr
  117.     ret    z
  118.     ld    (hl),a
  119.     inc    de
  120.     inc    hl
  121.     dec    b
  122.     ret    z
  123.     jr    movncr
  124.  
  125. ; Open (or create and open) the user file.
  126. ; Allocate memory for user call list.
  127.  
  128. opnusr:    maklst    uslst,mxusr,6,' '
  129.     dodosa    setdma,ushdr
  130.     ld    hl,ufcb+10
  131.     call    setb7        ; Set $sys attribute
  132.     dodosa    open,ufcb
  133.     inc    a
  134.     jr    z,opnua
  135.     movb    ver,usver    ; Save current version
  136.     dodosa    read,ufcb
  137.     call    fixusr
  138.     ld    hl,(uscnt)
  139.     call    bindec
  140.     ld    hl,(um14)
  141.     call    @prtx
  142.     jr    rdlst
  143. opnua:    dodosa    make,ufcb
  144.     call    curtime
  145.     zmov    usldt,date,6
  146.     zmov    usltm,time,4
  147.     zmov    uslmnr,mnr,2
  148.  
  149. ; Write the user file header.
  150. ; Close and re-open the file.
  151.  
  152. wtufhs:    call    wthdr
  153.     dodosa    close,ufcb
  154.     dodosa    open,ufcb
  155.     ret
  156. wthdr:    lxim    urec,0
  157.     dodosa    setdma,ushdr
  158.     dodosa    wrec,ufcb
  159.     ret
  160.  
  161. ; Fill the list of user calls.
  162.  
  163. rdlst:    lxim    cnt,0        ; Clear count
  164.     movw    ptr,uslst    ; Point to start of list
  165.     dodosa    setdma,usrec    ; Point I/O to record
  166. rdlsta:    ld    de,(cnt)    ; Got this many
  167.     ld    hl,(uscnt)    ; Need this many
  168.     or    a        ; Clear carry
  169.     sbc    hl,de        ; Got em all?
  170.     ret    z        ; Yes
  171.     inc    de
  172.     ld    (cnt),de    ; Count this one
  173.     ld    (urec),de    ; Point to rec in file
  174.     dodosa    rrec,ufcb    ; Read the record
  175.     ld    hl,(ptr)    ; Current slot in list
  176.     move    ,uscall,6    ; Move call to list
  177.     ld    (ptr),hl    ; Next slot
  178.     jr    rdlsta
  179.  
  180. ; Close the user file.
  181.  
  182. clsusr:    dodosa    close,ufcb
  183.     ret
  184.  
  185. ; Read the user record for mcall.
  186. ; If there is no record, make one.
  187.  
  188. rdusr:    comp    mcall,uscall,6    ; Already current?
  189.     ret    z        ; Yes
  190.     srclst    mcall,uslst,uscnt,6,6
  191.     jr    nz,rdusra    ; New user, make a record for him
  192.     ld    hl,(@srcf)    ; Number of record found
  193.     ld    (ptr),hl
  194.     ld    (urec),hl
  195.     dodosa    setdma,usrec
  196.     dodosa    rrec,ufcb
  197.     ret
  198. ; New user. Make a user record for him.
  199. rdusra:    call    curtime
  200.     zmov    uscall,mcall,6
  201.     zmov    usdate,date,6
  202.     zmov    ustime,time,4
  203.     lxim    usmnr,0
  204.     mvim    usssid,'0'
  205.     comp    mcall,ocall,6    ; Owner's user record?
  206.     ld    a,usoloc+usobbs+usoexp+usosys
  207.     jr    z,rdusrb    ; Yes
  208.     ld    a,0
  209. rdusrb:    ld    hl,usopt
  210.     ld    (hl),a
  211.     fill    usname,12,' '
  212.     ld    de,(dname)
  213.     ld    hl,usname
  214.     ld    b,12
  215.     call    movncr
  216.     mvim    usport,' '
  217.     ld    hl,uspath
  218.     call    addcr0        ; Null string for path
  219.     lxim    uslogd,0    ; Zero the login count
  220.     fill    ushbbs,6,' '    ; Blank home bbs
  221.  
  222.     lxim    ptr,0        ; Flag for "no user record current"
  223.     ld    de,(uscnt)    ; # users
  224.     ld    hl,(mxusr)    ; Max #
  225.     or    a        ; Clear carry
  226.     sbc    hl,de        ; List full?
  227.     ret    z        ; Yes, leave default
  228.     ex    de,hl
  229.     inc    hl        ; Count this user
  230.     ld    (uscnt),hl    ; Save new count
  231.     ld    (ptr),hl    ; Point to record
  232.     ld    (urec),hl    ; Point I/O to record
  233.     ld    de,(@srcl)    ; Point to start of list
  234.     zmov    ,mcall,6    ; Put this user call in list
  235.     mvim    uschg,true    ; Mark file as changed
  236.     dodosa    setdma,usrec
  237.     dodosa    wrec,ufcb
  238.     jp    wtufhs
  239.  
  240. ; Update the current user record with current date,time,last msg.
  241. ; Called at logout.
  242.  
  243. updusr:    dtz    ptr        ; Valid user record?
  244.     ret    z        ; No
  245.     ld    (urec),hl    ; Point I/O at record
  246.     call    curtime
  247.     zmov    usdate,date,6
  248.     zmov    ustime,time,4
  249.     movw    usmnr,mnr
  250.     inxm    uslogd        ; Count this login
  251.     dodosa    setdma,usrec
  252.     dodosa    wrec,ufcb
  253.     ret
  254.  
  255. ; Set users name.
  256.  
  257. setnam:    fill    usname,12,' '
  258.     ld    a,(f2l)
  259.     cp    13
  260.     jr    c,setna
  261.     ld    a,12
  262. setna:    ld    c,a
  263.     ld    b,0
  264.     ld    hl,(f2st)
  265.     ld    de,usname
  266.     ldir
  267.     jp    erdone
  268.  
  269. ; Connect to user.
  270. ; Return zero set if connect fails.
  271.  
  272.     dseg
  273. cmsg:    db    'C $U',0
  274. vmsg:    db    ' v ',0
  275.     cseg
  276.  
  277. ; Send connect text to tnc from current user record.
  278.  
  279. prtcon:    ld    hl,cmsg
  280.     call    @prtx
  281.     ld    a,(usssid)
  282.     cp    '0'
  283.     jr    z,prtca
  284.     ld    c,'-'
  285.     call    @outch
  286.     ld    a,(usssid)
  287.     ld    c,a
  288.     call    @outch
  289. prtca:    ld    a,(uspath)
  290.     cp    cr
  291.     jr    z,prtcb
  292.     ld    hl,vmsg
  293.     call    @prtx
  294. prtcb:    ld    hl,uspath
  295.     jp    @prtx
  296.  
  297. ; Connect to the station with call in fcb2.
  298.  
  299. conusr:    srclst    fcb2+1,uslst,uscnt,6,6
  300.     jr    z,cusra
  301.     call    erfind
  302.     retz
  303. cusra:    zmov    mcall,fcb2+1,6
  304.     call    rdusr
  305.     call    tnca
  306.     cmpm    usport,'B'
  307.     jr    nz,cusrb
  308.     call    tncb
  309. cusrb:    master
  310.     call    prtcon
  311.     console
  312.     zmov    mcall,ocall,6
  313.     call    rdusr
  314.     retnz
  315.  
  316. ; Display last path to user.
  317.  
  318. shpath:    srclst    fcb2+1,uslst,uscnt,6,6
  319.     jp    nz,erfind
  320.     zmov    scall,mcall,6
  321.     zmov    mcall,fcb2+1,6
  322.     call    rdusr
  323.     ld    a,(uspath)
  324.     cp    cr
  325.     jr    z,shpa
  326.     ld    hl,(um13)
  327.     cmpm    usport,'L'    ; Linked user?
  328.     jr    z,shpc        ; Yes
  329.     ld    hl,(um11)
  330. shpc:    call    @prtx
  331.     ld    hl,uspath
  332.     call    @prtx
  333.     jr    shpb
  334. shpa:    prtx    um12
  335. shpb:    zmov    mcall,scall,6
  336.     call    rdusr
  337.     ret
  338.  
  339. ; Get the user record for mcall, update port and path.
  340. ; If there is no record, make one.
  341.  
  342. getusr:    call    rdusr        ; Read user record
  343.     comp    mcall,ocall,6    ; Local?
  344.     ret    z        ; Yes, no tnc, ssid, or path
  345.     movb    usport,logtxt    ; TNC id
  346.     call    parse        ; Parse the connect string
  347.     ld    a,(f1l)        ; Length of call+ssid
  348.     ld    b,a
  349.     ld    hl,(f1st)    ; Location of call
  350.     ld    a,'-'
  351. gtusra:    cp    (hl)        ; A minus?
  352.     inc    hl
  353.     ld    c,(hl)        ; ssid
  354.     jr    z,gtusrb    ; Got a ssid
  355.     dec    b
  356.     jr    nz,gtusra
  357.     ld    c,'0'        ; No ssid
  358. gtusrb:    ld    a,c
  359.     ld    (usssid),a
  360. ; Get path
  361.     cmpm    usport,'L'    ; Linked user?
  362.     jr    nz,zz        ; No
  363.     zmov    uspath,scall,6    ; Call of adjacent node
  364.     ld    hl,uspath+6
  365.     jp    addcr0
  366.  
  367. zz:    ld    hl,uspath    ; Where to put CR,0
  368.     ld    a,(f3l)        ; Length of path string
  369.     or    a        ; Is a path?
  370.     jp    z,addcr0    ; No
  371.     cp    pathl-1        ; For CR,0
  372.     ret    nc        ; Path too long
  373.     ld    c,a
  374.     ld    b,0        ; Length of path
  375.     ld    de,(f3st)
  376.     move    uspath,,    ; Get path
  377.     jp    addcr0        ; Add CR,0 to string
  378.  
  379. ; Edit the user record for user call in fcb2.
  380.  
  381. getinp:    call    getcmd        ; Get response
  382.     ckcmd    getinp,getina,getina
  383.     ld    a,(cmdlen)
  384.     or    a        ; Change?
  385.     ret
  386. getina:    scf
  387.     ret
  388.  
  389. ; Mark current user record as deleted.
  390.  
  391. delusr:    ld    a,(usopt)    ; Get options
  392.     or    usodel        ; Or in "deleted" bit
  393.     ld    (usopt),a    ; Put options back
  394.     mvim    uschg,true    ; Mark file as changed
  395.     ret
  396.  
  397. eubit:    push    bc
  398.     call    @prtx        ; Put the prompt
  399.     call    getinp        ; Get response
  400.     pop    bc
  401.     ret    c        ; Discon/timeout
  402.     ret    z        ; No change
  403.     ld    a,(usopt)
  404.     xor    b
  405.     ld    (usopt),a
  406.     ret
  407.  
  408. ; EU (no argument) command. Go through all users and ask delete.
  409.  
  410. eusr1:    zmov    scall,mcall,6    ; Save current user
  411.     movw    cnt,uscnt
  412.     mvim    shp,pathl    ; Show whole path
  413.     dodosa    setdma,usrec
  414. eusr1a:    dtz    cnt        ; Done?
  415.     jp    z,eusrz        ; Yes
  416.     ld    (urec),hl
  417.     dec    hl        ; Count this one
  418.     ld    (cnt),hl
  419.     dodosa    rrec,ufcb
  420.     call    lusr
  421.     prtx    um2
  422.     call    getinp
  423.     jp    c,eusrz        ; Discon/timeout
  424.     ld    a,(opt1)
  425.     cp    'Q'        ; Wants to quit?
  426.     jp    z,eusrz        ; Yes
  427.     cp    'Y'        ; Delete it?
  428.     jr    nz,eusr1a
  429.     call    delusr        ; Mark this one as deleted
  430.     dodosa    wrec,ufcb    ; Write changed rec
  431.     jr    eusr1a
  432.  
  433. ; EU <call> command. Edit a user record.
  434.  
  435. eusr2:    zmov    scall,mcall,6    ; Save current user
  436.     zmov    mcall,fcb2+1,6    ; Who to edit
  437.     call    rdusr        ; Get that rec in, or make one
  438.     dtz    ptr        ; Got one?
  439.     jr    nz,xx        ; Yes
  440.     call    ercant        ; User file full, can't make new
  441.     jp    eusrz
  442.  
  443. xx:    prtx    um1        ; Print header
  444.     mvim    shp,pathl    ; Show whole path
  445.     call    lusr        ; Print it
  446.     prtx    um2        ; Ask delete
  447.     call    getinp        ; Get response
  448.     jp    c,eusrz        ; Discon/timeout
  449.     ld    a,(opt1)
  450.     cp    'Q'        ; Quit?
  451.     jp    z,eusrz        ; Yes
  452.     cp    'Y'        ; Delete?
  453.     jr    nz,eusra    ; No
  454.     call    delusr        ; Mark this one as deleted
  455.     jp    eusry        ; Clean up
  456.  
  457. eusra:    ld    hl,(um15)    ; Change expert user state?
  458.     ld    b,usoexp
  459.     call    eubit        ; Get response
  460.     jp    c,eusrz        ; Discon/timeout
  461.     ld    hl,(um9a)    ; Change is a bbs state?
  462.     ld    b,usobbs
  463.     call    eubit        ; Get response
  464.     jp    c,eusrz        ; Discon/timeout
  465.     ld    hl,(um4)    ; Change sysop state?
  466.     ld    b,usosys
  467.     call    eubit        ; Get response
  468.     jp    c,eusrz        ; Discon/timeout
  469.     ld    hl,(um16)    ; Change exclude on A state?
  470.     ld    b,usoexa
  471.     call    eubit        ; Get response
  472.     jp    c,eusrz        ; Discon/timeout
  473.     ld    hl,(um17)    ; Change exclude on B state?
  474.     ld    b,usoexb
  475.     call    eubit        ; Get response
  476.     jp    c,eusrz        ; Discon/timeout
  477.     prtx    um3        ; Change call?
  478.     call    getinp        ; Get response
  479.     jp    c,eusrz        ; Discon/timeout
  480.     jr    z,eusrc        ; No change
  481.     srclst    uscall,uslst,uscnt,6,6
  482.     jr    nz,eusrb    ; No find (can't happen...)
  483.     zmov    @srcl,fcb1+1,6    ; New call
  484. eusrb:    zmov    uscall,fcb1+1,6    ; New call
  485. eusrc:    prtx    um10        ; Change ssid?
  486.     call    getinp        ; Get response
  487.     jp    c,eusrz        ; Discon/timeout
  488.     jr    z,eusrd        ; No change
  489.     movb    usssid,opt1    ; New ssid
  490. eusrd:    prtx    um5        ; Change name?
  491.     call    getinp        ; Get response
  492.     jp    c,eusrz        ; Discon/timeout
  493.     jr    z,eusrf        ; No change
  494.     fill    usname,12,' '    ; Clear it
  495.     movcmd    usname,0,12    ; New name
  496. eusrf:    prtx    um7        ; Change port?
  497.     call    getinp        ; Get response
  498.     jp    c,eusrz        ; Discon/timeout
  499.     jr    z,eusrg        ; No change
  500.     movb    usport,fcb1+1    ; New port
  501. eusrg:    prtx    um8        ; Change path?
  502.     call    getinp        ; Get response
  503.     jr    c,eusrz        ; Discon/timeout
  504.     jr    z,eusri        ; No change
  505.     ld    a,(cmdlen)
  506.     ld    c,a
  507.     ld    hl,cmd
  508.     call    @upper
  509.     ld    hl,uspath
  510.     cmpm    cmd,' '        ; Single space?
  511.     jr    z,eusrh        ; Yes, no path
  512.     movcmd    ,0,pathl-2    ; New path
  513. eusrh:    call    addcr0        ; Add CR,0 to string
  514. eusri:    prtx    um9        ; Change home bbs?
  515.     call    getinp        ; Get response
  516.     jr    c,eusrz        ; Discon/timeout
  517.     jr    z,eusry        ; No change
  518.     zmov    ushbbs,fcb1+1,6
  519.     comp    ushbbs,ocall,6    ; This is home?
  520.     ld    a,(usopt)
  521.     jr    nz,eusrj    ; No
  522.     or    usoloc
  523.     jr    eusrk
  524. eusrj:    cpl
  525.     or    usoloc
  526.     cpl
  527. eusrk:    ld    (usopt),a
  528.  
  529. eusry:    movw    urec,ptr    ; Point to record
  530.     dodosa    setdma,usrec
  531.     dodosa    wrec,ufcb    ; Write changed rec
  532.     call    wthdr
  533.     prtx    um1        ; Print header
  534.     call    lusr        ; Print user record
  535. eusrz:    zmov    mcall,scall,6    ; Restore current call
  536.     call    rdusr        ; and make record current
  537.     jp    waitc
  538.  
  539. ; Routine to let user flip his own "expert" bit.
  540.  
  541. ussetx:    ld a,    (usopt)        ; Change bit in user option byte
  542.     xor    usoexp
  543.     ld    (usopt),a
  544.     jp    erdone
  545.  
  546. ; Routine to let user set his own "home bbs" field
  547.  
  548.     dseg
  549. ttcall:    ds    6
  550.     cseg
  551.  
  552. usseth:    fill    ttcall,6,' '
  553.     ld hl,    (f2st)        ; Copy arg from here
  554.     ld de,    ttcall        ;  to this temp
  555.     ld a,    (f2l)        ; Only this many chars
  556.     call    movcal        ; Stripping any SSID
  557.     ld hl,    ttcall        ; Check for valid BBS call
  558.     call    iscall
  559.     jp c,    erwhat        ; If not, don't do it
  560.     zmov    ushbbs,ttcall,6
  561.     comp    ushbbs,ocall,6
  562.     ld a,    (usopt)        ; Set local-user bit appropriately
  563.     jr nz,    ushnl        ; Go if not local
  564.     or    usoloc        ; Say local
  565.     jr    ush9
  566. ushnl:    cpl
  567.     or    usoloc        ; Say not local
  568.     cpl
  569. ush9:    ld    (usopt),a    ; Store local/not local bit
  570.     jp    erdone
  571.  
  572.  
  573.  
  574. ; FB and FL command - make a file with bbs / local users.
  575.  
  576. filusr:    openwn    fcb2
  577.     jp    z,erexst
  578.     movw    cnt,uscnt
  579. fusra:    dtz    cnt        ; Done?
  580.     jr    nz,fusrb    ; No
  581.     ld    c,eof
  582.     call    tobuf
  583.     closew
  584.     jp    rdusr        ; Get right user record back
  585.  
  586. fusrb:    ld    (urec),hl
  587.     dec    hl        ; Count this one
  588.     ld    (cnt),hl
  589.     dodosa    setdma,usrec
  590.     dodosa    rrec,ufcb
  591.     ld    b,usobbs
  592.     cmpm    opt2,'B'
  593.     jr    z,fusrc
  594.     ld    b,usoloc
  595. fusrc:    ld    a,(usopt)
  596.     and    b
  597.     jr    z,fusra
  598.     ntobuf    uscall,6
  599.     ld    c,' '
  600.     call    tobuf
  601.     ntobuf    usname,12
  602.     ld    c,cr
  603.     call    tobuf
  604.     ld    c,lf
  605.     call    tobuf
  606.     jr    fusra
  607.  
  608. ; List the user records.
  609.  
  610.     dseg
  611. shp:    ds    1        ; # chars of path to print
  612.     cseg
  613. lstusr:    movw    cnt,uscnt
  614.     mvim    shp,21        ; Dont show whole path
  615.     ld    hl,(um1)    ; Address of header
  616.     call    pgst        ; Init screen paging
  617.     dodosa    setdma,usrec
  618. lusra:    dtz    cnt        ; Any left?
  619.     jr    nz,lusrb    ; Yes
  620.     call    pgdn
  621.     jp    rdusr        ; Make his user record current
  622. lusrb:    ld    (urec),hl
  623.     dec    hl        ; Count this one
  624.     ld    (cnt),hl
  625.     dodosa    rrec,ufcb
  626.     ld    a,(opt2)
  627.     cp    'B'        ; Show bbs only?
  628.     jr    nz,p1        ; No
  629.     ld    a,(usopt)
  630.     and    usobbs        ; BBS?
  631.     jr    nz,p9        ; Yes, show it
  632.     jr    lusra
  633. p1:    cp    'L'        ; Show locals only?
  634.     jr    nz,p2        ; No
  635.     ld    a,(usopt)
  636.     and    usoloc        ; Local?
  637.     jr    nz,p9        ; Yes, show it
  638.     jr    lusra
  639. p2:    cp    'S'        ; Show sysops only?
  640.     jr    nz,p3        ; No
  641.     ld    a,(usopt)
  642.     and    usosys
  643.     jr    nz,p9
  644.     jr    lusra
  645. p3:    cp    'E'        ; Show excluded only?
  646.     jr    nz,p9        ; No
  647.     ld    a,(usopt)
  648.     and    usoexa+usoexb
  649.     jr    z,lusra
  650. p9:    call    pghd
  651.     call    lusr
  652.     call    pgck
  653.     jr    nz,lusra    ; No pause
  654.     ld    a,c
  655.     cp    etx        ; Wants to quit?
  656.     jp    z,rdusr        ; Yes, make his user record current
  657.     jr    lusra
  658.  
  659. lusr:    ld    hl,($memry)
  660.     move    ,uscall,6
  661.     ld    (hl),' '
  662.     inc    hl
  663.     move    ,usdate,6
  664.     ld    (hl),' '
  665.     inc    hl
  666.     move    ,ustime,4
  667.     push    hl
  668.     ld    hl,(uslogd)
  669.     call    bindec
  670.     pop    hl
  671.     move    ,numb,5
  672.     push    hl
  673.     ld    hl,(usmnr)
  674.     call    bindec
  675.     pop    hl
  676.     move    ,numb,5
  677.     ld    (hl),' '
  678.     inc    hl
  679.     move    ,ushbbs,6
  680.     ld    (hl),' '
  681.     inc    hl
  682.     ld    a,(usssid)
  683.     ld    (hl),a
  684.     inc    hl
  685.     ld    c,usosys
  686.     call    pyn
  687.     ld    c,usoloc
  688.     call    pyn
  689.     ld    c,usoexp
  690.     call    pyn
  691.     ld    c,usobbs
  692.     call    pyn
  693.     ld    c,usodel
  694.     call    pyn
  695.     ld    c,usoexa
  696.     call    pyn
  697.     ld    c,usoexb
  698.     call    pyn
  699.     ld    a,(usport)
  700.     ld    (hl),a
  701.     inc    hl
  702.     ld    (hl),' '
  703.     inc    hl
  704.     move    ,usname,12
  705.     ld    de,uspath
  706.     ld    a,(shp)
  707.     ld    b,a
  708.     call    movncr
  709.     call    addcr0        ; Add CR,0 to string
  710.     ld    hl,($memry)
  711.     jp    @prtx
  712.  
  713. pyn:    ld    b,'N'
  714.     ld    a,(usopt)
  715.     and    c
  716.     jr    z,pyna
  717.     ld    b,'Y'
  718. pyna:    ld    (hl),b
  719.     inc    hl
  720.     ret
  721.  
  722. ; Untangle the user file. Remove deleted users.
  723.  
  724.     dseg
  725. copbs:    ds    2
  726. copbp:    ds    2
  727. copbc:    ds    2
  728. copin:    ds    2
  729. oct:    ds    2
  730. ict:    ds    2
  731. uuzf:    ds    1
  732.     cseg
  733.  
  734. ; Read a bunch of sectors into buffer
  735.  
  736. copr:    movw    copbp,$memry    ; Point to start of buffer space
  737.     movw    copbc,copbs    ; Init avail buffer count
  738.     lxim    copin,0        ; Init count of records read
  739. copra:    ld    de,(copbp)
  740.     dodosa    setdma        ; Point IO to buffer
  741.     dodosa    read,fcb3    ; Read text record
  742.     dcxm    ict        ; Count one read
  743.     ld a,    (uuzf)        ; Want to zero the msg numbers?
  744.     or    a
  745.     jr z,    copr5        ; Go if not
  746.     ld hl,    (copbp)        ; Yes. Find msg number slot
  747.     ld de,    usmnro
  748.     add hl,    de        ; ..
  749.     ld (hl),0        ; Clear it
  750.     inc    hl
  751.     ld (hl),0        ; Both bytes
  752. copr5:    ld    hl,(copbp)
  753.     ld    de,usopto
  754.     add    hl,de
  755.     ld    a,(hl)
  756.     and    usodel        ; Deleted?
  757.     jr    nz,coprb    ; Yes, read next
  758.     inxm    copin        ; Count records in buffer
  759.     ld    hl,(copbp)
  760.     ld    de,128
  761.     add    hl,de
  762.     ld    (copbp),hl    ; Point to next buffer
  763.     dcxm    copbc        ; One less available
  764.     ld    a,l
  765.     or    h        ; Any left
  766.     ret    z        ; No, done with bunch
  767. coprb:    dtz    ict        ; Any left in file?
  768.     jr    nz,copra    ; Yes, read next
  769.     ret
  770.  
  771. ; Write the bunch of records.
  772.  
  773. copw:    movw    copbp,$memry
  774. copwa:    dtz    copin        ; More to do?
  775.     ret    z        ; No
  776.     dec    hl
  777.     ld    (copin),hl
  778.     ld    de,(copbp)
  779.     dodosa    setdma
  780.     dodosa    write,fcb2    ; Write record
  781.     inxm    oct        ; Count one written
  782.     ld    hl,(copbp)
  783.     ld    de,128
  784.     add    hl,de
  785.     ld    (copbp),hl
  786.     jr    copwa
  787.  
  788. untusz:    ld a,    1        ; Here to clear msg number during untusr
  789.     jr    untusb
  790. untusr:    cmpm    uschg,true    ; Any new or deleted?
  791.     ret    nz        ; No
  792.     ld a,    0
  793. untusb:    ld    (uuzf),a    ; Flag whether or not to clear msg numbers
  794.     dtz    uscnt        ; Any in the file?
  795.     ret    z        ; No
  796.     prtx    um6        ; Tell untangling
  797.     ld    hl,(uscnt)    ; # user records
  798.     inc    hl        ; Plus one for header
  799.     ld    (ict),hl    ; Is number to copy
  800.     lxim    oct,0        ; Init # copied
  801.  
  802.     zmov    fcb2,ufcb,fcbsize
  803.     zmov    fcb3,ubfcb,fcbsize
  804.     call    inibak        ; Initialize files for backup
  805.     ret    z        ; Didn't work
  806.     call    getbuf        ; Get # sectors free mem avail
  807.     ld    (copbs),hl
  808.  
  809. ; Copy the file.
  810.  
  811. unta:    call    copr        ; Read a bunch
  812.     call    copw        ; Write em
  813.     dtz    ict        ; Done?
  814.     jr    nz,unta        ; No
  815.     dodosa    close,fcb2
  816.     dodosa    open,ufcb    ; Open under correct fcb
  817.     ld    hl,(oct)    ; # records written
  818.     dec    hl        ; Minus one
  819.     ld    (uscnt),hl    ; Is current # users
  820.     call    curtime
  821.     zmov    usldt,date,6
  822.     zmov    usltm,time,4
  823.     movw    uslmnr,mnr
  824.     mvim    uschg,false
  825.     call    wthdr
  826.     call    rdlst        ; Re-build the list
  827.     jp    rdusr        ; Make local user current and return
  828.  
  829. ; Update user file to current version.
  830.  
  831. fixusr:    ld    a,(ver)
  832.     ld    hl,usver
  833.     cp    (hl)
  834.     ret    z
  835.     dtz    uscnt        ; Any in the file?
  836.     jp    z,fixz        ; No
  837.     lxim    ict,0        ; Input rec #
  838.     dodosa    setdma,usrec
  839. fixa:    inxm    ict        ; Next input rec
  840.     ld    (urec),hl    ; Point to input rec
  841.     dodosa    rrec,ufcb    ; Read it
  842.     ld    a,(usver)
  843.     cp    3        ; Version 3 file?
  844.     jr    z,fixd        ; Yes
  845.     cp    4        ; Version 4 file?
  846.     jr    z,fixf        ; Yes
  847. ; Fixes for version 1 or 2
  848.     ld    hl,uspath
  849.     ld    c,pathl-2
  850. fixb:    ld    a,(hl)
  851.     or    a
  852.     jr    z,fixc
  853.     cp    ' '
  854.     jr    z,fixc
  855.     cp    cr
  856.     jr    z,fixc
  857.     inc    hl
  858.     dec    c
  859.     jr    nz,fixb
  860. fixc:    call    addcr0        ; Add CR,0 to string
  861.     ld    hl,usssid
  862.     ld    a,(hl)
  863.     cp    ' '
  864.     jr    nz,fixd
  865.     ld    (hl),'0'
  866. ; Change for version 3->4
  867. fixd:    lxim    uslogd,1    ; Start login count at one
  868.     ld    a,(usopt)
  869.     and    usoloc        ; Local user?
  870.     jr    nz,fixe        ; Yes
  871.     fill    ushbbs,6,' '    ; Blank fill home bbs
  872.     jr    fixf
  873. fixe:    zmov    ushbbs,ocall,6
  874. ; Change for version 4->5
  875. fixf:    ld    hl,uspriv    ; Old priv type
  876.     ld    a,(hl)
  877.     ld    (hl),0        ; Now unused
  878.     ld    b,usosys
  879.     cp    'S'        ; Sysop?
  880.     jr    z,fixg        ; Yes
  881.     ld    b,usoexa
  882.     cp    'A'        ; Excluded A?
  883.     jr    z,fixg        ; Yes
  884.     ld    b,usoexb
  885.     cp    'B'        ; Excluded B?
  886.     jr    z,fixg        ; Yes
  887.     ld    b,usoexa+usoexb
  888.     cp    'E'        ; Excluded both?
  889.     jr    nz,fixy        ; No, nothing to do
  890.  
  891. fixg:    ld    a,(usopt)
  892.     xor    b
  893.     ld    (usopt),a
  894. fixy:    movw    urec,ict    ; Point to output rec
  895.     dodosa    wrec,ufcb    ; Write it
  896.     ld    hl,(ict)    ; # we did
  897.     ld    de,(uscnt)    ; # to do
  898.     or    a        ; Clear carry
  899.     sbc    hl,de        ; Did em all?
  900.     jp    nz,fixa        ; No
  901. fixz:    movb    usver,ver
  902.     jp    wthdr
  903.     end
  904. 
  905.