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
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 **************