home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol050 / boot < prev    next >
Encoding:
Text File  |  1984-04-29  |  4.9 KB  |  345 lines

  1.  
  2.  
  3. ;
  4. ;
  5. ;
  6. ;BOOT - Data Technology Corporation CP/M 2.2 BOOT.
  7. ;
  8. ;    +-----------------------+
  9. ;    |            |
  10. ;    |    B O O T     |
  11. ;    |            |
  12. ;    +-----------------------+
  13. ;
  14. ;
  15. ;
  16. ;    Version number:    2.2B
  17. ;    Version date:    March 19, 1981
  18. ;
  19. ;    Update date:    March 24, 1981
  20. ;
  21. ;    Update date:    June 26, 1981
  22. ;            No longer support boot from single-density
  23. ;            diskette.
  24. ;
  25. ;            Boots from logical unit number in A
  26. ;            register on entry.
  27. ;
  28. ;    The following code is supplied to customers who
  29. ;    purchase a hard/floppy disk system from DTC.
  30. ;    The following code is written onto track 0 sector 0
  31. ;    of the hard disk.  This routine is read into memory
  32. ;    at location 0 by the user's PROM.   This routine then
  33. ;    loads the rest of the system into memory.
  34. ;
  35. ;
  36. ;    The format of the Hard Disk Boot sectors are as follows:
  37. ;
  38. ;    Logical        Routine
  39. ;    Sector        Name
  40. ;
  41. ;      0        Boot program
  42. ;
  43. ;    1 thru 8    CCP
  44. ;
  45. ;    9 thru 22    BDOS
  46. ;
  47. ;    23 thru 32    DTC CBIOS
  48. ;
  49.     
  50.  
  51.  
  52.  
  53.  
  54. VERS:    EQU    22
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.     
  63.  
  64.  
  65. ;Enter and exit with A = logical unit # of the boot device
  66.  
  67.  
  68.     ORG    100h
  69. BOOT:
  70.     LXI    SP,BOOT
  71.     LXI    H,DT        ;Find parameters
  72.     LXI    D,DTELN
  73.     MVI    B,NLUN
  74. BOOT2:
  75.     CMP    M
  76.     JZ    BOOT3
  77.     DAD    D
  78.     DCR    B
  79.     JNZ    BOOT2
  80.     LXI    H,DT
  81.     XRA    A
  82. BOOT3:
  83.     INX    H
  84.     STA    LUN        ;Set logical unit number
  85.     STA    CIOAD+1
  86.     STA    CIOFS+1
  87.     MOV    A,M
  88.     STA    CIOPB+3        ;Set starting sector
  89.     INX    H
  90.     MOV    A,M
  91.     STA    CIOPB+4        ;Set # sectors
  92.     INX    H        ;Set drive type
  93.     MOV    A,M
  94.     INX    H
  95.     CPI    0FFh
  96.     JZ    BOOT0
  97.     STA    CIOAD+4
  98.     PUSH    H
  99.     LXI    H,CIOAD
  100.     CALL    EXEC
  101.     CZ    WAITF
  102.     POP    H
  103. BOOT0:
  104.     MOV    A,M
  105.     CPI    0FFh
  106.     JZ    BOOT1
  107.     STA    CIOFS+5
  108.     LXI    H,CIOFS
  109.     CALL    EXEC
  110.     CZ    WAITF
  111. BOOT1:
  112.     LXI    D,CCP
  113.     LXI    H,CIOPB
  114.     CALL    RDISK
  115.     ORA    A
  116.     JNZ    BOOT1
  117.     MOV    A,C
  118.     ANI    FERR
  119.     JNZ    BOOT1
  120.  
  121.     LDA    LUN
  122.     JMP    CBIOS 
  123.  
  124.  
  125. CIOAD:    DB    ADCMD,0,0,0,0,0
  126. CIOFS:    DB    FSCMD,0,0,0,0,0
  127. CIOPB:    DB    RDCMD
  128. LUN:    DB    0
  129.  
  130.     DB    0,1
  131.     DB    0        ;Read two tracks less BOOT
  132.     DB    0        ;Perform not retries
  133.  
  134. BOTSIZ:    EQU    BIOCOD+CBIOS-CCP
  135. HBTLN:    EQU    BOTSIZ/256
  136. FBTLN:    EQU    24+(BOTSIZ-24*128)/256
  137. MBTLN:    EQU    14+(BOTSIZ-14*128)/256
  138.  
  139. DT:
  140.     IF    LUN0
  141.     DB    0 SHL 5
  142.     DB    1+NF0+N48M0+N96M0
  143.     DB    NH0*HBTLN+NF0*FBTLN+(N48M0+N96M0)*MBTLN
  144.     DB    LUN0DAT
  145.     DB    B0
  146.     ENDIF
  147.     IF    LUN1
  148.     DB    1 SHL 5
  149.     DB    1+NF1+N48M1+N96M1
  150.     DB    NH1*HBTLN+NF1*FBTLN+(N48M1+N96M1)*MBTLN
  151.     DB    LUN1DAT
  152.     DB    B1
  153.     ENDIF
  154.     IF    LUN2
  155.     DB    2 SHL 5
  156.     DB    1+NF2+N48M2+N96M2
  157.     DB    NH2*HBTLN+NF2*FBTLN+(N48M2+N96M2)*MBTLN
  158.     DB    LUN2DAT
  159.     DB    B2
  160.     ENDIF
  161.     IF    LUN3
  162.     DB    3 SHL 5
  163.     DB    1+NF3+N48M3+N96M3
  164.     DB    NH3*HBTLN+NF3*FBTLN+(N48M3+N96M3)*MBTLN
  165.     DB    LUN3DAT
  166.     DB    B3
  167.     ENDIF
  168. DTELN:    EQU    5
  169. DTLEN:    EQU    ($-DT)/DTELN
  170.  
  171. ;    Disk I/O Routines
  172. ;
  173. ;
  174.     IF    I696
  175. ;    E X E C
  176.  
  177. EXEC:    MVI    B,BUSY        ;Wait for not busy.
  178.     MVI    C,BUSY and (not BUSY)
  179.     CALL    WAITM
  180.     RNZ
  181.     
  182.  
  183.     MVI    A,SLCT        ;Alert controller
  184.     OUT    DIO+1
  185. EXEC1:
  186.     MOV    C,B        ;Wait for controller busy
  187.     CALL    WAITM
  188.     RNZ
  189.  
  190.     MVI    A,DODTA        ;Enable data in
  191.     OUT    DIO+1
  192.  
  193. EXEC2:    IN    DIO+2        ;Get status
  194.     XRI    0FFh
  195.     JM    EXEC2        ;If not requesting next byte
  196.     ANI    CMND+DIROUT
  197.     JNZ    EXEC3        ;If CMND or DIROUT false
  198.     MOV    A,M
  199.     INX    H
  200.     OUT    DIO        ;Send byte from command buffer
  201.     JMP    EXEC2
  202.  
  203. EXEC3:    CMP    A        ;Z:=1
  204.     RET
  205. ;
  206. ;
  207. ;
  208. ;
  209. ;    RDISK - Input to memory buffer.
  210. ;
  211. ;    Entry:    HL = command buffer address
  212. ;        DE = data buffer address
  213.  
  214. RDISK:    CALL    EXEC
  215.     RNZ            ;Return if timeout
  216. RDISK1:    IN    DIO+2        ;Read status
  217.     ORA    A
  218.     JP    RDISK1        ;If request is present
  219.     ANI    CMND
  220.     JNZ    GCMPS
  221.     IN    DIO
  222.     STAX    D
  223.     INX    D
  224.     JMP    RDISK1
  225. ;
  226. ;
  227. ;
  228. ;
  229. ;    WAITF - Wait for function to complete.
  230.  
  231. WAITF:    MVI    B,REQ+CMND    ;Wait for both REQ and CMND
  232.     MOV    C,B
  233.     CALL    WAITM
  234.     RNZ
  235. ;
  236. ;    Get completion status.
  237.  
  238. GCMPS:    IN    DIO        ;Get completion status
  239.     MOV    C,A
  240.  
  241. GCMP1:    IN    DIO+2
  242.     ORA    A
  243.     JP    GCMP1        ;If REQ not set
  244.  
  245.     MOV    B,A
  246.     IN    DIO        ;Get message byte
  247.     RET
  248.     ENDIF
  249. ;
  250.  
  251. ;
  252. ;
  253. ;
  254.     IF    I796
  255. ;    EXEC - Output the command
  256. ;
  257. ;    Enter:    HL is the command buffer address
  258. ;        DE - data transfer address.
  259.  
  260. EXEC:
  261.     MOV    A,E        ;Output DMA address
  262.     OUT    DIO+2
  263.     MOV    A,D
  264.     OUT    DIO+3
  265.     MOV    A,L
  266.     OUT    DIO+4
  267.     MOV    A,H
  268.     OUT    DIO+5
  269.     MVI    A,0
  270.     OUT    DIO+6
  271.     OUT    DIO+7
  272.     OUT    DIO
  273.     CMP    A        ;Z:=1
  274.     RET
  275.  
  276.  
  277. ;    Disk read/write
  278. ;
  279. ;    Entry:    same as EXEC
  280. ;
  281. RDISK:
  282. WDISK:    CALL    EXEC
  283.     RNZ            ;Return if timeout
  284.  
  285. ;    WAITF - Wait until transfer done
  286. ;
  287. ;    Enter:    none
  288. ;    Exit:    when transfer completed
  289.  
  290. WAITF:    MVI    B,CMDDON    ;Wait for CMDDON
  291.     MOV    C,B
  292.     CALL    WAITM
  293.     RNZ            ;Return if timeout
  294. ;
  295.  
  296. ;    GCMPS - Get completion status
  297. ;
  298. ;    Enter:    none
  299. ;    Exit:    Status in C
  300. GCMPS:    IN    DIO+1
  301.     MOV    C,A
  302.     RET
  303.     ENDIF
  304.  
  305. ;    WAITM - Wait for controller with timeout
  306. ;
  307. ;    Entry:    B=Status mask
  308. ;        C=Status value
  309. ;    Exit:    Z=1 if OK, else timeout with A=C=TERR
  310. ;
  311. WAITM:
  312.     PUSH    D        ;Save D
  313.     PUSH    H
  314.     LXI    H,138        ;Two minute timeout
  315.     LXI    D,0        ;Max wait @4MHZ is 868 ms
  316. WAITML:
  317.     IF    I696
  318.     IN    DIO+2
  319.     ENDIF
  320.     IF    I796
  321.     IN    DIO
  322.     ENDIF
  323.     ANA    B        ;Mask wait bits
  324.     CMP    C        ;Check value
  325.     JZ    WAITM1
  326.     DCX    D        ;Not ready.  Decrement time
  327.     MOV    A,D
  328.     ORA    E
  329.     JNZ    WAITML
  330.     DCX    H
  331.     MOV    A,H
  332.     ORA    L
  333.     JNZ    WAITML
  334.     MVI    B,0        ;Timeout
  335.     MVI    A,TERR
  336.     ORA    A
  337. WAITM1:
  338.     POP    H
  339.     POP    D        ;Restore D
  340.     MOV    C,A        ;Return status in C
  341.     RET
  342.  
  343.  
  344.     END
  345.