-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsyslib.s
3325 lines (3210 loc) · 72.9 KB
/
syslib.s
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
;
; PROMAL for the Commodore 64
; Copyright (C) 1985, SMA, Inc.
; Re-source (C) 2015 jbevren
;
; PROMAL system library routines
; version
; status:
; TODO: name and document zp usage
; unnamed zp usage:
; count location
; 36 z2C : commonly used with z2D as a buffer pointer
; 35 z2D
; 1 z2F : variable base address pointer for current program
; 2 z30 : pointer into the system heap
; 44 z34
; 51 z35
; 32 z36
; 35 z37
; 68 z38
; 38 z39
; 24 z3A
; 24 z3B
; 12 z3C
; 12 z3D
; 16 z3E
; 12 z3F
; 2 z40
; 1 z41
; 7 z67
; defines for system library
Stringv =$2c ; WORD: commonly used as a pointer to string buffer
zrelsz =$67 ; WORD: temp storage for relocation table size
maxparms=$69 ; BYTE: getprm maximum number of paramemters
numparms=$6a ; BYTE: getprm number of parameters
minparms=$6b ; BYTE: getprm minimum parameters
getpmsk =$6c ; BYTE: getprm bitmask
Parent =$3a ; WORD: storage for caller address
GParent =$6d ; WORD: storage for caller's caller address
getprm PLA
STA Parent
PLA
STA Parent+1
PLA
STA GParent
PLA
STA GParent+1
STY numparms
LDY #$01
LDA (Parent),Y
AND #$0F
STA maxparms
CMP numparms
BCC _error
LDA (Parent),Y
BEQ _finish
LSR
LSR
LSR
LSR
STA minparms
CMP numparms
BEQ _ok
BCC _ok
_error JMP esys
_ok INY
LDA (Parent),Y
STA getpmsk
_loop DEC maxparms
BMI _finish
INY
LDA (Parent),Y
TAX
LDA maxparms
CMP minparms
BCC _pull
BIT getpmsk
BMI _isword
INY
LDA (Parent),Y
STA 00,X
_isword LDA maxparms
CMP numparms
BCS _defalt
_pull PLA
BIT getpmsk
BPL _isbyte
STA 01,X
_isbyte PLA
STA 00,X
_defalt ASL getpmsk
JMP _loop
_finish TYA
CLC
ADC Parent
TAX
LDA Parent+1
ADC #$00
PHA
TXA
PHA
LDA GParent
STA Parent
LDA GParent+1
STA Parent+1
RTS
getverz JSR getprm ; page 4-24: word=GETVER
.BYTE $00 ; no prameters
LDA #$21
PHA
LDA #$01
JMP retbyte
p100fz JSR getprm ; undocumented: word=p100f
.BYTE $00 ; no prameters
LDA #$0F
PHA
LDA #$10 ; return $100F
JMP retbyte
getkeyz JSR getprm ; page 4-20: byte=GETKEY [(#variable)]
.BYTE $01,$80 ; 0-1 parm: Wxxx xxxx
.BYTE z2C ; store word on stack at z2C: #variable
JSR IsCapLk
JMP j18B5 ; use getcz to finish
getcz JSR getprm ; page 4-19: byte=GETC[(#variable)]
.BYTE $01,$80 ; 0-1 parm: Wxxx xxxx
.BYTE z2C ; store word on stack at z2C: #variable
JSR hkeyin
j18B5 LDY numparms
BEQ g18BD
LDX #$00
STA (Stringv,X)
g18BD JMP retbyte
getcfz PLA ; page 4-20: flagbyte=GETCF(handle, #variable)
STA Parent
PLA
STA Parent+1
CPY #$02
BEQ _ok
JMP esys
_ok PLA
STA Stringv+1
PLA
STA Stringv
PLA
STA z35
PLA
STA z34
JSR ckfh
JSR rdck
JSR hgetin
LDX #$00
STA (Stringv,X)
BCS _exit
LDA #$01
_exit JMP retbyte
; determine if a file can be written
wrtck CMP #$57 ; 'W': write
BEQ rwok
CMP #$41 ; 'A': append
BEQ rwok
CMP #$42 ; 'B': both
BEQ rwok
rwbad JMP eredio ; not okay.
; determine if a file can be read
rdck CMP #$52 ; 'R': read
BEQ rwok
CMP #$42 ; 'B': both
BNE rwbad
rwok LDA #$00 ; it's okay.
STA dioerr
RTS
cpstrng STX z34 ; copy string from (.Y.X) to (stringv)
STY z35
LDY #$FF
_loop INY
LDA (z34),Y
STA (Stringv),Y
BNE _loop
DEY
RTS
getlz JSR getprm ; page 4-21: GETL #buffer [,limit]
.BYTE $12,$40 ; 1-2 parms: BWxx xxxx
.BYTE z38,$50 ; store byte on stack or 50 at z38: limit
.BYTE z2C ; store word on stack at z2C : #buffer
LDA z38
JSR hgetln
JSR cpstrng
JMP return
getlfz PLA ; page 4-22: flagbyte=getlf(handle, #buffer [, limit])
STA Parent
PLA
STA Parent+1
LDA #$50
CPY #$03
BNE _1parm
PLA
PLA
DEY
_1parm STA z38
CPY #$02
BEQ _ok
JMP esys
_ok PLA
STA Stringv+1
PLA
STA Stringv
PLA
STA z35
PLA
STA z34
JSR ckfh
JSR rdck
STX z37
LDA z38
JSR hgetlf
JSR cpstrng
LDA #$01
BCC _exit
LDA #$00
_exit JMP retbyte
putz PLA ; page 4-45: PUT item [,item...]
STA Parent
PLA
STA Parent+1
j196F CPY #$00
BNE _ok
JMP esys
_ok TSX
STX z38
TYA
ASL
CLC
ADC z38
STA z39
TAX
_loop LDA cpustk,X
STA Stringv
DEX
STX z34
LDA cpustk,X
BEQ _schar
STA Stringv+1
LDY #$00
_char STY z35
LDA (Stringv),Y
BEQ _eos
JSR hconout
LDY z35
INY
BNE _char
_schar LDA Stringv
JSR hconout
_eos LDX z34
DEX
CPX z38
BNE _loop
LDX z39
TXS
JMP return
putfz PLA ; page 4-47: PUTF handle, item [, item...]
STA Parent
PLA
STA Parent+1
j19B8 CPY #$02
BCS _ok
JMP esys
_ok TSX
STX z38
TYA
ASL
CLC
ADC z38
STA z39
TAX
LDA cpustk,X
STA z34
DEX
LDA cpustk,X
STA z35
DEX
STX z37
JSR ckfh
JSR wrtck
STX z36
LDX z37
_loop LDA cpustk,X
STA Stringv
DEX
LDA cpustk,X
BEQ _char
STA Stringv+1
LDY #$00
STX z37
_loop1 STY z3E
LDA (Stringv),Y
BEQ _next
LDX z36
JSR hputf
LDY z3E
INY
BNE _loop1
BEQ _next
_char LDA Stringv
STX z37
LDX z36
JSR hputf
_next LDX z37
DEX
CPX z38
BNE _loop
LDX z39
TXS
JMP return
outputz PLA ; page 4-41: OUTPUT Formatstring [, item...]
STA Parent
PLA
STA Parent+1
CPY #$00
BNE _ok
JMP esys
_ok TSX
STX z38
TYA
ASL
CLC
ADC z38
TAX
STX hxsav2
LDA cpustk,X
STA z34
DEX
LDA cpustk,X
STA z35
DEX
STX z37
JSR txtfmt
LDX hxsav2
TXS
LDA #$00
PHA
LDA #$0A
PHA
LDY #$01
JMP j196F
outputfz PLA ; page 4-43: OUTPUTF Handle, formatstring [, item...]
STA Parent
PLA
STA Parent+1
CPY #$02
BCS _ok
JMP esys
_ok DEY
TSX
STX z38
TYA
ASL
CLC
ADC z38
TAX
STX hxsav2
LDA cpustk,X
STA z34
DEX
LDA cpustk,X
STA z35
DEX
STX z37
JSR txtfmt
LDX hxsav2
TXS
LDA #$00
PHA
LDA #$0A
PHA
LDY #$02
JMP j19B8
txtfmt LDY #$FF ; format text for outputz and outputfz
LDX #$00
_char INY
LDA #$FF
STA p4362
LDA #$00
STA z38
LDA (z34),Y
BEQ _exit
CMP #$23 ; '#' for format code?
BEQ _format
_wchar STA scratchpad,X
INX
BNE _char
_exm1 DEX
_exit LDA #$00
STA scratchpad,X
RTS
_format INY
LDA (z34),Y
BNE _fmtok
DEX
LDA #$23
_fmtok CMP #$23 ; '#' to print a #?
BEQ _wchar
JSR Ndigit
BCC _fmtdo
JSR a2nb
CMP #$2E
BNE _fmtdo
LDA z38
PHA
LDA #$00
STA z38
INY
LDA (z34),Y
JSR a2nb
LDA z38
STA p4362
PLA
STA z38
LDA (z34),Y
_fmtdo JSR ToUpper1
CMP #$43 ; 'C' for carriage return?
BNE _chkB
LDA z38
BNE _wchar
LDA #$0D
BNE _wchar
_chkB CMP #$42 ; 'B' for blank space(s)?
BNE _fmtU
LDA z38
BNE _fmtsp
INC z38
_fmtsp LDA #$20
STA scratchpad,X
INX
BEQ _estr
DEC z38
BNE _fmtsp
JMP _char
_fmtU PHA
STX z2C
LDA #$0A
STA Stringv+1
LDA #$00
STA z36
LDA #$0A
STA z3C
LDA #$20
STA z39
LDX z37
LDA cpustk,X
STA z3E
DEX
LDA cpustk,X
STA z3F
DEX
STX z37
STY hysav2
PLA
CMP #$53 ; 'S' for string?
BNE _chkH
LDX z2C
LDY #$00
LDA z3F
BEQ _fchar
_gstr LDA (z3E),Y
BEQ _fspc
STA scratchpad,X
INY
INX
BNE _gstr
BEQ _estr
_fchar LDA z3E
STA scratchpad,X
INY
INX
_fspc TYA
SEC
SBC z38
BCS _cont
TAY
LDA #$20
_fspcl STA scratchpad,X
INX
BEQ _estr
INY
BNE _fspcl
BEQ _cont
_estr JMP _exm1
_cont LDY hysav2
JMP _char
_chkH CMP #$48 ; 'H' for hex word?
BNE _chkI
LDA #$10
STA z3C
LDA #$30
STA z39
BNE _n2a
_chkI CMP #$49 ; 'I' for int?
BNE _chkW
DEC z36
BNE _n2a
_chkw CMP #$57 ; 'W' for word?
BNE _chkE
_n2a JSR n2a
_nxtf TYA
LDY hysav2
CLC
ADC z2C
TAX
BCC _fnxt
LDX #$00
BEQ _estr
_fnxt JMP _char
_chkE CMP #$45 ; 'E' for scientific?
BNE _chkR
_freal LDA z38
STA p4363
DEC p4363
LDA z3E
JSR rpull1
JSR s4861
JMP _nxtf
_chkR CMP #$52 ; 'R' for real?
BEQ _freal
LDY hysav2
LDX z2C
JMP _wchar
a2nb PHA ; fast convert ascii value in (z34) to byte
LDA z38 ; multiply z38 by 10:
ASL ; mul 2 (2 total)
ASL ; mul 2 (4 total)
CLC
ADC z38 ; add 1 (5 total)
ASL ; mul 2 (10 total)
STA z38 ; save
PLA ; restore new digit
SEC
SBC #$30 ; subtract ascii '0'
CLC
ADC z38 ; add z38
STA z38 ; save
INY ; increment string index
LDA (z34),Y ; get next char
JSR Ndigit ; check for non-digit
BCS a2nb ; it's a digit, loop.
RTS
strvalz JSR getprm ; page 4-53: byte=STRVAL(String, #variable [,Radix [,Maxfield]])
.BYTE $24,$30 ; 2-4 parms: BBWW xxxx
.BYTE z38,$FF ; store $ff or byte on stack at z38: Maxfield
.BYTE z3E,$0A ; store $0a or byte on stack at z3E: Radix
.BYTE z2C ; store word on stack at z2C : #variable
.BYTE z34 ; store word on stack at z34 : String
LDY #$00
STY z37
STY z3F
STY z3C
STY z3D
DEY
STY z36
_next INY
CPY z38
BEQ _exit
LDA (z34),Y
CMP #$20 ; space?
BEQ _space
CMP #$2D ; '-'?
BEQ _sign
CMP #$2B ; '+'?
BEQ _sign
JSR ToUpper1
SEC
SBC #$30
BCC _exit
CMP #$0A
BCC _ov10
SEC
SBC #$07
CMP #$0A
BCC _exit
_ov10 CMP z3E
BCS _exit
STA z36
JSR Mul16
LDA z40
ORA z41
BNE _err
LDA z3C
CLC
ADC z36
STA z3C
BCC _next
INC z3D
BNE _next
_err LDA #$00
STA z37
STA z3D
BEQ _save
_sign BIT z36
BPL _exit
BIT z37
BVS _err
SEC
ROR z37
CMP #$2D
ROR z37
JMP _next
_space BIT z36
BMI _next
_exit BIT z36
BMI _err
BIT z37
BPL _ispos
BIT z3D
BMI _err
LDA #$00
SEC
SBC z3C
STA z3C
LDA #$00
SBC z3D
STA z3D
_ispos STY z37
LDA z3C
_save LDY #$00
STA (Stringv),Y
INY
LDA z3D
STA (Stringv),Y
LDA z37
JMP retbyte
intstrz SEC ; page 4-28: INTSTR Value, #Buf[,Radix[,Minfield[,Padding]]]
BCS tostr ; set carry and use wordstrz
wordstrz CLC ; page 4-57: WORDSTR Value, #Buf[,Radix[,Minfield[,Padding]]]
tostr ROR z36
JSR getprm
.BYTE $25,$18 ; 2-5 parms: BBBW Wxxx
.BYTE z39,$20 ; store $20 or byte on stack at z39
.BYTE z38,$00 ; store $00 or byte on stack at z38
.BYTE z3C,$0A ; store $0a or byte on stack at z3C
.BYTE z2C ; store word on stack at z2C
.BYTE z3E ; store word on stack at z3E
JSR n2a
LDA #$00
STA (Stringv),Y
JMP return
n2a LDX #$00 ; convert number to ascii
STX z3D
LDA z36
BPL _word
LDA #$00
BIT z3F
BPL _word
SEC
SBC z3E
STA z3E
LDA #$00
SBC z3F
STA z3F
INX
LDA #$80
_word STA z36
_next LDA z3E
CMP z3C
LDA z3F
SBC z3D
BCC _last
JSR Div32
LDA z40
PHA
INX
BNE _next
_last LDA z3E
PHA
INX
LDY #$00
_pad CPX z38
BCS _sign
LDA z39
STA (Stringv),Y
INY
DEC z38
BNE _pad
_sign BIT z36
BPL _2asc
LDA #$2D
STA (Stringv),Y
INY
DEX
_2asc PLA
CLC
ADC #$30
CMP #$3A
BCC _store
ADC #$06
_store STA (Stringv),Y
INY
DEX
BNE _2asc
RTS
gNxtFH LDA z34 ; Advance to next handle or return carry
CLC
ADC #$16 ; file handle field size
STA z34
BCC _skip
INC z35
_skip CLC
ADC #$16 ; file handle field size
TAY
LDA z35
ADC #$00
CMP FHTabE+1
BCC _ok
BNE _err
CPY FHTabE
BCC _ok
BEQ _ok
_err LDY #$00
SEC
RTS
_ok LDY #$00
CLC
RTS
openz LDA bfiltyp ; page 4-36: word=OPEN (filename [,mode [,nocheck [,type]]])
STA z36
LDA nofnchk
STA z34
JSR getprm
.BYTE $14,$D0 ; 1-4 parms: WWBW xxxx
.BYTE z36 ; store word on stack at z36 : type
.BYTE z34 ; store word on stack at z34 : nocheck
.BYTE z38,$52 ; store $52 ('R') or byte on stack at z38: mode
.BYTE z2C ; store word on stack at z2C : filename
LDA z34 ; nocheck
BEQ _nochk
LDA #$80
_nochk STA z37
LDA z36 ; type
JSR ToUpper1
STA z36
LDA z38 ; mode
JSR ToUpper1
LDX #$03
_loop CMP _abrw,X
BEQ _open
DEX
BPL _loop
LDA #$01
JMP ioerr
_abrw .BYTE $41,$42,$52,$57 ; 'ABRW'
_open STA z38
JSR sfck
JSR bldFNam
JSR sfck
BCC _fnok
LDA #$02
JMP ioerr
_fnok CPX #$02
BCS _nspc
JSR qSpcNam
JMP spec
_nspc LDA FHtabB
STA z34
LDA FHtabB+1
STA z35
LDY #$00
_newfh LDA (z34),Y
BEQ _fhbad
_nchr LDA (z34),Y
BEQ _empty
CMP FName,Y
BNE _fhbad
INY
BNE _nchr
_empty LDA FName,Y
BNE _fhbad
INY
INY
LDA (z34),Y
TAX
JSR hcleanup
LDA #$00
TAY
STA (z34),Y
JMP _openf
_fhbad JSR gNxtFH
BCC _newfh
LDA FHtabB
STA z34
LDA FHtabB+1
STA z35
_fhok LDA (z34),Y
BEQ _openf
JSR gNxtFH
BCC _fhok
LDA #$06
JMP ioerr
_openf LDA z38 ; mode
JSR styp ; swap filetype with ours
JSR s36E8 ; check for special disk file
JSR styp ; swap back
CMP #$00 ; no file?
BNE ioerr ; error
LDY #$00
_fnam LDA FName,Y
STA (z34),Y
BEQ _fnend
INY
BNE _fnam
_fnend INY
LDA z38
STA (z34),Y
INY
TXA
STA (z34),Y
LDA z34
PHA
LDA z35
JMP retbyte
ioerr STA ioerror ; recycled code: not a local label
LDA #$00
PHA
JMP retbyte
spec LDA z38
JSR s37D6
BCS ioerr
LDY #$08 ; offset for L file pointers
LDA SName,X
.if ldrv + wdrv
CMP #$4C ; 'L' file?
BEQ _W ; yes, keep current offset
LDY #$00 ; offset for W file pointers
CMP #$57 ; 'W' file?
BNE _A
_W LDA z38 ; mode
CMP #$41 ; 'A' for append?
BEQ _A
CMP #$52 ; 'R' for read?
BEQ _R
; reset EOF pointer, effectively erasing file
LDA worg,Y ; .Y may be 8, directing these to lorg et.al
STA weof,Y
LDA worg+1,Y ; get origin of file
STA weof+1,Y ; store at end of file to clear it
; reset file pointer, resetting file for read
_R LDA worg,Y ; get origin of file
STA wptr,Y ; store at current offset to reset it
LDA worg+1,Y
STA wptr+1,Y
.fi ;ldrv or wdrv
; file is open, set up file handle
_A TXA
CLC
ADC #<SName ; $D8
PHA
LDA #>SName ; $0F
ADC #$00
JMP retbyte
sfck LDA nofnchk ; swap nofnck with specified value
LDY z37
STA z37
STY nofnchk
RTS
styp PHA ; swap bfiltyp with specified value
LDA bfiltyp
PHA
LDA z36
STA bfiltyp
PLA
STA z36
PLA
RTS
FNameLen LDY #$00 ; Find length of string at (Stringv) and put on stack
- LDA (Stringv),Y
CMP #$20 ; space
BNE _push ; not space, push char
INC Stringv
BNE - ; next char
INC Stringv+1
BNE - ; next char
_push PHA ; put char on stack
- LDA (Stringv),Y
BEQ _exit ; end of string? exit
INY
BNE - ; more chars? loop back
_exit PLA ; pull first char off stack
RTS
qUConv BIT nofnchk ; Convert character to uppercase if nofnchk is valid
BMI +
JSR ToUpper1
+ STA FName,X ; add to filename
INX
RTS
FAddXt STX xsav2 ; optionally add default extension to filename
- DEX
CPX #$02
BCC _eonam
LDA FName,X ; get byte from filename
CMP #$2E ; '.'
BEQ _dot ; filename has a . in it, exit
BNE -
_eonam LDX xsav2
LDA #$2E ; '.'
JSR qUConv ; add to filename
LDA dfext ; default extension
JSR qUConv ; add to filename
LDA #$00
STA FName,X ; terminate filename with null
RTS
_dot LDX xsav2
RTS
bldFNam JSR FNameLen ; Build filename from program input
LDX #$00
CPY #$00 ; filename has zero length?
BNE _go ; No, proceed
LDA #$02
JMP _err ; set carry and return
_go CPY #$01 ; Filename has one character?
BNE _norm ; No, proceed normally
JSR qUConv ; convert filename to uppercase and store in ca5
LDA #$00
STA p0CA6
JSR qSpcNam ; check for special files(?)
BCC _Apfx
LDX #$01
BNE _exit ; always branches (ldx #1)
_norm LDY #$01
LDX #$00
LDA (Stringv),Y
CMP #$3A ; ':'
BNE _Apfx
DEY
LDA (Stringv),Y
CMP #$30 ; '0'
BEQ _fnuc
CMP #$31 ; '1'
BEQ _fnuc
_Apfx LDA prefix ; add prefix
STA FName
LDA #$3A ; ':'
STA p0CA6
LDX #$02
_fnuc LDY #$FF ; preset for increment
_loop INY ; uppercase filename
LDA (Stringv),Y
BEQ _done
JSR qUConv
CPX #$12
BCC _loop
LDA #$02
BNE _err
_done STA FName,X
CPX #$03
BCC _err
BIT nofnchk
BMI _exit
JSR FAddXt
_exit CLC
RTS
_err SEC
RTS
qSpcNam LDA FName ; Determine if filename indicates a special device
JSR ToUpper1
LDX #$00
- CMP SName,X