mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 09:24:19 +00:00
436 lines
7.5 KiB
Plaintext
436 lines
7.5 KiB
Plaintext
; 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
|
||
|