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,738 @@
; CP/NET BOOTING LOADER
;
; 1982.8.27. VER.1.0
;
; EQUATIONS OF DATA
;
TOP EQU 0 ;MEMORY TOP
;
; EQUATIONS OF CP/NET FUNCTION
;
COPEN EQU 15 ;OPEN FILE
CREAD EQU 20 ;READ ONE SECTOR
CSTUSC EQU 32 ;SET USER CODE
CLOGIN EQU 64 ;LOG IN
;
; EQUATIONS OF CODE & DATA
;
SOH EQU 01H ;START OF HEADER
STX EQU 02H ;START OF DATA
ETX EQU 03H ;END OF DATA
EOT EQU 04H ;END OF TRANSMISSION
ENQ EQU 05H ;ENQUIRE
ACK EQU 06H ;ACKNOWLEDGE
ACKS EQU 07H ;SECOND ACKNOWLEDGE
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGRE RETURN
NAK EQU 15H ;NEGATIVE ACKNOWLEDGE
;
TMORTY EQU 100 ;TIME OUT RETRY COUNT
MAXRTY EQU 10 ;SEND MESSAGE RETRY COUNT
;
; EQUATIONS OF INPUT OUTPUT PORT & ADDRESS
;
COMPRT EQU 0C4H ;COMMUNICATION PORT
STATI EQU COMPRT ;INPUT STATUS
DPRTI EQU COMPRT+1 ;DATA PORT
MSKI EQU 01H ;INPUT READY BIT
;
STATO EQU COMPRT ;OUTPUT STATUS
DPRTO EQU COMPRT+1 ;DATA PORT
MSKO EQU 80H ;OUTPUT READY BIT
;
;
CRTBF EQU 0F800H ;VRAM AREA
CPORT EQU 40H ;PORT FOR BELL ON
;
;
SUBTTL BOOTER PART
;
; SYSTEM PAGE
; 2B:NDOS TOP
; 2B:SNIOS TOP
; 2B:BDOS TOP
; 2B:BIOS TOP
; 2B:LENGTH
;
;
; ENTRY POINT & PARAMETERS
;
NBOOT:
JMP START
;
; ID CODE FOR PATCH
;
MSTID: DB 0 ;MASTER ID CODE
SLVID: DB 20H ;SLAVE ID CODE
;
; FCB FOR SYSTEM LOAD
;
FCB: DB 2 ;MASTER DISK NUMBER +1
DB 'CPNETPC SYS' ;SYSTEM FILE NAME
DB 0,0 ;EXTENT & CURRENT RECODE
;
; PASS WORD
;
PASSWD: DB 'PASSWORD' ;DEFAULT PASS WORD
;
;
START:
LXI SP,STACK
CALL LOGIN ;LOG IN
CALL SETUSR ;SET USER CODE TO ZERO
CALL OPEN ;OPEN SYSTEM FILE
LXI H,PARAMT
SHLD DMAADD ;SET DMA ADDRESS TO WORK
CALL READ ;READ PARAMETER PAGE
LHLD PARAMT
SHLD DMAADD ;GET LOADING TOP
LXI D,3
DAD D
SHLD NDOSPT ;SAVE NDOS COLD START ENTRY
LHLD PARAMT+2
DAD D
DAD D
SHLD SNIOSP ;GET SNIOS ENTRY FOR CONFIGRATION TABLE
LHLD PARAMT+4
DAD D
DAD D
SHLD BDOSPT ;GET BDOS ENTRY
LHLD PARAMT+6
SHLD BIOSPT ;BIOS COLD START POINT
LHLD PARAMT+8 ;GET SYSTEM LENGTH
DAD H
MOV A,H ;GET COUNT
LOOP: ;SECTOR READ LOOP
PUSH PSW ;SAVE COUNT
CALL READ ;READ ONE SECTOR
LHLD DMAADD
LXI D,128
DAD D
SHLD DMAADD ;TO NEXT DMA ADDRESS
POP PSW
DCR A
JNZ LOOP ;TO NEXT SECTOR
MVI A,0C3H
STA TOP
STA TOP+5 ;SET JUMP INSTRUCTIONS
LHLD BDOSPT
SHLD TOP+6 ;SET BDOS ENTRY
LHLD BIOSPT
INX H
INX H
INX H
SHLD TOP+1 ;SET WARM BOOT VECTOR
LXI H,LOOPEN
PUSH H
LHLD SNIOSP ;GET ROUTINE POINT FOR CONFIGRATION TABLE
PUSH H
LHLD NDOSPT
MOV B,H
MOV C,L ;GET NDOS TOP
LHLD BIOSPT
PCHL ;TO BIOS INITIALIZE ROUTINE
;
LOOPEN:
INX H
LDA SLVID
MOV M,A ;SET SLAVE ID
LXI D,40
DAD D
MOV M,A ;SLAVE ID FOR LIST OUT
LHLD NDOSPT
PCHL ;TO NDOS COLD START POINT
;
; OPEN FILE
;
OPEN:
XRA A
STA FCB+12 ;CLEAR EXTENT
STA FCB+13 ;CLEAR CURRENT RECODE
CALL STFCBP ;SET FCB POINT
LXI H,FCB
MVI B,13
CALL MCPYTO ;SET FCB DATA
MVI C,COPEN
CALL LINK ;LINK WITH MATSER
CALL GTRPA ;GET RETURN PARAMETER
INR A
MVI A,'O'
JZ LOADER ;OPEN ERROR
RET
;
; READ ONE SECTNR
;
READ:
CALL STFCBP
CALL STEXCR ;SET EXTENT & CURRENT RECODE
MVI C,CREAD
CALL LINK
CALL RSEXCR ;RESTORE EXTENT & CURRENT RECODE
LHLD DMAADD ;DMA POINT
MVI B,128
CALL MCPYFR ;GET DAMA
CALL GTRPA ;GET RETURN PARAMETER
ORA A
MVI A,'D'
JNZ LOADER ;READ DATA ERROR
RET
;
; LINK WITH MASTER
; INPUT
; C:FUNCTION
;
LINK:
LXI H,MSGTOP
MVI M,0 ;TO SEND
INX H
LDA MSTID
MOV M,A
INX H
LDA SLVID
MOV M,A ;SET SLAVE ID
INX H
MOV M,C ;SET FCUNTION
INX H
XCHG
LHLD MCRPNT ;DATA POINT
XRA A
SUB E
MOV C,A
MVI A,0
SBB D
MOV B,A
DAD B ;GET LENGTH
DCX H
DCX H
XCHG
MOV M,E ;SET SIZE
LXI B,MSGTOP
CALL SNDMSG
INR A
MVI A,'S'
JZ LOADER ;SEND ERROR
LXI B,MSGTOP
CALL RCVMSG
INR A
MVI A,'R'
JZ LOADER ;RECEIVE ERROR
LXI H,MSGDAT
SHLD MCRPNT ;INITIALIZE POINTER
RET
;
; RESTORE EXTENT & CURRENT RECORD
;
RSEXCR:
LHLD MCRPNT
MOV A,M
STA FCB+12 ;SET EXTENT
INX H
MOV A,M
STA FCB+13 ;SET CURRENT RECODE
INX H
SHLD MCRPNT
RET
;
; GET RETURN PARAMETER
; OUTPUT
; A:ONE BYTE PARAMETER SAME WITH L
;
GTRPA:
LHLD MCRPNT
MOV A,M ;GET PARAMETER
RET
;
; SET EXTENT & CURRENT RECODE
;
STEXCR:
LHLD MCRPNT
LDA FCB+12 ;GET EXTENT
MOV M,A
INX H
LDA FCB+13 ;GET CURRENT RECODE
MOV M,A
INX H
SHLD MCRPNT
RET
;
; SET FCB POINT
;
STFCBP:
LXI H,MSGDAT
LXI D,FCB
MOV M,E
INX H
MOV M,D ;SET FCB POINT
INX H
SHLD MCRPNT ;SET POINTER
RET
;
; MESSAGE COPY FROM MESSAGE BUFFER
; INPUT
; B:COUNT
; HL:DESTINATION
;
MCPYFR:
XCHG
LHLD MCRPNT ;GET MESSAGE BUFFER POINT
MOV A,M ;COPY DATA
STAX D
INX D
INX H
DCR B
JNZ $-5 ;TO NEXT BYTE
SHLD MCRPNT ;SAVE NEXT POINT
RET
;
; MESSAGE COPY TO MESSAGE BUFFER
; INPUT
; B:COUNT
; HL:SOURCE POINT
;
MCPYTO:
XCHG
LHLD MCRPNT ;GET MESSAGE POINT
LDAX D ;COPY DATA
MOV M,A
INX D
INX H
DCR B
JNZ $-5
SHLD MCRPNT ;SAVE NEXT POINT
RET
;
; LOGIN
;
LOGIN:
LXI H,MSGDAT
SHLD MCRPNT ;SET POINTER TO TOP
LXI H,PASSWD
MVI B,8
CALL MCPYTO ;SET PASSWORD
MVI C,CLOGIN
CALL LINK
CALL GTRPA ;GET RESULT
ORA A
MVI A,'L'
JNZ LOADER ;LOGIN ERROR
RET
;
; SET USER CODE TO ZERO
;
SETUSR:
LXI H,MSGDAT
MVI M,0 ;SET USER CODE ZERO
INX H
SHLD MCRPNT ;SET DATA POINTER
MVI C,CSTUSC
JMP LINK
;
; LOAD ERROR
; INPUT
; A:ERROR CODE
;
LOADER:
LXI D,CBOTER ;ERROR COMMENT POINT
JMP FTEROR
;
;
SUBTTL COMMUNICATION PART
;
; FATAL ERROR END STOP
; INPUT
; DE:ERROR STRING POINTER
; A:ERROR CODE
;
FTEROR:
DI
MOV C,A
LXI H,CRTBF+50
INX H
INX D
LDAX D
MOV M,A
ORA A
JNZ $-5 ;TO NEXT CODE
MOV M,C ;SET ERROR CODE
MVI A,20H
OUT CPORT ;BELL ON
JMP $
;
; SEND MESSAGE ON NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
SNDMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
SNDMSR: ;RETRY LOOP
MVI A,MAXRTY
STA RTYCNT ;INITIALIE RETRY COUNT
SEND:
CALL NTRSET ;RESET BUFFER
SENDS:
LHLD MSGADR ;GET MESSAGE TOP
MVI D,TMORTY ;TIME OUT RETRY COUNT
SENDWT: ;ENQUIRE RESPONSE WAIT LOOP
MVI C,ENQ
CALL CHROUT ;SEND ENQUIRE TO MASTER
CALL CHARIN ;WAIT RESPONSE
JNC SENDGT ;GET RESPONSE
DCR D ;TIME OVER
JNZ SENDWT ;SEND ENQUIRE ONCE MORE
JMP CHINTO ;TIME OVER FOR LINK
;
SENDGT: ;GET RESPONSE
CPI ENQ ;CHECK SEND - SEND MODE
JZ SNDRCV ;CRASH SEND SO TO PASS RECEIVE MODE
CALL GETAK0 ;GET RESPONSE OF ENQ
MVI C,SOH
MVI E,5 ;HEADER LENGTH COUNT
CALL MSGOUT ;SEND SOH,FMT,DID,SID,FNC,SIZ
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND HCS (HEADER CHECK SUM)
CALL CHARIW ;GET RESPONSE
JC GETATS ;TIME OVER
CPI ACK
JNZ $+9 ;NORMAL MODE
CALL CHARIW ;MAYBE BUFFER LEFT ACK, SO IGNORE
JC GETATS ;TIME OVER
SUI ACKS
JNZ GETATS ;MISS MATCH OF RESPONSE
DCX H
MOV E,M
INX H
INR E
MVI C,STX
CALL MSGOUT ;SEND STX,DB0,DB1,....
MVI C,ETX
CALL NETOUT ;SEND ETX
XRA A
SUB D
MOV C,A
CALL NETOUT ;SEND DATA CHECK SUM
MVI C,EOT
CALL CHROUT ;SEND END OF TRNASMISSION
CALL GETAKS ;********NEED CALL ******* FOR ERROR RETRY
RET
;
; PASS RECEIVE FOR SEND & SEND MODE
;
SNDRCV:
CALL NTRSET ;CLEAR CURRENT BUFFER
MVI D,TMORTY
SNDRCW: ;WAIT FOR ANOTHER ENQ
CALL CHARIN
JNC SNDRCG ;GET DATA
DCR D ;TIME OVER
JNZ SNDRCW ;WAIT
JMP SEND ;MAYBE MISS LINK, SO TO SEND
;
SNDRCG: ;GET DATA
CPI ENQ
JNZ SEND ;MAYBE MISS LINK
LXI H,SNDRCV
PUSH H ;SAVE RETRY LOOP
CALL SNDACK ;SEND ACKNOWLEDGE
CALL CHARIW
RC ;NO RESPONSE, SO RETRY
CPI SOH
RNZ
LXI H,DHEADR ;DUMMY HEADER BUFFER
MOV D,A
MVI E,5
CALL MSGIN ;GET HEADER
CNC NETIN ;GET CHECK SUM
RC ;TIME OUT RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW
RC
CPI STX ;CHECK START OF TEXT
RNZ ;RETRY
MOV D,A ;INITIALIZE CHECK SUM
DCX H
MOV E,M
INR E
INR E ;GET COUNT FOR READ
SNDRCL: ;DATA PASS RECEIVE LOOP
CALL NETIN ;GET ONE DATA
RC ;TIME OUT RETRY
DCR E
JNZ SNDRCL ;TO NEXT DATA
CPI ETX
RNZ ;MISS MATCH OF END CODE
CALL NETIN ;GET CHECK SUM
RC
CALL CHARIN
RC
CPI EOT ;END OF TRANSMISSION
RNZ
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS
POP H
JMP SENDS
;
; GET ACKNOWLEDGE
; OVERRIDING RETURN WHEN ERROR
;
GETAK0: ;CHECK ACKNOWLEDGE
SUI ACK
RZ
SNDRTY:
POP H ;DISCARD RETURN ADDRESS
GETATS: ;TIME OVER RETRY
LXI H,RTYCNT
DCR M
JNZ SEND ;SEND AGAIN
CHINTO: ;CHARACTER IN TIME OUT
MVI A,-1
RET
;
GETAKS: ;GET SECOND ACKNOWLEDGE
CALL CHARIW
JC SNDRTY ;TIME OUT
SUI ACKS
RZ ;OK
JMP SNDRTY ;RETRY
;
; RECEIVE MESSAGE FROM NETWORK
; INPUT
; BC:MESSAGE ADDRESS
;
RCVMSG:
MOV H,B
MOV L,C
SHLD MSGADR ;SAVE MESSAGE ADDRESS
RCVMSR:
MVI A,MAXRTY
STA RTYCNT ;INITIALIZE RETRY COUNT
RECALL:
CALL RECEIV
LXI H,RTYCNT ;RETURN FROM RECEIV IS ERROR
DCR M
JNZ RECALL ;RETRY
RCVTOT: ;TIME OUT
MVI A,-1
RET
;
; RECEIVE BODDY
; RETURN OVERRIDING WHEN OK
; SIMPLE RETURN IS ERROR
;
RECEIV:
LHLD MSGADR ;GET MESSAGE ADDRESS
MVI D,TMORTY
CALL NTRSET ;RESET INPUT BUFFER
RCVFST: ;RECEIVE FIRST CHARACTER LOOP
CALL CHARIN
JNC RCVGFS ;GET FIRST CHARACTER
DCR D ;TIME OVER
JNZ RCVFST ;RETRY
POP H
JMP RCVTOT ;SET TIME OVER ERROR FLAG & RETRY
;
RCVGFS: ;GET FIRST CHARACTER
CPI ENQ
JNZ RECEIV ;NOT ENQUIRE SO RETRY
CALL SNDACK ;RESPONSE TO MASTER
CALL CHARIW
RC ;RETURN TO RECEIVE RETRY
CPI SOH
RNZ ;NOT START OF HEADER
MOV D,A ;START OF HEADER
MVI E,5 ;LENGTH OF HEADER
CALL MSGIN ;GET HEADER BLOCK
CNC NETIN ;GET HCS (HEADER CHECK SUM)
RC ;TIME OVER RETRY
JNZ SNDNAK ;CHECK SUM ERROR
CALL SNDAKS ;SEND RESPONSE
CALL CHARIW ;WAIT DATA TOP
RC
CPI STX
RNZ ;NOT START OF TEXT
MOV D,A ;START OF TEXT
DCX H
MOV E,M ;GET SIZE
INX H
INR E ;MAKE READ COUNT FOR DATA BLOCK
CALL MSGIN ;RECEIVE DATA
RC
CALL CHARIN ;GET END CODE OF DATA BLOCK
RC
CPI ETX
RNZ ;NOT END OF TEXT SO RETRY
ADD D
MOV D,A
CALL NETIN ;GET HEADER CHECK SUM
RC
CALL CHARIN ;GET LAST CODE
RC
CPI EOT
RNZ ;NOT END OF TRANSMIT SO ERROR
MOV A,D
ORA A
JNZ SNDNAK ;CHECK SUM ERROR
POP H ;OK ALL PACKETTE IS RECEIVED
LHLD MSGADR
INX H
LDA SLVID ;GET SLAVE ID
SUB M ;CHECK SID
JZ $+5
MVI A,-1 ;SID ERROR
PUSH PSW
CALL SNDAKS ;SEND ACKNOWLEDGE
POP PSW
RET
;
; ROUTINES TO SEND RESPONSE CODES
;
SNDACK: ;SEND ACKNOWLEDGE
MVI C,ACK
JMP CHROUT
;
SNDAKS: ;SEND SECOND ACKNOWLEDGE
MVI C,ACKS
JMP CHROUT
;
SNDNAK: ;SEND NEGATIVE ACKNOWLEDGE
MVI C,NAK
JMP CHROUT
;
; NETWORK ERROR RECOVER ROUTINE RESET COMMUNICATION INTERFACE
;
NTRSET:
MVI A,080H
OUT STATO ;RESET
RET
;
; NETWORK OUTPUT DATA
; INPUT
; C:OUTPUT DATA
; D:CHECK SUM
;
NETOUT:
MOV A,D
ADD C
MOV D,A ;MAKE CHECK SUM
CHROUT:
IN STATO
ANI MSKO ;GET OUTPUT READY MODE
JNZ CHROUT ;NOT READY
MOV A,C
OUT DPRTO ;OUT DATA
RET
;
; INPUT FROM NETWORK
; OUTPUT
; A:DATA
; CF:ON TIME OVER OFF GET DATA
;
CHARIW: ;LONG WAIT
MVI B,0
JMP CHARIM
;
CHARIN:
MVI B,10 ;10 MS = 192 CH / 192K BAUD
CHARIM: ;WAIT LOOP
MVI C,5AH ;1 MS WAIT VALUE
CHARIL: ;1 MS WAIT LOOP
IN STATI
ANI MSKI
JZ CHARIG ;READY
DCR C
JNZ CHARIL ;WAIT OF 1 MS
DCR B
JNZ CHARIM ;WAIT
STC ;TIME OVER RETURN
RET
;
CHARIG:
IN DPRTI ;GET DATA
RET
;
; MESSAGE INPUT
; INPUT
; HL:DESTINATION ADDRESS
; E:INPUT COUNT
;
MSGIN:
CALL NETIN
RC ;TIME OUT
MOV M,A ;GET DATA
INX H
DCR E
JNZ MSGIN ;TO NEXT BYTE
RET
;
; NETWORK INPUT
; INPUT
; D:CHECK SUM
; OUTPUT
; A:DATA
;
NETIN:
CALL CHARIN ;RECEIVE BYTE IN BINARY MODE
RC
MOV B,A
ADD D ;MAKE CHECK SUM
MOV D,A
ORA A ;OFF CARRY FLAG
MOV A,B
RET
;
; MESSAGE OUT
; INPUT
; HL:SOURCE ADDRESS
; E:COUNT OF OUTPUT DATA
; C:PREAMBLE CODE
;
MSGOUT:
MVI D,0 ;CLEAR CHECK SUM
CALL NETOUT ;OUT PREAMBLE CODE
MSGOTL: ;OUT LOOP
MOV C,M ;GET CODE
INX H
CALL NETOUT ;OUT DATA
DCR E
JNZ MSGOTL ;TO NEXT DATA
RET
;
;
CBOTER: DB ' LOAD ERROR ',0
;
; WORKING AREA
; FOR BOOT
;
DMAADD: DS 2 ;DMA ADDRESS
NDOSPT: DS 2 ;NDOS COLD START POINT
SNIOSP: DS 2 ;SNIOS ENTRY FOR CONFIGRATION TABLE
BDOSPT: DS 2 ;BDOS ENTRY POINT
BIOSPT: DS 2 ;BIOS COLD START POINT
;
MCRPNT: DS 2 ;MESSAGE POINTER
;
; MESSAGE AREA
;
MSGTOP: DS 5 ;HEADER
MSGDAT: DS 2 ;DATA
PARAMT: DS 128 ;DATA OF ONE SECTOR
DS 1
;
DS 64
STACK:
;
; DATA AREA FOR SEND & RECEIVE
;
MSGADR: DS 2 ;MESSSAGE ADDRESS BUFFER
DHEADR: DS 5 ;DUMMY HEADER BUFFER
RTYCNT: DB 0 ;RETRY COUNT
;
;
END