; ; MAPPER5 2-3-81 ; ; MAPPER3 DIFFERS FROM MAPPER2 IN THE FOLLOWING WAYS: ; 1. MAPPER 3 ALLOWS HEAD SELECTION FROM 0-9, NOT 0-7 ; 2. MAPPER 3 DOES NOT USE DMA ; 3. MAPPER 3 FORMATS TRACK 0, MAPPER 2 DID NOT ; IOBASE EQU 90H BUSU EQU IOBASE BUSL EQU IOBASE+1 CMND EQU IOBASE+2 SCTAD EQU IOBASE+3 SCTBU EQU IOBASE+4 DMACL EQU IOBASE+5 DMACU EQU IOBASE+6 STATU EQU IOBASE+7 FALSE EQU 0 TRUE EQU NOT FALSE CMD EQU TRUE PAT EQU 2 MAXSEC EQU 35 MAPSIZE EQU 10 ;MAX ENTRIES ALLOWED IN MAP BACKSPACE EQU 08H MAXTRK EQU 803 ;LAST TRACK BEFOR SPARES CRLF EQU 0D0AH ; ; ; ; START ORG 100H LXI SP,STACK LXI D,UNMES ;PRINT UNIT? CALL PMES CALL CHRIN ANI 0FH CPI 4 JNC START ;IF OVERFLOW ASK AGAIN RLC RLC RLC RLC OUT BUSU MVI A,10H ;SELECT COMMAND OUT CMND ;SELECT UNIT IN STATU ANI 1 JZ USELERR ;IF NOT SELECTED, ERROR LXI D,HEADMES ;HEAD? QUESTION CALL PMES CALL CHRIN ANI 0FH STA CURHEAD IF CMD CPI 0 JZ HEADR ADI 15 ENDIF HEADR OUT BUSL MVI A,40H OUT 92H IN STATU ANI 20H JNZ HSELERR MENU LXI D,MENUMES ;1 TO APPEND, 2 TO CREATE LXI SP,STACK CALL PMES CALL CHRIN CPI '1' JZ M$ONE ;FIRST MENU SELECTION CPI '2' JZ M$TWO ;SECOND MENU SELECTION CPI '3' JZ M$THREE ;READ VERIFY TEST CPI '4' JZ M$FOUR CPI '5' JZ M$FIVE CPI '6' JZ START CPI '7' JZ 0 ;ABORT ; JMP MENU ;IF ILLEGAL ENTRY M$ONE CALL BLDNEW ;CLEARS THE MAP BUFFER THEN ENTERS NEW JMP MAPBLT ;PRINTS MAP THEN FORMATS, THEN VARIFIES M$TWO CALL APPEND ;GETS THE MAP AND APPENDS TRACKS TO IT JMP MAPBLT ;PRINTS MAP THEN FORMATS, THEN VARIFIES M$THREE CALL GETMAP ;GETS THE MAP CALL PRTMAP ;PRINTS THE MAP JMP MENU ;RESTARTS M$FOUR CALL BLDNEW CALL MAPWRT JMP MENU ;JUST REPLACED MAP ; APPEND CALL GETMAP ;PLACE MAP AT MAPBUF ; SEE IF BIT MAP MAKES SENCE LXI H,MAPBUF MVI B,MAPSIZE T1 MOV A,M CPI 0E5H ;IS END OF MAP FLAG SET? JZ MAPGOOD ;IF AT END ALL IS GOOD CPI 4 JNC MAPBAD ;TRACK ADDRESS OVER 1024 INX H INX H ;NEXT MSB DCR B JZ MAPBAD ;NO END IN SIGHT JMP T1 MAPBAD LXI D,KAPUTM CALL PMES JMP MENU BLDNEW LXI H,MAPBUF ;CLEAR MAP LXI D,512 ;SECTOR SIZE ZBUF MVI A,0E5H ;END OF SECTOR MARKER MOV M,A INX H DCX D MOV A,D ORA E JNZ ZBUF MAPGOOD ;PRINT THE MAP, GET ANY UPDATES LXI D,APMES ;ENTER TRACKS MESSAGE CALL PMES CALL PRTMAP ;PRINT MAP, RETURNS WITH H,L ;POINTING TO NEXT MAP LOCATION BTRKE XRA A MOV B,A ;MSB MOV C,A MOV D,A ;LSB MOV E,A ;ZERO CALL CHRIN CPI 0DH ;IS IT A CARRAGE RETURN? RZ JMP DD ;DONE APPENDING MAP NCHR CALL CHRIN CPI 0DH ;IS IT CR JZ SAVETRK ;WHEN CR B,C,D HOLD NEW TRACK DD CPI BACKSPACE JZ BAKUP CPI 3AH JNC BADCHR CPI '0' JC BADCHR MOV E,B MOV B,C MOV C,D ANI 0FH ;MAKE LSB IN A BINARY MOV D,A MOV A,E CPI 0 JNZ BADCHR JMP NCHR BADCHR PUSH H LXI D,BCHRMES CALL PMES POP H JMP BTRKE BAKUP MOV D,C MOV C,B MOV B,E JMP NCHR SAVETRK ;B,C,D EQUAL BINARY CODED DECIMAL ;MAKE INTO HEX AND STORE IN TRACK MAP PUSH H ;SAVE TRACK MAP POINTER MOV L,D ;UNITS MVI H,0 LXI D,10 ;D,E IS TEN DECIMAL MOV A,C TENADD CPI 0 ;IF ZERO THE TENS ARE DONE JZ TENCOM ;TENS COMPLETE JUMP DAD D DCR A JMP TENADD TENCOM LXI D,100 MOV A,B HUNADD CPI 0 JZ ALLCOM DAD D ;ADD ONE HUNDRED TO HEX COUNT DCR A JMP HUNADD ; ALLCOM ;H,L=BINARY BAD TRACK XCHG POP H ;TRACK MAP POINTER RESTORED MOV M,D INX H MOV M,E INX H ;POINTER INCREMENTED, WORD STORED ; PRINT A CARRAGE RETURN PUSH H PUSH D PUSH B MVI C,2 MVI E,0AH CALL 5 MVI C,2 MVI E,13 CALL 5 POP B POP D POP H JMP BTRKE ;GET NEXT ENTRY ; M$FIVE JMP VERONLY PRTMAP LXI D,BADTMES CALL PMES LXI H,MAPBUF LXI B,MAXTRK+1 NTRK MOV A,M ;GET MSB CPI 0E5H ;IS IT AT THE END RZ INX H MOV E,M ;LSB IN E INX H ;POINT TO NEXT MOV D,A PUSH H PUSH B CALL X16 ;PRINT 16 BIT BINARY NUMBER LXI D,TOMES CALL PMES POP D PUSH D CALL X16 LXI D,RETMES CALL PMES POP B INX B POP H JMP NTRK ; X16 PUSH H ;D,E=1 TO 999 XCHG ;PRINT AS 3 DECIMAL DIGITS MVI B,0 LXI D,-100 NHUN DAD D JNC HUNDONE INR B JMP NHUN HUNDONE MOV A,B STA HUN LXI D,100 DAD D ;ADD BACK 100 CAUSE WE ALWAYS GO TO FAR MVI B,0 LXI D,-10 NTEN DAD D JNC TENDONE INR B JMP NTEN TENDONE MOV A,B STA TEN LXI D,10 DAD D MOV A,L STA UNS ;NOW PRINT LDA HUN CALL HEXT LDA TEN CALL HEXT LDA UNS CALL HEXT POP H RET HEXT ANI 0FH CPI 0AH JC OKNUM ADI 7 OKNUM ADI 30H MOV E,A MVI C,2 CALL 5 RET ; CHRIN PUSH B PUSH D PUSH H MVI C,1 CALL 5 POP H POP D POP B RET ; ; GETMAP LXI D,0 CALL SEEK ;GO TO FIRST TRACK MVI A,MAXSEC ;MAPS SECTOR OUT SCTAD OUT STATU ;ZERO BUFFER XRA A OUT BUSU OUT BUSL MVI A,8 ;DISK READ COMMAND OUT CMND ;DO THE READ CALL WT OUT SCTAD ;ZERO THE BUFFER ADDRESS IN SCTBU ;TEST THE HEADER, TRACK FIRST CPI 0 JNZ DERR IN SCTBU CPI 0 JNZ DERR ;LAST TRACK BYTE LDA CURHEAD MOV B,A IN SCTBU ;NEXT HEADER BYTE IS HEAD CMP B JNZ DERR IN SCTBU CPI MAXSEC ;SECTOR SHOULD BE MAX JNZ DERR ; LXI D,MAPBUF ; MOV A,D ;SET DMA ADDRESS ; OUT DMACU ; MOV A,E ; OUT DMACL ; MVI A,4 ; OUT CMND LXI D,512 LXI H,MAPBUF NRBUF IN SCTBU MOV M,A INX H DCX D MOV A,D ORA E JNZ NRBUF RET ; ; SUBS ;TRANSLATE TRACK IN D,E TO A GOOD TRACK ; FINDT LXI H,MAPBUF MVI C,0 ;USED TO COUNT LOCATION IN TABLE ;TABLE POSITION=SPARE TRACK FINDN MOV A,M ;GET BYTE FROM TABLE,FIRST HALF RLC RC ;IF CARRY IT IS A GOOD TRACK ;(HIT END OF TABLE) MOV A,D ;MSB OF DESIRED TRACK CMP M ;IS IT EQUAL TO ADDRESS IN TABLE? INX H ;INCREMENT THE POINTER JNZ NOCMP ;JMP NOCMP IF NOT THE SAME MOV A,E ;LSB OF DESIRED TRACK CMP M ;IS LSB THE SAME AS TABLE? JZ SUBT ;IF BOTH ARE THE SAME GO SUBSTITUTE NOCMP INX H ;INCREMENT THE POINTER INR C JMP FINDN SUBT MVI B,0 LXI H,MAXTRK+1 DAD B ;H&L NOW EQUAL THE NEW TRACK XCHG ;D&E NOW EQUAL THE NEW TRACK JMP FINDT ;SEE IF NEW TRACK IS MAPPED MAPBLT CALL PRTMAP ;PRINT MAP TO VARIFY LXI D,REFORMES ;WARN BEFOR FORMATTING CALL PMES CALL CHRIN CPI 'Y' JZ DOIT ;IF Y WE ARE GO CPI 'N' JZ MENU ;IF N BOOT JMP MAPBLT ;SOME FOOL CANT READ ; DOIT ;FIRST WE KILL ALL BAD TRACKS LXI H,MAPBUF NKILL MOV A,M CPI 0E5H JZ WT0 ;WHEN AT END GO FORMAT GOOD MOV D,M INX H MOV E,M INX H PUSH H CALL SEEK ;GO TO TRACK IN D,E , NO SUBSTITUTION CALL KILLER ;KILLS ALL SECTORS POP H JMP NKILL ;KILL UNTIL END ; KILLER XRA A STA CURSEC ;START A ZERO NEXTKIL LDA CURSEC CPI MAXSEC-1 RNC ;RETURN WHEN ALL ARE DONE OUT SCTAD OUT STATU ;ZERO BUFFER MVI A,'E' ;ASCII E IN PLACE OF HEADER OUT SCTBU OUT SCTBU OUT SCTBU OUT SCTBU OUT STATU ;ZERO BUFFER AGAIN XRA A OUT BUSL OUT BUSU CALL WTDISK ;WRITE THE BAD HEADER LDA CURSEC INR A STA CURSEC JMP NEXTKIL ; WT0 ; WRITE THE MAP CALL MAPWRT JMP FORM MAPWRT LXI D,0 CALL SEEK ;SEEK ZERO XRA A OUT STATU OUT SCTBU OUT SCTBU ;HEADER, TRACK 0 LDA CURHEAD OUT SCTBU MVI A,MAXSEC OUT SCTBU OUT SCTAD ; HEADER NOW BUILT ; LXI D,MAPBUF ; MOV A,D ; OUT DMACU ; MOV A,E ;SET DMA ADDRESS ; OUT DMACL ; MVI A,02 ; OUT CMND LXI H,MAPBUF LXI D,512 NWBUF MOV A,M OUT SCTBU DCX D INX H MOV A,D ORA E JNZ NWBUF CALL WTDISK ;WRITE IT RET ; ;FORMAT THE DISK USING THE TABLE AND VARIABLE INTERLEAVE ; ; BUILD THE BUFFER FORM LXI H,516 OUT STATU BLOOP MVI A,0E5H OUT SCTBU ;LOAD SECTOR BUFFER DCX H ;DECREMENT WORD COUNT MOV A,H ORA L JNZ BLOOP ;IF NOT DONE DO ONE MORE SETUP XRA A STA SCOUNT STA BASE STA TRACK+1 ;SET TRACK EQUAL TO ONE STA CURSEC ; MVI A,1 ;IF STARTING AT 1 ONLY STA TRACK LXI D,0 ;1 IF STARTING AT 1 CALL SUBS CALL SEEK XRA A OUT BUSL OUT BUSU JMP WSEC0 ; HEADER CALL WT WSEC0 OUT STATU LDA TRACK+1 OUT SCTBU LDA TRACK OUT SCTBU LDA CURHEAD OUT SCTBU LDA CURSEC OUT SCTBU ;SECTOR BUFFER BUILT OUT SCTAD OUT STATU ; ; WRITE MVI A,1 ;DISK WRITE COMMAND OUT CMND ;ADVANCE TO THE NEXT ADDRESS LDA SCOUNT ;SECTOR COUNT FOR THIS TRACK INR A STA SCOUNT ;INCREMENT IT LHLD TRACK MOV A,H ORA L LDA SCOUNT JNZ DOALLSC INR A ;BUMP SECTOR BY 1 IF AT TRACK 0 DOALLSC CPI MAXSEC+1 ;IS IT TIME TO SEEK? JZ NEXTTRACK LDA CURSEC ADI PAT ;INCREMENT BY INTER PATTERN STA CURSEC CPI MAXSEC+1;TIME FOR A NEW BASE? JC HEADER LDA BASE INR A STA BASE STA CURSEC JMP HEADER ;GET NEXTTRACK LHLD TRACK INX H ;INCREMENT TRACK SHLD TRACK LXI D,-MAXTRK DAD D MOV A,L ORA H JZ READTEST ;WHEN DONE GO READ VERIFY LHLD TRACK XCHG CALL SUBS CALL WT CALL SEEK XRA A STA SCOUNT ;MAKE SECTOR A ZERO STA CURSEC ;CURRENT SECTOR ZERO STA BASE OUT BUSU OUT BUSL JMP WSEC0 ;START NEW TRACK ; ; READTEST CALL WT VERONLY LXI H,01 SHLD TRACK XCHG CALL SUBS CALL SEEK ;SEEK TO D,E XRA A STA SCOUNT STA CURSEC STA BASE OUT BUSL OUT BUSU ; ;READ! READVER LDA CURSEC OUT SCTAD OUT STATU MVI A,8 OUT CMND ; DO THE READ ;DO ALL WE CAN WHILE WAITING FOR THE DISK LHLD TRACK LDA CURHEAD MOV D,A LDA CURSEC MOV E,A ;SAVED OLD ADDRESS IN H,L,D,E LDA SCOUNT INR A STA SCOUNT LDA CURSEC ADI PAT STA CURSEC CPI MAXSEC+1 JC ADREADY LDA BASE INR A STA BASE STA CURSEC ADREADY PUSH H PUSH D CALL WT POP D POP H IN STATU ANI 4 JNZ ERROR OUT STATU IN SCTBU CMP H JNZ ERROR IN SCTBU CMP L JNZ ERROR IN SCTBU CMP D JNZ ERROR IN SCTBU CMP E JNZ ERROR ERRTN LDA SCOUNT CPI MAXSEC+1 JNZ READVER NEXTTRK LHLD TRACK INX H SHLD TRACK LXI D,-MAXTRK DAD D MOV A,L ORA H JZ PASSES LHLD TRACK XCHG CALL SUBS CALL SEEK XRA A STA SCOUNT STA CURSEC STA BASE OUT BUSL OUT BUSU JMP READVER ; PASSES LXI D,PASMES CALL PMES JMP MENU ; ; MAXSEC EQU 35 CURSEC DS 1 CURHEAD DS 1 ; ; WTDISK XRA A OUT BUSL OUT BUSU OUT STATU MVI A,1 ;DISK WRITE COMMAND OUT CMND CALL WT IN STATU ANI 20H JNZ WRITEF RET ; SEEK MOV A,D ;MSB OF TRACK OUT BUSU MOV A,E OUT BUSL MVI A,20H ;SEEK COMMAND OUT CMND CALL WT RET ;WAIT FOR DONE, RET CARRY IF TIMEOUT WT MVI H,0FFH ;HL GROSS TIME OUT WZ DCX H MOV A,H ORA L JZ TIMEOUT IN STATU ANI 80H JZ WZ RET TIMEOUT LXI D,TIMMES CALL PMES JMP MENU PMES MVI C,9 CALL 5 RET ERRORP CALL PMES JMP MENU TIMMES DW CRLF DB 'TIMEOUT $' WERMES DW CRLF DB 'WRITE FAULT $' UNMES DW CRLF DB 'UNIT? $' HEADMES DW CRLF DB 'HEAD? (0-9) $' SERMES DW CRLF DB 'UNIT SELECT ERROR $' HERMES DW CRLF DB 'HEAD SELECT ERROR $' MENUMES DW CRLF DW CRLF DB 'ENTER 1 TO CREATE NEW MAP, (NORMAL FORMAT),' DW CRLF DB ' 2 TO APPEND OLD MAP, (REFORMAT DISK),' DW CRLF DB ' 3 TO VIEW OLD MAP,' DW CRLF DB ' 4 TO REPLACE BLOWN MAP,(CAUTION!),' DW CRLF DB ' 5 TO READ VERIFY DISK,(AFTER 1,2,3, OR 4 ONLY)' DW CRLF DB ' 6 TO RESTART' DW CRLF DB ' 7 TO ABORT .' DB '$' KAPUTM DW CRLF DB 'TRACK MAP KAPUT $' APMES DW CRLF DB 'ENTER TRACK/CR TO MAP A BAD TRACK, CR WHEN DONE. ' DW CRLF DB '$' BADTMES DW CRLF ; DB 'BAD TRACKS' ; DW CRLF DB '$' REFORMES DW CRLF DB 'CAUTION FORMATTING DISTROYS ALL DATA ON ' DB 'TWO LOGICAL UNITS.' DW CRLF DB 'FORMAT WITH NEW MAP? (Y/N) $' USELERR LXI D,SERMES CALL PMES JMP START HSELERR LXI D,HERMES CALL PMES JMP MENU ERROR MOV A,E STA TEMP LXI D,RDERMES CALL PMES LHLD TRACK XCHG CALL X16 LXI D,SCTEMES CALL PMES LDA TEMP MOV E,A MVI D,0 CALL X16 LXI D,RETMES JMP ERRTN SCTEMES DB ' SECTOR=$' RMAPER DW CRLF DB 'READ MAP ERROR $' DERR LXI D,RMAPER JMP ERRORP WRITEF LXI D,WERMES JMP ERRORP RDERMES DW CRLF DB 'READ ERROR, TRACK=$' TOMES DB ' IS MAPPED TO $' RETMES DW CRLF DB '$' PASMES DW CRLF DB 'READ VERIFY GOOD $' BCHRMES DW CRLF DB '?' DB ' ' DB 0DH DB '$' MAPBUF DS 516 DS 50 STACK DS 2 HUN DS 1 TEN DS 1 UNS DS 1 TRACK DS 2 SCOUNT DS 1 BASE DS 1 TEMP DS 1 END