Der Super-Sprite-Editor
Zirka fünfzig verschiedene Sprite-Editorprogramme erreichten uns in der Redaktion. Das beste Programm haben wir für Sie ausgewählt.
Der Hauptbildschirm besteht aus einem Anzeigefeld (Spalte 0 bis 12) und einem Arbeitsfeld (rechts eingerahmt). Im Anzeigefeld stehen das zu bearbeitende Sprite und Hinweise auf verfügbare Kommandos, im Arbeitsfeld wird das Sprite erstellt. Die Zahlen im Rahmen des Arbeitsfeldes ergeben sich aus dem Format der Sprites im Speicher.
Das Menü
Das Menü (=Command List) wird mit »Space« ins Anzeigefeld gerufen.
0 bis 7
Es werden bis zu sieben Sprites gleichzeitig im Spritefeld dargestellt. Die Tasten 0 bis 7 fungieren als On/Off-Schalter.
I
Das jeweils zuletzt angeschaltete Sprite wird nacheinander in Y-, XY- und X-Richtung vergrößert.
M
Schaltet für das zuletzt bearbeitete Sprite den Multicolormodus ein.
C
Verzweigt in die Routine für die Farbwahl.
R
Reproduktion des zuletzt bearbeiteten Sprites ins Arbeitsfeld. Kann mit beliebiger Taste abgebrochen werden.
F1
Schaltet in den Arbeitsmodus (siehe unten).
F3
Ändert die Hintergrundfarbe.
F7
Schiebt das Sprite im Speicher um eine Zeile tiefer. Es kann passieren, daß Punkte aus dem Sprite davor ins Bild verschoben werden.
F8
Wie F7, schiebt das Sprite hoch.
H
Verzweigt in die Handle-Routine, mit der Sprites auf dem Bildschirm verschoben werden können.
$
Zeigt das Diskettendirectory an. Kann mit F 1 abgebrochen werden.
@
Ermöglicht Disk-Befehle zu senden, beziehungsweise nur mit RETURN den Fehlerkanal abzufragen.
S
Gibt die Dezimalwerte des zuletzt bearbeiteten Sprite im Anzeigefeld aus. Am Kopf der Tabelle steht die Anfangsadresse des Sprites im Speicher (dezimal).
P
Ausgabe auf Drucker. Zusätzliche Angabe eines 20 Zeichen langen Namens möglich. Geräteadresse = 4
F
Verzweigt ins Floppymenü. Dieser Programmteil erklärt sich weitgehend selbst. Beim ersten Einsprung in die Routine sollte ein Name definiert werden, sonst wird das File (sequentiell) unter dem Namen »Data« geSAVEd. Später kann die Position »Filename« mit RETURN übergangen werden und der alte Name wird verwendet. Unter einem Namen können beliebig viele Sprites abgelegt werden. Geräteadresse = 8
D
Alle acht Sprites werden in Datazeilen umgewandelt.
K
Das Programm wird gelöscht. Datazeilen bleiben bestehen und können an andere Programme angehängt werden. Geduld, die Sache dauert!
Der Arbeitsmodus
’*’ beziehungsweise ’@’
Diese Tasten zeichnen Punkte (Linien) in horizontaler beziehungsweise vertikaler Richtung.
’=’ beziehungsweise ’;’
Wie oben, nur werden Punkte gelöscht. Die Belegung dieser Tasten ist an die Cursortasten angelehnt. Gleichzeitig mit SHIFT ist die Bewegungsrichtung umgekehrt.
Außerdem definiert: RETURN, HOME, CLEAR, F1
Aus fast jeder Routine kann mit F1 ausgestiegen werden. Auf Fragen wird mit Y(es) oder RETURN und N(o) oder beliebiger Taste geantwortet. Nicht definierte Tasten bewirken nichts. Fehleingaben sind abgefangen.
Man sollte das Programm nicht mit STOP/RESTORE beenden. Der Bildschirminhalt ist sonst nicht mehr lesbar. Nach QUIT oder STOP kann allerdings problemlos ohne Verlust der Sprites neu gestartet werden.
Für »Tippfaule«: Sämtliche Remzeilen sind optional, da sie nicht angesprungen werden, und dienen nur der Orientierung im Listing. Man kann sie also auch später einfügen, oder ganz weglassen.
Und wenn’s dann endlich drin ist (wunde Finger gehören nunmal dazu): Viel Spaß beim Malen!
Erweiterungen
- Der Bildschirm ist nach 33792 verlegt, um für acht Sprites Platz zu schaffen. Dementsprechend liegen die Sprites auch in Block 3, nämlich ab Adresse 32768.
- Die Tastenbelegung der »Work«-Routine ist der Verwendung von Cursortasten angeglichen. Links vertikale, rechts horizontale Bewegungen.
- Es stehen drei Routinen für Diskettenverwaltung zur Verfügung:
- Anzeige des Directory
- Senden von Disk-Commands
- Floppy Controller
- Die »Floppy«-Routine ist so gestaltet, daß ein relativ bequemes Umsortieren der Sprites auf Diskette von einem File ins andere möglich wird.
Das heißt: Viele Stellen, an denen bei Irrtum noch eine »Umkehr« möglich ist; immer wieder wird gezeigt, was gerade passiert. Bei Eingabe des Filenamens kann jetzt mit DELETE korrigiert werden. Bei fehlender Namensangabe heißt das File »Data« — kein unlöschbares »,« mehr.
Wenn man in letzter Minute noch aussteigt und doch kein einziges Sprite abgespeichert, entsteht nun kein Geisterfile mehr, das zwar einen Eintrag im Directory hat, aber keine Daten enthält und das Programm bei nächster Gelegenheit böswillig zum Absturz bringt.
- Diverse Kleinigkeiten.
0 rem ............................... 1 rem . . 2 rem . s p r i t e a i d + . 3 rem . . 4 rem . written by andreas koelbach . 5 rem . stadtwaldstr. 5 . 6 rem . 3550 marburg/l. . 7 rem . . 8 rem ............................... 9 rem 10 v=53248:ifpeek(53280)<>246thenpoke53280,6:gosub345 11 cd$="{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}" 12 f=55296:c=33792:sn=32768:a=0:o$=" " 13 fori=0to7:poke53287+i,7:pokec+1016+i,i:next 14 poke650,128:pokev+28,0:pokev+23,0:pokev+29,0 15 deffna(a)=a+x+y*40 16 gosub24 17 pokev+33,6:print"{clr}{wht}.spriteaid+.{lblu}" 18 print" {rvon} 8 6 4 {rvof}" 19 fori=1to20step2 20 print" {rvon} {rvof}........................{rvon} {rvof}" 21 print" {rvon}-{rvof}........................{rvon}-{rvof}":next 22 print" {rvon} {rvof}........................{rvon} {rvof}" 23 print" {rvon} 8 6 4 {rvof}":gosub172:goto68 24 pokev+21,0:fori=0to7:s(i)=1:sn$(i)=".":next:return 25 rem******* calculate dot *********** 26 ca=x-14:cb=y-2:h=int(ca/8):by=sn+3*cb+h:bi=2^(7-ca+h*8) 27 ifzl=46thenpokeby,peek(by)and255-bi:return 28 pokeby,peek(by)orbi:return 29 rem ******** get subroutine ********* 30 poke204,0:poke198,0:wait198,1:geta$:a=asc(a$) 31 ifpeek(207)then31 32 poke204,1:return 33 poke198,0:wait198,1:geta$:a=asc(a$):return 34 rem ********* reproduction ********** 35 print"{home}"tab(13)"{blk}- repro -{lblu}":ca=0:bi=0 36 forby=sntosn+62:b=peek(by):fori=7to0step-1:ca=ca+1 37 ifband2^ithenpokec+93+ca,42:goto39 38 pokec+93+ca,46:geta$:ifa$<>""theni=0:by=sn+62 39 nexti:bi=bi+1:ifbi=3thenbi=0:ca=ca+16 40 nextby:return 41 rem ********* multimatrix *********** 42 a=0:goto44 43 a=14 44 ifmf(s)=0thenreturn 45 fori=55389to56213step40:forj=1to24step4:pokei+j,a:pokei+j+1,a:nextj,i:return 46 rem ********** clear sprite ********* 47 pokefna(c),zl:pokefna(f),fl 48 printleft$(cd$,14)"{wht}sure ? {lblu}";:gosub30:ifa<>89anda<>13then52 49 mf(s)=1:gosub183 50 print"{home}{down}{down}";:fori=1to21:printtab(14)"........................":next 51 fori=sntosn+62:pokei,0:next 52 printleft$(cd$,14)" ":gosub43:goto68 53 rem********* set cursor ************* 54 pokefna(c),zl:pokefna(f),fl 55 ifx+r<38andx-l>13andy-u>1andy+d<23then60 56 iflthenx=38:goto60 57 ifutheny=23:goto60 58 ifdtheny=1:goto60 59 ifrthenx=13 60 x=x+r-l:y=y+d-u 61 zl=peek(fna(c)):fl=peek(fna(f)) 62 pokefna(c),43:pokefna(f),1 63 r=0:l=0:d=0:u=0:return 64 rem ********** slip sprite ********** 65 fori=sn+62tosnstep-1:pokei,peek(i-3):next:return 66 fori=sntosn+62:pokei,peek(i+3):next:return 67 rem ******** main menu ************** 68 print"{home}"tab(13)" " 69 printleft$(cd$,13) 70 print" " 71 print" " 72 print" " 73 print" " 74 print"{rvon} space {rvof} for" 75 print"command list " 76 print" " 77 print" " 78 print" " 79 print" ":print" " 80 printleft$(cd$,24)"input no.? "; 81 gosub30 82 ifa>47anda<56then105:rem on/off 83 ifa=67then192:rem color 84 ifa=73then111:rem incr. 85 ifa=77thengosub183:goto80:rem multi 86 ifa=82thengosub35:goto68:rem repro 87 ifa=81then154:rem exit 88 ifa=133thengosub42:goto242:rem work 89 ifa=136thengosub65:goto80:rem slip 90 ifa=140thengosub66:goto80:rem slip 91 ifa=134thengosub103:rem back color 92 ifa=72thengosub24:goto411:rem handle 93 ifa=83then145:rem screendat 94 ifa=80then221:rem printer 95 ifa=70thengosub24:goto276:rem floppy 96 ifa=68then362:rem dataline 97 ifa=75thengosub24:goto439:rem kill 98 ifa=36then120:rem $ 99 ifa=64then374:rem @ 100 ifa=32then387:rem command list 101 goto80 102 rem ******** background ************* 103 pokev+33,peek(v+33)+1and15:return 104 rem ******** sprite on/off ********** 105 s=a-48:sn=32768+s*64 106 ifs(s)=0thens(s)=1:sn$(s)=".":pokev+21,peek(v+21)and255-2^s:gosub172:goto80 107 s(s)=0:sn$(s)=right$(str$(s),1):gosub172:pokev+2*s,56:pokev+1+2*s,92 108 pokev+21,peek(v+21)or2^s:iffi(s)=0then80 109 fi(s)=fi(s)-1 110 rem********* increased ************* 111 gosub162:iffi(s)then113 112 fi(s)=1:pokev+23,peek(v+23)or2^s:goto80 113 iffi(s)>1then115 114 fi(s)=2:pokev+29,peek(v+29)or2^s:goto80 115 iffi(s)>2then117 116 fi(s)=3:pokev+23,peek(v+23)and255-2^s:goto80 117 pokev+29,peek(v+29)and255-2^s 118 gosub172:fi(s)=0:goto80 119 rem ********* directory ************ 120 gosub24:print"{clr}{wht}.directory.{lblu}{down}":i=0 121 open2,8,15:open1,8,0,"$" 122 get#1,a$,b$ 123 get#1,a$,b$ 124 get#1,a$,b$:i=i+1 125 b=0:ifa$<>""thenb=asc(a$) 126 ifb$<>""thenb=b+asc(b$)*256 127 printmid$(str$(b),2);tab(5); 128 get#1,b$:ifstthen138 129 ifb$<>chr$(34)then128 130 get#1,b$:ifb$<>chr$(34)thenprintb$;:goto130 131 get#1,b$:ifb$=chr$(32)then131 132 printtab(21);:c$="" 133 c$=c$+b$:get#1,b$:ifb$<>""then133 134 print" "left$(c$,5) 135 gett$:ift$="{f1}"then142 136 ifi=20then139 137 ifst=0then123 138 print"{rvon} blocks free {rvof}":close1:close2:gosub141:goto16 139 print"{down} press any key ...":gosub141 140 print"{clr}{wht}.directory.{lblu}{down}":i=0:goto123 141 gett$:ift$=""then141 142 ift$="{f1}"thenclose1:close2:goto16 143 return 144 rem ******* give out decimal ******* 145 gosub24:gosub156:print"{down}{blk} adr.";sn;"{lblu}":fori=sntosn+62step3 146 a1$=str$(peek(i)):a2$=str$(peek(i+1)):a3$=str$(peek(i+2)) 147 a1$=left$(o$,4-len(a1$))+mid$(a1$,1,4) 148 a2$=left$(o$,4-len(a2$))+mid$(a2$,1,4) 149 a3$=left$(o$,4-len(a3$))+mid$(a3$,1,4) 150 print"{left}";a1$;a2$;a3$:next 151 gosub159:poke198,0:wait198,1 152 gosub156:gosub172:goto68 153 rem ************* exit ************* 154 print"{home}{down}";:end 155 rem ****** clear display area ****** 156 print"{home}" 157 fori=1to23:print" ":next:print"{home}"; 158 rem ****** screen line msb ********* 159 fori=0to6:poke217+i,132:poke230+i,134:next 160 fori=0to5:poke224+i,133:poke237+i,135:next:return 161 rem********************************* 162 print"{home}{down}{down}{down}{down}{rght}{rght}{rght}U{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}I" 163 print"{rght}{rght}{rght}B B" 164 print"{rght}{rght}{rght}B B" 165 print"{rght}{rght}{rght}B B" 166 print"{rght}{rght}{rght}B B" 167 print"{rght}{rght}{rght}B B" 168 print"{rght}{rght}{rght}B B" 169 print"{rght}{rght}{rght}J{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}K" 170 return 171 rem********************************* 172 print"{home}{down}{down} ";:fori=0to7:ifi=sthenprint"{wht}"; 173 printsn$(i)"{lblu}";:next:print 174 print"{down} U{SHIFT-*}{SHIFT-*}{SHIFT-*}I " 175 print" B B " 176 print" B B " 177 print" B B " 178 print" J{SHIFT-*}{SHIFT-*}{SHIFT-*}K " 179 print" " 180 print" " 181 print" ":return 182 rem ********** multi mode ********** 183 ifmf(s)then185 184 pokev+28,peek(v+28)or2^s:mf(s)=1:goto186 185 pokev+28,peek(v+28)and255-2^s:mf(s)=0 186 printleft$(cd$,13); 187 print"mlt:"; 188 fori=0to7:ifmf(i)thenprintright$(str$(i),1);:goto190 189 print"."; 190 next:print:return 191 rem ********** set color *********** 192 a=peek(v+37):c$(0)=str$(a-240) 193 a=peek(v+38):c$(1)=str$(a-240) 194 a=peek(v+39+s):c$(2)=str$(a-240) 195 printleft$(cd$,16); 196 print"colors reg. " 197 print"{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T} {CBM-T}{CBM-T}{CBM-T}{CBM-T} " 198 print" 37 " 199 print" " 200 print" 38 " 201 print" " 202 print" {rvon}"str$(39+s)" {rvof} " 203 print" " 204 print" " 205 printleft$(cd$,18)" "c$(0)" " 206 print"{down}{rght}"c$(1)" ":print"{down}{rght}"c$(2)" " 207 printleft$(cd$,16) 208 i=0:gosub212:pokev+37,b 209 i=1:gosub212:pokev+38,b 210 i=2:gosub212:pokev+39+s,b 211 goto68 212 print"{down} ";:b$="" 213 gosub30:ifa=13then217 214 ifa<48ora>57then213 215 b$=b$+a$:printa$;:iflen(b$)=2then218 216 goto213 217 ifb$=""thenprint:goto219 218 c$(i)=b$:print" " 219 b=val(left$(c$(i),3)):return 220 rem ********** printer out ********* 221 printleft$(cd$,25); 222 print"name (20chr.) ? {up}":printtab(16);:b$="" 223 gosub30:goto225 224 gosub33 225 ifa=20andb$<>""thenb$=left$(b$,len(b$)-1):printchr$(20);:goto224 226 ifa=133then16 227 ifa=13then231 228 ifa=<32ora>127then224 229 b$=b$+a$:iflen(b$)>20then231 230 printa$" {left}";:goto224 231 printleft$(cd$,11)tab(17)" {wht}printer on ?{lblu} {left}{left}"; 232 gosub30 233 ifa=78then221 234 ifa=133then16 235 ifa<>13anda<>89then231 236 open1,4:cmd1:printb$ 237 fori=sntosn+62step3: 238 printpeek(i);peek(i+1);peek(i+2) 239 next:print 240 close1:goto16 241 rem ********* work routine ********* 242 print"{home}"tab(14)"{blk}- work -{lblu}" 243 printleft$(cd$,15); 244 print" " 245 print"dot(*)='*' " 246 print" '@' " 247 print"spc(.)='=' " 248 print" ';' " 249 print" " 250 print"{blk}menu ='f1' {lblu}" 251 print" " 252 print"{rvon} use'crsr' " 253 print"{rvon} to move ! {rvof}{home}"; 254 x=0:y=0:d=1:r=14:zl=46:fl=1 255 gosub54 256 poke198,0:wait198,1:geta$:a=asc(a$) 257 ifa=145thenu=1:goto255 258 ifa=157thenl=1:goto255 259 ifa=17thend=1:goto255 260 ifa=29thenr=1:goto255 261 ifpeek(654)then269 262 ifa=42thenr=1:zl=42:gosub26:goto255 263 ifa=64thend=1:zl=42:gosub26:goto255 264 ifa=59thend=1:zl=46:gosub26:goto255 265 ifa=61thenr=1:zl=46:gosub26:goto255 266 ifa=13thenl=x-14:goto255 267 ifa=133thenpokefna(c),zl:pokefna(f),fl:gosub43:goto68 268 ifa=19thenl=x-14:u=y-2:goto255 269 ifa=192thenl=1:zl=42:gosub26:goto255 270 ifa=93thenu=1:zl=46:gosub26:goto255 271 ifa=186thenu=1:zl=42:gosub26:goto255 272 ifa=61thenl=1:zl=46:gosub26:goto255 273 ifa=147then47 274 goto256 275 rem ******** floppy **************** 276 pokev+21,0:print"{clr}"left$(cd$,25)"{blk} - 'f1'=exit -{lblu}"; 277 fori=0to7:sp(i)=0:next 278 print"{home}{wht}.floppy disk controller.{lblu}" 279 print"{down}{yel}r{lblu}ead or {yel}w{lblu}rite ?" 280 gosub33 281 ifa=133then16 282 ifa$="r"thenm=0:b$="{yel}read{lblu}":c$="":b=7:goto285 283 ifa$="w"thenm=1:b$="{yel}write{lblu}":c$="s":b=0:goto285 284 goto278 285 print"{up}mode : {up}":printtab(8)b$:ifm=0thenb$="replace" 286 print"{down}input sprite"c$" you want to "b$:b$="":print"{down}> "; 287 gosub33 288 ifa=133then276 289 ifa=13then292 290 ifa<48ora>55then287 291 a=val(a$):printa;:sp(a)=1:b=b+1:ifb<8then287 292 print" <{down}" 293 f$="":print"filename : "; 294 gosub33:ifa=20andlen(f$)>0thenf$=left$(f$,len(f$)-1):printa$; 295 ifa=13then300 296 ifa<32ora>127then294 297 printa$;:f$=f$+a$ 298 iflen(f$)>16thenprint"{del}";:goto300 299 goto294 300 iff$<>""thenfi$=f$:goto302 301 printfi$;:iffi$=""thenfi$="data" 302 fori=0to7:fi(i)=0:next:pokev+23,0:pokev+29,0:x=0:y=0:ifmthen321 303 rem ********** read **************** 304 gosub339:gosub33:ifa<>13anda<>89then276 305 b$="{lred}>>> reading <<<{lblu}":gosub343:no=0 306 rem ********** input *************** 307 open15,8,15:open2,8,2,fi$+",s,r" 308 input#15,a,b$:ifathengosub318:goto276 309 printtab(3)"{down}no.:"no:no=no+1 310 fori=adtoad+62:input#2,b 311 pokei,b:nexti 312 ifst=64thenb$="{wht} end of data ! {lblu}":gosub343:gosub33:goto316 313 b$=" {wht}take over ? {lblu}":gosub343 314 gosub33:ifa=133then316 315 ifa<>13anda<>89thenb$="{lred}>>> reading <<<{lblu}":gosub343:goto309 316 pokev+21,0:close2:close15:goto276 317 rem ********** errors ************** 318 printleft$(cd$,25)tab(3)b$" - press any key";:gosub33 319 close2:close15:return 320 rem *********** write ************** 321 fork=0to7:ifsp(k)=0then325 322 gosub339:gosub33:ifa<>13anda<>89thensp(k)=0:goto324 323 sp(k)=2:x=1 324 b$=" ":gosub343 325 nextk:ifx=0then276 326 open15,8,15:open2,8,2,fi$+",s,w":x=0 327 input#15,a,b$:ifa=63thenclose2:open2,8,2,fi$+",s,a":x=1 328 input#15,a,b$:ifathengosub318:goto276 329 fork=0to7:s=k:ifsp(k)=0then336 330 geta$:ifa$="{f1}"thenk=7:goto336 331 sp(k)=1:y=1:gosub339:y=0 332 b$="{grn}<<< writing >>>{lblu}":gosub343 333 ifxthenb$="{down} {lred}append !{lblu}":gosub343 334 forj=adtoad+62:b=peek(j):print#2,b:nextj 335 b$="{down}{down} ":gosub343 336 sp(s)=0:nextk 337 close2:close15:goto276 338 rem ********** ask ok ? ************ 339 fori=0to7:s=i:ad=32768+64*s:ifsp(i)=1theni=7 340 nexti:pokev+2*s,56:pokev+2*s+1,150:pokev+21,2^s 341 printleft$(cd$,12)" {rvon}"s"{left} {rvof} ":ifythenreturn 342 b$="{wht} o.k. ? {lblu}" 343 printleft$(cd$,16)" "b$:return 344 rem *********** intro ************* 345 poke56576,5:poke648,132:poke56,124:rem screen nach 33792 - characterrom!! 346 print"{clr}{down}{down}{down}{down}{down}{down} {wht}.............................." 347 print" . ." 348 print" . s p r i t e a i d + ." 349 print" . ." 350 print" . {CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@}{CBM-@} ." 351 print" . written by {rvon} m a t a n {rvof} ." 352 print" . marburg (1984) ." 353 print" . ." 354 print" . {lred} no copyrights !! {wht} ." 355 print" . ." 356 print" ..............................{lblu}" 357 fori=32768to33344:pokei,0:next 358 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}";:fori=1to19:print" ";:forii=1to100:nextii,i 359 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{wht}press any key.{lblu}" 360 goto33 361 rem ******** data lines ************ 362 pokev+21,0:print"{clr}{wht}.data generator.{lblu}" 363 print"{down}begin with line (*10000) ? ";:gosub30 364 ifa<49ora>54then16 365 print"{clr}"left$(cd$,24)"{wht} generate data lines - w a i t !" 366 zn=(a-48)*10000:t=0:poke646,peek(v+33):fori=1to2000:next 367 ift=8then10 368 ad=32768+64*t:print"{clr}"zn"rem sprite"t 369 forii=0to6:zn=zn+1:printzn"{left}data";:fori=0to8 370 printmid$(str$(peek(ad+i+ii*9)),2,3)",";:nexti 371 printchr$(20):nextii 372 print"zn="zn+1":t="t+1":goto367";:goto447 373 rem******* send disk command ******* 374 gosub24:print"{clr}{wht}.send disk command.{lblu}{down}{down}":i=0 375 i=i+1:printleft$(cd$,2*i+1)"=>";:c$="" 376 gosub33:ifa=20andlen(c$)>0thenprinta$;:c$=left$(c$,len(c$)-1):goto376 377 ifa=13then382 378 ifa=133then16 379 ifa<32ora>127then376 380 c$=c$+a$:printa$; 381 goto376 382 open1,8,15,c$:input#1,a,b$,c$:ifa=1thenprintleft$(cd$,25)c$; 383 gosub318:close1:ifa=133then16 384 printleft$(cd$,25)" ";:ifi<8then375 385 goto374 386 rem ******* command list *********** 387 gosub24:gosub156 388 print"{home}{down}{wht}command list{lblu}"left$(cd$,3) 389 print"{rvon}sprites {rvof} " 390 print"{rvon}on/off {rvof}=0-7 " 391 print"incr. = i " 392 print"multi = m " 393 print"color = c " 394 print"repro = r " 395 print"{rvon} work {rvof} = f1 " 396 print"slip dwn= f7 " 397 print"slip up = f8 " 398 print"backcol.= f3 " 399 print"handle = h " 400 print"screen = s " 401 print"printer = p " 402 print"dataline= d " 403 print"{down}floppy = f " 404 print"show $ = $ " 405 print"disk-cmd= @ {down}" 407 print"kill = k " 408 print"quit = q " 409 gosub33:gosub156:gosub172:goto68 410 rem ********* handle *************** 411 pokev+21,0:print"{clr}{wht}.handle sprites.{lblu}":z=1:fori=0to7:s(i)=0:next 412 print"{down}0-3 = select sprite" 413 print"'f7' = fast move." 414 print"{down}use 'crsr' to move !" 415 gosub33:print"{clr}{wht} : x= y=":goto418 416 print"{home}"tab(10)peek(x)+255*sgn(peek(v+16)and2^s)"{left} "tab(22)peek(y)"{left} " 417 gosub33 418 ifa<48ora>55then424 419 s=val(a$):print"{home}no."s 420 x=v+2*s:y=v+2*s+1 421 ifs(s)then423 422 pokev+21,peek(v+21)or2^s:s(s)=1:goto416 423 pokev+21,peek(v+21)and255-2^s:s(s)=0:goto416 424 ifa=134thengosub103:goto416 425 ifa=17thenpokey,peek(y)+zand255:goto416 426 ifa=145thenpokey,peek(y)-zand255:goto416 427 ifa=29then434 428 ifa=157then436 429 ifa<>136then432 430 ifz=1thenz=5:goto416 431 z=1:goto416 432 ifa<>133then416 433 pokev+21,0:pokev+16,0:goto16 434 ifpeek(x)>=256-zthenpokev+16,peek(v+16)or2^s:pokex,0 435 pokex,peek(x)+zand255:goto416 436 ifpeek(x)<=0+z-1thenpokev+16,peek(v+16)and255-2^s:pokex,255 437 pokex,peek(x)-zand255:goto416 438 rem *********** kill *************** 439 print"{clr}{wht}.clear program.{lblu}" 440 print"{down}are you sure ? ";:gosub30 441 ifa<>89anda<>13then16 442 print"{clr}"left$(cd$,24)"{wht} clear program except data !!" 443 poke646,peek(v+33):t=0 444 print"{home}";:fori=ttot+7:printi:next 445 ift>439thenprint"poke 646,14:end":goto447 446 print"t="i":goto444" 447 poke631,19:fori=1to9:poke631+i,13:next:poke198,10:end