home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol040 / mds.prn < prev    next >
Encoding:
Text File  |  1984-04-29  |  16.0 KB  |  358 lines

  1.       (0000)      0521+ LP:    DL    AA0011
  2. *** undefined symbol on pass one ***
  3.  
  4.       (0000)      0565+ LP:    DL    AA0015
  5. *** undefined symbol on pass one ***
  6.  
  7.       (0000)      0608+ LP:    DL    AA0019
  8. *** undefined symbol on pass one ***
  9.  
  10.       (0000)      0651+ LP:    DL    AA0023
  11. *** undefined symbol on pass one ***
  12.  
  13. Pass One Errors       4
  14. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0001
  15. *** MDS *** 
  16.  
  17.                   0001  ; INTEL MDS FDC CARD EMULATOR
  18.                   0002  ;
  19.                   0003  ; SOURCED NOV 79 BY TREVOR MARSHALL
  20.                   0004  ;            Dept E & E Eng
  21.                   0005  ;            University of West Australia
  22.                   0006  ;            NEDLANDS, W.A. 6009
  23.                   0007  ;
  24.                   0008  ; This version of the source produces, after linking,
  25.                   0009  ; object code in memory from 600H to A000H to enable
  26.                   0010  ; a Prom Programmer resident in the host system
  27.                   0011  ; to directly program the object file
  28.                   0012  ;
  29.                   0013  ; A version ORGed at F800H is compiled seperately
  30.                   0014  ; and is provided on the master disk as MDSABS.Z80
  31.                   0015  ;
  32.                   0016  ;
  33.                   0017  ; REGISTER USAGE DURING READ AND WRITE:
  34.                   0018  ; D contains the (auto wait) drive control byte
  35.                   0019  ; IX points to the IOPB base
  36.                   0020  ; HL points to the current memory DMA address
  37.                   0021  ; B contains the input byte counter for INI & OUTI
  38.                   0022  ; C contains DDATA for INI & OUTI
  39.                   0023  ; B' (alternate) contains the number of records required
  40.                   0024  ; D' (alternate) contains the current sector address
  41.                   0025  ; E' (alternate) contains the retry count
  42.                   0026  ; H' (alternate) contains the previously logged track
  43.                   0027  ; AF' (alternate) contains the previous drive mask
  44.                   0028  ; to skip read trk# if it is already logged
  45.                   0029  ; and allow for fast response without interleaving
  46.                   0030  ;
  47.                   0031  ; FDC CONTROLLER DEFINITIONS:
  48.       (0063)      0032  DCONTROL:EQU    63H    ;Control Port
  49.       (0063)      0033  DFLAGS:     EQU    63H    ;FDC Status Port
  50.       (0067)      0034  DDATA:   EQU    67H    ;1793 Data Port
  51.       (0064)      0035  DSTATUS: EQU    64H    ;1793 Status Port
  52.       (0064)      0036  DCOMMAND:EQU    64H    ;1793 Command Port
  53.       (0065)      0037  DTRACK:     EQU    65H    ;1793 Track Port
  54.       (0066)      0038  DSECTOR: EQU    66H    ;1793 Sector Port
  55.       (0004)      0039  DSIDE:    EQU    4    ;Bit 1=0 selects side 1
  56.                   0040              ; of D/S drives
  57.                   0041  ;
  58.                   0042  ; DISK CONTROL PORT HARDWARE ENVIRONMENT
  59.                   0043  ; Bits 0-3 select drives 1-4
  60.                   0044  ; Bit 7 enables auto wait on accesses to DDATA
  61.                   0045  ; Bit 5 enables dsk drive motors 
  62.                   0046  ; Bit 4 selects single density (S/D)
  63.                   0047  ;
  64.                   0048  ; DISK STATUS PORT HARDWARE REQUIREMENTS
  65.                   0049  ; Bit 0 is 1793 INTREQ status output
  66.                   0050  ; Bit 5 indicates head is loaded
  67.                   0051  ;
  68.                   0052  ; DISK DENSITY DEFINITIONS
  69.       (001A)      0053  MAXSECTORS: EQU 1AH  ;Single Density
  70.       (004C)      0054  MAXTRACKS:   EQU 4CH  ; 8" Disks
  71.                   0055  ;
  72.                   0056  ; PIO DEFINITIONS:
  73.       (007A)      0057  ACOMMAND:EQU    7AH
  74.       (0078)      0058  ADATA:   EQU    78H
  75.       (007B)      0059  BCOMMAND:EQU    7BH
  76.       (0079)      0060  BDATA:   EQU    79H
  77.                   0061  ;
  78. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0002
  79. *** MDS *** 
  80.  
  81.                   0062  ; BUS CONTROL:
  82.       (007F)      0063  RELEASE: EQU    7FH    ;I/O To this addr releases bus
  83.       (007C)      0064  HOLD:    EQU    7CH    ;I/O to this addr requests bus
  84.                   0065  ;
  85.                   0066  ; MDS PORT DEFINITIONS:
  86.       (007E)      0067  STATUS:  EQU    7EH    ;S100 Bus reads 78H
  87.                   0068  ;Note that port 78H is referenced directly in ASERVICE
  88.                   0069  ;TYPE:    Not Implemented
  89.       (007D)      0070  RESULT:  EQU    7DH    ;S100 Bus reads 7BH
  90.                   0071  ;RESET: Not Implemented
  91.       (0079)      0072  IOPBLOW: EQU    79H
  92.       (007A)      0073  IOPBHIGH:EQU    7AH
  93.                   0074  ;
  94.                   0075  ; DISKETTE INSTRUCTION CODES:
  95.       (0000)      0076  NOP:     EQU    0    
  96.       (0001)      0077  SEEK:     EQU    1
  97.       (0002)      0078  FORMAT:     EQU    2
  98.       (0003)      0079  RECALIB: EQU     3
  99.       (0004)      0080  READ:     EQU    4
  100.       (0005)      0081  VERIFY:     EQU    5
  101.       (0006)      0082  WRITE:     EQU    6
  102.       (0007)      0083  WRITEDEL:EQU    7    ;Write deleted data mark;
  103.                   0084  ;
  104.                   0085  ; AS THERE IS NO STACK RAM AVAILABLE ALL CODE
  105.                   0086  ; MUST BE SEQUENTIAL
  106.                   0087  ;
  107.                   0088  ; THE PROM PROGRAMMER REQUIRES AN ADDRESS OFFSET
  108.                   0089  ; OF 0F200H FOR THIS ORG 0F800H CODE
  109.                   0090  ;
  110.                   0091  ; THE FOLLOWING MACROS FORM COMMONLY USED ROUTINES
  111.                   0092  ;
  112.                   0093  STOP:    MACRO
  113.                   0094      LD    SP,STACK; Point at ROM stack
  114.                   0095      IN    A,RELEASE
  115.                   0096      RETI
  116.                   0097      MEND
  117.                   0098  DONE: MACRO   ;Set up status port & stop
  118.                   0099      LD    A,0FH
  119.                   0100      OUT    STATUS,A
  120.                   0101      STOP
  121.                   0102      MEND
  122.                   0103  ;
  123.                   0104  INTREQ:    MACRO    ;Wait for intreq
  124.                   0105  LL#SYM:    IN    A,DFLAGS ;Loop until 1793 INTREQ active
  125.                   0106      RRA
  126.                   0107      JR    NC,LL#SYM
  127.                   0108      MEND
  128.                   0109  ;
  129.                   0110  ERRORS: MACRO    #LOOP,#MASK ;Check 1793 for errors
  130.                   0111      INTREQ
  131.                   0112      IN    A,DSTATUS
  132.                   0113      EXX    ;Save working registers
  133.                   0114      LD    C,A    ;Save error byte
  134.                   0115      AND    80H    ;Not ready mask
  135.                   0116      EXX
  136.                   0117      JR    NZ,#LOOP    ;Loop until drive ready
  137.                   0118      EXX
  138.                   0119      LD    A,C
  139.                   0120      AND    #MASK    ;General error mask
  140.                   0121      JP    NZ,SELECT+OFFSET ;Retry if any errors
  141.                   0122      EXX
  142. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0003
  143. *** MDS *** 
  144.  
  145.                   0123      MEND
  146.                   0124  ;
  147.                   0125  SETUP:    MACRO    ;Set up read and write common parameters
  148.                   0126  LP:    DL    AA#SYM
  149.                   0127  AA#SYM:    INC    D    ;Sector #
  150.                   0128      LD    A,D
  151.                   0129      OUT    DSECTOR,A
  152.                   0130      EXX
  153.                   0131      LD    A,D
  154.                   0132      OUT    DCONTROL,A
  155.                   0133      LD    B,80H    ;Input byte count
  156.                   0134      IN    A,DFLAGS ;Is head loaded?
  157.                   0135      AND    20H
  158.                   0136      JR    Z,J2#SYM ;No
  159.                   0137      LD    A,0
  160.                   0138      JR    J3#SYM
  161.                   0139  J2#SYM: LD    A,04H    ;Head load mask for 1793
  162.                   0140  J3#SYM    DL    $
  163.                   0141      MEND
  164.                   0142  ;
  165.                   0143  CHECK:    MACRO    ;See if read or write is complete
  166.                   0144      EXX
  167.                   0145      DJNZ    LP
  168.                   0146      EXX
  169.                   0147      LD    B,0    ;Done
  170.                   0148      JP    FINISH+OFFSET
  171.                   0149      MEND
  172.                   0150  ;
  173.                   0151  ; NOTE THAT THE 1793 NEEDS TIME TO CALCULATE CRC
  174.                   0152  ; BEFORE THE ERROR STATUS IS AVAILABLE
  175.                   0153  ; IF THE DRQ IS NOT SERVICED
  176.                   0154  ; The following delay loop is sufficient (4MHz Z-80)
  177.                   0155  DELAY:    MACRO
  178.                   0156      LD    B,30H    ;12 to 15 give CRC errors
  179.                   0157  ; 0 to 12 give BUSY flag
  180.                   0158      DJNZ    $
  181.                   0159      MEND
  182.                   0160  ;
  183.                   0161  ; Check for 1793 errors during read and write
  184.                   0162  DERROR: MACRO    #MASK
  185.                   0163      INTREQ
  186.                   0164      IN    A,DSTATUS
  187.                   0165      EXX
  188.                   0166      LD    C,A    ;Save error byte
  189.                   0167      EXX
  190.                   0168  ; Note that we will not check for deleted data marks
  191.                   0169      AND    #MASK
  192.                   0170      JP    NZ,S2+OFFSET ; Retry errors
  193.                   0171      MEND
  194.                   0172  
  195.                   0173  ; LINKER AND PROM PROGRAMMER CODE REQUIREMENTS
  196.       (0100)      0174      ORG    100H
  197. 0100  C30000      0175      JP    0
  198.       (F200)      0176  OFFSET: EQU    0F800H-600H
  199.                   0177  ; Setup vectors at top of ROM
  200.       (09F4)      0178      ORG    9F4H    ;Effectively FBF4
  201. 09F4  37F8        0179  VEC1:    DW    ASERVICE+OFFSET
  202. 09F6  50F8        0180  VEC2:    DW    BSERVICE+OFFSET
  203. 09F8  FB          0181  WAIT:    EI
  204. 09F9  76          0182      HALT    ;wait for interrupt
  205.                   0183  ; STACK: To enable interrupt structure we need a 'stack'
  206. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0004
  207. *** MDS *** 
  208.  
  209. 09FA  F8FB        0184      DW    WAIT+OFFSET
  210.       (FBFC)      0185  STACK:    EQU    $+OFFSET
  211. 09FC  F8FB        0186      DW    WAIT+OFFSET 
  212. 09FE  F8FB        0187      DW    WAIT+OFFSET
  213.                   0188  ;
  214.                   0189  ; Hardware Reset Code
  215.       (0600)      0190      ORG    600H
  216. 0600  C304F8      0191  START:    JP    0F804H
  217. 0603  00          0192      NOP
  218.                   0193  ; The ORG address is now effectively F804H
  219.                   0194  ; Now setup PIO & Interupts
  220.                   0195  ;
  221. 0604  ED5E        0196      IM2
  222. 0606  3EFB        0197      LD    A,0FBH
  223. 0608  ED47        0198      LD    I,A    ;Int vector table near FBF2
  224. 060A  3EF4        0199      LD    A,0F4H    ;IVEC(A) = FBF4
  225. 060C  D37A        0200      OUT    ACOMMAND,A
  226. 060E  3EF6        0201      LD    A,0F6H    ;IVEC(B) = FBF6
  227. 0610  D37B        0202      OUT    BCOMMAND,A
  228. 0612  3E4F        0203      LD    A,4FH    ;MODE 1
  229. 0614  D37A        0204      OUT    ACOMMAND,A
  230. 0616  D37B        0205      OUT    BCOMMAND,A
  231. 0618  DB78        0206      IN    A,ADATA    ;Set READY handshake
  232. 061A  DB79        0207      IN    A,BDATA
  233. 061C  3E87        0208      LD    A,87H    ;Enable PIO interrupt mode
  234. 061E  D37A        0209      OUT    ACOMMAND,A
  235. 0620  D37B        0210      OUT    BCOMMAND,A
  236.                   0211  ; Now setup output latches
  237. 0622  3E00        0212      LD    A,00
  238. 0624  D37D        0213      OUT    RESULT,A
  239. 0626  3E0B        0214      LD    A,0BH    ;:F0:,:F1: ready, not D/D
  240. 0628  D37E        0215      OUT    STATUS,A
  241. 062A  08          0216      EX    AF,AF'
  242. 062B  3E00        0217      LD    A,0    ;Clear drive select mask
  243. 062D  08          0218      EX    AF,AF'
  244. 062E  D9          0219      EXX
  245. 062F  26FF        0220      LD    H,0FFH    ;Clear logged trk
  246. 0631  D9          0221      EXX
  247. 0632  31FCFB      0222      LD    SP,STACK
  248. 0635  FB          0223      EI
  249. 0636  76          0224      HALT
  250.                   0225  ; Routine to service PIO inputs
  251.                   0226  ; (79) go to IX lower, (7A) to IX upper
  252.                   0227  ;
  253. 0637  F3          0228  ASERVICE: DI
  254. 0638  D37C        0229      OUT    HOLD,A    ; Lock out bus until done
  255. 063A  00          0230      NOP    ;Allow time for bus control
  256. 063B  00          0231      NOP
  257. 063C  DB78        0232      IN    A,78H ; S100 Status port read (& reset)
  258.                   0233  ;              ; must be done during bus access
  259. 063E  DB78        0234      IN    A,ADATA
  260. 0640  DD210000    0235      LD    IX,0
  261. 0644  4F          0236      LD    C,A
  262. 0645  0600        0237      LD    B,0
  263. 0647  DD09        0238      ADD    IX,BC    ;Now have A in IX
  264. 0649              0239      STOP
  265. 0649  31FCFB      0240+     LD    SP,STACK; Point at ROM stack
  266. 064C  DB7F        0241+     IN    A,RELEASE
  267. 064E  ED4D        0242+     RETI
  268. 0650  F3          0243  BSERVICE: DI
  269. 0651  D37C        0244       OUT    HOLD,A    ; Lock out bus until done
  270. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0005
  271. *** MDS *** 
  272.  
  273. 0653  DB79        0245      IN    A,BDATA
  274. 0655  47          0246      LD    B,A
  275. 0656  0E00        0247      LD    C,0
  276. 0658  DD09        0248      ADD    IX,BC    ; IX now points to IOPB
  277.                   0249  ; Now select side 0 of disks
  278. 065A  3E02        0250      LD    A,2    ;Set bit 1
  279. 065C  D304        0251      OUT    DSIDE,A
  280.                   0252  ;
  281. 065E  D9          0253      EXX
  282. 065F  1E0A        0254      LD    E,0AH    ;10 retries
  283. 0661  1803        0255      JR    SELECT
  284.                   0256  ;
  285.                   0257  ; NOW BEGIN DECODING COMMAND WORD
  286.                   0258  ; 
  287.                   0259  ; FIRST SELECT THE DRIVE (:F0:=A:, :F1:=C:)
  288.                   0260  ;
  289. 0663  D9          0261  S2:    EXX
  290. 0664  26FF        0262      LD    H,0FFH    ;Log off track if error occurs
  291.                   0263  ;            ;This will cause a RESTORE cmd
  292.                   0264  ;            ;To be executed for SEEK errors
  293. 0666  7B          0265  SELECT:    LD    A,E
  294. 0667  FE00        0266      CP    0    ;Have we retried 10 times?
  295. 0669  79          0267      LD    A,C    ;Error byte
  296.                   0268  
  297. 066A  CAC8FA      0269      JP    Z,EXIT+OFFSET
  298. 066D  1D          0270      DEC    E
  299. 066E  D9          0271      EXX
  300. 066F  DD7E00      0272      LD    A,(IX+0)
  301. 0672  E63F        0273      AND    3FH ;Check for acceptable channel word
  302. 0674  C27EFB      0274      JP    NZ,CHERROR+OFFSET ; Channel error
  303.                   0275  ;
  304.                   0276  ;If the op is NOP,FORMAT or RECALIBRATE 
  305.                   0277  ;Dont check address field
  306. 0677  DD7E01      0278      LD    A,(IX+1)
  307. 067A  E607        0279      AND    07H    ;Now have opcode field
  308. 067C  FE01        0280      CP    1    ;Seek
  309. 067E  2804        0281      JR    Z,DONTSKIP
  310. 0680  D604        0282      SUB    4
  311. 0682  3823        0283      JR    C,SKIP    ; <=3
  312.                   0284  DONTSKIP:
  313.                   0285  
  314.                   0286  ; Now check for valid IOPB addresses
  315. 0684  DD7E03      0287  N12:    LD    A,(IX+3) ;Track address
  316. 0687  D64D        0288      SUB    MAXTRACKS+1  ;max track # + 1
  317. 0689  D269FB      0289      JP    NC,ADDERROR+OFFSET
  318. 068C  DD7E04      0290      LD    A,(IX+4)
  319.                   0291  ;
  320.                   0292  ; Must reset bits 4 & 5 of sector byte (a drive select b
  321.             it)
  322.                   0293  ; to retain compatibility with S/D MDS systems
  323. 068F  E69F        0294      AND    A,09FH
  324. 0691  CA69FB      0295      JP    Z,ADDERROR+OFFSET ;Zero sector #
  325. 0694  D61B        0296      SUB    MAXSECTORS+1 ;Max sector # + 1
  326. 0696  D269FB      0297      JP    NC,ADDERROR+OFFSET
  327. 0699  DD7E04      0298      LD    A,(IX+4) ;Sector addr
  328.                   0299  ;
  329.                   0300  ; Must reset bit 5 of sector byte (a drive select bit)
  330.                   0301  ; to retain compatibility with S/D MDS systems
  331. 069C  E69F        0302      AND    A,09FH
  332. 069E  DD4E02      0303      LD    C,(IX+2) ;Number of records requested
  333. 06A1  81          0304      ADD    A,C
  334. CROMEMCO Z80 Macro Assembler version 03.07   Nov 30, 1980  09:46:29   Page 0006
  335. *** MDS *** 
  336.  
  337. 06A2  D61C        0305      SUB    A,MAXSECTORS+2
  338. 06A4  D269FB      0306      JP    NC,ADDERROR+OFFSET ;Final sector >1AH
  339.                   0307  ; Address errors trapped, now seek to required track
  340.                   0308  ;
  341. 06A7  DD7E01      0309  SKIP:    LD    A,(IX+1) ;Instruction word
  342. 06AA  E630        0310      AND    30H    ;Get drive mask
  343. 06AC  CB0F        0311      RRC    A
  344. 06AE  CB0F        0312      RRC    A
  345. 06B0  CB0F        0313      RRC    A
  346. 06B2  CB0F        0314      RRC    A
  347. 06B4  FE03        0315      CP    3 ; S/D MDS drive #1 mask
  348. 06B6  2804        0316      JR    Z,BSELECT ;Select drive B
  349.                   0317  ; Dont allow for more than 2 drives
  350. 06B8  16B1        0318      LD    D,0B1H    ;Auto wait,motor on,S/D,A:
  351. 06BA  1802        0319      JR    J3
  352. 06BC  16B2        0320  BSELECT: LD    D,0B2H    ;Auto wait,motor on,S/D,B:
  353.                   0321  ; D contains the drive control byte with auto wait set
  354.                   0322  ;
  355.                   0323  ; Now check for recalibrate, nop & format instructions
  356.                   0324  ;
  357. 06BE  DD7E01      0325  J3:    LD    A,(IX+1)
  358. 06C1  E607        0326