home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / cpm / utils / s / zen2.lbr / FORMAT.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-03-30  |  69.1 KB  |  3,477 lines

  1.     TITLE    'FORMAT - CP/M-85 FORMAT UTILITY     02 MAR 83'
  2. FALSE    EQU    0
  3. TRUE    EQU    1
  4.  
  5. ASM86    EQU    FALSE
  6.  
  7.  
  8.  
  9. ;**    EXTRA PSEUDO OPS FOR USE WITH MAC
  10. ;
  11.  
  12. RB    MACRO    A
  13.     DS    A
  14.     ENDM
  15.  
  16. RW    MACRO    A
  17.     DS    2*A
  18.     ENDM
  19.  
  20.  
  21.  
  22. ;**
  23. ;*    MACRO COMINP    - Command line input
  24. ;*
  25. ;*    Macro to bypass console prompts and read from command line
  26. ;*
  27. ;*    Bill Earl 10/18/81
  28. ;*
  29. ;*    DATUM    = address of desired input data
  30. ;*    PROCED    = place to continue after acquiring data
  31. ;*    IGNOR    = place to continue if no command line
  32. ;*
  33.  
  34.  
  35. COMINP    MACRO    DATUM,    PROCED,    IGNOR
  36.  
  37.     LDA    COMLIN    ;; is there a command line
  38.     ANA    A    ;;
  39.     JZ    IGNOR    ;; no, read from console
  40.  
  41.     LDA    DATUM    ;; yes, load it into A
  42.     JMP    PROCED    ;; take it and run
  43.  
  44.     ENDM
  45.  
  46. ;**
  47. ;*    MACRO    QUERY
  48. ;*
  49. ;*    CHECKS TO SEE IF NO QUERY MODE,
  50. ;*    IF SO, SKIPS OVER USER PROMPT
  51. ;*
  52.  
  53. QUERY    MACRO    RESUME
  54.     LDA    NOQFLG
  55.     ANA    A
  56.     JNZ    RESUME
  57.     ENDM
  58.  
  59.  
  60. ;**
  61. ;*    MACRO    TCHECK
  62. ;*
  63. ;*    TYPE CHECK OF DISK
  64. ;*
  65.  
  66. TCHECK    MACRO    DRT
  67.  
  68.     LOCAL    TC1
  69.  
  70.     LDA    TFLG
  71.     ANA    A
  72.     JZ    TC1
  73.     CPI    DRT
  74. TC1    JNZ    TMMERR
  75.     ENDM
  76.  
  77.     PAGE
  78. BIAS    EQU    0
  79. ;**    CP/M-85 SYSTEM EQUATES
  80. ;
  81.  
  82. ;    OS VALUES
  83.  
  84. CCPL    EQU    0800H            ;LENGTH OF CCP
  85. BDOSL    EQU    0E00H            ;LENGTH OF BDOS
  86.  
  87. ;    RESERVED LOCATIONS IN PAGE ZERO
  88.  
  89.     ORG    BIAS
  90. BOOT    RB    3            ;JUMP TO WARM START ENTRY
  91. IOBYTE    RB    1            ;IOBYTE
  92. DFTDRV    RB    1            ;CURRENT EFAULT DRIVE
  93. BDOS    RB    3            ;JUMP TO BDOS
  94. INT1    RB    8            ;INTERRUPT LOCATION 1
  95. INT2    RB    8            ;INTERRUPT LOCATION 2
  96. INT3    RB    8            ;INTERRUPT LOCATION 3
  97. INT4    RB    8            ;INTERRUPT LOCATION 4
  98. INT5    RB    8            ;INTERRUPT LOCATION 5
  99. INT6    RB    8            ;INTERRUPT LOCATION 6 (RESERVED)
  100. INT7    RB    8            ;INTERRUPT LOCATION 7 (USED BY DDT)
  101. BSCR    RB    16            ;16 BYTE SCRATCH AREA FOR BIOS
  102.     RB    12            ;12 BYTES NOT USED BUT RESERVED
  103. TFCB    RB    36            ;TRANSIENT DEFAULT FCB
  104. TFCB2    EQU    TFCB+16            ;TRANSIENT 2ND FILENAME
  105. TBUFF    RB    128            ;DEFAULT DISK BUFFER
  106. TPA    RB    0            ;START OF TRANSIENT PROGRAM AREA
  107.  
  108. ;    HEATH PAGE ZERO LOCATIONS
  109.  
  110.     IF    ASM86
  111.     ORG    OFFSET INT1+3
  112.     ENDIF
  113.     IF    NOT ASM86
  114.     ORG    INT1+3
  115.     ENDIF
  116. TICCNT    RW    2            ;32 BIT TIMER TIC COUNTER
  117. TIMEFLG    RB    1            ;TIMER 2 FLAG (0=RUNNING , 1=TIME OUT)
  118.  
  119.     IF    ASM86
  120.     ORG    OFFSET INT2
  121.     ENDIF
  122.     IF    NOT ASM86
  123.     ORG    INT2
  124.     ENDIF
  125. COMREG    RB    0            ;BIOS88 COMMUNICATION REGION
  126. COMFUNC    RB    1            ; BIOS FUNCTION VALUE = (#-CBOOT)/3
  127. COMRA    RB    1            ; (A)
  128. COMRBC    RW    0            ; (BC)
  129. COMRC    RB    1            ;  (C)
  130. COMRB    RB    1            ;  (B)
  131. COMRDE    RW    0            ; (DE)
  132. COMRE    RB    1            ;  (E)
  133. COMRD    RB    1            ;  (D)
  134. COMRHL    RW    0            ; (HL)
  135. COMRL    RB    1            ;  (L)
  136. COMRH    RB    1            ;  (H)
  137. COMWHO    RB    1            ;WHICH PROCESSOR IS RUNNING
  138.                     ; ZPSPPS5 = 8085
  139.                     ; ZPSPPS8 = 8088
  140.  
  141. BDMAP    EQU    BSCR+00H        ;DRIVE MAP (MAX OF 8 ENTRIES 0-7)
  142.     IF    ASM86
  143. BBIOS    EQU    WORD PTR BSCR+0EH    ;TRUE ADDRESS FOR START OF BIOS
  144.     ENDIF
  145.     IF    NOT ASM86
  146. BBIOS    EQU    BSCR+0EH        ;TRUE ADDRESS FOR START OF BIOS
  147.     ENDIF
  148.  
  149. ;    CP/M FUNCTIONS
  150.  
  151. RESET    EQU    0            ;SYSTEM RESET
  152. RDCON    EQU    1            ;READ CONSOLE
  153. WRCON    EQU    2            ;WRITE CONSOLE
  154. RDRDR    EQU    3            ;READ READER
  155. WRPUN    EQU    4            ;WRITE PUNCH
  156. WRLST    EQU    5            ;WRITE LIST
  157. DCONIO    EQU    6            ;DIRECT CONSOLE I/O (2)
  158. IOSTAT    EQU    7            ;INTERROGATE I/O STATUS
  159. ASTAT    EQU    8            ;ALTER I/O STATUS
  160. PRCONB    EQU    9            ;PRINT CONSOLE BUFFER
  161. RDCONB    EQU    10            ;READ CONSOLE BUFFER
  162. CCSTAT    EQU    11            ;CHECK CONSOLE STATUS
  163. LDH    EQU    12            ;LIFT DISK HEAD
  164. CPMVER    EQU    LDH            ;GET CP/M VERSION (2)
  165. RDS    EQU    13            ;RESET DISK SYSTEM
  166. SELDSK    EQU    14            ;SELECT DISK
  167. OPEN    EQU    15            ;OPEN FILE
  168. CLOSE    EQU    16            ;CLOSE FILE
  169. S1ST    EQU    17            ;SEARCH FIRST
  170. SNXT    EQU    18            ;SEARCH NEXT
  171. DELETE    EQU    19            ;DELETE FILE
  172. READ    EQU    20            ;READ RECORD
  173. WRITE    EQU    21            ;WRITE RECORD
  174. CREATE    EQU    22            ;CREATE FILE
  175. RENAME    EQU    23            ;RENAME FILE
  176. ILOG    EQU    24            ;INTERROGATE LOGIN
  177. IDSK    EQU    25            ;INTERROGATE DISK
  178. SETDMA    EQU    26            ;SET DMA ADDRESS
  179. IALLOC    EQU    27            ;INTERROGATE ALLOCATION
  180. WPD    EQU    28            ;WRITE PROTECT DISK
  181. GROV    EQU    29            ;GET READ/ONLY VECTOR
  182. SFA    EQU    30            ;SET FILE ATTRIBUTES
  183. GADPB    EQU    31            ;GET ADDR OF DPB
  184. SGUSR    EQU    32            ;SET/GET USER CODE
  185. READRR    EQU    33            ;READ RANDOM RECORD
  186. WRITERR    EQU    34            ;WRITE RANDOM RECORD
  187. CFSIZE    EQU    35            ;COMPUTE FILE SIZE
  188. SRR    EQU    36            ;SET RANDOM RECORD
  189. RESDRV    EQU    37            ;RESET DRIVE
  190. WRITERZ    EQU    40            ;WRITE RANDOM WITH ZERO FILL
  191.  
  192. ;    BIOS ENTRY POINTS.
  193. ;      GIVEN AS DISPLACEMENTS FROM WARM BOOT ENTRY POINT WHOSE
  194. ;      ADDRESS IS USUALLY AT LOCATION BOOT+1.
  195. ;      TO COMPUTE DISPLACEMENTS FROM VALUE STORED AT 'BBIOS'
  196. ;      SUBTRACT 'CBOOT'.  EG. DISPLACEMENT FOR WARM BOOT = WBOOT-CBOOT
  197.  
  198. CBOOT    EQU    -0003H            ;COLD BOOT
  199. WBOOT    EQU    0000H            ;WARM BOOT
  200. CONST    EQU    0003H            ;CONSOLE STATUS
  201. CONIN    EQU    0006H            ;CONSOLE INPUT
  202. CONOUT    EQU    0009H            ;CONSOLE OUTPUT
  203. LSTOUT    EQU    000CH            ;LIST OUTPUT
  204. PUNOUT    EQU    000FH            ;PUNCH OUTPUT
  205. RDRIN    EQU    0012H            ;READER INPUT
  206. HOME    EQU    0015H            ;HOME DISK
  207. SETDSK    EQU    0018H            ;SET (SELECT) DISK DRIVE
  208. SETTRK    EQU    001BH            ;SET TRACK NUMBER
  209. SETSEC    EQU    001EH            ;SET SECTOR NUMBER
  210. SDMA    EQU    0021H            ;SET DMA ADDRESS
  211. BREAD    EQU    0024H            ;READ SELECTED SECTOR
  212. BWRITE    EQU    0027H            ;WRITE SELECTED SECTOR
  213. BLSTST    EQU    002AH            ;CHECK LIST DEVICE STATUS
  214. BSECTRN    EQU    002DH            ;SECTOR TRANSLATE ROUTINE
  215. BFMT    EQU    0030H            ;FORMAT
  216. BRDTRK    EQU    0033H            ;READ TRACK
  217. BWRTRK    EQU    0036H            ;WRITE TRACK
  218. BWPC    EQU    0039H            ;WRITE PROTECT CHECK
  219. BCBD    EQU    003CH            ;CLEAR BUFFERS FOR DRIVE
  220.  
  221. ;    BIOS WRITE TYPES
  222.  
  223. BWRNOR    EQU    0            ;NORMAL WRITE
  224. BWRDIR    EQU    1            ;WRITE TO A DIRECTORY SECTOR
  225. BRWUA1    EQU    2            ;WRITE TO 1ST SECTOR OF UNALLOC BLOCK
  226.  
  227. ;    FILE CONTROL BLOCK
  228.  
  229.     ORG    0
  230. FCBDN    RB    1            ;DISK NAME
  231. FCBFN    RB    8            ;FILE NAME
  232. FCBFNL    EQU    8            ;FILE NAME LENGTH
  233. FCBFT    RB    3            ;FILE TYPE
  234. FCBFTL    EQU    3            ;FILE TYPE LENGTH
  235. FCBRO    EQU    FCBFT+0            ;R/O FLAG
  236. FCBROF    EQU    10000000B        ; R/O FLAG VALUE
  237. FCBSYS    EQU    FCBFT+1            ;SYS FLAG
  238. FCBSYSF    EQU    10000000B        ; SYS FLAG VALUE
  239. FCBEX    RB    1            ;EXTENT
  240.     RB    1
  241. FCBRWF    RB    1            ;R/W FLAG
  242. FCBRWFF EQU    10000000B        ; R/W FLAG VALUE
  243. FCBRC    RB    1            ;RECORD COUNT
  244. FCBDM    RB    16            ;DISK ALLOCATION MAP
  245. FCBNR    RB    1            ;NEXT RECORD TO BE READ OR WRITTEN
  246. FCBLS    EQU    33            ;FCB LENGTH FOR SEQUENTIAL I/O
  247. FCBRR    RB    3            ;RANDOM RECORD POINTER
  248. FCBLR    EQU    36            ;FCB LENGTH FOR RANDOM I/O
  249.  
  250.  
  251.  
  252. ;**    CHARACTER I/O TABLE DEFINITIONS
  253. ;
  254.  
  255.     ORG    0
  256.  
  257. ;    TABLE
  258.  
  259. CIOTBL    RB    0
  260.  
  261. CIOBP    RB    1            ;BASE PORT
  262. CIOBR    RW    1            ;BAUD RATE
  263. CIOF1    RB    1            ;FLAG BYTE 1
  264. CIOF2    RB    1            ;FLAG BYTE 2
  265. CIOIM    RB    1            ;INPUT READY MASK
  266. CIOIPM    RB    1            ;INPUT READY POLARITY MASK
  267. CIOOM    RB    1            ;OUTPUT READY MASK
  268. CIOOPM    RB    1            ;OUTPUT READY POLARITY MASK
  269. CIOECNT    RB    1            ;# OF CHARACTERS BEFORE SENDING <ETX>
  270. CIOECTR    RB    1            ;CHARACTER COUNTER FOR SENDING <ETX>
  271. CIONCHR    RB    1            ;SEND NULLS AFTER THIS CHARACTER
  272. CIONCNT    RB    1            ;# OF NULLS TO SEND
  273. CIONCTR    RB    1            ;NULL COUNTER
  274. CIOVAL1    RB    1            ;DEVICE DEPENDANT VALUE 1
  275. CIOVAL2    RB    1            ;DEVICE DEPENDANT VALUE 2
  276. CIOVAL3    RB    1            ;DEVICE DEPENDANT VALUE 3
  277. CIOVAL4    RB    1            ;DEVICE DEPNEDANT VALUE 4
  278. CIOVAL5    RB    1            ;DEVICE DEPENDANT VALUE 5
  279. CIOVAL6    RB    1            ;DEVICE DEPENDANT VALUE 6
  280. CIOVAL7    RB    1            ;DEVICE DEPENDANT VALUE 7
  281. CIOVAL8    RB    1            ;DEVICE DEPENDANT VALUE 8
  282. CIOIN    RW    1            ;ADDRESS OF DEVICE INIT ROUTINE
  283. CIOIS    RW    1            ;ADDRESS OF INPUT INPUT STATUS ROUTINE
  284. CIOID    RW    1            ;ADDRESS OF INPUT DATA ROUTINE
  285. CIOOS    RW    1            ;ADDRESS OF INPUT OUTPUT STATUS ROUTINE
  286. CIOOD    RW    1            ;ADDRESS OF OUTPUT DATA ROUTINE
  287.  
  288.     IF    ASM86
  289. CIOTBLL    EQU    OFFSET $-OFFSET CIOTBL    ;LENGTH OF CIO TABLE
  290.     ENDIF
  291.     IF    NOT ASM86
  292. CIOTBLL    EQU    $-CIOTBL        ;LENGTH OF CIO TABLE
  293.     ENDIF
  294.  
  295. ;    FLAG BYTE 1
  296.  
  297. CIOSPI    EQU    00000001B        ;STRIP PARITY BIT ON INPUT
  298. CIOSPO    EQU    00000010B        ;STRIP PARITY BIT ON OUTPUT
  299. CIOMLI    EQU    00000100B        ;MAP LOWER CASE ON INPUT
  300. CIOMLO    EQU    00001000B        ;MAP LOWER CASE ON OUTPUT
  301. CIOEAH    EQU    00010000B        ;USE <ETX>/<ACK> HANDSHAKING
  302. CIODCH    EQU    00100000B        ;USE <DC1>/<DC3> HANDSHAKING
  303.  
  304. ;    FLAG BYTE 2
  305.  
  306. CIOW4A    EQU    CIOEAH            ;<ETX> SENT, WAITING FOR <ACK>
  307. CIOW4D    EQU    CIODCH            ;WAITING FOR <DC1>
  308.  
  309.  
  310.  
  311. ;**    DEFINITION OF LOCATIONS AT THE HEAD OF THE BIOS FOR CP/M-85
  312. ;
  313. ;  * * *   N O T E   * * *
  314. ;
  315. ;    IF THE BIOS IS ALTERED, THEN THIS FILE MUST ALSO BE UPDATED.
  316. ;
  317.  
  318. BVERSN    EQU    101            ;VERSION # FOR CURRENT BIOS
  319.                     ; USE THIS EQUATE IN USER PROGRAMS
  320.                     ;  THAT WISH TO KNOW VERSION #
  321.                     ;   THEY WERE ASSEMBLED FOR
  322. BREVSN    EQU    ' '            ;REVISION LETTER
  323.  
  324. BMO    EQU    03            ;DATE
  325. BDY    EQU    10
  326. BYR    EQU    83
  327.  
  328. NDRIVES    EQU    6            ;MAXIMUM NUMBER OF DRIVE TABLES
  329.  
  330. ;
  331.  
  332.     ORG    0042H            ;SKIP BIOS JUMP VECTOR CODE
  333.  
  334. BIOSVER    RB    1            ;BIOS VERSION
  335. DEFIOB    RB    1            ;DEFAULT I/O BYTE
  336.  
  337. MODE    RB    1            ;MODE FLAGS BYTE
  338.  
  339. BSIZE    RB    1            ;BIOS SIZE IN PAGES
  340. BEND    RW    1            ;ENDING ADDR OF BIOS + 1
  341. HECNT    RW    1            ;HARD ERROR COUNT (SINCE COLD BOOT)
  342. SECNT    RW    1            ;SOFT ERROR COUNT (SINCE COLD BOOT)
  343. NDISKS    RB    1            ;NUMBER OF DISK POSSIBLE IN THIS BIOS
  344.  
  345. ;    AUTO EXEC COMMAND BUFFERS
  346.  
  347. AUTOCBC    RB    41            ;COLD BOOT AUTO COMMAND
  348. AUTOWBC    RB    41            ;WARM BOOT AUTO COMMAND
  349.  
  350. ;  CHARACTER I/O TABLES
  351.  
  352. CRTTBL    RB    CIOTBLL            ;CRT: (KEYBOARD/DISPLAY)
  353. SERATBL    RB    CIOTBLL            ;SERIAL PORT A
  354. SERBTBL    RB    CIOTBLL            ;SERIAL PORT B
  355. PPRTTBL    RB    CIOTBLL            ;PARALLEL PRINTER PORT
  356. DUMMYTBL RB    CIOTBLL            ;DUMMY UNIT
  357.  
  358. ;    DISK PARAMETER ENTRY TABLES
  359.  
  360. DPEBASE    RB    0            ;START OF DISK PARAMETER ENTRY TABLES
  361.  
  362.  
  363.  
  364. ;**    SOFTWARE BOOT CODE DEFINITIONS
  365. ;
  366.  
  367. SBCSBC    EQU    0        ;LOGICAL SECTOR # OF SBC
  368.  
  369.     ORG    0
  370. SBCJMP    RB    3        ;JUMP TO SOFTWARE BOOT CODE
  371. SBCVER    RB    1        ;SOFTWARE BOOT CODE VERSION NUMBER
  372. SBCREV    RB    1        ;SOFTWARE BOOT CODE REVISION NUMBER
  373. SBCDBS    RB    27        ;DEFAULT BOOT STRING
  374. SBCBSA    RB    3        ;SECTOR ADDR OF BAD SECTOR TABLE A
  375. SBCBSB    RB    3        ;SECTOR ADDR OF BAD SECTOR TABLE B
  376. SBCSBA    RB    3        ;SECTOR ADDR OF SUPER BLOCK A
  377. SBCSBB    RB    3        ;SECTOR ADDR OF SUPER BLOCK B
  378. SBCSSZ    RW    1        ;SECTOR SIZE
  379. SBCSPT    RW    1        ;SECTORS PER TRACK
  380. SBCTPC    RW    1        ;TRACKS PER CYLINDER
  381. SBCCPV    RW    1        ;CYLINDERS PER VOLUME
  382. SBCSPS    RW    1        ;SECTORS PER REGION
  383. SBCVSZ    RB    3        ;VOLUME SIZE (SECTORS PER VOLUME)
  384. SBCNSL    RB    1        ;NUMBER OF REGIONS - 1
  385. SBCCSA    RW    1        ;CHECKSUM: SUPER BLOCK A
  386. SBCCSB    RW    1        ;CHECKSUM: SUPER BLOCK B
  387. SBCCBA    RW    1        ;CHECKSUM: BAD SECTOR TABLE A
  388. SBCCBB    RW    1        ;CHECKSUM: BAD SECTOR TABLE B
  389. SBCSDP    RB    12        ;SET DRIVE PARAMETERS
  390. SBCFUS    RB    3        ;FIRST USER SECTOR NUMBER
  391. SBCDATE    RB    6        ;DATE PARTITIONED
  392. SBCCRC    RW    1        ;CRC OF SBC (ASSUMIN SBCCRC=0)
  393.     RB    39        ;RESERVED
  394.  
  395. SBCLEN    EQU    0080H        ;SBC LENGTH
  396.  
  397. ;  SUPER BLOCK DEFINITIONS
  398.  
  399. SPBNE    EQU    16        ;NUMBER OF ENTRIES
  400.  
  401.     ORG    0
  402. SPBPNL    EQU    16        ;MAXIMUM LENGTH OF PARTITION NAME
  403. SPBPN    RB    SPBPNL        ;PARTITION NAME
  404. SPBOSL    EQU    10        ;MAXIMUM LENGTH OF OS NAME
  405. SPBOS    RB    SPBOSL        ;OS NAME
  406. SPBFLG    RB    1        ;FLAG BYTE
  407. SPBFSN    RB    3        ;FIRST SECTOR # OF PARTITION
  408.                 ;  (LOW,MID,HIGH)
  409. SPBPEL    EQU    30        ;LENGTH OF ENTRY
  410.  
  411. ;  SUPER BLOCK FLAG BYTE
  412.  
  413. SPBFPNF    EQU    10000000B    ;PARTITION NOT FORMATTED
  414.  
  415. ;  BAD SECTOR TABLE
  416.  
  417. SBCBEL    EQU    3        ;LENGTH OF ENTRY
  418.  
  419.  
  420.  
  421. ;**    Z207 EQUATES
  422. ;
  423.  
  424. ;    PORT ASSIGNMENTS
  425.  
  426. FDBASE    EQU    0B0H        ;BASE PORT ADDRESS
  427. FDCMD    EQU    FDBASE        ;1797 COMMAND REGISTER
  428. FDSTA    EQU    FDBASE        ;     STATUS REGISTER
  429. FDTRK    EQU    FDBASE+1    ;     TRACK REGISTER
  430. FDSEC    EQU    FDBASE+2    ;     SECTOR REGISTER
  431. FDDAT    EQU    FDBASE+3    ;     DATA REGISTER
  432. FDCON    EQU    FDBASE+4    ;DISK CONTROL PORT
  433. FDAS    EQU    FDBASE+5    ;AUX STATUS PORT
  434.  
  435. ;    COMMANDS
  436.  
  437. FDCRST    EQU    000H        ;RESTORE
  438. FDCSEK    EQU    010H        ;SEEK
  439. FDCSTP    EQU    020H        ;STEP
  440. FDCSTI    EQU    040H        ;STEP IN
  441. FDCSTO    EQU    060H        ;STEP OUT
  442. FDCRDS    EQU    080H        ;READ SECTOR
  443. FDCWRS    EQU    0A0H        ;WRITE SECTOR
  444. FDCRDA    EQU    0C0H        ;READ ADDRESS
  445. FDCRDT    EQU    0E0H        ;READ TRACK
  446. FDCWRT    EQU    0F0H        ;WRITE TRACK
  447. FDCFI    EQU    0D0H        ;FORCE INTERRUPT
  448.  
  449. ;    TYPE 1 COMMAND FLAGS
  450.  
  451. FDFUTR    EQU    00010000B    ;UPDATE TRACK REGISTER
  452. FDFHLB    EQU    00001000B    ;HEAD LOAD AT BEGINNING
  453. FDFVRF    EQU    00000100B    ;VERIFY FLAGS
  454.  
  455. ;    TYPE 1 COMMAND STEP RATE FLAGS
  456.  
  457. FDFSRM    EQU    00000011B    ;STEP RATE MASK
  458. FDFS6    EQU    00000000B    ;STEP RATE  6(3) MS
  459. FDFS12    EQU    00000001B    ;          12(6)
  460. FDFS20    EQU    00000010B    ;          20(10)
  461. FDFS30    EQU    00000011B    ;          30(15)
  462.  
  463. ;    TYPE 2&3 COMMAND FLAGS
  464.  
  465. FDFMRF    EQU    00010000B    ;MULTIPLE RECORD FLAG
  466. FDFSLF    EQU    00001000B    ;SECTOR LENGTH FLAG
  467. FDFDLF    EQU    00000100B    ;30 MS DELAY
  468. FDFSS1    EQU    00000010B    ;SELECT SIDE 1
  469. FDFDDM    EQU    00000001B    ;DELETED DATA MARK
  470.  
  471. ;    TYPE 4 COMMAND FLAGS
  472.  
  473. FDFINI    EQU    00000000B    ;TERMINATE WITH NO INTERRUPT
  474. FDFII0    EQU    00000001B    ;NOT READY TO READY TRANSITION
  475. FDFII1    EQU    00000010B    ;READY TO NOT READY TRANSITION
  476. FDFII2    EQU    00000100B    ;INDEX PULSE
  477. FDFII3    EQU    00001000B    ;IMMEDIATE INTERRUPT
  478.  
  479. ;    STATUS FLAGS
  480.  
  481. FDSNRD    EQU    10000000B    ;NOT READY
  482. FDSWPV    EQU    01000000B    ;WRITE PROTECT VIOLATION
  483. FDSHLD    EQU    00100000B    ;HEAD IS LOADED
  484. FDSRTE    EQU    00100000B    ;RECORD TYPE
  485. FDSWTF    EQU    00100000B    ;WRITE FAULT
  486. FDSSEK    EQU    00010000B    ;SEEK ERROR
  487. FDSRNF    EQU    00010000B    ;RECORD NOT FOUND
  488. FDSCRC    EQU    00001000B    ;CRC ERROR
  489. FDSTK0    EQU    00000100B    ;FOUND TRACK 0
  490. FDSLDT    EQU    00000100B    ;LOST DATA
  491. FDSIND    EQU    00000010B    ;INDEX HOLE
  492. FDSDRQ    EQU    00000010B    ;DRQ
  493. FDSBSY    EQU    00000001B    ;BUSY
  494.  
  495. ;    INFO RETURNED BY A READ ADDRESS COMMAND
  496.  
  497. FDRATRK    EQU    0        ;TRACK
  498. FDRASID    EQU    1        ;SIDE
  499. FDRASEC    EQU    2        ;SECTOR
  500. FDRASL    EQU    3        ;SECTOR LENGTH
  501. FDRACRC    EQU    4        ;2 BYTE CRC
  502. FDRAL    EQU    6        ;LENGTH OF READ ADDRESS INFO
  503.  
  504. ;    DISK HEADER SECTOR LENGTH VALUES
  505.  
  506. FDSL128    EQU    0        ;SECTOR LENGTH 128
  507. FDSL256    EQU    1        ;SECTOR LENGTH 256
  508. FDSL512    EQU    2        ;SECTOR LENGTH 512
  509. FDSL1K    EQU    3        ;SECTOR LENGTH 1024
  510.  
  511. ;    CONTROL REGISTER FLAGS
  512.  
  513. CONDS    EQU    00000011B    ;DRIVE SELECT BITS
  514. CONDS8    EQU    00000100B    ;0=5 1/4" , 1=8"
  515. CONDSEN    EQU    00001000B    ;DRIVE SELECT ENABLE
  516. CONPC    EQU    00010000B    ;WRITE PRE-COMPENSATION
  517.                 ; 5 1/4"  0=YES , 1=NO
  518.                 ; 8"  0=ALL TRACKS , 1=TRACKS 44-76
  519. CON5FS    EQU    00100000B    ;5 1/4" FAST STEP
  520. CONWE    EQU    01000000B    ;ENABLE WAIT FOR DRQ OR IRQ
  521. CONSD    EQU    10000000B    ;ENABLE SINGLE DENSITY
  522.  
  523. ;    AUXILARY STATUS REGISTER FLAGS
  524.  
  525. ASIRQ    EQU    00000001B    ;1797 INTERRUPT REQUEST
  526. ASMO    EQU    00000010B    ;5 1/4" MOTOR ON
  527. AS96T    EQU    00001000B    ;5 1/4" DRIVES ARE 96TPI
  528. AS5PC    EQU    00010000B    ;5 1/4" DRIVES NEED WRITE PRE-COMPENSATION
  529. AS2S    EQU    01000000B    ;SELECTED 8" DRIVE CONTAINS 2 SIDED MEDIA
  530. ASDRQ    EQU    10000000B    ;1797 DRQ
  531.  
  532. ;    MISCELLANEOUS VALUES
  533.  
  534. NTRKS37    EQU    40        ;# TRACKS SINGLE DENSITY 5 1/4" (48 TPI)
  535. NTRKD37    EQU    80        ;# TRACKS DOUBLE DENSITY 5 1/4" (96 TPI)
  536. NTRK837    EQU    77        ;NUMBER OF TRACKS 8"
  537. NSBT37    EQU    52        ;NUMBER OF CP/M RECORDS TO BE LOADED AT BOOT
  538.  
  539.  
  540.  
  541. ;**    Z217 EQUATES
  542. ;
  543.  
  544. WINSPT    EQU    18            ;# PHYSICAL SECTORS PER TRACK
  545. WICSZ    EQU    512            ;CELL SIZE USED
  546.  
  547. ;*    PORT ASSIGNMENTS
  548.  
  549. WIPBASE    EQU    0AEH            ;BASE PORT
  550. WIPCMD    EQU    WIPBASE+0        ; COMMAND
  551. WIPSTAT    EQU    WIPBASE+0        ; HARDWARE STATUS
  552. WIPRES    EQU    WIPBASE+1        ; RESET
  553. WIPINTA    EQU    WIPBASE+1        ; INTERRUPT ACKNOWLEDGE/HARDWARE STATUS
  554.  
  555. ;*    HARDWARE STATUS REGISTER
  556.  
  557. WISINT    EQU    10000000B        ;INTERRUPT PENDING
  558. WISBUSY    EQU    01000000B        ;BUSY
  559. WISBM    EQU    00100000B        ;BURST MODE
  560. WISTMA    EQU    00010000B        ;TMA IN PROGRESS
  561. WISERR    EQU    00001000B        ;ERROR
  562. WISIERR    EQU    00000100B        ;IMMEDIATE MODE ERROR
  563. WISPAUS    EQU    00000010B        ;PAUSED
  564. WISDONE    EQU    00000001B        ;DONE
  565.  
  566. ;*    DIRECT MODE COMMANDS
  567.  
  568. WISETUP    EQU    08H            ;SETUP
  569. WIEXEC    EQU    10H            ;EXECUTE
  570. WIPAUS    EQU    18H            ;PAUSE
  571. WICONT    EQU    20H            ;CONTINUE
  572.  
  573. ;*    CONTROL BLOCK COMMANDS
  574.  
  575. WIRECAL    EQU    00H            ;RECALIBRATE
  576. WISTAT    EQU    01H            ;STATUS
  577. WIWRL    EQU    10H            ;WRITE LOGICAL
  578. WIRDL    EQU    11H            ;READ LOGICAL
  579. WISEKL    EQU    13H            ;SEEK LOGICAL
  580. WIFMTD    EQU    20H            ;FORMAT DRIVE
  581. WIFMTT    EQU    21H            ;FORMAT TRACK
  582. WISDP    EQU    22H            ;SET DRIVE PARAMETERS
  583. WIWRA    EQU    30H            ;WRITE ABSOLUTE
  584. WIRDA    EQU    31H            ;READ ABSOLUTE
  585. WISEKA    EQU    33H            ;SEEK ABSOLUTE
  586.  
  587. ;*    FORMAT OF COMMANDS
  588.  
  589. ;        TYPE 0 & 1
  590.  
  591.     ORG    0
  592. WI01BLK    RB    0
  593. WI01OP    RB    1            ;COMMAND OP CODE
  594. WI01DHS    RB    1            ;BIT 7-5 -- DRIVE SELECT
  595.                     ;    4-0 -- HIGH BYTE OF LOG SECTOR #
  596. WI01D    EQU    11100000B        ;  DRIVE SELECT MASK
  597. WI01HS    EQU    00011111B        ;  HIGH BYTE OF LOG SECTOR # MASK
  598. WI01MS    RB    1            ;MIDDLE BYTE OF LOGICAL SECTOR #
  599. WI01LS    RB    1            ;LOW BYTE OF LOGICAL SECTOR #
  600. WI01SC    RB    1            ;SECTOR COUNT
  601. WI01HT    RB    1            ;HIGH BYTE OF DATA TMA ADDRESS
  602. WI01MT    RB    1            ;MIDDLE BYTE OF DATA TMA ADDRESS
  603. WI01LT    RB    1            ;LOW BYTE OF DATA TMA ADDRESS
  604. WI01HN    RB    1            ;HIGH BYTE OF NEXT COMMAND ADDRESS
  605. WI01MN    RB    1            ;MIDDLE BYTE OF NEXT COMMAND ADDRESS
  606. WI01LN    RB    1            ;LOW BYTE OF NEXT COMMAND ADDRESS
  607. WI01FLG    RB    1            ;FLAGS
  608. WI01EEC    RB    1            ;ERROR CODE
  609. WI01EDH    RB    1            ;BIT 7-5 -- DRIVE SELECT
  610.                     ;    4-0 -- HIGHT BYTE OF LOG SECTOR #
  611. WI01ED    EQU    11100000B        ;  ERROR DRIVE SELECT MASK
  612. WI01EHS    EQU    00011111B        ;  ERROR HIGH BYTE OF LOG SECTOR # MASK
  613. WI01EMS    RB    1            ;ERROR MIDDLE BYTE OF LOGICAL SECTOR #
  614. WI01ELS    RB    1            ;ERROR LOW BYTE OF LOGICAL SECTOR #
  615.     IF    ASM86
  616. WI01BKL    EQU    OFFSET $ - OFFSET WI01BLK
  617.     ENDIF
  618.     IF    NOT ASM86
  619. WI01BKL    EQU    $-WI01BLK
  620.     ENDIF
  621.     IF    WI01BKL NE 16
  622. %:    TYPE 0 & 1 COMMAND BLOCK IS WRONG LENGTH
  623.     ENDIF
  624.  
  625. ;        TYPE 2
  626.  
  627.     ORG    0
  628. WI2BLK    RB    0
  629. WI2OP    RB    1            ;COMMAND OP CODE
  630. WI2DH    RB    1            ;BIT 7-5 -- DRIVE SELECT
  631.                     ;    2-0 -- (MAX) HEAD #
  632. WI2D    EQU    11100000B        ;  DRIVE SELECT MASK
  633. WI2H    EQU    00000111B        ;  HEAD # MASK
  634. WI2HMC    RB    1            ;HIGH BYTE OF MAX CYLINDER #
  635. WI2LMC    RB    1            ;LOW BYTE OF MAX CYLINDER #
  636. WI2HRWC    RB    1            ;HIGH BYTE OF RWC CYLINDER #
  637. WI2LRWC    RB    1            ;LOW BYTE OF RWC CYLINDER #
  638. WI2HPC    RB    1            ;HIGH BYTE OF PRE-COMP CYLINDER #
  639. WI2LPC    RB    1            ;LOW BYTE OF PRE-COMP CYLINDER #
  640. WI2SR    RB    1            ;STEP RATE (LSB = 20uS)
  641. WI2ECC    RB    1            ;ECC SPAN
  642. WI2CSIF    RB    1            ;BIT 6   -- CELL SIZE
  643.                     ;    4-0 -- INTERLEAVE FACTOR
  644. WI2CS    EQU    01000000B        ;  CELL SIZE MASK
  645. WI2CS5    EQU    00000000B        ;    CELL SIZE =  512 BYTES/LOG SECTOR
  646. WI2CS1K    EQU    01000000B        ;    CELL SIZE = 1024 BYTES/LOG SECTOR
  647. WI2IF    EQU    00011111B        ;  INTERLEAVE FACTOR MASK
  648. WI2FC    RB    1            ;FILL CHARACTER
  649. WI2EEC    RB    1            ;ERROR CODE
  650. WI2EHS    RB    1            ;BIT 7-5 -- ERROR HEAD #
  651.                     ;    4-0 -- ERROR SECTOR #
  652. WI2EH    EQU    11100000B        ;  ERROR HEAD # MASK
  653. WI2ES    EQU    00011111B        ;  ERROR SECTOR # MASK
  654. WI2EHC    RB    1            ;ERROR HIGH BYTE OF CYLINDER #
  655. WI2ELC    RB    1            ;ERROR LOW BYTE OF CYLINDER #
  656.     IF    ASM86
  657. WI2BLKL    EQU    OFFSET $ - OFFSET WI2BLK
  658.     ENDIF
  659.     IF    NOT ASM86
  660. WI2BLKL EQU    $-WI2BLK
  661.     ENDIF
  662.     IF    WI2BLKL NE 16
  663. %:    TYPE 2 COMMAND BLOCK IS WRONG LENGTH
  664.     ENDIF
  665.  
  666. ;        TYPE 3
  667.  
  668.     ORG    0
  669. WI3BLK    RB    0
  670. WI3OP    RB    1            ;COMMAND OP CODE
  671. WI3DH    RB    1            ;BIT 7-5 -- DRIVE SELECT
  672.                     ;    2-0 -- HEAD #
  673. WI3D    EQU    11100000B        ;  DRIVE SELECT MASK
  674. WI3H    EQU    00000111B        ;  HEAD # MASK
  675. WI3HC    RB    1            ;HIGH BYTE OF CYLINDER #
  676. WI3LC    RB    1            ;LOW BYTE OF CYLINDER #
  677. WI3S    RB    1            ;SECTOR #
  678. WI3HT    RB    1            ;HIGH BYTE OF DATA TMA ADDRESS
  679. WI3MT    RB    1            ;MIDDLE BYTE OF DATA TMA ADDRESS
  680. WI3LT    RB    1            ;LOW BYTE OF DATA TMA ADDRESS
  681. WI3HN    RB    1            ;HIGH BYTE OF NEXT COMMAND ADDRESS
  682. WI3MN    RB    1            ;MIDDLE BYTE OF NEXT COMMAND ADDRESS
  683. WI3LN    RB    1            ;LOW BYTE OF NEXT COMMAND ADDRESS
  684. WI3FLG    RB    1            ;FLAGS
  685. WI3EEC    RB    1            ;ERROR CODE
  686. WI3EHS    RB    1            ;BIT 7-5 -- ERROR HEAD #
  687.                     ;    4-0 -- ERROR SECTOR #
  688. WI3EH    EQU    11100000B        ;  ERROR HEAD # MASK
  689. WI3ES    EQU    00011111B        ;  ERROR SECTOR # MASK
  690. WI3EHC    RB    1            ;ERROR HIGH BYTE OF CYLINDER #
  691. WI3ELC    RB    1            ;ERROR LOW BYTE OF CYLINDER #
  692.     IF    ASM86
  693. WI3BLKL    EQU    OFFSET $ - OFFSET WI3BLK
  694.     ENDIF
  695.     IF    NOT ASM86
  696. WI3BLKL    EQU    $-WI3BLK
  697.     ENDIF
  698.     IF    WI3BLKL NE 16
  699. %:    TYPE 3 COMMAND BLOCK IS WRONG LENGTH
  700.     ENDIF
  701.  
  702. ;        COMMAND BLOCK FLAG BYTE
  703.  
  704. WIFINTE    EQU    10000000B        ;INTERRUPTS ENABLED
  705. WIFBM    EQU    01000000B        ;USE BURST MODE TMA
  706. WIFIPCC    EQU    00100000B        ;IGNORE PAUSE AND CONTINUE COMMANDS
  707. WIFIDR    EQU    00000100B        ;DISABLE RETRIES
  708. WIFDECC    EQU    00000010B        ;DISABLE ECC
  709. WIFCHN    EQU    00000001B        ;CHAIN NEXT COMMAND IMMEDIATELY
  710.  
  711. ;*    FORMAT OF STATUS RETURNED BY 01 COMMAND
  712.  
  713.     ORG    0
  714. WISBLK    RB    0
  715. WISFLG    RB    1            ;FLAG BYTE
  716. WISDR    EQU    00000100B        ;  BIT 2 -- DRIVE READY
  717. WISACC    EQU    00000010B        ;      1 -- ACCESSED
  718. WISSC    EQU    00000001B        ;      0 -- SEEK COMPLETE
  719. WISHMC    RB    1            ;HIGH BYTE OF MAX CYLINDER #
  720. WISLMC    RB    1            ;LOW BYTE OF MAX CYLINDER #
  721. WISHRWC    RB    1            ;HIGH BYTE OF RWC CYLINDER #
  722. WISLRWC    RB    1            ;LOW BYTE OF RWC CYLINDER #
  723. WISHPC    RB    1            ;HIGH BYTE OF PRE-COMP CYLINDER #
  724. WISLPC    RB    1            ;LOW BYTE OF PRE-COMP CYLINDER #
  725. WISHCC    RB    1            ;HIGH BYTE OF CURRENT CYLINDER #
  726. WISLCC    RB    1            ;LOW BYTE OF CURRENT CYLINDER #
  727. WISSR    RB    1            ;STEP RATE (LSB = 20uS)
  728.     RB    1            ;RESERVED
  729. WISIF    RB    1            ;INTERLEAVE FACTOR
  730. WISCS    RB    1            ;CELL SIZE
  731. WISCS5    EQU    1            ;  =  512 BYTES/LOG SECTOR
  732. WISCS1K    EQU    2            ;  = 1024 BYTES/LOG SECTOR
  733. WISMH    RB    1            ;MAX HEAD #
  734. WISFC    RB    1            ;FILL CHARACTER
  735.     RB    1            ;RESERVED
  736.     IF    ASM86
  737. WISBLKL    EQU    OFFSET $ - OFFSET WISBLK
  738.     ENDIF
  739.     IF    NOT ASM86
  740. WISBLKL    EQU    $-WISBLK
  741.     ENDIF
  742.     IF    WISBLKL NE 16
  743. %:    STATUS BLOCK IS WRONG LENGTH
  744.     ENDIF
  745.  
  746. ;*    ERROR CODES
  747.  
  748. WIENE    EQU    00H            ;NO ERROR
  749. WIEDNR    EQU    01H            ;DRIVE NOT READY
  750. WIENSC    EQU    02H            ;NO SEEK COMPLETE
  751. WIENT0    EQU    03H            ;NO TRACK 0
  752. WIENI    EQU    04H            ;NO INDEX
  753. WIENDS    EQU    05H            ;NO DRIVE SELECT
  754. WIEHNF    EQU    10H            ;HEADER ADDRESS MARK NOT FOUND
  755. WIESEK    EQU    11H            ;SEEK ERROR (BAD CYLINDER # IN HEADER)
  756. WIESNF    EQU    12H            ;SECTOR NOT FOUND
  757. WIEECCH    EQU    13H            ;ECC ERROR IN HEADER
  758. WIEDNF    EQU    14H            ;DATA ADDRESS MARK NOT FOUND
  759. WIENECC    EQU    15H            ;NONCORRECTABLE ECC ERROR IN DATA FIELD
  760. WIEECC    EQU    16H            ;CORRECTABLE ECC ERROR IN DATA FIELD
  761. WIEWF    EQU    17H            ;WRITE FAULT
  762. WIEIOP    EQU    20H            ;ILLEGAL OP CODE
  763. WIEIDA    EQU    21H            ;ILLEGAL DISK ADDRESS
  764. WIEFMTP    EQU    22H            ;FORMAT PROTECTED
  765. WIEWRP    EQU    23H            ;WRITE PROTECTED
  766. WIEMISC    EQU    30H            ;MISCELLANEOUS ERROR
  767. WIEDIAG    EQU    40H            ;ERROR DURING DIAGNOSTIC
  768. WIEPNA    EQU    80H            ;PARTION NOT ASSIGNED
  769. WIESNWP    EQU    81H            ;SECTOR NOT WITHIN PARTITION
  770.  
  771. ;*    CP/M RELATED VALUES
  772.  
  773. WIRPS    EQU    WICSZ/128        ;CP/M RECORDS PER SECTOR
  774. WIRPT    EQU    WIRPS*WINSPT        ;CP/M RECORDS PER TRACK
  775. WINST    EQU    1            ;# OF SYSTEM TRACKS
  776. WINSYS    EQU    WINST*WINSPT        ;# SECTORS IN SYSTEM TRACK(S)
  777.  
  778. WIMIN    EQU    1024/WICSZ*64+WINSYS    ;MINIMUM # USEABLE SECTORS
  779. WIMAX    EQU    1024/WICSZ*8*1024+WINSYS ;MAX # USEABLE SECTORS
  780.  
  781.  
  782.  
  783. ;**    DISK PARAMETER TABLE EQUATES
  784. ;
  785.  
  786. ;    DISK PARAMETER ENTRY DESCRIPTION
  787.  
  788.     ORG    0
  789. DPEXLT    RW    1        ;SECTOR TRANSLATE TABLE ADDRESS
  790.     RW    3
  791. DPEDIRB    RW    1        ;DIRECTORY BUFFER ADDRESS
  792. DPEDPB    RW    1        ;DISK PARAMETER BLOCK ADDRESS
  793. DPECSV    RW    1        ;CHECKSUM VECTOR ADDRESS
  794. DPEALV    RW    1        ;ALLOCATION VECTOR ADDRESS
  795. DPEHTH    RB    8        ;HEATH EXTENSIONS
  796. DPEL    EQU    24        ;LENGTH OF DISK PARAMETER ENTRY
  797.  
  798. ;    HEATH EXTENSIONS
  799.  
  800. DPEFLAG    EQU    DPEHTH+0    ;FLAGS
  801. DPETYPE    EQU    11100000B    ;BIT 7-5 = DEVICE TYPE
  802. DPENE    EQU    00000000B    ; NON-EXISTENT
  803. DPEZ207    EQU    00100000B    ; Z207
  804. DPEZ217    EQU    01000000B    ; Z217
  805. DPE48RO    EQU    00010000B    ;BIT 4 -- FOR Z207
  806.                 ;  48 TPI MEDIA IN 96 TPI DRIVE (R/O)
  807. DPE96T    EQU    00001000B    ;BIT 3 -- 0=48 TPI DRIVE  1=96 TPI DRIVE
  808. DPEASGN    EQU    00001000B    ;BIT 3 -- FOR Z217 WINCHESTER DISK
  809.                 ;         0=UNASSIGNED A PARTITION
  810.                 ;         1=ASSIGNED A PARTITION
  811. DPET0SD    EQU    00000100B    ;BIT 2 -- 1=TRACK 0 IS SINGLE DENSITY
  812. DPEDD    EQU    00000010B    ;BIT 1 -- 0=SINGLE DENSITY  1=DOUBLE
  813. DPELSIO    EQU    00000010B    ;BIT 1 -- Z217 LOGICAL SECTOR I/O
  814. DPE2S    EQU    00000001B    ;BIT 0 -- 0=SINGLE SIDED  1=DOUBLE
  815. DPEPRIM    EQU    00000001B    ;BIT 0 -- Z217 PRIMARY DPE FOR UNIT
  816.  
  817. DPEUNIT    EQU    DPEHTH+1    ;UNIT SELECT VALUE
  818. DPERPS    EQU    DPEHTH+2    ;CP/M RECORDS PER PHYSICAL SECTOR
  819. DPERPAB    EQU    DPEHTH+3    ;CP/M RECORDS PER ALLOCATION BLOCK
  820. DPETRK    EQU    DPEHTH+4    ;TRACK COUNTER
  821. DPEUNK    EQU    10000000B    ; TRACK POSITION UNKNOWN
  822. DPELPB    EQU    DPEHTH+4    ;Z217 LOWER PARTITION BOUNDARY (LOG SECTOR #)
  823. DPESEK    EQU    DPEHTH+5    ;MOTOR SPEED AND SEEK SPEED
  824.                 ;BIT 3-0 = SEEK SPEED VALUE
  825. DPEFS    EQU    01000000B    ;BIT 6 = FAST STEP FOR Z207
  826. DPEMO    EQU    10000000B    ;BIT 7 = MOTOR UP TO SPEED FLAG
  827.                 ;  0=1 SEC  1=250 MSEC
  828. DPEUPB    EQU    DPEHTH+6    ;Z217 UPPER PARTITION BOUNDARY + 1
  829. DPEFLG2    EQU    DPEHTH+6    ;2ND FLAG BYTE
  830. DPEHLS    EQU    00000100B    ;BIT 2  DRIVE HAS HEAD LOAD SELONOID
  831. DPEIMG    EQU    00000010B    ;BIT 1  IMAGINARY DRIVE
  832. DPE96TM    EQU    00000001B    ;BIT 0  0=48 TPI MEDIA  1=96 TPI MEDIA
  833. DPELUN    EQU    DPEHTH+7    ;LAST LOGICAL UNIT MOUNTED
  834. DPELOG    EQU    11110000B    ; CP/M LOGICAL DRIVE NAME FOR THIS ENTRY
  835. DPEREAL    EQU    00001111B    ; FOR IMAGINARY DRIVE, LOGICAL DRIVE NAME
  836.                 ;  FOR CORRESPONDING REAL DRIVE
  837. DPEMNT    EQU    00001111B    ; FOR REAL DRIVE, LOGICAL DRIVE NAME FOR
  838.                 ;  CURRENLY MOUNTED DISK
  839.  
  840. DPEHL    EQU    8        ;LENGTH OF HEATH EXTENSION
  841.  
  842. ;    DISK PARAMETER BLOCK
  843.  
  844.     ORG    0
  845. DPBSPT    RW    1        ;SECTORS PER TRACK
  846. DPBBSH    RB    1        ;BLOCK SHIFT FACTOR
  847. DPBBLM    RB    1        ;BLOCK MASK
  848. DPBEXM    RB    1        ;EXTENT MASK
  849. DPBDSM    RW    1        ;TOTAL # OF BLOCKS - 1
  850. DPBDRM    RW    1        ;# OF DIRECTORY ENTRIES - 1
  851. DPBAL0    RB    1        ;INITIAL AL0 VALUE
  852. DPBAL1    RB    1        ;INITIAL AL1 VALUE
  853. DPBCKS    RW    1        ;SIZE OF DIRECTORY CHECK VECTOR
  854. DPBOFF    RW    1        ;NUMBER OF SYSTEM TRACKS
  855. DPBL    EQU    15        ;LENGTH OF DISK PARAMETER BLOCK
  856.  
  857.  
  858.  
  859. ;**    HEATH CP/M DISK LABEL DEFINITIONS
  860. ;
  861. ;  DISK LABELS ARE USED ON MOST DATA DISKS AND
  862. ;    ON ALL SYSGEN'ED (BOOTABLE) DISKS.
  863. ;  TO MAINTAIN COMPATIBILITY WITH OLDER RELEASES OF CP/M,
  864. ;    THE 5 1/4" HARD SECTOR AND 8" SOFT SECTOR FLOPPY DATA DISKS
  865. ;    DO NOT USE LABELS.
  866. ;
  867. ;  THE LABEL RESIDES ON THE 1ST SECTOR OF TRACK 0, SIDE 0.
  868. ;
  869. ;  AT THE END OF THE LABEL IS A CHECKSUM.
  870. ;    FOR VERSION # 0 OF THE LABEL, THE CHECKSUM IS CALCULATED
  871. ;      BY ADDING UP THE VALUES IN THE LABEL PRIOR TO THE CHECKSUM SLOT
  872. ;      A BYTE AT A TIME, THEN TAKING THE ONE'S COMPLEMENT OF THE SUM.
  873. ;
  874.  
  875. LABVER    EQU    0        ;CURRENT FORM # FOR LABEL
  876.  
  877. LABBUF    EQU    0        ;SLOT FOR JUMP INSTRUCTION AROUND LABEL
  878. BDTYPE    EQU    LABBUF+3    ;SLOT FOR DRIVE TYPE
  879.  
  880. LABEL    EQU    LABBUF+4
  881. LABTYP    EQU    LABEL+0        ;SLOT FOR LABEL TYPE
  882. LABHTH    EQU    LABTYP+1    ;SLOT FOR HEATH EXTENSIONS TO DPE
  883. LABDPB    EQU    LABHTH+DPEHL    ;SLOT FOR DISK PARAMETER BLOCK
  884. LABCS    EQU    LABDPB+DPBL    ;CHECKSUM
  885.  
  886. LABLEN    EQU    LABCS-LABEL+1    ;LABEL LENGTH
  887.  
  888.  
  889.  
  890. ;**    ASCII CONTROL CHARACTER EQUATES
  891. ;
  892.  
  893. CTLC    EQU    003H            ;CONTROL-C
  894. CTLQ    EQU    011H            ;CONTROL-Q
  895. CTLS    EQU    013H            ;CONTROL-S
  896. CTLZ    EQU    01AH            ;CONTROL-Z
  897.  
  898. ACK    EQU    006H            ;<ACK>
  899. BELL    EQU    007H            ;BELL
  900. CPMEOF    EQU    CTLZ            ;ASCII FILE EOF MARK
  901. CPMEOM    EQU    '$'            ;CP/M END-OF-MESSAGE SYMBOL
  902. CR    EQU    00DH            ;CARRIAGE RETURN
  903. ESC    EQU    01BH            ;ESCAPE
  904. ETX    EQU    CTLC            ;<ETX>
  905. DC1    EQU    CTLQ            ;<DC1>
  906. DC3    EQU    CTLS            ;<DC3>
  907. LF    EQU    00AH            ;LINE FEED
  908. NULL    EQU    000H            ;NULL
  909.  
  910.  
  911.     PAGE
  912.     ORG    TPA
  913.  
  914. START    JMP    FORMAT
  915.     DB    'Copyright 1982 @Heath/Zenith'
  916. SIGNON    DB    CR,LF,'CP/M-85 Format Version 2.2.'
  917.     DB    BVERSN/100+'0',(BVERSN/10 MOD 10)+'0',(BVERSN MOD 10)+'0'
  918.     DB    CR,LF,'$'
  919. SIGNON1    DB    CR,LF,'This program is used to initialize a disk.'
  920.     DB    CR,LF
  921.     DB    'All information currently on the disk will be destroyed.'
  922.     DB    CR,LF
  923.     DB    'Is that what you want? (y/n): $'
  924.     DS    40
  925. STACK    EQU    $
  926. FORMAT:    LXI    SP,STACK
  927.  
  928.     MVI    C,PRCONB    ;PRINT ISSUE MESSAGE
  929.     LXI    D,SIGNON
  930.     CALL    BDOS
  931.  
  932.     LHLD    BBIOS        ;Q. CORRECT VERSION OF BIOS
  933.     LXI    D,BIOSVER
  934.     DAD    D
  935.     MOV    A,M
  936.     CPI    BVERSN
  937.     JZ    FMT00        ; BR IF YES
  938.  
  939.     MVI    C,PRCONB
  940.     LXI    D,BADBIOS
  941.     CALL    BDOS
  942.     JMP    BOOT
  943.  
  944. FMT00:    LDA    TBUFF
  945.     CPI    0
  946.     JZ    FMT0        ; NO COMMAND LINE
  947.  
  948.     MVI    A,TRUE
  949.     STA    COMLIN        ;YES THERE IS A COMMAND LINE
  950.     CALL    CLINT        ;CALL COMMAND LINE INTERPRETER/WME
  951.  
  952. FMT0:    QUERY    FMT2
  953.     MVI    C,PRCONB    ;print sign on message. Continue?
  954.     LXI    D,SIGNON1
  955.     CALL    BDOS
  956.  
  957. FMT1:    MVI    C,RDCON        ;Read reply
  958.     CALL    BDOS
  959.  
  960.     CALL    TOUPPER        ;convert character to upper case
  961.  
  962.     CPI    'Y'
  963.     JZ    FMT2        ;Yes continue.
  964.  
  965.     JMP    FMT5
  966.  
  967. FMT2:    COMINP    DRIVID,FMT2A0,FMT20A
  968.  
  969. FMT20A:    MVI    C,PRCONB    ;which drive are we using
  970.     LXI    D,WHICH
  971.     CALL    BDOS
  972.  
  973.     MVI    C,RDCON        ;Read Drive ID
  974.     CALL    BDOS
  975. FMT2A0:    CALL    TOUPPER
  976.     STA    DRIVID        ;SAVE UPPERCASE TRANSLATED VALUE
  977.     STA    DRMSGA
  978.     STA    FPARTD
  979.  
  980.     CPI    'A'        ;Range Check
  981.     JC    FMT2AA
  982.  
  983.     CPI    'Z'+1
  984.     JC    FMT2A
  985.  
  986. FMT2AA:    CPI    CTLC
  987.     JZ    FMT5
  988.  
  989.     MVI    C,PRCONB    ;Error- out of range (A..Z)
  990.     LXI    D,ERRMSG
  991.     CALL    BDOS
  992.     JMP    FMT3B
  993.  
  994.  
  995. FMT2A:    STA    PROMPTA        ;save drive letter in message
  996.     CALL    WKIND        ;go determine drive type
  997.     JNC    FMT2AB        ;BR IF VALID DRIVE TYPE
  998.  
  999.     MVI    C,PRCONB
  1000.     LXI    D,DRMSG
  1001.     CALL    BDOS
  1002.     JMP    FMT3B
  1003.  
  1004.  
  1005. FMT2AB:
  1006.     LDA    DRIVID        ;KEEP TRACK IF SYSTEM DISK REMOVED
  1007.     CPI    'A'
  1008.     JNZ    FMT3
  1009.     MVI    A,1
  1010.     STA    SYSDSK
  1011.  
  1012. FMT3:
  1013.     CALL    DISPATCH    ;FORMAT DISK
  1014.     JC    FMT9
  1015.  
  1016. FMT3B    COMINP    DRIVID,FMT5,FMT3BA    ;EXIT IF SUBMIT JOB
  1017.  
  1018. FMT3BA:    MVI    C,PRCONB
  1019.     LXI    D,AMWMSG    ;any more work
  1020.     CALL    BDOS
  1021.  
  1022.  
  1023. FMT4A    MVI    C,RDCON
  1024.     CALL    BDOS
  1025.  
  1026.     CALL    TOUPPER
  1027.  
  1028.     CPI    'Y'
  1029.     JZ    FMT2
  1030.  
  1031. FMT5:    LDA    SYSDSK        ;Q. WAS SYSTEM DISK INVOLVED
  1032.     ORA    A
  1033.     JZ    BOOT
  1034.  
  1035.     MVI    C,PRCONB
  1036.     LXI    D,LVEMSG
  1037.     CALL    BDOS
  1038.  
  1039.     MVI    C,RDCON
  1040.     CALL    BDOS
  1041.  
  1042.     JMP    BOOT
  1043.  
  1044.  
  1045. FMT9:
  1046.     CALL    FWPC        ;Q. DISK WRITE PROTECTED
  1047.     LXI    D,WPEMSG
  1048.     ORA    A
  1049.     JNZ    FMT9A        ; BR IF YES
  1050.     LXI    D,BMSG
  1051.  
  1052. FMT9A:
  1053.     MVI    C,PRCONB
  1054.     CALL    BDOS
  1055.     JMP    FMT3B
  1056.  
  1057. TOUPPER    CPI    061H        ;is not lower case
  1058.     RC
  1059.     CPI    '{'
  1060.     RNC
  1061.     SUI    020H
  1062.     RET
  1063.  
  1064. ERRMSG:    DB    CR,LF,'OPTION NOT AVAILABLE',CR,LF,BELL,'$'
  1065.  
  1066.  
  1067.     PAGE
  1068. ;**    WKIND - DETERMINES DRIVE TYPE AND SELECTS UNIT
  1069. ;
  1070.  
  1071. WKIND:
  1072.     SUI    'A'        ;GET CP/M DRIVE #
  1073.     MOV    C,A
  1074.     CALL    FSETDSK        ;SELECT DRIVE
  1075.     MOV    A,H        ;Q. SELECT ERROR
  1076.     ORA    L
  1077.     JZ    WKERR        ; BR IF NO DRIVE
  1078.     SHLD    DPEPTR        ;SAVE POINTER TO DPE
  1079.     XCHG
  1080.  
  1081.     LXI    H,DPEFLG2    ;IMAGINARY FLAG
  1082.     DAD    D
  1083.     MOV    A,M
  1084.     STA    FLAG2
  1085.  
  1086.     LXI    H,DPEDPB    ;GET DPB POINTER
  1087.     DAD    D
  1088.     CALL    HLIHL
  1089.     SHLD    DPBPTR
  1090.  
  1091.     LXI    H,DPEHTH    ;GET HEATH FLAGS
  1092.     DAD    D
  1093.     MOV    A,M
  1094.     STA    DRTYPE
  1095.  
  1096.     INX    H        ;GET UNIT SELECT
  1097.     MOV    A,M
  1098.     STA    AIOUNI
  1099.  
  1100.     ORA    A        ;CLEAR CARRY TO INDICATE NO ERROR
  1101.     RET
  1102.  
  1103. WKERR:
  1104.     STC            ;INDICATE ERROR
  1105.     RET
  1106.  
  1107. ;**    FSETDSK - GETS DISK TABLE POINTER IN (HL)
  1108. ;
  1109. ;    ENTRY:    (C)=CP/M DRIVE #
  1110. ;    EXIT:    (HL)=POINTER (IF 0 THEN ERROR)
  1111. ;    USES:    ALL
  1112. ;
  1113.  
  1114. FSETDSK:
  1115.     LHLD    BBIOS
  1116.     LXI    D,SETDSK-CBOOT
  1117.     DAD    D
  1118.     MVI    E,1
  1119.     PCHL
  1120.  
  1121. ;**    FSETTRK - SET CP/M TRACK #
  1122. ;
  1123. ;    ENTRY:    (BC)=DESIRED CP/M TRACK #
  1124. ;    EXIT:    NONE
  1125. ;    USES:    ALL
  1126. ;
  1127.  
  1128. FSETTRK:
  1129.     LHLD    BBIOS
  1130.     LXI    D,SETTRK-CBOOT
  1131.     DAD    D
  1132.     PCHL
  1133.  
  1134. ;**    FSETSEC - SET CP/M SECTOR #
  1135. ;
  1136. ;    ENTRY:    (BC)=DESIRED CP/M SECTOR #
  1137. ;    EXIT:    NONE
  1138. ;    USES:    ALL
  1139. ;
  1140.  
  1141. FSETSEC:
  1142.     LHLD    BBIOS
  1143.     LXI    D,SETSEC-CBOOT
  1144.     DAD    D
  1145.     PCHL
  1146.  
  1147. ;**    FSETDMA - SET DMA
  1148. ;
  1149. ;    ENTRY:    (BC)=DMA
  1150. ;    EXIT:    NONE
  1151. ;    USES:    ALL
  1152. ;
  1153.  
  1154. FSETDMA:
  1155.     LHLD    BBIOS
  1156.     LXI    D,SDMA-CBOOT
  1157.     DAD    D
  1158.     PCHL
  1159.  
  1160. ;**    FREAD - READ CP/M SECTOR
  1161. ;
  1162. ;    ENTRY:    NONE
  1163. ;    EXIT:    (A)=ERROR STATUS
  1164. ;    USES:    ALL
  1165. ;
  1166.  
  1167. FREAD:
  1168.     LHLD    BBIOS
  1169.     LXI    D,BREAD-CBOOT
  1170.     DAD    D
  1171.     PCHL
  1172.  
  1173. ;**    FWRITE - WRITE CP/M SECTOR
  1174. ;
  1175. ;    ENTRY:    (C)=WRITE MODE
  1176. ;    EXIT:    (A)=ERROR STATUS
  1177. ;    USES:    ALL
  1178. ;
  1179.  
  1180. FWRITE:
  1181.     LHLD    BBIOS
  1182.     LXI    D,BWRITE-CBOOT
  1183.     DAD    D
  1184.     PCHL
  1185.  
  1186. ;**    FFORMAT - FORMAT DISK
  1187. ;
  1188. ;    ENTRY:    (C)=VERIFY FLAG (0=NO , 1=YES)
  1189. ;    EXIT:    (A)=STATUS BYTE
  1190. ;    USES:    ALL
  1191. ;
  1192.  
  1193. FFORMAT:
  1194.     LHLD    BBIOS
  1195.     LXI    D,BFMT-CBOOT
  1196.     DAD    D
  1197.     PCHL
  1198.  
  1199. ;**    FWRTRK - WRITE TRACK
  1200. ;
  1201. ;    ENTRY:    NONE
  1202. ;    EXIT:    (A)=ERROR STATUS
  1203. ;    USES:    ALL
  1204. ;
  1205.  
  1206. FWRTRK:
  1207.     LHLD    BBIOS
  1208.     LXI    D,BWRTRK-CBOOT
  1209.     DAD    D
  1210.     PCHL
  1211.  
  1212. ;**    FWPC - WRITE PROTECT CHECK
  1213. ;
  1214. ;    ENTRY:    NONE
  1215. ;    EXIT:    (A)=WRITE PROTECT STATUS (0=NO , 1=YES)
  1216. ;    USES:    ALL
  1217. ;
  1218.  
  1219. FWPC:
  1220.     LHLD    BBIOS
  1221.     LXI    D,BWPC-CBOOT
  1222.     DAD    D
  1223.     PCHL
  1224.  
  1225. ;**    FCBD - CLEAR BUFFER FOR DRIVE
  1226. ;
  1227. ;    ENTRY:    NONE
  1228. ;    EXIT:    NONE
  1229. ;    USES:    ALL
  1230. ;
  1231.  
  1232. FCBD:
  1233.     LHLD    BBIOS
  1234.     LXI    D,BCBD-CBOOT
  1235.     DAD    D
  1236.     PCHL
  1237.  
  1238.     PAGE
  1239. ;
  1240. ;  FORMAT H37.
  1241. ;
  1242.  
  1243. F37:
  1244.     LDA    AIOUNI        ;Q. 5 1/4" DRIVE
  1245.     ANI    CONDS8
  1246.     JNZ    F370        ; BR IF NO
  1247.     MVI    A,'D'        ;  YES - DENSITY IS DOUBLE
  1248.     JMP    F3700A
  1249.  
  1250. F370:    COMINP  CLIDENS,F3700A,F3700
  1251.  
  1252. F3700:    MVI    C,PRCONB
  1253.     LXI    D,WDSDMSG
  1254.     CALL    BDOS
  1255.  
  1256.     MVI    C,RDCON
  1257.     CALL    BDOS
  1258. F3700A:    CALL    TOUPPER
  1259.  
  1260.     MVI    B,0
  1261.     CPI    'S'
  1262.     JZ    F371
  1263.  
  1264.     MVI    B,DPEDD
  1265.     CPI    'D'
  1266.     JZ    F371
  1267.  
  1268.     MVI    C,PRCONB
  1269.     LXI    D,ERRMSG
  1270.     CALL    BDOS
  1271.     JMP    F370
  1272.  
  1273. F371:    MOV    A,B
  1274.     STA    DENSITY
  1275.  
  1276.     LDA    AIOUNI        ;Q. 8" DRIVE
  1277.     ANI    CONDS8
  1278.     JZ    F371A        ; BR IF NOT
  1279.     MVI    A,'2'        ;  YES - SAY DOUBLE SIDED (ACTUAL FORMAT WILL
  1280.     JMP    F371A2        ;        WORK OFF OF INDEX HOLE PLACEMENT)
  1281.  
  1282. F371A:    COMINP    CLISIDS,F371AB,F371AA
  1283.  
  1284. F371AA    MVI    C,PRCONB
  1285.     LXI    D,WSMSG
  1286.     CALL    BDOS
  1287.  
  1288.     MVI    C,RDCON
  1289.     CALL    BDOS
  1290. F371AB    CALL    TOUPPER
  1291.  
  1292. F371A2:
  1293.     MVI    B,0
  1294.     CPI    '1'
  1295.     JZ    F371B
  1296.  
  1297.     MVI    B,DPE2S
  1298.     CPI    '2'
  1299.     JZ    F371B
  1300.  
  1301.     MVI    C,PRCONB
  1302.     LXI    D,ERRMSG
  1303.     CALL    BDOS
  1304.     JMP    F371A
  1305.  
  1306. F371B:
  1307.     MOV    A,B
  1308.     STA    SIDES
  1309.  
  1310.     QUERY    F372
  1311.  
  1312.     MVI    C,PRCONB    ;ASK TO INSERT DISK
  1313.     LXI    D,PROMPT
  1314.     CALL    BDOS
  1315.  
  1316.     MVI    C,PRCONB    ;ASK IF READY
  1317.     LXI    D,PROMPT1
  1318.     CALL    BDOS
  1319.  
  1320.     MVI    C,RDCON
  1321.     CALL    BDOS
  1322.     CPI    CR
  1323.     JNZ    F3748        ; BR IF NOT READY
  1324.  
  1325. F372:
  1326.     CALL    F377        ;FILL IN DPE & DPB
  1327.  
  1328.     XRA    A        ;CLEAR WORK VALUES
  1329.     STA    TRACK
  1330.  
  1331.     MVI    B,NTRK837    ;DETERMINE # CP/M TRACKS
  1332.     LDA    AIOUNI
  1333.     ANI    CONDS8
  1334.     JNZ    F3721
  1335.     MVI    B,NTRKS37
  1336.     LDA    DRTYPE
  1337.     ANI    DPE96T
  1338.     JZ    F3721
  1339.     MVI    B,NTRKD37
  1340. F3721:
  1341.     LDA    SIDES
  1342.     CPI    DPE2S
  1343.     MVI    A,0
  1344.     JNZ    F3722
  1345.     MOV    A,B
  1346. F3722:
  1347.     ADD    B
  1348.     STA    DSKTKS
  1349.  
  1350.     LHLD    DPEPTR        ;FORCE RESTORE BY SETTING TRACK POINTER
  1351.     LXI    B,DPETRK    ; TO UNKNOWN
  1352.     DAD    B
  1353.     MVI    M,DPEUNK
  1354.  
  1355. ;    IF 8" DRIVE AND TRACK 0 / SIDE 0 IS SINGLE DENSITY
  1356. ;    THEN FORMAT TRACK 0 / SIDE 0
  1357.  
  1358.     LDA    AIOUNI        ;Q. 8" DRIVE
  1359.     ANI    CONDS8
  1360.     JZ    F374        ; BR IF NOT
  1361.     LDA    DRTYPE        ;Q. CP/M TRACK 0 SINGLE DENSITY
  1362.     ANI    DPET0SD
  1363.     JZ    F374        ; BR IF NOT
  1364.  
  1365.     LXI    H,F37STBL    ;BUILD TRACK IMAGE
  1366.     CALL    F378
  1367.  
  1368.     CALL    F375        ;FORMAT TRACK
  1369.     ORA    A        ;Q. ERROR
  1370.     JNZ    F3749        ; BR IF ERROR
  1371.  
  1372. ;    FORMAT SURFACE(S).
  1373.  
  1374. F374:
  1375.     LXI    H,F37D2TB    ;DETERMINE WHICH TABLE TO USE
  1376.     LDA    AIOUNI        ; TO BUILD TRACK IMAGE
  1377.     ANI    CONDS8
  1378.     JZ    F3741
  1379.     LXI    H,F37STBL
  1380.     LDA    DENSITY
  1381.     CPI    DPEDD
  1382.     JNZ    F3741
  1383.     LXI    H,F37DTBL
  1384.  
  1385. F3741:
  1386.     CALL    F378        ;BUILD TRACK IMAGE
  1387.  
  1388. F3742:
  1389.     CALL    F375        ;FORMAT TRACK
  1390.     ORA    A        ;Q. ERROR
  1391.     JZ    F3743        ; BR IF NOT
  1392.  
  1393.     CPI    FDSNRD        ;IF NOT READY ERROR ON 8" DRIVE AND TRYING
  1394.     JNZ    F3749        ; TO FORMAT DOUBLE SIDED, THEN SWITCH
  1395.     LDA    AIOUNI        ;  TO SINGLE SIDED AND TRY AGAIN
  1396.     ANI    CONDS8
  1397.     JZ    F3749
  1398.     LDA    TRACK
  1399.     CPI    1
  1400.     JNZ    F3749
  1401.     LDA    SIDES
  1402.     CPI    DPE2S
  1403.     JNZ    F3749
  1404.     XRA    A
  1405.     STA    SIDES
  1406.     JMP    F372
  1407.  
  1408. ;
  1409.  
  1410. F3743:
  1411.     LDA    TRACK        ;Q. ALL TRACKS DONE
  1412.     LXI    H,DSKTKS
  1413.     CMP    M
  1414.     JNZ    F3742        ; BR IF NOT
  1415.  
  1416. ;*    FORM LABEL AND WRITE IT TO TRACK 0 / SECTOR 1 / SIDE 0
  1417.  
  1418.     CALL    WRLAB
  1419.     JC    F3749        ;BR IF ERROR
  1420.  
  1421. ;    ALL DONE.
  1422.  
  1423. F3748:
  1424.     XRA    A
  1425.     RET            ;RETURN INDICATING NO ERRORS
  1426.  
  1427. ;    ERROR
  1428.  
  1429. F3749:
  1430.     STC            ;INDICATE ERROR
  1431.     RET
  1432.  
  1433. ;**    FORMAT TRACK
  1434. ;
  1435.  
  1436. F375:
  1437.     CALL    F378Y        ;SET TRACK/SIDE/SECTOR VALUES IN TRACK IMAGE
  1438.  
  1439.     LDA    TRACK        ;SET DESIRED CP/M TRACK #
  1440.     MOV    C,A
  1441.     MVI    B,0
  1442.     CALL    FSETTRK
  1443.  
  1444.     LXI    B,BUFFER    ;SET DMA
  1445.     CALL    FSETDMA
  1446.  
  1447.     MVI    C,1        ;FORMAT TRACK
  1448.     LDA    FAST
  1449.     ORA    A
  1450.     JZ    F3751
  1451.     MVI    C,0
  1452. F3751:
  1453.     CALL    FFORMAT        ;FORMAT TRACK
  1454.     ORA    A        ;Q. ERROR
  1455.     RNZ            ; RET IF ERROR
  1456.  
  1457.     LXI    H,TRACK        ;BUMP TRACK COUNTER
  1458.     INR    M
  1459.  
  1460.     RET
  1461.  
  1462. ;*    FILL DPE & DPB
  1463.  
  1464. F377:
  1465.     MVI    B,0        ;DETERMINE WHICH TABLE TO USE
  1466.     LDA    AIOUNI
  1467.     ANI    CONDS8
  1468.     JNZ    F3771
  1469.  
  1470.     LDA    DRTYPE
  1471.     ANI    DPE96T
  1472.     JZ    F3772
  1473.     MVI    B,2
  1474.     JMP    F3772
  1475.  
  1476. F3771:
  1477.     MVI    B,4
  1478.     LDA    DENSITY
  1479.     CPI    DPEDD
  1480.     JNZ    F3772
  1481.     MVI    B,6
  1482.  
  1483. F3772:
  1484.     LDA    SIDES
  1485.     CPI    DPE2S
  1486.     JNZ    F3773
  1487.     INR    B
  1488.  
  1489. F3773:
  1490.     MOV    A,B
  1491.     MVI    E,F37TBLL
  1492.     CALL    MUL88
  1493.  
  1494.     LXI    D,F37TBL
  1495.     DAD    D
  1496.     XCHG            ;(DE)=TABLE ADDRESS
  1497.  
  1498.     LHLD    DPEPTR
  1499.     LXI    B,DPEHTH
  1500.     DAD    B
  1501.     XCHG            ;(DE)=DPE POINTER , (HL)=TABLE POINTER
  1502.  
  1503.     LDAX    D        ;DPE FLAG BYTE 1
  1504.     ANI    0FFH-(DPE48RO+DPEDD+DPE2S)
  1505.     ORA    M
  1506.     STAX    D
  1507.  
  1508.     INX    D        ;CP/M RECORDS PER SECTOR
  1509.     INX    D
  1510.     INX    H
  1511.     MOV    A,M
  1512.     STAX    D
  1513.  
  1514.     INX    D        ;CP/M RECORDS PER ALLOCATION BLOCK
  1515.     INX    H
  1516.     MOV    A,M
  1517.     STAX    D
  1518.  
  1519.     INX    D        ;MEDIA TPI
  1520.     INX    D
  1521.     INX    D
  1522.     INX    H
  1523.     LDAX    D
  1524.     ANI    0FFH-DPE96TM
  1525.     ORA    M
  1526.     STAX    D
  1527.  
  1528.     INX    H        ;FILL IN DPB
  1529.     XCHG
  1530.     LHLD    DPBPTR
  1531.     XCHG
  1532.     MVI    B,DPBL
  1533.     CALL    MOVEIT
  1534.  
  1535.     RET
  1536.  
  1537. ;*    BUILD TRACK IMAGE
  1538.  
  1539. F378:
  1540.     MOV    E,M        ;GET TRACK OFFSET
  1541.     INX    H
  1542.     MOV    D,M
  1543.     XCHG
  1544.     SHLD    F37C
  1545.     XCHG
  1546.     INX    H        ;GET LENGTH OF SECTOR AMOUNT-2
  1547.     MOV    E,M
  1548.     INX    H
  1549.     MOV    D,M
  1550.     XCHG
  1551.     SHLD    F37D
  1552.     XCHG
  1553.     INX    H        ;BUILD SKEW TABLE
  1554.     MOV    B,M        ; SKEW FACTOR
  1555.     INX    H
  1556.     MOV    A,M        ;  SPT
  1557.     STA    DSKSPT
  1558.     MOV    C,A
  1559.     PUSH    H
  1560.     LXI    H,F37SKEW
  1561.     CALL    INTRLV
  1562.     POP    D
  1563.  
  1564.     LXI    H,BUFFER    ;START OF TRACK IMAGE
  1565.  
  1566. F378A2:
  1567.     INX    D        ;FILL IN FRONT END GAP
  1568.     LDAX    D        ;GET AMOUNT
  1569.     ORA    A        ;CHECK IF END OF FRONT END GAP INFO
  1570.     JZ    F378A3        ; BR IF IT IS
  1571.     MOV    B,A
  1572.     INX    D
  1573.     LDAX    D        ;GET VALUE
  1574.     CALL    F378X        ;FILL
  1575.     JMP    F378A2
  1576. F378A3:
  1577.     SHLD    F37B        ;SAVE START OF SECTORS
  1578.     PUSH    D        ;SAVE START OF SECTOR DESCRIPTORS
  1579.  
  1580.     LDA    DSKSPT        ;GET SECTORS PER TRACK
  1581.     MOV    C,A
  1582.  
  1583. F378B:    POP    D        ;FILL IN FOR A SECTOR
  1584.     PUSH    D
  1585. F378C:    INX    D
  1586.     LDAX    D
  1587.     ANA    A
  1588.     JZ    F378D        ;BR IF END OF SECTOR DESCRIPTORS
  1589.     MOV    B,A
  1590.     INX    D
  1591.     LDAX    D
  1592.     CALL    F378X
  1593.     JMP    F378C
  1594. F378D:    DCR    C
  1595.     JNZ    F378B
  1596.  
  1597.     POP    B        ;DISCARD ADDR OF SECTOR DESCRIPTORS
  1598.  
  1599. F378E:    INX    D        ;FILL REQUIRED GAP IV AMOUNT
  1600.     LDAX    D
  1601.     MOV    B,A
  1602.     INX    D
  1603.     LDAX    D
  1604.     CALL    F378X
  1605.  
  1606. F378F:    INX    D        ;FILL OPTIONAL GAP IV AMOUNT
  1607.     LDAX    D
  1608.     ANA    A
  1609.     JZ    F378G
  1610.     MOV    B,A
  1611.     INX    D
  1612.     LDAX    D
  1613.     CALL    F378X
  1614.     JMP    F378F
  1615.  
  1616. F378G:
  1617.     RET
  1618.  
  1619. ;  FILL AREA OF LENGTH (B) WITH VALUE (A) STARTING AT ADDRESS (HL)
  1620. F378X:    MOV    M,A
  1621.     INX    H
  1622.     DCR    B
  1623.     JNZ    F378X
  1624.     RET
  1625.  
  1626. ;  FILL IN TRACK/SIDE/SECTOR VALUES FOR THIS ITERATION IN TRACK IMAGE.
  1627. F378Y:
  1628.     LDA    TRACK        ;CALCULATE PHYSICAL TRACK / SIDE VALUES
  1629.     MOV    B,A
  1630.     MVI    C,0
  1631.  
  1632.     LDA    SIDES
  1633.     CPI    DPE2S
  1634.     JNZ    F378Y1
  1635.  
  1636.     MOV    A,B
  1637.     ANA    A
  1638.     RAR
  1639.     MOV    B,A
  1640.     JNC    F378Y1
  1641.     MVI    C,1
  1642.  
  1643. F378Y1:
  1644.     MOV    A,B
  1645.     STA    F37E
  1646.     MOV    A,C
  1647.     STA    F37F
  1648.  
  1649.     LHLD    F37C
  1650.     XCHG
  1651.     LHLD    F37B
  1652.     DAD    D
  1653.  
  1654.     LXI    B,F37SKEW    ;(BC) = ADDR OF SKEW TABLE
  1655.  
  1656. F378Y3: LDAX    B
  1657.     ANA    A
  1658.     RZ            ;RET IF END OF SECTORS
  1659.     LDA    F37E        ;GET TRACK
  1660.     MOV    M,A
  1661.     INX    H
  1662.     LDA    F37F        ;GET SIDE
  1663.     MOV    M,A
  1664.     INX    H
  1665.     LDAX    B        ;GET SECTOR
  1666.     MOV    M,A
  1667.     INX    B
  1668.     XCHG
  1669.     LHLD    F37D
  1670.     DAD    D
  1671.     JMP    F378Y3
  1672.  
  1673. F37B    DS    2        ;ADDR OF 1ST SECTOR IN BUFFER
  1674. F37C    DS    2        ;OFFSET INTO 1ST SECTOR
  1675. F37D    DS    2        ;SIZE OF SECTOR - 2
  1676. F37E    DS    1        ;PHYSICAL TRACK #
  1677. F37F    DS    1        ;PHYSICAL SIDE VALUECONTROL REG IMAGE
  1678.  
  1679. F37SKEW    DS    27        ;SKEW TABLE SPACE
  1680.  
  1681. F37STBL    DS    0        ;8" SINGLE DENSITY TRACK FORMAT TABLE
  1682.     DW    7        ;OFFSET INTO SECTOR AREA OF TRACK #
  1683.     DW    184        ;LENGTH OF SECTOR AREA MINUS 2
  1684.     DB    1        ;INTERLEAVE FACTOR
  1685.     DB    26        ;SECTORS PER TRACK
  1686.     DB    40,0FFH        ;TRACK HEADER GAP
  1687.     DB    6,0
  1688.     DB    1,0FCH
  1689.     DB    26,0FFH
  1690.     DB    0
  1691.     DB    6,0        ;SECTOR AREA (REPEAT FOR SPT)
  1692.     DB    1,0FEH
  1693.     DB    4,0
  1694.     DB    1,0F7H
  1695.     DB    11,0FFH
  1696.     DB    6,0
  1697.     DB    1,0FBH
  1698.     DB    128,0E5H
  1699.     DB    1,0F7H
  1700.     DB    27,0FFH
  1701.     DB    0
  1702.     DB    24,0FFH        ;REQUIRED GAP IV AMOUNT
  1703.     DB    255,0FFH    ;OPTIONAL GAP IV AMOUNT
  1704.     DB    124,0FFH
  1705.     DB    0
  1706.  
  1707. F37DTBL    DS    0        ;8" DOUBLE DENSITY 26x256 TRACK FORMAT TABLE
  1708.     DW    16
  1709.     DW    368
  1710.     DB    1,26
  1711.     DB    80,04EH
  1712.     DB    12,0
  1713.     DB    3,0F6H
  1714.     DB    1,0FCH
  1715.     DB    50,04EH
  1716.     DB    0
  1717.     DB    12,0
  1718.     DB    3,0F5H
  1719.     DB    1,0FEH
  1720.     DB    3,0
  1721.     DB    1,1
  1722.     DB    1,0F7H
  1723.     DB    22,04EH
  1724.     DB    12,0
  1725.     DB    3,0F5H
  1726.     DB    1,0FBH
  1727.     DB    128,0E5H
  1728.     DB    128,0E5H
  1729.     DB    1,0F7H
  1730.     DB    54,04EH
  1731.     DB    0
  1732.     DB    24,04EH
  1733.     DB    255,04EH
  1734.     DB    255,04EH
  1735.     DB    255,04EH
  1736.     DB    121,04EH
  1737.     DB    0
  1738.  
  1739. F37D2TB    DS    0    ;5 1/4" DOUBLE DENSITY 8x512 TRACK FORMAT TABLE
  1740.     DW    16
  1741.     DW    650
  1742.     DB    1,8
  1743.     DB    80,04EH
  1744.     DB    12,0
  1745.     DB    3,0F6H
  1746.     DB    1,0FCH
  1747.     DB    50,04EH
  1748.     DB    0
  1749.     DB    12,0
  1750.     DB    3,0F5H
  1751.     DB    1,0FEH
  1752.     DB    3,0
  1753.     DB    1,2
  1754.     DB    1,0F7H
  1755.     DB    22,04EH
  1756.     DB    12,0
  1757.     DB    3,0F5H
  1758.     DB    1,0FBH
  1759.     DB    128,0E5H
  1760.     DB    128,0E5H
  1761.     DB    128,0E5H
  1762.     DB    128,0E5H
  1763.     DB    1,0F7H
  1764.     DB    80,04EH
  1765.     DB    0
  1766.     DB    24,04EH
  1767.     DB    255,04EH
  1768.     DB    255,04EH
  1769.     DB    255,04EH
  1770.     DB    255,04EH
  1771.     DB    15,04EH
  1772.     DB    0
  1773.  
  1774. ;  H37 DISK DESCRIPTORS FOR LABEL.
  1775. ;
  1776. ;    DB    DENSITY/SIDES FLAGS
  1777. ;    DB    CP/M RECORDS PER SECTOR
  1778. ;    DB    CP/M RECORDS PER ALLOCATION BLOCK
  1779. ;    DB    MEDIA TPI FLAG
  1780. ;    DW    SECTORS PER TRACK
  1781. ;    DB    BLOCK SHIFT FACTOR
  1782. ;    DB    BLOCK MASK
  1783. ;    DB    EXTENT MASK
  1784. ;    DW    # OF BLOCKS - 1
  1785. ;    DW    # OF DIRECTORY ENTRIES - 1
  1786. ;    DW    AL1*256+AL0
  1787. ;    DW    LENGTH OF CHECKSUM VECTOR
  1788. ;    DW    # OF SYSTEM TRACKS
  1789. ;
  1790.  
  1791. F37TBL    DS    0
  1792.  
  1793.     ;5 1/4" DOUBLE DENSITY (8x512)/SINGLE SIDED/48 TPI
  1794.     DB    DPEDD,4,8,0
  1795.     DW    32
  1796.     DB    3,7,0
  1797.     DW    151,127,00F0H,32,2
  1798.  
  1799. F37TBLL    EQU    $-F37TBL
  1800.  
  1801.     ;5 1/4" DOUBLE DENSITY (8x512)/DOUBLE SIDED/48 TPI
  1802.     DB    DPEDD+DPE2S,4,16,0
  1803.     DW    32
  1804.     DB    4,15,1
  1805.     DW    155,255,00F0H,64,2
  1806.  
  1807.     ;5 1/4" DOUBLE DENSITY (8x512)/SINGLE SIDED/96 TPI
  1808.     DB    DPEDD,4,16,DPE96TM
  1809.     DW    32
  1810.     DB    4,15,1
  1811.     DW    155,127,00C0H,32,2
  1812.  
  1813.     ;5 1/4" DOUBLE DENSITY (8x512)/DOUBLE SIDED/96 TPI
  1814.     DB    DPEDD+DPE2S,4,16,DPE96TM
  1815.     DW    32
  1816.     DB    4,15,0
  1817.     DW    315,255,00F0H,64,2
  1818.  
  1819.     ;8" SINGLE DENSITY / SINGLE SIDED
  1820.     DB    0,1,8,0
  1821.     DW    26
  1822.     DB    3,7,0
  1823.     DW    242,63
  1824.     DB    0C0H,0
  1825.     DW    16,2
  1826.  
  1827.     ;8" SINGLE DENSITY / DOUBLE SIDED
  1828.     DB    DPE2S,1,16,0
  1829.     DW    26
  1830.     DB    4,15,1
  1831.     DW    246,127
  1832.     DB    0C0H,0
  1833.     DW    32,2
  1834.  
  1835.     ;8" DOUBLE DENSITY / SINGLE SIDED
  1836.     DB    DPEDD,2,16,0
  1837.     DW    52
  1838.     DB    4,15,10
  1839.     DW    242,127
  1840.     DB    0C0H,0
  1841.     DW    32,2
  1842.  
  1843.     ;8" DOUBLE DENSITY / DOUBLE SIDED
  1844.     DB    DPEDD+DPE2S,2,16,0
  1845.     DW    52
  1846.     DB    4,15,0
  1847.     DW    493,255,255
  1848.     DB    0F0H,0
  1849.     DW    64,2
  1850.  
  1851.     PAGE
  1852. ;**    FORMAT Z217
  1853. ;
  1854.  
  1855. F217:
  1856.     MVI    C,SGUSR            ;GET CURRENT USER CODE
  1857.     MVI    E,0FFH
  1858.     CALL    BDOS
  1859.     STA    F217UC
  1860.  
  1861.     MVI    C,SGUSR            ;RESET USER CODE TO 31
  1862.     MVI    E,31            ; TO HIDE FILE
  1863.     CALL    BDOS
  1864.  
  1865.     LHLD    DPEPTR            ;Q. PARTITION ASSIGNED
  1866.     LXI    D,DPEFLAG
  1867.     DAD    D
  1868.     MOV    A,M
  1869.     ANI    DPEASGN
  1870.     JZ    F21799            ; BR IF NOT
  1871.  
  1872.     MVI    C,PRCONB        ;INFORM USER
  1873.     LXI    D,FMTPART
  1874.     CALL    BDOS
  1875.  
  1876.     QUERY    F2171
  1877.  
  1878.     MVI    C,PRCONB        ;ASK IF READY
  1879.     LXI    D,PROMPT1
  1880.     CALL    BDOS
  1881.     MVI    C,RDCON
  1882.     CALL    BDOS
  1883.     CPI    CR
  1884.     JNZ    F21798            ; BR IF NOT
  1885.  
  1886. F2171:
  1887.     CALL    FCBD            ;CLEAR BIOS BUFFERS FOR DRIVE
  1888.  
  1889.     CALL    F21780            ;FILL IN DPB & CALC VALUES
  1890.     JC    F21799            ; BR IF ERROR
  1891.  
  1892. ;*    COMPUTE # CP/M RECORDS TO CLEAR.
  1893. ;    (# CP/M RECORDS) = (# DIRECTORY ALLOCATION BLOCKS) SHL (BSH) +
  1894. ;               (# RECORDS FOR SYSTEM TRACK(S))
  1895.  
  1896.     LHLD    DPBPTR            ;GET # ALLOCATION BLOCKS FOR DIRECTORY
  1897.     LXI    B,DPBAL0
  1898.     DAD    B
  1899.     CALL    HLIHL
  1900.     MVI    B,0
  1901. F2172:
  1902.     MOV    A,H
  1903.     ANA    A
  1904.     RAL
  1905.     MOV    H,A
  1906.     MOV    A,L
  1907.     RAL
  1908.     MOV    L,A
  1909.     JNC    F2172A
  1910.     INR    B
  1911.     JMP    F2172
  1912.  
  1913. F2172A:
  1914.     LHLD    DPBPTR            ;GET BLOCK SHIFT FACTOR
  1915.     LXI    D,DPBBSH
  1916.     DAD    D
  1917.     MOV    A,M
  1918.  
  1919.     MVI    H,0            ;(HL) = # ALLOCATION BLOCKS
  1920.     MOV    L,B            ;       FOR DIRECTORY
  1921.     SHLD    F217DAB            ;SAVE FOR LATER
  1922. F2172B:
  1923.     DAD    H
  1924.     DCR    A
  1925.     JNZ    F2172B            ;(HL) = # CP/M RECORDS FOR DIRECTORY
  1926.  
  1927.     LXI    D,WINST*WIRPT        ;(DE) = # CP/M RECORDS FOR SYSTEM TRK
  1928.     DAD    D
  1929.     SHLD    F217C1            ;(HL) = # CP/M RECORDS TO CLEAR
  1930.  
  1931. ;*    WRITE 0E5H TO ALL SECTORS TO BE CLEARED
  1932.  
  1933.     MVI    A,0E5H            ;FILL SECTOR BUFFER WITH 0E5H
  1934.     MVI    B,128
  1935.     LXI    H,BUFFER
  1936.     CALL    F378X
  1937.     LXI    B,BUFFER        ;SET DMA
  1938.     CALL    FSETDMA
  1939.  
  1940.     LXI    H,0            ;INIT TRACK #
  1941.     SHLD    F217TRK
  1942.     LXI    H,1            ;INIT SECTOR #
  1943.     SHLD    F217SEC
  1944.  
  1945. F21710:
  1946.     LHLD    F217TRK            ;SET TRACK
  1947.     MOV    B,H
  1948.     MOV    C,L
  1949.     CALL    FSETTRK
  1950.     LHLD    F217SEC            ;SET SECTOR
  1951.     MOV    B,H
  1952.     MOV    C,L
  1953.     CALL    FSETSEC
  1954.     MVI    C,BWRNOR        ;WRITE SECTOR
  1955.     CALL    FWRITE
  1956.     ORA    A            ;Q. ERROR
  1957.     JNZ    F21799            ; BR IF ERROR
  1958.  
  1959.     LHLD    F217SEC            ;GET CP/M SECTOR # JUST WRITTEN
  1960.     XCHG                ;(DE)=CP/M SECTOR #
  1961.     LXI    H,WIRPT
  1962.     CALL    CPHLDE            ;Q. JUST WROTE LAST SECTOR OF TRACK
  1963.     JNZ    F21712            ; BR IF NO
  1964.     LXI    D,0            ;RESET SECTOR #
  1965.     LHLD    F217TRK            ;INCREMENT TRACK #
  1966.     INX    H
  1967.     SHLD    F217TRK
  1968. F21712:
  1969.     XCHG                ;(HL)=SECTOR #
  1970.     INX    H            ;BUMP SECTOR #
  1971.     SHLD    F217SEC
  1972.  
  1973.     LHLD    F217C1            ;LOOP
  1974.     DCX    H
  1975.     SHLD    F217C1
  1976.     MOV    A,H
  1977.     ORA    L
  1978.     JNZ    F21710
  1979.  
  1980. ;*    WRITE LABEL TO 1ST SECTOR OF DISK
  1981.  
  1982.     CALL    WRLAB
  1983.     JC    F21799            ;BR IF ERROR
  1984.  
  1985. ;*    BUILD A FILE WITH THE BAD SECTORS OF THIS PARTITION ALLOCATED
  1986. ;    TO THIS FILE SO THEY CAN'T BE USED.
  1987.  
  1988.     LDA    PROMPTA            ;GET DRIVE
  1989.     SUI    'A'-1            ;CONVERT TO 1-N
  1990.     STA    F217FCB+FCBDN        ;PLACE IN FCB
  1991.  
  1992.     CALL    F217RDB            ;READ IN BAD SECTOR TABLE
  1993.     JC    F21799            ; BR IF ERROR
  1994.  
  1995.     LXI    H,0            ;INIT LAST ALLOCATION BLOCK MARKED BAD
  1996.     SHLD    F217LAB
  1997.     XRA    A            ;INIT ALLOCATION BLOCK COUNTER
  1998.     STA    F217C2
  1999.  
  2000. F2175A:
  2001.     CALL    F21750            ;GET NEXT ENTRY IN TABLE
  2002.     JZ    F2175C            ; BR IF NO MORE ENTRIES
  2003.  
  2004.     XCHG                ;(DE)=BAD SECTOR #
  2005.     LHLD    F217LB            ;CHECK AGAINST SECTOR # FOR
  2006.     CALL    SUBHLDE            ; START OF PARTITION
  2007.     JC    F2175A            ;  BR IF BAD SECTOR PRIOR TO START
  2008.  
  2009.     XCHG                ;(DE)=BAD SECTOR DISPLACEMENT FROM
  2010.                     ;     START OF PARTITTION
  2011.     LXI    H,WINSYS        ;(HL)=# SECTORS FOR SYSTEM TRACKS
  2012.     CALL    SUBHLDE            ;(HL)=BAD SECTOR DISPLACEMENT FROM
  2013.                     ;     SYSTEM TRACKS
  2014.     JC    F21799            ;ERROR IF BAD SECTOR IS WITHIN
  2015.                     ; SYSTEM TRACKS
  2016.  
  2017.     XCHG                ;(DE)=BAD SECTOR DISPLACEMENT
  2018.     LHLD    DPBPTR            ;CALCULATE ALLOCATION BLOCK #
  2019.     LXI    B,DPBBSH        ; AB = (DE) SHR (BSH-2)
  2020.     DAD    B
  2021.     MOV    B,M
  2022.     DCR    B
  2023.     DCR    B
  2024.     IF    WICSZ NE 512
  2025. %:    SECTOR SIZE NE 512
  2026.     ENDIF
  2027.     XCHG
  2028.     CALL    F21770            ;(HL)=ALLOCATION BLOCK #
  2029.  
  2030.     XCHG                ;(DE)=ALLOCATION BLOCK #
  2031.     LHLD    F217DAB            ;(HL)=# AB'S FOR DIRECTORY
  2032.     XCHG                ;(DE)=# AB'S FOR DIRECTORY
  2033.                     ;(HL)=AB # OF BAD SECTOR
  2034.     CALL    CPHLDE            ;Q. BAD SECTOR WITHIN DIRECTORY
  2035.     JC    F21799            ; BR IF YES
  2036.  
  2037.     XCHG                ;(DE)=AB # OF BAD SECTOR
  2038.     LHLD    DPBPTR
  2039.     LXI    B,DPBDSM        ;CHECK AGAINST MAX BLOCK #
  2040.     DAD    B            ; FOR THIS PARTITION
  2041.     CALL    HLIHL
  2042.     MOV    A,H
  2043.     STA    F217H            ;SAVE HIGH ORDER VALUE OF DSM
  2044.     INX    H
  2045.     XCHG                ;(DE)=MAX BLOCK # + 1
  2046.                     ;(HL)=BAD BLOCK #
  2047.     CALL    CPHLDE
  2048.     JNC    F2175A            ; BR IF PAST END OF PARTITION
  2049.  
  2050.     XCHG                ;(DE)=BAD BLOCK #
  2051.     LHLD    F217LAB            ;CHECK TO SEE IF SAME AS LAST BAD
  2052.     CALL    CPHLDE            ; BLOCK #
  2053.     JZ    F2175A            ;  BR IF YES
  2054.  
  2055.     XCHG                ;(HL)=BAD BLOCK #
  2056.     SHLD    F217LAB            ;SAVE AS LAST BAD BLOCK #
  2057.  
  2058.     XCHG                ;(DE)=BAD BLOCK #
  2059.  
  2060. ;    ADD BAD BLOCK # TO DISK MAP FOR THE CURRENT DIRECTORY ENTRY.
  2061.  
  2062.     LDA    F217C2            ;GET MAP COUNTER
  2063.     CPI    16            ;Q. MAP FULL
  2064.     JNZ    F2175B            ; BR IF NOT
  2065.  
  2066.     PUSH    D            ;DIRECTORY ENTRY FULL
  2067.     CALL    F21760            ; WRITE IT TO DISK
  2068.     JC    F21799            ;  BR IF ERROR
  2069.     POP    D
  2070.     XRA    A            ;ZERO MAP COUNTER
  2071.  
  2072. F2175B:
  2073.     LXI    H,F217MAP        ;PLACE BAD BLOCK # INTO MAP
  2074.     CALL    DADA
  2075.     MOV    M,E
  2076.     INX    H
  2077.     MOV    M,D
  2078.  
  2079.     LXI    H,F217C2        ;BUMP MAP COUNTER
  2080.     INR    M
  2081.     LDA    F217H            ;CHECK DSM TO SEE IF SINGLE OR
  2082.     ORA    A            ; DOUBLE BYTE MAP VALUES
  2083.     JZ    F2175A            ;  BR IF SINGLE (DSM <= 255)
  2084.     INR    M
  2085.     JMP    F2175A
  2086.  
  2087. ;    DONE BUILDING DIRECTORY ENTRIES BAD SECTORS.
  2088.  
  2089. F2175C:
  2090.     CALL    F21760            ;WRITE DIRECTORY ENTRY
  2091.     JC    F21799            ; BR IF ERROR
  2092.  
  2093.     LXI    H,F217FCB+FCBRO        ;SET ATTRIBUTES TO R/O & SYS
  2094.     MOV    A,M
  2095.     ORI    FCBROF
  2096.     MOV    M,A
  2097.     INX    H
  2098.     MOV    A,M
  2099.     ORI    FCBSYSF
  2100.     MOV    M,A
  2101.     MVI    C,SFA
  2102.     LXI    D,F217FCB
  2103.     CALL    BDOS
  2104.  
  2105. ;*
  2106.  
  2107.     JMP    F21798
  2108.  
  2109. ;*    GET NEXT ENTRY FOR BAD SECTOR TABLE.
  2110. ;
  2111. ;    ENTRY:    'F217BSE'=TABLE POINTER
  2112. ;    EXIT:    PSW/Z    0=ENTRY PRESET , 1=NO MORE ENTRIES
  2113. ;        (HL) = BAD SECTOR #
  2114. ;    USES:    ALL
  2115. ;
  2116.  
  2117. F21750:
  2118.     LHLD    F217BSE            ;GET TABLE POINTER TO NEXT ENTRY
  2119.     MOV    C,M            ;GET LOW ORDER BYTE
  2120.     INX    H
  2121.     MOV    B,M            ;GET MIDDLE ORDER BYTE
  2122.     INX    H
  2123.     INX    H            ;HIGH ORDER BYTE IS NOT USED
  2124.     SHLD    F217BSE            ;SAVE TABLE POINTER FOR NEXT TIME
  2125.  
  2126.     MOV    H,B            ;MOVE BAD SECTOR # TO (HL)
  2127.     MOV    L,C
  2128.  
  2129.     MOV    A,H            ;SET PSW/Z FLAG
  2130.     ORA    L
  2131.     RET
  2132.  
  2133. ;*    WRITE DIRECTORY ENTRY TO DISK.
  2134. ;
  2135. ;    ENTRY:    'F217C2'=MAP COUNTER
  2136. ;        'F217FCB'=DIRECTORY ENTRY
  2137. ;    EXIT:    'F217C2'=MAP COUNTER ZEROED
  2138. ;        'F217FCB'=DIRECTORY ENTRY UPDATED FOR NEXT EXTENT
  2139. ;    USES:    ALL
  2140. ;
  2141.  
  2142. F21760:
  2143.     LDA    F217C2            ;Q. MAP COUNTER = 0
  2144.     ORA    A
  2145.     RZ                ; RET IF YES -- DIR ENTRY IS EMPTY
  2146.  
  2147.     MVI    C,RDS            ;RESET DISK SYSTEM
  2148.     CALL    BDOS
  2149.  
  2150.     MVI    C,CREATE        ;MAKE FILE FOR THIS ENTRY
  2151.     LXI    D,F217FCB
  2152.     CALL    BDOS
  2153.     INR    A            ;CHECK FOR ERROR
  2154.     STC
  2155.     RZ                ; RET IF ERROR
  2156.  
  2157.     MVI    B,16            ;MOVE MAP TO FCB
  2158.     LXI    H,F217MAP
  2159.     LXI    D,F217FCB+FCBDM
  2160. F21761:
  2161.     MOV    A,M
  2162.     STAX    D
  2163.     MVI    M,0
  2164.     INX    H
  2165.     INX    D
  2166.     DCR    B
  2167.     JNZ    F21761
  2168.  
  2169.     LHLD    DPBPTR            ;SET EXTENT NUMBER BYTE
  2170.     LXI    B,DPBEXM
  2171.     DAD    B
  2172.     LDA    F217FCB+FCBEX
  2173.     ADD    M
  2174.     STA    F217FCB+FCBEX
  2175.     CPI    32            ;EXTENT NUMBER > MAX
  2176.     JC    F21762            ; BR IF NOT
  2177.     SUI    32            ;  MAKE EXTENT # MODULUS 32
  2178.     STA    F217FCB+FCBEX
  2179.     LXI    H,F217FCB+FCBRWF    ;    INC MODULE NUMBER
  2180.     INR    M
  2181.  
  2182. F21762:
  2183.     MVI    A,128            ;SET RECORD COUNT TO FULL
  2184.     STA    F217FCB+FCBRC
  2185.     LXI    H,F217FCB+FCBRWF    ;CLEAR 'FILE WRITE FLAG'
  2186.     MOV    A,M
  2187.     ANI    0FFH-FCBRWFF
  2188.     MOV    M,A
  2189.  
  2190.     MVI    C,CLOSE            ;CLOSE FILE
  2191.     LXI    D,F217FCB
  2192.     CALL    BDOS
  2193.     INR    A            ;CHECK FOR ERROR
  2194.     STC
  2195.     RZ                ; RET IF ERROR
  2196.  
  2197.     LXI    H,F217FCB+FCBEX        ;SET EXTENT NUMBER FOR NEXT TIME
  2198.     INR    M
  2199.  
  2200.     XRA    A            ;CLEAR MAP COUNTER
  2201.     STA    F217C2
  2202.  
  2203.     RET
  2204.  
  2205. ;*    ROUTINE TO DO POWER OF 2 DIVISION BY SHIFTING RIGHT.
  2206. ;    ENTRY:     (B) = SHIFT COUNT
  2207. ;        (HL) = VALUE TO BE DIVIDED
  2208. ;    EXIT:    (HL) = RESULT
  2209. ;    USES:    A,F,B,H,L
  2210.  
  2211. F21770:
  2212.     MOV    A,H
  2213.     ANA    A
  2214.     RAR
  2215.     MOV    H,A
  2216.     MOV    A,L
  2217.     RAR
  2218.     MOV    L,A
  2219.     DCR    B
  2220.     JNZ    F21770
  2221.     RET
  2222.  
  2223. ;*    CALCULATE DPE HEATH EXTENSIONS AND DISK PARAMETER BLOCK VALUES
  2224.  
  2225. F21780:
  2226.  
  2227. ;    CALCULATE # SECTORS WITHIN PARTITION.
  2228.  
  2229.     LHLD    DPEPTR            ;GET LAST SECTOR # + 1
  2230.     LXI    B,DPEUPB
  2231.     DAD    B
  2232.     CALL    HLIHL
  2233.     INX    H
  2234.  
  2235.     XCHG                ;(DE) = LAST SECTOR # + 1
  2236.     LHLD    DPEPTR            ;GET BEGINNING SECTOR #
  2237.     LXI    B,DPETRK
  2238.     DAD    B
  2239.     CALL    HLIHL
  2240.     SHLD    F217LB
  2241.  
  2242.     CALL    SUBHLDE            ;(HL) = # SECTORS IN PARTITION
  2243.  
  2244.     LXI    D,WIMIN            ;CHECK AGAINST MINIMUM ALLOWABLE
  2245.     CALL    CPHLDE
  2246.     JNC    F21781            ; BR IF >= MINIMUM
  2247.     MVI    C,PRCONB        ;PRINT ERROR MESSAGE IF < MINIMUM
  2248.     LXI    D,MINMSG
  2249.     CALL    BDOS
  2250.     STC                ;INDICATE ERROR
  2251.     RET
  2252.  
  2253. F21781:
  2254.     LXI    D,WIMAX+1        ;CHECK AGAINST MAXIMUM USEABLE
  2255.     CALL    CPHLDE
  2256.     JC    F21782            ; BR IF <= MAXIMUM
  2257.     MVI    C,PRCONB        ;ISSUE WARNING MESSAGE
  2258.     LXI    D,MAXMSG
  2259.     CALL    BDOS
  2260.     LXI    H,WIMAX            ;ONLY ALLOW MAXIMUM USEABLE
  2261.  
  2262. F21782:
  2263.     SHLD    F217NS            ;SAVE # SECTORS WITHIN PARTITION
  2264.  
  2265. ;    SEARCH    PARAMETER TABLE TO FIND ENTRY THAT THE PARTITION'S # USEABLE
  2266. ;    SECTORS >= TABLE ENTRY'S # SECTORS.
  2267.  
  2268.     LXI    H,F217TBL        ;(HL) = TABLE POINTER
  2269.  
  2270. F21783:
  2271.     MOV    E,M            ;GET # SECTORS FROM TABLE
  2272.     INX    H
  2273.     MOV    D,M
  2274.     PUSH    H
  2275.     LHLD    F217NS            ;GET PARTITION'S # USEABLE SECTORS
  2276.     CALL    CPHLDE            ;COMPARE
  2277.     POP    H
  2278.     JNC    F21784            ; BR IF >=
  2279.     LXI    D,F217TBLL-1        ;BUMP TO NEXT TABLE ENTRY
  2280.     DAD    D
  2281.     JMP    F21783            ;CHECK NEXT ENTRY
  2282.  
  2283. ;    PLACE INFO INTO THE HEATH EXTENSION AREA OF THE DRIVE'S
  2284. ;    DISK PARAMETER ENTRIES TABLE.
  2285.  
  2286. F21784:
  2287.     XCHG                ;(DE) = F217 TABLE POINTER
  2288.     LHLD    DPEPTR            ;(HL) = DISK PARAMETER ENTRY TABLE PTR
  2289.  
  2290.     LXI    B,DPERPAB        ;CP/M RECORDS PER ALLOCATION BLOCK
  2291.     DAD    B
  2292.     INX    D
  2293.     LDAX    D
  2294.     MOV    M,A
  2295.  
  2296. ;    PLACE INFO INTO THE DRIVE'S DISK PARAMETER BLOCK.
  2297.  
  2298.     LHLD    DPBPTR            ;(HL) = DISK PARAMETER BLOCK POINTER
  2299.  
  2300.     LXI    B,WIRPT            ;CP/M RECORDS PER TRACK
  2301.     MOV    M,C
  2302.     INX    H
  2303.     MOV    M,B
  2304.  
  2305.     INX    D            ;BLOCK SHIFT FACTOR
  2306.     INX    H
  2307.     LDAX    D
  2308.     MOV    M,A
  2309.  
  2310.     INX    D            ;BLOCK MASK
  2311.     INX    H
  2312.     LDAX    D
  2313.     MOV    M,A
  2314.  
  2315.     INX    D            ;EXTENT MASK
  2316.     INX    H
  2317.     LDAX    D
  2318.     MOV    M,A
  2319.  
  2320.     INX    D            ;# DIRECTORY ENTRIES - 1
  2321.     INX    H
  2322.     INX    H
  2323.     INX    H
  2324.     LDAX    D
  2325.     MOV    M,A
  2326.     INX    D
  2327.     INX    H
  2328.     LDAX    D
  2329.     MOV    M,A
  2330.  
  2331.     INX    D            ;AL0
  2332.     INX    H
  2333.     LDAX    D
  2334.     MOV    M,A
  2335.  
  2336.     INX    D            ;AL1
  2337.     INX    H
  2338.     LDAX    D
  2339.     MOV    M,A
  2340.  
  2341.     XRA    A            ;CHECKSUM VECTOR LENGTH
  2342.     INX    H
  2343.     MOV    M,A
  2344.     INX    H
  2345.     MOV    M,A
  2346.  
  2347.     LXI    B,WINST            ;# OF SYSTEM TRACKS
  2348.     INX    H
  2349.     MOV    M,C
  2350.     INX    H
  2351.     MOV    M,B
  2352.  
  2353. ;    CALCULATE DISK PARAMETER BLOCK 'DSM' VALUE.
  2354. ;      DSM = ( [# USEABLE SECTORS] - [# SYSTEM SECTORS] ) /
  2355. ;        [# SECTORS PER ALLOCATION BLOCK] - 1
  2356.  
  2357.     LHLD    F217NS
  2358.     LXI    D,-WINSYS
  2359.     DAD    D
  2360.     XCHG
  2361.  
  2362.     LHLD    DPBPTR
  2363.     LXI    B,DPBBSH
  2364.     DAD    B
  2365.     MOV    B,M
  2366.     DCR    B
  2367.     DCR    B
  2368.     IF    WICSZ NE 512
  2369. %:    CELL SIZE IS NOT 512 -- DO NOT DCR TWICE
  2370.     ENDIF
  2371.  
  2372.     XCHG                ;(DE) = POINTER INTO DPB
  2373.                     ;(HL) = VALUE TO BE DIVIDED
  2374.     CALL    F21770
  2375.     XCHG                ;(DE) = QUOTIENT
  2376.                     ;(HL) = POINTER INTO DPB
  2377.  
  2378.     DCX    D
  2379.  
  2380.     LXI    B,DPBDSM-DPBBSH        ;PLACE RESULT INTO DISK PARM BLOCK
  2381.     DAD    B
  2382.     MOV    M,E
  2383.     INX    H
  2384.     MOV    M,D
  2385.  
  2386.     XRA    A            ;INDICATE NO ERROR
  2387.     RET
  2388.  
  2389. ;*    NO ERROR
  2390.  
  2391. F21798:
  2392.     XRA    A
  2393.     JMP    F217100
  2394.  
  2395. ;*    ERROR
  2396.  
  2397. F21799:
  2398.     STC
  2399.  
  2400. ;*    DONE FORMATTING Z217
  2401.  
  2402. F217100:
  2403.     PUSH    PSW
  2404.  
  2405.     MVI    C,SGUSR            ;RESTORE USER CODE
  2406.     LDA    F217UC
  2407.     MOV    E,A
  2408.     CALL    BDOS
  2409.  
  2410.     CALL    FCBD            ;CLEAR BIOS BUFFER FOR DRIVE
  2411.  
  2412.     POP    PSW
  2413.     RET
  2414.  
  2415.  
  2416. ;*    READ IN BAD SECTOR TABLE
  2417.  
  2418. F217RDB:
  2419.     CALL    FCBD            ;CLEAR BUFFERS
  2420.  
  2421.     LHLD    DPEPTR            ;INDICATE TO LOGICAL I/O
  2422.     LXI    D,DPEFLAG
  2423.     DAD    D
  2424.     MOV    A,M
  2425.     ORI    DPELSIO
  2426.     MOV    M,A
  2427.  
  2428.     LXI    B,0            ;READ SBC
  2429.     LXI    D,1
  2430.     LXI    H,BUFFER
  2431.     CALL    F217RD
  2432.     JC    F217RDB9        ; BR IF ERROR
  2433.  
  2434.     LHLD    BUFFER+SBCBSA        ;GET LOGICAL SECTOR # OF BAD SEC TABLE
  2435.  
  2436.     MOV    B,H            ;COMPUTE TRACK #
  2437.     MOV    C,L
  2438.     LXI    D,WINSPT
  2439.     CALL    C$DU66
  2440.     SHLD    F217TRK
  2441.  
  2442.     MVI    A,WIRPS            ;COMPUTE CP/M SECTOR # = PHYSICAL
  2443.     CALL    C$MU86            ; SECTOR # * CP/M RECORDS PER
  2444.     INX    H            ;  PHYSICAL SECTOR + 1
  2445.     SHLD    F217SEC
  2446.  
  2447.     LXI    H,BUFFER        ;SET BUFFER ADDRESS
  2448.     SHLD    F217BSE
  2449.  
  2450.     MVI    A,WIRPS*2        ;ASSUME TABLE WILL FIT IN
  2451.     STA    F217C2            ; 2 PHYSICAL SECTORS
  2452.  
  2453. F217RDB1:
  2454.     LHLD    F217TRK            ;GET TRACK #
  2455.     MOV    B,H
  2456.     MOV    C,L
  2457.     LHLD    F217SEC            ;GET CP/M SECTOR #
  2458.     XCHG
  2459.     LHLD    F217BSE            ;GET BUFFER FWA
  2460.     CALL    F217RD            ;READ 128 BYTES
  2461.     JC    F217RDB9        ; BR IF ERROR
  2462.  
  2463.     LHLD    F217SEC            ;Q. END OF TRACK
  2464.     LXI    D,WIRPT
  2465.     CALL    CPHLDE
  2466.     JNZ    F217RDB3        ; BR IF NOT
  2467.     LHLD    F217TRK            ;BUMP TRACK #
  2468.     INX    H
  2469.     SHLD    F217TRK
  2470.     LXI    H,0
  2471.  
  2472. F217RDB3:
  2473.     INX    H            ;BUMP CP/M SECTOR #
  2474.     SHLD    F217SEC
  2475.  
  2476.     LHLD    F217BSE            ;BUMP BUFFER ADDRESS
  2477.     LXI    D,128
  2478.     DAD    D
  2479.     SHLD    F217BSE
  2480.  
  2481.     LXI    H,F217C2        ;LOOP AND READ
  2482.     DCR    M
  2483.     JNZ    F217RDB1
  2484.  
  2485.     LXI    H,BUFFER        ;INIT BAD SECTOR TABLE ENTRY POINTER
  2486.     SHLD    F217BSE
  2487.  
  2488.     XRA    A            ;INDICATE NO ERROR
  2489.  
  2490. F217RDB9:
  2491.     PUSH    PSW            ;SAVE CARRY FLAG (ERROR INDICATOR)
  2492.  
  2493.     LHLD    DPEPTR            ;TURN OFF DOING LOGICAL SECTOR I/O FLAG
  2494.     LXI    D,DPEFLAG
  2495.     DAD    D
  2496.     MOV    A,M
  2497.     ANI    0FFH-DPELSIO
  2498.     MOV    M,A
  2499.  
  2500.     CALL    FCBD            ;CLEAR BUFFERS
  2501.  
  2502.     POP    PSW            ;RETRIEVE ERROR INDICATOR
  2503.  
  2504.     RET
  2505.  
  2506. ;*    READ CP/M SECTOR FROM DISK
  2507. ;
  2508. ;    ENTRY:    (BC) = TRACK #
  2509. ;        (DE) = CP/M SECTOR # (1 TO SPT)
  2510. ;        (HL) = BUFFER FWA
  2511. ;    EXIT:    PSW/C    0=NO ERROR , 1=ERROR
  2512. ;    USES:    ALL
  2513. ;
  2514.  
  2515. F217RD:
  2516.     PUSH    H
  2517.     PUSH    D
  2518.  
  2519.     CALL    FSETTRK            ;SET TRACK
  2520.  
  2521.     POP    B            ;SET CP/M SECTOR
  2522.     CALL    FSETSEC
  2523.  
  2524.     POP    B            ;SET DMA
  2525.     CALL    FSETDMA
  2526.  
  2527.     CALL    FREAD            ;READ SECTOR
  2528.  
  2529.     ORA    A            ;Q. ERROR
  2530.     RZ                ; RET IF NO ERROR
  2531.  
  2532.     STC                ;INDICATE ERROR OCCURRED
  2533.     RET
  2534.  
  2535.  
  2536. ;*    PARAMETER TABLE CONTAINING
  2537. ;      1) HEATH EXTENSION VALUES
  2538. ;      2) DISK PARAMETER BLOCK VALUES
  2539. ;
  2540. ;    FORMAT OF TABLE:
  2541. ;       BYTE #                    DESCRIPTION
  2542. ;       ------  ----------------------------------------------------
  2543. ;        0-1    # SECTORS -- THIS ENTRY IS USED IF PARTITION'S
  2544. ;                               # USEABLE SECTORS >=
  2545. ;         2     CP/M RECORDS PER ALLOCATION BLOCK
  2546. ;         3     BLOCK SHIFT FACTOR
  2547. ;         4     BLOCK MASK
  2548. ;         5     EXTENT MASK
  2549. ;        6-7    # OF DIRECTORY ENTRIES - 1
  2550. ;         8     AL0
  2551. ;         9     AL1
  2552. ;
  2553.  
  2554. F217TBL    DS    0
  2555.  
  2556.     DW    1024/WICSZ*4*1024+WINSYS+1    ;4 MEG < X <= 8 MEG
  2557.     DB    32,5,31,1
  2558.     DW    1023
  2559.     DB    0FFH,000H
  2560.  
  2561. F217TBLL EQU    $-F217TBL        ;TABLE ENTRY LENGTH
  2562.  
  2563.     DW    1024/WICSZ*1*1024+WINSYS+1    ;1 MEG < X <= 4 MEG
  2564.     DB    16,4,15,0
  2565.     DW    511
  2566.     DB    0FFH,000H
  2567.  
  2568.     DW    1024/WICSZ*512+WINSYS+1        ;512K < X <= 1 MEG
  2569.     DB    16,4,15,0
  2570.     DW    255
  2571.     DB    0F0H,000H
  2572.  
  2573.     DW    1024/WICSZ*256+WINSYS+1        ;256K < X <= 512K
  2574.     DB    16,4,15,1
  2575.     DW    127
  2576.     DB    0C0H,000H
  2577.  
  2578.     DW    WIMIN                ;MINIMUM <= X <= 256K
  2579.     DB    8,3,7,0
  2580.     DW    63
  2581.     DB    0C0H,000H
  2582.  
  2583. FMTPART    DB    CR,LF,CR,LF,'Will format partition assigned to drive '
  2584. FPARTD    DB    '?:',CR,LF,CPMEOM
  2585.  
  2586. MINMSG    DB    CR,LF,BELL,'PARTION IS SMALLER THAN MINIMUM ALLOWABLE '
  2587.     DB    'SIZE',CR,LF,CPMEOM
  2588.  
  2589. MAXMSG    DB    CR,LF,BELL,'PARTITION IS LARGER THAN CP/M MAXIMUM SIZE'
  2590.     DB    ' -- ONLY 8 MEG USEABLE',CR,LF,CPMEOM
  2591.  
  2592. F217NS    DS    2            ;# USEABLE SECTORS
  2593. F217TRK    DS    2            ;TRACK #
  2594. F217SEC    DS    2            ;SECTOR #
  2595. F217DAB    DS    2            ;# DIRECTORY ALLOCATION BLOCKS
  2596. F217C1    DS    2            ;LOOP COUNTER
  2597. F217C2    DS    1            ;COUNTER
  2598. F217BS    DS    2            ;BAD SECTOR TABLE SECTOR #
  2599. F217BSE    DS    2            ;BAD SECTOR TABLE POINTER
  2600. F217LAB    DS    2            ;LAST ALLOCATION BLOCK MARKED BAD
  2601. F217LB    DS    2            ;PARTITION LOWER BOUND
  2602. F217H    DS    1            ;HIGH ORDER BYTE OF DSM
  2603. F217UC    DS    1            ;USER CODE
  2604.  
  2605. F217FCB    DB    0,'BADBLOCKSYS',0,0,0,0
  2606.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2607. F217MAP    DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2608.  
  2609.     PAGE
  2610. ;
  2611. ;  INTRLV -- CONSTRUCTS A SECTOR INTERLEAVE TABLE
  2612. ;
  2613. ;    ENTRY:  (B) = INTERLEAVE FACTOR
  2614. ;            (C) = SECTORS PER TRACK
  2615. ;           (HL) = ADDR OF TABLE
  2616. ;    USES:   ALL
  2617. ;
  2618. ;    CONDITIONAL VARIABLE 'INTERACT' IF 1 ALLOWS INTERLEAVE FACTOR
  2619. ;    TO BE ENTERED FROM CONSOLE INSTEAD OF PASSED IN REG B.
  2620. ;
  2621.  
  2622. INTERACT EQU 0
  2623.  
  2624. INTRLV:
  2625.  
  2626.     MOV    A,C        ;SAVE SPT
  2627.     STA    INTRLVA
  2628.     STA    INTRLVB        ;ALSO AS COUNTER
  2629.     SHLD    INTRLVC        ;SAVE ADDR OF TABLE
  2630.  
  2631.     INR    C        ;BUMP (C) FOR TEST & INITIALIZATION
  2632.     MOV    A,B        ;CHECK FOR VALID INTERLEAVE FACTOR
  2633.     ANA    A
  2634.     JZ    INTRLV1        ; BR IF ZERO -- INVALID
  2635.     CMP    C
  2636.     JC    INTRLV2        ;  BR IF <= SPT -- VALID
  2637. INTRLV1:
  2638.     MVI    B,1        ;SET INTERLEAVE FACTOR TO 1
  2639.  
  2640. INTRLV2:
  2641.     XRA    A        ;INIT INTERLEAVE TABLE TO ZEROES
  2642. INTRLV2A:
  2643.     MOV    M,A
  2644.     INX    H
  2645.     DCR    C
  2646.     JNZ    INTRLV2A
  2647.  
  2648.     IF    INTERACT
  2649.     MVI    C,PRINTF
  2650.     LXI    D,INTRLVMSG
  2651.     CALL    BDOS
  2652.     MVI    C,RDCON
  2653.     CALL    BDOS
  2654.     SUI    '0'
  2655.     MOV    B,A
  2656.     JMP    INTRLV3
  2657. INTRLVMSG:
  2658.     DB    13,10,'ENTER INTERLEAVE FACTOR: $'
  2659.     ENDIF
  2660.  
  2661. INTRLV3:
  2662.     MVI    C,0        ;(C) = TABLE DISPLACEMENT
  2663.     MVI    D,1        ;(D) = SECTOR #
  2664.  
  2665. INTRLV4:
  2666.     MOV    A,C
  2667.     LXI    H,INTRLVA
  2668.     CMP    M
  2669.     JC    INTRLV5
  2670.     SUB    M        ;MODULO SPT
  2671.     MOV    C,A
  2672.  
  2673. INTRLV5:
  2674.     LHLD    INTRLVC
  2675.     CALL    DADA
  2676.     MOV    A,M
  2677.     ANA    A
  2678.     JZ    INTRLV6
  2679.  
  2680.     INR    C
  2681.     JMP    INTRLV4
  2682.  
  2683. INTRLV6:
  2684.     MOV    M,D
  2685.     INR    D
  2686.  
  2687.     MOV    A,C
  2688.     ADD    B
  2689.     MOV    C,A
  2690.  
  2691.     LXI    H,INTRLVB
  2692.     DCR    M
  2693.     JNZ    INTRLV4
  2694.  
  2695.     RET
  2696.  
  2697. INTRLVA    DS    1        ;SPT
  2698. INTRLVB    DS    1        ;LOOP COUNTER
  2699. INTRLVC    DS    2        ;ADDR OF TABLE
  2700.  
  2701.     PAGE
  2702. ;C$DU66 -- UNSIGNED 16 / 16 DIVISION.
  2703. ;
  2704. ;    (HL)=(BC)/(DE)
  2705. ;
  2706. ;    ENTRY:    (BC),(DE) PRESET
  2707. ;    EXIT:    (HL) = RESULT
  2708. ;        (DE) = REMAINDER
  2709. ;    USES:    ALL
  2710. C$DU66:    MOV    A,D
  2711.     CMA
  2712.     MOV    D,A
  2713.     MOV    A,E
  2714.     CMA
  2715.     MOV    E,A
  2716.     INX    D
  2717.     MOV    A,D
  2718.     ORA    E
  2719.     JZ    DU665        ;IF DIVIDE BY 0
  2720.     XRA    A
  2721. ;    SHIFT (DE) LEFT UNTIL:
  2722. ;
  2723. ;    1) DE > BL
  2724. ;    2) OVERFLOW
  2725.  
  2726. DU661:    MOV    H,D
  2727.     MOV    L,E
  2728.     DAD    B
  2729.     JNC    DU662        ;IS TOO LARGE
  2730.     INR    A
  2731.     MOV    H,D
  2732.     MOV    L,E
  2733.     DAD    H
  2734.     XCHG
  2735.     JC    DU661
  2736.  
  2737. ;    (DE) OVERFLOWED PUT IT BACK
  2738.     XCHG
  2739.     DCR    A    ;REMOVE EXTRA COUNT
  2740.  
  2741. ;    READY TO START SUBTRACTING. (A)=LOOP COUNT
  2742.  
  2743. DU662:    MOV    H,B    ; (HL) = WORKING VALUE
  2744.     MOV    L,C
  2745.     LXI    B,0    ; (BC) = RESULT
  2746. DU663:    PUSH    PSW
  2747.     DAD    D
  2748.     JC    DU664    ;IF SUBTRACT OK
  2749.     MOV    A,L    ;ADD BACK IN
  2750.     SUB    E
  2751.     MOV    L,A
  2752.     MOV    A,H
  2753.     SBB    D
  2754.     MOV    H,A
  2755. DU664:    MOV    A,C
  2756.     RAL
  2757.     MOV    C,A
  2758.     MOV    A,B
  2759.     RAL
  2760.     MOV    B,A
  2761.  
  2762. ; RIGHT SHIFT (DE)
  2763.  
  2764.     STC
  2765.     MOV    A,D
  2766.     RAR
  2767.     MOV    D,A
  2768.     MOV    A,E
  2769.     RAR
  2770.     MOV    E,A
  2771.     POP    PSW
  2772.     DCR    A
  2773.     JP    DU663    ;IF NOT DONE
  2774. DU665:    XCHG        ;(DE)=REMAINDER
  2775.     MOV    H,B    ;(HL)=RESULT
  2776.     MOV    L,C
  2777.     RET
  2778.  
  2779. ;C$MU86 -- 8 BY 16 BIT MULTIPLICATION
  2780. ;
  2781. ;    ENTRY:    (A) = MULTIPLIER
  2782. ;        (DE)= MULTIPLICAND
  2783. ;    EXIT:    (HL)= RESULT
  2784. ;        'Z' SET IF NOT OVERFLOW
  2785. ;    USES:    A,F,H,L
  2786. ;
  2787. C$MU86:    LXI    H,0    ;(HL) = RESULT ACCUMULATOR
  2788.     PUSH    B
  2789.     MOV    B,H    ;(B) = OVERFLOW FLAG
  2790. MU860:    ORA    A    ;CLEAR CARRY
  2791.  
  2792. MU861:    RAR
  2793.     JNC    MU862    ;IF NOT TO ADD
  2794.     DAD    D
  2795.     JNC    MU862    ;NOT OVERFLOW
  2796.     INR    B
  2797. MU862:    ORA    A
  2798.     JZ    MU863    ;IF DONE
  2799.     XCHG
  2800.     DAD    H
  2801.     XCHG
  2802.     JNC    MU861    ;LOOP IF NOT OVERFLOW
  2803.     INR    B
  2804.     JMP    MU860
  2805.  
  2806. MU863:    ORA    B    ;SET *Z* FLAG IF NOT OVERFLOW
  2807.     POP    B
  2808.     RET
  2809.  
  2810. ;
  2811. ;  CPHLDE -- COMPARE (HL) TO (DE)
  2812. ;
  2813. ;    USES:  A,F
  2814. ;
  2815.  
  2816. CPHLDE:    MOV    A,H
  2817.     CMP    D
  2818.     RNZ
  2819.     MOV    A,L
  2820.     CMP    E
  2821.     RET
  2822.  
  2823. ;
  2824. ;  DADA -- ADD (A) TO (HL)
  2825. ;
  2826. ;    USES:  A,F,H,L
  2827. ;
  2828.  
  2829. DADA:    ADD    L
  2830.     MOV    L,A
  2831.     RNC
  2832.     INR    H
  2833.     RET
  2834.  
  2835. ;
  2836. ;  DISPATCH - CALL APPROPRIATE FORMATTING ROUTINE
  2837. ;
  2838.  
  2839. DISPATCH:
  2840.     LDA    DRTYPE
  2841.     RLC
  2842.     RLC
  2843.     RLC
  2844.     ANI    DPETYPE SHR 5
  2845.     ADD    A
  2846.     LXI    H,FMTRTN
  2847.     CALL    DADA
  2848.     CALL    HLIHL
  2849.     MOV    A,H
  2850.     ORA    L
  2851.     RZ
  2852.     PCHL
  2853.  
  2854. ;
  2855. ;  HLIHL -- LOAD HL FROM SLOT POINTED TO BY HL
  2856. ;
  2857. ;    USES:  A,H,L
  2858. ;
  2859.  
  2860. HLIHL:    MOV    A,M
  2861.     INX    H
  2862.     MOV    H,M
  2863.     MOV    L,A
  2864.     RET
  2865.  
  2866. ;
  2867. ;*    WRLAB - FORM LABEL AND WRITE IT TO 1ST SECTOR OF DISK
  2868. ;
  2869. ;    ENTRY:    NONE
  2870. ;    EXIT:    PSW/C = 0 IF NO ERROR , 1 IF ERROR
  2871. ;    USES:    ALL
  2872. ;
  2873.  
  2874. WRLAB:
  2875.     MVI    A,0E5H        ;CLEAR 128 BYTES OF BUFFER TO 0E5H
  2876.     MVI    B,128
  2877.     LXI    H,BUFFER
  2878.     CALL    F378X
  2879.  
  2880.     MVI    A,LABVER    ;INSERT CURRENT FORM #
  2881.     STA    BUFFER+LABTYP
  2882.  
  2883. ;    MOVE HEATH EXTENSIONS TO LABEL
  2884.  
  2885.     LHLD    DPEPTR        ;GET ADDR OF HEATH EXTENSIONS
  2886.     LXI    D,DPEHTH
  2887.     DAD    D        ;(HL) = HEATH EXTENSIONS
  2888.     LXI    D,BUFFER+LABHTH    ;(DE) = LABEL AREA
  2889.     MVI    B,DPEHL        ;LENGTH OF HEATH EXTENSIONS
  2890.     CALL    MOVEIT
  2891.  
  2892. ;    MOVE DPB TO LABEL
  2893.     LHLD    DPBPTR
  2894.     LXI    D,BUFFER+LABDPB
  2895.     MVI    B,DPBL
  2896.     CALL    MOVEIT
  2897.  
  2898. ;
  2899.  
  2900.     XRA    A        ;CALCULATE CHECKSUM FOR LABEL
  2901.     LXI    H,BUFFER+LABEL
  2902.     MVI    B,LABLEN-1
  2903. WRLAB5:
  2904.     ADD    M
  2905.     INX    H
  2906.     DCR    B
  2907.     JNZ    WRLAB5
  2908.     CMA
  2909.     MOV    M,A        ;PLACE CHECKSUM INTO LABEL
  2910.  
  2911. ;    WRITE LABEL TO DISK.
  2912.  
  2913.     LXI    B,0        ;SET DESIRED CP/M TRACK #
  2914.     CALL    FSETTRK
  2915.     LXI    B,1        ;SET DESIRED CP/M SECTOR #
  2916.     CALL    FSETSEC
  2917.     LXI    B,BUFFER    ;SET DMA
  2918.     CALL    FSETDMA
  2919.     MVI    C,BWRDIR    ;WRITE SECTOR
  2920.     CALL    FWRITE
  2921.     ORA    A        ;Q. ERROR
  2922.     RZ            ; RET IF NO ERROR
  2923.     STC            ;INDICATE ERROR
  2924.     RET
  2925.  
  2926. ;
  2927. ;  MOVEIT -- MOVE BLOCK OF MEMORY
  2928. ;
  2929. ;      ENTRY:    (HL)=SOURCE ADDRESS
  2930. ;        (DE)=DESTINATION ADDRESS
  2931. ;        (B)=COUNT
  2932. ;    EXIT:    NONE
  2933. ;    USES:    ALL
  2934. ;
  2935.  
  2936. MOVEIT:
  2937.     MOV    A,M
  2938.     STAX    D
  2939.     INX    H
  2940.     INX    D
  2941.     DCR    B
  2942.     JNZ    MOVEIT
  2943.     RET
  2944.  
  2945. ;
  2946. ;  SUBHLDE -- (HL)=(DE)-(HL)
  2947. ;
  2948. ;    USES:  A,F,H,L
  2949. ;
  2950.  
  2951. SUBHLDE:
  2952.     MOV    A,E
  2953.     SUB    L
  2954.     MOV    L,A
  2955.     MOV    A,D
  2956.     SBB    H
  2957.     MOV    H,A
  2958.     RET
  2959.  
  2960. ;*
  2961. ;    TMMERR -TYPE MISMATCH ERROR
  2962. ;
  2963.  
  2964. TMMERR    MVI    C,PRCONB
  2965.     LXI    D,MMERR
  2966.     CALL    BDOS
  2967.     JMP    BOOT
  2968.  
  2969.  
  2970. ;***
  2971. ;*    CLINT - COMMAND LINE INTERPRETER
  2972. ;*    BILL EARL 10/12/81
  2973. ;*
  2974. ;*    PARSES COMMAND LINE OPTIONS
  2975. ;*    BYPASSES USER PROMPT SECTION
  2976. ;*    SYNTAX ERRORS OR INVALID FIELDS
  2977. ;*    CAUSE ERROR MESSAGE AND EXIT FROM
  2978. ;*    PROGRAM
  2979. ;*    
  2980. ;*    ENTRY:
  2981. ;*        COMMAND LINE COUNT AT TBUFF
  2982. ;*        COMMAND LINE AT TBUFF + 1
  2983. ;*
  2984. ;*    EXIT:
  2985. ;*        COMMAND LINE COUNT = 0
  2986. ;*
  2987. ;*    USES:    ALL REGISTERS
  2988. ;*
  2989. ;*    CALLS:  RDOPT, WKIND
  2990. ;*
  2991.  
  2992. CLINT    LDA    TBUFF        ;BYTECOUNT
  2993.     MOV    B,A        ;BYTECOUNT IN B
  2994.     LXI    H,TBUFF+1    ;ADDR OF START OF STRING
  2995.  
  2996.     CALL    CSCAN        ;FIND DEVICE NAME
  2997.     CPI    TNAME        ;IS IT A NAME?
  2998.     JNZ    CLI0        ;NOT A NAME
  2999.     MOV    A,B        ;ACCUMULATOR <= BYTECOUNT
  3000.     STA    TBUFF        ;UPDATE BYTECOUNT
  3001.     SHLD    CURSOR        ;UPDATE STRING POINTER
  3002.  
  3003.     LDAX    D        ;GET DRIVE ID
  3004.     STA    DRIVID        ;STORE IT IN DRIVID
  3005.  
  3006.     JMP    CLI1        ;
  3007.  
  3008. ;    DEVICE ERROR
  3009.  
  3010. CLI0    LDAX    D
  3011.     STA    DRMSGA        ;ERRONEOUS DRIVE NAME
  3012.     MVI    C,PRCONB
  3013.     LXI    D,DRMSGA    ;DEVICE ERROR MESSAGE
  3014.     CALL    BDOS
  3015.     CALL    RDQUIT
  3016.  
  3017. CLI1    CALL    RDOPT        ;READ FORMAT OPTIONS
  3018.     RET            ;END OF COMMAND LINE INTERPRETER
  3019.  
  3020.  
  3021. ;**
  3022. ;*    RDOPT - READ OPTIONS
  3023. ;*    BILL EARL 10/12/81
  3024. ;*
  3025. ;*    COMMAND LINE INTERPRETER ROUTINE TO FIND AND SET OPTIONS
  3026. ;*
  3027. ;*    ENTRY:
  3028. ;*        POINTER TO COMMAND STRING AT CURSOR
  3029. ;*        LENGTH OF COMMAND STRING AT TBUFF
  3030. ;*
  3031. ;*    EXIT:
  3032. ;*
  3033. ;*    USES:    ALL REGISTERS
  3034. ;*
  3035. ;*    CALLS:    CSCAN
  3036. ;*
  3037.  
  3038.  
  3039. RDOPT    LDA    TBUFF        ;GET BYTECOUNT
  3040.     MOV    B,A        ;PUT IT IN B
  3041.     LHLD    CURSOR        ;GET STRING POINTER
  3042.     CALL    CSCAN        ;
  3043.     CPI    TEOL        ;END OF LINE?
  3044.     JZ    RDEXIT        ;
  3045.     CPI    TLBR        ;BEGINNING OF OPTIONS
  3046.     JNZ    RDOP9        ;SYNTAX ERROR
  3047.  
  3048. ;    MAIN LOOP
  3049.  
  3050. RDOP0    CALL    CSCAN        ;GET OPTION
  3051.     CPI    TNAME        ;IS IT VALID?
  3052.     JNZ    RDOP9        ;SYNTAX ERROR
  3053.  
  3054. ;    DECODE SECTION
  3055.  
  3056. RDOP1    LDAX    D        ;GET FIRST CHAR.
  3057.     CALL    TOUPPER
  3058.     CPI    'F'        ;FAST?
  3059.     JNZ    RDOP2
  3060.  
  3061. ;    FAST OPTION SELECTED
  3062.  
  3063.     STA    FAST        ;SET FAST FLAG
  3064.     JMP    RDOP6        ;NEXT OPTION
  3065.  
  3066. RDOP2    CPI    'N'        ;NOQUERY?
  3067.     JNZ    RDOP2A
  3068.     
  3069.     MVI    A,TRUE
  3070.     STA    NOQFLG
  3071.     JMP    RDOP6
  3072.     
  3073. RDOP2A    CPI    'D'        ;DOUBLE FACTOR?
  3074.     JNZ    RDOP2B
  3075.  
  3076.     STA    FACTOR        ;SET FACTOR
  3077.     JMP    RDOP4        ;GET PARAMETER
  3078.  
  3079. RDOP2B    CPI    'S'        ;SINGLE FACTOR?
  3080.     JNZ    RDOP2C
  3081.  
  3082.     STA    FACTOR
  3083.     JMP    RDOP4
  3084.  
  3085. RDOP2C    CPI    '1'        ;ONE SIDE
  3086.     JNZ    RDOP2D
  3087.  
  3088.     STA    FACTOR
  3089.     JMP    RDOP3
  3090.  
  3091. RDOP2D    CPI    '2'        ;TWO SIDES
  3092.     JNZ    RDOP10
  3093.  
  3094.     STA    FACTOR
  3095.  
  3096.  
  3097. RDOP3    INX    D        ;IT BETTER BE SIDES!
  3098.     LDAX    D        ;GET NEXT CHAR
  3099.     CALL    TOUPPER
  3100.  
  3101.     CPI    'S'        ;IS IT SIDES
  3102.     JNZ    RDOP10        ;OPTION ERROR. NOT SIDES
  3103.  
  3104.     LDA    FACTOR
  3105.     STA    CLISIDS        ;STORE # OF SIDES
  3106.     JMP    RDOP6
  3107.  
  3108. RDOP4    INX    D        ;NEXT CHAR
  3109.     LDAX    D        ;LOAD IT
  3110.  
  3111.     CPI    'D'        ;DENSITY?
  3112.     JNZ    RDOP10        ;OPTION ERROR
  3113.  
  3114.     LDA    FACTOR        ;GET FACTOR
  3115.     STA    CLIDENS        ;PUT IT IN DENSITY BYTE
  3116. ;    JMP    RDOP6        ;NEXT OPTION
  3117.  
  3118. ;
  3119. ;    END OF OPTION DECODE, GET NEXT OPTION
  3120. ;
  3121.  
  3122. RDOP6    INX    D
  3123.     LDAX    D        ;LOOK AT NEXT CHAR
  3124.     CPI    ']'        ;
  3125.     JZ    RDOP6A        ;
  3126.     CPI    ' '        ;
  3127.     JZ    RDOP6A        ;
  3128.     CPI    ','        ;
  3129.     JNZ    RDOP10        ;ERROR, EXTRA CHARACTERS
  3130.     
  3131.  
  3132. RDOP6A    CALL    CSCAN        ;LOOK FOR MORE
  3133.     CPI    TRBR        ;RIGHT BRACKET?
  3134.     JZ    RDEXIT        ;
  3135.  
  3136.     CPI    TCOMMA        ;IS IT A COMMA?
  3137.     JZ    RDOP0        ;
  3138.     JMP    RDOP9        ;SYNTAX ERROR;
  3139. RDEXIT    RET            ;END OF READ OPTIONS
  3140.  
  3141. ;    ERROR HANDLING
  3142. ;    SYNTAX ERROR
  3143.  
  3144. RDOP9    MVI    C,PRCONB    ;
  3145.     LXI    D,SYNMSG    ;SYNTAX ERROR MESSAGE
  3146.     CALL    BDOS        ;
  3147.     JMP    RDQUIT        ;FATAL ERROR
  3148.  
  3149. ;    ILLEGAL OPTION
  3150.  
  3151. RDOP10    MVI    C,PRCONB    ;
  3152.     LXI    D,OPTMSG    ;OPTION ERROR MESSAGE
  3153.     CALL    BDOS        ;
  3154. ;    JMP    RDQUIT        ;FATAL ERROR
  3155.  
  3156. RDQUIT    JMP    BOOT        ;WARM BOOT 
  3157.  
  3158.  
  3159. ;***    CSCAN - Scanner for CP/M command lines
  3160. ;     
  3161. ;    CSCAN is called to get the next token from a CP/M
  3162. ;       command line.
  3163. ;
  3164. ;       Protocol CALL CSCAN
  3165. ;
  3166. ;    Entry    (HL) = addr of current position in string
  3167. ;        (B)  = number of bytes to end of string
  3168. ;
  3169. ;    Exit    (HL) = updated to addr of byte after token
  3170. ;        (B)  = updated to number of bytes left in string
  3171. ;        (DE) = addr of beginning of token
  3172. ;        (C)  = length of token in bytes
  3173. ;        (A)  = token type
  3174. ;
  3175. ;    the token types are:
  3176. ;        TNAME - a name
  3177. ;        TEQUAL - an equal sign
  3178. ;        TLBR - an "["
  3179. ;        TRBR - an "]"
  3180. ;        TCOMMA - a comma
  3181. ;        TEOL - the end of the command line
  3182. ;        TILG - an illegal token(ie anything else)
  3183. ;
  3184. ;    Uses all registers
  3185. ;
  3186. ;    Revision
  3187. ;        10/14/81 dtp - new
  3188.  
  3189.  
  3190. CSCAN    XRA    A        ; Clear A to zero
  3191.     STA    CSCSTA        ; STATE = 0
  3192.     STA    CSCTSZ        ; TOKSIZ = 0
  3193.     SHLD    CSCSTP        ; Save string ptr
  3194.  
  3195. ;
  3196. ;    Main processing loop
  3197. ;    (B = bytes left)
  3198.  
  3199. CSC00    MOV    A,B        ; Test if bytes left is zero
  3200.     ANA    A
  3201.     JZ    CSC02        ; If bytes left is zero(char class is zero)
  3202.  
  3203. ;    Compute character class
  3204.  
  3205.     LHLD    CSCSTP        ; Get string ptr
  3206.     MOV    A,M        ; Get a byte from the string
  3207.     ANI    7FH        ; Remove parity bit, if present
  3208.     LXI    H,CSCCLT    ; Get addr of class table
  3209.     ADD    L        ; Compute offset in table
  3210.     MOV    L,A        ; STORE IT IN L
  3211.     JNC    CSC01        ; If no carry
  3212.     INR    H        ; Propagate carry
  3213. CSC01    MOV    A,M        ; Get character class
  3214. CSC02    STA    CSCCLS        ; Save class
  3215.  
  3216. ;    Compute addr of scan table entry given state and class
  3217.  
  3218.     LDA    CSCSTA        ; Get current state
  3219.     MVI    E,CSCNCL    ; Get number of classes
  3220.     CALL    MUL88        ; Compute STATE*NCLASS
  3221.     LDA    CSCCLS        ; Get current class
  3222.     ADD    L        ; Compute STATE*NCLASS + CLASS
  3223.     MOV    L,A        ; STORE IT IN L
  3224.     JNC    CSC03        ; If no carry
  3225.     INR    H        ; Propagate carry
  3226. CSC03    DAD    H        ; Compute 2*(STATE*NCLASS + CLASS)
  3227.     LXI    D,CSCSNT    ; Get addr of scan table
  3228.     DAD    D        ; Compute addr of scan table entry
  3229.  
  3230. ;    Get scan table entry
  3231.  
  3232.     MOV    A,M        ; Get action (SCANTAB.ACT)
  3233.     INX    H        ; Point to second byte
  3234.     MOV    C,M        ; Get argument (SCANTAB.ARG)
  3235.  
  3236. ;    Decode and perform actions
  3237.  
  3238.     RAR            ; Test to set token start
  3239.     JNC    CSC04        ; If not
  3240.     LHLD    CSCSTP        ; Get string ptr
  3241.     SHLD    CSCTKP        ; TOKPTR = STRPTR
  3242.  
  3243. CSC04    RAR            ; Test to incr token size
  3244.     JNC    CSC05        ; If not
  3245.     LXI    H,CSCTSZ    ; Get addr of TOKSIZ
  3246.     INR    M        ; TOKSIZ = TOKSIZ + 1
  3247.  
  3248. CSC05     RAR            ; Test to incr string position
  3249.     JNC    CSC06        ; If not
  3250.     LHLD    CSCSTP        ; Get string ptr
  3251.     INX    H        ; STRPTR = STRPTR + 1
  3252.     SHLD    CSCSTP        ; Store string ptr
  3253.     DCR    B        ; BYTESLEFT = BYTESLEFT - 1
  3254.     
  3255. CSC06    ANI    CSCAMK        ; Isolate transition type
  3256.     JNZ    CSC07        ; If "RETURN" transition
  3257.  
  3258. ;    "GOTO" transition
  3259.  
  3260.     MOV    A,C        ; Get SCANTAB.ARG
  3261.     STA    CSCSTA        ; STATE = SCANTAB.ARG
  3262.     JMP    CSC00        ; Do forever
  3263.  
  3264. ;    "RETURN" transition
  3265.  
  3266. CSC07    MOV    D,C        ; Save token type
  3267.     LDA    CSCTSZ        ; Get token size
  3268.     MOV    C,A        ; To proper reg
  3269.     MOV    A,D        ; Token type to proper reg
  3270.     LHLD    CSCTKP        ; Get token ptr
  3271.     XCHG            ; To proper regs (DE)
  3272.     LHLD    CSCSTP        ; Get string ptr
  3273.     RET            ; Return to caller
  3274.  
  3275.  
  3276. ;    Define the variables
  3277.  
  3278. CSCSTA    DS    1    ; STATE - the state of the finite state machine
  3279. CSCCLS    DS    1    ; CLASS - the class of the current character
  3280. CSCSTP  DS    2    ; STRPTR - ptr to current character in string
  3281. CSCTKP    DS    2    ; TOKPTR - ptr to token in string
  3282. CSCTSZ    DS    1    ; TOKSIZ - token size
  3283.  
  3284.  
  3285. ;    Define constants and tables
  3286.  
  3287. TNAME    EQU    1    ; Name token
  3288. TEQUAL    EQU    2    ; Equal sign token
  3289. TLBR    EQU    3    ; Left brace token
  3290. TRBR    EQU    4    ; Right brace token
  3291. TCOMMA    EQU    5    ; Comma token
  3292. TEOL    EQU    6    ; End-of-line token
  3293. TILG    EQU    7    ; Illegal type token
  3294.  
  3295. CSCACR    EQU    08H    ; "RETURN" action
  3296. CSCACG    EQU    00H    ; "GOTO" action
  3297. CSCACS    EQU    01H    ; Set token start action
  3298. CSCACA    EQU    02H    ; Increase token size action
  3299. CSCACI    EQU    04H    ; Increase string ptr action
  3300.  
  3301. CSCAMK    EQU    01H    ; Action mask
  3302. CSCNST    EQU    2    ; Number of states
  3303. CSCNCL    EQU    8    ; Number of character classes
  3304.  
  3305. ;    The character classes and the character class table
  3306.  
  3307. CSCEOL    EQU    0    ; End of line class
  3308. CSCILG    EQU    1    ; Illegal character class
  3309. CSCEQU    EQU    2    ; Equal sign class
  3310. CSCLBR    EQU    3    ; Left brace class
  3311. CSCRBR    EQU    4    ; Right brace class
  3312. CSCBNK    EQU    5    ; Blank/tab class
  3313. CSCCOM    EQU    6    ; Comma class
  3314. CSCNAM    EQU    7    ; Name class
  3315.  
  3316. ; for each of the 128 characters, define which class in which it belongs
  3317.  
  3318. CSCCLT    DB    CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 00-07
  3319.     DB    CSCILG,CSCBNK,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 08-15
  3320.     DB    CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 16-23
  3321.     DB    CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 24-31
  3322.     DB    CSCBNK,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 32-39
  3323.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCCOM,CSCNAM,CSCNAM,CSCNAM ; 40-47
  3324.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 48-55
  3325.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCEQU,CSCNAM,CSCNAM ; 56-63
  3326.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 64-71
  3327.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 72-79
  3328.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 80-87
  3329.     DB    CSCNAM,CSCNAM,CSCNAM,CSCLBR,CSCNAM,CSCRBR,CSCNAM,CSCNAM ; 88-95
  3330.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 96-03
  3331.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 04-11
  3332.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 12-19
  3333.     DB    CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 20-27
  3334.  
  3335.  
  3336. ;    The Scanner State table
  3337.  
  3338. CSCSNT    DB    CSCACS+CSCACA+CSCACI+CSCACR,TEOL    ; CSCEOL
  3339.     DB    CSCACS+CSCACA+CSCACI+CSCACR,TILG    ; CSCILG
  3340.     DB    CSCACS+CSCACA+CSCACI+CSCACR,TEQUAL    ; CSCEQU
  3341.     DB    CSCACS+CSCACA+CSCACI+CSCACR,TLBR    ; CSCLBR
  3342.     DB    CSCACS+CSCACA+CSCACI+CSCACR,TRBR    ; CSCRBR
  3343.     DB    CSCACI+CSCACG,0                ; CSCBNK
  3344.     DB    CSCACS+CSCACA+CSCACI+CSCACR,TCOMMA    ; CSCCOM
  3345.     DB    CSCACS+CSCACA+CSCACI+CSCACG,1        ; CSCNAM
  3346.  
  3347.     DB    CSCACR,TNAME                ; CSCEOL
  3348.     DB    CSCACR,TNAME                ; CSCILG
  3349.     DB    CSCACR,TNAME                ; CSCEQU
  3350.     DB    CSCACR,TNAME                ; CSCLBR
  3351.     DB    CSCACR,TNAME                ; CSCRBR
  3352.     DB    CSCACR,TNAME                ; CSCBNK
  3353.     DB    CSCACR,TNAME                ; CSCCOM
  3354.     DB    CSCACA+CSCACI+CSCACG,1            ; CSCNAM
  3355.  
  3356. ***    MUL88 - Multiply 8X8 Unsigned
  3357. *
  3358. *    MUL88 Multiplies a 8 bit value by a 8 bit value
  3359. *    to give a 16 bit result.
  3360. *
  3361. *    ENTRY    (A) = Multiplier
  3362. *        (E) = Multiplicand
  3363. *
  3364. *    EXIT    (HL) = result
  3365. *
  3366. *    Uses A,D,E,H,L
  3367. *
  3368. *    Revision
  3369. *        10/15/81 dtp - converted form MUL86
  3370.  
  3371. MUL88    LXI    H,0        ; Result = 0
  3372.     MOV    D,H        ; Clear D to 0
  3373.     ANA    A        ; CLEAR CARRY
  3374.  
  3375. ;    For each bit that is on in the multiplier, add the multiplicand
  3376. ;    raised to the appropriate power of two to the result.
  3377. ;    (Cy = 0)
  3378.  
  3379. MUL00    RAR            ; Look at next bit in multiplier
  3380.     JNC    MUL01        ; If bit zero
  3381.     DAD    D        ; Add in current multiplicand
  3382. MUL01    ORA    A        ; See if finished(any bits left)
  3383.     RZ            ; If done
  3384.     XCHG            ; Swap result and current multiplicand
  3385.     DAD    H        ; Mult multiplicand by 2
  3386.     XCHG            ; Put back in proper regs
  3387.     JMP    MUL00        ; Continue
  3388.  
  3389.  
  3390.  
  3391.     PAGE
  3392. BADBIOS    DS    0
  3393.     DB    'Incorrect version of the BIOS',CR,LF,CPMEOM
  3394. WHICH    DB    CR,LF,CR,LF
  3395.     DB    'Which drive do you wish to use for this operation?'
  3396.     DB    ': $'
  3397.  
  3398. WDSDMSG: DB    CR,LF,CR,LF
  3399.     DB    'Which density? (S=single, D=double): $'
  3400.  
  3401. WSMSG:    DB    CR,LF,CR,LF
  3402.     DB    'Number of sides? (1=single, 2=double): $'
  3403.  
  3404. DRMSG:    DB    CR,LF,BELL
  3405.     DB    'Drive '
  3406. DRMSGA    DB    ' '
  3407.     DB    ' not available in current configuration.'
  3408.     DB    CR,LF,'$'
  3409.  
  3410. PROMPT:    DB    CR,LF,CR,LF
  3411.     DB    'Put the disk you wish to be formatted in drive '
  3412. PROMPTA    DB    '0','.$'
  3413. PROMPT1    DB    CR,LF
  3414.     DB    'Press RETURN to begin, anything else to abort.',CR,LF,'$'
  3415. WPMSG:    DB    CR,LF,BELL
  3416.     DB    'Unable to format this disk. It is write protected.$'
  3417.  
  3418. AMWMSG:    DB    CR,LF
  3419.     DB    'Do you have more disks to format? (y/n): $'
  3420.  
  3421. LVEMSG:    DB    CR,LF
  3422.     DB    'Place a bootable disk in drive A and press any character:'
  3423.     DB    '$'
  3424.  
  3425. WPEMSG    DB    CR,LF,'Disk is write protected'
  3426. BMSG    DB    CR,LF,BELL,'Unable to format this disk.',CR,LF,'$'
  3427.  
  3428. SYNMSG  DB    CR,LF,BELL,'ILLEGAL COMMAND SYNTAX',CR,LF,'$'
  3429.  
  3430. OPTMSG    DB    CR,LF,BELL,'ILLEGAL FORMAT OPTION',CR,LF,'$'
  3431. MMERR    DB    CR,LF,BELL,'DISK IS NOT OF TYPE SPECIFIED',CR,LF,'$'
  3432.  
  3433. FMTRTN    DS    0
  3434.     DW    0
  3435.     DW    F37
  3436.     DW    F217
  3437.     DW    0
  3438.     DW    0
  3439.     DW    0
  3440.     DW    0
  3441.     DW    0
  3442.  
  3443. CURSOR    DW    0    ;COMMAND STRING INDEX
  3444. COMLIN    DB    FALSE    ;COMMAND LINE FLAG
  3445. NOQFLG    DB    FALSE    ;NO QUERY FLAG
  3446. FACTOR    DB    0    ;COMMAND STRING OPTION FACTOR (S,D,1,2)
  3447. CLIDENS    DB    'D'    ;COMMAND STRING DENSITY RESULT
  3448. CLISIDS    DB    '2'    ;COMMAND STRING SIDES RESULT
  3449. DRIVID    DB    'Z'    ;COMMAND LINE DRIVE ID
  3450. SYSDSK    DB    0    ;SYSTEM DISK INVOLVED FLAG
  3451. TFLG    DB    0    ;DISK TYPE CHECK. DEFAULT NO CARE.
  3452. FAST    DB    0    ;fast flag defaults to off
  3453. DENSITY DB    0    ;density to be used
  3454.  
  3455.  
  3456. DPEPTR    DS    2    ;DISK PARAMETER ENTRIES POINTER
  3457. DPBPTR    DS    2    ;DISK PARAMETER BLOCK POINTER
  3458. DSKTKS    DS    1    ;number of tracks
  3459. DSKSPT    DS    1    ;SECTORS PER TRACK
  3460. TRACK    DS    1    ;TRACK COUNTER
  3461. SIDES    DS    1    ;# SIDES
  3462. AIOUNI    DS    1
  3463. DRTYPE    DS    1
  3464. FLAG2    DS    1
  3465.  
  3466. BUFFER    EQU    $
  3467.  
  3468.     END    START
  3469. PER TRACK
  3470. TRACK    DS    1    ;TRACK COUNTER
  3471. SIDES    DS    1    ;# SIDES
  3472. AIOUNI    DS    1
  3473. DRTYPE    DS    1
  3474. FLAG2    DS    1
  3475.  
  3476. BUFFER    EQU    $
  3477.