ȉ́ADOSł̃\[XɕtĂhLg̈ꕔłB
-------------------------------------------------------------------------------
		<<<@dviout/dviprt ̃vỎ@>>>

		yvȃf[^p̃obt@z

                     Far Heap             Heap

tHgf[^  FONT_INFO_REC's  ->       name    tHg
                  b     b      ->       k_dir   2 byte tHggf[^
                  b     b
                       b
pk_buf         pk, dir   b  [htHgt@Cipackedj
(Font file buffer)       b
                         b
                       
raster_buf        CHAR_INFO_REC's        f[^̏
(Expanded font buffer)   
raster_buf     ̃X^[Ef[^iunpackedj

bit_map_buf    \^C[WWJobt@
(Bit map buffer)

view_buf       kC[Wۑpobt@



		ytHgf[^̃Nz

PDetHgɑ΂AtHg̏ node  FONT_INFO_REC ADVI t@C
̃tHgɌ鏇ɁAŇ`ō\

first_font_info -> FONT_INFO_REC -> FONT_INFO_REC -> 


QDɁAFONT_INFO_REC ́AtHgԍ̏Ƀ\[gAœKꂽ binary
tree 쐬B

                                                b\  FONT_INFO_REC ...
                               \  FONT_INFO_REC
                             b                 b\  FONT_INFO_REC ...
font_info_root -> FONT_INFO_REC 
                             b                 b\  FONT_INFO_REC ...
                               \  FONT_INFO_REC
                                                b\  FONT_INFO_REC ...


RD2 byte  JTM t@C[hꂽƂALN^R[hȂ瓯
X^[f[^̓mŁAO[vAN쐬igbvA
k_top ŁAւ pointer Ak_next

FONT_INFO_REC ->  -> FONT_INFO_REC  FONT_INFO_REC ->  -> FONT_INFO_REC



SDẽX^[f[^WJēƂȀ̕񂪁AtHgʂɁA
̍Ō 4bits ɂĈقȂ root Ȃ binary tree ̃N`
ŁAi[BɁÃ̕X^[Ef[^ւ pointer 

              ->                              b\\ CHAR_INFO_REC->raster
              ->          \\ CHAR_INFO_REC->raster
              ->         b                   b\\ CHAR_INFO_REC->raster
FONT_INFO_REC -> CHAR_INFO_REC->raster 
              ->         b                   b\\ CHAR_INFO_REC->raster
              ->          \\ CHAR_INFO_REC->raster
                                            b\\ CHAR_INFO_REC->raster
                            b\\
              -> CHAR_INFO_REC->raster
                              b\\



		ytHgf[^̏z

struct FONT_INFO_REC {
  int		font_code;	/* tHgԍ				*/

  int		font_type;	/* tHgEt@C̎		*/
				/* PXL100,.., ROM_FONT,... etc.		*/

  int		f_goth;		/* SVbNA{p̃tO		*/

  char		*name;		/* tHg̖O cmr10, min10 etc.	*/

  char far	*pk;		/* [htHgEt@C̃AhX */

  struct CHAR_INFO_REC far	*char_info[16];
	/* ẽf[^ւ tree  roots  pointer 			*/
	/* R[h̉ʂ 4 bits ŕĂ			*/

  struct FONT_INFO_REC far	*k_top;
	/* 2 oCgł̃O[ṽgbv 			*/
	/* ̃X^[Ef[^p̂AO[vitH */
	/* gEt@CpA{pǂB^SVbŃAr	*/
	/* bg}bvobt@ɓWJɏ̂ŁAʂȂj	*/

  struct FONT_INFO_REC far	*k_next;
	/* 2 oCgł̃O[vł̎ւ̃N			*/

  long	size_para		/* fUCETCY			*/

  strcut FONT_INFO_REC far	*next_font;
	/*  FONT_INFO_REC ւ̃N				*/

  strcut FONT_INFO_REC far	*before_font;
	/* FONT_INFO_REC  tree ̑O node ւ pointer		*/

  strcut FONT_INFO_REC far	*after_font;
	/* FONT_INFO_REC  tree ̌ node ւ pointer		*/

  int	k_width;
	/* 2 byte ̕W̉̋ehbgAJFM t@Cɂ */

  int	k_height;
	/* 2 byte ̕W̏c̋ehbgAJFM t@Cɂ */

  int	last_code;
	/* 2 byte ̏ꍇAtHgEt@CɊ܂܂Ō̕	*/
	/* JIS CODE							*/

  long	c;	/* DVI ǂ TFM/JFM t@C̃`FbNT	*/

  union EXT {
    char far*	dir;
	/* ptHĝƂA[Ƀ[htHgf[^̊e */
	/* ̃AhXEe[uւ̃|C^				*/

    union KFONT *kdir;
	/* ROM_FONT ȊO 2 byte ̂Ƃg KFONT ւ̃|C^	*/
};

  struct KFONT {
    int		width;		/* hbgPʂł̉i{plj	*/
				/* cgݘał̓tHg̍   */
    int		height;		/* hbgPʂł̍			*/
    				/* cgݘał̓tHg̕B	*/
@@int		size;		/* (width+7)/8*height			*/
    int		base;		/* x[XC艺hbg	*/
    int		fh;		/* t@CEnh̔ԍ		*/
    char	*name;		/* tHgEt@C			*/
	/* قȂtHgł̃tHgEt@CpƂ́A */
	/* t@CEnhg					*/
  };


struct CHAR_INFO_REC {
    int code;			/* R[h				*/

    CHAR_INFO_REC far	*next_char;	/* ̕ node  pointer	*/

@@CHAR_INFO_REC far	*former_char;	/* O̕ node  pointer	*/

    struct PREAMBLE_REC pre {
	/* Expanded font buffer ɓWJꂽtHg̏		*/
	/* {p͏Ă邪A^SVbN͏ĂȂ	*/

      int	width;		/* hbgPʂł̕			*/
      int	height;		/* hbgPʂł̍			*/
      				/* ͑gɂȂB*/
      int	pitch_offset;	/*  offset		*/
      int	depth_offset;	/* ̐[ offset		*/
      char far *raster;		/* X^[Ef[^ւ̃|C^		*/
      long	tfm_width;	/* scaled point Pʂł̕蕝	*/
      int 	byte_width;	/* (width+7)/8				*/
};


			ydviout/dviprt ̗̏z
o 

  dvifile_open()
  R}hCɂAdvi t@CI[v
  ̂ƂAgqtĂȂ΁A.dvi ₤iname_linkj

  initialize()
    dviout.cfg/dviprt.cfg ̃pXϐ TEXCFG 猈肵Ȁ
@@siread_post, set_config, set_option, set_dimension, make_font_list,
    make_page_index, pixel_init, buffer_init, stack_init, decode_initj

    read_post()
    dvit@CȂ̂ǂ`FbN POSTAMBLE ǂ
   inum, den, mag, l, u:y[W̑傫, s:X^bN̑傫, t:y[Wj

    set_config()
    dviout.par/dviprt.par ̃IvVEp[^ǂ

    set_option()
    ÑIvVEp[^ǂ

    set_dimension()
    scaled point  pixel Ƃ̕ϊcʂɋ߁Aϊ֐i sptopxl,
    c vtopxljɁAset_convert ŁAn
    eLXg̏cƉ pixel ł̃TCYƂ߂BAAćAHeaderFooter
    TCY

    make_font_list()
    ϐ TEXPK ƁAdvit@C fnt_def ɊÂāAfont_define ŁAtH
    gEt@C{AtHg̃T[`₷悤 font_sort ŏ
    AA2oCg̃tHg̏ꍇ́Ajfm t@C{

      font_define()
      dvit@C font_def ǂ݁AtHgƉ𑜓xȂǂ̏𓾂

        make_font()
        ۂ̉𑜓x߁Afont_name_check ɂătHgEt@C{A
        tHg̏ FONT_INFO ̌`ŋL^ifar [j
        Ȃ΃G[bZ[W\

          font_name_check()
          ϐ TEXPK, tHgA𑜓xAփtHg̎w݂āA{
@@@@@t@C fill_name_and_fig ō쐬A%g ꍇ access ŁA
@@@@@ꍇ accgth ŃtHgEt@C{
          ȂtHǵA{t@C\

            accgth()
            FARt@CAGTHt@C ID 𒲂ׂČ肵A߂tHgE
            t@C܂܂Ă邩ǂ`FbNA܂܂Ă΁Â
            ʒuƃTCY߂

      font_sort()
      tHg̃XgtHgԍŃ\[gA{Ղ悤 make_font_tree
       binary tree 

    make_page_index()
    dvit@CǂŁAey[W̐擪 dvit@Cł̈ʒu̕\

    pixel_init()
    3̃obt@̃TCY肵ABit map buffer ̑傫A1y[W
    鐔ƁAɓWJ鉡Əc pixel Pʂ̑傫 set_size ɂ苁
    

    buffer_init()
    3 huge obt@mۂAKvȂ load_fc ɂătHgLVEt
    @C load_fc ŁA[h

      load_fc()
      tHgLVEt@C̐`FbNi̃IvVEt
      OAg嗦Ahuge obt@̈ʒuƃTCYAtHgEt@C̃Xg̃`F
      bNTȂ)AȅƃX^[Ef[^ Expanded font buffer 
      [hAtHgXgǂŁAȅւ̃m[hA2 byte 
      tHg̃O[vƋ^SVbÑtORs[

    stack_init()
      dvit@C̃f[^ɊÂāAX^bN̈mۂ

    decode_init()
      ݂́AĂȂ
-------------------------------------------------------------------------------
o vi-f Ǝw肵Ȃꍇj

put_dvi()
-o ɂy[W̐iߕǂ݁Adevice_init ̂ƁA-B IvVA邢́Ao
̓y[Ww̋Ñp[^ search_page ŉ߂āAprint_page ɂ
o͂
ŌɁAdevice_end Ă

  device_init()
    dviout ł́AÑp[^ɂăXN[EXs[hݒ肵A-B I
  vV΁A[ǂōŏ̃y[Wݒ肷
@GDC̃NbNA GVRAM ݂̑𒲂ׁAOtBbNʂB܂A
@\镔̑傫ƂɁAʂ̂ǂ̈ʒuɕ\邩߂
  View [ĥƂ̕\ʒuAgAL^邽߂̃obt@߂
    dviprt ł́A-O ̃p[^ƂɁAoׂ͂foCXKvȂI[v
  ̃R[h𑗂

  print_page()
  w肳ꂽ͈͂̃y[Wo͂
@ׂy[W̎w肳ꂽidviout ł́A̔ԍ\j interpret
  ŁABit map buffer ɓWJAdevice_clear Ă񂾌Ã݂y[W̏ꏊ̔
  \Adevice_out ŏo͂Bꂩ̖߂lŁA̕߂ēl
  A邢͔łBy[WςƂ́A pr_new_page ĂԁB

    set_output_size()
    WJ Bit map buffer ́ÃEChEł̂ŁAy[W̒ł̈ʒu
@@TCYȂǂ split Ȃǂlċ߂

    init_output()
    o͂y[W̐擪 dvit@Cɉʒu߁Astackɖ߂ABit
    map buffer NA[ABit map buffer Ɋւ|C^萔ANZX
@@₷` bitmap_init ŃZbg

    interpret()
    ϐ̏̌Advit@C̃y[WLq܂ŐiŁAwork ɂ肻
@@߂āABit map buffer ƂEChEɓWJ

      work()
      dvit@C̃y[WLqǂ݁AR[hɉāA֐
@@@Ăԁifont_change tHg̑IAcput ̈󎚁Arput r̈󎚁AJ
@@@gE|Cg̈ړAϐ push, popAspecial R}hȂǁj
      cput Ă񂾏ꍇ́A̖߂lɃ|C^i߂
      EOP ɏo܂ő

        xxx1()
        \special R}h͉AKvȂǂ݂Ƃ΂

        font_change()
        tHgԍ̃tHgtHgEXg̒{ÃAhX
@@@@߂
@@@@SVbNǂ̃tOZbg

        rput()
        󎚂ׂ box ̃TCYApixel Pʂŋ߁Awrite_rule ŁA Bit map 
        buffer ɏ
        APȉɂȂꍇłAPƂ

        cput()
        get_font ŁA̕Ɋւ傫̏ƃX^[f[^߁A
        sptopixel, vtopixel ň󎚂ׂʒuApixel Pʂŋ߁Awrite_font
@@@@Bit map buffer Ɉ󎚂
        SVbÑtO΁A 1 pixel 炵ē̂󎚂
        ̕ɊւǂŁA scaled point PʂŕԂ

          get_font()
          vꂽ Expanded font buffer ɊɓWJĂ邩ǂ
@@@@@ׁAWJĂ΁Ȁ̂AhXԂB݂ȂƂ:
          get_pk ŁAFont file buffer Ƀ[hꂽtHgEt@Ci1 byte
          ̎́AtHg̃X^[f[^kēĂt@CA
          2 byte̎ JFM t@Cĵ̂̕镔̃AhXԂB
@@@@@̏̕ set_preamble ŁAExpanded font buffer ɗ̈mۂ
@@@@@ďB
          2 byte̎́ÃtHg̃X^[Ef[^ Expanded font
          buffer ɑ݂邩ǂׁA݂΁A̕ɏB
@@@@@ȊOł́AExpanded font buffer ɂ̕WJi{pɂȂ
@@@@@΁AjAtHg̃̕NɉāÃAh
@@@@@XԂB

            get_pk()
            Font file buffer ɑΉtHgEt@C[hĂȂ
@@@@@@΁Aload_pk Ń[hA ID 𒲂ׂāAtHg̏ FONT_
            INFO_REC ɏBJFM t@CłāAɁAtHg̃X^[
@@@@@@f[^Et@C܂I[vĂȂƂ́Aopen_kfont ŁA
@@@@@@I[vîƂAǂf[^g܂Bhbg
@@@@@@TCYAROM_FONT gǂA^SVbNɂ邩ǂjA
@@@@@@tHgL^BKvȂtHg̃`FbNT̐
            ׂB
            R[h̐𒲂ׂāÃ̕f[^̂镔̃AhX
@@@@@@ԂB

              load_pk()
              iobt@ȂƂ́Aobt@tVĂj
              ^ꂽt@C̃tHgEt@C load_pk_data ŁA
@@@@@@@Expanded font buffer Ƀ[hiGTH 邢 FAR t@Ĉ
@@@@@@@́AΉ镔̂݃[hjB

              open_kfont()
              ϐ TEXKNJ ɂāAœK̉ 2 byte ̃X^[
@@@@@@@f[^̃t@C{B̃t@CÃtHgŁAI[v
@@@@@@@ĂȂ΁AI[vB
@@@@@@@ROM_FONT ɂȂ邩A{pgAŌ܂B܂ÃO
@@@@@@@[vɂׂ̂邩ǂA`FbNAL^B

            set_preamble()
              p̗̈ Expaneded font buffer ɊmۂAX^[f[^
@@@@@@@Ɋւf[^ipixel Pʂł̕AAItZbg̑ɁAs
@@@@@@@b`itfm widthj \magstep Ȃǂŕ␳ꂽ̂vZājL
@@@@@@@^ÃAhXԂ

      write_font()
      LN^̈ꕔłA݂ Bit map buffer ƂEChEɓ邩
@@@ׁAĂ̂ w_font ɂāAKȃrbg炵 Bit 
      map buffer ɏ

    device_clear()
    dviout ł́AϐAsplitԍPȏȂ\ɗp GVRAM N
@@A[BeLXgʂNA[ăJ[\

    device_out()
    Bit map buffer ̃f[^efoCXɏo͂AKvȏs

    pr_new_page()
    dviout ł́AȂBdviprt ł́A-nf ɉāAy[WR[hA܂
@@̉sR[h𑗂

  device_end()
  dviout.exe ł́AOtBbNʂ̏OtBbNʂɖ߂̏A
  dviprt.exe ł́Ay[WAv^ʏ탂[hɖ߂Ȃǂ̏s

-------------------------------------------------------------------------------
o ㏈

  save_fc()
  -r Ńt@Cw肳ĂāAExpanded font buffer NɔׂčXV
@ĂAtbVĂȂ΁AExpanded font buffer ̃f[^AtHgE
@Xg̃f[^A`FbN̂߂̏t@CɃZ[u

  information_out()
  tHg̎gp󋵂Ȃǂ\

  dvifile_close()
  dvi t@CA2 byte ̃tHgEX^[Ef[^Et@CN[Y

  buffer_information()
  obt@̎gp󋵂\



			yڐÂ߂̃qgz

PDPC-9801 ̏ꍇAOtBbNErfIEobt@ɗp邱Ƃł
ɂȂĂ邪A֎~B

QDCPU  8086n Ȃ΁AAZũvOi*.asmj́Â܂܎g
낤idviprt.exe Ŏg p_sub.asm, p_subnec.asm ́Achar *pr_buf, 
int pr_buf_len, pr_flush() QƂĂ̂ŒӁjB
̂ƂAdviprt.exe ł pr_flush() ݂̂Ahard ware dependent łB
dviout.exe ł́Adevice.c Ahard ware dependent łB
{Iɂ́ÁAdevice_init(), device_cear(), device_out(), device_end() 
n[hɈˑ镔iAAIvVp[^ɂ́APC-9801 ̂ݗLȂ̂
jB

RD CPU ̏ꍇ́AႦ΁Aint A16 bits łȂꍇȂǂ́Aׂ
Ał낤B

---
January 28, 1990, written by SHIMA
