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,653 @@
; DISK OPERATING SYSTEM
; OF CP/NET NOS NO DISK OPERATION
;
; 1982.8.30. FOR NOS
;
TITLE BASIC OPERATING SYSTEM FOR NOS CP/NET SYSTEM
;
; EQUATIONS OF SYSTEM POINTER IN LOWER ADDRESS
;
RBOOT EQU 0 ;SYSTEM REBOOT ENTRY
IOSTS EQU 3 ;I/O STATUS
CDISK EQU 4 ;CURRENT DISK & USER CODE
ENBDS EQU 5 ;BDOS ENTRY
SYSDM EQU 80H ;SYSTEM DMA ADDRESS
;
; BDOS USER CODE AREA
;
BDOS:
DB 0,0,0,0,0,0
;
BDOSS: ;ENTRY OF BDOS FROM +6
JMP BDOST
;
; ERROR PROCESS ROUTINE TABLE
;
AFLRW: DW EFLRW ;DISK READ WRITE ERROR
ADRIV: DW EDRIV ;DISK SELECT ERROR
ADKCG: DW EDKCG ;R/O DISK ERROR
ADKCH: DW EDKCH ;R/O FILE ERROR
;
; MAIN ROUTINE OF BDOS
; INPUT
; C:NUMBER OF BDOS FUNCTION
; DE:PARAMETER OF INPUT
; OUTPUT
; A:PARAMETER OF OUTPUT WHEN ONE BYTE OR LOWER DATA
; B:PARAMETER OF OUTPUT HIGHER DATA WHEN DOUBLE BYTES
; HL:PARAMETER OF DOUBLE BYTES
;
BDOST:
XCHG
SHLD INPAR ;SAVE INPUT PARAMETER
XCHG
LXI H,0
SHLD OTPAR ;CLEAR OUTPUT PARAMETERS
DAD SP
SHLD INSTK ;SAVE STACK POINTER
LXI SP,STACK ;SET BDOS STACK
LXI H,BDOSE ;END OF ROUTINE
PUSH H ;SAVE RETURN ADDRESS
MOV A,C
CPI 41
RNC ;CALL NUMBER OVER
MOV C,E ;SAVE ONE BYTE DATA
LXI H,MINDX ;MAIN INDEX OF FUNCTION
MOV E,A
MVI D,0
DAD D
DAD D
MOV E,M
INX H
MOV D,M ;GET ROUTINE ADDRESS
LHLD INPAR ;GET INPUT PARAMETER
XCHG
PCHL ;TO EACH ROUTINE
;
; MAIN INDEX OF BODS FUNCTIONS
;
MINDX:
DW WBOOT ;BOOT 0
DW MCNIN ;CONSOLE INPUT
DW MCNOT ;CONSOLE OUTPUT
DW MREAD ;READER INPUT
DW PUNCH ;PUNCHER OUTPUT
DW LIST ;LIST OUTPUT 5
DW MDCIO ;DIRECT CONSOLE I/O
DW MGIOB ;GET I/O BYTE
DW MSIOB ;SET I/O BYTE
DW MBFPR ;PRINT STRING
DW MBFRD ;READ CONSOLE BUFFER 10
DW MSNCN ;GET CONSOLE STATUS
DW MVSNM ;GET VERSION NUMBER
DW MSNCR ;INITIALIZE
DW MDVSL ;SELECT DRIVE
DW MDKDUM ;OPEN FILE 15
DW MDKDUM ;CLOSE FILE
DW MDKDUM ;SEARCH FILE
DW MDKDUM ;SEARCH FOR NEXT
DW MDKDUM ;DELETE FILE
DW MDKDUM ;READ SEQUENTIAL 20
DW MDKDUM ;WRITE SEQUENTIAL
DW MDKDUM ;MAKE FILE
DW MDKDUM ;RENAME FILE
DW MSNCR ;GET LOG-IN VECTOR
DW MSNCR ;GET CURRENT DRIVE 25
DW MSNCR ;SET DMA ADDRESS
DW MDKDUM ;GET ALLOCATION MAP POINT
DW MDKDUM ;SET WRITE PROTECT FLAG
DW MDKDUM ;GET WRITE PROTECT FLAG ADDRESS
DW MDKDUM ;SET FILE ATTRIBUTES 30
DW MDKDUM ;GET DISK PARAMETER ADDRESS
DW MUSER ;SET OR GET USER CODE
DW MDKDUM ;READ RANDOM
DW MDKDUM ;WRITE RANDOM
DW MDKDUM ;COMPUTE FILE SIZE 35
DW MDKDUM ;GET RANDOM RECODE
DW MDKDUM ;RESET DRIVE
DW MSNCR ;NOT USE
DW MSNCR ;NOT USE
DW MDKDUM ;WRITE RANDOM WITH FILL ZERO 40
;
; ERROR COMMENT OUT ROUTINES
;
; DISK READ WRITE ERROR
;
EFLRW:
LXI H,CFLRW
CALL ERPRN ;"BDOS ERR ON "X": BAD SECTOR"
CPI 03H ;CONTROL-C "REBOOT CODE"
JZ RBOOT ;TO REBOOT
RET
;
; DISK SELECT ERROR
;
EDRIV:
LXI H,CDRIV ;"SELECT"
JMP EDKCH+3
;
; READ ONLY ERROR
;
EDKCG:
LXI H,CDKCG ;"R/O"
JMP EDKCH+3
EDKCH:
LXI H,CDKCH ;"FILE R/O"
CALL ERPRN ;"BDOS ERR ON "X": ..."
LXI H,CDISK
MOV A,M
ANI 0F0H
MOV M,A ;TO DISK A:
JMP RBOOT ;TO REBOOT
;
; ERROR COMMENT CODES
;
CERPN: DB 'Bdos Err On : $'
CFLRW: DB 'Bad Sector$'
CDRIV: DB 'Select$'
CDKCH: DB 'File '
CDKCG: DB 'R/O$'
;
; ERROR COMMENT OUT & KEY RESPONSE WAIT
; INPUT
; HL:ADDRESS OF COMMENT
;
ERPRN:
PUSH H ;SAVE COMMENT INDEX
CALL CRLF ;CARRIAGE RETURN & LINE FEED
LDA NDRIV ;DRIVE NUMBER
ADI 'A'
STA CERPN+12 ;SET CODE TO COMMENT
LXI B,CERPN
CALL BFPRN ;"BDOS ERR ON "X": "
POP B
CALL BFPRN ;PRINT EACH COMMENT
;
; CONSOLE I/O ROUTINES
;
; CONSOLE INPUT WITH CONSOLE INTERRUPT CODE CHECK
; OUTPUT
; A:CODE OF INPUT
;
CONSI:
LXI H,INCON ;CONSOLE INTERRUPT CODE
MOV A,M ;GET CODE
MVI M,0 ;CLEAR CODE
ORA A
RNZ ;NOW CODE HAS BEEN SET
JMP CONIN ;TO NORMAL CONSOLE INPUT
;
; CONSOLE INPUT WITH CONTROL CODE TREATMENT
;
CONCI:
CALL CONSI ;CONSOLE INPUT
CALL CONCK ;CONTROL CODE CHECK
RC ;CONTROL CODE
PUSH PSW ;NORMAL CODE
MOV C,A
CALL PRINS ;PRINT WITH TAB TREATMENT
POP PSW
RET
;
; CONTROL CODE CHECK EXCEPT CR,LF,HTAB,BACK SPACE
; INPUT
; A:CODE
; OUTPUT
; CF:ON CONTROL CODE
;
CONCK:
CPI 0DH ;CARRIAGE RETURN
RZ
CPI 0AH ;LINE FEED
RZ
CPI 09H ;HORIZONTAL TAB
RZ
CPI 08H ;BACK SPACE
RZ
CPI 20H ;SPACE
RET
;
; CONSOLE INTERRUPT CHECK ROUTINE
; OUTPUT
; A:0=NO INTERRUPT, 1=INTERRUPTED & CODE IS IN "INCON"
;
CONIT:
LDA INCON ;CONSOLE INTERRUPT CODE
ORA A
JNZ CONIG+3 ;NOW INTERRUPTED
CALL CONST ;GET STATUS
ANI 1 ;CHECK READY
RZ ;NO INPUT
CALL CONIN ;GET INPUT
CPI 13H ;CONTROL-S "FREEZE"
JNZ CONIG
CALL CONIN ;FREEZE THE SYSTEM TO NEXT INPUT
CPI 03H ;CONTROL-C "REBOOT"
JZ RBOOT ;NOW REBOOT
XRA A ;NOW CODE IS IGNORED
RET
CONIG: ;GET CODE
STA INCON ;SET CODE
MVI A,1 ;SET FLAG OF GETTING
RET
;
; PRINT TO CONSOLE WITH CONSOLE INTERRUPT CHECK
; INPUT
; C:PRINT CODE
;
PRINT:
LDA ECHKL ;GET ECHO KILL MODE
ORA A
JNZ PRINK ;NOW ECHO KILL
PUSH B
CALL CONIT ;CHECK CONSOLE INTERRUPT
POP B ;GET PRINT CODE
PUSH B
CALL CONOT ;CONSOLE OUT THE CHARACTER
POP B ;GET PRINT CODE
PUSH B
LDA OTLST ;GET LIST OUT MODE
ORA A
CNZ LIST ;LIST OUT
POP B
PRINK:
MOV A,C
LXI H,PCARI ;CARRIAGE POSITION
CPI 7FH
RZ ;DELETE CODE
INR M ;UP THE CARRIAGE POSITION
CPI 20H
RNC ;NOW PRINTING CHARACTER
DCR M ;CONTROL CODE
MOV A,M
ORA A
RZ
MOV A,C
CPI 08H ;BACK SPACE
JNZ $+5
DCR M
RET
CPI 0AH ;LINE FEED
RNZ ;NOT LINE FEED
MVI M,0 ;RESET THE COUNTER
RET
;
; PRINT WITH CONTROL CODE VISIBLE
; INPUT
; C:CODE
;
PRINC:
MOV A,C
CALL CONCK ;CONTROL CODE CHECK
JNC PRINS ;NORMAL CODE
PUSH PSW ;CONTROL CODE
MVI C,5EH ;UPER ARROW IS CONTROL CODE MARK
CALL PRINT
POP PSW
ORI 40H ;MAKE TO VISIBLE CODE
MOV C,A
;
; 2:CONSOLE OUTPUT
;
MCNOT:
PRINS:
MOV A,C
CPI 09H ;HORIZONTAL TAB
JNZ PRINT ;OTHER CODE
MVI C,20H
CALL PRINT ;SPACE PRINT
LDA PCARI
ANI 07H ;CHECK CARRIAGE POSITION
JNZ $-10 ;TO TAB LOOP
RET
;
; BACK SPACE WITH ERASE ON CRT
;
BACKS:
CALL BACK
MVI C,20H
CALL CONOT ;ERASE
BACK:
MVI C,08H
JMP CONOT
;
; PRINT "#" & CRLF
;
NCRLF:
MVI C,23H ;"#"
CALL PRINT
CALL CRLF
NCRLL:
LDA PCARI ;GET CARIAGE POSITION
LXI H,PPROM
CMP M
RNC
MVI C,20H
CALL PRINT
JMP NCRLL
;
; CARIAGE RETURN & LINE FEED
;
CRLF:
MVI C,0DH ;CARRIAGE RETURN
CALL PRINT
MVI C,0AH ;LINE FEED
JMP PRINT
;
; BUFFERED CHARACTER PRINT END BY "$"
; INPUT
; BC:BUFFER TOP ADDRESS
;
BFPRN:
LDAX B ;GET CODE
CPI 24H ;"$"
RZ ;END CODE
INX B
PUSH B
MOV C,A
CALL PRINS ;PRINT WITH TAB TREATMENT
POP B
JMP BFPRN ;TO NEXT CODE
;
; 10:READ CONSOLE BUFFER
;
MBFRD:
LDA PCARI
STA PPROM ;SET PROMPT POSITION
LHLD INPAR ;GET CHARACTER BUFFER
MOV C,M ;GET MAXIMUM BUFFER LENGTH
INX H
PUSH H ;SAVE POINTER OF CURRENT LENGTH COUNTER
MVI B,0 ;RESET COUNTER
STREL: ;ONE CHARACTER LOOP
PUSH B
PUSH H
CALL CONSI
POP H
POP B
CPI 0DH ;CARIAGE RETURN
JZ STREE ;GET END CODE
CPI 0AH ;LINE FEED
JZ STREE ;GET END CODE
CPI 08H ;BACK SPACE
JNZ STREK
MOV A,B
ORA A
JZ STREL ;COUNT IS ZERO
DCR B
LDA PCARI
STA ECHKL ;SET ECHO KILL COUNT
JMP STREI
STREK:
CPI 7FH ;RUBOUT IS LAST CHARACTER DELETE
JNZ STREA
MOV A,B
ORA A ;COUNTER CHECK
JZ STREL ;THERE IS NO CHARACTER
MOV A,M ;GET LAST CODE
DCR B ;DOWN OF POINTER & COUNTER
DCX H
JMP STRES ;TO PRINT
STREA:
CPI 05H ;CONTROL-E "ONLY LINE CHANGE"
JNZ STREB
PUSH B
PUSH H
CALL CRLF ;LINE CHANGE
XRA A
STA PPROM ;PROMPT POSITION TOP
JMP STREL+2 ;TO NEXT READ
STREB:
CPI 10H ;CONTROL-P "LIST MODE CHANGE"
JNZ STREC
PUSH H
LXI H,OTLST ;LIST OUT MODE
MVI A,01H
SUB M ;CHANGE LIST OUT MODE
MOV M,A
POP H
JMP STREL ;TO NEXT
STREC:
CPI 18H ;CONTROL-X CANCEL OF NOW SET
JNZ STREY
POP H
STREX: ;CANSEL BY ERASE
LDA PPROM ;PROMPT POSITION
LXI H,PCARI
CMP M
JNC MBFRD ;NOW TO TOP
DCR M
CALL BACKS ;ERASE BACK
JMP STREX ;ERASE LOOP
STREY:
CPI 15H ;CONTROL-U "CANCEL OF NOW SET"
JNZ STREF
CALL NCRLF ;"#" & CR,LF
POP H
JMP MBFRD ;TO START POINT
STREF:
CPI 12H ;CONTROL-R "CHANGE LINE & PRINT LEFT CODES"
JNZ STREN ;NORMAL CODE
STREI:
PUSH B
CALL NCRLF ;"#" & CR,LF
POP B
POP H ;GET POINTERS
PUSH H
PUSH B
STREG: ;PRINT LEFT CODES
MOV A,B ;COUNT OF LEFT CODE
ORA A
JZ STREH ;END OF PRINT
INX H
MOV C,M ;GET CODE
DCR B
PUSH B
PUSH H
CALL PRINC ;PRINT WITH CONTROL CODE VISIBLE
POP H
POP B
JMP STREG ;TO NEXT CHARACTER PRINT
STREH:
PUSH H
LDA ECHKL
ORA A
JZ STREL+2 ;NORMAL MODE
LXI H,PCARI
SUB M
STA ECHKL
CALL BACKS ;BACK TO LAST POSITION
LXI H,ECHKL
DCR M
JNZ $-7
JMP STREL+2
STREN: ;NORMAL CODES
INX H
MOV M,A ;SET CODE & POINTER UP
INR B ;COUNTER UP
STRES: ;ECHO PRINT
PUSH B
PUSH H
MOV C,A
CALL PRINC ;PRINT WITH CONTROL CODE VISIBLE
POP H
POP B
MOV A,M
CPI 03H ;CONTROL-C "REBOOT"
MOV A,B
JNZ $+8
CPI 01H ;THE FIRST CODE
JZ RBOOT ;TO REBOOT
CMP C
JC STREL ;TO NEXT READ
STREE:
POP H ;BUFFER FULL OR CR END
MOV M,B
MVI C,0DH
JMP PRINT ;PRINT CARRIAGE RETURN & END
;
; 1:CONSOLE INPUT
;
MCNIN:
CALL CONCI ;CONSOLE INPUT
JMP MOPST
;
; 3:READER INPUT
;
MREAD:
CALL READR ;READ ONE BYTE
JMP MOPST
;
; 6:DIRECT CONSOLE I/O
; INPUT
; C:-1 INPUT -2 GET STATUS OTHER OUTPUT
;
MDCIO:
MOV A,C
INR A
JZ MDCIS ;INPUT MODE
INR A
JZ CONST ;STATUS READ
JMP CONOT ;DIRECT OUT
MDCIS:
CALL CONST
ORA A
JZ BDOSE ;NOT READY
CALL CONIN ;CONSOLE INPUT
JMP MOPST
;
; 7:GET I/O BYTE
;
MGIOB:
LDA IOSTS ;GET DATA
JMP MOPST
;
; 8:SET I/O BYTE
;
MSIOB:
LXI H,IOSTS
MOV M,C ;SET DATA
RET
;
; 9:PRINT STRING TERMINATED BY "$"
;
MBFPR:
XCHG
MOV C,L
MOV B,H ;GET INDEX POINT
JMP BFPRN ;PRINT
;
; 11:GET CONSOLE STATUS
;
MSNCN:
CALL CONIT
MOPST:
STA OTPAR ;SET OUTPUT PARAMETER
MSNCR:
RET
;
; SET ERROR FLAG TO OUTPUT PARAMETER AREA
;
STOTP:
MVI A,1
JMP MOPST
;
; 12:GET VERSION NUMBER
;
MVSNM:
MVI A,22H ;VERSION 2.2
JMP MOPST
;
; 32:SET OR GET USER NUMBER
;
MUSER:
LDA INPAR
CPI -1
JNZ MUSES ;SET MODE
LDA MDUSR ;GET MODE
JMP MOPST
;
MUSES: ;SET MODE
ANI 1FH
STA MDUSR
RET
;
; DATA AREA FOR BASIC I/O
;
ECHKL: DB 0 ;ECHO KILL COUNT
PPROM: DB 0 ;PROMPT POSITION
PCARI: DB 0 ;CONSOLE CARRIAGE POSITION COUNTER
OTLST: DB 0 ;LIST OUTPUT MODE 0 NOT OUT
INCON: DB 0 ;CONSOLE INTERRUPT CODE
INSTK: DS 2 ;USER STACK POINTER SAVE BUFFER
DS 48
STACK: ;SYSTEM STACK
MDUSR: DB 0 ;USER MODE
NDRIV: DB 0 ;DRIVE NUMBER
INPAR: DW 0000H ;INPUT PARAMETER BUFFER
OTPAR: DW 0000H ;OUTPUT PARAMETER BUFFER
;
; DISK OPERATION ROUTINES
;
; 14:SELECT DISK
;
MDVSL:
LDA INPAR ;GET DISK NUMBER
STA NDRIV ;SET AS CURRENT DISK
;
; ERROR ROUTINES
;
DNERR: ;DRIVE NUMBER ERROR
LXI H,ADRIV
ERROR: ;JUMP TO EACH ROUTINE
MOV E,M
INX H
MOV D,M
XCHG
PCHL
;
; DUMMY FOR DISK OPERATION
;
MDKDUM:
LXI H,-1
SHLD OTPAR ;SET ERROR FLAG TO OUTPUT DATA
RET
;
; BDOS END PROCESS
;
BDOSE:
LHLD INSTK
SPHL ;SET STACK POINTER
LHLD OTPAR
MOV A,L
MOV B,H ;SET RETURN PARAMETER
RET
;
;
ORG (($-BDOS+256) AND 0FF00H)-1
DB 0
;
;
; POINTERS TO BASIC I/O SYSTEM
;
BOOT EQU $ ;COLD START BOOTING
WBOOT EQU $+3 ;WARM BOOTING
CONST EQU $+6 ;CONSOLE STATUS
CONIN EQU $+9 ;CONSOLE INPUT
CONOT EQU $+12 ;CONSOLE OUTPUT
LIST EQU $+15 ;LIST OUTPUT
PUNCH EQU $+18 ;PUNCH OUTPUT
READR EQU $+21 ;READER INPUT
HOME EQU $+24 ;MOVE DISK TO TRACK ZERO
SELDK EQU $+27 ;SELECT DISK DRIVE
SETRK EQU $+30 ;SET TRACK NUMBER
SETSC EQU $+33 ;SET SECTOR NUMBER
SETDM EQU $+36 ;SET DMA ADDRESS
READ EQU $+39 ;READ ONE SECTOR
WRITE EQU $+42 ;WRITE ONE SECTOR
LISTS EQU $+45 ;LIST STATUS
SCTRN EQU $+48 ;SECTOR TRANSLATE
;
;
END