Advertisement
Guest User

dont look

a guest
Oct 17th, 2019
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.19 KB | None | 0 0
  1. // XMega65 Kernal Development Template
  2. // Each function of the kernal is a no-args function
  3. // The functions are placed in the SYSCALLS table surrounded by JMP and NOP
  4.  
  5. #pragma cpu(rom6502)
  6.  
  7. import "string"
  8.  
  9. #pragma link("mega65hyper.ld")
  10.  
  11.  
  12. const char* RASTER = 0xd012;
  13. const char* VIC_MEMORY = 0xd018;
  14. const char* SCREEN = 0x0400;
  15. const char* BGCOL = 0xd021;
  16. const char* COLS = 0xd800;
  17. const char BLACK = 0;
  18. const char BLUE = 6;
  19. const char WHITE = 1;
  20.  
  21. char[] MESSAGE = "checkpoint 5.2";
  22. char[] FIRST = "checkpoint 5.2 berr0185";
  23.  
  24. const unsigned char STATE_NOTRUNNING = $00;
  25. const unsigned char STATE_RUNNING = $01;
  26.  
  27. unsigned char pid_counter = 0;
  28.  
  29. // Process Descriptor Block definition
  30. struct process_descriptor_block
  31. {
  32.  // Unique identifier for the process
  33.   unsigned char process_id;
  34.  
  35.   // Current state of the process
  36.   unsigned char process_state;
  37.  
  38.   // Human readable name of the process
  39.   char* process_name;
  40.  
  41.   // Where this process is stored when not running
  42.   // i.e., where in the $20000-$5FFFF memory range the
  43.   // process is stored when not running.
  44.   unsigned long storage_start_address;
  45.   unsigned long storage_end_address;
  46.  
  47.   // Stored registers and related machine state for this
  48.   // process (for the $D640-$D67E machine state registers)
  49.   unsigned char* stored_state;
  50. };
  51.  
  52. // Process stored state will live at $C000-$C7FF, with 256 bytes
  53. // for each process reserved
  54. const unsigned char *stored_pdbs = $C000;
  55. // 8 processes x 16 bytes = 128 bytes for names
  56. const char *process_names = $C800;
  57. // 8 processes x 64 bytes context state = 512 bytes
  58. const unsigned char *process_context_states = $C900;
  59.  
  60.  
  61.  
  62. volatile unsigned char *current_screen_line = SCREEN;
  63. volatile unsigned char current_screen_x = 0;
  64.  
  65. unsigned char next_free_pid()
  66. {
  67.   unsigned short i;
  68.  
  69.   // Start with the next process ID
  70.   unsigned char pid=++pid_counter;
  71.  
  72.   // then make sure that it isn't currently in use by another process
  73.   // This loop must terminate according to the Pigeon Hole Principlle,
  74.   // i.e., there are more possible PIDs than there are processes, so
  75.   // iterating through them will find at least one.
  76.   unsigned char stepped=1;
  77.   while(stepped) {
  78.     stepped=0;
  79.     for(i=0;i<8;i++) {
  80.       struct process_descriptor_block *p
  81.         =(struct process_descriptor_block*)((unsigned short)stored_pdbs+(i<<8));
  82.       if (pid==p->process_id) { pid++; stepped=1; }
  83.     }
  84.   }
  85.  
  86.   return pid;
  87. }
  88.  
  89. void print_char(char c)
  90. {
  91.    current_screen_line[current_screen_x++]=c;
  92. }
  93.  
  94. void print_to_screen(char *message)
  95. {
  96.   char *c=message;
  97.   while(*c) {
  98.     current_screen_line[current_screen_x++]=*c;
  99.     c++;
  100.   }
  101. }
  102.  
  103. void print_newline()
  104. {
  105.   current_screen_line+=40;
  106.   current_screen_x=0;
  107. }
  108.  
  109.  
  110. void print_hex(unsigned word value)
  111. {
  112.   char[5] hex;
  113.   unsigned char i;
  114.   for(i=0;i<8;i++) {
  115.     if (value<0xa000) hex[i]='0'+(char)(value>>12);
  116.     else hex[i]=(char)(value>>12)-9;
  117.     value<<=4;
  118.   }
  119.   hex[4]=0;
  120.   print_to_screen(hex);
  121. }
  122.  
  123. void print_dhex(unsigned dword value)
  124. {
  125.   print_hex((word)(value>>16));
  126.   print_hex((unsigned word)value);
  127. }
  128.  
  129. void describe_pdb(unsigned char pdb_number)
  130. {
  131.   unsigned char i;
  132.   struct process_descriptor_block *p
  133.     =(struct process_descriptor_block *)(((unsigned short)stored_pdbs)+(((unsigned short)pdb_number)<<8));
  134.  
  135.   print_to_screen("pdb#");
  136.   print_hex((word)pdb_number);
  137.   print_to_screen(":");
  138.   print_newline();
  139.  
  140.   print_to_screen("  pid:          ");
  141.   print_hex((word)p->process_id);
  142.   print_newline();
  143.  
  144.   print_to_screen("  process name: ");
  145.   char *n=p->process_name;
  146.   for(i=0;n[i]&&(i<17);i++) {
  147.     print_char(n[i]);
  148.   }
  149.   print_newline();
  150.  
  151.   print_to_screen("  mem start:    $");
  152.   print_dhex(p->storage_start_address);
  153.   print_newline();
  154.  
  155.   print_to_screen("  mem end:      $");
  156.   print_dhex(p->storage_end_address);
  157.   print_newline();
  158.  
  159.   print_to_screen("  pc:           $");
  160.   unsigned short *ss=p->stored_state;
  161.   print_hex(ss[4]);
  162.   print_newline();
  163.  
  164.  
  165. }
  166.  
  167. // Setup a new process descriptor block
  168. void initialise_pdb(unsigned char pdb_number,char *name)
  169. {
  170.   unsigned char i;
  171.  
  172.   struct process_descriptor_block *p
  173.     =(struct process_descriptor_block *)(((unsigned short)stored_pdbs)+(((unsigned short)pdb_number)<<8));
  174.  
  175.   // Setup process ID
  176.   p->process_id = next_free_pid();
  177.   //XXX - Call the function next_free_pid() to get a process ID for the
  178.   //process in this PDB, and store it in p->process_id
  179.    
  180.  
  181.   // Setup process name
  182.   // (32 bytes space for each to fit 16 chars + nul)
  183.   // (we could just use 17 bytes, but kickc can't multiply by 17)
  184.   p->process_name=process_names+(((short)i)<<5);
  185.   char *pn=p->process_name;
  186.  
  187.   for(int i = 0; i < 17; i++)
  188.   {
  189.     pn[i]=name[i];
  190.   }
  191.  
  192.   //XXX - copy the string in the array 'name' into the array 'p->process_name'
  193.   //XXX - To make your life easier, do something like char *pn=p->process_name
  194.   //      Then you can just do something along the lines of pn[...]=name[...]
  195.   //      in a loop to copy the name into place.
  196.   //      (The arrays are both 17 bytes long)
  197.  
  198.   // Set process state as not running.
  199.   //XXX - Put the value STATE_NOTRUNNING into p->process_state
  200.   p->process_state = STATE_NOTRUNNING;
  201.  
  202.  
  203.   // Set stored memory area
  204.   // (for now, we just use fixed 8KB steps from $30000-$3FFFF
  205.   // corresponding to the PDB number
  206.   //XXX - Set p->storage_start_address to the correct start address
  207.   //for a process that is in this PDB.
  208.   //The correct address is $30000 + (((unsigned dword)pdb_number)*$2000);
  209.   p->storage_start_address = $30000 + (((unsigned dword)pdb_number)*$2000);
  210.  
  211.   //XXX - Then do the same for the end address of the process
  212.   //This gets stored into p->storage_end_address and the correct
  213.   //address is $31FFF + (((unsigned dword)pdb_number)*$2000);
  214.   p->storage_end_address = $31FFF + (((unsigned dword)pdb_number)*$2000);
  215.  
  216.  
  217.   // Initialise processor state for standard entry at $080D
  218.   // Everything to zero, except for a few things we will set manually
  219.  
  220.   // 64 bytes context switching state for each process
  221.   p->stored_state=process_context_states+(((unsigned short)pdb_number)<<6);
  222.   unsigned char *ss=p->stored_state;
  223.  
  224.   //XXX - Set all 64 bytes of the array 'ss' to zero, to clear the context
  225.   //switching state
  226.   for(i=0;i<63;i++)
  227.   {
  228.     ss[i] = $00;
  229.   }
  230.  
  231.   // Set tandard CPU flags (8-bit stack, interrupts disabled)
  232.   ss[7] = $24;
  233.  
  234.   //XXX - Set the stack pointer to $01FF
  235.   //(This requires a bit of fiddly pointer arithmetic, so to save you
  236.   //the trouble working it out, you can use the following as the left
  237.   //side of the expression:   *(unsigned short *)&ss[x] = ...
  238.   //where x is the offset of the stack pointer low byte (SPL) in the
  239.   //Hypervisor saved state registers in Appendix D of the MEGA65 User's
  240.   //Guide. i.e., if it were at $D640, x would be replaced with 0, and
  241.   //if it were at $D641, x would be replaced with 1, and so on.
  242.   //XXX - Note that the MEGA65 User's Guide has been updated on FLO.
  243.   //You will required the latest version, as otherwise SPL is not listed.
  244.  
  245.   int x = 5;
  246.   *(unsigned short *)&ss[x] = $01FF;
  247.  
  248.   //XXX - Set the program counter to $080D
  249.   //(This requires a bit of fiddly pointer arithmetic, so to save you
  250.   //the trouble working it out, you can use the following as the left
  251.   //side of the expression:   *(unsigned short *)&ss[x] = ...
  252.   //where x is the offset of the program counter low byte (PCL) in the
  253.   //Hypervisor saved state registers in Appendix D of the MEGA65 User's
  254.   //Guide.
  255.  
  256.   x = 8;
  257.   *(unsigned short *)&ss[x] = $080D;
  258.  
  259.  
  260.   return;
  261. }
  262.  
  263.  
  264. void main() {
  265.  
  266. }
  267.  
  268. void exit_hypervisor()
  269. {
  270.     // Exit hypervisor
  271.     *(char *)$D67F = $01;
  272. }
  273.  
  274. //Sample sys calls to display a character on screen
  275. void syscall00()
  276. {
  277.   exit_hypervisor();
  278. }
  279. void syscall01()
  280. {
  281.   exit_hypervisor();
  282. }
  283.  
  284. void syscall02()
  285. {
  286.   exit_hypervisor();
  287. }
  288.  
  289. void syscall03()
  290. {
  291.     exit_hypervisor();
  292. }
  293.  
  294. void syscall04()
  295. {
  296.     exit_hypervisor();
  297. }
  298.  
  299. void syscall05()
  300. {
  301.     exit_hypervisor();
  302. }
  303.  
  304. void syscall06()
  305. {
  306.     exit_hypervisor();
  307. }
  308.  
  309. void syscall07()
  310. {
  311.     exit_hypervisor();
  312. }
  313.  
  314. void syscall08()
  315. {
  316.     exit_hypervisor();
  317. }
  318.  
  319. void syscall09()
  320. {
  321.     exit_hypervisor();
  322. }
  323.  
  324. void syscall0A()
  325. {
  326.     exit_hypervisor();
  327. }
  328.  
  329. void syscall0B()
  330. {
  331.     exit_hypervisor();
  332. }
  333.  
  334. void syscall0C()
  335. {
  336.     exit_hypervisor();
  337. }
  338.  
  339. void syscall0D()
  340. {
  341.     exit_hypervisor();
  342. }
  343.  
  344. void syscall0E()
  345. {
  346.     exit_hypervisor();
  347. }
  348.  
  349. void syscall0F()
  350. {
  351.     exit_hypervisor();
  352. }
  353.  
  354. void syscall10()
  355. {
  356.     exit_hypervisor();
  357. }
  358.  
  359. void SECURENTR()
  360. {
  361.     exit_hypervisor();
  362. }
  363.  
  364. void SECUREXIT()
  365. {
  366.     exit_hypervisor();
  367. }
  368.  
  369. void syscall13()
  370. {
  371.     exit_hypervisor();
  372. }
  373.  
  374. void syscall14()
  375. {
  376.     exit_hypervisor();
  377. }
  378.  
  379. void syscall15()
  380. {
  381.     exit_hypervisor();
  382. }
  383.  
  384. void syscall16()
  385. {
  386.     exit_hypervisor();
  387. }
  388.  
  389. void syscall17()
  390. {
  391.     exit_hypervisor();
  392. }
  393.  
  394. void syscall18()
  395. {
  396.     exit_hypervisor();
  397. }
  398.  
  399. void syscall19()
  400. {
  401.     exit_hypervisor();
  402. }
  403.  
  404. void syscall1A()
  405. {
  406.     exit_hypervisor();
  407. }
  408.  
  409. void syscall1B()
  410. {
  411.     exit_hypervisor();
  412. }
  413.  
  414. void syscall1C()
  415. {
  416.     exit_hypervisor();
  417. }
  418.  
  419. void syscall1D()
  420. {
  421.     exit_hypervisor();
  422. }
  423.  
  424. void syscall1E()
  425. {
  426.     exit_hypervisor();
  427. }
  428.  
  429. void syscall1F()
  430. {
  431.     exit_hypervisor();
  432. }
  433.  
  434. void syscall20()
  435. {
  436.     exit_hypervisor();
  437. }
  438.  
  439. void syscall21()
  440. {
  441.     exit_hypervisor();
  442. }
  443.  
  444. void syscall22()
  445. {
  446.     exit_hypervisor();
  447. }
  448.  
  449. void syscall23()
  450. {
  451.     exit_hypervisor();
  452. }
  453.  
  454. void syscall24()
  455. {
  456.     exit_hypervisor();
  457. }
  458.  
  459. void syscall25()
  460. {
  461.     exit_hypervisor();
  462. }
  463.  
  464. void syscall26()
  465. {
  466.     exit_hypervisor();
  467. }
  468.  
  469. void syscall27()
  470. {
  471.     exit_hypervisor();
  472. }
  473.  
  474. void syscall28()
  475. {
  476.     exit_hypervisor();
  477. }
  478.  
  479. void syscall29()
  480. {
  481.     exit_hypervisor();
  482. }
  483.  
  484. void syscall2A()
  485. {
  486.     exit_hypervisor();
  487. }
  488.  
  489. void syscall2B()
  490. {
  491.     exit_hypervisor();
  492. }
  493.  
  494. void syscall2C()
  495. {
  496.     exit_hypervisor();
  497. }
  498.  
  499. void syscall2D()
  500. {
  501.     exit_hypervisor();
  502. }
  503.  
  504. void syscall2E()
  505. {
  506.     exit_hypervisor();
  507. }
  508.  
  509. void syscall2F()
  510. {
  511.     exit_hypervisor();
  512. }
  513.  
  514. void syscall30()
  515. {
  516.     exit_hypervisor();
  517. }
  518.  
  519. void syscall31()
  520. {
  521.     exit_hypervisor();
  522. }
  523.  
  524. void syscall32()
  525. {
  526.     exit_hypervisor();
  527. }
  528.  
  529. void syscall33()
  530. {
  531.     exit_hypervisor();
  532. }
  533.  
  534. void syscall34()
  535. {
  536.     exit_hypervisor();
  537. }
  538.  
  539. void syscall35()
  540. {
  541.     exit_hypervisor();
  542. }
  543.  
  544. void syscall36()
  545. {
  546.     exit_hypervisor();
  547. }
  548.  
  549. void syscall37()
  550. {
  551.     exit_hypervisor();
  552. }
  553.  
  554. void syscall38()
  555. {
  556.     exit_hypervisor();
  557. }
  558.  
  559. void syscall39()
  560. {
  561.     exit_hypervisor();
  562. }
  563.  
  564. void syscall3A()
  565. {
  566.     exit_hypervisor();
  567. }
  568.  
  569. void syscall3B()
  570. {
  571.     exit_hypervisor();
  572. }
  573.  
  574. void syscall3C()
  575. {
  576.     exit_hypervisor();
  577. }
  578.  
  579. void syscall3D()
  580. {
  581.     exit_hypervisor();
  582. }
  583.  
  584. void syscall3E()
  585. {
  586.     exit_hypervisor();
  587. }
  588.  
  589. void syscall3F()
  590. {
  591.     exit_hypervisor();
  592. }
  593.  
  594. void RESET()
  595. {
  596.  
  597.     //Initializes screen memory
  598.     *VIC_MEMORY = 0x14;
  599.    
  600.     //Fill the screen
  601.     memset(SCREEN, ' ', 40*25);
  602.  
  603.     //Sets the colour of every char on screen (white)
  604.     memset(COLS, WHITE, 40*25);
  605.  
  606.     //Print the message
  607.     char* sc = SCREEN+40; //one line down
  608.     char* msg = FIRST; //the msg to display
  609.  
  610.     //copy routine that copies the string
  611.     while(*msg)
  612.     {
  613.         *sc++ = *msg++;
  614.     }
  615.  
  616.     current_screen_line = SCREEN;
  617.         print_newline();
  618.     print_newline();
  619.         print_newline();
  620.  
  621.         initialise_pdb(0,"program1.prg");
  622.         describe_pdb(0);
  623.  
  624.     //Forever loop displaying two white lines
  625.     while(true)
  626.     {
  627.         if(*RASTER==54 || *RASTER==66)
  628.         {
  629.             *BGCOL = WHITE;
  630.         }
  631.         else
  632.         {
  633.             *BGCOL = BLACK;
  634.         }  
  635.     }
  636.  
  637.     exit_hypervisor();
  638.  
  639. }
  640.  
  641. void PAGFAULT()
  642. {
  643.     exit_hypervisor();
  644. }
  645.  
  646. void RESTORKEY()
  647. {
  648.     exit_hypervisor();
  649. }
  650.  
  651. void ALTTABKEY()
  652. {
  653.     exit_hypervisor();
  654. }
  655.  
  656. void VF011RD()
  657. {
  658.     exit_hypervisor();
  659. }
  660.  
  661. void VF011WR()
  662. {
  663.     exit_hypervisor();
  664. }
  665.  
  666. void RESERVED()
  667. {
  668.     exit_hypervisor();
  669. }
  670.  
  671. void CPUKIL()
  672. {
  673.     exit_hypervisor();
  674. }
  675.  
  676.  
  677.  
  678. //Now we select the SYSCALL segment to hold the SYSCALL/trap entry point table.
  679. #pragma data_seg(Syscall)
  680.  
  681. //The structure of each entry point is JMP (handler address) + NOP,
  682. // We have a char (xjmp) to hold the opcode for the JMP instruction,
  683. //and then put the address of the SYSCALL/trap handler in the next
  684. //two points as a pointer, and end with the NOP instruction opcode.
  685. struct SysCall
  686. {
  687.     char xjmp;      //Holds $4C, the JMP $nnnn opcode
  688.     void()* syscall;    //Holds handler address, will be the target of the JMP
  689.     char xnop;      //Holds $EA, the NOP opcode
  690. };
  691.  
  692. //To save writing 0x4c and 0xEA all the time, we define them as constants
  693. const char JMP = 0x4c;
  694. const char NOP = 0xea;
  695.  
  696. //Each line is an instance of the struct SysCall from above, with the JMP
  697. //opcode value, the address of the handler routine and the NOP opcode.
  698. export struct SysCall[] SYSCALLS =
  699. {
  700.     { JMP, &syscall00, NOP },
  701.     { JMP, &syscall01, NOP },
  702.     { JMP, &syscall02, NOP },
  703.     { JMP, &syscall03, NOP },
  704.     { JMP, &syscall04, NOP },
  705.     { JMP, &syscall05, NOP },
  706.     { JMP, &syscall06, NOP },
  707.     { JMP, &syscall07, NOP },
  708.     { JMP, &syscall08, NOP },
  709.     { JMP, &syscall09, NOP },
  710.     { JMP, &syscall0A, NOP },
  711.     { JMP, &syscall0B, NOP },
  712.     { JMP, &syscall0C, NOP },
  713.     { JMP, &syscall0D, NOP },
  714.     { JMP, &syscall0E, NOP },
  715.     { JMP, &syscall0F, NOP },
  716.     { JMP, &syscall10, NOP },
  717.     { JMP, &SECURENTR, NOP },
  718.     { JMP, &SECUREXIT, NOP },
  719.     { JMP, &syscall13, NOP },
  720.     { JMP, &syscall14, NOP },
  721.     { JMP, &syscall15, NOP },
  722.     { JMP, &syscall16, NOP },
  723.     { JMP, &syscall17, NOP },
  724.     { JMP, &syscall18, NOP },
  725.     { JMP, &syscall19, NOP },
  726.     { JMP, &syscall1A, NOP },
  727.     { JMP, &syscall1B, NOP },
  728.     { JMP, &syscall1C, NOP },
  729.     { JMP, &syscall1D, NOP },
  730.     { JMP, &syscall1E, NOP },
  731.     { JMP, &syscall1F, NOP },
  732.     { JMP, &syscall20, NOP },
  733.     { JMP, &syscall21, NOP },
  734.     { JMP, &syscall22, NOP },
  735.     { JMP, &syscall23, NOP },
  736.     { JMP, &syscall24, NOP },
  737.     { JMP, &syscall25, NOP },
  738.     { JMP, &syscall26, NOP },
  739.     { JMP, &syscall27, NOP },
  740.     { JMP, &syscall28, NOP },
  741.     { JMP, &syscall29, NOP },
  742.     { JMP, &syscall2A, NOP },
  743.     { JMP, &syscall2B, NOP },
  744.     { JMP, &syscall2C, NOP },
  745.     { JMP, &syscall2D, NOP },
  746.     { JMP, &syscall2E, NOP },
  747.     { JMP, &syscall2F, NOP },
  748.     { JMP, &syscall30, NOP },
  749.     { JMP, &syscall31, NOP },
  750.     { JMP, &syscall32, NOP },
  751.     { JMP, &syscall33, NOP },
  752.     { JMP, &syscall34, NOP },
  753.     { JMP, &syscall35, NOP },
  754.     { JMP, &syscall36, NOP },
  755.     { JMP, &syscall37, NOP },
  756.     { JMP, &syscall38, NOP },
  757.     { JMP, &syscall39, NOP },
  758.     { JMP, &syscall3A, NOP },
  759.     { JMP, &syscall3B, NOP },
  760.     { JMP, &syscall3C, NOP },
  761.     { JMP, &syscall3D, NOP },
  762.     { JMP, &syscall3E, NOP },
  763.     { JMP, &syscall3F, NOP }
  764. };
  765.  
  766. //Function for undefined traps
  767. void undefined_trap()
  768. {
  769.    
  770. }
  771.  
  772.  
  773.  
  774. //IN this example we only had 2 syscalls defined, so rather than having
  775. //another 62 lines, we can just ask KickC to make the TRAP table begin
  776. //at the next mulitple of $100, ie at $8100
  777. export align(0x100) struct SysCall[] SYSCALL_RESET =
  778. {
  779.     { JMP, &RESET, NOP },
  780.     { JMP, &undefined_trap, NOP },
  781.     { JMP, &undefined_trap, NOP },
  782.     { JMP, &undefined_trap, NOP },
  783.     { JMP, &undefined_trap, NOP },
  784.     { JMP, &undefined_trap, NOP },
  785.     { JMP, &undefined_trap, NOP },
  786.     { JMP, &undefined_trap, NOP },
  787.     { JMP, &undefined_trap, NOP },
  788.     { JMP, &undefined_trap, NOP },
  789.     { JMP, &undefined_trap, NOP },
  790.     { JMP, &undefined_trap, NOP },
  791.     { JMP, &undefined_trap, NOP },
  792.     { JMP, &undefined_trap, NOP },
  793.     { JMP, &undefined_trap, NOP },
  794.     { JMP, &undefined_trap, NOP },
  795.     { JMP, &undefined_trap, NOP },
  796.     { JMP, &undefined_trap, NOP },
  797.     { JMP, &undefined_trap, NOP },
  798.     { JMP, &undefined_trap, NOP },
  799.     { JMP, &undefined_trap, NOP },
  800.     { JMP, &undefined_trap, NOP },
  801.     { JMP, &undefined_trap, NOP },
  802.     { JMP, &undefined_trap, NOP },
  803.     { JMP, &undefined_trap, NOP },
  804.     { JMP, &undefined_trap, NOP },
  805.     { JMP, &undefined_trap, NOP },
  806.     { JMP, &undefined_trap, NOP },
  807.     { JMP, &undefined_trap, NOP },
  808.     { JMP, &undefined_trap, NOP },
  809.     { JMP, &undefined_trap, NOP },
  810.     { JMP, &undefined_trap, NOP },
  811.     { JMP, &undefined_trap, NOP },
  812.     { JMP, &undefined_trap, NOP },
  813.     { JMP, &undefined_trap, NOP },
  814.     { JMP, &undefined_trap, NOP },
  815.     { JMP, &undefined_trap, NOP },
  816.     { JMP, &undefined_trap, NOP },
  817.     { JMP, &undefined_trap, NOP },
  818.     { JMP, &undefined_trap, NOP },
  819.     { JMP, &undefined_trap, NOP },
  820.     { JMP, &undefined_trap, NOP },
  821.     { JMP, &undefined_trap, NOP },
  822.     { JMP, &undefined_trap, NOP },
  823.     { JMP, &undefined_trap, NOP },
  824.     { JMP, &undefined_trap, NOP },
  825.     { JMP, &undefined_trap, NOP },
  826.     { JMP, &undefined_trap, NOP },
  827.     { JMP, &undefined_trap, NOP }
  828. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement