Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,514 @@
;*****************************************************
;*
;* BDOS Interface
;*
;*****************************************************
MPM equ true
CPM equ false
cseg
org 0
jmp init ;BDOS initialization
jmp entry ;inter module entry pt.
sysdat dw 0 ;seg address of sysdat
supervisor equ offset $
dw 3
dw 0 ;SUP segment
db 'COPYRIGHT (C) 1981,'
db ' DIGITAL RESEARCH '
serial db '654321'
;====
init:
;====
; initialize bdos/xios modules
; assume ds=system data area
; save sysdat segment
mov sysdat,ds
mov bx,offset supmod ! mov si,supervisor
mov ax,[bx] ! mov cs:[si],ax
mov ax,2[bx] ! mov cs:2[si],ax
; create disk mx queue
mov dx,offset mxdiskqd ! mov cx,f_qmake
call mpmif
; open mx disk queue
mov dx,offset mxdiskqpb ! mov cx,f_qopen
call mpmif
; write mx disk queue
mov dx,offset mxdiskqpb ! mov cx,f_qwrite
call mpmif
retf
;*****************************************************
;*
;* BDOS function table
;*
;*****************************************************
;
; format of entry in functab
;
btab_addr equ word ptr 0
btab_flag equ byte ptr (btab_addr + word)
btablen equ btab_flag + byte
bf_getmx equ 0001h ;get mxdisk queue
BF_CSHELL EQU 0002H ;CONDITIONAL SHELL FUNCTION
BF_TANDW EQU 0004H ;TEST & WRITE FUNCTION
BF_FCB36 EQU 0008H ;SHELL 36 BYTE FCB FLAG
;
; bdos function table
;
functab dw func13 ! db 1 ; 0: disk reset
dw func14 ! db 1 ; 1: select disk
dw func15 ! db 1 ; 2: open file
dw func16 ! db 1 ; 3: close file
dw func17 ! db 1 ; 4: search first
dw func18 ! db 1 ; 5: search next
dw func19 ! db 1 ; 6: delete file
dw func20 ! db 3 ; 7: read sequential
dw func21 ! db 3 ; 8: write sequential
dw func22 ! db 1 ; 9: make file
dw func23 ! db 1 ; 10: rename file
dw func24 ! db 0 ; 11: return login vector
dw func25 ! db 0 ; 12: return current disk
dw func26 ! db 0 ; 13: set dma address
dw func27 ! db 1 ; 14: get alloc addr
dw func28 ! db 1 ; 15: write protect disk
dw func29 ! db 0 ; 16: get r/o vector
dw func30 ! db 1 ; 17: set file attributes
dw func31 ! db 1 ; 18: get disk parm addr
dw func32 ! db 0 ; 19: set/get user code
RDRAN_OFF dw func33 ! db 11 ; 20: read random
WRRAN_OFF dw func34 ! db 11 ; 21: write random
dw func35 ! db 1 ; 22: compute file size
dw func36 ! db 1 ; 23: set random record
dw func37 ! db 1 ; 24: reset drive
dw func38 ! db 1 ; 25: access drive
dw func39 ! db 1 ; 26: free drive
dw func40 ! db 3 ; 27: write random w/zero fill
DW FUNC41 ! DB 13 ; 28: TEST & WRITE RECORD
DW FUNC42 ! DB 1 ; 29: LOCK RECORD
DW FUNC43 ! DB 1 ; 30: UNLOCK RECORD
DW FUNC44 ! DB 0 ; 31: SET MULTI-SECTOR COUNT
DW FUNC45 ! DB 0 ; 32: SET BDOS ERROR MODE
DW FUNC46 ! DB 1 ; 33: GET DISK FREE SPACE
DW FUNC47 ! DB 1 ; 34: CHAIN TO PROGRAM
DW FUNC48 ! DB 1 ; 35: FLUSH BUFFERS
dw func51 ! db 0 ; 36: set dma base
dw func52 ! db 0 ; 37: get dma base
DW FUNC100 ! DB 1 ; 38: SET DIRECTORY LABEL
DW FUNC101 ! DB 1 ; 39: RETURN DIRECTORY LABEL DATA
DW FUNC102 ! DB 1 ; 40: READ FILE XFCB
DW FUNC103 ! DB 1 ; 41: WRITE OR UPDATE FILE XFCB
DW FUNC104 ! DB 1 ; 42: SET CURRENT DATE AND TIME
DW FUNC105 ! DB 1 ; 43: GET CURRENT DATE AND TIME
DW FUNC106 ! DB 1 ; 44: SET DEFAULT PASSWORD
DW FUNC107 ! DB 0 ; 45: RETURN SERIAL NUMBER
DW PR_TERM ! DB 1 ; 46: TERMINATE PROCESS
;=====
entry:
;=====
mov ch,0 ! mov ax,btablen
push dx ! mul cx ! pop dx
mov si,offset functab ! add si,ax
TEST cs:btab_flag[si],bf_getmx ! jz nomx
call getdiskmx ! jmps exit
nomx: call cs:btab_addr[si]
exit: mov ax,bx ! retf
;=========
getdiskmx:
;=========
; si = address of functab entry
; dx = argument
push si! push dx
MOV CX,F_CONSTAT
CALL MPMIF
pop dx! pop si
;do not allow ctrl c while in bdos
mov bx,rlr
mov ax,p_flag[bx] ! and ax,pf_tempkeep
PUSH AX
or p_flag[bx],pf_tempkeep
push si! push dx
mov cx,f_qread ! mov dx,offset mxdiskqpb
call mpmif
pop dx ! pop si
mov bx,rlr! test p_flag[bx],pf_ctlc
jz $+5
jmp retmonx
;switch to internal bdos stack
pushf ! pop ax ! cli
mov sssave,ss
mov spsave,sp
mov ss,sysdat
mov sp,offset bdosstack
push ax ! popf
;initialize bdos data area for user
push si ! push dx
mov ax,u_wrkseg
mov parametersegment,ax
mov ax,u_retseg
mov returnseg,ax
mov bx,rlr ! MOV PDADDR,BX
;set default user code
mov al,p_user[bx] ! mov usrcode,al
;set default disk
mov dl,p_dsk[bx]
MOV SELDSK,DL
;set default dma
mov setbf,false
mov ax,u_dma_ofst
cmp ax,dmaad ! je nodmaoch
mov setbf,true
nodmaoch:
mov ax,u_dma_seg
cmp ax,dmabase ! je nodmabch
mov setbf,true
nodmabch:
;copy uda bdos vars to local area
push es ! push ds ! pop es ! pop ds
mov si,offset u_dma_ofst ! mov di,offset dmaad
mov cx,uda_ovl_len ! rep movs al,al
push es ! push ds ! pop es ! pop ds
TEST PDCNT,1! JZ PDCNT_OK ;RESET PDCNT IF LOW ORDER BIT SET
MOV AL,PDCNT! CALL INC_PDCNT
PDCNT_OK:
pop dx ! push dx
mov info,dx ;info=dx
mov linfo,dl ;linfo = low(info) - don't equ
call entryzero
;Set DMA buffer if needed
cmp setbf,true ! jne nsetbf
call setdata
nsetbf:
;ready to go to the function
pop dx ! pop si
PUSH ES! PUSH DS! POP ES
MOV AH,CS:BTABFLAG[SI]
TEST AH,BF_TANDW ! JNZ SHELL
CMP MULT_CNT,1 ! JE NOSHELL
TEST AH,BF_CSHELL ! JNZ SHELL
NOSHELL:
CALL CALL_BDOS
RETMON:
POP ES
mov si,offset dmaad ! mov di,offset u_dma_ofst
mov cx,uda_ovl_len
rep movs al,al
;setup return registers
mov dx,returnseg
mov u_retseg,dx
mov bx,aret
;switch back to user's stack
pushf ! pop dx ! cli
mov ss,sssave
mov sp,spsave
push dx ! popf
;release mxdisk queue
RETMONX:
push bx
mov cx,f_qwrite ! mov dx,offset mxdiskqpb
call mpmif
;see if control c occured
mov si,rlr
pop bx! pop ax! not ax
xor ax,pf_tempkeep! and p_flag[si],ax
test p_flag[si],pf_ctlc
jz mxdiskexit
mov cx,f_terminate ! push bx
sub dx,dx ! call mpmif
pop bx
mxdiskexit:
ret
;
SHELL:
MOV SHELL_SI,SI
MOV BX,DMAAD! MOV SHELL_DMA,BX
MOV BX,OFFSET SHELL_RTN! PUSH BX
TEST AH,BF_FCB36! JNZ SHELL01
CALL PARSAVE33! JMP SHELL02
SHELL01:
CALL PARSAVE36! CALL SAVE_RR
SHELL02:
MOV SHELL_FLAG,TRUE
TEST AH,BF_TANDW! JNZ TST_WRT
JMP MULTIO
;
CBDOS:
MOV SI,SHELL_SI
CBDOS1:
MOV DX,INFO
CALL CALL_BDOS! MOV AL,BYTE PTR ARET! RET
;
SHELL_ERR:
MOV BX,ARET
MOV DL,MULT_CNT! POP AX! SUB DL,AL
MOV CL,4! SHL DL,CL! OR BH,DL
RET
;
SHELL_RTN:
MOV ARET,BX
TEST AH,BF_FCB36! JZ $+5! CALL RESET_RR
MOV BX,SHELL_DMA! MOV DMAAD,BX! CALL SET_DATA
MOV SHELL_FLAG,FALSE! CALL PARUNSAVE
JMP RETMON
;
INCR_RR:
CALL GET_RRA
INC W[BX]! JNZ INCR_RR_RET
INC BX! INC BX! INC B[BX]
INCR_RR_RET:
RET
;
SAVE_RR:
CALL SAVE_RR2! XCHG BX,DX
SAVE_RR1:
MOV CL,3! JMP MOVE
SAVE_RR2:
CALL GET_RRA! MOV DX,OFFSET SHELL_RR! RET
;
RESET_RR:
CALL SAVE_RR2! JMP SAVE_RR1
;
TST_WRT:
MOV AL,MULT_CNT! PUSH AX
CALL SET_DIR! POP AX
TST_WRT1:
PUSH AX! MOV SI,OFFSET RDRAN_OFF! CALL CBDOS1
OR AL,AL! JNZ SHELL_ERR
CALL COMPARE_RECS
CALL INCR_RR
ADD DMAAD,80H
POP AX! DEC AL! JNZ TST_WRT1
PUSH AX! CALL SET_DATA
CALL RESET_RR
MOV SHELL_SI,OFFSET WRRAN_OFF
POP AX
;
MULT_IO:
MOV AL,MULT_CNT
MULT_IO1:
PUSH AX! CALL CBDOS
OR AL,AL! JZ $+5! JMP SHELL_ERR
POP AX! PUSH AX! TEST AH,BF_FCB36! JZ MULT_IO2
CALL INCR_RR
MULT_IO2:
ADD DMAAD,80H! CALL SET_DATA
POP AX! DEC AL! JNZ MULT_IO1
XOR BX,BX
RET
;
COMPARE_RECS:
PUSH ES! MOV ES,DMABASE! MOV DI,DMAAD
MOV SI,BUFFA! MOV CL,64
REP CMPS AX,AX
POP ES
JNZ $+3! RET
POP BX! MOV BX,7! JMP SHELL_ERR
;
CALL_BDOS:
MOV SAVESP,SP
call cs:btab_addr[si]
BDOS_RETURN:
MOV AL,SELDSK
cmp resel,0
JE RETMON5
CMP COMP_FCB_CKS,TRUE! JNE RETMON1
CALL SET_CHKSUM_FCB
RETMON1:
MOV AL,XFCB_READ_ONLY! OR AL,AL! JZ RETMON2
MOV BX,INFO! OR 7[BX],AL
RETMON2:
CALL GETEXTA! MOV AL,HIGHEXT! CMP AL,60H! JNE RETMON3
SUB BX,4! MOV AL,80H
RETMON3:
OR [BX],AL
MOV AL,ACTUAL_RC! OR AL,AL! JZ RETMON4
CALL GETRCNTA! OR [BX],AL
RETMON4:
MOV AL,SELDSK
mov cl,fcbdsk
mov bx,info ! mov [bx],cl
cmp cl,0 ! je RETMON5
mov al,olddsk
RETMON5:
cmp parcopfl,true
jne RETMON6
call parunsave
RETMON6:
;copy local vars to uda
RET
;
XCRLF: mov cx,F_CONPRINT
mov dx,offset crlfstr
XOR BX,BX
jmp mpmif
;
XPRINT: mov dx,cx ! mov cx,F_CONPRINT
XOR BX,BX
jmp mpmif
;
parsave: ;copy parameterblock from user segment to bdos segment
;cl-reg = lenght of parameter block
;
TEST SHELL_FLAG,TRUE
JNZ PARRET
push ds
push ax
mov parcopfl,true
mov parlg,cl
xor ch,ch
mov si,info
mov infosave,si
mov di,offset loc_par_area
mov info,di
mov ds,parametersegment
rep movs al,al
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
;
TEST SHELL_FLAG,TRUE
JNZ PARRET
push es
push ax
push cx
mov cl,parlg
xor ch,ch
mov es,parametersegment
mov si,offset loc_par_area
mov di,infosave
mov info,di
rep movs al,al
pop cx
pop ax
pop es
ret
;these functions taken out of the
;bdosio.a86 module
setlret1: mov al,1
staret: mov lret,al
funcret: ret
;these functions added for mpm interface
;=====
mpmif:
;=====
; call mpm function
MOV SI,RLR
PUSH ES
MOV ES,P_UDA[SI]
callf cs:dword ptr .supervisor
POP ES
ret
entryzero:
;---------
push cx ! push es
mov cx,ds ! mov es,cx
mov cx,zerolength ! mov al,0
mov di,offset fcbdsk
rep stos al
pop es ! pop cx
ret
;*****************************************************
;*
;* bdos - xios interface
;*
;*****************************************************
bootf:
wbootf: mov cx,f_terminate ! jmp mpmif
homef: mov al,io_home ! jmps xiosif
seldskf:mov al,io_seldsk ! jmps xiosif
settrkf:mov al,io_settrk ! jmps xiosif
setsecf:mov al,io_setsec ! jmps xiosif
setdmf: mov al,io_setdma ! jmps xiosif
setdmbf:mov al,io_setdmab ! jmps xiosif
readf: mov al,io_read ! jmps xiosif
writef: mov al,io_write ! jmps xiosif
sectran:mov al,io_sectran ! jmps xiosif
flush: mov al,io_flush ! jmps xiosif
;====== ========================
xiosif: ; xios interface routine
;====== ========================
; input: al = function number
; cx = argument 1
; dx = argument 2
; output: ax = bx = output
MOV SI,RLR! PUSH ES! MOV ES,P_UDA[SI]
callf dword ptr .xiosmod
CLD! POP ES
ret