home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / lan / netlight.arj / NETLIGHT.ASM < prev    next >
Assembly Source File  |  1991-01-15  |  8KB  |  332 lines

  1. PAGE        90,132
  2. TITLE        NETLIGHT - Flashes a light to indicate Network traffic.
  3. SUBTTL        Based on an original idea by Apricot Computers Ltd.
  4. COMMENT    #
  5.  
  6. This terminate-and-stay-resident program attempts to flash a light on
  7. the outside of an Apricot machine to indicate Network activity.
  8.  
  9. The particular light used depends on the model of computer.
  10.  
  11.     On XEN-S and QI models, the LAN light is used.
  12.     On XEN-I models, the VOICE light is used.
  13.     On XEN (generic) models, the VOICE light is used.
  14.  
  15. Note that the standard NETLIGHT.COM, as provided by Apricot, only works
  16. on the IBM-compatible models.
  17.  
  18. This program was written because of lack of support for my XEN, and the
  19. large store overhead of NETLIGHT.COM (480 bytes). In addition, since the
  20. standard version is a .COM file, it can not be AMLOADed unless at least 64K
  21. is available for it. Since this version is a .EXE file, it can be AMLOADed
  22. into as little as 804 bytes.
  23.  
  24. Because of careful coding (what some would say are very suspect techniques)
  25. this program only keeps a mimimum of store when resident.
  26. The actual figures are:
  27.     204 bytes on an Apricot XEN
  28.     176 bytes on an Apricot XEN-I, XEN-S or QI.
  29.  
  30. On other machines, the program aborts with an explanatory error message and
  31. an ERRORLEVEL of 1.
  32.  
  33. Usage:
  34.     NETLIGHT [/n]
  35. where the optional /n denotes that the light is to be turned on when hardware
  36. interrupt n occurs. If the /n is omitted, the light is turned on when the
  37. standard network interrupt (2Ah) is accessed by an application.
  38. So, if the network software does not use interrupt 2Ah, and the network board
  39. is attached to IRQ 12, then the command line should be:
  40.     NETLIGHT /12
  41. On Apricot XEN machines, the /n parameter is ignored.
  42.  
  43.     #
  44.  
  45.     INCLUDE    legal.inc
  46. Lf    EQU    0ah
  47. Cr    EQU    0dh
  48.  
  49. MINSES    EQU    0            ;Non-zero to use int 2Ah.
  50. ;
  51.     DOSSEG
  52.     .MODEL    small
  53.     .STACK    100
  54.     .CODE
  55.     .286
  56.  
  57. OldIntAddress    equ    5Ch        ;Holds address of Hardware Int.
  58. OldInt08Address    equ    60h        ;Old Timer address.
  59. NetLightPort    equ    64h        ;Port address to turn light on/off
  60. NetLightCount    equ    66h        ;Timer counter for turning off.
  61.  
  62. CodeHolder    equ    68h        ;Address to hold routines in PSP.
  63. ;
  64. ;    This routine turn on the light when a hardware Interrupt occurs.
  65. ;
  66. IH_HARDWARE    PROC    FAR
  67.     push    dx
  68.     push    ax
  69.     mov    dx,WORD PTR cs:NetLightPort
  70.     mov    al,1
  71.     out    dx,al
  72.     pop    ax
  73.     pop    dx
  74.     mov    WORD PTR cs:NetLightCount,2    
  75.     jmp    DWORD PTR cs:[OldIntAddress]
  76. IH_HARDWARE_L    equ    $-IH_HARDWARE
  77. IH_HARDWARE    ENDP
  78. ;
  79. ;    This routine turns the light on when MINSES is activated.
  80. ;
  81. IH_MINSES    PROC    FAR
  82. if MINSES
  83.     cmp    ah,50H
  84.     ja    LOC_RET_1
  85. endif
  86.     push    dx
  87.     push    ax
  88.     mov    dx,WORD PTR cs:NetLightPort
  89.     mov    al,1
  90.     out    dx,al
  91.     mov    WORD PTR cs:NetLightCount,2    
  92.     pop    ax
  93.     pop    dx
  94. LOC_RET_1:
  95.     jmp    DWORD PTR cs:[OldIntAddress]
  96. IH_MINSES_L    equ    $-IH_MINSES
  97. IH_MINSES    ENDP
  98. ;
  99. ;    This routine turns the light OFF when the time is up.
  100. IH_TIMER    PROC    FAR
  101.     cmp    WORD PTR cs:NetLightCount,0
  102.     jz    LOC_2
  103.     dec    WORD PTR cs:NetLightCount
  104.     jnz    LOC_2
  105.     push    dx
  106.     push    ax
  107.     mov    dx,WORD PTR cs:NetLightPort
  108.     mov    al,0
  109.     out    dx,al
  110.     pop    ax
  111.     pop    dx
  112. LOC_2:
  113.     jmp    DWORD PTR cs:[OldInt08Address]
  114. IH_TIMER_L    equ    $-IH_TIMER
  115. IH_TIMER    ENDP
  116. ;
  117. ;    This routine turns the XEN voice light on when MINSES is activated.
  118. ;
  119. AH_MINSES    PROC    FAR
  120.     cmp    ah,50H
  121.     ja    AH_LOC_RET_1
  122.     push    ax
  123.     push    bx
  124.     push    dx
  125.     push    es
  126.     xor    ax,ax
  127.     mov    es,ax
  128.     les    bx,DWORD PTR es:[722h]
  129.     mov    al,es:[bx+8]        ;Get Write-only LED register copy.
  130.     or    al,01h            ;Add in the VOICE bit.
  131.     mov    es:[bx+8],al
  132.     mov    dx,0C00h        ;Xen LED port address.
  133.     out    dx,al
  134.     pop    es
  135.     pop    dx
  136.     pop    bx
  137.     pop    ax
  138.     mov    WORD PTR cs:NetLightCount,5
  139. AH_LOC_RET_1:
  140.     jmp    DWORD PTR cs:[OldIntAddress]
  141. AH_MINSES_L    equ    $-AH_MINSES
  142. AH_MINSES    ENDP
  143. ;
  144. ;    This routine turns the XEN Voice light OFF when the time is up.
  145. AH_TIMER    PROC    FAR
  146.     cmp    WORD PTR cs:NetLightCount,0
  147.     jz    AH_LOC_2
  148.     dec    WORD PTR cs:NetLightCount
  149.     jnz    AH_LOC_2
  150.     push    ax
  151.     push    bx
  152.     push    dx
  153.     push    es
  154.     xor    ax,ax
  155.     mov    es,ax
  156.     les    bx,DWORD PTR es:[722h]
  157.     mov    al,es:[bx+8]        ;Get Write-only LED register copy.
  158.     and    al,0FEh            ;Remove the VOICE bit.
  159.     mov    es:[bx+8],al
  160.     mov    dx,0C00h        ;Xen LED port address.
  161.     out    dx,al
  162.     pop    es
  163.     pop    dx
  164.     pop    bx
  165.     pop    ax
  166. AH_LOC_2:
  167.     jmp    DWORD PTR cs:[OldInt08Address]
  168. AH_TIMER_L    equ    $-AH_TIMER
  169. AH_TIMER    ENDP
  170.  
  171.  
  172. TopOfCode    LABEL    BYTE        ;Last address in TSR portion of code
  173.  
  174. ApricotData    LABEL    DWORD        ;Pointer to "APRICOT" in ROM.
  175.         dw    0,0FFFCh
  176.  
  177. What        db    '@(#) '        ;For use by WHAT.EXE
  178. SignOn        db    'Apricot Netlight Utility    V1.2',9
  179.         db    '(C) 1991 by MicroExpansions Ltd.',Cr,Lf,'$'
  180. Msg_Not_Apricot    db    'Not a Suitable Machine!',Cr,Lf,'$'
  181. ;    List of things to install:
  182. OnVec    db    2Ah            ;Interrupt vector for LIGHT ON.
  183. OnAddr    dw    IH_MINSES        ;Address of routine for LIGHT ON.
  184. OnLen    dw    IH_MINSES_L        ;Length of routine for LIGHT ON.
  185. OffVec    db    08h            ;Interrupt vector for LIGHT OFF
  186. OffAddr    dw    IH_TIMER        ;Address of routine for LIGHT OFF
  187. OffLen    dw    IH_TIMER_L        ;Length of routine for LIGHT OFF
  188.  
  189. PspSegment    dw    0        ;For initialisation.
  190.  
  191. Initialise:
  192.     mov    cs:PspSegment,ds    ;Remember Address of PSP
  193.     push    cs
  194.     pop    ds
  195.     mov    es,es:[2Ch]        ;Get environment segment address.
  196.     mov    ah,49h
  197.     int    21h            ;Release the environment.
  198.     les    bx,DWORD PTR cs:ApricotData
  199.     cmp    WORD PTR ES:[bx],'PA'    
  200.     jnz    Not_Apricot
  201.     cmp    WORD PTR ES:[bx+2],'IR'    
  202.     jnz    Not_Apricot
  203.     cmp    WORD PTR ES:[bx+4],'OC'    
  204.     jnz    Not_Apricot
  205.     cmp    BYTE PTR ES:[bx+6],'T'
  206.     jz    Is_Apricot
  207. Not_Apricot:
  208.     xor    ax,ax
  209.     mov    es,ax            ;Point at low end of RAM.
  210.     cmp    WORD PTR es:[404h],1234h
  211.     jne    Not_Xen            ;J if not Apricot Generic.
  212.     cmp    BYTE PTR es:[401h],3
  213.     jne    Not_Xen            ;J if not XEN.
  214.     mov    cs:OnAddr,OFFSET AH_MINSES
  215.     mov    cs:OnLen,AH_MINSES_L    ;Adjust to use Xen Voice on routine.
  216.     mov    cs:OffAddr,OFFSET AH_TIMER
  217.     mov    cs:OffLen,AH_TIMER_L
  218.     mov    cs:OffVec,0FFh        ;& 50 times a second timer.
  219.     jmp    SHORT Use_MINSES    ;Hook on to 2A routine ONLY.
  220. Not_Xen:
  221.     lea    dx,Msg_Not_Apricot
  222.     mov    ah,9
  223.     int    21H
  224.     mov    ax,4C01h
  225.     int    21H
  226. Is_Apricot:
  227.     cmp    BYTE PTR ES:[bx+8],4
  228.     jb    Use_Voice
  229.     mov    es,cs:PspSegment
  230.     mov    WORD PTR es:NetLightPort,28h
  231.     jmp    SHORT Use_Lan
  232.  
  233. Use_Voice:
  234.     mov    es,cs:PspSegment
  235.     mov    WORD PTR es:NetLightPort,0F003h
  236. Use_Lan:
  237.     mov    di,80H
  238.     mov    cl,ES:[di]
  239.     mov    ch,0
  240.     inc    di
  241.     mov    al,'/'
  242.     repnz    scasb
  243.     jnz    Use_MINSES
  244.     mov    ax,0
  245.     mov    bl,0ah
  246. Scan_Number:
  247.     cmp    BYTE PTR ES:[di],'0'
  248.     jb    Scan_Exit
  249.     cmp    BYTE PTR ES:[di],'9'
  250.     ja    Scan_Exit
  251.     mul    bl
  252.     add    al,ES:[di]
  253.     sub    al,'0'
  254.     inc    di
  255.     loop    Scan_Number
  256. Scan_Exit:
  257.     cmp    al,0FH
  258.     ja    Use_MINSES
  259.     cmp    al,7
  260.     ja    Use_Slave
  261.     and    al,7
  262.     add    al,8
  263.     jmp    SHORT Use_IRQ
  264.  
  265. Use_Slave:
  266.     and    al,7
  267.     add    al,70H
  268. Use_IRQ:
  269.     mov    cs:OnVec,al
  270.     mov    cs:OnAddr,OFFSET IH_HARDWARE
  271.     mov    cs:OnLen,IH_HARDWARE_L
  272.     jmp    SHORT Hook_Int
  273.  
  274. Use_MINSES:
  275. if MINSES
  276.     mov    BYTE PTR cs:OnVec,2ah
  277. else
  278.     mov    BYTE PTR cs:OnVec,5Ch
  279. endif
  280.  
  281. ;    Installation routine:    
  282.  
  283. Hook_Int:
  284.     mov    ah,35h
  285.     mov    al,cs:OnVec
  286.     int    21h            ;Get address of original routine.
  287.     push    es
  288.     mov    es,cs:PspSegment
  289.     mov    WORD PTR es:OldIntAddress,bx
  290.     pop    WORD PTR es:OldIntAddress+2;Save it in our PSP.
  291.     mov    ah,35h
  292.     mov    al,cs:OffVec        ;Do same for Lights Off.
  293.     int    21h
  294.     push    es
  295.     mov    es,cs:PspSegment
  296.     mov    WORD PTR es:OldInt08Address,bx
  297.     pop    WORD PTR es:OldInt08Address+2
  298.     mov    es,cs:PspSegment
  299.     mov    di,CodeHolder
  300.     mov    si,cs:OnAddr
  301.     mov    cx,cs:OnLen
  302.     rep movsb            ;Copy the ON routine to the PSP.
  303.     mov    cs:OnLen,di        ;Save address for OFF routine.
  304.     mov    si,cs:OffAddr
  305.     mov    cx,cs:OffLen
  306.     rep movsb            ;Copy the OFF routine to the PSP.
  307.     mov    cs:OffLen,di        ;Remember address of last of the code.
  308. ;
  309.     mov    ah,25h
  310.     mov    al,cs:OnVec
  311.     mov    dx,CodeHolder        ;Set up the LIGHT ON code.
  312.     mov    ds,cs:PspSegment
  313.     int    21h
  314.     mov    ah,25h
  315.     mov    al,cs:OffVec
  316.     mov    dx,cs:OnLen        ;Set up the LIGHT OFF code.
  317.     mov    ds,cs:PspSegment
  318.     int    21h
  319.      push    cs
  320.     pop    ds
  321.     lea    dx,SignOn
  322.     mov    ah,9
  323.     int    21H
  324.     mov    dx,cs:OffLen
  325.     add    dx,15            ;Round up.
  326.     shr    dx,4
  327.     mov    ax,3100h
  328.     int    21H            ;Stay resident.
  329.  
  330. ;
  331. END    Initialise
  332.