Files
Digital-Research-Source-Code/MPM OPERATING SYSTEMS/MPM I/MPM I SOURCE/12/warm.asm
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

138 lines
3.6 KiB
NASM
Raw 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.

;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