0A>type b:heas553.mac PAGE 65 .Z80 TITLE HEAS VERS. 5.53 (30.06.83) ;++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ CINIT changed: 0 = 19200 baud + ;+ A = ????? baud + ;++++++++++++++++++++++++++++++++++++++ 30.06.83 ++++ ;==================================================== AUTO EQU 0 ; FOR M.K.C. ONLY I ;AUTO EQU 1 ; == FOR USER == I ;==================================================== IFF AUTO INCLUDE B:STEUER. ELSE ;==================================================== ; FDC OR EPC WANTED I ;==================================================== EPC EQU 0 ; EPC ;EPC EQU 1 ; FDC5 OR FC8/5 ;==================================================== IFF EPC DMAMOD EQU 1 ELSE ;==================================================== ; DEFINE MODE (DMA OR NON-DMA) I ;==================================================== DMAMOD EQU 0 ; DMA MODE WANTED ;DMAMOD EQU 1 ; NON-DMA-MODE WANTED ;==================================================== ENDIF IFF DMAMOD ;==================================================== ; 5,25" OR 8" DISKS WANTED ? I ;==================================================== MINI EQU 0 ; 5,25" DISKS ;MINI EQU 1 ; 8" DISKS ;==================================================== ELSE MINI EQU 0 ENDIF ;==================================================== ; DEFINE NUMBER OF DD-DISKS I ;==================================================== NDISKS DEFL 2 ; NUMBER OF DISKS (MAX: 4) ;==================================================== IFF MINI ;==================================================== ; DEFINE 5,25" DD-DISKS I ;==================================================== ; 40 OR 80 TRACKS / SIDE I ;==================================================== ;MAXT EQU 40 ; 40 TRACKS / SIDE MAXT EQU 80 ; 80 TRACKS / SIDE ;==================================================== IFF MAXT EQ 80 MIX EQU 1 ELSE ;==================================================== ; MIXED SYSTEM (A reads 80 track, B 40 track I ;==================================================== MIX EQU 0 ; MIXED WANTED ;MIX EQU 1 ; NORMAL SYSTEM ;==================================================== ENDIF ELSE MIX EQU 1 ;==================================================== ; DEFINE 8" DD-DISKS I ;==================================================== ; SINGLE DENSITY DISK WANTED ? I ; INCLUDES FILE: B:SD.MAC I ;==================================================== ;SD EQU 0 ; SINGLE DENSITY SD EQU 1 ; DOUBLE DENSITY ;==================================================== ENDIF ;==================================================== ; OPTIONAL MBYTE ( RAM - FLOPPY ) I ; INCLUDES FILE: B:MBYTE.MAC I ;==================================================== ;MBYTE EQU 0 ; MBYTE-OPTION MBYTE EQU 1 ; NORMAL ;==================================================== ; OPTIONAL WINCHESTER - DISK (UNIT A) I ; INCLUDES FILE: B:WINCH.MAC I ;==================================================== ;WINCH EQU 0 ; WINCHESTER OPTION WINCH EQU 1 ; NORMAL ;==================================================== ENDIF ; AUTO ; HEAS FOR Z80-DOS WITH H.K.M. FLOPPY- ; CONTROLLER FDC5, FDC8/5 and EPC ; ; THIS HEAS IS COMPATIBLE TO CP/M 2.X BIOS ; HEAS IS CONFIGURED FOR: ; 5,25" OR 8" DISKS ; (DOUBLE SIDED, CHANGE WITH S.COM) ; ; ***** DISK-DRIVES SHOULD HAVE A READY-SIGNAL, IF NOT: ***** ; ***** WAIT MOTOR-ON-TIME BEFORE WRITING TO DISK ***** ; ***** Change HEAS or generate a READY-SIGNAL ***** ; ; INTERRUPT MODE 2 ; SIO PORT A = 1200 BAUD ; SIO PORT B = CONSOLE BAUDRATE ; BOTH: 8 BIT, NO PARITY, 1 STOP BIT ; NO HANDSHAKE ; CENTRONICS PARALLEL ; ; OPTIONS: MBYTE ( RAM - FLOPPY ) ; WINCH ( WINCHESTER - DISK ) ; ; COPYRIGHT 81, 82 / 83 H.K.M. / M.K.C. ;==================================================== IFF EPC .PRINTX /HEAS553 EPC-MODE (30.06.83)/ ELSE IFF DMAMOD .PRINTX /HEAS553 DMA-MODE (30.06.83)/ ELSE .PRINTX /HEAS553 NON-DMA-MODE (30.06.83)/ ENDIF ENDIF IFF MINI .PRINTX /5,25" DISKS/ SD EQU 1 ; SD ONLY WITH 8" DISKS IFF MAXT EQ 80 .PRINTX /40 TRACK/ CAPAC EQU 400 ; 400 K BYTE CAPACITY (DD DS 40 TRK) ELSE .PRINTX /80 TRACK/ CAPAC EQU 800 ; 800 K BYTE CAPACITY (DD DS 80 TRK) ENDIF SPT EQU 40 ; 40 128-SECTORS/TRACK ; timing for TEAC (enable by: HEAS+39H = 0) HLTF EQU 25 ; HEAD LOAD TIME = 50 MS SRTF EQU 2 ; STEP RATE TIME = 4 MS ELSE .PRINTX /8" DISKS/ CAPAC EQU 1155 ; 1155 K BYTE CAPACITY (DD DS 77 TRK) SPT EQU 60 ; 60 128-SECTORS/TRACK MAXT EQU 77 ; timing for NEC (enable by: HEAS+39H = 0) HLTF EQU 60 ; 60 MS HEAD-LOAD-TIME SRTF EQU 3 ; 3 MS STEP-RATE-TIME ENDIF ; timing for other Disks (normal case: HEAS+39H = 0FFH) HLTSL EQU 60 ; 60 OR 120 MS SRTSL EQU 12 ; 12 OR 24 MS HUT EQU 240 ; LONGEST UNLOAD TIME IFF MIX .PRINTX / B reads 40 TRACK / NDISKS DEFL 1 ; ONLY 1 NORMAL DISK ! B IS SPECIAL CAPACB EQU 400 ; 400 KBYTE CAPACITY FOR DRIVE B ENDIF ;==================================================== ; ***** I/O-PORTS ***** ;==================================================== CONB EQU 0E3H ; CONSOLE B STATUS CONA EQU 0E1H ; CONSOLE A STATUS IFF WINCH FDC EQU 4 ; SPECIAL FOR 5/8 ELSE IFF EPC FDC EQU 0F2H ; EPC ONLY TIMER EQU 0E9H ; MOTO-TIMER FOR EPC RBOOT EQU 0ECH ; SWITCH OFF EPROM ELSE FDC EQU 0 ; FLOPPY CONTROLL ENDIF ENDIF FDD EQU FDC+1 ; FLOPPY DATA PORT FTC EQU FDC+2 ; FLOPPY TERMINATE DMA EQU FDC+3 ; FLOPPY-DMA-PORT CTC EQU 0E8H ; CLOCK FOR CONA PIOA EQU 0E4H ; PRINTER CONTROL PIOB EQU 0E6H ; PRINTER DATA ; PTIME EQU 16 ; TIME-OUT (CENTRONICS) STIME EQU 16 ; TIME-OUT (V24) ;==================================================== ; ***** EXTERNALS ***** ;==================================================== KI EQU 0E000H ZDOS EQU KI + 806H CDISK EQU 0004H ; CURRENT DISK FOR ZDOS IOBYTE EQU 0003H ; IOBYTE CAPS EQU CAPAC/2-(SPT+7)/8-1 HLTS EQU ((HLTSL-1)/2)*2 HUTS EQU (HUT+15)/16 SRTS EQU 16-SRTSL HLTSF EQU ((HLTF-1)/2)*2 SRTSF EQU 16-SRTF XLT EQU 0 ; SECTOR TRANSLATION TABLE ; NOT USED IN SECTRA .XLIST ; DON'T LIST MACRO-CODE ;--------------------------------------------------- IFF MBYTE ; MBYTE-OPTION ONLY ;--------------------------------------------------- INCLUDE B:MBYTE.MAC ; MBYTE - CODE ;--------------------------------------------------- ELSE ; DUMMY - CODE ;--------------------------------------------------- DPHX MACRO ENDM DPBX MACRO ENDM CSVX MACRO ENDM ALVX MACRO ENDM SELX MACRO ENDM SETX MACRO ENDM SETX1 MACRO ENDM WR512X MACRO ENDM RD512X MACRO ENDM RWX MACRO ENDM INIX MACRO ENDM XDISKS EQU 0 ;--------------------------------------------------- ENDIF ; END OF MBYTE-CODE ;--------------------------------------------------- IFF WINCH ; WINCHESTER ONLY ;--------------------------------------------------- INCLUDE B:WINCH.MAC ; WINCHESTER OPTION ;--------------------------------------------------- ELSE ; DUMMY - CODE ;--------------------------------------------------- DPHW MACRO ENDM DPBW MACRO ENDM CSVW MACRO ENDM ALVW MACRO ENDM RECALW MACRO ENDM SETW MACRO ENDM SETW1 MACRO ENDM WR512W MACRO ENDM RD512W MACRO ENDM RWW MACRO ENDM SECIBW MACRO ENDM TRANSW MACRO ENDM WTERMI MACRO ENDM CMFDW MACRO ENDM NEXTW MACRO ENDM UNA0W MACRO ENDM INIW MACRO ENDM WDISKS EQU 0 ;--------------------------------------------------- ENDIF ; END OF WINCH-CODE ;--------------------------------------------------- IFF SD ; SINGLE DENSITY ;--------------------------------------------------- INCLUDE B:SD.MAC ;--------------------------------------------------- ELSE ;--------------------------------------------------- SDISKS EQU 0 ; NO DISK TRANSS MACRO ENDM RD0S MACRO ENDM WR0S MACRO ENDM SECTRS MACRO ENDM WRITS MACRO ENDM SECIBS MACRO ENDM READS MACRO ENDM WR512S MACRO ENDM RD512S MACRO ENDM RWS MACRO ENDM ALLOCS MACRO ENDM DPHS MACRO ENDM DPBS MACRO ENDM CSVS MACRO ENDM ALVS MACRO ENDM ;--------------------------------------------------- ENDIF ;--------------------------------------------------- .LIST ; ; ***** ENTRY POINTS FOR ZDOS ***** ; .PHASE KI + 1400H ; JUMP: JP BOOT ; COLD START ENTRY WBOOT: JP WBOT ; RESTART ENTRY JP CST ; CONSOLE STATUS CONIN: JP CIN ; CONSOLE INPUT CONOUT: JP COUT ; CONSOLE OUTPUT JP LIST ; LISTING OUTPUT JP PNCH ; PUNCH (OR TAPE) OUTPUT JP RDR ; READER (OR TAPE) INPUT JP HOME ; ONLY DONE ON FIRST ACCESS ; FOR EACH DISK JP SELDSK ; SELECT DISK JP SETTRK ; SELECT TRACK JP SETSEC ; SECTOR FOR READ/WRITE JP SETDMA ; SET ADDRESS FOR BUFFER JP READ ; READ SECTOR ; PARAMETERS ARE GIVEN) JP WRITE ; WRITE SECTOR JP LST ; LIST-DEVICE STATUS JP SECTRA ; SECTOR TRANSLATION ; ( NOT USED ) JP CBUF ; RETURN .CBUF JP CONFIG ; RETURN .CONFIG FAST: DEFB 0FFH ; 0FFH IS SLOW, 0 IS FAST ; ; ***** DATA - AREA FOR LEAS 3.41 ; DATA: DEFB ' DATA AREA FOR LEAS 3.41' ; DON'T USE THIS AREA DEFB ' I.E. STACK AND RAM-AREA' DEFB ' COPYRIGHT (C) 1983 BY M.K.C. ' DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0 DEND: STACK: DLEN EQU DEND-DATA ; ; ***** RETURN ADDRESS OF CONFIG-TABLE ***** ; CONFIG: LD HL,CINIT ; ADDRESS < JUMP + 100H RET ; ; ***** I/O - ROUTINES ( LOGICAL ) ***** ; CIN: PUSH HL ; CONSOLE INPUT LD HL,TCIN JR IO COUT: PUSH HL ; CONSOLE OUTPUT LD HL,TCOUT JR IO CST: PUSH HL ; CONSOLE STATUS LD HL,TCST IO: LD A,(IOBYTE) JR IO4 RDR: PUSH HL ; READER INPUT LD HL,TRDR LD A,(IOBYTE) JR IO3 PNCH: PUSH HL ; PUNCH OUTPUT LD HL,TPNCH LD A,(IOBYTE) JR IO2 LIST: PUSH HL ; LIST OUTPUT LD HL,TLIST JR IO1 LST: PUSH HL ; LIST STATUS LD HL,TLST IO1: LD A,(IOBYTE) RRCA ; SHIFT 6 FOR LIST RRCA IO2: RRCA ; SHIFT 4 FOR PUNCH RRCA IO3: RRCA ; SHIFT 2 FOR READER RRCA IO4: AND 03 ; SHIFT 0 FOR CONSOLE ADD A,A ADD A,L ; HL=HL+OFFSET LD L,A JR NC,IO5 INC H IO5: LD A,(HL) ; HL=.ROUTINE INC HL LD H,(HL) LD L,A ; HL=(HL) EX (SP),HL ; JUMP TO PHYS. RET ; ROUTINES ; ; ***** I/O-ROUTINES ( PHYSICAL ) ***** ; ; CONSOLE STATUS (RECEIVER) ; CASTI: LD A,CONA ; SIO PORT A JR RXRDY CBSTI: LD A,CONB ; SIO PORT B RXRDY: PUSH BC LD C,A IN A,(C) AND 1 STRET: POP BC RET Z LD A,0FFH RET ; ; LIST STATUS (TRANSMITTER) ; CASTO: LD A,CONA ; SIO PORT A JR TXRDY CBSTO: LD A,CONB ; SIO PORT B TXRDY: PUSH BC LD C,A IN A,(C) AND 4 JR STRET ; ; CONSOLE INPUT (SIO) ; CAIN: CALL CAIN8 ; SIO A 7 BIT IN CAI1: AND 7FH RET CBIN: CALL CBIN8 ; SIO B 7 BIT IN JR CAI1 CAIN8: LD A,CONA ; SIO A 8 BIT IN JR SIOIN CBIN8: LD A,CONB ; SIO B 8 BIT IN SIOIN: PUSH BC LD C,A WAIN: IN A,(C) RRA JR NC,WAIN DEC C IN A,(C) POP BC RET ; ; CONSOLE OUTPUT (SIO) ; CAOUT: LD A,CONA ; SIO A 8 BIT OUT JR SIOOUT CBOUT: LD A,CONB ; SIO B 8 BIT OUT SIOOUT: PUSH BC LD B,C LD C,A WAOUT: PUSH HL ; SAVE HL PUSH DE WAOUT1: LD E,STIME LD HL,0000H ; WAIT-TIME WAOL: IN A,(C) AND 4 JR NZ,WAO0 ; READY ! DEC HL ; DEC TIME-COUNTER LD A,H OR L ; TIME OUT ? JR NZ,WAOL ; NO: TRY ON DEC E JR NZ,WAOL LD HL,ANRDY ; "CONA NOT READY" BIT 1,C ; OR CONB ? JR Z,WAO3 ; WAS CONA LD HL,BNRDY WAO3: CALL ERRMES ; SEND ERROR-MESSAGE JR WAOUT1 WAO0: POP DE POP HL ; UNSAVE HL DEC C OUT (C),B LD A,0CH SUB B POP BC RET NZ LD B,A WAO1: PUSH BC LD B,A WAO2: DJNZ WAO2 POP BC DJNZ WAO1 RET ; ; LISTING OUTPUT TO PIO PORT B ; BUSY EQU 2 ; CHECK ONLY CENT.-BUSY PIOOUT: RES 7,C ; CENTRONICS 7 BIT OUT PIO8: PUSH HL ; SAVE PUSH DE PIO81: LD E,PTIME LD HL,0000H ; WAIT-COUNTER PIOL: IN A,(PIOA) ; CENTONICS 8 BIT OUT AND BUSY JR NZ,PIO9 ; LPT READY DEC HL LD A,H OR L ; TIME OUT ? JR NZ,PIOL ; NO: WAIT FOR READY DEC E JR NZ,PIOL LD HL,PNRDY ; "LPT NOT READY" CALL ERRMES JR PIO81 ; TRY AGAIN PIO9: POP DE POP HL ; UNSAVE LD A,C OUT (PIOB),A ; DATA OUT LD A,10H ; STROBE ON ***************** OUT (PIOA),A XOR A ; STROBE OFF OUT (PIOA),A RET ; ; LIST STATUS ( 0 = NOT RDY , FF = READY ) ; PIOST: IN A,(PIOA) ; CENTRONICS STATUS AND BUSY LD A,0FFH RET NZ BATST: XOR A ; ALWAYS NOT READY RET DUMY: LD A,1AH ; DUMMY-INPUT NO: RET ; DUMMY OUTPUT ; ; **** ASSIGN - TABLES ; TCIN: DEFW CAIN,CBIN,RDR,CBIN ; TTY,CRT,BAT,UC1 TCOUT: DEFW CAOUT,CBOUT,LIST,CBOUT ; TTY,CRT,BAT,UC1 TCST: DEFW CASTI,CBSTI,BATST,CBSTI ; TTY,CRT,BAT,UC1 TRDR: DEFW CAIN,DUMY,CBIN,CBIN8 ; TTY,PTR,UR1,UR2 TPNCH: DEFW CAOUT,NO,CBOUT,NO ; TTY,PTP,UP1,UP2 TLIST: DEFW CAOUT,CBOUT,PIO8,NO ; TTY,CRT,LPT,UL1 TLST: DEFW CASTO,CBSTO,PIOST,BATST ; TTY,CRT,LPT,UL1 ; ; **** RETURN .CBUF AND (CBUF) **** ; CBUF: LD HL,BUF LD A,(HL) RET ; ; **** ZDOS WARMBOOT ***** ; ;------------------------------------------------------- IFF WINCH ; WINCHESTER ONLY ;------------------------------------------------------- WBOTW ; WINCHESTER-WARMBOOT ;------------------------------------------------------- ELSE ;------------------------------------------------------- IFF DMAMOD ; DMA-MODE ONLY ;------------------------------------------------------- WBOT: ;***** INITIALIZE LEAS-DATA-AREA ***** LD HL,DATA LD DE,DATA+1 LD BC,DLEN-1 LD (HL),0 LDIR ;***** INIT DONE ***** LD SP,STACK ; DEFINE STACK LD HL,TERMI ; SET INTERRUPT LD (INTVEC),HL LD A,HIGH(INTVEC) LD I,A LD HL,FILL1 ; SET DISK COMMAND-TAB. LD DE,ACTIVE LD BC,9 LDIR CALL SEEK ; TRACK 0 LD HL,KI ; .START OF SYSTEM LD (RBUF),HL LD HL,1400H-1 ; LENGTH OF SYSTEM LD (RLEN),HL CALL RDB ; READ TRACK JR NZ,WBOT ; TRY AGAIN IF ERROR LD HL,DBUF LD (RBUF),HL ; DISK-BUFFER AGAIN LD HL,512-1 ; LENGTH OF DBUFFER LD (RLEN),HL ;------------------------------------------------------- ELSE ; NON-DMA-MODE ;------------------------------------------------------- WBOT: ;***** INITIALIZE LEAS-DATA-AREA ***** LD HL,DATA LD DE,DATA+1 LD BC,DLEN-1 LD (HL),0 LDIR ;***** INIT DONE ***** LD SP,STACK ; DEFINE STACK LD HL,FILL1 ; SET DISK COMMAND-TAB. LD DE,ACTIVE LD BC,9 LDIR LD DE,KI ; .START OF SYSTEM CALL SEEK ; TRACK 0 WBOT1: PUSH DE ; SAVE LOAD-ADDRESS CALL RD512 ; READ PHYS. SECTOR POP DE ; UNSAVE LOAD-ADDRESS JR NZ,WBOT ; TRY AGAIN IF ERROR LD HL,DBUF ; COPY FROM DISKBUFFER LD BC,200H LDIR LD A,(DISKS) ; NEXT SECTOR INC A CP 11 ; TRACK DONE? LD (DISKS),A JR NZ,WBOT1 ; NO: LOOP ;------------------------------------------------------- ENDIF ; DMAMOD ;------------------------------------------------------- ENDIF ; WINCHESTER ;------------------------------------------------------- GODOS: LD A,0C3H ;SET DOS-ENTRY LD (5),A LD HL,ZDOS LD (6),HL LD HL,FILL1 ; SET DISK PARMS LD DE,ACTIVE LD BC,9 LDIR LD A,(CDISK) ; UNIT FOR KI LD C,A JP KI ; ; **** ZDOS-DISK ROUTINES ***** ; SELDSK: ; SELECT DISK GIVEN BY C ; RETURNS: ADDRESS OF DISK HEADER IN HL ; DESTROYS: AF, BC, DE, HL LD HL,0 LD A,C CP WDISKS+NDISKS+SDISKS+XDISKS IFF MIX CP WDISKS+NDISKS+SDISKS+XDISKS+1 ENDIF RET NC LD (DOSU),A ; LOAD TO CURRENT DISK LD L,A ; COMPUTE ADDRESS OF ADD HL,HL ; DISK PARAMETER BASE ADD HL,HL ADD HL,HL ADD HL,HL LD DE,DPBASE ADD HL,DE SELX PUSH HL ; SAVE .DPBASE(DISK) LD BC,0EH ; FIRST ACCESS ? ADD HL,BC LD E,(HL) INC HL LD D,(HL) LD A,(DE) OR A CALL Z,RECAL ; YES : RECALIBRATE IT POP HL RET ; HOME: ; = SET TRACK 0 LD C,0 ; SETTRK: ; SET TRACK GIVEN BY C ; DESTROYS: A LD A,C ; STORE TRACK LD (DOST),A RET ; SETSEC: ; SET SECTOR GIVEN BY C ; DESTROYS: A LD A,C ; STORE SECTOR LD (DOSS),A RET ; SECTRA: ; TRANSLATE SECTOR GIVEN BY BC ; RETURN IN HL ; TRANSLATE TABLE IN DE ; DESTROYS: HL SECTRS ; FOR SINGLE DENSITY SECTR9: LD H,B LD L,C RET ; SETDMA: ; SET DMA-ADDRESS GIVEN BY BC ; DESTROYS: --- LD (DOSDMA),BC ; STORE DMA RET ; READ: ; READ SECTOR WITH GIVEN PARAMETERS CALL SECIB ; SECTOR IN BUFFER ? JR Z,RDCOPY ; YES : COPY SECTOR RDCLR: CALL CLEAR ; SAVE OLD BUFFER ; BEFORE READ A NEW RET NZ ; IF SAVE-ERROR RDSET: CALL SET ; SET PARAMETERS ; AND ADJUST HEAD READS ; FOR SINGLE-DENSITY RDLOP: CALL RD512 ; READ PHYS. SECTOR RET NZ ; IF READ-ERROR RDCOPY: CALL SEGMNT ; ADDRESSES FOR COPY CALL COPY ; COPY INTO DMA-AREA XOR A ; NO ERRORS ! RET ; WRITE: ; WRITE SECTOR WITH GIVEN PARAMETERS PUSH BC ; SAVE WRITE TYPE CALL SECIB ; SECTOR IN BUFFER ? JR Z,WRCOPY ; YES : COPY FROM DMA WRCLR: CALL CLEAR ; FIRST SAVE OLD POP BC ; GET WRITE TYPE RET NZ ; IF SAVE-ERROR PUSH BC ; SAVE WRITE TYPE WRSET: CALL SET ; ADJUST DISK POP BC ; GET WRITE TYPE PUSH BC CALL ALLOC ; WRITE TO ALLOCATED ? JR Z,WRCOPY ; NO : COPY WRREAD: CALL RD512 ; YES : FIRST READ POP BC RET NZ ; IF PRE-READ-ERROR PUSH BC WRCOPY: WRITS ; FOR SINGLE DENSITY WRSEG: CALL SEGMNT ; SET ADDRESSES AND EX DE,HL CALL COPY ; COPY FROM DMA AREA XOR A ; NO ERRORS ! LD (ACTIVE),A ; SET BUFFER ACTIVE POP BC DEC C ; WRITE TO DIRECTORY ? RET NZ ; NO : RETURN WRDIR: CALL CLEAR ; YES : WRITE TO DISK RET ; ; **** DISK UTILITIES ***** ; SECIB: ; CHECKS IF ZDOS-SECTOR IS IN DISKBUFFER ; I.E. UNITS AND TRACKS EQUAL AND ; ZDOS-SECTOR INTO DISKSECTOR ; RETURNS WITH: Z IF SECTOR IN BUFFER ; AND WITH: NZ IF NOT ; DESTROYES: AF,DE,HL LD DE,(DOSU) ; COMPARE UNIT & TRACK SECIBS ; FOR SINGLE-DENSITY SECIBW IFF MIX LD A,E ; DRIVE B ? OR A LD A,D JR Z,T80 ; NO: DONE ADD A,40 ; YES: CORRECT TRACK-DIFFERENCE T80: SUB MAXT ELSE LD A,D ; TRACK SUB MAXT ; GT TRACKS/SIDE? ENDIF SECI9: JR C,SECI0 LD D,A ; YES: SUBTRACT TRACKS/SIDE SET 2,E ; SET SIDE-BIT IN UNIT SECI0: LD HL,(DISKU) LD A,(DISKT+1) ; HEAD 1 ? OR A ; CLEAR CARRY JR Z,SECI2 ; HEAD 0 SET 2,L ; SET HEAD-BIT IN UNIT SECI2: SBC HL,DE ; COMPARE DOS AND DISK-VALUES RET NZ ; UNIT & TRACK NOT EQUAL CALL TRANSL ; TRANSLATE SECTOR SECI1: LD HL,DISKS ; AND COMPARE WITH CP (HL) ; SECTOR IN BUFFER RET ; TRANSL: ; TRANSLATE SECTOR ; RETURNS WITH SECTOR IN A ; DESTROYES F TRANSS ; SD ONLY TRANSW LD A,(DOSS) ; LOAD ZDOS-SECTOR AND 0FCH ; 0,4,8,12... ;------------------------------------------------------- IFF MINI ; 5,25" TRANSLATE ;------------------------------------------------------- SRL A ; 0,2,4,6... INC A ; 1,3,5,7... CP 0AH ; GE 10 ? RET C ; NO : FINISHED SUB 09H ; YES : 2,4,6,8,10 RET ;------------------------------------------------------- ELSE ; 8" TRANSLATE ;------------------------------------------------------- INC A ; 1,5,9... TRANS1: CP 10H ; OVERFLOW ? RET C ; NO: DONE SUB 0FH ; SUBTRACT JR TRANS1 ;------------------------------------------------------- ENDIF ;------------------------------------------------------- ; RECAL: ; MOVE HEAD TO HOME POSITION ; DONE WITH ZDOS - UNIT !!!!! LD A,(DISKU) ; SAVE PHYS. UNIT PUSH AF LD A,(DOSU) ; ZDOS - UNIT FOR CMD LD (DISKU),A RECALW RECAL0: CALL REC ; RECALIBRATE UNIT CALL REC POP AF LD (DISKU),A ; RESTORE RET ; REC: LD BC,0207H ; RECALIBRATE CALL MOTO ; WAIT FOR DISK LD B,0 DELY0: PUSH BC LD B,0 DELY1: DJNZ DELY1 POP BC DJNZ DELY0 CALL SENS ; RECAL. FINISHED ? RET ; SET: ; SET UP PARAMETERS FOR FD-CONTROLLER ; SEEK TRACK ; DESTROYES: AF,BC,HL XOR A LD (DISKT+1),A ; HEAD 0 LD HL,(DOSU) ; UNIT AND TRACK LD (DISKU),HL SETX SETW IFF MIX LD A,L OR A ; DRIVE B ? LD A,H JR Z,TT80 ; DRIVE A IS OK ADD A,40 ; DRIV B: CORRECT TRACK DIFF TT80: SUB MAXT ELSE LD A,H ; DOS-TRACK SUB MAXT ; TRACKS/SIDE ENDIF SET9: JR C,SET0 LD H,A ; SUBTRACT TRACKS/SIDE LD (DISKU),HL LD A,1 LD (DISKT+1),A ; HEAD 1 SET0: CALL TRANSL ; TRANSLATE SECTOR SET1: LD (DISKS),A ; SECTOR SETX1 SETW1 ; MOVE HEAD TO TRACK GIVEN BY "DISKT" SEEK: IFF MIX LD A,(DISKU) OR A ; DRIVE B (MIXED) LD A,(DISKT) PUSH AF JR Z,SK80 ; IS DRIVE A ADD A,A ; 2 STEPS PER TRACK LD (DISKT),A ENDIF SK80: LD BC,030FH ; SEEK TRACK CALL MOTO CALL SENS IFF MIX POP AF ; CORRECT TACK NUMBER LD (DISKT),A ENDIF RET ; SEEK FINISHED ? SENS: LD BC,0108H ; SENSE DRIVE CALL CMFD CALL NEXT ; FETCH RESULT PUSH AF ; SAVE RESULT CP 80H ; INVALID COMMAND ? CALL NZ,NEXT ; NO : NEXT RESULT POP AF ; FIRST RESULT BIT 5,A ; SEEK FINISHED ? JR Z,SENS ; NO : WAIT RET ; YES : ALL DONE ; CLEAR: ; RETURN WITH Z IF BUFFER NOT ACTIVE ; IF BUFFER ACTIVE: WRITE IT TO DISK ; SET BUFFER PASSIV AND RETURN WITH: ; Z = WRITE OK NZ = WRITE ERROR ; DESTROYES: AF,BC,HL LD A,(ACTIVE) ; BUFFER ACTIVE ? OR A JR Z,WR512 ; YES : STORE XOR A ; NOT ACTIVE RET ; ACTIVE -> WRITE BUFFER TO DISK ;------------------------------------------------------- IFF DMAMOD ; DMA-MODE ONLY ;------------------------------------------------------- WR512: ; WRITE 512-SECTOR TO DISK WR512X WR512S WR512W WR: LD B,10 ; RETRY 10 TIMES WR0: PUSH BC ; SAVE COUNTER WR0S LD BC,0945H ; WRITE SECTOR WR1: CALL MOTO LD BC,CWLEN*256+DMA ; C = .DMA ; B = CMD-LENGTH LD HL,CWRT OTIR ; DMA WRITE TO DISK CALL RESULT ; TERMINATE AND ; FETCH RESULTS POP BC ; UNSAVE COUNTER JR Z,WRFIN ; NO ERROR : DONE DJNZ WR0 ; ERROR : TRY AGAIN RET ; FATAL ERROR WRFIN: DEC A LD (ACTIVE),A ; SET BUFFER TO INC A ; NOT ACTIVE STATE RET ; RD512: ; READ PHYSICAL SECTOR FROM DISK ; RETURNS WITH: Z = NO ERRORS ; AND: NZ = READ ERROR RD512S ; SINGLE-DENSITY ONLY RDB: LD A,0FFH LD (TABLE),A ; RESET UNALLOCATED RD512X RD512W RD: LD B,10 ; RETRY-COUNTER RD0: PUSH BC RD0S ; SD ONLY! LD BC,0946H ; READ RD1: CALL MOTO LD BC,CRLEN*256+DMA ; C = DMA, B = CMD-LENGTH LD HL,CRDT OTIR ; DMA READ FROM DISK CALL RESULT ; FETCH RESULT POP BC RET Z ; NO ERROR DJNZ RD0 LD HL,DISKS ; SECTOR ERROR LD (HL),0 ; NOT POSS. SECTOR RET ;------------------------------------------------------- ELSE ; NON-DMA-MODE ;------------------------------------------------------- WR512: ; WRITE 512-SECTOR TO DISK WR512X WR512W IFF EPC CALL SETCTC ENDIF LD B,10 ; RETRY 10 TIMES LD A,I PUSH AF ; SAVE IFF DI ; NO INTERRUPT WR0: PUSH BC ; SAVE COUNTER LD BC,0945H ; WRITE CALL MOTO LD HL,DBUF ; .DISKBUFFER LD BC,FDD ; 256 BYTES , DATA PORT LD DE,WR99 ; ENDADDRESS PUSH DE LD E,0A0H ; MASK FOR EXEC-END WR1: IN A,(FDC) ; REQUEST FOR MASTER ? AND E ; EXEC.PHASE? JP P,WR1 ; NOT REQUEST FOR MASTER RET PO ; JP WR99 IF PARITY ODD OUTI ; OUTPUT DATA JP NZ,WR1 ; 256 DONE ? WR2: IN A,(FDC) ; NEXT 256 BYTES AND E JP P,WR2 ; NOT RQM RET PO ; JP PO,WR99 OUTI JP NZ,WR2 RET ; JP WR99 WR99: OUT (FTC),A CALL RESULT ; TERMINATE AND ; FETCH RESULTS POP BC ; UNSAVE COUNTER JR Z,WRFIN ; NO ERROR : DONE DJNZ WR0 ; ERROR : TRY AGAIN JR RDE WRFIN: DEC A LD (ACTIVE),A ; SET BUFFER TO INC A ; NOT ACTIVE STATE JR RDE ; JUMP TO READ/WRITE-EXIT ; RD512: ; READ PHYSICAL SECTOR FROM DISK ; RETURNS WITH: Z = NO ERRORS ; AND: NZ = READ ERROR IFF EPC CALL SETCTC ENDIF LD A,0FFH LD (TABLE),A ; RESET UNALLOC RD512X RD512W LD A,I PUSH AF ; SAVE IFF LD B,10 DI ; NO INTERRUPT RD0: PUSH BC LD BC,0946H ; READ CALL MOTO LD HL,DBUF ; BUFFER-ADDRESS LD BC,FDD ; B = 256, C = FDD LD DE,RD99 ; ENDADDRESS PUSH DE ; FOR RET PO / RET LD E,0A0H ; MASK FOR EXEC-END RD1: IN A,(FDC) ; READ STATUS AND E ; EXEC PHASE? JP P,RD1 ; NOT READY: TRY AGAIN RET PO ; ABORTED ! INI ; READ DATA JP NZ,RD1 ; 256 DONE ? RD2: IN A,(FDC) AND E JP P,RD2 ; NOT REQUEST FOR MASTER RET PO ; IF EXEC. PHASE ENDED INI JP NZ,RD2 RET ; JP RD99 RD99: OUT (FTC),A ; TERMINATE UPD 765 CALL RESULT ; FETCH RESULTS POP BC JR Z,RDE ; NO ERROR: READ/WRITE-EXIT DJNZ RD0 LD HL,DISKS ; SECTOR ERROR LD (HL),0 ; NOT POSS. SECTOR RDE: EX (SP),HL ; RESTORE IFF PUSH AF PUSH HL POP AF ; GET IFF JP PO,RDE1 ; WANTS DI EI RDE1: POP AF POP HL RET ;------------------------------------------------------- ENDIF ; COMMON CODE AGAIN ;------------------------------------------------------- RWS ; EXEC. SINGLE-DENSITY R/W RWX RWW SEGMNT: ; SET REGISTER FOR SEGMENT-COPY FROM ; ZDOS-DMA-BUFFER TO DISK-BUFFER ; DESTROYES: AF ; SETS: BC,DE,HL LD DE,(DOSDMA) ; DESTINATION LD A,(DOSS) AND 3 LD HL,DBUF ; START OF BUFFER LD BC,80H ; LENGTH INC A SEGM1: DEC A RET Z ADD HL,BC ; SOURCE JR SEGM1 ; COPY: ; = INVERTED LDIR ; DESTROYES: AF,BC,DE,HL LD A,(HL) CPL LD (DE),A INC HL INC DE DEC C JR NZ,COPY RET ; RESULT: ; FETCH RESULTS OF READ/WRITE OPERATION ; AND CHECK THEM FOR R/W-ERRORS ; DESTROYES: AF,BC ; RETURNS WITH: Z & A=0, IF NO ERRORS ; AND WITH: NZ & A=? IF ANY ERROR LD B,4 ; 7 RESULTS CALL NEXT ; 1ST RESULT AND 0C0H ; ERROR ? LD C,A ; SAVE CALL NEXT AND 2 ; WRITE PROTECTED? OR C LD C,A CALL NEXT AND 10H ; WRONG TRACK ? OR C LD C,A RESLOP: CALL NEXT DJNZ RESLOP XOR A ; RESTORE OR C ; CHECK ERR-COND. RET Z BIT 1,A JR NZ,NONWR ; NON WRITABLE BIT 4,A JR NZ,WRTRK ; WRONG TRACK OR A RET WRTRK: PUSH AF CALL REC ; RECALIBRATE CALL REC ; TWICE FOR 80 TRACK CALL SEEK ; SEEK TRACK AGAIN POP AF OR A RET NONWR: LD HL,WRPROT ; SEND WRITE-PROTECT CALL ERRMES OR A RET ; ERRMES: PUSH AF PUSH BC PUSH DE CALL SENDM CALL CONIN CP 'C'-40H JR Z,ERR99 POP DE POP BC POP AF RET ERR99: LD HL,0 LD (BUF),HL JP WBOOT ;------------------------------------------------------- IFF DMAMOD ; DMA ONLY ;------------------------------------------------------- TERMI: ; INTERUPT SERVICE ROUTINE OUT (FTC),A ; TERMIN. UPD 765 WTERMI PUSH AF LD A,0C3H ; RESET DMA-LOGIC OUT (DMA),A POP AF EI ; ENABLE INTERRUPT RETI ; DONE ! ;------------------------------------------------------ ENDIF ;------------------------------------------------------ IFF EPC ;------------------------------------------------------ CTCMOD EQU 01000111B SETCTC: LD A,CTCMOD OUT (TIMER),A LD A,40 OUT (TIMER),A RET ;------------------------------------------------------ ENDIF ; EPC ;------------------------------------------------------ MOTO: ; WAITS UNTIL DISK READY AND THEN ; TRANSMITS COMMAND TO FD-CONTROLLER ; DESTROYES: AF,BC,HL PUSH BC ; SAVE COMMAND ; WAIT UNTIL DISK READY LD HL,4000H ; TIME LOOP COUNTER PUSH HL LD BC,0204H ; SENSE DRIVE CALL CMFD CALL NEXT ; FETCH RESULT BIT 5,A ; DISK READY ? POP HL JR NZ,MOT1 ; DISK READY DEC HL ; DEC TIME COUNTER LD A,H OR L JR NZ,MOTO+4 ; NE 0: WAIT LD HL,NRDY ; DISK NOT READY CALL ERRMES JR MOTO+1 MOT1: POP BC ; YES : FETCH COMMAND ; CMFD: ; TRANSMITS COMMAND TO FD-CONTROLLER ; DESTROYES: AF,BC,HL CMFDW LD HL,DISKU ; SET HEAD-BIT IN UNIT LD A,(DISKT+1) ; HEAD 1 ? OR A JR Z,CMFD0 SET 2,(HL) ; SET HEAD 1 CMFD0: LD HL,CMDTAB ; POINT TO COMMANDTABLE CMFD1: IN A,(FDC) ; REQUEST FOR MASTER ? AND 0C0H CP 80H ; MASTER TO UPD 765? JR NZ,CMFD1 ; NO : WAIT LD A,C ; YES : OUT (FDD),A ; SEND COMMAND INC HL ; POINT TO NEXT BYTE LD C,(HL) DJNZ CMFD1 ; SEND NEXT BYTE LD HL,DISKU RES 2,(HL) ; RESET HEAD-BIT IN UNIT RET ; ALL BYTES TRANSFERRED ; NEXT: ; READ NEXT RESULT-BYTE FROM FD-CONTROLLER ; DESTROYES: AF NEXTW IN A,(FDC) RLCA ; REQUEST FOR MASTER ? JR NC,NEXT IN A,(FDD) ; YES : FETCH RESULT RET ; ALLOC: ; ALLOCATED OR UNALLOCATED SECTOR ? ; C = WRITE TYPE FROM ZDOS ; RETURNS WITH: NZ = ALLOCATED SECTOR ; AND WITH: Z = UNALLOC. SECTOR ALLOCS ; ONLY SINGLE-DENSITY LD A,C ; WRITE TYP CP 2 JR Z,UNALL ; UNALLOCATED OR A ; (CP 1) RET NZ ; WRITE TO DIRECTORY ; NORMAL WRITE LD A,(DOSU) ; COMPARE WITH TABLE LD HL,TABLE ; UNIT, TRACK, SECTOR CP (HL) RET NZ INC HL LD A,(DOST) CP (HL) RET NZ INC HL LD A,(DOSS) AND 0FCH ; SECTOR 0,4,8.... CP (HL) RET NZ UNA9: PUSH BC PUSH DE LD DE,TABLE+1 ; MOVE CONTENTS OF TABLE LD HL,TABLE+3 LD BC,5 LDIR POP DE POP BC RET ; ZERO IS SET !! UNALL: LD HL,TABLE ; BUILD TABLE LD A,(DOSU) LD (HL),A PUSH BC LD B,3 ; NEXT 3 SECTORS LD A,(DOST) LD C,A LD A,(DOSS) UNA0: ADD A,4 ; NEXT SECTOR UNA0W CP SPT ; NEXT TRACK ? JR C,UNA1 INC C ; TRACK + 1 SUB SPT ; SECTORS / TRACK UNA1: INC HL LD (HL),C ; TRACK INC HL LD (HL),A ; SECTOR (512) DJNZ UNA0 INC HL LD (HL),0FFH ; END OF TABLE POP BC XOR A ; SET ZERO RET ; SENDM: ; SEND MESSAGE STARTING @ (HL) ; MESSAGE ENDS ON '$' LD A,(HL) ; LOAD CHARACTER CP '$' ; END OF STRING ? RET Z ; YES : DONE LD C,A ; NO : SEND CHARACTER CALL CONOUT ; TO CONSOLE INC HL ; NEXT CHARACTER JR SENDM ; ; **** ERROR - MESSAGES **** ; WRPROT: DEFB 0DH,7,0AH,'*** WRITE PROTECTED ***$' NRDY: DEFB 0DH,0AH,7,'DISK?$' ANRDY: DEFB 0DH,0AH,7,'CONA?$' BNRDY: DEFB 0DH,0AH,7,'CONB?$' PNRDY: DEFB 0DH,0AH,7,'LPT?$' ; ; **** DISK DEFINITION TABLES ; ; DISK PARAMETER HEADER FOR DISKS A .. D ; DPBASE: DPHW ; WINCHESTER OPTION DSKDEF MACRO CSV,ALV DEFW XLT,0,0,0 DEFW DIRB,DPB,CSV,ALV ENDM IFT NDISKS GE 1 DSKDEF CSV0,ALV0 ; FLOPPY 0 MIXED DRIVE A IFT NDISKS GE 2 DSKDEF CSV1,ALV1 ; FLOPPY 1 IFT NDISKS GE 3 DSKDEF CSV2,ALV2 ; FLOPPY 2 IFT NDISKS GE 4 DSKDEF CSV3,ALV3 ; FLOPPY 3 ENDIF ENDIF ENDIF ENDIF IFF MIX DEFW XLT,0,0,0 ; MIXED SYSTEM ONLY LAST DRIVE DEFW DIRB,DPBB,CSVMIX,ALVMIX ENDIF DPHS ; SINGLE-DENSITY DPHX ; MBYTE - OPTION ; ; DISK PARAMETER BLOCK ( FOR ALL DISKS ) ; DPBW ; FOR WINCHESTER ;------------------------------------------------------- IFF MINI ;------------------------------------------------------- DPB: DEFW SPT ; SECTORS / TRACK IFF MAXT EQ 80 DEFB 4,0FH,1 DEFW CAPS,3FH DEFB 80H,0 CL EQU 16 DEFW CL,2 ELSE DEFB 4,0FH,0 ; 16 BIT POINTER DEFW CAPS,127 ; 127 DIR-ENTRYS DEFB 0C0H,0 ; 2 DIR-BLOCKS CL EQU 32 DEFW CL,2 ; 32 SECTORS FOR DIRECTORY ENDIF ; **** EXTENTION FOR SPOOLING ONLY **** DEFW SBUF ; SECTOR BUFFER DEFW FCB ; FILE CONTROL BLOCK ;------------------------------------------------------- IFF MIX ;------------------------------------------------------- CAPSB EQU CAPACB/2-(SPT+7)/8-1 DPBB: DEFW SPT ; SPECIAL PARAMETER DEFB 4,0FH,1 ; FOR DRIVE B (MIXED) DEFW CAPSB,3FH DEFB 80H,0 DEFW 16,2 DEFW SBUF,FCB ;------------------------------------------------------- ENDIF ELSE ; 8" DISKS ;------------------------------------------------------- DPB: DEFW SPT DEFB 4,0FH,0 DEFW CAPS,0BFH DEFB 0E0H,0 CL EQU 30H DEFW CL,2 DEFW SBUF,FCB ;------------------------------------------------------- ENDIF ;------------------------------------------------------- DPBS ; SINGLE-DENSITY DPBX ; MBYTE OPTION ;------------------------------------------------------- IFF DMAMOD ; DMA-MODE ONLY ;------------------------------------------------------- ; ; COMMAND-TABLES FOR DMA CONTROLLER ; CWRT: ; DMA WRITE TO DISK DEFB 83H,0C3H,79H WBUF: DEFW DBUF WLEN: DEFW 512-1 DEFB 14H,28H DEFB 95H WIO: DEFB FDD,12H,LOW(INTVEC) DEFB 8AH,0CFH,5,0CFH,0ABH,87H CWRE: CWLEN EQU CWRE-CWRT ; CRDT: ; DMA READ FROM DISK DEFB 83H,0C3H,79H RBUF: DEFW DBUF RLEN: DEFW 512-1 DEFB 14H,28H,95H RIO: DEFB FDD DEFB 12H,LOW(INTVEC),8AH,0CFH,0ABH,87H CRDE: CRLEN EQU CRDE-CRDT ;------------------------------------------------------ ENDIF ; COMMON AGAIN ;------------------------------------------------------ ; ; INITIAL VALUES FOR DISK CMD TABLE ; FILL1: DEFB 0FFH,0,00H,0,01H,2,SPT/4,10H,2 ; ; **** COMMAND-AREA FOR UPD 765 ; DOSU: DEFB 0 ; UNIT FOR ZDOS DOST: DEFB 0 ; TRACK FOR ZDOS DOSS: DEFB 0 ; SECTOR FOR ZDOS DOSDMA: DEFW 0 ; .BUFFER FOR ZDOS ACTIVE: ; WRITE PENDING FLAG CMDTAB: DEFB 0 ; COMMAND-TABLE DISKU: DEFB 0 ; PHYS. UNIT DISKT: DEFB 0,0 ; PHYS. TRACK AND HEAD DISKS: DEFB 0,0,0,0,0 ; PHYS. SECTOR UNA: DEFB 0 ; 2=UNALLOC, 1=ALLOC TABLE: DEFB 0FFH ; UNIT FOR "ALLOC" DEFB 0FFH,0FFH ; TRACK, SECTOR DEFB 0FFH,0FFH ; TRACK, SECTOR DEFB 0FFH,0FFH ; TRACK, SECTOR DEFB 0FFH ; END OF TABLE ; ; **** CONSOLE BUFFER **** ; DEFB 07EH,7 ; BUFFER LENGTH, TEXTLENGTH BUF: DEFB 'DO INIT',0,0,0 ; STARTUP-PROCEDURE DEFB 0,0,0,0,0,0 DEFB 'HEAS VERSION 5.5' ; VERSION IFF MINI DEFB ' 5,25" ' ELSE DEFB ' 8" ' ENDIF IFF MBYTE DEFB ' X (MBYTE)' ELSE DEFB ' ' ENDIF DEFB 'COPYRIGHT (C) 19' DEFB '81, 82 BY H.K.M.' DEFB 'FOR ZDOS 5.B ' DEFB 'CENTRONICS PAR ' DEFB 'IS INSTALLED $' ; ; **** FILE CONTROL BLOCK FOR SPOOLING **** ; FCB: DEFB 0 ; DISK / EMPTY - FLAG DEFW 0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0 ; ; **** INIT-TABLE FOR SERIAL I/O ; CINIT: DEFB 01,4DH,8,01,0C1H,44H,6AH,04 DEFB 02,4DH,64,02,0C1H,44H,6AH,10 ; ; **** DIRECTORY - BUFFER **** ; DIRB: ; DEFS 80H DIRECTORY-BUFFER ; ; **** ZDOS COLDSTART **** ; (LOCATED IN DIRECTORY-BUFFER) ; BOOT: ; COMPUTE BAUDRATE OF TERMINAL LD SP,STACK ; DEFINE STACK-POS. LD HL,TCT ; TIME CONSTANT TABLE LD B,10 ; 10 ENTRIES CBOT: CP (HL) ; EQUAL ? INC HL JR Z,CBOT1 ; FOUND DJNZ CBOT CBOT1: LD (CINIT+10),A ; TC INTO TABLE LD C,B LD B,0 LD HL,TCCTC ADD HL,BC LD A,(HL) LD (CINIT+15),A ; BAUDRATE INTO CINIT IFF EPC OUT (RBOOT),A ; SWITCH OFF BOOT-EPROM ENDIF ; **** INITIALIZE OPTIONS INIX ; INIT MBYTE-OPTION ; **** SPECIFY MODE ;------------------------------------------------------- IFF DMAMOD ;------------------------------------------------------- LD HL,TERMI ; RESTORE IM 2 LD (INTVEC),HL ;------------------------------------------------------- ENDIF ;------------------------------------------------------- DI LD A,HIGH(INTVEC) LD I,A IM 2 EI LD BC,0303H ; SPECIFY ;------------------------------------------------------- IFF DMAMOD ;------------------------------------------------------- SPEC EQU HLTS*256+SRTS*16+HUTS SPECF EQU HLTSF*256+SRTSF*16+HUTS ;------------------------------------------------------- ELSE ;------------------------------------------------------- SPEC EQU HLTS*256+256+SRTS*16+HUTS SPECF EQU HLTSF*256+256+SRTSF*16+HUTS ;------------------------------------------------------- ENDIF ; DMAMOD ;------------------------------------------------------- INIW LD HL,SPEC ; SLOW VESION LD A,(FAST) ; FAST INSTALLED ? OR A JR NZ,SLOW LD HL,SPECF ; FAST VERSION SLOW: LD (DISKU),HL CALL CMFD ; INITIALIZE PAGE ZERO CBOT2: LD HL,FILL0 ; SET ZERO PAGE LD DE,0 LD BC,8 LDIR ; INITIALIZE CONSOLE PORT A LD A,4DH ; SET TIMER OUT (CTC),A LD HL,CINIT+15 IFF EPC LD A,96 ; 1,8 MHZ CLOCK (EPC) ELSE LD A,64 ; 2,5 MHZ CLOCK (CPU) ENDIF BIT 7,(HL) JR Z,XXXX LD A,104 ; 4 MHZ CLOCK (BOTH) XXXX: LD (CINIT+2),A OUT (CTC),A LD HL,CONI ; SET SIO PORT A LD A,18H OUT (CONA),A LD B,5 PLL: LD A,6 SUB B OUT (CONA),A LD A,(HL) INC HL OUT (CONA),A DJNZ PLL ; INITIALIZE PARALLEL PRINTER PORT LD A,0FH ; OUTPUT MODE 0 OUT (PIOB+1),A ; PORT B LD A,0CFH ; CONTROL MODE 3 OUT (PIOA+1),A ; PORT A LD A,0FH ; BIT 7 .. 4 = OUT ; BIT 0 .. 3 = IN OUT (PIOA+1),A XOR A OUT (PIOA),A ; CLEAR CONTROL-PORT LD HL,SGON ; PRINT SIGNON-MESSAGE CALL SENDM ; ***** CLEAR ALLOCATION - VECTORS LD HL,ALSTRT LD DE,ALSTRT+1 LD BC,ALENGTH-1 LD (HL),0 LDIR JP GODOS ; SGON: DEFB 0DH,0AH,'HEAS VERS 5.53' IFF EPC DEFB ' EPC-VERSION' ELSE IFF DMAMOD DEFB ' DMA-VERSION' ELSE DEFB ' NON-DMA-VERSION' ENDIF ENDIF IFF MINI DEFB ' 5,25"' IFF MAXT EQ 80 DEFB ' 40 TRK' ELSE DEFB ' 80 TRK' ENDIF IFF MIX DEFB ' B = 40 TRACK' ENDIF ELSE DEFB ' 8"' ENDIF IFF MBYTE DEFB ' EXTENDED (MBYTE)' ENDIF IFF WINCH DEFB ' WINCHESTER' ENDIF DEFB 0DH,0AH,'SYSTEM LOADED$' DEFB '30.06.83' ; CONI: DEFB 0,0,0C1H,44H,6AH ; ; INITIAL VALUES FOR PAGE ZERO ; FILL0: DEFB 0C3H ; JP WBOOT DEFW WBOOT DEFB 81H ; LPT,TTY,TTY,CRT DEFB 0 ; CURRENT DISK = A DEFB 0C3H ; JP ZDOS DEFW ZDOS ; ; BAUDRATE TABLES ; IFF EPC TCT: DEFB 7,13,26,52,104,6,12,24,48,96 ELSE TCT: DEFB 7,13,26,52,104,4,8,16,32,64 ENDIF TCCTC: DEFB 09H,04H,03H,02H,01H,00H,84H,83H,82H,81H,80H ENDBOT: ; SBUF EQU DIRB+80H ; SPOOL BUFFER DBUF EQU SBUF+80H ; 512- SECTOR - BUFFER ; ; **** UNINITIALIZED RAM-AREA ; CNEXT DEFL DBUF + 200H CSVW ; FOR WINCHESTER CSV0 EQU CNEXT ; NORM. UNIT 0 CNEXT DEFL CNEXT + CL IF NDISKS GT 1 CSV1 EQU CNEXT ; 1 CNEXT DEFL CNEXT + CL IF NDISKS GT 2 CSV2 EQU CNEXT ; 2 CNEXT DEFL CNEXT + CL IF NDISKS GT 3 CSV3 EQU CNEXT ; 3 CNEXT DEFL CNEXT + CL ENDIF ENDIF ENDIF IFF MIX ; 80 AND 40 TRACK ONLY CSVMIX EQU CNEXT CNEXT DEFL CNEXT + CL ENDIF CSVS ; SINGLE DENSITY CSVX ; MBYTE - OPTION ; ; **** ALLOCATION VECTOR ; HAS TO BE ZERO ON COLD START ; ALNEXT DEFL CNEXT ALSTRT EQU ALNEXT ALVW ; FOR WINCHESTER IFT NDISKS GE 1 ALV0 EQU ALNEXT ALNEXT DEFL ALNEXT + CAPS/8 + 1 ; FLOPPY 0 IFT NDISKS GE 2 ALV1 EQU ALNEXT ALNEXT DEFL ALNEXT + CAPS/8 + 1 ; FLOPPY 1 IFT NDISKS GE 3 ALV2 EQU ALNEXT ALNEXT DEFL ALNEXT + CAPS/8 + 1 ; FLOPPY 3 IFT NDISKS GE 4 ALV3 EQU ALNEXT ALNEXT DEFL ALNEXT + CAPS/8 + 1 ; FLOPPY 4 ENDIF ENDIF ENDIF ENDIF IFF MIX ALVMIX EQU ALNEXT ALNEXT DEFL ALNEXT + CAPSB/8 + 1 ENDIF ALVS ; SINGLE-DENSITY ALVX ; MBYTE - OPTION ALENGTH EQU ALNEXT - ALSTRT ; IFNDEF INTDEF INTVEC EQU KI+1F00H ; INT-VECTOR-PAGE ELSE INTVEC EQU ( ALNEXT + 100H ) AND 0FF00H .PRINTX /***** COMPUTED INTVEC *****/ DEFW ZZZZZZ,INTVEC ENDIF ;----------------------------------------------------- ; CHECK HEAS-LENGTH ;----------------------------------------------------- IF CNEXT GE INTVEC OR CNEXT LT KI .PRINTX /***** TOO LONG, COMPUTE INTVEC *****/ DEFW ZZZZZZ,INTVEC ENDIF IF ENDBOT GE KI+1E00H OR ENDBOT LT KI .PRINTX /***** CAN'T BE LOADED, LENGTH GREATER 1E00H *****/ DEFW ZZZZZZ,ENDBOT ENDIF ; .DEPHASE END