汇编源码系列之basmain

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究.......

extrn  $$main:far
cseg  segment para public 'code'
; This program is used to set the PSP address for a compiled BASIC program.
; The PSP segment is saved at 0:4F2H.
; It can also be used to limit the maximum memory available to a compiled
; BASIC program. The option '/M:nnn' is used on the command line, where
; nnn is the number of K-bytes the program is limited to. If no, /M option
; is specified, no memory limitation takes place. For example, '/M:64' would
; limit the program to 64*1024 bytes. The range for nnn is 64 to 1024.
; This routine gets control before BASIC, does its handiwork, and then
; passes control to the BASIC program. It must be linked as follows:
; LINK BASMAIN+yourprog,yourprog,NUL.MAP,BASCOM
; If BASMAIN is unable to limit memory as requested, a message is displayed
; and the execution of the program is continued.
public  basmain
basmain proc far
  assume cs:cseg,ds:cseg,ss:nothing,es:nothing
  push ds     ; save ds
  xor ax,ax
  mov ds,ax    ; ds=0
  mov si,4f2h    ; dos communications area
  mov ax,es    ; get psp seg
  mov [si],ax    ; save psp in dos comm area
  pop ds      ; restore ds
  mov si,80h    ; point to command line
  mov ch,0
  mov cl,[si]    ; get length of command line
  jcxz p025    ; it's zero
p010:  inc si
  mov al,[si]    ; get char from command line
  cmp al,'/'       ; is it a slash?
  jnz p020    ; no
  mov ax,[si+1]    ; get next 2 chars
  cmp ax,':M'       ; is it M: ?
  jz p030     ; yes
  cmp ax,':m'       ; is it m: ?
  jz p030     ; yes
p020:  loop p010    ; check next char
p025:  jmp p080    ; no /m: or /M: found
p030:        ; found /m: or /M:
  add si,3    ; point to first number
  mov ax,0
  mov bx,0
  mov cx,10
p040:  mov bl,[si]    ; get character
  cmp bl,'0'       ; out of range?
  jb p050     ; yes
  cmp bl,'9'       ; out of range?
  ja p050     ; yes
  sub bl,'0'       ; convert to binary
  mul cx      ; multiply ax by 10
  add ax,bx    ; add new digit
  inc si      ; point to next char
  jmp p040    ; continue
p050:        ; got value in ax
  cmp ax,64    ; less than 64K?
  jb p060     ; yes - print msg
  cmp ax,1024    ; greater than 1024K?
  ja p060     ; yes - print msg
  mov cl,6
  sal ax,cl    ; convert from KB to paragraphs (*64)
  mov bx,es    ; get psp
  add bx,ax    ; new top of memory
  mov si,2    ; point to top of memory in psp
  mov ax,[si]    ; get current top of memory
  cmp ax,bx    ; is new setting larger?
  jae p055    ; no
  mov dx,offset msg2  ; yes - print msg
  jmp p065
p055:  mov [si],bx    ; save new top of memory
  jmp p080
p060:  mov dx,offset msg1  ; print the message
p065:  add dx,100h    ; fudge for the psp
  mov ah,9
  int 21h
p080:  jmp $$main    ; jump to BASIC's start point
msg1  db 'Memory specification must be from 64 to 1024',7,10,13,'$'
msg2  db 'Unable to limit memory',7,10,13,'$'
basmain endp
cseg  ends
end  basmain     ; must be a main program!

时间: 2024-08-03 06:44:43

汇编源码系列之basmain的相关文章

汇编源码系列之clear

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name clear page 55,132 title 'CLEAR --- control PC display';; CLEAR Utility to clear display; and set character attributes;; Ray Duncan, Uncopyright (u) August 1983; This

汇编源码系列之clock

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... CGROUP GROUP VECTOR,CODESEGVECTOR SEGMENT AT 0H DB 6CH DUP(?) ;FILLERTIME_LO DW ? ;DOS TIMETIME_HI DW ? ;DOS TIMEVEC_IP DW ;CLOCK UPDATE VECTOR IPVEC_CS DW ;CLOCK UPDATE

汇编源码系列之charop

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... title MSDOS 2.00 Function Library for Lattice Csubttl -;;;;FUNCTION: Sets and returns switch char-;; acter and device availability.;;;;;;CALL:;;;; ret= _charop(al,dl);; i

汇编源码系列之clean

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name clean page 55,132 title 'CLEAN --- Filter text file';; CLEAN --- a utility to filter text files.; This program removes all control codes except; for line feeds, carr

汇编源码系列之cleanf

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name cleanf page 55,132 title 'CLEANF - Filter text file';; CLEANF - a DOS 2.0 filter for word processing document files.;; CLEAN.ASM Originally written by Ray Duncan; Co

汇编源码系列之burnout

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... COMMENT * Demo (and semi-useful) program to read/set burnout device parameters. Usage: burnout [ticks] [C+-] [V+-] [H+-] Parameters can be separated by almost anything. W

汇编源码系列之calc

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... PAGE ,132 TITLE CALCCGROUP GROUP CODESEGCODESEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CGROUP,DS:CGROUP,ES:CGROUP PUBLIC CALC ORG 100HCALC PROC FAR JMP START;--------------

汇编源码系列之char

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ctable segment para public 'DATA db 9 dup(' ') db 9,10,' ',12,13 db 13 dup(' ') db 27 db 4 dup(' ') db ' !"#$%&',39,'()*+,-./0123456789:;<=>?@' db 'ABCDEFGHIJKL

汇编源码系列之brk

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... PGROUP Group PROGDGROUP Group DATADATA Segment Public 'DATA'public brkflagbrkflag DW 0DATA endsPROG Segment Para Public 'PROG'public TrapBreaassume cs:PGROUP,DS:DGROUPTra