SlideShare uma empresa Scribd logo
1 de 209
Emulating with
  JavaScript

    new Cpu;
WHOAMI
WHOAMI

• Alexander Dickson
WHOAMI

• Alexander Dickson
• @alexdickson
WHOAMI

• Alexander Dickson
• @alexdickson
• Not an emulation expert
WHOAMI

• Alexander Dickson
• @alexdickson
• Not an emulation expert
• JavaScript developer at Atlassian
WHOAMI

• Alexander Dickson
• @alexdickson
• Not an emulation expert
• JavaScript developer at Atlassian

                                  ;
JavaScript today
JavaScript today

• Fast
JavaScript today

• Fast
• Browser APIs are awesome
JavaScript today

• Fast
• Browser APIs are awesome
• Inputs and outputs are awesome
What we have
What we have

• Canvas Element
What we have

• Canvas Element
• Web Audio API
What we have

• Canvas Element
• Web Audio API
• GamePad API
What we have

• Canvas Element
• Web Audio API
• GamePad API
• Typed Arrays
What we have

• Canvas Element
• Web Audio API
• GamePad API
• Typed Arrays
• requestAnimationFrame()
What we don’t have
What we don’t have


• Sane implementations
What we don’t have


• Sane implementations
• Just kidding, but some are better than
  others
What we can build
What we can build


• Lots of awesome, practical stuff...
What we can build


• Lots of awesome, practical stuff...
• ...or, emulate hardware, such as gaming
  consoles.
Why?
Why?




Because we can!
What is an
emulator?
What is an
                  emulator?

  In computing, an emulator is hardware or software or both that
  duplicates (or emulates) the functions of a first computer system (the
  guest) in a different second computer system (the host), so that the
  emulated behaviour closely resembles the behaviour of the real
  system.

http://en.wikipedia.org/wiki/Emulator
What can be emulated
What can be emulated


• Church-Turing thesis
What can be emulated


• Church-Turing thesis
• Any system can be emulated
Implementations
Implementations




• Interpreter
Implementations




• Interpreter
• Dynamic Re-compilation
Implementations




• Interpreter
• Dynamic Re-compilation
• Static Re-compilation
Shhhh...
Shhhh...

• Emulation can sometimes be a bit shaky
  from a legal perspective.
Shhhh...

• Emulation can sometimes be a bit shaky
  from a legal perspective.
• Emulate at your own risk and always use
  free programs.
Shhhh...

• Emulation can sometimes be a bit shaky
  from a legal perspective.
• Emulate at your own risk and always use
  free programs.
Where to start

      CPU
Where to start

• Pick a system, anyCPU
                     system
Where to start

• Pick a system, anyCPU
                     system
• Discover its components
Where to start

• Pick a system, anyCPU
                      system
• Discover its components
• Find technical information on how
  components work
Chip8
Chip8 is Easy
Chip8 is Easy

• Simple CPU implementation
Chip8 is Easy

• Simple CPU implementation
• Simple graphics
Chip8 is Easy

• Simple CPU implementation
• Simple graphics
• Fixed audio sample
Demo Time
Example System
Nintendo Entertainment System
Nintendo Entertainment System


• Custom 6502 CPU
Nintendo Entertainment System


• Custom 6502 CPU
• 2KiB onboard RAM, 2KiB video RAM, 256B
  OAM RAM, 28B palette RAM
Nintendo Entertainment System


• Custom 6502 CPU
• 2KiB onboard RAM, 2KiB video RAM, 256B
  OAM RAM, 28B palette RAM
• Custom-made PPU
Nintendo Entertainment System


• Custom 6502 CPU
• 2KiB onboard RAM, 2KiB video RAM, 256B
  OAM RAM, 28B palette RAM
• Custom-made PPU
• 5 sound channels
Nintendo Entertainment System


• Custom 6502 CPU
• 2KiB onboard RAM, 2KiB video RAM, 256B
  OAM RAM, 28B palette RAM
• Custom-made PPU
• 5 sound channels
• Awesome rectangular controllers
Von-Neumann
 Architecture

CPU                 Memory


        Bus



      Peripherals
CPU
CPU

• Basically a loop
CPU

• Basically a loop
• Read operation codes (opcodes) from
  memory, processes them
CPU

• Basically a loop
• Read operation codes (opcodes) from
  memory, processes them
• Opcodes mostly operate on registers
6502
6502
•   Ricoh 2A03/2A07, customised 6502 w/ audio w/
    gamepad w/o BCD
6502
•   Ricoh 2A03/2A07, customised 6502 w/ audio w/
    gamepad w/o BCD

•   8 bit processor w/ 16 bit address bus
6502
•   Ricoh 2A03/2A07, customised 6502 w/ audio w/
    gamepad w/o BCD

•   8 bit processor w/ 16 bit address bus

•   1-2MHz clock speed
6502
•   Ricoh 2A03/2A07, customised 6502 w/ audio w/
    gamepad w/o BCD

•   8 bit processor w/ 16 bit address bus

•   1-2MHz clock speed

•   http://www.6502.org/documents/datasheets/
    rockwell/
// Customised 6502 CPU
Nes.Cpu = function() {
    this.registers = {
        // Program Counter (16bit)
        pc: null,
        // Stack Pointer (8bit)
        sp: null,
        // Accumulator (8bit)
        a: null,
        // Index X (8bit)
        x: null,
        // Index Y (8bit)
        y: null,
        // Processor Status,
        p: null
    };
	 // ...
    this.reset();
};
Memory
Memory


• Contiguous block of data
Memory


• Contiguous block of data
• ROM (readable)/RAM (readable/writable)
NES Memory
NES Memory
• 2KiB onboard
NES Memory
• 2KiB onboard
• Internally stored zero-page, stack, general
  purpose memory
NES Memory
• 2KiB onboard
• Internally stored zero-page, stack, general
  purpose memory
• Addressable up to 0x10000
NES Memory
• 2KiB onboard
• Internally stored zero-page, stack, general
  purpose memory
• Addressable up to 0x10000
• Program ROM contain opcodes, graphics
  and sound
Typed Arrays
Typed Arrays

• TypedArrays help performance critical
  applications such as emulators
Typed Arrays

• TypedArrays help performance critical
  applications such as emulators
• Makes it trivial to reach any specified offset
Typed Arrays

• TypedArrays help performance critical
  applications such as emulators
• Makes it trivial to reach any specified offset
• http://www.khronos.org/registry/
  typedarray/specs/latest/
Nes.Cpu = function() {
	 // ...
	 // Our device has 2KiB of RAM.
	 var memoryBuffer = new ArrayBuffer(0x800);
	 // 6502 is a 8 bit processor, able
	 // to address 8 bits at once.
	 this.memory = new Uint8Array(memory);
	 // ...
};
Need Getters/Setters



Memory is mapped everywhere, so you need to
delegate reads and writes to different areas.
Fetch/Decode Loop
Fetch/Decode Loop


• Check for interrupts
Fetch/Decode Loop


• Check for interrupts
• Read memory at PC
Fetch/Decode Loop


• Check for interrupts
• Read memory at PC
• Decode addressing mode
Fetch/Decode Loop


• Check for interrupts
• Read memory at PC
• Decode addressing mode
• Process opcode
Interrupts
Interrupts

• Special signal that interrupts normal
  execution
Interrupts

• Special signal that interrupts normal
  execution
• Loads special address into PC and executes
  it
Nes.Cpu = function() {
	 // ...
	 // Interrupt Types.
	 this.interruptTypes = {
	 	 NMI: 0
	 	 // ...
	 };
	 // Current Interrupt.
	 this.interrupt = null;
	 // ...
};

Nes.Cpu.prototype.emulateCycle = function() {
	 if (this.interrupt != null) {
	 	 switch (this.interrupt) {
	 	 	 // Non-Maskable
	 	 	 case this.interruptTypes.NMI:
	 	 	 	 this.handleNmi();
	 	 	 	 break;
	 	 	 // ...
	 	 }
	 }
	 // ...
};
Slow
Nes.Cpu.prototype.emulateCycle = function() {
    this.interrupt != null &&
    this["handle" +
         (["nmi", "irq", "reset"]
           .filter(function(type, index) {
               return index == this.interrupt;
           })[0])
        ]();
    // ...
};
Handling Opcodes
Handling Opcodes

• Read location in PC from memory
Handling Opcodes

• Read location in PC from memory
• Lookup opcode
Handling Opcodes

• Read location in PC from memory
• Lookup opcode
• Find addressing mode
Handling Opcodes

• Read location in PC from memory
• Lookup opcode
• Find addressing mode
• Process opcode
Handling Opcodes

• Read location in PC from memory
• Lookup opcode
• Find addressing mode
• Process opcode
• Increment PC
Cpu.prototype.emulateCycle = function() {
	 // ...
	 // Get opcode at PC.
	 var opcode = this.getOpcode(this.loadMemory(this.pc));
	 var address;
	
	 // Get final address via addressing mode of opcode.
	 switch (opcode.addressingMode) {
	 	 // Zero Page
	 	 // Uses a single operand which address
	 	 // memory in zero page (0x0000-0x00FF).
	 	 case this.addressingModes.ZERO_PAGE:
	 	 	 address = this.loadMemory(this.pc + 1);
	 	 	 break;
	 }
	
	 this.pc += opcode.bytes;
	 // ...
};
Process All The Opcodes
Process All The Opcodes


• Read technical paper twice, implement
  once
Process All The Opcodes


• Read technical paper twice, implement
  once
• Debugging is hard, so get it right
Process All The Opcodes


• Read technical paper twice, implement
  once
• Debugging is hard, so get it right
• When you don’t get it right, try again
Nes.Cpu.prototype.emulateCycle = function() {
	 // ...
	 switch (opcode.type) {
	 	 // JMP
	 	 // Jump to location.
	 	 case this.operands.JMP:
	 	 	 this.pc = address;
	 	 	 break;
	 }
	 // ...
};
PPU
PPU


• Generates video signals from memory
PPU


• Generates video signals from memory
• Handles sprites, scrolling, colours
RP2C02
RP2C07
RP2C02
              RP2C07

• Different chip for NTSC/PAL
RP2C02
              RP2C07

• Different chip for NTSC/PAL
• 2KiB RAM
RP2C02
              RP2C07

• Different chip for NTSC/PAL
• 2KiB RAM
• 8x8 or 8x16 sprites
RP2C02
              RP2C07

• Different chip for NTSC/PAL
• 2KiB RAM
• 8x8 or 8x16 sprites
• Resolution of 256x240
Communicating with your PPU
Communicating with your PPU



• 0x2000-0x2007 on CPU memory map to
  PPU’s registers
Communicating with your PPU



• 0x2000-0x2007 on CPU memory map to
  PPU’s registers
• 8x8 or 8x16 pixel tiles, accessed on
  program ROM
Colour Palette

• 52 colours available
• 2 palettes, 16b each, image and sprite
• Can use 25 colours at once on screen
TileS
TileS

• Each 8x8 tile occupies 16b
TileS

• Each 8x8 tile occupies 16b
• Position of bit denotes position of pixel
TileS

• Each 8x8 tile occupies 16b
• Position of bit denotes position of pixel
• First 8 bits combine with second 8 bits
TileS

• Each 8x8 tile occupies 16b
• Position of bit denotes position of pixel
• First 8 bits combine with second 8 bits
• Combine bits to get colour index
Anatomy of a tile
  1   1   1   1   1   1   1   1

  1   1   1   1   1   1   1   1

  1   1   0   1   1   0   0   1

  1   1   0   1   0   1   1   1

  1   1   0   1   1   0   1   1

  1   1   0   1   1   1   0   1

  1   0   0   1   0   0   1   1

  1   1   1   1   1   1   1   1
Anatomy of a tile
  1   1   1    1      1     1   1   1

  1   1   1    1      1     1   1   1

  1   1   0    1      1     0   0   1

  1   1   0    1      0     1   1   1

  1   1   0    1      1     0   1   1

  1   1   0    1      1     1   0   1

  1   0   0    1      0     0   1   1

  1   1   1    1      1     1   1   1


              (simplified)
Nametables
Nametables


• Bytes which index pattern table
Nametables


• Bytes which index pattern table
• 32 horizontal and 30 vertical tiles, 960 tiles
Nametables


• Bytes which index pattern table
• 32 horizontal and 30 vertical tiles, 960 tiles
• 1KiB long, delta contains extra colour
  information
Nothing is wasted
Nothing is wasted
• Remaining 64b stores extra colour
  information (attribute bytes)
Nothing is wasted
• Remaining 64b stores extra colour
  information (attribute bytes)
• Attribute bytes map to 16 tiled blocks of
  nametable (64 32x32 pixel tiles)
Nothing is wasted
• Remaining 64b stores extra colour
  information (attribute bytes)
• Attribute bytes map to 16 tiled blocks of
  nametable (64 32x32 pixel tiles)
• Each of these blocks is sub-blocked into 4
  tiles (4 16x16 pixel tiles)
Nothing is wasted
• Remaining 64b stores extra colour
  information (attribute bytes)
• Attribute bytes map to 16 tiled blocks of
  nametable (64 32x32 pixel tiles)
• Each of these blocks is sub-blocked into 4
  tiles (4 16x16 pixel tiles)
• Sub blocks affected by 2 bits from attribute
  bytes
Put it all together
  0. 1    0    1    1 0 0 1 1
  8. 0    0    1    0 1 0 0 1
960. 1    1    0    0 0 0 1 1
=============================
     1110 1100 0011 ...
=============================
Put it all together
  0. 1    0    1    1 0 0 1 1
  8. 0    0    1    0 1 0 0 1
960. 1    1    0    0 0 0 1 1
=============================
     1110 1100 0011 ...
=============================
Put it all together
  0. 1    0    1    1 0 0 1 1
  8. 0    0    1    0 1 0 0 1
960. 1    1    0    0 0 0 1 1
=============================
     1110 1100 0011 ...
=============================
Put it all together
  0. 1    0    1    1 0 0 1 1
  8. 0    0    1    0 1 0 0 1
960. 1    1    0    0 0 0 1 1
=============================
     1110 1100 0011 ...
=============================
// Byte   at offset 0.
var a =   0xB3;
// Byte   at offset 8.
var b =   0x29;
// Byte   at offset 960.
var c =   0xC3;

var merged = (a & 0x80) >> 0x6;
merged |= b >> 0x7;
merged |= (c & 0x3) << 0x2;
Scratching the surface
Scratching the surface



• There is a whole lot more going on
Scratching the surface



• There is a whole lot more going on
• http://wiki.nesdev.com/w/index.php/PPU
Full Screen API
Full Screen API

• Look ma, no chrome
Full Screen API

• Look ma, no chrome
• Still want Chrome for performance
Full Screen API

• Look ma, no chrome
• Still want Chrome for performance
• https://developer.mozilla.org/en-US/docs/
  DOM/Using_fullscreen_mode
var goFullScreen = (function() {
    // Polyfills for cross browser support.
    return function(element, callback) {
        typeof callback != "function" && (callback = function() {});
        var requestFullScreen = getFullScreenMethod(element);

         if (requestFullScreen) {
             requestFullScreen = requestFullScreen.call(element);
         } else {
             return false;
         }

         document.addEventListener(fullScreenEvent, function() {
             callback.call(this, getFullScreenElement());
         });
    };
})();
Demo Time
Sound
Sound
• Vibration of air
Sound
• Vibration of air
• Represented as waves w/ freq. and
  amplitude
Sound
• Vibration of air
• Represented as waves w/ freq. and
  amplitude
• Frequency is number of phase changes per
  second
Sound
• Vibration of air
• Represented as waves w/ freq. and
  amplitude
• Frequency is number of phase changes per
  second
• Amplitude is volume of the wave measured
  in dB
NES Sound
NES Sound

• 5 sound channels
NES Sound

• 5 sound channels
• 2 pulse wave channels of variable duty cycle
NES Sound

• 5 sound channels
• 2 pulse wave channels of variable duty cycle
• 16 volume levels
NES Sound

• 5 sound channels
• 2 pulse wave channels of variable duty cycle
• 16 volume levels
• Pitch bending
APU
APU

• APU registers mapped to CPU memory
  starting at 0x4000
APU

• APU registers mapped to CPU memory
  starting at 0x4000
• 2 pulse-wave channels, 1 triangle-wave
  channel, 1 random-wave channel and 1
  digital channel
PULSE Wave
0x4000. 1011 1111


0x4002. 0001 0111


0x4003. 0000 0001
PULSE Wave
0x4000. 1011 1111   Volume



0x4002. 0001 0111


0x4003. 0000 0001
PULSE Wave
0x4000. 1011 1111      Volume



                    Low order bits
0x4002. 0001 0111    of raw period



0x4003. 0000 0001
PULSE Wave
0x4000. 1011 1111      Volume



                    Low order bits
0x4002. 0001 0111    of raw period


                    High order bits
0x4003. 0000 0001   of raw period
PULSE Wave
0x4000. 1011 1111                         Volume



                                       Low order bits
0x4002. 0001 0111                       of raw period
round(111860.8 / 0x117) - 1) = 400hz

                                       High order bits
0x4003. 0000 0001                      of raw period
Demo Time
Web Audio API
Web Audio API

• Based on Audio Routes
Web Audio API

• Based on Audio Routes
• Connect nodes to each other
Web Audio API

• Based on Audio Routes
• Connect nodes to each other
• Perfect for emulator sound
var gainNode = ctx.createGainNode();
gainNode.gain.value = volume;

var osc = ctx.createOscillator();
osc.connect(gainNode);
osc.type = type;
osc.frequency.value = frequency;

gainNode.connect(ctx.destination);
osc.noteOn(0);

setTimeout(function () {
    osc.noteOff(0);
}, duration);
Demo Time
Sounds good
Sounds good

• Again, scratching the surface
Sounds good

• Again, scratching the surface
• Sound information is rarer to find
Sounds good

• Again, scratching the surface
• Sound information is rarer to find
• http://wiki.nesdev.com/w/index.php/APU
Controller
Controller


• Two controllers, mapped to CPU memory
  at 0x4016 and 0x4017
Controller


• Two controllers, mapped to CPU memory
  at 0x4016 and 0x4017
• When written to, controller’s state is
  stored in sequential 8 bytes, as low order
  bit
Gamepad API
Gamepad API


• Firefox has an event based system
Gamepad API


• Firefox has an event based system
• WebKit requires polling
// Support gamepads in WebKit.
var GamePad = function(callback) {
	 if (typeof callback != "function") {
	 	 throw Error("Callback must implement [[call]].");
	 }
	 this.callback = callback;
	 this.running = false;
};

GamePad.prototype.start = function() {
    this.running = true;
    this.tick();
};

GamePad.prototype.stop = function() {
    this.running = false;
};

GamePad.prototype.tick = function() {
    if ( ! this.running) {
    	 return;
    }
	 this.callback(navigator.webkitGetGamepads());
    webkitRequestAnimationFrame(this.tick.bind(this));
};
Demo Time
Cycles
Cycles

• Components IRL run in parallel
Cycles

• Components IRL run in parallel
• Count cycles, use to sync other
  components
Cycles

• Components IRL run in parallel
• Count cycles, use to sync other
  components
• Try using Web Workers
Your very own emulator
Your very own emulator


• Spend a lot of time researching
Your very own emulator


• Spend a lot of time researching
• Start programming your own programs
Your very own emulator


• Spend a lot of time researching
• Start programming your own programs
• http://skilldrick.github.com/easy6502/
Your very own emulator


• Spend a lot of time researching
• Start programming your own programs
• http://skilldrick.github.com/easy6502/
• http://www.6502.org/books
Getting Started
Getting Started


      C8IYF
Getting Started


          C8IYF
  (Chip-8 Is Your Friend)
Tips
Tips

• JavaScript as you would C
Tips

• JavaScript as you would C
• Optimise passing around data
Tips

• JavaScript as you would C
• Optimise passing around data
• Know about V8 optimisations
Tips

• JavaScript as you would C
• Optimise passing around data
• Know about V8 optimisations
• Write your own programs
Possibilities
Possibilities


• Multiplayer via WebSockets
Possibilities


• Multiplayer via WebSockets
• Vibration API for force feedback
Possibilities


• Multiplayer via WebSockets
• Vibration API for force feedback
• File API and application cache for portable
  offline emulators
Possibilities


• Multiplayer via WebSockets
• Vibration API for force feedback
• File API and application cache for portable
  offline emulators
• localStorage for battery backed saved state
Thank You
Thank You


Questions

Mais conteúdo relacionado

Mais procurados

Device tree support on arm linux
Device tree support on arm linuxDevice tree support on arm linux
Device tree support on arm linuxChih-Min Chao
 
Kernel Recipes 2017 - The Serial Device Bus - Johan Hovold
Kernel Recipes 2017 - The Serial Device Bus - Johan HovoldKernel Recipes 2017 - The Serial Device Bus - Johan Hovold
Kernel Recipes 2017 - The Serial Device Bus - Johan HovoldAnne Nicolas
 
Kernel Recipes 2017 - What's inside the input stack? - Benjamain Tissoires
Kernel Recipes 2017 - What's inside the input stack? - Benjamain TissoiresKernel Recipes 2017 - What's inside the input stack? - Benjamain Tissoires
Kernel Recipes 2017 - What's inside the input stack? - Benjamain TissoiresAnne Nicolas
 
Tech Days 2015: Embedded Product Update
Tech Days 2015: Embedded Product UpdateTech Days 2015: Embedded Product Update
Tech Days 2015: Embedded Product UpdateAdaCore
 
Capturing Stills, Sounds, and Scenes with AV Foundation
Capturing Stills, Sounds, and Scenes with AV FoundationCapturing Stills, Sounds, and Scenes with AV Foundation
Capturing Stills, Sounds, and Scenes with AV FoundationChris Adamson
 
Animation Programming Techniques
Animation Programming TechniquesAnimation Programming Techniques
Animation Programming TechniquesAmir H. Fassihi
 
LCA2018 Open Hardware MiniConference: LoliBot Software
LCA2018 Open Hardware MiniConference: LoliBot SoftwareLCA2018 Open Hardware MiniConference: LoliBot Software
LCA2018 Open Hardware MiniConference: LoliBot SoftwareAndy Gelme
 
BSidesDelhi 2018: Headshot - Game Hacking on macOS
BSidesDelhi 2018: Headshot - Game Hacking on macOSBSidesDelhi 2018: Headshot - Game Hacking on macOS
BSidesDelhi 2018: Headshot - Game Hacking on macOSBSides Delhi
 
Linux Kernel Platform Development: Challenges and Insights
 Linux Kernel Platform Development: Challenges and Insights Linux Kernel Platform Development: Challenges and Insights
Linux Kernel Platform Development: Challenges and InsightsGlobalLogic Ukraine
 
Raspberry Pi Gaming Rig
Raspberry Pi Gaming RigRaspberry Pi Gaming Rig
Raspberry Pi Gaming RigDuc Le
 
XenSummit NA 2012: Xen on ARM Cortex A15
XenSummit NA 2012: Xen on ARM Cortex A15XenSummit NA 2012: Xen on ARM Cortex A15
XenSummit NA 2012: Xen on ARM Cortex A15The Linux Foundation
 
IPv6 Fundamentals & Securities
IPv6 Fundamentals & SecuritiesIPv6 Fundamentals & Securities
IPv6 Fundamentals & SecuritiesDon Anto
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...Yury Bushmelev
 

Mais procurados (20)

Device tree support on arm linux
Device tree support on arm linuxDevice tree support on arm linux
Device tree support on arm linux
 
Kernel Recipes 2017 - The Serial Device Bus - Johan Hovold
Kernel Recipes 2017 - The Serial Device Bus - Johan HovoldKernel Recipes 2017 - The Serial Device Bus - Johan Hovold
Kernel Recipes 2017 - The Serial Device Bus - Johan Hovold
 
Videogame Optimization
Videogame OptimizationVideogame Optimization
Videogame Optimization
 
Kernel Recipes 2017 - What's inside the input stack? - Benjamain Tissoires
Kernel Recipes 2017 - What's inside the input stack? - Benjamain TissoiresKernel Recipes 2017 - What's inside the input stack? - Benjamain Tissoires
Kernel Recipes 2017 - What's inside the input stack? - Benjamain Tissoires
 
Tech Days 2015: Embedded Product Update
Tech Days 2015: Embedded Product UpdateTech Days 2015: Embedded Product Update
Tech Days 2015: Embedded Product Update
 
Capturing Stills, Sounds, and Scenes with AV Foundation
Capturing Stills, Sounds, and Scenes with AV FoundationCapturing Stills, Sounds, and Scenes with AV Foundation
Capturing Stills, Sounds, and Scenes with AV Foundation
 
Kgdb kdb modesetting
Kgdb kdb modesettingKgdb kdb modesetting
Kgdb kdb modesetting
 
Linux Kernel Live Patching
Linux Kernel Live PatchingLinux Kernel Live Patching
Linux Kernel Live Patching
 
Animation Programming Techniques
Animation Programming TechniquesAnimation Programming Techniques
Animation Programming Techniques
 
LCA2018 Open Hardware MiniConference: LoliBot Software
LCA2018 Open Hardware MiniConference: LoliBot SoftwareLCA2018 Open Hardware MiniConference: LoliBot Software
LCA2018 Open Hardware MiniConference: LoliBot Software
 
Lets Play Together
Lets Play TogetherLets Play Together
Lets Play Together
 
BSidesDelhi 2018: Headshot - Game Hacking on macOS
BSidesDelhi 2018: Headshot - Game Hacking on macOSBSidesDelhi 2018: Headshot - Game Hacking on macOS
BSidesDelhi 2018: Headshot - Game Hacking on macOS
 
Linux Kernel Platform Development: Challenges and Insights
 Linux Kernel Platform Development: Challenges and Insights Linux Kernel Platform Development: Challenges and Insights
Linux Kernel Platform Development: Challenges and Insights
 
Raspberry Pi Gaming Rig
Raspberry Pi Gaming RigRaspberry Pi Gaming Rig
Raspberry Pi Gaming Rig
 
XenSummit NA 2012: Xen on ARM Cortex A15
XenSummit NA 2012: Xen on ARM Cortex A15XenSummit NA 2012: Xen on ARM Cortex A15
XenSummit NA 2012: Xen on ARM Cortex A15
 
IPv6 Fundamentals & Securities
IPv6 Fundamentals & SecuritiesIPv6 Fundamentals & Securities
IPv6 Fundamentals & Securities
 
Polstra 44con2012
Polstra 44con2012Polstra 44con2012
Polstra 44con2012
 
Porting Android
Porting AndroidPorting Android
Porting Android
 
Device tree
Device treeDevice tree
Device tree
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...
 

Semelhante a Emulating With JavaScript

Micro control idsecconf2010
Micro control idsecconf2010Micro control idsecconf2010
Micro control idsecconf2010idsecconf
 
Building a robot with the .Net Micro Framework
Building a robot with the .Net Micro FrameworkBuilding a robot with the .Net Micro Framework
Building a robot with the .Net Micro FrameworkDucas Francis
 
Finding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyFinding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyPriyanka Aash
 
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangPractical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangLyon Yang
 
Your 1st Ceph cluster
Your 1st Ceph clusterYour 1st Ceph cluster
Your 1st Ceph clusterMirantis
 
Computerhardware 130909042641-
Computerhardware 130909042641-Computerhardware 130909042641-
Computerhardware 130909042641-zeyneptsd
 
Alessandro Abbruzzetti - Kernal64
Alessandro Abbruzzetti - Kernal64Alessandro Abbruzzetti - Kernal64
Alessandro Abbruzzetti - Kernal64Scala Italy
 
Computer Main Comppponents.pdf
Computer Main Comppponents.pdfComputer Main Comppponents.pdf
Computer Main Comppponents.pdfthinalost
 
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)Nate Lawson
 
Advanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONAdvanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONLyon Yang
 
motherboardppt.pdf
motherboardppt.pdfmotherboardppt.pdf
motherboardppt.pdfPaulBarbar1
 
Programming the Cell Processor A simple raytracer from pseudo-code to spu-code
Programming the Cell Processor A simple raytracer from pseudo-code to spu-codeProgramming the Cell Processor A simple raytracer from pseudo-code to spu-code
Programming the Cell Processor A simple raytracer from pseudo-code to spu-codeSlide_N
 
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese..."Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...Edge AI and Vision Alliance
 
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...DefconRussia
 
embedded-systems-for-beginners
embedded-systems-for-beginnersembedded-systems-for-beginners
embedded-systems-for-beginnersmohamed gaber
 

Semelhante a Emulating With JavaScript (20)

Micro control idsecconf2010
Micro control idsecconf2010Micro control idsecconf2010
Micro control idsecconf2010
 
Building a robot with the .Net Micro Framework
Building a robot with the .Net Micro FrameworkBuilding a robot with the .Net Micro Framework
Building a robot with the .Net Micro Framework
 
mtl_rubykaigi
mtl_rubykaigimtl_rubykaigi
mtl_rubykaigi
 
Finding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyFinding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated Disassembly
 
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon YangPractical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
Practical IoT Exploitation (DEFCON23 IoTVillage) - Lyon Yang
 
Your 1st Ceph cluster
Your 1st Ceph clusterYour 1st Ceph cluster
Your 1st Ceph cluster
 
Computerhardware 130909042641-
Computerhardware 130909042641-Computerhardware 130909042641-
Computerhardware 130909042641-
 
Alessandro Abbruzzetti - Kernal64
Alessandro Abbruzzetti - Kernal64Alessandro Abbruzzetti - Kernal64
Alessandro Abbruzzetti - Kernal64
 
Ibm cell
Ibm cell Ibm cell
Ibm cell
 
Computer Main Comppponents.pdf
Computer Main Comppponents.pdfComputer Main Comppponents.pdf
Computer Main Comppponents.pdf
 
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)
Copy Protection Wars: Analyzing Retro and Modern Schemes (RSA 2007)
 
Computer hardware
Computer hardwareComputer hardware
Computer hardware
 
Advanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCONAdvanced SOHO Router Exploitation XCON
Advanced SOHO Router Exploitation XCON
 
motherboardppt.pdf
motherboardppt.pdfmotherboardppt.pdf
motherboardppt.pdf
 
Motherboard ppt
Motherboard pptMotherboard ppt
Motherboard ppt
 
Programming the Cell Processor A simple raytracer from pseudo-code to spu-code
Programming the Cell Processor A simple raytracer from pseudo-code to spu-codeProgramming the Cell Processor A simple raytracer from pseudo-code to spu-code
Programming the Cell Processor A simple raytracer from pseudo-code to spu-code
 
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese..."Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...
"Making Computer Vision Software Run Fast on Your Embedded Platform," a Prese...
 
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...
Nikita Abdullin - Reverse-engineering of embedded MIPS devices. Case Study - ...
 
You suck at Memory Analysis
You suck at Memory AnalysisYou suck at Memory Analysis
You suck at Memory Analysis
 
embedded-systems-for-beginners
embedded-systems-for-beginnersembedded-systems-for-beginners
embedded-systems-for-beginners
 

Último

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 

Último (20)

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 

Emulating With JavaScript

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. \n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n
  172. \n
  173. \n
  174. \n
  175. \n
  176. \n
  177. \n
  178. \n
  179. \n
  180. \n