home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 426 / 3C509A.ZIP / TAIL.ASM < prev    next >
Assembly Source File  |  1993-02-01  |  14KB  |  559 lines

  1. ;   PC/FTP Packet Driver source, conforming to version 1.05 of the spec
  2. ;   Updated to version 1.08 Feb. 17, 1989.
  3. ;   Copyright 1988-1992 Russell Nelson
  4.  
  5. ;   This program is free software; you can redistribute it and/or modify
  6. ;   it under the terms of the GNU General Public License as published by
  7. ;   the Free Software Foundation, version 1.
  8. ;
  9. ;   This program is distributed in the hope that it will be useful,
  10. ;   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;   GNU General Public License for more details.
  13. ;
  14. ;   You should have received a copy of the GNU General Public License
  15. ;   along with this program; if not, write to the Free Software
  16. ;   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     include    defs.asm
  19.  
  20. code    segment word public
  21.     assume    cs:code, ds:code
  22.  
  23.     public    is_eisa
  24. is_eisa    db    0            ;=0 if ISA, =1 if EISA
  25.     extrn    sys_features: byte    ;bitmask of system features.
  26.     extrn    is_186: byte        ;=0 if 808[68], =1 if 80[1234]86.
  27.     extrn    is_286: byte        ;=0 if 80[1]8[68], =1 if 80[234]86.
  28.     extrn    is_386: byte        ;=0 if 80[12]8[68], =1 if 80[34]86.
  29.     extrn    int_no: byte        ;the board's interrupt level.
  30.     extrn    hw_int_no: byte        ;the 8259 interrupt level.
  31.     extrn    driver_class: byte    ;the class of this driver, per the spec.
  32.     extrn    rcv_modes: word        ;count of modes followed by mode handles.
  33.  
  34. ;-> last byte of static memory used by driver-dependent code.
  35.     extrn    end_resident: byte
  36.     extrn    end_free_mem: byte
  37.  
  38. ;-> the fixed address of the card.
  39.     extrn    rom_address: byte
  40.  
  41. ;-> the current address of the card.
  42.     extrn    my_address: byte
  43.  
  44.     extrn    phd_dioa: byte
  45.     extrn    phd_environ: word
  46.     extrn    flagbyte: byte
  47.  
  48.     include    printnum.asm
  49.     include    decout.asm
  50.     include    digout.asm
  51.     include    crlf.asm
  52.     include    chrout.asm
  53.  
  54. free_mem    dw    end_resident    ;allocate memory from here.
  55. ;also see memory_to_keep.
  56.  
  57.     public    malloc
  58. malloc:
  59. ;enter with dx = amount of memory desired.
  60. ;exit with nc, dx -> that memory, or cy if there isn't enough memory.
  61.     add    dx,free_mem        ;make a pointer after that much memory.
  62.     cmp    dx,offset end_free_mem    ;is it still in the free area?
  63.     ja    malloc_1        ;no, we're in trouble.
  64.     xchg    dx,free_mem        ;get the pointer back, store ptr->end.
  65.     clc
  66.     ret
  67. malloc_1:
  68.     stc
  69.     ret
  70.  
  71.  
  72. end_tail_1    label    byte        ; end of the delayed init driver
  73.  
  74. ;usage_msg is of the form "usage: driver [options] <packet_int_no> <args>"
  75.     extrn    usage_msg: byte
  76.  
  77. options_msg    label    byte
  78. db"   -d -- Delayed initialization.  Used for diskless booting",CR,LF
  79. db"   -n -- NetWare conversion.  Converts 802.3 packets into 8137 packets",CR,LF
  80. db"   -w -- Windows hack, obsoleted by winpkt",CR,LF
  81. db"   -p -- Promiscuous mode disable",CR,LF
  82. db"   -u -- Uninstall",CR,LF
  83. db '$'
  84.  
  85. ;copyright_msg is of the form:
  86. ;"Packet driver for the foobar",CR,LF
  87. ;"Portions Copyright 19xx, J. Random Hacker".
  88.     extrn    copyright_msg: byte
  89.  
  90. ;SPECIAL    equ    "Pre 11.x ALPHA release"
  91.  
  92. copyleft_msg    label    byte
  93.  db "Packet driver skeleton copyright 1988-92, Crynwr Software.",CR,LF
  94.  db "This program is free software; see the file COPYING for details.",CR,LF
  95.  db "The source to this program must be available; see the file COPYING for details.",CR,LF
  96.  db "NO WARRANTY; see the file COPYING for details.",CR,LF
  97.  db CR,LF
  98.   ifdef SPECIAL
  99.  masm51
  100.  SPECIALLEN    sizestr    SPECIAL
  101.  db '╔', SPECIALLEN dup ('═'), '╗',CR,LF
  102.  db '║ ',SPECIAL,' ║',CR,LF
  103.  db '╚', SPECIALLEN dup('═'), '╝',CR,LF
  104.   endif
  105.  db CR,LF,'$'
  106.  
  107. no_resident_msg    label    byte
  108.  db CR,LF,"*** Packet driver failed to initialize the board ***",CR,LF,'$'
  109.  
  110. ;parse_args should parse the arguments.
  111. ;called with ds:si -> immediately after the entry_point.
  112.     extrn    parse_args: near
  113.  
  114. ;print_parameters should print the arguments.
  115.     extrn    print_parameters: near
  116.  
  117.     extrn    our_isr: near, their_isr: dword
  118.     extrn    entry_point: byte
  119.  
  120. eisa_signature    db    "EISA"
  121.  
  122. entry_point_name    db    "Packet driver software interrupt is ",'$'
  123. eaddr_msg    db    "My Ethernet address is ",'$'
  124. aaddr_msg    db    "My ARCnet address is ",'$'
  125.  
  126. already_msg    db    CR,LF,"Error: there is already a packet driver (you may uninstall it using -u) at ",'$'
  127. no_pkint_msg    db    CR,LF,"Error: there not a packet driver at ",'$'
  128. int_msg        db    CR,LF
  129.         db    "Error: <hardware_irq> should be between 0 and "
  130. int_msg_num    label    word
  131.         db    "15 inclusive", '$'
  132. xt_hd_warn_msg    db    CR,LF,"Warning: the hard disk on an XT usually uses IRQ 5.  Use a different interrupt",CR,LF,'$'
  133. terminated_msg    db    "Uninstall completed",'$'
  134.  
  135. handle        dw    ?
  136.  
  137. bogus_type    db    0,0        ;totally bogus type code.
  138. our_recv:
  139.     xor    di,di
  140.     mov    es,di
  141.     retf
  142.  
  143.     public    etopen_diagn
  144. etopen_diagn    db    0        ; errorlevel from etopen if set
  145.  
  146. ;etopen should initialize the device.  If it needs to give an error, it
  147. ;can issue the error message and quit to dos.
  148.     extrn    etopen: near
  149.  
  150. memory_to_keep    dw    end_resident    ;keep at least this much memory.
  151. ;also see free_mem.
  152.  
  153. already_error:
  154.     mov    dx,offset already_msg
  155. already_error_1:
  156.     mov    di,offset entry_point
  157.     call    print_number
  158.     mov    ax,4c05h        ; give errorlevel 5
  159.     int    21h
  160.  
  161. usage_error:
  162.     mov    dx,offset usage_msg
  163.     mov    ah,9
  164.     int    21h
  165.     mov    dx,offset options_msg
  166.     public    error
  167. error:
  168.     mov    ah,9
  169.     int    21h
  170.     mov    ax,4c0ah        ; give errorlevel 10
  171.     int    21h
  172.  
  173.     include    timeout.asm
  174.  
  175.     public    start_1
  176. start_1:
  177.     cld
  178.  
  179.     mov    dx,offset copyright_msg
  180.     mov    ah,9
  181.     int    21h
  182.  
  183.     mov    dx,offset copyleft_msg
  184.     mov    ah,9
  185.     int    21h
  186.  
  187.     mov    dx,0f000h        ;ROM segment
  188.     mov    es,dx
  189.     mov    di,0ffd9h
  190.     mov    si,offset eisa_signature
  191.     mov    cx,2
  192.     repe    cmpsw
  193.     jne    not_eisa
  194.     inc    is_eisa
  195. not_eisa:
  196.  
  197. ;
  198. ; Get the feature byte (if reliable) so we can know if it is a microchannel
  199. ; computer and how many interrupts there are.
  200. ;
  201.     mov    ah,0c0h
  202.     int    15h            ; es:bx <- sys features block
  203.     jc    look_in_ROM        ; error, must use rom.
  204.     or    ah,ah
  205.     jnz    look_in_ROM
  206.     mov    dx,es:[bx]        ; # of feature bytes
  207.     cmp    dx,4            ; do we have the feature byte we want?
  208.     jae    got_features        ;yes.
  209. look_in_ROM:
  210.     cmp    byte ptr es:[0fffeh],0fch;is this an AT?
  211.     jne    identified        ;no.
  212.     or    sys_features,TWO_8259    ; ATs have 2nd 8259
  213.     jmp    identified        ; assume no microchannel
  214. got_features:
  215.     mov    ah,es:[bx+2]        ; model byte
  216.     cmp    ah,0fch
  217.     je    at_ps2
  218.     ja    identified        ; FD, FE and FF are not ATs
  219.     cmp    ah,0f8h
  220.     je    at_ps2
  221.     ja    identified        ; F9, FA and FB are not ATs
  222.     cmp    ah,09ah
  223.     jbe    identified        ; old non-AT Compacs go here
  224. at_ps2:                    ; 9B - F8 and FC are assumed to
  225.     mov    ah,es:[bx+5]        ;   have reliable feature byte
  226.     mov    sys_features,ah
  227. identified:
  228.  
  229. ;Determine the processor type.  The 8088 and 8086 will actually shift ax
  230. ;over by 33 bits, while the 80[123]86 use a shift count mod 32.
  231.     mov    cl,33
  232.     mov    ax,0ffffh
  233.     shl    ax,cl            ;186 or better?
  234.     jz    processor_identified    ;no.
  235.     mov    is_186,1
  236.  
  237.     push    sp
  238.     pop    ax
  239.     cmp    ax,sp            ;286 or better?
  240.     jne    processor_identified    ;no.
  241.     mov    is_286,1
  242.  
  243.     pushf
  244.     pop    ax
  245.     or    ax,7000h        ;the 386 lets us set these bits
  246.     push    ax
  247.     popf
  248.     pushf
  249.     pop    ax
  250.     test    ax,7000h        ;did the bits get set?
  251.     je    processor_identified
  252.     mov    is_386,1
  253.  
  254. processor_identified:
  255.  
  256.     mov    si,offset phd_dioa+1
  257.     call    skip_blanks        ;end of line?
  258.     cmp    al,CR
  259.     je    usage_error_j_1
  260.  
  261. chk_options:
  262.     call    skip_blanks
  263.     cmp    al,'-'            ; any options?
  264.     jne    no_more_opt
  265.     inc    si            ; skip past option char
  266.     lodsb                ; read next char
  267.     or    al,20h            ; convert to lower case
  268.     cmp    al,'d'
  269.     jne    not_d_opt
  270.     or    flagbyte,D_OPTION
  271.     jmp    chk_options
  272. not_d_opt:
  273.     cmp    al,'n'
  274.     jne    not_n_opt
  275.     or    flagbyte,N_OPTION
  276.     jmp    chk_options
  277. not_n_opt:
  278.     cmp    al,'w'
  279.     jne    not_w_opt
  280.     or    flagbyte,W_OPTION
  281.     jmp    chk_options
  282. not_w_opt:
  283.     cmp    al,'p'
  284.     jne    not_p_opt
  285.     cmp    rcv_modes,6        ;do they even *have* a promiscuous mode?
  286.     jbe    chk_options        ;no.
  287.     mov    rcv_modes+2[6*2],0    ;yes, nuke it.
  288.     jmp    chk_options
  289. not_p_opt:
  290.     cmp    al,'u'
  291.     jne    not_u_opt
  292.     or    flagbyte,U_OPTION
  293.     jmp    chk_options
  294. not_u_opt:
  295. usage_error_j_1:
  296.     jmp    usage_error
  297. no_more_opt:
  298.  
  299.     mov    di,offset entry_point    ;parse the packet interrupt number
  300.     call    get_number        ;  for them.
  301.  
  302.     test    flagbyte,U_OPTION    ;should we terminate the driver?
  303.     je    not_terminate
  304.  
  305.     call    verify_packet_int
  306.     jnc    terminate_1
  307.     jmp    error
  308. terminate_1:
  309.     je    terminate_2        ;go if we found a signature.
  310.     mov    dx,offset no_pkint_msg
  311.     jmp    already_error_1
  312. terminate_2:
  313.  
  314.     mov    their_isr.offs,bx
  315.     mov    their_isr.segm,es
  316.  
  317.     mov    ax,1ffh            ;driver_info
  318.     pushf
  319.     cli
  320.     call    their_isr
  321.     call    fatal_error
  322.     push    cs            ;restore ds.
  323.     pop    ds
  324.  
  325.     mov    ah,2            ;access_type
  326.     mov    al,ch            ;their class from driver_info().
  327.     mov    bx,dx            ;their type from driver_info().
  328.     mov    dl,cl            ;their number from driver_info().
  329.     mov    cx,2            ;use type length 2.
  330.     mov    si,offset bogus_type
  331.     push    cs            ;es:di -> our receiver.
  332.     pop    es
  333.     mov    di,offset our_recv
  334.     pushf
  335.     cli
  336.     call    their_isr
  337.     call    fatal_error
  338.     mov    handle,ax
  339.  
  340.     mov    ah,5            ;terminate the driver.
  341.     mov    bx,handle
  342.     pushf
  343.     cli
  344.     call    their_isr
  345.     jnc    now_close
  346.     call    print_error
  347.     mov    ah,3            ;release_type
  348.     mov    bx,handle
  349.     pushf
  350.     cli
  351.     call    their_isr
  352.     int    20h
  353. now_close:
  354.     mov    dx,offset terminated_msg
  355.     mov    ah,9
  356.     int    21h
  357.     int    20h
  358.  
  359. usage_error_j_2:
  360.     jmp    usage_error
  361. not_terminate:
  362.  
  363.     call    parse_args
  364.     jc    usage_error_j_2
  365.  
  366.     call    skip_blanks        ;end of line?
  367.     cmp    al,CR
  368.     jne    usage_error_j_2
  369.  
  370.     call    verify_packet_int
  371.     jnc    packet_int_ok
  372.     jmp    error
  373. packet_int_ok:
  374.     jne    packet_int_unused
  375.     jmp    already_error        ;give an error if there's one there.
  376. packet_int_unused:
  377. ;
  378. ; Verify that the interrupt number they gave is valid.
  379. ;
  380.     cmp    int_no,15        ;can't possibly be > 15.
  381.     ja    int_bad
  382.     test    sys_features,TWO_8259    ; 2nd 8259 ?
  383.     jnz    int_ok            ;yes, no need to check for <= 7.
  384.     mov    int_msg_num,'7'+' '*256    ;correct the error message, just in case.
  385.     cmp    int_no,7        ;make sure that the packet interrupt
  386.     jbe    int_ok_7        ;  number is in range.
  387. int_bad:
  388.     mov    dx,offset int_msg
  389.     jmp    error
  390. int_ok_7:
  391.     cmp    int_no,5        ;Are they trying to use irq 5 on an XT?
  392.     jne    int_ok            ;no.
  393.  
  394.     push    ds
  395.     mov    ax,40h
  396.     mov    ds,ax
  397.     mov    al,ds:[75h]        ;get the number of hard disks.
  398.     pop    ds
  399.  
  400.     or    al,al            ;do they have one?
  401.     je    int_ok            ;unbelievably, no.
  402.     mov    dx,offset xt_hd_warn_msg
  403.     mov    ah,9
  404.     int    21h
  405. int_ok:
  406.  
  407. ;
  408. ; Map IRQ 2 to IRQ 9 if needed.
  409. ;
  410.     test    sys_features,TWO_8259    ; 2nd 8259 ?
  411.     je    no_mapping_needed    ;no, no mapping needed
  412.     cmp    int_no,2        ;map IRQ 2 to IRQ 9.
  413.     jne    no_mapping_needed
  414.     mov    int_no,9
  415. no_mapping_needed:
  416.  
  417. ; If they chose the -d option, don't call etopen when we are loaded,
  418. ; but when we are called for the first time
  419. ;
  420. ; Save part of the tail, needed by delayed etopen
  421.     test    flagbyte,D_OPTION
  422.     jz    open_now
  423.     mov    memory_to_keep,offset end_tail_1    ; save first part of tail
  424.     jmp    delayed_open_1
  425. open_now:
  426.     call    etopen            ;init the driver.  If any errors,
  427.                     ;this routine returns cy.
  428.     jnc    yes_resident
  429.     jmp    no_resident
  430.  
  431. yes_resident:
  432.     mov    si,offset rom_address    ;copy their original address to
  433.     push    ds
  434.     pop    es
  435.     mov    di,offset my_address    ;  their current address.
  436.     mov    cx,MAX_ADDR_LEN/2
  437.     rep    movsw
  438.  
  439.     mov    di,offset entry_point
  440.     mov    dx,offset entry_point_name
  441.     call    print_number
  442.  
  443.     call    print_parameters    ;echo our parameters.
  444.     or    flagbyte,CALLED_ETOPEN
  445.  
  446.     cmp    driver_class,1        ;Ethernet?
  447.     jne    print_addr_2        ;no, don't print what we don't have.
  448.  
  449.     mov    dx,offset eaddr_msg
  450.     mov    ah,9
  451.     int    21h
  452.  
  453.     mov    si,offset rom_address
  454.     call    print_ether_addr
  455.  
  456.     call    crlf
  457.  
  458. print_addr_2:
  459.  
  460.     cmp    driver_class,8        ;ARCnet?
  461.     jne    print_addr_3        ;no, don't print what we don't have.
  462.  
  463.     mov    dx,offset aaddr_msg
  464.     mov    ah,9
  465.     int    21h
  466.  
  467.     mov    al,rom_address
  468.     mov    cl,' '            ;Don't eliminate leading zeroes.
  469.     call    byteout
  470.  
  471.     call    crlf
  472.  
  473. print_addr_3:
  474. delayed_open_1:
  475.     mov    ah,35h            ;remember their packet interrupt.
  476.     mov    al,entry_point
  477.     int    21h
  478.     mov    their_isr.offs,bx
  479.     mov    their_isr.segm,es
  480.  
  481.     mov    ah,25h            ;install our packet interrupt
  482.     mov    dx,offset our_isr
  483.     int    21h
  484.  
  485.     mov    ah,49h            ;free our environment, because
  486.     mov    es,phd_environ        ;  we won't need it.
  487.     int    21h
  488.  
  489.     mov    bx,1            ;get the stdout handle.
  490.     mov    ah,3eh            ;close it in case they redirected it.
  491.     int    21h
  492.  
  493.     test    flagbyte,D_OPTION
  494.     jne    f_release_type_1    ;no.
  495.     cmp    rcv_modes+2[3*2],0    ;does mode 3 exist?
  496.     je    f_release_type_1    ;no.
  497.     call    rcv_modes+2[3*2]    ;  call it.
  498. f_release_type_1:
  499.  
  500.     mov    dx,memory_to_keep    ;keep the greater of this and
  501.     cmp    dx,free_mem        ;  free_mem.
  502.     jae    go_resident
  503.     mov    dx,free_mem
  504. go_resident:
  505.     add    dx,0fh            ;round up to next highest paragraph.
  506.     mov    cl,4
  507.     shr    dx,cl
  508.     mov    ah,31h            ;terminate, stay resident.
  509.     mov    al,etopen_diagn        ; errorlevel (0 - 9, just diagnostics)
  510.     int    21h
  511.  
  512. no_resident:
  513.     mov    ah,9            ;print their error message.
  514.     int    21h
  515.  
  516.     mov    dx,offset no_resident_msg
  517.     mov    ah,9
  518.     int    21h
  519.  
  520.     mov    ax,4c00h + 32        ; give errorlevel 32
  521.     cmp    al,etopen_diagn
  522.     ja    no_et_diagn        ; etopen gave specific reason?
  523.     mov    al,etopen_diagn        ; yes, use that for error level
  524. no_et_diagn:
  525.     int    21h
  526.  
  527. ;             Suggested errorlevels:
  528. ;
  529. ; _____________________  0 = normal
  530. ;              1 = unsuitable memory address given; corrected
  531. ; In most cases every-     2 = unsuitable IRQ level given; corrected
  532. ; thing should work as     3 = unsuitable DMA channel given; corrected
  533. ; expected for lev 1-5     4 = unsuitable IO addr given; corrected (only 1 card)
  534. ; _____________________     5 = packet driver for this int # already loaded
  535. ; External errors, when    20 = general cable failure (but pkt driver is loaded)
  536. ; corrected normal    21 = network cable is open             -"-
  537. ; operation starts    22 = network cable is shorted          -"-
  538. ; _____________________ 23 = 
  539. ; Packet driver not    30 = usage message
  540. ; loaded. A new load    31 = arguments out of range
  541. ; attempt must be done    32 = unspecified device initialization error
  542. ;            33 = 
  543. ;            34 = suggested memory already occupied
  544. ;            35 = suggested IRQ already occupied
  545. ;            36 = suggested DMA channel already occupied
  546. ;            37 = could not find the network card at this IO address
  547.  
  548.  
  549.     include    verifypi.asm
  550.     include    getnum.asm
  551.     include    getdig.asm
  552.     include    skipblk.asm
  553.     include    printea.asm
  554.     include    pkterr.asm
  555.  
  556. code    ends
  557.  
  558.     end
  559.