// *** データ ヨミコミ ルーチン(2 BYTE) *** // IN : HL<= TEXT ADR // EXIT : DE<= DATA : HL<= NEXT TEXT ADR // : NON DATA ナラ SET CARRYシテ Aニ ツギ ノ モジレツ // : ERROR...A=1 : NON ERROR...A=0 // exam : c16 ナラ 16 ヲ ヨンデ DE ニ カエス public void REDATA() { Mem.stack.Push(Z80.BC); Mem.stack.Push(Z80.HL); //Z80.HL = SCORE; //Z80.DE = SCORE + 1; //Mem.LD_8(Z80.HL, 0); //Z80.BC = 5; //Z80.LDIR();// INIT SCORE for (int i = 0; i < SCORE.Length; i++) { SCORE[i] = 0; } Z80.HL = Mem.stack.Pop(); Z80.B = 5; // 5ケタ マデ Z80.A ^= Z80.A; Mem.LD_8(HEXFG, Z80.A); Mem.LD_8(MINUSF, Z80.A); READ0: // FIRST CHECK Z80.A = Mem.LD_8(Z80.HL); if (Z80.A - 0x20 == 0) { goto RE01; } if (Z80.A - 0x24 == 0)//0x24 = '$' { goto READH; } if (Z80.A - 0x2d == 0)//0x2d = '-' { goto READ9; } if (Z80.A - 0x30 < 0) //0x30 = '0' { goto READE; //0イジョウ ノ キャラクタナラ ツギ } if (Z80.A - 0x3A >= 0) //0x3A = ':' :は9の次に定義されている文字 { goto READE; //9イカナラ ツギ } goto READ7; RE01: Z80.HL++; goto READ0; READH: Z80.HL++; Z80.A = 1; Mem.LD_8(HEXFG, Z80.A); goto READ7; READ9: // MINUS CHECK Z80.HL++; Z80.A = Mem.LD_8(Z80.HL); if (Z80.A - 0x30 < 0) //0x30 = '0' { goto READE; //0イジョウ ノ キャラクタナラ ツギ } if (Z80.A - 0x3A >= 0) //0x3A = ':' :は9の次に定義されている文字 { goto READE; //9イカナラ ツギ } Z80.A = 1; Mem.LD_8(MINUSF, Z80.A); // SET MINUS FLAG READ7: do { Z80.A = Mem.LD_8(Z80.HL); // SECOND CHECK Z80.D = Z80.A; Z80.A = Mem.LD_8(HEXFG); Z80.A |= Z80.A; Z80.Zero = (Z80.A == 0); Z80.A = Z80.D; if (Z80.Zero) { goto READC; } if (Z80.A - 0x61 < 0)//0x61 = 'a' { goto READG; } if (Z80.A - 0x67 >= 0)//0x67 = 'g' { goto READG; } Z80.A -= 32; READG: if (Z80.A - 0x41 < 0)//0x61 = 'A' { goto READC; } if (Z80.A - 0x47 >= 0)//0x67 = 'G' { goto READC; } Z80.A -= 7; goto READF; READC: if (Z80.A - 0x30 < 0) //0x30 = '0' { goto READ1; //0イジョウ ノ キャラクタナラ ツギ } if (Z80.A - 0x3A >= 0) //0x3A = ':' :は9の次に定義されている文字 { goto READ1; //9イカナラ ツギ } READF: Mem.stack.Push(Z80.HL); Mem.stack.Push(Z80.BC); //Z80.HL = SCORE + 1; //Z80.DE = SCORE; //Z80.BC = 5; //Z80.LDIR(); SCORE[0] = SCORE[1]; SCORE[1] = SCORE[2]; SCORE[2] = SCORE[3]; SCORE[3] = SCORE[4]; SCORE[4] = SCORE[5]; Z80.BC = Mem.stack.Pop(); Z80.HL = Mem.stack.Pop(); Z80.A -= 0x30;// A= 0 - 9 //Mem.LD_8(SCORE + 4, Z80.A); SCORE[4] = Z80.A; Z80.HL++; // NEXT TEXT Z80.B--; } while (Z80.B != 0); Z80.A = Mem.LD_8(Z80.HL); // THIRD CHECK if (Z80.A - 0x30 < 0) //0x30 = '0' { goto READ1; //0イジョウ ノ キャラクタナラ ツギ } if (Z80.A - 0x3A >= 0) //0x3A = ':' :は9の次に定義されている文字 { goto READ1; //9イカナラ ツギ } //READ8: Z80.A &= Z80.A; // CY=0 Z80.A = 1; // ERROR SIGN Z80.BC = Mem.stack.Pop(); return; //RET ; 7ケタイジョウ ハ エラー READ1: Z80.A = Mem.LD_8(HEXFG); Z80.A |= Z80.A; if (Z80.A == 0) { goto READD; } //Z80.A = Mem.LD_8(SCORE + 1); Z80.A = SCORE[1]; Z80.RLCA(); Z80.RLCA(); Z80.RLCA(); Z80.RLCA(); Z80.D = Z80.A; //Z80.A = Mem.LD_8(SCORE + 2); Z80.A = SCORE[2]; Z80.A |= Z80.D; Z80.D = Z80.A; //Z80.A = Mem.LD_8(SCORE + 3); Z80.A = SCORE[3]; Z80.RLCA(); Z80.RLCA(); Z80.RLCA(); Z80.RLCA(); Z80.E = Z80.A; //Z80.A = Mem.LD_8(SCORE + 4); Z80.A = SCORE[4]; Z80.A |= Z80.E; Z80.E = Z80.A; goto READA; READD: Mem.stack.Push(Z80.HL); Z80.HL = 0; Z80.DE = 10000; // 10000 ノ ケタ //Z80.A = Mem.LD_8(SCORE); Z80.A = SCORE[0]; Z80.A |= Z80.A; if (Z80.A == 0) { goto READSEN; } Z80.B = Z80.A; //READMAN: do { Z80.HL += Z80.DE; Z80.B--; } while (Z80.B != 0); READSEN: Z80.DE = 1000; //Z80.A = Mem.LD_8(SCORE + 1);// 1000 ノ ケタ Z80.A = SCORE[1];// 1000 ノ ケタ Z80.A |= Z80.A; if (Z80.A == 0) { goto READHYAKU; } Z80.B = Z80.A; //READSEN2: do { Z80.HL += Z80.DE; Z80.B--; } while (Z80.B != 0); READHYAKU: Z80.DE = 100; //Z80.A = Mem.LD_8(SCORE + 2);// 100 ノ ケタ Z80.A = SCORE[2];// 100 ノ ケタ Z80.A |= Z80.A; if (Z80.A == 0) { goto READ4; } Z80.B = Z80.A; //READ2: do { Z80.HL += Z80.DE; Z80.B--; } while (Z80.B != 0); READ4: //Z80.A = Mem.LD_8(SCORE + 3);// 10 ノ ケタ Z80.A = SCORE[3];// 10 ノ ケタ Z80.A |= Z80.A; if (Z80.A == 0) { goto READ5; } Z80.B = Z80.A; Z80.A = 0; Z80.C = 10; //READ3: do { Z80.A += Z80.C; Z80.B--; } while (Z80.B != 0); Z80.C = Z80.A; goto READ6; READ5: Z80.C = 0; READ6: //Z80.A = Mem.LD_8(SCORE + 4);// 1 ノ ケタ Z80.A = SCORE[4];// 1 ノ ケタ Z80.A += Z80.C; Z80.Carry = (Z80.A + Z80.L > 0xff); Z80.A += Z80.L; Z80.L = Z80.A; Z80.A += (byte)(Z80.H + (Z80.Carry ? 1 : 0)); Z80.A -= Z80.L; Z80.H = Z80.A; Z80.EX_DE_HL(); Z80.HL = Mem.stack.Pop(); Z80.A = Mem.LD_8(MINUSF);// CHECK MINUS FLAG Z80.A |= Z80.A; if (Z80.A == 0) { goto READA;// NON MINUS } Mem.stack.Push(Z80.HL); Z80.A ^= Z80.A; // CY=0 Z80.HL = 0; Z80.HL -= Z80.DE; // DE ノ ホスウ ヲ トル Z80.EX_DE_HL(); Z80.HL = Mem.stack.Pop(); READA: Z80.A ^= Z80.A; //CY=0 Z80.Carry = false; Z80.BC = Mem.stack.Pop(); return;// RET READE: Mem.LD_8(SECCOM, Z80.A); Z80.Carry = true; // NON DATA Z80.BC = Mem.stack.Pop(); // RET }