code: protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {
  
          // If the month is out of range, adjust it into range, and
          // modify the extended year value accordingly.
          if (month < 0 || month > 11) {
              int[] rem = new int[1];
              eyear += floorDivide(month, 12, rem);
              month = rem[0];
          }
  
          int gyear = eyear + epochYear - 1; // Gregorian year
          int newYear = newYear(gyear);
          int newMoon = newMoonNear(newYear + month * 29, true);
          
          int julianDay = newMoon + EPOCH_JULIAN_DAY;
  
          // Save fields for later restoration
          int saveMonth = internalGet(MONTH);
          int saveIsLeapMonth = internalGet(IS_LEAP_MONTH);
  
          // Ignore IS_LEAP_MONTH field if useMonth is false
          int isLeapMonth = useMonth ? saveIsLeapMonth : 0;
  
          computeGregorianFields(julianDay);
          
          // This will modify the MONTH and IS_LEAP_MONTH fields (only)
          computeChineseFields(newMoon, getGregorianYear(),
                               getGregorianMonth(), false);        
  
          if (month != internalGet(MONTH) ||
              isLeapMonth != internalGet(IS_LEAP_MONTH)) {
              newMoon = newMoonNear(newMoon + SYNODIC_GAP, true);
              julianDay = newMoon + EPOCH_JULIAN_DAY;
          }
  
          internalSet(MONTH, saveMonth);
          internalSet(IS_LEAP_MONTH, saveIsLeapMonth);
  
          return julianDay - 1;
      }
docs: Return the Julian day number of day before the first day of the
  given month in the given extended year.
  
  <p>Note: This method reads the IS_LEAP_MONTH field to determine
  whether the given month is a leap month.
  @param eyear the extended year
  @param month the zero-based month.  The month is also determined
  by reading the IS_LEAP_MONTH field.
  @return the Julian day number of the day before the first
  day of the given month and year