home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 November / VPR9811A.BIN / BENCH / CWSDPMI2 / CWSDPMI2.LZH / SRC.LZH / START.ASM < prev    next >
Assembly Source File  |  1997-09-24  |  6KB  |  343 lines

  1. ; Copyright (C) 1995,1996 CW Sandmann (sandmann@clio.rice.edu) 1206 Braelinn, Sugarland, TX 77479
  2. ;
  3. ; This file is distributed under the terms listed in the document
  4. ; "copying.cws", available from CW Sandmann at the address above.
  5. ; A copy of "copying.cws" should accompany this file; if not, a copy
  6. ; should be available from where this file was obtained.  This file
  7. ; may not be distributed without a verbatim copy of "copying.cws".
  8. ;
  9. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  10. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11.  
  12.     title    cwsdpmi
  13.     include    segdefs.inc
  14.  
  15. ;------------------------------------------------------------------------
  16.  
  17. .8086
  18.  
  19.     start_data16
  20.     public    __psp, __osmajor, __osminor, __brklvl, ___brklvl
  21. __psp        dw    0
  22. __osmajor    db    0
  23. __osminor    db    0
  24. __brklvl     dd    0
  25. ___brklvl     dw    offset DGROUP:bss_end
  26. firstf        dw    offset DGROUP:bss_end
  27.     extrn __stklen:word
  28.     end_data16
  29.  
  30.     start_bss
  31. bss_start     label    byte
  32.     public    _errno
  33. _errno        dw    ?
  34.     end_bss
  35.  
  36. _bssend segment
  37. bss_end        label    word
  38.     ends
  39.  
  40. ;------------------------------------------------------------------------
  41.  
  42.     start_code16
  43.  
  44. extrn    _main:near
  45.     .8086
  46.  
  47. start    proc near
  48.     mov    bp, ds:[2]    ; Highest memory segment
  49.     mov    dx, DGROUP
  50.     mov    ds, dx
  51.     mov    __psp, es
  52.  
  53.     sub    bp, dx        ; Our current DGROUP size in paragraphs
  54.     mov    di, __stklen    ; Requested stack size
  55.     add    di, offset DGROUP:bss_end
  56.     mov    cl, 4
  57.     shr    di, cl        ; Convert bss_end+stack to paragraphs
  58.     inc    di        ; Wanted DGROUP size in paragraphs
  59.     cmp    bp, di
  60.     jb    short _exit    ; Not enough memory (but we fixed header!?)
  61.  
  62.     mov    di, 1000h    ; More than 64K?
  63.     cmp    bp, di
  64.     ja    short mem_ok    ; Someone carried away with CWSPARAM, 64K Max
  65.     mov    di, bp        ; The usual case
  66.  
  67. ;    Move to new stack, then return extra memory to DOS
  68.  
  69. mem_ok:    mov    bx, di
  70.     shl    di, cl        ; Convert back to bytes from paragraphs
  71.     mov    ss, dx        ; Set the program stack
  72.     mov    sp, di
  73.  
  74.     add    bx, dx        ; Segment value for end of our new DGROUP
  75.     mov    word ptr __brklvl+2, bx
  76.     mov    ax, es        ; __psp 
  77.     sub    bx, ax        ; Number of paragraphs to keep
  78.     mov    ah, 04Ah    ; DOS resize memory block call
  79.     int    021h
  80.  
  81. ;    Clear BSS area to zero
  82.  
  83.     push    ds
  84.     pop    es
  85.     mov    di, offset DGROUP:bss_start
  86.     mov    cx, offset DGROUP:bss_end
  87.     sub    cx, di
  88.     xor    ax, ax
  89.     cld
  90.     rep    stosb
  91.  
  92.     mov    ah, 30h        ; get DOS version into TCC like variable
  93.     int    21h    
  94.     mov    word ptr __osmajor, ax
  95.  
  96.     mov    ds:[bss_end],8000h    ; For malloc
  97.  
  98.     call    _main        ; Never return, so this is OK
  99.     endp
  100.     
  101.     PUBLIC    __exit,_exit    ; Always error exit here
  102. __exit    proc    near
  103. _exit:    mov    ax,4C01h
  104.     int    21h
  105.     endp
  106.  
  107.     PUBLIC    _unlink
  108. _unlink    proc    near
  109.     push    bp
  110.     mov    bp,sp
  111.     mov    ah,41h        ; Delete file
  112.     jmp    short comn1
  113.     endp
  114.  
  115.     PUBLIC    __creat
  116. __creat    proc    near
  117.     push    bp
  118.     mov    bp,sp
  119.     xor    cx,cx        ; No attributes (ignore bp+6)
  120.     mov    ah,3Ch        ; Create new (or zero length existing) file
  121. comn1:    mov    dx,[bp+4]    ; Name of file
  122.     int    21h
  123.     jnc    short do_ret
  124.     mov    ah,-1        ; AX thus negative, shorter, AL has err code
  125.     jmp    short do_ret
  126.     endp
  127.  
  128.     PUBLIC    __write
  129. __write    proc    near
  130.     push    bp
  131.     mov    bp,sp
  132.     mov    ah,40h        ; Write
  133. com3:    mov    cx,[bp+8]    ; Buffer size
  134.     mov    dx,[bp+6]    ; Buffer offset
  135. com1:    mov    bx,[bp+4]    ; File handle
  136.     int    21h
  137.     jnc    short do_ret
  138.     xor    ax,ax
  139. do_ret:    pop    bp
  140.     ret
  141.     endp
  142.  
  143.     PUBLIC    __read
  144. __read    proc    near
  145.     push    bp
  146.     mov    bp,sp
  147.     mov    ah,3fh        ; Read
  148.     jmp    short com3
  149.     endp
  150.  
  151.     PUBLIC    _lseek
  152. _lseek    proc    near
  153.     push    bp
  154.     mov    bp,sp
  155.     mov    ax,4200h    ; Seek absolute (always abs here)
  156.     jmp    short com3
  157.     endp
  158.  
  159.     PUBLIC    __close
  160. __close    proc    near
  161.     push    bp
  162.     mov    bp,sp
  163.     mov    ah,3eh        ; Close
  164.     jmp    short com1
  165.     endp
  166.  
  167.     PUBLIC    __restorezero    ; Bogus, for TCC compatibility
  168. __restorezero    proc    near
  169.     ret
  170.     endp
  171.  
  172.     PUBLIC    _free
  173. _free    proc    near
  174.     push    bp
  175.     mov    bp,sp
  176.     mov    bx,[bp+4]    ; pointer
  177.     dec    bx
  178.     or    byte ptr [bx], 80h    ; negative size means "free"
  179.     dec    bx
  180.     cmp    firstf,bx
  181.     jb    short f1
  182.     mov    firstf,bx
  183. f1:    pop    bp
  184.     ret
  185.     endp
  186.     
  187.     PUBLIC    _malloc
  188. _malloc    proc    near
  189.     push    bp
  190.     mov    bp,sp
  191.     mov    dx,[bp+4]    ; size
  192.     add    dx,3        ; for header and roundup
  193.     and    dl,0feh        ; clear roundup
  194.  
  195.     mov    bx,firstf
  196. m0:    mov    ax,[bx]        ; header size/tag
  197.     test    ax,ax
  198.     js    short m1
  199.     cmp    firstf,bx    ; not free!
  200.     jne    short m3
  201.     add    firstf,ax
  202. m3:    add    bx,ax
  203.     jmp    short m0
  204.     
  205. m1:    and    ah,7fh        ; get the size
  206.     cmp    ax,dx
  207.     jb    short m2
  208.  
  209. ;    We have a big enough block
  210.  
  211.     sub    ax,dx        ; ax is now extra
  212.     jmp    short m4
  213.  
  214. m2:    or    ax,ax
  215.     jne    short m3    ; don't try to merge since all same size    
  216.  
  217. ;    End of chain (ax = 0)
  218.  
  219.     mov    cx,bx
  220.     add    cx,dx        ; new end
  221.     add    cx,380h        ; enough for a single HW interrupt
  222.     cmp    cx,sp
  223.     ja    short mend
  224.     mov    ax,8000h
  225. m4:    mov    [bx],dx
  226.     add    bx,dx
  227.     or    ax,ax
  228.     je    short m5
  229.     or    ah,80h
  230.     mov    [bx],ax
  231. m5:    mov    ax,bx
  232.     sub    ax,dx
  233.     cmp    firstf,ax
  234.     jne    short m6
  235.     mov    firstf,bx
  236. m6:    add    ax,2
  237. mend:    pop    bp
  238.     ret
  239.     endp
  240.  
  241. csub    macro    name
  242.     public    name
  243. name :    push    bp
  244.     mov    bp,sp
  245.     endm
  246.  
  247. asub    macro    name
  248.     public    name
  249. name :
  250.     endm
  251.  
  252. csub    _getvect
  253.     mov    ah,35h
  254.     mov    al,[bp+4]
  255.     int    21h
  256.     mov    dx,es
  257.     xchg    bx,ax        ; Shorter than mov ax,bx
  258.     pop    bp
  259.     ret
  260.  
  261. csub    _setvect
  262.     mov    ah,25h
  263.     push    ds
  264.     mov    al,[bp+4]
  265.     lds    dx,[bp+6]
  266.     int    21h
  267.     pop    ds
  268.     pop    bp
  269.     ret
  270.  
  271. csub    _memset
  272.     push    ds
  273.     pop    es
  274.     cld
  275.     push    di
  276.     mov    di,[bp+4]
  277.     mov    al,[bp+6]
  278.     mov    cx,[bp+8]
  279.     rep    stosb
  280.     pop    di
  281.     pop    bp
  282.     ret
  283.     
  284. csub    _movedata
  285.     push    si
  286.     push    di
  287.     push    ds
  288.     mov    ds,[bp+4]
  289.     les    si,[bp+6]        ; si=6,es=8 (horrid hack for space!)
  290.     mov    di,[bp+10]
  291.     mov    cx,[bp+12]
  292.     cld
  293.     rep    movsb
  294.     pop    ds
  295.     pop    di
  296.     pop    si
  297.     pop    bp
  298.     ret
  299.  
  300. csub    N_SCOPY@
  301.     push    si
  302.     push    di
  303.     push    ds
  304.     lds    si,[bp+4]
  305.     les    di,[bp+8]
  306.     cld
  307.     rep    movsb
  308.     pop    ds
  309.     pop    di
  310.     pop    si
  311.     pop    bp
  312.     ret    8
  313.  
  314. asub    N_LXMUL@            ; Cheat - assume only result is long
  315.     mul    bx
  316.     ret
  317.  
  318.     .386
  319. asub    N_LXLSH@
  320.     shld    dx,ax,cl
  321.     xor    bx,bx
  322.     shld    ax,bx,cl
  323.     ret
  324.  
  325. asub    N_LXRSH@
  326.     mov    bx,dx
  327.     sar    bx,15
  328. rsh:    shrd    ax,dx,cl
  329.     shrd    dx,bx,cl
  330.     ret
  331.  
  332. asub    N_LXURSH@
  333.     xor    bx,bx
  334.     jmp    short rsh
  335.  
  336.     end_code16
  337.  
  338. _STACK    segment stack 'STACK'
  339.     db    128 dup(?)    ;minimal startup stack (overwritten)
  340.     ends
  341.  
  342.     end    start
  343.