Download Disk Basic Unravelled II

Transcript
APPENDIX B
DISASSEMBLY OF DISK BASIC 1.1
DISK BASIC UNRAVELLED II
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
C658
C65A
C65C
C65E
C660
C662
C664
C666
C669
C66C
C66E
C671
C674
C676
C678
C67B
C67D
C67E
C681
C684
E0
25
1F
34
8D
86
97
BD
33
DF
BD
6F
E6
26
EC
26
5F
63
E7
39
E0
21
98
02
23
02
EA
C7
88
EE
D6
88
E0
0C
88
04
C685
C687
C689
C68B
EE 07
33 41
EF 07
39
LC658
LC65E
63
19
F2
18
13
LC67D
88 17
88 18
LC681
LC684
LC685
C68C
C68F
C692
C695
C697
C699
C69B
C69D
C6A0
C6A2
C6A5
C6A8
C6AA
C6AC
C6AE
C6B0
C6B3
C6B5
C6B7
C6B9
C6BC
C6BE
C6C1
C6C3
C6C6
7F
7F
CC
97
D7
C6
D7
CE
DF
BD
FF
31
A6
26
8D
8E
A6
A1
26
8C
26
F7
A6
B7
39
09
09
11
EC
EA
03
ED
06
EE
D6
09
C4
C4
28
29
09
80
C0
0E
09
F5
09
42
09
73
77
02
C6C7
C6CA
C6CE
C6D0
C6D1
C6D3
C6D5
33
11
26
5C
C1
23
39
A8 20
83 07 00
D5
00
F2
74
4C
57
73
76
C6D9
C6DC
C6DE
C6E1
C6E4
B6
26
F7
FF
39
09 77
06
09 77
09 78
C6E5
C6E7
C6EA
C6EC
C6
7D
26
7E
34
09 73
F8
AC 46
C6EF
C6F2
C6F5
C6F8
C6FA
C6FC
BD
BD
BD
8D
8D
86
C9 35
A5 C7
C7 9D
92
E9
FF
C6FE
C701
C704
C706
C708
C70A
C70D
C70F
C711
BD
BE
6F
C6
D7
BD
E6
8D
30
C8 07
09 74
84
03
EA
D6 F2
0D
44
06
,S+
LC67D
B,A
A
LC685
#$02
DCOPC
LC763
FCBCON,X
DCBPT
LD6F2
FCBLFT,X
,S+
LC684
FCBLST,X
LC681
SUBTRACT CURRENT SECTOR NUMBER AND PULS A
BRANCH IF PAST LAST SECTOR
SECTOR NUMBER TO ACCA
SAVE SECTOR NUMBER DIFFERENCE
INCREMENT RECORD NUMBER
*GET READ OPERATION CODE
*AND SAVE IT IN DSKCON VARIABLE
GET PROPER TRACK AND SECTOR TO DSKCON VARIABLES
* POINT U TO START OF FCB DATA BUFFER
* AND SAVE IT IN DSKCON VARIABLE
GO READ A SECTOR INTO FCB BUFFER
NUMBER OF CHARS LEFT IN BUFFER = 256
GET SECTOR NUMBER OFF STACK
RETURN IF DATA LEFT; FALL THRU IF LAST SECTOR
GET NUMBER OF BYTES IN THE LAST SECTOR
BRANCH IF SOME BYTES IN LAST SECTOR
SET NUMBER OF REMAINING BYTES = 256
SET DATA LEFT FLAG TO $FF
SAVE THE NUMBER OF CHARS LEFT IN BUFFER
FCBDFL,X
FCBLFT,X
LDU FCBREC,X
LEAU $01,U
STU FCBREC,X
RTS
GET CURRENT RECORD NUMBER
BUMP IT
PUT IT BACK
* SCAN DIRECTORY FOR FILENAME.EXT FOUND IN DNAMBF. IF FILENAME FOUND,
* RETURN WITH SECTOR NUMBER IN V973, GRANULE IN V976 AND RAM BUFFER
* CONTAINING DIRECTORY DATA IN V974. IF DISK IS FULL THEN V973,
* V977 = 0. THE FIRST UNUSED SECTOR RETURNED IN V977, RAM IMAGE IN V978
LC68C
CLR V973
CLEAR SECTOR NUMBER
CLR V977
CLEAR TEMP SECTOR COUNTER
LDD #$1102
TRACK 17 (DIRECTORY), READ OPERATION CODE
STA DCTRK
SAVE TRACK NUMBER
STB DCOPC
SAVE OPERATION CODE (READ)
LDB #$03
READ SECTOR 3 (FIRST DIRECTORY SECTOR)
LC69B
STB DSEC
SAVE SECTOR NUMBER IN DSKCON VARIABLE
LDU #DBUF0
*BUFFER AREA NUMBER 0 AS DATA BUFFER - SAVE
STU DCBPT
*IN DSKCON VARIABLE
JSR LD6F2
GO READ A SECTOR
LC6A5
STU V974
SAVE RAM DIRECTORY BUFFER ADDRESS
LEAY ,U
POINT Y TO DIRECTORY BUFFER
LDA ,U
GET A BYTE FROM BUFFER
BNE LC6D6
BRANCH IF NOT ZERO - FILE IS ACTIVE
BSR LC6D9
SET UNUSED FILE POINTERS IF ENTRY HAS BEEN KILLED
LC6B0
LDX #DNAMBF
POINT TO DISK FILE NAME BUFFER
LC6B3
LDA ,X+
*COMPARE THE FILENAME AND EXTENSION
CMPA ,U+
*STORED IN RAM AT DNAMBF TO THE DIRECTORY
BNE LC6C7
*ENTRY STORED AT ,U (BRANCH IF MISMATCH)
CMPX #DNAMBF+11
AT END OF FILE NAME BUFFER?
BNE LC6B3
BRANCH IF NOT DONE CHECKING FILENAME
STB V973
SAVE SECTOR NUMBER IN DSKCON VARIABLE
LDA FCBFGR,U
*GET NUMBER OF FIRST GRANULE IN FILE
STA V976
*AND SAVE IT IN V976
RTS
LC6C7
0B
C6
C6D6 43
C6D7 26 D7
SUBB
BLO
TFR
PSHS
BSR
LDA
STA
JSR
LEAU
STU
JSR
CLR
LDB
BNE
LDD
BNE
CLRB
COM
STB
RTS
ORIGIN:SPECTRAL ASSOC
REVISED:12/26/1999 WALTER K ZYDHEK
LC6D6
LEAU
CMPU
BNE
INCB
CMPB
BLS
RTS
DIRLEN,Y
#DBUF0+SECLEN
LC6A5
GET NEXT DIRECTORY ENTRY (DIRLEN BYTES PER ENTRY)
AT END OF BUFFER?
CHECK NEXT ENTRY IF NOT AT END
NEXT SECTOR
11 SECTORS MAX IN DIRECTORY
BRANCH IF MORE SECTORS
#11
LC69B
COMA
BNE LC6B0
COMPLEMENT FIRST BYTE IN DIRECTORY EMTRY
BRANCH IF FILE IS ACTIVE - FALL THRU IF NOT USED
* SET POINTERS FOR FIRST UNUSED DIRECTORY ENTRY
LC6D9
LDA V977
UNUSED ENTRY ALREADY FOUND?
BNE DVEC12
RETURN IF UNUSED ENTRY ALREADY FOUND
STB V977
SECTOR CONTAINING THIS DIRECTORY ENTRY
STU V978
POINTS TO RAM AREA WHERE DIRECTORY DATA IS STORED
DVEC12
RTS
LC6E4
LDB
TST
BNE
JMP
#2*26
V973
DVEC12
LAC46
'NE' ERROR
WAS A DIRECTORY MATCH FOUND?
RETURN IF FOUND
JUMP TO ERROR HANDLER IF NOT FOUND
* KILL COMMAND
KILL
JSR LC935
JSR LA5C7
JSR LC79D
BSR LC68C
BSR LC6E5
LC6FC
LDA #$FF
*
JSR LC807
LDX V974
CLR DIRNAM,X
LDB #$03
STB DCOPC
JSR LD6F2
LDB DIRGRN,X
LC70F
BSR LC755
LEAX FATCON,X
GET FILENAME.EXT FROM BASIC
'SYNTAX' ERROR IF MORE CHARACTERS ON LINE
GET VALID FAT DATA
TEST FOR FILE NAME MATCH IN DIRECTORY
MAKE SURE THE FILE EXISTED
* MATCH FILE TYPE = $FF; THIS WILL CAUSE AN 'AO'
* ERROR TO BE GENERATED IF ANY FILE TYPE IS OPEN
CHECK TO MAKE SURE FILE IS NOT OPEN
*GET RAM IMAGE OF DIRECTORY
*AND ZERO FIRST BYTE - KILL FILE
=WRITE OPERATION CODE - SAVE
=IT IN DSKCON VARIABLE
WRITE A SECTOR
GET NUMBER OF FIRST GRANULE IN FILE
POINT X TO PROPER FILE ALLOCATION TABLE
SKIP 6 CONTROL BYTES
B10