;------------------------------------------------------------ ; ; SOFT BOOT FOR MICRO/SYS CP/M SYSTEM ; VERSION 2.2, MINI-FLOPPY VERSION ; ; THIS LOADER IS READ FROM TRACK 0, SECTOR 1 BY ; MHBOOT PROM. IT LOADS CP/M FROM THE REST OF ; TRACK 0 AND ALL OF TRACKS 1,2, AND 3. ; ; DMA SUPPORT REQUIRES MHBOOT PROM THAT ; HAS DMA ROUTINES, AS CALLS ARE MADE TO ; MHBOOT ROUTINES. ; ; 10/1/80 MICRO/SYS, DYSCUS ; ;------------------------------------------------------------ ; FALSE: EQU 0 TRUE: EQU NOT FALSE ; MSIZE: EQU 20 ;MEMORY SIZE DMA: EQU FALSE ;OPTIONAL DMA SUPPORT ; ; CBASE: EQU 0C8H ;SB8420 BASE ADDRESS CSTAT: EQU CBASE+1 ;SB8420 CHAN 0 STATUS PORT CCOM: EQU CBASE+1 ;SB8420 CHAN 0 COMMAND PORT IS SAME CDATA: EQU CBASE ;SB8420 CHAN 0 DATA PORT CKBR: EQU 2 ;SB8420 KEYBOARD READY BIT CPTR: EQU 1 ;SB8420 PRINTER READY BIT ; ; FBASE: EQU 0C0H ;SB8500 FDC BASE ADDRESS FDSTAT: EQU FBASE ;SB8500 FDC STATUS PORT FDDATA: EQU FBASE+1 ;SB8500 DATA PORT FDTC: EQU FBASE+2 ;SB8500 TERMINAL COUNT PORT FDCREQ: EQU FBASE+2 ;SB8500 REQUEST PORT FDCBSY: EQU 10H ;FDC BUSY BIT ; ; XREAD: EQU 26H ;READ COMMAND XRECAL: EQU 7 ;RECALIBRATE (HOME) COMMAND XSNSIS: EQU 8 ;SENSE INTERRUPT STATUS COMMAND XSEEK: EQU 0FH ;SEEK COMMAND ; ; XN: EQU 0 ;BYTES/SECTOR CODE (SINGLE DENSITY) XEOT: EQU 16 ;SECTORS/TRACK XGPL: EQU 7 ;GAP LENGTH XDTL: EQU 128 ;BYTES/SECTOR XNOSTR: EQU 4 ;NUMBER OF TRACKS FOR CP/M ; ; BIAS: EQU (MSIZE-20)*1024 CCP: EQU BIAS+3400H BDOS: EQU CCP+806H BIOS: EQU CCP+1600H DMAST: EQU 0003H ;JUMP TO DMAST IN MHBOOT ; ORG 200H ; SBOOT: LXI H,CCP-80H ;POINT TO CPM LOAD ADDRESS IF NOT DMA RDTRK: LXI D,XEOT*XDTL ;# BYTES TO READ ENDIF IF DMA RDTRK: LXI D,XEOT*XDTL-1 ;DMAC EXPECTS # BYTES - 1 ENDIF CALL SREAD ;READ THEM LDA STRACK ;GET LAST TRACK READ INR A ;INCREMENT TRACK # STA STRACK ;SAVE IT IN FDCB CPI XNOSTR ;LAST TRACK YET? JC RDTRK ;NO, NOT DONE YET JMP BIOS ;YES, GO TO CPM ; ; SREAD: PUSH H ;SAVE LOAD ADDRESS LXI H,SFDCB ;POINT TO FDCB MVI M,XSEEK ;PUT SEEK COMMAND MVI B,3 ;3 BYTE FDCB CALL SFCMDN ;OUT TO FDC SWAIT: IN FDCREQ ;WAIT TILL DONE ORA A JP SWAIT MVI M,8 ;SENSE INTERRUPT MVI B,1 ;1 BYTE FDCB CALL SFCMDN ;SEND TO FDC CALL SRESLT ;GET RESULT BYTES IF DMA POP H ;GET LOAD ADDRESS CALL DMAST ;SET UP DMA WRITE TO MEMORY LXI D,XEOT*XDTL ;GET OFFSET DAD D ;SET LOAD ADDRESS FOR NEXT SECTOR PUSH H ;AND SAVE IT ON STACK ENDIF LXI H,SFDCB ;POINT TO FDCB MVI M,XREAD ;PUT READ COMMAND MVI B,9 ;9 BYTE FDCB CALL SFCMDN ;OUT TO FDC POP H ;GET LOAD ADDRESS IF NOT DMA SRDRQM: IN FDSTAT ;GET FDC STATUS ORA A ;CHECK RQM BIT JP SRDRQM ;NOT READY YET IN FDDATA ;GET DATA BYTE MOV M,A ;PUT IN MEMORY INX H ;NEXT LOCATION DCX D ;COUNT BYTES MOV A,D ;GET HIGH ORA E ;AND LOW JNZ SRDRQM ;MORE TO DO OUT FDTC ;STOP FDC ENDIF ; ; SRESLT: CALL SFDCRDY ;WAIT FOR CONTROLLER RP ;DIO IN SIGN/DONE IF 0 IN FDDATA ;GET BYTE JMP SRESLT ;BACK FOR MORE, 7 TOTAL ; ; SFCMDN: PUSH H ;SAVE FDCB ADDR SFCMDL: CALL SFDCRDY ;WAIT FOR CONTROLLER MOV A,M ;GET BYTE FROM FDCB OUT FDDATA ;SEND TO FDC INX H ;NEXT BYTE DCR B ;COUNT BYTES JNZ SFCMDL ;MORE TO DO POP H ;RESTORE FDCB ADDR RET ; ; SFDCRDY:IN FDSTAT ;GET STATUS ADD A ;RQM TO CARRY RC ;READY TO GO JMP SFDCRDY ;CONTINUE WAITING ; ; SFDCB: EQU $ DB 0 ;COMMAND DB 0 ;DRIVE STRACK: DB 0 ;TRACK DB 0 ;HEAD DB 1 ;SECTOR DB 0 ;BYTES/SECTOR DB XEOT ;LAST SECTOR NUMBER DB XGPL ;GAP LENGTH DB XDTL ;DATA LENGTH END SBOOT