-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUade0F.asm
1290 lines (1070 loc) · 20.4 KB
/
Uade0F.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;.OPT
;UADE0F;> Uade0F
;.TTL
;Fileserver file UADE0F
.UADE0F
;**********************
;* A U T M A N *
;**********************
;AUTMAN: THE AUTHENTICATION MANAGER
;THE PASSWORD FILE CONTAINS A NUMBER
;OF ENTRIES, EACH OF WHICH HAS THE FOLLOWING FORM:-
;0) USERID (10 BYTES)
;1) PASSWORD (6 BYTES)
;4) Free space (4 bytes)
;3) FLAG (1 BYTE) - INUSE & PRIVILEGE FLAG
APWIND = 4;window size in blocks
;***** MAIN ROUTINE *****
.AUTMAN
{
LDX #10;AUTMAN HAS 10 ENTRY POINTS
LDA #MODAUT;A:=NAME OF THIS MODULE
JSR ENTRY
LDA ATRTNS,X
STA ATJUMP+1
LDA ATRTNS+1,X
STA ATJUMP+2
LDA #0
STA ATDRIV
LDA #9
STA ATWORK+2;** 31/10/83
;<>0 -> dont keep window with empty slot
;unset in ATNWUS
JSR SETFS
.ATJUMP
JMP ATJUMP
.ATRTNS
EQUW ATNWUS;1 => NEW USER
EQUW ATCKPW;2 => CHECK PASSWORD
EQUW ATSTPW;3 => SET PASSWORD
EQUW ATDLUS;4 => DELETE USER
EQUW ATSPRV;5 => SET PRIVILEGE
EQUW ATREST;6 => RESTART
EQUW ATSOPT;7 => SET "USER OPTION"
EQUW ATENS;8 => Update user disc space in PW file ** 2/10/84 **
EQUW ATFREE;9 => Return user disc space
EQUW ATWRIT;10=> Write user disc space
}
.ATEXIT
JMP EXIT
.PWTITL
.PWFILE
EQUB "$.PASSWORDS",CR
;***** ATNWUS *****
;ATNWUS: NEW USER - MAKE AN ENTRY IN THE PASSWORD FILE
;ENTRY:
;ARGB = LS(PTR TO USERINFO)
;ARGC = MS(PTR TO USERINFO)
;ARGD = LS(PTR TO USERID)
;ARGE = MS(PTR TO USERID)
;EXIT:
;ARGA = RC
;FUNCTION:-
;0) CHECK THAT CALLER HAS SYSTEM PRIV
;1) CHECK THAT USERID DOES NOT EXIST ALREADY
;2) CHECK SYNTAX OF USERID
;3) MAKE AN ENTRY IN PW FILE
{
.ATNWSG
STA ATWORK+2
JSR APENRG
BNE ATEXIT
.*ATNWUS
LDA #0
STA DOTFLG
JSR CHKPRV;CHECK THAT CALLER HAS SYSTEM PRIV
;GENPTR:=PTR TO USERINFO
BNE ATEXIT
JSR SETAUT;AUTPTR:=PTR TO USERID
;SEE IF USERID EXISTS ALREADY
LDA #0
STA ATDRIV
JSR FUSIDD
BNE ATNWSA
LDA #ATERRF;USERID ALREADY IN USE
BNE ATNWXA
.ATNWSA
LDA #0
STA ATWORK+2
STA ATDRIV
JSR CHKPRV;GENPTR:=PTR TO USERINFO
LDY #UTDISC;ARGA,B=DISC NO.
LDA (GENPTR),Y
TAX
INY
LDA (GENPTR),Y
LDY #ARGC
STA (NEWARG),Y
TXA
DEY;Y:=ARGB
STA (NEWARG),Y
LDA #15
JSR SETRTN
JSR MAPMAN;FIND DRIVE WITH DISC NO.
BNE ATNWSD
LDY #ARGB
LDA (NEWARG),Y
STA ATDRIV
.ATNWSD
JSR FUSIDD
BEQ ATNWSB
CMP #ATERRB;User ID not found
BEQ ATNWSG
BNE ATEXIT
;CHECK SYNTAX OF USERID
.ATNWSB
LDY #0
STY DOTFLG
.DOTLP
LDX #MAXID
LDA (AUTPTR),Y;Check first char is alpha only
JSR ISCHAR
BCS ATNWSR;Nope -> error
.ATNWSC
LDA (AUTPTR),Y
JSR ISDCHA;Is digit or char
BCS ATNWSF;Nope
INY
DEX
BNE ATNWSC
LDA (AUTPTR),Y;Check char after user id. is terminator
.ATNWSF
CMP #CR
BEQ ATNWSH; => continue
CMP #DOT
BNE ATNWSR
LDA DOTFLG
BNE ATNWSR
INC DOTFLG
CPY #MAXID+1;should have had a "." before this
BCS ATNWSR
INY
BCC DOTLP
.ATNWSR
LDA #ATERRG;SYNTAX ERROR IN USERID
.ATNWXA
JMP ATNWSX
;SEE IF THERE IS ANY ROOM IN PW FILE
.ATNWSH
TYA ;Check if ptr. zero
BEQ ATNWSR; => bad user id.
EOR #MAXUNM
STA DOTFLG;0=> maximum length
LDY #PWUSID
.ATNWSN
LDA (AUTPTR),Y;Set userid (terminated CR)
CMP #DOT
BNE ATNIND
LDX DOTFLG
BNE ATNIND
LDA PWFPTR
BNE ATNWSP
DEC PWFPTR + 1
.ATNWSP
DEC PWFPTR
JMP ATNDID
.ATNIND
STA (PWFPTR),Y
CMP #CR
BEQ ATNWSQ;Check for end of userid
.ATNDID
INY
BNE ATNWSN
.ATNWSQ
LDA DOTFLG
BNE ATNWPI
INC PWFPTR
BNE ATNWPI
INC PWFPTR+1
.ATNWPI
LDY #PWPASS
LDA #TERMIN
STA (PWFPTR),Y;PASSWORD = ""
LDY #PWFREE;space allocation always maximum
LDA #4
LDX #UTFRLN-1
.ATNWFR
STA (PWFPTR),Y;** 2/10/84 **
INY
DEX
BNE ATNWFR
TXA
STA (PWFPTR),Y
LDY #PWFLAG
LDA #INUSE
STA (PWFPTR),Y
JSR MARKDT;MARK PW FILE DIRTY
LDA #0
.ATNWSX
JSR APENFL
JMP ATEXIT
}
;***** ATCKPW *****
;ATCKPW: CHECK PASSWORD
;ENTRY:
;ARGB & ARGC = SPARE
;ARGD = LS(PTR TO USERID FOLLOWED BY PW)
;ARGE = MS(PTR TO USERID FOLLOWED BY PW)
;EXIT:
;ARGA = RC
;ARGB-E = LS User disc space ** 2/10/84 **
;ARGF = FLAG BYTE FROM PW FILE
.ATCKPW
{
JSR SETAUT;AUTPTR:=PTR TO USERID
JSR FUSIDD;SEARCH PW FILE FOR USERID
BNE ATCKWX
JSR ATFIND;is user already logged on
BCC ATCKPJ;yes
LDA #PWFREE
LDX #PWFPTR
BNE ATCKPK
.ATCKPJ
JSR ATFPTR;make pointer
LDA #UTFREE
LDX #GENPTR
.ATCKPK
STA OFF1
LDY #ARGPTR
LDA #ARGB
STA OFF2
LDA #4
JSR MOVBLK;general move routine
LDY #PWFLAG
LDA (PWFPTR),Y
LDY #ARGF
STA (ARGPTR),Y
INY
LDA ATDRIV
STA (ARGPTR),Y
;NOW SEE IF PASSWORDS MATCH
JSR CHEKPW
JSR APENFL
.ATCKWX
JMP ATEXIT
}
;***** ATSTWP *****
;ATSTPW: SET PASSWORD
;ENTRY:
;ARGB = LS(PTR TO USERINFO)
;ARGC = MS
;ARGD = LS(PTR TO OLD PW FOLLOWED BY NEW PW)
;ARGE = MS
;EXIT:
;ARGA = RC
;FUNCTION:- IF OLD PW MATCHES
;EXISTING PW IN PW FILE THEN CHANGE PW.
.ATSTPW
{
JSR SETAP1;Set AUTPTR to point to user id.
JSR FUSIDD;SEARCH PW FILE FOR USERID
BNE ATSTWY
;NOW SEE IF OLD PW MATCHES THAT IN PW FILE
LDY #ARGD
LDA (ARGPTR),Y
STA AUTPTR
INY
LDA (ARGPTR),Y
STA AUTPTR+1;AUTPTR USED BY CHEKPW
LDY #0;Offset for first pw
JSR CHEKP1
BNE ATSTWX
;CHECK SYNTAX OF NEW PW
JSR STEPUR;Step Y past first PW
STY OFF1;OFFSET FOR START OF NEW PW
LDX #MAXPW
.ATSTWD
LDA (AUTPTR),Y
CMP #TERMIN
BEQ ATSTWG
JSR ISDCHA;Is digit or character ?
BCS ATSTWF;Nope => error
INY
DEX
BNE ATSTWD
LDA (AUTPTR),Y
CMP #TERMIN
BEQ ATSTWG;SYNTAX OF PW OK
.ATSTWF
LDA #ATERRE
BNE ATSTWX
;NOW COPY NEW PW INTO PW FILE
.ATSTWG
LDA #PWPASS;Copy new PW into PW file
STA OFF2;Note OFF1 already set
LDX #AUTPTR;"From" ptr.
LDY #PWFPTR;"To" ptr.
LDA #MAXPW
JSR MOVBLK
JSR MARKDT;MARK PW FILE STORE BUFFER DIRTY
LDA #0
.ATSTWX
JSR APENFL
.ATSTWY
JMP ATEXIT
}
;***** ATDLUS *****
;ATDLUS: DELETE USER FROM PASSWORD FILE
;ENTRY: ARGB = LS(PTR TO USERINFO)
;ARGC = MS(PTR TO USERINFO)
;ARGD = LS(PTR TO USERID)
;ARGE = MS(PTR TO USERID)
;EXIT: ARGA = RC
.ATDLUS
{
JSR CHKPRV;SEE IF CALLER HAS SYSTEM PRIV
BNE ATDLSY
JSR SETAUT;AUTPTR:=PTR TO USERID
JSR FUSIDD;SEARCH PW FILE FOR USERID
BNE ATDLSY
;NOW CLEAR PASSWORD FILE ENTRY
LDX #PWENSZ
LDY #0
TYA
.ATDLSB
STA (PWFPTR),Y
INY
DEX
BNE ATDLSB
JSR MARKDT;MARK PW FILE BUFFER DIRTY
LDA #0
JSR APENFL
.*ATDLSY
JMP ATEXIT
}
;***** ATSPRV *****
;ATSPRV: SET PRIVILEGE OF A SPECIFIED USER
;ENTRY:
;ARGB = LS(PTR TO USERINFO)
;ARGC = MS(PTR TO USERINFO)
;ARGD = LS(PTR TO USERID)
;ARGE = MS(PTR TO USERID)
;ARGF = PRIV. FLAG:
;1 => system privileges
;2 => no privileges
;else normal user privileges
;EXIT: ARGA = RC
{
.ATSTBL
EQUB 0, SYSTPV, LOCKPV, 0
.*ATSPRV
JSR CHKPRV;CHECK THAT CALLER HAS SYSTEM PRIV
BNE ATDLSY;NO!
JSR SETAUT;AUTPTR:=PTR TO USERID
JSR FUSIDD;PWFPTR:=PW FILE ENTRY FOR GIVEN USER
BNE ATDLSY
LDY #ARGF
LDA (ARGPTR),Y;Load priv. flag
AND #3
TAY
LDA ATSTBL,Y
STA ATWORK+2
LDY #PWFLAG
LDA (PWFPTR),Y
AND #NTSYST;Mask off SYST bit
JMP ATENPW;OR in ATWORK+2, ensure PW file
}
;***** ATREST *****
;ATREST: AUTMAN.RESTART
;FINDOUT THE DISC NUMBER OF THE DISC
;WHICH CONTAINS THE PASSWORD FILE.
;NOTE IF PW FILE NOT FOUND A <>0 RC IS RETURNED
;EXIT:
;ARGA = RC
.ATREST
{
LDA #LO(ATUSRI)
STA ATUSPT
LDA #HI(ATUSRI)
STA ATUSPT+1;ATUSPT := PTR TO AUTMAN'S USERINFO AREA
LDA #ATERRA;CANNOT FIND PASSWORD FILE
STA ATWORK+2
LDY #UTPRIV
LDA #(SYSTPV OR INUSE)
STA (ATUSPT),Y;AUTMAN HAS SYSTEM PRIV
LDA #0
STA ATDRIV;DRIVE NUMBER
.ATRSTB
LDA ATDRIV;A:=DRIVE NUMBER
JSR DRVINF;MAPMAN.DRIVEINFO
BNE ATRSTG
JSR RETPWF
BEQ ATRSTD
CMP #DRERRC;IF RC=CANNOT FIND OBJECT THEN TRY NEXT DRIVE
BEQ ATRSTG
JSR INTERR
.ATRSTD
LDA #0
STA ATWORK+2
.ATRSTG
INC ATDRIV;ATDRIV+:= 1
LDA ATDRIV
CMP DRIVES
BCC ATRSTB
LDA ATWORK+2
JMP ATEXIT
}
;***** ATSOPT *****
;Set user option bits in PW flag (bottom two bits)
;ENTRY:
;ARGB/C = ptr. to user info (lo/hi)
;ARGD = new option bits (bottom two bits)
;EXIT :
;ARGA = RC
.ATSOPT
{
JSR SETAP1;Set AUTPTR -> uRV id.
JSR FUSIDD;Find user id. in pw file
BNE ATSOEX
LDY #ARGD
LDA (ARGPTR),Y
AND #OPTMSK;Mask off option bits
STA ATWORK+2
LDY #PWFLAG
LDA (PWFPTR),Y;Read PW flag byte
AND #NTOPT;Mask off all but option bits
.*ATENPW
;Exit code shared by ATSPRV
ORA ATWORK+2;OR in option bits
CMP (PWFPTR),Y
BEQ ATSOEZ
STA (PWFPTR),Y
JSR MARKDT;Mark PW file dirty
.ATSOEZ
LDA #0;Return code (restored over ENSPWF)
JSR APENFL
.*ATSOEX
JMP ATEXIT
}
;***** ATENS *****
;ensure that user disc allocation is up to date
;on disc.
;ENTRY:
;ARGB,C unset
;ARGD,E pointer to user id
;ARGF,G,H,I value to write
.ATENS
{
JSR SETAUT;point to userid
JSR FUSIDD;lookup the name
BNE ATFREX
LDA #ARGF
STA OFF1
LDA #PWFREE
STA OFF2
LDX #ARGPTR
LDY #PWFPTR
LDA #0;SET POINTERS, BUT DON'T MOVE YET
JSR MOVBLK;copy the data
LDX #UTFRLN
JSR COMPAR
BEQ ATENSB;NO CHANGE
LDX #UTFRLN
JSR MOVE;MOVE NOW
JSR MARKDT
.ATENSB
JSR APENLV;unlock PW file
LDA #0
BEQ ATFREX;write the file back to the disc
}
;***** ATFREE *****
;ENTRY:
;ARGB,C ptr to callers info
;ARGD,E ptr to user name
;EXIT:
;ARGB,C,D,E user free space
.ATFREE
{
JSR ATFIND;is user logged on
BNE ATFREX;some error here
BCC ATFREA;user logged on
JSR SETAUT
JSR FUSIDD
BNE ATFREX;not found
LDA #PWFREE
STA OFF1
LDX #PWFPTR
SEC
BCS ATFREB
.ATFREA
JSR ATFPTR;grasp pointer from stack
LDA #UTFREE
STA OFF1
LDX #GENPTR
CLC
.ATFREB
LDA #ARGB
STA OFF2
LDY #ARGPTR
PHP
LDA #4
JSR MOVBLK;copy the info to the appropriate place
PLP
LDA #0
BCC ATFREX
JSR APENFL
.*ATFREX
JMP ATEXIT;and return to caller
}
;***** ATWRIT *****
;ENTRY:
;as for ATFREE+ ARGF-I value to write
.ATWRIT
{
JSR CHKPRV
BNE ATWRIX;check for priv
LDY #ARGD
LDA (ARGPTR),Y
TAX
INY
LDA (ARGPTR),Y
LDY #ARGC
STA (NEWARG),Y
DEY
TXA
STA (NEWARG),Y;pointer to name
LDA #ARGF
STA OFF1
LDX #ARGPTR
LDA #ARGD
STA OFF2
LDY #NEWARG
LDA #4
JSR MOVBLK
LDA #9
JSR SETRTN;call update user free space
JSR USRMAN
BNE ATWRIX
JSR SETAUT
JSR FUSIDD
BNE ATWRIX;not found
LDA #PWFREE;area to copy to
STA OFF2
LDY #PWFPTR
LDA #ARGF
STA OFF1
LDX #ARGPTR
LDA #4
JSR MOVBLK
JSR MARKDT;indicate that PW file is dirty
LDA #0
JSR APENFL
.ATWRIX
JMP ATEXIT
}
.ATFPTR
LDY #ARGF;setup Zpage pointer from ARGF
LDA (NEWARG),Y
STA GENPTR
INY
LDA (NEWARG),Y
STA GENPTR+1
RTS
.ATFIND
{
LDX #4;EXIT Z=1 => ok user: C=1 => not logged on
LDY #ARGB
.ATFINA
LDA (ARGPTR),Y
STA (NEWARG),Y
INY
DEX
BNE ATFINA;copy stack for USRMAN
LDA #6;find user
JSR SETRTN
JSR USRMAN
CLC
BEQ ATFINB;user found in table
CMP #URERRE;'not logged on'
.ATFINB
RTS
}
.SETAUT
LDY #ARGD
LDA (ARGPTR),Y
STA AUTPTR
INY
LDA (ARGPTR),Y
STA AUTPTR+1;AUTPTR:=ADDRESS OF USERID
RTS
.CHKPRV
{
LDY #ARGB
LDA (ARGPTR),Y
STA GENPTR
INY
LDA (ARGPTR),Y
STA GENPTR+1
LDY #UTPRIV
LDA (GENPTR),Y
AND #SYSTPV
BNE CHKPVX
LDA #ATERRD;INSUFFICIENT PRIV
RTS
.CHKPVX
LDA #0
RTS
}
;RETPWF: RETRIEV PW FILE FROM DISC (ATUSRI HOLDS DISCNO)
;FIRST SETUP ARGS FOR DIRMAN.RETRIEVE
{
.RETPTB
EQUB 2;DIRMAN.RETRIEVE
EQUW ATUSRI;userinfo
EQUW PWTITL;PW file title
EQUW ATINF;result area
EQUB 0
.*RETPWF
LDY #ARGB
LDA (NEWARG),Y
LDY #UTDISC
STA (ATUSPT),Y
LDY #ARGC
LDA (NEWARG),Y
LDY #UTDISC + 1
STA (ATUSPT),Y
LDY #ARGA
.RETPWL
LDA RETPTB -ARGA,Y
STA (NEWARG),Y
INY
CPY #ARGI
BNE RETPWL
JSR DIRMAN
BNE RETPFZ
LDY #ARGB
LDA (NEWARG),Y
AND #TYPDIR
CMP #TYPFIL
BEQ RETPFY
LDA #ATERRI;$.PASSWORDS WRONG TYPE
JSR INTERR
.RETPFY
LDA #0;RC:=0
.RETPFZ
PHP
CMP #MPERRA;DISC NOT FOUND
BNE RETPFX
LDA #ATERRA
.RETPFX
PLP
RTS
}
.DSCSIN
JSR SETRTN
LDY #ARGB;PLACE DISC NO & SIN ONTO NEWARG STACK
LDA ATINF+INFDIS;disc number (lo)
STA (NEWARG),Y
INY
LDA ATINF+INFDIS+1;disc number (hi)
STA (NEWARG),Y
INY
LDA ATINF+INFSIN
STA (NEWARG),Y;SIN (ls)
INY
LDA ATINF+INFSIN+1
STA (NEWARG),Y;SIN (cs)
INY
LDA ATINF+INFSIN+2
STA (NEWARG),Y;SIN (ms)
RTS
.MARKDT
LDA ATSTRA
STA GENPTR
LDA ATSTRA+1
STA GENPTR+1
JMP MRKDRT
;FUSIDD: SEARCH THE PW FILE FOR GIVEN USERID ACROSS DISCS
;AUTPTR:=PTR TO USERID
;SEARCH PW FILE FOR USERID
;ENTRY:
;IF ATWORK?2 == 0, ONLY CHECK ATDRIV
;EXIT:
;AS FDUSID
.FUSIDD
{
LDA ATDRIV;A:=DRIVE NUMBER
LDY ATWORK+2
BNE FUSIDA
DEY ;Y:=&FF
STY ATDRIV
.FUSIDA
JSR DRVINF;MAPMAN.DRIVEINFO
BEQ FDUSID;IF OK
.*FUSIDB
INC ATDRIV
LDA ATDRIV
CMP DRIVES
BCC FUSIDA;TRY NEXT DRIVE
LDA #ATERRB;userid not found error
RTS
}
;FDUSID: SEARCH THE PW FILE FOR GIVEN USERID
;ENTRY:
;AUTPTR = POINTER TO USERID
;EXIT:
;A = RC
;PWFPTR = PTR TO RELEVENT ENTRY IN PW FILE
;ATNWEN = PTR TO FIRST FREE PW FILE ENTRY(=0=>NONE)
;**** 11/4/83 ****
.FDUSID
{
JSR APINIT;get first block of entries
BEQ FDUSDB
CMP #DRERRC
BEQ FUSIDB
.FDUSDB
LDA #0;initialise the flag for every lookup
STA DOTFLG
LDY #PWFLAG
LDA (PWFPTR),Y
AND #INUSE;IS THE ENTRY IN USE?
BEQ FDUNDK
LDA ATWORK+2
BEQ FDUSDH
LDY #PWUSID
STY TEMPA;use registers to hold pointers
STY TEMPB;pointer into PW file
.FDUSDC
LDY TEMPA
LDA (AUTPTR),Y
JSR ISCHAR;C=1 -> not alpha
LDY TEMPB
EOR (PWFPTR),Y;Compare with PW file
BCS FDUSJW
AND #&DF;Compare with case forcing
.FDUSJW
BNE FDUSDH
LDA (PWFPTR),Y;Here are equal, so check if are terminators
CMP #TERMIN
BEQ FDUSDJ;Both terminators => found
CPY #PWPASS -1; *** LH 24/10/85
BNE FDUSDK;Not last pair so continue
LDY TEMPA;Check USERID terminated
INY
LDA (AUTPTR),Y
CMP #TERMIN
BEQ FDUSDJ;End and terminated
BNE FDUSDH;Not terminated so step on
.FDUSDK
INC TEMPA
INC TEMPB
LDY TEMPA
LDA (AUTPTR),Y
CMP #DOT
BNE FDUNDD
INC DOTFLG
CPY #MAXID;only skip if the dot could have been omitted
BNE FDUNDD;from the PW file
LDY TEMPB;just look for "."
EOR (PWFPTR),Y
BNE FDUNDE;dont adjust if it is there
INC TEMPB
.FDUNDE
INC TEMPA;step past in AUTPTR, not PWFPTR
.FDUNDD
LDY TEMPA
CPY #MAXID+1;check that we have had a dot in first 11 chars
BNE FDUSDC; LH 24/10/85 check next match
LDA DOTFLG
BEQ FDUSDH;should have found one by now
BNE FDUSDC;Dot found so continue
.FDUSDJ
LDA #0;FOUND IT
.FDUNDZ
RTS
.FDUNDK
LDA ATWORK+2
BEQ FDUNDZ
;NOW MAKE PWFPTR POINT TO THE NEXT ENTRY
.FDUSDH
JSR APTEST;check for end-of-window
BNE FDUSDS;go again if not
JSR APEND;check end-of-file
BEQ FDUEOF
CMP #LO(-1);check alternative RC
BNE FDUNDZ;return the error
JSR APNEXT;get next window
BNE FDUNDZ
.FDUSDS
JMP FDUSDB
;EOF
.FDUEOF
LDA #0
JSR APENFL
BNE FDUNDZ
LDA ATWORK + 2
BEQ FDUSFE
JMP FUSIDB
.FDUSFE
LDA #ATERRB;userid not found error
RTS ;else return to caller
}
;CHEKPW: CHECK PASSWORD SUPPLIED BY THE USER WITH
;THAT IN THE PASSWORD FILE.
;ENTRY: AUTPTR = PTR TO USERID (TERMINATED CR) FOLLOWED BY PW.
;PWFPTR = PTR TO PW FILE ENTRY.
;EXIT: A = RC
.CHEKPW
JSR STEPUR;Step Y past userid. to password
.CHEKP1;Entry from SETPASSWORD (Y already set)
{
LDA #PWPASS;Set up offsets for PW comparison
STA OFF2
.CHEKWB
LDA (AUTPTR),Y
STY OFF1
LDY OFF2;Offset into PW file
CPY #PWPASS+MAXPW;Check if reached end of pw in file
BEQ CHEKWD;If so, check that pw from AUTPTR is terminated