Tendrías que hacer un max a tu tabla.
Para generar el código:
string ls_codigo
integer li_codigo
//capturas el código máximo, extrayendo sólo los números y convirtiéndolo en entero
select max(cast(right(codigo,4) as int)) into :li_codigo from matricula ;
// esto es para el primer registro, si no existen registros te arroja nulo y si es eso se inicializa con cero
if isnull(li_codigo) then li_codigo = 0
//convertes el correlativo al formato que deseas
ls_codigo = 'M' + string( (li_codigo + 1), '0000')
Para el caso de la fecha puedes hacerle un today(), pero el today recuperará la fecha y hora de la PC, es preferible que captures la fecha y hora del servidor. para eso haces esto:
select getdate() into :ldt_fechahora from tabla;
//tabla: es cualquier tabla pequeña que tengas
// ejemplo:
select getdate() into :ldt_fechahora from moneda ;
// la tabla moneda sólo tendrá 3 registros a lo mucho (Soles, Dólares y Euros)