mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
288
MPM OPERATING SYSTEMS/MPM II/MPM II SOURCE 2/bdos/bnkbdos1.asm
Normal file
288
MPM OPERATING SYSTEMS/MPM II/MPM II SOURCE 2/bdos/bnkbdos1.asm
Normal file
@@ -0,0 +1,288 @@
|
||||
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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user