home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / mslang / as / basmain.asm < prev    next >
Assembly Source File  |  1985-05-28  |  3KB  |  98 lines

  1. extrn    $$main:far
  2. cseg    segment para public 'code'
  3.  
  4.  
  5. ; This program is used to set the PSP address for a compiled BASIC program.
  6. ; The PSP segment is saved at 0:4F2H.
  7.  
  8. ; It can also be used to limit the maximum memory available to a compiled
  9. ; BASIC program. The option '/M:nnn' is used on the command line, where
  10. ; nnn is the number of K-bytes the program is limited to. If no, /M option
  11. ; is specified, no memory limitation takes place. For example, '/M:64' would
  12. ; limit the program to 64*1024 bytes. The range for nnn is 64 to 1024.
  13.  
  14. ; This routine gets control before BASIC, does its handiwork, and then
  15. ; passes control to the BASIC program. It must be linked as follows:
  16. ; LINK BASMAIN+yourprog,yourprog,NUL.MAP,BASCOM
  17.  
  18. ; If BASMAIN is unable to limit memory as requested, a message is displayed
  19. ; and the execution of the program is continued.
  20.  
  21. public    basmain
  22. basmain proc far
  23.     assume cs:cseg,ds:cseg,ss:nothing,es:nothing
  24.  
  25.     push ds         ; save ds
  26.     xor ax,ax
  27.     mov ds,ax        ; ds=0
  28.     mov si,4f2h        ; dos communications area
  29.     mov ax,es        ; get psp seg
  30.     mov [si],ax        ; save psp in dos comm area
  31.     pop ds            ; restore ds
  32.     mov si,80h        ; point to command line
  33.     mov ch,0
  34.     mov cl,[si]        ; get length of command line
  35.     jcxz p025        ; it's zero
  36.  
  37. p010:    inc si
  38.     mov al,[si]        ; get char from command line
  39.     cmp al,'/'              ; is it a slash?
  40.     jnz p020        ; no
  41.     mov ax,[si+1]        ; get next 2 chars
  42.     cmp ax,':M'             ; is it M: ?
  43.     jz p030         ; yes
  44.     cmp ax,':m'             ; is it m: ?
  45.     jz p030         ; yes
  46.  
  47. p020:    loop p010        ; check next char
  48. p025:    jmp p080        ; no /m: or /M: found
  49.  
  50. p030:                ; found /m: or /M:
  51.     add si,3        ; point to first number
  52.     mov ax,0
  53.     mov bx,0
  54.     mov cx,10
  55. p040:    mov bl,[si]        ; get character
  56.     cmp bl,'0'              ; out of range?
  57.     jb p050         ; yes
  58.     cmp bl,'9'              ; out of range?
  59.     ja p050         ; yes
  60.     sub bl,'0'              ; convert to binary
  61.     mul cx            ; multiply ax by 10
  62.     add ax,bx        ; add new digit
  63.     inc si            ; point to next char
  64.     jmp p040        ; continue
  65.  
  66. p050:                ; got value in ax
  67.     cmp ax,64        ; less than 64K?
  68.     jb p060         ; yes - print msg
  69.     cmp ax,1024        ; greater than 1024K?
  70.     ja p060         ; yes - print msg
  71.     mov cl,6
  72.     sal ax,cl        ; convert from KB to paragraphs (*64)
  73.     mov bx,es        ; get psp
  74.     add bx,ax        ; new top of memory
  75.     mov si,2        ; point to top of memory in psp
  76.     mov ax,[si]        ; get current top of memory
  77.     cmp ax,bx        ; is new setting larger?
  78.     jae p055        ; no
  79.     mov dx,offset msg2    ; yes - print msg
  80.     jmp p065
  81.  
  82. p055:    mov [si],bx        ; save new top of memory
  83.     jmp p080
  84.  
  85. p060:    mov dx,offset msg1    ; print the message
  86. p065:    add dx,100h        ; fudge for the psp
  87.     mov ah,9
  88.     int 21h
  89.  
  90. p080:    jmp $$main        ; jump to BASIC's start point
  91.  
  92. msg1    db 'Memory specification must be from 64 to 1024',7,10,13,'$'
  93. msg2    db 'Unable to limit memory',7,10,13,'$'
  94.  
  95. basmain endp
  96. cseg    ends
  97. end    basmain         ; must be a main program!
  98.