OS65D Dissasembly Manual
rescanned by Marcus Bennett
Not Your Device? Search For Manuals or Datasheets below:
File Info : application/pdf, 68 Pages, 13.05MB
Document DEVICE REPORTOS65D Dissasembly ManualOS-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 TXAAdobe Acrobat 8.1 Paper Capture Plug-in