|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 12544 (0x3100) Types: TextFile Names: »FONTUTIL.PAS«
└─⟦c042bf94c⟧ Bits:30002694 SW1435 RcFont Release 1.3 └─⟦c042bf94c⟧ Bits:30005758 SW1435 RcFont Release 1.3 └─ ⟦this⟧ »FONTUTIL.PAS«
(* Type definitions, functions and procedures for processing of RcFont generated character sets. JZ NOVEMBER 1985 *) (*$R-*) TYPE FILENAME = STRINGÆ14Å; FONT_IO_TYPE= (FONT_INPUT, FONT_OUTPUT); CHARSET = RECORD fontfile : FILE; operation : FONT_IO_TYPE; headr, headc : BYTE; buffer : ARRAYÆ1..128Å OF BYTE; index : 1..128; count : INTEGER; checksum : INTEGER; END; FONTRECORD = RECORD rows, cols : BYTE; character : CHAR; charfont : ARRAYÆ1..16Å OF INTEGER; END; ALPHANO = 1..4; PRINTERTYPE = (RC603, RC604, RC605); STR255 = STRINGÆ255Å; STR8 = STRINGÆ8Å; FONTQUEUE = RECORD dummy1 : INTEGER; queueid : INTEGER; dummy2 : INTEGER; buf_ptr : INTEGER; name : STR8; buffer : STR255; END; VAR fqresult: INTEGER; fqrecord: FONTQUEUE; FUNCTION open_charset(VAR filedescr: CHARSET; name : FILENAME; io_type : FONT_IO_TYPE): BOOLEAN; VAR c_count: INTEGER; BEGIN (* opens and prepare a font file for input *) open_charset := true; WITH filedescr DO BEGIN count := 0; assign(fontfile, name); operation := io_type; (*$I-*) reset(fontfile) (*$I+*); IF operation = FONT_OUTPUT THEN BEGIN (* font output *) IF iores > 0 THEN rewrite(fontfile); bufferÆ1Å := 255; bufferÆ2Å := 255; index := 3; END ELSE BEGIN (* font input *) blockread(fontfile, buffer, 1,c_count); IF c_count<> 1 THEN open_charset := FALSE; headr := bufferÆ1Å; headc := bufferÆ2Å; index := 2; IF NOT ( ((headr=255) AND (headc=255)) OR ((headr> 0) AND (headr<=16) AND (headc> 0) AND (headc<=16)) ) THEN BEGIN (* format error *) close(fontfile); open_charset := false; END; END; END; END; (* open_charset *) PROCEDURE close_charset(VAR filedescr: CHARSET); VAR c_count: INTEGER; BEGIN WITH filedescr DO BEGIN IF operation = FONT_OUTPUT THEN BEGIN bufferÆindexÅ := 0; blockwrite(fontfile, buffer, 1, c_count); END; close(fontfile); END; END; (* close_charset *) FUNCTION read_font(VAR filedescr: CHARSET; VAR fontrec: FONTRECORD): BYTE; VAR i, b : BYTE; sum, sum1 : INTEGER; FUNCTION read_byte: BYTE; VAR c_count: INTEGER; b : BYTE; BEGIN (* get next byte from fontfile *) WITH filedescr DO BEGIN IF index = 128 THEN BEGIN (* buffer empty *) blockread(fontfile, buffer, 1,c_count); index := 1; END ELSE index := index + 1; b := bufferÆindexÅ; read_byte := b; checksum := checksum + b; END; END; (*read_byte *) BEGIN (* get next character font from fontfile *) read_font := 0; (* a priori ok result *) WITH filedescr DO WITH fontrec DO BEGIN checksum := 0; IF headr = 255 THEN BEGIN (* new format *) rows := read_byte; cols := read_byte; END ELSE BEGIN (* old format *) rows := headr; cols := headc; END; character := CHAR(read_byte); IF ( (character <> CHAR(0)) OR (count=0)) AND (rows <> 0) THEN BEGIN (* move the font to parameter *) FOR i := 1 TO rows DO BEGIN IF cols > 8 THEN BEGIN (* broad format *) sum := read_byte; charfontÆiÅ := swap(read_byte) OR sum; END ELSE charfontÆiÅ := swap(read_byte); (* high byte *) END; FOR i := rows + 1 TO 16 DO charfontÆiÅ := 0; count := count + 1; IF headr = 255 THEN BEGIN (* only checksum in new format *) sum := checksum; b := read_byte; sum1 := swap(read_byte) + b; IF (sum + sum1) <> 0 THEN read_font := 2; (* checksum error *) END; (* checksum *) END ELSE read_font := 1; (* end of fontfile *) END; (* WITH *) END; (* read_font *) PROCEDURE write_font(VAR filedescr: CHARSET; VAR fontrec: FONTRECORD); VAR fontrow, mask, sum: INTEGER; i : BYTE; PROCEDURE write_byte(b: BYTE); VAR c_count: INTEGER; BEGIN (* put next byte into fontfile *) WITH filedescr DO BEGIN bufferÆindexÅ := b; checksum := checksum + b; IF index = 128 THEN BEGIN (* buffer full *) blockwrite(fontfile, buffer, 1,c_count); index := 1; END ELSE index := index + 1; END; END; (* write byte *) BEGIN (* put next character font into fontfile *) WITH filedescr DO WITH fontrec DO BEGIN checksum := 0; write_byte(rows); write_byte(cols); write_byte(ORD(character)); mask := $FFFF shl (16-cols); FOR i := 1 TO rows DO BEGIN fontrow := charfontÆiÅ AND mask; IF cols <= 8 THEN (* small format *) write_byte(hi(fontrow)) ELSE (* broad format *) BEGIN write_byte(lo(fontrow)); write_byte(hi(fontrow)); END; END; sum := -checksum; write_byte(lo(sum)); write_byte(hi(sum)); END; (* WITH *) END; (* write_font *) PROCEDURE define_screen_font(destination: ALPHANO; VAR fontrec: FONTRECORD); CONST xios = $28; define_font = 52 ; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; i, mask, ones : INTEGER; BEGIN WITH fontrec DO BEGIN (* define the font in proper alphabet *) mask := $FFFF shl (16-cols); ones := (NOT mask) shr 1; FOR i := 1 TO rows DO charfontÆiÅ := charfontÆiÅ AND mask OR ones; reg.ax := define_font; (* xios function no *) reg.cx := (destination-1)*256 + ORD(character); reg.dx := ofs (charfontÆ1Å); reg.ds := seg(charfontÆ1Å); swint(xios, reg); (* call xios extra function: define_font *) END END; (* define_screen_font *) PROCEDURE get_screen_font(source: ALPHANO; VAR fontrec: FONTRECORD); CONST xios = $28; get_font = 51 ; get_conf = 4 ; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; i, mask, ones : INTEGER; monitor_type : ^BYTE; BEGIN WITH fontrec DO BEGIN (* get the font from proper alphabet *) reg.ax := get_conf; swint(xios, reg); (* get configuration vector *) monitor_type := PTR(reg.es, reg.si + 18); IF (monitor_type^ AND 2) = 0 THEN rows := 10 ELSE rows := 14; reg.ax := get_font; (* xios function no *) reg.cx := (source-1)*256 + ORD(character); reg.dx := ofs (charfontÆ1Å); reg.ds := seg(charfontÆ1Å); swint(xios, reg); (* call xios extra function: get_font *) ones := charfontÆ1Å; cols := 15; WHILE (cols > 0) AND ODD(ones) DO BEGIN cols := cols - 1; ones := ones shr 1; END; mask := $FFFF shl (16-cols); FOR i := 1 TO rows DO charfontÆiÅ := charfontÆiÅ AND mask; END END; (* define_screen_font *) FUNCTION open_printer_charset(printer: PRINTERTYPE): BOOLEAN; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; FUNCTION lcattach: BOOLEAN; CONST ccpm = 224; l_cattach = 161; BEGIN reg.cx := l_cattach; swint(ccpm, reg); lcattach := reg.ax=0; END; (* lcattach *) PROCEDURE open_603; CONST ccpm = 224; s_sysdat = 154; p_delay = 141; ticks_off = $51; VAR ticks_ptr : ^BYTE; BEGIN (* Only usefull for RC603/604 printers *) write(lst, @27, @63, '1600'); (* reserve cg buffer in RC603/604 *) reg.cx := s_sysdat; swint(ccpm, reg); (* get sysdat segment *) ticks_ptr := PTR(reg.es, ticks_off); reg.dx := ticks_ptr^; reg.cx := p_delay; swint(ccpm, reg); (* delay process one second *) write(lst, @27, @117); (* cg copy *) END; (* open_RC603 *) PROCEDURE open_605; BEGIN (* only usefull for RC605 printer *) write(lst, @27, '$'); END; BEGIN IF lcattach THEN BEGIN open_printer_charset := TRUE; CASE printer OF RC603, RC604: open_603; RC605: open_605; OTHERWISE open_printer_charset := FALSE; END (* case printer *) END ELSE open_printer_charset := FALSE; END; (* open_printer_charset *) PROCEDURE close_printer_charset(printer: PRINTERTYPE); CONST ccpm = 224; l_detach = 159; VAR reg : RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; BEGIN CASE printer OF (* enable soft character set *) RC603, RC604: write(lst, @27, @39); RC605: write(lst, @27, '2'); END; reg.cx := l_detach; swint(ccpm, reg); close(lst); END; (* close_printer_charset *) PROCEDURE define_printer_font(printer: PRINTERTYPE; VAR fontrec: FONTRECORD); VAR first_row, chrlength: BYTE; descent: BOOLEAN; PROCEDURE send_printer_font(first, n_cols: BYTE); VAR i, j, chr: BYTE; BEGIN WITH fontrec DO BEGIN FOR j := 0 TO n_cols-1 DO BEGIN chr := 0; FOR i := first+7 DOWNTO first DO BEGIN chr := chr shl 1; IF (charfontÆiÅ shl j) < 0 THEN chr := chr + 1; END; write(lst, CHAR(chr)); END; END (* width fontrec *) END; (* send_printer_font *) BEGIN WITH fontrec DO BEGIN descent := (rows = 9) AND (charfontÆ9Å AND ($FFFF shl (16-cols)) <> 0); CASE printer OF RC603, RC604: IF (character >= CHAR(32)) AND (character <=CHAR(126)) THEN BEGIN IF descent THEN BEGIN chrlength := cols + 32; first_row := 2; END ELSE BEGIN chrlength := cols; first_row := 1; END; write(lst, @27, '+', character, CHAR(chrlength)); send_printer_font(first_row, cols); write(lst, CHAR(4)); (* write EOT *) END; (* RC603 and RC604 *) RC605: IF (character >= CHAR(32)) AND (character <= CHAR(127)) OR (character >=CHAR(160)) AND (character <= CHAR(223)) THEN BEGIN IF descent THEN BEGIN write(lst, @27, '%D', character); first_row := 3; END ELSE BEGIN write(lst, @27, '%A', character); first_row := 1; END; send_printer_font(first_row, 11); END (* RC605 *) END (* case *) END (* WIDTH fontrec *) END; (* define_printer_font *) PROCEDURE open_queue(VAR fq: FONTQUEUE; queuename: STR8); CONST q_open = 135; q_write = 139; ccpm = 224; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; i : INTEGER; BEGIN (* open the queue: FONTWAIT *) WITH fq DO BEGIN dummy1 := 0; queueid:= 0; dummy2 := 0; buf_ptr:= ofs(buffer); FOR i:=0 TO 7 DO nameÆiÅ := queuenameÆi+1Å; reg.dx := ofs(fq); reg.ds := seg(fq); reg.cx := q_open; swint(ccpm, reg); END; IF reg.ax = 0 THEN fqresult := 0 ELSE fqresult := reg.cx; END; PROCEDURE writequeue(VAR fq: FONTQUEUE; func: INTEGER; str: STR255); CONST q_write = 139; q_cwrite = 140; ccpm = 224; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; BEGIN reg.dx := ofs(fq); reg.ds := seg(fq); IF func = 0 THEN reg.cx := q_write ELSE reg.cx := q_cwrite; fq.buffer := str; swint(ccpm, reg); IF (reg.ax = 0) OR (func <> 0) THEN fqresult := 0 ELSE fqresult := reg.cx; END; PROCEDURE open_font_graphics; BEGIN open_queue(fqrecord, 'FONTWAIT'); END; PROCEDURE writefg(str: STR255); CONST l_attach = 158; l_detach = 159; ccpm = 224; VAR reg: RECORD ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER; END; BEGIN (* write message to fontqueue *) reg.cx:=l_detach; swint(ccpm, reg); (* detach printer *) writequeue(fqrecord, 0, str); END; PROCEDURE stop_font_graphics; VAR fs: FONTQUEUE; BEGIN (* stop fontgraphics fileprint *) open_queue(fs, 'FONTSTOP'); writequeue(fs, 1, 'S'); END; «eof»