;****************************************************************************************** ;REVERSI ORG 0100H REVST: LD B,08H ; B=8 CALL SETCOL ;C=COL2:A=COL2 MAIN: LD DE,BAN1 ; DE=アドレスBAN1 LD HL,(XY) ; HL=XY ADD HL,DE ; HL=XY+アドレスBAN LD A,(HL) ;A=BAN(HL) CP 00H ; Aと0を比較 (A-0) JP NZ,MA2 ;IF A<>0 THEN MA2 '終了 LD (XY0),HL ;XY0=HL LD (XY1),HL ;XY1=HL LD HL,FLAG ; HL=アドレスFLAG LD (HL),00H ;FLAG=0 LD HL,XYP ; HL=アドレスXYP LD (XYCT),HL ;XYCT=HL MA1: LD HL,(XYCT) ; HL=XYCT (XYCT自体がアドレス) LD D,(HL) ; D=XYCT上位8ビット INC HL LD E,(HL) ; E=XYCT上位8ビット LD HL,FLAG1 ; HL=アドレスFLAG1 LD (HL),00H ;FLAG1=0 LD HL,(XY1) ; HL=XY1 LD (XY0),HL ;XY0=XY1 ADD HL,DE ; HL=HL+XYP(*) LD (XY0),HL ;XY0=XY0+XYP(*) LD A,(HL) ;A=BAN(HL) CP C ; AとCOL2を比較 (Zフラグ 一致1 非一致0) CALL Z,CHE01 ;IF A=COL2 THEN GOSUB CHE01 LD HL,(XYCT) ; HL=アドレスXYCT INC HL ; HL=HL+1 INC HL ; HL=HL+1 LD (XYCT),HL ;XYCT=XYCT+2 DEC B ; B=B-1 JP NZ,MA1 ;IF B<>0 THEN MA1 MA2: RET ;QUIT CHE01: LD A,(FLAG1) ; A=FLAG1 INC A ; A=A+1 LD (FLAG1),A ;FLAG1=FLAG1+1 ADD HL,DE ; HL=HL+XYP(A) LD (XY0),HL ;XY0=XY0+XYP(*) LD A,(HL) ;A=BAN(HL) CP C ; AとCOL2を比較 JP Z,CHE01 ;IF A=COL2 THEN GOTO CHE01 PUSH HL LD HL,COL1 ; HL=アドレスCOL1 LD C,(HL) ; C=COL1 POP HL CP C ; AとCOL1を比較 JP NZ,CH2 ;IF A<>COL1 THEN CH2(RETURN) PUSH HL LD HL,FLAG LD (HL),01H ;FLAG=1 POP HL LD A,(REV) ;A=REV CP 01H JP NZ,CH2 ;IF REV<>1 THEN CH2(RETURN) CH1: AND A ; ダミー処理 → キャリーフラグを0にする SBC HL,DE ; HL=HL-A - キャリーフラグ LD (XY0),HL ;XY0=XY0-XYP(*) LD (HL),C ;BAN(HL)=C LD A,(FLAG1) ; A=FLAG1 DEC A ; A=A-1 LD (FLAG1),A ;FLAG1=FLAG1-1 JP NZ,CH1 ;IF FLAG1<>0 THEN CH1 CH2: PUSH HL LD HL,COL2 ; HL=アドレスCOL2 LD C,(HL) ; C=COL2 POP HL RET ;--------------------- BACK: LD HL,BAN1 LD DE,BAN0 LD B,00H LD C,51H LDIR RET ;--------------------- REST: LD HL,BAN0 LD DE,BAN1 LD B,00H LD C,51H LDIR RET ;--------------------- SETCOL: LD HL,COL1 ; HL=アドレスCOL1 LD A,(HL) ; A=COL1 AND 01H ; A and 01 '1なら1、2なら0 INC A ; A=A+1 LD HL,COL2 ; HL=アドレスCOL2 LD (HL),A ;COL2=A 'COL1の逆 LD C,A ; C=COL2 RET ;--------------------- SETTB: LD HL,(T1) ; H=T2 : L=T1 LD IX,BAN1 LD IY,TBL1 LD A,(IX+10) CP 00H ; Aと0を比較 (A-0) JP Z,SETT1 ;IF A=0 THEN SETT1 LD (IY+11),L LD (IY+19),L LD (IY+20),H SETT1: LD A,(IX+17) CP 00H ; Aと0を比較 (A-0) JP Z,SETT2 ;IF A=0 THEN SETT2 LD (IY+26),L LD (IY+16),L LD (IY+25),H SETT2: LD A,(IX+73) CP 00H ; Aと0を比較 (A-0) JP Z,SETT3 ;IF A=0 THEN SETT3 LD (IY+74),L LD (IY+64),L LD (IY+65),H SETT3: LD A,(IX+80) CP 00H ; Aと0を比較 (A-0) JP Z,SETT4 ;IF A=0 THEN SETT4 LD (IY+79),L LD (IY+71),L LD (IY+70),H SETT4: RET ;--------------------- RESTTB: LD HL,(B1) ; H=B2 : L=B1 LD IY,TBL1 LD (IY+11),L LD (IY+19),L LD (IY+20),H LD (IY+26),L LD (IY+16),L LD (IY+25),H LD (IY+74),L LD (IY+64),L LD (IY+65),H LD (IY+79),L LD (IY+71),L LD (IY+70),H RET ;--------------------- CPU: CALL BACK LD HL,BAN11 LD DE,CAL_DB LD B,09 ; B=09 LD C,00 ; C=0 LD A,00 LD (CAL_CT),A ;CAL_CT=0 CP_L1: INC HL ; INC B ; B=B+1 LD A,B CP 81 JP Z,CP_END ;IF B=81 THEN CP_END LD (XY),A ;XY=A LD A,(HL) CP 00 JP NZ,CP_L1 ;IF A<>0 THEN CP_L1: '石が置いていればループ PUSH BC ; P(1)=BC PUSH HL ; P(2)=HL PUSH DE ; P(3)=DE CALL REVST LD A,(FLAG) CP 00 JP Z,CP_L2 ;IF FLAG=0 THEN CP_L2 ; 石が返せる時の処理 POP DE ; DE=P(3) POP HL ; HL=P(2) POP BC ; BC=P(1) INC C ; C=C+1 LD A,C ; A=C LD (CAL_CT),A ;CAL_CT=CAL_CT+1 LD A,B ; A=B 'A=XY LD (DE),A LD A,(COL1) LD (HL),A ;BANに石を置く PUSH BC ; P(1)=BC PUSH HL ; P(2)=HL PUSH DE ; P(3)=DE CALL SETTB CALL CALCST CALL RESTTB POP DE ; DE=P(3) INC DE LD HL,CALC LD A,(HL) LD (DE),A INC DE INC HL LD A,(HL) LD (DE),A INC DE PUSH DE ; P(3)=DE CALL REST CP_L2: POP DE ; DE=P(3) POP HL ; HL=P(2) POP BC ; BC=P(1) JP CP_L1 CP_END: RET ;テスト用はHALT ;****************************************************************************************** ;CALC CALCST: LD HL,0000H ; HL=0 LD (CALC),HL ;CALC=0 CALL SETCOL ;C=COL2:A=COL2 LD HL,COL1 ; HL=アドレスCOL1 LD A,(HL) ; A=COL1 LD C,A ; C=A 'C=COL1 LD HL,BAN11 LD DE,TBL LD B,72 ; B=72 LOOP: INC HL ; HL=HL+1 INC DE ; DE=DE+1 DEC B ; B=B-1 ; RET Z ;IF B=0 THEN RETURN (QUIT) JP Z,QUIT ; シミュレータのテスト用 LD A,(HL) ;A=BAN(HL) 'A=アドレスHLの値 CP 00H ; Aと0を比較 (A-0) JP Z,LOOP ;IF A=0 THEN LOOP: '石が置いていなければループ CP C ; AとCを比較 (A-C) A=BAN上の石色 C=自分の石色 JP Z,PLUS ;IF A=C THEN PLUS ;ここから除算 LD A,(DE) ;A=TBL(DE) 'A=アドレスDEの値 PUSH HL PUSH BC LD B,00H CP 80H ; Aと80Hを比較 JP C,LP1 ;IF A<80H THEN LP1 LD B,FFH LP1: LD C,A ; BC=TBL LD HL,(CALC) ; HL=CALC AND A ; ダミー処理 → キャリーフラグを0にする SBC HL,BC ; HL=HL-BC - キャリーフラグ LD (CALC),HL ;CALC=HL POP BC POP HL JP LOOP ;ここから加算 PLUS: LD A,(DE) ;A=TBL(DE) 'A=アドレスDEの値 PUSH HL PUSH BC LD B,00H CP 80H ; Aと80Hを比較 JP C,PL1 ;IF A<80H THEN PL1 LD B,FFH PL1: LD C,A ; BC=TBL LD HL,(CALC) ; HL=CALC ADD HL,BC ; HL=HL+BC LD (CALC),HL ;CALC=HL POP BC POP HL JP LOOP QUIT: RET CALC: DB 00H,00H REV: DB 01H COL1: DB 01H COL2: DB FFH CT1: DB 00H CT2: DB 00H XY: DB 28H,00H XY0: DB 00H,00H XY1: DB 00H,00H FLAG: DB 00H FLAG1: DB 00H XYCT: DB 00H,00H T1: DB 15 T2: DB 10 B1: DB ECH B2: DB E2H XYP: DB FFH,F6H,FFH,F7H,FFH,F8H,FFH,FFH DB 00H,01H,00H,08H,00H,09H,00H,0AH TBL1: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H TBL: DB 00H,3CH,ECH,00H,FEH,FEH,00H,ECH,3CH DB 00H,ECH,E2H,FDH,FDH,FDH,FDH,E2H,ECH DB 00H,00H,FDH,00H,FFH,FFH,00H,FDH,00H DB 00H,FEH,FDH,FFH,FFH,FFH,FFH,FDH,FEH DB 00H,FEH,FDH,FFH,FFH,FFH,FFH,FDH,FEH DB 00H,00H,FDH,00H,FFH,FFH,00H,FDH,00H DB 00H,ECH,E2H,FDH,FDH,FDH,FDH,E2H,ECH DB 00H,3CH,ECH,00H,FEH,FEH,00H,ECH,3CH BAN1: DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH BAN11: DB FFH,01H,02H,02H,00H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,02H,02H,02H,02H,02H,02H,02H,02H DB FFH,00H,02H,02H,02H,02H,02H,02H,00H DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH DB FFH BAN0: DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,00H,00H,00H,00H,00H,00H,00H,00H DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH DB FFH CAL_CT: DB 00H CAL_DB: DB 00H