home *** CD-ROM | disk | FTP | other *** search
- (0000) 0521+ LP: DL AA0011
- *** undefined symbol on pass one ***
-
- (0000) 0565+ LP: DL AA0015
- *** undefined symbol on pass one ***
-
- (0000) 0608+ LP: DL AA0019
- *** undefined symbol on pass one ***
-
- (0000) 0651+ LP: DL AA0023
- *** undefined symbol on pass one ***
-
- Pass One Errors 4
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0001
- *** MDS ***
-
- 0001 ; INTEL MDS FDC CARD EMULATOR
- 0002 ;
- 0003 ; SOURCED NOV 79 BY TREVOR MARSHALL
- 0004 ; Dept E & E Eng
- 0005 ; University of West Australia
- 0006 ; NEDLANDS, W.A. 6009
- 0007 ;
- 0008 ; This version of the source produces, after linking,
- 0009 ; object code in memory from 600H to A000H to enable
- 0010 ; a Prom Programmer resident in the host system
- 0011 ; to directly program the object file
- 0012 ;
- 0013 ; A version ORGed at F800H is compiled seperately
- 0014 ; and is provided on the master disk as MDSABS.Z80
- 0015 ;
- 0016 ;
- 0017 ; REGISTER USAGE DURING READ AND WRITE:
- 0018 ; D contains the (auto wait) drive control byte
- 0019 ; IX points to the IOPB base
- 0020 ; HL points to the current memory DMA address
- 0021 ; B contains the input byte counter for INI & OUTI
- 0022 ; C contains DDATA for INI & OUTI
- 0023 ; B' (alternate) contains the number of records required
- 0024 ; D' (alternate) contains the current sector address
- 0025 ; E' (alternate) contains the retry count
- 0026 ; H' (alternate) contains the previously logged track
- 0027 ; AF' (alternate) contains the previous drive mask
- 0028 ; to skip read trk# if it is already logged
- 0029 ; and allow for fast response without interleaving
- 0030 ;
- 0031 ; FDC CONTROLLER DEFINITIONS:
- (0063) 0032 DCONTROL:EQU 63H ;Control Port
- (0063) 0033 DFLAGS: EQU 63H ;FDC Status Port
- (0067) 0034 DDATA: EQU 67H ;1793 Data Port
- (0064) 0035 DSTATUS: EQU 64H ;1793 Status Port
- (0064) 0036 DCOMMAND:EQU 64H ;1793 Command Port
- (0065) 0037 DTRACK: EQU 65H ;1793 Track Port
- (0066) 0038 DSECTOR: EQU 66H ;1793 Sector Port
- (0004) 0039 DSIDE: EQU 4 ;Bit 1=0 selects side 1
- 0040 ; of D/S drives
- 0041 ;
- 0042 ; DISK CONTROL PORT HARDWARE ENVIRONMENT
- 0043 ; Bits 0-3 select drives 1-4
- 0044 ; Bit 7 enables auto wait on accesses to DDATA
- 0045 ; Bit 5 enables dsk drive motors
- 0046 ; Bit 4 selects single density (S/D)
- 0047 ;
- 0048 ; DISK STATUS PORT HARDWARE REQUIREMENTS
- 0049 ; Bit 0 is 1793 INTREQ status output
- 0050 ; Bit 5 indicates head is loaded
- 0051 ;
- 0052 ; DISK DENSITY DEFINITIONS
- (001A) 0053 MAXSECTORS: EQU 1AH ;Single Density
- (004C) 0054 MAXTRACKS: EQU 4CH ; 8" Disks
- 0055 ;
- 0056 ; PIO DEFINITIONS:
- (007A) 0057 ACOMMAND:EQU 7AH
- (0078) 0058 ADATA: EQU 78H
- (007B) 0059 BCOMMAND:EQU 7BH
- (0079) 0060 BDATA: EQU 79H
- 0061 ;
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0002
- *** MDS ***
-
- 0062 ; BUS CONTROL:
- (007F) 0063 RELEASE: EQU 7FH ;I/O To this addr releases bus
- (007C) 0064 HOLD: EQU 7CH ;I/O to this addr requests bus
- 0065 ;
- 0066 ; MDS PORT DEFINITIONS:
- (007E) 0067 STATUS: EQU 7EH ;S100 Bus reads 78H
- 0068 ;Note that port 78H is referenced directly in ASERVICE
- 0069 ;TYPE: Not Implemented
- (007D) 0070 RESULT: EQU 7DH ;S100 Bus reads 7BH
- 0071 ;RESET: Not Implemented
- (0079) 0072 IOPBLOW: EQU 79H
- (007A) 0073 IOPBHIGH:EQU 7AH
- 0074 ;
- 0075 ; DISKETTE INSTRUCTION CODES:
- (0000) 0076 NOP: EQU 0
- (0001) 0077 SEEK: EQU 1
- (0002) 0078 FORMAT: EQU 2
- (0003) 0079 RECALIB: EQU 3
- (0004) 0080 READ: EQU 4
- (0005) 0081 VERIFY: EQU 5
- (0006) 0082 WRITE: EQU 6
- (0007) 0083 WRITEDEL:EQU 7 ;Write deleted data mark;
- 0084 ;
- 0085 ; AS THERE IS NO STACK RAM AVAILABLE ALL CODE
- 0086 ; MUST BE SEQUENTIAL
- 0087 ;
- 0088 ; THE PROM PROGRAMMER REQUIRES AN ADDRESS OFFSET
- 0089 ; OF 0F200H FOR THIS ORG 0F800H CODE
- 0090 ;
- 0091 ; THE FOLLOWING MACROS FORM COMMONLY USED ROUTINES
- 0092 ;
- 0093 STOP: MACRO
- 0094 LD SP,STACK; Point at ROM stack
- 0095 IN A,RELEASE
- 0096 RETI
- 0097 MEND
- 0098 DONE: MACRO ;Set up status port & stop
- 0099 LD A,0FH
- 0100 OUT STATUS,A
- 0101 STOP
- 0102 MEND
- 0103 ;
- 0104 INTREQ: MACRO ;Wait for intreq
- 0105 LL#SYM: IN A,DFLAGS ;Loop until 1793 INTREQ active
- 0106 RRA
- 0107 JR NC,LL#SYM
- 0108 MEND
- 0109 ;
- 0110 ERRORS: MACRO #LOOP,#MASK ;Check 1793 for errors
- 0111 INTREQ
- 0112 IN A,DSTATUS
- 0113 EXX ;Save working registers
- 0114 LD C,A ;Save error byte
- 0115 AND 80H ;Not ready mask
- 0116 EXX
- 0117 JR NZ,#LOOP ;Loop until drive ready
- 0118 EXX
- 0119 LD A,C
- 0120 AND #MASK ;General error mask
- 0121 JP NZ,SELECT+OFFSET ;Retry if any errors
- 0122 EXX
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0003
- *** MDS ***
-
- 0123 MEND
- 0124 ;
- 0125 SETUP: MACRO ;Set up read and write common parameters
- 0126 LP: DL AA#SYM
- 0127 AA#SYM: INC D ;Sector #
- 0128 LD A,D
- 0129 OUT DSECTOR,A
- 0130 EXX
- 0131 LD A,D
- 0132 OUT DCONTROL,A
- 0133 LD B,80H ;Input byte count
- 0134 IN A,DFLAGS ;Is head loaded?
- 0135 AND 20H
- 0136 JR Z,J2#SYM ;No
- 0137 LD A,0
- 0138 JR J3#SYM
- 0139 J2#SYM: LD A,04H ;Head load mask for 1793
- 0140 J3#SYM DL $
- 0141 MEND
- 0142 ;
- 0143 CHECK: MACRO ;See if read or write is complete
- 0144 EXX
- 0145 DJNZ LP
- 0146 EXX
- 0147 LD B,0 ;Done
- 0148 JP FINISH+OFFSET
- 0149 MEND
- 0150 ;
- 0151 ; NOTE THAT THE 1793 NEEDS TIME TO CALCULATE CRC
- 0152 ; BEFORE THE ERROR STATUS IS AVAILABLE
- 0153 ; IF THE DRQ IS NOT SERVICED
- 0154 ; The following delay loop is sufficient (4MHz Z-80)
- 0155 DELAY: MACRO
- 0156 LD B,30H ;12 to 15 give CRC errors
- 0157 ; 0 to 12 give BUSY flag
- 0158 DJNZ $
- 0159 MEND
- 0160 ;
- 0161 ; Check for 1793 errors during read and write
- 0162 DERROR: MACRO #MASK
- 0163 INTREQ
- 0164 IN A,DSTATUS
- 0165 EXX
- 0166 LD C,A ;Save error byte
- 0167 EXX
- 0168 ; Note that we will not check for deleted data marks
- 0169 AND #MASK
- 0170 JP NZ,S2+OFFSET ; Retry errors
- 0171 MEND
- 0172
- 0173 ; LINKER AND PROM PROGRAMMER CODE REQUIREMENTS
- (0100) 0174 ORG 100H
- 0100 C30000 0175 JP 0
- (F200) 0176 OFFSET: EQU 0F800H-600H
- 0177 ; Setup vectors at top of ROM
- (09F4) 0178 ORG 9F4H ;Effectively FBF4
- 09F4 37F8 0179 VEC1: DW ASERVICE+OFFSET
- 09F6 50F8 0180 VEC2: DW BSERVICE+OFFSET
- 09F8 FB 0181 WAIT: EI
- 09F9 76 0182 HALT ;wait for interrupt
- 0183 ; STACK: To enable interrupt structure we need a 'stack'
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0004
- *** MDS ***
-
- 09FA F8FB 0184 DW WAIT+OFFSET
- (FBFC) 0185 STACK: EQU $+OFFSET
- 09FC F8FB 0186 DW WAIT+OFFSET
- 09FE F8FB 0187 DW WAIT+OFFSET
- 0188 ;
- 0189 ; Hardware Reset Code
- (0600) 0190 ORG 600H
- 0600 C304F8 0191 START: JP 0F804H
- 0603 00 0192 NOP
- 0193 ; The ORG address is now effectively F804H
- 0194 ; Now setup PIO & Interupts
- 0195 ;
- 0604 ED5E 0196 IM2
- 0606 3EFB 0197 LD A,0FBH
- 0608 ED47 0198 LD I,A ;Int vector table near FBF2
- 060A 3EF4 0199 LD A,0F4H ;IVEC(A) = FBF4
- 060C D37A 0200 OUT ACOMMAND,A
- 060E 3EF6 0201 LD A,0F6H ;IVEC(B) = FBF6
- 0610 D37B 0202 OUT BCOMMAND,A
- 0612 3E4F 0203 LD A,4FH ;MODE 1
- 0614 D37A 0204 OUT ACOMMAND,A
- 0616 D37B 0205 OUT BCOMMAND,A
- 0618 DB78 0206 IN A,ADATA ;Set READY handshake
- 061A DB79 0207 IN A,BDATA
- 061C 3E87 0208 LD A,87H ;Enable PIO interrupt mode
- 061E D37A 0209 OUT ACOMMAND,A
- 0620 D37B 0210 OUT BCOMMAND,A
- 0211 ; Now setup output latches
- 0622 3E00 0212 LD A,00
- 0624 D37D 0213 OUT RESULT,A
- 0626 3E0B 0214 LD A,0BH ;:F0:,:F1: ready, not D/D
- 0628 D37E 0215 OUT STATUS,A
- 062A 08 0216 EX AF,AF'
- 062B 3E00 0217 LD A,0 ;Clear drive select mask
- 062D 08 0218 EX AF,AF'
- 062E D9 0219 EXX
- 062F 26FF 0220 LD H,0FFH ;Clear logged trk
- 0631 D9 0221 EXX
- 0632 31FCFB 0222 LD SP,STACK
- 0635 FB 0223 EI
- 0636 76 0224 HALT
- 0225 ; Routine to service PIO inputs
- 0226 ; (79) go to IX lower, (7A) to IX upper
- 0227 ;
- 0637 F3 0228 ASERVICE: DI
- 0638 D37C 0229 OUT HOLD,A ; Lock out bus until done
- 063A 00 0230 NOP ;Allow time for bus control
- 063B 00 0231 NOP
- 063C DB78 0232 IN A,78H ; S100 Status port read (& reset)
- 0233 ; ; must be done during bus access
- 063E DB78 0234 IN A,ADATA
- 0640 DD210000 0235 LD IX,0
- 0644 4F 0236 LD C,A
- 0645 0600 0237 LD B,0
- 0647 DD09 0238 ADD IX,BC ;Now have A in IX
- 0649 0239 STOP
- 0649 31FCFB 0240+ LD SP,STACK; Point at ROM stack
- 064C DB7F 0241+ IN A,RELEASE
- 064E ED4D 0242+ RETI
- 0650 F3 0243 BSERVICE: DI
- 0651 D37C 0244 OUT HOLD,A ; Lock out bus until done
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0005
- *** MDS ***
-
- 0653 DB79 0245 IN A,BDATA
- 0655 47 0246 LD B,A
- 0656 0E00 0247 LD C,0
- 0658 DD09 0248 ADD IX,BC ; IX now points to IOPB
- 0249 ; Now select side 0 of disks
- 065A 3E02 0250 LD A,2 ;Set bit 1
- 065C D304 0251 OUT DSIDE,A
- 0252 ;
- 065E D9 0253 EXX
- 065F 1E0A 0254 LD E,0AH ;10 retries
- 0661 1803 0255 JR SELECT
- 0256 ;
- 0257 ; NOW BEGIN DECODING COMMAND WORD
- 0258 ;
- 0259 ; FIRST SELECT THE DRIVE (:F0:=A:, :F1:=C:)
- 0260 ;
- 0663 D9 0261 S2: EXX
- 0664 26FF 0262 LD H,0FFH ;Log off track if error occurs
- 0263 ; ;This will cause a RESTORE cmd
- 0264 ; ;To be executed for SEEK errors
- 0666 7B 0265 SELECT: LD A,E
- 0667 FE00 0266 CP 0 ;Have we retried 10 times?
- 0669 79 0267 LD A,C ;Error byte
- 0268
- 066A CAC8FA 0269 JP Z,EXIT+OFFSET
- 066D 1D 0270 DEC E
- 066E D9 0271 EXX
- 066F DD7E00 0272 LD A,(IX+0)
- 0672 E63F 0273 AND 3FH ;Check for acceptable channel word
- 0674 C27EFB 0274 JP NZ,CHERROR+OFFSET ; Channel error
- 0275 ;
- 0276 ;If the op is NOP,FORMAT or RECALIBRATE
- 0277 ;Dont check address field
- 0677 DD7E01 0278 LD A,(IX+1)
- 067A E607 0279 AND 07H ;Now have opcode field
- 067C FE01 0280 CP 1 ;Seek
- 067E 2804 0281 JR Z,DONTSKIP
- 0680 D604 0282 SUB 4
- 0682 3823 0283 JR C,SKIP ; <=3
- 0284 DONTSKIP:
- 0285
- 0286 ; Now check for valid IOPB addresses
- 0684 DD7E03 0287 N12: LD A,(IX+3) ;Track address
- 0687 D64D 0288 SUB MAXTRACKS+1 ;max track # + 1
- 0689 D269FB 0289 JP NC,ADDERROR+OFFSET
- 068C DD7E04 0290 LD A,(IX+4)
- 0291 ;
- 0292 ; Must reset bits 4 & 5 of sector byte (a drive select b
- it)
- 0293 ; to retain compatibility with S/D MDS systems
- 068F E69F 0294 AND A,09FH
- 0691 CA69FB 0295 JP Z,ADDERROR+OFFSET ;Zero sector #
- 0694 D61B 0296 SUB MAXSECTORS+1 ;Max sector # + 1
- 0696 D269FB 0297 JP NC,ADDERROR+OFFSET
- 0699 DD7E04 0298 LD A,(IX+4) ;Sector addr
- 0299 ;
- 0300 ; Must reset bit 5 of sector byte (a drive select bit)
- 0301 ; to retain compatibility with S/D MDS systems
- 069C E69F 0302 AND A,09FH
- 069E DD4E02 0303 LD C,(IX+2) ;Number of records requested
- 06A1 81 0304 ADD A,C
- CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:46:29 Page 0006
- *** MDS ***
-
- 06A2 D61C 0305 SUB A,MAXSECTORS+2
- 06A4 D269FB 0306 JP NC,ADDERROR+OFFSET ;Final sector >1AH
- 0307 ; Address errors trapped, now seek to required track
- 0308 ;
- 06A7 DD7E01 0309 SKIP: LD A,(IX+1) ;Instruction word
- 06AA E630 0310 AND 30H ;Get drive mask
- 06AC CB0F 0311 RRC A
- 06AE CB0F 0312 RRC A
- 06B0 CB0F 0313 RRC A
- 06B2 CB0F 0314 RRC A
- 06B4 FE03 0315 CP 3 ; S/D MDS drive #1 mask
- 06B6 2804 0316 JR Z,BSELECT ;Select drive B
- 0317 ; Dont allow for more than 2 drives
- 06B8 16B1 0318 LD D,0B1H ;Auto wait,motor on,S/D,A:
- 06BA 1802 0319 JR J3
- 06BC 16B2 0320 BSELECT: LD D,0B2H ;Auto wait,motor on,S/D,B:
- 0321 ; D contains the drive control byte with auto wait set
- 0322 ;
- 0323 ; Now check for recalibrate, nop & format instructions
- 0324 ;
- 06BE DD7E01 0325 J3: LD A,(IX+1)
- 06C1 E607 0326