68’000 Nostalgie
Beim Umkopieren von Daten bin ich kürzlich auf eine ST-Image Datei gestossen. Ich muss nun etwas vorausschicken: mein erster Rechner war ein Atari STF mit Blitter-TOS, 1 MB Ram, einem Motorola 68000 Prozessor, 8 Mhz schnell oder wohl eher langsam. Das wiederentdeckte ST-Image stammte von einer Floppy-Disk (720KB), welche ich vor über einem Jahrzehnt mit einem „Floppy Image & File Transfer Program“ (MSA) auf meinen damaligen PC übertragen hatte. Den ST hatte ich übrigens 1989 über den Musenalp Express bestellt – wenn ich mich richtig erinnere für ca. 1300 CHF. Geliefert wurde dieser mit integriertem Floppylaufwerk (für 3.5″ Disketten, 720 KB), einem SM 124 Monitor (12″ Monochrom, 70 Hz), einer Maus (Kugel), einer 3.5 Zoll Diskette (ST-Basic) und einem Netzkabel mit Schuko-Stecker.
Bei den ersten Programmierversuchen mit Omikron-Basic (Editor, Interpreter und Kompiler) musste ich dann feststellen, dass die Diskette schneller ihr Speicherlimit erreicht hatte als vorgesehen. Das erste 10-Pack 3.5 Zoll Disketten erstand ich im Manor (1989) für 55 CHF. Software war für einen Teenager auch nicht gerade erschwinglich. Daher kaufte ich nur eine einzige Software (ein Zeichenprogramm von Data Becker für 79 CHF) und habe mich dann aufs Tauschen von Programmen, sprich Kopieren von Disketten verlegt.
Getauscht haben wir auf dem Pausenhof oder über Adressen aus Annoncen, welche man in einschlägigen Technik- und Computerzeitschriften fand. Diskettenliste erstellen, ausdrucken (dauerte mit einem Nadeldrucker eine Ewigkeit) und per Post an den Tauschpartner, im nächsten Schritt folgten dann die zu tauschenden Disketten. Um gleich noch etwas Werbung zu machen und uns das langwierige Ausdrucken, resp. das Fotokopieren der Softwareliste zu ersparen, sind wir dann dazu über gegangen eine Service Disk, welche eine Softwareliste, eine Picture Show und ein Demo enthielt, zu verschicken.
Nun genau diese Service Disk befand sich auf dem anfangs erwähnten ST-Image. Irgendwie konnte ich dieses Relikt aus den Jahren meiner ersten Gehversuchen in Basic und Assembler nicht einfach mit dem restlichen Datenmüll entsorgen. Da der Sourcecode der Programme von mir ebenfalls archiviert wurde, mache ich diesen ebenfalls zugänglich. Gleichfalls war ich darüber erstaunt, wie mit wenigen Bytes und Kilobytes man vor drei Jahrzehnten ausgekommen ist.
Die SR Service Disk als ST-Image kann hier als ZIP-Datei heruntergeladen werden:
SR Service Disc
Atari ST Emulatoren laufen auf aktuellen Systemen wegen der geringen Hardwareanforderungen problemlos. Es gibt sie für Windows, Linux und iOS.
Download STeem: steem.atari.st/lang_deutsch.htm
Download steem SSE (Aktuelle Win-Version von Steem): sourceforge.net/projects/steemsse/
Nun also zum Inhalt der SR-Disk, darauf befand sich:
«Dial Menu»
Dial Menu (Omikron Basic 3.0, 11790 Bytes, Res. 640×400 & 640×200)
Simpels Auswahlmenü für den vereinfachten Aufruf der einzelnen Programme auf der Service Disk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
' ****************************************** ' ** DIAL MENU ** ' ** 1990 BY CLUEDO FROM THE SUPERRIDERS ** ' ** OMIKRON-BASIC 3.0 ** ' ****************************************** ' CLEAR 120000,4096 Appl_Init XBIOS (Graphik%,4) IF Graphik%=0 THEN MOUSEON FORM_ALERT (1,"[1][Das Programm läuft nur|in der hohen und mittleren|Auflösung !][OK]") MOUSEOFF END ENDIF ON ERROR GOTO Fehler IF Graphik%=2 THEN Rsrc_Load("A:\SR_MONO.RSC",Re_Addr) Meldung Rsc_Define_A Rsrc_Gaddr(0,Tree1,Re_Addr) Box_Open REPEAT MOUSEON Form_Do(0,Re_Addr,Var) Objc_Change(Var,0,Ox,Oy,Ow,Oh,Re_Addr) IF Var=Liste THEN Box_Close EXEC "LISTE.PRG" Box_Open ENDIF IF Var=Show THEN Box_Close EXEC "SOUND.PRG" EXEC "SHOW.PRG" Box_Open ENDIF IF Var=Ende THEN FORM_ALERT (1,"[2][Wollen Sie das Programm|schon verlassen ?][Ja|Nein]",Button%) IF Button%=1 THEN Box_Close Rsrc_Free END ENDIF Box_Open ENDIF IF Var=Info THEN GOSUB Information UNTIL 0 ELSE Rsrc_Load("A:\SR_COLOR.RSC",Re_Addr) Meldung Rsc_Define_B Rsrc_Gaddr(0,Tree1,Re_Addr) Box_Open REPEAT MOUSEON Form_Do(0,Re_Addr,Var) Objc_Change(Var,0,Ox,Oy,Ow,Oh,Re_Addr) IF Var=Liste THEN Box_Close EXEC "LISTE.PRG" Box_Open ENDIF IF Var=Show THEN Box_Close EXEC "SHOW.PRG" Box_Open ENDIF IF Var=Ende THEN FORM_ALERT (1,"[2][Wollen Sie das Programm|schon verlassen ?][Ja|Nein]",Button%) IF Button%=1 THEN Box_Close Rsrc_Free END ENDIF Box_Open ENDIF IF Var=Hz50 THEN WAIT .2 WVBL POKE $FF820A,2 ENDIF IF Var=Hz60 THEN WAIT .2 WVBL POKE $FF820A,0 ENDIF IF Var=Info THEN GOSUB Information UNTIL 0 ENDIF -Information Box_Close Rsrc_Gaddr(0,Tree2,Re_Addr) Box_Open Form_Do(0,Re_Addr,Var) Objc_Change(Var,0,Ox,Oy,Ow,Oh,Re_Addr) Box_Close Rsrc_Gaddr(0,Tree1,Re_Addr) Box_Open RETURN -Fehler RESUME NEXT RETURN DEF PROC Meldung IF Re_Addr<>1 THEN MOUSEON FORM_ALERT (1,"[3][Fehler beim Laden der|Resource Datei !][Abbruch]") END ENDIF RETURN DEF PROC Rsc_Define_A Tree1=0 Liste=1:Show=7:Demo=6:Ende=2:Info=8 Tree2=1 Ok=5 RETURN DEF PROC Rsc_Define_B Tree1=0 Liste=1:Show=3:Info=2:Hz50=8:Hz60=9:Ende=4 Tree2=1 Ok=5 RETURN DEF PROC Box_Open MOUSEOFF Form_Center(Re_Addr,Ox,Oy,Ow,Oh) Form_Dial(0,Ox,Oy,Ow,Oh) Form_Dial(1,Ox,Oy,Ow,Oh) Objc_Draw(0,8,Ox,Oy,Ow,Oh,Re_Addr) MOUSEON RETURN DEF PROC Box_Close MOUSEOFF Form_Center(Re_Addr,Ox,Oy,Ow,Oh) Form_Dial(2,Ox,Oy,Ow,Oh) Form_Dial(3,Ox,Oy,Ow,Oh) MOUSEON RETURN DEF PROC Appl_Init: LOCAL X,Y,W,H: DIM Ctrl%(12),Intin%(128),Addrout(1) DIM Intout%(128),Ptsin%(1,128),Ptsout%(1,6),Addrin(3),Global%(15) Wi_Pok1=$64:Wi_Pok2=$6C:Wi_Pok3=$7C:Wi_Pok4=Wi_Pok2+8 Form_Dial(0,X,Y,W,H):Form_Dial(3,X,Y,W,H): PRINT CHR$(27);"f" RETURN DEF PROC Objc_Change(Intin%(0),Intin%(6),Intin%(2),Intin%(3),Intin%(4),Intin%(5),Addrin(0)) Intin%(1)=0:Intin%(7)=1 AES (47,Global%(15),Intin%(8),Addrin(1),Intout%(1),Addrout(0)) RETURN DEF PROC Objc_Draw(Intin%(0),Intin%(1),Intin%(2),Intin%(3),Intin%(4),Intin%(5),Addrin(0)) AES (42,Global%(15),Intin%(6),Addrin(1),Intout%(1),Addrout(0)) RETURN DEF PROC Form_Do(Intin%(0),Addrin(0),R Intout%(0)) AES (50,Global%(15),Intin%(1),Addrin(1),Intout%(1),Addrout(0)) RETURN DEF PROC Form_Dial(X,Intin%(5),Intin%(6),Intin%(7),Intin%(8)) IF X=0 THEN RETURN ELSE LPOKE Wi_Pok2, LPEEK(Wi_Pok2) OR 1 SHL 29 IF X=3 THEN LPOKE Wi_Pok2, LPEEK(Wi_Pok2) XOR 1 SHL 29 ELSE RETURN Intin%(1)=Intin%(5)+Intin%(7) SHR 1:Intin%(3)=1:Intin%(0)=X Intin%(2)=Intin%(6)+Intin%(8) SHR 1:Intin%(4)=1 AES (51,Global%(15),Intin%(9),Addrin(0),Intout%(1),Addrout(0)) RETURN DEF PROC Form_Center(Addrin(0),R Intout%(1),R Intout%(2),R Intout%(3),R Intout%(4)) AES (54,Global%(15),Intin%(0),Addrin(1),Intout%(5),Addrout(0)) RETURN DEF PROC Graf_Mouse(Intin%(0)) AES (78,Global%(15),Intin%(1),Addrin(1),Intout%(1),Addrout(0)) RETURN DEF PROC Rsrc_Load(Text$,R Intout%(0)):Text$=Text$+ CHR$(0) Addrin(0)= LPEEK( VARPTR(Text$))+ LPEEK( SEGPTR +28) AES (110,Global%(15),Intin%(0),Addrin(1),Intout%(1),Addrout(0)) LPOKE Wi_Pok1,Global%(5) SHL 16 OR Global%(6) RETURN DEF PROC Rsrc_Gaddr(Intin%(0),Intin%(1),R Addrout(0)) AES (112,Global%(15),Intin%(2),Addrin(0),Intout%(1),Addrout(1)) RETURN DEF PROC Rsrc_Free Form_Dial(3,0,0,1,1) IF LPEEK(Wi_Pok3) THEN LPOKE Wi_Pok2,0: LPOKE Wi_Pok4,0: LPOKE Wi_Pok3,0: LP OKE Wi_Pok1,0 IF LPEEK(Wi_Pok1) THEN Global%(5)= WPEEK(Wi_Pok1):Global%(6)= LOW( LPEEK(Wi_Pok1)): LPOKE Wi_Pok 1,0 AES (111,Global%(15),Intin%(0),Addrin(0),Intout%(1),Addrout(0)) ENDIF RETURN |
Picture Show
Picture Show (Res. 640×400, 68K Assembler, 1175 Bytes)
Kurzes Intro als Scroller (Gehversuch in Englisch), gefolgt von einer Picture Show, welche eine Auswahl von Screenshots aus Programmen zeigte, welche man bei uns tauschen konnte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
.TEXT ; ****************************************** ; ** PICTURE SHOW ** ; ** 1990 BY CLUEDO FROM THE SUPERRIDERS ** ; ** 68K-ASSEMBLER ** ; ****************************************** .DC.w $a00a move.l #f_names,f_addr movea.l sp,a0 movea.l 4(sp),a0 move.l #32256,-(sp) move.l a0,-(sp) move.w #0,-(sp) move.w #74,-(sp) trap #1 lea.l 16(sp),sp move.l #32256,-(sp) move.w #72,-(sp) trap #1 addq.l #6,sp tst.l d0 beq l_exit move.l d0,addr tst.b d0 beq.s continue clr.b d0 addi.w #$100,d0 continue: move.l d0,screen endlos: move.w #7,-(sp) trap #1 addq.l #2,sp clr.w -(sp) ;*Datei nur lesen move.l f_addr,-(sp) ;*Dateiname move.w #$3d,-(sp) ;*Open-Funktion trap #1 ;*GEMDOS-Funktion addq.l #8,sp tst.w d0 ;*Fehler ? bmi l_exit ;*Ja --> Ende move.w d0,cp_handle ;*Datei-Handle merken addi.w #13,f_addr cl_j0: pea cp_buffer ;*Pufferadresse move.l #512,-(sp) ;*Einen Sektor lesen move.w cp_handle,-(sp) ;*Datei-Handle move.w #$3f,-(sp) ;*Read-Funktion trap #1 ;*GEMDOS adda.l #12,sp ;*Stapelkorrektur tst.w d0 ;*Fehler ? bmi l_exit ;*Ja --> Ende movea.l screen,a6 ;*Startadresse move.l #32000,d2 ;*Quellbytezähler lea.l cp_buffer,a5 ;*Zeiger auf Dateipuffer move.w #2,d1 ;*Zähler für aus Puffer gelesene Bytes move.w (a5)+,d4 ;*Wert laden move.b #15,d3 ;*Zähler für Bits/Wort cl_j1: bsr code_wort ;*Lo-Nibble holen move.w d5,(a6)+ ;*merken subq.l #2,d2 ;*Zähler erniedrigen bne.s cl_j1 ;*In Schleife l_close: move.l d0,-(sp) ;*Fehlercode retten move.w cp_handle,-(sp) ;*Dateihandle move.w #$3e,-(sp) ;*Fclose trap #1 ;*Gemdos addq.l #4,sp ;*Stapelkorrektur move.l (sp)+,d0 ;*Fehlercode holen movea.l screen,a0 movea.l #$f8000,a1 move.w #3999,d4 ;*1000 Blöcke a 8x8 Pixel clr.w d2 ;*d2 löschen rbc_j1: move.w #1500,d3 ;*Zähler laden rbc_j1a: dbra d3,rbc_j1a ;*Schleife rbc_j2: move.w d2,d3 ;*d2 kopieren lsl.w #4,d2 ;*d2 mal 16 add.w d3,d2 ;*d2 + d3 addi.w #87,d2 ;*d2 + 87 andi.w #4095,d2 ;*and 4095 cmpi.w #3999,d2 ;*d2 > 3999 ? bhi.s rbc_j2 ;*Ja --> Zurück move.w d2,d3 ;*d3 = d2 ext.l d3 ;*auf 32 Bit erweitern divu.w #80,d3 ;*Durch 80 teilen move.w d3,d0 ;*Ergebnis nach d0 mulu.w #640,d0 ;*mal 640, da 8 Zeilen a 80 Bytes swap.w d3 ;*Modulo-Wert holen move.w d3,d1 ;*d3 nach d1 andi.w #1,d1 ;*Bits 1 bis 15 ausschalten add.w d1,d0 ;*Hinzuaddieren andi.w #$fffe,d3 ;*Bit 0 löschen add.w d3,d0 ;*Hinzuaddieren move.w #7,d3 ;*8 Durchläufe rbc_j3: move.b 0(a0,d0.w),d1 ;*Wert laden move.b d1,0(a1,d0.w) ;*Wert schreiben move.b 2(a0,d0.w),d1 ;*Wert laden move.b d1,2(a1,d0.w) ;*Wert schreiben move.b 4(a0,d0.w),d1 ;*Wert laden move.b d1,4(a1,d0.w) ;*Wert schreiben move.b 6(a0,d0.w),d1 ;*Wert laden move.b d1,6(a1,d0.w) ;*Wert schreiben addi.w #80,d0 ;*Nächste Zeile dbra d3,rbc_j3 ;*Schleife dbra d4,rbc_j1 ;*Zurück rbc_j4: bra endlos l_exit: move.l addr,-(sp) move.w #73,-(sp) trap #1 addq.l #6,sp move.w #7,-(sp) trap #1 addq.l #2,sp .DC.w $a009 clr.w -(sp) trap #1 ;* Code -> Nibble - Routine. ;* Ergebnisparameter: D5 -> Geholtes Nibble code_wort: btst #15,d4 ;*Bit 15 = 0 ? bne.s cw_j1 ;*Nein --> Weiter clr.w d5 ;*Wort = 0 clr.w d6 ;*1 Bit bra.s schieben ;*Schieben und Ende cw_j1: btst #14,d4 ;*Bit 14 = 0 ? bne.s cw_j2 ;*Nein --> Weiter move.w #$ffff,d5 ;*Wort = $ffff move.w #1,d6 ;*1 Bit bra.s schieben ;*Schieben und Ende cw_j2: move.w #1,d6 ;*2 Bits rotieren bsr.s schieben ;*Aufrufen move.w d4,d5 ;*Wert nach d5 move.w #15,d6 ;*16 Bits rotieren schieben: move.w (a5),d0 cn_j3: roxl.w #1,d0 ;*Linksrotieren roxl.w #1,d4 ;*Wert linksrotieren dbra d3,cn_j4 ;*Bitzähler erniedrigen und ggf. weiter move.w #15,d3 ;*Zähler zurücksetzen addq.l #2,a5 move.w (a5),d0 ;*Neuen Wert laden addq.w #2,d1 ;*Erhöhe Zähler für Pufferbyte cmpi.w #512,d1 ;*d1=512 ? bne.s cn_j4 ;*Nein --> Weiter movem.l d0-d2/a0-a2,-(sp) move.l #cp_buffer,-(sp) ;*Pufferadresse move.l #512,-(sp) ;*Einen Sektor lesen move.w cp_handle,-(sp) ;*Datei-Handle move.w #$3f,-(sp) ;*Read-Funktion trap #1 ;*GEMDOS adda.l #12,sp ;*Stapelkorrektur tst.w d0 ;*Fehler aufgetreten ? bpl.s r_ok ;*Nein --> Weiter adda.l #28,sp ;*Stapelkorrektur bra l_close ;*Abbruch r_ok: movem.l (sp)+,d0-d2/a0-a2 clr.w d1 ;*Zähler für Pufferbyte löschen movea.l #cp_buffer,a5 move.w (a5),d0 cn_j4: dbra d6,cn_j3 ;*In Schleife move.w d0,(a5) ;*Wert zurückschreiben clr.l d0 ;*Kein Fehler rts ;*Ende ; Notwendige Puffer .DATA ; 0123456789abc f_names: .DC.b "CLUEDO01.YYY",0 .DC.b "CLUEDO02.YYY",0 .DC.b "CLUEDO03.YYY",0 .DC.b "CLUEDO04.YYY",0 .DC.b "CLUEDO05.YYY",0 .DC.b "CLUEDO06.YYY",0 .DC.b "CLUEDO07.YYY",0 .DC.b "CLUEDO08.YYY",0 .DC.b "CLUEDO09.YYY",0 .DC.b "CLUEDO10.YYY",0 .DC.b "CLUEDO11.YYY",0 .DC.b "CLUEDO12.YYY",0 .EVEN .BSS cp_buffer: .DS.b 512 ;*Speicherbuffer .EVEN cp_handle: .DS.w 1 ;*Datei-Handle f_addr: .DS.l 1 addr: .DS.l 1 screen: .DS.l 1 cp_fname: .DS.l 1 ;*Dateiname cp_start: .DS.l 1 ;*Startadresse cp_length: .DS.l 1 ;*Länge .EVEN |
Fight Demo
Fight Demo (Res. 640×400, 68K Assembler, 3095 Bytes)
Kleine Demo die ich dazumal vor allem geschrieben hatte, weil es keine für den SW-Modus gab. (Englisch war immer noch nicht besser)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 |
.TEXT ; ****************************************** ; ** FIGHT DEMO ** ; ** 1990 BY CLUEDO FROM THE SUPERRIDERS ** ; ** 68K-ASSEMBLER ** ; ****************************************** .MACRO super_v clr.l -(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp .ENDM .MACRO print addr_1 pea \1 move.w #9,-(sp) trap #1 addq.l #6,sp .ENDM .MACRO malloc wert move.l \1,-(sp) move.w #$48,-(sp) trap #1 addq.l #6,sp .ENDM .MACRO open file clr.w -(sp) ;File_open pea \1 move.w #$3d,-(sp) trap #1 addq.l #8,sp move.w d0,handle tst.w d0 bmi ende .ENDM .MACRO read addr_2,long move.l \1,-(sp) ;File_read move.l \2,-(sp) move.w handle,-(sp) move.w #$3f,-(sp) trap #1 adda.l #12,sp tst.w d0 bmi ende .ENDM .MACRO close move.w handle,-(sp) ;File_close move.w #$3e,-(sp) trap #1 addq.l #4,sp tst.w d0 bmi ende .ENDM .MACRO COPY qx1,qy1,qx2,qy2 movem.l d0-d2/a0-a2,-(sp) .DC.w $a000 ;Init -> Parameterblock clr.w 116(a0) ;Opaque-Modus movea.l 12(a0),a1 ;Zeiger auf PTSIN-Feld move.w #\1,(a1) ;qx1 move.w #\2,2(a1) ;qy1 move.w #\3,4(a1) ;qx2 move.w #\4,6(a1) ;qy2 move.w #282,8(a1) ;zx1 move.w #218,10(a1) ;zy1 move.w #492,12(a1) ;zx2 move.w #348,14(a1) ;zy2 movea.l 4(a0),a1 ;Zeiger auf CONTRL-Feld move.l #qmfdb,14(a1) ;Quell-MFDB move.l #zmfdb,18(a1) ;Ziel-MFDB movea.l 8(a0),a1 ;Zeiger auf INTIN-Feld move.w #3,(a1) ;" Z = Q "-Modus .DC.w $a00e ;Raster kopieren movem.l (sp)+,d0-d2/a0-a2 .ENDM super_v .DC.w $a00a print cls move.w #4,-(sp) ;Xbios 4 trap #14 ;Wenn Auflösung nicht in monochrom, addq.l #2,sp ;dann beenden ! cmpi.w #2,d0 bne ende move.w #2,-(sp) trap #14 addq.l #2,sp move.l d0,physbase movea.l sp,a5 movea.l 4(a5),a5 move.l #180000,-(sp) ;Gesamtgrösse des Programms move.l a5,-(sp) ;Speicherb. für nachl. PRG zeichen clr.w -(sp) ;"zero" muss immer auf 0 sein move.w #$4a,-(sp) ;Set Block trap #1 adda.l #12,sp malloc #170000 tst.l d0 beq ende move.l d0,control pea env pea com pea file_e clr.w -(sp) move.w #$4b,-(sp) trap #1 adda.l #16,sp move.l control,d0 tst.b d0 beq continue clr.b d0 addi.w #$100,d0 continue: move.l d0,speicher addi.l #32000,d0 move.l d0,bild_2 addi.l #32000,d0 move.l d0,bild_3 addi.l #32000,d0 move.l d0,bild_4 move.l bild_3,qmfdb move.l physbase,zmfdb open file_b read speicher,#32000 ;Scroll Bild close open file_d read bild_2,#32000 ;bild_2 = Reset Bild close open file_c read bild_3,#32000 ;Animations Bild close open file_a read bild_4,#32000 ;Screen Bild close movea.l bild_4,a0 ;Quelladresse movea.l physbase,a1 ;Zieladresse move.l #255999,d0 ;anzahl Bits clr.l d1 ;Counter auf 0 rnd: move.l d1,d2 ;Pixel in d2 lsl.l #4,d1 ;Pixel * 16 add.l d2,d1 ;Pixel + d2 addi.l #87,d1 ;Pixel + 87 andi.l #262143,d1 ;AND 262143 cmpi.l #255999,d1 ;d1 > 255999 bhi.s rnd ;ja -> rnd move.l d1,d3 move.l d3,d4 lsr.l #3,d3 andi.l #7,d4 btst d4,0(a0,d3.w) bne set_bit bclr d4,0(a1,d3.w) bra counter set_bit: bset d4,0(a1,d3.w) counter: subq.l #1,d0 tst.l d0 bne rnd move.l #initb_1,$42a move.l #$31415926,$426 move.l speicher,scr78_f move.l speicher,d0 addi.l #38400,d0 move.l d0,scr78_e move.l physbase,scrF8 move.l physbase,scrF8_e addi.l #32000,scrF8_e move.w #400,d1 movea.l scr78_f,a0 movea.l scrF8,a1 loop_a: movem.l (a0),d4-d7 movem.l d4-d7,(a1) lea.l 16(a0),a0 lea.l 80(a1),a1 dbra d1,loop_a move.l a0,scr78_f lea.l $456,a0 movea.l (a0),a0 adda.l #4,a0 move.l #new_vbl,(a0) move.l physbase,d0 addi.l #16,d0 move.l d0,screen move.l #inita_1,36 move.w sr,d0 bset #15,d0 move.w d0,sr loop_z: COPY 1,1,212,132 COPY 214,1,425,132 COPY 427,1,638,132 COPY 1,134,212,265 COPY 214,134,425,265 COPY 427,134,638,265 COPY 1,267,212,398 COPY 214,267,425,398 COPY 427,267,638,398 COPY 214,267,425,398 COPY 1,267,212,398 COPY 427,134,638,265 COPY 214,134,425,265 COPY 1,134,212,265 COPY 427,1,638,132 COPY 214,1,425,132 bra loop_z ende: print antwort move.w #7,-(sp) trap #1 addq.l #2,sp super_v clr.w -(sp) trap #1 inita_1: movea.l scrF8,a2 movem.l 80(a2),d4-d7 movem.l d4-d7,(a2) lea.l 80(a2),a2 move.l a2,scrF8 cmpa.l scrF8_e,a2 bne.s inita_1 move.l physbase,scrF8 movea.l scr78_f,a2 movem.l (a2),d4-d7 movea.l scrF8_e,a3 movem.l d4-d7,(a3) lea.l 16(a2),a2 move.l a2,scr78_f cmpa.l scr78_e,a2 beq.s inita_2 rte inita_2: move.l speicher,scr78_f rte new_vbl: movea.l screen,a4 movea.l physbase,a5 adda.l #11040,a5 move.w #3,d0 inv_loop: eori.l #$ffffffff,(a4)+ eori.l #$ffffffff,(a4)+ eori.l #$ffffffff,(a4)+ eori.l #$ffffffff,(a4)+ dbra d0,inv_loop cmpa.l a5,a4 blt.s weiter movea.l physbase,a4 weiter: adda.w #16,a4 move.l a4,screen rts initb_1: move.b #$02,$ff8260 movea.l #bild_2,a0 move.b 1(a0),$ff8201 move.b 2(a0),$ff8203 clr.l $426 initb_2: bra initb_2 qmfdb: .DC.l 0 .DC.w 640,400 .DC.w 40 .DC.w 0 .DC.w 1 .DC.w 0,0,0 zmfdb: .DC.l 0 .DC.w 640,640 .DC.w 40 .DC.w 0 .DC.w 1 .DC.w 0,0,0 cls: .DC.b 27,"E" .DC.b 27,"f",0 antwort: .DC.b 10,10,13 .DC.b " Allgemeiner Fehler !",10,10,13 .DC.b " Prüfe ob:",10,13 .DC.b " - Die Auflösung hoch ist",10,13 .DC.b " - Genügend RAM, mind. 170 KB",10,13 .DC.b " - (Ramdisk, kein direkter Aufruf)",10,13 .DC.b " - Accesoirs und Interrupt gelöscht",10,13 .DC.b " - Ob alle Files vorhanden sind",10,13 .DC.b " - Der Computer eingeschaltet ist",10,10,10,13 .DC.b " Drücke eine Taste um zum Desktop zurück zu kehren",0 file_a: .DC.b "RIDERS_1.XXX",0 file_b: .DC.b "RIDERS_2.XXX",0 file_c: .DC.b "RIDERS_3.XXX",0 file_d: .DC.b "RIDERS_4.XXX",0 file_e: .DC.b "RIDERS_5.XXX",0 .EVEN com: .DC.l 0 env: .DC.l 0 .BSS scr78_f: .DS.l 1 scrF8: .DS.l 1 scrF8_e: .DS.l 1 handle: .DS.w 1 screen: .DS.l 1 speicher: .DS.l 1 scr78_e: .DS.l 1 physbase: .DS.l 1 bild_2: .DS.l 1 bild_3: .DS.l 1 bild_4: .DS.l 1 control: .DS.l 1 .END |
Nun für ehemalige ST-Geeks findet sich ein sehr umfangreiches ST-Software Archiv unter folgender URL:
https://ia801904.us.archive.org/zipview.php?zip=/34/items/Atari_ST_TOSEC_2012_04_23/Atari_ST_TOSEC_2012_04_23.zip