Jump to content

Photo

Why appears here "hello world" 2x.


3 replies to this topic

#1 funkheld OFFLINE  

funkheld

    Chopper Commander

  • 214 posts

Posted Sat Mar 25, 2017 4:51 AM

Hi good afternoon.
 
Why appears here "hello world" 2x.
 
Thank you.
greeting
 
 
PROCESSOR 6502
INCLUDE "vcs.h"
 
ORG $F000         ; Start of "cart area" (see Atari memory map)
 
StartFrame:
lda #%00000010    ; Vertical sync is signaled by VSYNC's bit 1...
sta VSYNC
REPEAT 3          ; ...and lasts 3 scanlines
 sta WSYNC       ; (WSYNC write => wait for end of scanline)
REPEND
lda #0
sta VSYNC         ; Signal vertical sync by clearing the bit
 
PreparePlayfield:   ; We'll use the first VBLANK scanline for setup 
lda #124
sta COLUBK        ; Background color
lda #0 
lda #$1f          ; Playfield collor 
sta COLUPF
 
ldx #0            ; X will count visible scanlines, let's reset it
REPEAT 37         ; Wait until this (and the other 36) vertical blank
sta WSYNC     ; scanlines are finished
REPEND
lda #0            ; Vertical blank is done, we can "turn on" the beam
sta VBLANK
 
Scanline:
cpx #174          ; "HELLO WORLD" = (11 chars x 8 lines - 1) x 2 scanlines =
bcs ScanlineEnd   ; 174 (0 to 173). After that, skip drawing code
txa               ; We want each byte of the hello world phrase on 2 scanlines,
lsr               ; which means Y (bitmap counter) = X (scanline counter) / 2.
tay               ; For division by two we use (A-only) right-shift
lda Phrase,y      ; "Phrase,Y" = mem(Phrase+Y) (Y-th address after Phrase)
sta PF1           ; Put the value on PF bits 4-11 (0-3 is PF0, 12-15 is PF2)
ScanlineEnd:
sta WSYNC         ; Wait for scanline end
inx               ; Increase counter; repeat untill we got all kernel scanlines
cpx #191
bne Scanline
 
Overscan:
lda #%01000010    ; "turn off" the beam again...
sta VBLANK        ;
REPEAT 30         ; ...for 30 overscan scanlines...
sta WSYNC
REPEND
jmp StartFrame    ; ...and start it over!
 
Phrase:
.BYTE %00000000 ; H
.BYTE %01000010
.BYTE %01111110
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %00000000
.BYTE %00000000 ; E
.BYTE %01111110
.BYTE %01000000
.BYTE %01111100
.BYTE %01000000
.BYTE %01000000
.BYTE %01111110
.BYTE %00000000
.BYTE %00000000 ; L
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01111110
.BYTE %00000000
.BYTE %00000000 ; L
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01111110
.BYTE %00000000 ; O
.BYTE %00000000
.BYTE %00111100
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %00111100
.BYTE %00000000
.BYTE %00000000 ; white space
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000
.BYTE %00000000 ; W
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %01011010
.BYTE %00100100
.BYTE %00000000
.BYTE %00000000 ; O
.BYTE %00111100
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %01000010
.BYTE %00111100
.BYTE %00000000
.BYTE %00000000 ; R
.BYTE %01111100
.BYTE %01000010
.BYTE %01000010
.BYTE %01111100
.BYTE %01000100
.BYTE %01000010
.BYTE %00000000
.BYTE %00000000 ; L
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01000000
.BYTE %01111110
.BYTE %00000000
.BYTE %00000000 ; D
.BYTE %01111000
.BYTE %01000100
.BYTE %01000010
.BYTE %01000010
.BYTE %01000100
.BYTE %01111000
.BYTE %00000000 ; Last byte written to PF1 (important, ensures lower tip
; of letter "D" won't "bleeed")
 
ORG $FFFA             ; Cart config (so 6502 can start it up)
 
.WORD StartFrame      ; NMI
.WORD StartFrame      ; RESET
.WORD StartFrame      ; IRQ
 
  END

Attached Thumbnails

  • Bild11.jpg

Edited by funkheld, Sat Mar 25, 2017 4:51 AM.


#2 BNE Jeff OFFLINE  

BNE Jeff

    Moonsweeper

  • 288 posts
  • Location:Virginia, USA

Posted Sat Mar 25, 2017 7:52 AM

As designed, Atari will either repeat or reflect the left half of the playfield graphics on the right side.  In this case, you are repeating the left side.  Try storing a #1 to register CTRLPF and you will see your words reflected on the right half.

 

Note:  many programs avoid repeating or reflecting the play field by changing those graphics registers with precise timing- after the beam has passed the left side but not yet reached the right side.



#3 funkheld OFFLINE  

funkheld

    Chopper Commander

  • Topic Starter
  • 214 posts

Posted Sun Mar 26, 2017 8:27 AM

hello, thanks.

 

A funny thing and what oll bring it?

 

greeting



#4 BNE Jeff OFFLINE  

BNE Jeff

    Moonsweeper

  • 288 posts
  • Location:Virginia, USA

Posted Sun Mar 26, 2017 8:37 AM

Hmm I'm not sure I understand your question.  They did it to save money, memory, and machine time.  The TIA only uses 3 bytes for the playfield registers this way.  The games they imagined during the design- Combat, Pong, etc  use reflected playfields for example.






0 user(s) are browsing this forum

0 members, 0 guests, 0 anonymous users