Angelo Mathews struck his highest Test score with an unbeaten double century on Wednesday as Sri Lanka left Zimbabwe battling to save the series opener going into the final day at Harare.
Former skipper Mathews eclipsed his previous Test best of 160 and finished 200 not out after a marathon knock spanning 468 balls, as Sri Lanka declared their first innings on 515 for nine.
Zimbabwe, playing their first Test since November 2018, ended the fourth day on 30 without loss and trailing by 127 runs after Brian Mudzinganyama was drafted in as a concussion substitute for opener Kevin Kasuza.
Debutant Kasuza, who made 63 in the first innings, suffered a delayed concussion after he took a blow to the helmet while fielding at short leg on Tuesday.
Mudzinganyama became the fourth Zimbabwean to make his Test debut in this match. He was unbeaten on 14 with Prince Masvaure 15 not out at stumps.
The 32-year-old Mathews brought up his 10th Test century, his first since December 2018, in the morning session and steadily added to his total with considerable support from Dhananjaya de Silva and Niroshan Dickwella.
He was dropped shortly after reaching his ton when wicketkeeper Regis Chakabva was unable to hold a difficult chance off left-arm spinner Ainsley Ndlovu.
De Silva and Dickwella both scored 63 but two quick wickets for Sikandar Raza, who finished with three for 62, hastened the declaration as Mathews reached 200 with a sweep to the square leg boundary.
With one day remaining, the visitors appear the only team capable of victory although the pitch looks likely to have the final say.
The two-Test tour was only announced by the Sri Lankan cricket board last week.
Zimbabwe were readmitted as an ICC member in October following a three-month suspension over political interference.
The Sri Lanka games represent their first Tests since a 1-1 series draw in Bangladesh in November 2018.
Zimbabwe last played a Test at home against the West Indies in October 2017.