|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 7552 (0x1d80) Types: TextFile Names: »BOOT.ASM«
└─⟦b445f10af⟧ Bits:30004389 CP/M Plus Source files └─ ⟦this⟧ »BOOT.ASM«
TITLE 'BOOT MODULE FOR CP/M 3.0 BIOS - DATE 831208' PAGE 43 ;************************************************************************ ;* THE BOOT MODULE PERFORMS SYSTEM INITIALIZATION OTHER THAN * ;* CHARACTER AND DISK I/O .BOOT LOADS THE CCP FOR COLD START * ;* AND RELOADS IT FOR WARM STARTS * ;************************************************************************ PUBLIC ?INIT ; PUBLIC ?LDCCP ; PUBLIC ?RLCCP ; PUBLIC ?TIME ; PUBLIC DMYINT,TIMER PUBLIC DSKTMR,MONCNT ; EXTRN MA3MIR ;(MOVE) EXTRN DISK$MSG,SIGNON$MSG,BIOS$MSG ;(DRVTBL) EXTRN VECTOR EXTRN ?CONIN,@CBNK EXTRN ?PDERR,?PDEC,?PMSG EXTRN ?MOVE,?XMOVE,?BNKSL EXTRN @CIVEC,@COVEC,@AIVEC,@AOVEC,@LOVEC EXTRN @DATE,@HOUR,@MIN,@SEC MACLIB PORTS MACLIB Z80 BDOS EQU 0005H ; PAGE DSEG ;BANKED MEMORY ;************************************************************************ ;* SYSTEM INITIALIZATION * ;* * ;* INPUT : NONE * ;* * ;* OUTPUT: NONE * ;* * ;************************************************************************ ?INIT: LXI H,8000H ;ASSIGN CONSOLE TO CRT SHLD @CIVEC ; SHLD @COVEC ; LXI H,4000H ;ASSIGN PRINTER TO LPT SHLD @LOVEC ; LXI H,2000H ;ASSIGN AUX TO MODEM SHLD @AIVEC ; SHLD @AOVEC ; LXI H,INIT$TABLE ;SET UP MISC. HARDWARE CALL OUT$BLOCKS ; CALL HW$INIT ; if banked MVI C,TPABANK ;SOURCE BANK MVI B,SYSBANK ;DESTINATION BANK CALL ?XMOVE ; LXI B,0C000H ;BYTE COUNT LXI D,00H ;SOURCE ADDR LXI H,00H ;DESTINATION ADDR CALL ?MOVE ;COPY TPABANK INTO SYSBANK endif LXI H,SIGNON$MSG ;PRINT SIGNON MESSAGE CALL ?PMSG ; LXI H,DISK$MSG ;PRINT DISK TYPE MESSAGE CALL ?PMSG ; LXI H,BIOS$MSG ; CALL ?PMSG ; JMP SHIFT$BANK OUT$BLOCKS: MOV A,M ;GET COUNT VALUE ORA A ; RZ ; MOV B,A ;GET COUNT VALUE INTO <B> INX H ; MOV C,M ;GET PORT ADDRESS INTO <C> INX H ;<HL> POINTER TO OUTPUT VALUE OUTIR ; JMP OUT$BLOCKS ; INIT$TABLE: DB 1,P$DMA$CLEAR,0 ;CLEAR DMA DB 1,P$DMA$STAT,C$DMA$BYTE ;SET HARDWARE ATTRIBUTES DB 4,P$DMA$MODE,88H,85H,82H,83H ;SET CH.0-3 MODE REG. DB 00H ;TABLE TERMINATOR ;************************************************************************* ; I/O AND HARDWARE INITIALIZATION ROUTINE ;************************************************************************* HW$INIT: MVI A,0FFH ;DELAY 1/4 SECOND FOR ANY ;UART CHAR IN PROGRESS SDLY: MVI L,070H DCR L JNZ $-1 DCR A JNZ SDLY DI ;--------------------------INIT TIMER------------------------------------ MVI A,03H ;INIT ALSO SOFTWARE TIMER OUT P$DMA$INT ;CH0 RESET OUT P$MFD$INT ;CH1 RESET OUT P$SCI$INT ;CH3 RESET LXI H,VECTOR ; MOV A,L ; OUT P$CTC ; MVI A,0A5H ; OUT P$TIM$INT ;CH2 USED AS SOFTWARE TIMER MVI A,195 ;...AND BUS TIMER OUT P$TIM$INT ;INTERRUPT EVERY 12.5 MILLISECONDS ;--------------------------INIT CPU--------------------------------------- MOV A,H ;CTC INTERRUPT VECTOR TABLE ADDRESS STAI ;MOV I,A INITIALIZE CPU PART OF IM2 ;IM 2 INTERRUPT LOGIC EI ; RET ;FINALLY DONE WITH ALL THAT PAGE CSEG ;REST IS IN COMMON MEMORY ;************************************************************************ ;* THE BOOT LOADER LOADS THE CCP FROM A FILE CALLED CCP.SYS * ;* ON THE SYSTEM DRIVE * ;* * ;* INPUT : NONE * ;* * ;* OUTPUT: NONE * ;* * ;************************************************************************ ?LDCCP: XRA A ; STA CCP$FCB+15 ;ZERO EXTENT LXI H,00H ;START AT BEGINNING OF FILE SHLD FCB$NR ; LXI D,CCP$FCB ; CALL OPEN ;OPEN FILE CONTAINING CCP INR A ; JZ NO$CCP ;ERROR IF NO FILE LXI D,100H ;START OF TPA CALL SETDMA ; LXI D,128 ;ALLOW UP TO 16K BYTES CALL SETMULTI ; LXI D,CCP$FCB ; CALL READ ;LOAD CCP if banked MVI C,TPABANK ;SOURCE BANK MVI B,SYSBANK ;DESTINATION BANK CALL ?XMOVE LXI B,0C80H ;BYTE COUNT LXI D,0100H ;SOURCE ADDR LXI H,0100H ;DESTINATION ADDR CALL ?MOVE ;COPY CCP FROM TPABANK TO SYSBANK endif RET NO$CCP: LXI H,CCP$MSG ; CALL ?PMSG ; RESP: CALL ?CONIN ;GET A RESPONSE JMP ?LDCCP ;AND TRY AGAIN PAGE ;************************************************************************ ;* * ;************************************************************************ ?RLCCP: if banked MVI C,SYSBANK ;SOURCE BANK MVI B,TPABANK ;DESTINATION BANK CALL ?XMOVE LXI B,0C80H ;BYTE COUNT LXI H,100H ;DESTINATION ADDR LXI D,100H ;SOURCE ADDR CALL ?MOVE ;COPY CCP FROM SYSBANK TO TPABANK RET else JMP ?LDCCP endif ;----------------------------------------------------------------------- SHIFT$BANK: MVI A,SYSBANK CALL ?BNKSL RET ;************************************************************************ ;* * ;************************************************************************ ?TIME: MOV A,C ;GET FLAG FROM <C> CPI 0FFH ;CHECK FOR SET FLAG JNZ TIME$EXIT ; MVI A,0 ;IF BDOS HAS UPDATED SCB STA COUNT ; THEN RESET COUNT TIME$EXIT: RET ; ;======================================================================== ; CP/M BDOS FUNCTION INTERFACES OPEN: MVI C,15 ; JMP BDOS ; SETDMA: MVI C,26 ; JMP BDOS ; SETMULTI: MVI C,44 ; JMP BDOS ; READ: MVI C,20 ; JMP BDOS ; CCP$MSG: DB CR,LF,'BIOS Error: No CCP.SYS',0 CCP$FCB: DB CCP$DRIVE ;DRIVE DB 'CCP ' ;NAME DB 'SYS' ;TYPE DB 0,0,0,0 ; DS 16 ; FCB$NR: DB 0,0,0 ; ;*********************************************************************** ; 12.5 MSEC. TIMER INTERRUPT SERVICE ROUTINE ;*********************************************************************** MONCNT: DB 0 DSKTMR: DB 0 COUNT: DB 0 TIMER: PUSH PSW ;SAVE ALL REGISTERS PUSH B PUSH D PUSH H LDA COUNT ; ADI 1 ; CPI 80 ;12.5 mSEC * 80 = 1 SEC JC MOTCHK ; NEWSEC: LDA @SEC ; ADI 1 ; DAA ; CPI 60H ; JZ NEWMIN ; PUTSEC: STA @SEC ;STORE NEW SECONDS SUB A ; JMP MOTCHK ; NEWMIN: LDA @MIN ; ADI 1 ; DAA ; CPI 60H ; JZ NEWHOUR ; PUTMIN: STA @MIN ;STORE NEW MINUTES SUB A ;CLEAR SECONDS JMP PUTSEC ; NEWHOUR: LDA @HOUR ; ADI 1 ; DAA ; CPI 24H ;CHECK FOR DAY CROSSING JZ NEWDAY ; PUTHOUR: STA @HOUR ;STORE NEW HOUR SUB A ;CLEAR MINUTES JMP PUTMIN ; NEWDAY: LHLD @DATE ; INX H ; SHLD @DATE ;STORE NEW DATE SUB A ;CLEAR HOURS JMP PUTHOUR ; MOTCHK: STA COUNT ;STORE TIMER COUNT LDA MA3MIR ;CHECK IF MOTORS IS OFF ANI 080H ;MOTENB JZ TIMER1 ; LDA DSKTMR ;TEST IF 2 SEC HAS ELAPSED ANA A ; WITHOUT DISK ACCESS JNZ TIMER1 ; LDA MONCNT ; INR A ; STA MONCNT ; CPI 03H ;HAVE WE BEEN AT THIS FOR SIX SEC YET JNZ NEXT2 ; LDA MA3MIR ;IF SIX SEC HAS ELAPSED ANI 0FH ; STA MA3MIR ; OUT P$MAP3 ;SHUT OFF MINI MOTOR JMP TIMER1 ; NEXT2: MVI A,160 ;160*12.5 mSEC = 2 SEC STA DSKTMR ;SET ANOTHER 2 SEC DELAY TIMER1: LDA DSKTMR ;GET MINI FLOPPY MOTOR ON COUNTER ANA A JZ TEXIT ;IF NOT TIMED OUT DCR A ;COUNT DOWN STA DSKTMR ;OPDATE MEMORY IMAGE TEXIT: POP H ;RESTORE ALL REGISTERS POP D ; POP B ; POP PSW ; DMYINT: ;DUMMY INTERRUPTS CAN ENTER HERE EI RETI END «eof»