Files
Digital-Research-Source-Code/MPM OPERATING SYSTEMS/MPM-86/MPM-86 2.0 SOURCES/04/LBDOSENT.A86
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

212 lines
6.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;******************** BDOS entry module ********************
;
; Perform branching, error handling and special
; 8086 stuff.
;
;
cseg cpmsegment
org bdosoffset
;
db 0,0,0,0,0,0
;
; enter here from the user's program with function number in cl,
; and information address in dx
;
JMP bdose ;past parameter block
;
; ************************************************
; *** relative locations 0009 - 000e ***
; ************************************************
pererr dw persub ;permanent error subroutine
seler dw selsub ;select error subroutine
roderr dw rodsub ;ro disk error subroutine
rofer dw rofsub ;ro file error subroutine
;
;
bdose: ;arrive here from user progs
mov axsave,ax ;switch stack segment
mov SS_save,ss
mov SP_save,sp
mov ax,cs
; add ax,(bdosoffset+bdoscodesize)/16
mov ss,ax
lea sp,endstack
;
;pick up parameter segment
mov ax,ds
;
push ds ;save registers
push es
push bp
push di
push si
;
push ss ;switch to local segment registers
push ss
pop es
pop ds
;
mov parametersegment,ax
mov ax,axsave
;
call oldbdos ;call 8080 BDOS
;
pop si ;unsave 8086 registers
pop di
pop bp
pop es
pop ds
;
;switch back to entry stack
mov sp,SP_save
mov ss,SS_save
iret ; return from interrupt
;
;
oldbdos: ;8080 bdos entry point
MOV info,dx ;info=dx
MOV linfo,dl ;linfo = low(info) - don't equ
MOV aret,0 ;return value defaults to 0000
mov parcopfl,false ;set true if parameter
;block copied from user
; MOV entsp,sp ;entsp = stackptr
; LEA sp,lstack ;local stack setup
XOR AL,AL
MOV fcbdsk,AL
MOV resel,AL ;fcbdsk,resel=false
MOV BX,offset goback ;common return point
PUSH BX ;jmp goback equivalent to ret
CMP cl,nfuncs80
jb branch
sub cl,sfunc86-nfuncs80
cmp cl,nfuncs
jb branch
RET
; ;skip if invalid #
branch: MOV bl,cl
mov bh,0
MOV CL,DL ;possible output char. to CL
add bx,bx ;branch
jmp cs:functab[bx]
;
; dispatch table for functions
;
functab dw wbootf,func1,func2,func3
dw punchf,listf,func6,func7
dw func8,func9,func10,func11
diskf equ 12 ;beginning of disk functions
dw func12,func13,func14,func15
dw func16,func17,func18,func19
dw func20,func21,func22,func23
dw func24,func25,func26,func27
dw func28,func29,func30,func31
dw func32,func33,func34,func35
dw func36,func37,func38,func39
dw func40
dw func50,func51,func52,func53 ;8086 functions
dw func54,func55,func56,func57
nfuncs80 equ 41 ;number of 8080 functions
sfunc86 equ 50 ;start number for 8086 functions
nfuncs equ 49 ;total number of BDOS functions
;
;
; error subroutines
persub: ;report permanent error
LEA BX,permsg
CALL errflg ;to report the error
CMP AL,ctlc
jnz parret ;rnz
JMP wbootf
;reboot if response is ctlc
;and ignore the error
;
selsub: ;report select error
LEA BX,selmsg
JMPS waiterr ;wait console before boot
;
rodsub: ;report write to R/O disk
LEA BX,rodmsg
JMPS waiterr
;
rofsub: ;report read/only file
LEA BX,rofmsg ;wait for console
;
waiterr:
;wait for response before boot
CALL errflg
JMP wbootf
;
errflg:
;report error to console,
;message address in BX
PUSH BX
CALL crlf ;stack mssg address, new line
MOV AL,curdsk
ADD AL,'A'
MOV dskerr,AL ;current disk name
LEA CX,dskmsg
CALL print ;the error message
POP CX
CALL print ;error mssage tail
jmp coninf ;jump to input character
;note: conin is now coninf for cpm loader, goes to bios
;
parsave:
;copy parameterblock from user segment to BDOS segment
;CL-reg = lenght of parameter block
;
push ds
push ax
push cx
mov parcopfl,true
mov parlg,cl
xor ch,ch
mov si,info
mov infosave,si
lea di,loc_par_area
mov info,di
mov ds,parametersegment
rep movs al,al
pop cx
pop ax
pop ds
parret: ret
;
parsave33:
;copy 33 byte length parameterblock
push cx
mov cl,33
jmps pscommon
;
parsave36:
;copy 36 byte length parameterblock
push cx
mov cl,36
pscommon:
call parsave
pop cx
ret
;
parunsave:
;copy local parameter block to user segment
;
push es
push ax
push cx
mov cl,parlg
xor ch,ch
mov es,parametersegment
lea si,loc_par_area
mov di,infosave
mov info,di
rep movs al,al
pop cx
pop ax
pop es
ret
;
;
;***************** end BDOS entry module ****************
end