diff --git a/Platform/Apple/virtual/build.xml b/Platform/Apple/virtual/build.xml index aa00adb8..dccb0503 100644 --- a/Platform/Apple/virtual/build.xml +++ b/Platform/Apple/virtual/build.xml @@ -47,6 +47,7 @@ + Adding files to image. diff --git a/Platform/Apple/virtual/src/raycast/javascript/intcast.js b/Platform/Apple/virtual/src/raycast/javascript/intcast.js index 5c17fc5e..15102a36 100644 --- a/Platform/Apple/virtual/src/raycast/javascript/intcast.js +++ b/Platform/Apple/virtual/src/raycast/javascript/intcast.js @@ -31,7 +31,7 @@ var player = { var options = 0; -var debugRay = null; /* Debugging info printed about this ray num, or null for none */ +var debugRay = 0; /* Debugging info printed about this ray num, or null for none */ var maxAngleNum = 16; @@ -590,8 +590,10 @@ function intCast(x) if (x == debugRay) { console.log("intCast: ray=" + x + - ", bDeltaDistX=" + bDeltaDistX + - ", bDeltaDistY=" + bDeltaDistY); + ", bStepX=" + bStepX + + ", bStepY=" + bStepY + + ", bDeltaDistX=$" + byteToHex(bDeltaDistX) + + ", bDeltaDistY=$" + byteToHex(bDeltaDistY)); } // Calculate step and initial sideDist @@ -606,8 +608,8 @@ function intCast(x) bSideDistY = umul_bb_b(bSideDistY, bDeltaDistY); if (x == debugRay) { - console.log(" initial sideDistX=" + bSideDistX + - ", sideDistY=" + bSideDistY); + console.log(" initial sideDistX=$" + byteToHex(bSideDistX) + + ", sideDistY=$" + byteToHex(bSideDistY)); } // Distance to wall, and texture coordinate on the wall @@ -619,17 +621,17 @@ function intCast(x) { // Jump to next map square in x-direction, OR in y-direction if (uless_bb(bSideDistX, bSideDistY)) { - bSideDistY -= bSideDistX; - bSideDistX = bDeltaDistX; bMapX += bStepX; if (x == debugRay) { - console.log(" side0, mapX=" + bMapX + ", mapY=" + bMapY + - ", sideDistX=" + bSideDistX + - ", sideDistY=" + bSideDistY); + console.log(" sideX, mapX=" + bMapX + ", mapY=" + bMapY + + ", bSideDistX=$" + byteToHex(bSideDistX) + + ", bSideDistY=$" + byteToHex(bSideDistY)); } + bSideDistY -= bSideDistX; + bSideDistX = bDeltaDistX if (map[bMapY][bMapX] > 0) { if (x == debugRay) - console.log(" hit side 0"); + console.log(" hit X side"); var wPerpWallDist = (bMapX<<8) - wRayPosX; if (bStepX < 0) wPerpWallDist += 256; @@ -643,17 +645,17 @@ function intCast(x) } } else { - bSideDistX -= bSideDistY; - bSideDistY = bDeltaDistY; bMapY += bStepY; if (x == debugRay) { - console.log(" side1, mapX=" + bMapX + ", mapY=" + bMapY + - ", sideDistX=" + bSideDistX + - ", sideDistY=" + bSideDistY); + console.log(" sideY, mapX=" + bMapX + ", mapY=" + bMapY + + ", bSideDistX=$" + byteToHex(bSideDistX) + + ", bSideDistY=$" + byteToHex(bSideDistY)); } + bSideDistX -= bSideDistY; + bSideDistY = bDeltaDistY; if (map[bMapY][bMapX] > 0) { if (x == debugRay) - console.log(" hit side 1"); + console.log(" hit Y side"); var wPerpWallDist = (bMapY<<8) - wRayPosY; if (bStepY < 0) wPerpWallDist += 256; @@ -669,8 +671,10 @@ function intCast(x) } if (x == debugRay) { - console.log(" perpWallDist=" + wPerpWallDist.toString() + - ", lineHeight=" + lineHeight.toString()); + console.log(" abs(wPerpWallDist)=$" + wordToHex(Math.abs(wPerpWallDist)) + + ", lineHeight=$" + wordToHex(lineHeight) + + ", wallType=" + map[bMapY][bMapX] + + ", wallX=$" + byteToHex(bWallX)); } // Wrap it all in a nice package. diff --git a/Platform/Apple/virtual/src/raycast/render.s b/Platform/Apple/virtual/src/raycast/render.s index 20a608c5..95eba4c7 100644 --- a/Platform/Apple/virtual/src/raycast/render.s +++ b/Platform/Apple/virtual/src/raycast/render.s @@ -12,7 +12,7 @@ codeBeg = * ; Conditional assembly flags DOUBLE_BUFFER = 0 ; whether to double-buffer -DEBUG = 0 ; turn on verbose logging +DEBUG = 1 ; turn on verbose logging ; Constants TOP_LINE = $2180 ; 24 lines down from top @@ -37,7 +37,6 @@ frontBuf = $13 ; len 1 (value 0 or 1) pRayData = $14 ; len 2 playerX = $16 ; len 2 (hi=integer, lo=fraction) playerY = $18 ; len 2 (hi=integer, lo=fraction) -playerDir = $19 ; len 1 rayDirX = $1A ; len 1 rayDirY = $1B ; len 1 stepX = $1C ; len 1 @@ -50,6 +49,7 @@ deltaDistX = $52 ; len 1 deltaDistY = $53 ; len 1 dist = $54 ; len 2 diff = $56 ; len 2 +playerDir = $57 ; len 1 ; Other monitor locations a2l = $3E @@ -67,7 +67,7 @@ blitIndexHi = $D80 ; size $80 clrBlitRoll = $E00 ; size 3*(128/2) = $C0, plus 2 for tya & rts XF00 = $F00 ; unused -prodosBuf = $1000 ; temporary, before building the tables +prodosBuf = $AC00 ; temporary, before building the tables screen = $2000 ;--------------------------------- @@ -124,6 +124,85 @@ blitOffsets: .byte 5,8,11,1,17,20,24 texAddrLo: .byte tex0,>tex1,>tex2,>tex3 +; Debug macros +.macro DEBUG_STR str +.if DEBUG + php + pha + jsr pstr + .byte str,0 + pla + plp +.endif +.endmacro + +.macro DEBUG_BYTE byte +.if DEBUG + php + pha + lda byte + jsr prbyte + lda #$A0 + jsr cout + pla + plp +.endif +.endmacro + +.macro DEBUG_WORD word +.if DEBUG + php + pha + lda word+1 + jsr prbyte + lda word + jsr prbyte + lda #$A0 + jsr cout + pla + plp +.endif +.endmacro + +.macro DEBUG_LN +.if DEBUG + php + pha + jsr crout + pla + plp +.endif +.endmacro + +; Print a string following the JSR, in high or low bit ASCII, terminated by zero. +; If the string has a period "." it will be followed automatically by a CR. +pstr: + pla + clc + adc #1 + sta @ld+1 + pla + adc #0 + sta @ld+2 +@ld: + lda $2000 + beq @done + ora #$80 + jsr cout + cmp #$AE + bne :+ + jsr crout +: inc @ld+1 + bne @ld + inc @ld+2 + bra @ld +@done: + lda @ld+2 + pha + lda @ld+1 + pha + rts + ;------------------------------------------------------------------------------- ; Multiply two bytes, quickly but somewhat inaccurately, using logarithms. ; Utilizes tbl_log2_b_b and tbl_pow2_b_b, which translate to and from 3+5 bit @@ -288,6 +367,12 @@ castRay: lda (pRayData),y ; distance moved in Y direction sta deltaDistY ; for each step + DEBUG_STR "castRay: deltaDistX=" + DEBUG_BYTE deltaDistX + DEBUG_STR "deltaDistY=" + DEBUG_BYTE deltaDistY + DEBUG_LN + ; Start at the player's position lda playerX+1 sta mapX @@ -297,8 +382,8 @@ castRay: ; Next we need to calculate the initial distance on each side ; Start with the X side lda playerX ; fractional byte of player distance - bit stepX ; if stepping in reverse... - bpl :+ + bit stepX ; if stepping forward... + bmi :+ eor #$FF ; invert initial dist : tax ldy deltaDistX ; calculate fraction of delta @@ -306,14 +391,20 @@ castRay: sta sideDistX ; to form initial side dist ; Now the Y side lda playerY ; fractional byte of player distance - bit stepY ; if stepping in reverse... - bpl :+ + bit stepY ; if stepping forward... + bmi :+ eor #$FF ; invert initial dist : tax ldy deltaDistY ; calculate fraction of delta jsr umul_bb_b sta sideDistY ; to form initial side dist + DEBUG_STR " initial sdx=" + DEBUG_BYTE sideDistX + DEBUG_STR " sdy=" + DEBUG_BYTE sideDistY + DEBUG_LN + ; We're going to use the Y register to index the map. Initialize it. lda mapY asl ; assume map is 16 tiles wide... @@ -330,12 +421,6 @@ castRay: bcs @takeStepY ; taking a step in the X direction @takeStepX: - lda sideDistY ; adjust side dist in Y dir - sec - sbc sideDistX - sta sideDistY - lda deltaDistX ; re-init X distance - sta sideDistX lda stepX ; advance mapX in the correct direction bmi @negX inc mapX @@ -345,10 +430,22 @@ castRay: dec mapX dey @checkX: + .if DEBUG + DEBUG_STR " sideX" + jsr @debugSideData + .endif + lda sideDistY ; adjust side dist in Y dir + sec + sbc sideDistX + sta sideDistY + lda deltaDistX ; re-init X distance + sta sideDistX lda mapData,y ; check map at current X/Y position beq @DDA_step ; nothing there? do another step. ; We hit something! @hitX: + DEBUG_STR " Hit." + brk sta txNum ; store the texture number we hit lda #0 sec @@ -375,12 +472,6 @@ castRay: rts ; taking a step in the Y direction @takeStepY: - lda sideDistX ; adjust side dist in Y dir - sec - sbc sideDistY - sta sideDistX - lda deltaDistY ; re-init Y distance - sta sideDistY tya ; get ready to adjust Y by a whole line bit stepY ; advance mapY in the correct direction bmi @negY @@ -393,11 +484,24 @@ castRay: sec sbc #16 @checkY: + .if DEBUG + DEBUG_STR " sideY" + jsr @debugSideData + .endif tay ; row number to Y so we can index the map + lda sideDistX ; adjust side dist in Y dir + sec + sbc sideDistY + sta sideDistX + lda deltaDistY ; re-init Y distance + sta sideDistY lda mapData,y ; check map at current X/Y position - beq @DDA_step ; nothing there? do another step. - ; We hit something! + bne @hitY ; nothing there? do another step. + jmp @DDA_step @hitY: + ; We hit something! + DEBUG_STR " Hit." + brk sta txNum ; store the texture number we hit lda #0 sec @@ -480,6 +584,19 @@ castRay: lda #$FF ; clamp large line heights to 255 : sta lineCt rts ; all done with wall calculations + .if DEBUG +@debugSideData: + DEBUG_STR ", mapX=" + DEBUG_BYTE mapX + DEBUG_STR "mapY=" + DEBUG_BYTE mapY + DEBUG_STR "sdx=" + DEBUG_BYTE sideDistX + DEBUG_STR "sdy=" + DEBUG_BYTE sideDistY + DEBUG_LN + rts + .endif ; Advance pLine to the next line on the hi-res screen nextLine: @@ -850,6 +967,7 @@ copyToAux: ; Test code to see if things really work test: + DEBUG_STR "Clearing memory." ; Clear ProDOS mem map so it lets us load stuff anywhere we want ldx #$18 lda #1 @@ -878,22 +996,6 @@ test: lda #0 sta playerDir -; Test out log multiplication -: jsr getln1 - ldy #0 - jsr getnum - ldy a2l - ldx a2h - jsr pow2_w_w - pha - txa - jsr prbyte - pla - jsr prbyte - jsr crout - jsr crout - jmp :- - ; Copy our code to aux mem so we can seamlessly switch back and forth ; It's wasteful but makes things easy for now. ldy #>codeBeg @@ -901,6 +1003,8 @@ test: jsr copyToAux ; Load the texture expansion code + DEBUG_STR "Skipping expansion code and textures because of mip problem." + .if 0 lda #>expandVec1 pha lda #@frameName jsr bload + .endif + ; Build all the unrolls and tables jsr makeBlit jsr makeClrBlit @@ -973,8 +1079,11 @@ test: .endif sta bacKBuf + DEBUG_STR "Staying in text mode." + .if 0 bit clrText bit setHires + .endif lda #63 sta lineCt @@ -1005,7 +1114,7 @@ test: inc pixNum lda pixNum cmp #7 - bne @oneCol + bne @nextCol @flush: ldy byteNum iny ; move to right 2 bytes to preserve frame border @@ -1018,14 +1127,13 @@ test: sta pixNum inc byteNum inc byteNum - lda byteNum - cmp #18 - beq @nextLevel @nextCol: pla clc adc #4 ; advance to next ray - bra @oneCol + ldx byteNum + cpx #18 + bne @oneCol @nextLevel: ; flip onto the screen