[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! =-----