OS65D Dissasembly Manual

rescanned by Marcus Bennett

PDF Viewing Options

Not Your Device? Search For Manuals or Datasheets below:


File Info : application/pdf, 68 Pages, 13.05MB

Document DEVICE REPORTOS65D Dissasembly Manual
OS-65D V3.2
DISASS ELY MA ~L
, :~:"
OFT\NARE :.DNSULTANTS
7053 ROSE TRAIL / MEMPHIS~ TENN. 38134/ (OOD 377-3503~.~.~_._",.

05-650 VERSION 3.2 DISASSEMBLY

by

)

Software Consultants

7853 Rose Trail

Memphis, TN 38134

(9111) 377-3583

This document is not from any official source, but was done using the "brute force method". That is, starting with the small amount of data released by OSI, each routine was painstakingly traced and decoded by hand. GTeat care was taken to insure accuracy througbout, however, if you do find any errors or o......1sions, please let us know. We will then forward all such ~orrections to all purchasers.

In several places within this listing you will find comments which are less than complimentary to 051. This was not done with the intent of belittling the original authors of 05-650, but strictly to inform all
) readers of the shortcomings as well as the virtues of this operating
system. If anyone feels we have been overly critical, we apologize.

If any of your friends asks you to allow them to make a copy of this document, please ask them to first read the following.

Software Consultants is a professional software house specializing in 051 compatible products. We are in business to make a profit, just as
all b\15il1ell.a,s",8 are. The 05-.650. disassembly represent.s over 588 manhours of res":tcb"~coJlpilation, and editing. The 'price was set as low as was possible' wtiile still allowing us a reasonable profit. If we are den'ied this reasQn~ble profit by large numbers of people aaking pirate copies then we w111 not be able to continue working on other products for 051 equipment. You may save yourself a few· dollars, but you will also be jeopardizing one of the very limited number of sources of high quality
products for the 051 community.

) COPYRIGHT 1988 by Software Consultants. All rights reserved.

,

_ . - _ . _ - - _.. -

--

GENERAL INFOHMATION
One of the most frustrating features of using Ohio Scientific equipment is the almost total lack of useable documentation. 05-650 is supposed to be a "developmental· operating system, which implies that the user can develop his own machine language programs and tie them into the OS. Obviously this is not the caSe or this document would never have come into existance.
We originally broke the OS not as a money making project, but to enable us to tie our own machine language programs into the OS, and to give us the information necessary to make modifications that suit our needs. Once completed, we felt others attempting to use this OS could use this information to the same advantage that we have. Of course, the profit motive was also a deciding factor.
We assume that anyone using this documeR~ is throughly familiar with the workings of OS-6~ V3~2 and is also· a compet~ 65.2 assembler programmer. Every effort has been made to make each routine within the OS as clear as possible. However, this is a r.eference manual, not a textbook.
We suggest that upon first reading this document you simply scan through and read all comments rather than attempt to absorb the entire thing at one reading. Then you may go back and read the actual code after first getting a feel for the contents and flow of the OS.
) This manual was intentionally printed on just one side of the paper to allow you to put your own notes on the facing pages. In particular, if you make changes to the OS, note each change in the listing along with it's purpose and the date made. If you will do your documentation as if you were going to be struck with amnesia tomorrow, it will truly make your life easier.
Following the listing of the OS itself is a complete cross reference showing the locations where each label is used. The location where the label is defined is marked with an asterisk. This shOUld prove invaluable in both tracing logic and in assuring yourself that any changes made will not have any undesired side effects.
Our intention in the preparation of this manual was to make it as useful as possible to you, the purchaser. If after careful study of the listing, you still have unanswered questions about the workings
.. of 05-650, write us and we will attempt to anSwer your questions. ~
Happy compu t i ng I'
)
,
-_._---_._-~

OS65D V3.2 DISASSEMBLY

PAGE: 1

-------------_.~-------------------------------------- ------------------

)

INITIALIZATION ROUTINE

;

; THIS IS THE ENTRY POINT WHEN THE SYSTEM IS BOOTED.

.; THE CODE FROM $2299 TO $22FF IS OVERLAYED BY BASIC WHEN IT IS CALLED ·
,

2299 1'.9 III

LOA tl

2292 29 B6 22

JSR PATCH8

SET SECTOR I AND STEP RATE

22115 211 BC 26

JSR SETTK

MOVE TO TRACK 1

22118 A9 21'.

LOA t$2A

2291'. 85 FF

STA MEMHI

SET HI MEM ADDR

2211C 29 54 27

JSR LDHEAD

LOAD HEAD

221lF 86 FE

STX MEMLO

SET LOW MEM ADDR TO 9

2211 211 67 29

JSR HEADDK

READ TK 1 INTO $2AIlB

2214 211 61 27

JSR UNLDHD

UNLOAD HEAD

2217 8E III F4

STX PTRPIA+l

2211'. 8E 99 F4

STX PTRPIA

CLEAR PRINTER PIA (X-9)

2210 8E 113 F4

STX PTRPIA+3

22211 CA

DEX

X-FF

.2221 8£ U OF
,

STX KPORT+l

SET KEYBOARD SOUND GENERATOR TO LOWEST FREQUENCY (192.753 HZ)

;

THEN TURN IT OFF @ S228FII!

2224 8E 112 F4

STX PTRPIA+2 SET PRINTER PIA

2227 AD 96 FB

LOA UART+6

2221'. 8E 95 FB

STX UART+5

SET SERIAL PORT

)

2220 A9 04 222F 80 III F4

LOA t4 STA PTRPIA+l

PRINTER AGAIN

2232 BD 93 F4

STA PTRPIA+3

2235 8C 91 C9

STY 1 ~'LOPIN+

RESET DISK (Y=B)

2238 1'.8 411

LOY 1$411

2231'. 8C·89 Cil

STY FLOPIN

2230 80 III CII

STA FLOPIN+l

2249 1'.9 III

LOA U

2242 28 C6 29

JSR SETDRV

SET TO DRIVE 1

2245 A9 93

LOA 13

2247 80 89 FC

STA 'fERMAC

RESET TERMINAL ACIA

2241'. 1'.8 11

LOY 1$11

224C 8C 89 FC

STY TERMAC

SET TERMINAL ACIA

224F 1'.2 IE

LOX ISlE

2251 90 89 CF CLRX16 STA X16ACI,X SET CA-I0X 16 WAY SERIAL BOARD

2254 98

TYA

(IF ADDRESSED @ SCF98)

2255 9D 09 CF

STA X16ACI,X

2258 A9 83

LOA 13

225A CA

DEX

2258 CA

DEX

225C 18 F3

BPL CLRX16

225E 1'.2 88

LOX 18

CLEAR VIDEO SCREEN

22611 A9 09

LOA ISD9

2262 85 FF

5TA MEMHI

2264 1'.8 811

LOY U

2266 84 FE

STY MEMLO

) 2268 A9 28

LOA IS21l

2261'. 91 FE CLRVID sTA (MEMLO), Y

226C C8

INY

,

OS65D V3.2 UISASSEM~LY

PAGE: 2

""' -----------------------------------------------------------------------

2260 00 FB

BNE CLRVID

226F E6 FF

INC MEMHI

2271 CA

DEX

2272 DO F6

BNE CLRVID

2274 B6 00

STX PAGE" .

X· 0

;
; WE ORIGINALLY THOUGHT THE ABOVE INSTRUCTION WAS USED FOR A
; FOR A PURPOSE WE HAVE NEVER SEEN DOCUMENTED. WHEN BASIC IS RUN ; IT PUTS A,JUMP AT $0000 TO $0474 (4C 74 04).THIS JUMP WILL TAKE ; YOU TO THE COMMAND MODE. IF YOU RESET THE SYSTEM WHILE BASIC
; IS RUNNING AND DO NOT WISH TO LOSE THE PROGAM IN MEMORY, ALL YOU ; HAVE TO DO IS TO JUMP TO seeee FRaM THE MONITOR. I.E. TYPE 1'1 THEN
; L012E0088RG FOR A SERIAL SYSTEM OR .H0DeG FOR A VIDEO SYSTEM. ; ANOTHER TIME WHEN THIS IS USEFUL IS WHEH BASIC IS AT AN INPUT I STATEMENT AND YOU DO NOT WANT TO CONTINUE THE PROGRAM. SINCE YOU ; CANNOT USE CONTROL,C AT AN INPUT STATEMENT, JUST RESET AND DO THE ; ABOVE. WE SUSPECTED 'ruE ·PURPOSE OF TillS INSTRUCTION WAS TO
; PREVENT UOING JUST THIS IF THE RESET IS HIT, THEN 0, THEN RESET ; AGAIN BEFORE ~ASIC HAS BOOTED. ACTUALLY THAT IS NOT THE REASON, ; BUT SINCE THIS IS A USEFUL PIECE OF INFORMATION, WE PUT IT IN
; ANYWAY. THE REASON $H0 IS SET TO 0 IS AS A FLAG FOR BASIC TO
; KNOW WHETHER OR NOT TO SWAP PAGE" AND 1 (SEE $2050).

;

I
; MEMTST : HIGHEST MEMORY TEST ROUTINE

;

; THIS ROUTINE CHECKS FOR THE HIGHEST AVAILABLE MEMORY PAGE.

; IT STARTS WITH THE PAGE @ $BF00 AND MOVES DOWN IN STEPS OF ONE

I PAGE UNTIL IT FINDS MEMORY. A WORD OF CAUTION. IF YOU HAVE LESS

; THAN 48K AND INTEND TO USE SOME OF THE UPPER ADDRESS SPACE FOR

··
;

HARDWARE, THEN THE OR THE MEMORY TEST

STARTING PAGE ADDRESS MAY DO STRANGE THINGS

@ $2277 TO YOUR

SHOULD BE DEVICE.

MODIFIED

· 2276 A" BF

MEMTST LOY '$BF

START TEST @ $BF00

2278 20 EC 22

JSR MEMCHK .

TEST THIS PAGE

227B F0 03

BEQ HMFND

IF SO, FOUND MEMORY

2270 88

DEY

TRY NEXT PAGE

227E 00 F8

8NE MEMTST+2 ALWAYS JUMP BACK

2280 8C 00 23 HMFND STY HIMEM

STORE HIGHEST MEMORY PAGE

2283 .0.2 01

LOX 'I

CHECK FOR SERIAL OR VIDEO

2285 AD 01 FE

LOA $FE01

(EITHER 65-.0. OR 65-V PROM)

2288 F0 01

BEQ *+1

228.0. E8

INX

IF VIDEO SET X=2

2288 8E C6 2A

STX DEFDEV

STORE DEFAULT DEVICE

; THE DEFAULT DEVICE ABOVE IS PICKED UP BY BEXEC* AND PUT INTO THE

; INPUT & OUTPUT DISTRIBUTOR BYTES. THIS IS THE REASON THAT THE

I BASIC STARTUP MESSAGE IS NOT PRINTED ON BOOTING THE SYSTEM, SINCE

; THE OUTPUT DISTRIBUTOR ON DISK IS $00, WHICH DOES NOT OUTPUT TO

; ANYTHING.

228E E.o.

NOP

228F .0.2 01

LOX tl

SET VIDEO TO 64 CHAR/LINE

;

TURN OFF SOUND GENERATOR, COLOR

2291 8E "0 DE

STX VIDSIZ

,

-----_ .

--_. - ----------

OS65D V3.2 DISASSEMBLY

PAGE: 3

-----------------------------------------------------------------------

) 2294 4C B3 22

JMP GOBAS

SKIP OVER UNUSED CODE!

;

.;$2297-$22B2 IS UNUSED CODE
,

2297 EC 22 F0 229A 18

CPX $Fll22
e-ce-

229B All D7

LDY .$D7

~.~~ Ao06 LOY >l S- Do!
,,l.q ,,~oe;(,~ '1s.t)").rc.
? .. "I Fo ,q 1!l6Q 'p63

229D 211 EC 22

JSR MEHCHK

22All 00 11

BNE $22B3

22A2 All lI0

LDY til-

22A4 BE C7 22

LDX $22C7,Y

22A7 F-ll IIA

BEQ $22B3

22M C8

INY

22M B9 C7 22

LDA $22C7,Y

22AD 9D 99 25

STA VIDOUT,X

22BII C8

INY

.22Bl 00 FI
,

BN.£ $22A4

22B3 4C E6 2A GOBAS JMP BASIC

LOAD AND EXECUT~ BASIC

;

; THE JUMP ABOVE IS TO THE SAME ROUTINE USED WITH THE 'BA'

; COMMAND. YET 'BEXEC·' IS RUN ONLY WHEN THE SYSTEM IS BOOTED.

; THE METHOD USED TO DO THIS IS REALLY QUITE ELEGANT. THE INPUT

; DISTRIBUTOR ON DISK IS SET FOR MEMORY INPUT, WHILE THE MEMORY

)

; ;

INPUT POINTER ON DISK POINTS TO $2E25. THIS IS WITHIN THE OS INPUT BUFFER. AND WHAT IS AT $2E25 ON DISK? WHY, 'RUN BEXEC· (CR)',

; OF COURSE. THEN WHEN 'BEXEC.' RUNS, IT SETS THE INPUT AND OUTPUT

; DISTRIBUTORS FROM THE DEFAULT DEVICE (SEE NOTE @ $228B), SO THE

; NEXT TIME THE 'BA' COMMAND IS EXECUTED, 'BEXEC·' IS NOT RUN.

;

; THIS PATCH ADDED FOR ADAPTIVE STEP RATE

;

22B6 8D 5E 26 PATCHO STA SECTNM

SET SECTOR TO I

22B9 A2 lI8

LDX .$08

22BIl 86 EF

STX STEPRT

STEP RATE

221m 60

RTS

;

; $22C7 THRU $22EIl IS A TABLE USED BY TH~ UNUSED ROUTINE @$2297.

;

; MEMCHK : MEMORY CIIECI< SUBROUTINE. CALLP.D @ $2278

; THERE MUST BE SOME REASON TO ONLY CHECK THE LOWEST SIX BITS OF

; THE BYTE UNDER TEST, BUT WE SURE CAN'T THINK OF ONE!
,

22EC 84 FF MEMCHK STY MEMHI

POINT TO PAGE UNDER TEST

22EE Bl FE

LDA (MEMLO) ,Y GET A BYTE FROM THAT PAGE

22FlJ 29 3F

AND t$3F

KILL HIGHEST 2 BITS (?!)

22F2 49 3F

EOR tS3F

INVERT ALL REMAINING BITS

22F4 91 FE

STA (MEMLO), Y PUT HASHED BYTE BACK

22F6 85 FD

STA TS2

AND SAVE IT

) 22F8 Bl FE

LDA (MEHLO), 'i GET IlYTE BACK FROM MEMORY

22FA 29 3~'
22FC C5 m

AND f$3F CMP TS2

KILL HIGHEST 2 BITS IS IT THE SAME?

22FE 611

OS65D V3.2 DISASSEMBLY

R'rs

EXIT WITH EQL FLAG SET

PAGE: 4

OS65D V3.2 DISASSEMBLY

PAGE: 5

-----_._----------------------------------------------------------------

)

I

; OS-65D V3.2 (NMHZ)
;
; ZERO PAGE LOCATIONS USED BY OS

;
11111111

PAGEII = SIIIIIIII

BASE OF PAGE ZERO

II II Ell

TSl - SlIlIEII

TEMPORARY STORAGE

II11El

OSIBAD - SOllEl

OS INPUT BUFFER ADDRESS

II11E3

STROAD - $88E3

ADDRESS USED BY STROUT ROUTINE

II11E5

HSTTK - $811E5

HIGHEST TRACK NUMBER OF FILE

II11EE

TKNHLD - $lIl11EE

TRACK NUMBER HOLD

II liEF

STEPRT - SIIIIEF

STEP RATE FOR DISK

IIltF5

SCTRTY ~ SlIlIIf'5

SECTOR RETRY COUNT

II IIF6

WRTRTY - SllllF6

WRITE RETRY COUNT

OllF7

HDRTYM - S011F7

READ VERIFICATION RETRY COUNT

;,.

AFTER MOVING HEAD (3) NOT USED ON VERIFY AFTER DISK WRITE

1I11-F8

RDRTYN " SII0F8

READ VERIFICATION RETRY COUNT

;

WITHOUT ~OVING HEAD (7)

; ON READ, TOTAL RETRIES BEFORE AN ERROR - RDRTYN * RDRTYM (21)

110F9 II0FA

SCTBYP SCTLEN

-=

SIIIIF9 SIIIIFA

SECTORS 8YPASSED COUNTER SECTOR LENGTH IN PAGES

II11FS

SCTNUM = SUFB

SECTOR NUMBER

""FC

""FD

)

II liFE II11FF

STKADR = SII0FC
TS2 = SIIllFD
MEMLO = SllOFE
MEMHI = SIIIIFF

STACK ADDRESS

TEMPORARY STORAGE

INDIRECT MEMORY ADDRESS, LOW

..

"

. . , HI

;
; OTHER MEMORY ADDRESSES REFERRED TO BY THE OS ; ALL EXCEPT THOSE MARKED WITH AN ASTERISK ARE PART OF AN INSTRUCTION

; AND THERFORE ARE CASES OF SELF-MODIFING CODE. ; DURING THE LISTING, ANY ADDRESS WHICH IS MODIFIED IS DENOTED BY

; TWO ASTERISKS (**) IN THE PLACE OF AN ADDRESS.

;

111110

11213

;

131111

13113

17110

;
211C4

20E4

235F

2361

2363

2378

238A

2391

23AC

)

23C3 23FD

2416

25M

STACK = SOHl" SWAP4A - S8213

STASH = $131111 RTASM = S13113 STEM - S17I111

RTBAS = S211C4

S'fBAS X.HOLD

==

S 211E4 S235F

Y.HOLD = S2361

A.HOLD = S2363

IOOFS - S2378
MINADR = S238A

MOTADR = S2391

OlIADR = S23AC

DlOADR - S23C3

D2IADR - S23FD

D20ADR - S2416

VOTOFS - S25A4

**KEY4BBAOBSAEYRTDEOSF

STACK (PAGE 1) SWAPPED DURING ROUTINE

POLLED

*·

COLD START FOR ASSEMBLER RESTART ASSEMBLER ENTRY POINT

*THECROELD

START IS NO

FOR EXTENDED RESTAR'f POINT

MONITOR

· RESTART BASIC ENTRY POINT · COLD START FOR BASIC

X REGIS'fER HOLD

Y REGISn;R HOLD

ACCUMULATOR HOLD

VECTORED I/O OFFSET

MEMORY INPUT ADDRESS
· OUTPUT ·

DISK 1 BUFFER INPUT ADDRESS

. ··
· 2·
. .. ·

OUTPUT INPUT

·..

OUTPUT ·

VIDEO OUTPUT LINE OFFSET

,

OS65D V3.2 DISASSEMBLY

PAGE: 6

262B 262E 2639
·267B
,
;

VLPI = $262B
= VLP2 = $2621':
VLOSAV $2639
NMHZ = $267B

·
2AC6 2CE5 2CED
07""

DEFDEV = $2AC6 BUFOFS = $2CE5 MAXBUF = $2CED PLINE = $D7111J

;

; FLOPPY DISK PIA (MC6B21)

VIDEO LINE POINTER DURING SCROLL

··

·

·

·

"

· OFFSET SAVE

NMHZ VARIABLE

$31=lMHZ. $62=2MHZ

WE CAN NOT FIND WHERE THIS IS

SET. PROBABLY IN BASIC.

DEFAULT I/O DEVICE (SET @ $228~)

OS BUFFER OFFSET

MAXIMUM SIZE OF OS BUFFER
* PRINT LINE FOR 5411 VIDEO

;
·CIIIIII
·; BIT

t'LOPIN = $CIlIIIJ
FUNCTION

FLOPPY DISK STATUS PORT

;
; II ;1 ;2 ;4 ;5 ;6
·; 7
·
CIIII2

DRIVE II READY (II IF READY)
TRACK o (II IF AT TRACK II)
FAULT (II IF FAULT)
DRIVE 1 READY (0 IF READY)
WRITE pROTECr (II IF WRITE PROTECT)
= DRIVE SELECT (1 A OR C. II = B OR D)
INDEX (II IF AT INDEX HOLE)

FLOPOT = $C1J1l2

FLOPPY DISK CONTROL PORT

;
; BIT FUNC'rION

;
; IJ ;1

WRITE ENABLE (IJ ALLOWS WRITING) ERASE ENABLE (II ALLOWS ERASING)

;

ERASE ENABLE IS ON 20llus AFTER WRITE IS ON

;

ERASE ENABLE IS OFF 53IJus AFTER WRITE IS OFF

; 2 STEP BIT : INDICATES DIRECTION OF STEP (WAIT III us FIRST)

; ; ;3 ; ;4

IJ INDICATES STEP TOWARD 76 1 INDICATES STEP TOWARD II STEP (TRANSITION FROM 1 TO Il) MUST HOLD AT LEAST 111 us. MIN Bus BETWEEN FAULT RESET (Il RESETS)

; 5 SIDE SELECT (1 = A OR B. II = C OR D)

;6 ;7

LOW CURRENT (II FOR TRKS 43-76, 1 FOR TRKS 0-42) HEAD LOAD (II TO LOAD: MUST WAIT 411ms AFTER)

;
; FLOPPY DISK ACIA (MC6851l)

;
C0111
Cllll
,

ACIA = $C"lII ACIAIO = $CIIll

DISK CONTROLLER ACIA STATU~ PORT

"

If

II

I/O

..

; OTHER HARDWARE ADDRESSES

·
CFII" DE'")

X16ACI = $CFII"
VIDSIZ = $DEIIII

NORMAL BASE ADDRESS OF CAI11X BOARD
VIDEO SIZE (1 = 64 CHAR. " = 32)

,

05650 V3.2 DISASSEMBLY

PAGE: 7

-----------------------------------------------------------------------

) DFIlIl

KPORT · $01'1111

POLLED KEYBOARD PORT

F4Il1l

PTRPIA · $1'41111

PARALLEL PRINTER PIA (MC682l)

FBIlIl

UART · $FB81l

438 BOARD SERIAL PORT (51883)

FCIID

TERMAC·· $FCIlIl

SERIAL TERMINAL ACIA STATUS PORT

FClll

TERMIO · $FClll

·.

·

· I/O

·

.1'01111

KPOLL .·:$1'0""

POLLED KEYBOARD ROUTINE (HOM)

·; THE ACIAS AT $CFXX AND $FCIlIl ARE ALL MC68511's

)

)
.... ~.,

__ - - - _ . - - - - - - - - _ .

.~

~

OS6SD V3.2 DISASS~M8LY

PAGE: 8

-----------------------------------------------------------------------

; START OF RESIDENT OS MEMORY AREA

;

·231'"
·
;

HIMEl'! = $23''''

HIGHEST MEMORY PAGE ADDRESS SET @$22811

; I/O DISPATCH TA8LE:(ADDRBSS. ACTUAL ADDRESS - 1)

; ROUTINES ARE CALLED BY PUSHING THE ADDRESS ON

; THE STACK AND DOING AM RTS.
··
; INPUT DISPATCH TABLE

;

23111 FS 24

IOTABL .WORD TgRMIN-l

TERMINAL (ACIA): BASIC DEVICE 1

2383 2A 25

.WORD KBINP-l

POLLED KEYBOARD: BASIC DEVICE 2

2385 17 25 2387 85 23 2.319 88 23

.WQRD.SERINI'-l .wORD NULLIN-l
.WORD'MSMlN- i'

tS!9EbR"ILA: L'. BA(USAICRTD)E: VBICAESIC4 DEVICE 3
ii'BMORY: .:BASIC DEVICE 5

238B AI 23

.WORD.DKlIN,.l

DISXi: BASIC DEVICE 6

2380 EF 23

.WORD DK2IN-l

DISK2: BASIC OEVICE 7

·230F AF 24
·

.WORD X16INP-l

; OUTPUT DISPATCH TABLE

CAIIIX: BASIC DEVIC~ 8

;

"

2311 CC 24

.WORD TERMOT-l

TERMINAL (ACIA): BASIC DEVIC~ 1

2313 98 25

.WORD VIDOUT-l

540 VIDEO: BASIC DEVICE 2

2315 IIC 25 2317 9E 24

· WORD SE.ROUT-l .WORD PTROUT-l

SERIAL (UART): 8ASIC DEVICE 3 PARALLEL PRINTER: BASIC DEVIC~ 4

2319 8F 23

.WORD MEMOT-l

MEMORY: BASIC DEVICE 5

231B Bl 23

.WORD DKI0UT-l

DISKl: BASIC DEVICE 5

2310 112 24

.WORD DK20UT-l

DISK2: BASIC DEVICE 7

231F BC 24

.WORD X160UT-l CAlIX: BASIC DEVICE 8

;

·;GENERAL STORAGE AREA

·
- 2321 III

INDST = *

INPUT DISTRIBUTOR

2322 81 2323 811 2324 04
2325 "0 2326 7E

OUTDST = *
X16DEV = * RNDSED = *
KPDO = *
DIBFLO = *+2

OUTPUT DISTRIBUTOR
CAll1X DEVICE t * 2 (0-lE)
RANDOM NUMBER SE~D KEY PRESSED DURING OUTPUT
DISKI BUFFER LOW ADDRESS

2327 31

2328 7E

D18FHI = *+2

DI'SKI BUFFER HI ADDRESS

2329 3D

232A 58

DIF.RST = *

DISKI FIRST TRACK

232B 51

01LAST = *

DISKI LAST TRACK

232C 58 2320 08 232E 7E

DICRTK = *
D18FDR = * D28FLO = *+2

DISKI CURRENT TRACK DISKI BUFFER 'DIRTY' FLAG DISK2 BUFFER LOW ADDRESS

232~' 3D

23311 7E

D2BFIII = *+2

DISK2 BUFFER HI ADDRESS

2331 49

2.332 50

D2FRST.=·~

DISK2 FIRST TRACK

2333 51

D2LAST =.*

DISK2 LAST TRACK

.2334 50
l':

D2CRTK =* ....'

DISi<i :.CURRENT TRACK

. .',.;,I:;~~,i;,~~~£;~,~;.".!~#?iif.':~~,;~r~f\~:~2·'·· ·.' .'

OS650 V3.2 DISASSEMBLY

PAGE: 9

)
2335 ""

D2BFDR z ·

;

; START OF ACTUAL CODE

DISK2 BUFFER 'DIRTY' FLAG

;
; INPUT/OUTPUT ROUTINES

;

·2336 4C 06 2C 11'11
,

J~IP INPUT

USED BY INECHO

; DOINP : DO VECTORED INPUT BASED ON VALUE IN INDST

@S2340

;
; (SEE NOTE AT $2CD6)

; THE OS-65D MANUAL SAYS THAT INPUT IS DONE FROM THE LOWEST SET

; DEVICE & ALL OTHERS ARE IGNORED. WRONG I II IF MORE THAN ONE BIT

I IS SET IN INDST, THINGS REALLY GO CRAZY. TRY ENTERING "10 11"
I (OR "10 12" FOR A VIDEO SYSTEM)' AT "A·" AN'DWATCH THE RESULTS.

;

,

2339 A8 80

DOINP LDY 'S88

SET ,FOR INPUT

233B AD 21 23

LDA INDST

GET INPUT DISTRIBUTOR

233E D8 8B

BNE 0010

GO DO INPUT

,·

; INECHO : INPUT & ECHO. ALSO CHECKS FOR CONTROL CHARACTERS.

;

2348 28 36 23 INECHO JSR 11'11

INPUT AND ECHO

;

THIS SHOULD HAVE BEEN

)

;
,,

,·

JSR INPUT. WHY THEY DID IT THIS WAY WE DON'T KNOW.

; PRINT ROUTINE : OUTPUT TO ALL ACTIVE DEVICES

; OUTPUT CHARACTER IN A

;

2343 28 67 23 PRINT JSR SAVAXY

2346 AD 22 23

LOA OUTDST

SAVE ALL REGISTERS GET OUTPUT DISTRIBUTOR

2349 A0 111

LOY '$111

DENOTES OUTPUT

;
; DO I/O, EITHER INPUT OR OUTPUT BAS£D ON VALUE IN Y

;
234B A2 FF 234D De 22

DOlO LOX ISFF

SET INDEX TO DETERMINE DEVICE

BNE PATCH1 ($23)/)GO TO PATCH t'OR I/O OFFSET

234F £8 23514A 2351 !l8 09 2353·48,
2354.,8.0. 235548 2356 21 76 23

INX LSR ,A BCC DONXIO
PHA TXA PHA JSR IODISP

CHECK,FOR,I/O BIT ON ($235C) BRANCH ~F NOT SAVE REST OF I/O DIST BYTE AND DEVICE NUMBER FOUND
I/O DEVICE NOW IN A
GO DO I/O

2359 68 235A AA

PLA

RESTORE A AND X

TAX

235B 68

PLA

235C D8 Fl DONXIO ,81'1£ 0010+4

(S234F) IF ANY BITS STILL ON

); ;

RSTAXY

:

REStoR~,,~.X;Y

(USED AFTER SAVAXY)

; WARNINGI '~~~S RqUT~~~;,~KS OUT THE UPPER BIT IN A

;

·.... '.

,"
,~.

,
'

..
'~

.,.

.
,

-. ."

;.,. ";.: '.

.. ~.""

- -:
'~. - .', .i ····

.
_~,.I~
. .:., 'of' :.'
',. ;;>'~~?~f~?,

- - - - - - - - - - - - - - ' .... - - - -

OS650 V3.2 DISASSEMBLY

PAGE: III

235E A2 01l 2360 A0 01l 2362 A9 00 2364 29 7F 2366611

HSTAXY LOX ··
.* LOY, *. LOA
AND 'S7F RTS

RESET X RESET Y RESET A KILL UPPER BIT IN A BACK WE GO

;
. ; SAVAXY ··

SAVE A,X,Y FOR LATER

2367 80 63 23 SAVAXY STA A.HOLO

236A 8C 61 23

STY Y.HOLD'

2360 8E 5F 23

STX X.HOLO

237060-

RTS

SAVE A SAVE Y SAVE X

;
·· PATCH TO SET I/O OFFSET

;

2371 8C 78 23 PATCHI STY IOOFS

·2374 Oil D9
,

BNE DOIOU

; IODISP : I/O DISPATCH ROUTINE

STORE I/O OFFSET (S234F) GO BACK'

;

2376 OA 2377 69 00

*. IOOISP ASL A ADC

2379 AA

TAX

237A BD 112 23

LOA IOTABL+l,X

2370 48

PHA

237E BD 01 23

LOA IOTABL,X

2381 48

PHA

2382 AD 63 23

LOA A.HOLD

2385 60

RTS

MULTIPLY I/O DEVICE BY 2 I/O OFFSET (0-INPUT S10=OUTPUT) GET SET TO GET I/O ADDRESS GET HI BYTE PUSH ON STACK GET THE LOW BYTE PUSH ON STACK RESTORE A FOR OUTPUT JUMP TO ROUTINE

;
; NULLIN: NULL INPUT ROUTINE (BASIC DEVICE 4)

;
; WHILE THE NULL INPUT ROUTINE IN ITSELF IS NOT THAT USEFUL,

; SINCE IT IS 3 BYTES LONG IT COULD BE USED AS A JUMP TO A ; USER DEFINED INPUT ROUTINE.

;
23861\9 11I11I 2388 6"

NULLIN LOA 'Sill" RTS

;
; MEMIN : ,.INPUTFROM MEMORY ROUTINE (BASIC DEVICE 5)

*. ;
;

THIS

R o t i f i.N. :E

IS

ALSO

USED

FOR

THE

INDIHECTFILE'FUNCTION

2389 AD 011I 011I MEMIN LDA

GET BYTE FROM MEMORY

;

MODIFIED 'BY COMINC

238C A2 011I

LOX 'S00

SET OFFSET

238E Fill 11I5

BEQ COMINC

GO TO COMMON INCREMENT ROUTINE

·
; MEMOT : MEMORY OUTPUT ROUTINE (BASIC DEVICE 5)

; THIS ROUTINE IS -ALSO USED BY THE INDIRECT FII.E FUNCTION.

b911 ;

80

1

11

0

8~"

M. iM-O. ~;:.'~:' :

"ST .

A;.;

~

2393 A2 07. ' ,

,'.- '-LOX ',$11I7

~u1B'iT£IN,.~()~t! ·
MODIFIED BY COflI",C ,;:' SET, OFFSET ,. -'.':.'-.> '.

·¥

.-

< -.· '

OS65D V3.2 DISASSEMBLY

PAGE: 11

') ; COM INC : COMMON INCREMENT ROUTINE

;

; THE FOLLOWING ROUTINE IS USED BY THE DISK 1 AND 2 INPUT

; AND OUTPUT ROUTINES AS WELL AS THE MEMORY INPUT AND OUTPUT

; ROUTINES. THIS IS AN EXTREME CASE OF SELF MODIFING CODE WHICH

; SHOULD NORMALLY BE AVOIDED. X IS USED AS THE INDEX

.; AND IS SET BY EACH INDIVIDUAL ROUTINE BEFORE CALLING THIS ROUTINE .
,

2395 8D 63 23 COM INC STA A.HOLD

SAVE A

2398 FE 8A 23

INC MINADR,X

INCREMENT MEMORY ADDRESS

239B 00 113

BNE *+5

($23A0)

239D FE 8B 23

INC MINADR+l,X

23M 60

RTS

;

; DKlIN DISK 1 INPUT ROUTINE (BASIC DEVICE 6)

;

23Al All 00

DKlIN LOY 1$00

23A3 20 66 24

JSR CKB~'E;j-2

SET Y OFFSET CHECK FOR END OF BUFFER

23A6 00 03

BNE *+5

($23AB) IF NOT END OF BUFFER, CONT

23M 20 CC 23 23AB AD 7E 31

JSI~ DKlNXT
LOA **

READ NEXT TRACK LOAD BYTE (MODIFIED BY COM INC)

23AE A2 22

LDX 1$22

SET THE OFFSET

23B0 D0 E3

BNE COMINC

GO USE COMMON INCREMENT ROUTINE

;

) ; DKlOUT : DISK 1 OUTPUT ROUTINE (ijASIC DEVICE 6) ;

THIS ROUTINE WILL ALLOW YOU TO PRINT ANY CHARACTERS TO DISK EXCEPT

; A LINE FEED ($0A). SOMETIMES IT IS USEFUL TO BE ABLE TO WRITE A

; LINE FEED TO DISK, I.~. CREATING A WORD PROCESSOR OR ASSEMBLER

; FILE WITH BASIC. IF YOU WISH TO DO SO, YOU CAN CHANGE THE FOURTH

; BYTE OF EITHER DISK OUTPUT ROUTINE TO A NULL (HEX 0). JUST BE SURE

; YOU DON'T DO A "NORMAL" WRITE TO DISK WHIL~ THE CHANGE IS IN EFFECT

; OR THE CARRIAGE RETURN WILL BE FOLLOWED BY A LINE FEED.

23B2 C9 0A DKlOUT eMP I$BA

If LINE I'EI>D THEN IlETUHN

23B4 F0 EA

BEQ DKlIN-l

($23AIl)

23B6 48

PHA

SAVE BYTE TO BE WRITTEN

23B7 A0 17 23B9 20 66 24

LDY '$17 JSR CKBFEN-2

SET Y FOR OFFSET CHECK FOR END OF BUFFER

23BC 00 03
23BE 20 CC 23

BNE *+5 JSR DK1NXT

($23Cl) CONTINUE IF NOT AT END WRITE THIS TRACK, READ NEXT

23Cl 68 23C2 8D.7E 31

PLA
STA **

RESTORE THE OUTPUT BYTE PUT IN BUFFEH (MODIFIED BY COMINC)

23C5 A2 39

LOX 1$39

SET OFFSET FOR COMMON INCREMENT

23C7 BE 20 23

STX DlB"DR

SET BUFFER DIRTY FLAG

23CA 00 C9

BNE COMIt~C

BRANCH TO COMMON INCREMENT

;

; DK1NXT : DISK 1 NEXT TRACK READ, USED BY DKlIN AND DK10UT
,

) 23CC AD 20 23 DKlNXT LOA DlBFDR

23CF F0 115

BEQ *+7

GET BUFFER 'DIRTY' FLAG ($2306) IF NOT 'DIRTY' CONTINUE

23D1 A2 DO

LUX ·.$110

SET m'FSET

OS65D V3.2 DISASSEMBLY

PAGE: 12

-----------------------------------------------------------------------

23D3 2" 77 24

JSR ~ITDKBF

GOSUl! TO WRITE DISK BUFFER

23D6 AD 26 23

LDA DIBFLO

RESET READ/WRITE ADDRESS

23D9 8D AC 23

STA DlIADR

AND MEMORY ADDRESS TO START

23DC 80 C3 23

STA DI0ADR

OF DISK BUFFER

23DF 85 FE

STA MEMLO

23EIAD 27 23

LDA DIBFLO+l

23E4 8D AD 23

STA DlIADR+l

23E7 8D C4 23

STA DI0ADR+l

23EA 85 n'

STA MEMHI

23EC A2 ~~

LOX '$00

SET OFFSET

23EE F0 52
··

BEQ BDRDNX

ALWAYS BRANCH

; DK2IN : DISK 2 INPUT ROUTINE (BASIC DEVICE 7)

;
23F0 A2 08 23F2 A0 51 23F4 20 68 23F7 DO 03 23F9 21l 2" 23FC AD 7E
2· 3FF A2 73
2401 D0 92

DK2IN
24
24 3D

LOX '$08 LDY '$51 .JSR CKBFEN BNE *+5 JSR DK2NXT LDA **
LDX '$73 BNE COMINC

SET OFFSETS
CHECK FOR END OF BUFFER ($23FC) IF NOT END. CONTINUE WRITE THIS BUFFER. READ NEXT LOAD BYTE FROM BUFFER MODIFIED BY COMINC SET OFFSET BRANCH TO COMMON INCREMENT

·
; DK20UT : DISK 2 OUTPUT ROUTINE (BASIC DEVICE 7) ; SEE NOTE @$23B2 ABOUT LINE FEED

· 2493 C9 ~A

DK20UT CMP '$01\

2495 F0 6F

BEQ $2476

24~7 48

PHA

2498 A2 08

LDX '$138

249AA0 6A

LOY iS6A

249C 29 68 24

JSR CKBFEN

249F 09 93

BNE *+5

2411 20 20 24 2414 68

JPSLRA DK2NXT

2415 80 7E 3D

STA **

2418 A2 8C

LOX '$8C

24lA 8E 35 23

STX D28FDR

241D 4C 95 23

JMP COMINC

IF LINE FEED THEN RETURN
SAVE BYTE TO BE WRITTEN SET OFFSETS
CHECK FOR END OF BUFFER ($2414) IF NOT END THEN CONTINUE WRITE BUFFER. READ NEXT TRACK GET BYTE TO BE WRITTEN PUT IN BUFFER (MODIFIED BY COMINC) SET OFFSET FOR COMINC SET BUFFER 'DIRTY' FLAG DO INCREMENT FOR POINTER

·
; DK2NXT : DISK 2 NEXT TRACK READ. USED BY DK2INAND DK20UT

· 2420 AD 35 23 DK2NXT LDA D2BFDR

2423 F0 05

BEQ *+7

2425 A2 08

LDX '$08

2427 20 77 24

JSll WTDKBI'

242A AD 2E 23

LDA D2BFLO

242D 8D FD 23

STA D2IADR

2430 8D 16 24

STA D20ADR

2433 85 FE

STA MI::MLO

2435 AD 2F 23

LDA D2BFLO+1

2438 8D FE 23

STA D2IADR+l

GET BUFFER 'DIRTY' FLAG ($242A) CONTINUE IF NOT 'DIRTY' SET OFFSET GO WRITE THIS BUFFER RESET READ/WRITE ADDRESSES AND MEMORY ADDRESS TO START OF BUFFER

. .-:

OS65U V3.2 DISASSEMBLY

PAGE: 13

-----------------------------------------------------------------------

) 243B OD 17 24

STA D20ADR+l

243E B5 ~'F 2441l A2 110

STA MEMHI LDX f$eB

SET OFFSET

;

;
; THE NEXT GROUP OF ROUTINES ARE USED BY BOTH DISK 1 & DISK 2

; X IS SET TO e FOR DISK 1 AND T08 FOR DISK 2.

;
; BDRDNX : BUFFERED DISK I/O READ NEXT TRACK

;

2442 BD 2C 23 BDRDNX LDA DICRTK.X

2445 18

CLC

2446 F8

SED

GET CURRENT TRACK NUMBER GET SET TO ADD 1 TO CURRENT TRACK SET DECIMAL (TRACK' IN BCD)

2447 69 Dl 2449 D8 244A 9D 2C 23 244D 21! 53 24 2450 4C ID 2B

ADC '$el CLD
STA DICRTK.X JSR BDI4HTK
JMP CALL+12

DO THE ADD CLEAR DECIMAL MODE SAVE THE TRACK NUMBER
MOVE HEAD TO TRACK ($2BID) READ DISK. UNLOAD HEAD AND RETURN

;
; BDMHTK : BUFFERED DISK I/O MOVE HEAD TO TRACK

;
2453 A9 0e

BDMHTK LDA 'See

CLEAR BUFFER 'DIRTY' FLAG

2455 9D 2D 23 2458 BD 2C 23

STA DIBFDR.X LDA DICRTK,X

COMPARE CURRENT TRACK

)

245B DD 2B 23 245E 21! 8D 2C

CMP DILAST,X WITH LAST TRACK JSR INCTKN+l11 ($2CBD) MOVE HEAD TO 'fHACK. IF

;
2461 C8 2462 DI! 2D

INY BNE PATCH2

PAST END OF FILE. ERROR D
SET Y TO 1 ALWAYS BRANCH TO PATCH2

2464 Ill!

BRK

(NOT USED)

2465 01!

BRK

(NOT USED)

;

2466 1\2 1I1l
;
,

LDX t$ee

SET OFFSET USED BY DKIIN AND DKI0UT

; CKBFEN : CHECK FOR END OF BUFFER

;

246B 89 AC 23 CKBFEN LDA DIIADR,Y

246B DD 28 23

CMP DIBFHI.X

246E De 1!6

BNE *+8

24711 89·AD 23

LDA DlIADR+ 1. Y

2473 DD 29 23

CMP DIBFHI+l.X

2476 61

RTS

,

LOW AODRESS OF BYTE TO BE READ LOW ADDRESS OF END OF BUFFER ($2476) IF NOT THE SAME THEN RETURN HI ADDRESS OF BYTE TO BE READ HI ADDRESS OF END OF BUFFER RETURN WITH 2 FLAG SET IF END

; WTDK8F : WRITE DISK BUFFER

;

2477 BD 29 23 WTDKBF LDA Dl BFHI+ 1, X HI ADDR OF BUFFER HI ADDR

247A 38 2478 FD 27 23

SEC SBC Dl BFLO+ 1, X HI ADDR OF BUFFER LOW ADDR

247E BD SF 26 ) 2481 BD 26 23

STA PGCtlT LDA D18FLO,X

NUMBER OF PAGES SET MEMORY ADDRESS TO LOW

2484 B5 FE

STA MEMLO

BUFFER ADDRESS

..,

OS65D V3.2 DISASSEMBLY

PAGE: 14

-----------------------------------------------------------------------

2486 ~D 27 23

LOA D1BFLO+1,X

2489 85 FF

STA MEMHI

248B 29 53 24

JSR BDMHTK

·248E 4C E1 27
,

JMP DSKWHT

; PATCH2 (FROM $2462)

MOVE HEAD TO TRACK WRITI:: TO DISK AND RETURN

;

2491 8C 5E 26 PATCH2 STY SECTNM

SET SECTOR NUMBER TO 1

·2494 4C 54 27
,

JMP LDHEAD

LOAD HEAD AND RETURN

; MODMIN : MODIFY MEMORY INPUT ADDRESS

;

; THIS ROUTINE IS USED ONLY BY THE INPUT FROM INDIRECT FILE

; FUNCTION (CTRL X). IF YOU WANT TO CHANGE THE LOCATION OF

; THE INDI~ECT FILE, YOU MUST CHANGE THE ADDRESS HERE AND IN

; THE ROUTINE @$2551.

·

;

2497 A9 80

MODMIN LDA '$80

HIGH ADDRESS FOR INDIRECT FILE

2499 8D 8B 23

STA MINADR+1 SAVE IT

249C A9 00

LDA .S00

LOW ADDRESS OF INDIRECT FILE

·249E 60
,

RTS

; PTROUT : PARALLEL PRINTEH OUTPUT DEVICE (BASIC DEVICE 4)

;
; NOTE: SOME OF THE NEWER PRINTERS ON THE MARKET ARE EQUIPPED WITH ; GRAPHICS AND NEED THE FULL 8 ~ITS OF AN OUTPUT ~YTE TO USF. ; THIS FEATORE. CHANGING 'rHE INSTRUCTION AT $24A7 AND $24A8 TO ; NOP'S ($EA) WILL ALLOW THIS.
,

249Y 48

PTROUT PHA

24A0 AD 00 F4

LDA PTRPIA

24A3 4A

LSR A

24M 80 FA

BCS PTROUT+l

24A6 68

PLA

24A7 29 7F

AND '$7F

24M 8D 92 F4

STA PTRPIA+2

24AC AD 20 F4

LDA PTRPIA+S2~

24AF 69

RTS

;

SAVE BYTE TO BE PRINTED CHECK PIA STATUS REGISTER
($24A0) NOT CLEAR, KEEP WAITING RESTORE THE OUTPUT BYTE KILL THE UPPER BIT OUTPu'r'THE BYTE STROBE THE ~YTE TO THE PRINTI::R

; BEYORE USING l::I'rHt;H OF 'rHI:: CA111X ROUTINES, THE PORT NUMBER MUST ; BE SET IN X16DEV ($2323)
;

; X16INP : CA10X INPUT ROUTINI:: (BASIC DEVICE 8)

;

24B0 AE 23 23 X16INP LOX X16DEV

GET ACIA DEVICE!

24B3 BD "0 CF

LDA X16ACI,X GET ACIA STATUS RI::GISTER

24B6 4A

LSR A

SHIFT STATUS BIT TO CARRY

24B7 90 F7

BCC X16INP

TRY AGAIN IF NOT READY

24B9 BII 4D

BCS PATCH3

($2508) GO TO PATCH3 TO INPUT

24BB 0~

BRK

(NOT USED)

24BC IIIl

BRK

(NOT USED)

;

; X160UT : CA10X OUTPUT HOUTINI:: (BASIC DEVICE 8)

OS65D V3.2 DISASSEMBLY

PAGE: 15

-------_ .. ---------------------------------------------------------------

) 2·4BD 48

X160UT PHA

SAVE THE OUTPUT BYTE

24BE AE 23 23

LOX XIGDEV

GET THE CURRENT DEVICE NUMBER

24Cl BD "" CF 24C4 4A

LOA X16ACI.X LSR A

GET THE STATUS REGISTER

24C5 4A

LSR A

24C6 91l F6

BCC X160UT+l

(S24BE) IF NOT READY, TRY AGAIN

24C8 68

PLA

GET THE BYTE TO BE OUTPUT

24C9 90 01 CF

STA X16ACI+l,X WRITE IT

24CC 61l

RTS

;
; TERMOT : TERMINAL OUTPUT ROUTINE (BASIC DEVICE 1)

;

24CO 48

'fERMOT PHA

24CE AD Il11 FC

LOA TERMAC

2401 4A

LSR A

2402 4A

LSR A

2403 90 F9

BCC TERMOT+l

2405 68

PLA

2406 80 01 ~'C

STA TEHMIO

24D9 48

PHA

240A AD Il9 FC

LOA TERMAC

2400 4A

LSR A

240E 99 11

BCC TORTN

24EIl 21l F6 24
) 24E3 80 25 23

JSR TERMIN STA KPOO

24E6 C9 13

CMP .S13

24E8 00 07

BNE TORTN

24EA 20 F6 24

JSR TERMIN

24EO C9 11

CMP 'S11

24EF Oil F9

BNE *-5

24Fl 68

TORTN PLA

24F2 80 63 23

STA A.HOLD

24F5 69

RTS

SAVE THE BYTE TO OUTPUT GET THE ACIA STATUS
(S24CE) IF NOT READY. TRY AGAIN GET THE BYTE TO PRINT OUTPUT IT SAVE IT AGAIN GET THE STATUS AGAIN CHECK FOR INPUT READY NO KEY PRESSED. GO BACK INPUT A CHARACTEH SAVE IT CONTROL S7 NO, GO BACK YES, INPUT A BYTE CONTROL Q7 (S24£A) NO. TRY AGAIN RESTORE THE OUTPUT BYTE SAVE IT

·
; TERMIN : SERIAL TERMINAL INPUT ROUTINE (BASIC DEVICE 1)

·
24F6 AD Il9 FC TERMIN LOA TERMIIC

24F9 EE 24 23

INC RNDSED

24FC 4A

LSR A

24FO 911·F7

BCC TERMIN

24FF AD 01 FC

LOA TERMIO

25112 29 7F

AND 'S7F

25114 80 63 23 TIHTN STA A.HOLD

2597 60

RTS

GET ACIA STATUS BUMP THE RANDOM SEED CHECK RCV READY IF NOT TRY AGAIN INPUT THE BYTE KILL THE UPPER BIT SAVE THE CHARACTER

·
; PATCH3 : ADDED TO X16INP ROUTINE (FROM S24B9)

·
2598 BD 01 CF PATCH3 LDA X16ACI+l,X GET BYTE ,'ROM ACIA

2511B BII F7

BCS TIRTN

PUT IN A.HOLD AND RETURN

)t ; SEROUT : 439 BOARD UART OUTPUT (BASIC DEVICE 3)
;

. . . .
-'

OS65D V3.2 DISASSEMBLY

PAGE: 16

2500 48

SEROUT plIA

SAVE TH~ BYTE TO OUTPUT

250E AD 05 FB

LOA UART+5

GET UART STATUS

2511 10 FB 2513 68

BpL SEROUT+l pLA

($250E) NOT R~ADY. TRY AGAIN RESTORE THE OUTPUT CHARACTER

2514 80 04 FB

STA UART+4

AND OUTpu'r I'r

2517 60

RTS

;

; S~RINp 430 BOARD UART INPUT (BASIC DEVICE 3)

;

2518 AD 05 FB SERINP LOA UAIlT+5.

G~T THE UART STATUS

251B 4A

LSR A

251C 9" FA

BCC SERINP

NOT READY, TRY AGAIN

251E AD 03 FB

LOA UART+3

INPUT A BYTE

2521 80 "7 FB

STA UART+7

ACKNOWLEDGE INPUT

2524 80 63 23

STA A.HOLD

SAVE THE BYTE

·2527 60
·

RTS

; TilE FOLLOWING IS A ·WHO KNOWS· INSTRUCTION

; THIS IS ANOTHER CASE OF HOW TO USE UP COMPUTER TIME

2· 528 20 3F 25

JSR KIRTN

JUMP SUBROUTINE TO RTS

;
; KBINP : POLLED KEYBOARD INPUT ROUTINE (BASIC DEVICE 2)

;
; THIS ROUTINE USES THE SAME ROUTINE AS THE ROM BASED MACHINES. ; UNFORTUNATELY. THE DISK BASIC USES SOME OF THE SAME MEMORY
LOCATIONS AS THE ROUTHIE AT $FD00. INSTEAD OF DOING THE CORRECT ; THING, WRITING A NEW ROUTINE FOR THE DOS, OSI MADE ANOTHER PATCH.
EVERY TIME YOU INPUT FROM THE 540 KEYBOARD YOU MUST FIRST SWAP ; OUT 4 BYTES, CALL THE ROUTINE IN ROM @$FD00. AND THEN RESTORE
THE 4 BYTES. HIGHLY INEFFICIENT!

·
252B 20 44 26 KBINP

JSR SWAP4

SAVE $213-$216

252~ EE 24 23

INC RNOSED

BUMP THE RANDOM SEED

2531 20 ~0 FD

JSR KPOLL

CALL THE ROUTINE IN ROM

2534 F" F8

SEQ KBINP+3

($252E) IF NULL THEN TRY AGAIN

;

; THIS IS ANOTH!::R STHANGE INSTRUCTION. THE PRESENT KEYBOARD ROUTINI>

; WAITS UNTIL A KEY IS PRESSED AND THEN RETURNS IT'S ASCII VALUE.

; A NULL IS NEVER RETURNED FROM THE PRESENT KEYBOARD ROUTINE SO

; IT MAKES NO SENSE TO CHECK FOR IT.

;

2536 80 63 23

2539 2~J 44 26

253C AD 63 23

253F 60

KIIl'rN

STA A.HOLO JSR SWAP4 LOA A.HOLD RTS

SAVE THE INPUT CHARACTER RESTORE $213-$215 GET THE INPUT CHARACTER

;

; PATCH4 USED BY 540 VIDEO DRIVER FOR KEY PRESSED DURING OUTPUT

; (FRml $25~'2)

;

2540 80 25 23 PA'i'CH4 STA KPDO

2543 68

PLA

2544 4C 04 25

JI'IP TIIlTN

SAVE THE CHARACTER SAVE A AND RETUR~

)
)
)
)

OS65D V3.2 DISASSEMBLY

PAGE: 17

-----------------------------------------------------------------------

;

; THIS IS ANLUNDOCUMENTED RE-ENTRY POINT TO THE OS. ON VIDEO SYSTEMS

; WHEN YOU ExIT TO THE MONITOR AND THEN RE-ENTER THE OS AT S2A51, YOU

; WILL NORMALLY HAVE PROBLEMS WITH THE POLLE~·KEYBOARD ROUTINE. BY

; ENTERING AT $2547, THE 4 BYTES FROM S0213-S0216 ARE RESTORED AND THE

; KEYBOARD ROUTINE WILL WORK CORIlECTLY.

,·

2547 20 44 26

JSR SWAP4

SWAP THE 4 BYTES

·254A 4C 51 2A
,

JMP OS65D3

JUMP TO THE OS

; CKINP : CHECK INPUT FOR I~DIRECT FILE COMMANDS AND CONTROL P.

,·

; THE CONTROL P IS A NICE FEATURE THAT WE HAVE NEVER SEEN DOCUMENTED

; BY OSI. UNDER VERSION 3.0 IT WAS A CONTROL T, WHILE UNDER

; VERSI~N,3.2 IT HAS BEEN CHANGED TOA CONTROL p. THIS. CONTROL

; CHARACTER,. WHICH EVER ONE IT IS, PLIP~PLOPS A PLAGTHAT CONTROLS·

I PRfN1'ER OUTPUT.'THE.. YIRST TIME THE CONTROL CHARACTER IS ENCOUNTERED

1 IT TURNS ON THE PRINTER DEVICE AND THE NEXT TIME IT TURNS IT OFF.

1 WARNINGI SOME OF THE SOFTWARE PROVIDED ON THE SYSTEM USES THIS

1 FUNCTION. WHEN USING WP2 IP YOU USE THIS PEATURE DURING OUTPUT

; THE WORD PROCESSOR TURNS IT OPF WHEN DONE. HOWEVER THE ASSEMBLER

I DOES NOT APFECT IT AND IT,REMAINS ON UNTIL THERE IS ANOTHER

; CONTROL (T/P) INPUT FROM THE KEYBOARD. THE PRINTER DEVICE BIT

; IS AT LOCATION S2592.

1

254D C9 5B CKINP CMP 'S5B

254F Dil 11

SNE CKIFND

2551 A9 S9

LDA 'SSI'I

2553 SD 92 23

STA MOTADR+l

2556 A9 00

LDA 'SI'I0

255S SD 91 23

.STA MOTADR

255B AD 22 23

LDA OUTDST

255E 09 10

ORA '$10

2561l D0 31

BNE CKIRTN

2562 C9 5D CKIFND CMP '5D

2564 Dil 13

SNE CKCTLX

2566 2" 46 23

JSR PRINT+3

2569 AD C6 2A

LOA DEFDEV

256C aD 21 23

STA INDST

256F AD 22 23

LDA OUTDST

25n 29. EF

AND 'SEF

2574 SO 22 23

STA OUTDST

2577 A9 5D

LOA 'S50

2579 C9 IS

CKCTLX CMP #$IS

257B Oil I'ID

BNE CKCTLP

257D A9 10

LDA 'S13

257F SD 21 23

STA INDST

2582 21'1 97 24

JSR MODMIN

2585 SO SA 23

STA MI·NADR

2588 Bil I'IC

BCS CKIR'fN+3

25SA C9 10

CKCTLP CMP '$ll'l

25SC DI'I IlA

BNE CKIRTN+5

25SE AD 22 23

LDA OUTDST

(I) START INDIRECT FILE? NO, CONTINUE SET UPPER ADDRESS FOR INDIRECT MODIFY MEMORY OUTPUT ROUTINE SET LOWER ADDRESS FOR INDIRECT MODIFY MEMORY OUTPUT ROUTINE
SET MEMORY OUTPUT ALWAYS BRANCH TO EXIT (l) CLOSE INDIRECT FILE? NO, CONTINUE
PRINT 'J', BYPASS SAVAXY
I/O DEFAULT DEVICE RESET INPUT POINTER GET THE PRESENT OUTPUT DEVICE(S) TURN OFF MEMORY OUTPUT SAVE TilE· OUTPUT DISTRIBUTOR
PUT 'J' BACK IN A
CONTROL X? (LOAD INDIRECT PILE) NO, CONTINUE
SET FOR MEMORY INPUT GOSUB TO SET INPUT HIGH ADDRESS SET INPUT LOW ADDRESS (S2596) ALWAYS BRANCH TO EXIT IS I't CONTROL P (S2598) NO, JUMP TO EXIT GET THE OUTPUT DISTRIBUTOR

....

OS65D V3.2 ~ISASSEMBLY

PAGE: 18

2591 49 08

EOR IS08

2593 llD 22 23 CKIRTN STA OUTDST

2596 A9 00

LOA 'S00

2598 60

RTS

FLIP-FLOP TilE PRINTER OUTPUT SAVE THE DISTHI8UTOR
DENOTES CONTROL CHARACTEIl FOUND

; VIDOUT : 540 VIDEO OUTPUT ROUTINE (BASIC DEVICE 2)

;
; AS DELIVERED WITH THE SYSTEM THE 540 VIDEO DRIVER IS NOTHING

; MORE THAN A "GLASS TELETYPE' WITH NON-DESTRUCTIVE BACKSPACE

; AND FORWARD SPACE. CONSIDERlliG THE· SOFTI'iARE SUPPLIED WITH OTHER

; COMPARABLE SYSTEMS, THIS IS RIDICULOUS. THE ROUTINE WILL NOT EVEN

; ALLOW YOU TO PRINT ANY OF THE OSI GRAPHICS CHARACTERS AND

; FORCES YOU TO "POKE" THEM TO THE SCREEN. ONE CHANGE THAT YOU

; COULD MAKE WOULD BE TO CHANGE THE INSTRUCTIONS FROM S25B9 TO

; S25C0 AND S25Al,S25A2 TO NOP'S. THIS WILL ALLOW YOU TO PRINT SOME

; GRAPHICS CHARACTERS. WARNINGl THIS ROUTINE IS BAD ABOUT USING ; SELF MODIFYING COD~.

;

2599 98

VIOOUT TYA

259A 48

PHA

259B AC 3C 26

LOY LCHAR

259E AD 63 23

LOA A.HOLD

SAVE Y FOR LATEH
GET CHARACTER 'UNDEH' CURSOR GET OUPUT CHARACTER

25Al 29 7f'
"" 25A3 A2
25A5 C9 ~D 25A7 FO SA 25A9 C9 OA 25AB F0 62
25AD C9 08 25AF F" 44 25Bl C9 10 25B3 F0 47 25B5 C9 0C

AND 'SH
LOX **
CMP ,S0D BEQ CR
CMP 'SM SEQ LF
CMP 'S08 IlEQ BSPACE
CMP 'S10 BEQ CNTLP CMP ,S0C

STRIP TO 7 BIT ASCII GET OFFSET IN PHINT LINE IS IT A 'CR' YES, DO IT I F IT A 'LF' YES, DO IT BACKSPACE? (non dest cut H) YES, DO IT IS IT CNTRL P YES, DO IT IS IT CNTRL L (forward space non dest)

25B7 F0 43 2589 C9 20 25B8 30 lA 25BD C9 7B 25BF 10 16 25Cl 90 00 07 25C4 E8

BEQ CNTLP
CMP 'S20 BMI EXIT
CMP 'S78 BPL EXIT S'fA PLINE,X INX

YES, DO IT
IS IT < " SPACE'
YES, INVALID CHAHACTER IS IT> '(' YES, INVALID CHARACTER
OUTPUT CHARACTER TO SCREEN BUMP LINE POINTER

25C5 E0 80 2 5C7 ~'0 42 25C9 BC 00 07 EXI'r 25CC 8C 3C 26

CPX IS80 BEQ SCROLL LOY PLINE,X STY LCHAR

LAST CHARACTEIl ON LINE YES, DO SCROLL GET CHAR. 'UNDEH' NEW CURSOR SAVE IT

2 5C~' A9 SF

LOA ,S5F

GET COHSOR CHAHACTER

2501 90 00 07 2504 8E A4 25

STA PLINE,X STX VOTOFS

OUTPUT IT SAVE OFFSET

2507 68

PLA

RESTORE Y

2508 A8

TAY

2509 A9 01

LOA .SOl

CHECK FOR 'CNTIlL'

25DB 20 3D 26 25DE 50 63 25E0 A9 "8

JSH KEYTST BVS KTRTN LOA 'S08

NO, WE ARE DONE CHECK FOil'S'

OS65D V3.2 DISASSEM~LY

PAGE: 19

-----------------------------------------------------------------------

) 25E2 2" 3D 26 25E5 10 5C 25E7 AD 63 23
25EA 48 25EB 20 28 25

JSR KEYTST BPL KTRTN LOA A.HOLD PHA JSR KBINP

NO, WE ARE DONE RESTORE OUTPUT CHARACTER AND SAVE INPUT FROM POLLED KEYBOARD

25EE C9 13

CMP 1$13

CNTRL S?

25F" F0 F9

BEQ *-5

25F2 4C 40 25

JMP PATCH4

25F5 98

BSPACE 'rYA

25F6 9D Il0 D7

STA PLINE,X

B" 25F9 CA
25FA CD 25FC 98

DEX BCS EXIT CNTLP TYA

25FD 90 0" D7

STA PLINE,X

B" 26"" E8

26"1

C6

INX BCS EXIT

2603 98

CR

TYA

26"4 9D Illl D7

STA PLINE,X

0" 26"7 A2 40

2609

BE

LOX '$40 BNE EXIT

0" 260B A2 40

260D

04

260F 98

SCROLL LDX '$40

8NE *+6

LF

TYA

261" 9D "0 D7

STA PLINE,X

2613 8E 39 26 ) 2616 A9 21l

STX VLOSAV LDA i$20

2618 A2 81l

LOX '$80

261A 9D Il0 D7

STA PLINE,X

($25EB) YES, KEEP LOOPING EXIT THE ROUTINE RESTORE CHAR. 'UNDER' CURSOR PRINT IT BUMP LINE POINTER BACK 1 GO BACK RESTORE CHAR. 'UNDER' CURSOR
BUMP LINE POINTER EXIT THIS HOUTINE RESTORE CHAR. 'UNDEH' CURSOR
RESET LINE POINTER JUMP TO EXIT RESET LINE POINTER ($2613) JUMP A LITTLE RESTORE CHAR. 'UNDER' CURSOH
SAVE LINE OFFSET SET TO CLEAR LOWER LINE SE'r O~'FSET OUTPUT IT

261D E8

INX

BUMP THE OFFSET

261E Oil FA
262" AO CF 2622 C8

SNE *-4
LDY '$C~' sr;TNXT INY

($261A) LOOP UNTIL DONE GET SET TO SCROLL
FIRST TIME THROUGH Y = $D0

2623 8C 28 26

STY VLPI

ADJUST LINE POINTER

2626 8C 2E 26 2629 BD 40 Oil- MOVE 262C 9D Il0 D0

STY VLP2 LDA *·,X STA **,X

ADJUST LINE POINTER MOVE UP 1 LINE AT A TIME

F" 262~' E8

263"

F0

2632 10 F5

INX BEQ SETNXT 8PL MOVE

BUMP THE LINE POINTEH IF MOVED LINE, SET FOR NEXT KEEP LOOPING

2634 Cil D7
2636 9" Fl 2638 A2 Oil 263A DO 80
263C
,

LCHAR

CPY '$07 BCC MOVE
LDX **
liNE EXIT
=*

HAVE WE DONE THEM ALL NO, KEEP-LOOPING RESTORE LINE OFFSET
JUMP TO EXIT CHARACTER 'UNDER' CURSOR

; I< EYT~T 'I'F:!"T POLLED KEYBOIIHD FOR KEYDOWN I N HOW I N ACCU~I

;
263D 8D 0" DF KEYTST STA KPOWr

ENABLE THE ROI';

2 64 ~l 2C 00 OF

~IT KPORT

) ~643 60

KTHTN IITS

CHECK FOR KEY DOWN

; SWAN PATCH ADDED TO ENABLE USE OF POLLED KEY80ARD ROUTINE ; @$FD00. SWAPS OUT 4 BYTES FROM $213-$216 TO $2657-$265A

OS650 V3.2 DISASSEMBLY

PAGE: 20

;

2644 A2 03

SWAP4 LOX 'S"3

2646 BO 13 "2

LOA SWAP4A,X

2649 BC 57 26

LOY SWAP4B,X

264C 90 57 26

STA SWAP4B,X

264F 98

TYA

2651l 90 13 e2

STA SWAP4A,X

2653 CA

OEX

2654 Ie F" 2656 61l

BPL SWAP4+2 RTS

;
2657

SWAP4B = *+4

SET INDEX FOR 4 BYTES SWAP A BYTE
($2646) IF ANOTHER CONTINUE SWAP AREA FOH $9213-$0216

OS65D V3.2 DISASSEMBLY

PAGE: 21

)
; DISK DRIVER ROUTINES AND STORAGE

;
265B 20 265C ill 265D 67 265E ill 265F 07 266il ilil 2661 IHI 2662 ilil
,,

,BYTE $2il
DSKDR = * TKNUM = *
SECTNl'l = *
PGCN'I' = * LAMB = *
HAMB = *
TRKNM = *

(UNKNOWN USAGE, IF ANY) PRESENT DISK DRIVE CURRENT TRACK NUMBER PRESENT SECTOR NUMBER PAGE COUNT LOW ADDRESS OF MEMORY BLOCK HI ADDRESS OF MEMORY BLOCK HEX TRACK NUMBER NOT USED, SEE NOTE @ $26A6

; HOME : HOMES HEAD TO 'fHACK il ON CURRENT DISK DRIVE

;

2663 2il 8A 26 HOME JSR STEPOT

2666 2il 78 26

JSR TENMS

2669 8C 50 26

STY TKNUM

266C A9 02

HOLOOP LOA '$il2

266E 2C ilil Cil

BIT FLOPIN

2671 FlJ il5

BEO TENMS

2673 20 83 26

,ISH STEPIN

2676 Fil F4

BEO HOLOOP

STEP HEAD OUT DELAY lil MS SET TRACK' TO il CHECK FOR TRACK il
DELAY 1ilMS AND HETUIlN IF 1'\< 0 s'rEP HEAD IN LOOP BACK AND THY AGAIN

;
; TENMS : 1il MS DELAY, ACTUALLY @ 1MHZ THE DELAY IS CLOSER TO 11 MS

) 2678 A2 0C 267A M 31

TENMS LOX '$lJC .".IN\'r.'-t.-- ~ 1"\\.\1LDY '$ 31 / ' (,,} - LOOP COUNT FOH DE LAY

267C 2il Bil 27

JSH DELAY

DO 1 MS DELAY

267F CA

DEX

2680 00 F8

BNE TENMS+2

(S267A) NOT DONE, KEEP ON

2682 Gil

HTS

;

; STEP IN : STEP TOWAIlDS THACK II

; MOVES !IE:AD ONE THACK
,

2683 AD 02 C0 STEPIN LOA FLO POT

TUHN ON STEPIN BIT

2686 09 04

ORA #$lJ4

2688 Oil 05

IlNE STEP

GO STEP IN

;

; STEPOT : STEP HEAD AWAY FROM TRACK lJ

; MOVES HEAD ONE THACK.
,

268A A9 FB

STEPOT LOA 'SFB

TUHN OFF STEP IN BIT

268C 20 02 Cil

AND ~'LOPOT

268F 80 02 C0 S'fEP STA FLOPOT

.2692 20 82 26

JSR STEPIN-1

($2682) KILLS 12 CLOCK CYCLES

2695 29 F7

AND '$F7

'~URN OFF STEP BIT

2697 2lJ 19 27

JSH SETFLO

STA @ $Cil02 AND RETURN

269A 20 06 27

JSH DELAY+6

($2706) KILL 14 CYCLES

2690 09 08 ) 269F 211 19 27

ORA '$08 JSR SETFLO

TURN ON STEP HI'f STA @ SC002 AND RETURN

26A2 A6 EF

LOX STEPRT

GET STEP RATE

26M 00 04

8NE TENl'lS+2

($267A) DELAY STEP RATE MS

OS6SD V3.2 DISASSEMBLY

PAGE: 22

) -----------------------------------------------------------------------

;
; (ROUTINE @ $26A6) THIS ROUTINE CONVERTS A HEX TRACK NUMBER
; AT $2662 TO BCD AND STORES IT AT $EE, THEN FALLS INTO THE SET ; TRACK ROUTINE. THE ROUTINE IS NOT USED BY THE OS, SO EITHER ; IT IS USED BY BASIC, OR IT'S LEFT OVER FROM AN OLDER VERSION.

;

26A6 AD 62 25 CNVHTN LOA TRKNM

26A9 38

SEC

26AA A2 FF

LOX '$FF

26AC E8

INX

26AD E9 0A

SBC ue

26AF Be FB

BCS *-3

26Bl 69 OA

ADC HO

26B3 85 EE

STA 'fKNHLD

26SB 8A

TXA

26B6 eA

ASL A

26B7 eA

ASL A

26B8 eA

ASL A

26B9 IlA

ASL A

26BA es EE

ORA TKNHLD

IN IT X TO COUNT Ill'S
SUBTRACT Ie FROM TRACK' ($26AC) IF >=0 BUMP X AND DO AGAIN ADD BACK LAST 10 FOR REMAINDER SAVE REMAINDEH GET NUMBER OF TENS SHIFT TO HIGH NIBBLE
COMBINE WITH REMAINDER

;· SETTK : CHECK FOR VALID TRACK NUMBER AND MOVE HEAD THERE
; TRACK NUMBER IN ACCUMULATOR

;

26BC 85 EE SETTK STA 'fKNHLD

SAVE TRACK NUMBER

26BE 48

PHA

26BF 2C 9E 26

BIT $2691'

CHECK FOR 8 BIT

26C2 Fe 114

BEQ ERR8-2

($26CB) IF NOT, CONTINUE

26C4 29 116

AND ,se6

CHECK FOR 4 BIT OR 2 BIT

26C6 DIl 05

BNE ERR8

YES, LOW NIBBLE> 9 : ERROR 8

26C8 68 26C9 C9 77

PLA CMP 'S77

RESTOHE TRACK NUMBER
TRACK < 77?

26CB 90 04

BCC MOVEIlD

YES, CONTINUE

26CD A9 e8

ERR8 LD,A ,se8

ERROR 8, BAD TRACK NUMBER

26CF De IlD

BNE ERR5+2

($26DE) JUMP TO ERROR HANDLER

2601 AD SC 26 MOVERD LOA DSKDR

GET DISK DRIVE

2604 29 el

AND ,sel

TOP DRIVE=I. BOTTOM DRIVE=B

2606 AS

TAY

26D7 211 01\ 29

JSR CKRDY

SEE IF DRIVE IS READY

26DA ge 05

BCC CKTK

YES, CONTINUE

26DC A9 06

ERR6 LDA '$06

DRIVE NOT READY : ERROR 6

26DE 4C 4B 2A

J~IP ERRENT

JUMP TO OS ERROR ROUTINE

26El AS EE CKTK LOA TKNHLD

RETRIEVE THACK NUMBER

26E3 CD 50 26

CMP TKNUM

SAME AS PRESENT THACK NUMBER?

26,E6 Fe 20

BEQ STCCNT~~7~)YES, DON'T MOVE THE HEAD

26E8 Be 07

BCS *+9

($26Fl) BHANCH IF > PRESENT TRACK

26EA 211 83 26

JSR STEP IN

STEP HEAD IN ONE TRACK

26ED A9 99

LDA 1$99

SET TO SUBTRACT 1 FROM TKNUN

26i::P 90 114

i>CC *+6

($26FS) JUMP

26Fl 2e 8A 26

JSR STEPOT

MOVE HEAD OUT 1 TRACK

26F4 8A

TXA

X=1 : SET TO ADD 1 TO TKNUN

26FS 1"3

SED

26F6 6D 50 26

ADC TKNUM

ADD OR SUBTRACT 1 FROM TKNUM

OS55D V3.2 DISASSEMBLY

PAGE: 23

) -----------------------------------------------------------------------

26F9 8D 5D 26 26FC D8 26FD 4C E1 26
,

STA TKNUM CLD JMP CKTK

AND SAVE GO SEE IF WE ARE DONE

; DELAY : DELAY=18*Y+14 CYCLES (DELAY=896us IF Y=$C1)

;
2700 20 9B 23 DELAY 2703 8B 2704 D0 FA 2706 EA 2707 60

JSR COMINC+6 DEY 8NE DELAY NOP RTS

($239B) BNE AND RTS : 14 CYCLES IF NOT DONE DO IT AGAIN

;
; SET TRACK CODE CONTINUED FROM $26E6

;

2708 C9 43

STCCNT CMP '$43

270A AD 02 C0

LDA FLOPOT

2711D 29 SF

AND 'SBF

270F A0 00

LDY 'SUB

2711 EA

NOP

2712 B0 05

BCS SETFLO

2714 A9 40

LDA '$40

2716 0D 112 CII

ORA FLOPOT

2719 8D 02 CII SETFLO STA FLOPOT

) ~71C 60

RTS

ARE WE PAST TRACK 42
RESET LOW CURRENT BIT WHO KNOWS?
IF PAST TRACK 42, CONTINUE
(PIA2) SET LOW CURRENT 81'1' STORE I'r

; WAITIH WAIT FOR IND~;X HOLE

;
271D AD 110 CII WAITIH LDA FLOPIN

GET DISK STATUS

2720 30 F8 2722 AD 00 CII 2725 10 FB 2727 60
,

BMI \~AI'I'IIi LDA FLOPIN
8PL *-3 RTS

IF BIT 7 ON, GO TEST AGAIN GET DISK STATUS ($2722) IF BIT 7 OFF, TRY AGAIN

; LDHDWI LOAD HEAD AND WAIT ~'OR INDEX HOLE

,

2728 20 54 27 LDHDWI JSR LDHEAD

LOAD HEAD

;
; RSACIA : RESET DISK ACIA, WAIT FOR INDEX HOLE

;

2728 29' ID 27 RSACIA JSR WAITIH

272E A9 03

LDA '503

2730 8D 10 C0

STA ACIA

2733 A9 58

LOA '$58

2735 80 10 CII

STA ACIA

2738 60

RTS

WAIT FOR,THE INDEX HOLE
MASTER RESET FOR ACIA SET FOR /1, RTS=l, NO INTERUPT

;
; EXAMCN
,

EXAM COMMAND CONTINUED

FIRST SECTION AT $2B37

2739 20 28 27 EXAMCN JSR LDHDWI

) 273C A9 Oil C0

LDA FLOP IN

273F 10 20

BPL UNLDHD

2741 AD III CIl

LOA ACIA

2744 4A

LSR A

LOAD HEAD, WAIT FOR INDEX HOLE GET TIiE STATUS IF AT INDEX IiOLE, UNLOAD HEAD GET ACIA STATUS

OS650 V3.2 UISASSEMBLY

PAGE: 24

) 2745 90 F5 2747 AD 11 Cil 274A 91 FE 274C C8 274D Dil ED 274F E6 FF 2751 4C 3C 27

BCC t;XAMCN+3 LOA ACIAIO STA (MEHLO) ,Y INY BNE EXAMCN+3 INC MEMHI JMP EXAMCN+3

($273C) NOT READY, WAIT fOR INDEX READ A BYTE STORE IT IN MEMORY
($273C) IF MORE IN THIS PAGE -BUMP MEMORY ADDRESS ($273C) CONTINUE

·
; LOHEAD : LOAD HEAD TO DISK
,

2754 A9 7F

LDHEAD LDA 1$7F

2756 2D 02 C0

AND FLOPOT

2759 8D 02 Cil

STA FLOPOT

275C A2 28

LDX 1$28

275E 4C 7A 26

JMP Tt;NMS+2

;

; UNLDHD : UNLOAD HEAD FROM DISK

SET BIT 7 'fO 0 SET FOR 32 ms DELAY

;

2761 A9 80

UNLDHD LDA 1$811

2763 IlD 02 Cil

ORA FLOPOT

2766 Dil F1

liNE LUHEAD+5

SET BIT 7 TO 1 ($2759) JUMP

;

; INITAL : INITIALIZE ALL TRACKS (EXCEPT ZERO) ON CURRENT DRIVE

·

)

2768 A9 76 276A 85 E5

INI'fAL LDA 1$76 STA HST'fK

276C 21l 63 26 276F 21l 83 2C

JSR HOMI:: JSR INCTKN

2772 20 7D 27

JSR HlITTK

2775 AD 5D 26

LOA TKNUM

2778 C9 76

CMP 1$76

277A Dil F3

BNE INITAL+7

277C 61l

RTS

;

; INITTK : INITIALIZE TRACK

SET HIGHEST TRACK NUMBER
1I0ME THE HEAD INCRI::MENT TRACK INITIALIZE THIS TRACK GET CURRENT TRACK NUMBER AT 76 YET? ($276F) NO, KEEP ON

· 2770 A9 112

INITTK LDA '$02

277F 2C Illl Cil

2782 Oil "4 2784 A9 03

ERR3

HIT FLOPIN
BNE *.. 6
LOA 1$03

2786 D0 09

BNE ERR4+2

2788 A9 2" 278A 2C 110 Cil

LOA 1$20 BIT FLOPIN

2780 D0 115

BNE I::RR4+5

278F A9 114

I::Rll4 LOA 1$04

2791 4C 4B 2A

J~IP ERRENT

2794 21l 28 27

JSR LOHDWI

2797 A9 FC

LOA I$FC

2799 20 "2 Cil

AND FLOPOT

279C 80 "2 Cil

STA .FLOPOT

279F A2 U1

LOX 1$01

27A1 20 7A 26

JSR TENMS+2

27M A2 43

LOX 1$43

CHECK FOR TRACK ~ ($2788) NO, CONTINUE DO ERROR 13 JUMP TO ERROR HANDLER
CHECK FOR WRITE PROTECT ($2794) NO, CONTINUE DO ERROR #4 JUMP TO ERROl< HANDLER LOAD HEAD AND WAIT FOR INDEX GET SET TO TURN ON WRITE ENABU: AND F.:RASI:: ENABLE
DO 1 ms DELAY
'fRACK START CODE BYTE1

OSGSD V3.2 DISASSEMBLY

PAGE: 25

-----------------------------------------------------------------------

) 27A6 2e C2 27 27A9 A2 57 27AB 2e C2 27 27AE AE 50 26 27Bl 20 C2 27

JSH DKWTX LOX '$57 JSR DKWTX LOX TKNUM JSR DKWTX

2784 A2 58 2786 2e C2 27
27119 AD ll0 ce

LOX '$58 JSR DKWTX
LOA FLOPIN

27BC 30 FB

BMI *-3

278E A9 83 27Ce De Al

LOA '$83 8NE UNLDHD+2

;
; DKWTX : WRITE X TO DISK
,

27C2 AD Ie CIl DKWTX LOA ACIA

27C5 4A

LSR A

27C6 4A

LSR A

27C7 90 F9

BCC DKWTX

27C9 8E 11 C0

STX ACIAIO

27CC 60

RTS

WRITE IT THACK STAin CODE BYTE2 WRITF; IT GET THE TRACK NUMBER WRITE IT TRACK TYPE CODE WRITE I'r WAIT FOR INDEX, ERASE IS ON ($27B9) NOT YET, TRY AGAIN TURN OFF WRITE ENABLE, ERASE ($2763) ENABLE, UNLOAD HEAD & RET
GET ACIA STATUS
NOT READY, TRY AGAIN WRITE X TO DISK

; DSKBYT GET BYTE FROM DISK

;
27CD AD 10 CIl DSKBYT LOA ACIA

GET ACIA STATUS

)

2700 4A 2701 90 FA

2703 AD 11 ce

LSR A BCC DSKBYT LOA ACIAIO

NOT HEADY, TRY AGAIN READ THE BYTE

2706 60

RTS

,

; THE FOLLOWING IS NOT USED BY THE OS. MAY BE USED BY BASIC

;
2707 AD 60 26 27DA 85 ~'E

LOA LAMB STA MEMLO

GET LOW ADDRESS OF MEMORY BLOCK SAVE AT MEMORY ADDRESS

27DC AD 61 26

LOA HAMB

GET HIGH ADDRESS

27DF 85 FF

STA MEMHI

AND SAVE

;
; DSKWRT WRITE SECTOR TO DISK ROUTINE

;
; TO USE 'fHIS ROUTINE THE HEAD MUS'f ALREADY BE POSITIONED 'ro THE

; PROPER TRACK, THE NUMBER OF PAGES TO WRITF; IN PGCNT ($265F), AND

; THE SECTOR NUMBEH TO WRITE IN SECTNM ($265E). STARTING

; ADDRESS OF DATA MUST BE IN MEMLO,MEMHI ($FE,$n').
,

27El AD SF 26 DSKWRT LDA PGCNT

27E4 F0 e2

BEQ ERRB

27E6 10 04

BPL *+6

GET NUMBER OF PAGES IF 0 DO ERROR B (S27EC) IF BIT 7 IS ON DO E:HHOR B

27E8 A9 "B

ERRB

27EA 00 AS

27EC C9 liE

27E£ III F8

) 27F0 A9 02

27F2 2C 00 C0

27F5 FU OF

LDA '$0B BNE ERH4+2
CMP 1$0E BPL ERRB
LOA '$112 BIT FLOPIN
SEQ DSKBYT+9

ERROR B ROUTINE ($2791) JUMP IF>O, THEN ERROR B
TEST FOR TRACK U
($2706) IF TRACK U THEN RETURN

1.

OS65D V3.2 DISASSEMBLY

PAGk:: 26

----------------------------------------------------------------------- ~

)

27Jn 4A

LSR A

27F8 85 FA

STA SCTLEN

PUT 1 IN SECTOR LENGTH

27FA A9 20

LDA 1$20

TEST FO~ WRITE PROTECT

27FC 2C 00 C0

BIT l'LOPIN

27FF D0 04

BNE *+6

( $2805) NOT WRITE PROTk:CT, CONTrl'lUE

2801 A9 04

LDA 1$04

WRITE PROTECT IS Ol'l, ERROR 4

2803 DO E5

BNE DSKWRT+8

($27EA) JUMP

2805 A9 01

LDA 1$01

2807 85 F6

STA WRTRTY

SET RETRY COUNT

2809 A9 03

REWRT LDA 1$03

281lB 85 F8

STA RDRTYN

HEAD VERIFICATIOI'l RETRY COUNT

2800 20 C4 28 2811'1 20 9F 28

JSR SETSCT JSR DLYFA

POSITION TO STAHT OF SECTOR
DO 800us DELAY (SCTLEI'l = 1)

2813 A9 FE

LOA I$FE

SET WRITE ENABLE

2815 2D 02 e0

AND FLOPo'r

2818 80 112 C0

STA FLOPOT

281B A2 02

LOX 1$02

DELAY 21116US

281D 20 A2 28

JSR HUNDUS

2820 A9 FD

LDA '$FD

TURN ON ERASE k:NAllLE

2822 2D 02 C0

AND FLOPOT

2825 8D 02 e0

STA FLOPOT

2828 20 9F 28

JSR o Lyt'A

ANOTHER 800us DELAY

2828 A2 76

LDX '$76

282D 21'1 C2 27

JSR DKWTX

WRITE SECTOH S'l'Awr CODE

)

2830 2833

AE 20

5E C2

26 27

LDX SECTNM JSR DKWTX

GET SECTOR NUMBER WRITE IT

2836 AE SF 26

LDX PGCNT

GET THE PAGE COUNT

2839 86 FD

STX TS2

SAVE IT

283B 20 C2 27

JSR DKWTX

WRITE PAGE COUNT

283E A0 00

LDY 1$00

SET INDEX

2840 III FE

WRTPG LOA MEMLO,Y

WRITE PAGE OF !"\EMORY 'ro DISK

2842 AA

TAX

2843 21'1 C2 27

JSR DKWTX

WHITE TO DISK

2846 C8

INY

2847 01'1 F7

BNE WRTjG

($2840) No'r DOI'lE, LOOP BACK

2849 E6 FF

INC MEMHI

BUMP HIGH MEMOHY ADDRESS

284B C6 FD

DEC 'rS2

DROP PAGE COUNT

284D D0 F1

BNE WHTPG

IF ANOTHER PAGE THEN CONTINUE

284F A2 47

LDX 1$47

WRITE ' G' TO DISK

;

(SECTOR START CODE)

2851 20 C2 27

JSR DK:oITX

2854 A2 53

LDX '$53

WRITE ' S' TO DISK

;

(SECTOR START CODE)

2856 21l C2 27

JSR DKWTX

2859 AD SF 26

LDA PGCNT

GET PAGt; COUNT

285C 0A

ASL A

MULTIPLY BY 2

285D 85 FD

STA TS2

SAVE IT

285F 1'1 A 2860 65 FD

ASL A ADC TS2

MULTIPLY BY 2 AGAII~
ADD TOGETHER, = 6*PAGE COUNT

)

2862 AA 2863 20 A2

28

TAX JSR HUNDUS

101'1us DELAY*PAGE COUNT

2866 AD 1'12 C0

LDA FLOPOT

2869 09 01

ORA 1$01

'fUHN OFF WHITE ENABLE

05650 V3.2 DISASSEMBLY

PIIGE: 27

) 286l:! 3D 02 C0

STA FLOPOT

286E A2 05

LOX 1$05

2870 20 A2 28

JSR HUNDUS

2873 A9 02

LOA I$Il2

2875 21l 16 27

JSIl SETFLO-3

2878 18

RTYCMP CLC

2879 8A 287A 65 FF

TXII IIDC MEMHI

287C 38

SEC

;
2870 ED SF 26 2881l 85 FF

SBC PGCN'I' STII /'lEMHI

2882 20 07 29

JSR RDCDSK

5IJIJus DELAY
($2716) TURN OFF ERASE ENABLE
liDO X TO HIGH MEMORY ADDRESS
x-a FIIlST TIME WE COMPARE
X-I OF SECTORS NOT COMPARED IF THIS IS A RETRY RESE'I' HIGH MEMORY ADDRESS
COMPARE DATA WRITTEN TO DISK

;

; WARNING! IF WRITE STARTED FROM PAGE 0. ABOVE ROUTINE WILL

; READ FROM DISK INSTEAD OF COMPARE.

··

2885 B0 28

BCS DKBT9-I

($28AF) NO FAULT SO RETURN

2887 C6 F8

DEC RDRTYN

DROP COMPAnE HETRY COUNT

2889 Dil ED

BNE RTYCMP

IF NOT lJ THEN TRY AGAIN

288B C6 F6

DEC WRTRTY

DROP WRITE RETRY COUNT

288D 30 0C

BMI ERR2

IF DONE THEN ERHOR '2

288F 8A

TXA

2891l 65 FF

ADC MEMHI

RESET MEMOHY ADDRESS

2892 38

SEC

) 2893 ED SF 26

SBC PGCNT

2896 85 FF

STA MEMHI

2898 4C 09 28

JMP REWRT

WRITE TO DISK AGIlIN

289B A9 02

ERR2 LDA '$02

ERROR #2

289D Oil 22

BNE ERR9+2

($28Cl) ALWAYS JUMP

;

; DLYFA : 81l0us DELAY TIMES VALUE IN SCTLEN ($FA)

,

289F 20 55 29 DLYFA JSR DLYFAI

GO COMPUTE VALUE FOR X

·; HUNDUS : APPROXIMATELY 100us DELAY PER X

;

28A2 AD 7B 26 HUNDUS LOA NMBZ

28A5 24 00

BIT PAGE0

28A7 38

SEC

281\8 E9· 05

Sl:!C 1$05

28M Bil F9

BCS HUNOUS+3

28AC CA

DEX

28AD D0 F3

BNE HUNDUS

28AF 60

RTS

GET DELAY COUNT KILT. 3 CYCLES
SUI3THAC'I' 5 FROM DELAY COUNT
($28A5) IF )-r. THEN DO AGAIN
DO X TIMES

;

; DKBT9 : GET BYTE FHUM DISK, ERROH 19 IF INDEX HOLE
,

28B0 AD 00 C0 DKBT9 LOll FLOPIN

GET DISK STIITUS

28B3 10 0A

8PL ERR9

IF INDEX HOLE THEN EHROJ; ~9

~ ') WARNING: $2884 IS MODIFIED BY THE D9 COMMAND 0 $2823

;

OS65D V3.2 DISASSEMBLY

PAGE: 28

-----------------------------------------------------------------------

) 28B5 AD III Cil

28B8 4A

28B9 90 F5

28BB AD 11 Cil

28BE 61l

28BF A9 119

ERR9

28Cl 4C 4B 2A

LOA ACIA LSR A BCC DKBT9 LOA ACIAIO RTS LOA 1$1l9 JMP ERRENT

CHECK ACIA STATUS
NOT READY, KEEP LOOKING GET BYTE FROM DISK
ERROR 19, CAN'T FIND SECTOR

;· SETSCT : SETUP FOR SECTOR IN SECTNM

··
28C4

A9

05

SETSCT LOA 1$05

28C6 85 F5

STA SCTRTY

SET RETRY COUNT

28C8 20 2B 27

JSR RSACIA

WAIT FOR INDEX HOLE

28CB 21l Bil 28

JSR DKBT9 "'-

GET FIRST BYTE FROM DISK

28CE C9 43

CMP .'C '-I J

CHECK FOR TRACK START CODE

28DIl Oil F9

BNE *-5

($28CB) IF.NOT 'C' TRY AGAIN

2802 21l BIl 28 2805 C9 57

-JSR.DKBT9
CMP .·'W S.,

GET SECOND BYTE FROM DIS~ CHECK FOR TRACK START CODE

2807 00 F5

BNE *-9

($28CE) IF NOT 'W' THEN CHECK FOR 'C'

2809 20 BIl 28

JSR DKBT9

GET ANOTHER BYTE FROM DISK

28DC 45 EE

EOR TKNHLD

IS THIS THE RIGHT TRACK?

28DE F0 IlB

BEQ SSOK

YES, CONTINUE

28E0 A9 Il5

ERR5 LDA 1$05

SET FOR ERROR IS, SEEK ERROR

28E2 C6 F5

DEC SCTRTY

BUT FIRST CHECK RETRY COUNT

28E4 19 61

BPL SEEKRT

FLIP SEEK RATE AND TRY AGAIN

) 28E6 CD A9 llA ERRA CMP $llAA9

;
; THE INSTRUCTION AT $28E6 IS AN OLD ASSEMBLER PROGRAMMING TRICK ; THAT SHOULD NORMALLY BE AVOIDED BECAUSE OF THE DANGERS INVOLVED.
; THIS IS A PRIME EXAMPLE OF MISUSE. THE TRICK IS TO TAKE A TWO ; BYTE INSTRUCTION; IN THIS CASE, LDA 1$IlA (A9 IlA); AND ADD A BYTE ; TO THE FRONT WHICH CREATES A "HARMLESS" THREE BYTE INSTRUCTION. ; THEN YOU CAN FALL THROUGH FROM PRECEEDING CODE WITH NO EFFECT, OR
; BRANCH TO THE SECOND BYTE OF THIS INSTRUCTION FOR A DIFFERENT ; EFFECT, AS IS' DONE AT $28FC. T~IS ALLOWS REPORTING AN ERROR 15 ; ON FALL THROUGH, OR ERRQR A WHEN ENTERING AT $28E7. THE RATIONALE
; FOR USING THIS TRICK IS TO SAVE ONE LOUSY BYTE OF CODE. THE DANGER ; IS THAT QUITE OFTEN THE "HARMLESS" THREE BYTE INSTRUCTION CAN CAUSE ; CONSIDERABLE HARM. SUCH IS THE CASE HERE. SINCE OSI CHOSE TO USE A ; CMP INSTRUCTION, IF THE VALUE AT $0AA9 IS EQUAL TO 5, THE TEST AT
; $28E9 WILL FAIL AND THE PROGRAM WILL FALL INTO THE CODE USED WHEN ; THERE IS _NO SEEK ERROR. ALSO $F9 WILL BE INITIALIZED TO 5 INSTEAD ; OF Il. ANOTHER ERROR, SUCH AS ERROR A, WILL PROBABLY OCCUR, BUT TO
US PROBABLY IS NOT NEARLY GOOD ENOUGH.

;

28E9 00 D6

28EB 85 F9

SSOK

28ED 20 B0 28

28Ffl AD 51:: 26

28F3 E9 III

28F5 t"" 0F

28F7 48

28F8 20 98 29

BNE ERR9+2 STA SCTBYP
JSR DKBT9 LOA SECTNM
SBC I$G!Il BEQ RDCDSK-l PHA JSR BPSECT

($28Cl) GO REPORT ERROR 5 (OR A) SET SECTORS BYPASSED TO Il GET FIRST BYTE FROM SECTOR GET SECTOR NUMBER SUBTRACT 1 ($2906) RETURN IF WANT SECTOR 1 SAVE SECTORS TO SKIP SKIP A SECTOR

,

---~ ..._-.- . _ - - - - - - - - - - -

I

.

OS65D V3.2 DISASSEMBLY

PAGE: 29

) 28FB 68 28FC 90 E9

PLA BCC S28E7

GET BACK SECTORS TO SKIP IF CARRY CLEAR, ERROR A

28FE C5 F9

CMP SCTBYP

HAVE WE SKIPPED ENOUGH?

2900 00 F5

BNE *-9

(S28F7) NO, CONTINUE

2902 C5 FB

CMP SCTNUM

SECTOR NUMBER JUST SKIPPED

;

SET @S29A4

2904 00 El 29~6 60

BNE S28E7 RTS

IF NOT RIGHT ONE, ERROR A

;

; ROCOSK : READ (OR COMPARE) FROM DISK, THIS TRACK INTO MEMORY @(SFE)

;
29117 48

RDCDSK Pill'.

,SAVE READ/COMPARE FLAG

;

( Il=READ)

2908 20 C4 28

JSR SETSCT

POSITION HEAD

290B 211 BII 28

JSR DKBT9

GET BYTE FROM DISK

290E C9 76

CMP IS76

IS IT A SECTOR START CODE?

2910 Oil F9

BNE *-5

(S290B) NO, TRY AGAIN

2912 20 B0 28

JSR DKBT9

GET ANOTHER BYTE

2915 CD 5E 26

CMP SECTNM

IS THIS THE RIGHT SECTOR?

2918 FIl 03

BEQ *+5

(S291D) YES, CONTINUE

291A 68

PLA

IF NOT, RETURN WITH CARRY

;

CLEAR AS FAULT FLAG

291B 18

SETFF' CLC

291C 60

RTS

;

) 2910 20 B0 28

JSR DKBT9

GET SECTOR LENGTH FROM DISK

2920 AA

TAX

PUT PAGE COUNT IN X

2921 80 5F 26

STA PGCNT

STORE SECTOR LENGTH

2924 All Il0

LOY ISIlil

SET Y FOR INDEXING

2926 68

PLA

RESTORE READ/COMPARE FLAG

2927 69 FE 2929 A9 III

ADC ISFE RDCONT LOA IS01

FORCE CARRY FLAG IF COMPARE

292B 2C III Cil

BI'f ACIA

CHECK ACIA READY AND PARITY

292E F0 FB

BEQ *-3

(S292B) IF NOT, TRY AGAIN

2930 AD 11 C0

LOA ACIAIO

GET BYTE FROM ACIA.

2933 70 E6

BVS SETFF

PARITY ERROR, RETURN

2935 90 04

BCC *+6

(S293B) CARRY CLEAR, THIS IS A READ

2937 01 FE

CMP (MEMLO), Y COMPARE TO BYTE IN MEMORY

2939 00 Ell

BNE SETFF

IF NOT THE SAME, ERROR

293B 91 FE

STA (1'1 EMLO) ,Y STORE BYTE IN MEMORY

2930 C8'

INY

BUMP THE· INDEX

293E Oil E9

BNE HOCONT

IF MORE THIS PAGE, CONTINUE

2940 E6 FF

INC MEMHI

SET ADDRESS FOR NEXT PAGE

2942 CA

DEX

DROP PAGE COUNT

2943 Oil E4

BNE HDCONT

IF ANOTHER PAGE, CONTINUE

2945 38

SEC

SET CARRY AS NO FAULT FLAG

2946 fiO

RTS

; SEEKR'I' SEEK RETHY MOUTINE FOR ADAPTIVE STEP RATE

) 2947 A5 EF 2949 49 OE 2948 85 EF

SEEKHT LDA STEPRT
EOR 3SIlE STA STEPRT

GET CURHENT STEP HATE
CHANGE 8 TO 6 Oil 6 TO 8 STORE NEW STEP RATE

OS65D V3.2 DISASSEMBLY

PAGE: 30

294D 20 63 26
2950 20 D1 26 2953 4C C8 28

JSH HOME JSR MOVEIH) JMP SETSCT+4

MOVE HEAD TO TRACK 0
GO MOVE HEAD TO PROPER TRACK AND TRY FOR SECTOR AGAIN

;
; DLYFA1 : COMPUTE 8 TIMES VALUE IN SCTLEN. USED BY DLYFA @ $289F

;
2956 AS FA

DLYFA1 LDA SCTLEN

GET SECTOR LENGTH

2958 0A 2959 0A 295A 0A

ASL A ASL A ASL A

MULTIPLY BY EIGHT

295B AA

TAX

PUT IN X (FOR HUNDUS)

295C 60

RTS

;

; SET MEMORY ADDRESS POINTER TO DISK BUFFER ADDRESS

·; NOT USED BY OS.
,
295D AD 60 26

LDA LAMB

2960 85 FE 2962 AD 61 26

STA MEMLO LDA HAMB

2965 85 FF

STA MEMIII

,·

; READDK : READ DISK, THIS TRACK INTO MEMORY @($FE)

,·

2967 A9 03

READDK LDA 0 $ 0 3

SET RETRY COUNT \vHEN HEAD MOVED

2969 85 F7

STA RDRTYM

296B A9 07

LDA #$07

SET RETRY COUNT WIO MOVING HEAD

296D 85 F8

STA RDRTYN

296F A9 00

RTYRD LDA 1$00

2971 20 07 29

JSR RDCDSK

DENOTES READ READ SECTOR INTO MEMORY

2974 90 04

BCC DKRDRY+3

($297A) IF FAULT OCCURED, RETRY

2976 60

RTS

;
; DKHDRY : DISK READ RETRY

;

2977 C6 FF DKRDRY DEC MEMHI

HESET MEMORY ADDRESS

2979 E8

INX

297A EC SF 26

CPX PGCNT

297D D0 F8

BNE DKRDRY

NOT DONE, CONTINUE

297F C6 F8 2981 D0 EC 2983 20 83 26 2986 20 78 26

DEC RDRTYN BNE RTYRD JSR STEPIN JSR TENMS

DHOP RETRY COUNT
NOT 0, TRY AGAI~ Wlo MOVING HEAD
STEP IIEAD IN'
10ms DELAY

2989 20 8A 26 298C 20 78 26 298F C6 F7

JSR STEPO'r JSR TENMS DEC RDRTYM

s'n;p HEAD OUT DROP RETRY COUNT

2991 10 D8

BPL READDK+4

($296B) IF )=0 THEN TRY AGAIN

2993 A9 01

ERR1 LDA #$01

2995 4C 4B 2A

JMP ERRENT

ALL RETRIES FAILED, ERROR II

: BPSECT : BYPASS SECTOR

2998 20 B6 29 BPSECT JSR DKBTCI

299B C9 76

CMP 1$76

GET BYTE FROM DISK SECTOR STAHT CODE?

I

I 05650 V3.2 DISASSEMBLY

PAGE: 31

) ---------------._-------------------------------------------------------

I

2990 Oil F9 299F 1.2 112

8NE 8PSECT LOX '$112

NO, TRY AGAIN SET TO READ 2 BYTES

I

29Al 20 B6 29 291.4 95 F9
;
291.6 CA

29A7 Oil F8

JSR DKBTCI STA SCTNUM-2,X
DEX
BNE *-6

GET BYTE FROM DISK STORE SECTOR NUMBER HI $FB STORE SECTOR LENGTH IN $FA (PAGES)
($29A1) BACK FOR SECOND BYTE

29M E6 F9

INC SCTBYP

BUMP SECTORS BYPASSED

291.8 A8

TAY

SECTOR LENGTH IN PAGES

29AC 21l B6 29

JSR DKBTCI

GET ANOTHER BYTE FROM DISK

29AF CA

DEX

29811 011 FA

BNE *-4

($29AC) IF NOT END OF PAGE, CONTINU

2982 88

DEY

2983 011 F7

BNE *-7

($29ACI IF MORE PAGES TO GO, ~ONTIN

2985 611

RTS

;

; DKBTCI : GET BYTE FROM DISK, IF INDEX HOLE SEEN POP STACK AND RETURN

;

29B6 AD 11l CIl DKBTCI LOA ACIA

29B9 4A

LSR A

29BA ell In

BCS SETDRV-3

298C AD Illl CEl

LOA FLOPIN

298F 3Il F5

BMI DKBTCI

29C1 68

PLA

) 29C2 6B

PLA

.29C3 4C BB 28
,

JMP DKBT9+11

GET ACIA STATUS
($29C3) ACIA READY, GO hHEAD TEST FOR INDEX HOLE NO, TRY AGAIN PULL LAST KNOWN RETURN ADDRESS OFF OF STACK AND RETURN ($2SBB) LOAD BYTE AND RETURN

; SETDRV : SET FOR DRIVE IN ACCUMULATOR

;

29C6 SO 5C 26 SETDRV STA TKNUM

SET TRACK NUMBER

29C9 IlA

ASL A

MULTI BY 2 : A=2,B=4,C-6,D-S

29CA AA

TAX

29C8 29 112

AND '$112

ISOLATE DRIVE: A=1,8=II,C=1,D-1I

29CD AS

TAY

29CE BD E9 29

LDA DKINIT-2,X INITIALIZE PIA FROM IN IT TABLE

29D1 SD 1I1l CII

STA FLOPIN

2904 BD EA 29

LOA DKINIT-l,X

29D7 SO 112 CIl

STA FLOPOT

;

; CKRDY : CHECK FOR DRIVE READY, RETURNS WITH CARRY CLEAR U' READY

;

29DA AD 1111 Cil CKRDY LOA FLOPIN

PUT READY BIT IN CARRY FLAG

29DD 4A

LSR A

29DE 118

PHP

SAVE CARRY STATUS

29DF Cil Illl

CPY ISII0

IF TOP DRIVE THEN RETURN

29E1 Oil 116

BNE DKINIT-2

($29E9)

291::3 28

PLP

RESTORE STATUS

2934 4A

LSR A

PUT BIT 4 IN CARRY

2935 4A

LSR A

) 29E6 4A

LSR A

29E7 4A

LSR A

29£8 Gil

RTS

29E9 28

PLP

RESTORE STATUS

OS65D V3.2 DISASSEMBLY

PAGE: 32

) ----------------------------------------------------------------------- ~

29EA 6"

HTS

;
; DISK INITIALIZATION'TABLE

I
29EB 41l 29EC FF 29ED IIIl 29EE FF
29EF 411 29FIl OF 29Fl Illl
.29F2 DF
,

DKINIT. .BYTE $40 .BYTE $FF .BYTE $11" .BYTE $FF .BYTE $411 .BYTE $OF .BYTE $1l11 .BYTE $OF

DRIVE A DRIVE B DRIVE C DRIVE D

I DIRCNT : OIR COMMAND CONTINUED (FROM $2B2C)

I

29F'3 AA 29F4 Fe Fl

OIRCNT TAX BEQ DKINIT-4

PUT TRACK NUMBER IN X
($29£7) IF e' THEN RETURN

29F6 48

PHI'.

SAVE TRACK NUMBER

29F7 211 BC 26

JSR SETTK

MOVE HEAD TO TRACK

29FA 211 73 20

JSR STROUT

PRINT THE FOLLOWING MESSAGE

_2.!!fR.-!'.JL~2 i _

.BYTE $0D,SIlA,"TRACK ",0

2A011 52 41 43

2M3 4B 21l 110

2AII6 68

PLA

RESTORE Tilt: TRACK NUMBER

2AII7 21l 92 20

JSR PRT211X

PRINT TRACK NUMBER

2AIIA BA

TSX

SAVE STACK ADDRESS

2AIlB 86 FC

STX STKIIDR

2AIID 211 54 27

JSR LDHEAD

LOAD HEAD TO DISK

2AlIIE8

INX

21'.11 8E 5E 26

STX SECTNM

PUT 1 IN SECTOR NUMBEH

2A14 20 C4 28

JSR SETSCT

POSITION FOR SECTOR 1

2A17 A9 1111 2A19 85 F9

LDA STA

SISCT"B"YP

CLEAR SECTORS BYPASSED COUNT

2A16 20 98 29

JSR BPSECT

BYPASS THIS tiECTOR

2AIE AS 1'B

LDA SCTNUM

2A211 48

PHA

SAVE SECTOR NUMBER

21'.21 AS FA

LDA SCTLEN

2A23 48

PHA

SAVE SECTOR LENGTH

.21'.24 BIl F5
,

BCS *-9

($2AIB) IF WE DIDN'T HIT THE INDEX KOLE, TRY AGAIN

2A26 1'.6 FC

LDX STKAOR

GET ORIGINAL' STACK ADDRESS

2A28 90 liD

BCC *+15 .

($2A37) 'AND JUMP

2A2A 2" 61'. 20 2A20 A9 211

JSR CRLF LDA '$20

PRINT CR/LF PRINT SPACE AND SECTOR NUMBER

2A2F 211 41 21'.

JSR DCPRNT

21'.32 A9 2D

LOA 1S2D

PRINT - AND SECTOR LENGTH

2A34 2D 41 21'.

JSR DCPRNT

2A37 C6 F9

DEC SCTBYP

DROP SECTORS BYPASSED COUNT

21'.39 1" EF 2113B A6 FC

BPL *-15 LOX STKADR

($21'.21'.) IF MORE TO DO, CONTINUE RESET STACK ADDRESS

2A3D 911

TXS

2A3E 4C 61 27

JMP UNLDHD

UNLOAD HEAD·AND RETURN

2A41 2(1 43 23 DCPRNT J~,R PRINT

PRINT ACCUMULATOR

,

- - - - - ..... _- - - - - -

_ .._----

)
2M4 BD "" 01 2M7 CA 2M8.4C 92 2D

OS65D V3.2 DISASSEM~LY

PAGt:: 33

LDA STACK,X DEX JSR PRT2HX

GET NEXT BYTE OFF STACK GET SET FOR THE NEXT ONE PRINT AS 2 HEX CHAR. AND RETURN

)

)

OSG5D V3.2 DISASSEMBLY

PAGE: 34

; ·· KERNEL ··

;
; ERRENT : OS ERHOR ENTRY. ERROR I IN ACCUMULATOR
,
2A4B 20 C4 2A ERRENT JSR OSERR (~4C4)

2A4E 4C 51 2A

JMP ··

;
; WHILE IT MAKES LITTLE SENSE TO DO A DIRECT JUMP TO THE NEXT ; MEMORY LOCATION, THIS MAKES IT POSSIBLE TO ALTER THE EXIT

; FROM THE OS ERROR ROUTINE SO THAT IT WILL RETURN TO ANOTHER ; PLACE OTHER THAN THE OS. THIS CAN BE DONE WITH THE SETERR

; ROUTINE @ $2A7D. IF YOU ARE USING THE OS FROM YOUR OWN PROGRAM,

; YOU MAY ALSO WISH TO MODIFY THE OSERR ROUTINE TO NOT PRINT THE ; ERROR MESSAGE, IN WHICH CASE YOU WOULD NEED TO SET A FLAG TO INFORM ; YOUR PROGRAM THAT AN ERROR HAD OCCURED.

;
; OS65D3 : ENTRY POINT FOR OS65D MAIN LOOP

;
2A51 A2 28 2A53 9A

OS65D3 LDX 1$28 TXS

SET STACK

;
; THE TOP OF STACK IS SET TO $28 SINCE THE NON-MASKABLE INTERRUPT

; VECTOR IS SET TO $013D. WE WON'T EVEN COMMENT ON HOW ASININE IT

; IS TO PUT THE IN'fERRUPT VECTORS IN THE STACK AREA.
),

2A54 A9 51

LOA 1$51

SET OS ERROR RETUHN TO OS

2A56 AD 2A

LDY 1$2A

2A58 20 7D 2A

JSR SETERR

2A5B 20 6A 20

JSR CHLF

2A5E AD 5C 26

LOA DSKDR

GET PRESENT DISK DRIVE

2A61 18

CLC

2A62
,

69

4"

ADC 1$40

ACCUM NOW HAS LETTER OF PRESENT DISK DRIVE

2A64 20 43 23 2M7 A9 2A 2A69 20 43 23 2A6C 20 9B 2C 2A6F A9 2E 2A71 85 E2 2A73 A9 IE 2A75 85 E1 2A77 20 84 2A 2A7A 4C 51 2A

JSR PRINT
LOA I'·
JSR PRINT JSR OSINP LOA 1$2E STA OSIBAD+1
LOA ISlE STA OSIBAD JSR EXCOM
JMP OS65D3

PRINT IT
PRINT ,*t DO INPUT TO OS BUFFER OS INPUT BUFFER HI ADDRESS
as INPUT BUFFER LOW ADDRESS
GO EXECUTE COMMAND LOOP BACK FOR ANOTHER COMMAND

;
; SETERR : SET OS ERROR RETURN, LOW ADDRESS IN A HIGH ADDRESS IN Y
,

2A7D 80 4F 2A SETERR STA ERRENT+4

2A8D 8C 50 2A

STY ERRENT+5

) ;A83 60

RTS

( S2A4F) (S 2A50)

; EXCOM : EXECUTE OS COMMAND SUBROUTINE
;

OS65D V3.2 DISASSEMBLY

PAGE: 35

)

; TO EXECUTE OS COMMANDS FROM OTHER PROGRAMS EITHER PLACE THE COMMAND ; IN THE OS BUFFER (@S2E1E) AND DO A JSR TO EXCOM. OR PUT THE COMMAND ; IN MEMORY, SET THE BUFFER POINTER (SE1,E2) TO YOUR BUFFER. THEN DO ; A JSR TO EXCOM. YOU WOULD PROBABLY ALSO WANT TO SET THE OS ERROR ; RETURN TO YOUR OWN PROGRAM ·

2· A84 A2 CD

EXCOM LOX 'S88

X2 0FFSET INTO DISPATCH TABLE

2A86 8E E5 2C

STX BUFOFS

CLEAR BUFFER OFFSET

;

USED BY BUFBYT

2A89 All 110

LOY ,Sll'0

Y=OFFSET INTO BUFFER

2A8B BD 3D 2E

LOA DSPTBL.X

FIRST CHARACTER IN DISPATCH

;

TABLE ENTRY

2A8E Fll 311

BEQ ERR7

IF II THEN DO ERROR '7

2A90 01 £1

CMP (OSIBAD).Y COMPARE TO BUFFER

2A92 Oil 26

BNE NXTENT

IF NOT GO CHECK NEXT ENTRY

2A94 C8

INY

BUMP BUFFER INDEX

2A95 BD 31 2E

LOA DSPTBL+ 1. X SECOND CHAR. IN TABLE ENTRY

2A98 01 E1

CMP (OSIBAO).Y COMPARE TO BUFFER

2A9A Oil 1 E

BNE NXTENT

IF NOT CHECK NEXT ENTRY

2A9C BD 33 2E

LDA DSPTBL+3.X GET HIGH ADDRESS FROM TABLE

2A9F 48

PHA

2Mll BD 32 2E

LOA DSPTBL+2. X GET LOW ADDRESS

2AA3 48

PHA

2AA4 20 E4 2C

JSR BUFBYT

GET BYTE FROM BUFFER

) 2AA7 C9 00

CMP 'S8D

CHECK FOR ',CR'

2M9 Fll 0E

BEQ NXTENT-1

(S2AB9) IF IT IS. EXECUTE COMMAND

2MB C9 20

CMP 'S20

CHECK FOR A 'SPACE'

2AAD Dll F5

BNE *-9

(S2AA4) IF NOT. TRY AGAIN

2AAF 20 E4 2C

JSR BUFBYT

GET BYTE FROM BUFFER

2AB2 C9 20

CMP 'S20

CHECK FOR A 'SPACE'

2A84 FIl F9

BEQ *-5

(S2MF) IF SO. LOOK AGAIN

2AB6 CE E5 2C

DEC IlUFOFS

POINT TO FIRST NONSPACE

2AB9 61l

RTS

JUMP TO ADDRESS FROM TABLE

2ABA E8

NXTENT INX

INCREMENT TO NEXT TABLE ENTRY

2AB13 E8

INX

EACH ENTRY IS 4 BYTES

2ABC E8

INX

2ABD E8

INX

2ABE Oil C9

BNE EXCOM+5

(S2A89) GO BACK IF MORE TABLE

2AC8 A9 07

ERR7 LOA 1S07

SYNTAX ERROR '7

2AC2 0111 87

BNE ERRENT

JUMP TO OS ERROR ENTRY '";Z.4t; 0)

;
; OSERR : OS ERROR ROUTINE. ERROR · IN ACCUMULATOR

;

; ALWAYS CALLED FROM S2A4B. NOTE THAT THE I/O DISTRIBUTORS ARE

RESET TO THE DEFAULT DEVICE ON ANY ERROR.

,

2AC4 48

OSERR PHA

2ACS A9 01

LOA .S01

GET DEFAULT I/O DISTRI6UTOR

2AC7 8D 21 23

STA INDST

AND RESET

) 2ACA 80 22 23

STA OUTDST

2ACD Ul 73 20

JSR STROUT

PRINT THE FOLLOWING

2AD0 20 45 52

.BYTE ' ERR j '.0

2AD3 52 20

OS65D V3.2 DISASS~MBLY

PAGE: 36

)

2AD5 23 ~0

2AD7 68

PLA

2AD8 20 9B 20

JSR PRTHEX

PRINT THE ERROR NUMBER

2ADB 4C 61 27

JMP UNLDHD

UNLOAD HEAD AND RETURN

;
.; ASM : ASSEMBLER COMMAND
,

2ADE A9 05 ASM 2AE0 20 EE 2A 2AE3 4C 00 13
,

LOA IS05 JSR LDCMN JMP STASH

FIRST TRACK NUMBER COMMON CODE JUMP TO START OF ASSEMBLER

; BASIC : BASIC COMMAND

;

2A~6 A9 02

BASIC

2AE8 20 EE 2A

2AE8 4C E4 21l

,

LOA ISIl2 JSR LDCMN JMP STBAS

FIRST TRACK NUMBER COMMON CODE JUMP TO START OF BASIC

; LDCMN : LOAD LANGUAG~ COMMON ROUTIN~

; LOADS 3 TRACKS STARTING WITH TRACK IN ACCUM INTO MEMORY e $0200 & UP
,

2AEE 20 BC 26 LDCMN JSR SETTK

POSITION HEAD TO FIRST TRACK

2AFI A2 02

LDX IS02

2An 86 E0

STX TS1

1 OF TRACKS-1 TO READ

2AF5 86 FF

STX MEMHI

MEMORY ADDRESS HIGH=2

2AF7 CA

DEX

2AF8 8E 5E 26

STX SECTNM

SET SECTOH TO 1

2AFB CA

DEX

2AFC 86 FE 2AFE CA

STX MEMLO DEX

MEMORY ADDRESS LOW=O

2AFF 86 E5 2B01 20 54 27 2B04 21l 67 29

STX HSTTK JSR LDHEAD JSR READDK

HIGHEST TRACK = SFF
LOAD HEAD TO DISK READ TRACK INTO MEMORY

2B07 C6 E0

DEC TS1

2809 30 15 2B08 20 83 2C

BMI D9-3 JSR INCTKN

(S2B21l) IF NO MORE TRACKS, DONE BUMP TRACK NUMBER AND SET HEAD

2B0E 4C 04 2B
,

JMP *-10

(S2B04) CONTINUE

; CALL : CALL COMMAND, READ SECTOR INTO .MEMORY
,

2Bll 20 23 2D CALL
2B14 20 58 2D 2817 20 60 2C 2B1A 20 54 27 2B1D 20 67 29 2B20 4C 61 27
,

JSR GETADR JSR CKEQL
JSR GETTK JSR LDHEAD JSR READDK JMP UNLDHD

MEMORY ADDRESS @$FE,FF
LOOK FOR = SIGN
GET TRACK 1 AND SECTOR LOAD HEAD TO DISK READ DISK INTO MEMORY UNLOAD HEAD AND RETURN

; D9 : DISABLE ERROR 9
,

2823 A9 00 D9 2B25 8D B4 28 2B28 60

LOA IS00 STA DKBT9+4 RTS

($28B4) CHANGE DKBT9 ROUTINE

;
; DIR : DIRECTORY COMMAND, PRINT SBCTOR MAP OF TRACK

OS65D V3.2 DISASSEMBLY

PAGE: 37

)
2· B29 20 2E 20 DIR
2B2C 4C F3 29

JSR BLDHEX JMP DIRCNT

GET TRACK NUMBER FROM BUFFER GOTO ACTUAL CODE

;
; EM : CALL AND ENABLE EXTENDED MONITOR

·

2B2F A9 05

EM

2B31 20 EE 2A

2834 4C 00 17

LOA 1$05 JSR LDCMN JMP STEM

GET FIRST TRACK NUMBER COMMON CODE GOTO START OF EXTENDED MONITOR

;
; EXAM : EXAM TRACK INCLUDING FORMATTING INFORMATION

: THIS IS A REALLY NICE COMMAND, EXCEPT THEY DON'T GIVE YOU ANY
; EASY WAY TO PUT THE DATA BACK ONTO THE DISK.

;
2B37 20 23 2D EXAM 2B3A 20 58 2D 2B3D 20 2E 2D 2B40 20 BC 26 2B43 4C 39 27

JSR GETADR JSR CKEQL
JSR 8LDHEX JSR SETTK JMP EXAMCN

MEMORY ADDRESS @$FE,FF LOOK FOR EQUAL SIGN
GET TRACK NUM8ER MOVE HEAD TO TRACK JUMP TO REST OF CODE

·
: GO : GO COMMAND

;

2846 2e 2E 2D GO

JSR 8LDHEX

2849 80 54 28 ) 2B4C 20 2E 20

STA GOADR+2 JSR tlLDHEX

284F 8D 53 28

STA GOADR+1

2852 4C 00 00 GOADR JMP **

;

; IN IT : INITIALIZATION COMMAND

GET HIGH ORDER ADDRESS ($2B54) SAVE IT GET LOW ORDER ADDRESS ($2B53) SAVE IT GO TO ADDRESS ENTERED

;

2855 20 E4 2C INIT JSR 8UF8YT

GET BYTE FROM 8UFFER

2858 C9 0D

CMP tS0D

285A F0 0C

SEQ FULINT

IF 'CR' THEN DO ENTIRE DISK

;

OTRERWISE, DO ONE TRACK

285C CE E5 2C

DEC IlUFOFS

RESET IlUFFER POINTER

2B5F 20 2E 2D

JSR BLDHEX

GE'f TRACK NUMBER

2B62 211 BC 26

JSR SETTK

MOVE HEAD TO TRACK

2865 4C 7D 27

JMP INITTK

INITIALIZE TRACK AND RETURN

2868 20 73 20 FULINT JSH S'fROUT

PRINT THE MESSAGE

2868 41 52 45

· BYTE · ARE YOU SURE?' ,0

286F 20 59 4F

2871 55 20 53 55

2B75 52 45 3F

2878 00

2B79 20 4{\ 23

JSR INECHO

INPUT AND ECHO 1 CHARACTER

2B7C C9 59

CMP I'Y

287E 00 26

BNE LOAD-1

($2BA6) IF NOT 'Y' THEN RETURN

2B811 4C 68 27

JMP INITAL

DO REST OF CODE

) ; IO : I/O COMMAND (SEE NOTE AT $2339)

·
2B83 20 E4 2C IO

JSR BUFBYT

GET BYTE FROM 8UFFER

OS65D V3.2 DISASSEMBLY

PAGE: 38

) 2B86 C9 2C

CMP 1 ' ,

2B88 F9 16

BEQ ONLYO

IF ' , ' DO OUTPUT ONLY

2B8A CE E5 2C

DEC BUFOFS

RESET BUFFER POINTER

2B8D 29 2E 2D

JSR BLDHEX

GE1' INPUT FLAG

2B99 8D 21 23

STA INDST

SAVE IT

2B93 29 E4 2C

JSR BUFBYT

GET BYTE FROM BUFFER

2B96 C9 0D

CMP IS0D

2B98 F9 0C 2B9A CE E5 2C

BEQ LOAD-1 DEC BUFOFS

($2BA6) IF 'CR' THEN RETURN RESET BUFFER POINTER

2B9D 29 5B 2D

JSR CKEQL+3

CHECK FOR COMMA

2BA9 29 2E 2D ONLYO JSR BLDHEX

GET OUTPUT FLAG

2BA3 8D 22 23

STA OUTDST

STORE IT

·2BA6 69

RTS

;· LOAD : LOAD COMMAND

;
2BA7 29 A6 2D LOAD JSR FNDFL

FIND FILE NAME IN DIRECTORY

2BAA 29 79 2C 2BAD 86 E0 2BAF HI 03

JSR SETPGM STX TS1 BEQ *+5

SET MEMORY ADDRESS & LOAD HEAD X=9 USED AS I OF TRACKS READ ($2BB4) SKIP NEXT INSTR 1ST TIME

2BB1 29 83 2C

JSR INCTKN

BUMP TRACK NUMBER

2BB4 29 67 29 2BB7 EG E0

JSR HEADDK INC TS1

READ TRACK INTO MEMORY BUMP TRACKS READ

2BB9 CE 7D 31

DEC S317D

DROP NUMBER OF TRACKS TO READ

2BBC D0 F3

BNE *-11

($2BB1) IF MORE TRACKS, CONTINUE

2BBE A5 E0

LDA TS1

2BC9 8D 7D 31

STA 5317D

RESET NUMBER OF TRACKS IN FILE

2BC3 4C 61 27

JNP UNLDHD

UNLOAD HEAD AND RETURN

;

; MEM : MEMORY COMMAND

2·, BC6 A2 00

MEM

LOX 1500

SET OFFSET FOR INPUT ADDRESS

2BC8 29 D0 2B

JSR *+8

($2BD0) GET FROM BUFFER AND SAVE I'!'

2BCB 20 5B 2D

JSR CKCOMA

CHECK FOR COMMA

2BCE A2 07

LDX 1507

SET OFFSET FOR OUTPUT ADDRESS

2BD9 29 2E 2D

JSR BLDHEX

GET HIGH ORDER ADDRESS

2BD3 9D 8B 23

STA MINADR+1. X SAVE IT

2BD6 29 2E 2D

JSR BLDHEX

GET LOW ORDER ADDRESS

2BD9 9D 8A 23

STA MINADR.X

SAVE IT

2BDC 69

RTS

·,

; PUT : PUT COMMAND

;
; THERE IS A SERIOUS ~'LAW IN THE PUT COMMAND. IT ALWAYS WRITES WHOLE

; TRACKS STARTING @ $3179. IF YOU HAVE A VERY LARGE FILE IN MEMORY,

; SUCH AS A WORD PROCESSOR FILE, AND IT GOES BEYOND SB578 THEN THE

; LANGUAGES (BASIC, ASSEMBLER, WORD PROCESSOR) WILL COMPUTE 13

; TRACKS TO BE PUT TO DISK. UNFORTUNATELY, ATTEMPTING TO PUT OUT

; 13 TRACKS WILL CAUSE THE SYSTEM TO WRITE THE DISK CONTROLLER

; MEMORY TO DISKI I! THE READ AFTER WRITE CHECK WILL FAIL AND YOU

; IH LL GET AN ERROR 2. IF YOU DON'T SEE THE ERROR WHEN IT OCCURS,

; AND ATTEMPT TO LOAD THE FILE LATER, VERY CURIOUS ERRORS llAPPEOl.

; THE SIMPLEST FIX FOR THIS PROBLEM IS TO LIMIT THE AMOUNT OF MEMORY

I

OS65D V3.2 DISASSEMBLY

PAGE: 39

; THE COMPUTER THINKS YOU HAVE BY CHANGING HIMEM @ $2300 TO $B4.

;

2BDD 20 A6 2D PUT JSR FNDFL

FIND FILE NAME IN DIRECTORY

2BE0 20 70 2C 2BE3 AD 7D 31

JSR SETPGM

LDA . ~ ,

..,~

.,)..1.,.1.,..:

SET MEMORY ADDRESS, LOAD HEAD
;: Z"!, :l~'!lit~~q OF T-RACKS

2BE6 85 Ell

STA TSI

SAVE IT

·2BE8 A9 0B
·

LDA '$9B

NUMBER OF PAGES

; YET ANOTHER EXAMPLE OF AN OSI BLUNDER. EACH TRACK ON THE DISK

; IS CAPABLE OF HOLDING 13 SECTORS BUT THE PROGRAMMERS AT 051

; ONLY USE 11 IN THE PUT COMMAND. THERE IS NO LOGICAL REASON ; TO DO THIS, MAYBE THEY THOUGHT THAT THIS WOULD HELP THEM TO

; SELL MORE DISKS. YOU MAY CHANGE THIS, AS WE HAVE, TO USE 12
; OR 13 SECTORS PER TRACK BY CHANGING THE PREVIOUS LDA '$9B TO ; LDA '$9C OR $8D. IF YOU DO DECIDE TO UTILIZE THE WASTED ; SECTORS WE WOULD ADVISE YOU TO GO TO A 12 SECTOR PER TRACK ; FORMAT AS THIS IS THE MOST THAT BASIC WILL RECOGNIZE.
; THIS WILL NOT HELP YOU WHEN SAVING BASIC OR ASSEMBLER PROGRAMS ; OR WORD PROCESSOR FILES AS ALL OF THESE LANGUAGES CALCULATE ; THE NUMBER OF TRACKS TO BE WRITTEN TO DISK BASED ON 11

; SECTORS PER TRACK. HOWEVER. IF YOU ARE DOING DISK I/O FROM ; YOUR OWN MACHINE LANGUAGE PROGRAMS, SUCH AS THE TEXT EDITOR

; USED TO PREPARE THIS DOCUMENT ·. YOU CAN USE 12 SECTORS PER TRACK ; WITHOUT ANY PROBLEM.

)

;
2BEA 8D 5F 26

2BED 20 El 27

2 BFll C6 E0

2BF2 F8 96

2BF4 20 83 2C

2BF7 4C ED 2B

2BFA 4C 61 27

STA PGCNT JSR DSKWRT DEC TSI BEQ *+8 JSR INCTKN JMP *-llil JMP UNLDHD

SAVE IT WRITE TO DISK DROP TRACK COUNT ($2BFA) IF NO MORE THEN DONE BUMP TRACK NUMBER AND STEP HEAD ($2BED) LOOP BACK & .WRITE THIS TRACt UNLOAD HEAD AND RETURN

;
; RET : RESTART COMMAND

;
; (*) NOTE. NOT ALL OF THESE WILL BE SET AT THE SAME TIME. ; EACH LANGUAGE SETS IT'S OWN RESTART ADDRESS AND SETS THE ; OTHERS TO REPORT AN ERROR. OF COURSE, THE ASSEMBLER/EXTENDED MONITOR ; SETS BOTH RETURN ADDRESSES.

·
2BFD 29 E4 2C RET 2C98 C9 41 2C02 Dll 03 2C94 4C 93 13 2C97 C9 42 2C09 D0 03 2C0B 4C C4 20 2COE C9 45 2CI0 DO 03 2C12 4C 90 17 ) 2C15 C9 40 2C17 D0 06 2C19 20 44 26

JSR BUFBYT
CMP "A BNE *+5 JMP RTASM CMP #'B BNE *+5 JMP RTBAS
CMP "E BNE *+5 JMP STEM
CMP "M BNE *+8 JSR SWAP4

GET BYTE ·FROM BUFFER
($2C97) NOT 'A' THEN CONTINUE REENTER ASSEMBLER (*)
($2C0E) NOT '8' THEN CONTINUE REENTER BASIC (*)
($2C15) NOT 'E' THEN CONTINUE ENTER EXTENDED MONITOR (*)
($2CIF) NOT 'M' THEN ERROR '7 SWAP 4 BYTES FUR VIDEO ROUTINE

OS65D V3.2 DISASSEMBLY

PAGE: 40

2CIC 6C FC FE 2CIF 4C C0 2A

JMP ($ FEFC) JMP ERR7

JUMP TO RESET VECTOR DO ERROR t7

;
; XQT : LOAD FILE AND GO @$317E

;
; ONE USEFUL CHANGE TO THIS ROUTINE IS TO MAKE THE JUMP AT $2C25 ; INTO AN INDIRECT JUMP TO $3179 (6C 79 31). SINCE THE PROGRAM MUST ; BE IN LOAD FORMAT ANYWAY, THIS WOULD ALLOW YOU TO HAVE A DISK ; BUFFER OR TWO AT THE FRONT OF THE WORKSPACE AND USE THE BASIC ; DISK I/O ROUTINES IN A STRAIGHTFORWARD FASHION.

;
2C22 20 A7 2B XQT 2C25 4C 7E 31

JSR LOAD JMP $317E

DO LOAD JUMP TO START OF PROGRAM

·; SAVE : SAVE COMMAND, WRITE SECTOR TO DISK

;

2C28 20 60 2C SAVE JSR GETTK

GET TRACK' AND POSITION HEAD

2C2B 20 58 2D

JSR CKEQL

CHECK FOR =

2C2E 20 23 2D

JSR GETADR

GET MEMORY ADDRESS AND PUT @$FE,FF

2C31 20 5E 2D

JSR CKEQL+6

CHECK FOR '/'

2C34 20 3D 2D

JSR GETHEX

GET NUMBER OF PAGES FROM BUFFER

2C37 8D 5F 26

STA PGCNT

SAVE IT

2C3A 20 54 27

JSR LDHEAD

LOAD HEAD

2C3D 20 El 27

JSR DSKWRT

WRITE TO DISK

2C40 4C 61 27

JMP UNLDHD

UNLOAD HEAD AND RETURN

,

; SELECT : SELECT DISK DRIVE

; SETS PARAMETERS FOR DRIVE AND HOMES HEAD

·2·C43 20 E4 2C SELECT JSR BUFBYT

GET BYTE FROM BUFFER

2C46 C9 41

CMP ·· A

CHECK FOR A-D

2C48 30 0E

BMI ERR6-3

($2C48) LESS THAN 'A', ERROR #7

2C4A C9 45

CMP I'E

2C4C 10 0A

BPL ERR6-3

($2C58) >= 'E', ERROR '7

2C4E 29 0F

AND 1$0F

KILL UPPER 4 BITS: A=I,D=4

2C50 20 C6 29

JSR SETDRV

SET FOR DRIVE

2C53 B0 06

BCS ERR6

ERROR '6 IF DRIVE NOT READY

2C55 4C 63 26

JMP HOME

HOME HEAD AND RETURN

2C58 4C C0 2A

JMP ERR7

DO ERROR t7

2C5B A9 06

ERR6 LDA '$06

DO ERROR t6

2C5D 4C 4B 2A

JMP ERRENT

OS65D V3.2 DISASS~MBLY

PAGE: 41

-----------------------------------------------------------------------

) ; COMMON HOUTINES USED BY KEHNEL

;

; GETTK : GET TRACK NUMBER & SECTOH FROM BUFFER 0 POSITION HEAD

;

2C6B 2B 2E 2D GETTK JSR BLDHEX

2C63 2B BC 26

JSR SETTK

GET TRACK NUMBER CHECK TRACK AND MOVE HEAD THERE

2C66 2B 5B 2D

JSR CKCOMA

CHECK FOR COM~lA

2C69 2B 3D 20

JSR GETHEX

GET SECTOR NUMBEH

2C6C BD 5E 26

STA SECTNM

SAVE IT

2C6F 6B

RTS

;

; SETPGM SET UP FOR PROGRAM

;

2C71l 2B BC 26 SETPGM JSR SETTK

SET HEAD TO TRACK

2C73 A9 31 2C75 85 FF

LOA IS31 STA MEMHI

SET MEMORY ADDRESS TO S3179

2C77 A9 79

LDA IS79

2C79 85 FE

STA MEMLO

2C7B 1\9 Bl 2C7D 80 5E 26

LOA ISB1 STI\ SECTNM

SET SECTOR NUMBER TO 1

2C8B 4C 54 27

JMP LDHEAD

LOAD HEAD AND RETURN

;

; INCTKN : INCREMENT TRACK NUMBER

;

2C83 AD 50 26 INCTKN LOA 'I'KNU~I

GET TRACK NUMBER

) 2C86 1B

CLC

2C87 FB

S~D

2CBB 69 III

ADC IS01

ADD 1 IN DECIMAL

2CBA DB

CLD

2C8B C5 E5

CMP HSTTK

IS THIS HIGHEST TRACK NUMBER?

2C8D FB B2

BEQ *+4

(S2C91) YES, LET'S CONTINU~

2C8F BIl B3

BCS *+5

S(2C94) HIGHER, DO ERROR D

2C91 4C BC 26

JMP SETTK

SET HEAD AT TRACK AND HETURN

2C94 A9 BD

ERRD LOA IS0D

ERROH D

2C96 DB C5

BNE ERR6+2

(S2C5D) JUMP TO ~RROR

;

2C9B 2B 6A 2D NXTOSN JSR CHLF

SET FOR NEXT OS INPUT

;

; OSINP : OS INPUT ROUTINE

;

; NOTE: ·THIS ROUTINE POES NOT TRAP ILLEGAL CON.TROL CHARAC'rERS.

; IF YOU PRESS 'BACKSPACE' (SBB), THE PREVIOUS CHARACTER WILL

; BE ERASED, BUT BOTH THE 'BACKSPACE' AND THE CHARACTEH WILL

; STILL BE IN THE BUFFER AND YOU WILL GET AN ERROR 17 EVEN

; THOUGH THE INPUT COMMAND LOOKS CORHECT.

;

2C9B A9 11

OSINP LOA IS11

SET BUFFER SIZE:

2C9D 80 ED 2C

STA MAXBUF

2CAIl A2 BB

LOX ISBll

X=CHARACTER COUNT

2CA2 2~ 40 23 NXTOSI JSR INECHO

GET A CHARACTER

) 2CA5 C9 SF 2CA7 DB 13 2C1\9 CA

CMP 'SSt" lINE OSIOK
DEX

IS IT THE 'UNDERLINE'
CONTINUE IF NOT MOVE BACK ONE CIl!\HAC'fER

OS65D V3.2 DISASSEMBLY

PAGE: 42

----------------------------------------------------------------------- --..

) 2CAA 3e EC

BMI NXTOSN

TRY AGAIN

·
2CAC

90

1£

2E

STA OSBUF.X

BACKSPACED AT FIRST CHARACTER PUT IT IN BUFFER

2CAF 29 73 20

JSR STROUT

DO BACKSPACE

;

; THIS PRINT FIRST DOES 2 BACKSPACES ~O POSITION THE CURSOR

; AT THE CHARACTER TO BE DELETED. THE FIRST IS NECESSARY TO GET

; PAST THE UNDERLINE OR LEFT ARROW AND THE SECOND TO GET TO THE

; CHARACTER THAT WAS INPUT. THE ROUTINE THEN PRINTS 2 SPACES. 1

; TO ELIMINATE THE CHARACTER THAT WAS ENTERED AND ANOTHER TO

; ELIMINATE THE UNDERLINE OR LEFT ARROW. THE CURSOR IS THEN

; BACKSPACED TWICE TO REPOSITION IT SO YOU ARE READY TO

·; ENTER THE CORRECT CHARACTER.
·

2CB2 llS OS 2ll

· BYTE 8.S.·

·,8,8,0

2CBS 29 9S llS

2CBS ll9

2CB9 4C A2 2C

JMP NXTOSI

CONTINUE

2CBC C9 15

OSIOK CMP }$15

CHECK FOR CONTROL U

2CBE F9 OS

BEQ NXTOSN

IF SO IGNORE INPUT UP TO NOW

2CCll 90 IE 2E

STA OSBUF.X

PUT IN BUFf'ER

2CC3 C9 llD

CMP O$llD

CHECK FOR · CR'

2CC5 F9 09

BEQ *+11

($2CDll) IF SO THEN WE ARE DONE

2CC7 ES

INX

BUMP INDEX

2CCS Ell 11

CPX 0$11

CHECK FOR MAXIMUM LENGTH

) 2CCA 09 06

BNE NXTOSI

NOT DONE SO CONTINUE

2CCC A9 eo

LOA #$llD

BUFFER FULL. STOP INPUT AND PROCESS

2CCE 09 F9

BNE OSIOK+4

($2CCll) JUMP

2CDil 4C 6A 20

JMP CRLF

2CD3 Illl

BRK

(UNUSED)

2CD4 9ll

BRK

(UNUSED)

2CD5 ""

BRK

(UNUSED)

; INPUT: INPUT ROUTINE. CIIECKS FOR CONTROL CHARACTERS.

;

; (SEE NOTE AT $2339)

; WHEN WRITING YOUR OWN INPUT HOUTINES TO BE USED WITH THE OS

; YOU SHOULD STORE THE INPUT CHAHACTER IN A.HOLD BEFORE RETURNING

; FROM YOUR ROUTINE SINCE THE INPUT ROUTINE RESTORES A.X.Y

WHEN IT RETURNS. IF YOU DO NOT DO THIS YOUR INPUT WILL BE THE

; CHARACTER IN A WHEN THE ROUTINE WAS CALLED.

;

2CD6 2ll 67 23 INPUT JSR SAVAXY

2CD9 2e 39 23

JSR DOINP

GO DO INPUT

2CDC 2ll 40 25

JSR CKINP

CHECK FOR CONTROL CHARACTERS

2CDF F9 f'S

BEQ DlPUT+3

( $2CDF) IF SO CONTINUE INPUT

2CEI 4C 5E 23

JMP RSTAXY

RESTORE REGIS'fERS AND GO BACK

;

.; BUFBYT : GET BYTE FROM BUFFER

.
)

~CE4

All

ll7

BUFIlYT LOY OBUFOFS

·
2CE6 131 E1

LOA (OSIBAD) .Y

GET OFFSET INTO BUFFER MORE SELF MODlrYING CODE LOAD BYTE

OS65D V3.2 DISASSEMBLY

PAGE: 43

) 2CE8 C9 IlD 2CEA F0 07 2CEC C0 11 2CEE F0 04 2CF0 EE E5 2C
2CF3 60 2CF4 A9 IlD 2CF6 611
,

CMP 1$IlD BEQ *+9 CPY 1$11 8EQ *+6 INC BUFOFS RTS
LOA 1$00 RTS

CHECK FOR 'CR' ($2CF3) IF SO WE ARE DONE CHECK FOR END OF 8UFFER ($2CF4) IF SO THEN RETURN BUMP THE OFFSET
LOAD A 'CR' RETURN, BUFFER IS FULL

; SWAP : SWAP PAGE Il AND 1 WITH $2F79 AND UP (USED BY BASIC)

; THIS ROUTINE IS NOT CALLED ANYWHERE BY THE OS

;

2CF7 68

SWAP PLA

2CFB 18

CLC

2CF9 69 01

AOC 1$01

2CFB 8D 21 2D

STA GE'fADR-2

2CFE 68

PLA

2CFF 69 01l

ADC H00

2 Dill 80 22 2D

STA GETADR-l

2DIl2 A2 01l

LOX 1$00

2006 BO 00 01 SWAPLP LOA STACK,X

2009 BC 79 30

LDY SWAPl,X

200C 9D 79 30

STA SWAPl,X

200F 98

TYA

.) 2010 90 00 01

STA STACK,X

2D13 B5 00

LOA PAGE0,X

2015 BC 79 2F

LOY SWAPIl,X

2018 9D 79 2~'

STA SWAP0,X

2DIB 94 00

STY PAGE0,X

2010 EB

INX

CHANGE RETURN ADDRESS INTO JUMP @$2020
($2D21)
($2022) SET THE OFFSET GET BYTE FROM PAGE 1 GET BYTE FROM SWAP AREA SAVE THE BYTE FROM PAGE 1
SAVE THE BYTE FROM SWAP AREA GET BYTE FROM PAGE 0 GET BYTE FROM SWAP AREA SAVE BYTE FROM PAGE 0 SAVE BYTE FROM SWAP AREA BUMP THE OFFSET

2DIE D0 E6 2D21l 4C C7 14

BNE SWAPLP
JMP **

NOT DONE, KEEP ON ADDRESS FOR JUMP IS CHANGED ABOVE

;
.; GETAOR : GET MEMORY ADDRESS FROM BUFFER
,

2D23 20 2E 20 GETADR JSR BLDHEX

2026 85 FF

STA MEMHI

HIGH ORDER BYTE

2028 20 2E 20 2D2B 85 FE

JSR BLDHEX STA MEMLO

LOW ORDER BYTE

.2020 60
,

RTS

; BLOHEX : BUILD HEX BYTE FROM BUFFER

; RESULT IS IN ACCUM

;

202E 20 3D 20 BLDHEX JSR GETHEX

2031 OA

ASL A

2D32 0A

ASL A

2033 0A

ASL A

2034 0A

ASL A

2035 B5 E0

STA TSI

) 2037 20 3D 20

JSR GETHEX

2D3A 05 E0

ORA TSI

2D3C 60

HTS

GET BYTE FROM BUFFER
SAVE UPPER FOUR BITS GET SECOND BYTE COMBINE WITH FIRST BYTE

OS650 V3.2 DISASSEMBLY

PAGE: 44

-----------------------------------------------------------------------

)
·;
, GETHEX : GET 1 HEX DIGIT FROM BUFFER

;
2030 20 E4 2C GETHEX JSR IlUFBYT

GET BYTE FROM BUFFER

2040 38

SEC

2D41 E9 30

SBC IS30

2D43 C9 0A

CMP ISBA

2D45 90 08

BCC *+10

(S204F) IF <10 THEN RETURN

2D47 E9 11

SBC IS11

2D49 C9 06 204B B0 08

CMP 1$06 BCS *+10

(S2D55) IF ) F THEN ERROR

204D 69 0A

AOC IS0A

·204F 60
,

RTS

·,0 THIS CODE USED BY BASIC ANO POSSIBLY THE OTHER LANGUAGES

2050 AS 00

LDA PAGE0

DO WE NEED TO SWAP PAGES 0/1

2052 F0 A3

BEQ SWAP

YES, GO DO IT

2054 60

RTS

;

2055 4C CIl 2A

JMP ERR7

GOT HERE FROM $204B

;

; CKEQL 0 CHECK FOR '=' OR ' , ' OR ' / '

o '.' THREE ENTRY POINTS -) CKEQL=S2058 : CKCOMA-S2D5B : CKSLSH=$205E ) , ANOTHER EXAMPLE OF TURNING A TWO BYTE INSTRUCTION INTO A THREE

BYTE 'HARMLESS' INSTRUCTION. (SEE NOTE @ S28E6)

; FORTUNATELY, THIS TIME THEY ARE HARMLESS.

0
2058 A9 3D

CKEQL

205A 2C A9 2C

2D5D 2C A9 2F

2060 85 E0

2062 20 E4 2C

2065 C5 E0

2D67 D0 EC

2069 60

LOA 0'= BIT S2CA9 BIT S2FA9 STA TS1
JSR BUFIlYT CMP TS1 BNE CKEQL-3 RTS

SAVE CHARACTER TO TEST GET BYTE FROM BUFFER
($2055) IF NOT THEN ERROR f7

0

0 CRLF : PRINT CR,LF TO ALL ACTIVE DEVICES

;

2D6A A9 0D CRLF LOA '$00

00 I CR'

206C 20 43 23

JSR PRINT

2D6F A9 0A

LOA ISBA

DO I LF'

2071 00 3"

IlNE FNOFL-3

(S20A3) JUMP TO PRINT

;

0 STROUT : PRINT STRING FOLLOWING JSIl THAT GOT US HERE

THE STRING CAN BE ANYTHING, BUT MUST BE TERMINATED BY A NULL.

o STIlING LENGTH IS LIMITED TO 255 CHARACTERS.
-..l THIS IS A VERY USEFUL ROUTINE, BUT BE WARNED THAT IT CAN llEALLY

.......

# PLAY HAVOC WITH YOUR PROGRAM IF YOU FORGET TO PUT 1'11<: "'ULL o OELIMITEIl ON YOUR STRING.

o

OS65D V3.2 DISASSEMBLY

PAGE: 45

) 2D73 68

STROUT PLA

PULL RETURN ADDRESS OFF STACK

2D74 85 E3

STA STROAD

STORE LOW ADDRESS

2D76 68

PLA

2D77 85 E4

STA STROAD+l

STORE HIGH ADDRESS

2D79 All 01

LDY 1$01

SET TO INDEX THROUGH STRING

2D7B Bl E3

LDA (STROAD),Y GET BYTE FROM STRING

2D7D Fll 06

BEQ *+8

($2D85) IF NULL THEN WE ARE DONE

2D7F 20 43 23

JSR PRINT

PRINT IT IF NOT

2082 C8

INY

GET SET FOR NEXT CHARACTER

2D83 D0 F6

BNE *-8

($2D7B) JUMP AND CONTINUE

2D85 98

TYA

2D86 38

SEC

GET SET TO FIND RETURN ADDRESS

2D87 65 E3

ADC STROAD

ADD LENGTH OF STRING TO ADDRESS

2D89 85 E3

STA STROAD

SAVE IT

2D88 90 112

Bce *+4

($2D8F) NO CARRY SO UPPER BYTE IS 01

2D8D E6 E4

INC STROAD+l

8UMP THE UPPER BYTE

.2D8F 6C E3 110
,

JMP (STROAD)

JUMP PAST PRINTED STRING

; PRT2HX PRINT 2 HEX CHARACTERS OF ACCUMULATOR

;

2D92 48

PRT2HX PHA

SAVE THE CHARACTER

2093 4A

LSR A

PUT UPPER NIBBLE IN LOWER NIBBLE

2D94 4A

LSR A

2095 4A

LSR A

2096 4A

LSR A

) 2097 20 9B 2D

JSR PRTHEX

PRINT THE UPPER 4 BITS

.2D9A 68
,

PLA

RESTORE THE CHARACTER

; PRTHEX : PRINT HEX OF LOW NIB8LE IN ACCUMULA'fOR

; GOOD HEX TO ASCII CONVERSION

;

2D9B 29 OF PRTHEX AND 1$IlF

MASK UPPER 4 BITS

2D9D C9 0A

CMP 1$IlA

SET CARRY IF >9 AND CLEAR

;

CARRY IF <10

2D9F F8

SED

2DAil 69 311

ADC '$30

IF CARRY SET THEN A=$41

;

IF CARRY CLEAR 9=$39

2DA2 08

CLD

2DA3 4C 43 23

JMP PRINT

;

; FNDFL : FIND FILE NAME IN DIRECTORY

;

ONE OF THE MOST USEt'UL ROUTINES IN THE OS IF YOU ARE WRITTING

; YOUR OWN MACHINE LANGUAGE PROGRAMS. PUT THE NAME OF THE FILE YOU ARE

; LOOKING FOR IN A BUFFER, EITHER THE OS BUFFER @ $2EIE OR yOUR OWN.

; THE FILE NAME SHOULD BE DELIMITED BY A CRIF IT IS SHORTER THAN

; SIX CHARACTERS. IF YOU ARE USING YOUR OWN BUFFER, IT'S ADDRESS

; SHOULD BE PUT IN $El,$E2. THE 8UFFER OFFSET e $2CE5 MUST BE

; SET, EITHER TO ZERO IF THE FILE NAME IS AT THE BEGINNING OF THE

; BUFFER, OR TO WHATEVER OFFSET IN THE BUFFER THE FIRST CHARACTER

) ; OF THE FILE NAME IS AT. THEN CALL THIS ROUTINE.

; RETURNS WITH STARTING TRACK IN A, LAST TRACK @ $E5.

;

OS65D V3.2 DISASSEMBLY

PAGE: 45

2DA6 A9 76

FNDFL LOA 'S76

20M 85 E5

STA HSTTK

SET HIGHEST TRACK NUMBER

2DM 211l E4 2C

JSR IlUFBYT

GET BYTE FROM BUFFER

20AO CE E5 2C

DEC BUFOFS

SET POINTER BACK

2DBlil C9 41

CMP '$41

2DB2 111l lilA

BPL *+12

($2DBE) IF ALPHA THEN LOOK FOR NAME

20B4 A2 1Il1il

LOX 1$98

HERE IF TRACK NUMBER ENTERED.

2DB6 A9 76 20B8 9D 7A 2E

LOA '$76 STA SCRBUF+ 1, X

2DBB 4C 2E 2D

JMP BLDHEX

·GET TRACKI IN A ANO RETURN

;

; LOAD BY NAME

;
20BE AD E5 2C

LDA BUFOFS

GET POINTER

20CI 85 Ell

STA TSI

SAVE IT

2DC3 A9 Il8 2DC5 28 BC 26

LDA 'S98 JSR SETTK

TRACK NUMBER FOR OIRECTORY MOVE TO TRACK B

2DC8 8e 5E 26

STY SECTNM

SECTNM-lil

20CB 4C 88 2E

JMP NEWOS

JUMP AROUND A LITTLE

20CE A2 08

LDX '$88

20DIl 21l E4 2C NXTCHR JSR BUFBYT

GET BYTE FROM BUFFER

2DD3 C9 8D

CMP 1$8D

2DD5 D8 Il2

BNE *+4

($2D09) IF NOT 'CR' THEN CONTINUE

2DD7 A9 28 2DD9 DD 79 2E
2DDC DlIJ 11 2DDE E8

LDA 'S21l CMP SCRIlUF,X
BNE NXTDE INX

IF 'CR' USE 'SPACE' FOR COMPARE COMPARE TO DIRECTORY ENTRY
IF NOT = TRY NEXT ENTRY
BUMP OFFSET

2DDF 8A

TXA

2DEil 29 87

AND 'S97

2DE2 C9 86
.2DE4 Dil EA
,

CMP IS96 aNE NXTCHR

IF WE HAVEN'T LOOKED AT ALL 6 CHARACTERS THEN CONTINUE

2DE6 IlD 7A 2E

LDA SCRBUF+l,X MATCHI GET LAST TRACK'

2IJE9 85 E5

STA HSTTK

SAVE IT

2DEB BD 79 2E

LDA SCRBUF,X

GET STA~TING TRACK'

2DEE 61l 2DEF 8A

RTS NXTDE ~'XA

NEXT DIR ENTRY SETUP

2DFlil 29 F8

AND ISF8

KILL LOWER 3 BITS IN OFF~ET

2DF2 18

CLC

2DF3 69 88

AOC IS88

SET TO NEXT DIR ENTRY

2DF5 AA

TAX

2DF6 Fil Il8

BEQ NEWDS

IF END OF SECTOR GET NEXT

2DF8 AS Ell

NXTDS LDA TSI

RESTORE BUFFER OFFSET

2DFA 8D E5 2C

S'fA BUFOFS

2DFD 4C 08 2D

JMP !'IXTCHR

JUMP IlACK AND TRY AGAIN

2EIl8 EE 5E 26 NEWDS INC SEC'fNM

BUMP SECTOR NUMBER

2E83 AD 5E 26

LDA SECTNM

2E06 C9 83 2EIl8 31l 85

CMP 'S03 BMI *+7

($2E0F) IF < 3 THEN CONTINUE

2EIlA A9 OC

ERRC LDA IS0C

ERROR C, FILE NOT FOUND

2EIlC 4C 4B 2A 2E8F A9 79

JMP ERRENT LDA IS79

~ET MEMORY ADDRESS TO $2E79

2E11 85 FE

STA MEMLO

(SCRATCH BUFFER, 256 8YTE~)

2E13 A9 2E 2E15 85 FF 2E17 20 11\ 2B
;
2E1A A2 00 2E1C F0 DA

OS65D V3.2 DISASSEMBLY

PAGE: 47

LDA 1$2E STA MEMHI JSR CALL+9
LDX '$00 BEQ NXTDS

( $2B1A) LOAD HEAD, READ DISK, UNLOAD HEAD BUFFER OFFSET SEARCH THIS DIRECTORY SECTOR

)

)

OS65D V3.Z DISASSEMBLY

PAGE: 48

)
; TABLES AND STORAG~ FOR OS65D

;
; OS650 INPUT BUFF~R eSZEIE TO SZEZF

;
ZEIE

OSBUF = *+17

;
; OS65D DISPATCH TABLE

;
; ADDRESS IN TABLE = ACTUAL ADDRESS OF ROUTINE - 1
; ADDRESS IN TABLE IS PUSHED ON· STACK AND THEN CALLED
; BY DOING AN RTS ·

·
ZE30 41 53
ZE3Z DD 2A

DSPTBL · BYTE 'AS' .WORD ASM-l

2£34 42 41

.BYTE 'BA'

2E36 E5 2A

.WORD BASIC-1

2E38 43 41

.BYTE 'CA'

2E3A 13 2B

.WORD CALL-1

2E3C 44 39

· BYTE '09'

2£3£ 22 2B

.WORD 09-1

2 £411 44 49

· BYTE 'DI'

2£42 28 2B

.liORD DIR-l

2E44 45 4D

.BYT£ 'EM'

ZE46 2E 2B

.WORD EM-l

2E48 45 58

· BYTE '£X'

2E4A 36 2B

.WORD EXAM-1

2E4C 47 4F

.BY1'E 'CO'

2£4£ 45 2B

.WORD GO-1

2 £511 48 4F

.BYTE 'HO'

2£52 62 26

.WORD HOM£-1

2£54 49 4E

.BYTE 'IN'

2E56 54 2B

.WORD INIT-l

2£58 49 4F

· BYT~ '10'

2£5A 82 2B

.WORD 10-1

2E5C 4C 4F

.BYTE · LO'

2E5E A6 2B

.WORD LOAD-l

2 E61l 4D 45

· BYTE 'ME'

2£62 C5 28

.WORD MEM-1

2£64 511 55

.BYTE 'PU'

2£66 DC 2B

· WORD PU'r-l

2£68 52 45

· BYTE 'RE'

ZE6A FC 2B

.WORD R£T-1

2E6C 58 51

.BYT£ 'XQ'

2£6£ 21 2C

.WORD XQT-1

2 E71l 53 41

.BYTE 'SA'

2E72 27 2C

.WORD SAV£-1

2E74 53 45

.BYTE 'SE'

2£76 42 2C

.WORD SELECT-1

2£78 110

.BYTE II

;

; THE REST OF TH£ OS MEMORY AREA IS WORKING STORAGE LOCATIONS

·
2E79

SCRBUF = *+256

SCRATCH BUFFER FOR DIRECTORY

OS65D V3.2 DISASSEMBLY

PAGE: 49

)
;

; THIS AREA IS ALSO USED BY THE BASIC GET/PUT LOGIC.

; YOU CAN USE THIS PAGE FOR TRANSIENT CODE BY CALLING IT HERE.

; JUST BE SURE THAT YOU DON'T DO A DIRECTORY SEARCH OR USE BASIC'S

; RANDOM DISK I/O. A GOOD PLACE TO PUT SUCH CODE IS ON TRACK 8

; IN SECTORS 6 & UP SINCE THIS AREA IS NOT USED FOR ANY OTHER

.; PURPOSE ·
·
2F79 31179

SWAPll ~ *+256
SWAPl = *+256

PAGE II HOLD AREA (USED BY BASIC)

STACK

"II

"."

;

: AND THAT (FINALLY!) BRINGS US UP TO THE START OF THE BASIC WORKSPACE.

)

)

OS-65D V3.2 CROSS REFERENCE

PAGE 1

------------------------------------------------------------------------- .......

$IlAM

28E6

$ 22M

22131

$221H

22All 22A7

$22C7

22M 22AA

$2476

24115

$269£

26BF

$28£7

28FC 2904

$2CA9

2D5A

$2FA9

2D5D

$317D

2B89 2BC0 2BE3

$317E

2C25

$1"1)22

2297

$ FEll 1

2285

$FEFC

2C1C

**

235E 23611 2362 2377 2389 2390 23AB 23C2 23FC 2415 25A3

2629 262C 2638 2A4E 2B52 2D20

A.HOLD *2363 2367 2382 2395 241"2 25114 2524 2536 253C 259E 25E7

ACIA

*C1l10 2730 2735 2741 27C2 27CD 2885 292B 2986

ACIAIO *C011 2747 27C9 27D3 28BB 2930

ASM

*2ADE 2E32

BASIC *2AE6 22B3 2E36

BDMHTK *2453 244D 248B

IlDRDNX *2442 23EE

BLDHEX *2D2E 2829 283D 21146 21l4C 2B51" 2B8D 2BAD 2BD0 2BD6 2C60 2D23 2D28 208B

BPSECT *2998 28 Fa 2990 2A1B

BSPACE *251"5 25AF

BUFBYT *2CE4 2AA4 2AAF 2B55 2BB3 2B93 2BFD 2C43 203D 2062 20AA

OS-65D V3.2 CROSS REFERENCE

PAGE 2

-------------------------------------------------------------_ .. _---------

2000

BUFOFS *2CE5 2A86 2AB6 2B5C 2B8A 2B9A 2CFIJ 20AO 20BE 20FA

CALL

*2B11 2450 2E17 2E3A

CKBFEN *2468 23A3 23B9 23F4 240C

CKCOMA 2BCB 2C66

CKCTLP *25BA 257B

CKCTLX *2579 2564

CKEQL *2058 2B14 2B3A 2B90 2C2B 2C31 2067

CKH'NO *2562 254F

CKINP *2540 2COC

CKIR'I'N *2593 25(1) 2588 258C

CKROY *290A 2607

) CKTK

*26E1 260A 26FO

CLRVIO *226A 2260 227?

CLRX16 *2251 225C

CNTLP *25FC 25B3 2587

CNVHTN *26A6

COMINC *2395 238E 2380 23CA 24111 2410 2700

CR

*2603 25A7

CRLF

*206A 2A2A 2A58 2C98 2COll

01BFOH *2320 23C7 23CC 2455

01BFHI *2328 246B 2473 2477

01BFLO *2326 2306 231':1 247B 2481 2486

01CRTl< *232C 2442 244A 2458

01FRST *232A
) OlIADR *23AC 2309 23E4 24611 2470

01LAST *232B 245B

OS-65D V3.2 CROSS REFERENCE

PAGE 3

------------------------------------------------------------------------- .......

DIOADR *23C3 23DC 231:7

Ll21l~'DH *2335 241A 242a

D28FHI * 233"

D28FLO *232E 242/\ 2435

D2CRTK *2334

D2FRST *2332

D2IADR *23FD 242D 2438

D2L/\ST *2333

D20/\DR *2416 2430 2438

D9

*2823 2809 2E3E

DCPRNT *2/\41 2/\2F 2A34

DEFDEV *2/\C6 228B 2569

DELAY *27"~ 267C 269/\ 2704

DIR

*2829 2E42

DIRC1'lT *29F3 2B2C

DKlI1'l *23/\1 2308 23114

DK11'lXT *23CC 23M 238E

DKIOUT *2382 2318

DK2IN *23Fe 230D

DK2NXT *2420 23F9 2411

OK20UT *2403 2310

OK8T9

*2880 2885 2889 28C8 2802 2809 28EO 2908 2912 2910 29C3 2B25

OKBTCr *2986 2998 291\1 291\C 298F

OKINIT *29E8 29CE 29D4 29E1 29F4

OKRORY DKWTX

*2977
*27C2 2856

2974 27A6

2970 271\8

2781

27B6

27C7

282D

2833

2831l

2843

""""'
2CS1

-_._--

05-65D V3.2 CROSS REFERENCE

PAGE 4

-------------------------------------------------------------------------

DLYFA *289F 281\' 2828

DLYFA1 *2956 289F

DOINP *2339 2CD9

DOlO

*234B 233E 235C 2374

DONXIU *235C 2351

DSKBYT *27CD 27D1 27F5

DSKDR *265C 26D1 2A5E

DSKWRT *27E1 248E 2803 2BED 2C3D

DSPTBL *2E3" 2A8B 2A9S 2A9C 2AM

EM

*2B2F 2E46

ERR1

*2993

ERR2

*289B 288D

) ERR3

*27B4

ERR4

*278F 2786 278D 27EA

ERR5

*28E0

ERR6

*26DC *2C5B 26CF 2C48 2C4C 2C53 2C96

ERR7

*2AC0 2A8E 2ClF 2C5B 2D55

ERR8

*26CD 26C2 26C6

EHR9

*28BF 289D 28B3 28E9

ERRA

*28E6

ERRB

* 27 E8 27E4 27r:E

ERRC

*2E0A

ERRD

*2C94

ERRENT *2A4B 26DE 2791 28C1 2995 2A7D 2M0 2AC2 2C5D 2E0C

EXAM

*2B37 2E4A

)EXAMCN *2739 2745 274D 2751 2B43

EXCOM *2A84 2A77 2ABE

- 05-650 V3.2 CKOSS R~F~RENCE

PIIGE 5

----------------------------_._-------------------------------------------

EXI'r

*25C9 2581J 258F 25FII 26el 26"9 26311

FLOPIN *ceee 2235 22311 2230 266E 2710 2722 273C 277F 27811 2789 27F2 27FC 2880 298C 2901 29011

FLOPOT *Ce"2 2683 268C 268F 271111 2716 2719 2756 2759 2763 2799 279C 2815 2818 2822 2825 2866 2868 2907

FNOFL *20116 28117 2BOO 2071

FULINT *2868 28511

GETIIOR *2023 2811 2B37 2C2E 2CF8 20el

GETHEX *2030 2C34 2C69 202E 2037

GET'rK *2C6e 2B17 2C28

GO

*2B46 2E4E

GOIIOR *2852 2849 284F

GOBAS *22B3 2294

) HAMB
HIMEM

*2661 270C 2962 *231Hl 2280

HMFNO * 228" 2278

HOLOOP *266C 2676

HOME

*2663 276C 2940 2C55 2E52

HSTTK *""E5 27611 2AFt> 2C8H 20M 20E9

HUNOUS *28112 2810 2863 287e 281\11 28110

INl

*2336 234e

INCTKN *2C83 245E 276F 2BeB 2881 2BF4

INOS'r INECHO

*2321 *234"

23313 2879

25GC 2CII2

257F

211C7

289 "

INIT

*2855 U56

INITIIL *2768 27711 288e

INITTK *2770 2772 2865

INPUT *2C06 2336 2CD.F'

05-650 V3.2 CROSS REFERENCE

PAGE 6

-------------------------------------------------------------------------

)

10

*2B83 2E5A

1OO1SP *2376 2356

100fS *2378 2371

10TABL *2301 237A 237E

KB1NP *252B 2303 2534 25EB

KEYTST *2630 250B 25E2

K1RTN *253F 2528

KPOO

*2325 24E3 25411

KPOLL *F001l 2531

KPORT *OFIlIl 2221 2630 2640

KTRTN *2643 250£ 25E5

LAMB

*2561l 2707 2950

) LCHAR
LOCMN

*263C 259B 25CC *2AEE 2M;\J 2AE8 2B31

LOHOW1 *2728 2739 2794

LOHEAO *2754 221lC 2494 2728 2766 2A00 2B01 2BIA 2C3A 2C81l

LF

*260F 25AB

LOAO

*2BA7 2B7E 2B98 2C22 2E5E

MAXBUF *2CEO 2C90

MEM

*211C6 2£62

MEMCHK *22EC 2.278 2290

MEMH1

*00FF 220A 2262 226F 22EC 23EA 243E 2489 27H' 270F 2849 287A 2880 2891l 2896 2940 2965 2977 2AF5 2C75 2026 2E15

MEM1N *2389 2309

MEMLO *0JilFE 220F 2266 226A 22EE 22F4 22F8 230F 2433 2484 274A 270A 2840 2937 293B 2960 2AFC 2C79 202B 2E11

) MEMOT *2390 2319

MEMTST *2276 227E

OS-650 V3.2 CROSS REFERENCE

PAGE 7

------------------------------------------------------ -------------------~

MINAOR *238A 2398 2390 2499 2585 2B03 2809

MOOMIN *2497 2582

MOTADR *2391 2553 2558

MOVE

*2629 2632 2636

MOVEHO *2601 26CB 2950

NEWOS *2E0" 20CB 20F6

NMHZ

*267B 28A2

NULLIN *2386 2307

NXTCHR *2000 201::4 20~'0

NXTOE *20EF 20DC

NXTOS *20F8 2E1C

NXTENT *2ABA 2M2 2A9A 2AA9
.......
) NXTOSI *2CA2 2CB9 2CCA

NXTOSN *2C98 2CAA 2C8E

ONLYO *2BA0 2B88

OS6503 *2A51 254A 2A7A

OS8UF * 2 El f: 2CAC 2CC0

OSERR *2AC4 2MB

OSIBAO *00El 2A71 2A75 2A90 2A98 2CE6

OSINP *2C9B 2A6C

OSIOK *2CBC 2CA7 2CCE

OUTOST *2322 2346 255B 256F 2574 258E 2593 2ACA 2BA3

PAGE0 *IHlIl0 2274 28A5 2013 201B 2050

PATCH0 *22B6 2202

PATCHl *2371 2341)

)PATCH2 *2491 2462

PATCH3 *2508 2489

. '" :

-- ---- OS-65D V3.2 CROSS R~FER~NC~
- --- -- ---- -- -- - - - - - - .. - - ------- --- --- ----------- --- --- ---- ---

PAGE 9
- -- ---- ..........

SCTBYP ·1l11F9 28EB 28FE 29A9 2A19 2A37

SCTLEN ·IlIlFA 27F8 2956 2A21

SCTNUM ·IlDFB 2902 29M 2A1E

SCTHTY ·IlIlF5 28C6 28E2

SECTNM ·265E 22B6 2491 283" 28FIl 2915 2A11 2AF8 2C6C 2C7D 2DC8 2EIl" 2t1l3

SEEKRT ·2947 28E4

SELECT ·2C43 2E76

SERINP ·2518 23"5 251C

SEROUT ·2511D 2315 2511

SETDRV ·29C6 2242 29BA 2C5"

SETEHR ·2A7D 2A58

SEnoF ·2918 2933 2939

SETFLO ·2719 2697 269F 2712 2875

SETNXT ·2622 263D

SETPGM ·2C71l 28AA 28E0

SETSCT ·28C4 2811D 29D8 2953 2A14

SETTK ·26BC 22115 29F7 2AEE 2B41l 2862 2C63 2C70 2C91 2DC5

SSOK

·28E8 28DE

STACK ·1l111D 2A44 2Dll6 2D11l

STASM ·13\)0 2AE3

STBAS · 21l E4 2AE8

STCCNT · 27118 26E6

STEM

·17Il11 2834 2C12

STEP

·268t' 2688

STEPIN ·2683 2673 2692 26EA 2983

STEPOT ·268A 2663 2oF1 2989

05-650 V3.2 CROSS REFERENCE

PAGE Ie

-------------------------------------------------------------------------

)

STEPRT *00EF 221l1l 26A2 2947 2948

STKAOR *00FC 2A08 2A26 2A38

STROAO *00E3 2074 2077 2078 2087 2089 2080 208F

STROUT *2073 29FA 2ACO 2868 2CAF

SWAP

*2CF7 2052

SWAP0 *2F79 2015 2018

SWAPI *3079 20e9 200C

SWAP4 *2644 2528 2539 2547 2654 2C19

SWAP4A *0213 2646 2650

SWAP48 *2657 2649 264C

SWAPLP *2006 201E

TENMS *2678 2666 2671 2680 26M 275E 27Al 2986 298C

) TERMAC *FC00 2247 224C 24CE 240A 24F6

T ERMIN *24F6 23el 24E0 24EA 24FO

TERMIO *FC01 2406 24FF

TERMOT *24CO 2311 2403

TIRTN *2504 2508 2544

TKNHLD *00EE 2663 261lA 268C 26El 28De

TKNUM *2650 2669 26E3 26F6 26F9 2775 27AE 29C6 2C83

TORTN *24Fl 240E 24E8

TRKNM *2662 26M

TSI

*00E0 2AF3 2Be7 28AO 2BB7 28BE 28E6 21n'1I 2035 203A 2060

2065 20Cl 20F8

TS2

*00FO 22F6 22FC 2839 284B 2850 2860

UART

*F800 2227 222A 25eE 2514 2518 251E 2521

)UNLOHO *2761 2214 273F 27Ce 2A3E 2A08 282" 2tlC3 28FA 2C40

VIOOUT *2599 22AO 2313

05-650 V3.2 CROSS REFERENCE

PAGE 11

------------------------------------------------------------------------- ........

VIOSIZ *DEBe 2291

VLOS.o.V *2639 2613

VLPI

*2621:1 2623

VLP2

*262E 2626

VOTOFS *25.0.4 2504

W.o.ITIH *2710 2720 2728

WRTPG *284B 2847 2840

WRTRTY *IIBF6 28117 2888

W'l'DKBF *2477 2303 2427

X.HOLO *235F 2360

X16.o.CI *CFIIB 2251 2255 2483 24Cl 24C9 25B8

X160EV *2323 24811 248E

X16INP *248B 23lH' 2487

X160UT *2480 231F 24C6

XQT

*2C22 2E6E

Y.HOLO *2361 236.0.

2528 21~~25 JS~ $25~~

~52B £E2~23 IN~ $232~

252£ ADl1Di LDA $Dfe1

2531 3ti5 BMI $2528

2533 8D6323 STA $2363

2536 EA 2537 £A

NOP

... "

i~OF

2538 £A

NOF

2539 £A

NOF

253A EA

NOP

253B 2f4'125 JSR

253£ ADej,Df LDA

25'11 ai8 25~3 60

BPL RTS

25 .. '1 A276 LDX

25~6 CA

DEX

25,,7 2j"C25 JSR

25 ..A DjFA BN£

25"C 6f

RTS

-.-, 25 ..D C958 CMP

25~f Dell B(lI:

2551 A9 Be LDA

2553 8D9223 STA

2556 A9U LDA *UI 2558 8D9123 STA $2391 2558 AD2223 LOA $2322
255E f9 U ORA *$1'
2560 DI31 8N£ $2593
2562 C95D CMP *$5D 256~ DilU BNi: $2579 2566 2e~623 JSR $23"6 2569 ADC62A LOA $2AC6
256C 8D2123 STA $2321
256i AD2223 LOA $2322
2572 29£f Al'<D *$£, 251'l 8D2223 STA $2322
2577 A95D LDA *:i5D
2579 C918 eMP *$1B 2578 DUD BriE :i>25SA
257D A9 U LDA *:l>lfl 257f 8D2123 STA $232 j, 2532 20972 .. JSR $2'197
2585 8D8A23 STA $238A 2588 BUC BCS $2596 2

Lo .. J .f' t .(

----- - ------------

540 video

2599 9 g

TVA

259A "S

FHA

259B A\;5826 LDY $2658

259 E AD6525 LOA $2565

25Al 29H' AND *$1;

25A5 A2 ..1 LDX *$52

25A5 C9liD \;MP *$IID

25A1 ;'118 BEQ $2621

25A9 C911S (;MP *$'8

25AB te66 BEI,l $261.3

25AO C9li \;MP *$le

25Ai f1169 BEQ $261A

25Bl C9fC CMP *$'(;

25B5 l&65 BEQ $261A

25B5 C911A eMF *:UA

2581 flH" BEQ $262D

2589 C9211 \;MF *$211

25B8 511 1C BMI $25D9

25BD C91B \;MP *$18

25Bf a18 8PL $25D9

25(;1 90ellD1 STA $01e&,X

25C" Es

INX -

25C5 E;SII CPX *Sll

A- /fa cJ
strip bit 7 - {;A cA
cr
back up
contrl. P - pr'" r,~ o"'/~'" f
control L
LF
<. 5pG£ e
£. 'I-/-r
'> i
TEo . ' T s<.n~<f:'"

25C1 fll60 BEQ $2629

25C9 Dees BNE $25(;B

25CB 8(,;11101 LOY $01111,X 25CE 8C5826 STY $2658 2501 A95; LOA *$5f

tA"',J'~ (,.wflSol'L <:. l.I ~ \. 0 R.

2505 90eeD1 STA ~lit,X

2506 8EA,,25 STX $25A ..

2509 68

PLA

25DA A8

TAY

2508 A06525 LOA $2565

250E '18

PHA

250f AOIIIDf LOA $0111.

25E2 51111 8MI $25i5 25E" gD2525 STA $2525 25E1 C915 \;MF *$15

_ SQllt kf"/P~~~}~J S c:.o",,1K O L

25E9 DnA 8NE: $25f5

25E8 21",,25 JSR $25~"

25EE AOBIOf LOA SO;lIl

25f 1 (;9 II \;MF *$11

2515 Oei9 BNE $25EE

25f5 4C112.. JMP $2";1

251 8 6.

RTS

2519 SA

TXA


Adobe Acrobat 8.1 Paper Capture Plug-in

Search Any Device: