改造例 > ルーチン変更・追加

■敵計略ルーチン
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をやってる

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年11月12日 23:45