mirror of
https://github.com/simonowen/apple1emu.git
synced 2024-06-07 16:44:38 +00:00
Added opcode definitions and implementation.
This commit is contained in:
parent
bb339dd159
commit
9c1c46c9d7
258
opdefs.inc
Normal file
258
opdefs.inc
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
; Opcode table positions (auto-generated by opdefs.pl)
|
||||||
|
|
||||||
|
op_00: equ &b000 ; +38
|
||||||
|
op_01: equ &b401 ; +18
|
||||||
|
op_02: equ &ba02 ; +3
|
||||||
|
op_03: equ &b103 ; +3
|
||||||
|
op_04: equ &b304 ; +14
|
||||||
|
op_05: equ &b205 ; +12
|
||||||
|
op_06: equ &b706 ; +13
|
||||||
|
op_07: equ &bb07 ; +9
|
||||||
|
op_08: equ &b108 ; +23
|
||||||
|
op_09: equ &ba09 ; +10
|
||||||
|
op_0a: equ &bc0a ; +7
|
||||||
|
op_0b: equ &b90b ; +3
|
||||||
|
op_0c: equ &b50c ; +16
|
||||||
|
op_0d: equ &b80d ; +13
|
||||||
|
op_0e: equ &b60e ; +14
|
||||||
|
op_0f: equ &b90f ; +13
|
||||||
|
op_10: equ &bd10 ; +8
|
||||||
|
op_11: equ &b211 ; +22
|
||||||
|
op_12: equ &b312 ; +20
|
||||||
|
op_13: equ &b413 ; +3
|
||||||
|
op_14: equ &ba14 ; +15
|
||||||
|
op_15: equ &bc15 ; +14
|
||||||
|
op_16: equ &bb16 ; +15
|
||||||
|
op_17: equ &be17 ; +9
|
||||||
|
op_18: equ &bd18 ; +4
|
||||||
|
op_19: equ &b719 ; +17
|
||||||
|
op_1a: equ &b41a ; +4
|
||||||
|
op_1b: equ &bf1b ; +3
|
||||||
|
op_1c: equ &b61c ; +17
|
||||||
|
op_1d: equ &b81d ; +17
|
||||||
|
op_1e: equ &b41e ; +18
|
||||||
|
op_1f: equ &bd1f ; +13
|
||||||
|
op_20: equ &b920 ; +16
|
||||||
|
op_21: equ &b521 ; +18
|
||||||
|
op_22: equ &b122 ; +3
|
||||||
|
op_23: equ &ba23 ; +3
|
||||||
|
op_24: equ &bf24 ; +8
|
||||||
|
op_25: equ &bc25 ; +12
|
||||||
|
op_26: equ &ba26 ; +13
|
||||||
|
op_27: equ &b227 ; +9
|
||||||
|
op_28: equ &b128 ; +25
|
||||||
|
op_29: equ &be29 ; +10
|
||||||
|
op_2a: equ &b32a ; +7
|
||||||
|
op_2b: equ &b02b ; +3
|
||||||
|
op_2c: equ &b72c ; +9
|
||||||
|
op_2d: equ &b62d ; +13
|
||||||
|
op_2e: equ &b02e ; +14
|
||||||
|
op_2f: equ &bb2f ; +13
|
||||||
|
op_30: equ &bd30 ; +8
|
||||||
|
op_31: equ &b231 ; +22
|
||||||
|
op_32: equ &b332 ; +20
|
||||||
|
op_33: equ &b533 ; +3
|
||||||
|
op_34: equ &b434 ; +10
|
||||||
|
op_35: equ &b935 ; +14
|
||||||
|
op_36: equ &b836 ; +15
|
||||||
|
op_37: equ &bc37 ; +9
|
||||||
|
op_38: equ &b538 ; +4
|
||||||
|
op_39: equ &b739 ; +17
|
||||||
|
op_3a: equ &ba3a ; +4
|
||||||
|
op_3b: equ &bd3b ; +3
|
||||||
|
op_3c: equ &bb3c ; +13
|
||||||
|
op_3d: equ &b63d ; +17
|
||||||
|
op_3e: equ &b53e ; +18
|
||||||
|
op_3f: equ &ba3f ; +13
|
||||||
|
op_40: equ &b040 ; +35
|
||||||
|
op_41: equ &b441 ; +18
|
||||||
|
op_42: equ &b142 ; +3
|
||||||
|
op_43: equ &bc43 ; +3
|
||||||
|
op_44: equ &b944 ; +3
|
||||||
|
op_45: equ &b145 ; +12
|
||||||
|
op_46: equ &b846 ; +13
|
||||||
|
op_47: equ &b247 ; +9
|
||||||
|
op_48: equ &b948 ; +7
|
||||||
|
op_49: equ &bc49 ; +10
|
||||||
|
op_4a: equ &b74a ; +7
|
||||||
|
op_4b: equ &b34b ; +3
|
||||||
|
op_4c: equ &bd4c ; +6
|
||||||
|
op_4d: equ &ba4d ; +13
|
||||||
|
op_4e: equ &b34e ; +14
|
||||||
|
op_4f: equ &b94f ; +13
|
||||||
|
op_50: equ &bb50 ; +10
|
||||||
|
op_51: equ &b151 ; +22
|
||||||
|
op_52: equ &b252 ; +20
|
||||||
|
op_53: equ &b453 ; +3
|
||||||
|
op_54: equ &b554 ; +3
|
||||||
|
op_55: equ &b755 ; +14
|
||||||
|
op_56: equ &b656 ; +15
|
||||||
|
op_57: equ &b857 ; +9
|
||||||
|
op_58: equ &bc58 ; +6
|
||||||
|
op_59: equ &b559 ; +17
|
||||||
|
op_5a: equ &bb5a ; +8
|
||||||
|
op_5b: equ &ba5b ; +3
|
||||||
|
op_5c: equ &b95c ; +3
|
||||||
|
op_5d: equ &b45d ; +17
|
||||||
|
op_5e: equ &b35e ; +18
|
||||||
|
op_5f: equ &b95f ; +13
|
||||||
|
op_60: equ &ba60 ; +13
|
||||||
|
op_61: equ &b861 ; +14
|
||||||
|
op_62: equ &bb62 ; +3
|
||||||
|
op_63: equ &b063 ; +3
|
||||||
|
op_64: equ &b764 ; +8
|
||||||
|
op_65: equ &bc65 ; +8
|
||||||
|
op_66: equ &b666 ; +13
|
||||||
|
op_67: equ &b267 ; +9
|
||||||
|
op_68: equ &bb68 ; +8
|
||||||
|
op_69: equ &b069 ; +27
|
||||||
|
op_6a: equ &bd6a ; +7
|
||||||
|
op_6b: equ &b16b ; +3
|
||||||
|
op_6c: equ &b56c ; +10
|
||||||
|
op_6d: equ &b76d ; +9
|
||||||
|
op_6e: equ &b16e ; +14
|
||||||
|
op_6f: equ &b46f ; +13
|
||||||
|
op_70: equ &b870 ; +10
|
||||||
|
op_71: equ &b271 ; +18
|
||||||
|
op_72: equ &b372 ; +16
|
||||||
|
op_73: equ &ba73 ; +3
|
||||||
|
op_74: equ &b974 ; +10
|
||||||
|
op_75: equ &b675 ; +10
|
||||||
|
op_76: equ &b576 ; +15
|
||||||
|
op_77: equ &bc77 ; +9
|
||||||
|
op_78: equ &ba78 ; +6
|
||||||
|
op_79: equ &b779 ; +13
|
||||||
|
op_7a: equ &bb7a ; +9
|
||||||
|
op_7b: equ &bd7b ; +3
|
||||||
|
op_7c: equ &b47c ; +15
|
||||||
|
op_7d: equ &b87d ; +13
|
||||||
|
op_7e: equ &b17e ; +18
|
||||||
|
op_7f: equ &b97f ; +13
|
||||||
|
op_80: equ &ba80 ; +10
|
||||||
|
op_81: equ &b681 ; +14
|
||||||
|
op_82: equ &bc82 ; +3
|
||||||
|
op_83: equ &b283 ; +3
|
||||||
|
op_84: equ &b384 ; +10
|
||||||
|
op_85: equ &bc85 ; +8
|
||||||
|
op_86: equ &b286 ; +10
|
||||||
|
op_87: equ &bb87 ; +9
|
||||||
|
op_88: equ &bd88 ; +6
|
||||||
|
op_89: equ &b089 ; +25
|
||||||
|
op_8a: equ &b88a ; +5
|
||||||
|
op_8b: equ &b48b ; +3
|
||||||
|
op_8c: equ &b58c ; +12
|
||||||
|
op_8d: equ &b78d ; +10
|
||||||
|
op_8e: equ &b48e ; +12
|
||||||
|
op_8f: equ &b38f ; +13
|
||||||
|
op_90: equ &b690 ; +8
|
||||||
|
op_91: equ &b191 ; +19
|
||||||
|
op_92: equ &b292 ; +17
|
||||||
|
op_93: equ &b893 ; +3
|
||||||
|
op_94: equ &b994 ; +12
|
||||||
|
op_95: equ &bb95 ; +10
|
||||||
|
op_96: equ &b896 ; +12
|
||||||
|
op_97: equ &bc97 ; +9
|
||||||
|
op_98: equ &b598 ; +5
|
||||||
|
op_99: equ &b699 ; +14
|
||||||
|
op_9a: equ &bd9a ; +7
|
||||||
|
op_9b: equ &b49b ; +3
|
||||||
|
op_9c: equ &ba9c ; +11
|
||||||
|
op_9d: equ &b59d ; +14
|
||||||
|
op_9e: equ &b49e ; +15
|
||||||
|
op_9f: equ &b79f ; +13
|
||||||
|
op_a0: equ &bba0 ; +7
|
||||||
|
op_a1: equ &b3a1 ; +15
|
||||||
|
op_a2: equ &b9a2 ; +7
|
||||||
|
op_a3: equ &b8a3 ; +3
|
||||||
|
op_a4: equ &b0a4 ; +10
|
||||||
|
op_a5: equ &b2a5 ; +9
|
||||||
|
op_a6: equ &b1a6 ; +10
|
||||||
|
op_a7: equ &b8a7 ; +9
|
||||||
|
op_a8: equ &bba8 ; +5
|
||||||
|
op_a9: equ &b9a9 ; +6
|
||||||
|
op_aa: equ &baaa ; +5
|
||||||
|
op_ab: equ &b5ab ; +3
|
||||||
|
op_ac: equ &b6ac ; +12
|
||||||
|
op_ad: equ &b7ad ; +11
|
||||||
|
op_ae: equ &b4ae ; +12
|
||||||
|
op_af: equ &b2af ; +13
|
||||||
|
op_b0: equ &b3b0 ; +8
|
||||||
|
op_b1: equ &b0b1 ; +20
|
||||||
|
op_b2: equ &b1b2 ; +18
|
||||||
|
op_b3: equ &b5b3 ; +3
|
||||||
|
op_b4: equ &b8b4 ; +12
|
||||||
|
op_b5: equ &b9b5 ; +11
|
||||||
|
op_b6: equ &b5b6 ; +12
|
||||||
|
op_b7: equ &bbb7 ; +9
|
||||||
|
op_b8: equ &bab8 ; +6
|
||||||
|
op_b9: equ &b6b9 ; +15
|
||||||
|
op_ba: equ &bcba ; +8
|
||||||
|
op_bb: equ &b4bb ; +3
|
||||||
|
op_bc: equ &b3bc ; +16
|
||||||
|
op_bd: equ &b7bd ; +15
|
||||||
|
op_be: equ &b4be ; +16
|
||||||
|
op_bf: equ &babf ; +13
|
||||||
|
op_c0: equ &b9c0 ; +13
|
||||||
|
op_c1: equ &b2c1 ; +20
|
||||||
|
op_c2: equ &b8c2 ; +3
|
||||||
|
op_c3: equ &bbc3 ; +3
|
||||||
|
op_c4: equ &b5c4 ; +15
|
||||||
|
op_c5: equ &b8c5 ; +14
|
||||||
|
op_c6: equ &b0c6 ; +9
|
||||||
|
op_c7: equ &b1c7 ; +9
|
||||||
|
op_c8: equ &bcc8 ; +6
|
||||||
|
op_c9: equ &bbc9 ; +12
|
||||||
|
op_ca: equ &bdca ; +6
|
||||||
|
op_cb: equ &becb ; +3
|
||||||
|
op_cc: equ &b3cc ; +16
|
||||||
|
op_cd: equ &b6cd ; +15
|
||||||
|
op_ce: equ &b9ce ; +11
|
||||||
|
op_cf: equ &b7cf ; +13
|
||||||
|
op_d0: equ &bcd0 ; +8
|
||||||
|
op_d1: equ &b0d1 ; +24
|
||||||
|
op_d2: equ &b1d2 ; +22
|
||||||
|
op_d3: equ &b5d3 ; +3
|
||||||
|
op_d4: equ &b8d4 ; +3
|
||||||
|
op_d5: equ &b4d5 ; +16
|
||||||
|
op_d6: equ &b5d6 ; +11
|
||||||
|
op_d7: equ &bad7 ; +9
|
||||||
|
op_d8: equ &b8d8 ; +13
|
||||||
|
op_d9: equ &b2d9 ; +19
|
||||||
|
op_da: equ &bbda ; +8
|
||||||
|
op_db: equ &b9db ; +4
|
||||||
|
op_dc: equ &b7dc ; +3
|
||||||
|
op_dd: equ &b3dd ; +19
|
||||||
|
op_de: equ &b6de ; +15
|
||||||
|
op_df: equ &b9df ; +13
|
||||||
|
op_e0: equ &bae0 ; +13
|
||||||
|
op_e1: equ &b7e1 ; +14
|
||||||
|
op_e2: equ &bce2 ; +3
|
||||||
|
op_e3: equ &bbe3 ; +3
|
||||||
|
op_e4: equ &b5e4 ; +15
|
||||||
|
op_e5: equ &b8e5 ; +8
|
||||||
|
op_e6: equ &bce6 ; +9
|
||||||
|
op_e7: equ &bbe7 ; +9
|
||||||
|
op_e8: equ &b1e8 ; +6
|
||||||
|
op_e9: equ &b0e9 ; +22
|
||||||
|
op_ea: equ &b4ea ; +2
|
||||||
|
op_eb: equ &bdeb ; +3
|
||||||
|
op_ec: equ &b4ec ; +16
|
||||||
|
op_ed: equ &b6ed ; +9
|
||||||
|
op_ee: equ &b8ee ; +11
|
||||||
|
op_ef: equ &b7ef ; +13
|
||||||
|
op_f0: equ &baf0 ; +8
|
||||||
|
op_f1: equ &b1f1 ; +18
|
||||||
|
op_f2: equ &b2f2 ; +16
|
||||||
|
op_f3: equ &b3f3 ; +3
|
||||||
|
op_f4: equ &b5f4 ; +3
|
||||||
|
op_f5: equ &b9f5 ; +10
|
||||||
|
op_f6: equ &b3f6 ; +11
|
||||||
|
op_f7: equ &bbf7 ; +9
|
||||||
|
op_f8: equ &b6f8 ; +14
|
||||||
|
op_f9: equ &b8f9 ; +13
|
||||||
|
op_fa: equ &bafa ; +9
|
||||||
|
op_fb: equ &b5fb ; +3
|
||||||
|
op_fc: equ &b4fc ; +3
|
||||||
|
op_fd: equ &b7fd ; +13
|
||||||
|
op_fe: equ &b5fe ; +15
|
||||||
|
op_ff: equ &b4ff ; +13
|
89
opdefs.pl
Normal file
89
opdefs.pl
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Calculates opcode addresses for the inline instruction decoding table
|
||||||
|
#
|
||||||
|
# Used by the VIC-20 emulator, available from:
|
||||||
|
#
|
||||||
|
# http://simonowen.com/sam/apple1emu/
|
||||||
|
|
||||||
|
# Assemble, outputting the symbols containing opcode implementation lengths
|
||||||
|
$_ = `pyz80.py -s op_.*_len apple1emu.asm`;
|
||||||
|
|
||||||
|
# Create include file for definitions
|
||||||
|
my $outfile = 'opdefs.inc';
|
||||||
|
open(FILE, ">$outfile") or die "$!";
|
||||||
|
print FILE "; Opcode table positions (auto-generated by opdefs.pl)\n\n";
|
||||||
|
|
||||||
|
# Assembly failed?
|
||||||
|
if ($?)
|
||||||
|
{
|
||||||
|
# Create dummy offset list to allow lengths to be calculated
|
||||||
|
for (0..255) {
|
||||||
|
printf FILE "op_%02x: equ &b000\n", $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create hash from opcode to length
|
||||||
|
while (/OP_(..)_LEN': (\d+)/g) {
|
||||||
|
$len{hex $1} = $2;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Position in order of size, largest first
|
||||||
|
@todo = reverse sort { $len{$a} <=> $len{$b} } keys %len;
|
||||||
|
|
||||||
|
my($size,$used) = (0,0);
|
||||||
|
|
||||||
|
OPCODE:
|
||||||
|
foreach $op (@todo)
|
||||||
|
{
|
||||||
|
MSB:
|
||||||
|
# Work up through MSB values until we find a space
|
||||||
|
for ($msb = 0; ; $msb++)
|
||||||
|
{
|
||||||
|
# Determine the extent of the opcode in the current MSB
|
||||||
|
my $start = ($msb << 8) | $op;
|
||||||
|
my $end = $start + $len{$op}-1;
|
||||||
|
|
||||||
|
# Special fiddle to allow room for EX AF,AF' before BRA
|
||||||
|
$start-- if $op == 0x80;
|
||||||
|
|
||||||
|
# Check against what we've already positioned
|
||||||
|
foreach (keys %off)
|
||||||
|
{
|
||||||
|
# Determine extent of existing item
|
||||||
|
my $start2 = $off{$_};
|
||||||
|
my $end2 = $start2 + $len{$_}-1;
|
||||||
|
|
||||||
|
# Reject MSB if new position would overlap
|
||||||
|
next MSB unless ($start > $end2 || $end < $start2);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Assign to the free spot we've found
|
||||||
|
$off{$op} = $start;
|
||||||
|
|
||||||
|
# Update size stats
|
||||||
|
$used += $len{$op};
|
||||||
|
if ($end > $size) { $size = $end; }
|
||||||
|
|
||||||
|
next OPCODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Undo fiddle so BRA is positioned as normal
|
||||||
|
$off{0x80}++;
|
||||||
|
|
||||||
|
# Position base so code finishes just before &c000
|
||||||
|
$base = 0xc000 - (($size + 0xff) & ~0xff);
|
||||||
|
|
||||||
|
print "Size = $size, used = $used, slack = ", $size-$used, "\n";
|
||||||
|
|
||||||
|
# Output sorted list of calculated positions
|
||||||
|
foreach (sort { $a <=> $b } @todo)
|
||||||
|
{
|
||||||
|
my $offset = $base + $off{$_};
|
||||||
|
printf FILE "op_%02x: equ &%04x ; +$len{$_}\n", $_, $base+$off{$_};
|
||||||
|
}
|
||||||
|
|
||||||
|
close FILE;
|
3527
opimpl.inc
Normal file
3527
opimpl.inc
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user