Date: 2005-11-23 16:31:14
On 2005-11-23, at 12:12, MagerValp wrote: >>>>>> "S" == silverdr <email@example.com> writes: > > S> I use the (faster) 1571 routine inlined and without temporary BIN > S> storage - the decoded BIN quartets go directly to output bufffers > S> rather than ZP locations. > > Since the rom disassembly is missing the vital tables: what does the > table layout and the inner loop look like? I'm about to write a table > based decoder myself, and this would give me a head start :) Since I couldn't find them in the ROM sources, I took them directly off the 1571, starting at $9f0d. I think they're too big to post here but I may send you the disassembly if you like. As for the innermost routine (5GCR24BIN) it is in the "LCCGCRBN.SRC" file of the said sources. After my recent changes it looks like the following: ; GCR conversion routine entry lda (gcr_buffer_vector),y sta gtab and #mask2 sta gtab + 1 iny bne fast_gcr_same_page10 inc gcr_buffer_vector + 1 fast_gcr_same_page10: lda (gcr_buffer_vector),y sta gtab + 2 and #mask2x ora gtab + 1 sta gtab + 1 lda gtab + 2 and #mask4 sta gtab + 3 iny lda (gcr_buffer_vector),y tax and #mask4x ora gtab + 3 sta gtab + 3 txa and #mask5 sta gtab + 4 iny lda (gcr_buffer_vector),y sta gtab + 5 and #mask5x ora gtab + 4 sta gtab + 4 lda gtab + 5 and #mask7 sta gtab + 6 iny bne fast_gcr_same_page11 inc gcr_buffer_vector + 1 fast_gcr_same_page11: lda (gcr_buffer_vector),y sta gtab + 7 and #mask7x ora gtab + 6 sta gtab + 6 iny sty gcr_pointer ldy bin_pointer ldx gtab lda LA00D,x ; a ldx gtab+1 ora L9F0D,x ; b sta (bin_buffer_vector),y iny beq end_of_sector ldx gtab+2 lda LA10D,x ; c ldx gtab+3 ora L9F0F,x ; d sta (bin_buffer_vector),y iny ldx gtab+4 lda L9F1D,x ; e ldx gtab+5 ora LA20D,x ; f sta (bin_buffer_vector),y iny ldx gtab+6 lda L9F2A,x ; g ldx gtab+7 ora LA30D,x ; h sta (bin_buffer_vector),y iny ; end of GCR conversion routine where mask1 = $f8 ; %11111000 mask2 = $07 ; %00000111 mask2x = $c0 ; %11000000 mask3 = $3e ; %00111110 mask4 = $01 ; %00000001 mask4x = $f0 ; %11110000 mask5 = $0f ; %00001111 mask5x = $80 ; %10000000 mask6 = $7c ; %01111100 mask7 = $03 ; %00000011 mask7x = $e0 ; %11100000 mask8 = $1f ; %00011111 and gtab is a 5 byte ZP buffer, which I also plan to partially eliminate. -- BSD is for people who love Unix. Linux is for people who hate Microsoft. Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.