Jump to content

TIA timing not working as expected


Recommended Posts

Hi, to better understand how a display is drawn onto the screen with CPU timing, I'm trying to remove first 8 pixels on the left side and output 192 lines (similar to Activision).

However code below shows the last line only partially (43 pixels). Any idea why this is broken?


Also with the vblank timing it seems you can only start drawing at position 7 or 10 so I wonder if Activision used instead a playfield or did they use a timer instead? What is the typical way to render?






    processor 6502
    include "vcs.h"
    include "macro.h"

    ORG $F000

    ; set TIA to known state (clear to 0)

            lda #0
            ldx #0
.zapTIA     sta 0,x
            cpx #$40
            bne .zapTIA

  ; Start of vertical blank processing
            lda #0
            sta VBLANK
            sta COLUBK              ; background colour to black

   ; 3 scanlines of vertical sync signal

            lda #%00000010
            sta VSYNC               ; turn ON VSYNC bit 1

            sta WSYNC               ; wait a scanline
            sta WSYNC               ; another
            sta WSYNC               ; another = 3 lines total

            lda #0
            sta VSYNC               ; turn OFF VSYNC bit 1

    ; 37 scanlines of vertical blank
            ldx #0
vBlank      sta WSYNC
            cpx #37
            bne vBlank

    ; 192 scanlines of picture

        ldx #10
        sta WSYNC               ; wait to the start of the next scanline
        sta COLUBK              ; black for first 10 pixels due to display bug
            ; 68 + 8 pixels = 76 / 3 = 25.33 CPU cycles
            ; skip 68 clock counts = 22.67 CPU cycles
        REPEAT 10
            nop                 ; 3+20 cycles
        ; 160 pixels = 53.33 cpu cycles
        stx COLUBK              ; put a colour in the background
        cpx #202    ; CA
        bne doPicture

        lda #0
        sta COLUBK              ; remaining background to black

    ; 30 lines of overscan

        ldx #0
        sta WSYNC               ; wait a scanline
        cpx #30
        bne doOverscan

        jmp newFrame

; the CPU reset vectors


    .word Reset          ; NMI
    .word Reset          ; RESET
    .word Reset          ; IRQ





Link to comment
Share on other sites

Actually see now I simply are missing WSYNC before I set it to black. I still wonder what the best pattern is to draw the screen and remove the first 8 pixels on the left? Is it timer based?


        sta WSYNC               ; wait to the start of the next scanline
        lda #0
        sta COLUBK              ; remaining background to black
Link to comment
Share on other sites

One thing to add for anyone else learning how TIA timing works, in Stella you can see exactly the position when entering the debugger (key `) and then check 'Scn Ln' & 'Pixel Pos' on top. When you step through the code you also see small white dot moving on the mini screen (I wish you could make that upper left window bigger).


Still wonder what is the best pattern to mask the first 8 pixels on the left and how for example Pitfall! did this.

Edited by lucienEn
Link to comment
Share on other sites

  • 8 months later...

Not sure why no one ever answered, as it's well known.


This was done by strobing the HMOVE register on every scan line.


Normally, when you strobe HMOVE to shift the players, missiles, and ball to the left or right by whatever values you've indicated for each of them, you get a black line 8 pixels long at the beginning of that scan line.


In games where HMOVE was strobed only on specific lines because of the way the game screen was divided up into horizontal bands or zones, you can see a "comb" of these black lines along the left edge of the screen.


What Activision decided to do was strobe HMOVE on every scan line so this "comb" effect wasn't apparent, since those black lines are on every scan line instead of on only some of the scan lines.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...