BIOSSZ EQU 512 ; TPA EQU 100H ; ; ; PASCAL BOOT MAINTENCE PROGRAM ; ; BOOTER MAY BE READ IN FROM CURRENT PASCAL DISK AND MOVED ; ONTO ANY NUMBER OF NEW DISKETTES ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC. ; ; BOOT EQU 0 BDOS EQU 5 RDCON EQU 1 WRBUF EQU 9 START EQU 900H ENDPT EQU START+128+256+768+BIOSSZ ;BOOT+PINIT+SPARE+BIOS NSECTS EQU (ENDPT-START)/128 FSTSCT EQU 1 ; CR EQU 0DH LF EQU 0AH EOM EQU '$' ; ; ; ORG TPA ; ; LXI SP,STACK MAIN: CALL SAY$TITLE CALL GET$BOOTER CALL PUT$BOOTER JMP REBOOT ; ; HOME: ;HOME DISK LHLD BOOT+1 MVI L,18H PCHL ; SELDSK: ;SELECT DISK LHLD BOOT+1 MVI L,1BH PCHL ; SETTRK: ;SET TRACK LHLD BOOT+1 MVI L,1EH PCHL ; SETSEC: ;SET SECTOR LHLD BOOT+1 MVI L,21H PCHL ; SETDMA: ;SET DMA ADDRESS LHLD BOOT+1 MVI L,24H PCHL ; READ: ;READ A SECTOR LHLD BOOT+1 MVI L,27H PCHL ; WRITE: ;WRITE A SECTOR LHLD BOOT+1 MVI L,2AH PCHL ; ; SAY$TITLE: ;JUST SAY WHO WE ARE MVI C,WRBUF LXI D,HELLO$MSG CALL BDOS RET ; ; GET$BOOTER: ;MAYBE A BOOTER COMES IN MVI C,WRBUF LXI D,GET$MSG CALL BDOS CALL CK$YES RC ;THAT'S ALL FOR HERE MVI C,WRBUF LXI D,READ$MSG ;SAY HEY CALL BDOS CALL WAIT$FOR$RET ;AND WAIT CALL DO$READ RET ;DONE ; ; PUT$BOOTER: ;DOES THE BOOTER GO OUT? MVI C,WRBUF ;ASK LXI D,PUT$MSG CALL BDOS CALL CK$YES ;IF THE ANSWER IS NOT YES RC ;LEAVE PUT$AGAIN: ;ELSE START TO PUT MVI C,WRBUF LXI D,WRITE$MSG CALL BDOS ;DO ANOTHER CONFIRM MSG CALL WAIT$FOR$RET ;AND HOLD UP CALL DO$WRITE ;NOW PUT IT OUT MVI C,WRBUF ;IS THIS A LOOP? LXI D,AGAIN$MSG CALL BDOS CALL CK$YES JNC PUT$AGAIN ;GUESS SO RET ;ALL DONE ; ; REBOOT: ;PULL BACK CP/M MVI C,WRBUF LXI D,REBOOT$MSG CALL BDOS CALL WAIT$FOR$RET JMP BOOT ; ; CK$YES: ;CHECK FOR A YES RESPONSE MVI C,RDCON CALL BDOS CPI 03H ;DON'T FORGET ^C JZ BOOT CPI 'Y' ;UPPER CASE RZ CPI 79H ;AND LOWER RZ STC ;NOT THERE RET ; ; WAIT$FOR$RET: ;HANG AROUND MVI C,RDCON CALL BDOS CPI 03H ;TEST FOR REBOOT REQUEST JZ BOOT CPI CR ;LEAVE WHEN READY JNZ WAIT$FOR$RET RET ; ; DO$READ: ;READ IN THE BOOTER MVI C,0 ;SELECT DISK CALL SELDSK CALL HOME ;MAKE SURE IT'S INITIALIZED LXI B,START ;SET WHERE WE START IN RAM LXI D,NSECTS SHL 8 + FSTSCT ;SIZE AND THE FIRST SECTOR DR$LOOP: ;THEN PUT IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL READ POP D POP B LXI H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DR$LOOP RET ; ; DO$WRITE: ;WRITE OUT THE BOOTER MVI C,0 ;SELECT THE DISK CALL SELDSK CALL HOME LXI B,START LXI D,NSECTS SHL 8 + FSTSCT DW$LOOP: ;ALL PARAMS SET - RUN IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL WRITE POP D POP B LXI H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DW$LOOP RET ; ; ; HELLO$MSG: DB CR,LF,'Pgen Version 1.0',CR,LF,EOM GET$MSG: DB CR,LF,'Get Booter?(y/n)',eom READ$MSG: DB CR,LF,'Reading Booter from drive A, type return ',eom PUT$MSG: DB CR,LF,LF,'Put Booter?(y/n)',eom WRITE$MSG: DB CR,LF,'Writing Booter to drive A, type return ',eom AGAIN$MSG: DB CR,LF,'Again?(y/n)',eom REBOOT$MSG: DB CR,LF,LF,'Rebooting CP/M, type return ',eom ; ; DS 256 STACK EQU $ ; ; ; END TPA