funkheld Posted March 25, 2017 Share Posted March 25, 2017 (edited) 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 Edited March 25, 2017 by funkheld Quote Link to comment Share on other sites More sharing options...
Just Jeff Posted March 25, 2017 Share Posted March 25, 2017 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. 1 Quote Link to comment Share on other sites More sharing options...
funkheld Posted March 26, 2017 Author Share Posted March 26, 2017 hello, thanks. A funny thing and what oll bring it? greeting Quote Link to comment Share on other sites More sharing options...
Just Jeff Posted March 26, 2017 Share Posted March 26, 2017 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.