title Das Spiel REVERSI name ('REVERSI') maclib BASE80.LIB ; ===== Routinen aus Bibliothek ext strbi0,crlf,condir,conino,uppcon,escchr ext conchd,decout,c16fl,flsub,fldiv,flsign ext clrscr,clreol,lowvid,norvid,gotoXY,delay ld sp,(BDOS+1) ; Stack laden jp main ; .. starten ; ===== Einige Konstanten ===== get.date equ 105 ; BDOS Funktion a_1 equ 'A'-1 comp equ 'O' man equ 'X' delimiter equ 095h horizontal equ 09ah vertical equ 085h double equ 08ah cross equ 09fh crosshair1 equ 084h crosshair2 equ 081h corner_1 equ 086h corner_2 equ 08ch corner_3 equ 083h corner_4 equ 089h left equ 082h right equ 088h status_Y equ 7 status_X equ 60 message_Y equ 24 cursor_up equ 01fh cursor_down equ 01eh cursor_left equ 001h cursor_right equ 006h exit_key equ 01bh break equ 003h free equ 0 human equ 1 computer equ 2 corner equ 3 field_type equ 4 on equ 00000001b off equ 00000000b dseg diff_z: db 0,-1,-1,-1,0,1,1,1 diff_sp: db 1,1,0,-1,-1,-1,0,1 game_board: db corner,corner,corner,corner ; Zeile 0 db corner,corner,corner db corner,corner,corner db corner,free,free,free,free ; Zeile 1 db free,free,free,free,corner db corner,free,free,free,free ; Zeile 2 db free,free,free,free,corner db corner,free,free,free,free ; Zeile 3 db free,free,free,free,corner db corner,free,free,free,human ; Zeile 4 db computer,free,free,free,corner db corner,free,free,free,computer ; Zeile 5 db human,free,free,free,corner db corner,free,free,free,free ; Zeile 6 db free,free,free,free,corner db corner,free,free,free,free ; Zeile 7 db free,free,free,free,corner db corner,free,free,free,free ; Zeile 8 db free,free,free,free,corner db corner,corner,corner,corner ; Zeile 9 db corner,corner,corner db corner,corner,corner ; ; Organisiert als : (1,1)..(1,8),...,(8,1)..(8,8) ; sw: db 128,8,32,16 ; Zeile 1 db 16,32,8,128 db 8,1,4,2 ; Zeile 2 db 2,4,1,8 db 32,4,8,4 ; Zeile 3 db 4,8,4,32 db 16,2,4,1 ; Zeile 4 db 1,4,2,16 db 16,2,4,1 ; Zeile 5 db 1,4,2,16 db 32,4,8,4 ; Zeile 6 db 4,8,4,32 db 8,1,4,2 ; Zeile 7 db 2,4,1,8 db 128,8,32,16 ; Zeile 8 db 16,32,8,128 count_arr: ds field_type machine_Y: ds 1 machine_X: ds 1 running: ds 1 not_running: ds 1 wanna_stop: db false stopping: db false regular: ds 1 cur_Y: db 1 cur_X: db 1 cseg ; ; Alarmton ausgeben ; @bell: ld a,bell call condir ; Klingeln ... ret ; ; Alarmton ausgeben und etwas warten ; beep: call @bell ; Klingeln ld hl,1000 call delay ; Warten ret ; ; Alten Cursor setzen ; restore_cursor: ld a,'k' jr .esc.out ; ; Aktuellen Cursor retten ; save_cursor: ld a,'f' ; ESCape-Sequenz ausgeben .esc.out: call escchr ret ; ; Loeschen bis Ende der Zeile ; EIN Register H haelt die X-, Register L Y- Position ; clrline: call .gotoXY ; Cursor positionieren call clreol ; Loeschen bis Ende der Zeile ret ; ; Kurze Ausgabe ueber Gebrauch der Tasten ; key_rule: ld l,1 ld h,message_Y+5 call .gotoXY ; Cursor setzen call lowvid ld de,$k.rule call strbi0 ; .. Text ausgeben call norvid ret ; dseg $k.rule: db 'Auswahl mit Cursor Tasten bis RETURN' db ' - Ende mit EXIT - Abbruch mit STOP',null cseg ; ; Zeichen als GROSSBUCHSTABEN einlesen ; AUS Akku haelt Zeichen ; get_char: call conino call uppcon ; .. GROSSBUCHSTABE ret ; ; Eingabe JA oder NEIN ; AUS Carry gesetzt wenn JA ; YES_NO: ld de,$Y_N call strbi0 Y_N.loop: call get_char cp 'J' ; Test JA jr z,Y_N.ok cp 'N' jr nz,Y_N.loop or a Y_N.ok: push af call crlf pop af scf ; Resultat setzen ret z ccf ret ; dseg $Y_N: db ' (J,N) ',null cseg ; ; Lesen eines Zeichens, Abbruch pruefen ; AUS Akku haelt Zeichen ; read_char: call get_char ; Zeichen lesen cp break ; Abbruch pruefen ret nz call save_cursor ; Cursor retten ld l,1 ld h,message_Y+5 call clrline ; Statuszeile loeschen ld de,$rd.c call strbi0 ; Meldung ausgeben call YES_NO ; Abbruch pruefen jp c,warm call key_rule ; Status zuruecksetzen call restore_cursor ; .. und den Cursor jr read_char ; dseg $rd.c: db '**** Abbruch',null cseg ; ; Copyright ausgeben ; copyright: call lowvid ld de,$cop call strbi0 call norvid call crlf ret ; dseg $cop: db 'REVERSI fuer den JOYCE ' db ' ' db 'W.Cirsovius - 1988',cr,lf,null cseg ; ; Regeln des Spiels ausgeben ; rules: call clrscr ; Bildschirm vorbereiten call copyright ; Copyright ausgeben ld de,$rul call strbi0 ; .. Regeln ausgeben call get_char ; Quittung lesen call clrscr ret ; dseg $rul: db 'Gespielt wird auf 64 Spielfeldern, ' db 'jeder Spieler besitzt 32 Steine:' db cr,lf,lf db ' Computersteine : ',comp,cr,lf db ' Eigene Steine : ',man,cr,lf,lf db 'Die Spieler setzen abwechselnd so, ' db 'dass sie einen oder mehrere ' db 'Steine des Gegners',cr,lf db 'horizontal, vertikal oder diagonal ' db 'einschliessen. Eingeschlossene ' db 'feindliche Steine',cr,lf db 'werden umgedreht und zu Steinen ' db 'eigener Farbe. Das Spiel ist beendet,' db ' wenn alle 64',cr,lf db 'Felder besetzt sind oder wenn kein ' db 'gegnerischer Stein mehr ' db 'eingeschlossen werden kann.',cr,lf db 'Bei Aufgabe bzw. keiner Setzmoeglich' db 'keit muss die EXIT Taste eingegeben ' db 'werden !',cr,lf,lf db 'Weiter mit beliebiger Taste',cr,lf,null cseg ; ; Das Spiel initiieren ; start_up: call copyright ; Copyright ausgeben ld de,$s_u call strbi0 ; Frage, ob Regeln ausgegeben werden sollen call YES_NO call c,rules ret ; dseg $s_u: db 'Spielregeln ausgeben',null cseg ; ; Spielsteine zaehlen ; count: ld ix,count_arr ld a,0 ld (ix+human),a ; Zaehler Null setzen ld (ix+computer),a ld (ix+free),a ld l,1 count.lop.1: ld h,1 count.lop.2: push hl call .game ; Inhalt des Spielfeldes holen ld c,a ld b,0 ld hl,count_arr add hl,bc inc (hl) ; .. hochzaehlen pop hl inc h ld a,h cp 8+1 jr nz,count.lop.2 inc l ld a,l cp 8+1 jr nz,count.lop.1 ld a,(ix+free) ; Test, ob Steine uebrig or a ret nz ld a,true ld (ix+free),a ; .. Ende setzen ret ; ; Kopfzeile ausgeben ; head: ld de,$head call strbi0 ; .. ausgeben ret ; dseg $head: db vertical,' ' db delimiter,' 1 ',delimiter,' 2 ' db delimiter,' 3 ',delimiter,' 4 ' db delimiter,' 5 ',delimiter,' 6 ' db delimiter,' 7 ',delimiter,' 8 ' db delimiter,' ',vertical,cr,lf,null cseg ; ; Zeichen mehrfach ausgeben auf Konsole ; EIN Register B haelt Zaehler, Register H das Zeichen ; line: ld a,h call condir ; Ausgeben djnz line ret ; ; Begrenzungszeile ausgeben ; EIN Register H,C,D,E halten die Grenzzeichen ; Register L haelt Video-Modus ; limit: bit 0,l ; Farbe testen call nz,lowvid ld a,d call condir ; Zeichen fuer linke Ecke ausgeben ld b,3 call line ; Zeichen ausgeben bit 0,l ; Farbe testen call nz,norvid ld b,8 ; Zeichen fuer ein Feld ausgeben .lim.loop: push bc ld a,c call condir ld b,5 call line pop bc djnz .lim.loop ld a,c call condir bit 0,l ; Farbe testen call nz,lowvid ld b,3 call line ; Endzeichen ausgeben ld a,e call condir ; Rechte Ecke ausgeben bit 0,l ; Farbe testen call nz,norvid call crlf ret ; ; Spielfeld ausgeben ; game_plan: ld l,1 ld h,1 call .gotoXY ; Cursor setzen call lowvid ld h,double ld c,crosshair1 ld d,corner_1 ld e,corner_2 ld l,off call limit ; Obere Begrenzung setzen call head ; Kopf ausgeben call norvid ld h,horizontal ld c,cross ld d,left ld e,right ld l,on call limit ; Naechste Grenzlinie ziehen ld l,'A' .gam.ini.lop: call lowvid ld a,l ld ($gam.1.1),a ; Beschriftung ausgeben ld ($gam.3.1),a ld de,$gam.1 call strbi0 call norvid ld b,8 .gam.ini.1: ld de,$gam.2 call strbi0 djnz .gam.ini.1 ld a,delimiter call condir call lowvid ld de,$gam.3 call strbi0 ; Rechtes Ende ausgeben call norvid call crlf push hl ld h,horizontal ld c,cross ld d,left ld e,right ld l,on call limit ; Naechste Grenzlinie ziehen pop hl inc l ld a,l cp 'H'+1 jr nz,.gam.ini.lop call lowvid call head ; Kopf nochmals ausgeben ld h,double ld c,crosshair2 ld d,corner_3 ld e,corner_4 ld l,off call limit ; Untere Begrenzung setzen call norvid call key_rule ; Bedeutung der Tasten anzeigen ret ; dseg $gam.1: db vertical $gam.1.1: db 'A',' ',null $gam.2: db delimiter,' ',null $gam.3: db ' ' $gam.3.1: db 'A',vertical,null ; cseg ; ; Aktuellen Stand ausgeben ; EIN Register C haelt Spelstein, Register H haelt die Zeile ; Register DE zeigt auf Text ; field: ld a,c cp human ld a,man jr z,..field ld a,comp ..field: push af ld l,status_X call clrline ; Cursor serzen call strbi0 ; Text ausgeben ld b,0 ld hl,count_arr add hl,bc ld a,(hl) ; Zaehler holen ld b,3 call pr.dec ; Und ausgeben ld de,$field call strbi0 ; Stand anzeigen pop af call condir ret ; dseg $field: db ' Felder ',null cseg ; ; Cursor fuer Spielfeld setzen ; EIN Register L haelt die X- und Register H die Y-Position ; game_cursor: push hl ld a,l ; .. X justieren add a,a add a,l inc a add a,a ld l,a ld a,h ; .. Y justieren inc a add a,a ld h,a call .gotoXY pop hl ret ; ; Ausgabe des Spielfeldinhalts ; print: call count ; Spielsteine zaehlen ld c,'A' pr.loop.1: ld b,8 pr.loop.2: ld a,c sub a_1 ld l,a ld h,b call .game ; Spielstein holen ld e,man cp human jr z,pr.pic ld e,comp cp computer jr z,pr.pic ld e,' ' pr.pic: ld l,b ld a,c sub a_1 ld h,a call game_cursor ; Cursor fuer das Feld setzen ld a,e call condir ; .. Spielstein setzen djnz pr.loop.2 inc c ld a,c cp 'H'+1 jr nz,pr.loop.1 call lowvid ld c,human ld h,status_Y ld de,$pr.1 call field ; Zaehlerstand anzeigen ld c,computer ld h,status_Y+2 ld de,$pr.2 call field ld l,status_X ld h,status_Y+4 call clrline ; Statuszeile loeschen ld a,(count_arr+free) cp 60 ; Test ob frei jr nc,pr.end or a jr z,pr.end ld a,(running) cp computer jr nz,pr.end ld a,(stopping) cp true jr z,pr.end ld de,$pr.3 call strbi0 ; Anzeige des Computer-Zuges ld a,(machine_Y) add a,a_1 call condir ld a,' ' call condir ld a,(machine_X) ld b,2 call pr.dec pr.end: call norvid ret ; dseg $pr.1: db 'Du hast ',null $pr.2: db 'Ich habe ',null $pr.3: db 'Mein Zug war : ',null cseg ; ; Spielsteine umwandeln ; EIN Register L haelt die Spalte, Register H die Zeile ; flip: push hl call .game ld a,(running) ld (hl),a ; Tzstand setzen pop hl ld b,8 ld ix,diff_z+7 ; Zeiger initialisieren ld iy,diff_sp+7 flip.loop: ld a,1 ld (far),a ; Faktor initialisieren ld a,(not_running) ld c,a .fl.lop.1: call @game cp c ; Gegenstuecke zaehlen jr nz,.ex.flip.1 ld a,(far) inc a ; Erhoehen ld (far),a jr .fl.lop.1 .ex.flip.1: call @game ld c,a ld a,(running) cp c ; Aktuellen Stein holen jr nz,.ex.flip.2 ld a,1 ld (far),a ; Zaehler erneuern ld a,(not_running) ld c,a .fl.lop.2: call @game ; Gegenstueck testen cp c jr nz,.ex.flip.2 ld a,(running) ld (de),a ; Auf aktuellen Stein setzen ld a,(far) inc a ; Richtung erhoehen ld (far),a jr .fl.lop.2 .ex.flip.2: dec ix dec iy djnz flip.loop ; Test ob fertig ret ; ; Test ob Zug nach Spielereingabe ok ; ; EIN Register L haelt Zeile, Register H haelt Spalte ; dseg complete: ds 1 single: ds 1 far: ds 1 ; cseg check_rule: ld a,0 ld (complete),a ; Zaehler initialisieren ld b,8 ld ix,diff_z+7 ; .. und Zeiger ld iy,diff_sp+7 .chk.loop: ld a,1 ld (far),a ld a,0 ld (single),a .chk.mode: call @game ; Inhalt suchen ld c,a ld a,(not_running) cp c jr nz,.chk.nxt ld a,(far) inc a ; Zaehler erhoehen ld (far),a ld a,(single) inc a ; Zaehler erhoehen ld (single),a jr .chk.mode .chk.nxt: call @game ; Inhalt suchen ld c,a ld a,(running) cp c jr nz,.chk.end ld a,(single) ld c,a ld a,(complete) add a,c ld (complete),a .chk.end: dec ix dec iy djnz .chk.loop ld a,(complete) ; Test ob Zug moeglich or a ld a,true jr nz,...chk ld a,false ...chk: ld (regular),a ; Resultat einstellen ret ; ; Suche nach optimalem Zug fuer Computer ; EIN Register B und C halten Zeiger auf Prioritaet ; all_directions: ld d,b ld e,c ld ix,diff_z ; Zeiger initialisieren ld iy,diff_sp ld b,8 .all.loop: ld hl,0 ld (partial),hl ; Zaehler initialisieren ld a,l ld (part_value),a ld a,1 ld (far),a call mach.x.y .all.lp.1: call .game ; Gegenstueck testen ld a,(not_running) cp (hl) jr nz,.all.end.1 ld hl,part_value inc (hl) ; Zaehler erhoehen push de ld a,d dec a add a,a ; Zeiger berechnen add a,a add a,a add a,e dec a ld e,a ld d,0 ld hl,sw add hl,de ld e,(hl) ; Wert laden ld hl,(partial) add hl,de ld (partial),hl pop de ld hl,far inc (hl) call mach.x.y jr .all.lp.1 .all.end.1: ld a,(running) ; Eigenen Stein testen cp (hl) jr nz,.all.end.2 ld hl,all_value ld a,(part_value) add a,(hl) ; Hochzaehlen ld (hl),a push de ld hl,(total) ld de,(partial) add hl,de ld (total),hl pop de .all.end.2: inc ix inc iy djnz .all.loop ret ; ; Moeglichen Zug fuer den Computer finden ; check_set: ld hl,0 ld (machine_Y),hl ; Zug loeschen ld (best_result),hl ld (best_result+2),hl ld ix,sw ; Prioritaetszeiger setzen ld b,1 .ck.lop.1: ld c,1 .ck.lop.2: ld l,b ld h,c call .game ld a,(hl) cp free ; Test ob Feld frei ist jp nz,.ck.end.1 ld hl,0 ld (ccomplete),hl ; Zaehler loeschen ld (ccomplete+2),hl ld a,l ld (all_value),a ld (total),hl push bc push ix call all_directions ; Einen Weg finden pop ix pop bc ld hl,all_value inc (hl) ; .. erhoehen ld e,(ix+0) ld d,0 ld hl,(total) add hl,de ; Prioritaetszaehler laden ld (total),hl ld a,(all_value) ; Bereich pruefen cp 1+1 jr c,.ck.end.1 push ix push bc ld hl,(total) ld de,dma call c16fl ; Zahl in Fliesskomma wandeln ld hl,(all_value) ld h,0 ld de,dma+4 call c16fl ld bc,dma ld de,dma+4 ld hl,ccomplete call fldiv ld bc,ccomplete ld de,best_result ld hl,dma call flsub ld bc,dma call flsign dec a ; Bereich pruefen jr nz,.ck.end.2 ld bc,4 ld hl,ccomplete ld de,best_result ldir ; Neuen Wert speichern pop bc pop ix ld h,c ld l,b ld (machine_Y),hl ; Zug speichern jr .ck.end.1 .ck.end.2: pop bc pop ix .ck.end.1: inc ix inc c ld a,8+1 cp c jp nz,.ck.lop.2 inc b cp b jp nz,.ck.lop.1 ret ; dseg best_result: ds 4 ccomplete: ds 4 total: ds 2 partial: ds 2 all_value: ds 1 part_value: ds 1 ; cseg ; ; Ausfuehrung des Computer-Zuges ; move_machine: ld l,1 ld h,message_Y call clrline ld de,$m.m call strbi0 ; Anzeige des Laufes ld a,human ld (not_running),a ; Spieler setzen ld a,computer ld (running),a call check_set ; Test ob Farbwechsel ld hl,(machine_Y) ld a,l or a ; Test ob erfolgreich jr z,.nomore call flip ; Steine wechseln call print ; .. neues Spielfeld ausgeben ret .nomore: ld a,true ld (stopping),a ; Ende markieren ret dseg $m.m: db 'Jetzt ziehe ich ...',null cseg ; ; Fehlermeldung ausgeben ; EIN Register DE zeigt auf Meldung ; tell_error: ld l,1 ld h,message_Y call .gotoXY ; Cursor setzen call strbi0 ; Text ausgeben call beep ret ; ; Eingabe Spielerzug ; input_move: ld l,1 ld h,message_Y call clrline ; Textausgabe loeschen ld de,(cur_Y) ld l,d ld h,e call game_cursor ; Spielfeld-Cursor setzen call read_char ; Eingabe holen ld ix,cur_Y cp cursor_up jr nz,.cursor_down ld a,1 cp (ix+0) ; Obere Grenze testen jr z,do.bell dec (ix+0) ; Neue Grenze setzen jr input_move do.bell: call @bell ; Fehler anzeigen jr input_move .cursor_down: cp cursor_down jr nz,.cursor_left ld a,8 cp (ix+0) ; Untere Grenze testen jr z,do.bell inc (ix+0) ; Neue Grenze setzen jr input_move .cursor_left: cp cursor_left jr nz,.cursor_right ld a,1 cp (ix+1) ; Linke Grenze testen jr z,do.bell dec (ix+1) ; Neue Grenze setzen jr input_move .cursor_right: cp cursor_right jr nz,.cr ld a,8 cp (ix+1) ; Rechte Grenze testen jr z,do.bell inc (ix+1) ; Neue Grenze setzen jr input_move .cr: cp cr jr nz,.exit_key ld hl,(cur_Y) ld (act_row),hl ; Cursor holen call .game ; Test ob Feld frei ist cp free ret z ld de,.in.ill call tell_error ; Fehler ausgeben jr input_move .exit_key: cp exit_key jr nz,input_move ld a,true ld (wanna_stop),a ; Abbruch setzen ret ; dseg .in.ill: db '** Besetzt',null ; cseg ; ; Spielerzug ausfuehren ; my_move: ld a,computer ld (not_running),a ; Marken setzen ld a,human ld (running),a ld a,false ld (regular),a my_loop: ld a,(regular) cp true jr z,my_end ; Ende testn call input_move ; Zug holen ld a,(wanna_stop) cp true ; Test Abbruch ret z ld hl,(act_row) call check_rule ; Test Regel jr my_loop my_end: ld hl,(act_row) call flip ; Steine wechslen call print ; .. und Resultat ausgeben ret ; dseg act_row: ds 1 act_col: ds 1 ; cseg ; ; Ersten Zug ausfuehren ; first_move: ld de,dma ld c,get.date call BDOS ; Sekundenwert der Maschine laden cp 030h ; .. Sekunden pruefen call nc,my_move ret ; ; Endstand ausgeben ; tell_result: ld l,1 ld h,message_Y call clrline ; Status loeschen ld l,1 ld h,message_Y+5 call clrline call print ; Spielfeld zum letzten Mal ausgeben ld l,1 ld h,message_Y call .gotoXY ; Status setzen ld a,(stopping) ; Abbruch testen cp true ld de,$tel.1 call nz,..tell.it ; .. anzeigen ld a,(count_arr+computer) ld b,a ld a,(count_arr+human) cp b ; Gewinner ermitteln ld de,$tel.2 jr z,..tell.it ld de,$tel.3 jr c,..tell.it ld de,$tel.4 ..tell.it: call strbi0 ; .. und anzeigen call crlf ret ; dseg $tel.1: db 'Schade drum ... Das Ergebnis ist :',null $tel.2: db '*** Remis ! ***',null $tel.3: db '*** Ich habe gewonnen ! ***',null $tel.4: db 'Gratuliere, Du hast gewonnen',null ; cseg ; ; Hauptteil beginnt hier ; main: call clrscr ; Bildschirm loeschen call start_up ; Startbedingungen setzen call clrscr call game_plan ; Spielfeld aufbaue call print ; .. und ausgeben call first_move ; Den ersten Zug holen game.loop: ld a,(wanna_stop) ; Test Abbruch durch Spieler cp true jr z,end.game ld a,(stopping) ; Test regulaeres Ende cp true jr z,end.game call move_machine ; Maschine zieht call count ; Steine zaehlen ld a,(stopping) ; Test regulaeres Ende cp true jr z,end.game call my_move ; Spieler zieht jr game.loop end.game: call tell_result ; Endstand ausgeben jp warm ; ; ===== Einige "nuetzliche" Routinen ===== ; ; Cursor positionieren ; EIN Register H,L halten die Y,X-Position ; .gotoXY: dec h ; Justieren fuer LIB-Routine dec l call gotoXY ret ; ; Inhalt eines Spielfeldes ermitteln ; EIN Register L haelt Zeile, Register H Spalte ; AUS Akku haelt Inhalt, Register HL zeigt auf das Feld ; .game: ld a,l add a,a ; * 2 add a,a ; * 4 add a,l ; * 5 add a,a ; *10 add a,h ; Relativen Zeiger holen ld hl,game_board add a,l ; .. absolut machen ld l,a jr nc,..game inc h ; .. Uebertrag beachten ..game: ld a,(hl) ; Inhalt holen ret ; ; Dezimalzahl ausgeben ; EIN Akku haelt Zahl, Register B die Anzahl Stellen ; pr.dec: cp 100 ; Bereich pruefen call z,dec.B cp 10 call z,dec.B push af ld e,' ' call conchd ; Vorspann ausgeben pop af ld l,a ld h,0 ld de,dma ld b,0 call decout ; In ASCII wandeln ld de,dma call strbi0 ret dec.B: dec b ret ; ; Inhalt des Spielfeldes holen in Abhaengigkeit von der Richtung ; EIN Register L haelt Zeile, Register H Spalte ; Register IX und IY zeigen auf Richtungsfaktor ; Adresse FAR haelt Multiplikator ; AUS Akku haelt Inhalt des Spielfelds ; Register DE zeigt auf Spielfeld ; @game: push hl ld a,(ix+0) call factor add a,l ; .. Zeile einstellen ld l,a ld a,(iy+0) call factor add a,h ; .. Spalte einstellen ld h,a call .game ; Inhalt holen ex de,hl pop hl ret factor: or a ; Test ob Multiplikator 0 ist ret z ld a,(far) ret p ; .. teste > 0 neg ; Setze *-1 ret ; ; Reihe und Spalte holen fuer Optimierung des Computerzuges ; EIN Register D und E halten Basiseinstellungen ; AUS Register H und L halten neue Positionen ; mach.x.y: ld a,(ix+0) call factor add a,d ld l,a ; .. Werte holen ld a,(iy+0) call factor add a,e ld h,a ld (hvar_z),hl ; Abspeichern ret ; dseg hvar_z: ds 1 hvar_sp: ds 1 cseg end