fortran66のブログ

fortran について書きます。

ANSI ESCAPE SEQUENCE の利用

16bit DOS窓の時代は、ANSI.SYS を config.sys で読み込むことで、ANSI ESCAPE SEQUENCE が利用できたわけですが、32bit 対応になったあたりから ANSI.SYS が使えなくなっていました。
しかしながら UNIX系のターミナルではまだ ANSI ESCAPE SEQUENCE が使われていることもあって、ANSI ESCAPE SEQUENCE のエミュレーションを 64bit/32bit Windows のコマンドプロンプトで実現するソフトが作られているようです。それが ANSICON です。https://github.com/adoxa/ansicon

昔懐かしい ANSI ESCAPE SEQENCE を用いて、これまた昔懐かしいキャラクターグラフィックをやってみました。

実行結果

64bit でコンパイルするか 32bit でコンパイルするかで、それぞれに対応した ANSICON を用いる必要があります。

ソースプログラム

program ansi2
  implicit none
  real, parameter :: pi = 4.0 * atan(1.0)
  character, parameter :: esc = achar(27)
  enum, bind(c)
    enumerator :: Reset_all_attributes = 0, Bright, Dim, Underscore, Blink, Reverse, Hidden  
    enumerator :: fg_Black = 30, fg_Red, fg_Green, fg_Yellow, fg_Blue, fg_Magenta, fg_Cyan, fg_White
    enumerator :: bg_Black = 40, bg_Red, bg_Green, bg_Yellow, bg_Blue, bg_Magenta, bg_Cyan, bg_White
  end enum
  
  integer :: i, ix, iy, ix0 = 5, iy0 = 13
  real :: a, x, y
  
  print "(a, '[2J')", esc ! CLS
  
!GRAPH TITLE  
  ix = 40
  iy = 2
  print "(a, '[', i2.2, ';', i2.2, 'm')", esc, fg_blue, bg_yellow 
  print "(a, '[', i2.2, ';', i2.2, 'H', a)", esc, iy, ix, 'exp(-ax) * sin(x)'  
  print "(a, '[', i2.2, 'm')", esc, Reset_all_attributes 
  
!plot axes ! x-axis, y-axis
  ix = ix0 + 83
  iy = iy0 + 1
  print "(a, '[', i4.4, ';', i4.4, 'H', a)", esc, iy, ix, 'X'
  ix = ix0 - 2
  iy = iy0 + 1
  print "(a, '[', i4.4, ';', i4.4, 'H', a)", esc, iy, ix, '0'
  
  do i = 1, 90
    ix = i
    iy = iy0
    print "(a, '[', i2.2, ';', i2.2, 'H', a)", esc, iy, ix, '-' 
  end do

  do i = 1, 25
    ix = ix0
    iy = i
    print "(a, '[', i2.2, ';', i2.2, 'H', a)", esc, iy, ix, '|' 
  end do

!plot curve  
  a = 0.12
  print "(a, '[', i2.2, ';', i2.2, 'm')", esc, fg_red, bright 
  do i = 1, 80
    x = 4 * (i - 1) * pi / 80
    y = sin(x) * exp(- a * x)
    ix = ix0 + i
    iy = iy0 - 10 * y 
    print "(a, '[', i3.3, ';', i2.2, 'H', a)", esc, iy, ix, '*' 
  end do
  print "(a, '[', i2.2, 'm')", esc, Reset_all_attributes 
  print "(a, '[26;1H')", esc 
  
end program ansi2