+# create an MBR partition if desired
+if (( psz )); then
+ (( mbrpno = 0x1BE + ((mbrpno - 1) * 16) ))
+ set -A o_code # g_code equivalent for partition offset
+ (( o_code[2] = pofs % g_code[2] + 1 ))
+ (( o_code[1] = pofs / g_code[2] ))
+ (( o_code[0] = o_code[1] / g_code[1] + 1 ))
+ (( o_code[1] = o_code[1] % g_code[1] + 1 ))
+ # boot flag; C/H/S offset
+ thecode[mbrpno++]=0x80
+ (( thecode[mbrpno++] = o_code[1] - 1 ))
+ (( cylno = o_code[0] > 1024 ? 1023 : o_code[0] - 1 ))
+ (( thecode[mbrpno++] = o_code[2] | ((cylno & 0x0300) >> 2) ))
+ (( thecode[mbrpno++] = cylno & 0x00FF ))
+ # partition type; C/H/S end
+ (( thecode[mbrpno++] = (mbrptp ? mbrptp : partp ? partp : 0x27) ))
+ (( thecode[mbrpno++] = g_code[1] - 1 ))
+ (( cylno = g_code[0] > 1024 ? 1023 : g_code[0] - 1 ))
+ (( thecode[mbrpno++] = g_code[2] | ((cylno & 0x0300) >> 2) ))
+ (( thecode[mbrpno++] = cylno & 0x00FF ))
+ # partition offset, size (LBA)
+ (( thecode[mbrpno++] = pofs & 0xFF ))
+ (( thecode[mbrpno++] = (pofs >> 8) & 0xFF ))
+ (( thecode[mbrpno++] = (pofs >> 16) & 0xFF ))
+ (( thecode[mbrpno++] = (pofs >> 24) & 0xFF ))
+ (( pssz = psz - pofs ))
+ (( thecode[mbrpno++] = pssz & 0xFF ))
+ (( thecode[mbrpno++] = (pssz >> 8) & 0xFF ))
+ (( thecode[mbrpno++] = (pssz >> 16) & 0xFF ))
+ (( thecode[mbrpno++] = (pssz >> 24) & 0xFF ))
+fi
+