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,138 @@
;WARM START LOADER FOR DOUBLE DENSITY
;VERSION M4.1
;INTERRUPTS ARE NOT IMPLEMENTED
;THIS IS STORED IN TRACK 0 SECTOR 2
;AND IS LOADED INTO THE 80 BYTES BELOW THE OP SYSTEM ON A
;COLD OR WARM BOOT
;
;
;THIS VERSION CONTAINS DISK DRIVERS FOR THE DIGITAL SYSTEMS
;FDC-3 CONTROLLER BOARD. THIS BOARD CAN HANDLE DOUBLE DENSITY
;
; NOTE : MSIZE DETERMINES WHERE THIS CBIOS IS LOCATED
MSIZE EQU 64 ;CP/M VERSION MEMORY SIZE IN KILOBYTES
;
;
ram$top equ msize*1024
BIOS EQU ram$top-6*256 ;START OF THE CBIOS PATCH
BDOS EQU bios-0e00h ;BASE OF RESIDENT PORTION OF CP/M
ccp EQU bdos-0800h ;LENGTH OF THE CP/M SYSTEM IN BYTES
warmboot equ ccp-0080h
NSECTS EQU (bios-ccp)/128 ;NUMBER OF SECTORS TO LOAD ON WARM START
;
ORG warm$boot ;ORIGIN OF THIS PROGRAM
WBOTE EQU BIOS+3
SETSEC EQU BIOS+21H
SETTRK EQU BIOS+1EH
SETDMA EQU BIOS+24H
READ EQU BIOS+27H
CONOUT EQU BIOS+0CH
SIGNON EQU BIOS+33h
;
PORT EQU 04AH
DENSITY EQU 04CH
;
; JUMP VECTOR FOR INDIVIDUAL SUBROUTINES
JMP INITIO ;COLD START
;
;
WBOOT: ;SIMPLEST CASE IS TO READ THE DISK UNTIL ALL SECTORS LOADED
;
;
MVI B,NSECTS ;B COUNTS THE NUMBER OF SECTORS TO LOAD
MVI C,0 ;C HAS THE CURRENT TRACK NUMBER
MVI D,3 ;D HAS THE NEXT SECTOR TO READ
; NOTE THAT WE BEGIN BY READING TRACK 0, SECTOR 3 SINCE SECTOR 1
; CONTAINS THE COLD START LOADER, WHICH IS SKIPPED IN A WARM START
; AND SECTOR 2 IS THE WARM START LOADER
LXI H,CCP ;BASE OF CP/M (INITIAL LOAD POINT)
LOAD1: ;LOAD ONE MORE SECTOR
PUSH B ;SAVE SECTOR COUNT, CURRENT TRACK
PUSH D ;SAVE NEXT SECTOR TO READ
PUSH H ;SAVE DMA ADDRESS
MOV C,D ;GET SECTOR ADDRESS TO REGISTER C
CALL SETSEC ;SET SECTOR ADDRESS FROM REGISTER C
POP B ;RECALL DMA ADDRESS TO B,C
PUSH B ;REPLACE ON STACK FOR LATER RECALL
CALL SETDMA ;SET DMA ADDRESS FROM B,C
;
; DRIVE SET TO 0, TRACK SET, SECTOR SET, DMA ADDRESS SET
CALL READ
ORA A ;ANY ERRORS?
JNZ WBOOT ;RETRY THE ENTIRE BOOT IF AN ERROR OCCURS
;
; NO ERROR, MOVE TO NEXT SECTOR
POP H ;RECALL DMA ADDRESS
LXI D,128 ;DMA=DMA+128
DAD D ;NEW DMA ADDRESS IS IN H,L
POP D ;RECALL SECTOR ADDRESS
POP B ;RECALL NUMBER OF SECTORS REMAINING, AND CURRENT TRK
DCR B ;SECTORS=SECTORS-1
JZ GOCPM ;TRANSFER TO CP/M IF ALL HAVE BEEN LOADED
;
; MORE SECTORS REMAIN TO LOAD, CHECK FOR TRACK CHANGE
INR D
MOV A,D ;SECTOR=27?, IF SO, CHANGE TRACKS
CPI 27
JC LOAD1 ;CARRY GENERATED IF SECTOR<27
;
; END OF CURRENT TRACK, GO TO NEXT TRACK
;CHECK FOR DENSITY CHANGE
;THE DENSITY TO BE USED IS THE DENSITY OF DRIVE A
LDA DENSITY
RRC
JNC LOAD2
;CHANGE TO DOUBLE DENSITY
MVI A,8
STA PORT
LOAD2:
MVI D,1 ;BEGIN WITH FIRST SECTOR OF NEXT TRACK
INR C ;TRACK=TRACK+1
;
; SAVE REGISTER STATE, AND CHANGE TRACKS
PUSH B
PUSH D
PUSH H
CALL SETTRK ;TRACK ADDRESS SET FROM REGISTER C
POP H
POP D
POP B
JMP LOAD1 ;FOR ANOTHER SECTOR
;
INITIO:
;
;GIVE LOG-ON MESSAGE ON COLD START ONLY
LXI SP,80H
LXI H,SIGNON
PRTMESS:
MOV A,M
ORA A ;ZERO?
JZ GOCPM
PUSH H
MOV C,A
CALL CONOUT
POP H
INX H
JMP PRTMESS
GOCPM:
;COME HERE ON EITHER WARM OR COLD BOOT
;INITIALIZE POINTERS IN LOW MEMORY
MVI A,0C3H ;C3 IS A JMP INSTRUCTION
STA 0 ;FOR JMP TO WBOOT
LXI H,WBOTE ;WBOOT ENTRY POINT
SHLD 1 ;SET ADDRESS FIELD FOR JMP AT 0
;
STA 5 ;FOR JMP TO BDOS
LXI H,BDOS+6 ;BDOS ENTRY POINT
SHLD 6 ;ADDRESS FIELD OF JUMP AT 5 TO BDOS
;
LXI B,80H ;DEFAULT DMA ADDRESS IS 80H
CALL SETDMA
;
;PUT ACTIVE DISK NUMBER (STORED IN LOCATION 4) IN C
LDA 04H
MOV C,A
DI
ORG ccp ;GO TO CPM FOR FURTHUR PROCESSING
END