■敵計略ルーチン
B644h
※計略候補ビットパターン
籠共連虚要乱陥火
$B634 A2 00 ldx #$00 ;機動力3以下の計略候補
$B636 AD 6F 06 lda $066F ;
$B639 C9 04 cmp #$04 ;
$B63B 90 1A bcc $B657 ;
$B63D A2 30 ldx #$B0 ;機動力4の場合の計略候補
$B63F C9 05 cmp #$05 ;
$B641 90 14 bcc $B657 ;
$B643 A2 33 ldx #$33 ;機動力5の場合の計略候補
$B645 C9 06 cmp #$06 ;
$B647 90 0E bcc $B657 ;
$B649 A2 37 ldx #$B7 ;機動力6の場合の計略候補
$B64B C9 07 cmp #$07 ;
$B64D 90 08 bcc $B657 ;
$B64F 20 D0 D5 jsr $D5D0 ;追加ルーチン
$B652 90 03 bcc $B657 ;
$B654 EA nop ;
$B655 A2 FF ldx #$FF ;機動力12以上の場合の計略候補
$B657 A4 9C ldy $9C ;
$B659 B9 1A 6E lda $6E1A,y ;
$B65C 29 0F and #$0F ;
$B65E 85 16 sta $16 ;
追加ルーチン($D5D0+10h=D5E0h)
$D5D0 A2 3F ldx #$3F ;機動力7の場合の計略候補
$D5D2 C9 09 cmp #$09 ;
$D5D4 90 04 bcc $D5DA ;
$D5D6 A2 7F ldx #$7F ;機動力9の場合の計略候補
$D5D8 C9 0C cmp #$0C ;
$D5DA 60 rts ;
■計略を使える知力判定(COM)
B689h($B679)
$B679 F0 1E beq $B699 ;
$B67B C0 2D cpy #$2D ;要撃(45以上)
$B67D 90 0A bcc $B689 ;
$B67F C0 41 cpy #$41 ;乱水(65以上)
$B681 90 0C bcc $B68F ;
$B683 C0 55 cpy #$55 ;共殺(85以上)
$B685 90 0E bcc $B695 ;
$B687 18 clc ;
$B688 60 rts ;
$B689 29 13 and #$13 ;45未満の場合の計略絞込み
$B68B F0 0C beq $B699 ;
$B68D D0 F8 bne $B687 ;
$B68F 29 1F and #$1F ;65未満の場合の計略絞込み
$B691 F0 06 beq $B699 ;
$B693 D0 F2 bne $B687 ;
$B695 29 3D and #$FD ;85未満の場合の計略絞込み
$B697 D0 EE bne $B687 ;↑COMは籠絡をインチキ使用
$B699 38 sec ;
$B69A 60 rts ;
■敵計略実行条件
B712h 残兵士数 02(200人)未満で共殺・要撃・乱水・火計なし
B720h 残体力 1E(30)未満で陥穽なし
B72Eh 忠誠 4B(75)以上で籠絡なし
■計略を使える知力判定(プレーヤー)
14BB7h 要撃(40以上)
14BBFh 乱水(60以上)
14BC7h 共殺(80以上)
■計略の消費機動力
14BE6h($CBD6)~火計 陥穽 乱水 要撃 虚兵 連環 共殺 籠絡の順
■計略実行可能地形
14BF6h~火計 陥穽 乱水 要撃 虚兵 連環 共殺 籠絡の順の8バイト×8計略
■敵の籠絡の計優遇(機動力消費を1にする)
14CBAh($CCAA+8010h=14CBAh)
14D8Ch($CD7C)
$CD7C 20 20 95 jsr $95C0 ;追加ルーチン11530h
$CD7F 38 sec ;
$CD80 F9 D6 CB sbc $CBD6,y ;Aから計略機動力分減算
$CD83 8D 6F 06 sta $066F ;
11530h($9520) 追加ルーチン
$9520 C0 07 cpy #$07 ;籠絡の計かどうか
$9522 30 14 bmi $9538 ;違うなら$9538(通常処理へ戻る)
$9524 AE 76 06 ldx $0676 ;Xに現在実行武将ID
$9527 86 F2 stx $F2 ;Xを$F2に退避(忠誠変化時に必要)
$9529 EC A3 06 cpx $06A3 ;COMが実行武将か判断
$952C F0 0A beq $9538 ;一致したら$9538
$952E BE D6 CB ldx $CBD6,y ;Xに籠絡消費機動力抽出
$9531 CA dex ;Xをデクリメント
$9532 8A txa ;X→A
$9533 18 clc ;
$9534 6D 6F 06 adc $066F ;A+現在機動力($066F)
$9537 60 rts ;
$9538 AD 6F 06 lda $066F ;Aに現在機動力抽出
$953B 60 rts ;
■忠誠値変化ルーチン(籠絡の計後の変化)
$0620:敵(対象)ID
$06A3:味方ID
$00F2:実行武将ID
1525Bh($D24A+8010h=1525Bh)~
$D24A AD F2 00 lda $00F2 ;味方の武将ID
$D24D 20 84 AF jsr $AF84 ;忠誠値変化ルーチン12F94h
12F94h($AF84+8010h=12F94h)~忠誠値変化ルーチン
戦闘終了後君主を倒した場合$8000にはバンク3Chが入っているため
バンク38h(人徳データとサブルーチン)に入れ替えないといけない
君主を倒した際にまだその君主の配下武将が居た場合(他都市も含む)はプレーヤー君主の相性で
忠誠が変化するようにしている
$AF84 A5 7E lda $7E ;$8000のバンクNoを取得
$AF86 85 F3 sta $F3 ;$F3に退避
$AF88 C9 38 cmp #$38 ;バンクNoが38h(人徳データがあるバンク)か
$AF8A F0 0D beq $AF99 ;一致したら$AF99にブランチ
$AF8C A9 38 lda #$38 ;バンクNo38hを$8000に入れ替える準備
$AF8E 20 13 E6 jsr $E613 ;$8000バンク切り替えルーチン
$AF91 AD 20 06 lda $0620 ;君主ID抽出(プレーヤー)
$AF94 85 F2 sta $F2 ;$F2に退避
$AF96 8E 20 06 stx $0620 ;X(捕らえた武将ID)→$0620
$AF99 A5 F2 lda $F2 ;$F2→A
$AF9B 20 00 9A jsr $9A00 ;忠誠値変化ルーチン続きへ
$AF9E A5 F3 lda $F3 ;$F3(バンクNo)→A
$AFA0 C9 3C cmp #$3C ;$3Cか
$AFA2 D0 08 bne $AFAC ;一致しなかったら$AFACへブランチ
$AFA4 20 13 E6 jsr $E613 ;$8000バンク切り替えルーチン
$AFA7 A5 F2 lda $F2 ;$F2(君主ID)→A
$AFA9 8D 20 06 sta $0620 ;A→$0620※他の都市の武将を捕らえた時に必要
$AFAC 60 rts ;
11A10h($9A00+8010h=11A10h)~続き
$9A00 A0 00 ldy #$00 ;相性のオフセット
$9A02 20 45 EE jsr $EE45 ;武将データ抽出(相性値)
$9A05 29 07 and #$07 ;下位3ビット抽出
$9A07 85 F0 sta $F0 ;$F0へ退避
$9A09 AD 20 06 lda $0620 ;敵ID抽出
$9A0C 20 45 EE jsr $EE45 ;武将データ抽出(相性値)
$9A0F 29 07 and #$07 ;下位3ビット抽出
$9A11 38 sec ;キャリーフラグセット
$9A12 E5 F0 sbc $F0 ;相性値の差を計算
$9A14 B0 02 bcs $9A18 ;結果がプラスならブランチ($9A18)
$9A16 29 07 and #$07 ;下位3ビット抽出
$9A18 C9 05 cmp #$05 ;差が5未満か
$9A1A 90 05 bcc $9A21 ;5未満ならブランチ($9A21)
$9A1C 49 07 eor #$07 ;反転
$9A1E AA tax ;A→X
$9A1F E8 inx ;Xをインクリメント
$9A20 8A txa ;X→A
$9A21 85 F0 sta $F0 ;$F0へ退避
$9A23 AE F2 00 ldx $00F2 ;計略実行武将IDをXに
$9A26 BD A0 97 lda $97A0,x ;計略使用武将の魅力をAに
$9A29 4A lsr a ;魅力を1/2
$9A2A 85 F1 sta $F1 ;$F1に退避
$9A2C 4A lsr a ;更に半分1/4
$9A2D 65 F1 adc $F1 ;1/2+1/4=3/4
$9A2F 85 F1 sta $F1 ;$F1へ退避
$9A31 20 E6 E9 jsr $E9E6 ;ランダム値→Aに
$9A34 25 F1 and $F1 ;$F1とAND
$9A36 A6 F0 ldx $F0 ;$F0→Xに
$9A38 E0 00 cpx #$00 ;Xと0を比較
$9A3A D0 05 bne $9A41 ;0でなければ$9A41へブランチ
$9A3C 18 clc ;
$9A3D 69 23 adc #$23 ;Aに+#$23(+35)
$9A3F D0 17 bne $9A58 ;$9A58へブランチ
$9A41 E0 01 cpx #$01 ;Xと1を比較
$9A43 D0 05 bne $9A4A ;1でなければ$9A4Aへブランチ
$9A45 18 clc ;
$9A46 69 0F adc #$0F ;Aに+#$0F(+15)
$9A48 D0 0E bne $9A58 ;$9A58へブランチ
$9A4A E0 03 cpx #$03 ;Xと3を比較
$9A4C D0 04 bne $9A52 ;3でなければ$9A52へブランチ
$9A4E 4A lsr a ;右シフト(1/2)
$9A4F 18 clc ;
$9A50 90 06 bcc $9A58 ;$9A2Fへブランチ
$9A52 E0 04 cpx #$04 ;Xと4を比較
$9A54 D0 02 bne $9A58 ;4でなければ$9A58へブランチ
$9A56 4A lsr a ;右シフト(1/2)
$9A57 4A lsr a ;右シフト(1/2)
$9A58 C9 60 cmp #$60 ;Aと#$60(96)を比較
$9A5A 90 02 bcc $9A5E ;#$60(96)を超えてなければ$9A5Eへブランチ
$9A5C A9 5F lda #$5F ;#$5F(95)に設定
$9A5E A0 05 ldy #$05 ;Yに5(忠誠オフセット)
$9A60 91 00 sta ($00),y ;忠誠値上書き
$9A62 60 rts ;
■忠誠値変化(戦闘で降伏した場合)
$0688:左側武将ID
$0689:右側武将ID
$068A:どっちが降伏したかのフラグ00:左側降伏80:右側降伏
12F72h($AF62+8010h=12F72h)
$AF62 AD 88 06 lda $0688 ;
$AF65 AC 89 06 ldy $0689 ;
$AF68 AE 8A 06 ldx $068A ;
$AF6B 20 40 95 jsr $9540 ;11550h
$AF6E EA nop ;
$AF6F EA nop ;
11550h($9540+8010h=11550h)
$9540 30 04 bmi $9546 ;右側が降伏ならブランチ
$9542 A8 tay ;AとYを
$9543 AD 89 06 lda $0689 ;入れ替え
$9546 85 F2 sta $F2 ;
$9548 8C 20 06 sty $0620 ;
$954B 20 84 AF jsr $AF84 ;12F94h忠誠値変化ルーチンへ
$954E 60 rts ;
■COM戦争時の負け側戦死武将候補
C499h,C4A8h
攻め(守り)側の武将IDのあるワークエリア$6DC2~$6E02を読み取る際
ループの終了条件が違うため関係のないエリアを読み取りそのデータを
武将IDと認識し後の計算結果次第により戦死扱いを受ける
そのため戦争とは関係のない未登場の在野武将が登場しない既存バグがある
$C489 A9 3C lda #$3C ;3C→39へ 戦死の計算で統率を使っているかも
$C498 A9 3C lda #$3C ;3C→39へ 戦死の計算で武力+20を使っている
■COM捕らわれ確率(COM対COMの戦争)
C534h~
$C524 A0 06 ldy #$05 ;忠誠のオフセット
$C526 20 17 D0 jsr $D017 ;忠誠抽出
$C529 85 21 sta #21 ;
$C52B 20 50 D6 jsr #D650 ;ランダムで110以下の数値抽出※ランダムで100以下のルーチンと同じ
$C52E C5 21 cmp $21 ;忠誠より高い値なら
$C530 B0 03 bcs #C535 ;捕らわれる
■忠誠値変化ルーチン(COM対COMの戦争)
$18$19:捕らわれた武将データの先頭アドレス
$95:捕らわれた武将
$16$17:捕らわれ先の都市の先頭アドレス
C6E1h~
$CED1 A0 00 ldy #$00 ;相性のオフセット
$CED3 20 17 D0 jsr $D017 ;武将データ抽出ルーチン(システム側)
$CED6 29 07 and #$07 ;下位3ビット抽出(相性値)
$CED8 85 F0 sta $F0 ;$F0へ退避
$CEDA A5 A0 lda $A0 ;どちらが勝ったか00守り勝ち 01攻め勝ち
$CEDC F0 0B beq $CEE9 ;守り勝ちならブランチ
$CEDE A5 9E lda $9E ;攻め側の都市ID
$CEE0 20 49 F8 jsr $F849 ;都市の先頭アドレス抽出ルーチン($00,$01)
$CEE3 A0 00 ldy #$00 ;
$CEE5 B1 00 lda ($00),y ;都市の先頭データ抽出(支配者君主)
$CEE7 90 02 bcc $CEEB ;
$CEE9 B1 16 lda ($16),y ;守り側の都市ID抽出
$CEEB 29 0F and #$0F ;下位4ビット(君主ID)抽出
$CEED 85 F1 sta $F1 ;$F1に退避
$CEEF C9 08 cmp #$08 ;08(張魯)かどうか
$CEF1 D0 02 bne $CEF5 ;
$CEF3 A9 01 lda #$01 ;01にする
$CEF5 20 F0 D5 jsr $D5F0 ;相性値計算ルーチン
$CEF8 91 18 sta ($18),y ;
$CEFA 60 rts ;
相性値計算ルーチン(君主の人徳の75%以下のランダム値+相性差補正値)
相性差00:+35,01:+25,02:+15,03:+5,04:+0)
D600h~
$D5F0 38 sec ;
$D5F1 E5 F0 sbc $F0 ;最小値の差を計算
$D5F3 B0 02 bcs $D5F7 ;結果がプラスならブランチ
$D5F5 29 07 and #$07 ;下位3ビット抽出
$D5F7 C9 05 cmp #$05 ;差が5未満か?
$D5F9 90 05 bcc $D600 ;5未満ならブランチ
$D5FB 49 07 eor #$07 ;レジスタAの値を反転
$D5FD AA tax ;A→X
$D5FE E8 inx ;Xをインクリメント(+1)
$D5FF 8A txa ;X→A
$D600 85 F0 sta $F0 ;$F0へ退避(相性差)
$D602 A9 38 lda #$38 ;バンクNo38h(人徳データがあるバンク)をセット
$D604 20 19 E6 jsr $E619 ;$8000バンク切り替えルーチン
$D607 A6 F1 ldx $F1 ;$F1→X
$D609 BD A0 B7 lda $B7A0,x ;君主の人徳抽出
$D60C 4A lsr a ;人徳を1/2
$D60D 85 F1 sta $F1 ;$F1に退避
$D60F 4A lsr a ;更に半分
$D610 65 F1 adc $F1 ;1/2+1/4=3/4
$D612 85 F1 sta $F1 ;A→$F1へ
$D614 A9 35 lda #$35 ;バンクNo35hをセット
$D616 20 19 E6 jsr $E619 ;$8000バンク切り替えルーチン
$D619 20 E6 E9 jsr $E9E6 ;ランダム値抽出
$D61C 25 F1 and $F1 ;$F1とAND
$D61E A6 F0 ldx $F0 ;$F0→X
$D620 D0 05 bne $D627 ;相性差0
$D622 18 clc ;
$D623 69 23 adc #$23 ;+35
$D625 D0 19 bne $D640 ;
$D627 E0 01 cpx #$01 ;相性差1
$D629 D0 05 bne $D630 ;
$D62B 18 clc ;
$D62C 69 19 adc #$19 ;+25
$D62E D0 10 bne $D640 ;
$D630 E0 02 cpx #$02 ;相性差2
$D632 D0 05 bne $D639 ;
$D634 18 clc ;
$D635 69 0F adc #$0F ;+15
$D637 90 07 bcc $D640 ;
$D639 E0 03 cpx #$03 ;相性差3
$D63B D0 03 bne $D640 ;
$D63D 18 clc ;
$D63E 69 05 adc #$05 ;+5
$D640 C9 60 cmp #$60 ;96を超えたか
$D642 90 02 bcc $D646 ;
$D644 A9 5F lda #$5F ;95に再設定
$D646 A0 05 ldy #$05 ;忠誠のオフセット
$D648 60 rts ;
■戦争開始時期判定
BF8Fh~
$BF7F AD 88 6D lda $6D88 ;レベル抽出
$BF82 F0 18 beq BF9C ;0(レベル1)ならブランチ
$BF84 C9 02 cmp $02 ;2(レベル3)か
$BF86 F0 21 beq BFA9 ;2ならブランチ
$BF88 AD 85 6D lda 6D85 ;現在の年抽出
$BF8B C9 C9 cmp $C9 ;1年経過しているか
$BF8D B0 1A bcs BFA9 ;していればブランチ
$BF8F AD 87 6D lda 6D87 ;現在の月抽出
$BF92 C9 07 cmp $07 ;6ヶ月経過しているか
$BF94 B0 13 bcs BFA9 ;していればブランチ
$BF96 EE 89 06 inc 0689 ;
$BF99 4C 53 BF jmp BF53 ;
$BF9C AD 85 6D lda 6D85 ;レベル1のブランチ先
$BF9F C9 C9 cmp $C9 ;
$BFA1 B0 06 bcs BFA9 ;
$BFA3 EE 89 06 inc 0689 ;
$BFA6 4C 53 BF jmp BF53 ;
$BFA9 A0 FF ldy $FF ;
レベル1なら1年間は戦争しない
レベル2なら6ヶ月間は戦争しない
レベル3なら開始直後から戦争がありえる
■COMの国造り補正値
CA61h~
$CA51 20 DA E9 jsr $E9DA ;ランダム値0~7抽出ルーチン
$CA54 18 clc ;
$CA55 69 10 adc #$10 ;ランダム値+#$10(16)
$CA57 A0 04 ldy #$04 ;都市の土地のオフセット
$CA59 20 79 CE jsr $CE79 ;加算ルーチン($1B利用)
$CA5C A9 05 lda #$05 ;
$CA5E 20 11 CF jsr $CF11 ;
$CA61 4C EF C9 jmp $C9EF ;
$CA64 AE 8B 6D ldx $6D8B ;
$CA67 BD 20 6F lda $6F20,x ;
$CA6A 29 1F and #$1F ;
$CA6C C9 1E cmp #$1E ;
$CA6E 90 08 bcc $CA78 ;
$CA70 BD 20 6F lda $6F20,x ;
$CA73 29 E0 and #$E0 ;
$CA75 9D 20 6F sta $6F20,x ;
$CA78 BD 20 6F lda $6F20,x ;
$CA7B FE 20 6F inc $6F20,x ;
$CA7E 29 1F and #$1F ;
$CA80 20 68 CE jsr $CE68 ;
$CA83 29 0F and #$0F ;
$CA85 CD 8B 6D cmp $6D8B ;
$CA88 D0 DA bne $CA64 ;
$CA8A 20 D8 CE jsr $CED8 ;
$CA8D 20 DA E9 jsr $E9DA ;ランダム値0~7抽出ルーチン
$CA90 18 clc ;
$CA91 69 10 adc #$10 ;ランダム値+#$10(16)
$CA93 A0 06 ldy #$06 ;都市の産業のオフセット
$CA95 20 79 CE jsr $CE79 ;加算ルーチン($1B利用)
$CA98 A9 05 lda #$05 ;
$CA9A 20 11 CF jsr $CF11 ;
$CA9D 4C EF C9 jmp $C9EF ;
$CAA0 AE 8B 6D ldx $6D8B ;
$CAA3 BD 26 6F lda $6F26,x ;
$CAA6 29 1F and #$1F ;
$CAA8 C9 1E cmp #$1E ;
$CAAA 90 08 bcc $CAB4 ;
$CAAC BD 26 6F lda $6F26,x ;
$CAAF 29 E0 and #$E0 ;
$CAB1 9D 26 6F sta $6F26,x ;
$CAB4 BD 26 6F lda $6F26,x ;
$CAB7 29 1F and #$1F ;
$CAB9 20 68 CE jsr $CE68 ;
$CABC 29 0F and #$0F ;
$CABE CD 8B 6D cmp $6D8B ;
$CAC1 F0 06 beq $CAC9 ;
$CAC3 FE 26 6F inc $6F26,x ;
$CAC6 4C A0 CA jmp $CAA0 ;
$CAC9 20 D8 CE jsr $CED8 ;
$CACC 20 D4 E9 jsr $E9D4 ;ランダム値0~3抽出ルーチン
$CACF 18 clc ;
$CAD0 69 0A adc #$0A ;ランダム値+#$0A(10)
$CAD2 85 16 sta $16 ;
$CAD4 A9 64 lda #$64 ;100倍にするための準備
$CAD6 85 17 sta $17 ;
$CAD8 20 AF B5 jsr $B5AF ;100倍化ルーチン
■COM国造り実行可否バグ
CCD7h~
$CCC7 20 E0 E9 jsr $E9E0 ;ランダム値0~F抽出 ※ここが駄目かも
$CCCA AC 88 6D ldy $6D88 ;ゲームレベル抽出(レベル1=00、レベル2=01、レベル3=02)
$CCCD D9 AD CC cmp $CCAD,y ;テーブル内と比較(15 2A 55)
$CCD0 B0 E2 bcs $CCB4 ;ランダム値0~F-15 or 2A or 55 なので必ずキャリーフラグはクリアの状態
$CCD2 A9 3C lda #$3C ;
↓
$CCC7 20 C7 E9 jsr $E9C7 ;ランダム値64未満抽出
レベル1=21% レベル2=42% レベル3=85%の確率で内政をするプログラムだったのではないか?
ただしCOMが内政しなさ過ぎるのもアレなのでこのままでいいかも
■都市ID12倍化ルーチン(在野位置で必要COM用)
CCE7h~($CCD7)
$CCD7 A9 00 lda #$00 ;
$CCD9 85 16 sta $16 ;
$CCDB 85 F0 sta #F0 ;
$CCDD A5 94 lda $94 ;
$CCDF 0A asl ;
$CCE0 0A asl ;
$CCE1 0A asl ;
$CCE2 85 F0 sta $F0 ;
$CCE4 20 C0 D5 jsr $D5C0 ;
↓
D5D0h($D5C0)
$D5C0 A5 94 lda $94 ;
$D5C2 0A asl ;
$D5C3 0A asl ;
$D5C4 65 F0 adc $F0 ;
$D5C6 26 16 rol $16 ;
$D5C8 60 rts ;
■都市ID12倍化ルーチン(在野位置で必要自分用)
19B80h~($9B70)
$9B70 85 F0 sta $F0 ;
$9B72 AD 17 06 lda $0617 ;
$9B75 0A asl ;
$9B76 0A asl ;
$9B77 65 F0 adc $F0 ;
$9B79 26 00 rol $00 ;
$9B7B 60 rts ;
呼び出し元のルーチン
1B057h($B047)
$B047 A9 00 lda #$00 ;
$B049 85 00 sta $00 ;
$B04B 85 F0 sta $F0 ;
$B04D 85 F1 sta $F1 ;
$B04F AD 17 06 lda $0617 ;
$B052 0A asl ;
$B053 0A asl ;
$B054 0A asl ;
$B055 20 50 9C jsr $9B70 ;※19B80h城番号12倍にする処理
$B058 69 30 adc #$30 ;※$FE30のアドレス
$B05A 85 05 sta $05 ;
$B05C A5 00 lda $00 ;
$B05E 69 FE adc #$FE ;※$FE30のアドレス
$B060 85 06 sta $06 ;
$B062 AD 85 6D lda $6D85 ;※現在年
$B065 38 sec ;
$B066 E9 C6 sbc #$C6 ;※開始年から何年たつか
$B068 8D 25 06 sta $0625 ;※結果を格納
$B06B EE 25 06 inc $0625 ;
$B06E 20 E6 E9 jsr $E9E6 ;
$B071 29 07 and #$0F ;※テーブルの最後か
$B073 CD 25 06 cmp $0625 ;
$B076 B0 F6 bcs $B06E ;※キャリーフラグがセットされている時にブランチ
$B078 A8 tay
■COM在野武将捜索バグ
CD11h~
$CD01 A9 FF lda #$FF ;
$CD03 85 21 sta $21 ;
$CD05 E6 21 inc $21 ;在野武将テーブルオフセット値
$CD07 A4 21 ldy $21 ;
$CD09 C4 20 cpy &20 ;スタート後何年経過したか(ループの終了値)
$CD0B 90 03 bcc $CD10 ;
$CD0D 4C B4 CC jmp $CCB4 ;次の都市の処理へ
$CD10 B1 1B lda ($1B),y ;在野武将テーブルから武将ID取得
$CD12 85 9F sta $9F ;
$CD14 C9 FF cmp #$FF ;在野いないか?
$CD16 D0 03 bne $CD1B ;
$CD18 4C B4 CC jmp $CCB4 ;次の都市の処理へ ※ここが駄目
$CD1B A0 00 ldy #$00 ;
↓
$CD18 4C 05 CD jmp $CD05 ;在野がいない(FF)の場合はオフセット値をインクリメントする処理へ戻る
■武将データ表示順
F48Eh 03 統率(元は武力)
F498h 02 知力
F4A2h 01 武力(元は体力)
■武将データ--表示
F634h
$B624 C9 FF cmp #$FF ;FFなら
$B626 F0 26 beq $B64E ;--表示
↓
$B624 C9 64 cmp #$64 ;64以上なら
$B626 B0 26 bcs $B64E ;--表示
※君主の忠誠度をFF(255)以外に設定→64(100)
育成時に君主の忠誠を255で計算しないで済む
■何か忘れた
110ABh~
127FBh~
A0 03 lda #$03 ;旧武力読み込み
↓
A0 01 lda #$01 ;新武力読み込み
■戦闘時武将ユニットのHPを武力にする(追加ルーチン)
11D0Fh(実アドレス-8010h)ジャンプ元
$9CFF A5 06 lda $06 ;体力が格納されている
$9D01 8D B1 04 sta $04B1 ;セット
$9D04 A5 07 lda $07 ;体力が格納されている
$9D06 8D D2 04 sta $04D2 ;セット
$9D09 A2 00 ldx #$00 ;
↓
$9CFF 20 F0 98 jsr $98E0 ;武力抽出ルーチンジャンプ
$9D02 8D B1 04 sta $04B1 ;セット
$9D05 20 FB 98 jsr $98EB ;武力抽出ルーチンジャンプ
$9D08 8D D2 04 sta $04D2 ;セット
武力抽出ルーチン
118F0h-11907h(実アドレス-8010h)
$98E0 AD 88 06 lda $0688 ;レジスタAに武将IDをセット
$98E3 A0 01 ldy #$01 ;レジスタYに01(武力)をセット
$98E5 20 45 EE jsr $EE45 ;抽出ルーチンへジャンプ
$98E8 85 F2 sta $F2 ;$F2に抽出した武力を格納(戦闘開始時の武力の一時保存(一騎打ち前に参照))
$98EA 60 rts ;
$98EB AD 89 06 lda $0689 ;
$98EE A0 01 ldy #$01 ;
$98F0 20 45 EE jsr $EE45 ;
$98F3 85 F3 sta $F3 ;$F3に抽出した武力を格納(戦闘開始時の武力の一時保存(一騎打ち前に参照))
$98F5 A2 00 ldx $00 ;
$98F7 60 rts ;
■一騎打ち時の体力
10DFEh ジャンプ元
$8DEE 20 EE 93 jsr $93EE
↓
$8DEE 20 BA 98 jsr $98BA
118CAh ジャンプ先(実アドレス-8010h)
$98BA AD 88 06 lda $0688 ;
$98BD A0 01 ldy #$01 ;
$98BF 20 45 EE jsr $EE45 ;
$98C2 CD B1 04 cmp $04B1 ;
$98C5 F0 04 beq $98DB ;
$98C7 A5 F2 lda $F2 ;
$98C9 91 00 sta ($00),y ;
$98CB AD 89 06 lda $0689 ;
$98CE A0 01 ldy #$01 ;
$98D0 20 45 EE jsr $EE45 ;
$98D3 CD D2 04 cmp $04D2 ;
$98D6 F0 04 beq $98EC ;
$98D8 A5 F3 lda $F3 ;
$98DA 91 00 sta ($00),y ;
$98DC 20 EE 93 jsr $93EE ;
$98DF 60 rts ;
■部隊の色抽出ルーチン新バージョン(君主9人)
11B96h
部隊の色抽出ルーチン旧バージョン(君主6~7人)
$9B86 AE 73 06 ldx $0673 ;
$9B89 10 07 bpl $9B92 ;
$9B8B 85 0A sta $0A ;
$9B8D 85 0B sta $0B ;
$9B8F 4C A0 9B jmp $9BA0 ;
$9B92 4A lsr ;
$9B93 4A lsr ;
$9B94 4A lsr ;
$9B95 4A lsr ;
$9B96 85 0A sta $0A ;
$9B98 B1 00 lda ($00),y ;
$9B9A 0A asl ;
$9B9B 0A asl ;
$9B9C 0A asl ;
$9B9D 0A asl ;
$9B9E 85 0B sta $0B ;
$9BA0 A5 0A lda $0A ;
$9BA2 29 07 and #$07 ;
$9BA4 0A asl ;
$9BA5 85 00 sta $00 ;
$9BA7 A5 0B lda $0B ;
$9BA9 29 F0 and #$F0 ;
$9BAB 05 00 ora $00 ;
$9BAD A8 tay ;
$9B8E 60 rts ;
↓
部隊の色抽出ルーチン新バージョン(君主9人)
$9B86 48 pha ;Aに上位桁君主番号下位桁に君主番号
$9B87 29 0F and #$0F ;下位桁の君主番号抽出
$9B89 85 0A sta $0A ;$0Aに退避
$9B8B 68 pla ;スタックから取り出す
$9B8C 4A lsr ;4ビット右シフトして
$9B8D 4A lsr ;上位桁を取り出す
$9B8E 4A lsr ;
$9B8F 4A lsr ;
$9B90 85 0B sta $0B ;$0Bに退避
$9B92 A4 0A ldy $0A ;下位桁君主番号をYに
$9B94 A5 0B lda $0B ;上位桁君主番号をAに
$9B96 AE 73 06 ldx $0673 ;プレーヤーかCOMか判断のフラグ抽出?
$9B99 10 04 bpl $ ;ネガティブフラグがクリアされている時にブランチします
$9B9B A4 0B ldy $0B ;
$9B9D A5 0A lda $0A ;
$9B9F 0A asl ;Aを左シフト
$9BA0 18 clc ;
$9BA1 79 A6 9B adc $9BA6,y ;
$9BA4 A8 tay ;
$9BA5 60 rts ;
$9BA6 インデックステーブル
00 12 24 36 48 5A 6C 7E 90
■戦闘時の部隊攻撃力(武>統→武、統≧武→(統+武)/2)
120E1h ジャンプ元
$A0D1 20 45 EE jsr $EE45
↓
$A0D1 20 A0 98 jsr $98A0
118B0h ジャンプ先(実アドレス-8010h)
$98A0 85 F0 sta $F0 ;武将IDを$F0に退避
$98A2 20 45 EE jsr $EE45 ;Y=3 統率抽出
$98A5 85 F1 sta $F1 ;統率を$F1に退避
$98A7 A5 F0 lda $F0 ;武将ID抽出
$98A9 A0 01 ldy #$01 ;Y=1 武力抽出
$98AB 20 45 EE jsr $EE45 ;A=武力
$98AE C5 F1 cmp $F1 ;A=武力と$F1=統率を比較
$98B0 B0 07 bcs $98C9 ;武力≧統率ならキャリーフラグセット(ブランチする)
$98B2 65 F1 adc $F1 ;A=武力+統率
$98B4 4A lsr a ;Aを右シフト(÷2)
$98B5 A0 01 ldy #$01 ;
$98B7 91 00 sta ($00),y ;武力(部隊攻撃力)書き換え
$98B9 60 rts ;
■戦争時部隊色テーブル読み込みルーチン
13621h(実アドレス-8010h)
$B611 A0 39 ldy #$39
$B613 B1 00 lda ($00),y ;$6DAA+39=6DE3 戦争中の君主ID(上位桁と下位桁)
$B615 48 pha ;スタックにプッシュ
$B616 29 0F and #$0F ;下位桁抽出
$B618 0A asl a ;左シフト(テーブルは2バイトなので下位桁2倍にする)
$B619 85 00 sta $00 ;$00に退避
$B61B 68 pla ;スタックから(プル)ポップ
$B61C 29 F0 and #$F0 ;上位桁抽出
$B61E 05 00 ora $00 ;$00とor(テーブルの縦横の座標となる)
$B620 A8 tay ;
↓
$B611 A0 39 ldy #$39 ;
$B613 B1 00 lda ($00),y ;$6DAA+39=6DE3 戦争中の君主ID(上位桁と下位桁)
$B615 48 pha ;スタックにプッシュ
$B616 29 0F and #$0F ;下位桁抽出
$B618 0A asl a ;左シフト(テーブルは2バイトなので下位桁2倍にする)
$B619 85 00 sta $00 ;$00に退避
$B61B 68 pla ;スタックから(プル)ポップ
変更箇所↓
$B61C 20 40 DF jsr $DF40 ;テーブル座標決定ルーチン
$B620 EA nop ;
テーブル座標決定ルーチン
15F50h(実アドレス-8010h)
$DF40 29 F0 and #$F0 ;上位桁抽出
$DF42 4A lsr ;右シフト4回で
$DF43 4A lsr ;下位桁に移動
$DF44 4A lsr ;
$DF45 4A lsr ;
$DF46 A8 tay ;
$DF47 A5 00 lda $00 ;$00読み込み
$DF49 18 clc ;
$DF4A 79 4E DF adc ($DF4E),y ;$DF4Eのテーブル読み込み
$DF4D 60 rts ;
;テーブル2バイト×9君主=18バイト(12ずつ増加)
$DF4E~ 00 12 24 36 48 5A 6C 7E 90
■機動力バグ修正(戦闘終了後に-3するように順番を入れ替える)
1569Ch(実アドレス-8010h) 戦闘開始直前(攻撃の対象を選択した直後)
$D68C AD 6F 06 lda $066F ;機動力読み込み
$D68F 38 sec ;キャリーフラグセット
$D690 E9 03 sbc #$03 ;3減算
$D692 8D 6F 06 sta $066F ;機動力上書き
$D695 20 5E C3 jsr $C35E ;戦闘準備等のルーチン
$D698 F0 01 beq $D69B ;
$D69A 60 rts ;戦闘開始~
$D69B AD 89 06 lda $0689 ;
↓
$D68C 20 5E C3 jsr $C35E ;戦闘準備等のルーチン
$D68F F0 0A beq $D69B ;
$D691 60 rts ;戦闘開始~
;機動力3減算ルーチン
$D692 AD 6F 06 lda $066F ;機動力読み込み
$D695 F0 03 beq $D69B ;機動力が0(戦争開始直後)なら処理を飛ばす
$D697 38 sec ;キャリーフラグセット
$D698 E9 03 sbc #$03 ;3減算
$D69A 60 rts ;
$D69B AD 89 06 lda $0689 ;
135FCh(実アドレス-8010h) 戦闘開始直後、戦闘終了後
$B5EC AD 6F 06 lda $066F ;機動力読み込み
$B5EF 48 pha ;
↓
$B5EC 20 92 D6 jsr $D692 ;機動力3減算ルーチンへ
$B5EF 48 pha ;
■説得に応じない武将(武将ID)
1B177h
1B17Bh
1B17Fh
1B183h
1B187h
1B18Bh
1B18Fh
1B193h
1B197h
1B19Bh
■説得に応じない武将テーブルに変更し人数拡張
1B16Ch~
$B15C AD 27 06 lda $0627 ;発見武将ID
$B15F C9 FF cmp #$FF ;FFか?
$B161 D0 1F bne $B182 ;FFでなければごねる武将検査
$B163 4C E4 AE jmp $AEE4 ;
$B166;説得に応じない武将テーブル(最大28人まで可)
1A EE 70 6E D1 54 E3 6B 3B 64 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF;
$B182 A0 00 ldy #$00 ;Y=00
$B184 D9 66 B1 cmp $B166,y ;ごね武将テーブルと発見武将比較
$B187 F0 0A beq $B193 ;一致したらブランチ
$B189 C8 iny ;Yインクリメント
$B18A C0 12 cpy #$12 ;Yが17以下か(17人に設定中)
$B18C D0 F6 bne $B184 ;一致しなかったらブランチ(ループ戻る)
$B18E A9 0A lda #$0A ;以下通常処理
$B190 4C CE AF jmp $AFCE ;
$B193 A9 07 lda #$07 ;07=ごねるフラグ
$B195 8D 23 06 sta $0623 ;
$B198 A9 0A lda #$0A ;
$B19A 4C CE AF jmp $AFCE ;
■国造りを知力から政治へ
1B34Ch~
レジスタAに武将ID
$B33C A0 02 ldy #$02 ;抽出対象知力(2)
$B33E 20 26 F8 jsr $F826 ;抽出ルーチンへジャンプ
↓
$B33C A8 tay ;レジスタAに武将IDが格納されているので
$B33D A8 tay ;レジスタYにセット。2回目は穴埋めで意味なし
$B33E 20 15 FE jsr $FE15 ;政治力抽出ルーチンへジャンプ
ジャンプ先
1FE25h~
$FE15 A9 31 lda #$31 ;2010h~(政治データテーブルアドレスがあるバンク)の読み込み準備
$FE17 20 13 E6 jsr $E613 ;バンク入れ替えルーチン
$FE1A AD 08 80 lda $8008 ;政治データテーブルアドレス読み込み
$FE1D 85 00 sta $00 ;
$FE1F AD 09 80 lda $8009 ;政治データテーブルアドレス読み込み
$FE22 85 01 sta $01 ;
$FE24 B1 00 lda ($00),y ;政治データ読み込み
$FE26 60 rts ;
■国造りの上昇値変更
1B443h~
$B433 A0 01 ldy #$01 ;金のオフセット
$B435 B1 0E lda ($0E),y ;対象都市の金1バイト目
$B437 38 sec ;
$B438 ED 20 06 sbc $0620 ;国づくりにかかった費用を減算
$B43B 91 0E sta ($0E),y ;
$B43D C8 iny ;オフセットインクリメント
$B43E B1 0E lda ($0E),y ;金2バイト目
$B440 E9 00 sbc #$00 ;キャリーフラグの計算
$B442 91 0E sta ($0E),y ;
$B444 C8 iny ;オフセットインクリメント
$B445 B1 0E lda ($0E),y ;金3バイト目
$B447 E9 00 sbc #$00 ;キャリーフラグの計算
$B449 91 0E sta ($0E),y ;
$B44B AD 20 06 lda $0620 ;かかった費用を
$B44E 4A lsr a ;1/2する
$B44F 85 00 sta $00 ;$00に格納
$B451 AD 21 06 lda $0621 ;実施者の政治
$B454 4A lsr a ;1/8にしたものを
$B455 4A lsr a ;国づくり上昇値基本値テーブルの
$B456 4A lsr a ;オフセットとする
$B457 A8 tay ;yに
$B458 A5 30 lda $30 ;ランダムに取得した値に
$B45A 29 03 and #$03 ;補正を掛ける0~3
$B45C 18 clc ;
$B45D 79 D1 B4 adc $B4D1,y ;国づくり上昇基本値を加算
$B460 18 clc ;
$B461 65 00 adc $00 ;費用の半値を加算
$B463 85 00 sta $00 ;今回の上昇値退避
$B465 8D 22 06 sta $0622 ;今回の上昇値退避
$B468 AD 1C 06 lda $061C ;国造りの種類00=土地01=産業02=人口
$B46B D0 08 bne $B475 ;土地でなければブランチ
$B46D A0 04 ldy #$04 ;土地のオフセット
$B46F 20 BE B4 jsr $B4BE ;上昇値加算ルーチンへ
$B472 4C A8 B4 jmp $B4A8 ;統治度上昇ルーチンへ
$B475 C9 01 cmp #$01 ;産業か?
$B477 D0 08 bne $B481 ;産業でなければブランチ
$B479 A0 06 ldy #$06 ;産業のオフセット
$B47B 20 BE B4 jsr $B4BE ;上昇値加算ルーチンへ
$B47E 4C A8 B4 jmp $B4A8 ;統治度上昇処理へ
$B481 20 92 D9 jsr $D992 ;人口上昇値決定ルーチン
$B484 A9 00 lda #$00 ;
$B486 85 01 sta $01 ;
$B488 85 02 sta $02 ;
$B48A A9 64 lda #$64 ;
$B48C 85 03 sta $03 ;
$B48E 20 17 ED jsr $ED17 ;
$B491 A5 06 lda $06 ;
$B493 85 00 sta $00 ;
$B495 A5 07 lda $07 ;
$B497 85 01 sta $01 ;
$B499 A0 08 ldy #$08 ;
$B49B 20 C2 B4 jsr $B4C2 ;
$B49E C8 iny ;
$B49F B1 0E lda ($0E),y ;
$B4A1 69 00 adc #$00 ;
$B4A3 91 0E sta ($0E),y ;
$B4A5 68 pla ;
$B4A6 85 00 sta $00 ;
$B4A8 46 00 lsr $00 ;
$B4AA 46 00 lsr $00 ;
$B4AC A0 0E ldy #$0E ;
$B4AE B1 0E lda ($0E),y ;
$B4B0 18 clc ;
$B4B1 65 00 adc $00 ;
$B4B3 91 0E sta ($0E),y ;
$B4B5 C9 64 cmp #$64 ;
$B4B7 90 04 bcc $B4BD ;
$B4B9 A9 64 lda #$64 ;
$B4BB 91 0E sta ($0E),y ;
$B4BD 60 rts ;
人口上昇値決定ルーチン
1D9A2h~
$D992 68 pla ;
$D993 85 01 sta $01 ;スタックポインタ退避
$D995 68 pla ;
$D996 85 02 sta $02 ;スタックポインタ退避
$D998 20 D4 E9 jsr $E9D4 ;ランダム値0~3取得
$D99B 18 clc ;
$D99C 65 00 adc $00 ;人口の上昇値にランダム値加算
$D99E 4A lsr ;人口の上昇値を半減
$D99F 85 00 sta $00 ;$00へ上昇値を格納
$D9A1 8D 22 06 sta $0622 ;$0622へ上昇値を格納
$D9A4 48 pha ;スタックへ上昇値を格納
$D9A5 A5 02 lda $02 ;
$D9A7 48 pha ;
$D9A8 A5 01 lda $01 ;
$D9AA 48 pha ;
$D9AB 60 rts ;
■忠誠度アップ限界値
1C231h
■統率(武力)アップ限界値
1C243h
■忠誠度アップの補正値
1C7EEh~
$C85B
↓
$C924
■情報ウインドウ漢字表示
上段左側→□□←上段右側
下段左側→□□←下段右側
621Ch~1文字目上段左側
B9 3D A2 lda $A23D,y
8D 57 05 sta $0557
6223h~1文字目上段右側
B9 3E A2 lda $A23E,y
8D 58 05 sta $0558
6228h~2文字目上段左側
B9 3F A2 lda $A23F,y
8D 59 05 sta $0559
622Eh~2文字目上段右側
B9 40 A2 lda $A240,y
8D 5A 05 sta $055A
6234h~1文字目下段左側
B9 55 A2 lda $A255,y
8D 67 05 sta $0567
623Ah~1文字目下段右側
B9 56 A2 lda $A256,y
8D 68 05 sta $0568
6240h~2文字目下段左側
B9 57 A2 lda $A257,y
8D 69 05 sta $0569
6246h~2文字目下段右側
B9 58 A2 lda $A258,y
8D 6A 05 sta $056A
60 rts
メモリ NESROM内
$A23D-3FF0h=624Dh
$A255-3FF0h=
$FF70+10010h=1FF80h
■君主選択
画面上から劉備、劉璋、孫権、馬騰、曹操、袁紹
77AAh~
04 05 03 01 02 00
この値が各君主に割り当てられ#$80とor演算して決定される
■OPの巻物の文字開始位置
3DC60h~
FF XX YY で圧縮あり(FF パターン 繰り返し)
■都市の数カウント?
1DDFBh
この都市番号~都市番号00まで降順でカウントしてるっぽい
■学問所利用の制限
利用必要金額 1CDBFh
利用可能限度値(この値未満なら利用可) 1CE26h
上昇基準値(知力低い順から) 1CE56h 1CE5Dh 1CE69h
利用金額テーブル 1CF0Eh~1CF10h
■年月関係
CD08h 開始からの経過年数(在野に関係あり8年以上経つと在野がいないのでCOMの在野任官ルーチンカットのため?かも)
CD0Ah 開始から8年経っているか計算する値
CD0Eh 上記値と同じ値を入れておく
EBDFh 開始年
EBE9h 開始月
1B077h 開始からの経過年数(プレイヤーの在野に関係あり 開始年が格納されている)
1A0CAh ゲームオーバー年
1DAE6h $DAD2~年-C9 月-06 $0620-1Eをやってる
■
最終更新:2012年11月12日 23:45