.include "ti82.h" .include "keys.inc" ; -------------------------------------> Variables score =TEXT_MEM edgedata =TEXT_MEM+2 v =TEXT_MEM+57 destroy =TEXT_MEM+58 x =TEXT_MEM+60 marker =TEXT_MEM+61 ; -------------------------------------> Game startup .org START_ADDR .db "Z-Kart 3D v1.2",0 LD A,$8C OUT (2),A ld (iy+13),0 ld hl,GRAPH_MEM ld (hl),0 ld de,GRAPH_MEM+1 ld bc,767 ldir xor a ld (x),a inc a ld (marker),a ;--------------- TITLE SCREEN ---------------------------------------------- ROM_CALL(CLEARLCD) ld hl,0 ld (CURSOR_ROW),hl ld hl,title_message ROM_CALL(D_ZT_STR) ld hl,$0004 ld (CURSOR_ROW),hl ld hl,speed_txt ROM_CALL(D_ZT_STR) ld hl,$0006 ld (CURSOR_ROW),hl ld hl,hitxt ROM_CALL(D_ZT_STR) loopttl: call GET_KEY cp G_1 jr z,speed1 cp G_2 jr z,speed2 cp G_3 jr z,speed3 cp G_4 jr z,speed4 cp G_5 jr z,speed5 cp G_CLEAR jr nz,loopttl ret speed1: ld a,4 jr start speed2: ld a,3 jr start speed3: ld a,2 jr start speed4: ld a,1 jr start speed5: xor a start: ld (loop+1),a cpl add a,7 add a,a add a,a add a,a ld b,a add a,a add a,a add a,b ld (score),a ; -------------- ACTUAL GAME ----------------------------------------------- ROM_CALL(CLEARLCD) ld hl,edgedata ld b,54 lced: ld (hl),45 inc hl djnz lced ; -------------- MAIN LOOP ------------------------------------------------- loop: ld a,0 or a jr z,no_wait ld b,a wait: halt djnz wait ; -------------- RENDER THE TRACK ------------------------------------------ no_wait: call GET_KEY cp G_ENTER call Z,PAUSE cp G_CLEAR jp z,lose ld a,(marker) dec a jr nz,n0 ld a,9 n0: ld (marker),a ld hl,GRAPH_MEM ld (destroy),hl LD HL,edgedata ld b,9 ld c,-1 render_far_away: call linedrw inc hl djnz render_far_away ld b,9 render_middle_distance: call linedrw dec hl call linedrw inc hl djnz render_middle_distance ld b,9 render_near: call linedrw dec hl call linedrw dec hl call linedrw inc hl djnz render_near ld b,63 ; -------------- MOVE UP THE LANDSCAPE ------------------------------------- ld a,r cp 8 jr NC,nocc ld hl,dirs and 7 ld e,a ld d,0 ADD hl,de ld a,(hl) ld (v),a nocc: ld de,edgedata+53 ld hl,edgedata+51 ld bc,52 lddr inc hl inc de ld a,(v) ld d,a ld a,(hl) cp 62 jr nz,nle ld d,1 nle: inc hl ld a,(hl) cp 62 jr nz,nre ld d,-1 nre: ld a,d ld (v),a ld a,(hl) add a,d ld (hl),a dec hl ld a,(hl) sub d ld (hl),a LD A,(score) and 15 jr nz,ntts dec (hl) inc hl dec (hl) ntts: ; -------------- MOVE YOUR CAR --------------------------------------------- ld a,%01111110 out (1),a ld hl,x in a,(1) rra rra jr c,noleft dec (hl) dec (hl) noleft: rra jr c,noright inc (hl) inc (hl) noright: ld a,(hl) ld c,53 call pton_t ld a,(hl) dec a call pton_t ld a,(hl) inc a call pton_t ld a,(hl) inc a inc a call pton_t ld a,(hl) dec a dec a call pton_t dec c ld a,(hl) call pton_t ld a,(hl) dec a call pton_t ld a,(hl) inc a call pton_t ld a,(hl) dec c call pton_t ld a,%00111111 out (1),a ROM_CALL(DISP_GRAPH) ld hl,$0007 ld (CURSOR_ROW),hl ld hl,message ROM_CALL(D_ZT_STR) LD HL,$0607 ld (CURSOR_ROW),hl ld hl,(score) inc hl ld (score),hl ROM_CALL(D_HL_DECI) jp loop pton_t: push hl push bc add a,63 ld b,a ld a,63 sub c ld c,a call FIND_PIXEL ld de,GRAPH_MEM add hl,de ;Point into the graphics memory ld b,(hl) ld c,a or b ;A now contains the modified screen byte ld (HL),A ;Write back to screen to update ld a,c and b pop bc pop hl jr nz,you_lose ret you_lose: inc sp inc sp ; -------------- GAME OVER ------------------------------------------------- lose: ld hl,0 ld (CURSOR_ROW),hl ld hl,lose_ ROM_CALL(D_ZT_STR) ld hl,(best) ld de,(score) CALL CP_HL_DE jr c,hisc PAUSE: call GET_KEY cp G_ENTER jr nz,PAUSE ret hisc: ld de,(score) ld (best),de ld de,digits+3 ld hl,(score) ld b,4 p_l: CALL UNPACK_HL add a,'0' ld (de),a dec de djnz p_l ld hl,0 ld (CURSOR_ROW),hl ld hl,hi_msg ROM_CALL(D_ZT_STR) ld hl,$600 ld (CURSOR_ROW),hl ld hl, name push hl ld b,9 space_loop: ld (hl), ' ' inc hl djnz space_loop pop ix enter_name_loop: CALL GET_KEY or A jr z,enter_name_loop cp G_DEL jr z,backup SUB 9 ret z dec a jp m,enter_name_loop ld hl,chartable ld e,a ld d,0 add hl,de ld a,9 cp b jr z,enter_name_loop ld a,(hl) or a jr z,enter_name_loop ld (ix),a ROM_CALL(TX_CHARPUT) inc b inc ix jr enter_name_loop backup: xor a cp b jr z,enter_name_loop dec b dec ix ld a,' ' ld (ix),a ld hl,CURSOR_COL dec (hl) ROM_CALL(TX_CHARPUT) dec (hl) jr enter_name_loop ; -------------- DATA / SUBROUTINES ---------------------------------------- linedrw: inc c push hl ;save coordinate pointer push bc ld bc,11 ld HL,(destroy) ld (hl),0 ld de,(destroy) inc de ldir ld (destroy),de pop bc pop hl ld a,(marker) cp b jr nz,nad ld a,50 cp c jr c,nad inc hl ld a,(hl) dec hl sub (hl) sra a call DoConvSide dec a call pton nad: ld a,(hl) inc hl call DoConvSide cpl ;Flip to left side add a,48 push hl ld hl,(destroy) ld de,-12 add hl,de ld e,8 lfil: sub e jp m,done ld (hl),255 inc hl jr lfil done: and 7 ld d,0 ld e,a push hl ld hl,offsets_left add hl,de ld a,(hl) pop hl or (hl) ld (hl),a pop hl LD A,(HL) ;read right edge coordinate call DoConvSide cpl add a,49 push hl ld hl,(destroy) ld e,8 lfir: dec hl sub e jp m,done2 ld (hl),255 jr lfir done2: and 7 ld d,0 ld e,a push hl ld hl,offsets_right add hl,de ld a,(hl) pop hl or (hl) ld (hl),a pop hl ret DoConvSide: push hl ld hl,clab1 bit 7,a jr nz,dcs_neg ld (hl),$c9 dcs_c: ld d,0 ;HL=A*20 ld e,a add a,a add a,a ld h,0 ld l,a add hl,de add hl,hl add HL,HL ld a,92 sub c call UNPACK_HL+2 ld a,l pop hl clab1: neg ret dcs_neg: neg ld (hl),$ed jr dcs_c ; -------------------------------------> Text messages hi_msg: .db "Name: _________ ",0 lose_: .db "YOU LOSE ",0 message: .db "Score: 0!",0 title_message: .db "Z-Kart 3D v1.2" .db " Programmed by " .db "Patrick Davidson",0 speed_txt: .db "Select Speed 1-5",0 hitxt: .db " High score: " digits: .db "0456 / PATRICK D",0 name =digits+7 ; -------------------------------------> Pixel subroutines pton: push bc add a,47 ld b,a ld a,63 sub c ld c,a push hl call FIND_PIXEL ld de,GRAPH_MEM add hl,de ;Point into the graphics memory or (HL) ;A now contains the modified screen byte ld (HL),A ;Write back to screen to update pop hl pop bc ret ; -------------------------------------> Data tables dirs: .db -1,1,-1,1,-1,1,0,0 chartable: .db ":WRMH." .DB "..0VQLG!..ZUPKFC" .DB "..YTOJEBX.>SNIDA" .DB ".12345.." best: .dw 456 offsets_left: .db %00000000 .db %10000000 .db %11000000 .db %11100000 .db %11110000 .DB %11111000 .DB %11111100 .DB %11111110 offsets_right: .db %00000000 .db %00000001 .db %00000011 .db %00000111 .db %00001111 .db %00011111 .db %00111111 .db %01111111 end: .end