           .globl chess
;
; Ausgabe aller moeglichen Positionen eines Springers auf einem
; Schachbrett nach einem Zug.
; Aufruf mit JSR PC,CHESS, Parameteruebergabe ber den Stack:
; 1. Argument - Zeiger auf Position des Springers, dargestellt als
;               zweistellige Oktalzahl ij
; 2. Argument - Zeiger auf "Schachbrett", zeilenweise von oben nach
;               unten abgespeichert, 1 Byte pro Feld
;
chess:     mov  @2(sp),r0   ; hole Anfangsposition
           mov  4(sp),board ; hole Zeiger auf Schachbrett
;
; Das Schachbrett wird mit Leerzeichen initialisiert.
;
           mov  #64.,r1     ; Zaehler, 64 Felder (dezimal)
           mov  board,r5    ; R5 zeigt auf das erste Feld des Schachbretts
init:      movb #' ,(r5)+
           sob  r1,init     ; wiederhole, bis alle Felder gefuellt sind
;
; Die Zahl ij in R0 wird in ihre Komponenten i und j zerlegt und in
; R0 bzw. R1 abgelegt. Die i-Komponente bleibt dabei an der 8er-Stelle.
;
           mov  r0,r1       ; bringe ij nach R1
           ash  #-3,r0      ; isoliere i durch Rechtsshift um 3 Stellen
           bic  #70,r1      ; isoliere j durch Lschen der Bits 3 bis 5
;
; In der folgenden Schleife LOOP werden die neun theoretischen Positionen
; des Springers (inklusive Anfangposition) berechnet. Falls sie noch auf
; dem Brett liegen, werden sie durch einen Stern (*) markiert.
; Um R0 und R1 nicht zu zerstoeren, werden R2 und R3 fr die i- bzw.
; j-Position benutzt.
;
           mov  #jump,r4    ; Zeiger auf Sprungtabelle
loop:      mov  r0,r2       ; R2 := i
           mov  r1,r3       ; R3 := j
           add  (r4)+,r2    ; Berechne neue Position ii,jj mit den Offsets
           add  (r4)+,r3    ;   aus der Sprungtabelle
           mov  r2,r5       ; R5 := ii
           bis  r3,r5       ; R5 := ii OR jj
           bic  #7,r5       ; drei Bits rechts ausmaskieren
           bne  nostar      ; kein Stern, falls nicht 0 <= ii,jj <= 7
;
; Wenn das Programm hier angelangt ist, muss ein Stern plaziert werden.
; Die Adresse ergibt sich einfach durch Addition vom (ii * 8) + jj zur
; Adresse des ersten Feldes:
;
           ash  #3,r2       ; ii := ii * 8
           mov  board,r5    ; R5 zeigt auf das Feld 0,0
           add  r2,r5       ; R5 zeigt auf das Feld ii,0
           add  r3,r5       ; R5 zeigt auf das Feld ii,jj
           movb #'*,(r5)
;
; Schleifenende: Falls das Ende der Sprungtabelle erreicht wurde,
; wird abgebrochen, ansonsten die naechste Position berechnet.
;
nostar:    cmp  r4,#jumpend
           bne  loop
           rts  pc
;
; Datenbereich
;
jump:      .word   0,0,   1,2,   1,-2,   2,1,   2,-1
           .word         -1,2,  -1,-2,  -2,1,  -2,-1
jumpend:
                            ; Tabelle der Sprungoffsets
board:     .blkw   1        ; Startadresse des "Schachbretts"
           .end
