"If" not in help Imp BOS - Behavioural Operating System -------------------------------------- How does the program work? The main element is LOOP which first of all gets a command. Then the command is interpreted in a CASE section. The software has developed from the Bambino software where commands were single bytes from an IRremote-handset. There are four modes of operation. 1. Direct control where commands are got and interpreted and the commands may make the robot move; 2. Record mode where commands are processed as in 1. then saved to memory; 3. Load mode where commands are got, only load commands are processed and the others are saved to memory; 4. Play mode where commands are retrieved from memory, interpreted and executed. Not all commands are recordable, some don't make sense if recorded. Commands may be got, in this precedence order, from the IRremote, from the Serial port, or from Memory if Playing. The commands from the Serial port or Memory are case sensitive. The IR remote used is a PicAxe remote set to Sony codes. The Terminal connection uses the standard PicAxe programming cable with the terminal set to 19200baud. The best terminal program to use is Br@y's Terminal. Commands from the IRremote are translated from the byte values to character values, some directly after reception, other complex ones are translated before the start of the CASE section. If Recording then commands are recorded at the end of the main DoCommand LOOP. Multi character and parameter commands, if recording, are recorded as they are got. Originally with Bambino there was only a 256 byte block of EEPROM which was divided into eight 32 byte Acts or Slots to suit the 1 - 8 number keys on the IRremote. Imp has a 32k byte EEPROM which is divided into Chapters of ten 256 byte Pages, each with eight 32 byte Slots. The ten pages can be selected by the numbers 0 - 9 which saves having to decode multi digit numbers. In the software the commands from the IRremote are listed as are the character commands from a terminal. The main movement commands from a terminal are - F for Forward one step B for Backwards one step L for turn Left one step R for turn Right one step On power-on the current Page is Acts0. To record moves into Slot1 "r1" is entered then the moves, and recording ended with a full stop. E.g. r1FFFRRRBL. Spaces are allowed. A full stop returns control to Direct mode. Command 1 plays the moves in Slot1. IF a command 1 - 8 is recorded in the moves then, on that command, control will jump to that Slot, E.g. if Slot one contains F1. then entering 1 will start Slot1 to play and Imp will take one step Forwards then 1 will be executed which will play Slot1 again, so Slot1 will repeat forever. Any of the first 8 slots can be set to autorun on Poweron or Reset, see command bd. The command may be a multi character command with parameters. Originally the commands were all single letter commands so at the end of the case statement if recording was enabled then the command was recorded. To accommodate multi character commands and parameters the commands are recorded as necessary by checking if recording is 'on' as each command is got. The main Command Interpreter is in ProgramSlot0 and Moves are executed by ProgramSlot1 by setting the Command appropriately and RUNing programSlot1 by the Basic command RUN 1. After the command finishes a RUN 0 is executed to re-enter the Command Interpreter. All variables are preserved across jumps so each program slot can access any variable, the declarations in each program slot must be the same! Only Acts Page0 is available from the IRremote. For viewing, recording and loading - /A changes the current Chapter to the Chapter for Acts; /B changes the current Chapter to the Chapter for Behaviours; /R changes the current Chapter to the Chapter for ReActions; /! changes the current Chapter to the Chapter for ReActions; /P changes the current Chapter to the Chapter for Poses, Poses can be loaded or learned from the Pose set-up section; /V changes the current Chapter to the Chapter for Voice/Sounds, Sounds can only be loaded; /T changes the current Chapter to the Chapter for Tasks; /M changes the current Chapter to the Chapter for Minds; /N changes the current Chapter to the Chapter for user Notes, Notes can only be loaded. /<0 - 9> changes the current Page in the chapter; <1 - 8> Plays the selected Slot in the current Page in the current Chapter. ?<1 - 8> prints the selected Slot in the current Page in the current Chapter; ?? prints all the Slots in the current Page in the current Chapter; ?p prints all the Slots in the current Page in the current Chapter; ?P prints all the Slots in all the pages in the current Chapter; ?d dumps all the Slots in the current Page in the current Chapter suitable for reloading; ?D dumps all the Slots in the Pages in the current Chapter, suitable for reloading; ?b prints the current Behaviour settings; ?h<0 - 8> prints the selected Help file. See below for the Help files, or the command list in ProgramSlot0. Acts/Tasks/Minds can chain to any other Act/Task/Mind in the same Page with a command <1 -8> as above. They can chain to an Act/Task/Mind in another Page (or even a Behaviour - which makes no sense) by changing the Chapter and Page. E.g. /1 2 will Play Slot2 in Page1, /T/1 2 will Play Slot2 in Page1 in Tasks. Acts/Tasks/Minds can call Behaviours and Poses which when finished will return control back to the calling Act/Task/Mind. Acts/Tasks/Minds can call Poses/Acts/Behaviours/Tasks/Sounds/Minds up to 10 deep Reactions are called by the Sensor routines. Variable use ------------ Pagecmnd - if a jump is made by /, e.g. /A64 then if the page is changed to 6 as soon as 6 is read then the slot pointer will read from the new page 6 instead of the page which held the /A64 command, So the 4 will not be read. Pagecmnd stores the new page until after the new slot number is read, then before the slot command is executed the page is updated. ======================================================================== The help files need to be less than 1024 bytes to prevent wrap round in the hardware serial buffer. The files need to ended with byte 255 - Alt(num-pad 0255) and they need to be saved as Ansi so all characters are single bytes. ======================================================================== Help file ?h0 - Help0.txt ========================= Help-1 ------ Q,F,B,R,L,<,>.S,H,Z,z,E,1-8 s0,s<1-9>,s+,s-,sm w0,w r<1-8> l<1-8>,l0,la l:':' U,W,G Help-2 ------ b<0-9><1-8> b,<0-9>,U<0-9>,u<01>,v<0-9>,v*,v-,vm,v/,b,q> b<0-9>,<+-><0-9>,<0-9> Help-3 ------ t u <0-9><1-8> P<0-9><1-8> p(..) \,k,G(LEDs),0-7<1,0,h,l>>, Help-4 ------ v<0-5,b,e,o,t0,t<1-9>,s<0-9><1-8>> a<1-9,r,>,<,b,g,t,p,s> /<0-9>,/A,/R,/P,/B,/T,/V,/N y<1-9><1-8> Help-5 ------ Poses Help-6 ------ Reactions b@ - set servos, learn Pose Help-7,Help-8 ------------- Imp OS ? - Query - print h - these instructions - page, h - all <1-8> - print Act/slot b - current Behaviour p.? - current Page, all slots P - all Pages in current Chapter d - dump current Page to the PC, just the commands D - dump current Chapter to the PC, as d # - Dump current Page to the PC as ASCII 'comment' . stop X,x - end to enable reprogram ------------------------------------------------------------------------ Help file ?h1 - Help1.txt ========================= Q,[.],[Esc] - quit current operation . - stand - servos off F - step Forwards B - step Backwards R - step Right L - step Left < - jump Left > - jump Right H - Halt - stand with feet together Z,z - Sleep E - Execute - RUN 3 1-8 - Act to Record or Play @ - Autorun marker, Apage0 s0 - stop no pulse s<1-9> - speed s+ speed up +1 MAX speedmax s- speed down /2 MIN 1 sm - set speedmax for s+ w0 - if playing, wait until command for Act to resume w - wait x/2 seconds r<1-8> - record 1 of 80 32byte Acts/Reactions/Poses/Behaviours/Notes end with "." or ";" for Play to continue in the next 32 byte slot l<1-8> - load Slot x, end with "." or ";" p - load all current page l:':' - autoload a slot l:'name:A31'. - autoload A31 lH<0-9> - load Help page - end file with EOF=255 U - READ Ultrasonic sensor AND react W - READ Whisker sensors AND react G - READ Beard sensors AND react ------------------------------------------------------------------------ Help file ?h2 - Help2.txt ========================= Behaviour --------- b <0-9><1-8> - run behaviour S - save current settings haviour D - reInitialise with Default behaviour I - Initialise internal EEPROM d<0-8> - set RAMautoAct, 0=>noautoAct da - autorun RAMautoAct if Ccmnd="." dq - autorun off <0-9> - set current Reactions Page U<+-><0-9> - set U+ or U-, units 50mm U - set U far(+) or U near(-) manually u<01> - auto-getup 0 off, 1 on p<0-9> - move pace x l<0-9> - move lift x t<0-9> - move turn x h+<0-9> - Hip, toes offset move out, deg h-<0-9> - Hip, toes offset move in MAX 5, deg a+<0-9> - Ankle, foot outside down, deg a-<0-9> - Ankle, foot outside up, deg v<0-9> - Vitality v+ - inc vitality MAX 9 v- - dec vitality MIN 0 v/ - vitality /2 MIN 1 vm - set vitalitymax for v+ b - bip when reading serial commands q - quiet, no bip W<0-9> - Whisker threshold G<0-9> - Ground Feeler threshold ------------------------------------------------------------------------ Help file ?h3 - Help3.txt ========================= t - Turn ta - turn Away from leading foot tt - Turn To leading foot (if Backwards still the forward foot) tm - turn Memory (same way as last turn) to - turn Other way from last time tr - turn Right with feet side by side, no pace tl - turn Left with feet side by side, no pace tb - test eyes, step L or R to brightest (10%) td - test eyes, step L or R to darkest (10%) t@b - Turn to bright until L R the same (10%) t@d - Turn to dark until L R the same (10%) u - get up f - tipped forwards b - tipped backwards execute M<0-9><1-8> - Mind T<0-9><1-8> - Task A<0-9><1-8> - Act !<0-9><1-8> - ReAct P<0-9><1-8> - Pose p(..) - inline pose \,k - control '"\" gives syntax error W,G - Whisker LEDs, Gwhisker LEDs 0=%00 - off 1=%01 - Left off, Right on 2=%10 - Left on, Right off 3=%11 - Left on, Right on L - Left on R - Right on 0-7 - set/clear PortB bits 1,h - high 0,l - low % - binary portB b - byte ------------------------------------------------------------------------ Help file ?h4 - Help4.txt ========================= v<0-5,e,o,t,s> - voices 0,t - tsh 1,b - bip 2 - beep50 3 - sshhh 4,e - whee 5,o - whoa 6,T0 - random tune 6,T<1-9> tune 1-TwilightZone 2-Thunderbirds_Theme 3-Terminator_Theme 4-Adams_Family 5-StarWars 6-Mission 7-Knightride 8-James_Bond 9-Entertainer a - action x, subroutine x, ^ on IR-remote 1 - bip 2 - beep50 3 - sshhh 4,r - RockRock 5,> - JumpR 6,< - JumpL 7,b - Bow 8,g - goof 9,t - tiptoe p - please s - StandUp /<0-9> - set Page set Chapter /A - Acts /P - Poses - comma and space separators allowed /B - Behaviours /R,/! - if in ReActs set ReActions to current Page /R./! - ReActs /T - Tasks /M - Minds /V - Voices - format as sound command /N - Notes - write user comments and notes y, a 'bored' variable increments each pass until >=parameter then reset bored and skip the cmnd. ------------------------------------------------------------------------ Help file ?h5 - Help5.txt ========================= Poses ----- /P - set Chapter to Poses - comma and space separators allowed, end with . Servo numbers - LHip=3,LAnkle=2,RHip=1,RAnkle=0 Individual Pose cmnds 1- Pulse servo - servo number, 1=on 0=off - eg 20, 31. (LH=3 LA=2 rRH=1 RA=0) Individual Pose cmnds - scaled by vitality 2- Offset from joint mid in joint travel units 0-9 L,R,Hip,Ankle,Up,Down,In.Out,amount 0-9, LHOx,LHIx,LAUx,LADx,RHOx,RHIx,RAUx,RADx eg RHU4 3- Offset from current position in 10us units servo number 0-3, +- direction, offset(0-9) eg 3-5, 1+9, 2-4, 0-8 Quad Pose cmnds in 10us units - If value 0 or omitted then ignored eg #123 #0 #0 #34 . 4- #LHip,#LAnkle,#RHip,#RAnkle - logical with logical mid 150 eg #124 #97 #193 #56. 5- jLHip jLAnkle jRHip jRAnkle - logical joint values eg j124 j97 j193 j56. 6- sLHip sLAnkle sRHip sRAnkle - servo values eg s124 s97 s193 s56. P() - inline poses, ------------------------------------------------------------------------ Help file ?h6 - Help6.txt ========================= Reactions --------- /R./! - set eChapter to ReActs slot 1 'U+' 'if object within range 2 'U-' 'if object too near 3 'W-R' 'if object on Right 4 'WL-' 'if object on Left 5 'WLR' 'if objects on Left + Right 6 'G-R' 'if hole on Right 7 'GL-' 'if hole on Left 8 'GLR' 'if holes on Left + Right Setup ----- b@ - setup Pose - adjust joints / - next * - print -,+ - adjust p<0-9><1-8> - save Pose to Pose PosePge,Slot,type s,j,# C - set LHC LAC RHC RAC to current position 9 - feet@90deg n - @neutral, rL,rR,rm,rM - roll left and right for walking, m ankles at min, M ankles at max pL,pR,pm,pM - pace left and right for walking, m hips at min, M hips at max Q,Esc - Quit ------------------------------------------------------------------------ Help file ?h7 - Help7.txt ========================= Imp-OS ------ Imp OS is a Behavioural Operating System a user can send robot commands to the robot which are stored in an EEPROM. There are six command sections - Minds, Tasks, Acts, ReActs, Poses, Behaviours. There is also an area for Notes and ten Help pages. Each section consists of 10 pages, each with 8 command strings of 32 characters. level 1 - Poses are the lowest level and consist of joint angles (or servo values) which determine the Pose of the robot level 2 - Behaviours are list of command such as speed, foot lift, foot stride when walking, and foot turn when turning. level 3 - ReActions are command lists to be executed depending on sensor information. E.g. how to move if there is a hole or close obstacle. level 4 - Acts are list of commands such as Forward, Backwards, make a sound, test a sensor etc. They can include calls to Poses and Behaviours and can chain to other Acts or themselves. ------------------------------------------------------------------------ Help file ?h8 - Help8.txt ========================= level 5 - Tasks are lists of Acts and can include calls to any command in a lower level. They can Chain to themselves level 6 - Any one Mind will be the current Mind of the robot. Minds are lists of everything else. They can call any lower level and can Chain to themselves. At level 0 are the inbuilt commands such as Forward, Backwards etc. Connect Imp to a terminal at 19,200 baud, To view the nine pages type ?h0 to ?h8 Before any movement commands are sent Imp must be calibrated. If Imp has been calibrated then you can type F or B for Forwards or Backwards etc. ------------------------------------------------------------------------ Help file ?h9 - Help9.txt ========================= . ------------------------------------------------------------------------ ======================================================================== @25Jan21 Commands ======== Note - ","comma and " "space ignored, "'" start/end of comment [Esc],[Q],[.],[IR-Power] - quit current operation - recording, playing, input, autoAct if [IR-Power],[Q],[Esc] then flush Serial Buffer ; - Play continues in the next 32 byte slot ( - start of a Do, a jump to an Act will on . continue in the Do, will show its location in EEPROM when played. If a jump is made to an Act which contains another Do then that Do will not be implemented. ) - end of a Do F - step Forwards B - step Backwards R - step Right L - step Left < - jump Left > - jump Right H - Halt - stand with feet together E - Execute - RUN 2 - user code Z - Sleep t - Turn ta - turn Away from leading foot, will be used in avoid Acts tt - Turn Towards leading foot (if Backwards this is still the forward foot) tm - turn Memory (same way as last turn, will be used in avoid Acts to - turn Other way from last time, will be used in avoid Acts tr - turn Right with feet side by side, no pace tl - turn Left with feet side by side, no pace tb - test eyes and step to L or R depending on which is brightes by 10% td - test eyes and step to L or R depending on which is darkest by 10% t@b - Turn to light until L R the same within 10% t@d - Turn to dark until L R the same within 10% v<1-5,b,e,o,t> - voices 0,t - tsh 1,b - bip 2,v - beep50 3,s - sshhh 4,e - whee 5,o - whoa 6,T - tune 0 - random 1-9 tune T1:'TwilightZone T2:'Thunderbirds_Theme T3:'Terminator_Theme T4:'Adams_Family T5:'StarWars T6:'Mission T7:'Knightrid T8:'james_bond T9:'entertainer z - Sleep s stop no pulse s - speed x [1-9] + - speed up +1 MAX speedmax - - speed down /2 MIN 1 m - set speedmax for s+ w0 - wait until serial or IR command for Act to resume, no effect if not playing w - wait x/2 seconds a,^ - do action, subroutine, ^ on IR-remote 1 - bip 2 - beep50 3 - sshhh 4,r - RockRock 5,> - JumpR 6,< - JumpL 7,b - Bow 8,g - goof 9,t - tiptoe p - please s - StandUp u - getup f - getup from front b - getup from back 1-8 Act etc to Record or Play (Slot 0 - 7) in current page r<1-8> - record 1 of 80 32byte Acts/Reactions/Poses/Behaviours/Notes end with "." or ";" for Play to continue in the next 32 byte slot 'comments' are ignored and not recorded $U - READ Ultrasonic sensor AND react TO objectRange using React to Ping behaviour rules $u - READ Ultrasonic sensor $W - READ Whisker sensors AND avoid obstacles (if any) using React to Whiskers behaviour rules $G - READ Beard sensors AND avoid holes (if any) using React to GWhiskers behaviour rules \,k - control 'can't print "\" gives syntax error W,G - Whisker LEDs, Gwhisker LEDs 0=%00 - off 1=%01 - Left off, Right on 2=%10 - Left on, Right off 3=%11 - Left on, Right on L - Left on R - Right on 0-7 set bits of portB high or low 1,h - set high 0,l - set low % - set portB to binary, if less than 8 digits follow by space or comma needs \0 - \7 first to set direction to output b - set portB to next byte - use Alt(numpad - 0,number) y<1-9> - yawn, yawn increments each pass until >parameter then reset yawn and skip next character. I.e. FOR yawn=0 TO parameter DO (...) i - If, if true do (cmnds), only in Play mode, can't be recorded only loaded, '(' ignored iU(cmnds) - if Ultrasonic distance < value(0-9) then do (cmnds) ir<0-9>(cmnds) - if random(0-9) > value(0-9) then do (cmnds) b<0-9,S,D,I,r,s,d,R,U,p,l,t,h,a,q> <0-9><1-8> - run commands and return S - Save current behaviour to internal EEPROM D - reInitialise behaviour from Default in internal EEPROM I - Initialise internal EEPROM d<0-8> - do set RAMautoAct, 0=>noautoAct da - do autorun RAMautoAct if Ccmnd="." dq - autorun off R<0-9> - set current Reactions Page !<0-9> - set current Reactions Page u<01> - set auto-getup 1=on U<+-> - set manually by IR/Kbd, set U far(+) or U near(-), units 50mm U<+-><0-9> - set U far(+) or U near(-), units 50mm U<0,1> - disable or enable react to US p<0-9> - move pace x l<0-9> - move lift x t<0-9> - move turn x h+<0-9> - Hip, toes offset move out (10us degrees) h-<0-9> - Hip, toes offset move in MAX 5 (10us degrees) a+<0-9> - Ankle, foot outside down (10us degrees) a-<0-9> - Ankle, foot outside up (10us degrees) v<0-9> - Vitality v+ - inc vitality MAX 9 v- - dec vitality MIN 0 v/ - vitality /2 MIN 1 vm - set vitalitymax =Vitality for v+ b - bip when reading serial commands q - quiet, no bip W<0-9> - Whisker threshold G<0-9> - Ground Feeler threshold @ - setup Pose / - next * - print -,+ - adjust P<0-9><1-8> - save Pose to Pose PosePge,Slot,type s,j,# C - set LHC LAC RHC RAC to current position 9 - feet@90deg n - @neutral, rL, rR, rm, rM - roll left and right for walking, m ankles at min, M ankles at max pL ,pR, pm, pM - pace left and right for walking, m hips at min, M hips at max Q,[Esc] - Quit - Acts,Tasks,Minds,behaviours, Sounds and Poses are lists of commands stored in EEPROM !<0-9><1-8> - execute ReAct in and as subroutine A<0-9><1-8> - execute Act in and as subroutine T<0-9><1-8> - execute Task in and as subroutine M<0-9><1-8> - execute Mind in and as subroutine b<0-9><1-8> - run Behaviour commands in and return (lc b because of Back) V<0-9><1-8> - execute Sound in and as subroutine Sounds are lists as for the Basic 'sound' command P<0-9><1-8> - execute Pose in and as subroutine Poses have several types Individual Pose cmnds- 1- Pulse servo - servo number, 1=on 0=off - eg 20, 31. (LH=3 LA=2 rRH=1 RA=0) Individual Pose cmnds - scaled by vitality 2- Offset from joint mid in joint travel units 0-9 L,R,Hip,Ankle,Up,Down,In.Out,amount 0-9, LHOx,LHIx,LAUx,LADx,RHOx,RHIx,RAUx,RADx eg RHU4 3- Offset from current position in 10us units servo number 0-3, +- direction, offset(0-9) (LH=3 LA=2 rRH=1 RA=0) eg 3-5, 1+9, 2-4, 0-8 Quad Pose cmnds in 10us units - must be in this order LH LA RH RA For #js types If value 0 or omitted then ignored eg #123 #0 #0 #34 then LA RH not altered. Only leading type char read, rest are used as separators and can be commas or space eg s104,56,0 93 4- #LHip,#LAnkle,#RHip,#RAnkle - logical with logical mid 150 eg #124 #97 #193 #56. 5- jLHip jLAnkle jRHip jRAnkle - logical joint values eg j124 j97 j193 j56 6- sLHip sLAnkle sRHip sRAnkle - servo values eg s124 s97 s193 s56. p( - inline pose end with ")", run prog1 InlinePose, ( optional p#102 #43 #200 #74), p(3+2 1-6), p(:P32 'comment' LAI7 RHO3) l<1-8> - load slot x in current page p - load all current page l: - autoload a slot, slot address may be inside a comment ie l:'any comment':. eg l:'slot1:T21'Fvv. l::T22'slot2'FFvv. l:':T23slot3'FFFvv. l:'slot4':T24 FFFFvv. l::T25FFFFFvv. l:FFFFFvv:T26. l:FFFFFvv:T27FBRL. lH<0-9> - load Help page - end file with EOF=255 /<0-9> - set Page /A - set Chapter to Acts /P - set Chapter to Poses - comma and space separators allowed /B - set Chapter to Behaviours /R,/! - if in ReActs set ReActions to current RePage /R,/! - set Chapter to ReActs slot 1 'U+' 'if object within range 2 'U-' 'if object too near 3 'W-R' 'if object on Right 4 'WL-' 'if object on Left 5 'WLR' 'if objects on Left and Right 6 'G-R' 'if hole on Right 7 'GL-' 'if hole on Left 8 'GLR' 'if holes on Left and Right /V - set Chapter to Voice - format as sound command /T - set Chapter to Tasks /M - set Chapter to Minds /N - set Chapter to User Notes ? - Query h - print help <1-8> - page, h - all b - print Behavior <1-8> - print Slot ? - Print all Slots in current Page /A /B/ /P /R /T /S /M /N p - Print all Slots in current Page /A /B/ /P /R /T /S /M /N P - print all pages in current Chapter /A /B/ /P /R /T /S /M /N d - Dump current Page to the PC, without description, with load header D - Dump current Chapter to the PC, without descriptions, with load headers # - Dump current Page to the PC as ASCII s - print Sytem info - Chapter, Page, Slot 'comment' - ignored, readAct:,ReadSerCmnd: processes this - saves time X,x - end to enable reprogram ------------------------------------------------------------------------ 32K EEPROM 128 Page 256 byte blocks, 1024 Slots Chapter Pages total Slots total K 0-A Acts 0 - 9 10 80 80 2.5 1-R Re-Actions 10 - 19 20 80,10 sets 160 5.0 2-P Pose 20 - 29 30 80 240 7.5 3-B Behaviours 30 - 39 40 80 320 10.0 4-T Tasks 40 - 49 50 80 400 12.5 5-V Voice 50 - 59 60 80 480 15.0 6-M Mind 60 - 69 70 80 560 17.5 7-N Notes 70 - 73 74 80 640 20.0 8-H Help0 74 - 77 78 (32 1k block) 672 21.0 8-H Help1 78 - 81 82 (32 1k block) 704 22.0 8-H Help2 82 - 85 86 (32 1k block) 736 23.0 8-H Help3 86 - 89 90 (32 1k block) 768 24.0 8-H Help4 90 - 93 94 (32 1k block) 800 25.0 8-H Help5 94 - 97 98 (32 1k block) 832 26.0 8-H Help6 98 -101 102 (32 1k block) 864 27.0 8-H Help7 102 -105 106 (32 1k block) 896 28.0 8-H Help8 106 -109 110 (32 1k block) 928 29.0 - 110 -113 114 (32 1k block) 960 30.0 - 114 -117 118 (32 1k block) 992 31.0 - 119 -122 123 (32 1k block) 1024 32.0 ------------------------------------------------------------------------