CP/M Operating System Manual

CP/M Manual

Appendix A

The MDS Basic I/O System (BIOS)


NOTE

This appendix consists of a cross-reference listing generated by the XREF utility from the results of assembly with MAC. The original source file used to generate this listing is available here.


     1                  ;	MDS-800 I/O DRIVERS FOR CP/M 2.2
     2                  ;	(FOUR DRIVE SINGLE DENSITY VERSION)
     3                  ;
     4                  ;	VERSION 2.2 FEBRUARY, 1980
     5                  ;
     6   0016 =         VERS	EQU	22	;VERSION 2.2
     7                  ;
     8                  ;	COPYRIGHT (C) 1980
     9                  ;	DIGITAL RESEARCH
    10                  ;	BOX 579, PACIFIC GROVE
    11                  ;	CALIFORNIA, 93950
    12                  ;
    13                  ;
    14   FFFF =         TRUE	EQU	0FFFFH	;VALUE OF "TRUE"
    15   0000 =         FALSE	EQU	NOT TRUE	;"FALSE"
    16   0000 =         TEST	EQU	FALSE	;TRUE IF TEST BIOS
    17                  ;
    18                  	IF	TEST
    19                  BIAS	EQU	03400H	;BASE OF CCP IN TEST SYSTEM
    20                  	ENDIF
    21                  	IF	NOT TEST
    22   0000 =         BIAS	EQU	0000H	;GENERATE RELOCATABLE CP/M SYSTEM
    23                  	ENDIF
    24                  ;
    25   1600 =         PATCH	EQU	1600H
    26                  ;
    27   1600           	ORG	PATCH
    28   0000 =         CPMB	EQU	$-PATCH	;BASE OF CPM CONSOLE PROCESSOR
    29   0806 =         BDOS	EQU	806H+CPMB	;BASIC DOS (RESIDENT PORTION)
    30   1600 =         CPML	EQU	$-CPMB	;LENGTH (IN BYTES) OF CPM SYSTEM
    31   002C =         NSECTS	EQU	CPML/128	;NUMBER OF SECTORS TO LOAD
    32   0002 =         OFFSET	EQU	2	;NUMBER OF DISK TRACKS USED BY CP/M
    33   0004 =         CDISK	EQU	0004H	;ADDRESS OF LAST LOGGED DISK ON WARM START
    34   0080 =         BUFF	EQU	0080H	;DEFAULT BUFFER ADDRESS
    35   000A =         RETRY	EQU	10	;MAX RETRIES ON DISK I/O BEFORE ERROR
    36                  ;
    37                  ;	PERFORM FOLLOWING FUNCTIONS
    38                  ;	BOOT	COLD START
    39                  ;	WBOOT	WARM START (SAVE I/O BYTE)
    40                  ;	(BOOT AND WBOOT ARE THE SAME FOR MDS)
    41                  ;	CONST	CONSOLE STATUS
    42                  ;		REG-A = 00 IF NO CHARACTER READY
    43                  ;		REG-A = FF IF CHARACTER READY
    44                  ;	CONIN	CONSOLE CHARACTER IN (RESULT IN REG-A)
    45                  ;	CONOUT	CONSOLE CHARACTER OUT (CHAR IN REG-C)
    46                  ;	LIST	LIST OUT (CHAR IN REG-C)
    47                  ;	PUNCH	PUNCH OUT (CHAR IN REG-C)
    48                  ;	READER	PAPER TAPE READER IN (RESULT TO REG-A)
    49                  ;	HOME	MOVE TO TRACK 00
    50                  ;
    51                  ;	(THE FOLLOWING CALLS SET-UP THE IO PARAMETER BLOCK FOR THE
    52                  ;	MDS, WHICH IS USED TO PERFORM SUBSEQUENT READS AND WRITES)
    53                  ;	SELDSK	SELECT DISK GIVEN BY REG-C (0,1,2...)
    54                  ;	SETTRK	SET TRACK ADDRESS (0,...76) FOR SUBSEQUENT READ/WRITE
    55                  ;	SETSEC	SET SECTOR ADDRESS (1,...,26) FOR SUBSEQUENT READ/WRITE
    56                  ;	SETDMA	SET SUBSEQUENT DMA ADDRESS (INITIALLY 80H)
    57                  ;
    58                  ;	(READ AND WRITE ASSUME PREVIOUS CALLS TO SET UP THE IO PARAMETERS)
    59                  ;	READ	READ TRACK/SECTOR TO PRESET DMA ADDRESS
    60                  ;	WRITE	WRITE TRACK/SECTOR FROM PRESET DMA ADDRESS
    61                  ;
    62                  ;	JUMP VECTOR FOR INDIVIUAL ROUTINES
    63   1600 C3B316    	JMP	BOOT
    64   1603 C3C316    WBOOTE:	JMP	WBOOT
    65   1606 C36117    	JMP	CONST
    66   1609 C36417    	JMP	CONIN
    67   160C C36A17    	JMP	CONOUT
    68   160F C36D17    	JMP	LIST
    69   1612 C37217    	JMP	PUNCH
    70   1615 C37517    	JMP	READER
    71   1618 C37817    	JMP	HOME
    72   161B C37D17    	JMP	SELDSK
    73   161E C3A717    	JMP	SETTRK
    74   1621 C3AC17    	JMP	SETSEC
    75   1624 C3BB17    	JMP	SETDMA
    76   1627 C3C117    	JMP	READ
    77   162A C3CA17    	JMP	WRITE
    78   162D C37017    	JMP	LISTST	;LIST STATUS
    79   1630 C3B117    	JMP	SECTRAN
    80                  ;
    81                  	MACLIB	DISKDEF	;LOAD THE DISK DEFINITION LIBRARY
    82                  	DISKS	4	;FOUR DISKS
    83   1633+=         DPBASE	EQU	$	;BASE OF DISK PARAMETER BLOCKS
    84   1633+82160000  DPE0:	DW	XLT0,0000H	;TRANSLATE TABLE
    85   1637+00000000  	DW	0000H,0000H	;SCRATCH AREA
    86   163B+6E187316  	DW	DIRBUF,DPB0	;DIR BUFF,PARM BLOCK
    87   163F+0D19EE18  	DW	CSV0,ALV0	;CHECK, ALLOC VECTORS
    88   1643+82160000  DPE1:	DW	XLT1,0000H	;TRANSLATE TABLE
    89   1647+00000000  	DW	0000H,0000H	;SCRATCH AREA
    90   164B+6E187316  	DW	DIRBUF,DPB1	;DIR BUFF,PARM BLOCK
    91   164F+3C191D19  	DW	CSV1,ALV1	;CHECK, ALLOC VECTORS
    92   1653+82160000  DPE2:	DW	XLT2,0000H	;TRANSLATE TABLE
    93   1657+00000000  	DW	0000H,0000H	;SCRATCH AREA
    94   165B+6E187316  	DW	DIRBUF,DPB2	;DIR BUFF,PARM BLOCK
    95   165F+6B194C19  	DW	CSV2,ALV2	;CHECK, ALLOC VECTORS
    96   1663+82160000  DPE3:	DW	XLT3,0000H	;TRANSLATE TABLE
    97   1667+00000000  	DW	0000H,0000H	;SCRATCH AREA
    98   166B+6E187316  	DW	DIRBUF,DPB3	;DIR BUFF,PARM BLOCK
    99   166F+9A197B19  	DW	CSV3,ALV3	;CHECK, ALLOC VECTORS
   100                  	DISKDEF	0,1,26,6,1024,243,64,64,OFFSET
   101   1673+=         DPB0	EQU	$		;DISK PARM BLOCK
   102   1673+1A00      	DW	26		;SEC PER TRACK
   103   1675+03        	DB	3		;BLOCK SHIFT
   104   1676+07        	DB	7		;BLOCK MASK
   105   1677+00        	DB	0		;EXTNT MASK
   106   1678+F200      	DW	242		;DISK SIZE-1
   107   167A+3F00      	DW	63		;DIRECTORY MAX
   108   167C+C0        	DB	192		;ALLOC0
   109   167D+00        	DB	0		;ALLOC1
   110   167E+1000      	DW	16		;CHECK SIZE
   111   1680+0200      	DW	2		;OFFSET
   112   1682+=         XLT0	EQU	$		;TRANSLATE TABLE
   113   1682+01        	DB	1		
   114   1683+07        	DB	7		
   115   1684+0D        	DB	13		
   116   1685+13        	DB	19		
   117   1686+19        	DB	25		
   118   1687+05        	DB	5		
   119   1688+0B        	DB	11		
   120   1689+11        	DB	17		
   121   168A+17        	DB	23		
   122   168B+03        	DB	3		
   123   168C+09        	DB	9		
   124   168D+0F        	DB	15		
   125   168E+15        	DB	21		
   126   168F+02        	DB	2		
   127   1690+08        	DB	8		
   128   1691+0E        	DB	14		
   129   1692+14        	DB	20		
   130   1693+1A        	DB	26		
   131   1694+06        	DB	6		
   132   1695+0C        	DB	12		
   133   1696+12        	DB	18		
   134   1697+18        	DB	24		
   135   1698+04        	DB	4		
   136   1699+0A        	DB	10		
   137   169A+10        	DB	16		
   138   169B+16        	DB	22		
   139                  	DISKDEF	1,0
   140   1673+=         DPB1	EQU	DPB0	;EQUIVALENT PARAMETERS
   141   001F+=         ALS1	EQU	ALS0	;SAME ALLOCATION VECTOR SIZE
   142   0010+=         CSS1	EQU	CSS0	;SAME CHECKSUM VECTOR SIZE
   143   1682+=         XLT1	EQU	XLT0	;SAME TRANSLATE TABLE
   144                  	DISKDEF	2,0
   145   1673+=         DPB2	EQU	DPB0	;EQUIVALENT PARAMETERS
   146   001F+=         ALS2	EQU	ALS0	;SAME ALLOCATION VECTOR SIZE
   147   0010+=         CSS2	EQU	CSS0	;SAME CHECKSUM VECTOR SIZE
   148   1682+=         XLT2	EQU	XLT0	;SAME TRANSLATE TABLE
   149                  	DISKDEF	3,0
   150   1673+=         DPB3	EQU	DPB0	;EQUIVALENT PARAMETERS
   151   001F+=         ALS3	EQU	ALS0	;SAME ALLOCATION VECTOR SIZE
   152   0010+=         CSS3	EQU	CSS0	;SAME CHECKSUM VECTOR SIZE
   153   1682+=         XLT3	EQU	XLT0	;SAME TRANSLATE TABLE
   154                  ;	ENDEF OCCURS AT END OF ASSEMBLY
   155                  ;
   156                  ;	END OF CONTROLLER - INDEPENDENT CODE, THE REMAINING SUBROUTINES
   157                  ;	ARE TAILORED TO THE PARTICULAR OPERATING ENVIRONMENT, AND MUST
   158                  ;	BE ALTERED FOR ANY SYSTEM WHICH DIFFERS FROM THE INTEL MDS.
   159                  ;
   160                  ;	THE FOLLOWING CODE ASSUMES THE MDS MONITOR EXISTS AT 0F800H
   161                  ;	AND USES THE I/O SUBROUTINES WITHIN THE MONITOR
   162                  ;
   163                  ;	WE ALSO ASSUME THE MDS SYSTEM HAS FOUR DISK DRIVES
   164   00FD =         REVRT	EQU	0FDH	;INTERRUPT REVERT PORT
   165   00FC =         INTC	EQU	0FCH	;INTERRUPT MASK PORT
   166   00F3 =         ICON	EQU	0F3H	;INTERRUPT CONTROL PORT
   167   007E =         INTE	EQU	0111$1110B	;ENABLE RST 0(WARM BOOT), RST 7 (MONITOR)
   168                  ;
   169                  ;	MDS MONITOR EQUATES
   170   F800 =         MON80	EQU	0F800H	;MDS MONITOR
   171   FF0F =         RMON80	EQU	0FF0FH	;RESTART MON80 (BOOT ERROR)
   172   F803 =         CI	EQU	0F803H	;CONSOLE CHARACTER TO REG-A
   173   F806 =         RI	EQU	0F806H	;READER IN TO REG-A
   174   F809 =         CO	EQU	0F809H	;CONSOLE CHAR FROM C TO CONSOLE OUT
   175   F80C =         PO	EQU	0F80CH	;PUNCH CHAR FROM C TO PUNCH DEVICE
   176   F80F =         LO	EQU	0F80FH	;LIST FROM C TO LIST DEVICE
   177   F812 =         CSTS	EQU	0F812H	;CONSOLE STATUS 00/FF TO REGISTER A
   178                  ;
   179                  ;	DISK PORTS AND COMMANDS
   180   0078 =         BASE	EQU	78H	;BASE OF DISK COMMAND IO PORTS
   181   0078 =         DSTAT	EQU	BASE	;DISK STATUS (INPUT)
   182   0079 =         RTYPE	EQU	BASE+1	;RESULT TYPE (INPUT)
   183   007B =         RBYTE	EQU	BASE+3	;RESULT BYTE (INPUT)
   184                  ;
   185   0079 =         ILOW	EQU	BASE+1	;IOPB LOW ADDRESS (OUTPUT)
   186   007A =         IHIGH	EQU	BASE+2	;IOPB HIGH ADDRESS (OUTPUT)
   187                  ;
   188   0004 =         READF	EQU	4H	;READ FUNCTION
   189   0006 =         WRITF	EQU	6H	;WRITE FUNCTION
   190   0003 =         RECAL	EQU	3H	;RECALIBRATE DRIVE
   191   0004 =         IORDY	EQU	4H	;I/O FINISHED MASK
   192   000D =         CR	EQU	0DH	;CARRIAGE RETURN
   193   000A =         LF	EQU	0AH	;LINE FEED
   194                  ;
   195                  SIGNON:	;SIGNON MESSAGE: XXK CP/M VERS Y.Y
   196   169C 0D0A0A    	DB	CR,LF,LF
   197                  	IF	TEST
   198                  	DB	'32'	;32K EXAMPLE BIOS
   199                  	ENDIF
   200                  	IF	NOT TEST
   201   169F 3030      	DB	'00'	;MEMORY SIZE FILLED BY RELOCATOR
   202                  	ENDIF
   203   16A1 6B2043502F	DB	'k CP/M vers '
   204   16AD 322E32    	DB	VERS/10+'0','.',VERS MOD 10+'0'
   205   16B0 0D0A00    	DB	CR,LF,0
   206                  ;
   207                  BOOT:	;PRINT SIGNON MESSAGE AND GO TO CCP
   208                  ;	(NOTE: MDS BOOT INITIALIZED IOBYTE AT 0003H)
   209   16B3 310001    	LXI	SP,BUFF+80H
   210   16B6 219C16    	LXI	H,SIGNON
   211   16B9 CDD317    	CALL	PRMSG	;PRINT MESSAGE
   212   16BC AF        	XRA	A	;CLEAR ACCUMULATOR
   213   16BD 320400    	STA	CDISK	;SET INITIALLY TO DISK A
   214   16C0 C30F17    	JMP	GOCPM	;GO TO CP/M
   215                  ;
   216                  ;
   217                  WBOOT:;	LOADER ON TRACK 0, SECTOR 1, WHICH WILL BE SKIPPED FOR WARM 
   218                  ;	READ CP/M FROM DISK - ASSUMING THERE IS A 128 BYTE COLD START
   219                  ;	START.
   220                  ;
   221   16C3 318000    	LXI	SP,BUFF	;USING DMA - THUS 80 THRU FF AVAILABLE FOR STACK
   222                  ;
   223   16C6 0E0A      	MVI	C,RETRY	;MAX RETRIES
   224   16C8 C5        	PUSH	B
   225                  WBOOT0:	;ENTER HERE ON ERROR RETRIES
   226   16C9 010000    	LXI	B,CPMB	;SET DMA ADDRESS TO START OF DISK SYSTEM
   227   16CC CDBB17    	CALL	SETDMA
   228   16CF 0E00      	MVI	C,0	;BOOT FROM DRIVE 0
   229   16D1 CD7D17    	CALL	SELDSK
   230   16D4 0E00      	MVI	C,0
   231   16D6 CDA717    	CALL	SETTRK	;START WITH TRACK 0
   232   16D9 0E02      	MVI	C,2	;START READING SECTOR 2
   233   16DB CDAC17    	CALL	SETSEC
   234                  ;
   235                  ;	READ SECTORS, COUNT NSECTS TO ZERO
   236   16DE C1        	POP	B	;10-ERROR COUNT
   237   16DF 062C      	MVI	B,NSECTS
   238                  RDSEC:	;READ NEXT SECTOR
   239   16E1 C5        	PUSH	B	;SAVE SECTOR COUNT
   240   16E2 CDC117    	CALL	READ
   241   16E5 C24917    	JNZ	BOOTERR	;RETRY IF ERRORS OCCUR
   242   16E8 2A6C18    	LHLD	IOD	;INCREMENT DMA ADDRESS
   243   16EB 118000    	LXI	D,128	;SECTOR SIZE
   244   16EE 19        	DAD	D	;INCREMENTED DMA ADDRESS IN HL
   245   16EF 44        	MOV	B,H
   246   16F0 4D        	MOV	C,L	;READY FOR CALL TO SET DMA
   247   16F1 CDBB17    	CALL	SETDMA
   248   16F4 3A6B18    	LDA	IOS	;SECTOR NUMBER JUST READ
   249   16F7 FE1A      	CPI	26	;READ LAST SECTOR?
   250   16F9 DA0517    	JC	RD1
   251                  ;	MUST BE SECTOR 26, ZERO AND GO TO NEXT TRACK
   252   16FC 3A6A18    	LDA	IOT	;GET TRACK TO REGISTER A
   253   16FF 3C        	INR	A
   254   1700 4F        	MOV	C,A	;READY FOR CALL
   255   1701 CDA717    	CALL	SETTRK
   256   1704 AF        	XRA	A	;CLEAR SECTOR NUMBER
   257   1705 3C        RD1:	INR	A	;TO NEXT SECTOR
   258   1706 4F        	MOV	C,A	;READY FOR CALL
   259   1707 CDAC17    	CALL	SETSEC
   260   170A C1        	POP	B	;RECALL SECTOR COUNT
   261   170B 05        	DCR	B	;DONE?
   262   170C C2E116    	JNZ	RDSEC
   263                  ;
   264                  ;	DONE WITH THE LOAD, RESET DEFAULT BUFFER ADDRESS
   265                  GOCPM:	;(ENTER HERE FROM COLD START BOOT)
   266                  ;	ENABLE RST0 AND RST7
   267   170F F3        	DI
   268   1710 3E12      	MVI	A,12H	;INITIALIZE COMMAND
   269   1712 D3FD      	OUT	REVRT
   270   1714 AF        	XRA	A
   271   1715 D3FC      	OUT	INTC	;CLEARED
   272   1717 3E7E      	MVI	A,INTE	;RST0 AND RST7 BITS ON
   273   1719 D3FC      	OUT	INTC
   274   171B AF        	XRA	A
   275   171C D3F3      	OUT	ICON	;INTERRUPT CONTROL
   276                  ;
   277                  ;	SET DEFAULT BUFFER ADDRESS TO 80H
   278   171E 018000    	LXI	B,BUFF
   279   1721 CDBB17    	CALL	SETDMA
   280                  ;
   281                  ;	RESET MONITOR ENTRY POINTS
   282   1724 3EC3      	MVI	A,JMP
   283   1726 320000    	STA	0
   284   1729 210316    	LXI	H,WBOOTE
   285   172C 220100    	SHLD	1	;JMP WBOOT AT LOCATION 00
   286   172F 320500    	STA	5
   287   1732 210608    	LXI	H,BDOS
   288   1735 220600    	SHLD	6	;JMP BDOS AT LOCATION 5
   289                  	IF	NOT TEST
   290   1738 323800    	STA	7*8	;JMP TO MON80 (MAY HAVE BEEN CHANGED BY DDT)
   291   173B 2100F8    	LXI	H,MON80
   292   173E 223900    	SHLD	7*8+1
   293                  	ENDIF
   294                  ;	LEAVE IOBYTE SET
   295                  ;	PREVIOUSLY SELECTED DISK WAS B, SEND PARAMETER TO CPM
   296   1741 3A0400    	LDA	CDISK	;LAST LOGGED DISK NUMBER
   297   1744 4F        	MOV	C,A	;SEND TO CCP TO LOG IT IN
   298   1745 FB        	EI
   299   1746 C30000    	JMP	CPMB
   300                  ;
   301                  ;	ERROR CONDITION OCCURRED, PRINT MESSAGE AND RETRY
   302                  BOOTERR:
   303   1749 C1        	POP	B	;RECALL COUNTS
   304   174A 0D        	DCR	C
   305   174B CA5217    	JZ	BOOTER0
   306                  ;	TRY AGAIN
   307   174E C5        	PUSH	B
   308   174F C3C916    	JMP	WBOOT0
   309                  ;
   310                  BOOTER0:
   311                  ;	OTHERWISE TOO MANY RETRIES
   312   1752 215B17    	LXI	H,BOOTMSG
   313   1755 CDD317    	CALL	PRMSG
   314   1758 C30FFF    	JMP	RMON80	;MDS HARDWARE MONITOR
   315                  ;
   316                  BOOTMSG:
   317   175B 3F626F6F74	DB	'?boot',0
   318                  ;
   319                  ;
   320                  CONST:	;CONSOLE STATUS TO REG-A
   321                  ;	(EXACTLY THE SAME AS MDS CALL)
   322   1761 C312F8    	JMP	CSTS
   323                  ;
   324                  CONIN:	;CONSOLE CHARACTER TO REG-A
   325   1764 CD03F8    	CALL	CI
   326   1767 E67F      	ANI	7FH	;REMOVE PARITY BIT
   327   1769 C9        	RET
   328                  ;
   329                  CONOUT:	;CONSOLE CHARACTER FROM C TO CONSOLE OUT
   330   176A C309F8    	JMP	CO
   331                  ;
   332                  LIST:	;LIST DEVICE OUT
   333                  ;	(EXACTLY THE SAME AS MDS CALL)
   334   176D C30FF8    	JMP	LO
   335                  ;
   336                  LISTST:
   337                  	;RETURN LIST STATUS
   338   1770 AF        	XRA	A
   339   1771 C9        	RET		;ALWAYS NOT READY
   340                  ;
   341                  PUNCH:	;PUNCH DEVICE OUT
   342                  ;	(EXACTLY THE SAME AS MDS CALL)
   343   1772 C30CF8    	JMP	PO
   344                  ;
   345                  READER:	;READER CHARACTER IN TO REG-A
   346                  ;	(EXACTLY THE SAME AS MDS CALL)
   347   1775 C306F8    	JMP	RI
   348                  ;
   349                  HOME:	;MOVE TO HOME POSITION
   350                  ;	TREAT AS TRACK 00 SEEK
   351   1778 0E00      	MVI	C,0
   352   177A C3A717    	JMP	SETTRK
   353                  ;
   354                  SELDSK:	;SELECT DISK GIVEN BY REGISTER C
   355   177D 210000    	LXI	H,0000H	;RETURN 0000 IF ERROR
   356   1780 79        	MOV	A,C
   357   1781 FE04      	CPI	NDISKS	;TOO LARGE?
   358   1783 D0        	RNC		;LEAVE HL = 0000
   359                  ;
   360   1784 E602      	ANI	10B	;00 00 FOR DRIVE 0,1 AND 10 10 FOR DRIVE 2,3
   361   1786 326618    	STA	DBANK	;TO SELECT DRIVE BANK
   362   1789 79        	MOV	A,C	;00, 01, 10, 11
   363   178A E601      	ANI	1B	;MDS HAS 0,1 AT 78, 2,3 AT 88
   364   178C B7        	ORA	A	;RESULT 00?
   365   178D CA9217    	JZ	SETDRIVE
   366   1790 3E30      	MVI	A,00110000B	;SELECTS DRIVE 1 IN BANK
   367                  SETDRIVE:
   368   1792 47        	MOV	B,A	;SAVE THE FUNCTION
   369   1793 216818    	LXI	H,IOF	;IO FUNCTION
   370   1796 7E        	MOV	A,M
   371   1797 E6CF      	ANI	11001111B	;MASK OUT DISK NUMBER
   372   1799 B0        	ORA	B	;MASK IN NEW DISK NUMBER
   373   179A 77        	MOV	M,A	;SAVE IT IN IOPB
   374   179B 69        	MOV	L,C
   375   179C 2600      	MVI	H,0	;HL=DISK NUMBER
   376   179E 29        	DAD	H	;*2
   377   179F 29        	DAD	H	;*4
   378   17A0 29        	DAD	H	;*8
   379   17A1 29        	DAD	H	;*16
   380   17A2 113316    	LXI	D,DPBASE
   381   17A5 19        	DAD	D	;HL=DISK HEADER TABLE ADDRESS
   382   17A6 C9        	RET
   383                  ;
   384                  ;
   385                  SETTRK:	;SET TRACK ADDRESS GIVEN BY C
   386   17A7 216A18    	LXI	H,IOT
   387   17AA 71        	MOV	M,C
   388   17AB C9        	RET
   389                  ;
   390                  SETSEC:	;SET SECTOR NUMBER GIVEN BY C
   391   17AC 216B18    	LXI	H,IOS
   392   17AF 71        	MOV	M,C
   393   17B0 C9        	RET
   394                  SECTRAN:
   395                  		;TRANSLATE SECTOR BC USING TABLE AT DE
   396   17B1 0600      	MVI	B,0	;DOUBLE PRECISION SECTOR NUMBER IN BC
   397   17B3 EB        	XCHG		;TRANSLATE TABLE ADDRESS TO HL
   398   17B4 09        	DAD	B	;TRANSLATE(SECTOR) ADDRESS
   399   17B5 7E        	MOV	A,M	;TRANSLATED SECTOR NUMBER TO A
   400   17B6 326B18    	STA	IOS
   401   17B9 6F        	MOV	L,A	;RETURN SECTOR NUMBER IN L
   402   17BA C9        	RET
   403                  ;
   404                  SETDMA:	;SET DMA ADDRESS GIVEN BY REGS B,C
   405   17BB 69        	MOV	L,C
   406   17BC 60        	MOV	H,B
   407   17BD 226C18    	SHLD	IOD
   408   17C0 C9        	RET
   409                  ;
   410                  READ:	;READ NEXT DISK RECORD (ASSUMING DISK/TRK/SEC/DMA SET)
   411   17C1 0E04      	MVI	C,READF	;SET TO READ FUNCTION
   412   17C3 CDE017    	CALL	SETFUNC
   413   17C6 CDF017    	CALL	WAITIO	;PERFORM READ FUNCTION
   414   17C9 C9        	RET		;MAY HAVE ERROR SET IN REG-A
   415                  ;
   416                  ;
   417                  WRITE:	;DISK WRITE FUNCTION
   418   17CA 0E06      	MVI	C,WRITF
   419   17CC CDE017    	CALL	SETFUNC	;SET TO WRITE FUNCTION
   420   17CF CDF017    	CALL	WAITIO
   421   17D2 C9        	RET		;MAY HAVE ERROR SET
   422                  ;
   423                  ;
   424                  ;	UTILITY SUBROUTINES
   425                  PRMSG:	;PRINT MESSAGE AT H,L TO 0
   426   17D3 7E        	MOV	A,M
   427   17D4 B7        	ORA	A	;ZERO?
   428   17D5 C8        	RZ
   429                  ;	MORE TO PRINT
   430   17D6 E5        	PUSH	H
   431   17D7 4F        	MOV	C,A
   432   17D8 CD6A17    	CALL	CONOUT
   433   17DB E1        	POP	H
   434   17DC 23        	INX	H
   435   17DD C3D317    	JMP	PRMSG
   436                  ;
   437                  SETFUNC:
   438                  ;	SET FUNCTION FOR NEXT I/O (COMMAND IN REG-C)
   439   17E0 216818    	LXI	H,IOF	;IO FUNCTION ADDRESS
   440   17E3 7E        	MOV	A,M	;GET IT TO ACCUMULATOR FOR MASKING
   441   17E4 E6F8      	ANI	11111000B	;REMOVE PREVIOUS COMMAND
   442   17E6 B1        	ORA	C	;SET TO NEW COMMAND
   443   17E7 77        	MOV	M,A	;REPLACED IN IOPB
   444                  ;	THE MDS-800 CONTROLLER REQUIRES DISK BANK BIT IN SECTOR BYTE
   445                  ;	MASK THE BIT FROM THE CURRENT I/O FUNCTION
   446   17E8 E620      	ANI	00100000B	;MASK THE DISK SELECT BIT
   447   17EA 216B18    	LXI	H,IOS		;ADDRESS THE SECTOR SELECT BYTE
   448   17ED B6        	ORA	M		;SELECT PROPER DISK BANK
   449   17EE 77        	MOV	M,A		;SET DISK SELECT BIT ON/OFF
   450   17EF C9        	RET
   451                  ;
   452                  WAITIO:
   453   17F0 0E0A      	MVI	C,RETRY	;MAX RETRIES BEFORE PERM ERROR
   454                  REWAIT:
   455                  ;	START THE I/O FUNCTION AND WAIT FOR COMPLETION
   456   17F2 CD3F18    	CALL	INTYPE	;IN RTYPE
   457   17F5 CD4C18    	CALL	INBYTE	;CLEARS THE CONTROLLER
   458                  ;
   459   17F8 3A6618    	LDA	DBANK		;SET BANK FLAGS
   460   17FB B7        	ORA	A		;ZERO IF DRIVE 0,1 AND NZ IF 2,3
   461   17FC 3E67      	MVI	A,IOPB AND 0FFH	;LOW ADDRESS FOR IOPB
   462   17FE 0618      	MVI	B,IOPB SHR 8	;HIGH ADDRESS FOR IOPB
   463   1800 C20B18    	JNZ	IODR1	;DRIVE BANK 1?
   464   1803 D379      	OUT	ILOW		;LOW ADDRESS TO CONTROLLER
   465   1805 78        	MOV	A,B
   466   1806 D37A      	OUT	IHIGH	;HIGH ADDRESS
   467   1808 C31018    	JMP	WAIT0		;TO WAIT FOR COMPLETE
   468                  ;
   469                  IODR1:	;DRIVE BANK 1
   470   180B D389      	OUT	ILOW+10H	;88 FOR DRIVE BANK 10
   471   180D 78        	MOV	A,B
   472   180E D38A      	OUT	IHIGH+10H
   473                  ;
   474   1810 CD5918    WAIT0:	CALL	INSTAT		;WAIT FOR COMPLETION
   475   1813 E604      	ANI	IORDY		;READY?
   476   1815 CA1018    	JZ	WAIT0
   477                  ;
   478                  ;	CHECK IO COMPLETION OK
   479   1818 CD3F18    	CALL	INTYPE		;MUST BE IO COMPLETE (00) UNLINKED
   480                  ;	00 UNLINKED I/O COMPLETE,    01 LINKED I/O COMPLETE (NOT USED)
   481                  ;	10 DISK STATUS CHANGED       11 (NOT USED)
   482   181B FE02      	CPI	10B		;READY STATUS CHANGE?
   483   181D CA3218    	JZ	WREADY
   484                  ;
   485                  ;	MUST BE 00 IN THE ACCUMULATOR
   486   1820 B7        	ORA	A
   487   1821 C23818    	JNZ	WERROR		;SOME OTHER CONDITION, RETRY
   488                  ;
   489                  ;	CHECK I/O ERROR BITS
   490   1824 CD4C18    	CALL	INBYTE
   491   1827 17        	RAL
   492   1828 DA3218    	JC	WREADY		;UNIT NOT READY
   493   182B 1F        	RAR
   494   182C E6FE      	ANI	11111110B	;ANY OTHER ERRORS?  (DELETED DATA OK)
   495   182E C23818    	JNZ	WERROR
   496                  ;
   497                  ;	READ OR WRITE IS OK, ACCUMULATOR CONTAINS ZERO
   498   1831 C9        	RET
   499                  ;
   500                  WREADY:	;NOT READY, TREAT AS ERROR FOR NOW
   501   1832 CD4C18    	CALL	INBYTE		;CLEAR RESULT BYTE
   502   1835 C33818    	JMP	TRYCOUNT
   503                  ;
   504                  WERROR:	;RETURN HARDWARE MALFUNCTION (CRC, TRACK, SEEK, ETC.)
   505                  ;	THE MDS CONTROLLER HAS RETURNED A BIT IN EACH POSITION
   506                  ;	OF THE ACCUMULATOR, CORRESPONDING TO THE CONDITIONS:
   507                  ;	0	- DELETED DATA (ACCEPTED AS OK ABOVE)
   508                  ;	1	- CRC ERROR
   509                  ;	2	- SEEK ERROR
   510                  ;	3	- ADDRESS ERROR (HARDWARE MALFUNCTION)
   511                  ;	4	- DATA OVER/UNDER FLOW (HARDWARE MALFUNCTION)
   512                  ;	5	- WRITE PROTECT (TREATED AS NOT READY)
   513                  ;	6	- WRITE ERROR (HARDWARE MALFUNCTION)
   514                  ;	7	- NOT READY
   515                  ;	(ACCUMULATOR BITS ARE NUMBERED 7 6 5 4 3 2 1 0)
   516                  ;
   517                  ;	IT MAY BE USEFUL TO FILTER OUT THE VARIOUS CONDITIONS,
   518                  ;	BUT WE WILL GET A PERMANENT ERROR MESSAGE IF IT IS NOT
   519                  ;	RECOVERABLE.  IN ANY CASE, THE NOT READY CONDITION IS
   520                  ;	TREATED AS A SEPARATE CONDITION FOR LATER IMPROVEMENT
   521                  TRYCOUNT:
   522                  ;	REGISTER C CONTAINS RETRY COUNT, DECREMENT 'TIL ZERO
   523   1838 0D        	DCR	C
   524   1839 C2F217    	JNZ	REWAIT	;FOR ANOTHER TRY
   525                  ;
   526                  ;	CANNOT RECOVER FROM ERROR
   527   183C 3E01      	MVI	A,1	;ERROR CODE
   528   183E C9        	RET
   529                  ;
   530                  ;	INTYPE, INBYTE, INSTAT READ DRIVE BANK 00 OR 10
   531   183F 3A6618    INTYPE:	LDA	DBANK
   532   1842 B7        	ORA	A
   533   1843 C24918    	JNZ	INTYP1	;SKIP TO BANK 10
   534   1846 DB79      	IN	RTYPE
   535   1848 C9        	RET
   536   1849 DB89      INTYP1:	IN	RTYPE+10H	;78 FOR 0,1  88 FOR 2,3
   537   184B C9        	RET
   538                  ;
   539   184C 3A6618    INBYTE:	LDA	DBANK
   540   184F B7        	ORA	A
   541   1850 C25618    	JNZ	INBYT1
   542   1853 DB7B      	IN	RBYTE
   543   1855 C9        	RET
   544   1856 DB8B      INBYT1:	IN	RBYTE+10H
   545   1858 C9        	RET
   546                  ;
   547   1859 3A6618    INSTAT:	LDA	DBANK
   548   185C B7        	ORA	A
   549   185D C26318    	JNZ	INSTA1
   550   1860 DB78      	IN	DSTAT
   551   1862 C9        	RET
   552   1863 DB88      INSTA1:	IN	DSTAT+10H
   553   1865 C9        	RET
   554                  ;
   555                  ;
   556                  ;
   557                  ;	DATA AREAS (MUST BE IN RAM)
   558   1866 00        DBANK:	DB	0	;DISK BANK 00 IF DRIVE 0,1
   559                  			;	   10 IF DRIVE 2,3
   560                  IOPB:	;IO PARAMETER BLOCK
   561   1867 80        	DB	80H	;NORMAL I/O OPERATION
   562   1868 04        IOF:	DB	READF	;IO FUNCTION, INITIAL READ
   563   1869 01        ION:	DB	1	;NUMBER OF SECTORS TO READ
   564   186A 02        IOT:	DB	OFFSET	;TRACK NUMBER
   565   186B 01        IOS:	DB	1	;SECTOR NUMBER
   566   186C 8000      IOD:	DW	BUFF	;IO ADDRESS
   567                  ;
   568                  ;
   569                  ;	DEFINE RAM AREAS FOR BDOS OPERATION
   570                  	ENDEF
   571   186E+=         BEGDAT	EQU	$
   572   186E+          DIRBUF:	DS	128	;DIRECTORY ACCESS BUFFER
   573   18EE+          ALV0:	DS	31
   574   190D+          CSV0:	DS	16
   575   191D+          ALV1:	DS	31
   576   193C+          CSV1:	DS	16
   577   194C+          ALV2:	DS	31
   578   196B+          CSV2:	DS	16
   579   197B+          ALV3:	DS	31
   580   199A+          CSV3:	DS	16
   581   19AA+=         ENDDAT	EQU	$
   582   013C+=         DATSIZ	EQU	$-BEGDAT
   583   19AA           	END
ALS1             001F   141#
ALS2             001F   146#
ALS3             001F   151#
ALV0             18EE    87   573#
ALV1             191D    91   575#
ALV2             194C    95   577#
ALV3             197B    99   579#
BASE             0078   180#  181   182   183   185   186 
BDOS             0806    29#  287 
BEGDAT           186E   571#  582 
BIAS             0000    19#   22#
BOOT             16B3    63   207#
BOOTER0          1752   305   310#
BOOTERR          1749   241   302#
BOOTMSG          175B   312   316#
BUFF             0080    34#  209   221   278   566 
CDISK            0004    33#  213   296 
CI               F803   172#  325 
CO               F809   174#  330 
CONIN            1764    66   324#
CONOUT           176A    67   329#  432 
CONST            1761    65   320#
CPMB             0000    28#   29    30   226   299 
CPML             1600    30#   31 
CR               000D   192#  196   205 
CSS1             0010   142#
CSS2             0010   147#
CSS3             0010   152#
CSTS             F812   177#  322 
CSV0             190D    87   574#
CSV1             193C    91   576#
CSV2             196B    95   578#
CSV3             199A    99   580#
DATSIZ           013C   582#
DBANK            1866   361   459   531   539   547   558#
DIRBUF           186E    86    90    94    98   572#
DPB0             1673    86   101#  140   145   150 
DPB1             1673    90   140#
DPB2             1673    94   145#
DPB3             1673    98   150#
DPBASE           1633    83#  380 
DPE0             1633    84#
DPE1             1643    88#
DPE2             1653    92#
DPE3             1663    96#
DSTAT            0078   181#  550   552 
ENDDAT           19AA   581#
FALSE            0000    15#   16 
GOCPM            170F   214   265#
HOME             1778    71   349#
ICON             00F3   166#  275 
IHIGH            007A   186#  466   472 
ILOW             0079   185#  464   470 
INBYT1           1856   541   544#
INBYTE           184C   457   490   501   539#
INSTA1           1863   549   552#
INSTAT           1859   474   547#
INTC             00FC   165#  271   273 
INTE             007E   167#  272 
INTYP1           1849   533   536#
INTYPE           183F   456   479   531#
IOD              186C   242   407   566#
IODR1            180B   463   469#
IOF              1868   369   439   562#
ION              1869   563#
IOPB             1867   461   462   560#
IORDY            0004   191#  475 
IOS              186B   248   391   400   447   565#
IOT              186A   252   386   564#
LF               000A   193#  196   196   205 
LIST             176D    68   332#
LISTST           1770    78   336#
LO               F80F   176#  334 
MON80            F800   170#  291 
NSECTS           002C    31#  237 
OFFSET           0002    32#  100   564 
PATCH            1600    25#   27    28 
PO               F80C   175#  343 
PRMSG            17D3   211   313   425#  435 
PUNCH            1772    69   341#
RBYTE            007B   183#  542   544 
RD1              1705   250   257#
RDSEC            16E1   238#  262 
READ             17C1    76   240   410#
READER           1775    70   345#
READF            0004   188#  411   562 
RECAL            0003   190#
RETRY            000A    35#  223   453 
REVRT            00FD   164#  269 
REWAIT           17F2   454#  524 
RI               F806   173#  347 
RMON80           FF0F   171#  314 
RTYPE            0079   182#  534   536 
SECTRAN          17B1    79   394#
SELDSK           177D    72   229   354#
SETDMA           17BB    75   227   247   279   404#
SETDRIVE         1792   365   367#
SETFUNC          17E0   412   419   437#
SETSEC           17AC    74   233   259   390#
SETTRK           17A7    73   231   255   352   385#
SIGNON           169C   195#  210 
TEST             0000    16#   18    21   197   200   289 
TRUE             FFFF    14#   15 
TRYCOUNT         1838   502   521#
VERS             0016     6#  204   204 
WAIT0            1810   467   474#  476 
WAITIO           17F0   413   420   452#
WBOOT            16C3    64   217#
WBOOT0           16C9   225#  308 
WBOOTE           1603    64#  284 
WERROR           1838   487   495   504#
WREADY           1832   483   492   500#
WRITE            17CA    77   417#
WRITF            0006   189#  418 
XLT0             1682    84   112#  143   148   153 
XLT1             1682    88   143#
XLT2             1682    92   148#
XLT3             1682    96   153#


Back to title page       Next

← CP/M Alteration↑ CP/M Manualaxa.asm →