home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / sysutl / ddosaid.arc / SEND.ASM < prev    next >
Assembly Source File  |  1985-12-17  |  9KB  |  242 lines

  1.            PAGE    62,132 
  2.            Title   DoubleDOS Utility: SEND Commands 
  3.  
  4. CR                 EQU     0Dh                   ;ASCII Carriage Return
  5. LF                 EQU     0Ah                   ;ASCII Line Feed
  6. $                  EQU     24h                   ;String termination charachter
  7.  
  8. Parm_Byte_Count    EQU     80h
  9.  
  10. Dos_Call           EQU     21h
  11. Terminate_Process  EQU     4Ch
  12. Display_Character  EQU     02h
  13. Put_String         EQU     09h
  14.  
  15. DD_Menu_Control    EQU     0E0h
  16. Resume_Invisible   EQU     73h
  17. Suspend_Invisible  EQU     75h
  18. DD_Send_Char       EQU     0E2h
  19. DD_Other_Status    EQU     0E5h
  20. Give_Other_Time    EQU     0EEh
  21.  
  22. Print_$    MACRO
  23.            mov     ah,Put_String
  24.            int     Dos_Call
  25.            ENDM
  26.  
  27. Code_Seg   SEGMENT 
  28.            ASSUME  cs:Code_Seg,ds:Code_Seg,es:Code_Seg
  29.            ORG     0100h  
  30. Main       PROC    NEAR
  31.  
  32.            mov     si,Parm_Byte_Count            ;Point to parm byte count 
  33.            mov     di,OFFSET Parm_Copy           ;point to copy destination
  34.            cld                                   ;  String Counts forward
  35.            lodsb                                 ;  AL = Byte Count
  36.  
  37.            mov     Parm_Count,al                 ;Store Byte Count 
  38.            mov     dx,OFFSET Prog_Info           ;Display program info
  39.            PRINT_$
  40.            mov     al,Parm_Count                 ;Restore Byte Count
  41.  
  42.            cmp     al,00h
  43.            jz      Err_Chk1                      ;No parms given?
  44.            test    al,80h
  45.            jnz     Err_Chk2                      ;More than 127 bytes?
  46.  
  47.            cbw                                   ;AX = Byte Count
  48.            mov     cx,ax                         ;CX = Loop control
  49.            rep     movsb                         ;Copy parms into buffer
  50.  
  51.            mov     dx,OFFSET Send_Msg            ;Sending...
  52.            Print_$
  53.  
  54.  
  55.            call    Chk_Susp                      ;Other partition Suspended?
  56.  
  57.  
  58.            mov     al,Parm_Count                 ;Get Char Count
  59.            cbw
  60.            mov     cx,ax                         ;Convert to word in CX
  61.            mov     si,OFFSET Parm_Copy           ;Prepare to Send chars
  62.            inc     si                            ;Throw away 1st char
  63.            dec     cx                            ;  also lower cnt by 1
  64.  
  65. Send_Loop: mov     al,BYTE PTR [si]
  66.            mov     pending,al                    ;Charachter to be sent
  67.            mov     Retry_Cnt,03h                 ;3 Retries in case of Err
  68.            mov     Temp_Cnt,cx                   ;Save Count
  69.            call    Send_Char                     ;Send character
  70.  
  71.            mov     ah,Display_Character          ;If control was returned,
  72.            mov     dl,Pending                    ;  all went well. Output
  73.            int     Dos_Call                      ;  charachter
  74.  
  75.            mov     cx,Temp_Cnt                   ;Restore Count
  76.            dec     cx                            ;Decrement Count
  77.            inc     si
  78.            jcxz    Exit_Loop                     ;Done?
  79.            jmp     Send_Loop                     ;No, Next Char
  80.  
  81. Exit_Loop: mov     Pending,CR                    ;Follow with Carriage Return
  82.            mov     Retry_Cnt,03h                 ;3 Tries
  83.            call    Send_Char
  84.  
  85.            mov     dx,OFFSET CRLF
  86.            Print_$
  87.  
  88.  
  89.            call    Fix_Susp                      ;Suspend the other partition
  90.                                                  ;  if we have temporarily
  91.                                                  ;resumed it.
  92.  
  93.            
  94.            mov     Ret_Code,30h                  ;All Kosher, end program
  95.            jmp     Finished                      ;Return ERRORLEVEL 0
  96.  
  97.  
  98. ;//////////////////
  99. ;
  100. ;  Error Checking Routines
  101. ;
  102. ;//////////////////
  103.  
  104. Err_Chk1:  mov     dx,OFFSET Err_Msg1
  105.            Print_$
  106.            mov     Ret_Code,39h                  ;Return ERRORLEVEL 9
  107.            jmp     Finished
  108.  
  109. Err_Chk2:  mov     dx,OFFSET Err_Msg2
  110.            Print_$
  111.            mov     Ret_Code,38h                  ;Return ERRORLEVEL 8
  112.            jmp     Finished                      
  113.  
  114. Err_Chk3:  mov     dx,OFFSET ERR_Msg3
  115.            Print_$
  116.            mov     Ret_Code,37h                  ;Return ERRORLEVEL 7
  117.            call    Fix_Susp
  118.            jmp     Finished
  119.  
  120. Err_Chk4:  mov     dx,OFFSET ERR_Msg4
  121.            Print_$
  122.            mov     Ret_Code,36h                  ;Return ERRORLEVEL 6
  123.            call    Fix_Susp
  124.            jmp     Finished
  125.  
  126. ;//////////////////
  127. ;
  128. ;    This Routine Actually sends a charachter to the other side, with
  129. ;  full error checking.  Err_Chk3 is an unknown error.  Err_Chk4 means
  130. ;  the keyboard buffer on the other side is full.
  131. ;
  132. ;//////////////////
  133.  
  134. Send_Char: mov     al,Pending                    ;Get Char
  135.            mov     ah,DD_Send_Char
  136. Retry:     int     Dos_Call                      ;Send it
  137.            cmp     al,00h
  138.            jnz     Problem                       ;Successfully Sent?
  139.            ret                                   ;Yes.
  140.  
  141. Problem:   cmp     al,01                         ;No.
  142.            jz      Buff_Full                     ;Buffer full?
  143.            jmp     Err_Chk3                      ;No, Terminate program
  144.  
  145. Buff_Full: mov     al,Retry_Cnt
  146.            cmp     al,00h
  147.            jz      Err_Chk4                      ;3 Tries, Terminate
  148.            dec     Retry_Cnt                     ;1 less try
  149.  
  150.            mov     al,0FFh                       ;Give the other side
  151.            mov     ah,Give_Other_Time            ;  time to think: 255
  152.            int     Dos_Call                      ;  55ms time intervals
  153.            mov     al,Pending                    ;restore Charachter
  154.            jmp     Retry                         ;Try Again
  155.  
  156. Finished:  mov     dx,OFFSET Finish_Msg          ;Display ERRORLEVEL MSG
  157.            PRINT_$
  158.            mov     ah,Terminate_Process          ;End Program
  159.            mov     al,Ret_Code                   ;ERRORLEVEL in AL
  160.            and     al,0Fh                        ;Ascii to binary integer
  161.            int     Dos_Call
  162.  
  163.  
  164. ;//////////////////
  165. ;
  166. ;    This subroutine checks to see if the other partition is suspended.
  167. ;  If it is, we RESUME it, and set a flag telling the program to re-suspend
  168. ;  the other partition prior to termination.
  169. ;
  170. ;//////////////////
  171.  
  172. Chk_Susp:  mov     ah,DD_Other_Status
  173.            int     Dos_Call
  174.            mov     Suspended,00h
  175.            cmp     al,02h                    
  176.            jz      Resume                        ;Other side Suspended?
  177.            ret                                   ;No
  178.  
  179. Resume:    mov     Suspended,01h                 ;Yes: Flag for later,
  180.            mov     ah,DD_Menu_Control            ;     and Resume
  181.            mov     al,Resume_Invisible
  182.            int     Dos_Call
  183.            ret
  184.  
  185.  
  186. ;//////////////////
  187. ;
  188. ;    This routine checks to see if the other partition was suspended when
  189. ;  this program was executed. If we temporarily resumed it, then we
  190. ;  re-suspend it.
  191. ;
  192. ;//////////////////
  193.   
  194. Fix_Susp:  mov     al,Suspended                  ;Was Other side Suspended
  195.            cmp     al,00h                        ;  then Resumed?
  196.            jnz     Susp
  197.            ret                                   ;No
  198.  
  199. Susp:      mov     ah,DD_Menu_Control            ;Yes, Re-Suspend
  200.            mov     al,Suspend_Invisible
  201.            int     Dos_Call
  202.            ret
  203.  
  204.  
  205. ;//////////////////
  206. ;
  207. ;  Data Definition Area
  208. ;
  209. ;//////////////////
  210.  
  211. Prog_Info  DB      CR,LF,'DoubleDOS Utility - by Chris M. Magyar '
  212.            DB      '- 12/18/85',CR,LF,CR,LF,$
  213.  
  214. Send_Msg   DB      'The following command will be sent '
  215.            DB      'to the other partition:',CR,LF,CR,LF,$
  216.  
  217. Finish_Msg DB      CR,LF,'ERRORLEVEL : '
  218. Ret_Code   DB      ?,' being returned.',CR,LF,$
  219.  
  220. Err_Msg1   DB      'No parameters given.',CR,LF,$
  221. Err_Msg2   DB      'More than 127 bytes in parameter list!!!',CR,LF
  222.            DB      'Must terminate now.',CR,LF,$
  223. Err_Msg3   DB      'Unknown Error encountered when passing character',CR,LF
  224.            DB      'to the other partition.  Must Terminate now.',CR,LF,$
  225. Err_Msg4   DB      'The keyboard buffer on the other partition is',CR,LF
  226.            DB      'full.  All re-tries failed.  Terminating now.',CR,LF,$
  227.  
  228. CRLF       DB      CR,LF,$
  229.  
  230. Parm_Count DB      ?
  231. Parm_Copy  DB      128 DUP(?),CR,LF,$
  232.  
  233. Suspended  DB      ?
  234. Pending    DB      ?
  235. Retry_Cnt  DB      ?
  236. Temp_Cnt   DW      ?
  237.  
  238. Main       ENDP
  239. Code_Seg   ENDS
  240.            END Main
  241.  
  242.