Subject: Re: [stella] 13 chars C64-style From: Andrew Towers <mariofrog@xxxxxxxxxxx> Date: Wed, 10 Dec 2003 05:19:49 +1100 |
Still not enough for a whole line, but maybe someone else finds some more cycles. :-)
I rearranged the code again and added a text terminator so I could use a BNE to exit the loop, instead of the DEC-BMI-JMP sequence, saving 5 cycles. There were 8 cycles of code that seemed to have no effect on the final output! The 6-pairs encoding loop was crossing a page boundary, taking an extra 5 cycles. We had 59 spare already, bringing us up to 77 :)
Regards, Andrew.
Attachment:
13ch4.bin
Description: Binary data
;--------------------------------------------------------------------------- ; ; Generic 2600 Game ; ;--------------------------------------------------------------------------- processor 6502 include vcs.h ;--------------------------------------------------------------------------- ; Constants ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- ; RAM Variables ;--------------------------------------------------------------------------- chara equ $80 charb equ $85 charc equ $8a chard equ $8f chare equ $94 charf equ $99 charg equ $9e chars equ $a2 temp equ $a4 line equ $a5 count equ $a6 textptr equ $a7 savesp equ $a8 MAC SLEEP IF {1} = 1 ECHO "ERROR: SLEEP 1 not allowed !" END ENDIF IF {1} & 1 nop $00 REPEAT ({1}-3)/2 nop REPEND ELSE REPEAT ({1})/2 nop REPEND ENDIF ENDM MAC TEXTDISP lda charg+{1} ;3 sta ENAM0 ;3 lsr ;2 sta ENAM1 ;3 lsr ;2 sta ENABL ;3 lda charf+{1} ;3 sta GRP0 ;3 lda chare+{1} ;3 sta.w GRP1 ;4 ldx #$26+{2} ;2 nop ;2 nop ;2 stx COLUP0 ;3 stx COLUP1 ;3 lda chard+{1} ;3 sta GRP0 ;3 lda charc+{1} ;3 ldy charb+{1} ;3 stx COLUPF ;3 ldx chara+{1} ;3 sta GRP1 ;3 sty GRP0 ;3 stx GRP1 ;3 sta GRP0 ;3 lda #$20 ;2 sta COLUPF ;3 ENDM ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- org $F000 ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- ; Start of Program ;--------------------------------------------------------------------------- ; Clear memory, locate character graphics positions and such, ; initialize key memory values, start GameLoop. ;------------------------------------------------------------- Start sei cld ldx #$FF txs lda #0 clear sta 0,x dex bne clear ;--------------------------------------------------------------------------- ; Initialize variables / registers ;--------------------------------------------------------------------------- lda #$48 sta COLUP0 lda #$99 sta COLUP1 lda #255 sta PF0 sta PF1 lda #0 sta PF2 lda #%00000101 sta WSYNC sta CTRLPF sta GRP0 sta GRP1 lda #$03 ; set both players to 3 copies sta NUSIZ0 sta NUSIZ1 lda #$01 ; set vertical delay on for both players sta VDELP0 sta $2d ; nop sta RESM0 sta RESM1 sta VDELP1 sta RESBL sta RESP0 sta RESP1 lda #%11110000 sta HMP1 lda #%11100000 sta HMP0 lda #%10000000 sta HMBL lda #%10110000 sta HMM0 lda #%01010000 sta HMM1 sta WSYNC sta HMOVE ;-------------------------------------------------------------------------- ; GameLoop ;-------------------------------------------------------------------------- GameLoop jsr VSync ;start vertical retrace jsr VBlank ; spare time during screen blank jsr Picture ; draw one screen jsr overscan ; do overscan jmp GameLoop ;back to top ;-------------------------------------------------------------------------- ; VSync ;-------------------------------------------------------------------------- VSync lda #2 ;bit 1 needs to be 1 to start retrace sta VSYNC ;start retrace sta WSYNC ;wait a few lines sta WSYNC lda #44 ;prepare timer to exit blank period (44) sta TIM64T ;turn it on sta WSYNC ;wait one more sta VSYNC ;done with retrace, write 0 to bit 1 rts ; VSync ;-------------------------------------------------------------------------- ; VBlank ;-------------------------------------------------------------------------- ; Game Logic ;-------------------------------------------------------------------------- VBlank rts ; VBlank ;-------------------------------------------------------------------------- ; Overscan ;-------------------------------------------------------------------------- ; More Game Logic ;-------------------------------------------------------------------------- overscan sta WSYNC lda #$00 sta COLUBK lda #36 ; Use the timer to make sure overscan takes (34) sta TIM64T ; 30 scan lines. 29 scan lines * 76 = 2204 / 64 = 34.4 endOS lda INTIM ; We finished, but wait for timer bne endOS ; by looping till zero sta WSYNC ; End last scanline lda #$82 sta VBLANK lda #$02 sta VBLANK rts ; overscan ;-------------------------------------------------------------------------- ; Draw TV Pictures ;-------------------------------------------------------------------------- ; ;-------------------------------------------------------------------------- Picture pictureLoop lda INTIM ;check timer for end of VBLANK period bne pictureLoop ;loop until it reaches 0 sta WSYNC lda #$80 sta VBLANK ;end screen blank ; Set playfield color lda #$20 sta COLUPF lda #15 sta line lda #0 sta textptr tsx stx savesp SLEEP 46 jmp mainTextLoop ;3 ; put this here so we can jump out of the main text loop ; using a 2-cycle relative branch. quitTextLoop lda #0 sta GRP0 sta GRP1 sta GRP0 sta GRP1 sta ENAM0 sta ENAM1 sta ENABL ; restore stack pointer ldx savesp txs ldx #11 ScanLoop sta WSYNC dex bne ScanLoop sta COLUPF rts ; Picture ;------------------------------------------------------------------ align 256 mainTextLoop ; set up the stack for building screen data ldx #chars ;2 txs ;2 ; load the first text character ; note: x and y are reversed! ldy textptr ;3 ldx text,y ;4 beq quitTextLoop ;2 ->4 ; look for terminating character (0) iny ;2 ; build screen data for first character lda fontlo,x ;4 pha ;3 lda fontlo+1,x ;4 pha ;3 lda fontlo+2,x ;4 pha ;3 lda fontlo+3,x ;4 pha ;3 lda fontlo+4,x ;4 pha ;3 ; loop through the remaining 6 character pairs textLineLoop ; load the next two text characters ldx text,y ;4 lda text1,y ;4 iny ;2 sty textptr ;3 tay ;2 ; build screen data for next two characters lda fonthi,x ;4 ora fontlo,y ;4 pha ;3 lda fonthi+1,x ;4 ora fontlo+1,y ;4 pha ;3 lda fonthi+2,x ;4 ora fontlo+2,y ;4 pha ;3 lda fonthi+3,x ;4 ora fontlo+3,y ;4 pha ;3 lda fonthi+4,x ;4 ora fontlo+4,y ;4 pha ;3 ; next character pair ldy textptr ;3 tsx ;2 bmi textLineLoop ;2 ; now render it asap ;;sta WSYNC ;;SLEEP 77 ; 15+23+12 ;lda #255 ;2 didn't seem to have any effect ;) ;sta GRP0 ;3 ;sta GRP1 ;3 [59] TEXTDISP 0,0 TEXTDISP 1,2 TEXTDISP 2,4 TEXTDISP 3,6 TEXTDISP 4,8 lda #0 ;2 sta COLUP0 ;3 sta COLUP1 ;3 ;sta GRP0 ;sta GRP1 ;sta GRP0 ;sta ENAM0 ;sta ENAM1 sta.w ENABL ;4 use up one extra cycle left over! jmp mainTextLoop ;3 ;------------------------------------------------------------------ ;------------------------------------------------------------------ ;--------------------------------------------------------------------------- ; note: dasm doesn't like using x or y as a label! align 256 text byte t ,h ,r ,e ,n ,h ,r byte _ ,_ ,_ ,e ,o ,ast,_ byte eq ,eq ,eq ,eq ,eq ,eq ,eq byte t ,h ,s ,i ,_ ,_ ,_ byte w ,h ,l ,_ ,u ,c ,_ byte o ,f ,s ,u ,f ,i ,a byte w ,r ,t ,n ,_ ,o ,_ byte t ,e ,t ,t ,e ,n ,w byte t ,e ,t ,r ,u ,i ,e byte i ,s ,i ,_ ,o ,_ ,_ byte ast,ast,e ,yy ,c ,o ,ast byte yy ,e ,_ ,t ,i ,_ ,_ byte a ,c ,u ,l ,yy ,_ ,_ byte eq ,eq ,eq ,eq ,eq ,eq ,eq byte o ,n ,_ ,o ,e ,l ,n byte 0 ; terminate text text1 byte 0 ,i ,t ,e ,c ,a ,s byte 0 ,ast,d ,m ,_ ,_ ,_ byte 0 ,eq ,eq ,eq ,eq ,eq ,eq byte 0 ,i ,_ ,s ,a ,_ ,_ byte 0 ,o ,e ,b ,n ,h ,_ byte 0 ,_ ,t ,f ,_ ,_ ,m byte 0 ,i ,i ,g ,t ,_ ,_ byte 0 ,s ,_ ,h ,_ ,e ,_ byte 0 ,xx ,_ ,o ,t ,n ,_ byte 0 ,_ ,t ,n ,t ,_ ,_ byte 0 ,v ,r ,_ ,o ,l ,ast byte 0 ,s ,i ,_ ,s ,_ ,_ byte 0 ,t ,a ,l ,_ ,_ ,_ byte 0 ,eq ,eq ,eq ,eq ,eq ,eq byte 0 ,e ,m ,r ,_ ,i ,e ;--------------------------------------------------------------------------- align 256 fonthi eof byte %00000000 ; value not used, address must be zero _ byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 a byte %10100000 byte %10100000 byte %11100000 byte %10100000 byte %01000000 b byte %11000000 byte %10100000 byte %11000000 byte %10100000 byte %11000000 c byte %01100000 byte %10000000 byte %10000000 byte %10000000 byte %01100000 d byte %11000000 byte %10100000 byte %10100000 byte %10100000 byte %11000000 e byte %11100000 byte %10000000 byte %11000000 byte %10000000 byte %11100000 f byte %10000000 byte %10000000 byte %11000000 byte %10000000 byte %11100000 g byte %01100000 byte %10100000 byte %10100000 byte %10000000 byte %01100000 h byte %10100000 byte %10100000 byte %11100000 byte %10100000 byte %10100000 i byte %01000000 byte %01000000 byte %01000000 byte %01000000 byte %01000000 j byte %10000000 byte %01000000 byte %01000000 byte %01000000 byte %11100000 k byte %10100000 byte %10100000 byte %11000000 byte %10100000 byte %10000000 l byte %11100000 byte %10000000 byte %10000000 byte %10000000 byte %10000000 m byte %10100000 byte %10100000 byte %10100000 byte %11100000 byte %10100000 n byte %10100000 byte %10100000 byte %10100000 byte %10100000 byte %11000000 o byte %01000000 byte %10100000 byte %10100000 byte %10100000 byte %01000000 p byte %10000000 byte %10000000 byte %11000000 byte %10100000 byte %11000000 q byte %01100000 byte %11100000 byte %10100000 byte %10100000 byte %01000000 r byte %10100000 byte %10100000 byte %11000000 byte %10100000 byte %11000000 s byte %11000000 byte %00100000 byte %01000000 byte %10000000 byte %01100000 t byte %01000000 byte %01000000 byte %01000000 byte %01000000 byte %11100000 u byte %01100000 byte %10100000 byte %10100000 byte %10100000 byte %10100000 v byte %01000000 byte %01000000 byte %10100000 byte %10100000 byte %10100000 w byte %10100000 byte %11100000 byte %10100000 byte %10100000 byte %10100000 xx byte %10100000 byte %10100000 byte %01000000 byte %10100000 byte %10100000 yy byte %01000000 byte %01000000 byte %01000000 byte %10100000 byte %10100000 z byte %11100000 byte %10000000 byte %01000000 byte %00100000 byte %11100000 ast byte %10100000 byte %01000000 byte %11100000 byte %01000000 byte %10100000 eq byte %00000000 byte %11100000 byte %00000000 byte %11100000 byte %00000000 align 256 fontlo ;eof byte %00000000 ;_ byte %00000000 byte %00000000 byte %00000000 byte %00000000 byte %00000000 ;a byte %00001010 byte %00001010 byte %00001110 byte %00001010 byte %00000100 ;b byte %00001100 byte %00001010 byte %00001100 byte %00001010 byte %00001100 ;c byte %00000110 byte %00001000 byte %00001000 byte %00001000 byte %00000110 ;d byte %00001100 byte %00001010 byte %00001010 byte %00001010 byte %00001100 ;e byte %00001110 byte %00001000 byte %00001100 byte %00001000 byte %00001110 ;f byte %00001000 byte %00001000 byte %00001100 byte %00001000 byte %00001110 ;g byte %00000110 byte %00001010 byte %00001010 byte %00001000 byte %00000110 ;h byte %00001010 byte %00001010 byte %00001110 byte %00001010 byte %00001010 ;i byte %00000100 byte %00000100 byte %00000100 byte %00000100 byte %00000100 ;j byte %00001000 byte %00000100 byte %00000100 byte %00000100 byte %00001110 ;k byte %00001010 byte %00001010 byte %00001100 byte %00001010 byte %00001000 ;l byte %00001110 byte %00001000 byte %00001000 byte %00001000 byte %00001000 ;m byte %00001010 byte %00001010 byte %00001010 byte %00001110 byte %00001010 ;n byte %00001010 byte %00001010 byte %00001010 byte %00001010 byte %00001100 ;o byte %00000100 byte %00001010 byte %00001010 byte %00001010 byte %00000100 ;p byte %00001000 byte %00001000 byte %00001100 byte %00001010 byte %00001100 ;q byte %00000110 byte %00001110 byte %00001010 byte %00001010 byte %00000100 ;r byte %00001010 byte %00001010 byte %00001100 byte %00001010 byte %00001100 ;s byte %00001100 byte %00000010 byte %00000100 byte %00001000 byte %00000110 ;t byte %00000100 byte %00000100 byte %00000100 byte %00000100 byte %00001110 ;u byte %00000110 byte %00001010 byte %00001010 byte %00001010 byte %00001010 ;v byte %00000100 byte %00000100 byte %00001010 byte %00001010 byte %00001010 ;w byte %00001010 byte %00001110 byte %00001010 byte %00001010 byte %00001010 ;xx byte %00001010 byte %00001010 byte %00000100 byte %00001010 byte %00001010 ;yy byte %00000100 byte %00000100 byte %00000100 byte %00001010 byte %00001010 ;z byte %00001110 byte %00001000 byte %00000100 byte %00000010 byte %00001110 ;ast byte %00001010 byte %00000100 byte %00001110 byte %00000100 byte %00001010 ;eq byte %00000000 byte %00001110 byte %00000000 byte %00001110 byte %00000000 ;--------------------------------------------------------------------------- ; Program Startup ;--------------------------------------------------------------------------- org $FFFC .word Start .word Start
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [stella] 13 chars C64-style, Thomas Jentzsch | Thread | Re: [stella] 13 chars C64-style, Thomas Jentzsch |
Re: [stella] 13 chars C64-style, Paul Slocum | Date | Re: [stella] tia hue luminance, A Braunsdorf |
Month |