Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

436 lines
7.5 KiB
Plaintext
Raw Permalink 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.

; 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