[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Boot ROM + Prodos loader listing with comments
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