title The Game of Galaxy name ('GALAXY') include solvdm.lib ; ; SHOOTING STARS -- A BRAIN TEASER GAME ; AN INTERACTIVE GAME FOR 8080 COMPUTER ; THIS VERSION IMPLEMENTED FOR Sol ; DEVELOPED AND DEBUGGED WITH ALS-8 ; PROGRAM DEVELOPMENT SYSTEM ; ; PROGRAM ORIGINALLY SUBMITTED TO THE ; HEWLETT-PACKARD SOFTWARE LIBRARY IN BASIC ; SUBSEQUENTLY PUBLISHED BY PEOPLE'S COMPUTER ; COMPANY IN SEPT 74 AS "TEASER" ; WRITTEN IN 8008 CODE BY WILLARD I. NICO ; IN BYTE MAY 76 AS "SHOOTING STARS" ; ADAPTED TO 8080 CODE FOR USE WITH VDM-1 ; BY JERRY BACON ; S.I.L. PROGRAMMING LABORATORY ; BRASILIA, D.F. BRASIL ; ; DATE: 14 JAN 77 ; ; ######################################################## ; # Angepasst an den JOYCE, Werner Cirsovius, Maerz 2002 # ; ######################################################## extrn SOLon,SOLOS,CONin,VDMclr ;_YES equ 'Y' ; Original _YES equ 'J' ; DEutsch scrbt equ SOLvid+12*maxcol+0 ; ; Sternenplaetze ; str1 equ SOLvid+4*maxcol+27 str2 equ str1+5 str3 equ str2+5 ; str4 equ str1+2*maxcol str5 equ str4+5 str6 equ str5+5 ; str7 equ str4+2*maxcol str8 equ str7+5 str9 equ str8+5 ld sp,stack ; Stack initialisieren call SOLon ; SOL einschalten shsdr: ld hl,headr ; Anfangsmeldung call scrn ; .. ausgeben call CONin ; Zeichen lesen cp 'N' ; Anleitung benoetigt? jr z,start ; Anfangen falls nicht ld hl,page1 ; Sonst Hilfetext ausgeben call scrn call CONin ; Zeichen lesen ld hl,page2 ; .. zwei Seiten call scrn call CONin ; Zeichen lesen call VDMclr ; Bildschirm loeschen ; ; ################# ; # Spielschleife # ; ################# ; start: ld de,SOLvid call cler ; Bildschirm loeschen ld bc,1 ; Universum initialisieren ld d,b ; Schusszaehler initiieren cntst: inc d ; Schusszaehler erhoehen disp: ld hl,str1 ; Universum anzeigen call type ld hl,str2 call type ld hl,str3 call type ld hl,str4 call type ld hl,str6 call type ld hl,str7 call type ld hl,str8 call type ld hl,str9 call type xor a ld a,c rrca ld hl,str5 call type1 wntst: ld a,b ; Universum holen cp -1 ; Test ob Randgestirn jr nz,lstst ; Falls nicht da, test ob verloren ld a,c or a ; Mittleren Stern holen jr nz,gtstr ; Weiter wenn vorhanden ld hl,mess4 ; Sonst ist das Spiel gewonnen call scrnb ld e,'0' ; Zahlenwandlungbeginnen ld b,e ld c,e dec d ; Letzten Schuss bereinigen ld a,'9'+1 ; Endwert setzen mrdec: inc e ; Einer erhoehen cp e ; Test Ueberlauf jr nz,tally ; Weiter wenn nicht ld e,'0' ; Sonst Einer loeschen inc c ; Zehner erhoehen cp c jr nz,tally ld c,'0' inc b ; Hunderter erhoehen tally: dec d ; Schusszaehler runterzaehlen jr nz,mrdec ld a,'0' cp b ; Test fuehrender Nullen jr nz,three ; Falls nicht, drei Stellen anzeigen cp c jr nz,two jr one three: ld_hl_b ; Spielstand anzeigen inc hl two: ld_hl_c inc hl one: ld_hl_e inc hl ex de,hl ld hl,mess5 ; Zweite Haelfte der Meldung call scrn2 prnt1: call CONin ; Zeichen lesen cp _YES ; Test neues Spiel jp z,start ; Falls ja, neuer Anfang jp SOLOS ; Sonst SOL ausschalten lstst: or a ; Test ob kein Randstern jr nz,gtstr ; Falls vorhanden, weiter mit dem Spiel ld a,c or a ; Falls nicht, Test ob Mittelstern jr nz,gtstr ; Falls ja, weiter ld hl,mess3 ; Sonst Spiel verloren call scrnb jr prnt1 gtstr: ld hl,mess7 ; Frage nach Schuss call scrnb nxtst: call CONin ; Zeichen lesen inc hl ld_hl_a ; Schuss ausgeben call delay ld e,msklen/4 ; Maskenzaehler setzen ld hl,mask ; .. und Maskenzeiger nxgrp: cp (hl) ; Schusswahl testen jr z,found dec e jr z,inval ; Ungueltiger Schuss inc hl ; Naechsten Eintrag pruefen inc hl inc hl inc hl jr nxgrp found: inc hl ld a,(hl) or a ; Sternenposition testen jr nz,univ2 ; Sprung falls Randstern ld a,c cp 1 ; Test ob Mittelstern jr nz,bdfel ; Schlechter Schuss falls nicht jr nxbyt univ2: ld a,b and (hl) ; Schuss isolieren jr z,bdfel ; Schlechter Schuss nxbyt: inc hl ld a,b xor (hl) ; Galaxie aendern ld b,a ; Neues Muster retten inc hl ld a,c xor (hl) ; Mittelstern aendern ld c,a jp cntst ; Schuss zaehlen inval: cp esc ; Test ESCape jr nz,ntval ld hl,mess6 ; Aufgabe ausgeben call scrnb jr prnt1 ntval: ld hl,mess2 ; Falscher Stern jr ..nxtst bdfel: ld hl,mess1 ; Fehlermeldung ..nxtst: call scrnb jr nxtst ; ; Loeschen des Bildschirms und Ausgabe einer Zeichenkette ^HL ; scrn: ld a,d ld (temp),a ; Schusszaehler retten ld de,SOLvid ; Bildschirmadresse setzen scrn1: call cler ; Bildschirm loeschen scrn2: ld a,(hl) cp eot ; Test Ende jr z,endl ld_de_a ; Zeichen anzeigen inc hl inc de jr scrn2 endl: ld a,(temp) ; Schusszaehler zurueckholen ex de,hl ld d,a ; Zurueck in Reg D ret ; ; Ausgabe einer Zeichenkette ^HL in unteren Bereich ; scrnb: ld a,d ld (temp),a ld de,scrbt ; Untere Bildschirmadresse jr scrn1 ; ; Einen Teil des Videospeichers in ^DE loeschen ; cler: push de ; Startadresse retten cler1: ld a,' ' ; Leerzeichen eingeben ld_de_a inc de ld a,d cp high VidTop ; Test Ende des Speichers jr nz,cler1 pop de ; Startadresse holen ret ; ; Zustand anzeigen ; type: xor a ; Carry loeschen rrc b ; Universum verschieben type1: jr c,star ld_hl_8 '0' ; Loch anzeigen ret star: ld_hl_8 '*' ; Stern anzeigen ret ; ; Verzoegerung von 0,2 Sekunden ; delay: push de push af ; ; ===>> 200 Millisekunden <<=== ; ld d,2 ; ; ===>> 100 Millisekunden <<=== ; dly1: ld e,100 ; ; ===>> 1 Millisekunde (4MHz Clock) <<=== ; dly2: xor a dly3: dec a jr nz,dly3 ; dec e jr nz,dly2 dec d jr nz,dly1 pop af pop de ret ; temp: ds 1 ; ; Meldungen ; mess1: db 'Nur auf Sterne schie',_sz,'en, keine schwarzen L',_oe,'cher. Nochmal.' db eot mess2: db 'Falsche Sternennummer. Nochmal.' db eot mess3: db 'Du hast verloren! Auf mehr Sterne schie',_sz,'en?' db eot mess4: db 'Du gewinnst!! Gute Sch',_ue,'sse! Du hast ' db eot mess5: db ' mal geschossen. Bester Spielstand sind 11 Sch',_ue,'sse.' db 'Willst du nochmal?' db eot mess6: db 'Zu schnell aufgegeben! Nochmal auf Sterne schie',_sz,'en?' db eot mess7: db 'Dein Schuss?' db eot headr: db ' * * * * * * * * S T E R N E N S C H I E S S E N * * * * * * * ' db ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .' db ' E I N R ',_bae,' T S E L - S P I E L ! ! !. . . . . . . . . . . . . ' db ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .' db 'Spielregeln anzeigen? (N eingeben falls nicht)' db eot page1: db 'Es gibt Sterne: * und L',_oe,'cher: 0 in dem Universum. Du schie',_sz,'t ' db 'einen Stern (kein schwarzes Loch) durch Eingabe seiner Nummer. ' db ' 1 2 3 * * * 0 0 0 ' db ' 4 5 6 * 0 * 0 0 0 ' db ' 7 8 9 * * * 0 0 0 ' db 'Du hast gewonnen, wenn du das Raster in der Mitte bekommst und ' db 'verloren, wenn du das Raster auf der rechten Seite bekommst. ' db eot page2: db 'Jeder Stern ist in einer Galaxis. Wenn du auf einen Stern ' db 'schie',_sz,'t, ',_ae,'ndert sich alles in seiner Galaxis. Jeder Stern wird ' db 'zum schwarzen Loch und jedes schwarze Loch wird zum Stern ' db '. . . . . . . . . . . . Galaxien: . . . . . . . . . . . .' db ' 1 * 0 * 2 * 0 * 3 * 0 0 0 * 0 ' db ' * * 0 0 0 0 0 * * 4 0 0 * 5 * ' db ' 0 0 0 0 0 0 0 0 0 * 0 0 0 * 0 ' db '. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ' db ' 0 0 * 0 0 0 0 0 0 0 0 0 ' db ' 0 0 6 * * 0 0 0 0 0 * * ' db ' 0 0 * 7 * 0 * 8 * 0 * 9 ' db 'Fertig zum Spielen. Start mit beliebieger Taste. Viel Gl',_ue,'ck! ' db eot ; ; Spielmasken ; mask: db '1' ; Tastaturwert db 00h ; Sternenposition db 00001011b ; Sternenbewegung db 00000001b ; db '2',02h,00000111b,00000000b ; db '3',04h,00010110b,00000001b ; db '4',08h,00101001b,00000000b ; db '5',00h,01011010b,00000001b ; db '6',10h,10010100b,00000000b ; db '7',20h,01101000b,00000001b ; db '8',40h,11100000b,00000000b ; db '9',80h,11010000b,00000001b msklen equ $-mask ; ds 2*32 stack equ $ end