home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
NSTAR
/
GENSYS32.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
24KB
|
1,132 lines
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; GENESYS version 3.2 - July 18, 1981
; r. l. plouffe
; for use with cp/m 1.45, 2.0x, or 2.2x
; on north star with lifeboat bios
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; This is a version of SYSGEN that runs above the
; sysgen image of cp/m, thus permitting the first four
; north star sectors to contain code for an expanded user
; area. To use this feature, the cold boot loader must
; be modified to load code from ccp-900H. This version of
; GENESYS patches in a complete new cold boot loader that
; accomplishes this function into the sysgen image prior to
; writing to either a CPM.xx file or to the system tracks.
; The new loader reads all 10 sectors of the system tracks
; except that it skips sector 4 on track 1 since that sector
; is read in by the boot prom. The init routine which you put
; in user1 should run at ccp-900H and move the user2 code
; to a location just above the running cp/m. A special org
; must be contained at the portion of init that runs at
; ccp-900h so that the lifeboat format byte will be present
; at 05CH above ccp-900H since that code will be resident
; at sector 0, track 1 of the north star disk where it is
; tested by the lifeboat bios for reading or writing of files
; so that the skew factor will be correct. GENEUSER.ASM which
; is also on this disk will do all of the above and provides
; general user code for 1.45, 2.0 and 2.2 including t102 clock,
; pmmi modem, and north star parity error routines as well.
; The program reads the format of the destination
; drive and changes the format byte found on the source
; drive so that the destination drive format remains
; unchanged after being written to with the 'sysgened' cp/m.
; Thus neither drive is changed in format so far as files
; are concerned after using GENESYS.
;
;
BDOS EQU 0005H ;jmp to bdos function calls
BIOSV EQU 0001H ;bios warm boot vector
CR EQU 0DH ;carriage return
LF EQU 0AH ;line feed
TAB EQU 09H ;tab function
BELL EQU 07H ;ding
;
FCB EQU 005CH ;address of FCB
FRSTCHAR EQU 005DH ;addr of 1rst char in FCB
CURREC EQU 007CH ;addr of curr record #
SYSIMG EQU 0100H ;cp/m sysgen image
SEC0IMG EQU 0080H ;sector 0 image
DMAINCR EQU 0080H ;dma increment amount
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Routine for moving the whole program beginning with START
; to just above the 'sysgen' image of cp/m so that the space
; from 100H to 8FFH will be available for init and user2 code
; for storage on sectors 0-3 of track 1 on the north star disk.
; If any code after START is added/changed, the address labels
; must be followed by EQU $+BIAS.
;
DEST EQU 2D00H ;running location of genesys
;
ORG SYSIMG
;
LXI B,PEND1-SOURCE1
LXI H,DEST2+PEND1-SOURCE1
LXI D,SOURCE2+PEND1-SOURCE1-1
CALL MOVEIT
LXI B,PEND-START ;# of bytes to move
LXI H,DEST+PEND-START ;end of moved code
LXI D,SOURCE-START+PEND-1 ;end of source code
CALL MOVEIT
PCHL
;
MOVEIT: LDAX D ;get byte
DCX H ;bump pointers
MOV M,A ;new home
DCX D
DCX B ;bump byte count
MOV A,B ;check if zero
ORA C
JNZ MOVEIT ;if not, keep moving
RET ;jump to start
;
SOURCE EQU $ ;boundary memory marker
;
BIAS EQU DEST-SOURCE ;relocation amount
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; The beginning of it all.
;
;
START: EQU $+BIAS ;
LXI SP,STACK ;point to new stack
LXI D,SIGNON ;give signon message
CALL PRNMSG ;to the console
CALL SKWGEN ;write the skew table
LDA FRSTCHAR
CPI 20H
JZ NOFILE ;
LXI D,FCB
CALL OPEN ;
INR A
JNZ OPENOK ;
LXI D,NOFILMSG ;say no source file
CALL PRNMSG ;to the console
JMP EXIT ;
;
OPENOK: EQU $+BIAS ;
XRA A
STA CURREC
MVI C,50H ;# of cp/m sectors in file
;
CHKFIL: EQU $+BIAS ;this loop checks for bad file
PUSH B
LXI D,FCB
CALL SEQRD ;read sequential
ORA A
POP B
JNZ BADFILE ;if 0, say incomplete
DCR C
JNZ CHKFIL ;if not done, get another sec.
; initialize current record buffer and set dma to sys image
XRA A
STA CURREC ;set current record to 0
LXI H,SYSIMG ;initial dma
; now read all sectors of the file to ram at sys image
RDFILE: EQU $+BIAS ;
PUSH H
MOV B,H ;set dma address
MOV C,L
CALL DMASET
LXI D,FCB
CALL SEQRD ;read sequential to dma
POP H
ORA A
JNZ IMGRDY ;
LXI D,DMAINCR
DAD D
JMP RDFILE ;
;
BADFILE:EQU $+BIAS ;
LXI D,INCMPMSG ;say source file incomplete
CALL PRNMSG ;to the console
JMP EXIT ;
; if no file in command line, get sys from selected drive
NOFILE: EQU $+BIAS ;
LXI D,SRCNAME ;ask for source drive name
CALL PRNMSG ;at the console
CALL CONIN ;read the console buffer
SUI 41H
CPI 4
JC FROM ;
CALL BADNAME ;
JMP NOFILE ;
;
FROM: EQU $+BIAS ;
STA CURRDRV ;
ADI 41H ;convert to alpha
STA SRCDRV ;
LXI D,SRCMSG ;say to place source disk
CALL PRNMSG ;to the console
CALL CONIN ;
CPI 0DH
JNZ EXIT ;
CALL CRLF ;
XRA A
STA RDWRFLG ;set flag to read
CALL RDWRSYS ;
;
IMGRDY: EQU $+BIAS ;
LDA 900H ;get hi byte of cold loader org
SUI 34H ;get the difference
MOV C,A ;store in C for a while
LXI H,CLDBTABL ;point to addresses of bytes in
;cold loader that need to be changed
CHNGCLDBT:EQU $+BIAS
MOV E,M
INX H
MOV D,M
MOV A,M
ORA E
JZ MOVER
LDAX D
ADD C
STAX D
INX H
JMP CHNGCLDBT
; now patch the cold boot loader into the system image
;
DEST1 EQU 0907H
;
MOVER: EQU $+BIAS
LXI B,PEND1-SOURCE1
LXI H,DEST1+PEND1-SOURCE1
LXI D,PEND1-1
MOVCONT:EQU $+BIAS
LDAX D
DCX H
MOV M,A
DCX D
DCX B
MOV A,B
ORA C
JNZ MOVCONT
;now test and patch for bugs in the various versions
LDA 1201H ;get version
LHLD 900H-1 ;get hi byte of cldbt addr.
MVI L,0CH ;addr in cldbt page to patch
CPI 20H ;see if 2.0x
JNZ TST22 ;if not, see if it's 2.2
SHLD 26BFH ;replace in patch table
TST22: EQU $+BIAS
CPI 22H ;see if 2.2
JNZ TST14 ;if not, see if it's 1.4
LDA 1511H ;
CPI 01H ;see if it's 2.21A
JZ TST14 ;if so, don't patch
CPI 0CCH ;see if it's 2.22
JZ SKP221
SHLD 151BH ;replace in patch table
ORA A ;clear status
TST14: EQU $+BIAS
CZ FIX221A ;fix if 221A
SKP221: EQU $+BIAS
MOV A,H ;get hi byte of cldbt addr.
ADI 24H ;make it hi byte of sys size
MOV B,A ;save for a while
LDA 1201H ;get version
CPI 0EH ;see if 1.45
JNZ RSTCNT ;if not jmp to reset counter
MOV A,B ;get hi byte of sys size
SUI 0AH ;make it hi byte of bios last blk
MOV H,A ;put in H
MVI L,0F7H ;addr in bios last pg to patch
SHLD 1E6CH ;put in bdos patch table
XRA A ;zero A
STA 0906H ;patch coldboot loader
MOV A,B ;get hi byte of sys size again
SUI 0CH ;to make compatible w/1.45 sizing
MOV B,A ;save in B
; now calculate the system size and store in SAVE prompt
RSTCNT: EQU $+BIAS
LXI H,3030H ;set to say 00
SHLD FILNAM+3 ;tens digit
SYSSIZ: EQU $+BIAS
LXI H,FILNAM+4 ;units digit
INR M ;increment it
MOV A,M ;to acc.
CPI 3AH ;overflow of units?
JC SYSSIZ1 ;
MVI M,30H ;reset units digit
DCX H ;go to tens digit
INR M ;increment it
SYSSIZ1:EQU $+BIAS
DCR B
DCR B
DCR B
DCR B
JNZ SYSSIZ ;count more if not done
; now patch the image for cp/m version
LDA 900H ;get the msb of booter
MOV B,A ;store in B for a while
LDA 1201H ;get the cp/m version #
CPI 0EH ;see if version 1.45
LXI D,ONEFOUR ;point to image addresses
JZ PATCHER ;if so jump to patch routine
CPI 20H ;see if version 2.0x
LXI D,TWOZERO ;point to image addresses
JZ PATCHER ;if so jump to patch routine
CPI 22H ;see if version 2.2x
LXI D,TWOTWO ;point to image addresses
JZ PATCHER ;if so jump to patch routine
JMP BADVERS ;if none of the above,say sorry
PATCHER:EQU $+BIAS
LXI H,INIT+7-BIAS1+100H ;get patch location in booter
CALL PATCH ;patch it
LXI H,BOOT+9-BIAS1+100H
CALL PATCH
LXI H,BOOT+6-BIAS1+100H
CALL PATCH
LXI D,IMG0100 ;say cp/m image ready
CALL PRNMSG ;to the console
; now put the sys image to a selected drive
DESTDR: EQU $+BIAS ;
LXI D,TODRV ;ask for destination drive name
CALL PRNMSG ;at the console
CALL CONIN ;read the console buffer
CPI 0DH ;done?
JZ EXIT ;
SUI 41H
CPI 4
JC DESTDRV ;
CALL BADNAME ;
JMP DESTDR ;
;
FIX221A:EQU $+BIAS
MOV A,H ;get hi byte of cldbt addr
MVI L,0F2H ;byte to fix
SHLD 153DH ;add to patch table
XRA A ;A=0
STA 247AH ;remove stack unbalance so that
;read-after-write bit can be set
;in the MODE byte. otherwise, bug
RET
;
PATCH: EQU $+BIAS
LDAX D ;lsb
MOV M,A ;patch it
INX H
INX D
LDAX D ;msb
ADD B ;add hi byte of booter
SUI 09H ;convert to hi byte of addr
MOV M,A ;patch it
INX D
RET
;
DESTDRV:EQU $+BIAS ;
STA CURRDRV ;
ADI 41H
STA DSTDR ;
; read the first sector (with 10 retries) of dest drive
; and get format byte to store in system image
XRA A ;zero the retry count
STA RETRY ;put in retry counter buff.
X10TRY: EQU $+BIAS
LDA CURRDRV ;get current drive no.
MOV C,A ;
CALL DSKSEL ;select the drive
MVI C,0
CALL TRKSET ;set to track 0
LXI B,1 ;
CALL SECSET ;set to sector 1
LXI B,SEC0IMG ;dma
CALL DMASET ;set dma to SEC0IMG
LDA RETRY ;get retry count
CPI 0AH ;allow 10 of them
JC REPEAT ;increment and read
ERROR: EQU $+BIAS
LXI D,PERMERR ;point to error msg
CALL PRNSTR ;send it to console
JMP EXIT ;back to cp/m
;
REPEAT: EQU $+BIAS
INR A ;bump retry counter
STA RETRY ;
CALL SECRD ;read first sector to 80h
ORA A ;bad read?
JNZ X10TRY ;if so, try again
;
TINU: EQU $+BIAS
; now get the format byte from dest drive 1rst sector image
LDA 00DCH ;get dest drive format
; put format byte in system image
STA 015CH ;store it in the sys image
LXI D,DESTMSG ;say to place dest disk
CALL PRNMSG ;at the console
CALL CONIN ;
CPI 0DH ;return key?
JZ WRSYS ;
CPI 20H ;space bar?
JZ WRFILE ;if so, write sys to a file
JMP EXIT ;exit to cp/m if any other key
;
WRSYS: EQU $+BIAS
CALL CRLF ;send cr,lf to console
LXI D,SYSMSG
CALL PRNMSG
LXI H,RDWRFLG ;point to rd/wr flag buffer
MVI M,1 ;set it for write operations
CALL RDWRSYS ;
DONE: EQU $+BIAS
LXI D,FDONE ;say function complete
CALL PRNSTR ;to the console
JMP DESTDR ;want another drive?
;
BADVERS:EQU $+BIAS
LXI D,SORRY
CALL PRNSTR
HLT
;
EXIT: EQU $+BIAS ;
MVI C,0
CALL DSKSEL ;select drive A
CALL CRLF ;output a cr,lf sequence
JMP 0 ;return to cp/m
;
BADNAME:EQU $+BIAS ;
LXI D,INVLDR ;say invalid drive name
CALL PRNMSG ;to the console
RET
;
BADOPEN:EQU $+BIAS
LXI D,NOOPEN ;say cant open the file
CALL PRNMSG ;to the console
JMP EXIT ;back to cp/m
;
BADWR: EQU $+BIAS
LXI D,WRBAD ;say bad write operation
CALL PRNMSG
JMP EXIT
;
WRFILE: EQU $+BIAS
CALL CRLF
;
MVI B,14
LXI D,FILNAM
LXI H,FRSTCHAR
OVER: EQU $+BIAS
LDAX D
MOV M,A
INX H
INX D
DCR B
JNZ OVER
XRA A
STA FCB
STA CURREC
;
MVI C,SELDRV
LDA CURRDRV
MOV E,A
CALL BDOS
;
LXI D,FCB
MVI C,FILDEL
CALL BDOS
LXI D,FCB
MVI C,FILMAK
CALL BDOS
INR A
JZ BADOPEN
LXI D,FILMSG
CALL PRNMSG
LXI H,SYSIMG ;start of system image
WRFIL: EQU $+BIAS
PUSH H
XCHG
CALL BUFSET
LXI D,FCB
MVI C,WRSEQ
CALL BDOS
POP H
ORA A
JNZ BADWR ;say bad write
LXI D,DMAINCR ;increment dma by 80h
DAD D
PUSH H
MVI A,50H ;# of cp/m sectors
LXI H,CURREC
CMP M
POP H
JZ CLOSIT
JMP WRFIL
;
CLOSIT: EQU $+BIAS
LXI D,FCB
MVI C,CLOSFIL
CALL BDOS
INR A
JNZ DONE
;
BADCLOS:EQU $+BIAS
LXI D,NOCLOSE
CALL PRNMSG
JMP EXIT
;
SORRY: EQU $+BIAS
DB CR,LF,TAB,'SORRY, BAD'
DB ' VERSION OF CP/M',BELL,'$'
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Routines for selecting drive, track, sector and setting of
; disk memory access address when reading or writing sys trks.
; Module provides for up to 10 tries at read or write
; and gives an error message if errors are detected.
;
RDWRSYS:EQU $+BIAS ;
; select which drive
LDA CURRDRV ;get current disk number
MOV C,A
CALL DSKSEL ;select disk
; initialize dma address
LXI H,SYSIMG ;start of cp/m image
SHLD IMGADR ;current image addr buffer
; initialize current track buffer
MVI A,0FFH ;track zero-1
STA TRKBUF ;current track buffer
; initialize skew pointer to first entry in skew table
LXI H,SKWTBL ;point to skew table
SHLD SKWPTR ;put in skew pointer buffer
; now set the track number
;
TRAKSET:EQU $+BIAS ;
LXI H,TRKBUF ;get previous track #
INR M ;advance track #
MVI A,2 ;get # of system tracks
CMP M ;see if done
RZ ;if so, return
LXI H,TRKBUF ;get track number
MOV C,M
CALL TRKSET ;set track number
;
; initialize sector number to zero
XRA A ;zero the accumulator
STA SECBUF ;sector number buffer
; now set sector and dma in accordance with skew table
SCTRSET:EQU $+BIAS ;
MVI A,28H ;get # of sectors/track
LXI H,SECBUF ;get current sector number
CMP M ;see if done
JZ ADJDMA ;
INR M ;advance sector number
LDA TRKBUF ;get current track #
ORA A
JNZ SCTR ;
LDA SECBUF ;get sector #
MOV E,A
MVI D,0
LHLD SKWPTR ;get skew pointer
DCX H
DAD D
MOV A,M
CPI 1H
JC SCTRSET ;
SCTR: EQU $+BIAS ;
LXI H,SECBUF ;point to sector # buffer
MOV E,M ;store sector # in DE pair
MVI D,0
LHLD SKWPTR ;get skew pointer
MOV B,M
DCX H
DAD D
MOV C,M
PUSH B
CALL SECSET ;set sector
POP B
MOV A,C
SUB B
CALL X128 ;
XCHG
LHLD IMGADR ;get current image address
DAD D
MOV B,H
MOV C,L
CALL DMASET ;set dma address
;
; set read/write retry counter to zero
XRA A
STA RETRY ;set re-try counter to 0
; now read or write up to 10 times until no error is detected
TRYX10: EQU $+BIAS ;
LDA RETRY ;get re-try count
CPI 0AH ;allow 10 of them
JC RDWRTRY ;
LXI D,PERMERR ;say permanent error
CALL PRNSTR ;to the console
CALL CONIN ;
CPI 0DH
JNZ EXIT ;
CALL CRLF ;
JMP SCTRSET ;
RDWRTRY:EQU $+BIAS ;
INR A
STA RETRY ;bump re-try counter
LDA RDWRFLG ;see if read or write
ORA A
JZ READIT ;if zero, then read
CALL SECWR ;write sector
JMP ERRCHK ;
;
READIT: EQU $+BIAS ;
CALL SECRD ;
;
ERRCHK: EQU $+BIAS ;
ORA A
JZ SCTRSET ;if zero, then do another sec
JMP TRYX10 ;else try again
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; This routine multiplies sector number by 128 to adjust the
; current dma address.
;
ADJDMA: EQU $+BIAS
MVI A,28H ;get # of sectors/track
CALL X128 ;multiply by 128
XCHG
LHLD IMGADR ;get current image sddr
DAD D ;adjust it
SHLD IMGADR ;store it
JMP TRAKSET
X128: EQU $+BIAS ;
MOV L,A
MVI H,0
DAD H
DAD H
DAD H
DAD H
DAD H
DAD H
DAD H
RET
;
SKWGEN: EQU $+BIAS
LXI H,SKWTBL
MVI A,15H
;
SKWGEN1:EQU $+BIAS
SUI 14H
CALL FOURSEC
ADI 10H
CALL FOURSEC
CPI 29H
JNZ SKWGEN1
RET
;
FOURSEC:EQU $+BIAS
MVI C,4
SKWWR: EQU $+BIAS
MOV M,A
INX H
INR A
DCR C
JNZ SKWWR
RET
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Routines for msg out to console.
;
CRLF: EQU $+BIAS ;get carriage ret, line feed
LXI D,CRLFMSG ;point to it
JMP PRNSTR ;send it to console
;
CRLFMSG:EQU $+BIAS ;carriage ret, line feed
DB CR,LF,'$'
;
PRNMSG: EQU $+BIAS ;
PUSH D
CALL CRLF ;get carriage ret, line feed
POP D
; fall through to prnstr
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; BDOS and BIOS functions
;
PRNSTR: EQU $+BIAS ;
MVI C,PRTSTRG ;print string to console
JMP BDOS
;
DSKSEL: EQU $+BIAS ;
LHLD BIOSV
LXI D,SELDSK ;select disk drive
DAD D
PCHL
;
TRKSET: EQU $+BIAS ;
PUSH B
MVI B,0 ;zero the B register
CALL TRKSET1 ;set track number
POP B
RET
;
TRKSET1:EQU $+BIAS ;
LHLD BIOSV
LXI D,SETTRK ;set track number
DAD D
PCHL
;
SECSET: EQU $+BIAS ;
LHLD BIOSV
LXI D,SETSEC ;set sector number
DAD D
PCHL
;
DMASET: EQU $+BIAS
LHLD BIOSV
LXI D,SETDMA ;set disk memory address
DAD D
PCHL
;
SECRD: EQU $+BIAS ;
LHLD BIOSV
LXI D,RDSEC ;read selected sector
DAD D
PCHL
;
SECWR: EQU $+BIAS ;
LHLD BIOSV
LXI D,WRSEC ;write selected sector
DAD D
PCHL
;
SEQRD: EQU $+BIAS ;
MVI C,RDSEQ ;read next 128 bytes to dma
JMP BDOS
;
BUFSET: EQU $+BIAS
MVI C,SETBUF ;set the dma
JMP BDOS
;
OPEN: EQU $+BIAS ;
MVI C,OPNFIL ;open the file
JMP BDOS
;
CONIN: EQU $+BIAS
MVI C,CONSIN ;console input
CALL BDOS
CPI 60H ;convert to upper case
RC
CPI 7BH
RNC
ANI 5FH
RET
;
; Messages for the console
;
SIGNON: EQU $+BIAS ;
DB TAB,'GENESYS vers 3.2',CR,LF
DB TAB,'for cp/m 1.45,2.01,2.2,2.21A or 2.22',CR,LF
DB TAB,'on North Star DQ w/Lifeboat bios'
DB CR,LF,TAB,'July 18, 1981',CR,LF,'$'
;
SRCNAME:EQU $+BIAS ;
DB TAB,'Source drive NAME: $'
;
SRCMSG: EQU $+BIAS ;
DB TAB,'Put SOURCE disk on: '
;
SRCDRV: EQU $+BIAS ;
DB 0,', & hit RETURN$'
;
IMG0100:EQU $+BIAS ;
DB CR,LF,TAB,'CP/M image in RAM from 100H'
DB ' to 2900H$'
;
TODRV: EQU $+BIAS ;
DB CR,LF,TAB,'Destination drive NAME'
DB CR,LF,TAB,'(or RETURN to reboot): $'
;
DESTMSG:EQU $+BIAS ;
DB TAB,'Put DESTINATION disk on: '
;
DSTDR: EQU $+BIAS ;
DB 0,CR,LF,CR,LF,TAB,'& hit RETURN to write'
DB ' system'
DB CR,LF,TAB,'or, hit SPACE bar to save '
;
FILNAM: EQU $+BIAS
DB 'CPMxx COM',0,0,0,'$'
;
PERMERR:EQU $+BIAS ;
DB TAB,'Hard ERROR',BELL,'$'
;
FDONE: EQU $+BIAS ;
DB TAB,'Done',BELL,'$'
;
INVLDR: EQU $+BIAS ;
DB TAB,'Invalid, (Use A B C or D)$'
;
NOFILMSG:EQU $+BIAS ;
DB TAB,'No source file$'
;
INCMPMSG:EQU $+BIAS ;
DB TAB,'Source file incomplete$'
;
NOOPEN: EQU $+BIAS
DB TAB,'Can`t open file$'
;
WRBAD EQU $+BIAS
DB TAB,'Bad write -full disk?$'
;
NOCLOSE:EQU $+BIAS
DB TAB,'Can`t close file -write protected?$'
;
SYSMSG: EQU $+BIAS
DB TAB,'Writing cp/m system -wait-$'
;
FILMSG EQU $+BIAS
DB TAB,'Writing cp/m.com file -wait-$'
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Tables
;
CLDBTABL:EQU $+BIAS
DW STRT-1
DW STRT+3
DW STRT+7
DW STRT+0AH
DW TWOTRKS+7
DW TWOTRKS+0DH
DW STSECT+2
DW STSECT+0BH
DW STSECT+0EH
DW RDENBL+5
DW DELAY+3
DW DELAY+8
DW SYNCH+4
DW SYNCH+8
DW COUNT+6
DW COUNT+0FH
DW COUNT+12H
DW HALT+2
DW READSECS+2
DW TWOBLKS+8
DW TWOBLKS+0DH
DW TWOBLKS+12H
DW NEXTSEC+9
DW NEXTSEC+0DH
DW NEXTSEC+11H
DW NEXTSEC+20H
DW NEXTSEC+24H
DW INIT+2
DW CHNGBIOS+7
DW CHNGBIOS+0EH
DW BOOT+2
DW ADVSEC+2
DW ADVSEC+8
DW DETSEC+4
DW DETSEC+8
DW DETSEC+0EH
DW 0000H ;table scan terminator
;
ONEFOUR:EQU $+BIAS ;table for version 1.45
DW 1E40H ;promtabl
DW 1F00H ;bios
DW 090CH ;promhi
;
TWOZERO:EQU $+BIAS ;table for version 2.0x
DW 26B5H ;promtabl
DW 2000H ;bios
DW 26F5H ;promhi
;
TWOTWO: EQU $+BIAS ;table for version 2.2x
DW 1511H ;promtabl
DW 2000H ;bios
DW 26F5H ;promhi
;
PEND EQU $+BIAS
DS DEST2-PEND
;
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Bdos function call equates
;
CONSIN EQU 01H ;console input
RDSEQ EQU 14H ;read sequential
WRSEQ EQU 15H ;write sequential
SELDRV EQU 0EH ;select disk
SETBUF EQU 1AH ;set dma
OPNFIL EQU 0FH ;open file
FILDEL EQU 13H ;delete file
FILMAK EQU 16H ;make a file
CLOSFIL EQU 10H ;close file
PRTSTRG EQU 09H ;print string to console
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Bios function call equates
;
SELDSK EQU 18H ;select disk drive
SETTRK EQU 1BH ;set track number
SETSEC EQU 1EH ;set sector number
SETDMA EQU 21H ;set disk memory address
RDSEC EQU 24H ;read selected sector
WRSEC EQU 27H ;write selected sector
;
;=============================================================
;
; COLDBOOT LOADER FOR NORTH STAR
;
; WILL LOAD ALL SECTORS ON BOTH SYSTEM TRACKS TO RAM BEGINNING
; AT CCP-900H THUS GIVING A SECOND USER AREA OF UP TO 2KBYTES.
; THE SOFTWARE SKIPS READING OF SECTOR 4 ON TRACK 1 SINCE THAT
; SECTOR IS LOADED BY THE BOOTSTRAP PROM ON THE DISK CONTROLLER.
;
; R. L. PLOUFFE
; 12/19/80
;
;=============================================================
;
ORIG EQU 0807H ;
PROM EQU 0E800H ;DISK CONTR PROM ADDRESS
;DO NOT CHANGE EVEN IF YOU HAVE
;RELOCATED YOUR PROM. THE COLD BOOT
;LOADER NEEDS THIS VALUE TO DETERMINE
;AMOUNT BY WHICH YOU HAVE MOVED YOUR
;PROM AND THEN PATCH ALL PROM DEPENDENT
;BYTES IN THE BIOS BY ADDING THE DIFF-
;ERENCE.
USER2 EQU ORIG-800H-7H ;LOCATION OF 2ND USER AREA
CMDMSB EQU (PROM+300H)/256 ;HI BYTE OF CONTROLLER COMMANDS
DSKRD EQU 40H ;BYTE FOR READ COMMAND
ASTAT EQU 10H ;LO BYTE FOR A STATUS MASK
RSTSEC EQU 11H ;LO BYTE FOR RESET SECTOR COMMAND
STEPIN EQU 21H ;LO BYTE FOR STEP-IN CMD, DR 1
STEPIN1 EQU 31H ;LSB FOR STEPIN,DR1,HEAD LOADED
CMOTON EQU 35H ;MOTORS ON, GET C-STATUS
RESET EQU 07H ;RESET CONTROLLER, DESELECT DRIVES
;AND STOP THE MOTORS
DMA EQU USER2 ;BEGINNING RAM ADDRESS
STACK1 EQU USER2 ;STACK
;
DEST2 EQU DEST+707H
ORG ORIG
SOURCE2 EQU $
BIAS1 EQU DEST2-SOURCE2
SOURCE1 EQU $+BIAS1
;
JMP INIT
STRT: EQU $+BIAS1
DI
LXI SP,STACK1+BIAS1
XCHG
SHLD RDCMD
LXI H,DMA+BIAS1
MVI E,2
TWOTRKS0:EQU $+BIAS1
LXI B,0A00H
TWOTRKS:EQU $+BIAS1
PUSH H
PUSH B
PUSH D
MOV A,E
DCR A
JZ READ
MOV A,C
CPI 4
JZ NEXTSEC
READ: EQU $+BIAS1
PUSH H
STSECT: EQU $+BIAS1
CALL ONESEC
MVI L,CMOTON
MOV A,M
ANI 0FH
CMP C
JNZ STSECT
LHLD RDCMD
MVI L,ASTAT
RDENBL: EQU $+BIAS1
MOV A,M
ANI 4
JZ RDENBL
MVI A,9
DELAY: EQU $+BIAS1
DCR A
JNZ DELAY
MVI B,8CH
LHLD RDCMD
MVI L,ASTAT
SYNCH: EQU $+BIAS1
MOV A,M
RRC
JC READSECS
DCR B
JNZ SYNCH
;
REBOOT: EQU $+BIAS1
LXI H,0FFFFH
COUNT: EQU $+BIAS1
INX H
MOV A,M
CPI 76H
JZ COUNT
MVI A,76H
MOV M,A
MOV A,L
CPI 07H
JZ HALT
LHLD RDCMD
DCR H
DCR H
DCR H
MVI L,0
PCHL
;
HALT: EQU $+BIAS1
LHLD RDCMD
MVI L,RESET ;RESET THE DISK CONTROLLER
MOV A,M ;DO IT
HLT ;STOP THE COMPUTER
;
READSECS:EQU $+BIAS1
LHLD RDCMD
XCHG
POP H
MVI B,0
MVI L,0
MVI C,2
TWOBLKS:EQU $+BIAS1
LDAX D
MOV M,A
XRA B
RLC
MOV B,A
INR L
JNZ TWOBLKS
INR H
DCR C
JNZ TWOBLKS
LDAX D
XRA B
JNZ REBOOT
NEXTSEC:EQU $+BIAS1
POP D
POP B
POP H
INR H
INR H
INR C
DCR B
JNZ TWOTRKS
DCR E
JZ INIT
PUSH H
LHLD RDCMD
DCR H
MVI L,STEPIN
MOV A,M
MVI L,STEPIN1
MOV A,M
MVI L,STEPIN
MOV A,M
MVI D,2
CALL ADVSEC
POP H
JMP TWOTRKS0
;
INIT: EQU $+BIAS1
LDA CMDHI
SUI CMDMSB
MOV C,A
LXI H,0000H ;0000H, storage location for
;PROMTABL address
CHNGBIOS:EQU $+BIAS1
MOV E,M
INX H
MOV D,M
MOV A,M
ORA E
JZ BOOT
LDAX D
ADD C
STAX D
INX H
JMP CHNGBIOS
;
;
ONESEC: EQU $+BIAS1
MVI D,1
ADVSEC: EQU $+BIAS1
LHLD RDCMD
MVI L,RSTSEC
MOV A,M
LHLD RDCMD
MVI L,ASTAT
DETSEC: EQU $+BIAS1
MOV A,M
ORA A
JP DETSEC
DCR D
LHLD RDCMD
MVI L,RSTSEC
MOV A,M
JNZ ADVSEC
RET
;
DUPL: EQU $+BIAS1
DW 0EB40H ;duplicate required here for 2.21A
;gets patched to correct prom by the
;patch table in bdos
;
BOOT: EQU $+BIAS1
LDA CMDHI
SUI 3
STA 0000H ;0000H, storage location for
;addr of PROM hi byte
JMP 0000H ;storage loc. for jmp to BIOS
;
RDCMD: EQU $+BIAS1
DB DSKRD
CMDHI: EQU $+BIAS1
DB CMDMSB
;
PEND1 EQU $+BIAS1
;
;==========================================================
;
; Buffer space
;
SKWTBL: EQU $+BIAS1
DS 40 ;written by SKWGEN
;
CURRDRV:EQU $+BIAS1 ;current disk # buffer
DS 1
;
TRKBUF: EQU $+BIAS1 ;current track buffer
DS 1
;
SECBUF: EQU $+BIAS1 ;sector number buffer
DS 1
;
RDWRFLG:EQU $+BIAS1 ;read/write flag WRITE=1
DS 1
;
IMGADR: EQU $+BIAS1 ;current image address
DS 2
;
RETRY: EQU $+BIAS1 ;buffer for re-try count
DS 1
;
SKWPTR: EQU $+BIAS1 ;skew pointer buffer
DS 2
;
DS 207 ;stack area
STACK: EQU $+BIAS1
;
; the
END