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