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,436 @@
; CP/NET-86 LOADER
;
; 1983.8.31. VER.1.00
;
; EQUATIONS OF DATA
;
LF EQU 0AH ;LINE FEED
CR EQU 0DH ;CARRIAGE RETURN
;
BDOS EQU 224 ;BODS INTERRUPT NUMBER
SCTLNG EQU 128 ;SECTOR LENGTH
;
VBDOS EQU BDOS*4 ;VECTOR OF BDOS INTERRUPT
BSBIOS EQU 250H ;BIAS TO BIOS
MINSIZ EQU 800H ;MINIMUM REQUIRED SPACE
MAXCPM EQU 0C00H ;MAXIMUM CP/M SIZE
;
; EQUATIONS OF BDOS FUNCTION
;
CRESET EQU 0 ;SYSTEM RESET
CCONOT EQU 2 ;CONSOLE OUT
CBUFPR EQU 9 ;BUFFERED STRING PRINT
CGETVR EQU 12 ;GET VERSION NUMBER
COPEN EQU 15 ;OPEN FILE
CREAD EQU 20 ;READ FILE
CSTDMA EQU 26 ;SET DMA OFFSET
CDBIOS EQU 50 ;DIRECT BIOS CALL
CSTDMS EQU 51 ;SET DMA SEGMENT
CGTMXM EQU 53 ;GET MAXIMUM MEMORY
;
;
ORG 100H
;
JMP START
;
;
DB 'COPYRIGHT (C) 1983,'
DB ' XYZ (DIGITAL RESEARCH)'
;
;
START:
MOV AX,CS
MOV SS,AX
MOV SP,OFFSET STACK ;SET STACK
XOR DX,DX
MOV CL,CGETVR
INT BDOS ;GET VERSION NUMBER
MOV CX,OFFSET CARLOD
AND AX,200H
JNZ ERROR ;ALREADY LOADED
CALL GETMRG ;GET LOADING MEMORY REGION
MOV CX,OFFSET CSTUP
CALL BUFPRN ;OUT TABLE TOP
XOR DX,DX
MOV CX,OFFSET CCCP
CALL DSPLIN ;OUT CCP LOCATION
XOR DX,DX
MOV ES,DX
MOV DX,ES:WORD PTR .VBDOS ;GET OFFSET OF BDOS
MOV CL,4
SHR DX,CL ;GET BDOS BIAS
MOV CX,OFFSET CBDOS
CALL DSPLIN ;OUT BDOS LOCATION
MOV DX,BSBIOS ;BIOS TOP
MOV CX,OFFSET CBIOS
CALL DSPLIN ;OUT BIOS LOCATION
MOV DX,LODOFF
MOV CX,OFFSET CCCPN
CALL LOAD ;LOAD CCPN
MOV NDOSOF,DX ;SAVE NDOS TOP
MOV CX,OFFSET CNDOS
CALL LOAD ;LOAD NDOS
MOV CX,OFFSET CSNIOS
CALL LOAD ;LOAD SNIOS
MOV CX,OFFSET CTPA
CALL DSPLIN ;TPA LOCATION
MOV CX,OFFSET CLEND
CALL BUFPRN ;OUT LOADING END COMMENT
MOV AX,NDOSOF
MOV CL,4
SHL AX,CL
ADD AX,3
MOV NDOSEN,AX ;SET NDOS COLD START ENTRY OFFSET
JMPF DWORD PTR NDOSEN ;TO NDOS
;
; ERROR END
; INPUT
; CX:COMMENT POINT
;
ERROR: ;ERROR END
CALL BUFPRN ;OUT ERROR COMMENT
MOV CL,CRESET
INT BDOS ;RETURN TO SYSTEM
;
; GET MEMORY REGION FOR CP/NET SYSTEM
;
GETMRG:
MOV DX,OFFSET WKMCB
MOV CL,CGTMXM
INT BDOS ;GET MAXIMUM MEMORY
MOV CX,OFFSET CNOAVL
OR AL,AL
JNZ ERROR ;NO AVAILABLE MEMORY
MOV CL,CDBIOS
MOV DX,OFFSET WKBIOS
INT BDOS ;GET MEMORY REGION TABLE
INC BX
MOV DX,ES:[BX] ;GET TOP REGION
MOV CX,OFFSET CNOAVL
CMP DX,WKMCB
JNZ ERROR ;NOT TOP NEED TOP REGION FOR CP/NET
MOV AX,WKMCB+2
CMP AX,MINSIZ
JC ERROR ;TOO SMALL
XOR AX,AX
MOV ES,AX ;INTERRUPT VECTOR PAGE
MOV DX,ES:WORD PTR .VBDOS+2 ;GET DOS SEGMENT
MOV DOSSGM,DX ;SAVE SEGMENT
MOV AX,WKMCB ;GET AVAILABLE TOP
SUB AX,DX
ADD AX,15
AND AX,0FFF0H ;TO PAGE BOUNDARY
CMP AX,MAXCPM
JNC ERROR ;CP/M BASIC LENGTH TOO LONG
MOV LODOFF,AX ;SAVE OFFSET
RET
;
; ERROR OF LOADING
;
ERLOAD:
MOV CX,OFFSET CLERR
JMP ERROR
;
; LOAD ONE PROGRAM
; INPUT
; DX:LOADING TOP PARAGRAPH
; CX:FILE NAME POINTER
; OUTPUT
; DX:NEXT PARAGRAPH
;
LOAD:
PUSH DX
PUSH CX
CALL CRLF
POP CX
PUSH CX
CALL BUFPRN ;OUT FILE NAME
MOV AX,DS
MOV ES,AX
POP SI
MOV DI,OFFSET WKFCB
CLD
XOR AX,AX
STOSB ;CLEAR ENTRY TYPE
MOV CX,11
REP MOVSB ;SET FILE NAME TO FCB
MOV CL,21
REP STOSB ;CLEAR LEFT AREA
MOV DX,OFFSET WKFCB
MOV CL,COPEN
INT BDOS ;OPEN FILE
INC AL
JZ ERLOAD ;FILE NOT FOUND
MOV DX,CS
MOV CL,CSTDMS
INT BDOS ;SET DMA SEGMENT
MOV DX,OFFSET RDWORK
MOV CL,CSTDMA
INT BDOS ;SET DMA OFFSET TO READ WORK
CALL READ ;READ ONE SECTOR
MOV BX,OFFSET RDWORK+1
MOV DX,[BX] ;GET CODE LENGTH
MOV AX,3[BX] ;GET DATA LENGTH
ADD AX,DX ;GET TOTAL LENGTH
MOV CODLNG,DX ;SAVE CODE LENGTH
MOV CL,4
ADD AX,15
SHR AX,CL ;GET BY PARAHRAPH
POP BX ;GET CURRENT TOP
MOV TOPPGH,BX ;SAVE TOP
ADD AX,BX
ADD AX,15
AND AX,0FFF0H ;GET NEXT PAGE TOP
MOV NXTPGH,AX ;SAVE NEXT PARAGRAPH
MOV CL,4
SHL BX,CL
MOV LODTOP,BX
ADD DX,127
MOV CL,7
SHR DX,CL ;GET SECTOR COUNT
MOV DI,BX ;SET DESTINATION POINTER
PUSH DX
PUSH DI
CALL READ ;DUMMY PASS READ
POP DI
POP DX
LOADLP: ;ONE SECTOR LOAD LOOP
PUSH DX
PUSH DI
CALL READ ;REDA ONE SECTOR
POP DI
MOV SI,OFFSET RDWORK
MOV ES,DOSSGM ;DESTINATION SEGMENT
MOV CX,SCTLNG
CLD
REP MOVSB ;TO DESTINATION AREA
POP DX
DEC DX
JNZ LOADLP ;TO NEXT SECTOR
MOV DX,CODLNG ;GET CODE LENGTH
MOV AX,DX
AND AX,7FH ;GET OFFSET IN SECTOR
MOV SI,OFFSET RDWORK
ADD SI,AX ;GET DATA POINT
MOV BX,LODTOP ;LOADED DATA TOP
MOV CL,3
SHL AX,CL
MOV CX,AX ;GET RELOCATION COUNT
MOV AH,BH ;GET RELOCATION BIAS
LOADRL: ;RELOCATION LOOP
TEST CL,7
JNZ LOADRB ;NOT BYTE BOUNDARY
TEST CX,3FFH
JNZ LOADRS ;NOT SECTOR BOUNDARY
PUSH AX ;TO NEXT SECTOR
PUSH BX
PUSH DX
PUSH ES
CALL READ ;READ TO WORK
POP ES
POP DX
POP BX
POP AX
XOR CX,CX ;CLEAR COUNT
MOV SI,OFFSET RDWORK ;WORK TOP
CLD
LOADRS:
LODSB ;GET ONE BYTE RELOCATION DATA
LOADRB:
INC CX
ROL AL,1
JNC LOADRA ;ABSOLUTE
ADD ES:[BX],AH ;RELOCATE
LOADRA:
INC BX ;POINTER TO NEXT
DEC DX ;DOWN LENGTH COUNT
JNZ LOADRL ;TO NEXT DATA
MOV AX,TOPPGH
PUSH AX
MOV CL,4
SHL AX,CL ;GET OFFSET
MOV CX,AX
CALL LOCPRS ;OUT OFFSET
POP CX
ADD CX,DOSSGM
CALL LOCPR ;OUT TOP
MOV DX,NXTPGH ;GET NEXT PARAGRAPH
LOADEN:
RET
;
; READ ONE SECTOR
;
READ:
MOV DX,OFFSET WKFCB
MOV CL,CREAD
INT BDOS ;READ ONE SECTOR
OR AL,AL
JZ LOADEN ;OK
JMP ERLOAD ;NO DATA OR SO
;
; DISPLAY LINE
; INPUT
; DX:PARAGRAPH OFFSET OF TOP
; CX:NAME COMMENT POINTER
;
DSPLIN:
PUSH DX
PUSH CX
CALL CRLF
POP CX
CALL BUFPRN ;OUT NAME
POP AX
PUSH AX
MOV CL,4
SHL AX,CL
MOV CX,AX
CALL LOCPRS ;OUT OFFSET
POP CX
ADD CX,DOSSGM
JMPS LOCPR ;OUT LOCATION
;
; OUT LOCATION
; INPUT
; CX:OFFSET
;
LOCPRS:
CALL LOCPRD ;OUT NUMBER PART
MOV CL,'H'
JMP CONOUT
;
; OUT LOCATION
; INPUT
; CX:PARAGRAPH DATA
;
LOCPR:
CALL LOCPRD ;OUT NUMBER PART
MOV CL,'0'
CALL CONOUT
MOV CL,'H'
JMP CONOUT
;
; OUT HEXADECIMAL WORD DATA
; INPUT
; CX:DATA
;
LOCPRD:
PUSH CX
MOV CL,' '
CALL CONOUT
MOV CL,' '
CALL CONOUT
POP CX
PUSH CX
MOV CL,CH
CALL HXPRN ;PRINT HIGHER
POP CX ;TO PRINT LOSER
;
; PRINT BY HEXADECIMAL
; INPUT
; CL:DATA
;
HXPRN:
PUSH CX
SHR CL,1
SHR CL,1
SHR CL,1
SHR CL,1
CALL HXPRH ;PRINT HIGHER NIBBLE
POP CX
HXPRH:
AND CL,0FH
ADD CL,'0'
CMP CL,'9'+1
JC CONOUT ;0 TO 9
ADD CL,7
JMPS CONOUT ;A TO F
;
; CONSOLE OUT
; INPUT
; CL:CODE
;
CONOUT:
PUSH AX
MOV DL,CL
MOV CL,CCONOT
INT BDOS
POP AX
RET
;
; PRINT BUFFERED STRING
; INPUT
; CX:STRING POINTER
;
BUFPRN:
MOV DX,CX
MOV CL,CBUFPR
INT BDOS
RET
;
; CARRIAGE RETURN & LINE FEED
;
CRLF:
MOV CL,CR
CALL CONOUT
MOV CL,LF
JMPS CONOUT
;
DAREA EQU $
;
DSEG
ORG OFFSET DAREA
;
; COMENTS
;
CARLOD DB CR,LF,'CP/NET-86 IS ALREADY LOADED.$'
CSTUP DB CR,LF,LF,'CP/NET-86 VER.1.00 LOADER'
DB CR,LF,'==========================$'
CNOAVL DB CR,LF,'NO AVAILABLE MEMORY FOR CP/NET-86$'
CLERR DB ' LOADING ERROR OF THIS FILE$'
CLEND DB CR,LF,'CP/NET-86 LOADING COMPLETE.',CR,LF,'$'
;
CCCP DB 'CCP $'
CBDOS DB 'BDOS $'
CBIOS DB 'BIOS $'
CCCPN DB 'CCPN SYS$'
CNDOS DB 'NDOS SYS$'
CSNIOS DB 'SNIOS SYS$'
CTPA DB 'TPA $'
;
; WORK AREA
;
; MEMORY CONTROL BLOCK
;
WKMCB DW 0 ;BASE
DW 0FFF0H ;LENGTH
DB 0 ;EXTENT
;
; DIRECT BIOS CALL WORK
;
WKBIOS DB 18 ;GET MEMORY REGION TABLE
DW 0 ;INPUT PARAMETER NOT USED
DW 0
;
LODOFF RW 1 ;LOAD OFFSET BY PARAGRAPH
NDOSOF RW 1 ;NDOS OFFSET BY PARAGRAPH
;
NDOSEN RW 1 ;NDOS ENTRY
DOSSGM RW 1 ;DOS SEGMENT
;
; LOADER WORK
;
WKFCB RB 33 ;FCB
RDWORK RB 128 ;WORKING FOR ONE SECTOR READ
CODLNG RW 1 ;CODE AREA LENGTH
TOPPGH RW 1 ;TOP PARAGRAPH
NXTPGH RW 1 ;NEXT PARAGRAPH
LODTOP RW 1 ;LOADING TOP
;
;
RS 64
STACK:
DB 0
;
;
END