sanjaya wrote: > Does anyone has the disk drive BootROM listing ; APPLE II BOOT ROM -- APPLE II DISK CONTROLLER ; THIS CODE RESIDES FROM $C600 TO $C6FF ; WHEN THE DISK CONTROLLER IS IN SLOT 6. ; IT LOADS TRACK 0 SECTOR 0 INTO MEMORY ; AT $0800 AND JUMPS TO $0801. ORG $C600 ;SLOT 6 Z26 EQU $26 ;SECTOR BUFFER POINTER Z27 EQU $27 ; Z2B EQU $2B ;SLOT NUMBER * 16 FOR INDEX Z3C EQU $3C ;WORK BYTE Z3D EQU $3D ;SECTOR WANTED Z40 EQU $40 ;TRACK FOUND Z41 EQU $41 ;TRACK WANTED ; BUILD READ TRANSLATE TABLE C600 A2 20 HC600 LDX #$20 ;SIGNATURE C602 A0 00 LDY #$00 ;INIT TABLE VALUE INDICATOR C604 A2 03 LDX #$03 C606 86 3C HC606 STX Z3C ;STORE BIT PATTERN C608 8A TXA C609 0A ASL A ;SHIFT PATTERN LEFT ONE BIT C60A 24 3C BIT Z3C ;ARE THERE ANY TWO ADJACENT BITS ON? C60C F0 10 BEQ HC61E ;=>NO, TRY ANOTHER PATTERN C60E 05 3C ORA Z3C ;YES, TURN OFF RIGHTMOST OF EACH GROUP OF ZEROES C610 49 FF EOR #$FF ;FLIP BITS, PAIR OF ZERO BITS NOW SINGLE ONE BIT C612 29 7E AND #$7E ;HIGH BIT ALWAYS ON/TURN OF BIT WE MISSED BEFORE C614 B0 08 HC614 BCS HC61E ;=> C616 4A LSR A ;SHIFT PATTERN RIGHT, MUST HAVE ONLY ONE BIT ON C617 D0 FB BNE HC614 ;=>IF MORE THAN ONE BIT ON, TRY ANOTHER PATTERN C619 98 TYA ;FOUND ONE, GET TABLE VALUE C61A 9D 56 03 STA H0356,X ;AND STORE IT IN TABLE C61D C8 INY ;INCREMENT TABLE VALUE INDICATOR C61E E8 HC61E INX ;GET NEXT BIT PATTERN, DONE YET? C61F 10 E5 BPL HC606 ;=>NO, GO CHECK IT OUT ; DETERMINE SLOT, TURN DRIVE ON C621 20 58 FF JSR IORTS ;CALL A KNOWN RTS C624 BA TSX ;GET STACK POINTER C625 BD 00 01 LDA H0100,X ;GET HIGH BYTE OF WHERE WE ARE C628 0A ASL A ;TIMES 16 TO GET SLOT C629 0A ASL A C62A 0A ASL A C62B 0A ASL A C62C 85 2B STA Z2B ;SAVE SLOT C62E AA TAX ;PUT IN X REG FOR INDEX C62F BD 8E C0 LDA SETRD,X ;INSURE READ MODE C632 BD 8C C0 LDA RDREG,X C635 BD 8A C0 LDA DRSEL,X ;SELECT DRIVE 1 C638 BD 89 C0 LDA MOTON,X ;TURN THE MOTOR ON ; RECALIBRATE DISK ARM C63B A0 50 LDY #$50 ;PREPARE TO STEP THE ARM 80 PHASES C63D BD 80 C0 HC63D LDA P0OFF,X ;TURN A PHASE OFF C640 98 TYA ;PUT COUNTER IN ACCUMULATOR C641 29 03 AND #$03 ;CREATE A PHASE NUMBER C643 0A ASL A ;DOUBLE IT FOR PROPER INDEX C644 05 2B ORA Z2B ;COMBINE WITH SLOT FOR FINAL INDEX C646 AA TAX ;PUT INDEX IN X REGISTER C647 BD 81 C0 LDA P0ON,X ;TURN A PHASE ON C64A A9 56 LDA #$56 ;DELAY ABOUT 20 MICROSECONDS C64C 20 A8 FC JSR WAIT C64F 88 DEY ;DECREMENT COUNTER C650 10 EB BPL HC63D ;=>LOOP UNTIL ALL 80 ARE DONE ; INITIALIZATION C652 85 26 STA Z26 C654 85 3D STA Z3D ;SECTOR TO FIND -> $00 C656 85 41 STA Z41 ;TRACK TO FIND -> $00 C658 A9 08 LDA #$08 C65A 85 27 STA Z27 ;MAIN BUFFER POINTER -> $0800 C65C 18 HC65C CLC ;CLEAR THE CARRY C65D 08 HC65D PHP ;PUSH STATUS ON STACK ; SEARCH FOR A VALID HEADER C65E BD 8C C0 HC65E LDA RDREG,X ;CHECK DATA REGISTER C661 10 FB BPL HC65E ;=>LOOP UNTIL DATA IS VALID C663 49 D5 HC663 EOR #$D5 ;IS IT A $D5 C665 D0 F7 BNE HC65E ;=>NO, TRY AGAIN C667 BD 8C C0 HC667 LDA RDREG,X ;YES, CHECK REGISTER AGAIN C66A 10 FB BPL HC667 ;=>LOOP UNTIL VALID C66C C9 AA CMP #$AA ;IS IT AN $AA C66E D0 F3 BNE HC663 ;=>NO, SEE IF IT'S A $D5 C670 EA NOP ;YES, DELAY FOR REGISTER TO CLEAR C671 BD 8C C0 HC671 LDA RDREG,X ;CHECK REGISTER C674 10 FB BPL HC671 ;=>LOOP UNTIL VALID C676 C9 96 CMP #$96 ;IS IT A $96 C678 F0 09 BEQ HC683 ;=>YES, WE FOUND AN ADDRESS HEADER C67A 28 PLP ;NO, HAVE WE FOUND ONE PREVIOUSLY? C67B 90 DF BCC HC65C ;=>IF NOT, START OVER C67D 49 AD EOR #$AD ;WAS IT AN $AD? C67F F0 25 BEQ HC6A6 ;=>YES, WE FOUND A DATA HEADER C681 D0 D9 BNE HC65C ;=>NO, START OVER ; DECODE ADDRESS FIELD C683 A0 03 HC683 LDY #$03 ;INITIALIZE COUNTER C685 85 40 HC685 STA Z40 ;SAVE VALUE DECODED, WILL BE TRACK ON LAST PASS C687 BD 8C C0 HC687 LDA RDREG,X ;READ DATA REGISTER C68A 10 FB BPL HC687 ;=>LOOP UNTIL DATA VALID C68C 2A ROL A ;SHIFT BITS INTO POSITION X1X1X1X1 C68D 85 3C STA Z3C ;SAVE FOR LATER C68F BD 8C C0 HC68F LDA RDREG,X ;READ REGISTER FOR NEXT BYTE C692 10 FB BPL HC68F ;=>LOOP UNTIL VALID C694 25 3C AND Z3C ;COMBINE WITH PREVIOUS 1X1X1X1X AND X1X1X1X1 C696 88 DEY ;DECREMENT COUNTER, DONE YET? C697 D0 EC BNE HC685 ;=>NO, DO ANOTHER C699 28 PLP ;KEEP THE STACK CLEAN C69A C5 3D CMP Z3D ;IS THIS SECTOR WE WANT? C69C D0 BE BNE HC65C ;=>NO, START OVER C69E A5 40 LDA Z40 ;GET TRACK FOUND C6A0 C5 41 CMP Z41 ;IS IT TRACK WE WANT? C6A2 D0 B8 BNE HC65C ;=>NO, START OVER C6A4 B0 B7 BCS HC65D ;=>YES, INDICATE ADDRESS FOUND, GO LOOK FOR DATA FIELD ; READ DATA FIELD C6A6 A0 56 HC6A6 LDY #$56 ;INITIALIZE OFFSET (AUXILIARY BUFFER) C6A8 84 3C HC6A8 STY Z3C C6AA BC 8C C0 HC6AA LDY RDREG,X ;READ DATA REGISTER C6AD 10 FB BPL HC6AA ;=>LOOP UNTIL VALID C6AF 59 D6 02 EOR H02D6,Y ;EXCLUSIVE-OR WITH TRANLSATE TABLE C6B2 A4 3C LDY Z3C C6B4 88 DEY ;DECREMENT OFFSET C6B5 99 00 03 STA H0300,Y ;STORE BYTE IN AUXILIARY BUFFER C6B8 D0 EE BNE HC6A8 ;=>LOOP UNTIL BUFFER FULL C6BA 84 3C HC6BA STY Z3C ;INITIALIZE OFFSET (MAIN BUFFER) C6BC BC 8C C0 HC6BC LDY RDREG,X ;READ DATA REGISTER C6BF 10 FB BPL HC6BC ;=>LOOP UNTIL VALID C6C1 59 D6 02 EOR H02D6,Y ;EXCLUSIVE-OR WITH TRANSLATE TABLE C6C4 A4 3C LDY Z3C C6C6 91 26 STA (Z26),Y ;STORE BYTE IN MAIN BUFFER C6C8 C8 INY ;INCREMENT OFFSET C6C9 D0 EF BNE HC6BA ;=>LOOP UNTIL BUFFER FULL C6CB BC 8C C0 HC6CB LDY RDREG,X ;READ DATA REGISTER C6CE 10 FB BPL HC6CB ;=>LOOP UNTIL VALID C6D0 59 D6 02 EOR H02D6,Y ;IS CHECKSUM OKAY? C6D3 D0 87 HC6D3 BNE HC65C ;=>NO, START OVER ; MERGE MAIN AND AUXILIARY BUFFERS C6D5 A0 00 LDY #$00 ;INITIALIZE OFFSET (MAIN BUFFER) C6D7 A2 56 HC6D7 LDX #$56 ;INITIALIZE OFFSET (AUXILIARY BUFFER) C6D9 CA HC6D9 DEX ;DECREMENT OFFSET (AUX BUFFER) C6DA 30 FB BMI HC6D7 ;=>IF LESS THAT ZERO RESET IT C6DC B1 26 LDA (Z26),Y ;GET BYTE FROM MAIN BUFFER C6DE 5E 00 03 LSR H0300,X C6E1 2A ROL A ;ROLL IN TWO BITS FROM AUXILIARY BUFFER C6E2 5E 00 03 LSR H0300,X C6E5 2A ROL A C6E6 91 26 STA (Z26),Y ;SAVE COMPLETED DATA BYTE C6E8 C8 INY ;INCREMENT OFFSET (MAIN BUFFER) C6E9 D0 EE BNE HC6D9 ;=>LOOP UNTIL WHOLE BUFFER IS DONE ; DETERMINE IF THERE IS MORE TO DO C6EB E6 27 INC Z27 ;INCREMENT MAIN BUFFER POINTER C6ED E6 3D INC Z3D ;INCREMENT SECTOR NUMBER C6EF A5 3D LDA Z3D C6F1 CD 00 08 CMP H0800 ;IS THERE ANOTHER SECTOR TO LOAD? C6F4 A6 2B LDX Z2B C6F6 90 DB BCC HC6D3 ;=>YES, GO DO IT C6F8 4C 01 08 JMP H0801 ;==>NO, ENTER CODE WE JUST LOADED ; UNUSED C6FB 00 .DB $00 ;........ C6FC 00 .DB $00 ;........ C6FD 00 .DB $00 ;........ C6FE 00 .DB $00 ;........ C6FF 00 .DB $00 ;........ H0100 EQU $0100 ;SYSTEM STACK H02D6 EQU $02D6 ;TRANSLATE TABLE - $80 H0300 EQU $0300 ;AUXILIARY BUFFER H0356 EQU $0356 ;TRANSLATE TABLE H0800 EQU $0800 ;SECTORS TO LOAD H0801 EQU $0801 ;ENTRY POINT P0OFF EQU $C080 ;PHASE 0 OFF P0ON EQU $C081 ;PHASE 0 ON MOTOFF EQU $C088 ;MOTOR OFF MOTON EQU $C089 ;MOTOR ON DRSEL EQU $C08A ;DRIVE SELECT RDREG EQU $C08C ;READ DATA REGISTER SETRD EQU $C08E ;SET READ MODE WAIT EQU $FCA8 ;MONITOR WAIT ROUTINE IORTS EQU $FF58 ;RTS