{{:base:3ddotscroll.jpg?200|}} Executable prg file {{:base:3ddotscroll.zip|}} ;USED ASSEMBLER 64tass v1.45 ;THIS IS THE EXAMPLE CODE OF 3D DOT SCROLL ON THE C64 ;NO IRQ, WITHOUT MSX, NO DOUBBLE BUFFERING THIS IS ONLY SAMPLE ;I VERY LIKE THIS ART ON THIS COMPUTER ;THE RULE IS SIMPLE - ON THE 3D TRAJECTORY DATA OF CHARSET ARE WRITTING ;THE TRAJECTORY WAS PREPARED IN MY PROGRAM CREATED IN DELPHI ;======================= ;= C64 3D DOT SCROLL = ;= BY WEGI /BS/SMR/FTM = ;======================= *= $0801 ;BASIC LINE START .BYTE $0B,$08,$90,$06,$9E,$32 .BYTE $30,$34,$39,$00,$A0,$00 ;-------- COUNTLINES = 8 ;8 LINES IN CHAR COUNTCHAR = 16 ;16 CHARS TO SHIFT LENLOOP = $62 ;LENGTH LOOP FOR SPEEDCODE ITERATION STOREPLOT = $04 ;4 VECTOR FOR STORE MISC DATA VECTR1 = $06 VECTR2 = $08 VECTR3 = $0A SCREEN = $2000 ;SCREEN ADDRES SPEEDCODE = $4000 ;UNROLED CODE ADDRES FOR DISPLAY DATA SPEEDCLEAR = SPEEDCODE + ( COUNTCHAR * LENLOOP * COUNTLINES)+1 ;SPEED CLEAR ALL 1024 PLOT CHAR1 = $20 ;CHAR TO SHIFT (ON ZP) CHAR2 = CHAR1 + COUNTCHAR CHAR3 = CHAR2 + COUNTCHAR CHAR4 = CHAR3 + COUNTCHAR CHAR5 = CHAR4 + COUNTCHAR CHAR6 = CHAR5 + COUNTCHAR CHAR7 = CHAR6 + COUNTCHAR CHAR8 = CHAR7 + COUNTCHAR CSET2 = CHAR8 + COUNTCHAR ;--- START SEI CLD LDX #$FB TXS LDA #$37 STA $01 JSR $FDA3 JSR $FD15 JSR $E3BF JSR $FF5B SEI LDA #DRAW STA $0319 STA $FFFB STA $FFFF JSR INITGRAPH ;ENABLE HIRES ETC. JSR FILLCHAR ;FILL CHAR JSR SETTBADR ;HELP PROC. FOR PREPARE DATA JSR MAKESPEEDCODE ;MAKE LONG AND BORNING CODE FOR DOTSCROLL ;AND SETTING PLOTS FOR WAIT LOOK JSR SPEEDCODE ;NOW PLOTS WILL BE CLEAR JSR CLEARCHAR ;NOW CHAR BE CLEAR JSR MAKESPEEDCLEAR ;LIKE BEFORE FOR CLEAR PLOTS AND SET PLOTS JSR SPEEDCLEAR ;OK NOW CLEAR PLOTS ;========== ;HERE IS IRQ NMI AND BRK FOR NEVERENDING LOOP ;IN THIS SAMPLE WE DON'T WORK IN THE IRQ ;========== DRAW SEI CLD LDX #$FB ;STACK INIT TXS LDA #$38 ;SHOW ALL 64 RAM (IN THIS SAMPLE NOT NECESSARY) STA $01 JSR CLEARCHAR JSR SPEEDCLEAR ;CLEAR PLOTS STA POSSCROLL ;START SCROL FROM ZERO POS. ;AFTER INIT AND MAKE SPEEDCODE HERE IS MAINLOP ;AND ALL NECESSARY ROUTINES TO WORK DOT SCROLL ;REALLY NOT THAT BIG ;-) ;FROM $0801 TO $0A29 ;OF COURSE SPEEDCODE FROM $4000 TO $7D03 STILL OVER HERE MAINLOOP JSR ROLCHAR ;SHIFT DATA FOR DOT SCROLL LDA #$35 ;SHOW I/O STA $01 LDX #$C8 CPX $D012 BNE *-3 INC $D020 LDA #$38 ;SHOW ALL RAM STA $01 JSR SPEEDCLEAR ;CLEAR PLOTS ON THE BITMAP JSR SPEEDCODE ;DISPLAY PLOTS OF CHARS ON 3D TRAJECTORY LDA #$35 ;SHOW I/O VIC ETC. STA $01 DEC $D020 LDA #$EF CMP $DC01 ;SPACE? BNE MAINLOOP CMP $DC01 BEQ *-3 LDA #$38 STA $01 BRK ;GO TO DRAW OF COURSE ;============== ;CLEAR OR FILL CHAR DATA ;============== CLEARCHAR LDA #$00 .BYTE $2C FILLCHAR LDA #$FF INITCHAR LDX #$00 - STA CHAR1,X INX CPX #COUNTCHAR*8+8 BCC - RTS ;================ ROLCHAR ;======= ;SHIFT ALL BITS FOR DOT SCROLL ;DATA ON ZERO PAGE FOR SPEED ;======= ASL CSET2 ROL CHAR1 + COUNTCHAR-1 ROL CHAR1 + COUNTCHAR-2 ROL CHAR1 + COUNTCHAR-3 ROL CHAR1 + COUNTCHAR-4 ROL CHAR1 + COUNTCHAR-5 ROL CHAR1 + COUNTCHAR-6 ROL CHAR1 + COUNTCHAR-7 ROL CHAR1 + COUNTCHAR-8 ROL CHAR1 + COUNTCHAR-9 ROL CHAR1 + COUNTCHAR-10 ROL CHAR1 + COUNTCHAR-11 ROL CHAR1 + COUNTCHAR-12 ROL CHAR1 + COUNTCHAR-13 ROL CHAR1 + COUNTCHAR-14 ROL CHAR1 + COUNTCHAR-15 ROL CHAR1 ASL CSET2+1 ROL CHAR2 + COUNTCHAR-1 ROL CHAR2 + COUNTCHAR-2 ROL CHAR2 + COUNTCHAR-3 ROL CHAR2 + COUNTCHAR-4 ROL CHAR2 + COUNTCHAR-5 ROL CHAR2 + COUNTCHAR-6 ROL CHAR2 + COUNTCHAR-7 ROL CHAR2 + COUNTCHAR-8 ROL CHAR2 + COUNTCHAR-9 ROL CHAR2 + COUNTCHAR-10 ROL CHAR2 + COUNTCHAR-11 ROL CHAR2 + COUNTCHAR-12 ROL CHAR2 + COUNTCHAR-13 ROL CHAR2 + COUNTCHAR-14 ROL CHAR2 + COUNTCHAR-15 ROL CHAR2 ASL CSET2+2 ROL CHAR3 + COUNTCHAR-1 ROL CHAR3 + COUNTCHAR-2 ROL CHAR3 + COUNTCHAR-3 ROL CHAR3 + COUNTCHAR-4 ROL CHAR3 + COUNTCHAR-5 ROL CHAR3 + COUNTCHAR-6 ROL CHAR3 + COUNTCHAR-7 ROL CHAR3 + COUNTCHAR-8 ROL CHAR3 + COUNTCHAR-9 ROL CHAR3 + COUNTCHAR-10 ROL CHAR3 + COUNTCHAR-11 ROL CHAR3 + COUNTCHAR-12 ROL CHAR3 + COUNTCHAR-13 ROL CHAR3 + COUNTCHAR-14 ROL CHAR3 + COUNTCHAR-15 ROL CHAR3 ASL CSET2+3 ROL CHAR4 + COUNTCHAR-1 ROL CHAR4 + COUNTCHAR-2 ROL CHAR4 + COUNTCHAR-3 ROL CHAR4 + COUNTCHAR-4 ROL CHAR4 + COUNTCHAR-5 ROL CHAR4 + COUNTCHAR-6 ROL CHAR4 + COUNTCHAR-7 ROL CHAR4 + COUNTCHAR-8 ROL CHAR4 + COUNTCHAR-9 ROL CHAR4 + COUNTCHAR-10 ROL CHAR4 + COUNTCHAR-11 ROL CHAR4 + COUNTCHAR-12 ROL CHAR4 + COUNTCHAR-13 ROL CHAR4 + COUNTCHAR-14 ROL CHAR4 + COUNTCHAR-15 ROL CHAR4 ASL CSET2+4 ROL CHAR5 + COUNTCHAR-1 ROL CHAR5 + COUNTCHAR-2 ROL CHAR5 + COUNTCHAR-3 ROL CHAR5 + COUNTCHAR-4 ROL CHAR5 + COUNTCHAR-5 ROL CHAR5 + COUNTCHAR-6 ROL CHAR5 + COUNTCHAR-7 ROL CHAR5 + COUNTCHAR-8 ROL CHAR5 + COUNTCHAR-9 ROL CHAR5 + COUNTCHAR-10 ROL CHAR5 + COUNTCHAR-11 ROL CHAR5 + COUNTCHAR-12 ROL CHAR5 + COUNTCHAR-13 ROL CHAR5 + COUNTCHAR-14 ROL CHAR5 + COUNTCHAR-15 ROL CHAR5 ASL CSET2+5 ROL CHAR6 + COUNTCHAR-1 ROL CHAR6 + COUNTCHAR-2 ROL CHAR6 + COUNTCHAR-3 ROL CHAR6 + COUNTCHAR-4 ROL CHAR6 + COUNTCHAR-5 ROL CHAR6 + COUNTCHAR-6 ROL CHAR6 + COUNTCHAR-7 ROL CHAR6 + COUNTCHAR-8 ROL CHAR6 + COUNTCHAR-9 ROL CHAR6 + COUNTCHAR-10 ROL CHAR6 + COUNTCHAR-11 ROL CHAR6 + COUNTCHAR-12 ROL CHAR6 + COUNTCHAR-13 ROL CHAR6 + COUNTCHAR-14 ROL CHAR6 + COUNTCHAR-15 ROL CHAR6 ASL CSET2+6 ROL CHAR7 + COUNTCHAR-1 ROL CHAR7 + COUNTCHAR-2 ROL CHAR7 + COUNTCHAR-3 ROL CHAR7 + COUNTCHAR-4 ROL CHAR7 + COUNTCHAR-5 ROL CHAR7 + COUNTCHAR-6 ROL CHAR7 + COUNTCHAR-7 ROL CHAR7 + COUNTCHAR-8 ROL CHAR7 + COUNTCHAR-9 ROL CHAR7 + COUNTCHAR-10 ROL CHAR7 + COUNTCHAR-11 ROL CHAR7 + COUNTCHAR-12 ROL CHAR7 + COUNTCHAR-13 ROL CHAR7 + COUNTCHAR-14 ROL CHAR7 + COUNTCHAR-15 ROL CHAR7 ASL CSET2+7 ROL CHAR8 + COUNTCHAR-1 ROL CHAR8 + COUNTCHAR-2 ROL CHAR8 + COUNTCHAR-3 ROL CHAR8 + COUNTCHAR-4 ROL CHAR8 + COUNTCHAR-5 ROL CHAR8 + COUNTCHAR-6 ROL CHAR8 + COUNTCHAR-7 ROL CHAR8 + COUNTCHAR-8 ROL CHAR8 + COUNTCHAR-9 ROL CHAR8 + COUNTCHAR-10 ROL CHAR8 + COUNTCHAR-11 ROL CHAR8 + COUNTCHAR-12 ROL CHAR8 + COUNTCHAR-13 ROL CHAR8 + COUNTCHAR-14 ROL CHAR8 + COUNTCHAR-15 ROL CHAR8 INC CNTROL LDA CNTROL AND #$07 ;IF ALL CHAR WAS SHIFTED THEN SCROLL NEXT CHAR BEQ MYSCROL RTS ;================= MYSCROL ;=========== ;SIMPLE SCROLL ROUTINE (MAX 256 CHAR!!!) ;=========== LDX POSSCROLL LDA TXTSCROL,X BNE + STA POSSCROLL LDA TXTSCROL + AND #$3F ASL ASL ASL ;CHAR MULTIPLY 8 FOR ADDRES IN THE CHARGEN STA VECTR1 LDA #$00 ADC #$D0 STA VECTR1+1 PHP ;STATUS REGISTER SAVE LDY #$07 SEI LDA $01 PHA ;SAVE $01 LDA #$33 ;HERE IS USED CHARGEN FROM C64 ROM STA $01 ;YOU CAN USED SOMETHING OWN - LDA (VECTR1),Y STA CSET2,Y DEY BPL - PLA ;RECALL $01 STA $01 PLP ;RECALL STATUS REGISTER FOR "I" (INTERRUPTS WAS BLOCKED?) INC POSSCROLL RTS ;============== POSSCROLL .BYTE 0 CNTROL .BYTE 0 TXTSCROL .TEXT "_________ C64 3D DOT SCROLLER " .BYTE 0 ;============== ;====================================================== ;AFTER INIT ALL DATA AND PROC. BELOW CAN BE ERASE ;====================================================== *= $1000 INITGRAPH ;============== ;ENABLE HIRES, FILL COLLOR, CLEAR BITMAP ;============== LDA #$18 STA $D018 LDA $D011 ORA #$20 STA $D011 LDX #$00 LDA #246 - STA $0400,X STA $0500,X STA $0600,X STA $06F8,X INX BNE - STX POSSCROLL LDX #>SCREEN STX VECTR1+1 LDY #$00 STY VECTR1 LDA #$00 - STA (VECTR1),Y INY BNE - INC VECTR1+1 DEX BNE - RTS ;=========== ;CALCULATE TB ROW ADDRESS IN THE BITMAP ;=========== SETTBADR LDX #$00 LDA #>SCREEN STX VECTR1 STA VECTR1+1 - LDA VECTR1 STA TBADLO,X LDA VECTR1+1 STA TBADHI,X LDA VECTR1 CLC ADC #$40 STA VECTR1 LDA VECTR1+1 ADC #$01 STA VECTR1+1 INX CPX #25 BCC - RTS ;-------- TBBIT .BYTE %10000000 .BYTE %01000000 .BYTE %00100000 .BYTE %00010000 .BYTE %00001000 .BYTE %00000100 .BYTE %00000010 .BYTE %00000001 ;--- TBADLO .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 ;--- TBADHI .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 .BYTE 0,0,0,0,0 ;-------- XPOSS .BYTE 0,0 YPOSS .BYTE 0 ;-------- CALCPLOTADD ;============================== ;CONVERT DATA FROM XPOSS LO HI AND YPOS (BITMAP POSS.) AND RETURN ;TO ACC #PLOT ADDRES, XREG BIT POSS. ;============================== LDA YPOSS LSR A LSR A LSR A TAX LDA YPOSS AND #$07 TAY LDA XPOSS AND #$F8 CLC ADC TBADLO,X STA STOREPLOT LDA TBADHI,X ADC XPOSS+1 STA STOREPLOT+1 LDA XPOSS AND #$07 TAX ;SET PLOT THIS IS NOT NECESSARY ONLY FOR WAIT LOOK LDA (STOREPLOT),Y EOR TBBIT,X STA (STOREPLOT),Y ; RTS ;OR THIS IS ONLY EOR PLOT PROCEDURE TYA CLC ADC STOREPLOT STA STOREPLOT BCC + INC STOREPLOT+1 + LDA TBBIT,X TAX LDA STOREPLOT LDY STOREPLOT+1 ;IN ACC #PLOT ADDRES, XREG BIT POSS. RTS ;=========================== MAKESPEEDCODE ;=========================== ;ITERATOR FOR GENERATE UNROLLED CODE ;FROM SPEEDCODE BASE ;=========================== LDA #SPEEDCODE STA VECTR3+1 LDY #$00 STY CNTRCOLUMN LDA #PLOTS STA VECTR1+1 LDA CNTRCOLUMN ASL ADC CNTRCOLUMN ADC VECTR1 STA VECTR1 BCC + INC VECTR1+1 + LDY #$00 STY CNTRLINES JSR STOREDATA MCOD1 JSR CALCPLOTADD ;IN ACC #PLOT ADDRES, XREG BIT POSS. STA DOT8 STA DOT8+5 STY DOT8+1 STY DOT8+6 STX DOT8+3 JSR NEXTROW JSR CALCPLOTADD STA DOT7 STA DOT7+5 STY DOT7+1 STY DOT7+6 STX DOT7+3 JSR NEXTROW JSR CALCPLOTADD STA DOT6 STA DOT6+5 STY DOT6+1 STY DOT6+6 STX DOT6+3 JSR NEXTROW JSR CALCPLOTADD STA DOT5 STA DOT5+5 STY DOT5+1 STY DOT5+6 STX DOT5+3 JSR NEXTROW JSR CALCPLOTADD STA DOT4 STA DOT4+5 STY DOT4+1 STY DOT4+6 STX DOT4+3 JSR NEXTROW JSR CALCPLOTADD STA DOT3 STA DOT3+5 STY DOT3+1 STY DOT3+6 STX DOT3+3 JSR NEXTROW JSR CALCPLOTADD STA DOT2 STA DOT2+5 STY DOT2+1 STY DOT2+6 STX DOT2+3 JSR NEXTROW JSR CALCPLOTADD STA DOT1 STA DOT1+5 STY DOT1+1 STY DOT1+6 STX DOT1+3 JSR NEXTROW LDA CNTCHAR STA LITERA1 INC CNTCHAR LDY #$00 - LDA FCOD,Y STA (VECTR3),Y INY CPY #LENLOOP+1 BNE - LDA VECTR3 CLC ADC #LENLOOP STA VECTR3 BCC + INC VECTR3+1 + INC CNTRLINES LDA CNTRLINES CMP #COUNTCHAR BEQ + JMP MCOD1 + INC CNTRCOLUMN LDA CNTRCOLUMN CMP #COUNTLINES BEQ + JMP MCOD0 + RTS ;================= ;MAKE STA $ADDRESS PLOT FOR FAST CLEAR ALL 1024 BITS ;NOT SUPER OPTIMIZE!!! COS DON'T ELLIMINATED THIS SAME ADDRES FOR ;ANY PLOTS ;================= MAKESPEEDCLEAR LDA #SPEEDCLEAR STA VECTR3+1 LDA #PLOTS STA VECTR1+1 LDA #$A9 LDY #$00 STA (VECTR3),Y TYA INY STA (VECTR3),Y LDA VECTR3 CLC ADC #$02 STA VECTR3 BCC + INC VECTR3+1 + - LDY #$00 LDA #$8D STA (VECTR3),Y LDY #$03 LDA #$60 STA (VECTR3),Y JSR STOREDATA JSR CALCPLOTADD TAX TYA LDY #$02 STA (VECTR3),Y TXA DEY STA (VECTR3),Y LDA VECTR1 CLC ADC #$03 STA VECTR1 BCC + INC VECTR1+1 + LDA VECTR3 CLC ADC #$03 STA VECTR3 BCC + INC VECTR3+1 + LDA VECTR1+1 CMP #>EPLOT BNE - LDA VECTR1 CMP #