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

  1. ;**************************
  2. ;*                        *
  3. ;* High-C用 RS-232C ライブラリー  *
  4. ;*         Programmed by 山崎憲明    *
  5. ;*              NIFTY ID=QGB01416    *
  6. ;*            nanno-NET ID= YAMA      *
  7. ;*                        *
  8. ;**************************
  9. ;
  10. ;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ;
  13. ;    v0.01    Makeing by YAMA
  14. ;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;
  17. ;セグメント宣言
  18. ;
  19. rmdata    segment dword public 'DATA' use16
  20. rmdata    ends
  21. rmcode    segment word public use16
  22. rmcode    ends
  23. RSBcode    segment dword public 'CODE' use32
  24. RSBcode    ends
  25.  
  26.  
  27. rsb_para_s    struc        ;9 artcles 17 bytes
  28.     mode    db    ?
  29.     baud    db    ?
  30.     rbuf    dd    ?
  31.     stime    dw    ?
  32.     rtime    dw    ?
  33.     rinf    dd    ?
  34.     extn    db    ?
  35.     xon    db    ?
  36.     xoff    db    ?
  37. rsb_para_s    ends
  38.  
  39. ;
  40. ;定数
  41. ;
  42.  
  43. TRUE    equ    1
  44. FALSE    equ    0
  45.  
  46.     assume    cs:RSBcode,ds:rmdata
  47.  
  48. ;
  49. ;リアルモードデータセグメント
  50. ;
  51.  
  52. rmdata    segment 
  53. ;
  54. ;
  55. ;
  56.  
  57. real_seg    dw    0    ;データエリアのリアルモードセグメント値
  58.  
  59. rm_int_no    dw    0    ;int no.
  60. rm_ds        dw    0    ;リアルモードds
  61. rm_es        dw    0    ;リアルモードes
  62. rm_fs        dw    0    ;リアルモードfs
  63. rm_gs        dw    0    ;リアルモードgs
  64. rm_eax        dd    0    ;リアルモードeax
  65. rm_edx        dd    0    ;リアルモードedx
  66.  
  67. ;
  68. ;  データ領域
  69. ;
  70. port        dd    (-1)
  71.         public    port
  72. rsb_ovr_flg    dd    0
  73.         public    rsb_ovr_flg
  74.  
  75. rsb_para    rsb_para_s    <>        ;パラメータエリア
  76.  
  77. buf_size    equ    1024*5            ;受信バッファサイズ(5Kbyte)
  78. rsb_buf        label    byte
  79.         dw    buf_size
  80.         dw    0            ;文字カウント
  81.         dw    0            ;入力ポインタ
  82.         dw    0            ;出力ポインタ
  83.         db    buf_size+16 dup(0)    ;受信バッファ
  84.  
  85.         public    rsb_end_real    ;リアルモードエンドアドレス
  86. rsb_end_real    label    byte
  87.  
  88. rmdata    ends
  89.  
  90. ;
  91. ;リアルモ-ドコ-ド
  92. ;
  93.  
  94. rmcode    segment 
  95.  
  96. revint    proc    far
  97.     and    ah,10h
  98.     jz    revit1
  99.     mov    ah,08h
  100.     mov    al,byte ptr cs:port
  101.     mov    dl,02h
  102.     int    9Bh
  103.     mov    byte ptr cs:rsb_ovr_flg,1
  104. revit1:    ret
  105. revint    endp
  106.  
  107. rmcode    ends
  108.  
  109. ;
  110. ;プロテクトモードーコード
  111. ;
  112.  
  113. RSBcode    segment
  114.  
  115. ;データセグメントのリアルモードセグメント値の算定
  116.  
  117. set_real_seg    proc    near
  118.  
  119.         mov    ax,ds        ;リアルモード用セグメント算定
  120.         mov    es,ax        ;先頭アドレス
  121.         xor    ebx,ebx        ;
  122.         lea    ecx,rsb_end_real;リアルモードコードセグメントサイズ
  123.         mov    ax,250Fh    ;プロテクト=>リアルアドレス変換
  124.         int    21h
  125.         ;jc    err        ;エラー処理
  126.         ;test    ecx,0FFFFh    ;
  127.         ;jnz    err        ;
  128.         shr    ecx,16
  129.         mov    real_seg,cx    ;リアルモードセグメント値設定
  130.  
  131.         ret
  132. set_real_seg    endp
  133.  
  134.  
  135. ;リアルモード割り込み発行(ポインター指定付)
  136.  
  137. int_9Bh_2    proc    near
  138.  
  139.         mov    rm_eax,eax
  140.         mov    rm_edx,edx
  141.  
  142.         mov    cx,real_seg
  143.         mov    rm_ds,cx    ;ds設定
  144.         mov    rm_es,cx    ;es設定
  145.         mov    rm_fs,cx    ;fs設定
  146.         mov    rm_gs,cx    ;gs設定
  147.  
  148.         mov    byte ptr rm_int_no,9Bh    ;int no.
  149.         mov    edx,offset rm_int_no
  150.         mov    ax,2511h
  151.         int    21h
  152.         mov    edx,rm_edx
  153.         ret
  154. int_9Bh_2    endp
  155.  
  156.  
  157. ;回線オープン
  158. ;int     RSB_open(int port);
  159. ;
  160.     public    RSB_open
  161. RSB_open    proc    near
  162.  
  163.         push    ebp        ;High-C用ヘッダー
  164.         mov    ebp,esp
  165.  
  166.         mov    eax,[ebp][8]    ;引数 1( int port )
  167.         mov    ah,01h        ;open
  168.         int    9Bh
  169.         movzx    eax,ah
  170.  
  171.         pop    ebp        ;High-C用後処理
  172.         ret
  173. RSB_open    endp
  174.  
  175. ;回線クローズ
  176. ;int     RSB_close(int port);
  177. ;
  178.     public    RSB_close
  179. RSB_close    proc    near
  180.  
  181.         push    ebp        ;High-C用ヘッダー
  182.         mov    ebp,esp
  183.  
  184.         mov    eax,[ebp][8]    ;引数 1( int port )
  185.         mov    ah,02h        ;close
  186.         int    9Bh
  187.         movzx    eax,ah
  188.  
  189.         pop    ebp        ;High-C用後処理
  190.         ret
  191. RSB_close    endp
  192.  
  193. ;通信パラメータ設定
  194. ;int    RSB_setpara(int port,char *para);
  195. ;
  196.     public    RSB_setpara
  197. RSB_setpara    proc    near
  198.  
  199.         push    ebp        ;High-C用ヘッダー
  200.         mov    ebp,esp
  201.         push    es
  202.         push    esi
  203.         push    edi
  204.         push    ebx
  205.         push    ecx
  206.  
  207.         call    set_real_seg
  208.  
  209.         mov    esi,[ebp][12]    ;引数 2( char *para )
  210.         mov    edi,offset rsb_para
  211.         mov    ecx,11h
  212.         rep    movsb
  213.  
  214.         mov    esi,[ebp][12]    ;引数 2( char *para )
  215.         mov    edi,offset rsb_para
  216.         mov    ax,real_seg        ;受信バッファアドレスが
  217.         mov    word ptr[edi].rbuf+2,ax    ;独自バッファを指すように
  218.         mov    eax,offset rsb_buf    ;リアル、ネイティブ両ポインタ
  219.         mov    [esi].rbuf,eax        ;を修正
  220.         mov    word ptr[edi].rbuf,ax    ;
  221.  
  222.         mov    ax,buf_size
  223.         mov    word ptr[rsb_buf],ax    ; buff Size Init Apend by Ken
  224.  
  225.         mov    ax,real_seg
  226.         shl    eax,16
  227.         lea    ebx,revint
  228.         add    eax,ebx            ; real address calc
  229.         mov    [esi].rinf,ebx        ; protect buff
  230.         mov    [edi].rinf,eax        ; real buff
  231.  
  232.         mov    eax,[ebp][8]    ;引数 1( int port )
  233.         mov    ah,03h        ;setpara
  234.         mov    edi,offset rsb_para
  235.         call    int_9Bh_2
  236.         movzx    eax,ah
  237.  
  238.         pop    ecx
  239.         pop    ebx        ;High-C用後処理
  240.         pop    edi
  241.         pop    esi
  242.         pop    es
  243.         pop    ebp
  244.         ret
  245. RSB_setpara    endp
  246.  
  247. ;通信パラメータ読み取り
  248. ;int    RSB_rdpara(int port,char *para);
  249. ;
  250.     public    RSB_rdpara
  251. RSB_rdpara    proc    near
  252.  
  253.         push    ebp        ;High-C用ヘッダー
  254.         mov    ebp,esp
  255.         push    es
  256.         push    esi
  257.         push    edi
  258.         push    ebx
  259.         push    ecx
  260.  
  261.         call    set_real_seg
  262.  
  263.         mov    eax,[ebp][8]    ;引数 1( int port )
  264.         mov    ah,04h        ;rdpara
  265.         mov    edi,offset rsb_para
  266.         call    int_9Bh_2
  267.  
  268.         mov    esi,offset rsb_para
  269.         mov    edi,[ebp][12]    ;引数 2( char *para )
  270.         mov    ecx,11h
  271.         rep    movsb
  272.  
  273.         movzx    eax,ah
  274.  
  275.         pop    ecx
  276.         pop    ebx        ;High-C用後処理
  277.         pop    edi
  278.         pop    esi
  279.         pop    es
  280.         pop    ebp
  281.         ret
  282. RSB_rdpara    endp
  283.  
  284.  
  285. ;受信データ数の読み取り
  286. ;int    RSB_read(int port, int *len);
  287. ;
  288.     public    RSB_read
  289. RSB_read    proc    near
  290.  
  291.         push    ebp        ;High-C用ヘッダー
  292.         mov    ebp,esp
  293.         push    edi
  294.  
  295.         mov    eax,[ebp][8]    ;引数 1( int port )
  296.         mov    ah,05h        ;read
  297.         int    9Bh
  298.         movzx    edx,dx
  299.         mov    edi,[ebp][12]    ;引数 2( int *len )
  300.         mov    [edi],edx
  301.         movzx    eax,ah
  302.  
  303.         pop    edi        ;High-C用後処理
  304.         pop    ebp
  305.         ret
  306. RSB_read    endp
  307.  
  308.  
  309. ;データの受信
  310. ;int    RSB_receive(int port,int *ch,int *st);
  311. ;注:<return>=エラーno.(ah)  ch=data(dl)  st=ステータス(h:dh,l:cl)
  312. ;
  313.     public    RSB_receive
  314. RSB_receive    proc    near
  315.  
  316.         push    ebp        ;High-C用ヘッダー
  317.         mov    ebp,esp
  318.         push    es
  319.         push    esi
  320.         push    edi
  321.         push    ebx
  322.         push    ecx
  323.  
  324.         mov    eax,[ebp][8]    ;引数 1( int port )
  325.         mov    ah,06h        ;receive
  326.         int    9Bh
  327.         mov    ch,dh
  328.         movzx    ecx,cx
  329.         movzx    edx,dl
  330.         mov    edi,[ebp][12]    ;引数 2( int *ch )
  331.         mov    [edi],edx
  332.         mov    edi,[ebp][16]    ;引数 3( int *st )
  333.         mov    [edi],ecx
  334.         movzx    eax,ah
  335.  
  336.         pop    ecx
  337.         pop    ebx        ;High-C用後処理
  338.         pop    edi
  339.         pop    esi
  340.         pop    es
  341.         pop    ebp
  342.         ret
  343. RSB_receive    endp
  344.  
  345.  
  346. ;データの送信
  347. ;int    RSB_send(int port,int ch,int *st);
  348. ;注:<return>=エラーno.(ah)  st=ステータス(l:dh)
  349. ;
  350.  
  351.     public    RSB_send
  352. RSB_send    proc    near
  353.  
  354.         push    ebp        ;High-C用ヘッダー
  355.         mov    ebp,esp
  356.         push    es
  357.         push    esi
  358.         push    edi
  359.         push    ebx
  360.         push    ecx
  361.  
  362.         mov    eax,[ebp][8]    ;引数 1( int port )
  363.         mov    edx,[ebp][12]    ;引数 2( int ch )
  364.         mov    ah,07h        ;send
  365.         int    9Bh
  366.         movzx    edx,dh
  367.         mov    edi,[ebp][16]    ;引数 3( int *st )
  368.         mov    [edi],edx
  369.         movzx    eax,ah
  370.  
  371.         pop    ecx
  372.         pop    ebx        ;High-C用後処理
  373.         pop    edi
  374.         pop    esi
  375.         pop    es
  376.         pop    ebp
  377.         ret
  378. RSB_send    endp
  379.  
  380. ;拡張DTR信号の保持設定
  381. ;int    RSB_dtr(int port,int sw);
  382. ;
  383.  
  384.     public    RSB_dtr
  385. RSB_dtr        proc    near
  386.  
  387.         push    ebp        ;High-C用ヘッダー
  388.         mov    ebp,esp
  389.  
  390.         mov    eax,[ebp][8]    ;引数 1( int port )
  391.         mov    edx,[ebp][12]    ;引数 2( int sw )
  392.         mov    ah,0Eh        ;dtr
  393.         int    9Bh
  394.         movzx    eax,ah
  395.  
  396.         pop    ebp        ;High-C用後処理
  397.         ret
  398. RSB_dtr        endp
  399.  
  400. ;Break信号の送信
  401. ;int    RSB_break(int port,int sec);
  402. ;
  403.  
  404.     public    RSB_break
  405. RSB_break    proc    near
  406.  
  407.         push    ebp        ;High-C用ヘッダー
  408.         mov    ebp,esp
  409.  
  410.         mov    eax,[ebp][8]    ;引数 1( int port )
  411.         mov    edx,[ebp][12]    ;引数 2( int sec )
  412.         mov    ah,0Bh        ;break
  413.         int    9Bh
  414.         movzx    eax,ah
  415.  
  416.         pop    ebp        ;High-C用後処理
  417.         ret
  418. RSB_break    endp
  419.  
  420. ;シリアルポートの制御
  421. ;int    RSB_ctrl(int port,unsigned ctrl);
  422. ;
  423.  
  424.     public    RSB_ctrl
  425. RSB_ctrl    proc    near
  426.         push    ebp        ;High-C用ヘッダー
  427.         mov    ebp,esp
  428.  
  429.         mov    eax,[ebp][8]    ;引数 1( int port )
  430.         mov    edx,[ebp][12]    ;引数 2( int ctrl )
  431.         mov    ah,08h        ;break
  432.         int    9Bh
  433.         movzx    eax,ah
  434.  
  435.         pop    ebp        ;High-C用後処理
  436.         ret
  437. RSB_ctrl    endp
  438.  
  439.  
  440. RSBcode    ends
  441.  
  442.     end
  443.