Skip to navigation

Elite on the BBC Micro and NES

Drawing pixels: CPIX2, Removed

[Elite-A, Docked]

Name: CPIX2, Removed [Show more] Type: Subroutine Category: Drawing pixels Summary: Draw a single-height dash on the dashboard Deep dive: Drawing colour pixels in mode 5
Context: See this subroutine in context in the source code References: No direct references to this subroutine in this source file

Draw a single-height mode 5 dash (1 pixel high, 2 pixels wide).
Arguments: X1 The screen pixel x-coordinate of the dash Y1 The screen pixel y-coordinate of the dash COL The colour of the dash as a mode 5 character row byte
\ --- Mod: Code removed for Elite-A: ------------------> \.CPIX2 \ \ LDA Y1 \ Fetch the y-coordinate into A \ \ TAY \ Store the y-coordinate in Y \ \ LSR A \ Set A = A / 8, so A now contains the character row we \ LSR A \ need to draw in (as each character row contains 8 \ LSR A \ pixel rows) \ \ ORA #&60 \ Each character row in Elite's screen mode takes up one \ \ page in memory (256 bytes), so we now OR with &60 to \ \ get the page containing the dash (see the comments in \ \ routine TT26 for more discussion about calculating \ \ screen memory addresses) \ \ STA SCH \ Store the screen page in the high byte of SC(1 0) \ \ LDA X1 \ Each character block contains 8 pixel rows, so to get \ AND #%11111000 \ the address of the first byte in the character block \ \ that we need to draw into, as an offset from the start \ \ of the row, we clear bits 0-2 \ \ STA SC \ Store the address of the character block in the low \ \ byte of SC(1 0), so now SC(1 0) points to the \ \ character block we need to draw into \ \ TYA \ Set Y to just bits 0-2 of the y-coordinate, which will \ AND #%00000111 \ be the number of the pixel row we need to draw into \ TAY \ within the character block \ \ LDA X1 \ Copy bits 0-1 of X1 to bits 1-2 of X, and clear the C \ AND #%00000110 \ flag in the process (using the LSR). X will now be \ LSR A \ a value between 0 and 3, and will be the pixel number \ TAX \ in the character row for the left pixel in the dash. \ \ This is because each character row is one byte that \ \ contains 4 pixels, but covers 8 screen coordinates, so \ \ this effectively does the division by 2 that we need \ \ LDA CTWOS,X \ Fetch a mode 5 1-pixel byte with the pixel position \ AND COL \ at X, and AND with the colour byte so that pixel takes \ \ on the colour we want to draw (i.e. A is acting as a \ \ mask on the colour byte) \ \ EOR (SC),Y \ Draw the pixel on-screen using EOR logic, so we can \ STA (SC),Y \ remove it later without ruining the background that's \ \ already on-screen \ \ LDA CTWOS+1,X \ Fetch a mode 5 1-pixel byte with the pixel position \ \ at X+1, so we can draw the right pixel of the dash \ \ BPL CP1 \ The CTWOS table has an extra row at the end of it that \ \ repeats the first value, %10001000, so if we have not \ \ fetched that value, then the right pixel of the dash \ \ is in the same character block as the left pixel, so \ \ jump to CP1 to draw it \ \ LDA SC \ Otherwise the left pixel we drew was at the last \ ADC #8 \ position of four in this character block, so we add \ STA SC \ 8 to the screen address to move onto the next block \ \ along (as there are 8 bytes in a character block). \ \ The C flag was cleared above, so this ADC is correct \ \ LDA CTWOS+1,X \ Re-fetch the mode 5 1-pixel byte, as we just overwrote \ \ A (the byte will still be the fifth byte from the \ \ table, which is correct as we want to draw the \ \ leftmost pixel in the next character along as the \ \ dash's right pixel) \ \.CP1 \ \ AND COL \ Apply the colour mask to the pixel byte, as above \ \ EOR (SC),Y \ Draw the dash's right pixel according to the mask in \ STA (SC),Y \ A, with the colour in COL, using EOR logic, just as \ \ above \ \ RTS \ Return from the subroutine \ --- End of removed code ----------------------------->