;* ;* Draw player viewport ;* DRAWVIEW STA VIEWPORT ;* ;* Render ground from bottom -> up ;* DRAWGRND LDA ANGLE ; Calc S,T,DS,DT table address AND #$7F ; ST table offset = angle * horizon * 8 LSR ; horizon * 8 = 16 * 8 = 128 TAX ; angle * 128 = angle << 7 == (angle<<8) >> 1 LDA #$00 ; STA SCANLN ; for later... ROR ; CLC ; Carry = 0 from above ADC #ST_TBL STA STPTRH ;* ;* Draw even and odd scanlines together ;* DRAWGRNDSCN LDA VIEWPORT ; Max scanline number/2 SEC SBC SCANLN TAX LDA TXT_TBLL,X STA GBASL LDA TXT_TBLH,X ORA GPAGE STA GBASH ;* ;* Draw right half of odd scanline ;* LDY #$00 ; Copy and update working values from ST table STY S_MIDFL ; Convert ST_TBL from 6.10 fixpt to 8.16 fixpt and add XYVIEW STY T_MIDFL LDA (STPTR),Y STA S_MIDFH INY LDA (STPTR),Y CMP #$80 ROR ROR S_MIDFH ROR S_MIDFL CMP #$80 ROR ROR S_MIDFH ROR S_MIDFL STA S_MIDI LDA S_MIDFH CLC ADC XVIEWF STA S_MIDFH LDA S_MIDI ADC XVIEWI STA S_MIDI INY LDA (STPTR),Y STA T_MIDFH INY LDA (STPTR),Y CMP #$80 ROR ROR T_MIDFH ROR T_MIDFL CMP #$80 ROR ROR T_MIDFH ROR T_MIDFL STA T_MIDI LDA T_MIDFH CLC ADC YVIEWF STA T_MIDFH LDA T_MIDI ADC YVIEWI STA T_MIDI INY LDA (STPTR),Y STA DS_FRACL LDX #$00 INY LDA (STPTR),Y CMP #$80 BCC + DEX + STA DS_FRACH STX DS_INT ROR ; S = S_MID + DS/2 STA S_FRACH LDA DS_FRACL ROR CLC ADC S_MIDFL STA S_FRACL LDA S_FRACH ADC S_MIDFH STA S_FRACH TXA ADC S_MIDI STA S_INT INY LDA (STPTR),Y STA DT_FRACL LDX #$00 INY LDA (STPTR),Y CMP #$80 BCC + DEX + STA DT_FRACH STX DT_INT ROR ; T = T_MID + DT/2 STA T_FRACH LDA DT_FRACL ROR CLC ADC T_MIDFL STA T_FRACL LDA T_FRACH ADC T_MIDFH STA T_FRACH TXA ADC T_MIDI STA T_INT TYA ; Update STPTR to next scanline SEC ADC STPTRL STA STPTRL BCC + INC STPTRH + LDY #15 ; Right-middle of screen BNE GRNDRO - LDA #$00 BEQ + GRNDRO LDA S_INT CMP #$40 BCS - LDX T_INT CPX #$40 BCS - ORA MAP_TBLL,X STA RDTEXRO+1 LDA MAP_TBLH,X STA RDTEXRO+2 RDTEXRO LDA MAP AND #$F0 + STA (GBASE),Y LDA S_FRACL ; S = S + DS CLC ADC DS_FRACL STA S_FRACL LDA S_FRACH ADC DS_FRACH STA S_FRACH LDA S_INT ADC DS_INT STA S_INT LDA T_FRACL ; T = T + DT CLC ADC DT_FRACL STA T_FRACL LDA T_FRACH ADC DT_FRACH STA T_FRACH LDA T_INT ADC DT_INT STA T_INT INY CPY #30 BNE GRNDRO ;* ;* Draw left half of odd scanline ;* LDA DS_FRACL STA TMP LDA DS_FRACH CMP #$80 ROR ; S = S_MID - DS/2 STA TMP+1 ROR TMP LDA S_MIDFL SEC SBC TMP STA S_FRACL LDA S_MIDFH SBC TMP+1 STA S_FRACH LDA S_MIDI SBC DS_INT STA S_INT LDA DT_FRACL STA TMP LDA DT_FRACH CMP #$80 ROR ; T = T_MID - DT/2 STA TMP+1 ROR TMP LDA T_MIDFL SEC SBC TMP STA T_FRACL LDA T_MIDFH SBC TMP+1 STA T_FRACH LDA T_MIDI SBC DT_INT STA T_INT LDY #14 ; Left-middle of screen BNE GRNDLO - LDA #$00 BEQ + GRNDLO LDA S_INT CMP #$40 BCS - LDX T_INT CPX #$40 BCS - ORA MAP_TBLL,X STA RDTEXLO+1 LDA MAP_TBLH,X STA RDTEXLO+2 RDTEXLO LDA MAP AND #$F0 + STA (GBASE),Y LDA S_FRACL ; S = S + DS SEC SBC DS_FRACL STA S_FRACL LDA S_FRACH SBC DS_FRACH STA S_FRACH LDA S_INT SBC DS_INT STA S_INT LDA T_FRACL ; T = T + DT SEC SBC DT_FRACL STA T_FRACL LDA T_FRACH SBC DT_FRACH STA T_FRACH LDA T_INT SBC DT_INT STA T_INT DEY BPL GRNDLO ;* ;* Draw right half of even scanline ;* DEC VDLY BNE + BIT SPEAKER LDA VTONE STA VDLY + LDY #$00 ; Copy and update working values from ST table STY S_MIDFL ; Convert ST_TBL from 6.10 fixpt to 8.16 fixpt and add XYVIEW STY T_MIDFL LDA (STPTR),Y STA S_MIDFH INY LDA (STPTR),Y CMP #$80 ROR ROR S_MIDFH ROR S_MIDFL CMP #$80 ROR ROR S_MIDFH ROR S_MIDFL STA S_MIDI LDA S_MIDFH CLC ADC XVIEWF STA S_MIDFH LDA S_MIDI ADC XVIEWI STA S_MIDI INY LDA (STPTR),Y STA T_MIDFH INY LDA (STPTR),Y CMP #$80 ROR ROR T_MIDFH ROR T_MIDFL CMP #$80 ROR ROR T_MIDFH ROR T_MIDFL STA T_MIDI LDA T_MIDFH CLC ADC YVIEWF STA T_MIDFH LDA T_MIDI ADC YVIEWI STA T_MIDI INY LDA (STPTR),Y STA DS_FRACL LDX #$00 INY LDA (STPTR),Y CMP #$80 BCC + DEX + STA DS_FRACH STX DS_INT ROR ; S = S_MID + DS/2 STA S_FRACH LDA DS_FRACL ROR CLC ADC S_MIDFL STA S_FRACL LDA S_FRACH ADC S_MIDFH STA S_FRACH TXA ADC S_MIDI STA S_INT INY LDA (STPTR),Y STA DT_FRACL LDX #$00 INY LDA (STPTR),Y CMP #$80 BCC + DEX + STA DT_FRACH STX DT_INT ROR ; T = T_MID + DT/2 STA T_FRACH LDA DT_FRACL ROR CLC ADC T_MIDFL STA T_FRACL LDA T_FRACH ADC T_MIDFH STA T_FRACH TXA ADC T_MIDI STA T_INT TYA ; Update STPTR to next scanline SEC ADC STPTRL STA STPTRL BCC + INC STPTRH + LDY #15 ; Right-middle of screen BNE GRNDRE - LDA #$00 BEQ + GRNDRE LDA S_INT CMP #$40 BCS - LDX T_INT CPX #$40 BCS - ORA MAP_TBLL,X STA RDTEXRE+1 LDA MAP_TBLH,X STA RDTEXRE+2 RDTEXRE LDA MAP AND #$0F + ORA (GBASE),Y STA (GBASE),Y LDA S_FRACL ; S = S + DS CLC ADC DS_FRACL STA S_FRACL LDA S_FRACH ADC DS_FRACH STA S_FRACH LDA S_INT ADC DS_INT STA S_INT LDA T_FRACL ; T = T + DT CLC ADC DT_FRACL STA T_FRACL LDA T_FRACH ADC DT_FRACH STA T_FRACH LDA T_INT ADC DT_INT STA T_INT INY CPY #30 BNE GRNDRE ;* ;* Draw left half of even scanline ;* LDA DS_FRACL STA TMP LDA DS_FRACH CMP #$80 ROR ; S = S_MID - DS/2 STA TMP+1 ROR TMP LDA S_MIDFL SEC SBC TMP STA S_FRACL LDA S_MIDFH SBC TMP+1 STA S_FRACH LDA S_MIDI SBC DS_INT STA S_INT LDA DT_FRACL STA TMP LDA DT_FRACH CMP #$80 ROR ; T = T_MID - DT/2 STA TMP+1 ROR TMP LDA T_MIDFL SEC SBC TMP STA T_FRACL LDA T_MIDFH SBC TMP+1 STA T_FRACH LDA T_MIDI SBC DT_INT STA T_INT LDY #14 ; Left-middle of screen BNE GRNDLE - LDA #$00 BEQ + GRNDLE LDA S_INT CMP #$40 BCS - LDX T_INT CPX #$40 BCS - ORA MAP_TBLL,X STA RDTEXLE+1 LDA MAP_TBLH,X STA RDTEXLE+2 RDTEXLE LDA MAP AND #$0F + ORA (GBASE),Y STA (GBASE),Y LDA S_FRACL ; S = S + DS SEC SBC DS_FRACL STA S_FRACL LDA S_FRACH SBC DS_FRACH STA S_FRACH LDA S_INT SBC DS_INT STA S_INT LDA T_FRACL ; T = T + DT SEC SBC DT_FRACL STA T_FRACL LDA T_FRACH SBC DT_FRACH STA T_FRACH LDA T_INT SBC DT_INT STA T_INT DEY BPL GRNDLE DEC VDLY BNE + BIT SPEAKER LDA VTONE STA VDLY + INC SCANLN ; Move on to next even/odd scanlines LDY SCANLN CPY #HORIZON/2 BEQ DRAWBACK JMP DRAWGRNDSCN ;* ;* Draw background ;* DRAWBACK LDA VIEWPORT ; Max scanline number/2 SEC SBC SCANLN TAY LDA TXT_TBLL,Y STA STBCK1+1 LDA TXT_TBLH,Y ORA GPAGE STA STBCK1+2 LDA TXT_TBLL-1,Y STA STBCK2+1 LDA TXT_TBLH-1,Y ORA GPAGE STA STBCK2+2 LDY #29 LDA ANGLE CLC ADC #15 - AND #$7F TAX LDA WALLS,X STBCK1 STA $0400,Y AND #$F0 STBCK2 STA $0400,Y DEX TXA DEY BPL - ;* ;* Draw top-down map view ;* DRAWMAP LDA VIEWPORT TAY STY SCANLN SEC SBC #9 ; 20 - 2 STA VIEWPORT DRAWMAPSCN LDA TXT_TBLL,Y STA STMAP+1 LDA TXT_TBLH,Y ORA GPAGE STA STMAP+2 LDX #$80 TYA CLC ADC YVIEWI SEC SBC #$05 ; SEC SBC VIEWPORT CMP #$40 BCS + ; Scanline is off the map, so force black coordinates TAX LDA MAP_TBLL,X STA LDMAP+1 LDA MAP_TBLH,X STA LDMAP+2 LDA XVIEWI SEC SBC #$04 TAX + LDY #31 - CPX #$40 BCC LDMAP LDA #$00 BEQ STMAP LDMAP LDA MAP,X STMAP STA $0400,Y INX INY CPY #40 BNE - DEC MDLY BNE + BIT SPEAKER LDA MTONE STA MDLY + DEC SCANLN LDY SCANLN CPY VIEWPORT BNE DRAWMAPSCN LDA P1XI ; Plot player 1 on map SEC SBC XVIEWI CLC ADC #$04 BMI + CMP #9 BCS + ADC #31 TAY LDA P1YI SEC SBC YVIEWI CLC ADC #$04 BMI + CMP #9 BCS + SEC ADC VIEWPORT TAX LDA TXT_TBLL,X STA TMP LDA TXT_TBLH,X ORA GPAGE STA TMP+1 LDA P1CYCLE STA (TMP),Y + LDA P2XI ; Plot player 2 on map SEC SBC XVIEWI CLC ADC #$04 BMI + CMP #9 BCS + ADC #31 TAY LDA P2YI SEC SBC YVIEWI CLC ADC #$04 BMI + CMP #9 BCS + SEC ADC VIEWPORT TAX LDA TXT_TBLL,X STA TMP LDA TXT_TBLH,X ORA GPAGE STA TMP+1 LDA P2CYCLE STA (TMP),Y + RTS ;* ;* Draw enemy light cycle ;* DRAWENEMY ASL STA EBTTM INC EBTTM INC EBTTM ; SEC SBC #HORIZON-1 STA VIEWPORT LDA #$00 STA SCANLN TXA ASL STA TMP CMP #$80 ROR CMP #$80 ROR CLC ADC TMP STA TMP LDA #15 SEC SBC TMP CMP #30 BCS ++ STA ECNTR LDA PPSIZE CMP #$01 BNE + LDY VIEWPORT ; Only one pixel to plot INY LDX ECNTR JMP GPLOT + LDA SCANLN - CLC ADC VIEWPORT TAY LDA ECNTR SEC SBC SCANLN BPL + LDA #$00 + TAX LDA ECNTR CLC ADC SCANLN CMP #30 BCC + LDA #29 + JSR GHLIN INC SCANLN LDA SCANLN CMP PPSIZE BCC - ASL ; CLC ADC VIEWPORT STA VIEWPORT - SEC SBC SCANLN CMP EBTTM BCS ++ TAY LDA ECNTR SEC SBC SCANLN BPL + LDA #$00 + TAX LDA ECNTR CLC ADC SCANLN CMP #30 BCC + LDA #29 + JSR GHLIN LDA VIEWPORT DEC SCANLN BPL - ++ RTS ECNTR !BYTE $00 EBTTM !BYTE $00 ;* ;* Draw boost amount ;* UPDTBST LSR LSR LSR LSR STA TMP JSR GOTOXY JSR NORMAL LDX #$0F EMPTYBST CPX TMP BEQ + LDA #' ' JSR PUTC DEX BPL EMPTYBST BMI ++ + CPX #$00 BEQ ++ JSR INVERSE FULLBST LDA #'=' JSR PUTC DEX BNE FULLBST ++ JSR INVERSE RTS ;* ;* Draw paddle position ;* UPDTPDL TYA LSR LSR LSR CMP GCPREVY BEQ ++ STX TMP PHA LDX #0 LDY #22 JSR GOTOXY LDA GCPREVY CMP #14 BCC + LDA #14 + CLC ADC #3 TAY LDA (TBAS1),Y AND #$7F STA (TBAS1),Y STA (TBAS2),Y PLA STA GCPREVY CMP #14 BCC + LDA #14 + CLC ADC #3 TAY LDA (TBAS1),Y ORA #$80 STA (TBAS1),Y STA (TBAS2),Y LDX TMP ++ TXA LSR LSR LSR CMP GCPREVX BEQ ++ PHA LDX #0 LDY #22 JSR GOTOXY LDA GCPREVX CMP #14 BCC + LDA #14 + CLC ADC #22 TAY LDA (TBAS1),Y AND #$7F STA (TBAS1),Y STA (TBAS2),Y PLA STA GCPREVX CMP #14 BCC + LDA #14 + CLC ADC #22 TAY LDA (TBAS1),Y ORA #$80 STA (TBAS1),Y STA (TBAS2),Y ++ LDY GCPREVY LDX GCPREVX RTS GCPREVX !BYTE $00 GCPREVY !BYTE $00