diff --git a/LC3D-DOC.pdf b/LC3D-DOC.pdf new file mode 100755 index 0000000..49a2bfa Binary files /dev/null and b/LC3D-DOC.pdf differ diff --git a/LightCycles.png b/LightCycles.png new file mode 100755 index 0000000..c2315ad Binary files /dev/null and b/LightCycles.png differ diff --git a/cassette.jpg b/cassette.jpg new file mode 100755 index 0000000..f89265a Binary files /dev/null and b/cassette.jpg differ diff --git a/cross.asm b/cross.asm new file mode 100755 index 0000000..316807d --- /dev/null +++ b/cross.asm @@ -0,0 +1,55 @@ + !BYTE 0,4 ; Scanline repeat count + !BYTE 17,128+31,16 + !BYTE 0,1 ; Scanline repeat count + !BYTE 21,128+23,20 + !BYTE 0,1 ; Scanline repeat count + !BYTE 22,128+21,21 + !BYTE 0,1 ; Scanline repeat count + !BYTE 23,128+19,22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 24,128+17,23 + !BYTE 0,9 ; Scanline repeat count + !BYTE 25,128+15,24 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+4,21,128+15,21,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+5,20,128+15,20,128+4 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+6,19,128+15,19,128+5 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+7,19,128+13,19,128+6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,19,128+11,19,128+7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+23,4,128+11,4,128+22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+24,3,128+11,3,128+23 + !BYTE 0,11 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+24,3,128+11,3,128+23 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+23,4,128+11,4,128+22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,19,128+11,19,128+7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+7,19,128+13,19,128+6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+6,19,128+15,19,128+5 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+5,20,128+15,20,128+4 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+4,21,128+15,21,128+3 + !BYTE 0,9 ; Scanline repeat count + !BYTE 25,128+15,24 + !BYTE 0,1 ; Scanline repeat count + !BYTE 24,128+17,23 + !BYTE 0,1 ; Scanline repeat count + !BYTE 23,128+19,22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 22,128+21,21 + !BYTE 0,1 ; Scanline repeat count + !BYTE 21,128+23,20 + !BYTE 0,3 ; Scanline repeat count + !BYTE 16,128+32,16 + !BYTE 0,0 ; End of compressed map diff --git a/drag.asm b/drag.asm new file mode 100755 index 0000000..6c8e4be --- /dev/null +++ b/drag.asm @@ -0,0 +1,15 @@ + !BYTE 0,20 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,9 ; Scanline repeat count + !BYTE 45,128+19 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,1 ; Scanline repeat count + !BYTE 1,128+3,5,128+3,5,128+3,5,128+3,5,128+3,5,128+3,20 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,9 ; Scanline repeat count + !BYTE 45,128+19 + !BYTE 0,19 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,0 ; End of compressed map diff --git a/drawview.asm b/drawview.asm new file mode 100755 index 0000000..a1096a7 --- /dev/null +++ b/drawview.asm @@ -0,0 +1,815 @@ +;* +;* 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 diff --git a/hole.asm b/hole.asm new file mode 100755 index 0000000..522a14e --- /dev/null +++ b/hole.asm @@ -0,0 +1,71 @@ + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+28,7,128+1,1,128+27 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+24,16,128+24 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+21,22,128+21 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+19,26,128+19 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+17,30,128+17 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+16,32,128+16 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+14,36,128+14 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+13,38,128+13 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+12,40,128+12 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+11,42,128+11 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+10,44,128+10 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+9,46,128+9 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+8,48,128+8 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+7,50,128+7 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+6,52,128+6 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+5,54,128+5 + !BYTE 0,8 ; Scanline repeat count + !BYTE 128+4,56,128+4 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+5,54,128+5 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+6,52,128+6 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+7,50,128+7 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+8,48,128+8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+9,46,128+9 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+10,44,128+10 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+11,42,128+11 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+12,40,128+12 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+13,38,128+13 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+14,36,128+14 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+16,32,128+16 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+17,30,128+17 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+19,26,128+19 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+21,22,128+21 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+24,16,128+24 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+28,7,128+1,1,128+27 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,0 ; End of compressed map diff --git a/intro.asm b/intro.asm new file mode 100755 index 0000000..37b3c7a --- /dev/null +++ b/intro.asm @@ -0,0 +1,909 @@ + LDA #$91 ; CTRL-Q = TURN OFF 80 COLUMN + JSR $FDED ; COUT + STA $C000 ; Turn off 80STORE + STA $C00E ; Primary charset + CLI ; Turn off interrupts + LDA #ARENAS + STA ARENAP+1 +;* +;* Check for connected paddles +;* + JSR GCREAD + LDA #$01 + CPX #GCMAX + BNE + + CPY #GCMAX + BNE + + LDA #$00 ++ STA USEPDLS +;* +;* Initialize game state and get player options +;* +INITGAME + LDA $C054 ; Display page 1 + JSR $FB39 ; TXT mode + JSR NORMAL + JSR $FC58 ; HOME + LDA #$10 + STA GCPREVX + STA GCPREVY +;* +;* Init player panel +;* + JSR INVERSE + LDX #0 + LDY #20 + JSR PUTSXY + !TEXT "/:::: PLAYER 1 ::::\/:::: PLAYER 2 ::::\", 0 + LDX #0 + LDY #21 + JSR PUTSXY + !TEXT "! [===============]!![===============] !", 0 + LDX #0 + LDY #22 + JSR PUTSXY + !TEXT "! <<<<<<<*>>>>>>> !! <<<<<<<*>>>>>>> !", 0 + LDX #0 + LDY #23 + JSR PUTSXY + !TEXT "\::::::::::::::::::/\::::::::::::::::::/", 0 +;* +;* Display initial setting screen +;* +SHOWOPT JSR NORMAL + LDX #12 + LDY #0 + JSR PUTSXY + !TEXT "BY: RESMAN", 0 + LDX #10 + LDY #1 + JSR PUTSXY + !TEXT "COPYRIGHT 1977", 0 + LDX #4 + LDY #19 + JSR PUTSXY + !TEXT "(WHY 1977 WON'T BE LIKE 1977)", 0 + LDX #10 + LDY #4 + JSR GOTOXY + JSR INVERSE + LDA #'P' + JSR PUTC + JSR NORMAL + JSR PUTS + !TEXT "ADDLES: ", 0 + LDA USEPDLS + BEQ + + JSR PUTS + !TEXT "ENABLE ", 0 + JMP ++ ++ JSR PUTS + !TEXT "DISABLE", 0 +++ LDX #10 + LDY #7 + JSR GOTOXY + JSR INVERSE + LDA #'A' + JSR PUTC + JSR NORMAL + JSR PUTS + !TEXT "RENA: ", 0 + LDA ARENAP + STA TMP + LDA ARENAP+1 + STA TMP+1 + LDY #$00 +- TYA + PHA + LDA (TMP),Y + JSR PUTC + PLA + TAY + INY + CPY #$10 + BNE - + LDX #10 + LDY #10 + JSR PUTSXY + !TEXT "PLAYER ", 0 + JSR INVERSE + LDA #'1' + JSR PUTC + JSR NORMAL + LDA P1MAN + BEQ + + JSR PUTS + !TEXT ": HUMAN ", 0 + JMP ++ ++ JSR PUTS + !TEXT ": COMPUTER", 0 +++ LDX #10 + LDY #11 + JSR PUTSXY + !TEXT "PLAYER ", 0 + JSR INVERSE + LDA #'2' + JSR PUTC + JSR NORMAL + LDA P2MAN + BEQ + + JSR PUTS + !TEXT ": HUMAN ", 0 + JMP ++ ++ JSR PUTS + !TEXT ": COMPUTER", 0 +++ LDX #10 + LDY #14 + JSR PUTSXY + !TEXT "START GAME:", 0 + LDX #15 + LDY #15 + JSR GOTOXY + JSR INVERSE + LDA #'S' + JSR PUTC + JSR NORMAL + JSR PUTS + !TEXT "HORT TRAIL", 0 + LDX #15 + LDY #16 + JSR GOTOXY + JSR INVERSE + LDA #'M' + JSR PUTC + JSR NORMAL + JSR PUTS + !TEXT "EDIUM TRAIL", 0 + LDX #15 + LDY #17 + JSR GOTOXY + JSR INVERSE + LDA #'L' + JSR PUTC + JSR NORMAL + JSR PUTS + !TEXT "ONG TRAIL", 0 +;* +;* Scan for option input +;* +OPTION LDA KEYBD + BMI + + JMP OPTPDLS ++ BIT KEYSTRB + CMP #$D0 ; P key + BNE + + LDA USEPDLS + EOR #$01 + STA USEPDLS + JMP SHOWOPT ++ CMP #$C1 ; A key + BNE ++ + ; Move to next arena + LDA ARENAP + STA TMP + LDA ARENAP+1 + STA TMP+1 + LDY #$1A ; Scan for end of compressed map +- LDA (TMP),Y + BEQ + + INY + BNE - ++ INY + TYA + CLC + ADC TMP + STA TMP + LDA #$00 + ADC TMP+1 + STA TMP+1 + LDY #$00 + LDA (TMP),Y + BNE - + INY + LDA (TMP),Y ; Check for end of arena == 0 + BNE + + LDA #ARENAS + STA ARENAP+1 + JMP SHOWOPT ++ TYA + CLC + ADC TMP + STA ARENAP + LDA #$00 + ADC TMP+1 + STA ARENAP+1 + JMP SHOWOPT +++ CMP #$B1 ; 1 KEY + BNE + + LDA P1MAN + EOR #$01 + STA P1MAN + JMP SHOWOPT ++ CMP #$B2 ; 2 KEY + BNE + + LDA P2MAN + EOR #$01 + STA P2MAN + JMP SHOWOPT ++ CMP #$D3 ; S key + BNE + + LDA #$0F + STA LENTAIL + BNE STARTGAME ++ CMP #$CD ; M key + BNE + + LDA #$7F + STA LENTAIL + BNE STARTGAME ++ CMP #$CC ; L key + BNE + + LDA #$FF + STA LENTAIL + BNE STARTGAME ++ CMP #$9B ; ESC key + BNE OPTPDLS + JMP EXIT +OPTPDLS LDA USEPDLS + BEQ + + JSR GCREAD + JSR UPDTPDL ++ JMP OPTION +STARTGAME +;* +;* Init arena map +;* + LDA #>MAP + STA STPTRH + LDY #(MAP+$1000) + BNE INITMAP +;* +;* Get arena initial start positions +;* + LDA ARENAP + STA TMP + LDA ARENAP+1 + STA TMP+1 + LDY #$10 ; Copy start angle/pos out of arena map + LDA (TMP),Y + STA P1ANGLE + INY + LDA (TMP),Y + STA P1XF + INY + LDA (TMP),Y + STA P1XI + STA P1XPREV + INY + LDA (TMP),Y + STA P1YF + INY + LDA (TMP),Y + STA P1YI + STA P1YPREV + INY + LDA (TMP),Y + STA P2ANGLE + INY + LDA (TMP),Y + STA P2XF + INY + LDA (TMP),Y + STA P2XI + STA P2XPREV + INY + LDA (TMP),Y + STA P2YF + INY + LDA (TMP),Y + STA P2YI + STA P2YPREV +;* +;* Init rest of player variables +;* + LDX #$00 ; Clear out tails +- LDA #$40 + STA P1YTAIL,X + STA P2YTAIL,X + LDA #$00 + STA P1XTAIL,X + LDA #$7F + STA P2XTAIL,X + DEX + BNE - + STX P1TURBO ; Reset turbo values + STX P2TURBO + LDA #FULLBOOST + STA P1BOOST + STA P2BOOST +;* +;* Start decompressing into map +;* + LDA #>MAP + STA STPTRH + LDA # dividend + STA DVSR + STX DVDND + LDA DVDND+1 + LDX DVSR+1 + STA DVSR+1 + STX DVDND+1 + LDX #$80 ++ STX SIGN ; Use SIGN to save octant flip flag + LDX DVSR+1 ; Divide 8.8 by 8.0 to get 8.8 result + LDA DVSR ; Convert divisor to 8.0 + ASL ; Round up + BCC + + INX ++ STX DVSR + LDA #$00 + STA DVSR+1 + JSR DIV + CPX #$00 + BEQ + + LDA #$10 ; On the diagonal + BNE ++ ++ LDX #$FE +SRCHTAN INX ; Scan tan() table LSBs for matching angle + INX + CMP TAN_TBL,X + BEQ + + BCS SRCHTAN ; Less than, reload MSB and keep searching ++ TXA + LSR ; Convert index to angle + LDX SIGN + BPL ++ + STA TMP ; Reflect octant + LDA #$20 + SEC + SBC TMP +++ EOR QUADRNT ; Reflect into correct quadrant + STA PPANGLE +;* +;* Update rythm based on player-to-player distance +;* + LDA DRYTHM + CLC + ADC #$01 + CMP PPDIST + BCC + + LDA #$00 + LSR VTONE + BNE + + LDX #$02 + STX VTONE ++ STA DRYTHM +;* +;* Render views +;* + LDA P1ANGLE + STA ANGLE + LDA P1XF + STA XVIEWF + LDA P1XI + STA XVIEWI + LDA P1YF + STA YVIEWF + LDA P1YI + STA YVIEWI + LDA #$02 + SEC + SBC P1TURBO + STA MTONE + LDA #VIEWTOP + JSR DRAWVIEW + LDA P2CYCLE + STA GCLR + LDA P1ANGLE + SEC + SBC PPANGLE + AND #$7F + TAX + LDA #VIEWTOP + JSR DRAWENEMY + LDA P2ANGLE + STA ANGLE + LDA P2XF + STA XVIEWF + LDA P2XI + STA XVIEWI + LDA P2YF + STA YVIEWF + LDA P2YI + STA YVIEWI + LDA #$02 + SEC + SBC P2TURBO + STA MTONE + LDA #VIEWBOT + JSR DRAWVIEW + LDA P1CYCLE + STA GCLR + LDA P2ANGLE + SEC + SBC PPANGLE + CLC + ADC #$40 ; Flip angle to opposite direction + AND #$7F + TAX + LDA #VIEWBOT + JSR DRAWENEMY + JSR GSWAP +;* +;* AI player update +;* +AI1 LDA P1MAN + BNE AI2 +; BEQ + +; JMP AI2 +;+ + LDX P1XI + LDY P1YI + JSR MAPWTS ; Calc best direction based on map + LDY P2ANGLE + LDX #$00 + LDA COS_TBL,Y + ASL + BCC + + DEX + CLC ++ ADC P2XF + TXA + ADC P2XI + SEC + SBC P1XI + PHA + LDX #$00 + LDA SIN_TBL,Y + ASL + BCC + + DEX + CLC ++ ADC P2YF + TXA + ADC P2YI + SEC + SBC P1YI + TAY + PLA + TAX +; LDA P2XF +; CMP P1XF +; LDA P2XI +; SBC P1XI +; TAX +; LDA P2YF +; CMP P1YF +; LDA P2YI +; SBC P1YI +; TAY + JSR ENMYWT ; Calc best dir based on enemy relative pos + LDA P1ANGLE ; Default to current angle + LSR + LSR + LSR + LSR + LSR + TAY + EOR #$02 ; Don't allow 180 degree turns + TAX + LDA #$00 + STA AIMOVE,X + LDA AIMOVE,Y + LDX #$03 +- CMP AIMOVE,X ; Select highest weighted direction + BCS + + TXA + TAY + LDA AIMOVE,X ++ DEX + BPL - + TYA ; Convert to angle + ASL + ASL + ASL + ASL + ASL +; CMP P1ANGLE +; BEQ + + STA P1ANGLE +; LDA #$80 +; STA P1XF +; STA P1YF ++ LDY #$00 + LDX PPSIZE ; Turbo when enemy is close +; DEX + BEQ + + INY ++ STY P1TURBO +; LDX #5 +; LDY #23 +; JSR GOTOXY +; LDA AIMOVE+0 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+1 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+2 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+3 +; JSR PUTA +; LDA #'=' +; JSR PUTC +; LDA P1ANGLE +; JSR PUTA +AI2 LDA P2MAN + BNE READKBD +; BEQ + +; JMP READKBD +;+ + LDX P2XI + LDY P2YI + JSR MAPWTS ; Calc best direction based on map + LDY P1ANGLE + LDX #$00 + LDA COS_TBL,Y + ASL + BCC + + DEX + CLC ++ ADC P1XF + TXA + ADC P1XI + SEC + SBC P2XI + PHA + LDX #$00 + LDA SIN_TBL,Y + ASL + BCC + + DEX + CLC ++ ADC P1YF + TXA + ADC P1YI + SEC + SBC P2YI + TAY + PLA + TAX +; LDA P1XF +; CMP P2XF +; LDA P1XI +; SBC P2XI +; TAX +; LDA P1YF +; CMP P2YF +; LDA P1YI +; SBC P2YI +; TAY + JSR ENMYWT ; Calc best dir based on enemy relative pos + LDA P2ANGLE ; Default to current angle + LSR + LSR + LSR + LSR + LSR + TAY + EOR #$02 ; Don't allow 180 degree turns + TAX + LDA #$00 + STA AIMOVE,X + LDA AIMOVE,Y + LDX #$03 +- CMP AIMOVE,X ; Select highest weighted direction + BCS + + TXA + TAY + LDA AIMOVE,X ++ DEX + BPL - + TYA ; Convert to angle + ASL + ASL + ASL + ASL + ASL +; CMP P2ANGLE +; BEQ + + STA P2ANGLE +; LDA #$80 +; STA P2XF +; STA P2YF ++ LDY #$00 + LDX PPSIZE ; Turbo when enemy is close +; DEX + BEQ + + INY ++ STY P2TURBO +; LDX #25 +; LDY #23 +; JSR GOTOXY +; LDA AIMOVE+0 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+1 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+2 +; JSR PUTA +; LDA #' ' +; JSR PUTC +; LDA AIMOVE+3 +; JSR PUTA +; LDA #'=' +; JSR PUTC +; LDA P2ANGLE +; JSR PUTA +;* +;* Get player input and update position +;* +READKBD LDA KEYBD + BMI + + JMP READPDL ++ BIT KEYSTRB + CMP #$9B ; ESC key? + BNE + +- LDA KEYBD ; Pause + BPL - + BIT KEYSTRB + CMP #$D1 ; Quit + BNE + + LDA #$03 + STA PSTATUS + RTS ++ LDX USEPDLS + BEQ + + JMP READPDL ++ LDX P1MAN + BEQ ++ + CMP #$C1 ; A key + BNE + + LDA P1ANGLE + SEC + SBC #$20 + AND #$7F + STA P1ANGLE +; LDA #$80 +; STA P1XF +; STA P1YF + BNE READPDL ++ CMP #$C4 ; D key + BNE + + LDA P1ANGLE + CLC + ADC #$20 + AND #$7F + STA P1ANGLE +; LDA #$80 +; STA P1XF +; STA P1YF + BNE READPDL ++ CMP #$D3 ; S key + BNE ++ + LDA P1TURBO + EOR #$01 + STA P1TURBO + BPL READPDL +++ LDX P2MAN + BEQ READPDL + CMP #$CA ; J key + BNE + + LDA P2ANGLE + SEC + SBC #$20 + AND #$7F + STA P2ANGLE +; LDA #$80 +; STA P2XF +; STA P2YF + BNE READPDL ++ CMP #$CC ; L key + BNE + + LDA P2ANGLE + CLC + ADC #$20 + AND #$7F + STA P2ANGLE +; LDA #$80 +; STA P2XF +; STA P2YF + BNE READPDL ++ CMP #$CB ; K key + BNE READPDL + LDA P2TURBO + EOR #$01 + STA P2TURBO +READPDL JSR GCREAD + PHA + LDA USEPDLS + BNE + + PLA + JMP CHKBOOST ++ LDA P1MAN ; Check for player 1 AI + BEQ + + LDA #$00 + STA P1TURBO + PLA + PHA + BPL ++ + INC P1TURBO + BNE ++ ++ LDY #GCMAX/2 +++ LDA P2MAN ; Check for player 2 AI + BEQ + + LDA #$00 + STA P2TURBO + PLA + ASL + BPL ++ + INC P2TURBO + BNE ++ ++ LDX #GCMAX/2 + PLA +++ JSR UPDTPDL + TYA + SEC + SBC #GCMAX/16 + CLC + ADC P1ANGLE + AND #$7F + STA P1ANGLE + TXA + SEC + SBC #GCMAX/16 + CLC + ADC P2ANGLE + AND #$7F + STA P2ANGLE +CHKBOOST LDA P1TURBO + BEQ ++ + LDA P1BOOST + BEQ + + SEC + SBC #$08 + STA P1BOOST + LDX #3 + LDY #21 + JSR UPDTBST + LDA #$01 ++ STA P1TURBO +++ LDA P2TURBO + BEQ P1MOVE + LDA P2BOOST + BEQ + + SEC + SBC #$08 + STA P2BOOST + LDX #22 + LDY #21 + JSR UPDTBST + LDA #$01 ++ STA P2TURBO +;* +;* Update player 1 +;* +P1MOVE LDY P1ANGLE + LDA P1TURBO + LSR + LDX #$00 + LDA COS_TBL,Y + BPL + ; Sign extend into X + DEX ++ BCS + ; Turbo active? + CMP #$80 + ROR ++ CLC + ADC P1XF + STA P1XF + TXA + ADC P1XI + STA P1XI + LDA P1TURBO + LSR + LDX #$00 + LDA SIN_TBL,Y + BPL + ; Sign extend into X + DEX ++ BCS + ; Turbo active? + CMP #$80 + ROR ++ CLC + ADC P1YF + STA P1YF + TXA + ADC P1YI + STA P1YI +;* +;* Update player 2 +;* +P2MOVE LDY P2ANGLE + LDA P2TURBO + LSR + LDX #$00 + LDA COS_TBL,Y + BPL + ; Sign extend into X + DEX ++ BCS + ; Turbo active? + CMP #$80 + ROR ++ CLC + ADC P2XF + STA P2XF + TXA + ADC P2XI + STA P2XI + LDA P2TURBO + LSR + LDX #$00 + LDA SIN_TBL,Y + BPL + ; Sign extend into X + DEX ++ BCS + ; Turbo active? + CMP #$80 + ROR ++ CLC + ADC P2YF + STA P2YF + TXA + ADC P2YI + STA P2YI +;* +;* Check for collision +;* + ;LDA P2YI + CMP P1YI + BNE UPDTAIL1 + LDA P2XI + CMP P1XI + BNE UPDTAIL1 + LDA #$03 + STA PSTATUS +;* +;* Update map with tails +;* +UPDTAIL1 LDX P1XI ; Player 1 tail + LDY P1YI + CPX P1XPREV + BNE + + CPY P1YPREV + BEQ UPDTAIL2 ++ STX P1XPREV + STY P1YPREV + INC P1HEAD + LDA P1HEAD + AND LENTAIL + TAX + PHA + LDY P1XTAIL,X + LDA P1YTAIL,X + TAX + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + TXA ; Which color to clear to + LSR + TYA + ADC #$00 +; LDA P1XTAIL,X ; Which color to clear to +; EOR P1YTAIL,X + LSR + LDA #GREY + BCS + + LDA #DRKBLU ++ STA (TMP),Y ; Clear map + PLA + TAX + LDA P1XI + CMP #$40 + BCS DEREZ1 + STA P1XTAIL,X + TAY + LDA P1YI + CMP #$40 + BCS DEREZ1 + STA P1YTAIL,X + TAX + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BEQ + +DEREZ1 LDA #$01 ; Uh, oh. Player 1 derez! + ORA PSTATUS + STA PSTATUS + BNE UPDTAIL2 ++ LDA #P1TLCLR + STA (TMP),Y +UPDTAIL2 LDX P2XI ; Player 2 tail + LDY P2YI + CPX P2XPREV + BNE + + CPY P2YPREV + BEQ CHKSTAT ++ STX P2XPREV + STY P2YPREV + INC P2HEAD + LDA P2HEAD + AND LENTAIL + TAX + PHA + LDY P2XTAIL,X + LDA P2YTAIL,X + TAX + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + TXA ; Which color to clear to + LSR + TYA + ADC #$00 +; LDA P2XTAIL,X ; Which color to clear to +; EOR P2YTAIL,X + LSR + LDA #GREY + BCS + + LDA #DRKBLU ++ STA (TMP),Y ; Clear map + PLA + TAX + LDA P2XI + CMP #$40 + BCS DEREZ2 + STA P2XTAIL,X + TAY + LDA P2YI + CMP #$40 + BCS DEREZ2 + STA P2YTAIL,X + TAX + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BEQ + +DEREZ2 LDA #$02 ; Uh, oh. Player 2 derez! + ORA PSTATUS + STA PSTATUS + BNE GAMEOVER ++ LDA #P2TLCLR + STA (TMP),Y +CHKSTAT LDA PSTATUS + BNE GAMEOVER + INC FRAMENUM + LDA FRAMENUM + LSR + AND #$03 + TAX + LDA P1CYCLE+1,X + STA P1CYCLE + LDA P2CYCLE+1,X + STA P2CYCLE +; LDX #19 +; LDY #23 +; JSR GOTOXY +; LDA FRAMENUM +; JSR PUTA + JMP GAMELOOP +GAMEOVER RTS +;* +;* Calc best direction based on map +;* +MAPWTS LDA #$00 + STA AIMOVE+0 + STA AIMOVE+1 + STA AIMOVE+2 + STA AIMOVE+3 + TYA + PHA + TXA + PHA + TYA + TAX + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 ; Check map for obstacles + PLA + PHA + TAY + INY ; Check +X + CPY #$40 + BCS ++ ; Off map + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$04 + STA AIMOVE+0 + INY ; Check ++X + CPY #$40 + BCS ++ ; Off map + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$05 + STA AIMOVE+0 +++ PLA + PHA + TAY + DEY ; Check -X + BMI ++ ; Off map + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$04 + STA AIMOVE+2 + DEY ; Check --X + BMI ++ ; Off map + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$05 + STA AIMOVE+2 +++ PLA + TAY + PLA + PHA + TAX + INX ; Check +Y + CPX #$40 + BCS ++ + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$04 + STA AIMOVE+1 + INX ; Check ++Y + CPX #$40 + BCS ++ + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$05 + STA AIMOVE+1 +++ PLA + TAX + DEX ; Check -Y + BMI ++ + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$04 + STA AIMOVE+3 + DEX ; Check --Y + BMI ++ + LDA MAP_TBLL,X + STA TMP + LDA MAP_TBLH,X + STA TMP+1 + LDA (TMP),Y + CMP #DRKBLU + BEQ + + CMP #GREY + BNE ++ ; Some kind of obstacle ++ LDA #$05 + STA AIMOVE+3 +++ RTS +;* +;* Calc best direction based on relative enemy poition +;* +ENMYWT TXA + BEQ ++ + BMI + + INC AIMOVE+0 ; Enemy to the right + INC AIMOVE+0 + BNE ++ ++ INC AIMOVE+2 ; Enemy to the left + INC AIMOVE+2 +++ TYA + BEQ ++ + BMI + + INC AIMOVE+1 ; Enemy above + INC AIMOVE+1 + RTS ++ INC AIMOVE+3 ; Enemy below + INC AIMOVE+3 +++ RTS +;* +;* Player variables +;* +PSTATUS !BYTE $00 ; Player alive status +PPANGLE !BYTE $00 ; Player-to-player angle +PPDIST !BYTE $00 ; Player-to=player distance^2 +PPSIZE !BYTE $00 ; Player-to-player size +LENTAIL !BYTE $0F ; Tail length +P1MAN !BYTE $01 ; Human/AI +P1ANGLE !BYTE $00 ; Direction +P1XF !BYTE $00 ; Position +P1XI !BYTE $00 +P1YF !BYTE $00 +P1YI !BYTE $00 +P1TURBO !BYTE $00 +P1BOOST !BYTE $F0 +P1XPREV !BYTE $FF +P1YPREV !BYTE $FF +P1HEAD !BYTE $00 ; Tail list - set length for easy/med/hard +P1XTAIL !FILL 256 +P1YTAIL !FILL 256 +P1CYCLE !BYTE P1CLR,GRAY,P1CLR,WHITE,P1CLR +P2MAN !BYTE $01 ; Human/AI +P2ANGLE !BYTE $00 ; Direction +P2XF !BYTE $00 ; Position +P2XI !BYTE $00 +P2YF !BYTE $00 +P2YI !BYTE $00 +P2TURBO !BYTE $00 +P2BOOST !BYTE $F0 +P2XPREV !BYTE $FF +P2YPREV !BYTE $FF +P2HEAD !BYTE $00 ; Tail list - set length for easy/med/hard +P2XTAIL !FILL 256 +P2YTAIL !FILL 256 +P2CYCLE !BYTE P2CLR,GRAY,P2CLR,WHITE,P2CLR +;* +;* AI best move weights +;* +AIMOVE !BYTE $00,$00,$00,$00 +;* +;* Working variables +;* +USEPDLS !BYTE $00 +CURPAGE !BYTE $01 +PGBASE !BYTE $08,$04 +FRAMENUM !BYTE $00 +DRYTHM !BYTE $00 +VTONE !BYTE $01 +VDLY !BYTE $01 +MTONE !BYTE $01 +MDLY !BYTE $01 +;* +;* Background walls - set each wall quadrant to a different color +;* +WALLS !BYTE PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK + !BYTE YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW + !BYTE YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW + !BYTE AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA + !BYTE AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA + !BYTE ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE + !BYTE ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE + !BYTE PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK +;* +;* Map row addresses +;* +MAP_TBLL !BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0 + !BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0 + !BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0 + !BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0 +MAP_TBLH !BYTE $00+>MAP,$00+>MAP,$00+>MAP,$00+>MAP,$01+>MAP,$01+>MAP,$01+>MAP,$01+>MAP,$02+>MAP,$02+>MAP,$02+>MAP,$02+>MAP,$03+>MAP,$03+>MAP,$03+>MAP,$03+>MAP + !BYTE $04+>MAP,$04+>MAP,$04+>MAP,$04+>MAP,$05+>MAP,$05+>MAP,$05+>MAP,$05+>MAP,$06+>MAP,$06+>MAP,$06+>MAP,$06+>MAP,$07+>MAP,$07+>MAP,$07+>MAP,$07+>MAP + !BYTE $08+>MAP,$08+>MAP,$08+>MAP,$08+>MAP,$09+>MAP,$09+>MAP,$09+>MAP,$09+>MAP,$0A+>MAP,$0A+>MAP,$0A+>MAP,$0A+>MAP,$0B+>MAP,$0B+>MAP,$0B+>MAP,$0B+>MAP + !BYTE $0C+>MAP,$0C+>MAP,$0C+>MAP,$0C+>MAP,$0D+>MAP,$0D+>MAP,$0D+>MAP,$0D+>MAP,$0E+>MAP,$0E+>MAP,$0E+>MAP,$0E+>MAP,$0F+>MAP,$0F+>MAP,$0F+>MAP,$0F+>MAP +;* +;* Text/GR screen row addresses +;* +TXT_TBLL ; TXT/GR row pointers + !BYTE <$000,<$080,<$100,<$180,<$200,<$280,<$300,<$380 + !BYTE <$028,<$0A8,<$128,<$1A8,<$228,<$2A8,<$328,<$3A8 + !BYTE <$050,<$0D0,<$150,<$1D0,<$250,<$2D0,<$350,<$3D0 +TXT_TBLH ; TXT/GR row pointers + !BYTE >$000,>$080,>$100,>$180,>$200,>$280,>$300,>$380 + !BYTE >$028,>$0A8,>$128,>$1A8,>$228,>$2A8,>$328,>$3A8 + !BYTE >$050,>$0D0,>$150,>$1D0,>$250,>$2D0,>$350,>$3D0 + !SOURCE "grnd_st.asm" + !SOURCE "sincos.asm" + !SOURCE "tan.asm" + !WORD $FFFF ; Make sure tan() table search stops here + diff --git a/maze.asm b/maze.asm new file mode 100755 index 0000000..1149092 --- /dev/null +++ b/maze.asm @@ -0,0 +1,63 @@ + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+64 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,57,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+19,1,128+23,1,128+3,1,128+7,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,13,128+3,1,128+3,13,128+3,5,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+15,1,128+19,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+3,9,128+3,1,128+3,9,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+15,1,128+11,1,128+3,1,128+3,1,128+3,1,128+7,1,128+3,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,13,128+3,1,128+3,9,128+3,1,128+3,1,128+3,9,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+15,1,128+3,1,128+27,1,128+7,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,13,128+3,1,128+3,13,128+3,1,128+3,5,128+3,1,128+3,5,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+20,1,128+19,1,128+15,1,128+7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,13,128+3,17,128+3,1,128+3,9,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+35,1,128+11,1,128+3,1,128+3,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,33,128+3,5,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+40,1,128+7,1,128+3,1,128+11 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,13,128+3,17,128+3,9,128+3,1,128+3,5,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+20,1,128+7,1,128+11,1,128+7,1,128+3,1,128+3,1,128+7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 8,128+4,5,128+3,1,128+3,1,128+3,9,128+3,1,128+7,1,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+15,1,128+3,1,128+11,1,128+19,1,128+3,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,13,128+3,1,128+3,5,128+3,1,128+3,5,128+3,1,128+3,5,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+15,1,128+3,1,128+7,1,128+3,1,128+7,1,128+3,1,128+11,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+3,5,128+3,1,128+3,9,128+3,1,128+3,1,128+3,1,128+3,1,128+3,9,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+7,1,128+3,1,128+15,1,128+3,1,128+7,1,128+11,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,17,128+3,1,128+3,5,128+3,5,128+3,1,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+19,1,128+19,1,128+3,1,128+3,1,128+3,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+3,9,128+3,1,128+3,1,128+3,5,128+3,5,128+3,1,128+3,1,128+3,5,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+24,1,128+3,1,128+7,1,128+3,1,128+7,1,128+3,1,128+11 + !BYTE 0,1 ; Scanline repeat count + !BYTE 21,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,9,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+8,1,128+7,1,128+7,1,128+7,1,128+11,1,128+3,1,128+11,1,128+3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+4,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,1,128+3,13,128+3,9,128+3,1,128+3 + !BYTE 0,3 ; Scanline repeat count + !BYTE 128+4,1,128+7,1,128+7,1,128+3,1,128+3,1,128+27,1,128+7 + !BYTE 0,0 ; End of compressed map diff --git a/rings.asm b/rings.asm new file mode 100755 index 0000000..e47ea15 --- /dev/null +++ b/rings.asm @@ -0,0 +1,115 @@ + !BYTE 0,1 ; Scanline repeat count + !BYTE 25,128+14,25 + !BYTE 0,1 ; Scanline repeat count + !BYTE 22,128+20,22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 19,128+26,19 + !BYTE 0,1 ; Scanline repeat count + !BYTE 17,128+30,17 + !BYTE 0,1 ; Scanline repeat count + !BYTE 15,128+34,15 + !BYTE 0,1 ; Scanline repeat count + !BYTE 14,128+36,14 + !BYTE 0,1 ; Scanline repeat count + !BYTE 12,128+40,12 + !BYTE 0,1 ; Scanline repeat count + !BYTE 11,128+42,11 + !BYTE 0,1 ; Scanline repeat count + !BYTE 10,128+18,2,128+4,1,128+19,10 + !BYTE 0,1 ; Scanline repeat count + !BYTE 9,128+15,6,128+4,6,128+15,9 + !BYTE 0,1 ; Scanline repeat count + !BYTE 8,128+14,8,128+4,8,128+14,8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 7,128+13,10,128+4,10,128+13,7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 6,128+12,12,128+4,12,128+12,6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 6,128+11,13,128+4,13,128+11,6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 5,128+11,14,128+4,14,128+11,5 + !BYTE 0,1 ; Scanline repeat count + !BYTE 4,128+11,15,128+4,15,128+11,4 + !BYTE 0,1 ; Scanline repeat count + !BYTE 4,128+10,15,128+6,15,128+10,4 + !BYTE 0,1 ; Scanline repeat count + !BYTE 3,128+10,13,128+12,13,128+10,3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 3,128+9,12,128+16,12,128+9,3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+10,10,128+20,10,128+10,2 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+9,10,128+22,10,128+9,2 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+9,9,128+24,9,128+9,2 + !BYTE 0,2 ; Scanline repeat count + !BYTE 1,128+9,9,128+26,9,128+9,1 + !BYTE 0,1 ; Scanline repeat count + !BYTE 1,128+8,9,128+12,4,128+12,9,128+8,1 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+9,9,128+10,8,128+10,9,128+9 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+9,8,128+9,12,128+9,8,128+9 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,9,128+8,14,128+8,9,128+8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,8,128+9,14,128+9,8,128+8 + !BYTE 0,4 ; Scanline repeat count + !BYTE 128+8,8,128+8,16,128+8,8,128+8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,8,128+9,14,128+9,8,128+8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+8,9,128+8,14,128+8,9,128+8 + !BYTE 0,2 ; Scanline repeat count + !BYTE 128+9,8,128+9,12,128+9,8,128+9 + !BYTE 0,1 ; Scanline repeat count + !BYTE 128+9,9,128+10,8,128+10,9,128+8,1 + !BYTE 0,1 ; Scanline repeat count + !BYTE 1,128+8,9,128+12,4,128+12,9,128+8,1 + !BYTE 0,2 ; Scanline repeat count + !BYTE 1,128+9,9,128+26,9,128+9,1 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+9,9,128+24,9,128+9,2 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+9,10,128+22,10,128+9,2 + !BYTE 0,1 ; Scanline repeat count + !BYTE 2,128+10,10,128+20,10,128+10,2 + !BYTE 0,1 ; Scanline repeat count + !BYTE 3,128+9,12,128+16,12,128+9,3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 3,128+10,13,128+12,13,128+10,3 + !BYTE 0,1 ; Scanline repeat count + !BYTE 4,128+10,15,128+6,15,128+10,4 + !BYTE 0,1 ; Scanline repeat count + !BYTE 4,128+11,15,128+4,15,128+11,4 + !BYTE 0,1 ; Scanline repeat count + !BYTE 5,128+11,14,128+4,14,128+11,5 + !BYTE 0,1 ; Scanline repeat count + !BYTE 6,128+11,13,128+4,13,128+11,6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 6,128+12,12,128+4,12,128+12,6 + !BYTE 0,1 ; Scanline repeat count + !BYTE 7,128+13,10,128+4,10,128+13,7 + !BYTE 0,1 ; Scanline repeat count + !BYTE 8,128+14,8,128+4,8,128+14,8 + !BYTE 0,1 ; Scanline repeat count + !BYTE 9,128+15,6,128+4,6,128+15,9 + !BYTE 0,1 ; Scanline repeat count + !BYTE 10,128+17,1,128+1,1,128+4,2,128+18,10 + !BYTE 0,1 ; Scanline repeat count + !BYTE 11,128+42,11 + !BYTE 0,1 ; Scanline repeat count + !BYTE 12,128+40,12 + !BYTE 0,1 ; Scanline repeat count + !BYTE 14,128+36,14 + !BYTE 0,1 ; Scanline repeat count + !BYTE 15,128+34,15 + !BYTE 0,1 ; Scanline repeat count + !BYTE 17,128+30,17 + !BYTE 0,1 ; Scanline repeat count + !BYTE 19,128+26,19 + !BYTE 0,1 ; Scanline repeat count + !BYTE 22,128+20,22 + !BYTE 0,1 ; Scanline repeat count + !BYTE 26,128+13,25 + !BYTE 0,0 ; End of compressed map diff --git a/sincos.asm b/sincos.asm new file mode 100755 index 0000000..752796a --- /dev/null +++ b/sincos.asm @@ -0,0 +1,162 @@ +SIN_TBL + !BYTE $000 ; angle 0 + !BYTE $006 ; angle 1 + !BYTE $00C ; angle 2 + !BYTE $012 ; angle 3 + !BYTE $018 ; angle 4 + !BYTE $01E ; angle 5 + !BYTE $024 ; angle 6 + !BYTE $02A ; angle 7 + !BYTE $030 ; angle 8 + !BYTE $036 ; angle 9 + !BYTE $03B ; angle 10 + !BYTE $041 ; angle 11 + !BYTE $046 ; angle 12 + !BYTE $04B ; angle 13 + !BYTE $050 ; angle 14 + !BYTE $055 ; angle 15 + !BYTE $059 ; angle 16 + !BYTE $05E ; angle 17 + !BYTE $062 ; angle 18 + !BYTE $066 ; angle 19 + !BYTE $069 ; angle 20 + !BYTE $06C ; angle 21 + !BYTE $070 ; angle 22 + !BYTE $072 ; angle 23 + !BYTE $075 ; angle 24 + !BYTE $077 ; angle 25 + !BYTE $079 ; angle 26 + !BYTE $07B ; angle 27 + !BYTE $07C ; angle 28 + !BYTE $07D ; angle 29 + !BYTE $07E ; angle 30 + !BYTE $07E ; angle 31 +COS_TBL + !BYTE $07F ; angle 32 + !BYTE $07E ; angle 33 + !BYTE $07E ; angle 34 + !BYTE $07D ; angle 35 + !BYTE $07C ; angle 36 + !BYTE $07B ; angle 37 + !BYTE $079 ; angle 38 + !BYTE $077 ; angle 39 + !BYTE $075 ; angle 40 + !BYTE $072 ; angle 41 + !BYTE $070 ; angle 42 + !BYTE $06C ; angle 43 + !BYTE $069 ; angle 44 + !BYTE $066 ; angle 45 + !BYTE $062 ; angle 46 + !BYTE $05E ; angle 47 + !BYTE $059 ; angle 48 + !BYTE $055 ; angle 49 + !BYTE $050 ; angle 50 + !BYTE $04B ; angle 51 + !BYTE $046 ; angle 52 + !BYTE $041 ; angle 53 + !BYTE $03B ; angle 54 + !BYTE $036 ; angle 55 + !BYTE $030 ; angle 56 + !BYTE $02A ; angle 57 + !BYTE $024 ; angle 58 + !BYTE $01E ; angle 59 + !BYTE $018 ; angle 60 + !BYTE $012 ; angle 61 + !BYTE $00C ; angle 62 + !BYTE $006 ; angle 63 + !BYTE $000 ; angle 64 + !BYTE $0F9 ; angle 65 + !BYTE $0F3 ; angle 66 + !BYTE $0ED ; angle 67 + !BYTE $0E7 ; angle 68 + !BYTE $0E1 ; angle 69 + !BYTE $0DB ; angle 70 + !BYTE $0D5 ; angle 71 + !BYTE $0CF ; angle 72 + !BYTE $0C9 ; angle 73 + !BYTE $0C4 ; angle 74 + !BYTE $0BE ; angle 75 + !BYTE $0B9 ; angle 76 + !BYTE $0B4 ; angle 77 + !BYTE $0AF ; angle 78 + !BYTE $0AA ; angle 79 + !BYTE $0A6 ; angle 80 + !BYTE $0A1 ; angle 81 + !BYTE $09D ; angle 82 + !BYTE $099 ; angle 83 + !BYTE $096 ; angle 84 + !BYTE $093 ; angle 85 + !BYTE $08F ; angle 86 + !BYTE $08D ; angle 87 + !BYTE $08A ; angle 88 + !BYTE $088 ; angle 89 + !BYTE $086 ; angle 90 + !BYTE $084 ; angle 91 + !BYTE $083 ; angle 92 + !BYTE $082 ; angle 93 + !BYTE $081 ; angle 94 + !BYTE $081 ; angle 95 + !BYTE $081 ; angle 96 + !BYTE $081 ; angle 97 + !BYTE $081 ; angle 98 + !BYTE $082 ; angle 99 + !BYTE $083 ; angle 100 + !BYTE $084 ; angle 101 + !BYTE $086 ; angle 102 + !BYTE $088 ; angle 103 + !BYTE $08A ; angle 104 + !BYTE $08D ; angle 105 + !BYTE $08F ; angle 106 + !BYTE $093 ; angle 107 + !BYTE $096 ; angle 108 + !BYTE $099 ; angle 109 + !BYTE $09D ; angle 110 + !BYTE $0A1 ; angle 111 + !BYTE $0A6 ; angle 112 + !BYTE $0AA ; angle 113 + !BYTE $0AF ; angle 114 + !BYTE $0B4 ; angle 115 + !BYTE $0B9 ; angle 116 + !BYTE $0BE ; angle 117 + !BYTE $0C4 ; angle 118 + !BYTE $0C9 ; angle 119 + !BYTE $0CF ; angle 120 + !BYTE $0D5 ; angle 121 + !BYTE $0DB ; angle 122 + !BYTE $0E1 ; angle 123 + !BYTE $0E7 ; angle 124 + !BYTE $0ED ; angle 125 + !BYTE $0F3 ; angle 126 + !BYTE $0F9 ; angle 127 + !BYTE $000 ; angle 128 + !BYTE $006 ; angle 129 + !BYTE $00C ; angle 130 + !BYTE $012 ; angle 131 + !BYTE $018 ; angle 132 + !BYTE $01E ; angle 133 + !BYTE $024 ; angle 134 + !BYTE $02A ; angle 135 + !BYTE $030 ; angle 136 + !BYTE $036 ; angle 137 + !BYTE $03B ; angle 138 + !BYTE $041 ; angle 139 + !BYTE $046 ; angle 140 + !BYTE $04B ; angle 141 + !BYTE $050 ; angle 142 + !BYTE $055 ; angle 143 + !BYTE $059 ; angle 144 + !BYTE $05E ; angle 145 + !BYTE $062 ; angle 146 + !BYTE $066 ; angle 147 + !BYTE $069 ; angle 148 + !BYTE $06C ; angle 149 + !BYTE $070 ; angle 150 + !BYTE $072 ; angle 151 + !BYTE $075 ; angle 152 + !BYTE $077 ; angle 153 + !BYTE $079 ; angle 154 + !BYTE $07B ; angle 155 + !BYTE $07C ; angle 156 + !BYTE $07D ; angle 157 + !BYTE $07E ; angle 158 + !BYTE $07E ; angle 159 diff --git a/tan.asm b/tan.asm new file mode 100755 index 0000000..ef2f37b --- /dev/null +++ b/tan.asm @@ -0,0 +1,33 @@ +TAN_TBL + !WORD $0000 ; angle 0 + !WORD $000D ; angle 1 + !WORD $0019 ; angle 2 + !WORD $0026 ; angle 3 + !WORD $0033 ; angle 4 + !WORD $0040 ; angle 5 + !WORD $004E ; angle 6 + !WORD $005C ; angle 7 + !WORD $006A ; angle 8 + !WORD $0079 ; angle 9 + !WORD $0089 ; angle 10 + !WORD $0099 ; angle 11 + !WORD $00AB ; angle 12 + !WORD $00BE ; angle 13 + !WORD $00D2 ; angle 14 + !WORD $00E8 ; angle 15 + !WORD $0100 ; angle 16 + !WORD $011A ; angle 17 + !WORD $0138 ; angle 18 + !WORD $0159 ; angle 19 + !WORD $017F ; angle 20 + !WORD $01AB ; angle 21 + !WORD $01DF ; angle 22 + !WORD $021D ; angle 23 + !WORD $026A ; angle 24 + !WORD $02CB ; angle 25 + !WORD $034C ; angle 26 + !WORD $03FE ; angle 27 + !WORD $0507 ; angle 28 + !WORD $06BE ; angle 29 + !WORD $0A27 ; angle 30 + !WORD $145B ; angle 31 diff --git a/utils.asm b/utils.asm new file mode 100755 index 0000000..96c90ad --- /dev/null +++ b/utils.asm @@ -0,0 +1,342 @@ +;* +;* Read both game controllers in parallel +;* +GCREAD BIT GCSTROBE + LDY #$00 + LDX #$00 + LDA #GCMAX +GCLOOP BIT GC0 + BPL + + INY + BNE ++ ; Timing ++ NOP + NOP +++ BIT GC1 + BPL + + INX + BNE ++ ; Timing ++ NOP + NOP +++ SEC + SBC #$01 + BNE GCLOOP + LDA GCPB1 ; Read GC buttons + ASL + LDA GCPB2 + ROR + AND #$C0 + RTS +;* +;* Text routines +;* +GOTOXY STX CH + STY CV + LDA TXT_TBLL,Y + STA TBAS1L + STA TBAS2L + LDA TXT_TBLH,Y + ORA #$04 + STA TBAS1H + EOR #$0C + STA TBAS2H + RTS +NORMAL LDA #$FF + STA INVFLAG + RTS +INVERSE LDA #$3F + STA INVFLAG + RTS +FLASH LDA #$7F + STA INVFLAG + RTS +PUTXA PHA + TXA + JSR PUTA + PLA +PUTA PHA + LSR + LSR + LSR + LSR + TAX + LDA HEXCHR,X + JSR PUTC + PLA + AND #$0F + TAX + LDA HEXCHR,X +PUTC ORA #$80 + AND INVFLAG + LDY CH + STA (TBAS1),Y + STA (TBAS2),Y + INC CH + RTS +PUTSXY JSR GOTOXY +PUTS TSX + LDA $101,X + STA LDCHR+1 + LDA $102,X + STA LDCHR+2 + LDX #$01 +LDCHR LDA $1000,X + BEQ + + JSR PUTC + INX + BNE LDCHR ++ TXA + TSX + CLC + ADC $101,X + STA $101,X + BCC + + INC $102,X ++ RTS +HEXCHR !TEXT "0123456789ABCDEF" +;* +;* Fill screen with color +;* +GFILL LDX #$23 +-- PHA + LDA TXT_TBLL,X + STA GBASL + LDA TXT_TBLH,X + ORA GPAGE + STA GBASH + PLA + LDY #39 +- STA (GBASE),Y + DEY + BPL - + DEX + BPL -- + RTS +;* +;* Plot X,Y with GCLR +;* +GPLOT TYA + PHA + LSR + TAY + LDA TXT_TBLL,Y + STA GPLOTA+1 + STA GPLOTB+1 + LDA TXT_TBLH,Y + ORA GPAGE + STA GPLOTA+2 + STA GPLOTB+2 +GPLOTA LDA $FFFF,X + BCC + + AND #$0F + STA TMP + LDA GCLR + AND #$F0 + BCS ++ ++ AND #$F0 + STA TMP + LDA GCLR + AND #$0F +++ ORA TMP +GPLOTB STA $FFFF,X +-- PLA + TAY + RTS +;* +;* Plot horizontal line from X,Y to A,Y with GCLR +;* +GHLIN STA GHLRHT + TYA + PHA + LSR + TAY + LDA #$F0 + BCC + + LDA #$0F ++ STA DSTMASK + EOR #$FF + STA SRCMASK + LDA TXT_TBLL,Y + STA GHLINA+1 + STA GHLINB+1 + LDA TXT_TBLH,Y + ORA GPAGE + STA GHLINA+2 + STA GHLINB+2 +GHLINA LDA $FFFF,X + AND DSTMASK + STA TMP + LDA GCLR + AND SRCMASK + ORA TMP +GHLINB STA $FFFF,X + CPX GHLRHT + BEQ -- + INX + BNE GHLINA +GHLRHT !BYTE $00 +;* +;* Fill rectangle fro X,Y to A,SCANLN with GCLR +;* +GRECT STX GRCTLFT +- PHA + JSR GHLIN + PLA + CPY SCANLN + BEQ + + LDX GRCTLFT + INY + BNE - ++ RTS +GRCTLFT !BYTE $00 +;* +;* Swap rendered and displayed GR pages +;* +GSWAP LDA #$01 + EOR CURPAGE + STA CURPAGE + TAX + LDA $C054,X + LDA PGBASE,X + STA GPAGE + RTS +;* +;* Multiply X by A, return X:A +;* +MUL8X8 LSR + STA TMP + LDA #$00 + BCC + ; BIT 0 + TXA ++ DEX ; Because carry will be set for ADC + STX TMP+1 + LSR + ROR TMP + BCC + ; BIT 1 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 2 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 3 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 4 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 5 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 6 + ADC TMP+1 ++ LSR + ROR TMP + BCC + ; BIT 7 + ADC TMP+1 ++ LSR + TAX + LDA TMP + ROR + RTS +;* +;* Signed multiply 8x8 +;* +SMUL8X8 STX SIGN + PHA + EOR SIGN + STA SIGN + CPX #$80 + BCC + + TXA + EOR #$FF + TAX + INX ++ PLA + CMP #$80 + BCC + + EOR #$FF + ADC #$00 ++ JSR MUL8X8 + ASL SIGN ; SIGN(RESULT) = SIGN(MULTIPLCAND) ^ SIGN(MULTIPLIER) + BCC + + EOR #$FF + ADC #$00 + PHA + TXA + EOR #$FF + ADC #$00 + TAX + PLA ++ RTS +;* +;* Unsigned divide, return X:A +;* +DIV LDX #$00 + STX TMP ; REMNDRL + STX TMP+1 ; REMNDRH +; LDA DVSR+1 ; Check for divide by zero +; ORA DVSR + LDA DVDND+1 ; Check for zero divide + ORA DVDND + BEQ ++ + LDY #$11 ; #BITS+1 +- ASL DVDND + ROL DVDND+1 + DEY + BCC - +- ROL TMP ; REMNDRL + ROL TMP+1 ; REMNDRH + LDA TMP ; REMNDRL + CMP DVSR + LDA TMP+1 ; REMNDRH + SBC DVSR+1 + BCC + + STA TMP+1 ; REMNDRH + LDA TMP ; REMNDRL + SBC DVSR + STA TMP ; REMNDRL + SEC ++ ROL DVDND + ROL DVDND+1 + DEY + BNE - + LDA DVDND + LDX DVDND+1 +++ RTS +;* +;* Signed divide: return X:A +;* +SDIV LDX DVSR+1 + STX SIGN + BPL + + LDA DVSR + JSR NEG + STX DVSR+1 + STA DVSR ++ LDX DVDND+1 + BPL + + TXA + EOR SIGN + STA SIGN + LDA DVDND + JSR NEG + STX DVDND+1 + STA DVDND ++ JSR DIV + ASL SIGN ; SIGN(RESULT) = SIGN(DIVIDEND) ^ SIGN(DIVISOR) + BCC + +NEG STA TMP + STX TMP+1 + LDA #$00 + SEC + SBC TMP + STA TMP + LDA #$00 + SBC TMP+1 + TAX + LDA TMP ++ RTS