[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Boot ROM + Prodos loader listing with comments
*** post for FREE via your newsreader at post.newsfeed.com ***
Wow... thanks a lot....
Is this from a book?
san
"Paul R. Santa-Maria" <paulrsm@buckeye-express.com> wrote in message
414A586A.5229C033@buckeye-express.com">news:414A586A.5229C033@buckeye-express.com...
> sanjaya wrote:
> > Does anyone has the disk drive BootROM listing
>
> Lets see if I disabled that silly line wrap...
>
> ; 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
-----= Posted via Newsfeed.Com, Uncensored Usenet News =-----
http://www.newsfeed.com - The #1 Newsgroup Service in the World!
-----== 100,000 Groups! - 19 Servers! - Unlimited Download! =-----