home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / whisper / source / vram.asm < prev    next >
Assembly Source File  |  1980-01-02  |  20KB  |  936 lines

  1. ;*************************************
  2. ;    VRAM Direct Access Program
  3. ;*************************************
  4.  
  5. extrn    page_ofs:dword
  6. extrn    errno:word
  7.  
  8. bitptn    segment    'DATA'
  9.  
  10. ;*************************************
  11. ;    16色VRAMビットパタ-ン
  12. ;*************************************
  13.  
  14. slp_tim    dw    0FFFFh            ; anime sleep time
  15. ankfnt    dd    16*256 dup(?)
  16. fntcol    dd    256 dup(?)
  17. fntptn    dd    000000000h,0F0000000h,00F000000h,0FF000000h
  18.     dd    000F00000h,0F0F00000h,00FF00000h,0FFF00000h
  19.     dd    0000F0000h,0F00F0000h,00F0F0000h,0FF0F0000h
  20.     dd    000FF0000h,0F0FF0000h,00FFF0000h,0FFFF0000h
  21.     dd    00000F000h,0F000F000h,00F00F000h,0FF00F000h
  22.     dd    000F0F000h,0F0F0F000h,00FF0F000h,0FFF0F000h
  23.     dd    0000FF000h,0F00FF000h,00F0FF000h,0FF0FF000h
  24.     dd    000FFF000h,0F0FFF000h,00FFFF000h,0FFFFF000h
  25.     dd    000000F00h,0F0000F00h,00F000F00h,0FF000F00h
  26.     dd    000F00F00h,0F0F00F00h,00FF00F00h,0FFF00F00h
  27.     dd    0000F0F00h,0F00F0F00h,00F0F0F00h,0FF0F0F00h
  28.     dd    000FF0F00h,0F0FF0F00h,00FFF0F00h,0FFFF0F00h
  29.     dd    00000FF00h,0F000FF00h,00F00FF00h,0FF00FF00h
  30.     dd    000F0FF00h,0F0F0FF00h,00FF0FF00h,0FFF0FF00h
  31.     dd    0000FFF00h,0F00FFF00h,00F0FFF00h,0FF0FFF00h
  32.     dd    000FFFF00h,0F0FFFF00h,00FFFFF00h,0FFFFFF00h
  33.     dd    0000000F0h,0F00000F0h,00F0000F0h,0FF0000F0h
  34.     dd    000F000F0h,0F0F000F0h,00FF000F0h,0FFF000F0h
  35.     dd    0000F00F0h,0F00F00F0h,00F0F00F0h,0FF0F00F0h
  36.     dd    000FF00F0h,0F0FF00F0h,00FFF00F0h,0FFFF00F0h
  37.     dd    00000F0F0h,0F000F0F0h,00F00F0F0h,0FF00F0F0h
  38.     dd    000F0F0F0h,0F0F0F0F0h,00FF0F0F0h,0FFF0F0F0h
  39.     dd    0000FF0F0h,0F00FF0F0h,00F0FF0F0h,0FF0FF0F0h
  40.     dd    000FFF0F0h,0F0FFF0F0h,00FFFF0F0h,0FFFFF0F0h
  41.     dd    000000FF0h,0F0000FF0h,00F000FF0h,0FF000FF0h
  42.     dd    000F00FF0h,0F0F00FF0h,00FF00FF0h,0FFF00FF0h
  43.     dd    0000F0FF0h,0F00F0FF0h,00F0F0FF0h,0FF0F0FF0h
  44.     dd    000FF0FF0h,0F0FF0FF0h,00FFF0FF0h,0FFFF0FF0h
  45.     dd    00000FFF0h,0F000FFF0h,00F00FFF0h,0FF00FFF0h
  46.     dd    000F0FFF0h,0F0F0FFF0h,00FF0FFF0h,0FFF0FFF0h
  47.     dd    0000FFFF0h,0F00FFFF0h,00F0FFFF0h,0FF0FFFF0h
  48.     dd    000FFFFF0h,0F0FFFFF0h,00FFFFFF0h,0FFFFFFF0h
  49.     dd    00000000Fh,0F000000Fh,00F00000Fh,0FF00000Fh
  50.     dd    000F0000Fh,0F0F0000Fh,00FF0000Fh,0FFF0000Fh
  51.     dd    0000F000Fh,0F00F000Fh,00F0F000Fh,0FF0F000Fh
  52.     dd    000FF000Fh,0F0FF000Fh,00FFF000Fh,0FFFF000Fh
  53.     dd    00000F00Fh,0F000F00Fh,00F00F00Fh,0FF00F00Fh
  54.     dd    000F0F00Fh,0F0F0F00Fh,00FF0F00Fh,0FFF0F00Fh
  55.     dd    0000FF00Fh,0F00FF00Fh,00F0FF00Fh,0FF0FF00Fh
  56.     dd    000FFF00Fh,0F0FFF00Fh,00FFFF00Fh,0FFFFF00Fh
  57.     dd    000000F0Fh,0F0000F0Fh,00F000F0Fh,0FF000F0Fh
  58.     dd    000F00F0Fh,0F0F00F0Fh,00FF00F0Fh,0FFF00F0Fh
  59.     dd    0000F0F0Fh,0F00F0F0Fh,00F0F0F0Fh,0FF0F0F0Fh
  60.     dd    000FF0F0Fh,0F0FF0F0Fh,00FFF0F0Fh,0FFFF0F0Fh
  61.     dd    00000FF0Fh,0F000FF0Fh,00F00FF0Fh,0FF00FF0Fh
  62.     dd    000F0FF0Fh,0F0F0FF0Fh,00FF0FF0Fh,0FFF0FF0Fh
  63.     dd    0000FFF0Fh,0F00FFF0Fh,00F0FFF0Fh,0FF0FFF0Fh
  64.     dd    000FFFF0Fh,0F0FFFF0Fh,00FFFFF0Fh,0FFFFFF0Fh
  65.     dd    0000000FFh,0F00000FFh,00F0000FFh,0FF0000FFh
  66.     dd    000F000FFh,0F0F000FFh,00FF000FFh,0FFF000FFh
  67.     dd    0000F00FFh,0F00F00FFh,00F0F00FFh,0FF0F00FFh
  68.     dd    000FF00FFh,0F0FF00FFh,00FFF00FFh,0FFFF00FFh
  69.     dd    00000F0FFh,0F000F0FFh,00F00F0FFh,0FF00F0FFh
  70.     dd    000F0F0FFh,0F0F0F0FFh,00FF0F0FFh,0FFF0F0FFh
  71.     dd    0000FF0FFh,0F00FF0FFh,00F0FF0FFh,0FF0FF0FFh
  72.     dd    000FFF0FFh,0F0FFF0FFh,00FFFF0FFh,0FFFFF0FFh
  73.     dd    000000FFFh,0F0000FFFh,00F000FFFh,0FF000FFFh
  74.     dd    000F00FFFh,0F0F00FFFh,00FF00FFFh,0FFF00FFFh
  75.     dd    0000F0FFFh,0F00F0FFFh,00F0F0FFFh,0FF0F0FFFh
  76.     dd    000FF0FFFh,0F0FF0FFFh,00FFF0FFFh,0FFFF0FFFh
  77.     dd    00000FFFFh,0F000FFFFh,00F00FFFFh,0FF00FFFFh
  78.     dd    000F0FFFFh,0F0F0FFFFh,00FF0FFFFh,0FFF0FFFFh
  79.     dd    0000FFFFFh,0F00FFFFFh,00F0FFFFFh,0FF0FFFFFh
  80.     dd    000FFFFFFh,0F0FFFFFFh,00FFFFFFFh,0FFFFFFFFh
  81. ;**********************************************
  82. ;    漢字コ-ドチェックテ-ブル
  83. ;**********************************************
  84. ISKAN1    equ    1
  85. ISKAN2    equ    2
  86. ;        0 1 2 3 4 5 6 7 8 9 A B C D E F
  87. kantbl    db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;0
  88.     db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;1
  89.     db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;2
  90.     db    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;3
  91.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;4
  92.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;5
  93.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;6
  94.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0    ;7
  95.     db    2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3    ;8
  96.     db    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3    ;9
  97.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;A
  98.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;B
  99.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;C
  100.     db    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2    ;D
  101.     db    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3    ;E
  102.     db    3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0    ;F
  103. bitptn    ends
  104.  
  105. VRAM    segment 'CODE'
  106.     assume  cs:VRAM,ds:bitptn
  107. ;**************************************
  108. ;    String to VRAM Display
  109. ;**************************************
  110. ;   putstr(char *vram, char *str)
  111. ;            +8          +12
  112. ;**************************************
  113.     align    4                ; align set
  114.     public    putstr
  115. putstr    proc    near
  116.     push    ebp
  117.     mov    ebp,esp
  118.     xor    eax,eax
  119.     push    eax                ; work push
  120.  
  121.     push    gs
  122.     push    fs
  123.     push    es
  124.     push    esi
  125.     push    edi
  126.     push    edx
  127.     push    ecx
  128.     push    ebx
  129.     cld
  130.     mov    ax,104h                ; VRAM Selecter
  131.     mov    es,ax                ; es = VRAM Selecter
  132.     mov    ax,0110h            ; TBIOS Selecter
  133.     mov    fs,ax                ; fs = TBIOS
  134.     mov    ax,ds
  135.     mov    gs,ax                ; gs = ds
  136.  
  137.     align    4                ; align set
  138. putlop:                        ; Put Loop
  139.     mov    esi,[ebp+12]            ; char *str
  140. putlp2:
  141.     lodsb                    ; Get String    ※
  142.     or    al,al
  143.     je    Left_clear            ; End of String ?
  144.  
  145.     cmp    al,0Ah                ; \n skip
  146.     je    putlp2
  147.  
  148.     movzx    eax,al
  149.     mov    bl,[eax+offset kantbl]
  150.     and    bl,ISKAN1
  151.     jz    putank                ; Not iskanji1 ?
  152.     movzx    ebx,byte ptr [esi]
  153.     mov    bh,[ebx+offset kantbl]
  154.     and    bh,ISKAN2
  155.     jz    putank                ; Not iskanji2 ?
  156.     mov    bh,al
  157.     inc    esi                ; doubel_word ?????    ※
  158.     mov    [ebp+12],esi            ; Save *str
  159.  
  160.     shl    bh,1                ; Shift Jis to Jis
  161.     cmp    bl,080h
  162.     adc    bx,1f61h
  163.     add    bl,7fh
  164.     jc    short knf1
  165.     add    bl,0a2h
  166. knf1:    and    bh,7fh                ; StoJ end
  167.  
  168.     mov    ax,0100h
  169.     mov    dx,1010h
  170.  
  171.     call    pword ptr fs:[00a0h]        ; Get Kanji Font
  172.  
  173.     mov    edi,ss:[ebp+8]            ; *vram
  174.     add    edi,ss:[ebp-4]            ; work add
  175.     or    edi,gs:[page_ofs]        ; or Page Offset
  176.     mov    ebx,offset fntcol
  177.     xor    edx,edx                ; edx=0
  178.     xor    ecx,ecx                ; ecx=0
  179.     REPT    16
  180.     lodsw                    ; Get Kanji Font Pattern
  181.     mov    cl,al                ; Left Font Pattern
  182.     mov    dl,ah                ; Right Font Pattern
  183.     mov    eax,gs:[ebx+ecx*4]        ; Get Vram Bit Patan
  184.     stosd                    ; Write Left Font 
  185.     mov    eax,gs:[ebx+edx*4]        ; Get Vram Bit Patan
  186.     stosd                    ; Write Right Font
  187.     add    edi,512-4*2            ; 1 Line 512 Byte
  188.     endm
  189.     mov    ax,gs
  190.     mov    ds,ax
  191.     add    dword ptr [ebp-4],8        ; Next vram Address
  192.  
  193.     jmp    putlop                ; Next Put String Loop
  194.  
  195.     align    4                ; align set
  196. putank:                        ; Write Ank Font
  197.     mov    [ebp+12],esi            ; Save *str
  198.     movzx    esi,al
  199.     shl    esi,6                ; 4x16=64
  200.     add    esi,offset ankfnt        ; ANK Font Table Offset
  201.  
  202.     mov    edi,[ebp+8]            ; *vram
  203.     add    edi,[ebp-4]            ; work add
  204.     or    edi,[page_ofs]            ; or Page Offset
  205.     mov    ebx,512-4
  206.     REPT    15
  207.     movsd                    ; Trans Font
  208.     add    edi,ebx                ; Line add
  209.     endm
  210.     movsd                    ; Trans Font
  211.     add    dword ptr [ebp-4],4        ; Next vram Address
  212.  
  213.     jmp    putlop                ; Next Put String Loop
  214.  
  215.     align    4
  216. Left_clear:
  217.     ; VRAM Clear
  218.     mov    ebx,320
  219.     sub    ebx,[ebp-4]            ; nokori dword
  220.     je    nonclr
  221.  
  222.     mov    edi,[ebp+8]            ; *vram
  223.     add    edi,[ebp-4]            ; work add
  224.     or    edi,[page_ofs]            ; or Page Offset
  225.     shr    ebx,2                ; / 4
  226.     mov    ebp,[ebp-4]
  227.     add    ebp,512-320
  228.     mov    eax,[fntcol]
  229.     mov    edx,03FFFFh
  230.     mov    esi,[page_ofs]
  231.     REPT    16
  232.     mov    ecx,ebx                ; nokori dword
  233.     rep    stosd
  234.     add    edi,ebp
  235.     and    edi,edx
  236.     or    edi,esi
  237.     endm
  238. nonclr:
  239.     ; end of VRAM Clear
  240.     pop    ebx
  241.     pop    ecx
  242.     pop    edx
  243.     pop    edi
  244.     pop    esi
  245.     pop    es
  246.     pop    fs
  247.     pop    gs
  248.  
  249.     pop    eax                ; work pop
  250.     pop    ebp
  251.     ret                    ; end of putstr
  252.  
  253. putstr    endp
  254. ;***************************************************
  255. ;    void    ctblset(int Chr_Col,int Bak_Col);
  256. ;***************************************************
  257.     public    ctblset
  258. ctblset    proc    near
  259.     push    ebp
  260.     mov    ebp,esp
  261.     push    esi
  262.     push    edi
  263.     push    fs
  264.  
  265.     mov    ecx,256
  266.     mov    esi,offset fntptn
  267.     mov    edi,offset fntcol
  268. ctblp:    lodsd
  269.     mov    edx,eax
  270.     not    edx
  271.     and    eax,[ebp+8]
  272.     and    edx,[ebp+12]
  273.     or    eax,edx
  274.     stosd
  275.     loop    ctblp
  276.  
  277.     mov    ax,138h                ; ANK Font Selecter
  278.     mov    fs,ax
  279.     mov    esi,3D800h
  280.     mov    edi,offset ankfnt
  281.  
  282.     mov    ecx,16*256
  283. aktb1:    movzx    eax,byte ptr fs:[esi]
  284.     inc    esi
  285.     mov    eax,[eax*4+fntcol]
  286.     stosd
  287.     loop    aktb1
  288.  
  289.     pop    fs
  290.     pop    edi
  291.     pop    esi
  292.     pop    ebp
  293.     ret
  294. ctblset    endp
  295.     public    inport
  296. ;****************************************************************************
  297. ;   wrtstr(char *str, int page, char *vram, int forcol, int bakcol, int font)
  298. ;            +8        +12        +16        +20         +24         +28
  299. ;****************************************************************************
  300.     align    4                ; align set
  301.     public    wrtstr
  302. wrtstr    proc    near
  303.     push    ebp
  304.     mov    ebp,esp
  305.     push    gs
  306.     push    fs
  307.     push    es
  308.     push    esi
  309.     push    edi
  310.     push    ebx
  311.  
  312.     mov    ax,104h                ; VRAM Selecter
  313.     mov    gs,ax                ; gs = VRAM Selecter
  314.     mov    ax,110h                ; TBIOS Selecter
  315.     mov    fs,ax                ; fs = TBIOS
  316.  
  317.     align    4                ; align set
  318. wrtlop:                        ; Put Loop
  319.     mov    esi,[ebp+8]            ; char *str
  320.     movzx    eax,byte ptr [esi]
  321.     inc    si
  322.     or    al,al
  323.     jnz    short wrtnxt            ; End of String ?
  324.  
  325.     pop    ebx
  326.     pop    edi
  327.     pop    esi
  328.     pop    es
  329.     pop    fs
  330.     pop    gs
  331.     pop    ebp
  332.     ret                    ; end of putstr
  333.  
  334.     align    4                ; align set
  335. wrtnxt:
  336.     mov    bl,[eax+offset kantbl]
  337.     and    bl,ISKAN1
  338.     jz    wrtank                ; Not iskanji1 ?
  339.     movzx    ebx,byte ptr [esi]
  340.     mov    bh,[ebx+offset kantbl]
  341.     and    bh,ISKAN2
  342.     jz    wrtank                ; Not iskanji2 ?
  343.     mov    bh,al
  344.     inc    si
  345.     mov    [ebp+8],esi            ; Save *str
  346.  
  347.     shl    bh,1                ; Shift Jis to Jis
  348.     cmp    bl,080h
  349.     adc    bx,1f61h
  350.     add    bl,7fh
  351.     jc    short wrtst1
  352.     add    bl,0a2h
  353. wrtst1:    and    bh,7fh                ; StoJ end
  354.  
  355.     mov    ax,0100h
  356.     mov    dx,1010h
  357.     push    ds
  358.     call    pword ptr fs:[00a0h]        ; Get Kanji Font
  359.     push    ds                ; ds:esi = Kanji Font
  360.     pop    es                ; cheng ds<->es
  361.     pop    ds
  362.  
  363.     mov    edi,[ebp+16]            ; *vram
  364.     or    edi,[ebp+12]            ; page
  365.     mov    ecx,[ebp+28]            ; Y = 16 Dot Font
  366.     align    4                ; align set
  367.  
  368. wtkn1:    mov    bx,es:[esi]
  369.     add    esi,2
  370.  
  371.     cmp    byte ptr [ebp+28],16
  372.     je    short wtkn2
  373.     or    bx,es:[esi]
  374.     add    esi,2
  375. wtkn2:
  376.     movzx    eax,bl                ; Get Kanji Left Font Pattan
  377.     mov    eax,[eax*4+fntptn]        ; Get Vram Bit Patan
  378.     mov    edx,eax
  379.     not    edx
  380.     and    eax,[ebp+20]
  381.     and    edx,[ebp+24]
  382.     or    eax,edx
  383.     mov    gs:[edi],eax            ; Write Kanji Left Font
  384.  
  385.     movzx    eax,bh                ; Get Kanji Right Font Pattan
  386.     mov    eax,[eax*4+fntptn]        ; Get Vram Bit Patan
  387.     mov    edx,eax
  388.     not    edx
  389.     and    eax,[ebp+20]
  390.     and    edx,[ebp+24]
  391.     or    eax,edx
  392.     mov    gs:[edi+4],eax            ; Write Kanji Right Font
  393.  
  394.     add    edi,512                ; 1 Line 512 Byte
  395.     and    edi,03FFFFh
  396.     or    edi,[ebp+12]            ; Page
  397.     loop    wtkn1
  398.  
  399.     add    dword ptr [ebp+16],8
  400.     jmp    wrtlop                ; Next Put String Loop
  401.  
  402.     align    4                ; align set
  403. wrtank:                        ; Write Ank Font
  404.     cmp    al,1Bh                ; Esc Code
  405.     jne    short wtak0
  406.  
  407.     movzx    eax,byte ptr [esi]
  408.     inc    esi
  409. wtak0:    mov    [ebp+8],esi            ; Save *str
  410.     mov    esi,eax
  411.  
  412.     cmp    byte ptr [ebp+28],16
  413.     jne    short wrtft1
  414.     shl    esi,4                ; x16
  415.     add    esi,3D800h            ; 8x16 ANK Font Offset
  416.     jmp    short wrtft2
  417. wrtft1:    shl    esi,3                ; x8
  418.     add    esi,3D000h            ; 8x8 ANK Font Offset
  419.  
  420. wrtft2:    mov    ax,138h                ; ANK Font Selecter
  421.     mov    es,ax
  422.  
  423.     mov    edi,[ebp+16]            ; *vram
  424.     or    edi,[ebp+12]            ; Page
  425.     mov    ecx,[ebp+28]            ; Y = 16 Dot Font
  426.     align    4                ; align set
  427.  
  428. wtak1:    movzx    eax,byte ptr es:[esi]        ; Get Font Pattan
  429.     inc    esi
  430.     mov    eax,[eax*4+fntptn]        ; Get Vram Bit Patan
  431.     mov    edx,eax
  432.     not    edx
  433.     and    eax,[ebp+20]
  434.     and    edx,[ebp+24]
  435.     or    eax,edx
  436.     mov    gs:[edi],eax            ; Write Ank Font
  437.  
  438.     add    edi,512                ; 1 Line 512 Byte
  439.     and    edi,03FFFFh
  440.     or    edi,[ebp+12]            ; Page
  441.     loop    wtak1
  442.  
  443.     add    dword ptr [ebp+16],4
  444.  
  445.     jmp    wrtlop                ; Next Put String Loop
  446.  
  447. wrtstr    endp
  448. ;**************************************
  449. ;    int    inport(int portaddr)
  450. ;**************************************
  451. inport    proc    near
  452.     push    ebp
  453.     mov    ebp,esp
  454.     push    edx
  455.     mov    edx,[ebp+8]
  456.     xor    eax,eax
  457.     in    al,dx
  458.     pop    edx
  459.     pop    ebp
  460.     ret
  461. inport    endp
  462. ;**************************************
  463. ;    VRAM Disp Start Addr Set
  464. ;**************************************
  465.     public    dsp_adr_set
  466. dsp_adr_set    proc    near
  467.     push    ebp
  468.     mov    ebp,esp
  469.     push    edx
  470.  
  471.     mov    dx,0440h
  472.     mov    al,17            ; CRTC FA0
  473.     out    dx,al
  474.     mov    dx,0442h
  475.     mov    eax,[ebp+8]
  476.     out    dx,ax
  477.  
  478.     pop    edx
  479.     pop    ebp
  480.     ret
  481. dsp_adr_set    endp
  482. ;***********************************
  483. ;    Soft Timer
  484. ;    Soft_time(int us) 1 = 10us
  485. ;***********************************
  486.            public    Soft_time
  487. Soft_time proc    near
  488.     mov    cx,[esp+4]
  489.         int    0FDh
  490.         ret
  491. Soft_time endp
  492. ;***********************************
  493. ;    int    iskan(char *str);
  494. ;***********************************
  495.            public    iskan
  496. iskan    proc    near
  497.     push    esi
  498.     mov    esi,[esp+8]
  499.  
  500.     movzx    eax,byte ptr [esi]
  501.     mov    al,[eax+offset kantbl]
  502.     and    al,ISKAN1
  503.     jz    nokan
  504.     movzx    eax,byte ptr [esi+1]
  505.     mov    al,[eax+offset kantbl]
  506.     and    al,ISKAN2
  507.     jz    nokan
  508.     mov    eax,1
  509.     pop    esi
  510.     ret
  511.  
  512. nokan:    xor    eax,eax
  513.     pop    esi
  514.     ret
  515. iskan    endp
  516.  
  517. ;****************************************************
  518. ;   cputstr(char *vram, char *str, int col, int bak)
  519. ;             +8          +12       +16      +20
  520. ;****************************************************
  521.     align    4                ; align set
  522.     public    cputstr
  523. cputstr    proc    near
  524.     push    ebp
  525.     mov    ebp,esp
  526.     xor    eax,eax
  527.     push    eax                ; work push
  528.  
  529.     push    gs
  530.     push    fs
  531.     push    es
  532.     push    esi
  533.     push    edi
  534.     push    edx
  535.     push    ecx
  536.     push    ebx
  537.     cld
  538.     mov    ax,104h                ; VRAM Selecter
  539.     mov    es,ax                ; es = VRAM Selecter
  540.     mov    ax,0110h            ; TBIOS Selecter
  541.     mov    fs,ax                ; fs = TBIOS
  542.     mov    ax,ds
  543.     mov    gs,ax                ; gs = ds
  544.  
  545.     align    4                ; align set
  546. cputlop:                    ; Put Loop
  547.     mov    esi,[ebp+12]            ; char *str
  548. cputlp2:
  549.     lodsb                    ; Get String    ※
  550.     or    al,al
  551.     je    cLeft_clear            ; End of String ?
  552.  
  553.     cmp    al,0Ah                ; \n skip
  554.     je    cputlp2
  555.  
  556.     movzx    eax,al
  557.     mov    bl,[eax+offset kantbl]
  558.     and    bl,ISKAN1
  559.     jz    cputank                ; Not iskanji1 ?
  560.     movzx    ebx,byte ptr [esi]
  561.     mov    bh,[ebx+offset kantbl]
  562.     and    bh,ISKAN2
  563.     jz    cputank                ; Not iskanji2 ?
  564.     mov    bh,al
  565.     inc    esi                ; doubel_word ?????    ※
  566.     mov    [ebp+12],esi            ; Save *str
  567.  
  568.     shl    bh,1                ; Shift Jis to Jis
  569.     cmp    bl,080h
  570.     adc    bx,1f61h
  571.     add    bl,7fh
  572.     jc    short cknf1
  573.     add    bl,0a2h
  574. cknf1:    and    bh,7fh                ; StoJ end
  575.  
  576.     mov    ax,0100h
  577.     mov    dx,1010h
  578.  
  579.     call    pword ptr fs:[00a0h]        ; Get Kanji Font
  580.  
  581.     mov    edi,ss:[ebp+8]            ; *vram
  582.     add    edi,ss:[ebp-4]            ; work add
  583.     or    edi,gs:[page_ofs]        ; or Page Offset
  584.     mov    ebx,offset fntptn
  585.     xor    ecx,ecx                ; ecx=0
  586.  
  587.     REPT    16
  588.  
  589.     lodsb                    ; Get Kanji Font Pattern
  590.     mov    cl,al                ; Left Font Pattern
  591.     mov    eax,gs:[ebx+ecx*4]        ; Get Vram Bit Patan
  592.     mov    edx,eax
  593.     not    eax
  594.     and    eax,ss:[ebp+20]
  595.     and    edx,ss:[ebp+16]
  596.     or    eax,edx
  597.     stosd                    ; Write Left Font 
  598.  
  599.     lodsb                    ; Get Kanji Font Pattern
  600.     mov    cl,al
  601.     mov    eax,gs:[ebx+ecx*4]        ; Get Vram Bit Patan
  602.     mov    edx,eax
  603.     not    eax
  604.     and    eax,ss:[ebp+20]
  605.     and    edx,ss:[ebp+16]
  606.     or    eax,edx
  607.     stosd                    ; Write Right Font
  608.     add    edi,512-4*2            ; 1 Line 512 Byte
  609.  
  610.     endm
  611.  
  612.     mov    ax,gs
  613.     mov    ds,ax
  614.     add    dword ptr [ebp-4],8        ; Next vram Address
  615.  
  616.     jmp    cputlop                ; Next Put String Loop
  617.  
  618.     align    4                ; align set
  619. cputank:                    ; Write Ank Font
  620.     mov    [ebp+12],esi            ; Save *str
  621.     movzx    esi,al
  622.     shl    esi,4                ; 4x16=64
  623.     add    esi,3D800h
  624.  
  625.     mov    edi,[ebp+8]            ; *vram
  626.     add    edi,[ebp-4]            ; work add
  627.     or    edi,[page_ofs]            ; or Page Offset
  628.  
  629.     mov    ax,138h                ; ANK Font Selecter
  630.     mov    ds,ax
  631.     xor    ecx,ecx
  632.     mov    ebx,offset fntptn
  633.  
  634.     REPT    16
  635.     lodsb
  636.     mov    cl,al                ; Left Font Pattern
  637.     mov    eax,gs:[ebx+ecx*4]        ; Get Vram Bit Patan
  638.     mov    edx,eax
  639.     not    eax
  640.     and    eax,ss:[ebp+20]
  641.     and    edx,ss:[ebp+16]
  642.     or    eax,edx
  643.     stosd                    ; Write Left Font 
  644.     add    edi,512-4            ; Line add
  645.     endm
  646.  
  647.     mov    ax,gs
  648.     mov    ds,ax
  649.  
  650.     add    dword ptr [ebp-4],4        ; Next vram Address
  651.  
  652.     jmp    cputlop                ; Next Put String Loop
  653.  
  654.     align    4
  655. cLeft_clear:
  656.     ; VRAM Clear
  657.     mov    ebx,320
  658.     sub    ebx,[ebp-4]            ; nokori dword
  659.     je    cnonclr
  660.  
  661.     mov    edi,[ebp+8]            ; *vram
  662.     add    edi,[ebp-4]            ; work add
  663.     or    edi,[page_ofs]            ; or Page Offset
  664.     shr    ebx,2                ; / 4
  665.     mov    eax,[ebp+20]
  666.     mov    ebp,[ebp-4]
  667.     add    ebp,512-320
  668.     mov    edx,03FFFFh
  669.     mov    esi,[page_ofs]
  670.     REPT    16
  671.     mov    ecx,ebx                ; nokori dword
  672.     rep    stosd
  673.     add    edi,ebp
  674.     and    edi,edx
  675.     or    edi,esi
  676.     endm
  677. cnonclr:
  678.     ; end of VRAM Clear
  679.     pop    ebx
  680.     pop    ecx
  681.     pop    edx
  682.     pop    edi
  683.     pop    esi
  684.     pop    es
  685.     pop    fs
  686.     pop    gs
  687.  
  688.     pop    eax                ; work pop
  689.     pop    ebp
  690.     ret                    ; end of putstr
  691.  
  692. cputstr    endp
  693. ;
  694. ; void  decode(char *vram,char *buf)
  695. ;            +8         +12
  696. SLEEP    equ    0FFFFh
  697.  
  698.     public    ANI_decode
  699. ANI_decode    proc    near
  700.     push    ebp
  701.     mov    ebp,esp
  702.     push    edi
  703.     push    esi
  704.     push    edx
  705.     push    ecx
  706.     push    ebx
  707.     push    es
  708.  
  709.     mov    slp_tim,SLEEP    ; init sleep time
  710.  
  711.     mov    ax,104h        ; VRAM selecter
  712.     mov    es,ax
  713.     mov    edi,[ebp+8]
  714.     mov    esi,[ebp+12]
  715.  
  716. declop:    lodsw
  717.     test    ax,8000h
  718.     jnz    short decskip
  719.     and    eax,7FFFh
  720.     add    edi,eax
  721.     jmp    short declop
  722.  
  723. decskip:cmp    ax,0FFFFh
  724.     je    short decend
  725.     cmp    ax,0FFFEh
  726.     je    short decnew
  727.     cmp    ax,0FFFDh
  728.     je    short chgslp
  729.     test    ax,4000h
  730.     jnz    short decrep
  731.  
  732.     and    ax,3FFFh
  733.     movzx    ecx,ax
  734.     and    ecx,3
  735.     jz    short dec1
  736.     rep movsb
  737.  
  738. dec1:    movzx    ecx,ax
  739.     shr    ecx,2
  740.     jecxz    short declop
  741.     rep movsd
  742.     jmp    short declop
  743.  
  744. chgslp:    lodsw
  745.     mov    slp_tim,ax
  746.     jmp    short declop
  747.  
  748. decnew:    mov    edi,[ebp+8]
  749.     mov    cx,slp_tim
  750.         int    0FDh
  751.     jmp    short declop
  752.  
  753. decrep:    and    ax,3FFFh
  754.     movzx    ecx,ax
  755.     lodsd
  756.     rep stosd
  757.     jmp    short declop
  758.  
  759. decend:    pop    es
  760.     pop    ebx
  761.     pop    ecx
  762.     pop    edx
  763.     pop    esi
  764.     pop    edi
  765.     pop    ebp
  766.     ret
  767. ANI_decode    endp
  768.  
  769.     public    vram_scrool
  770. vram_scrool    proc    near
  771.     push    ebp
  772.     mov    ebp,esp
  773.     push    edi
  774.     push    esi
  775.     push    ecx
  776.     push    edx
  777.     push    es
  778.     push    ds
  779.  
  780.     mov    ax,104h        ; VRAM selecter
  781.     mov    es,ax
  782.     mov    ds,ax
  783.     mov    edi,[ebp+8]
  784.     mov    esi,edi
  785.     add    esi,512*16    ; next char Line
  786.  
  787.     mov    edx,[ebp+12]
  788. vr_lp:    mov    ecx,320/4
  789.     rep movsd
  790.     add    esi,192
  791.     add    edi,192
  792.     dec    edx
  793.     jne    short vr_lp
  794.  
  795.     xor    eax,eax
  796.     mov    edx,16
  797. vr_cr:    mov    ecx,320/4
  798.     rep stosd
  799.     add    edi,192
  800.     dec    edx
  801.     jne    short vr_cr
  802.  
  803.     pop    ds
  804.     pop    es
  805.     pop    edx
  806.     pop    ecx
  807.     pop    esi
  808.     pop    edi
  809.     pop    ebp
  810.     ret
  811. vram_scrool    endp
  812.  
  813. ;************************************
  814. ;void    wrt_ank(int ch,int adr);
  815. ;                   +8     +12
  816. ;************************************
  817.     public    wrt_ank
  818. wrt_ank    proc    near
  819.     push    ebp
  820.     mov    ebp,esp
  821.  
  822.     push    es
  823.     push    esi
  824.     push    edi
  825.  
  826.     mov    ax,104h                ; VRAM Selecter
  827.     mov    es,ax                ; es = VRAM Selecter
  828.  
  829.     movzx    esi,byte ptr [ebp+8]
  830.     shl    esi,6                ; 4x16=64
  831.     add    esi,offset ankfnt        ; ANK Font Table Offset
  832.  
  833.     mov    edi,[ebp+12]            ; *vram
  834.     or    edi,[page_ofs]            ; or Page Offset
  835.     mov    ecx,512-4
  836.     REPT    15
  837.     movsd                    ; Trans Font
  838.     add    edi,ecx                ; Line add
  839.     endm
  840.     movsd                    ; Trans Font
  841.  
  842.     pop    edi
  843.     pop    esi
  844.     pop    es
  845.  
  846.     pop    ebp
  847.     ret
  848. wrt_ank    endp
  849.  
  850. ;************************************
  851. ;void    wrt_kan(int ch,int adr);
  852. ;                   +8     +12
  853. ;************************************
  854.     public    wrt_kan
  855. wrt_kan    proc    near
  856.     push    ebp
  857.     mov    ebp,esp
  858.  
  859.     push    fs
  860.     push    gs
  861.     push    es
  862.     push    ds
  863.     push    esi
  864.     push    edi
  865.     push    edx
  866.     push    ebx
  867.  
  868.     mov    ax,104h                ; VRAM Selecter
  869.     mov    es,ax                ; es = VRAM Selecter
  870.     mov    ax,0110h            ; TBIOS Selecter
  871.     mov    fs,ax                ; fs = TBIOS
  872.     mov    ax,ds
  873.     mov    gs,ax                ; gs = ds
  874.  
  875.     movzx    ebx,word ptr [ebp+8]
  876.     shl    bh,1                ; Shift Jis to Jis
  877.     cmp    bl,080h
  878.     adc    bx,1f61h
  879.     add    bl,7fh
  880.     jc    short wt_kn1
  881.     add    bl,0a2h
  882. wt_kn1:    and    bh,7fh                ; StoJ end
  883.  
  884.     mov    ax,0100h
  885.     mov    dx,1010h
  886.  
  887.     call    pword ptr fs:[00a0h]        ; Get Kanji Font
  888.  
  889.     mov    edi,ss:[ebp+12]            ; *vram
  890.     or    edi,gs:[page_ofs]        ; or Page Offset
  891.     mov    ebx,offset fntcol
  892.     xor    edx,edx                ; edx=0
  893.     xor    ecx,ecx                ; ecx=0
  894.     REPT    16
  895.     lodsw                    ; Get Kanji Font Pattern
  896.     mov    cl,al                ; Left Font Pattern
  897.     mov    dl,ah                ; Right Font Pattern
  898.     mov    eax,gs:[ebx+ecx*4]        ; Get Vram Bit Patan
  899.     stosd                    ; Write Left Font 
  900.     mov    eax,gs:[ebx+edx*4]        ; Get Vram Bit Patan
  901.     stosd                    ; Write Right Font
  902.     add    edi,512-4*2            ; 1 Line 512 Byte
  903.     endm
  904.  
  905.     pop    ebx
  906.     pop    edx
  907.     pop    edi
  908.     pop    esi
  909.     pop    ds
  910.     pop    es
  911.     pop    gs
  912.     pop    fs
  913.  
  914.     pop    ebp
  915.     ret
  916. wrt_kan    endp
  917.  
  918. ;************************************
  919. ;void    wrt_cur(int adr);
  920. ;                   +8
  921. ;************************************
  922.     public    wrt_cur
  923. wrt_cur    proc    near
  924.     mov    eax,[esp+4]
  925.     push    fs
  926.     mov    cx,104h                ; VRAM Selecter
  927.     mov    fs,cx
  928.     not    dword ptr fs:[eax]
  929.     not    dword ptr fs:[eax+512]
  930.     pop    fs
  931.     ret
  932. wrt_cur    endp
  933.  
  934. VRAM    ends
  935.     end
  936.