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