User Tools

Site Tools


notes:comporg:spring2025:projects:dapx

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
notes:comporg:spring2025:projects:dapx [2025/03/03 14:20] – [Preserving our Registers] cgrant9notes:comporg:spring2025:projects:dapx [2025/03/09 15:44] (current) – [Masking] Made asm code format consistent tkastne1
Line 27: Line 27:
 </code> </code>
 =====Preserving our Textures===== =====Preserving our Textures=====
 +Along with preserving your register you need to preserve your texture and region, this should be done after preserving at least one of your registers, as we need to use a register to get the data to preserve.\\
 +Once we have preserved our registers, simply use the 'IN' instruction to get information from the GPU port like this:
 +<code>
 +IN   R0, GPU_SelectedTexture
 +PUSH R0
 +IN   R0, GPU_SelectedRegion
 +PUSH R0
 +</code>
 +And just like our registers, we need to pop them in reverse order to restore them when we're done:
 +<code>
 +POP  R0
 +OUT  GPU_SelectedRegion, R0
 +POP  R0
 +OUT  GPU_SelectedTexture, R0
 +</code>
 =====bitwise operations===== =====bitwise operations=====
  
 ====OR==== ====OR====
 ====AND==== ====AND====
 +The AND op code will do an and comparison of two values
 +<code>
 +mov  R0,  0x00F00000
 +mov  R1,  0x12689649
 +and  R0,  R1
 +</code>
 +This code will leave us with 0x00600000 because every other value was put into and with a zero.
 ====NOT==== ====NOT====
 ====NAND==== ====NAND====
Line 38: Line 60:
        
 ====SHIFT==== ====SHIFT====
-===Shift Right==== 
 ===Shift Left=== ===Shift Left===
 +A shift left can be done with the op code SHL
 +<code>
 +mov  R0,  0x00F00000
 +mov  R1,  4
 +shl  R0,  R1
 +</code>
 +This code will give R0 the value 0x0F000000 because the original value was left-shifted by 4 bits.
 +===Shift Right====
 +There isn't an op code provided by Vircon32 for right shifts, so we must shift left by a negative value.
 +<code>
 +mov  R0,  0x00F00000
 +mov  R1,  -4
 +shl  R0,  R1
 +</code>
 +This code will give R0 the value 0x000F0000 because we shifted the original value to the left by -4 bits.
 =====pseudocode===== =====pseudocode=====
  
Line 72: Line 108:
 ASCII code for 0 --> decimal 48, hexadecimal 0x30 ASCII code for 0 --> decimal 48, hexadecimal 0x30
 ASCII code for x --> 120 ASCII code for x --> 120
-ASCII code for [ --> 92+ASCII code for [ --> 91
 ASCII code for ] --> 93 ASCII code for ] --> 93
 ASCII code for : --> 58 ASCII code for : --> 58
Line 90: Line 126:
  
 ====Masking==== ====Masking====
 +We need to get a nibble on it's own, to do this we can use a bit mask
  
 +A mask only allows certain bit positions to be either 1 or 0, and forces everything else to be 0
 +
 +This is done with the **and** operator
 +
 +In order to get the most significant nibble we would want a mask of 0xF0000000 (0b11110000000000000000000000000000)
 +
 +<code>
 +mov   R1,   0xF0000000  ; Creating the mask
 +and   R1,   R0          ; R0 is the original value
 +</code>
 +
 +To get the second most significant nibble, instead of creating a new mask by hand, we can shift the old mask over by a nibble ever time we loop
 +
 +We should have a register keep track of our loop count
 +
 +<code>
 +mov   R2,   R3          ; R3 is the loop count
 +imul  R2,   -4          ; Left shift bits per nibble
 +
 +mov   R1,   0xF0000000  ; Creating the mask
 +shl   R1,   R2
 +   
 +and   R1,   R0          ; R0 is the original value
 +</code>
 ====Shifting==== ====Shifting====
  
Line 98: Line 159:
  
 ===Displaying=== ===Displaying===
 +Because we already have the debug function, we can use that to display all of the hex values needed
 +
 +The format is identical for every address, and goes as the following: [address]:value
 +
 +We can print the brackets and colon manually and leave the address and values to the debug function
 +
 +<code>
 +mov   R3,         91          ;ASCII code for '['
 +out   GPUREGION,  R3
 +mov   R3,                   ;Xpos
 +out   XDRAWINGP,  R5
 +out   GPUCOMMAND, DRAWREGION  ;Draw
 +</code>
 +
 +Repeat this for ']' and ':' changing the Xpos and accounting for the address width
 +
 +Utilize the debug function to print the address and value as shown in the following
 +
 +<code>
 +push  R2                      ;R2 is the current address
 +mov   R3,         10          ;Xpos
 +push  R3
 +push  R4                      ;Ypos
 +call  _debug
 +
 +mov   R3,         [R2]        ;Get the value
 +push  R3
 +mov   R3,         130         ;Xpos
 +push  R3
 +push  R4                      ;Ypos
 +call  _debug
 +</code>
 +
 +All of this code should be run for every address, stepping from the start value to the end value
 +
 +We will need to setup a loop with an exit condition
 +
 +===pseudocode===
 +<code>
 +MOVE THE STARTING ADDRESS INTO A DEDICATED REGISTER (current address)
 +UNTIL WE HAVE PASSED THE FINAL ADDRESS:
 +   TEST IF THE CURRENT ADDRESS IS GREATER THAN THE FINAL ADDRESS
 +      SHOULD IT BE GREATER SKIP TO AFTER THIS LOOP
 +   DISPLAY THE ADDRESS AND VALUE
 +   INCREMENT THE YPOS
 +   INCREMENT THE ADDRESS
 +REPEAT
 +</code>
 ======debugregister function====== ======debugregister function======
 =====dapX imagery=====  =====dapX imagery===== 
Line 108: Line 217:
 {{:notes:comporg:spring2024:projects:3.jpg?400|}} {{:notes:comporg:spring2024:projects:3.jpg?400|}}
 {{:notes:comporg:spring2024:projects:4.jpg?400|}} {{:notes:comporg:spring2024:projects:4.jpg?400|}}
 +
 +====dap1====
 +{{:notes:comporg:spring2024:projects:3.jpg?400|}}
 +{{:notes:comporg:spring2024:projects:4.jpg?400|}}
 +
 +====dap2====
 +{{:notes:comporg:spring2024:projects:5.jpg?400|}}
 +{{:notes:comporg:spring2024:projects:6.jpg?400|}}
  
 ======Debug Registers====== ======Debug Registers======
notes/comporg/spring2025/projects/dapx.1741011602.txt.gz · Last modified: 2025/03/03 14:20 by cgrant9