Download Disk Basic Unravelled II
Transcript
APPENDIX B DISASSEMBLY OF DISK BASIC 1.1 DISK BASIC UNRAVELLED II 0385 0386 0387 0388 0389 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 0400 0401 0402 0403 0404 0405 0406 0407 0408 0409 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 0450 0451 0452 0453 0454 0455 0456 0457 0458 0459 0460 0461 0462 0463 0464 0465 0466 0467 0468 0469 0470 0471 0472 0473 0474 0475 0476 0477 0478 0479 0480 C2B2 C2B4 C2B6 C2B9 C2BB C2BD C2BF 34 AE 8C 26 81 27 35 11 63 97 5F 04 23 02 91 C2C1 C2C3 C2C6 C2C8 C2CB C2CE C2D1 C2D4 C2D6 C2D8 C2DA C2DC C2DE C2E1 C2E4 C2E6 C2E8 C2EA C2EC C2EE C2F1 C2F3 C2F5 32 BD 9F 6F 6F 6F 6F 6F A6 97 9D 27 BD BD 1F 9E ED EC 27 BD EC AE 34 65 C8 F1 88 88 88 88 06 01 EB A5 0C B2 B7 10 F1 07 07 1D C6 09 0B 16 C2F7 C2F9 C2FC C2FE C300 C302 C304 30 BD 34 A6 26 35 35 5E 9F B5 60 E0 09 10 04 C306 C309 C30B C30D C310 C312 C314 C318 C31A C31C C31E C320 C322 8C 25 C6 7E DE AC 10 34 A6 27 6F C6 8D 02 64 05 36 AC 46 F1 4D 27 00 B7 14 4F 06 4F 03 33 C324 C326 C329 C32B C32E C32F EC BD 34 BD 50 EB 61 C7 84 04 C7 79 C331 C332 C334 C336 C339 C33B C33D C33E C340 C341 C342 C344 C346 C348 C34A 5C E7 E6 BD 33 A6 4C 30 3A 4A 27 E7 E6 C1 25 C34C C34E C350 C352 C354 C357 C35A C35C C35E C360 * CLS RAM VECTOR DVEC22 PSHS X,CC LDX $03,S CMPX #L975F BNE LC2BF CMPA #'#' BEQ LC2C1 LC2BF PULS CC,X,PC ORIGIN:SPECTRAL ASSOC REVISED:12/26/1999 WALTER K ZYDHEK SAVE X REG AND STATUS LOAD X WITH CALLING ADDRESS COMING FROM EXBAS' GET/PUT? NO NUMBER SIGN (GET#, PUT#)? BRANCH IF GET OR PUT TO RANDOM FILE RESTORE X REG, STATUS AND RETURN 37 E4 84 C0 F2 * GET/PUT TO A DIRECT/RANDOM FILE LC2C1 LEAS $05,S PURGE RETURN ADDRESS AND REGISTERS OFF OF THE STACK JSR LC82E EVALUATE DEVICE NUMBER & SET FCB POINTER STX FCBTMP SAVE FCB POINTER CLR FCBGET,X * RESET THE GET CLR FCBGET+1,X * DATA POINTER CLR FCBPUT,X = RESET THE PUT CLR FCBPUT+1,X = DATA POINTER CLR FCBPOS,X RESET PRINT POSITION COUNTER LDA FCBDRV,X *GET THE FCB DRIVE NUMBER AND STA DCDRV *SAVE IT IN DSKCON VARIABLE JSR GETCCH GET CURRENT INPUT CHARACTER FROM BASIC BEQ LC2EA BRANCH IF END OF LINE JSR SYNCOMMA SYNTAX CHECK FOR COMMA JSR LB73D EVALUATE EXPRESSION - RETURN IN (X) TFR X,D SAVE RECORD NUMBER IN ACCD LC2E6 LDX FCBTMP POINT X TO FCB STD FCBREC,X SAVE RECORD NUMBER IN FCB LC2EA LDD FCBREC,X GET RECORD NUMBER BEQ LC30B 'BAD RECORD' ERROR IF RECORD NUMBER = 0 JSR LC685 INCREMENT RECORD NUMBER LDD FCBRLN,X * GET RANDOM FILE RECORD LENGTH AND RANDOM FILE LDX FCBBUF,X * BUFFER POINTER AND SAVE THEM ON THE STACK PSHS X,B,A * THESE ARE THE INITIAL VALUES OF A TEMPORARY * * RECORD LENGTH COUNTER AND RANDOM BUFFER * * POINTER WHICH ARE MAINTAINED ON THE STACK LEAX $-2,U POINT X TO (RECORD NUMBER -1) JSR L9FB5 MULT (UNSIGNED) RECORD LENGTH X (RECORD NUMBER -1) PSHS U,Y SAVE PRODUCT ON THE STACK LDA ,S+ CHECK MS BYTE OF PRODUCT BNE LC30B 'BR' ERROR IF NOT ZERO (RECORD NUMBER TOO BIG) PULS X * PULL THE BOTTOM 3 PRODUCT BYTES OFF THE STACK; PULS B * TOP TWO IN X, BOTTOM IN ACCB; ACCB POINTS TO * * THE FIRST BYTE OF THE SECTOR USED BY THIS RECORD, * * (X) CONTAINS THE SECTOR OFFSET (IN WHICH SECTOR * * FROM THE START THE BYTE IS LOCATED) LC306 CMPX #(TRKMAX-1) 612 SECTORS MAX IN A RANDOM FILE BLO LC310 BRANCH IF RECORD LENGTH O.K. LC30B LDB #2*27 'BAD RECORD' ERROR JMP LAC46 JUMP TO ERROR HANDLER LC310 LDU FCBTMP POINT U TO FCB CMPX FCBSOF,U * COMPARE SAVED SECTOR OFFSET TO THE CURRENT SECTOR OFFSET LBEQ LC3CF * BEING PROCESSED - DO NOT PROCESS A NEW SECTOR IF THEY ARE EQUAL PSHS X,B SAVE BYTE AND SECTOR OFFSET TO RECORD START ON STACK LDA FCBFLG,U * CHECK FCB GET/PUT FLAG AND BEQ LC324 * BRANCH IF IT WAS A GET CLR FCBFLG,U FORCE GET/PUT TO 'PUT' LDB #$03 DSKCON WRITE OP CODE BSR LC357 GO WRITE A SECTOR - SAVE 'PUT' DATA ON DISK * CONVERT THE SECTOR OFFSET TO A GRANULE AND SECTOR NUMBER LC324 LDD $01,S * GET THE NUMBER OF SECTORS TO THE START OF JSR LC784 * THIS RECORD NUMBER AND CONVERT THEM TO A GRANULE OFFSET PSHS B SAVE GRANULE OFFSET ON THE STACK JSR LC779 MULTIPLY GRANULE NUMBER X 9 - CONVERT TO NUMBER OF SECTORS NEGB * NEGATE LS BYTE OF GRANULE OFFSET AND ADD THE ADDB $03,S * LS BYTE OF SECTOR OFFSET - ACCB = SECTOR * * NUMBER (0-8) CORRESPONDING TO THE SECTOR NUMBER WITHIN A * * GRANULE OF THE LAST SECTOR OF THE SECTOR OFFSET INCB = ADD ONE - SECTORS SAVED IN THE FCB; START STB FCBSEC,U = AT 1 NOT 0 - SAVE IT IN THE FCB LDB FCBFGR,U GET FIRST GRANULE IN FILE JSR LC755 POINT X TO FAT LEAU FATCON,X POINT U TO FAT DATA LDA ,S GET NUMBER OF GRANULES OFFSET TO RECORD INCA ADD ONE (COMPENSATE FOR DECA BELOW) LC33E LEAX ,U POINT X TO FAT DATA ABX POINT X TO CORRECT GRANULE DECA DECREMENT GRANULE COUNTER BEQ LC37B BRANCH IF CORRECT GRANULE FOUND STB ,S SAVE GRANULE ADDRESS ON STACK LDB ,X GET NEXT GRANULE IN FILE CMPB #$C0 LAST GRANULE IN FILE? BLO LC33E NO - KEEP LOOKING E6 0D 26 C6 7E 30 E4 D8 14 2E AC 46 C8 19 * THE GRANULE LDB TST BNE LC352 LDB JMP LC357 LEAX D7 9F 30 BD EA EE C4 C7 63 * READ/WRITE A SECTOR. ENTER WITH OP CODE IN ACCB, BUFFER PTR IN X LC35A STB DCOPC SAVE DSKCON OPERATION CODE VARIABLE STX DCBPT SAVE DSKCON LOAD BUFFER VARIABLE LEAX ,U POINT X TO FCB JSR LC763 CONVERT FCB TRACK AND SECTOR TO DSKCON VARIABLES 2E 15 16 17 18 6D 3D 85 63 44 42 C7 55 06 E4 C4 BEING SEARCHED FOR IS NOT PRESENTLY DEFINED IN THIS RANDOM FILE ,S GET OFFSET TO LAST GRANULE VD8 * CHECK GET/PUT FLAG LC366 * AND BRANCH IF PUT #2*23 'INPUT PAST END OF FILE' ERROR LAC46 JUMP TO ERROR HANDLER FCBCON,U POINT X TO FCB DATA BUFFER B5