Files
Digital-Research-Source-Code/MPM OPERATING SYSTEMS/MPM II/MPM II SOURCE/NUCLEUS/BNKBDOS1.ASM
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

288 lines
6.8 KiB
NASM
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.

title 'Non-Resident Portion of Banked BDOS'
cseg
;***************************************************************
;***************************************************************
;** **
;** B a s i c D i s k O p e r a t i n g S y s t e m **
;** **
;** N o n - R e s i d e n t P o r t i o n **
;** B a n k e d B D O S **
;** **
;***************************************************************
;***************************************************************
;/*
; Copyright (C) 1978,1979,1980,1981
; Digital Research
; P.O. Box 579
; Pacific Grove, CA 93950
;
; Revised:
; 14 Sept 81 by David K. Brown
;*/
on equ 0ffffh
off equ 00000h
MPM EQU ON
MPMENV EQU ON
BNKBDOS EQU ON
ctlc equ 03h ;control-c
cr equ 0dh ;carriage return
lf equ 0ah ;line feed
;
; BDOS call equates
dskinit equ 13
dskslct equ 14
dsksetDMA equ 26
setusercode equ 32
;
; Process Descriptor Offsets
pname equ 6
console equ 14
memseg equ 15
thread equ 18
disksetDMA equ 20
diskselect equ 22
diskparams equ 23
MULT$CNT$OFF EQU 50
PD$CNT$OFF EQU 51
;
; System Data Page Offsets
userstackflag equ 3
brkvctr equ 48
usrstkregion equ 80
;
;
; MP/M Data Page Offsets
rlros equ 5
thrdrt equ 17
msegtbl equ 150
;
;**************************************************
;* *
;**************************************************
;
org 0000h
base equ $
jmp bnkbdose
JMP BNKBDOSINIT
JMP REMOVE$FILES
XDMAAD: DW $-$
SYSDAT: DW $-$
BUFFA: DW $-$
bnkbdosinit:
pop h! push h! inx h! inx h! inx h
lxi d,extjmptbl! mvi c,24! xchg
CALL MOVE
;INITIALIZE OPEN FILE AND LOCKED RECORD LIST
LHLD SYSDAT! MVI L,187
MOV A,M! STA LOCK$MAX! INX H
MOV A,M! STA OPEN$MAX
INX H! MOV E,M! INX H! MOV D,M! INX H
PUSH D
MOV E,M! INX H! MOV D,M! XCHG! SHLD FREE$ROOT
POP D! DCX D! LXI B,10
ILIST:
PUSH D
MOV D,H! MOV E,L! DAD B! XCHG
MOV M,E! INX H! MOV M,D! XCHG
POP D! DCX D! MOV A,D! ORA E! JNZ ILIST
MOV M,A! DCX H! MOV M,A! RET
extjmptbl:
reboot: jmp $-$
rlr: jmp $-$
rlradr: jmp $-$
dsplynm: jmp $-$
xprint: jmp $-$
xcrlf: jmp $-$
conoutx: jmp $-$
getmemseg: jmp $-$
;
;************************************************
;* *
;************************************************
;
bnkbdose:
push d! push b
LXI H,DELETED$FILES
DI
MOV A,M! ORA A! MVI M,0
EI
CNZ DELETE$FILES
;perform the necessary BDOS parameter initialization
;disk set DMA
call rlr! SHLD PDADDR
lxi b,disksetDMA! dad b
mov e,m! inx h! mov d,m! push h! xchg! shld dmaad
mov b,h! mov c,l! call setdmaf
;disk select
pop h! inx h
mov a,m! rrc! rrc! rrc! rrc! ani 0fh! STA SELDSK
;set user code
mov a,m! ani 0fh! STA USRCODE
;copy local disk params
inx h! push h! lxi d,dcnt
XCHG! MVI C,2! CALL MOVE
LXI H,SEARCHL! LDAX D! MOV M,A
LXI H,MULT$CNT$OFF-DISKPARAMS-2! DAD D
MOV A,M! STA MULT$CNT
INX H! MOV A,M! ANI 0F0H! CMP M! JZ BNKBDOS1
ADI 10H! MOV M,A
BNKBDOS1:
STA PDCNT
;perform requested BDOS function
pop h! pop b! pop d! push h
call bdose
;save results
pop d! push h ; save results in HL
;copy disk params
lxi h,dcnt
XCHG! MVI C,2! CALL MOVE
LXI D,SEARCHL! LDAX D! MOV M,A
;return to non-banked bdos, will restore calling bank
; and release disk mutual exclusion message
pop h! ret
bdose:
xchg! shld info! xchg ;save parameter
mov a,e! sta linfo ;linfo = low(info) - don't equ
lxi h,0! shld aret ;return value defaults to 0000
SHLD RESEL ; RESEL,FCBDSK = 0
SHLD COMP$FCB$CKS ; COMP$FCB$CKS,SEARCH$USER0 = 0
SHLD MAKE$XFCB ; MAKE$XFCB,FIND$XFCB = 0
DAD SP! SHLD ENTSP ; SAVE STACK POSITION
lxi h,goback! push h ;fake return address
;compute disk function code address
mov a,c! STA FX! mov c,e! mov b,d
CPI NFUNCS+12! JNC HIGH$FXS
LXI H,DISKF-24! JMP BDOS$JMP
HIGH$FXS:
LXI H,XDISKF-200
BDOS$JMP:
mov e,a! mvi d,0 ;DE=func, HL=.diskf-24
dad d! dad d! mov e,m! inx h! mov d,m ;DE=functab(func)
LHLD INFO ;INFO IN DE FOR LATER EXCHANGE
xchg! pchl ;dispatched
;
; dispatch table for disk functions
diskf:
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,FUNC41,FUNC42,FUNC43
DW FUNC44,FUNC45,FUNC46,FUNC47
DW FUNC48,FUNC49,FUNC50
nfuncs equ ($-diskf)/2
XDISKF:
DW FUNC100,FUNC101,FUNC102,FUNC103
DW FUNC104,FUNC105,FUNC106,FUNC107
PERERR: DW PERSUB ;PERMANENT ERROR SUBROUTINE
RODERR: DW RODSUB ;RO DISK ERROR SUBROUTINE
ROFERR: DW ROFSUB ;RO FILE ERROR SUBROUTINE
SELERR: DW SELSUB ;SELECT ERROR SUBROUTINE
;
; error subroutines
PERSUB:
;report permanent error
lxi h,permsg! jmp report$err ;to report the error
;
SELSUB:
;report select error
lxi h,selmsg! jmp report$err ;wait console before boot
;
RODSUB:
;report write to read/only disk
lxi h,rodmsg! jmp report$err ;wait console
;
ROFSUB:
;report read/only file
lxi h,rofmsg ;drop through to wait for console
;
report$err:
;report error to console, message address in HL
push h ;stack msg address
;set D=console #
call rlr! lxi d,console! dad d! mov d,m
call xcrlf ;new line
LDA SELDSK! adi 'A'! sta dskerr ;current disk name
lxi b,dskmsg! call xprint ;the error message
pop b! call xprint ;error mssage tail
lda fx! mvi b,30h
lxi h,pr$fx1
cpi 100! jc rpt$err1
mvi m,31h! inx h! sui 100
rpt$err1:
sui 10! jc rpt$err2
inr b! jmp rpt$err1
rpt$err2:
mov m,b! inx h! adi 3ah! mov m,a
inx h! mvi m,20h
lxi h,pr$fcb! mvi m,0
lda resel! ora a! jz rpt$err3
mvi m,20h! push d
lhld info! inx h! xchg! lxi h,pr$fcb1
mvi c,8! call move! mvi m,'.'! inx h
mvi c,3! call move! pop d
rpt$err3:
call xcrlf
lxi b,pr$fx! call xprint
CALL GET$MEM$SEG
ORA A! JZ RTN$PHY$ERRS
INR A! JZ RTN$PHY$ERRS
LXI D,PNAME+5! CALL TEST$ERROR$MODE1! JNZ RTN$PHY$ERRS
jmp reboot ;terminate process
;ret
xerr$list:
dw xe3,xe4,xe5,xe6,xe7,xe8,xe9,xe10,xe11
xe3: db 'File Opened in Read/Only Mode',0
xe4: db 0
xe5: db 'File Currently Open',0
xe6: db 'Close Checksum Error',0
xe7: db 'Password Error',0
xe8: db 'File Already Exists',0
xe9: db 'Illegal ? in FCB',0
xe10: db 'Open File Limit Exceeded',0
xe11: db 'No Room in System Lock List',0
pr$fx: db 'Bdos Function: '
pr$fx1: db ' '
pr$fcb: db ' File: '
pr$fcb1:ds 12
db 0
fx: ds 1