Forums before death by AOL, social media and spammers... "We can't have nice things"
|    alt.os.development    |    Operating system development chatter    |    4,255 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 3,157 of 4,255    |
|    s_dubrovich@yahoo.com to muta...@gmail.com    |
|    Re: small memory model    |
|    17 Apr 22 12:37:22    |
   
   On Saturday, April 16, 2022 at 11:47:52 PM UTC-5, muta...@gmail.com wrote:   
   > Is there any reason why small memory model can't   
   > be used to make a .com file?   
   >   
   > Thanks. Paul.   
      
   No there isn't. However CMD.EXE starting around Win8 won't load it if it is >   
   64k.   
   Prior to that CMD.EXE would, as would all the pcDOS's as the Loader would load   
   the entire file size.   
   I experimented with doing such circa Win 97.   
      
   The .cseg must come first, with the code ORG'ed to 0100h. The reason is the   
   Loader prepends a 0100h   
   Program Segment Prefix, even for .com files prior to jumping to 0100h to start   
   the execution.   
      
   This begs the question of what tools to use. I used NASM and it has the   
   directives to make life easier to   
   do a couple of things.   
      
   o align 16, db 00h, placed at the last point in each segment to make them and   
   even paragraph in length.   
    This is done to figure a segments length, evenly,   
   ;---------------------------------------------------55   
   ; End Code Segment   
   ;---------------------------------------------------55   
   [SECTION .cseg]   
   align 16, db 0CCh   
   cmd_cend:   
      
   codelength equ (cmd_cend - cmd_cstart) >> 4   
   codemin equ codelength   
      
   So that this works...   
      
   ;   
   %IF pcDos   
    ORG 100h   
    [SECTION .cseg] ;; initial   
   %ELSE   
    [SECTION .cseg vstart=0 align=16]   
   %ENDIF   
   ;---------------------------------------------------55   
   cmd_cstart:   
   ;--- setup runtime segment registers from current CS   
   ; Note: this assumes real mode contiguous binary.   
      
    mov bx,CS   
    add bx,codemin ;;segm_sz of code + CS = DSEG   
      
   So CS plus its length in 'segments' so to speak, now is the segment number of   
   the next segment, DS.   
      
   %IF pcDos   
    add bx,10h ;; adj for 0100h orging   
   %ENDIF   
    mov DS,bx   
    add bx,datamin ;; + segm_sz data = ESEG   
   %IF pcDos   
    add bx,10h   
   %ENDIF   
    mov ES,bx   
    add bx,extramin ;; + segm_sz extra = SSEG   
   %IF pcDos   
    add bx,10h   
   %ENDIF   
    mov SS,bx   
    mov sp,stack_sp ;;offset in SSEG   
      
   main:   
    call START   
    jmp alldone   
   {START code block}   
   . . .   
   ;---exit program---   
      
   alldone: ;;return to here, exit.   
      
   ; do dos exit in this version...   
      
   %IF pcDos   
    mov ax,4C00h   
    int 21h   
   %ELSE ;; binary exit thru RomBios.   
    mov ah,0   
    int 16h ;;pause until keypress.   
    int 19h ;;reboot.   
   %ENDIF   
      
      
   ;---------------------------------------------------55   
   ; End Code Segment   
   ;---------------------------------------------------55   
   [SECTION .cseg]   
   align 16, db 0CCh   
   cmd_cend:   
      
   codelength equ (cmd_cend - cmd_cstart) >> 4   
   codemin equ codelength   
      
   ;----EO CSeg--------   
      
   ;---------------------------------------------------55   
   ; Data Ends   
   ;---------------------------------------------------55   
      
   [SECTION .dseg] ;;   
   align 16,db 0F6h   
      
   cmd_dend:   
   datalength equ (cmd_dend - cmd_dstart) >> 4   
   datamin equ datalength   
      
   ;----EO DSeg--------   
      
   ;---------------------------------------------------55   
   ; Extra Ends   
   ;---------------------------------------------------55   
   [SECTION .eseg]   
   cmd_eend:   
      
   extralength equ (cmd_eend - cmd_estart) >> 4   
   extramin equ extralength   
      
   ;--- EO ESeg ---   
      
   ;---------------------------------------------------55   
   ; Stack Ends   
   ;---------------------------------------------------55   
      
   [SECTION .sseg]   
    align 16, db 0CCh   
   cmd_send:   
      
   stack_sp equ (cmd_send - cmd_sstart)   
   stacklength equ (cmd_send - cmd_sstart) >> 4   
   stackmin equ stacklength   
      
   ;----EO SSeg--------   
      
   (rough idea, not final running code ~~ .eseg looks suspect from what I   
   remember)   
      
   ..an ex. make file for nasm   
      
   nasm -@ test.mak   
   -f bin   
   -l diskview.lst   
   -o diskview.bin   
   diskview.nsm   
      
   ..Rename the *.bin to *.com   
      
   hth,   
      
   Steve   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca