version 0.4: misc code improvements
[nemesis.git] / nemesis.z80
1         .include "asm86.h"
2         .include "ti86asm.inc"
3         .include "ti86abs.inc"
4
5         .org _asm_exec_ram
6
7         nop
8         jp  Start
9         .dw $0001
10         .dw Title
11         .dw spr_ship
12 Title:  .db "Nemesis v0.4.720 by Shiar",0
13 Start:
14         jr init
15
16 just_fired      = $c0f9         ;byte
17 temp1           = $c100         ;word
18
19 ;-------------------- init ----------------------------------------------------
20
21 init:
22         call _runindicoff
23
24 ;-------------------- main menu -----------------------------------------------
25
26         call Next_level
27         jp play_game
28
29 ;-------------------- exit ----------------------------------------------------
30
31 exit_game:
32         ret
33
34 ;----------------------- game setup -------------------------------------------
35
36 play_game:
37
38 ;---------------------- display setup ----------------------------------------
39
40 set_up_display:
41         call _clrLCD
42         ld  (_curCol),16
43         ld  (_curRow),6
44         ld  hl,txt_score
45         call _puts
46
47 ;------------------------------------------------------------------------------
48 ;-------------------------- game loop -----------------------------------------
49 ;------------------------------------------------------------------------------
50
51 game_main_loop:
52         ld  hl,timer            ;update time
53         inc (hl)
54
55 Clear_screen:
56         xor a
57         ld  hl,GRAPH_MEM+(16*12)
58         ld  b,a
59 clearloop:
60         ld  (hl),a
61         inc hl
62         ld  (hl),a
63         inc hl
64         ld  (hl),a
65         inc hl
66         djnz clearloop
67
68 check_exitkey:
69         ld  a,%00111111         ;<exit> pressed?
70         out (1),a
71         nop
72         nop
73         in  a,(1)
74         bit 6,a
75         jr  z,quit              ;yes: quit game
76
77 game_stuff:
78         call Level_event        ;insert enemies
79         call Handle_Ship        ;move you
80         call Fire_bullet        ;check for fire
81         call Handle_bullets     ;move bullets
82         call Handle_enemies     ;move enemies
83         call Enemy_fires        ;check for enemy fire
84         call Enemy_bullets      ;move bullets
85         call Enemies_hit        ;check for collision with enemies
86
87         call Display_Screen     ;display all
88         halt \ halt \ halt      ;delay
89         jr   game_main_loop     ;loop
90
91 quit:   ret
92
93 ;---------------------- display -----------------------------------------------
94
95 Display_Screen:
96         ld  a,64                ;Display Image
97         ld  hl,GRAPH_MEM+(16*12)
98         ld  de,$fc00
99 displayloop:
100         ld  bc,12
101         ldir
102         inc de
103         inc de
104         inc de
105         inc de
106         dec a
107         jr  nz,displayloop
108
109         ld  hl,$1006            ;Display Score
110         ld  (_curRow),hl
111         ld  hl,(timer)
112 ;       jp  _D_HL_DECI
113         ret
114
115 ;------------------------- handle ship ----------------------------------------
116
117 Handle_Ship:
118         ld  a,(your_occ)
119         or  a
120         jr  z,ok                ;0 = normal stat
121
122 ;       dec a
123 ;       ld  (your_status),a
124 ;       ld  hl,(lives)
125 ;       ld  a,l
126 ;       or  h
127 ;       jr  nz,ok
128 ;       pop af
129 ;       ret
130
131 ok:
132         ld  a,%01111110
133         out (1),a
134         ld  hl,y
135         in  a,(1)
136         rra
137         ld  b,a
138
139         jr  c,no_down
140         ld  a,(hl)
141         inc a
142         cp  73                  ;y < 73
143         jr  z,no_down
144         ld  (hl),a
145 no_down:
146         dec hl
147         rr  b
148         jr  c,no_left
149         ld  a,(hl)
150         dec a
151         jr  z,no_left           ;x > 0
152         ld  (hl),a
153 no_left:
154         rr b   
155         jr  c,no_right
156         ld  a,(hl)
157         inc a
158         cp  89                  ;x < 89
159         jr  z,no_right
160         ld  (hl),a
161 no_right:
162         ld d,(hl)
163         inc hl
164         rr  b
165         jr  c,no_up
166         ld  a,(hl)
167         dec a
168         cp  15                  ;y > 15
169         jr  z,no_up
170         ld  (hl),a
171 no_up:  ld  ix,spr_ship01
172
173 display_common:
174         ld  e,(hl)
175         jp  drw_spr
176
177 ;you_not_normal:
178 ;       ld       a,(your_status)
179 ;       dec      a
180 ;       ld       (your_status),a
181 ;       inc      a
182 ;       and      14
183 ;       xor      14
184 ;       ld       hl,x-1
185
186 explosion_stuff:
187         rra
188         add a,a
189         add a,a
190         add a,a
191         ld  c,a
192         ld  b,0
193         ld  ix,spr_explosion
194         add ix,bc
195         inc hl
196         ld  d,(hl)
197         inc hl
198         jr  display_common
199
200 damage_you:
201         ret
202
203 ;------------------------- fire bullet ----------------------------------------
204
205 Fire_bullet:
206         ld  a,%00111111
207         out (1),a
208         ld  a,(your_occ)
209         or  a
210         ret nz                  ;return if not normal stat
211         ld  hl,just_fired
212         in  a,(1)
213         bit 4,a
214         jr  z,fire              ;fire pressed?
215         ld  (hl),0              ;not fired
216         ret
217
218 fire:   ld  a,(hl)
219         or  a                   ;can't fire when 1
220         ret nz
221         ld  (hl),1              ;just fired
222
223         ld  hl,ybullets
224         ld  de,3
225         ld  b,10
226 find_ybullet:
227         ld  a,(hl)
228         or  a
229         jr  z,found_ybullet     ;0 = no bullet here
230         add hl,de
231         djnz find_ybullet       ;look next bullet
232         ret
233
234 found_ybullet:
235         ld  (hl),1              ;use bullet
236         inc hl
237         ld  a,(x)
238         add a,5
239         ld  (hl),a              ;set x
240         ld  a,(y)
241         add a,2
242         inc hl
243         ld  (hl),a              ;set y
244         ret
245
246 ;------------------------ handle bullets --------------------------------------
247
248 remove_bullet:
249         dec hl
250         ld  (hl),0              ;dump this bullet!
251         ret
252
253 Handle_bullets:
254         ld  hl,ybullets
255         ld  b,10
256 scan_bullets:
257         push bc
258         push hl
259         ld  (temp1),hl
260         ld  a,(hl)
261         inc hl
262         dec a
263         call z,bullet_type1
264         pop hl
265         pop bc
266         ld  de,3
267         add hl,de
268         djnz scan_bullets
269         ret
270
271 bullet_type1:
272         ld  a,(hl)              ;d = X
273         inc a                   ;move right
274         cp  $5a                 ;off screen?
275         jr  z,remove_bullet
276         inc a                   ;move right
277         cp  $5a                 ;off screen?
278         jr  z,remove_bullet
279         ld  (hl),a              ;save new pos.
280         ld  d,a
281         inc hl
282         ld  e,(hl)              ;e = Y
283         ld  ix,spr_bullet01
284         push de
285         call drw_spr            ;display bullet
286         pop de
287         ld  b,20
288         ld  hl,enemies
289
290 hit_enemies:                    ;Hits with normal enemies
291         push hl
292
293         ld  a,(hl)
294         and %00000010
295         jr  z,nohit             ;no hit when enemy_occ <> 2/3
296
297         inc hl
298         inc hl
299         ld  a,(hl)              ;check x
300         sub d
301         add a,5
302         jp  m,nohit
303         cp  8
304         jr  nc,nohit
305
306         inc hl
307         ld  a,(hl)              ;check y
308         sub e
309         add a,5
310         jp  m,nohit
311         cp  10
312         jr  nc,nohit
313
314         xor a
315         push hl
316         ld  hl,(temp1)
317         ld  (hl),a              ;remove bullet
318         pop hl
319
320         dec hl
321         dec hl
322         dec hl
323         ld  a,(hl)              ;occ
324         ld  b,a
325         srl a
326         srl a                   ;occ/4 = HP left
327         jr  nz,hpleft
328         ld  (hl),$01            ;set to explode
329         inc hl
330         ld  (hl),a              ;explosionFrame 0
331         pop hl
332         ret
333
334 hpleft:
335         ld  a,b
336         sub %00000100           ;decrease HP by one
337         ld  (hl),a              ;save
338         pop hl
339         ret
340
341 nohit:  pop hl
342         inc hl
343         inc hl
344         inc hl
345         inc hl
346         djnz hit_enemies        ;check next enemy
347         ret
348
349 ;--------------------------- level events -------------------------------------
350
351 Level_event:
352         ld  a,(nextevent)
353         dec a
354         ld  (nextevent),a
355         or  a
356         ret nz
357
358 do_event:
359         ld  hl,(curevent)
360         ld  de,enemies-4
361 chk_noenemy:
362         inc de
363         inc de
364         inc de
365         inc de
366         ld  a,(de)
367         or  a                   ;0 = no enemy present
368         jr  nz,chk_noenemy
369
370         ld  a,(hl)              ;type
371         ld  hl,enemy01
372         ld  c,a
373         ld  b,0
374         add hl,bc
375         add hl,bc               ;hl = enemy specs
376         ld  a,(hl)              ;load hitpoints+occ of this enemy class
377         ld  (de),a              ;occ
378
379         inc hl
380         inc de
381         ld  a,(hl)              ;load movement+type of this enemy class
382         ld  (de),a              ;type
383
384         inc de
385         ld  a,$5a               ;appear at right edge of screen
386         ld  (de),a              ;x
387         inc de
388
389         ld  hl,(curevent)
390         inc hl
391         ld  a,(hl)
392         ld  (de),a              ;y
393
394         inc hl                  ;@ next event
395         ld  a,(hl)
396         cp  $ff                 ;255 = end marker
397         jp  z,Next_level
398         ld  (nextevent),a       ;else time to next event
399
400         inc hl
401         ld  (curevent),hl       ;update pointer
402         ret
403
404 ;--------------------------- enemy fires --------------------------------------
405
406 Enemy_fires:
407         ld  a,r
408         and %01111111
409         cp  19
410         ret p
411
412         add a,a
413         add a,a
414         ld  c,a
415         ld  b,0                 ;bc = a*4
416         ld  hl,enemies
417         add hl,bc               ;hl = enemy
418         ld  a,(hl)
419         or  a
420         ret z                   ;return if no enemy
421         dec a
422         dec a
423         ret z                   ;or exploding enemy
424         inc hl
425         inc hl
426         ld  c,(hl)              ;enemy x-pos
427         dec c
428         dec c                   ;c = x-2
429         inc hl
430         ld  a,(hl)              ;y-pos
431         inc a
432         ld  e,a                 ;e = y+1
433
434         ld  b,10
435         ld  hl,ebullets
436 find_ebullet:
437         ld  a,(hl)
438         or  a
439         jr  z,found_ebullet     ;0 = not used
440         inc hl
441         inc hl
442         inc hl
443         djnz find_ebullet       ;look next bullet
444         ret
445
446 found_ebullet:
447         ld  (hl),1              ;use bullet
448         inc hl
449         ld  (hl),c              ;set x-pos
450         inc hl
451         ld  (hl),e              ;set y-pos
452         ret         
453
454 ;----------------------------- enemy bullets ----------------------------------
455
456 Enemy_bullets:
457         ld  hl,ebullets
458         ld  b,10
459 handle_bullet:
460         push bc
461         push hl
462         ld  a,(hl)
463         or  a
464         jr  nz,enemy_bullet
465 next_bullet:
466         pop hl
467         pop bc
468         inc hl
469         inc hl
470         inc hl
471         djnz handle_bullet
472         ret
473
474
475 enemy_bullet:
476         inc hl
477         ld  a,(hl)              ;bullet x
478         dec a
479         jp  m,remove_ebullet    ;off screen?
480         jr  z,remove_ebullet    ;"
481         dec a                   ;move left
482         ld  (hl),a
483         ld  d,a                 ;d=x
484         inc hl
485         ld  e,(hl)              ;e=y
486         ld  ix,spr_bullet11     ;display enemy bullet
487         call drw_spr
488
489         ld  a,(your_occ)
490         or  a
491         jr  nz,next_bullet      ;0 = you're normal
492
493         pop hl
494         push hl
495         inc hl                  ;check x
496         ld  a,(x)
497         sub (hl)
498         add a,6
499         jp  m,next_bullet
500         cp  9
501         jr  nc,next_bullet
502
503         inc hl                  ;check y
504         ld  a,(y)
505         sub (hl)
506         add a,6
507         jp  m,next_bullet
508         cp  9
509         jr  nc,next_bullet
510
511         call damage_you         ;HIT!!
512
513 remove_ebullet:
514         dec hl
515         dec hl
516         ld   (hl),0             ;bullet > unused
517         jr   next_bullet
518
519 ;--------------------------- handle enemies -----------------------------------
520
521 Handle_enemies:
522         ld  hl,enemies
523         ld  b,20                ;loop 20x
524
525 handle_enemy:
526         push bc
527         push hl
528
529         ld  a,(hl)
530         and %00000011
531         jr  z,next_enemy        ;occ "no enemy" 0
532         dec a
533         jr  z,exploding_enemy   ;occ "exploding" 1
534         ld  b,0
535         dec a
536         jr  z,normal_enemy      ;occ "normal" 2
537
538 moving_enemy:                   ;occ "moving" 3
539         ld  b,1
540
541 normal_enemy:
542         inc hl
543         ld  a,(hl)              ;type
544         add a,a
545         add a,a
546         add a,a
547         ld  c,a                 ;type*8 = offset
548
549         inc hl
550         ld  a,(hl)              ;x
551         dec a                   ;move left
552         jp  m,remove_enemy      ;off screen
553         jr  z,remove_enemy      ;"
554         ld  d,a
555
556         inc hl
557         ld  a,(hl)              ;y
558         ;;;;;;;;;;;;;;;;        ;
559         ld  (hl),a              ;store new y
560         ld  e,a
561
562         dec hl
563         ld  (hl),d              ;store new x
564         ld  ix,spr_enemy01
565         ld  b,$00
566         add ix,bc
567         call drw_spr
568         jr  next_enemy
569
570 remove_enemy:
571         pop hl
572         ld  (hl),$0000          ;bye bye enemy
573         push hl
574 next_enemy:
575         pop hl
576         ld  bc,$0004
577         add hl,bc
578         pop bc
579         djnz handle_enemy
580         ret
581
582 exploding_enemy:
583         inc  hl
584         push hl
585         ld   a,(hl)
586         call explosion_stuff    ;display explosion
587         pop  hl
588
589         ld  a,(hl)
590         cp  15
591         jr  z,remove_enemy      ;remove when at last frame
592         inc a
593         ld  (hl),a              ;next frame
594         jr  next_enemy
595
596 ;--------------------------- check collision ----------------------------------
597
598 Enemies_hit:
599         ld  a,(your_occ)
600         or  a                   ;0 = you're normal
601         ret nz
602
603         ld  de,(x)              ;e = X, d = Y
604         ld  hl,enemies
605         ld  b,20                ;check all 20 enemies
606 check_collision:
607         push hl
608         ld  a,(hl)
609         and %00000010
610         jr  z,check_next        ;2/3 = ok
611
612         inc hl
613         inc hl
614         ld  a,(hl)              ;check x match
615         sub e
616         add a,6
617         jp  m,check_next
618         cp  12
619         jr  nc,check_next
620
621         inc hl
622         ld  a,(hl)              ;check y match
623         sub d
624         add a,6
625         jp  m,check_next
626         cp  12
627         jr  nc,check_next
628
629         dec hl
630         dec hl
631         xor a
632         ld  (hl),a              ;explosionFrame 0
633         dec hl
634         inc a
635         ld  (hl),a              ;set to explode
636         call damage_you         ;auch!
637
638 check_next:
639         pop hl
640         inc hl
641         inc hl
642         inc hl
643         inc hl
644         djnz check_collision
645         ret
646
647 ;--------------------------- next level ---------------------------------------
648
649 Next_level:
650         ld  hl,Leveldata+1      ;reset level data
651         ld  (curevent),hl
652
653         call _clrLCD            ;clear screen
654         ld  hl,$0703
655         ld  (_curRow),hl        ;center
656         ld  hl,txt_level
657         call _puts              ;display "LEVEL "
658
659         ld  a,(level)
660         inc a                   ;increase level nr.
661         ld  (level),a
662         ld  l,a
663         ld  h,$00
664
665         call UNPACK_HL
666         add a,'0'
667         ld  b,a
668         call UNPACK_HL
669         add a,'0'
670         call _putc              ;display second digit
671         ld  a,b
672         call _putc              ;display first digit
673
674         ld  b,$20
675 wait:   halt \ halt
676         djnz wait               ;delay
677         call _getkey            ;wait for keypress
678
679         ret
680
681 ;--------------------------- putsprite ----------------------------------------
682
683 offsets_table:
684         .db 128,64,32,16,8,4,2,1
685 drw_spr:
686         ld  a,d
687         and 7
688         ld  hl,offsets_table
689         ld  c,a
690         ld  b,0
691         add hl,bc
692         ld  a,(hl)
693         ld  (_smc1+1),a
694
695         ld  (_smc1+1),a
696         ld  hl,GRAPH_MEM
697         ld  a,e
698         add a,a
699         add a,e
700         add a,a
701         rl  b
702         add a,a
703         rl  b
704         srl d
705         srl d
706         srl d
707         add a,d
708         jr  nc,_n1
709         inc b
710 _n1:    ld  c,a
711         add hl,bc
712           
713         ld  d,(ix)
714         ld  b,(ix+1)
715 _oloop: push bc                 ;Save # of rows
716         push hl                 ;Save screen address
717         ld  b,d                 ;Load width
718         ld  c,(ix+2)            ;Load one line of image
719         inc ix
720 _smc1:  ld  a,1                 ;Load pixel mask
721 _iloop: sla c                   ;Test leftmost pixel
722         jr  nc,_noplot          ;See if a plot is needed
723         ld  e,a                 ;OR pixel with screen
724         or  (hl)
725         ld  (hl),a
726         ld  a,e
727 _noplot: rrca
728         jr  nc,_notedge         ;Test if edge of byte reached
729         inc hl                  ;Go to next byte
730 _notedge:djnz _iloop
731         pop hl                  ;Restore address
732         ld  bc,12               ;Go to next line
733         add hl,bc
734         pop bc                  ;Restore data
735         djnz _oloop
736         ret
737
738
739
740 _D_HL_DECI:
741          push     bc
742          ld       de,up_data+4
743          ld       b,5
744 ldhld:   call     UNPACK_HL
745          add      a,'0'
746          ld       (de),a
747          dec      de
748          djnz     ldhld
749          ld       hl,up_data
750          ld       b,4
751 lis:     ld       a,(hl)
752          cp       '0'
753          jr       nz,dis
754          ld       (hl),' '
755          inc      hl
756          djnz     lis
757 dis:     ld       hl,up_data
758          call     _puts
759          pop      bc
760          ret
761
762 up_data: .db      "PAD98",0
763
764
765
766 ;------------------------------- sprites --------------------------------------
767
768 spr_ship:
769         .db 7,1         ;ship icon
770         .db %11000000   ; ██
771         .db %11110000   ; ████
772         .db %01111100   ;  █████
773         .db %01110010   ;  ███  █
774         .db %01111100   ;  █████
775         .db %11110000   ; ████
776         .db %11000000   ; ██
777
778 spr_ship01:
779         .db 7,7         ;ship alpha class
780         .db %01110000   ;  ███
781         .db %11100000   ; ███
782         .db %11111100   ; ██████
783         .db %11110010   ; ████  █
784         .db %11111100   ; ██████
785         .db %11100000   ; ███
786         .db %01110000   ;  ███
787 spr_ship02:
788         .db 7,7         ;ship beta class
789         .db %11000000   ; ██
790         .db %11110000   ; ████
791         .db %01111100   ;  █████
792         .db %01110010   ;  ███  █
793         .db %01111100   ;  █████
794         .db %11110000   ; ████
795         .db %11000000   ; ██
796
797 spr_bullet01:
798         .db 5,3         ;your bullets
799         .db %00110000   ;   ░▒▓██
800         .db %11111000   ; ░▒▓█████
801         .db %00110000   ;   ░▒▓██
802 spr_bullet02:
803         .db 5,3         ;your bullets
804         .db %11110000   ; ░▒▓████
805         .db %11111000   ; ░▒▓█████
806         .db %11110000   ; ░▒▓████
807
808 spr_bullet11:
809         .db 3,3         ;enemy bullets
810         .db %01000000   ;  █▓▒░
811         .db %11100000   ; ███▓▒░
812         .db %01000000   ;  █▓▒░
813
814 spr_explosion:                               
815         .db 8,6         ;1
816         .db %00000000
817         .db %00011100   ;    ███
818         .db %00111110   ;   █████
819         .db %01010110   ;  █ █ ██
820         .db %00111000   ;   ███
821         .db %00000000
822
823         .db 8,6         ;2
824         .db %00110000   ;   ██
825         .db %01001110   ;  █ ▒███
826         .db %10111110   ; █ █████
827         .db %01001111   ;  █ ▒████
828         .db %00111000   ;   ███
829         .db %00011010   ;    ██ █
830
831         .db 8,6         ;3
832         .db %10110011   ; █ ██  ██
833         .db %01001110   ;  █  ███
834         .db %10110101   ; █ ██▒█▒█
835         .db %01000101   ;  █  ▒█▒█
836         .db %00111110   ;   █████
837         .db %11011010   ; ██ ██ █
838
839         .db 8,6         ;4
840         .db %00101010   ; ▒ █▒█ █▒
841         .db %01000110   ;  █  ▒██
842         .db %10110101   ; █ ██ █ █
843         .db %01100110   ;  ██  ██▒
844         .db %00111100   ;   ████▒
845         .db %01011001   ; ▒█ ██ ▒█
846
847         .db 8,6         ;5
848         .db %01000001   ;  █▒ ▒ ▒█
849         .db %00100101   ;  ▒█  █▒█
850         .db %00010100   ; ▒ ▒█ █ ▒
851         .db %01000100   ;  █▒  █
852         .db %00010010   ;   ▒█▒▒█
853         .db %10011010   ; █▒ ██ █▒
854
855         .db 8,6         ;6
856         .db %01000100   ;  █   █ ▒
857         .db %00100000   ;   ▒█ ▒ ▒
858         .db %00000001   ;    ▒ ▒ █
859         .db %01000100   ;  █   █
860         .db %00100010   ;   █▒  █
861         .db %01001000   ; ▒█ ▒█ ▒
862
863         .db 8,6         ;7
864         .db %00001000   ;  ▒  █▒
865         .db %11000010   ; ██ ▒  █
866         .db %00000000   ;        ▒
867         .db %00100000   ;  ▒█  ▒
868         .db %00000001   ;   ▒   ▒█
869         .db %00110000   ;  ▒██▒
870
871         .db 8,6         ;8
872         .db %00000100   ;     ▒█
873         .db %00000000   ; ▒▒    ▒
874         .db %01000000   ;  █
875         .db %00000000   ;   ▒
876         .db %00000010   ;       █▒
877         .db %00100100   ;   █▒ █
878
879 spr_icon01:
880         .db 5,4
881         .db %00100000   ;   █
882         .db %10101000   ; █ █ █
883         .db %11111000   ; █████
884         .db %01110000   ;  ███
885 spr_icon02:
886         .db 5,4
887         .db %00000000   ;  ███
888         .db %00000000   ; ██ ██
889         .db %00000000   ; █   █
890         .db %00000000   ;
891
892 ;---------------------------- texts -------------------------------------------
893
894 txt_title:      .db "* * NEMESIS * *",0
895 txt_level:      .db "LEVEL ",0
896 txt_score:      .db "SCORE",0
897
898 ;---------------------------- save data ---------------------------------------
899
900 stored_data_start:
901
902 level           .db $00                 ;level number
903 timer           .db $00                 ;frame counter
904 curevent        .dw Leveldata+1         ;next event
905 nextevent       .db (Leveldata)         ;time to next event
906
907 score           .dw $0000
908
909 your_occ        .db $00                 ;0=normal 1=exploding 2=gone
910 lives           .dw $0003       ;unused
911 x               .db $16                 ;x-pos
912 y               .db $46                 ;think about it..
913 hp              .db $00                 ;hitpoints left
914
915 ybullets        .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
916 ebullets        .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
917
918 enemies         .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
919                 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
920                 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
921                 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
922                 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
923
924 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
925 ; %111 (move ptrn) 11111 (ship or explosion frame)  %11111111 (x) %11111111 (y)
926
927
928 ;---------------------------- enemy data --------------------------------------
929
930 spr_enemy01:
931         .db 6,6         ;enemy type one
932         .db %00111100   ;   ████
933         .db %01110000   ;  ███
934         .db %11110000   ; ████
935         .db %11110000   ; ████
936         .db %01110000   ;  ███
937         .db %00111100   ;   ████
938 spr_enemy02:
939         .db 6,6         ;enemy type two
940         .db %00111000   ;   ███
941         .db %01100000   ;  ██
942         .db %11111100   ; ██████
943         .db %11111100   ; ██████
944         .db %01100000   ;  ██
945         .db %00111000   ;   ███
946 spr_enemy03:
947         .db 6,6         ;enemy type three
948         .db %01111100   ;  █████
949         .db %11110000   ; ████
950         .db %11111000   ; █████
951         .db %11111000   ; █████
952         .db %11110000   ; ████
953         .db %01111100   ;  █████
954 spr_enemy04:
955         .db 6,6         ;enemy type four
956         .db %00111000   ;   ███
957         .db %01111100   ;  █████
958         .db %11111000   ; █████
959         .db %11111000   ; █████
960         .db %01111100   ;  █████
961         .db %00111000   ;   ███
962
963 enemy01:
964         .db %00000010,%00000000         ;first two enemy bytes
965 enemy02:
966         .db %00000010,%00100001
967 enemy03:
968         .db %00000110,%00000010
969 enemy04:
970         .db %00010010,%00000010
971
972 ;---------------------------- level data --------------------------------------
973
974 Leveldata:
975         .db $01,$01,$40         ;$time (ff=end)    $type    $y-pos
976         .db $10,$00,$30
977         .db $10,$02,$20
978         .db $40,$01,$10
979         .db $01,$00,$44
980         .db $15,$01,$31
981         .db $04,$02,$38
982         .db $05,$00,$40
983         .db $03,$00,$2f
984         .db $04,$00,$3a
985         .db $12,$02,$10
986         .db $10,$03,$18
987         .db $0e,$03,$20
988         .db $0c,$03,$28
989         .db $0a,$02,$30
990         .db $08,$02,$38
991         .db $06,$01,$40
992         .db $04,$00,$48
993         .db $2a,$00,$20
994         .db $ff,$ff,$ff
995
996 ;----------------------------- end --------------------------------------------
997
998         .end
999 .end
1000
1001
1002
1003
1004 ;----------------------------- NEMESIS'86 by Shiar ----------------------------
1005
1006 ;----------------------------- version history --------------------------------
1007
1008 ;0.01.717 -- 17.VII.99 -- size 984
1009 ;
1010 ;       + movement of ship over whole screen
1011 ;       + enemies moving from right to left, appearing right at specified times
1012 ;
1013 ; 0.1.718 -- 18.VII.99 -- size 907
1014 ;
1015 ;       * no crash when level restarts for the third time
1016 ;       * exit-procedure updated, unnecessary stuff/keychecks removed
1017 ;       * alot of unused code removed
1018 ;       + different types of enemies (just look different)
1019 ;       + collision detection!! enemy ships disappear when you hit them
1020 ;
1021 ; 0.2.718 -- 18.VII.99 -- size 1153
1022 ;
1023 ;       + ability to fire bullets (F1). Enemies disappear on impact
1024 ;       * enemies explode instead of disappearing
1025 ;
1026 ; 0.3.719 -- 19.VII.99 -- size 1401
1027 ;
1028 ;       * bullets appear correctly (not INSIDE your ship)
1029 ;       + some enemies can take multiple hits (differs per class)
1030 ;       + all enemies fire bullets at random
1031 ;       + if you're hit by bullet/enemy, you'll lose one hitpoint
1032 ;
1033 ; 0.4.720 -- 20.VII.99 -- size 1481
1034 ;
1035 ;       * collision detection fixed and optimized (much faster now!)
1036 ;       + shell-icon added (YAS type)
1037 ;       * code optimizations, some data "compression"
1038 ;       * explosion looks better, and some vars removed/smaller
1039 ;       * enemies are removed if at left side (instead of becoming invisible)
1040 ;       + displays level number before each level begins
1041
1042