Steel Slab

Auf nur einer einzigen Bildschirmseite läßt sich »Steel Slab«, das ideale Pausenspiel, unterbringen. Es ist vollständig in Maschinensprache geschrieben, arbeitet mit Sprites und Soft-Scrolling, benötigt einen Joystick und dürfte gerade richtig sein, um sich eben mal abzureagieren.

Geben Sie »Steel Slab« (Listing 1) mit dem MSE ein. Beim anschließenden Laden werden Sie feststellen, daß es sich um ein Basic-Programm handelt, das überwiegend aus PRINT-Zeilen besteht. Da deren Inhalt aber kaum fehlerfrei abgetippt werden kann, haben wir das Programm als MSE-Listing abgedruckt. Gestartet wird »Steel Slab« dennoch mit RUN. Um die erste Runde zu starten, drücken Sie bitte die RETURN-Taste. Die Spielhandlung besteht im beständigen Abschießen eines entgegenkommenden Balls. Die Steuerung übernimmt ein Joystick im Port 2. Beim Zusammenprall der beiden auf dem Bildschirm befindlichen Objekte wird das Spiel bis zum erneuten Betätigen der RETURN-Taste angehalten. Für Maschinensprache-Interessierte ist in Listing 2 der Objekt-Code abgedruckt. Einzelne Routinen wie zum Beispiel der Sound lassen sich durchaus in eigenen Programmen verwenden.

(P. Fröhlich/og)
PROGRAMM : STEEL SLAB     0801 0B7B
-----------------------------------
0801 : 4F 08 00 00 99 22 93 97   7D
0809 : 12 29 92 44 12 20 92 5F   08
0811 : 12 44 92 DF 12 45 92 A0   BD
0819 : 12 29 92 45 12 20 A2 44   42
0821 : 92 DA 12 45 92 DB 12 29   F0
0829 : 92 CD 12 20 92 21 12 C8   37
0831 : 44 92 D9 12 45 92 D8 20   04
0839 : 12 3F 23 92 CC CB 21 12   DA
0841 : 40 92 40 40 12 40 92 40   D0
0849 : 40 12 40 22 3B 00 9D 08   21
0851 : 01 00 99 22 92 40 40 12   4D
0859 : 4C 92 40 40 12 4C 92 40   55
0861 : 42 AC 40 41 DC 40 51 BD   C2
0869 : 40 52 12 2D 92 40 2A AA   26
0871 : 40 2A AA 30 2A BA 30 12   D4
0879 : 2A 92 BA 12 30 2A 92 BE   F9
0881 : 12 30 92 2A BE 12 B0 92   FA
0889 : 4F 12 BF BC 92 4F 12 BF   D4
0891 : BC 92 43 12 BF B0 92 40   F6
0899 : 42 22 3B 00 EB 08 02 00   C2
08A1 : 99 22 12 20 92 40 46 A8   6A
08A9 : 40 59 12 5A 92 40 25 DA   DB
08B1 : 40 12 55 92 AA 12 40 25   28
08B9 : 92 DA 12 40 59 2A 40 26   79
08C1 : 92 AA 12 40 2A 2A 40 2A   7E
08C9 : 2A 30 92 2A 12 2A BC 92   80
08D1 : 2A 12 2A BC 92 4A 12 2B   41
08D9 : BC 92 42 12 2F BF 92 40   6D
08E1 : 12 BF BF 92 40 12 BF 22   ED
08E9 : 3B 00 39 09 03 00 99 22   6F
08F1 : BF 92 40 12 BF BF 92 40   10
08F9 : 12 BF BF 92 40 3F 12 BC   ED
0901 : 92 40 3F 12 BC 92 40 4F   C5
0909 : 12 B0 92 40 12 C0 C0 C0   CC
0911 : C0 C0 BF C0 C0 2C C8 2C   22
0919 : C8 2C 92 40 40 40 40 40   2C
0921 : 40 40 40 40 40 40 40 53   47
0929 : 40 40 40 47 43 40 58 40   9A
0931 : 40 40 47 40 40 22 3B 00   6D
0939 : 87 09 04 00 99 22 40 40   72
0941 : 40 40 40 40 41 40 4E 4E   A5
0949 : 45 40 4A 40 40 55 40 12   1D
0951 : D0 92 40 12 C0 92 40 40   DF
0959 : 12 41 92 40 12 B0 92 40   2A
0961 : 4B 40 40 21 40 12 B0 92   7D
0969 : 40 4D 12 B2 5F 20 41 4C   BF
0971 : B8 92 47 12 C8 4C B9 92   81
0979 : 47 12 C8 4C BA 92 47 12   06
0981 : 29 92 4B 22 3B 00 D5 09   28
0989 : 05 00 99 22 12 4D 92 21   51
0991 : 12 D0 92 20 C4 12 A5 20   68
0999 : 92 CA 12 29 92 40 12 59   60
09A1 : 92 3F 20 12 48 D0 BA 39   86
09A9 : 92 48 21 12 59 92 40 12   39
09B1 : D0 C8 C0 92 2A 12 D0 B5   4A
09B9 : 29 92 50 12 4D 92 D5 20   83
09C1 : 12 4D 92 D8 20 4A 12 4D   71
09C9 : 92 DB 20 12 29 92 41 12   E4
09D1 : 4D 22 3B 00 23 0A 06 00   99
09D9 : 99 22 92 D6 20 12 4D 92   F0
09E1 : D9 20 4A 12 4D 92 DC 20   BC
09E9 : 12 20 92 59 12 39 92 31   73
09F1 : 21 12 59 BF D3 48 D0 B7   9C
09F9 : 2E 92 47 21 12 20 92 47   61
0A01 : 12 39 BF 92 20 12 59 92   0F
0A09 : 40 21 12 48 D0 B7 4E 92   91
0A11 : 40 21 12 20 92 48 20 12   7B
0A19 : 33 AE 48 D0 BA 2D 92 22   73
0A21 : 3B 00 71 0A 07 00 99 22   15
0A29 : 41 12 D0 4D 92 4F 12 D4   E7
0A31 : C9 92 20 12 50 92 47 12   69
0A39 : A9 92 43 12 4D 92 41 12   D1
0A41 : D0 D0 92 45 12 29 92 40   FC
0A49 : 12 4D 92 4F 12 D4 2D 92   32
0A51 : 40 12 DC 2A 92 29 50 12   EF
0A59 : D0 92 4A 12 29 92 40 12   94
0A61 : 4D 92 5E 12 D0 29 C8 4D   E5
0A69 : 92 41 12 D0 4A 22 3B 00   DD
0A71 : BF 0A 08 00 99 22 92 29   7F
0A79 : 44 12 D0 92 4A 12 2C 92   58
0A81 : 42 12 D0 C0 92 DA 12 50   01
0A89 : 92 43 12 CE 92 42 12 D0   40
0A91 : 4A 92 29 48 12 D0 92 4A   FE
0A99 : 12 2C 92 42 12 D0 C0 BA   CE
0AA1 : 30 92 43 12 AE 92 42 12   DA
0AA9 : D0 2C 92 42 12 D0 4C 92   7A
0AB1 : 40 12 D0 2D 92 44 12 DC   21
0AB9 : C9 92 48 22 3B 00 0D 0B   20
0AC1 : 09 00 99 22 12 30 92 46   EE
0AC9 : 12 25 92 42 C9 12 40 45   13
0AD1 : 92 42 12 25 92 42 30 4C   42
0AD9 : 12 2D 92 44 12 D0 C9 92   A3
0AE1 : DA 12 B0 AF CE 92 44 12   9D
0AE9 : D0 D0 92 4A 12 2D 92 44   6D
0AF1 : 12 D0 C9 BA 30 A3 AE 92   35
0AF9 : 44 12 D0 AE 92 45 12 D0   8D
0B01 : 2D 92 5E 12 D0 28 92 29   3C
0B09 : 41 22 3B 00 52 0B 0A 00   D0
0B11 : 99 22 12 B0 92 4D 12 29   84
0B19 : 92 48 12 4D 92 45 12 D0   3B
0B21 : 4D 92 41 12 D0 4D 92 5E   C8
0B29 : 12 D0 D0 92 4E 12 58 92   26
0B31 : 29 42 12 B0 92 49 12 25   1C
0B39 : CB C9 92 41 12 D0 BA 92   6D
0B41 : CC CB 21 CC 12 58 92 21   45
0B49 : 22 3A 92 31 39 38 2C 31   BC
0B51 : 00 79 0B 0B 00 9E 34 AE   55
0B59 : 35 3A 53 54 45 45 4C 20   FB
0B61 : 53 4C 41 42 20 42 59 20   2D
0B69 : 50 45 54 45 52 20 46 52   FD
0B71 : 4F 45 48 4C 49 43 48 00   CE
0B79 : 00 00                     E6
Listing 1. »Steel Slab« geben Sie bitte mit dem MSE ein. Gestartet wird das Spiel dann mit RUN.
start    * = $2040     ;programmstart
puff1    * = * + $40   ;puffer fuer spi
puff2    * = * + $0a   ;a bytes von sp2

;************* jet-sprite *************

sp2 .byte           %10000000,%00000000
    .byte %00000000,%10000000,%00000000
    .byte %00000000,%10000000,%00000000
    .byte %00000000,%10001100,%00000000
m1  .byte %00000000,%10001100,%00000000
    .byte %00000010,%01101100,%00000000
    .byte %00000001,%01011100,%00000000
    .byte %00010001,%01111101,%00000000
    .byte %00010010,%10101101,%00000000
    .byte %00101010,%01101010,%00000000
    .byte %00101010,%01101010,%00110000
    .byte %00101010,%01111010,%00110000
    .byte %10101010,%01111010,%10110000
    .byte %10101010,%01111110,%10110000
    .byte %00101010,%01111110,%11110000
    .byte %00001111,%11111111,%11111100
    .byte %00001111,%11111111,%11111100
    .byte %00000011,%11111111,%11110000
    .byte %00000000

;************ kugel-sprite ************

sp3 .byte %00000010,%10100000,%00000000
    .byte %00000110,%01101000,%00000000
    .byte %00011001,%10011010,%00000000
    .byte %00100101,%01011010,%00000000
    .byte %10010101,%01101010,%10000000
    .byte %10100101,%01011010,%10000000
    .byte %10011001,%10101010,%10000000
    .byte %10100110,%01101010,%10000000
    .byte %10101010,%10101010,%10000000
    .byte %10101010,%10101010,%10110000
    .byte %00101010,%10101010,%11111100
    .byte %00101010,%10101010,%11111100
    .byte %00001010,%10101011,%11111100
    .byte %00000010,%10101111,%11111111
    .byte %00000000,%11111111,%11111111
    .byte %00000000,%11111111,%11111111
    .byte %00000000,%11111111,%11111111
    .byte %00000000,%11111111,%11111111
    .byte %00000000,%00111111,%11111100
    .byte %00000000,%00111111,%11111100
    .byte %00000000,%00001111,%11110000
    .byte %00000000

;*********** gitter-zeichen ***********

ze1 .byte %11000000     ;gitter
    .byte %11000000
    .byte %11000000
    .byte %11000000
    .byte %11000000
    .byte %11000000
    .byte %11000000
    .byte %11000000
    .byte %11111111

;********* label definitionen *********

v        =    $d000     ;vic-register
si       =    $d400     ;sid-register
form1    =    2040      ;spritepointer1
form2    =    2041      ;spritepointer2
form3    =    2042      ;spritepointer3
clr      =    $e544     ;clear screen
x1       =    v+0       ;laser x-pos.
y1       =    v+1       ;laser y-pos.
x2       =    v+2       ;jet   x-pos.
x3       =    v+4       ;kugel x-pos.
y3       =    v+5       ;kugel y-pos.
joy      =    $dc00     ;joystick-port2
kolli    =    v+30      ;sprite-sprite
zufall   =    $dc04     ;zufallszahl
flag     =    $02       ;rechts-links
milli    =    $eeb3     ;warten

;**************** daten ***************

;vic-daten                     register

data1    .byte 172,200,172,200 ; 0- 3
         .byte 172,000,000,000 ; 4- 7
         .byte 000,000,000,000 ; 8-11
         .byte 000,000,000,000 ;12-15
         .byte $00,$13,000,000 ;16-19
         .byte 000,$07,$03,$00 ;20-23
         .byte $18,$00,$00,$00 ;24-27
         .byte $07,$00,$00,$00 ;28-31
         .byte 000,000,000,000 ;32-35
         .byte 000,001,000,014 ;36-39
         .byte 014,005         ;40-42

;sid-daten                     register

data2    .byte %00000000,%00001010 ;0
         .byte %00000000,%00000000 ;2
         .byte %00010101           ;4
         .byte %00000000           ;5
         .byte %11010000           ;6
         .byte %00000000,%11000000 ;7
         .byte %00000000,%00000000 ;9
         .byte %10000001           ;11
         .byte %00000000           ;12
         .byte %11110000           ;13
         .byte %00000000,%00001011 ;14
         .byte %00000000,%00000000 ;16
         .byte %00100001           ;18
         .byte %00000000           ;19
         .byte %11110000           ;20
         .byte %00000000,%00001101 ;21
	 .byte %11110010           ;34
         .byte %10011111           ;24

;************* bildaufbau ************

bildauf  ldy  #129      ;laser (sp1)
         sty  form1     ;
         iny            ;jet   (sp2)
         sty  form2     ;
         iny            ;kugel (sp3)
         sty  form3     ;

         lda  #11       ;hintergrund-
         sta  v+33      ;farbe = grau

         jsr clr        ;grid plotten

;************ sp1 aufbauen ************

setup    ldy  #74       ;74 bytes
         lda  #$00      ;loeschen
loop1    sta  puff1-1,y ;
         dey            ;
         bne  loop1     ;
loop2    lda  data1  ,y ;vic
         sta  v      ,y ;initialisieren
         iny            ;
         cpy  #42       ;alle 42 daten?
         bne  loop2     ;jmp wenn nein

         lda  #%00010000 ;weiss
         sta  m1   -64  ;
         sta  m1+3 -64  ;
         asl            ;hellblau
         sta  m1+6 -64  ;
         lda  #%00000001 ;weiss
         sta  m1+1 -64
         sta  m1+4 -64  ;
         asl            ;hellblau
         sta  m1+7 -64  ;

;********* sid mit daten laden ********

sid      ldy  #25       ;24 daten
m2       lda  data2-1,y ;von  data2
         sta  si   -1,y ;nach si
         dey            ;y = 0 ?
         bne  m2        ;jmp wenn nein

;************** y-scroll **************

scroll   ldx  ze1+7     ;byte 7 in x
         ldy  #$07      ;7 bytes um 1
loop3    lda  ze1-1  ,y ;byte nach
         sta  ze1-0  ,y ;hinten ver—
         dey            ;schieben
         bne  loop3     ;
         stx  ze1       ;byte 0=byte 7

;*********** warteschleife ************

warten   ldy  #14       ;wartezeit
loop4    jsr  milli     ;
         dey            ;15 millisek.
         bne  loop4     ;warten

;********** joystickabfrage ***********

laser    lda  y1        ;
         sta  si+15     ;laser-sound
         cmp  #32       ;laser oben ?
         bcc  soundoff  ;jmp wenn ja
         sbc  #3        ;laser nach
         sta  y1        ;oben bewegen
         bne  shoot     ;äjmp shootü
soundoff lda  #$00      ;laser—sound
         sta  si+15     ;ausschalten
shoot    lda  joy       ;
         tax            ;
         and  #%00010000 ;feuerknopf ?
         bne  links1    ;jmp wenn nein
         lda  #%00000000 ;
         sta  kolli     ;bit O-2 auf $0
         lda  #200      ;laser unten
         sta  y1        ;positionieren
links1   txa            ;
         and  #%00000100 ;links ?
         bne  rechts1   ;jmp wenn nein
         ldy  x2        ;
         cpy  #90       ;ganz links ?
         bcc  rechts1   ;jmp wenn ja
         dec  x2        ;nach links
rechts1  txa            ;
         and  #%00001000 ;rechts ?
         bne  gleich    ;jmp wenn nein
         ldy  x2        ;
         cpy  #250      ;ganz rechts ?
         bcs  gleich    ;jmp wenn nein
         inc  x2        ;nach rechts
gleich   ldy  x2        ;x1 =
         sty  x1        ;x2

;*********** kugel bewegung ***********

kugel    lda  zufall    ;
         cmp  #08       ;zufall = 8:256
         bcs  links2    ;
invers   lda  flag      ;
         eor  #%10000000 ;invertierung
         sta  flag      ;
links2   lda  flag      ;
         bmi  rechts2   ;jmp on set
         lda  x3        ;
         cmp  #90       ;ganz links ?
         beq  invers    ;jmp wenn ja
         dec  x3        ;nach links !
         bne  unten     ;äjmp untenü
rechts2  lda  x3        ;
         cmp  #250      ;ganz rechts ?
         bcs  invers    ;jmp wenn ja
         inc  x3        ;nach rechts !
unten    inc  y3        ;nach unten !

;************* kollision **************

crash    lda  kolli     ;
         tay            ;
         and  #%00000001 ;lasertreffer?
         beq  jetcrash  ;jmp wenn nein
         lda  #$08      ;laser + kugel
         sta  y3        ;nach ganz oben
         sta  y1        ;
         sta  kolli     ;reg. loeschen
         bne  nochmal   ;äjmp nochmalü
jetcrash tya            ;
         and  #%00000010 ;jet getroffen
         beq  nochmal   ;jmp wenn nein
loop5    lda  203       ;return
         cmp  #1        ;gedrueckt ?
         bne  loop5     ;jmp wenn nein
         jmp  bildauf   ;von vorne !
nochmal  jmp  scroll    ;
;************* spielende **************
Listing 2. Das Source-Code-Listing von »Steel Slab« enthält einige nützliche Anregungen für eigene Programme
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →