Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 37c8c80
Showing
11 changed files
with
5,358 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
VIC-20 Emulator v1.0 | ||
-------------------- | ||
|
||
Version 1.0 (19/8/2008) | ||
- Initial Release | ||
|
||
|
||
Written by Simon Owen | ||
http://simonowen.com/sam/vic20emu/ |
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
; Opcode table positions (auto-generated by opdefs.pl) | ||
|
||
op_00: equ &b000 ; +38 | ||
op_01: equ &b301 ; +17 | ||
op_02: equ &b402 ; +3 | ||
op_03: equ &b103 ; +3 | ||
op_04: equ &b604 ; +14 | ||
op_05: equ &b205 ; +11 | ||
op_06: equ &b706 ; +13 | ||
op_07: equ &bb07 ; +9 | ||
op_08: equ &b108 ; +23 | ||
op_09: equ &ba09 ; +9 | ||
op_0a: equ &bc0a ; +7 | ||
op_0b: equ &bd0b ; +3 | ||
op_0c: equ &b40c ; +16 | ||
op_0d: equ &b90d ; +12 | ||
op_0e: equ &b50e ; +14 | ||
op_0f: equ &b80f ; +13 | ||
op_10: equ &bd10 ; +8 | ||
op_11: equ &b211 ; +21 | ||
op_12: equ &b312 ; +19 | ||
op_13: equ &b613 ; +3 | ||
op_14: equ &ba14 ; +15 | ||
op_15: equ &bc15 ; +13 | ||
op_16: equ &bb16 ; +15 | ||
op_17: equ &b617 ; +9 | ||
op_18: equ &bd18 ; +4 | ||
op_19: equ &b719 ; +16 | ||
op_1a: equ &b91a ; +4 | ||
op_1b: equ &be1b ; +3 | ||
op_1c: equ &b51c ; +17 | ||
op_1d: equ &b81d ; +16 | ||
op_1e: equ &b41e ; +18 | ||
op_1f: equ &bd1f ; +13 | ||
op_20: equ &b920 ; +16 | ||
op_21: equ &b621 ; +17 | ||
op_22: equ &b122 ; +3 | ||
op_23: equ &ba23 ; +3 | ||
op_24: equ &be24 ; +8 | ||
op_25: equ &b325 ; +11 | ||
op_26: equ &ba26 ; +13 | ||
op_27: equ &b227 ; +9 | ||
op_28: equ &b128 ; +25 | ||
op_29: equ &bc29 ; +9 | ||
op_2a: equ &bf2a ; +7 | ||
op_2b: equ &b02b ; +3 | ||
op_2c: equ &bb2c ; +9 | ||
op_2d: equ &b72d ; +12 | ||
op_2e: equ &b02e ; +14 | ||
op_2f: equ &b52f ; +13 | ||
op_30: equ &bd30 ; +8 | ||
op_31: equ &b231 ; +21 | ||
op_32: equ &b332 ; +19 | ||
op_33: equ &b633 ; +3 | ||
op_34: equ &b434 ; +10 | ||
op_35: equ &b935 ; +13 | ||
op_36: equ &b836 ; +15 | ||
op_37: equ &bc37 ; +9 | ||
op_38: equ &b638 ; +4 | ||
op_39: equ &b739 ; +16 | ||
op_3a: equ &ba3a ; +4 | ||
op_3b: equ &bd3b ; +3 | ||
op_3c: equ &bb3c ; +13 | ||
op_3d: equ &b63d ; +16 | ||
op_3e: equ &b43e ; +18 | ||
op_3f: equ &ba3f ; +13 | ||
op_40: equ &b040 ; +35 | ||
op_41: equ &b541 ; +17 | ||
op_42: equ &b142 ; +3 | ||
op_43: equ &bc43 ; +3 | ||
op_44: equ &b944 ; +3 | ||
op_45: equ &b145 ; +11 | ||
op_46: equ &b846 ; +13 | ||
op_47: equ &bc47 ; +9 | ||
op_48: equ &bd48 ; +7 | ||
op_49: equ &b249 ; +9 | ||
op_4a: equ &bb4a ; +7 | ||
op_4b: equ &b34b ; +3 | ||
op_4c: equ &ba4c ; +6 | ||
op_4d: equ &b94d ; +12 | ||
op_4e: equ &b34e ; +14 | ||
op_4f: equ &b74f ; +13 | ||
op_50: equ &b450 ; +10 | ||
op_51: equ &b151 ; +21 | ||
op_52: equ &b252 ; +19 | ||
op_53: equ &b553 ; +3 | ||
op_54: equ &ba54 ; +3 | ||
op_55: equ &b855 ; +13 | ||
op_56: equ &b656 ; +15 | ||
op_57: equ &ba57 ; +9 | ||
op_58: equ &bc58 ; +6 | ||
op_59: equ &b559 ; +16 | ||
op_5a: equ &bb5a ; +8 | ||
op_5b: equ &b95b ; +3 | ||
op_5c: equ &b75c ; +3 | ||
op_5d: equ &b45d ; +16 | ||
op_5e: equ &b35e ; +18 | ||
op_5f: equ &b95f ; +13 | ||
op_60: equ &ba60 ; +13 | ||
op_61: equ &b761 ; +14 | ||
op_62: equ &bb62 ; +3 | ||
op_63: equ &b063 ; +3 | ||
op_64: equ &b864 ; +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 ; +25 | ||
op_6a: equ &bd6a ; +7 | ||
op_6b: equ &b16b ; +3 | ||
op_6c: equ &b56c ; +10 | ||
op_6d: equ &ba6d ; +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 &b773 ; +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 &b082 ; +3 | ||
op_83: equ &b283 ; +3 | ||
op_84: equ &b384 ; +10 | ||
op_85: equ &bb85 ; +8 | ||
op_86: equ &b286 ; +10 | ||
op_87: equ &b787 ; +9 | ||
op_88: equ &bc88 ; +6 | ||
op_89: equ &b089 ; +24 | ||
op_8a: equ &b88a ; +5 | ||
op_8b: equ &b48b ; +3 | ||
op_8c: equ &b58c ; +12 | ||
op_8d: equ &b98d ; +10 | ||
op_8e: equ &b48e ; +12 | ||
op_8f: equ &b38f ; +13 | ||
op_90: equ &bb90 ; +8 | ||
op_91: equ &b191 ; +19 | ||
op_92: equ &b292 ; +17 | ||
op_93: equ &b793 ; +3 | ||
op_94: equ &b894 ; +12 | ||
op_95: equ &b695 ; +10 | ||
op_96: equ &b796 ; +12 | ||
op_97: equ &ba97 ; +9 | ||
op_98: equ &bc98 ; +5 | ||
op_99: equ &b599 ; +14 | ||
op_9a: equ &bb9a ; +7 | ||
op_9b: equ &bd9b ; +3 | ||
op_9c: equ &b99c ; +11 | ||
op_9d: equ &b49d ; +14 | ||
op_9e: equ &b39e ; +15 | ||
op_9f: equ &b69f ; +13 | ||
op_a0: equ &b8a0 ; +7 | ||
op_a1: equ &b0a1 ; +15 | ||
op_a2: equ &baa2 ; +7 | ||
op_a3: equ &b7a3 ; +3 | ||
op_a4: equ &b1a4 ; +10 | ||
op_a5: equ &b2a5 ; +9 | ||
op_a6: equ &b7a6 ; +10 | ||
op_a7: equ &b8a7 ; +9 | ||
op_a8: equ &b5a8 ; +5 | ||
op_a9: equ &b9a9 ; +6 | ||
op_aa: equ &baaa ; +5 | ||
op_ab: equ &bbab ; +3 | ||
op_ac: equ &b4ac ; +11 | ||
op_ad: equ &b5ad ; +10 | ||
op_ae: equ &b3ae ; +11 | ||
op_af: equ &b2af ; +13 | ||
op_b0: equ &b6b0 ; +8 | ||
op_b1: equ &b0b1 ; +19 | ||
op_b2: equ &b1b2 ; +17 | ||
op_b3: equ &b7b3 ; +3 | ||
op_b4: equ &b9b4 ; +12 | ||
op_b5: equ &bab5 ; +11 | ||
op_b6: equ &b8b6 ; +12 | ||
op_b7: equ &bbb7 ; +9 | ||
op_b8: equ &b4b8 ; +6 | ||
op_b9: equ &b5b9 ; +14 | ||
op_ba: equ &bcba ; +8 | ||
op_bb: equ &b7bb ; +3 | ||
op_bc: equ &b3bc ; +15 | ||
op_bd: equ &b6bd ; +14 | ||
op_be: equ &b4be ; +15 | ||
op_bf: equ &b7bf ; +13 | ||
op_c0: equ &b9c0 ; +12 | ||
op_c1: equ &b2c1 ; +19 | ||
op_c2: equ &b8c2 ; +3 | ||
op_c3: equ &bac3 ; +3 | ||
op_c4: equ &b1c4 ; +14 | ||
op_c5: equ &b8c5 ; +13 | ||
op_c6: equ &b0c6 ; +9 | ||
op_c7: equ &bbc7 ; +9 | ||
op_c8: equ &bcc8 ; +6 | ||
op_c9: equ &bac9 ; +11 | ||
op_ca: equ &bdca ; +6 | ||
op_cb: equ &b6cb ; +3 | ||
op_cc: equ &b3cc ; +15 | ||
op_cd: equ &b5cd ; +14 | ||
op_ce: equ &b9ce ; +11 | ||
op_cf: equ &b6cf ; +13 | ||
op_d0: equ &b7d0 ; +8 | ||
op_d1: equ &b0d1 ; +23 | ||
op_d2: equ &b1d2 ; +21 | ||
op_d3: equ &b8d3 ; +3 | ||
op_d4: equ &b2d4 ; +3 | ||
op_d5: equ &b4d5 ; +15 | ||
op_d6: equ &bad6 ; +11 | ||
op_d7: equ &bbd7 ; +9 | ||
op_d8: equ &b7d8 ; +13 | ||
op_d9: equ &b2d9 ; +18 | ||
op_da: equ &bcda ; +8 | ||
op_db: equ &b8db ; +4 | ||
op_dc: equ &b6dc ; +3 | ||
op_dd: equ &b3dd ; +18 | ||
op_de: equ &b5de ; +15 | ||
op_df: equ &b8df ; +13 | ||
op_e0: equ &b9e0 ; +12 | ||
op_e1: equ &b6e1 ; +14 | ||
op_e2: equ &bbe2 ; +3 | ||
op_e3: equ &bae3 ; +3 | ||
op_e4: equ &b4e4 ; +14 | ||
op_e5: equ &b7e5 ; +8 | ||
op_e6: equ &bae6 ; +9 | ||
op_e7: equ &b1e7 ; +9 | ||
op_e8: equ &bbe8 ; +6 | ||
op_e9: equ &b0e9 ; +21 | ||
op_ea: equ &bdea ; +2 | ||
op_eb: equ &bceb ; +3 | ||
op_ec: equ &b2ec ; +15 | ||
op_ed: equ &b8ed ; +9 | ||
op_ee: equ &b7ee ; +11 | ||
op_ef: equ &b5ef ; +13 | ||
op_f0: equ &b6f0 ; +8 | ||
op_f1: equ &b1f1 ; +18 | ||
op_f2: equ &b3f2 ; +16 | ||
op_f3: equ &b4f3 ; +3 | ||
op_f4: equ &b9f4 ; +3 | ||
op_f5: equ &bbf5 ; +10 | ||
op_f6: equ &baf6 ; +11 | ||
op_f7: equ &bdf7 ; +9 | ||
op_f8: equ &b6f8 ; +14 | ||
op_f9: equ &b9f9 ; +13 | ||
op_fa: equ &bcfa ; +9 | ||
op_fb: equ &b4fb ; +3 | ||
op_fc: equ &b2fc ; +3 | ||
op_fd: equ &b8fd ; +13 | ||
op_fe: equ &b4fe ; +15 | ||
op_ff: equ &b7ff ; +13 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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/vic20emu/ | ||
|
||
# Assemble, outputting the symbols containing opcode implementation lengths | ||
$_ = `pyz80.py -s op_.*_len vic20emu.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; |
Oops, something went wrong.