[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