+ Reply to Thread
Results 1 to 8 of 8

Thread: Key-Points For Beginners

  1. #1
    Wire Sofaking Hitman271's Avatar
    Join Date
    Feb 2008
    Location
    Why? You looking for somebody?
    Posts
    731

    Default Key-Points For Beginners

    The whole point of this is to put alot of concepts and ideas into one place for beginners. Strings,using strings,and reading strings are some of the things in this that were hard to find and even then were vague.I try to explain those and others with several examples of each.

    These are in fact working cpu programs just copy and paste into your garrysmod/data/cpu chips folder.

    Any questions on what I went over and mistakes I might've made are gladly welcome.But, try to keep the help to a level that the beginner can understand as this was what the whole thread was intended. Also note that I urge anyone to post their own programs that you know to indefinitely work in this thread. But please try to not clutter so people can easily learn from this.

    This first section is writing a string to a console screen

    Code:
    //To wire up spawn a cpu,data port,console screen,and 2 different inputs for left and right.
    //I used a 4 and 6 numpad input.Wire port 0 to whatever "left" input you have and wire port 1
    //to the "right" input.Wire the cpu's membus input to the console screen.
    //The whole premise is to navigate from the first screen of text to another part.Although its only 2 lines..
    Start:
      jmp  aMain//This first section are the calls and On-screen Text.Note how each different string has a separate label i.e. Left,aStart..
     text://I also skip most of this part with the "jmp aMain" since not doing so might give error if you get to the ret.
       aStart://first choice that will show
        db 'Welcome Player!',-1//These -1's are to show where the string(or what I db'd) stops.
        db '4 is left and 6 is right',-1//Really is to let the Write call know when to stop writing.
       Left://second choice
        db 'Now Left.Left Again or Right?',-1//The different labels are to go to an individual string.
       Right://second  choice
        db 'Now Right.Right Again or Left?',-1//This -1 is used again at aWrite,look.
       bEnd:
         db 'End of Servicable Moves',-1//Db makes the makes those words into the "string".Note that the quotes around the db have to be the same.None of this """"String'
    Calls:
       Clear://This type of function is one of the most useful and easy around.Let's start with the #.If eax is 50, and we tell it mov #eax,10 that will make the memory location of 50 be ten but not the eax itself.
         push  eax
         mov  eax,65536//The console screen's clear is at mem address 2041 so why are we setting it to 65536?To get on the first memory address outside of the cpu's internal ram and then to get to the screen's 2041 on its memory.
         add  eax,2041//We add them together to to get to the console screen's memory.2041 just happens to be where the console screen's clear screen is on its memory. 
         mov  #eax,1//Note how we do the all-important process of clearing it with 1...
         mov  #eax,0//And then setting it back to avoid issues
         pop  eax
         ret//Remember that when the code hits the "ret" it will return to whatever is underneath the call.(Continued at call clear)
       Write://Ebx is the string that I am reading from,Edx is the Color of the pixel or "parameter"
          mov  eax,65536//If you are using hi-speed you will have to write outside of the cpu's memory,which stops at 65535.Which is why I will start at 1 above that.
          aWrite:
            cmp  #ebx,-1//When there are still characters in the string, they won't be -1 but when the string is done the -1 will pop up.That's why I check for it.
            je  aEnd//If it does pop up I go ahead and jump or "jmp" to the aEnd.
            mov  #eax,#ebx//The way the memory goes in the con screen's memory is character then parameter then character then parameter.....
            inc  eax//Since we compared or "cmp"'d the #ebx,we know that it is in fact in the string so we write it to the screen's current pixel or byte which is held in the eax register
            mov  #eax,edx//What we moved or "mov"'d to the eax was a character on the nth pixel,it is now on the parameter or color of that same nth digit. 
            inc  eax//increasing the eax once will go to the next pixel since we already put the character and parameter of the last one.
            inc  ebx//increasing this will go to the next character in the string.So if we were just at t in "The Cowboy" we are now at the h!
            jmp  aWrite//this will loop it back to the beginning of this function to get the whole string into the screen.Note how we jump to aWrite and not the regular Write since that would reset the eax,otherwise putting it back at the first pixel.
          aEnd://Note how I never called aEnd or aWrite but just Write.It will return or "ret" to the last caller.
           ret  
    aMain://This will start the code off with the title screen.
    call clear//After the call is done the code will come back to whatever is underneath the call i.e. "mov  edx,000999"
      
    mov  edx,000999//This register is for the color of the text on screena and won't be changed afterwards.
      mov  ebx,aStart//Note carefully about how "aStart" isn't a variable.It is where the 'Welcome Player!' string starts.
      call  Write//A great thing about calls is that you can do alot without having to retype it again.I use the write call in almost in the underlying labels.
    aWait:
      cmp port0,1//This part is just to tell if you've pressed the left or right.
      je  Leh
      cmp  port1,1
      je  Rih
      jmp  aWait//The two labels below do the same thing except say which string they want put on the screen
    Leh:
      call clear//This will call the clear label to "clear" the screen
      mov  ebx,left//I want to get the string after the left label so I set the ebx to the left label.
      call write
      jmp  end
    Rih:
      call clear
      mov  ebx,right//They both will call clear ,then tell which string to process using ebx,then call write to have that certain string be put on-screen. 
      call write
    End://
      Buffer: //This part is highly screwed up and its purpose is to allow time for the left or right to be let go.In other words,disregard this "buffer"
      cmp  port0,1
      je  buffer
      cmp  port1,1
      je  buffer
      aBuffer:
      cmp  port0,1
      je cend
      cmp  port1,0
      je  cend
    cEnd:
      call  clear
      mov  ebx,bEnd
      call Write
    This second section is for the segment register memory opcode. Example is mov eax,es:#edi. To make it work put in the address bus settings,then wire the Memory2 to the keyboard.Then the result will be in port 1. Esp is normally moved with the push opcode but then is reverted back with the pop.

    Code:
    //Set the address bus to -------#1 offset 0---#2offset 2048----#1 size 2048---#2 size 64
    //This program takes the first buffer of the wired keyboard to port 1.
    Start:
      mov  es,esp//Es is being set to esp which is a stack pointer.Esp is at the bottom of the stack i.e. 65535
      inc es//Since it is 1 short of 65536, we add 1 or just increment it or"inc"
      mov  edi,2048//This is the address where the first keyboard buffer resides
      aStart:
      mov  eax,es:#edi// Es is the segment while edi is the general register. The address we    are getting is 2048 plus 65536  which is the first keyboard buffer.
      out  1,eax//We moved Eax to the above address so we could take that to port 1.
      jmp aStart//Note that I jumped to aStart and not Start as doing that would inc es again.
    This third segment is on keyboard to console functions. Note this is a very slow way of doing it if you type slow. It's weird like that.

    Set the address bus to first offset at 0 then second offset at 2048. Then first size at 2048 then second size to 64. Then wire mem1 to console then mem2 to keyboard.

    Code:
    Entry:
      jmp  SetMainRegs
      alloc  CharPos
      define  Buffer,2048//The first byte on the keyboard aka "The buffer"
      define  Char,2049//The first actual character on the keyboard
      define  Color,000999
    Calls:
      GetKey://Returned in edx
        push  eax
        mov  eax,Char
        add  eax,es
        out 0,#eax
        mov  edx,#eax
        pop  eax
        ret
      ResBuffer:
        push  eax;//This is to reset the first "buffer" or byte on the keyboard.
        mov  eax,Buffer
        add  eax,es;mov  #eax,-1//Setting it to -1 seems to be the only reliable way to reset it.
        pop  eax
        ret
      WriteChar:
        call  Getkey
        push  esi
        mov esi,#CharPos
        add esi,es
        mov  #esi,edx//The Character has been set
        inc  esi
        mov  #esi,Color
        add  #CharPos,2
        pop  esi
        ret
      KeyDown:
        push  esi//Really just a check 
        mov  esi,Buffer// We set esi to the buffer
        add  esi,es// then add esi to es to get the actual buffer location
        mov  eax,esi// then we set eax to whatever the buffer is to free esi
        pop  esi
        aKeyDown:
          cmp  #eax,0
          je  aKeyDown
          call  Resbuffer
          call  WriteChar
          ret
    SetMainRegs:// I will use es to get directly out the cpu's memory
      mov  es,esp// esp starts at 65535 which is one less than we want so....
      inc  es
    Start://Main functions
      call  KeyDown
      jmp  Start
    Last edited by Hitman271; 08-20-2008 at 05:59 PM. Reason: Additions
    Quote Originally Posted by Anticept View Post
    This is not some place where you can toss your dick around and expect people to suck it.
    Community Gpu Thread. Post Yours!

    Bouncy Ball

  2. #2
    Wire Sofaking Hitman271's Avatar
    Join Date
    Feb 2008
    Location
    Why? You looking for somebody?
    Posts
    731

    Default Re: Key-Points For Beginners

    I added some stuff on the keyboard.Update bump
    Quote Originally Posted by Anticept View Post
    This is not some place where you can toss your dick around and expect people to suck it.
    Community Gpu Thread. Post Yours!

    Bouncy Ball

  3. #3
    Wire Sofaking Azrael's Avatar
    Join Date
    Aug 2007
    Posts
    1,946

    Default Re: Key-Points For Beginners

    Uh, use 0 for terminating strings, not -1. Just ask wikipedia.

  4. #4
    Wire Sofaking Fizyk's Avatar
    Join Date
    Jun 2008
    Location
    Łomianki, Poland
    Posts
    740
    Blog Entries
    1

    Default Re: Key-Points For Beginners

    0 or not 0, makes no difference. It's only important that it shouldn't be a valid character. On normal computers, -1 is equivalent to 255, so 0 should be used (though 255 is not some often-used character, so you could use 255 as a termination character if you wanted). But on zCPU -1 is only -1 and it's not a valid character in any way (afaik), so you can use it as well as 0.

    My programs: BIOS - Alcyone - Calculator - Notepad - Movie Player
    My tutorials: applyTorque - Quaternions - PID controllers
    Some other things I made: FT Chip - RK4 Solar System

  5. #5
    That furred thing Black Phoenix's Avatar
    Join Date
    Feb 2007
    Location
    Kyiv, Ukraine
    Posts
    3,565

    Default Re: Key-Points For Beginners

    On ZCPU -1 is "0x8000000000" or 549755813888 (even though it can't be directly represented as that)
    I'm a wire-crazy person with a tail.

    Take a daily journey into my brain

    D2K5

  6. #6
    Wirererer dnifan's Avatar
    Join Date
    Mar 2007
    Location
    Amersfoort, the Netherlands
    Posts
    330

    Default Re: Key-Points For Beginners

    lmao. isn't it 0xFFFFFFFF? But that's not for floats, just for integers.


    ^ 51mbps Fiber ftw [03:32] <ITSBOT> lua serializing function to be
    intergrated into xbox live
    [03:34] <ITSBOT> no girlfriend for a pineapple under the Channels

  7. #7
    That furred thing Black Phoenix's Avatar
    Join Date
    Feb 2007
    Location
    Kyiv, Ukraine
    Posts
    3,565

    Default Re: Key-Points For Beginners

    Quote Originally Posted by dnifan View Post
    lmao. isn't it 0xFFFFFFFF? But that's not for floats, just for integers.
    ZCPU uses 64-bit floats, that 48 bits of integer precision, not 32
    I'm a wire-crazy person with a tail.

    Take a daily journey into my brain

    D2K5

  8. #8
    Wire Amateur krazyfool's Avatar
    Join Date
    Jul 2009
    Posts
    77

    Default Re: Key-Points For Beginners

    It would be easier to read if there was more space between comments and code

+ Reply to Thread

Similar Threads

  1. Right Click Points with Wire Tool
    By AprilEthereal in forum Installation and Malfunctions Support
    Replies: 5
    Last Post: 11-13-2008, 06:08 PM
  2. Addition to Holoemiter: Extra points
    By webjunkie411 in forum Ideas & Suggestions
    Replies: 2
    Last Post: 08-24-2008, 05:19 PM
  3. Distance between 2 points...
    By Brasou in forum Installation and Malfunctions Support
    Replies: 3
    Last Post: 03-20-2008, 11:57 PM
  4. Ranger that always points down
    By -Gamah in forum Gate Nostalgia (Old School Wiring) Discussion & Help
    Replies: 4
    Last Post: 01-02-2008, 03:07 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
proceed-collector
proceed-collector
proceed-collector
proceed-collector
linguistic-parrots
linguistic-parrots
linguistic-parrots
linguistic-parrots