P* * Simple test program to test the 3d library. * ORG $1000 GETIN EQU $FFE4 CALCMAT EQU $8A00 GLOBROT EQU $8A03 ROTPROJ EQU $8A06 POLYFILL EQU $8A09 PQ EQU $9F80 ;Point queue XOFFSET EQU $53 YOFFSET EQU $54 MULTLO1 EQU $F7 ;Multiplication tables MULTLO2 EQU $F9 MULTHI1 EQU $FB MULTHI2 EQU $FD BITMAP EQU $FF ;Page of bitmap base FILLPAT EQU $BB ;Pointer to fill pattern PLISTXLO EQU $BD ;Pointers to plotted points PLISTXHI EQU $BF PLISTYLO EQU $C1 PLISTYHI EQU $C3 C0XLO EQU $63 ;Pointers to centers to rotate C0XHI EQU $65 C0YLO EQU $67 C0YHI EQU $69 C0ZLO EQU $6B C0ZHI EQU $6D CXLO EQU $A3 ;Pointers to rotated centers CXHI EQU $A5 CYLO EQU $A7 CYHI EQU $A9 CZLO EQU $AB CZHI EQU $AD ROTMATH EQU $AF ;Pointer to rotation math table P0X EQU $69 ;Pointers to points to be rotated P0Y EQU $6B P0Z EQU $6D * Set up pointers SETUP LDA $01 ;No BASIC AND #$FE STA $01 LDA #$80 STA $028A ;Repeat keys LDA #$C2 STA ROTMATH+1 LDX #$C5 STX MULTLO1+1 DEX STX MULTLO2+1 LDX #$C8 STX MULTHI1+1 DEX STX MULTHI2+1 LDA #$60 ;Buffer 1 at $6000 STA BITMAP LDA $DD02 ORA #3 STA $DD02 LDA $DD00 AND #$FC ORA #2 ;Bank 1 STA $DD00 LDA #$3B STA $D011 LDA #$08 ;Color at $4000 STA $D018 LDA #$30 ;cyan+black LDY #00 :LOOP STA $4000,Y STA $4100,Y STA $4200,Y STA $4300,Y STA $8000,Y STA $8100,Y STA $8200,Y STA $8300,Y INY BNE :LOOP LDA #00 STA THETAX STA THETAY STA THETAZ STA INCX STA INCY STA INCZ STA PLISTXLO STA PLISTXHI STA PLISTYLO STA PLISTYHI LDX #$30 ;Store data at $3000 STX PLISTXLO+1 INX STX PLISTXHI+1 INX STX PLISTYLO+1 INX STX PLISTYHI+1 LDA #TETCX STA CXLO+1 LDA #TETCY STA CYLO+1 LDA #TETCZ STA CZLO+1 LDA #TETCX+1 STA CXHI+1 LDA #TETCY+1 STA CYHI+1 LDA #TETCZ+1 STA CZHI+1 LDA #160 STA XOFFSET LDA #100 STA YOFFSET MAINLOOP LDA BITMAP ;$60 or $A0 BPL :BUFF2 LDA $DD00 ;View buffer 2 AND #$FC ORA #1 ;Bank 2 STA $DD00 LDA #$60 ;Draw into buffer 1 STA BITMAP STA $D07E ;Enable SuperCPU optimization STA $D075 ;bank 1 STA $D07F JSR CLBUF1 ;Clear buffer 1 JMP :READKEY :BUFF2 LDA #$A0 STA BITMAP STA $D07E STA $D074 STA $D07F LDA $DD00 AND #$FC ORA #2 ;Bank 1 STA $DD00 JSR CLBUF2 :READKEY JSR GETIN BNE :KEY JMP :DONE :KEY CMP #'s' BNE :C0 LDA $DD00 EOR #3 STA $DD00 BNE :READKEY :C0 CMP #'1' BNE :C1 INC INCX :C1 CMP #'!' BNE :C2 DEC INCX :C2 CMP #'2' BNE :C3 INC INCY :C3 CMP #'"' BNE :C4 DEC INCY :C4 CMP #'3' BNE :C5 INC INCZ :C5 CMP #'#' BNE :C6 DEC INCZ :C6 CMP #'a' BNE :C7 LDA TETCZ BNE :DZ DEC TETCZ+1 :DZ DEC TETCZ BCS :DONE :C7 CMP #'z' BNE :C7A INC TETCZ BNE :DONE INC TETCZ+1 :C7A CMP #'A'+96 BNE :C7Z LDA TETCZ SBC #16 STA TETCZ BCS :DONE DEC TETCZ+1 BCC :DONE :C7Z CMP #'Z'+96 BNE :C8 LDA TETCZ CLC ADC #16 STA TETCZ BCC :DONE INC TETCZ+1 BCS :DONE :C8 CMP #';' BNE :C9 INC TETCX BNE :DONE INC TETCX+1 :C9 CMP #':' BNE :C10 LDA TETCX BNE :DX DEC TETCX+1 :DX DEC TETCX BCS :DONE :C10 CMP #'@' BNE :C11 LDA TETCY BNE :DY DEC TETCY+1 :DY DEC TETCY BCS :DONE :C11 CMP #'/' BNE :C12 INC TETCY BNE :DONE INC TETCY+1 :C12 CMP #'r' BEQ :SETP :DONE INC COUNT ;Fps counter BNE :UPANG INC $D020 :UPANG LDA THETAX ;Update angles CLC ADC INCX STA THETAX TAX LDA THETAY CLC ADC INCY STA THETAY TAY LDA THETAZ CLC ADC INCZ STA THETAZ JSR CALCMAT ;Calculate rotation matrix :SETP LDA #TETX STA P0X+1 LDA #TETY STA P0Y+1 LDA #TETZ STA P0Z+1 LDX #00 ;Center index LDY #4 ;Rotate four points JSR ROTPROJ LDY #3 :L1 LDA FACE1,Y STA PQ,Y DEY BPL :L1 LDA #DITHER1 STA FILLPAT+1 LDX #3 JSR POLYFILL LDY #3 :L2 LDA FACE2,Y STA PQ,Y DEY BPL :L2 LDA #ZIGZAG STA FILLPAT+1 LDX #3 JSR POLYFILL LDY #3 :L3 LDA FACE3,Y STA PQ,Y DEY BPL :L3 LDA #CROSSSM STA FILLPAT+1 LDX #3 JSR POLYFILL LDY #3 :L4 LDA FACE4,Y STA PQ,Y DEY BPL :L4 LDA #SOLID STA FILLPAT+1 LDX #3 JSR POLYFILL JMP MAINLOOP CLBUF1 LDA #00 ;Clear bitmap LDY #00 :LOOP STA $6000,Y STA $6100,Y STA $6200,Y STA $6300,Y STA $6400,Y STA $6500,Y STA $6600,Y STA $6700,Y STA $6800,Y STA $6900,Y STA $6A00,Y STA $6B00,Y STA $6C00,Y STA $6D00,Y STA $6E00,Y STA $6F00,Y STA $7000,Y STA $7100,Y STA $7200,Y STA $7300,Y STA $7400,Y STA $7500,Y STA $7600,Y STA $7700,Y STA $7800,Y STA $7900,Y STA $7A00,Y STA $7B00,Y STA $7C00,Y STA $7D00,Y STA $7E00,Y STA $7F00,Y DEY BNE :LOOP RTS CLBUF2 LDA #00 ;Clear bitmap LDY #00 :LOOP STA $A000,Y STA $A100,Y STA $A200,Y STA $A300,Y STA $A400,Y STA $A500,Y STA $A600,Y STA $A700,Y STA $A800,Y STA $A900,Y STA $AA00,Y STA $AB00,Y STA $AC00,Y STA $AD00,Y STA $AE00,Y STA $AF00,Y STA $B000,Y STA $B100,Y STA $B200,Y STA $B300,Y STA $B400,Y STA $B500,Y STA $B600,Y STA $B700,Y STA $B800,Y STA $B900,Y STA $BA00,Y STA $BB00,Y STA $BC00,Y STA $BD00,Y STA $BE00,Y STA $BF00,Y DEY BNE :LOOP RTS COUNT DFB 00 THETAX DFB 00 ;Angles THETAY DFB 00 THETAZ DFB 00 INCX DFB 00 INCY DFB 00 INCZ DFB 00 * A simple tetrahedron * (1,1,1) (1,-1,-1) (-1,1,-1) (-1,-1,1) TETX DFB 72,72,-72,-72 TETY DFB 72,-72,72,-72 TETZ DFB 72,-72,-72,72 * Point list FACE1 DFB 0,1,2,0 FACE2 DFB 3,2,1,3 FACE3 DFB 3,0,2,3 FACE4 DFB 3,1,0,3 TETCX DA 0 ;Center at center of screen TETCY DA 00 TETCZ DA 420 ;and back a little ways. ZEROS DFB 0,0,0,0,0,0,0,0 SOLID HEX FFFFFFFFFFFFFFFF DITHER1 HEX 55AA55AA55AA55AA DITHER2 HEX AA55AA55AA55AA55 BRICK HEX 00EEEEEE00B4B4B4 CROSSSM HEX 55EE55BB55EE55BB ZIGS HEX EEDDBB77EEDDBB77 ZAGS HEX 77BBDDEE77BBDDEE ZIGZAG HEX BB55EEFFBB55EEFF HOLES HEX BD7EE7DBDBE77EBD