name ('ldbios') title ATHENA Loader Bios for the STD/BHS 60KB Development System .z80 .tfcond .comment ~ L D R B I O S . M A C Version 1.00 Creation Date: 14 April 1982 Module 3.0 Date Last Revised: 8 December 1982 ATHENA Loader Bios for the STD/BHS 60KB Development System Edit History: 14 Apr 82 - Created by Mike Pinkston for MP/M 2.1. 8 Dec 82 - Modified for the ATHENA 1.0 loader. 24 Jan 83 - Modified for the ATHENA 1.2 loader. ~ subttl Global/External points of entry and reference page 60 GLOBAL WBOOTF, CONIF, CONOF GLOBAL HOMF, SELF, TRKF, SECF, DMAF, DRDF, SECTRN subttl Loader Bios equate statements page IOCS EQU 0EFE0H ; MOSTEK DCF I/O CONTROL VECTOR. DCF EQU 0F800H ; MOSTEK DCF ORIGIN. RETRY EQU 10 ; NUMBER OF RETRIES AFTER AN ERROR OCCURS. ERROR EQU 0F806H ; ADDRESS OF DISK ERROR ROUTINE. ; SIOAD EQU 94H ; Address of SIO channel A's data port. SIOAC EQU 95H ; Address of SIO channel A's command port. SIOBD EQU 96H ; Address of SIO channel B's data port. SIOBC EQU 97H ; Address of SIO channel B's command port. ; REQUST EQU 0 ; UNIT EQU 1 ; TRACK EQU 2 ; SECTOR EQU 3 ; DMALOW EQU 4 ; DMAHI EQU 5 ; ERRFLG EQU 6 ; ; READR EQU 11H ; WRITER EQU 12H ; RESTOR EQU 14H ; HOME THE DISK HEAD. ; CR EQU 0DH ; CARRIAGE RETURN. LF EQU 0AH ; LINE FEED. PREFIX EQU 1BH ; ESCAPE. ERASE EQU 76H ; CLEAR SCREEN. subttl START OF LOADER BIOS JUMP TABLE page JP BOOT ; COLD START WBOOTF:: JP WBOOT ; WARM START JP CONST ; CONSOLE STATUS CONIF:: JP CONIN ; CONSOLE CHARACTER IN CONOF:: JP CONOUT ; CONSOLE CHARACTER OUT JP LIST ; LIST CHARACTER OUT JP PUNCH ; PUNCH CHARACTER OUT JP READER ; READER CHARACTER OUT HOMF:: JP HOME ; MOVE HEAD TO HOME POSITION SELF:: JP SELDSK ; SELECT DISK TRKF:: JP SETTRK ; SET TRACK NUMBER SECF:: JP SETSEC ; SET SECTOR NUMBER DMAF:: JP SETDMA ; SET DMA ADDRESS DRDF:: JP READ ; READ DISK JP WRITE ; WRITE DISK JP LISTST ; RETURN LIST STATUS SECTRN:: JP SECTRAN ; SECTOR TRANSLATE subttl FIXED DATA TABLES FOR ATHENA 1.0 USAGE page ; *** FIXED DATA TABLES FOR ONE-DRIVE STANDARD *** ; *** IBM-COMPATIBLE 8" DISKS *** ; *** *** ; *** DISK PARAMETER HEADER FOR DISK 00 *** DPBASE: DEFW TRANS,0000H DEFW 0000H,0000H DEFW DIRBF,DPBLK DEFW CHK00,ALL00 ; *** SECTOR TRANSLATE VECTOR *** TRANS: DEFB 1,7,13,19 ; SECTORS 1,2,3,4 DEFB 25,5,11,17 ; SECTORS 5,6,7,8 DEFB 23,3,9,15 ; SECTORS 9,10,11,12 DEFB 21,2,8,14 ; SECTORS 13,14,15,16 DEFB 20,26,6,12 ; SECTORS 17,18,19,20 DEFB 18,24,4,10 ; SECTORS 21,22,23,24 DEFB 16,22 ; SECTORS 25,26 DPBLK: ; DISK PARAMETER BLOCK, COMMON TO ALL DISKS DEFW 26 ; SECTORS PER TRACK DEFB 3 ; BLOCK SHIFT FACTOR DEFB 7 ; BLOCK MASK DEFB 0 ; NULL MASK DEFW 242 ; DISK SIZE-1 DEFW 63 ; DIRECTORY MAX DEFB 192 ; ALLOC 0 DEFB 0 ; ALLOC 1 DEFW 16 ; CHECK SIZE DEFW 2 ; TRACK OFFSET ; *** END OF FIXED TABLES *** subttl START OF LOADER BIOS ROUTINES page ; *** INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNCTION *** BOOT: WBOOT: GOCPM: LIST: PUNCH: READER: JP 0100H ; Jump to the start of the loader. subttl CONSOLE AND LIST DEVICE DRIVERS page CONST: ; CONSOLE STATUS, RETURN 0FFH IF CHARACTER ; READY, 00H IF NOT. LD A,0FFH RET CONIN: ; CONSOLE CHARACTER INTO REGISTER A. LD A,' ' RET CONOUT: ; CONSOLE CHARACTER OUTPUT FROM REGISTER C PUSH AF SUB A OUT (SIOAC),A CONO1$: IN A,(SIOAC) BIT 2,A JR Z,CONO1$ LD A,C OUT (SIOAD),A POP AF RET LISTST: XOR A RET subttl DISK I/O DRIVERS page HOME: ; MOVE TO THE TRACK 00 POSITION OF ; CURRENT DRIVE. PUSH IY LD IY,IOCS LD (IY+TRACK),00 LD (IY+REQUST),RESTOR CALL DCF POP IY RET SELDSK: ; SELECT DISK GIVEN BY REGISTER C LD HL,0000H LD A,C CP 2 ; MUST BE BETWEEN 0 AND 1 RET NC ; NO CARRY IF 2,3,4,5,... ; (DISK NUMBER IS IN THE PROPER RANGE) PUSH IY LD IY,IOCS LD (IY+UNIT),C POP IY ; (COMPUTE PROPER DISK PARAMETER HEADER ADDRESS) LD L,A ; L=DISK NUMBER 0,1 LD H,0 ; HIGH ORDER ZERO ADD HL,HL ; *2 ADD HL,HL ; *4 ADD HL,HL ; *8 ADD HL,HL ; *16 (SIZE OF EACH HEADER) LD DE,DPBASE ; ADD HL,DE ; HL=.DPBASE(DISKNO*16) RET ; EXIT. SETTRK: ; SET TRACK GIVEN BY REGISTER C. PUSH IY LD IY,IOCS LD (IY+TRACK),C POP IY RET SETSEC: ; SET SECTOR GIVEN BY REGISTER C. PUSH IY LD IY,IOCS LD (IY+SECTOR),C POP IY RET SECTRAN: ; TRANSLATE THE SECTOR GIVEN BY ; BC USING THE ; TRANSLATE TABLE GIVEN BY DE. EX DE,HL ; HL=.TRANS ADD HL,BC ; HL=.TRANS(SECTOR) LD L,(HL) ; L = TRANS(SECTOR) LD H,0 ; HL= TRANS(SECTOR) RET ; WITH VALUE IN HL SETDMA: ; SET DMA ADDRESS GIVEN BY REGISTERS ; B AND C. LD (DMAAD),BC RET READ: ; READ A SECTOR. PUSH IY LD IY,IOCS LD (IY+REQUST),READR READ0$: LD B,RETRY READ1$: LD HL,(DMAAD) LD (IY+DMALOW),L LD (IY+DMAHI),H CALL DCF JR Z,READ2$ DJNZ READ1$ CALL ERROR LD A,0FFH JR READ3$ READ2$: XOR A READ3$: POP IY RET WRITE: PUSH IY LD IY,IOCS LD (IY+REQUST),WRITER JR READ0$ subttl CBIOS DATA AREAS page ; THE REMAINDER OF THE CBIOS IS RESERVED UNINITIALIZED ; DATA AREA, AND DOES NOT NEED TO BE A PART OF THE ; SYSTEM MEMORY IMAGE (THE SPACE MUST BE AVAILABLE, ; HOWEVER, BETWEEN "BEGDAT" AND "ENDDAT"). DMAAD: DEFW 0 ; Direct Memory Access Address. ; *** SCRATCH RAM AREA FOR BDOS USE *** BEGDAT EQU $ ; BEGINNING OF DATA AREA. DIRBF EQU BEGDAT ; SCRATCH DIRECTORY AREA. ALL00 EQU BEGDAT+128 ; ALLOCATION VECTOR 0. ALL01 EQU BEGDAT+159 ; ALLOCATION VECTOR 1. CHK00 EQU BEGDAT+190 ; CHECK VECTOR 0. CHK01 EQU BEGDAT+206 ; CHECK VECTOR 1. ENDDAT EQU BEGDAT+222 ; DATSIZ EQU 222 ; SIZE OF THE DATA AREA. END