home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG040.ARK / NSCBIOS.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  12KB  |  466 lines

  1. ;    MDS I/O DRIVERS FOR CP/M
  2. ;    (FOUR DRIVE SINGLE DENSITY VERSION)
  3. ;    VERSION 1.4 JANUARY, 1978
  4. ; CUSTOMIZED FOR NATIONAL SEMICONDUCTOR BLC 8221 DISK CONT.
  5. ; BY Robert A. Van Valzah    2/23/79
  6. ;
  7. CBIVERS    EQU    09    ;CBIOS VERSION NUMBER
  8. CPMVERS    EQU    14    ;CP/M VERSION NUMBER
  9. ;
  10. ;    COPYRIGHT (C) 1978
  11. ;    DIGITAL RESEARCH
  12. ;    BOX 579, PACIFIC GROVE
  13. ;    CALIFORNIA, 93950
  14. ;
  15. ;
  16. TRUE    EQU    0FFFFH    ;VALUE OF "TRUE"
  17. FALSE    EQU    NOT TRUE    ;"FALSE"
  18. REL    EQU    FALSE    ;TRUE TO GENERATE RELOCATABLE CODE
  19. MSIZE    EQU    32    ;MEMORY AND CPM SYSTEM SIZE IN K BYTES
  20. ;
  21.     IF    REL
  22. BIAS    EQU    0    ;GENERATE CPM IMAGE ORGED FOR ZERO
  23.     ENDIF
  24.     IF    NOT REL
  25. BIAS    EQU    (MSIZE-16)*1024+2900H
  26.     ENDIF
  27. ;
  28. PATCH    EQU    1500H+BIAS
  29. ;
  30.     ORG    PATCH
  31. CPMB    EQU    000H+BIAS    ;BASE OF CPM CONSOLE PROCESSOR
  32. BDOS    EQU    806H+BIAS    ;BASIC DOS (RESIDENT PORTION)
  33. CPML    EQU    $-CPMB    ;LENGTH (IN BYTES) OF CPM SYSTEM
  34. NSECTS    EQU    CPML/128    ;NUMBER OF SECTORS TO LOAD
  35. OFFSET    EQU    2    ;NUMBER OF DISK TRACKS USED BY CP/M
  36. CDISK    EQU    0004H    ;ADDRESS OF LAST LOGGED DISK ON WARM START
  37. BUFF    EQU    0080H    ;DEFAULT BUFFER ADDRESS
  38. ;
  39. ;    PERFORM FOLLOWING FUNCTIONS
  40. ;    BOOT    COLD START
  41. ;    WBOOT    WARM START (SAVE I/O BYTE)
  42. ;    (BOOT AND WBOOT ARE THE SAME FOR MDS)
  43. ;    CONST    CONSOLE STATUS
  44. ;        REG-A = 00 IF NO CHARACTER READY
  45. ;        REG-A = FF IF CHARACTER READY
  46. ;    CONIN    CONSOLE CHARACTER IN (RESULT IN REG-A)
  47. ;    CONOUT    CONSOLE CHARACTER OUT (CHAR IN REG-C)
  48. ;    LIST    LIST OUT (CHAR IN REG-C)
  49. ;    PUNCH    PUNCH OUT (CHAR IN REG-C)
  50. ;    READER    PAPER TAPE READER IN (RESULT TO REG-A)
  51. ;    HOME    MOVE TO TRACK 00
  52. ;
  53. ;    (THE FOLLOWING CALLS SET-UP THE IO PARAMETER BLOCK FOR THE
  54. ;    MDS, WHICH IS USED TO PERFORM SUBSEQUENT READS AND WRITES)
  55. ;    SELDSK    SELECT DISK GIVEN BY REG-C (0,1,2...)
  56. ;    SETTRK    SET TRACK ADDRESS (0,...76) FOR SUBSEQUENT READ/WRITE
  57. ;    SETSEC    SET SECTOR ADDRESS (1,...,26) FOR SUBSEQUENT READ/WRITE
  58. ;    SETDMA    SET SUBSEQUENT DMA ADDRESS (INITIALLY 80H)
  59. ;
  60. ;    (READ AND WRITE ASSUME PREVIOUS CALLS TO SET UP THE IO PARAMETERS)
  61. ;    READ    READ TRACK/SECTOR TO PRESET DMA ADDRESS
  62. ;    WRITE    WRITE TRACK/SECTOR FROM PRESET DMA ADDRESS
  63. ;
  64. ;    JUMP VECTOR FOR INDIVIUAL ROUTINES
  65.     JMP    BOOT
  66. WBOOTE:    JMP    WBOOT
  67.     JMP    CONST
  68.     JMP    CONIN
  69.     JMP    CONOUT
  70.     JMP    LIST
  71.     JMP    PUNCH
  72.     JMP    READER
  73.     JMP    HOME
  74.     JMP    SELDSK
  75.     JMP    SETTRK
  76.     JMP    SETSEC
  77.     JMP    SETDMA
  78.     JMP    READ
  79.     JMP    WRITE
  80. ;
  81. NODISKS    DB    1    ;NUMBER OF PHYSICAL DRIVES
  82. ;
  83. ;
  84. ;    END OF CONTROLLER - INDEPENDENT CODE, THE REMAINING SUBROUTINES
  85. ;    ARE TAILORED TO THE PARTICULAR OPERATING ENVIRONMENT, AND MUST
  86. ;    BE ALTERED FOR ANY SYSTEM WHICH DIFFERS FROM THE INTEL MDS.
  87. ;
  88. ;    THE FOLLOWING CODE ASSUMES THE MDS MONITOR EXISTS AT 0F800H
  89. ;    AND USES THE I/O SUBROUTINES WITHIN THE MONITOR
  90. ;
  91. REVRT    EQU    0FDH    ;INTERRUPT REVERT PORT
  92. INTC    EQU    0FCH    ;INTERRUPT MASK PORT
  93. ICON    EQU    0F3H    ;INTERRUPT CONTROL PORT
  94. INTE    EQU    0111$1110B    ;ENABLE RST 0(WARM BOOT), RST 7 (MONITOR)
  95. ;
  96. ;    MDS MONITOR EQUATES
  97. MON80    EQU    0F800H    ;MDS MONITOR
  98. RMON80    EQU    0FF0FH    ;RESTART MON80 (BOOT ERROR)
  99. CI    EQU    0F803H    ;CONSOLE CHARACTER TO REG-A
  100. RI    EQU    0F806H    ;READER IN TO REG-A
  101. CO    EQU    0F809H    ;CONSOLE CHAR FROM C TO CONSOLE OUT
  102. PO    EQU    0F80CH    ;PUNCH CHAR FROM C TO PUNCH DEVICE
  103. LO    EQU    0F80FH    ;LIST FROM C TO LIST DEVICE
  104. CSTS    EQU    0F812H    ;CONSOLE STATUS 00/FF TO REGISTER A
  105. ;
  106. ;    DISK PORTS AND COMMANDS
  107. BASE    EQU    70H    ;BASE OF DISK COMMAND IO PORTS
  108. READY    EQU    BASE+1    ;READY, RETRY, AND ERROR BITS
  109. ERRBITS    EQU    BASE    ;ERROR TYPE BITS
  110. ;
  111. BUSY    EQU  1000$0000B    ;CONTROLLER BUSY STATUS BIT
  112. RTRYBIT    EQU  0010$0000B    ;INDICATES THAT THE EXECUTED COMMAND HAD A RETRY
  113. ;
  114. ILOW    EQU    BASE+1    ;IOPB LOW ADDRESS (OUTPUT)
  115. IHIGH    EQU    BASE+2    ;IOPB HIGH ADDRESS (OUTPUT)
  116. ;
  117. READFUN    EQU    8    ;READ A SECTOR FUNCTION
  118. WRITEFUN EQU    9    ;WRITE A SECTOR FUNCTION
  119. CR    EQU    0DH    ;CARRIAGE RETURN
  120. LF    EQU    0AH    ;LINE FEED
  121. ;
  122. SIGNON:    ;SIGNON MESSAGE: XXK CP/M VERS Y.Y-Z.Z NS
  123.     DB    CR,LF,LF
  124.     IF    NOT REL
  125.     DB    '0'+MSIZE/10, '0'+MSIZE MOD 10
  126.     ENDIF
  127.     IF    REL
  128.     DB    '00'    ;MEMORY SIZE FILLED BY RELOCATOR
  129.     ENDIF
  130.     DB    'K CP/M VERS '
  131.     DB    CPMVERS/10+'0', '.', CPMVERS MOD 10+'0'
  132.     DB    '-'
  133.     DB    '0'+CBIVERS/10, '.', '0'+CBIVERS MOD 10
  134.     DB    ' NS', CR, LF, 0
  135. ;
  136. BOOT:    ;PRINT SIGNON MESSAGE AND GO TO CCP
  137. ;    (NOTE: MDS BOOT INITIALIZED IOBYTE AT 0003H)
  138.     LXI    SP,BUFF+80H
  139.     LXI    H,SIGNON
  140.     CALL    PRMSG    ;PRINT MESSAGE
  141.     XRA    A    ;CLEAR ACCUMULATOR
  142.     STA    CDISK    ;SET INITIALLY TO DISK A
  143.     JMP    GOCPM    ;GO TO CP/M
  144. ;
  145. ;
  146. WBOOT:;    LOADER ON TRACK 0, SECTOR 1, WHICH WILL BE SKIPPED FOR WARM 
  147. ;    READ CP/M FROM DISK - ASSUMING THERE IS A 128 BYTE COLD START
  148. ;    START.
  149. ;
  150.     LXI    SP,BUFF+80H    ;SETUP TEMP STACK IN LOW MEM
  151.     MVI    C,0    ;SELECT DRIVE A FOR BOOTING
  152.     CALL    SELDSK
  153.     CALL    DO$SEL
  154. ;
  155. ; SEND ADDRESS OF FIRST IOPB TO CONTROLLER
  156. ;
  157.  
  158.     MVI    B,2    ;NUMBER OF IOPBS TO SEND
  159.     LXI    H,BTIOPB1
  160. SENDADR:
  161.     MOV    A,L
  162.     OUT    ILOW
  163.     MOV    A,H
  164.     OUT    IHIGH
  165. BTWAIT:            ;WAIT FOR CONTROLLER TO FINISH
  166.     IN    READY
  167.     ANI    BUSY
  168.     JNZ    BTWAIT
  169.     IN    ERRBITS    ;GET ERROR BITS FROM CONTROLLER
  170.     ORA    A    ;ANY ERRORS?
  171.     JNZ    BOOTERR    ;NO - PRINT ERROR AND GIVE UP
  172.     DCR    B    ;DONE WITH BOTH IOPB'S?
  173.     JZ    GOCPM    ;YES - INSTALL LOW MEM JMPS ETC
  174.     LXI    H,BTIOPB2 ;NO - SEND SECOND IOPB
  175.     JMP    SENDADR
  176. ;
  177. ;    DONE WITH THE LOAD, RESET DEFAULT BUFFER ADDRESS
  178. GOCPM:    ;(ENTER HERE FROM COLD START BOOT)
  179. ;    ENABLE RST0 AND RST7
  180.     DI
  181.     MVI    A,12H    ;INITIALIZE COMMAND
  182.     OUT    REVRT
  183.     XRA    A
  184.     OUT    INTC    ;CLEARED
  185.     MVI    A,INTE    ;RST0 AND RST7 BITS ON
  186.     OUT    INTC
  187.     XRA    A
  188.     OUT    ICON    ;INTERRUPT CONTROL
  189. ;
  190. ;    SET DEFAULT BUFFER ADDRESS TO 80H
  191.     LXI    B,BUFF
  192.     CALL    SETDMA
  193. ;
  194. ;    RESET MONITOR ENTRY POINTS
  195.     MVI    A,JMP
  196.     STA    0
  197.     LXI    H,WBOOTE
  198.     SHLD    1    ;JMP WBOOT AT LOCATION 00
  199.     STA    5
  200.     LXI    H,BDOS
  201.     SHLD    6    ;JMP BDOS AT LOCATION 5
  202.     STA    7*8    ;JMP TO MON80 (MAY HAVE BEEN CHANGED BY DDT)
  203.     LXI    H,MON80
  204.     SHLD    7*8+1
  205. ;    LEAVE IOBYTE SET
  206. ;    PREVIOUSLY SELECTED DISK WAS B, SEND PARAMETER TO CPM
  207.     LDA    CDISK    ;LAST LOGGED DISK NUMBER
  208.     MOV    C,A    ;SEND TO CCP TO LOG IT IN
  209.     EI
  210.     JMP    CPMB
  211. ;
  212. ; ERROR IN BOOTING, PRINT MESSAGE AND GIVE UP
  213. ;
  214. BOOTERR:
  215.     LXI    H,BOOTMSG
  216.     CALL    PRMSG
  217.     JMP    RMON80    ;MDS HARDWARE MONITOR
  218. ;
  219. BOOTMSG:
  220.     DB    '?BOOT',0
  221. ;
  222. ;
  223. CONST:    ;CONSOLE STATUS TO REG-A
  224. ;    (EXACTLY THE SAME AS MDS CALL)
  225.     JMP    CSTS
  226. ;
  227. CONIN:    ;CONSOLE CHARACTER TO REG-A
  228.     CALL    CI
  229.     ANI    7FH    ;REMOVE PARITY BIT
  230.     RET
  231. ;
  232. CONOUT:    ;CONSOLE CHARACTER FROM C TO CONSOLE OUT
  233.     PUSH    B    ;SAVE CHARACTER TO SEND
  234.     CALL    DO$SEL    ;ASK USER TO MOUNT CORRECT DISK
  235.     POP    B    ;GET CHARACTER FOR CONOUT
  236.     JMP    CO
  237. ;
  238. LIST:    ;LIST DEVICE OUT
  239. ;    (EXACTLY THE SAME AS MDS CALL)
  240.     MOV    A,C    ;THROW AWAY LINE FEEDS
  241.     CPI    LF
  242.     RZ
  243.     JMP    LO
  244. ;
  245. PUNCH:    ;PUNCH DEVICE OUT
  246. ;    (EXACTLY THE SAME AS MDS CALL)
  247.     JMP    PO
  248. ;
  249. READER:    ;READER CHARACTER IN TO REG-A
  250. ;    (EXACTLY THE SAME AS MDS CALL)
  251.     JMP    RI
  252. ;
  253. HOME:    ;MOVE TO HOME POSITION
  254. ;    TREAT AS TRACK 00 SEEK
  255.     MVI    C,0
  256.     JMP    SETTRK
  257. ;
  258. ; SELECT THE DRIVE IN REG C.
  259. ;
  260. SELDSK:
  261.     MOV    A,C    ;SAVE SELECT REQUEST UNTIL READ OR WRITE TIME
  262.     STA    SELREQ
  263.     RET
  264. ;
  265. ; ACTUALLY PERFORM THE SELECTION OF THE DRIVE IN SELREQ
  266. ;
  267. DO$SEL:
  268.     LDA    SELREQ    ;GET REQUESTED DRIVE NUMBER
  269.     MOV    C,A    ;INTO REG C
  270.     LDA    LASTSEL    ;SEE IF REQUEST IS SAME AS LAST DRIVE SELECTED?
  271.     CMP    C
  272.     RZ        ;IF SO WE ARE DONE - RETURN
  273.     MOV    A,C    ;IF NOT - UPDATE LAST DRIVE SELECTED BYTE
  274.     STA    LASTSEL
  275.     PUSH    B    ;SAVE REQUESTED DRIVE
  276.     CALL    CONST    ;CLEAR ANY CHARACTER WAITING IN INPUT LATCHES
  277.     ORA    A
  278.     CNZ    CONIN
  279.     LXI    H,MMSG    ;SEND MOUNT MESSAGE
  280.     CALL    PRMSG
  281.     POP    B    ;GET REQUEST
  282.     PUSH    B    ;AND SAVE AGAIN
  283.     MVI    A,'A'    ;CONVERT REQUEST DRIVE NO TO ASCII 'A' - 'D'
  284.     ADD    C
  285.     MOV    C,A
  286.     CALL    CONOUT    ;SEND IT FOLLOWING MOUNT MESSAGE
  287.     CALL    CONIN    ;WAIT FOR USER TO SRIKE ANY KEY
  288.     POP    B    ;GET REQUESTED DRIVE
  289.             ;SEE IF REQUESTED DISK > NODISKS
  290.     LDA    NODISKS
  291.     MOV    B,A    ;SAVE NODISK IN REG B FOR SELMOD
  292.     DCR    A
  293.     CMP    C
  294.     JNC    SELPHYS    ;NO - JUST SELECT REQUESTED PHYSICAL DRIVE
  295.     MOV    A,C    ;GET REQUESTED DRIVE INTO REG A
  296. SELMOD:            ;TAKE REQUEST MOD NODISKS BY SUBTRACTION
  297.     SUB    B
  298.     JNC    SELMOD    ;SUBTRACT UNTIL OVERDRAFT
  299.     ADD    B    ;RESTORE OVERDRAFT
  300.     MOV    C,A    ;REQUEST MOD NODISKS TO REG C FOR SELECTION
  301. SELPHYS:        ;SELECT PHYSICAL DRIVE IN REG C
  302.     MOV    A,C    ;GET DRIVE NUMBER
  303.     ANI    11B    ;LEAVE ONLY SIGNIFICANT BITS
  304.     RRC        ;MOVE TO B7, B6 FOR IOPB
  305.     RRC
  306.     MOV    C,A    ;BACK TO REG C WITH IT
  307.     LDA    IOPB    ;GET EXISTING IOPB COMMAND
  308.     ANI  0011$1111B    ;MASK OUT OLD DRIVE SELECT BITS
  309.     ORA    C    ;OR IN NEW BITS
  310.     STA    IOPB    ;REPLACE UPDATED COMMAND
  311.     RET
  312. ;
  313. MMSG:    DB    CR, LF, 'MOUNT ', 0
  314. ;
  315. ;
  316. SETTRK:    ;SET TRACK ADDRESS GIVEN BY C
  317.     LXI    H,IOT
  318.     MOV    M,C
  319.     RET
  320. ;
  321. SETSEC:    ;SET SECTOR NUMBER GIVEN BY C
  322.     MOV    A,C    ;SECTOR NUMBER TO ACCUM
  323.     STA    IOS    ;STORE SECTOR NUMBER TO IOPB
  324.     RET
  325. ;
  326. SETDMA:    ;SET DMA ADDRESS GIVEN BY REGS B,C
  327.     MOV    L,C
  328.     MOV    H,B
  329.     SHLD    IOD
  330.     RET
  331. ;
  332. READ:
  333.     MVI    E,READFUN ;LOAD UP CONTROLLER READ COMMAND
  334.     JMP    DOIO    ;CONTINUE AT COMMON DISK IO ROUTINE
  335. WRITE:
  336.     MVI    E,WRITEFUN ;LOAD UP CONTROLLER WRITE COMMNAD
  337.             ;AND FALL THRU TO COMMON DISK IO
  338. DOIO:
  339.     PUSH    D    ;SAVE R/W FLAG
  340.     CALL    DO$SEL    ;SELECT CORRECT DRIVE
  341.     POP    D    ;GET R/W FLAG BACK
  342.     LXI    H,IOPB    ;POINT TO IOPB AND FUNCTION BYTE
  343.     MOV    A,M    ;GET EXISTING FUNCTION
  344.     ANI  1111$1000B    ;MASK OUT OLD FUNCTION
  345.     ORA    E    ;OR IN NEW FUNCTION
  346.     MOV    M,A    ;REPLACE NEW FUNCTION INTO IOPB
  347.     MOV    A,L    ;START DISK IO BY SENDING IOPB ADDRESS
  348.     OUT    ILOW
  349.     MOV    A,H    ;SEND HIGH ORDER IOPB ADDRESS
  350.     OUT    IHIGH
  351. IOWAIT:
  352.     IN    READY    ;WAIT FOR CONTROLLE TO FINISH
  353.     ANI    BUSY    ;IS IT STILL BUSY?
  354.     JNZ    IOWAIT    ;YES - KEEP WAITING
  355.     IN    READY    ;SEE IF COMMAND HAD A RETRY
  356.     ANI    RTRYBIT
  357.     JZ    NORTRY    ;NO RETRY - SKIP RETRY MESSAGE
  358.     LXI    H,RTRYMSG ;HAD A RETRY, WARN OPPERATOR WITH A MESSAGE
  359.     CALL    PRMSG
  360. NORTRY:
  361.     IN    ERRBITS    ;GET ERROR STATUS
  362.     ORA    A    ;RETURN REG A ZERO IF OK
  363.     RZ
  364.     PUSH    PSW    ;SAVE ERROR BITS
  365.     LXI    H,ERRMSG ;PRINT ERROR STATUS MESSAGE
  366.     CALL    PRMSG
  367.     POP    PSW    ;GET ERROR BITS BACK
  368.     CALL    PRHEX    ;PRINT THEM IN HEX
  369.     MVI    A,1    ;SEND ERROR FLAG BACK TO BDOS
  370.     RET
  371. ;
  372. RTRYMSG:
  373.     DB    'RETRYING ', 0
  374. ;
  375. ERRMSG:
  376.     DB    'ERROR STAT (HEX)=', 0
  377. ;
  378. ;
  379. ;    UTILITY SUBROUTINES
  380. PRMSG:    ;PRINT MESSAGE AT H,L TO 0
  381.     MOV    A,M
  382.     ORA    A    ;ZERO?
  383.     RZ
  384. ;    MORE TO PRINT
  385.     PUSH    H
  386.     MOV    C,A
  387.     CALL    CONOUT
  388.     POP    H
  389.     INX    H
  390.     JMP    PRMSG
  391. ;
  392. ; PRINT A BYTE AS TWO HEX DIGITS, BYTE TO PRINT IN REG A
  393. ;
  394. PRHEX:
  395.     PUSH    PSW    ;SAVE BYTE
  396.     RRC! RRC! RRC! RRC ;PRINT HIGH NIBBLE FIRST
  397.     CALL    PRNIB
  398.     POP    PSW    ;GET BYTE BACK
  399.             ;FALL THRU TO PRINT LOW NIBBLE
  400. ;
  401. ; PRINT A NIBBLE AS ONE HEX DIGIT, NIBBLE IN REG A B0 - B3
  402. ;
  403. PRNIB:
  404.     ANI  0000$1111B    ;LEAVE ONLY LOW NIBBLE
  405.     ADI    90H    ;ASK INTEL HOW THE NEXT FOUR LINES WORK
  406.     DAA
  407.     ACI    40H
  408.     DAA
  409.     MOV    C,A    ;ASCII CHR TO PRINT TO REG C
  410.     JMP    CONOUT    ;PRINT & RETURN FROM CONOUT
  411. ;
  412. ;
  413. ;    DATA AREAS (MUST BE IN RAM)
  414. ;
  415. LASTSEL    DB    0    ;LAST DRIVE SELECTED (INITIALIZE TO DRIVE A)
  416. SELREQ    DB    0    ;DRIVE SELECT REQUEST
  417. ;
  418. ; MAIN READ / WRITE IOPB
  419. ;
  420. IOPB:
  421.     DB    READFUN    ;READ COMMAND, NO INTERRUPTS
  422.     DB    1    ;ONE SECTOR READ AT A TIME
  423. IOT:    DB    OFFSET    ;TRACK NUMBER
  424. IOS:    DB    1    ;SECTOR NUMBER
  425. IOD:    DW    80H    ;DMA ADDRESS
  426.     DB    1    ;SECTOR LENGTH = 128 BYTES
  427.     DB    0FFH    ;NORMAL DATA MARK, 3 RETRYS,
  428.             ;IBM FORMAT, 128 BYTE TRANSFER
  429.     DB    0    ;IGNORE BLOCK TAG
  430.     DB    4    ;SIDE 0, UNBUFFERED, SINGLE DENSITY,
  431.             ;LAST IOPB
  432.     DW    0    ;NO NEXT IOPB
  433. ;
  434. ; FIRST BOOT IOPB, READS TRACK 0 STARTING WITH SECTOR 2 INTO CPMB
  435. ;
  436. BTIOPB1:
  437.     DB    READFUN    ;READ WITH NO INTERRUPTS
  438.     DB    26-1    ;READ ALL OF TRACK 0 BUT SECTOR 1 (WHICH HOLDS BOOT)
  439.     DB    0    ;TRACK 0
  440.     DB    2    ;STARTING WITH SECTOR 2
  441.     DW    CPMB    ;START LOADING AT CPMB
  442.     DB    1    ;SECTOR LENGTH = 128 BYTES
  443.     DB    0FFH    ;NORMAL DATA MARK, 3 RETRYS, IBM FORMAT
  444.             ;AND 128 BYTE TRANSFER
  445.     DB    0    ;IGNORE BLOCK TAG
  446.     DB    100B    ;SIDE 0, UNBUFFERED, SINGLE DENSITY, LAST IOPB
  447.     DW    0    ;NO NEXT IOPB
  448. ;
  449. ; SECOND BOOT IOPB, READ REMAINDER OF DOS FROM TRACK 1 INTO FOLLOWING
  450. ; MEMORY ADDRESSES
  451. ;
  452. BTIOPB2:
  453.     DB    READFUN    ;READ WITH NO INTERRUPTS
  454.     DB    (PATCH-CPMB)/128-(26-1) ;NUMBER OF SECTORS ON TRACK 1
  455.     DB    1    ;TRACK 1
  456.     DB    1    ;STARTING WITH SECTOR 1
  457.     DW    CPMB+(26-1)*128 ;ADDRESS FOLLOWING READ OF FIRST IOPB
  458.     DB    1    ;SECTOR LENGTH = 128 BYTES
  459.     DB    0FFH    ;NORMAL DATA MARK, 3 RETRYS, IBM FORMAT,
  460.             ;AND 128 BYTE TRANSFER
  461.     DB    0    ;IGNORE BLOCK TAG
  462.     DB    100B    ;SIDE 0, UNBUFFERED, SINGLE DENSITY, LAST IOPB
  463.     DW    0    ;NO NEXT IOPB ADDRESS
  464. ;
  465.     END
  466.