Advertisement
Guest User

Untitled

a guest
Jan 4th, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.98 KB | None | 0 0
  1. --[[
  2.     6502 Lua emulator
  3.     by J. Aldo G. de F. Junior 2014 jorgealdojr@hotmail.com
  4.    
  5.     derived from javascript source by
  6.    
  7.     by N. Landsteiner  2005, e-tradion.net
  8.    
  9.     wich is derived from the c source by
  10.    
  11.     Earle F. Philhower III, Commodore 64 Emulator v0.3, (C) 1993-4
  12.    
  13.     extended for exact cycle times [N. Landsteiner, 2005]
  14.  
  15.     This program is free software; you can redistribute it and/or modify
  16.     it under the terms of the GNU General Public License as published by
  17.     the Free Software Foundation; either version 2 of the License, or
  18.     (at your option) any later version.
  19.  
  20.     This program is distributed in the hope that it will be useful,
  21.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.     GNU General Public License for more details.
  24.  
  25.     For the GNU General Public License see the Free Software Foundation,
  26.     Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27.    
  28.     Thanks to "chip" for a bugfix in function BranchRelAddr().
  29.    
  30.     fixed a bug regarding byte ranges in functions opDECR and opINCR -
  31.     thanks to James Larson for reporting. (2008-09-05)
  32.    
  33. --]]
  34.  
  35. emu6502 = {
  36.  
  37.     -- Global conf
  38.  
  39.     Debug = false
  40.     ExternalLoop = true
  41.     StopOnIterrupt = true
  42.  
  43.     -- Constants
  44.  
  45.     ResetTo = 0xfffc
  46.     IrqTo   = 0xfffe
  47.     NMITo   = 0xfffa
  48.  
  49.     -- Flags
  50.  
  51.     fCAR = 1
  52.     fZER = 2
  53.     fINT = 4
  54.     fDEC = 8
  55.     fBKC = 16
  56.     fOVF = 64
  57.     fNEG = 128
  58.    
  59.     -- regs & memory
  60.  
  61.     A = 0
  62.     X = 0
  63.     Y = 0
  64.     Flags = 0
  65.     SP = 0
  66.     PC = ResetTo
  67.     RAM = {}
  68.     BreakFlag = false
  69.     ExCycles = 0
  70.     AddCycles = 0
  71.    
  72.     function ByteAt(addr)
  73.         return RAM[addr] or 0
  74.     end
  75.    
  76.     function WordAt(addr)
  77.         return ByteAt(addr) + ByteAt(0xffff and (addr + 1)) * 256
  78.     end
  79.    
  80.     function ImmediateByte()
  81.         return ByteAt(PC)
  82.     end
  83.    
  84.     function ZeroPageAddr()
  85.         return ByteAt(PC)
  86.     end
  87.    
  88.     function ZeroPageXAddr()
  89.         return 255 and (x + ByteAt(PC))
  90.     end
  91.    
  92.     function ZeroPageYAddr()
  93.         return 255 and (y + ByteAt(PC))
  94.     end
  95.    
  96.     function IndirectXAddr()
  97.         return WordAt(255 and (ByteAt(PC) + x))
  98.     end
  99.    
  100.     function IndirectYAddr()
  101.         if AddCycles > 0 then
  102.             local a1 = WordAt(ByteAt(PC))
  103.             local a2 = (a1 + y) and 0xffff
  104.             if ((a1 and 0xff00) ~= (a2 and 0xff00)) then
  105.                 ExtraCyles = ExtraCyles + 1
  106.             end
  107.             return a2;
  108.         else
  109.             return (WordAt(ByteAt(PC)) + Y) and 0xffff
  110.         end
  111.     end
  112.    
  113.     function AbsoluteAddr()
  114.         return WordAt(PC)
  115.     end
  116.  
  117.     function AbsoluteXAddr()
  118.         if AddCycles > 0 then
  119.             local a1 = WordAt(PC)
  120.             local a2 = (a1 + X) and 0xffff
  121.             if ((a1 and 0xff00) ~= (a2 and 0xff00)) then
  122.                 ExtraCyles = ExtraCyles + 1
  123.             end
  124.             return a2
  125.         else
  126.             return (WordAt(PC) + X) and 0xffff
  127.         end
  128.     end
  129.  
  130.     function AbsoluteYAddr()
  131.         if AddCycles > 0 then
  132.             local a1 = WordAt(PC)
  133.             local a2 = (a1 + Y) and 0xffff
  134.             if ((a1 and 0xff00) ~= (a2 and 0xff00)) then
  135.                 ExtraCyles = ExtraCyles + 1
  136.             end
  137.             return a2
  138.         else
  139.             return (WordAt(PC) + Y) and 0xffff;
  140.         end
  141.     end
  142.  
  143.     function BranchRelAddr()
  144.         ExCycles = ExCycles + 1
  145.         Local addr = ImmediateByte()
  146.         PC = PC + 1;
  147.         if addr and 128 then
  148.             addr = PC - ((bit32.bxor(addr, 255) + 1)
  149.         else
  150.             addr = PC + addr
  151.         end
  152.         if ((pc and 0xff00) ~= (addr and 0xff00)) then
  153.             ExCycles = ExCycles + 1
  154.         end
  155.         pc = addr and 0xffff
  156.     end
  157.    
  158.     -- stack
  159.  
  160.     function stPush(z)
  161.         RAM[SP + 256] = Z and 255
  162.         SP = SP - 1
  163.         SP = SP and 255
  164.     end
  165.  
  166.     function stPop()
  167.         SP = SP + 1
  168.         SP = SP and 255
  169.         return ByteAt(SP + 256)
  170.     end
  171.  
  172.     function stPushWord(z)
  173.         stPush(bit32.rshift(z, 8) and 255)
  174.         stPush(z and 255)
  175.     end
  176.  
  177.     function stPopWord()
  178.         local z = stPop()
  179.         z = z + 256 * stPop()
  180.         return z
  181.     end
  182.    
  183.     -- operations
  184.  
  185.     function FlagsNZ(z)
  186.         Flags = Flags and not (fZER + fNEG)
  187.         if z == 0 then
  188.             Flags = Flags or fZER
  189.         else
  190.             Flags = Flags or (Z and 128)
  191.         end
  192.     end
  193.  
  194.     function opORA(x)
  195.         A = A or ByteAt(x)
  196.         FlagsNZ(A)
  197.     end
  198.  
  199.     function opASL(x)
  200.         local addr = x()
  201.         local tbyte = ByteAt(addr)
  202.         Flags = Flags and not (fCAR + fNEG + fZER)
  203.         if tbyte and 128 then
  204.             Flags = Flags or fCAR
  205.         end
  206.         if tbyte == bit32.lshift(tbyte, 1) then
  207.             Flags = Flags or (tbyte and 128)
  208.         else
  209.             Flags = Flags or fZER
  210.         end
  211.         RAM[addr] = tbyte
  212.     end
  213.  
  214.     function opLSR(x) {
  215.         local addr = x()
  216.         local tbyte = ByteAt(addr)
  217.         Flags = Flags and not (fCAR+fNEG+fZER)
  218.         Flags = Flags or (tbyte and 1)
  219.         if tbyte == bit32.rshit(tbyte,1) then
  220.         else
  221.             Flags = Flags or fZER
  222.         end
  223.         RAM[addr] = tbyte
  224.     end
  225.  
  226.     function opBCL(x)
  227.         if Flags and x then
  228.             PC = PC + 1
  229.         else
  230.             BranchRelAddr()
  231.         end
  232.     end
  233.  
  234.     function opBST(x)
  235.         if flags and x then
  236.             BranchRelAddr()
  237.         else
  238.             PC = PC + 1
  239.         end
  240.     end
  241.    
  242.     function opCLR(x) {
  243.         flags &=~x;
  244.     }
  245.     function opSET(x) {
  246.         flags |= x;
  247.     }
  248.     function opAND(x) {
  249.         a &= ByteAt(x());
  250.         FlagsNZ(a);
  251.     }
  252.     function opBIT(x) {
  253.         var tbyte=ByteAt(x());
  254.         flags &=~(fZER+fNEG+fOVF);
  255.         if ((a&tbyte)==0) flags |=fZER;
  256.         flags |=tbyte&(128+64);
  257.     }
  258.     function opROL(x) {
  259.         var addr=x();
  260.         var tbyte=ByteAt(addr);
  261.         if (flags&fCAR) {
  262.             if (tbyte&128) {}
  263.             else {
  264.                 flags &=~fCAR;
  265.             }
  266.             tbyte=(tbyte<<1)|1;
  267.         }
  268.         else {
  269.             if (tbyte&128) flags|=fCAR;
  270.             tbyte=tbyte<<1;
  271.         }
  272.         FlagsNZ(tbyte);
  273.         RAM[addr]=tbyte;
  274.     }
  275.     function opEOR(x) {
  276.         a^=ByteAt(x());
  277.         FlagsNZ(a);
  278.     }
  279.     function opADC(x) {
  280.         var data=ByteAt(x());
  281.         if (flags&fDEC) {
  282.             data = bcd2dec[data]+bcd2dec[a]+((flags&fCAR)?1:0);
  283.             flags &= ~(fCAR+fOVF+fNEG+fZER);
  284.             if (data>99) {
  285.                 flags|=fCAR+fOVF;
  286.                 data -=100;
  287.             }
  288.             if (data==0) {
  289.                 flags|=fZER;
  290.             }
  291.             else {
  292.                 flags |=data&128;
  293.             }
  294.             a=dec2bcd[data];
  295.         }
  296.         else {
  297.             data += a+((flags&fCAR)?1:0);
  298.             flags &= ~(fCAR+fOVF+fNEG+fZER);
  299.             if (data>255) {
  300.                 flags|=fOVF+fCAR;
  301.                 data &=255;
  302.             }
  303.             if (data==0) {
  304.                 flags|=fZER;
  305.             }
  306.             else {
  307.                 flags |=data&128;
  308.             }
  309.             a=data;
  310.         }
  311.     }
  312.     function opROR(x) {
  313.         var addr=x();
  314.         var tbyte=ByteAt(addr);
  315.         if (flags&fCAR){
  316.             if (tbyte&1) {}
  317.             else flags&=~fCAR;
  318.             tbyte=(tbyte>>1)|128;
  319.         }
  320.         else{
  321.             if (tbyte&1) flags|=fCAR;
  322.             tbyte=tbyte>>1;
  323.         };
  324.         FlagsNZ(tbyte);
  325.         RAM[addr]=tbyte;
  326.     }
  327.     function opSTA(x) {
  328.         RAM[x()]=a;
  329.     }
  330.     function opSTY(x) {
  331.         RAM[x()]=y;
  332.     }
  333.     function opSTX(y) {
  334.         RAM[y()]=x;
  335.     }
  336.     function opCPY(x) {
  337.         var tbyte=ByteAt(x());
  338.         flags &=~(fCAR+fZER+fNEG);
  339.         if (y==tbyte) {
  340.             flags |=fCAR+fZER;
  341.         }
  342.         else if (y>tbyte) {
  343.             flags |=fCAR;
  344.         }
  345.         else {
  346.             flags |=fNEG;
  347.         }
  348.     }
  349.     function opCPX(y) {
  350.         var tbyte=ByteAt(y());
  351.         flags &=~(fCAR+fZER+fNEG);
  352.         if (x==tbyte) {
  353.             flags |=fCAR+fZER;
  354.         }
  355.         else if (x>tbyte) {
  356.             flags |=fCAR;
  357.         }
  358.         else {
  359.             flags |=fNEG;
  360.         }
  361.     }
  362.     function opCMP(x) {
  363.         var tbyte=ByteAt(x());
  364.         flags &=~(fCAR+fZER+fNEG);
  365.         if (a==tbyte) {
  366.             flags |=fCAR+fZER;
  367.         }
  368.         else if (a>tbyte) {
  369.             flags |=fCAR;
  370.         }
  371.         else {
  372.             flags |=fNEG;
  373.         }
  374.     }
  375.     function opSBC(x) {
  376.         var data=ByteAt(x());
  377.         if (flags&fDEC) {
  378.             data = bcd2dec[a]-bcd2dec[data]-((flags&fCAR)?0:1);
  379.             flags &= ~(fCAR+fZER+fNEG+fOVF);
  380.             if (data==0) {
  381.                 flags |=fZER+fCAR;
  382.             }
  383.             else if (data>0) {
  384.                 flags |=fCAR;
  385.             }
  386.             else {
  387.                 flags|=fNEG;
  388.                 data +=100;
  389.             }
  390.             a=dec2bcd[data];
  391.         }
  392.         else {
  393.             data = a-data-((flags&fCAR)?0:1);
  394.             flags &=~(fCAR+fZER+fOVF+fNEG);
  395.             if (data==0) {
  396.                 flags |=fZER+fCAR;
  397.             }
  398.             else if (data>0) {
  399.                 flags |=fCAR;
  400.             }
  401.             else {
  402.                 flags|=fOVF;
  403.             }
  404.             flags |=data&128;
  405.             a=data&255;
  406.         }
  407.     }
  408.     function opDECR(x) {
  409.         var addr=x();
  410.         var tbyte=(ByteAt(addr)-1)&255;
  411.         flags &=~(fZER+fNEG);
  412.         if (tbyte) {
  413.             flags |=tbyte&128;
  414.         }
  415.         else {
  416.             flags|=fZER;
  417.         }
  418.         RAM[addr]=tbyte;
  419.     }
  420.     function opINCR(x) {
  421.         var addr=x();
  422.         var tbyte=(ByteAt(addr)+1)&255;
  423.         flags &=~(fZER+fNEG);
  424.         if (tbyte) {
  425.             flags |=tbyte&128;
  426.         }
  427.         else {
  428.             flags|=fZER;
  429.         }
  430.         RAM[addr]=tbyte;
  431.     }
  432.     function opLDA(x) {
  433.         a=ByteAt(x());
  434.         FlagsNZ(a);
  435.     }
  436.     function opLDY(x) {
  437.         y=ByteAt(x());
  438.         FlagsNZ(y);
  439.     }
  440.     function opLDX(y) {
  441.         x=ByteAt(y());
  442.         FlagsNZ(x);
  443.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement