mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
Upload
Digital Research
This commit is contained in:
138
MPM OPERATING SYSTEMS/MPM I/MPM I SOURCE/12/warm.asm
Normal file
138
MPM OPERATING SYSTEMS/MPM I/MPM I SOURCE/12/warm.asm
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user