;Marin-The-Movie ;By Stefan Lennartsson ;stefan@infinity.hemmet.s-hem.chalmers.se .NOLIST #define equ .equ #define EQU .equ #define end .end #include "ti83asm.inc" #include "tokens.inc" .LIST #DEFINE BOXX 8265h #DEFINE BOXY 8266h #DEFINE SOLX 8267h #DEFINE SOLY 8268h #DEFINE TRUY 8269h #DEFINE TRFX 8270h #DEFINE TRBX 8271h #DEFINE QUIT 8272h .org 9327h nop jr start .dw $0000 .dw desc .dw copter .dw $0000 start: ld a,0 ld (quit),a beginning: call _clrLCDFull call _runindicoff ld hl,pic ld de,PLOTSSCREEN ld bc,768 ldir call _GRBUFCPY_V ld a,56 ld (penrow),a ld a,50 ld (pencol),a ld hl,press call _vputs ld ix,titlesong call playproc restart: call _clrLCDFull call _grbufclr call _homeup ld a,40 ld (SOLX),a ld a,9 ld (SOLY),a ld a,40 ld (BOXX),a ld a,1 ld (BOXY),a ld (TRBX),a ld a,55 ld (TRUY),a ld a,9 ld (TRFX),a jp moveloop moveloop: ld a,(BOXX) cp 0 jr z,x1 cp 87 jr z,x86 ld a,(BOXY) cp 0 jr z,y1 cp 46 jr z,y46 jr mainstart x1: ld a,1 ld (BOXX),a ld (SOLX),a jr mainstart x86: ld a,86 ld (BOXX),a ld (SOLX),a jr mainstart y1: ld a,1 ld (BOXY),a ld a,9 ld (SOLY),a jr mainstart y46: ld a,45 ld (BOXY),a ld a,53 ld (SOLY),a jr mainstart mainstart: call putbox mainloop: call truck ld a,(TRBX) cp 96 jp z,fixtruck inc a ld (TRBX),a ld a,(TRFX) inc a ld (TRFX),a call truck call _grbufcpy_v ld a,0ffh out (1),a ld a,0feh out (1),a in a,(1) cp 253 jr z,left cp 251 jr z,right cp 254 jr z,down cp 247 jr z,up ld a,0ffh out (1),a ld a,0bfh out (1),a in a,(1) cp 223 jp z,droploop cp 191 call z,pause ld a,(quit) cp 1 jp z,quit jr mainloop left: call putbox ld a,(BOXX) dec a ld (BOXX),a ld (SOLX),a jp moveloop right: call putbox ld a,(BOXX) inc a ld (BOXX),a ld (SOLX),a jp moveloop up: call putbox ld a,(BOXY) dec a ld (BOXY),a ld a,(SOLY) dec a ld (SOLY),a jp moveloop down: call putbox ld a,(BOXY) inc a ld (BOXY),a ld a,(SOLY) inc a ld (SOLY),a jp moveloop putbox: ld a,(BOXY) ld e,a ld a,(BOXX) ld bc,copter call SPRXOR ld a,(SOLY) ld e,a ld a,(SOLX) ld bc,soldier call SPRXOR call truck ret truck: ld a,(TRUY) ld e,a ld a,(TRBX) ld bc,truckback call SPRXOR ld a,(TRUY) ld e,a ld a,(TRFX) ld bc,truckfront call SPRXOR ret soldier2: ld a,(SOLY) ld e,a ld a,(SOLX) ld bc,soldier call SPRXOR ret fixtruck: ld a,9 ld (TRFX),a ld a,1 ld (TRBX),a call truck jp mainloop droploop: ld a,(SOLY) cp 54 jp z,landfix cp 53 jp z,land call soldier2 call truck ld a,(SOLY) inc a inc a ld (SOLY),a ld a,(TRBX) inc a ld (TRBX),a ld a,(TRFX) inc a ld (TRFX),a call soldier2 call truck call _grbufcpy_v jp droploop landfix: call soldier2 ld a,53 ld (SOLY),a call soldier2 call _grbufcpy_v land: ld a,(SOLX) ld b,a ld a,(TRBX) cp b jp z,on inc a cp b jp z,on inc a cp b jp z,on inc a cp b jp z,on jp gameover on: ld a,1 ld (pencol),a ld a,10 ld (penrow),a ld hl,madeit call _vputs ld ix,dur call playproc jp restart gameover: ld a,1 ld (pencol),a ld a,10 ld (penrow),a ld hl,over call _vputs ld ix,minor call playproc jp beginning pause: call _clrLCDFull ld a,0 ld (currow),a ld (curcol),a ld hl,pausemess call _puts wait: ld a,0ffh out (1),a ld a,0bfh out (1),a in a,(1) cp 127 jp z,out ld a,0ffh out (1),a ld a,0fdh out (1),a in a,(1) cp 191 ret z jp wait out: ld a,1 ld (quit),a call _clrlcdfull ret enter: call _getkey cp 05h jp nz,enter ret quit: call _clrLCDFull call _grbufclr ld a,1 ld (penrow),a ld (pencol),a ld hl,made call _vputs ld a,1 ld (pencol),a ld a,8 ld (penrow),a ld hl,name call _vputs ld a,1 ld (pencol),a ld a,22 ld (penrow),a ld hl,have call _vputs ld a,56 ld (penrow),a ld a,50 ld (pencol),a ld hl,penter call _vputs call enter call _clrLCDFull call _dispdone ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³ Sprite83 ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ ; Sprite xor routine v1.0 ; Coded by Hannes Edfeldt in 1997 ; This routine uses xor to draw the sprite, therefore you can erase the sprite ; by just drawing it again at the same x and y coordinates. See xordemo.z80 ; for an example of how to use this routine. ; Feel free to use this routine in your own productions as long as you give me ; some credit. ; This file should of course be viewed in a DOS texteditor ;) ; Hannes Edfeldt -+- movax@algonet.se -+- http://www.algonet.se/~movax ;ÜÛÛÛÛÛÛÛÛÛÛÛÛß SPRXOR ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Xor 8x8 sprite þ a=x, e=y, bc=sprite address ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SPRXOR: push bc ; Save sprite address ;ÛÛÛÛ Calculate the address in graphbuf ÛÛÛÛ ld hl,0 ; Do y*12 ld d,0 add hl,de add hl,de add hl,de add hl,hl add hl,hl ld d,0 ; Do x/8 ld e,a srl e srl e srl e add hl,de ld de,8e29h add hl,de ; Add address to graphbuf ld b,00000111b ; Get the remainder of x/8 and b cp 0 ; Is this sprite aligned to 8*n,y? jp z,ALIGN ;ÛÛÛÛ Non aligned sprite blit starts here ÛÛÛÛ pop ix ; ix->sprite ld d,a ; d=how many bits to shift each line ld e,8 ; Line loop LILOP: ld b,(ix+0) ; Get sprite data ld c,0 ; Shift loop push de SHLOP: srl b rr c dec d jp nz,SHLOP pop de ld a,b ; Write line to graphbuf xor (hl) ld (hl),a inc hl ld a,c xor (hl) ld (hl),a ld bc,11 ; Calculate next line address add hl,bc inc ix ; Inc spritepointer dec e jp nz,LILOP ; Next line jp DONE1 ;ÛÛÛÛ Aligned sprite blit starts here ÛÛÛÛ ALIGN: ; Blit an aligned sprite to graphbuf pop de ; de->sprite ld b,8 ALOP1: ld a,(de) xor (hl) ld (hl),a inc de push bc ld bc,12 add hl,bc pop bc djnz ALOP1 DONE1: ret ;ÜÛÛÛÛÛÛÛÛÛÛÛÛÜ SPRXOR ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³ Sprite83 ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ playproc: ;----------------------------------------------------------------------------- ; Song Proc V1.0 29/11/97 ; by DHORDAIN Florent ;----------------------------------------------------------------------------- ;Plays a Song over a connected earphone... on a TI-83 ! ;----------------------------------------------------------------------------- ; ( 3*10^6 103 ) ; Frequency : HL = Round ( -------- - ----- ) ; ( 26*F 26 ) ; ; 3*10^6 ; Real Freq = ----------- ; 26*HL+103 ; ; Duree : DE = Duree * 2 * Freelle ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PlayTheSong ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This plays the song pointed by IX ; Until the end of the song, or Clear is pressed ; PlayTheSong: ; Initialise le port, etc, etc DI LD B, 0D0h LD A, B OUT (0), A ; Initialise la clavier LD A, 0FFh OUT (1), A LD A, 0FDh OUT (1), A SongLoop: IN A, (1) AND 64 JR Z, ExitPlay LD L, (IX+0) INC IX LD H, (IX+0) ; Charge la periode INC IX LD E, (IX+0) INC IX LD D, (IX+0) ; Et la duree INC IX ; DE = 0 <==> fin de la liste ? LD A, D OR E ret z CALL PlaySound ; Fait du bruit JR SongLoop ExitPlay: ; Initialise le port, etc, etc LD A, 0D0h OUT (0), A EI ret ; Voila ! c'est fini. ;;;;;;;; ; Fait du bruit ; 26 * HL cycles dans DLoop ; 103 cycles dans le le reste de SoundLoop ; Cycles dans: ;Dloop ;Le reste... PlaySound: SoundLoop: PUSH HL ; 11 DLoop: DEC HL ; 6 LD A, H ; 4 OR L ; 4 JR NZ, DLoop ; 12 ; 7 POP HL ; 10 Play: IN A, (1) ; 11 AND 64 ; 7 RET Z ; 5 LD A, B ; 4 XOR 00000011b ; 7 LD B, A ; 4 OUT (0), A ; 11 DEC DE ; 6 LD A, D ; 4 OR E ; 4 JR NZ, SoundLoop ; 12 DonePlay: ret ; Total des cycles: ; 26 ; 103 soldier: .db 01000001b .db 01011101b .db 00101010b .db 00011100b .db 00100010b .db 00100010b .db 01100011b .db 00000000b copter: .db 01111111b .db 00001000b .db 00111111b .db 01000001b .db 01000001b .db 00111111b .db 10010010b .db 01111111b truckback: .db 00000000b .db 00000000b .db 00000000b .db 00000000b .db 10000000b .db 11111111b .db 00111000b .db 00010000b pic: .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126 .db 1,248,63,193,255,193,252,124,126,0,0,193,2,8,64,35,0,35,4,194,194,0,1,192,132,8,128,23,0,23,5 .db 193,194,0,1,192,72,9,128,23,0,23,5,192,194,0,1,192,48,11,134,23,12,23,5,192,66,0,1,192,0,11 .db 134,23,12,23,5,192,2,0,1,192,0,11,128,23,0,23,5,192,2,0,1,192,0,11,128,23,0,39,5,192,2 .db 0,1,192,0,11,134,23,0,71,5,192,2,0,1,195,2,11,134,23,12,39,5,192,2,0,1,195,134,11,134,23 .db 12,23,5,194,2,0,1,195,206,11,134,23,12,23,5,195,2,0,1,195,254,11,134,23,12,23,5,195,130,0,1 .db 195,238,11,134,23,12,23,5,195,194,0,1,253,207,251,255,231,255,247,249,255,254,0,1,248,143,243,255,199,255,231 .db 241,252,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,192,0,0,198,0,0,16,0 .db 0,0,0,146,64,0,0,68,0,0,0,0,0,0,0,16,64,0,0,108,0,0,0,0,0,0,0,16,88,124,0 .db 108,124,238,112,124,0,0,0,16,100,130,0,84,130,68,16,130,0,0,0,16,68,254,254,84,130,68,16,254,0,0 .db 0,16,68,128,0,68,130,40,16,128,0,0,0,16,68,130,0,68,130,40,16,130,0,0,0,56,238,124,0,238,124 .db 16,124,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,0,0,0,0,0,0,0,0,0 .db 0,0,16,16,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0 .db 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 .db 255,0,0,0,0,0,0,0,0,0,0,2,68,0,0,0,0,0,0,0,0,0,0,1,255,0,0,0,0,0,0 .db 0,0,0,0,0,130,0,0,0,0,0,0,0,0,0,0,0,186,0,0,0,0,0,0,0,0,0,0,0,84,0 .db 0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0 .db 0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,130,0,0,0 .db 0,0,0,0,0,0,0,0,130,0,0,0,0,0,0,0,0,0,0,1,131,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 truckfront: .db 00011000b .db 00010100b .db 00010010b .db 00010001b .db 00010001b .db 11111111b .db 00001110b .db 00000100b titlesong: .word 389, 120 .word 258, 140 .word 290, 180 .word 389, 90 .word 326, 130 .word 389, 90 .word 290, 130 .word 389, 90 .word 258, 130 .word 389, 240 .word 1, 15000 .word 389, 120 .word 258, 140 .word 290, 180 .word 389, 90 .word 326, 130 .word 389, 90 .word 290, 130 .word 389, 90 .word 258, 130 .word 389, 240 .word 1, 15000 .word 194, 240 .word 129, 280 .word 145, 360 .word 194, 180 .word 163, 260 .word 194, 180 .word 145, 260 .word 194, 180 .word 129, 260 .word 194, 480 .word 1, 15000 .word 194, 240 .word 129, 280 .word 145, 360 .word 194, 180 .word 163, 260 .word 194, 180 .word 145, 260 .word 194, 180 .word 129, 260 .word 194, 480 .word 1, 15000 .word 389, 120 .word 258, 140 .word 290, 180 .word 389, 90 .word 326, 130 .word 389, 90 .word 290, 130 .word 389, 90 .word 258, 130 .word 389, 240 .word 1, 15000 .word 389, 120 .word 258, 140 .word 290, 180 .word 389, 90 .word 326, 130 .word 389, 90 .word 290, 130 .word 389, 90 .word 258, 130 .word 389, 240 .word 1, 15000 .word 194, 240 .word 129, 280 .word 145, 360 .word 194, 180 .word 163, 260 .word 194, 180 .word 145, 260 .word 194, 180 .word 129, 260 .word 194, 480 .word 1, 15000 .word 194, 240 .word 129, 280 .word 145, 360 .word 194, 180 .word 163, 260 .word 194, 180 .word 145, 260 .word 194, 180 .word 129, 260 .word 194, 480 .word 1, 15000 .word 1, 0 dur: .word 326, 80 .word 1, 400 .word 326, 100 .word 326, 175 .word 100, 1110 .word 1, 0 minor: .word 181, 180 .word 412, 170 .word 1, 23256 .word 1, 23256 .word 1, 0 desc: .db "Marin the Movie v1.0 by SL",0 made: .db "This game was made by",0 madeit: .db "You made it!",0 have: .db "Have a nice day :)",0 name: .db "Stefan Lennartsson",0 over: .db "Game Over!",0 pausemess: .db "Pause",0 penter: .db "Press Enter",0 press: .db "Press Clear",0 .end END