mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-14 15:36:34 +00:00
The code is being re-licensed under the MIT license. modified: bin/fixid modified: bin/launch.asm modified: bin/makefile-hpux.hp9000-x modified: bin/makefile-init.sgi modified: bin/makefile-init.sparc modified: bin/makefile-init.sparc-multi modified: bin/makefile-irix.sgi-x modified: bin/makefile-sunos4.sparc modified: bin/makefile-sunos4.sparc% modified: bin/makefile-sunos4.sparc-multi modified: bin/makefile-sunos5.386-x modified: bin/makefile-sunos5.i386-x modified: bin/makefile-sunos5.sparc-x modified: bin/makefile-tail modified: bin/makeisc modified: bin/makeright modified: inc/Check.h modified: inc/MyWindow.h modified: inc/Stipple.h modified: inc/XCursors.h modified: inc/XKeymap.h modified: inc/XVersion.h modified: inc/Xdeflt.h modified: inc/Xicon.h modified: inc/address.h modified: inc/arith.h modified: inc/arith2.h modified: inc/array.h modified: inc/bb.h modified: inc/cell.h modified: inc/cell.h% modified: inc/copyright modified: inc/dbprint.h modified: inc/debug.h modified: inc/devif.h modified: inc/display.h modified: inc/dspdata.h modified: inc/ether.h modified: inc/fast_dsp.h modified: inc/fp.h modified: inc/gc.h modified: inc/gc.h.save modified: inc/gcscan.h modified: inc/hdw_conf.h modified: inc/ifpage.h modified: inc/inlineC.h modified: inc/inlnMIPS.h modified: inc/inlnPS2.h modified: inc/inlndos.h modified: inc/iopage.h modified: inc/kbdif.h modified: inc/keyboard.h modified: inc/keyboard.h% modified: inc/keysym.h modified: inc/ldeXdefs.h modified: inc/lispemul.h modified: inc/lispemul.h.save modified: inc/lispmap.h modified: inc/lldsp.h modified: inc/lnk-Xdeflt.h modified: inc/lnk-debug.h modified: inc/lnk-fast_dsp.h modified: inc/lnk-inlineC.h modified: inc/lnk-lispmap.h modified: inc/lnk-tosfns.h modified: inc/lnk-tosret.h modified: inc/locfile.h modified: inc/lpdefs.h modified: inc/lpglobl.h modified: inc/lspglob.h modified: inc/lsptypes.h modified: inc/medleyfp.h modified: inc/mnxdefs.h modified: inc/my.h modified: inc/native.h modified: inc/ocr.h modified: inc/osmsg.h modified: inc/picture.h modified: inc/pilotbbt.h modified: inc/print.h modified: inc/profile.h modified: inc/rawrs232c.h modified: inc/return.h modified: inc/rs232c.h modified: inc/stack.h modified: inc/stream.h modified: inc/stream.h% modified: inc/stream.h2 modified: inc/sysatms.h modified: inc/timeout.h modified: inc/tos1defs.h modified: inc/tosfns.h modified: inc/tosret.h modified: inc/tty.h modified: inc/version.h modified: inc/vmemsave.h modified: inc/xbitmaps.h modified: inc/xdefs.h modified: src/Cldeetr.c modified: src/allocmds.c modified: src/arith2.c modified: src/arith3.c modified: src/arith4.c modified: src/array.c modified: src/array2.c modified: src/array3.c modified: src/array4.c modified: src/array5.c modified: src/array6.c modified: src/asmbbt.c modified: src/asmbitblt.c modified: src/atom.c modified: src/bbtSPARC.s modified: src/bbtsub.c modified: src/bin.c modified: src/binds.c modified: src/bitblt.c modified: src/blt.c modified: src/byteswap.c modified: src/call-c.c modified: src/car-cdr.c modified: src/cdaudio.c modified: src/cdrom.c modified: src/chardev.c modified: src/chatter.c modified: src/codeconv.c modified: src/codetbl.c modified: src/colorbltfns.c modified: src/common.c modified: src/conspage.c modified: src/cr modified: src/dbgtool.c modified: src/dir.c modified: src/doscomm.c modified: src/doskbd.c modified: src/dosmouse.c modified: src/draw.c modified: src/dsk.c modified: src/dspif.c modified: src/dspsubrs.c modified: src/ejlisp.c modified: src/eqf.c modified: src/ether.c modified: src/findkey.c modified: src/foreign.c modified: src/fp.c modified: src/fvar.c modified: src/gc.c modified: src/gc2.c modified: src/gcarray.c modified: src/gccode.c modified: src/gcfinal.c modified: src/gchtfind.c modified: src/gcmain3.c modified: src/gcoflow.c modified: src/gcr.c modified: src/gcrcell.c modified: src/gcscan.c modified: src/gvar2.c modified: src/hacks.c modified: src/hardrtn.c modified: src/imagefile.c modified: src/imagefile2.c modified: src/inet.c modified: src/initdsp.c modified: src/initkbd.c modified: src/initsout.c modified: src/intcall.c modified: src/kbdif.c modified: src/kbdsubrs.c modified: src/keyevent.c modified: src/keylib.c modified: src/keymaker.c modified: src/keytst.c modified: src/keytstno.c modified: src/kprint.c modified: src/launch.asm modified: src/ldeboot.c modified: src/ldeether.c modified: src/ldsout.c modified: src/lineblt8.c modified: src/lisp2c.c modified: src/llcolor.c modified: src/llstk.c modified: src/loader.c modified: src/loopsops.c modified: src/lowlev1.c modified: src/lowlev2.c modified: src/lpdual.c modified: src/lpkit.c modified: src/lplexyy.c modified: src/lpmain.c modified: src/lpread.c modified: src/lpsolve.c modified: src/lptran.c modified: src/lpwrite.c modified: src/lpytab.c modified: src/lsthandl.c modified: src/main.c modified: src/misc7.c modified: src/miscn.c modified: src/mkatom.c modified: src/mkcell.c modified: src/mkkey.c modified: src/mkvdate.c modified: src/mnwevent.c modified: src/mnxmeth.c modified: src/mouseif.c modified: src/mvs.c modified: src/ocr.c modified: src/ocrproc.c modified: src/oether.c modified: src/oldeether.c modified: src/optck.c modified: src/osmsg.c modified: src/perrno.c modified: src/picture.c modified: src/rawcolor.c modified: src/rawrs232c.c modified: src/return.c modified: src/rpc.c modified: src/rplcons.c modified: src/rs232c.c modified: src/setsout.c modified: src/shift.c modified: src/socdvr.c modified: src/storage.c modified: src/subr.c modified: src/subr0374.c modified: src/sxhash.c modified: src/testdsp.c modified: src/testtool.c modified: src/timeoday.c modified: src/timeofday.c modified: src/timer.c modified: src/truecolor.c modified: src/tstsout.c modified: src/tty.c modified: src/typeof.c modified: src/ubf1.c modified: src/ubf2.c modified: src/ubf3.c modified: src/ufn.c modified: src/ufs.c modified: src/unixcomm.c modified: src/unixfork.c modified: src/unwind.c modified: src/uraid.c modified: src/usrsubr.c modified: src/uutils.c modified: src/vars3.c modified: src/vesafns.asm modified: src/vesainit.c modified: src/vgainit.c modified: src/vmemsave.c modified: src/xbbt.c modified: src/xc.c modified: src/xc.c.orig modified: src/xcursor.c modified: src/xinit.c modified: src/xlspwin.c modified: src/xmkicon.c modified: src/xrdopt.c modified: src/xscroll.c modified: src/xwinman.c modified: src/z2.c
358 lines
13 KiB
NASM
Executable File
358 lines
13 KiB
NASM
Executable File
;************************************************************************
|
|
;* *
|
|
;* l a u n c h . a s m *
|
|
;* *
|
|
;* This is the launcher for Medley on DOS. It: *
|
|
;* *
|
|
;* * Looks for and validates any -m memsize argument on the *
|
|
;* command line. Only values in the range 8 - 32 are allowed. *
|
|
;* *
|
|
;* * Loads the real Medley emulator, emul.exe, from the same *
|
|
;* directory that the launcher came from. *
|
|
;* *
|
|
;* * Sets the Intel DOS Extender's profile to the requested *
|
|
;* memory size + 3Mb (to allow for the emulator, internal *
|
|
;* data areas, etc.) *
|
|
;* *
|
|
;* * Set the termination address in the child process's PSP, *
|
|
;* so control returns to the launcher when Medley terminates. *
|
|
;* *
|
|
;* * Jumps to the emulator's start address. *
|
|
;* *
|
|
;* * Upon return, just terminates cleanly. *
|
|
;* *
|
|
;* [We could perhaps do some diagnosis here of error returns?] *
|
|
;* *
|
|
;* *
|
|
;* *
|
|
;************************************************************************
|
|
|
|
;************************************************************************/
|
|
;* */
|
|
;* (C) Copyright 1993, 1994 Venue. All Rights Reserved. */
|
|
;* Manufactured in the United States of America. */
|
|
;* */
|
|
;************************************************************************/
|
|
|
|
.model small
|
|
.386p
|
|
.stack 100h
|
|
.data
|
|
align 8
|
|
;********************************************************
|
|
;* Parameter block for INT 214B, that loads medley.exe *
|
|
;********************************************************
|
|
envseg DW 0 ; environment (0 = copy mine)
|
|
cmdip DW ? ; command-line-tail pointer
|
|
cmdcs DW ?
|
|
fcb1 DD ? ; dummy first FCB to fill in
|
|
fcb2 DD ? ; " 2nd FCB, not here in DOS 4.01???
|
|
stk DD ? ; SS:SP for emul.exe, filled in by loader
|
|
csip DD ? ; start addr for emul.exe, filled in by loader
|
|
|
|
|
|
|
|
retad DD FAR PTR myret ; cs:ip return address, to put in
|
|
; child PSP, so we get control back.
|
|
|
|
|
|
;* Error messages, misc strings, and work areas*
|
|
align 8
|
|
memval dd 0
|
|
errstg DB 'ERROR: Couldn''t free excess storage.',13,10,'$'
|
|
noload db 'ERROR: Loading emulator failed: $'
|
|
loaded db 'LOAD SUCCESSFUL.',13,10,'$'
|
|
nominfo db 'ERROR: -m must be followed by a number 8 - 64.',13,10,'$'
|
|
badexe db 'ERROR: emul.exe is corrupted.',13,10,'$'
|
|
emulpath DB 'emul.exe',0 ; name of the real emulator.
|
|
mflag db '-m' ; to search for -m/-M in cmd line
|
|
mmflag db '-M'
|
|
profile db 'PRO' ; to find the DOS extender profile
|
|
cmdline db 128 dup (?) ; hold the cmd line tail for real emulator
|
|
|
|
;* Error-message table for failures loading emul.exe
|
|
align 2
|
|
errtbl dw OFFSET ng0msg ; 0 = unknown failure
|
|
dw OFFSET ng1msg ; 1 = "invalid function"
|
|
dw OFFSET ng2msg ; 2 = file not found
|
|
dw OFFSET ng3msg ; 3 = path not found
|
|
dw OFFSET ng4msg ; 4 = too many open files
|
|
dw OFFSET ng5msg ; 5 = access denied
|
|
dw OFFSET ng0msg ; 6 = not possible error
|
|
dw OFFSET ng0msg ; 7 = not possible error
|
|
dw OFFSET ng8msg ; 8 = insufficient storage
|
|
dw OFFSET ng0msg ; 9 = not possible
|
|
dw OFFSET ngamsg ; A = bad environment
|
|
dw OFFSET ngbmsg ; B = bad format (corrupt .exe?)a
|
|
|
|
ng0msg db 'Unknown problem',13,10,'$'
|
|
ng1msg db 'Invalid Function',13,10
|
|
db 'Make sure you are running DOS 4.0 or later.',13,10,'$'
|
|
ng2msg db 'File not found.',13,10
|
|
db 'CD to proper directory, or set PATH.',13,10,'$'
|
|
ng3msg db 'Path not found.',13,10
|
|
db 'CD to proper directory, or set PATH.',13,10,'$'
|
|
ng4msg db 'Too many files open.',13,10
|
|
db 'Shut down some TSRs that have file open?',13,10,'$'
|
|
ng5msg db 'Access denied.',13,10
|
|
db 'Make sure of your access rights to emul.exe?',13,10,'$'
|
|
ng8msg db 'Not enough memory.',13,10
|
|
db 'Shut down some TSR applications?',13,10,'$'
|
|
ngamsg db 'Environment corrupt.',13,10
|
|
db 'Check using SET; You may need to re-boot.',13,10,'$'
|
|
ngbmsg db 'EXE file corrupted.',13,10,'$'
|
|
db 'You may need to restore from backup or re-install.',13,10,'$'
|
|
.code
|
|
|
|
|
|
|
|
;************************************************************************
|
|
;* *
|
|
;* M A C R O S *
|
|
;* *
|
|
;* prints Given a string ptr in DX, print it to the display. *
|
|
;* *
|
|
;* kill Exit cleanly, using INT 21/4C *
|
|
;* *
|
|
;************************************************************************
|
|
|
|
prints macro text
|
|
mov dx, OFFSET text
|
|
mov ah,9
|
|
int 21h
|
|
endm
|
|
|
|
kill macro
|
|
mov ah,4ch
|
|
int 21h
|
|
endm
|
|
|
|
|
|
|
|
;************************************************************************
|
|
;* *
|
|
;* M A I N E N T R Y *
|
|
;* *
|
|
;* *
|
|
;* *
|
|
;* *
|
|
;* *
|
|
;************************************************************************
|
|
|
|
PUBLIC main
|
|
main PROC NEAR
|
|
|
|
mov ax,ds ; Save memory-block start for freeing
|
|
mov es,ax ; excess memory in a bit.
|
|
|
|
mov ax,@data ; DS points to start of data segment
|
|
mov ds,ax
|
|
|
|
mov cmdcs, ax ; Copy the command line for the emulator
|
|
mov cmdip, OFFSET cmdline
|
|
|
|
mov di, OFFSET cmdline
|
|
mov cx,128
|
|
mov bx,es
|
|
mov dx,ds
|
|
mov es,dx
|
|
mov ds,bx
|
|
mov si,80h
|
|
|
|
rep
|
|
movsb
|
|
|
|
mov es,bx ; Free the excess memory that DOS gives
|
|
mov ds,dx ; us (we need it for the emulator)
|
|
|
|
mov ax,4a00h
|
|
mov bx,090h ; We only need 900h bytes for this program
|
|
int 21h
|
|
jnc freeok
|
|
|
|
prints errstg ; Couldn't free spare space; punt.
|
|
kill
|
|
|
|
;************************************************
|
|
;* Search the command line for -m or -M *
|
|
;************************************************
|
|
freeok:
|
|
mov di,81h ; start of command line tail
|
|
mov si, OFFSET mflag
|
|
mov cx, 2
|
|
|
|
mov bx,81h
|
|
add bl,es:[80h]
|
|
|
|
m1lp: call strcmp
|
|
je fndm
|
|
|
|
add di, 1
|
|
cmp di, bx
|
|
jl m1lp
|
|
|
|
mov di,81h ; start of command line tail
|
|
mov si, OFFSET mmflag
|
|
|
|
m2lp: call strcmp
|
|
je fndm
|
|
|
|
add di, 1
|
|
cmp di, bx
|
|
jl m2lp
|
|
|
|
mov memval,02400000h ; memory value not set--use 35MB total.
|
|
jmp doload
|
|
|
|
fndm: add di,2 ; Found "-m". Now look for a number
|
|
cmp di,bx ; (Make sure it's not end of line)
|
|
jnl nogoodm
|
|
|
|
ok1:
|
|
mov edx, 0 ; Holds the memory-requirement value
|
|
mov ax,0 ; holds characters as we read
|
|
|
|
;************************************************
|
|
;* Skip over spaces/tabs before any number *
|
|
;************************************************
|
|
skiplp:
|
|
mov al, es:[di]
|
|
inc di
|
|
cmp al, 20h ; spaces
|
|
je skiplp
|
|
cmp al, 09h ; tabs
|
|
je skiplp
|
|
cmp di,bx ; make sure we're still in the string
|
|
jle cnvst ; Yup, we've got the first char, so enter
|
|
; the conversion loop part-way down.
|
|
|
|
nogoodm:
|
|
prints nominfo ; no arg to -m, or it's bad; Punt.
|
|
kill
|
|
|
|
;********************************************************
|
|
; Convert the numeric argument to -m; result in edx. *
|
|
;********************************************************
|
|
cnvlp: mov al,es:[di]
|
|
add di, 1
|
|
cnvst: cmp al, 30h
|
|
jl endcnv
|
|
cmp al, 39h
|
|
jg endcnv
|
|
sub al, 30h
|
|
imul dx, 10
|
|
add dx, ax
|
|
jmp cnvlp
|
|
|
|
endcnv:
|
|
cmp edx,0 ; if still 0, no valid chars!
|
|
je nogoodm
|
|
cmp edx, 8 ; must be in the range [8, 32]
|
|
jl nogoodm
|
|
cmp edx,64
|
|
jg nogoodm
|
|
|
|
add edx, 3 ; add 3mb for data areas, etc, and
|
|
sal edx, 20 ; convert to megabytes
|
|
mov memval, edx ; save memory requested
|
|
|
|
;************************************************
|
|
;* Load the real emulator .EXE file, emul.exe *
|
|
;************************************************
|
|
doload: mov dx, OFFSET emulpath
|
|
mov ax, seg envseg
|
|
mov es, ax
|
|
mov bx, OFFSET envseg
|
|
mov ax,4b01h ; load-don't-start
|
|
int 21h
|
|
jnc loadok
|
|
|
|
add ax,ax
|
|
mov si,ax
|
|
prints noload
|
|
mov bx,OFFSET errtbl
|
|
mov dx,ds:[bx+si]
|
|
mov ah,9
|
|
int 21h
|
|
kill
|
|
|
|
loadok: ; Load succeeded.
|
|
mov ah,51h ; get PSP address for child
|
|
int 21h
|
|
mov es, bx ; get segment for DI addressing
|
|
|
|
; mov cx,128 ; copy the command line tail
|
|
; mov di,80h ; (which appears to be flaky in DOS 4)
|
|
; mov si, offset cmdline
|
|
; rep
|
|
; movsb
|
|
|
|
mov eax,retad
|
|
mov dword ptr es:[+0ah], eax ; set up return address.
|
|
|
|
cmp memval, 0 ; If no -m value given, just
|
|
je dorun ; go start the emulator.
|
|
|
|
mov di,0 ; Search for the Intel Extender's PROFILE
|
|
mov si, OFFSET profile ; (see extender.h)
|
|
mov cx, 3 ; (length is 3 bytes)
|
|
|
|
srchlp: call strcmp
|
|
je gotprof ; found the profile; fix it.
|
|
add di, 1
|
|
cmp di, 2048
|
|
jle srchlp
|
|
|
|
prints badexe ; No extender profile, so the emulator
|
|
kill ; EXE must be corrupt. Punt.
|
|
|
|
gotprof:
|
|
mov eax,memval ; Fill in the memory requirement.
|
|
mov es:[di+1bch], eax
|
|
|
|
;********************************************************
|
|
;* *
|
|
;* Set up the stack seg/pointer & start medley. *
|
|
;* *
|
|
;********************************************************
|
|
dorun: lss sp,stk ; load stack SS & SP regs
|
|
mov ax, es ; copy PSP ptr to ax & ds, since some
|
|
mov bx, ds ; code expects it in both places.
|
|
mov fs,bx ; Also, copy DS to FS, so we still have
|
|
mov ds,ax ; a base for the indirect jump . . .
|
|
jmp fs:[csip] ; to start-of-medley.
|
|
|
|
myret: kill ; we get back here, so quit gracefully.
|
|
|
|
main endp
|
|
|
|
|
|
|
|
;************************************************************************/
|
|
;* */
|
|
;* s t r c m p */
|
|
;* */
|
|
;* Compare [ds]di and es:[si] for (CX) characters. If the */
|
|
;* strings are equal, the Zero flag is set when this returns. */
|
|
;* */
|
|
;* All registers are preserved. */
|
|
;* */
|
|
;************************************************************************/
|
|
|
|
strcmp proc near
|
|
cld
|
|
push di
|
|
push si
|
|
push cx
|
|
|
|
repe
|
|
cmpsb
|
|
|
|
pop cx
|
|
pop si
|
|
pop di
|
|
ret
|
|
strcmp endp
|
|
|
|
END
|