home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol005 / 3812diag.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  92.4 KB  |  2,784 lines

  1. ;************************************************************************
  2. ;                 MICROCOSM ASSOCIATES DISK DIAGNOSTIC
  3. ;                                FOR 
  4. ;                    ICOM FD3812 VER.1.0  (C) 1979
  5. ;************************************************************************
  6. ;
  7. ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY:
  8. ;KELLY SMITH, MICROCOSM ASSOCIATES
  9. ;3055 WACO AVENUE
  10. ;SIMI VALLEY, CALIFORNIA, 93065
  11. ;(805) 527-9321 (MODEM, CP/M-NET (TM))
  12. ;(805) 527-0518 (VERBAL)
  13. ;
  14. ;
  15. ;
  16. ;
  17. ;
  18.          ORG     00100H
  19. ;
  20.          DI                      ;DISABLE INTERRUPTS
  21.          LXI     SP,STACK        ;SET THE STACK POINTER
  22.          JMP     INIT            ;INITIALIZE
  23. ;
  24. ;
  25. ;
  26. ;
  27. ;
  28. ;
  29. ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BOARD
  30. ;
  31. CCTRL    EQU     010H    ;CONSOLE COMMAND/STATUS PORT
  32. CDATA    EQU     011H    ;CONSOLE DATA PORT
  33. CRRDY    EQU     001H    ;RECEIVER READY BIT
  34. CTRDY    EQU     002H    ;TRANSMITTER READY BIT
  35. ;
  36. ;
  37. ;
  38. ;DEFINE DOUBLE DENSITY CONTROLLER I/O PARAMETERS
  39. ;
  40. CNTRL    EQU     0C0H    ;CONTROL COMMANDS
  41. DATAO    EQU     0C1H    ;DATA OUT
  42. DATAI    EQU     0C0H    ;DATA IN
  43. ;
  44. ;
  45. ;
  46. ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE
  47.  
  48. NBL:     SUI     '0'
  49.          RC
  50.          ADI     0E9H
  51.          RC
  52.          ADI     6
  53.          JP      NIO
  54.          ADI     7
  55.          RC
  56. NIO:     ADI     10
  57.          ORA     A
  58.          RET
  59. ;
  60. ;
  61. ;
  62. ;SUBROUTINE TO CONVERT A BYTE TO TWO HEX CHARACTERS
  63.  
  64. LBYTE:   PUSH    PSW
  65.          RRC
  66.          RRC
  67.          RRC
  68.          RRC
  69.          ANI     0FH
  70.          CALL    HXDA
  71.          POP     PSW
  72.          ANI     0FH
  73. HXDA:    CPI     10
  74.          JM      CNO
  75.          ADI     7
  76. CNO:     ADI     30H
  77.          MOV     C,A
  78.          JMP     CO
  79. ;
  80. ;
  81. ;
  82. ;        CONSOLE INPUT ROUTINE
  83. ;
  84. CI:      IN      CCTRL
  85.          ANI     CRRDY
  86.          JZ      CI
  87.          IN      CDATA
  88.          ANI     7FH
  89.          RET
  90. ;
  91. ;
  92. ;
  93. CRLF:    MVI     C,0DH
  94.          CALL    CO
  95.          MVI     C,0AH
  96.          JMP     CO
  97. ;
  98. CONO:    CALL    BYTEO
  99.          CALL    CRLF
  100.          RET
  101. ;
  102. CONI:    CALL    BYTEC
  103.          RET
  104. ;
  105. ;        CONSOLE OUTPUT ROUTINE
  106. ;
  107. CO:      IN      CCTRL
  108.          ANI     CTRDY
  109.          JZ      CO
  110.          MOV     A,C
  111.          OUT     CDATA
  112.          RET
  113. ;
  114. ;
  115. ;
  116. ;
  117. ;
  118. ;INITIALIZE ALL PROGRAM CONTROL PARAMETERS AND OUTPUT OPERATING INSTRUCTIONS
  119. ;
  120. INIT:     LXI     H,01000H    ;DELAY COUNT FOR 6850 ACIA SETTLE
  121. INITD:     DCX     H
  122.      MOV     A,H
  123.      ORA     L
  124.      JNZ     INITD
  125.      MVI     A,003H  ;SET-UP CONSOLE SERIAL I/O
  126.          OUT     CCTRL
  127.          MVI     A,0B5H
  128.          OUT     CCTRL
  129.          CALL    TEXT    ;OUTPUT OPERATING INSTRUCTIONS TO CONSOLE
  130. ;
  131. ;
  132. ;
  133. ;TEXT TABLE OF OPERATING INSTRUCTIONS
  134. ;
  135.      DB     0DH,0AH,' MICROCOSM DISK DIAGNOSTIC FOR ICOM/ALTAIR FD3812 '
  136.      DB     '  VERSION 1.0  (C) 1979'
  137.          DB      0DH,0AH,0AH,0AH,' OPERATING INSTRUCTION ARE AS FOLLOWS:'
  138.          DB      0DH,0AH
  139.          DB      0DH,0AH,20H,'RESPOND TO ALL "=" CHARACTERS, '
  140.          DB      'WITH A TWO DIGIT HEX VALUE OR '
  141.          DB      'ALPHA CHARACTER '
  142.          DB      0DH,0AH
  143.          DB      'FOR ALL TEST FUNCTIONS EXCEPT,'
  144.          DB      0DH,0AH,'MEMORY ADDRESS(0000-FFFF)=,'
  145.          DB      'AND GO ADDRESS(0000-FFFF)='
  146.          DB      0DH,0AH,'(FOUR DIGIT HEX VALUES ARE REQUIRED'
  147.          DB      ',TERMINATED WITH CARRAIGE-RETURN)'
  148.          DB      0DH,0AH,0AH,020H
  149.          DB      'IMPROPER KEY-BOARD ENTRYS WILL BE '
  150.          DB      'PROMPTED,WITH A "?" CHARACTER,'
  151.          DB      0DH,0AH,'OR AN "INVALID" MESSAGE '
  152.          DB      ' (PLEASE PRESS SPACE-BAR)'
  153. ;
  154. ;
  155. ;
  156.          DB      080H    ;END OF TEXT FLAG
  157. ;
  158. ;
  159. ;
  160.          MVI     B,11    ;SET-UP 11 LINE-FEEDS
  161.          CALL    LFEED
  162.          CALL    BAR     ;WAIT FOR OPERATOR TO PRESS SPACE-BAR
  163. ;
  164. ;
  165. ;
  166.          CALL    TEXT    ;OUTPUT MORE TEXT TO CONSOLE
  167. ;
  168. ;
  169. ;
  170.          DB      0DH,0AH,0AH,0AH,0AH,20H
  171.          DB      'THE FOLLOWING IS A '
  172.          DB      'LIST OF ALL COMMANDS:'
  173.          DB      0DH,0AH,20H
  174.          DB      'ENTER A KEY-BOARD CHARACTER '
  175.          DB      'AS REQUIRED,FOR '
  176.          DB      'TEST EXECUTION'
  177.          DB      0DH,0AH
  178.          DB      0DH,0AH,20H,'M.....MEMORY ADDRESS(0000-FFFF)='
  179.          DB      0DH,0AH,20H,'G.....GO ADDRESS(0000-FFFF)='
  180.          DB      0DH,0AH,20H,'U.....UNIT SELECT(00-03)='
  181.          DB      0DH,0AH,20H,'D.....DOOR LOCK(Y,N)?'
  182.          DB      0DH,0AH,20H,'L.....LOOP'
  183.          DB      0DH,0AH,20H,'CONTROL-A.....ALIGNMENT,AUTO(Y,N)?'
  184.          DB      0DH,0AH,20H,'H.....HOME'
  185.          DB      0DH,0AH,20H,'E.....ENABLE DRIVE(00-03)='
  186.          DB      0DH,0AH,20H,'C.....CLEAR'
  187.          DB      0DH,0AH,20H,'CONTROL-T.....TIMER CONTROL(Y,N)?'
  188.          DB      0DH,0AH,20H,'CONTROL-P.....WRITE PROTECT(Y,N)?'
  189.          DB      0DH,0AH,20H,'S.....SEEK TO TRACK(00-4C)='
  190.          DB      0DH,0AH,20H,'R.....READ SECTOR(01-1A)='
  191.          DB      0DH,0AH,20H,'W.....WRITE SECTOR(01=1A)='
  192.          DB      0DH,0AH,20H,'F.....FORMAT SINGLE TRACK(Y,N)?'
  193.          DB      0DH,0AH,20H,'P.....PATTERN(00-FF)='
  194.          DB      0DH,0AH,20H,'T.....TEST WRITE/READ CONTINUOUS'
  195.          DB      0DH,0AH,20H,'CONTROL-S.....SYSTEM TEST'
  196.          DB      0DH,0AH,07H,20H
  197.          DB      'SPACE-BAR.....ABORTS ANY '
  198.          DB      'TEST OR "HANG-UP" '
  199.          DB      '  (PLEASE PRESS SPACE-BAR)'
  200. ;
  201. ;
  202. ;
  203.          DB      080H    ;END OF TEXT FLAG
  204. ;
  205. ;
  206. ;
  207.          CALL    BAR     ;WAIT FOR OPERATOR TO PRESS SPACE-BAR
  208.          MVI     B,25    ;SET-UP 25 LINE-FEEDS
  209.          CALL    LFEED
  210. ;
  211. ;
  212. ;
  213.          CALL    TEXT    ;OUTPUT MORE TEXT TO CONSOLE
  214. ;
  215. ;
  216. ;
  217.          DB      0DH,0AH,20H
  218.          DB      'THE FOLLOWING IS A SYSTEM '
  219.          DB      'STATUS TEST:'
  220.          DB      0DH,0AH
  221. ;
  222. ;
  223. ;
  224.          DB      080H    ;END OF TEXT FLAG
  225. ;
  226. ;
  227. ;
  228.          MVI     A,001H  ;SET SECTOR NUMBER TO 01
  229.          STA     SECNO
  230.          XRA     A       ;CLEAR ALL UNITS OF DISK REMOVED STATUS,
  231.                          ; AND INDICATE ANY UNITS WITH 
  232.                          ; DISK FAIL STATUS
  233.          STA     HDSEL   ;CLEAR HEAD SELECT
  234.          CALL    TCHK    ;TEST CHECK,UNIT 00
  235.          MVI     A,040H
  236.          CALL    TCHK    ;TEST CHECK,UNIT 01
  237.          MVI     A,080H
  238.          CALL    TCHK    ;TEST CHECK,UNIT 02
  239.          MVI     A,0C0H
  240.          CALL    TCHK    ;TEST CHECK,UNIT 03
  241.          MVI     B,10    ;OUTPUT 10 LINE-FEEDS TO CONSOLE
  242.          CALL    LFEED
  243.          XRA     A
  244.          STA     UNIT    ;SET UP INITIAL SELECT FOR DRIVE 00
  245.          STA     DELET   ;CLEAR DELETED DATA MARK COMMAND
  246.          STA     DDSEL   ;CLEAR DOUBLE DENSITY SELECT
  247.          STA     DDSAV   ;CLEAR DENSITY "SAVE" STATE
  248.          STA     XTEND   ;CLEAR EXTENDED FORMAT COMMAND
  249.          STA     XTSAV   ;CLEAR EXTENDED FORMAT "SAVE" STATE
  250.          STA     MODE    ;CLEAR FORMAT MODE
  251.          STA     MTREN   ;CLEAR DRIVE MOTOR ENABLES
  252.          STA     LOCK    ;CLEAR DOOR LOCK
  253.          STA     RETRY   ;CLEAR READ ERROR RETRY COUNTER
  254.          STA     TIME    ;CLEAR TIMER COMMAND
  255.          STA     SAVE    ;CLEAR "SAVED STATUS"
  256.          STA     RDCRC   ;CLEAR READ CRC COMMAND
  257.          STA     WPROT   ;CLEAR WRITE PROTECT COMMAND
  258.          STA     VFYCM   ;CLEAR VERIFY COMMAND
  259.          LXI     H,000H
  260.          SHLD    ECTR    ;CLEAR ERROR COUNTER
  261.          SHLD    PCTR    ;CLEAR PASS COUNTER
  262.          MVI     A,005H  ;SET NUMBER OF ERROR RETRIES TO 5 DECIMAL
  263.          STA     TRIES
  264. ;
  265. ;
  266. ;
  267. MNTR:    XRA     A       ;CLEAR A REG.
  268.          STA     BLOOP   ;CLEAR LOOP COMMAND
  269.          STA     MODE    ;CLEAR FORMAT MODE
  270.          STA     VFYCM   ;CLEAR VERIFY COMMAND
  271. MNTR1:   LXI     SP,STACK
  272.          CALL    CRLF
  273.          MVI     C,07H   ;OUTPUT BELL
  274.          CALL    CO
  275.          MVI     C,40H   ;OUTPUT PROMPT (@ CHARACTER)
  276.          CALL    CO
  277.          CALL    CECHO   ;ECHO KEY-BOARD INPUT OUT TO CONSOLE
  278.      CPI    003H
  279.      JZ    00000H    ;JUMP TO CP/M WARM BOOT,IF "CONTROL-C"
  280.          CPI     'M'
  281.          JZ      MEM     ;JUMP TO MEMORY DISPLAY/ALTER
  282.          CPI     'G'
  283.          JZ      GO      ;JUMP TO GO
  284.          CPI     'D'
  285.          JZ      DOOR    ;JUMP TO LOCK OR UNLOCK DOOR
  286.          CPI     'U'
  287.          JZ      UNITS   ;JUMP TO UNIT SELECT
  288.          CPI     'E'
  289.          JZ      ENAB    ;JUMP TO ENABLE DRIVE MOTORS
  290.          CPI     'H'
  291.          JZ      HOME    ;JUMP TO HOME (SEEK TO TRACK 00)
  292.          CPI     'S'
  293.          JZ      SKT     ;JUMP TO SEEK TO TRACK
  294.          CPI     013H
  295.          JZ      SYS     ;JUMP TO SYSTEM TEST,IF "CONTROL-S"
  296.          CPI     'W'
  297.          JZ      WRT     ;JUMP TO WRITE SECTOR
  298.          CPI     'R'
  299.          JZ      RDT     ;JUMP TO READ SECTOR
  300.          CPI     'C'
  301.          JZ      CLR     ;JUMP TO CLEAR CONTROLLER
  302.          CPI     'T'
  303.          JZ      RWC     ;JUMP TO WRITE/READ CONTINUOUS
  304.          CPI     'F'
  305.          JZ      FORM    ;JUMP TO FORMAT DISKETTE
  306.          CPI     'P'
  307.          JZ      PATT    ;JUMP TO SET DATA PATTERN
  308.          CPI     'L'
  309.          JZ      LOOP    ;JUMP TO SET LOOP COMMAND
  310.          CPI     014H    
  311.          JZ      TIMER   ;SET TIMER CONTROL,IF "CONTROL-T"
  312.          CPI     010H
  313.          JZ      PROT    ;SET WRITE PROTECT,IF "CONTROL-P"
  314.          CPI     001H
  315.          JZ      ALIN    ;JUMP TO ALIGNMENT,IF "CONTROL-A"
  316.          CPI     'V'
  317.          JZ      VRFYT   ;JUMP TO VERIFY (READ CRC,ALL TRACKS/SECTORS)
  318. LER:     MVI     C,'?'   ;LINE INPUT ERROR, OUTPUT "?" TO CONSOLE
  319.          CALL    CO
  320.          JMP     MNTR
  321. ;
  322. ;
  323. CECHO:   CALL    CI
  324.          MOV     C,A
  325.          CALL    CO
  326.          RET
  327. ;
  328. ;
  329. GO:      LXI     H,MSG25         ;OUTPUT GO ADDRESS? TO CONSOLE
  330.          CALL    MSG
  331.          CALL    PARAM
  332.          CALL    CRLF
  333.          PCHL
  334. ;
  335. ;
  336. PARAM:   LXI     H,0
  337. PARM1:   CALL    CECHO
  338.          CPI     0DH
  339.          RZ
  340.          DAD     H
  341.          DAD     H
  342.          DAD     H
  343.          DAD     H
  344.          JC      LER
  345.          CALL    NBL
  346.          JC      LER
  347.          ORA     L
  348.          MOV     L,A
  349.          JMP     PARM1
  350. ;
  351. ;
  352. BYTEC:   CALL    CECHO
  353. BYTC1:   CALL    NBL
  354.          JC      LER
  355.          RLC
  356.          RLC
  357.          RLC
  358.          RLC
  359.          PUSH    PSW
  360.          CALL    CECHO
  361.          CALL    NBL
  362.          JC      LER
  363.          POP     B
  364.          ORA     B
  365.          RET
  366. ;
  367. ;
  368. BYTEO:   PUSH    PSW
  369.          CALL    BYTO1
  370.          MOV     C,A
  371.          CALL    CO
  372.          POP     PSW
  373.          CALL    BYTO2
  374.          MOV     C,A
  375.          JMP     CO
  376. ;
  377. ;
  378. BYTO1:   RRC
  379.          RRC
  380.          RRC
  381.          RRC
  382. BYTO2:   ANI     0FH
  383.          CPI     0AH
  384.          JM      BYTO3
  385.          ADI     7
  386. BYTO3:   ADI     30H
  387.          RET
  388. ;
  389. ;
  390. HLCO:    CALL    CRLF
  391.          MOV     A,H
  392.          CALL    BYTEO
  393.          MOV     A,L
  394.          CALL    BYTEO
  395.          RET
  396. ;
  397. ;
  398. DSPYM:   CALL    HLCO
  399.          MVI     C,'='
  400.          CALL    CO
  401.          MOV     A,M
  402.          CALL    BYTEO
  403.          MVI     C,20H
  404.          CALL    CO
  405.          RET
  406. ;
  407. ;
  408. MEM:     LXI     H,MSG14
  409.          CALL    MSG
  410.          CALL    PARAM
  411. MEM1:    CALL    DSPYM
  412.          CALL    CECHO
  413.          CPI     05EH    ;NEED TO BACK-UP?
  414.          JZ      MEM10
  415.          CPI     0DH
  416.          JZ      MNTR
  417.          CPI     20H
  418.          JZ      MEM9
  419.          CALL    BYTC1
  420.          MOV     M,A
  421. MEM9:    INX     H
  422.          JMP     MEM1
  423. MEM10:   DCX     H
  424.          JMP     MEM1
  425. ;
  426. ;
  427. ;
  428. TIMER:   LXI     H,MSG45         ;OUTPUT "TIMER CONTROL?" TO CONSOLE
  429.          CALL    MSG
  430.          CALL    CECHO
  431.          CPI     'Y'
  432.          JZ      TIMEY
  433.          CPI     'N'
  434.          JZ      TIMEN
  435.          JMP     LER
  436. TIMEY:   MVI     A,001H  ;SET TIMER CONTROL
  437.          JMP     TIMES
  438. TIMEN:   XRA     A       ;RESET TIMER CONTROL
  439. TIMES:   STA     TIME
  440.          JMP     MNTR1
  441. ;
  442. ;
  443. ;
  444. ;SUBROUTINE TO KILL TIME AS REQUIRED
  445. ;(TOTAL DELAY OF TIME1+TIME2+TIME3 EQUALS 2.5 SECONDS)
  446. ;
  447. TIME1:   LXI     H,0FFFFH        ;LOAD DELAY CONSTANT
  448. TIMEA:   DCX     H       ;-1 TO H&L REGS.
  449.          MOV     A,L
  450.          ORA     H
  451.          JNZ     TIMEA   ;GO AGAIN,UNTIL TIMED OUT 
  452. TIME2:   LXI     H,0FFFFH
  453. TIMEB:   DCX     H
  454.          MOV     A,L
  455.          ORA     H
  456.          JNZ     TIMEB
  457. TIME3:   LXI     H,00FFFH
  458. TIMEC:   DCX     H
  459.          MOV     A,L
  460.          ORA     H
  461.          JNZ     TIMEC
  462.          RET
  463. ;
  464. ;
  465. ;
  466. ;KEY-BOARD INTERRUPT ROUTINE, KEYED WITH "SPACE-BAR"
  467. ;
  468. KBINT:   IN      CCTRL
  469.          ANI     CRRDY
  470.          RZ
  471.          IN      CDATA
  472.          ANI     07FH    ;MASK-OFF PARITY BIT 
  473.          CPI     020H
  474.          JZ      MNTR    ;GO TO MONITOR IF SPACE-BAR
  475.          RET
  476. ;
  477. ;
  478. ;
  479. ;ROUTINE TO OUTPUT LINE-FEEDS TO CONSOLE
  480. ; (ASSUMES QUANTITY OF LINE-FEEDS TO BE IN B REG.)
  481. ;
  482. LFEED:   MVI     C,00AH  ;OUTPUT A LINE-FEED TO CONSOLE
  483.          CALL    CO
  484.          DCR     B
  485.          JNZ     LFEED
  486.          RET
  487. ;
  488. ;
  489. ;
  490. ;ROUTINE TO "PAUSE" WHILE OPERATOR READS TEXT
  491. ; (ASSUMES PAUSE ITERATIONS TO BE IN B REG.)
  492. ;
  493. PAUSE:   LXI     H,0FFFFH        ;SET-UP PAUSE DELAY
  494.          CALL    DLY
  495.          DCR     B
  496.          JNZ     PAUSE
  497.          RET
  498. ;
  499. ;
  500. ;
  501. ;ROUTINE TO DO TEST CHECK ON DRIVES
  502. ; (ASSUMES UNIT NUMBER TO BE IN A REG.)
  503. ;
  504. TCHK:    STA     UNIT    ;SAVE UNIT NUMBER
  505.          CALL    XMTUS
  506.          CALL    UNCHK   ;CHECK UNIT CODE BITS FOR A MATCH
  507.                          ; TO THE SELECTED UNIT
  508.          CALL    WPCHK   ;CHECK WRITE PROTECT STATUS
  509.          IN      DATAI   ;GET STATUS
  510.          ANI     020H    ;DRIVE FAIL?
  511.          RNZ
  512.          CALL    CRLF
  513.          CALL    SP1
  514.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  515.          CALL    MSG
  516.          CALL    AUNIT   ;OUTPUT UNIT NUMBER TO CONSOLE
  517.          CALL    BYTEO
  518.          CALL    SP1
  519.          LXI     H,MSG24         ;OUTPUT "READY FOR TEST" TO CONSOLE
  520.          CALL    MSG
  521.          CALL    CRLF    ;KEEP IT NEAT 
  522.          RET
  523. ;
  524. ;
  525. ;
  526. ;ROUTINE TO WAIT FOR SPACE-BAR FROM KEY-BOARD
  527. ;
  528. BAR:     IN      CCTRL
  529.          ANI     CRRDY
  530.          JZ      BAR     ;OOPS KEY-BOARD NOT ACTIVE   
  531.          IN      CDATA
  532.          ANI     07FH    ;MASK-OFF PARITY BIT
  533.          CPI     020H    ;SPACE-BAR?
  534.          JNZ     BAR     ;NO KEEP WAITING 
  535.          RET
  536. ;
  537. ;
  538. ;
  539. ;ROUTINE TO CAUSE "LOOPING" ON A TEST
  540. ;
  541. LOOP:    LXI     H,MSG38         ;OUTPUT "LOOP" TO CONSOLE
  542.          CALL    MSG
  543.          MVI     A,001H  ;STORE LOOP COMMAND
  544.          STA     BLOOP
  545.          JMP     MNTR1
  546. ;
  547. ;
  548. ;
  549. ;SUBROUTINE TO TEST LOOP COMMAND
  550. ;
  551. LOOPT:   CALL    KBINT   ;TEST KEY-BOARD INTERRUPT
  552.          LDA     BLOOP   ;GO GET LOOP COMMAND
  553.          ADI     000H    ;IS IT A LOOP COMMAND?
  554.          RNZ             ;RETURN,IF YES 
  555.          JMP     MNTR
  556. ;
  557. ;
  558. ;
  559. ;
  560. ;
  561. ;
  562. ;*****************************
  563. ;*DISK TEST CODE FOLLOWS:    *
  564. ;*****************************
  565. ;
  566. ;
  567. ;
  568. ;
  569. SP5:     MVI     C,20H
  570.          CALL    CO
  571. SP4:     MVI     C,20H
  572.          CALL    CO
  573. SP3:     MVI     C,20H
  574.          CALL    CO
  575. SP2:     MVI     C,20H
  576.          CALL    CO
  577. SP1:     MVI     C,20H
  578.          CALL    CO
  579.          RET
  580. ;
  581. ;
  582. ;
  583. ;
  584. ;
  585. YNMSG:   DB      5,'(Y,N)'
  586. ;
  587. MSG1:    DB      8,0DH,0AH,' PASS='
  588. ;
  589. MSG2:    DB      6,' WRITE'
  590. ;
  591. MSG3:    DB      5,' READ'
  592. ;
  593. MSG4:    DB      23,0DH,0AH,'INVALID TRACK NUMBER '
  594. ;
  595. MSG5:    DB      23,0DH,0AH,' DATA COMPARE ERROR: '
  596. ;
  597. MSG6:    DB      17,'LOWER HEAD(Y,N)? '
  598. ;
  599. MSG7:    DB      21,' DOUBLE SIDED DISK: '
  600. ;
  601. MSG8:    DB      19,'NABLE DRIVE(00-03)='
  602. ;
  603. MSG9:    DB      25,'ORMAT SINGLE TRACK(Y,N)? '
  604. ;
  605. MSG10:   DB      14,'UNIT CODE FAIL'
  606. ;
  607. MSG11:   DB      20,'EEK TO TRACK(00-4C)='
  608. ;
  609. MSG12:   DB      14,'SECTOR(01-1A)='
  610. ;
  611. MSG13:   DB      14,'ATTERN(00-FF)='
  612. ;
  613. MSG14:   DB      25,'EMORY ADDRESS(0000-FFFF)='
  614. ;
  615. MSG15:   DB      33,0DH,0AH,' UNIT TRACK SECTOR BYTE WAS S/B'
  616. ;
  617. MSG16:   DB      14,' TOTAL ERRORS='
  618. ;
  619. MSG17:   DB      15,0DH,0AH,' MEDIA ERROR '
  620. ;
  621. ;MSG18 RESERVED
  622. ;
  623. ;MSG19 RESERVED
  624. ;
  625. ;MSG20 RESERVED
  626. ;
  627. ;MSG21 RESERVED
  628. ;
  629. ;MSG22 RESERVED
  630. ;
  631. MSG23:   DB      12,0DH,0AH,20H,'FAILED TO'
  632. ;
  633. MSG24:   DB      14,'READY FOR TEST'
  634. ;
  635. MSG25:   DB      21,'O ADDRESS(0000-FFFF)='
  636. ;
  637. MSG26:   DB      3,'OME'
  638. ;
  639. MSG27:   DB      5,'RITE '
  640. ;
  641. MSG28:   DB      4,'EAD '
  642. ;
  643. MSG29:   DB      4,'LEAR'
  644. ;
  645. MSG30:   DB      25,'EST WRITE/READ CONTINUOUS'
  646. ;
  647. MSG31:   DB      5,'UNIT='
  648. ;
  649. MSG32:   DB      18,'NIT SELECT(00-03)='
  650. ;
  651. MSG33:   DB      22,0DH,0AH,'INVALID UNIT NUMBER '
  652. ;
  653. MSG34:   DB      10,'DRIVE FAIL'
  654. ;
  655. MSG35:   DB      13,'WRITE PROTECT'
  656. ;
  657. MSG36:   DB      24,0DH,0AH,' DOUBLE DENSITY(Y,N)? '
  658. ;
  659. MSG37:   DB      22,'INVALID SECTOR NUMBER '
  660. ;
  661. MSG38:   DB      3,'OOP'
  662. ;
  663. MSG39:   DB      14,0DH,0AH,07H,' CRC ERROR '
  664. ;
  665. MSG40:   DB      10,'LOWER HEAD'
  666. ;
  667. MSG41:   DB      10,'UPPER HEAD'
  668. ;
  669. MSG42:   DB      15,'OOR LOCK(Y,N)? '
  670. ;
  671. MSG43:   DB      19,' DELETE DATA(Y,N)? '
  672. ;
  673. MSG44:   DB      8,' DD MARK'
  674. ;
  675. MSG45:   DB      20,'TIMER CONTROL(Y,N)? '
  676.  
  677. ;
  678. MSG46:   DB      16,' CRC ONLY(Y,N)? '
  679. ;
  680. MSG47:   DB      25,0DH,0AH,' EXTENDED FORMAT(Y,N)? '
  681. ;
  682. MSG48:   DB      9,0DH,0AH,20H,'VERIFY'
  683. ;
  684. MSG49:   DB      25,'ERIFY SINGLE TRACK(Y,N)? '
  685. ;
  686. MSG50:   DB      9,0DH,0AH,20H,'FORMAT'
  687. ;
  688. MSG51:   DB      10,'ALIGNMENT,'
  689. ;
  690. MSG52:   DB      2,'NO'
  691. ;
  692. MSG53:   DB      11,'AUTO(Y,N)? '
  693. ;
  694. MSG54:   DB      13,'TRACK(00-4C)='
  695. ;
  696. MSG55:   DB      22,0DH,0AH,20H,'NO "BUSY" RESPONSE '
  697. ;
  698. MSG56:   DB      19,0DH,0AH,20H,'"BUSY" RUN-AWAY '
  699. ;
  700. MSG57:   DB      11,'SYSTEM TEST'
  701. ;
  702. MSG58:   DB      6,'TRACK='
  703. ;
  704. MSG59:   DB      7,'SECTOR='
  705. ;
  706. MSG60:   DB      14,'SEEK TO TRACK='
  707. ;
  708. ;
  709. ;
  710. ;
  711. ;
  712. ;ROUTINE TO OUTPUT MESSAGES TO CONSOLE
  713. ;
  714. MSG:     PUSH    PSW
  715.          PUSH    B
  716.          MOV     B,M
  717.          INX     H
  718. MSGA:    MOV     C,M
  719.          CALL    CO
  720.          INX     H
  721.          DCR     B
  722.          JNZ     MSGA
  723.          POP     B
  724.          POP     PSW
  725.          RET
  726. ;
  727. ;
  728. ;
  729. ;ROUTINE TO OUTPUT "TEXT" TO CONSOLE
  730. ;
  731. TEXT:    XTHL            ;GET ADDRESS OF TEXT
  732.          PUSH    B
  733.          PUSH    PSW
  734. TEXTA:   MOV     A,M     ;CHECK FOR "END OF TEXT" FLAG
  735.          INX     H
  736.          ORA     A
  737.          JM      TEXTB   ;END OF TEXT?
  738.          MOV     C,A
  739.          CALL    CO
  740.          JMP     TEXTA   ;NO TRY AGAIN   
  741. TEXTB:   POP     PSW
  742.          POP     B
  743.          XTHL            ;GET THE RETURN ADDRESS
  744.          RET
  745. ;
  746. ;
  747. ;
  748. ;*****************************************
  749. ;* CONTROLLER/DISK TEST ROUTINES FOLLOW: *
  750. ;*****************************************
  751. ;
  752. ;
  753. ;
  754. ;CLEAR CONTROLLER
  755.  
  756. CLR:     LXI     H,MSG29         ;OUTPUT "CLEAR" TO CONSOLE
  757.          CALL    MSG
  758. CLR1:    MVI     A,81H   ;TRANSMIT CLEAR COMMAND TO CONSOLE
  759.          CALL    XMIT
  760.          MVI     A,00BH  ;TRANSMIT CLEAR ERROR FLAGS TO CONTROLLER
  761.          CALL    XMIT
  762.          LXI     H,000H  ;CLEAR PASS AND ERROR COUNTER
  763.          SHLD    PCTR
  764.          SHLD    ECTR
  765.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  766.          JMP     CLR1
  767. ;
  768. ;
  769. ;
  770. ;RESTORE TO TRACK 00
  771. ;
  772. HOME:    LXI     H,MSG26         ;OUTPUT "HOME" TO CONSOLE
  773.  
  774.          CALL    MSG
  775. HOME1:   CALL    RSTR    ;TRANSMIT "SEEK TRACK 00" COMMAND,
  776.                          ; TO CONTROLLER
  777.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  778.          JMP     HOME1
  779. ;
  780. ;
  781. ;
  782.  
  783. ;SEEK TO TRACK
  784.  
  785. SKT:     LXI     H,MSG11         ;OUTPUT "SEEK TO TRACK=" TO CONSOLE
  786.          CALL    MSG
  787.          CALL    CONI    ;READ CONSOLE INPUT
  788.          STA     TRKNO   ;STORE TRACK ADDRESS
  789.          STA     NEWTK   ;STORE NEW TRACK NUMBER IN CASE OF LOOP 
  790.          CPI     04DH    ;TRACK NUMBER >77 DECIMAL?
  791.          JNC     INER1   ;JUMP TO INPUT ERROR 1,IF SO 
  792.          CALL    CRLF
  793. SKT1:    MVI     C,'.'   ;MAKE A TRACK SEEK INDICATOR FOR CONSOLE
  794.          CALL    CO
  795.          CALL    DENT    ;GO SET PROPER DENSITY CONFIGURATION,
  796.                          ; FOR SEEKING
  797.          LDA     TRKNO   ;GO GET THE TRACK NUMBER
  798.          CPI     000H    ;TRACK 00 REQUESTED?
  799.          JZ      HOME1   ;IF SO,GO DO A RESTORE 
  800.          CALL    CLRER   ;TRANSMIT "CLEAR ERROR FLAGS",
  801.                          ; TO CONTROLLER
  802.          CALL    XMTUS
  803.          CALL    XMTTK
  804.          MVI     A,009H  ;SEEK TO TRACK
  805.          CALL    XMITW
  806.          IN      DATAI   ;EXAMINE STATUS FROM CONTROLLER
  807.          ANI     008H    ;CRC ERROR?
  808.          JZ      SKT2    ;IF NOT,GO TEST LOOP COMMAND
  809.          LXI     H,MSG39         ;OUTPUT "CRC ERROR" TO CONSOLE
  810.          CALL    MSG
  811.          CALL    CLRER   ;GO CLEAR ERROR FLAGS 
  812. SKT2:    CALL    LOOPT   ;GO TEST LOOP COMMAND
  813.          CALL    RSTR    ;TRANSMIT SEEK TRACK 00
  814.                          ; COMMAND TO CONTROLLER
  815.          LDA     NEWTK   ;RE-LOAD ORIGINAL TRACK NUMBER
  816.          STA     TRKNO
  817.          JMP     SKT1    ;SEEK TO ORIGINAL TRACK NUMBER
  818. ;
  819. ;
  820. ;
  821. ;
  822. ;
  823. ;ROUTINE TO LOCK OR UNLOCK DOOR
  824. ;
  825. DOOR:    LXI     H,MSG42         ;OUTPUT "DOOR LOCK?" TO CONSOLE
  826.          CALL    MSG
  827.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  828.          CPI     'Y'     ;DOOR LOCK REQUESTED?
  829.          JZ      DOOR1   ;IF YES,GO LOCK THE DOOR 
  830.          CPI     'N'     ;NO?
  831.          JZ      DOOR2
  832.          JMP     LER
  833. DOOR1:   MVI     A,040H  ;TRANSMIT DOOR LOCK COMMAND TO CONTROLLER
  834.          JMP     DLXMT
  835. DOOR2:   XRA     A       ;ZERO OUT A REG.
  836. DLXMT:   STA     LOCK    ;STORE DOOR LOCK COMMAND
  837. DL1:     CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR COMMAND
  838.                          ; TO CONTROLLER
  839.          CALL    XMTCF   ;TRANSMIT LOAD CONFIGURATION
  840.                          ; COMMAND TO CONTROLLER
  841.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  842.          JMP     DL1
  843. ;
  844. ;
  845. ;
  846. ;ROUTINE TO SELECT UNIT FOR TEST
  847. ;
  848. UNITS:   LXI     H,MSG32         ;OUTPUT "UNIT=" TO CONSOLE
  849.          CALL    MSG
  850.          CALL    CONI    ;READ CONSOLE INPUT
  851.          CPI     004H    ;UNIT SELECT NUMBER >3?
  852.          JNC     INER2
  853.          RRC             ;NO IT'S O.K AS REQUESTED BY OPERATOR
  854.                          ;SHIFT IT INTO PROPER POSITION
  855.          RRC
  856.          STA     UNIT    ;STORE UNIT SELECT
  857.          CALL    RSTR    ;TRANSMIT A SEEK TRACK 00 COMMAND
  858.                          ; TO CONTROLLER,TO RESTORE THE SELECTED UNIT
  859.          CALL    MEDIA   ;GO TEST MEDIA STATUS,
  860.                          ; THIS MAY BE A DOUBLE SIDED DISKETTE
  861. ;
  862. ;
  863. ;
  864. ;SELECT DATA DENSITY
  865. ;
  866. DENSE:   LXI     H,MSG36         ;OUTPUT "DOUBLE DENSITY?" TO CONSOLE
  867.          CALL    MSG
  868.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  869.          CPI     'Y'     ;IS IT DOUBLE DENSITY SELECTED?
  870.          JZ      DEN1    ;YES  GO STORE DOUBLE DENSITY COMMAND
  871.          CPI     'N'     ;NO  GO STORE SINGLE DENSITY COMMAND
  872.          JZ      DEN2
  873.          JMP     LER     ;OUTPUT "?" TO CONSOLE. THIS DUMMY
  874.                          ; IS'NT SURE WHAT HE WANTS   
  875. DEN1:    MVI     A,010H  ;STORE DOUBLE DENSITY SELECT COMMAND
  876.          STA     DDSEL
  877.          JMP     DEN3
  878. DEN2:    XRA     A       ;STORE SINGLE DENSITY COMMAND
  879.          STA     DDSEL
  880.          JMP     DEN5
  881. DEN3:    LXI     H,MSG47         ;OUTPUT "EXTENDED FORMAT" TO CONSOLE
  882.          CALL    MSG
  883.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  884.          CPI     'Y'     ;IS IT EXTENDED FORMAT SELECTED?
  885.          JZ      DEN4    ;YES  GO STORE EXTENDED FORMAT COMMAND
  886.          CPI     'N'     ;NO,NOT REQUESTED 
  887.          JZ      DEN5
  888.          JMP     LER
  889. DEN4:    MVI     A,080H  ;STORE EXTENDED FORMAT COMMAND
  890.          JMP     DEN6
  891. DEN5:    XRA     A       ;CLEAR EXTENDED FORMAT COMMAND
  892. DEN6:    STA     XTEND
  893.          JMP     MNTR
  894. ;
  895. ;
  896. ;
  897. ;
  898. ;
  899. ;
  900. ;SUBROUTINE TO ESTABLISH CORRECT DENSITY FOR 
  901. ; CURRENT TRACK POSITION AND SELECTED DENSITY.
  902. ; PROPER RECORD LENGTH WILL BE IN D&E REGS.
  903. ;
  904. DENT:    LDA     XTEND   ;SAVE EXTENDED FORMAT STATE
  905.          STA     XTSAV
  906.          LDA     DDSEL   ;GO GET STATE OF DOUBLE DENSITY SELECT
  907.          STA     DDSAV   ; SAVE IT ALSO 
  908.          CPI     001H    ;IS DOUBLE DENSITY SELECTED?
  909.          JNC     DENT3   ;GO TEST FOR TRACK 00,IF SO 
  910.          XRA     A       ;CLEAR DENSITY "SAVE" STATE
  911.          STA     DDSAV
  912. DENT1:   LXI     D,128   ;SET BYTE COUNT FOR SINGLE DENSITY
  913. DENT2:   XRA     A       ;OUTPUT A "DUMMY" EXAMINE STATUS TO
  914.                          ; CONTROLLER,TO CLEAR DATA OUT INTERFACE
  915.          OUT     CNTRL
  916.          CALL    XMTCF   ;TRANSMIT CONFIGURATION COMMAND,
  917.                          ; TO CONTROLLER
  918.          LDA     DDSAV   ;RESTORE DENSITY "SAVE " STATE
  919.          STA     DDSEL
  920.          LDA     XTSAV   ;RESTORE EXTENDED FORMAT "SAVE" STATE
  921.          STA     XTEND
  922.          RET
  923. DENT3:   LDA     TRKNO   ;GO GET CURRENT TRACK NUMBER
  924.          CPI     001H    ;IS IT TRACK 00?
  925.          JNC     DENT5   ;IF NOT,GO SET BYTE COUNT,
  926.                          ; FOR DOUBLE DENSITY 
  927.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  928.          CPI     001H    ;UPPER HEAD SELECTED?
  929.          JNC     DENT4   ;IF SO,SET BYTE COUNT AND MODE,
  930.                          ; FOR DOUBLE DENSITY
  931.          LDA     DDSEL   ;SAVE DENSITY SELECT STATUS
  932.          STA     DDSAV   
  933.          LDA     XTEND   ;SAVE EXTENDED FORMAT STATUS
  934.          STA     XTSAV
  935.          XRA     A       ;SET DENSITY STATUS TO "SINGLE"
  936.          STA     DDSEL
  937.          STA     XTEND   ;RESET EXTENDED FORMAT
  938.          JMP     DENT1   ;GO DO SINGLE DENSITY ON TRACK 00,
  939.                          ; LOWER SURFACE,EVEN THOUGH WE
  940.                          ; HAVE BEEN IN DOUBLE DENSITY MODE 
  941. DENT4:   XRA     A       ;CLEAR EXTENDED FORMAT FOR UPPER
  942.                          ; SURFACE,TRACK 00
  943.          STA     XTEND
  944. DENT5:   LXI     D,256   ;SET BYTE COUNT FOR DOUBLE DENSITY
  945.          JMP     DENT2
  946. ;
  947. ;
  948. ;
  949. ;
  950. ;
  951. ;
  952. ;TEST MEDIA STATUS SUBROUTINE
  953. ;
  954. MEDIA:   IN      DATAI   ;GET STATUS FROM CONTROLLER
  955.          ANI     040H    ;TEST MEDIA STATUS
  956.          JNZ     HEAD1   ;GO STORE LOWER HEAD SELECT COMMAND
  957.          LXI     H,MSG7  ;OUTPUT "DOUBLE SIDED DISK:",
  958.                          ; TO CONTROLLER
  959.          CALL    MSG
  960. ;
  961. ;
  962. ;
  963. ;SUBROUTINE TO SELECT HEAD
  964. ;
  965. HEAD:    LXI     H,MSG6  ;OUTPUT "LOWER HEAD? TO CONSOLE
  966.          CALL    MSG
  967.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  968.          CPI     'Y'     ;IS IT THE LOWER HEAD?
  969.          JZ      HEAD1   ;IF YES,GO STORE LOWER HEAD SELECT
  970.          CPI     'N'     ;IS THE UPPER HEAD SELECTED?
  971.          JZ      HEAD2   ;IF YES,GO STORE UPPER HEAD SELECT
  972.          JMP     LER     ;OUTPUT "?" TO CONSOLE,AND RETURN TO MONITOR
  973. HEAD1:   XRA     A       ;ZERO OUT A REG. AND STORE LOWER
  974.                          ; HEAD SELECT COMMAND
  975.          STA     HDSEL
  976.          RET
  977. HEAD2:   MVI     A,020H  ;STORE UPPER HEAD SELECT COMMAND
  978.          STA     HDSEL
  979.          RET
  980. ;
  981. ;
  982. ;
  983. ;SET DATA PATTERN ROUTINE
  984. ;
  985. PATT:    LXI     H,MSG13         ;OUTPUT "PATTERN=" TO CONSOLE
  986.          CALL    MSG
  987.          LXI     D,256   ;SET BYTE COUNT "FILL" TO 256 DECIMAL
  988.          CALL    CONI    ;READ CONSOLE KEY-BOARD INPUT
  989.                          ; FOR DESIRED DATA PATTERN
  990.          STA     DBUF    ;STORE DATA BYTE TO FREE-UP A REG.
  991.          LXI     H,WBUF  ;POINT THE DATA PATTERNS AT THE WRITE BUFFER
  992. PATT1:   LDA     DBUF    ;GET THE DESIRED PATTERN FROM STORAGE
  993.          MOV     M,A     ;LOAD UP THE WRITE BUFFER
  994.          INX     H
  995.          DCX     D
  996.          MOV     A,D
  997.          ORA     E
  998.          JNZ     PATT1   ;LOOP UNTIL WRITE BUFFER IS FULL
  999.          JMP     MNTR    ;GO TO MONITOR WHEN DONE
  1000. ;
  1001. ;
  1002. ;
  1003. ;SUBROUTINE TO ENABLE DRIVE MOTORS
  1004. ;
  1005. ENAB:    LXI     H,MSG8  ;OUTPUT "ENABLE DRIVE?" TO CONSOLE
  1006.          CALL    MSG
  1007.          CALL    CONI    ;READ CONSOLE INPUT
  1008.          CPI     000H    ;IS IT UNIT SELECT 00?
  1009.          JZ      ENAB0
  1010.          CPI     001H    ;IS IT UNIT SELECT 01?
  1011.          JZ      ENAB1
  1012.          CPI     002H    ;IS IT UNIT SELECT 02?
  1013.          JZ      ENAB2
  1014.          CPI     003H    ;IS IT UNIT SELECT 03?
  1015.          JZ      ENAB3
  1016.          CPI     004H    ;UNIT SELECT >3?
  1017.          JNC     INER2
  1018. ENAB0:   MVI     A,001H
  1019.          JMP     ENXMT
  1020. ENAB1:   MVI     A,002H
  1021.          JMP     ENXMT
  1022. ENAB2:   MVI     A,004H
  1023.          JMP     ENXMT
  1024. ENAB3:   MVI     A,008H
  1025. ENXMT:   STA     MTREN
  1026. EN1:     CALL    XMTUS   ;TRANSMIT LOAD UNIT /SECTOR
  1027.                          ; COMMAND TO CONTROLLER
  1028.          CALL    XMTCF   ;TRANSMIT LOAD CONFIGURATION COMMAND
  1029.                          ; TO CONTROLLER
  1030.          CALL    TIME1   ;GO KILL TIME TO ALLOW MOTOR
  1031.                          ; TO COME UP TO SPEED 
  1032.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  1033.          JMP     EN1
  1034. ;
  1035. ;
  1036. ;
  1037. ;
  1038. ;OPERATOR INPUT ERROR MESSAGE ROUTINES
  1039. ;
  1040. INER1:   LXI     H,MSG4  ;OUTPUT "INVALID TRACK NUMBER " TO CONSOLE
  1041. INERA:   CALL    MSG
  1042.          CALL    CRLF
  1043.          JMP     MNTR
  1044. ;
  1045. INER2:   CALL    CRLF
  1046.          LXI     H,MSG33         ;OUTPUT "INVALID UNIT NUMBER" TO CONSOLE
  1047.          JMP     INERA
  1048. ;
  1049. INER3:   CALL    CRLF
  1050.          LXI     H,MSG37         ;OUTPUT "INVALID SECTOR NUMBER" TO CONSOLE
  1051.          JMP     INERA
  1052. ;
  1053. ;
  1054. ;
  1055. ;
  1056. ;SUBROUTINE TO GET UNIT ADDRESS INTO PROPER
  1057. ; POSITION FOR CONSOLE OUTPUT
  1058. ;
  1059. AUNIT:   LDA     UNIT    ;GET UNIT ADDRESS FROM STORAGE
  1060.          RLC             ;ROTATE LEFT 2 PLACES TO GET
  1061.                          ; BYTE INTO PROPER POSITION
  1062.          RLC
  1063.          RET             ;GO BACK TO WHERE YOU CAME FROM
  1064. ;
  1065. ;
  1066. ;
  1067. ;READ INTO BUFFER FROM PRESENT TRACK
  1068.  
  1069. ;
  1070. RDT:     LXI     H,MSG28         ;OUTPUT "READ SECTOR=" TO CONSOLE
  1071.          CALL    MSG
  1072.          LXI     H,MSG12
  1073.          CALL    MSG
  1074.          CALL    CONI    ;READ KEY-BOARD INPUT FROM CONSOLE
  1075.                          ; TO GET DESIRED SECTOR NUMBER
  1076.          ADI     000H    ;TEST FOR INVALID SECTOR NUMBER
  1077.          JZ      INER3   ;GO PRINT "INVALID SECTOR NUMBER",
  1078.                          ; IF SO 
  1079.          CPI     01BH    ;TEST FOR INVALID SECTOR NUMBER
  1080.          JNC     INER3
  1081.          STA     SECNO   ;MUST BE GOOD  STORE IT 
  1082.          CALL    SECT8   ;GO TEST FOR EXTENDED FORMAT,
  1083.                          ; AND LIMIT OPERATOR INPUT TO 8 SECTORS
  1084.                          ; IF SO 
  1085.          LXI     H,MSG46         ;OUTPUT "CRC ONLY?" TO CONSOLE
  1086.          CALL    MSG
  1087.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  1088.          CPI     'Y'     ;READ CRC REQUESTED?
  1089.          JZ      CRC1    ;IF YES,STORE READ CRC COMMAND
  1090.          CPI     'N'     ;IF READ DATA AND CRC,CLEAR CRC COMMAND
  1091.          JZ      CRC2
  1092.          JMP     LER     ;OUTPUT "?" TO CONSOLE
  1093. CRC1:    MVI     A,007H  ;STORE READ CRC COMMAND
  1094.          JMP     CRC3
  1095. CRC2:    XRA     A       ;CLEAR READ CRC COMMAND
  1096. CRC3:    STA     RDCRC
  1097. RDTS:    CALL    XMTUS   ;TRANSMIT UNIT/SECTOR TO CONTROLLER
  1098.          CALL    DENT    ;GO TEST FOR PROPER DENSITY,
  1099.                          ; AND TRANSMIT TO CONTROLLER.
  1100.                          ; (RETURN WITH BYTE COUNT IN D&E REGS.)
  1101.          CALL    CLRER   ;GO CLEAR ERROR FLAGS
  1102. RDT1A:   XRA     A       ;CLEAR "SAVED STATUS"
  1103.          STA     SAVE
  1104.          LDA     RDCRC   ;GO GET STATE OF READ CRC COMMAND
  1105.          ANI     007H    ;IS IT A READ CRC COMMAND?
  1106.          JZ      RDT1    ;IF NOT,GO READ DATA AND CRC 
  1107.          CALL    XMITW
  1108.          IN      DATAI   ;EXAMINE STATUS FROM CONTROLLER
  1109.          STA     SAVE    ;SAVE POSSIBLE CRC ERROR STATUS
  1110.          ANI     008H    ;CRC ERROR?
  1111.          CNZ     CLRER   ;CLEAR IT IF SO 
  1112.          IN      DATAI   ;ONE MORE TIME FOR THE STATUS
  1113.          ANI     080H    ;DELETED DATA MARK?
  1114.          CNZ     CLRER   ;CLEAR IT ALSO
  1115.          JMP     RDT3    ;GO TEST IT 
  1116. RDT1:    MVI     A,003H  ;TRANSMIT READ COMMAND TO CONTROLLER
  1117.          CALL    XMITW
  1118.          IN      DATAI   ;EXAMINE STATUS FROM CONTROLLER
  1119.          STA     SAVE    ;SAVE POSSIBLE CRC ERROR STATUS
  1120.          ANI     008H    ;CRC ERROR?
  1121.          CNZ     CLRER   ;CLEAR IT IF SO 
  1122.          IN      DATAI   ;AND YET ANOTHER TIME FOR THE STATUS 
  1123.          ANI     080H    ;NOW A DELETED DATA MARK?
  1124.          CNZ     CLRER   ;CLEAR IT AGAIN   
  1125.          LXI     H,RBUF  ;SET H&L REGS. T0 POINT TO FIRST
  1126.                          ; LOCATION IN READ BUFFER
  1127.          MVI     A,040H  ;OUTPUT A READ BUFFER COMMAND,
  1128.                          ; TO CONTROLLER
  1129.          OUT     CNTRL
  1130. RDT2:    IN      DATAI   ;GET A DATA BYTE FROM CONTROLLER
  1131.          MOV     M,A     ;STUFF IT INTO THE READ BUFFER
  1132.          INX     H       ;BUMP THE POINTER TO THE NEXT LOCATION,
  1133.                          ; IN THE READ BUFFER
  1134.          DCX     D       ;-1 TO THE BYTE COUNT
  1135.          XRA     A       ;ARE WE DONE MOVING IN ALL DATA BYTES?
  1136.          ORA     E
  1137.          JNZ     RDT2    ;GO FOR MORE,IF NOT DONE 
  1138. RDT3:    LDA     SAVE    ;GO GET "SAVED STATUS" FROM STORAGE
  1139.          ANI     080H    ;DELETED DATA MARK?
  1140.          CNZ     MRK1    ;OUTPUT "DD MARK" TO CONSOLE,IF SO 
  1141.          LDA     SAVE
  1142.          ANI     008H    ;CRC ERROR?
  1143.          CNZ     ERROR   ;GO OUTPUT "CRC ERROR" TO CONSOLE,
  1144.                          ; IF CRC ERROR OCCURED 
  1145.          LDA     RDCRC   ;GO GET STATE OF READ CRC COMMAND
  1146.          ANI     007H
  1147.          CZ      RERR    ;GO CHECK FOR DATA COMPARE ERROR,
  1148.                          ; IF NOT A READ CRC COMMAND 
  1149. RDT4:    CALL    LOOPT   ;GO TEST LOOP COMMAND
  1150.          JMP     RDTS
  1151. ;
  1152. ;
  1153. ;
  1154. ;SUBROUTINE TO TEST DELETED DATA MARK ON READ
  1155. ;
  1156. DDMRK:   IN      DATAI   ;EXAMINE STATUS FROM CONTROLLER
  1157.          ANI     080H    ;IS IT A DD MARK?
  1158.          RZ
  1159. MRK1:    CALL    CLRER   ;CLEAR DD MARK STATUS FROM CONTROLLER
  1160.          CALL    CRLF
  1161.          LXI     H,MSG44         ;OUTPUT "DD MARK" TO CONSOLE
  1162.          CALL    MSG
  1163.          CALL    TKSEC   ;OUTPUT TRACK AND SECTOR,THAT THE
  1164.                          ; DELETED DATA MARK OCCURED ON 
  1165.          RET
  1166. ;
  1167. ;
  1168. ;
  1169. ;
  1170. ;
  1171. ;
  1172. ;SUBROUTINE TO COMPARE READ DATA TO WRITE DATA,
  1173. ; AND INDICATE THE FIRST BYTE IN ERROR
  1174. ;
  1175. RERR:    CALL    DENT    ;GO GET BYTE COUNT INTO D&E REGS.
  1176.          LXI     B,RBUF  ;SET B&C REGS. TO POINT TO FIRST
  1177.                          ; LOCATION IN READ BUFFER
  1178.          LXI     H,WBUF  ;SET H&L REGS. TO POINT TO FIRST
  1179.                          ; LOCATION IN WRITE BUFFER
  1180. RERR1:   MOV     A,M     ;GO GET A BYTE FROM WRITE BUFFER,
  1181.                          ; AND STUFF IT INTO A REG.
  1182.          STA     SHDBE   ;STORE "S/B" BYTE
  1183.          LDAX    B       ;GO GET A BYTE FROM READ BUFFER,
  1184.                          ; AND STUFF IT INTO A REG.
  1185.          INX     B       ;+1 TO READ BUFFER POINTER
  1186.          STA     WAS     ;STORE "WAS" BYTE
  1187.          CMP     M       ;COMPARE "WAS" BYTE,TO "S/B" BYTE
  1188.          JNZ     RERR3   ;GO PRINT ERROR STATUS,
  1189.                          ; IF A MISMATCH OCCURS
  1190.          INX     H       ;+1 TO WRITE BUFFER POINTER
  1191.          DCX     D       ;-1 TO BYTE COUNT
  1192.          XRA     A       ;ZERO OUT A REG.
  1193.          ORA     E       ;OR IN E REG.
  1194.          STA     DCTR    ;STORE DATA BYTE COUNTER
  1195.          JNZ     RERR1   ;GO COMPARE ANOTHER DATA BYTE,
  1196.                          ; IF NOT FINISHED WITH ENTIRE RECORD
  1197.          RET
  1198. ;
  1199. ;
  1200. ;
  1201. ;SUBROUTINE TO OUTPUT READ DATA ERROR STATUS TO CONSOLE
  1202. ;
  1203. RERR3:   MOV     A,L     ;SAVE POINTER FOR DATA BYTE COUNTER
  1204.          STA     DCTR
  1205.          LXI     H,MSG5  ;OUTPUT "READ DATA ERROR" TO CONSOLE
  1206.          CALL    MSG
  1207.          LDA     HDSEL   ;GO GET HEAD SELECT
  1208.          ANI     020H    ;IS IT THE UPPER HEAD?
  1209.          JZ      RERR4
  1210.          LXI     H,MSG41         ;OUTPUT "UPPER HEAD" TO CONSOLE
  1211.          CALL    MSG
  1212.          JMP     RERR5
  1213. RERR4:   LXI     H,MSG40         ;OUTPUT "LOWER HEAD" TO CONSOLE
  1214.          CALL    MSG
  1215. RERR5:   MVI     C,007H  ;RING THAT BELL 
  1216.          CALL    CO
  1217.          LXI     H,MSG15         ;OUTPUT ERROR MESSAGE HEADER TO CONSOLE
  1218.          CALL    MSG
  1219.          CALL    CRLF
  1220.          CALL    SP1
  1221.          CALL    AUNIT   ;OUTPUT ACTUAL UNIT NUMBER TO CONSOLE
  1222.          CALL    BYTEO
  1223.          CALL    SP3
  1224.          LDA     TRKNO   ;OUTPUT TRACK NUMBER TO CONSOLE
  1225.          CALL    BYTEO
  1226.          CALL    SP4
  1227.          LDA     SECNO   ;OUTPUT SECTOR NUMBER TO CONSOLE
  1228.          CALL    BYTEO
  1229.          CALL    SP5
  1230.          LDA     DCTR    ;OUTPUT BYTE NUMBER IN ERROR TO CONSOLE
  1231.          CALL    BYTEO
  1232.          CALL    SP3
  1233.          LDA     WAS     ;OUTPUT "WAS" DATA BYTE TO CONSOLE
  1234.          CALL    BYTEO
  1235.          CALL    SP2
  1236.          LDA     SHDBE   ;OUTPUT "S/B" DATA BYTE TO CONSOLE
  1237.          CALL    BYTEO
  1238.          CALL    CRLF
  1239.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER TO PRESENT TRACK
  1240.          INX     H
  1241.          SHLD    ECTR
  1242.          RET
  1243. ;
  1244. ;
  1245. ;
  1246. ;WRITE FROM BUFFER TO PRESENT TRACK
  1247. ;
  1248. WRT:     LXI     H,MSG27         ;OUTPUT "WRITE SECTOR=" TO CONSOLE
  1249.          CALL    MSG
  1250.          LXI     H,MSG12
  1251.          CALL    MSG
  1252.          CALL    CONI    ;READ KEY-BOARD INPUT FROM CONSOLE
  1253.                          ; TO GET DESIRED SECTOR NUMBER
  1254.          ADI     000H    ;TEST FOR INVALID SECTOR NUMBER
  1255.          JZ      INER3   ;GO PRINT "INVALID SECTOR NUMBER",
  1256.                          ; IF SO 
  1257.          CPI     01BH    ;TEST FOR INVALID SECTOR NUMBER
  1258.          JNC     INER3
  1259.          STA     SECNO   ;MUST BE GOOD  STORE IT 
  1260.          CALL    SECT8   ;LIMIT OPERATOR INPUT TO 8 SECTORS,
  1261.                          ; IF EXTENDED FORMAT
  1262.          CALL    WPRT    ;HAS THE OPERATOR REQUESTED WRITE PROTECTION?
  1263.          JNZ     WRT4    ;BAIL-OUT ,IF SO 
  1264.          IN      DATAI   ;GET STATUS FROM CONTROLLER
  1265.          ANI     010H    ;MASK WRITE PROTECT BIT
  1266.          JNZ     WRT4    ;IS THE DISKETTE WRITE PROTECTED?
  1267.          LXI     H,MSG43         ;OUTPUT "DELETE DATA?" TO CONSOLE
  1268.          CALL    MSG
  1269.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  1270.          CPI     'Y'     ;DELETED DATA REQUESTED?
  1271.          JZ      DEL1    ;IF YES,GO STORE WRITE DELETED
  1272.                          ; DATA MARK COMMAND
  1273.          CPI     'N'     ;IF NO,CLEAR WRITE DELETED DATA
  1274.                          ; MARK COMMAND
  1275.          JZ      DEL2
  1276.          JMP     LER     ;OUTPUT "?" TO CONSOLE
  1277. DEL1:    MVI     A,00FH  ;STORE WRITE DD MARK
  1278.          JMP     DEL3
  1279. DEL2:    XRA     A       ;ZERO OUT A REG.
  1280. DEL3:    STA     DELET
  1281. WRT1:    CALL    XMTUS   ;TRANSMIT UNIT/SECTOR TO CONTROLLER
  1282.          CALL    DENT    ;GO TEST FOR PROPER DENSITY,
  1283.                          ; AND TRANSMIT TO CONTROLLER.
  1284.                          ; (RETURN WITH BYTE COUNT IN D&E REGS.)
  1285.          CALL    CLRER   ;GO CLEAR ERROR FLAGS
  1286.          LXI     H,WBUF  ;SET H&L REGS. TO POINT TO FIRST
  1287.                          ; LOCATION IN WRITE BUFFER
  1288.          MVI     A,030H  ;OUTPUT WRITE BUFFER COMMAND,
  1289.                          ; TO CONTROLLER
  1290.          OUT     CNTRL
  1291. WRT2:    MOV     A,M     ;GET A DATA BYTE FROM WRITE BUFFER
  1292.          OUT     DATAO   ;SPIT IT OUT TO THE CONTROLLER 
  1293.          INX     H       ;BUMP THE WRITE BUFFER POINTER
  1294.          DCX     D       ;-1 TO THE BYTE COUNT
  1295.          XRA     A       ;HAVE ALL DATA BYTES BEEN SENT?
  1296.          ORA     E
  1297.          JNZ     WRT2    ;GO SEND SOME MORE,IF NOT DONE 
  1298.          LDA     DELET   ;GO GET DELETED DATA MARK COMMAND
  1299.          ANI     00FH    ;IS IT A WRITE DD MARK COMMAND?
  1300.          JNZ     WRT2A   ;WRITE DD MARK,IF SO 
  1301.          MVI     A,005H  ;OUTPUT WRITE COMMAND TO CONTROLLER
  1302. WRT2A:   CALL    XMITW
  1303.          IN      DATAI   ;EXAMINE STATUS FROM CONTROLLER
  1304.          ANI     008H    ;CRC ERROR?
  1305.          CNZ     ERROR   ;GO OUTPUT "CRC ERROR" TO CONSOLE,
  1306.                          ; IF CRC ERROR OCCURED 
  1307. WRT3:    CALL    LOOPT   ;GO TEST LOOP COMMAND
  1308.          JMP     WRT1
  1309. WRT4:    CALL    WPMSG   ;OUTPUT "WRITE PROTECT" TO CONSOLE
  1310.          JMP     MNTR
  1311. ;
  1312. ;
  1313. ;SUBROUTINE TO INDICATE CRC ERROR,AND CLEAR ERROR FLAGS
  1314. ;
  1315. ERROR:   LXI     H,MSG39         ;OUTPUT "CRC ERROR" TO CONSOLE
  1316.          CALL    MSG
  1317.          CALL    CLRER   ;CLEAR ERROR FLAGS
  1318.          RET
  1319. ;
  1320. ;
  1321. ;
  1322. ;
  1323. ;SUBROUTINE TO LIMIT OPERATOR TO 8 SECTORS IF EXTENDED FORMAT
  1324. ;
  1325. SECT8:   LDA     XTEND   ;GO GET STATE OF EXTENDED FORMAT COMMAND
  1326.          CPI     080H    ;RETURN,IF NOT EXTENDED FORMAT
  1327.          RNZ
  1328.          LDA     TRKNO   ;GO GET CURRENT TRACK NUMBER
  1329.          CPI     001H    ;IF NOT,CHECK FOR 8 SECTORS OR LESS 
  1330.          RC
  1331.          LDA     SECNO   ;SECTOR NUMBER >8 DECIMAL?
  1332.          CPI     009H
  1333.          JNC     INER3   ;IF YES,OUTPUT "SECTOR NUMBER"
  1334.                          ; TO CONSOLE,AND GO TO THE MONITOR
  1335.          RET             ;NO,IT'S O.K. 
  1336. ;
  1337. ;
  1338. ;
  1339. ;
  1340. ;SUBROUTINE TO CLEAR CONTROLLER AND/OR ERROR FLAGS
  1341. ;
  1342. SCLR:    MVI     A,081H  ;TRANSMIT CLEAR CONTROLLER COMMAND
  1343.                          ; TO CONTROLLER
  1344.          CALL    XMIT
  1345. CLRER:   MVI     A,00BH  ;OUTPUT CLEAR ERROR FLAGS TO CONTROLLER
  1346.          CALL    XMIT
  1347.          RET
  1348. ;
  1349. ;
  1350. ;
  1351. ;ROUTINE TO FORMAT ALL TRACKS ON A DISKETTE
  1352. ;
  1353. FORM:    LXI     H,MSG9  ;OUTPUT "FORMAT SINGLE TRACK?" TO CONSOLE
  1354.          CALL    MSG
  1355.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  1356.          CPI     'Y'     ;FORMAT SINGLE TRACK REQUESTED?
  1357.          JZ      FORMS
  1358.          CPI     'N'     ;IF NO,FORMAT ALL TRACKS 
  1359.          JZ      FORM0
  1360.          JMP     LER
  1361. FORMS:   CALL    SP2
  1362.          LXI     H,MSG54         ;OUTPUT "TRACK=" TO CONSOLE
  1363.          CALL    MSG
  1364.          CALL    CONI    ;READ CONSOLE INPUT
  1365.          STA     NEWTK   ;SAVE TRACK NUMBER
  1366.          CPI     04DH
  1367.          JNC     INER1   ;INVALID TRACK NUMBER?
  1368. FORML:   CALL    FORMT   ;GO DO A FORMAT INITIALIZE
  1369.          MVI     A,020H  ;STORE FORMAT MODE
  1370.          STA     MODE
  1371.          CALL    DENT    ;GO ESTABLISH PROPER DENSITY,
  1372.                          ; AND OUTPUT IT TO CONTROLLER
  1373.          LDA     NEWTK   ;RE-ESTABLISH TRACK NUMBER
  1374.          STA     TRKNO
  1375.          CPI     000H    ;TRACK 00 REQUESTED?
  1376.          JNZ     FORMA
  1377.          CALL    RSTR    ;YES  DO A SEEK TRACK 00   
  1378.          JMP     FORMB
  1379. FORMA:   CALL    XMTTK   ;TRANSMIT TRACK NUMBER,
  1380.                          ; TO CONTROLLER
  1381.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND,
  1382.                          ; TO CONTROLLER
  1383. FORMB:   MVI     A,005H  ;TRANSMIT WRITE COMMAND,
  1384.                          ; TO CONTROLLER
  1385.          CALL    XMITW
  1386.          XRA     A       ;CLEAR FORMAT MODE
  1387.          STA     MODE
  1388.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  1389.          JMP     FORML
  1390. FORM0:   CALL    FORMI   ;GO DO A FORMAT INITIALIZE
  1391.          CALL    CRLF
  1392. FORM1:   CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1393.          CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1394.          CALL    FILLE5   ;FILL CONTROLLER WRITE BUFFER WITH E5'S
  1395.          MVI     A,020H  ;STORE FORMAT MODE
  1396.          STA     MODE
  1397.          CALL    DENT    ;GO TEST FOR PROPER DENSITY(FORMAT MODE
  1398.                          ; WILL BE EXECUTED AT THIS TIME),AND
  1399.                          ; TRANSMIT TO CONTROLLER
  1400.          MVI     A,005H  ;TRANSMIT WRITE COMMAND,
  1401.                          ; TO CONTROLLER
  1402.          CALL    XMITW
  1403.          CALL    INCTN   ;INCREMENT TRACK NUMBER
  1404.          JZ      FORM2   ;GO DO A RESTORE,AND ATTEMPT
  1405.                          ; TO FORMAT UPPER SURFACE
  1406.                          ; IF ALL TRACKS HAVE BEEN
  1407.                          ; FORMATTED ON LOWER
  1408.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR,
  1409.                          ; TO CONTROLLER
  1410.          CALL    XMTTK   ;TRANSMIT LOAD TRACK NUMBER
  1411.                          ; TO CONTROLLER
  1412.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND
  1413.                          ; TO CONTROLLER
  1414.          JMP     FORM1   ;FORMAT NEXT TRACK
  1415. FORM2:   CALL    RSTR    ;TRANSMIT SEEK TRACK 00
  1416.                          ; COMMAND TO CONTROLLER
  1417.          LDA     HDSEL   ;GO GET HEAD SELECT STATE
  1418.          CPI     020H    ;GO VERIFY ALL TRACKS,IF UPPER
  1419.                          ; HEAD IS SELECTED AFTER CLEARING
  1420.                          ; FORMAT MODE
  1421.          JZ      VRFY    ;GO VERIFY ALL TRACKS,IF DONE 
  1422.          CALL    DSIDE   ;GO FIND OUT IF IT'S A DOUBLE
  1423.                          ; SIDED DISKETTE,AND SELECT HEAD
  1424.                          ; AS REQUIRED
  1425.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1426.          CPI     000H    ;IS THE LOWER HEAD SELECTED?
  1427.          JNZ     FORM1   ;GO FORMAT UPPER SURFACE,IF THE
  1428.                          ; UPPER HEAD IS SELECTED 
  1429. VRFY:    XRA     A       ;CLEAR FORMAT MODE AND HEAD SELECT
  1430.          STA     MODE
  1431.          STA     HDSEL
  1432.          LXI     H,MSG48         ;OUTPUT "VERIFY" TO CONSOLE
  1433.          CALL    MSG
  1434.          CALL    CRLF
  1435. VRFYS:   CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1436.          CALL    DENT    ;GO ESTABLISH PROPER DENSITY,
  1437.                          ; AND TRANSMIT TO CONTROLLER
  1438.          CALL    VRFYR   ;GO CHECK CRC ON A SECTOR
  1439. VRFY1:   CALL    INCTN   ;INCREMENT TRACK NUMBER
  1440.          JZ      VRFY2   ;GO DO A RESTORE,AND ATTEMPT TO
  1441.                          ; CHECK UPPER SURFACE,IF ALL TRACKS
  1442.                          ; HAVE BEEN CHECKED ON THE LOWER 
  1443.          CALL    XMTTK   ;TRANSMIT LOAD TRACK COMMAND
  1444.                          ; TO CONTROLLER
  1445.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND,
  1446.                          ; TO CONTROLLER
  1447.          JMP     VRFYS   ;GO CHECK SECTORS ON A NEW TRACK 
  1448. VRFY2:   CALL    RSTR    ;TRANSMIT SEEK TRACK 00 COMMAND,
  1449.                          ; TO CONTROLLER
  1450.          LDA     HDSEL   ;GET THE CURRENT STATE OF HEAD SELECT
  1451.          CPI     020H    ;END THIS PASS,IF THE UPPER HEAD
  1452.                          ; IS SELECTED
  1453.          JZ      FORME
  1454.          CALL    DSIDE   ;GO FIND OUT IF THIS IS A
  1455.                          ; DOUBLE SIDED DISKETTE,AND
  1456.                          ; CHECK THE UPPER SURFACE IF SO 
  1457.          LDA     HDSEL   ;GET THE CURRENT STATE OF HEAD SELECT
  1458.          CPI     000H    ;IS THE LOWER HEAD SELECTED?
  1459.          JNZ     VRFYS   ;GO CHECK THE UPPER SURFACE,
  1460.                          ; IF THE UPPER HEAD IS SELECTED 
  1461.          JMP     FORME   ;EXIT TEST HERE,AND GO TO MONITOR
  1462.                          ; AFTER CLEARING FORMAT MODE
  1463. ;
  1464. ;
  1465. ;
  1466. ;ROUTINE TO VERIFY (READ CRC) ALL TRACKS/SECTORS
  1467. ;
  1468. VRFYT:   LXI     H,MSG49         ;OUTPUT "VERIFY SINGLE TRACK?" TO CONSOLE
  1469.          CALL    MSG
  1470.          CALL    CECHO   ;GET A KEY-BOARD INPUT
  1471.          CPI     'Y'
  1472.          JZ      VRF1
  1473.          CPI     'N'
  1474.          JZ      VRF5
  1475.          JMP     LER     ;OOPS 
  1476. VRF1:    CALL    SP2
  1477.          LXI     H,MSG54         ;OUTPUT "TRACK=" TO CONSOLE
  1478.          CALL    MSG
  1479.          CALL    CONI
  1480.          STA     NEWTK   ;SAVE THE CONSOLE INPUT
  1481.          CPI     04DH
  1482.          JNC     INER1   ;OOPS 
  1483. VRF2:    CALL    RWCI    ;INITIALIZE FOR VERIFY
  1484.          CALL    DENT    ;SET-UP DENSITY
  1485.          LDA     NEWTK
  1486.          STA     TRKNO
  1487.          CPI     000H    ;TRACK 00 REQUESTED?
  1488.          JNZ     VRF3
  1489.          CALL    RSTR    ;YES  DO A SEEK TRACK 00
  1490.          JMP     VRF4
  1491. VRF3:    CALL    XMTTK   ;TRANSMIT TRACK NUMBER,
  1492.                          ; TO CONTROLLER
  1493.          CALL    SKTRK   ;TRANSMIT SEEK TRACK,
  1494.                          ; TO CONTROLLER
  1495. VRF4:    CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1496.          CALL    DENT    ;SET-UP DENSITY AGAIN 
  1497.          CALL    VRFYR   ;READ CRC'S ON THIS TRACK,ALL SECTORS 
  1498.          CALL    SEC01   ;RE-INITIALIZE TO SECTOR 01
  1499.          CALL    LOOPT
  1500.          JMP     VRF2
  1501. VRF5:    CALL    CRLF
  1502.          MVI     A,001H  ;SET VERIFY COMMAND
  1503.          STA     VFYCM
  1504.          XRA     A       ;CLEAR FORMAT MODE AND HEAD SELECT
  1505.          STA     MODE
  1506.          STA     HDSEL
  1507. VRF6:    CALL    RWCI    ;INITIALIZE FOR VERIFY
  1508.          JMP     VRFYS   ;GO VERIFY ALL TRACKS AND SECTORS
  1509. ;
  1510. ;
  1511. ;
  1512. ;
  1513. ;
  1514. NFORM:   CALL    SP1
  1515.          LXI     H,MSG35         ;OUTPUT "WRITE PROTECT" TO CONSOLE
  1516.          CALL    MSG
  1517. FORME:   XRA     A       ;CLEAR FORMAT MODE
  1518.          STA     MODE
  1519.          STA     HDSEL   ;CLEAR HEAD SELECT
  1520.          CALL    LOOPT   ;GO TEST LOOP COMMAND
  1521.          LDA     VFYCM   ;GO GET STATE OF FORMAT COMMAND
  1522.          ADI     000H    ;MASK IT 
  1523.          JNZ     VRF6    ;GO RE-VERIFY ALL TRACKS/SECTORS,
  1524.                          ; IF REQUESTED 
  1525.          LXI     H,MSG50         ;OUTPUT "FORMAT" TO CONSOLE
  1526.          CALL    MSG
  1527.          JMP     FORM0
  1528. ;
  1529. ;
  1530. ;
  1531. ;SUBROUTINE TO INITIALIZE AND FILL CONTROLLER WRITE BUFFER WITH E5 HEX DATA
  1532. ;
  1533. FORMI:   CALL    HEAD1   ;SET HEAD SELECT,TO LOWER SURFACE
  1534. FORMT:   CALL    WPRT    ;HAS THE OPERATOR REQUESTED WRITE PROTECTION?
  1535.          JNZ     WRT4    ;BAIL-OUT,IF SO 
  1536.          CALL    RWCI    ;INITIALIZE FOR FORMATTING
  1537.          IN      DATAI   ;GET CONTROLLER STATUS
  1538.          ANI     010H    ;IS THE DISKETTE WRITE PROTECTED?
  1539.          JNZ     NFORM   ;IF YES,GO TO THE MONITOR 
  1540. FILLE5:  LXI     D,256   ;SET BYTE COUNT TO FILL
  1541.                          ; CONTROLLERS WRITE BUFFER
  1542.          MVI     A,030H  ;OUTPUT WRITE BUFFER COMMAND,
  1543.                          ; TO CONTROLLER
  1544.          OUT     CNTRL
  1545. FILL:    MVI     A,0E5H  ;SET UP FOR DATA E5 HEX
  1546.          OUT     DATAO   ;OUT TO THE DATA PORT
  1547.          DCX     D       ;-1 TO BYTE COUNT
  1548.          MOV     A,D
  1549.          ORA     E
  1550.          JNZ     FILL
  1551.          RET
  1552. ;
  1553. ;
  1554. ;
  1555. ;SUBROUTINE TO VERIFY (READ CRC) A TRACK IN FORMAT TEST
  1556. ;
  1557. VRFYR:   LDA     TRIES   ;GET RETRIES
  1558.          STA     RETRY   ;STORE IN RETRY COUNTER
  1559.          CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1560.          CALL    TCRCE   ;GO TEST FOR POSSIBLE CRC ERROR
  1561.          CALL    VERSEC  ;GO CHECK FOR PROPER SECTOR NUMBER
  1562.          RZ              ;SEEK TO NEXT TRACK,IF DONE 
  1563.          CALL    XMTUS   ;WERE NOT FINISHED WITH THIS TRACK YET 
  1564.                          ; GO CHECK ANOTHER SECTOR 
  1565.          JMP     VRFYR
  1566. ;
  1567. ;
  1568. ;
  1569. ;SUBROUTINE TO READ AND TEST FOR CRC ERRORS
  1570. ;
  1571. TCRCE:   MVI     A,007H  ;TRANSMIT READ CRC TO CONTROLLER
  1572.          CALL    XMITW
  1573. CRCER:   IN      DATAI   ;GET STATUS FROM CONTROLLER
  1574.          ANI     008H    ;CRC ERROR?
  1575.          JNZ     ERTRY   ;GO DO RETRIES,IF CRC ERROR HAS OCCURED 
  1576.          CALL    DDMRK   ;GO TEST FOR POSSIBLE DD MARK
  1577.          RET
  1578. ERTRY:   CALL    CLRER   ;TRANSMIT CLEAR ERROR FLAGS,
  1579.                          ; TO CONTROLLER
  1580.          LXI     H,MSG39         ;OUTPUT "CRC ERROR" TO CONSOLE
  1581.          CALL    MSG
  1582.          CALL    TKSEC   ;OUTPUT TRACK AND SECTOR IN ERROR,
  1583.                          ; TO THE CONSOLE
  1584.          LDA     RETRY   ;GO GET THE ERROR RETRY COUNTER,
  1585.                          ; AND UPDATE IT 
  1586.          DCR     A
  1587.          STA     RETRY
  1588.          CPI     000H    ;RETRIES FINISHED?
  1589.          JZ      MEDER   ;QUIT IF RETRIES ARE FINISHED,
  1590.                          ; THIS IS A NON-RECOVERABLE ERROR 
  1591.          JMP     TCRCE   ;WERE NOT DONE YET,TRY AGAIN 
  1592. ;
  1593. ;
  1594. ;
  1595. ;SUBROUTINE TO OUTPUT TRACK AND SECTOR IN ERROR TO THE CONSOLE
  1596. ;
  1597. TKSEC:   CALL    SP1
  1598.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  1599.          CALL    MSG
  1600.          CALL    AUNIT   ;OUTPUT UNIT NUMBER TO CONSOLE
  1601.          CALL    BYTEO
  1602.          CALL    SP2
  1603.          LXI     H,MSG58         ;OUTPUT "TRACK=" TO CONSOLE
  1604.          CALL    MSG
  1605.          LDA     TRKNO   ;GET THE CURRENT TRACK NUMBER
  1606.          CALL    BYTEO   ;OUTPUT IT TO THE CONSOLE
  1607.          CALL    SP2
  1608.          LXI     H,MSG59         ;OUTPUT "SECTOR=" TO CONSOLE
  1609.          CALL    MSG
  1610.          LDA     SECNO   ;GO GET THE CURRENT SECTOR NUMBER
  1611.          CALL    BYTEO   ;OUTPUT IT TO THE CONSOLE
  1612.          RET
  1613. ;
  1614. ;
  1615. ;
  1616. ;SUBROUTINE TO INDICATE A "HARD ERROR"(MEDIA ERROR),RESTORE,AND QUIT
  1617. ;
  1618. MEDER:   LXI     H,MSG17         ;OUTPUT "MEDIA ERROR" TO CONSOLE
  1619.          CALL    MSG
  1620.          CALL    RSTR    ;TRANSMIT SEEK TRACK 00 COMMAND,
  1621.                          ; TO CONTROLLER
  1622.          JMP     MNTR
  1623. ;
  1624. ;
  1625. ;
  1626. ;
  1627. ;
  1628. ;TEST WRITE/READ CONTINUOUS (WRITE AND READ ALL AVAILABLE TRACKS)
  1629. ;
  1630. RWC:     LXI     H,MSG30         ;OUTPUT "TEST WRITE/READ CONTINUOUS"
  1631.                          ; TO CONSOLE
  1632.          CALL    MSG
  1633. RWCP:    CALL    HEAD1   ;SET HEAD SELECT TO LOWER SURFACE
  1634.          MVI     C,007H  ;OUTPUT A "BELL" TO INDICATE THE
  1635.                          ; START OF A PASS
  1636.          CALL    CO
  1637.          LXI     H,MSG1  ;OUTPUT "PASS=" TO CONSOLE
  1638.          CALL    MSG
  1639.          LHLD    PCTR    ;OUTPUT PASS NUMBER TO CONSOLE
  1640.          MOV     A,H
  1641.          CALL    BYTEO
  1642.  
  1643.          MOV     A,L
  1644.          CALL    BYTEO
  1645.          LXI     H,MSG16         ;OUTPUT "ERROR TOTAL=" TO CONSOLE
  1646.          CALL    MSG
  1647.          LHLD    ECTR    ;OUTPUT ERROR NUMBER TO CONSOLE
  1648.          MOV     A,H
  1649.          CALL    BYTEO
  1650.          MOV     A,L
  1651.          CALL    BYTEO
  1652.          CALL    RWCI    ;GO INITIALIZE FOR WRITE/READ CONTINUOUS
  1653.          CALL    WPRT    ;GO GET STATE OF OPERATOR REQUESTED
  1654.                          ; WRITE PROTECT
  1655.          JNZ     READO   ;GO DO "READ ONLY" IF WRITE PROTECTED 
  1656.          IN      DATAI   ;GET STATUS FROM CONTROLLER
  1657.          ANI     010H    ;IS THE DISKETTE WRITE PROTECTED?
  1658.          JNZ     READO   ;JUMP TO DO READ ONLY ROUTINE
  1659.                          ; IF WRITE PROTECT STATUS IS TRUE 
  1660. RWCWW:   CALL    CRLF
  1661.          LXI     H,MSG2  ;OUTPUT "WRITE" TO CONSOLE
  1662.          CALL    MSG
  1663.          CALL    CRLF
  1664. RWCWS:   CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1665. RWCW:    CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1666.          CALL    RWCW1   ;GO WRITE A SECTOR
  1667.          CALL    SECCK   ;GO CHECK FOR PROPER SECTOR NUMBER
  1668.          JZ      RWCW4   ;GO TO A NEW TRACK IF FINISHED 
  1669.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR
  1670.                          ; COMMAND,TO CONTROLLER
  1671.          JMP     RWCW    ;GO WRITE NEXT SECTOR
  1672. RWCW4:   CALL    INCTN   ;INCREMENT TRACK NUMBER
  1673.          JZ      RWCW5   ;GO DO A RESTORE,AND ATTEMPT TO
  1674.                          ; WRITE UPPER SURFACE,IF ALL TRACKS HAVE BEEN
  1675.                          ; WRITTEN ON THE LOWER 
  1676.          CALL    XMTTK   ;TRANSMIT LOAD TRACK NUMBER
  1677.                          ; TO CONTROLLER
  1678.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND TO CONTROLLER
  1679.          JMP     RWCWS   ;GO WRITE SECTOR ON NEW TRACK NUMBER
  1680. RWCW5:   CALL    RSTR    ;TRANSMIT SEEK TRACK 00
  1681.                          ; COMMAND TO CONTROLLER
  1682.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1683.          CPI     020H    ;GO READ IF THE UPPER HEAD
  1684.                          ; IS SELECTED
  1685.          JZ      RWCRX
  1686.          CALL    DSIDE   ;GO FIND OUT IF IT'S A DOUBLE
  1687.                          ; SIDED DISKETTE,AND SELECT HEAD
  1688.                          ; AS REQUIRED
  1689.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1690.          CPI     000H    ;IS THE LOWER HEAD SELECTED?
  1691.          JNZ     RWCWW   ;GO WRITE THE UPPER SURFACE,
  1692.                          ; IF THE UPPER HEAD IS SELECTED 
  1693. RWCRX:   CALL    KBINT   ;GO CHECK FOR KEY-BOARD INTERRUPT
  1694.          CALL    HEAD1   ;SELECT LOWER HEAD
  1695.          LDA     BLOOP   ;GET THE STATE OF THE LOOP COMMAND
  1696.          ADI     000H    ;LOOP ON WRITE CONTINUOUS?
  1697.          JNZ     RWCE    ;GO DO ANOTHER WRITE PASS IF SO 
  1698. RWCRR:   CALL    CRLF
  1699.          LXI     H,MSG3  ;OUTPUT "READ" TO CONSOLE
  1700.          CALL    MSG
  1701.          CALL    CRLF
  1702.          CALL    RWCI    ;INITIALIZE TEST FOR READ
  1703. RWCRS:   CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1704. RWCR1:   CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1705.          CALL    DENT    ;GO TEST FOR PROPER DENSITY AND
  1706.                          ; TRANSMIT TO CONTROLLER
  1707.                          ; (RETURN WITH BYTE COUNT IN D&E REGS.)
  1708.          CALL    RWCR2   ;GO READ A SECTOR
  1709.          CALL    SECCK   ;GO CHECK FOR PROPER SECTOR NUMBER
  1710.          JZ      RWCR6   ;GO TO A NEW TRACK IF FINISHED 
  1711.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR COMMAND
  1712.                          ; TO CONTROLLER,WERE NOT DONE WITH
  1713.                          ; THIS TRACK YET 
  1714.          JMP     RWCR1   ;GO READ NEXT SECTOR
  1715. RWCR6:   CALL    INCTN   ;INCREMENT TRACK NUMBER
  1716.          JZ      RWCR7   ;GO DO A RESTORE,AND ATTEMPT TO
  1717.                          ; READ UPPER SURFACE,IF ALL TRACKS HAVE
  1718.                          ; BEEN READ ON LOWER 
  1719.          CALL    XMTTK   ;TRANSMIT LOAD TRACK COMMAND
  1720.                          ; TO CONTROLLER
  1721.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND TO CONTROLLER
  1722.          JMP     RWCRS   ;GO READ SECTOR ON NEW TRACK NUMBER
  1723. RWCR7:   CALL    RSTR    ;TRANSMIT SEEK TRACK 00
  1724.                          ; COMMAND TO CONTROLLER
  1725.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1726.          CPI     020H    ;GO END THIS PASS IF THE UPPER
  1727.                          ; HEAD IS SELECTED 
  1728.          JZ      RWCE
  1729.          CALL    DSIDE   ;GO FIND OUT IF THIS IS A DOUBLE
  1730.                          ; SIDED DISKETTE,AND READ UPPER
  1731.                          ; SURFACE IF SO 
  1732.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1733.          CPI     000H    ;LOWER HEAD SELECTED?
  1734.          JNZ     RWCRR   ;GO READ UPPER SURFACE,IF UPPER
  1735.                          ; HEAD IS SELECTED 
  1736. RWCE:    LHLD    PCTR    ;GO GET PASS COUNTER FROM STORAGE,
  1737.                          ; AND UPDATE IT
  1738.          INX     H       ;INCREMENT PASS COUNTER
  1739.          SHLD    PCTR    ;STORE NEW PASS NUMBER
  1740.          JMP     RWCP    ;GO DO THE NEXT PASS
  1741. ;
  1742. ;
  1743. ;
  1744. READO:   CALL    SP1
  1745.          LXI     H,MSG35         ;OUTPUT "WRITE PROTECT" TO CONSOLE
  1746.          CALL    MSG
  1747.          JMP     RWCRX   ;GO DO A READ PASS ONLY 
  1748. ;
  1749. ;
  1750. ;
  1751. ;SUBROUTINE TO WRITE A SECTOR IN WRITE/READ CONTINUOUS TEST
  1752. ;
  1753. RWCW1:   CALL    WSEC    ;SET-UP FOR WRITE SECTOR
  1754.          MVI     A,005H  ;TRANSMIT WRITE COMMAND TO CONTROLLER
  1755.          CALL    XMITW
  1756.          CALL    WSTAT   ;GO FIND OUT STATUS OF WRITE
  1757.          RZ
  1758.          CALL    WERR    ;OOPS CRC ERROR   
  1759.          JMP     RWCWS   ;GO TRY AGAIN
  1760. ;
  1761. ;
  1762. ;
  1763. ;SUBROUTINE TO SET-UP WRITE SECTOR
  1764. ;
  1765. WSEC:    CALL    PTKSC   ;FILL WRITE BUFFER WITH ALTERNATE
  1766.                          ; TRACK AND SECTOR NUMBER,AS DATA
  1767.          CALL    DENT    ;GO TEST FOR PROPER DENSITY FOR CURRENT
  1768.                          ; TRACK POSITION,AND RETURN WITH THE
  1769.                          ; BYTE COUNT IN THE D&E REGISTERS 
  1770.          LXI     H,WBUF  ;SET H&L REGS. TO POINT TO FIRST
  1771.                          ; LOCATION IN WRITE BUFFER
  1772.          MVI     A,030H  ;OUTPUT WRITE BUFFER COMMAND,
  1773.                          ; TO CONTROLLER
  1774.          OUT     CNTRL
  1775. WSEC1:   MOV     A,M     ;LOAD A BYTE FROM WRITE BUFFER
  1776.                          ; FOR OUTPUT TO CONTROLLER
  1777.          OUT     DATAO   ;OUTPUT IT 
  1778.          INX     H       ;BUMP THE POINTER TO THE NEXT
  1779.                          ; LOCATION IN THE WRITE BUFFER
  1780.          DCX     D       ;-1 TO BYTE COUNT
  1781.          XRA     A       ;ZERO OUT A REG.
  1782.          ORA     E       ;OR IN E REG.
  1783.          JNZ     WSEC1   ;GO OUTPUT ANOTHER BYTE IF ALL THE DATA
  1784.                          ; HAS NOT BEEN TRANSMITTED TO
  1785.                          ; THE CONTROLLER
  1786.          RET
  1787. ;
  1788. ;
  1789. ;
  1790. ;SUBROUTINE TO CHECK STATUS OF WRITE SECTOR
  1791. ;
  1792. WSTAT:   IN      DATAI   ;GO GET STATUS FROM CONTROLLER
  1793.          ANI     008H    ;CRC ERROR?FIND OUT AT THE RETURN
  1794.          RET
  1795. ;
  1796. ;
  1797. ;
  1798. ;SUBROUTINE TO INDICATE A WRITE ERROR
  1799. ;
  1800. WERR:    LXI     H,MSG39         ;YES OUTPUT "CRC ERROR" TO CONSOLE
  1801.          CALL    MSG
  1802.          LXI     H,MSG2  ;OUTPUT "WRITE" TO CONSOLE
  1803.          CALL    MSG
  1804.          CALL    CLRER   ;TRANSMIT CLEAR ERROR FLAGS,
  1805.                          ; TO CONTROLLER
  1806.          CALL    TKSEC   ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE
  1807.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1808.          INX     H
  1809.          SHLD    ECTR
  1810.          RET
  1811. ;
  1812. ;
  1813. ;
  1814. ;
  1815. ;
  1816. ;
  1817. ;
  1818. ;SUBROUTINE TO READ A SECTOR IN WRITE/READ CONTINUOUS TEST
  1819. ;
  1820. RWCR2:   XRA     A       ;CLEAR OUT OLD "SAVE" STATUS
  1821.          STA     SAVE
  1822. RWCR3:   MVI     A,003H  ;TRANSMIT READ COMMAND
  1823.                          ; TO CONTROLLER
  1824.          CALL    XMITW
  1825.          IN      DATAI   ;GET CONTROLLER STATUS
  1826.          STA     SAVE    ;SAVE IT 
  1827.          ANI     008H    ;HAVE WE GOT A CRC ERROR?
  1828.          CNZ     CLRER   ;GO CLEAR ERROR FLAGS,IF SO 
  1829.          CALL    DDMRK   ;GO TEST FOR POSSIBLE DD MARK
  1830.          LXI     H,RBUF  ;SET H&L REGS. TO POINT TO FIRST
  1831.                          ; LOCATION IN READ BUFFER
  1832.          MVI     A,040H  ;TRANSMIT READ BUFFER COMMAND,
  1833.                          ; TO CONTROLLER
  1834.          OUT     CNTRL
  1835. RWCR4:   IN      DATAI   ;GET A DATA BYTE 
  1836.          MOV     M,A     ;STUFF IT INTO THE READ BUFFER
  1837.          INX     H       ;BUMP THE READ BUFFER POINTER
  1838.          DCX     D       ;-1 TO THE BYTE COUNT
  1839.          XRA     A       ;IS ALL THE DATA IN?
  1840.          ORA     E
  1841.          JNZ     RWCR4   ;GO GET ANOTHER DATA BYTE IF NOT DONE 
  1842.          CALL    PTKSC   ;FILL WRITE BUFFER WITH ALTERNATE
  1843.                          ; TRACK AND SECTOR NUMBER,AS DATA
  1844.          CALL    RERR    ;GO DO A BYTE FOR BYTE COMPARE ON DATA,
  1845.                          ; FOR POSSIBLE ERROR IN DATA FIELD
  1846.                          ; (CRC ERROR STATUS REPORT MAY
  1847.                          ; BE BROKEN,AND NOT TELL US)
  1848.          LDA     SAVE    ;GO GET "SAVED" STATUS
  1849.          ANI     008H    ;CRC ERROR?
  1850.          RZ
  1851.          LXI     H,MSG39         ;YES OUTPUT "CRC ERROR" TO CONSOLE
  1852.          CALL    MSG
  1853.          LXI     H,MSG3  ;OUTPUT "READ" TO CONSOLE
  1854.          CALL    MSG
  1855.          CALL    CLRER   ;CLEAR ANY ERROR
  1856.          CALL    TKSEC   ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE
  1857.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  1858.          INX     H
  1859.          SHLD    ECTR
  1860.          JMP     RWCRS
  1861. ;
  1862. ;
  1863. ;
  1864. ;
  1865. ;
  1866. ;
  1867. ;
  1868. ;
  1869. ;
  1870. ;SUBROUTINE TO INITIALIZE WRITE/READ CONTINUOUS
  1871. ;
  1872. RWCI:    CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1873.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR
  1874.                          ; TO CONTROLLER
  1875.          MVI     A,081H  ;TRANSMIT CLEAR COMMAND
  1876.                          ; TO CONTROLLER
  1877.          CALL    XMIT
  1878.          CALL    RSTR    ;TRANSMIT SEEK TO TRACK 00
  1879.                          ; COMMAND TO CONTROLLER
  1880.          CALL    CLRER   ;TRANSMIT CLEAR ERROR FLAGS
  1881.                          ; TO CONTROLLER
  1882.          RET
  1883. ;
  1884. ;
  1885. ;
  1886. ;
  1887. ;
  1888. ;
  1889. ;SYSTEM TEST (WRITES ALL TRACKS,READS TRACKS ON RANDOM SEEKS,UNITS 00 AND 01)
  1890. ;
  1891. SYS:     LXI     H,MSG57         ;OUTPUT "SYSTEM TEST"
  1892.                          ; TO CONSOLE
  1893.          CALL    MSG
  1894. SYSS:    CALL    RGEN    ;SET-UP THE RANDOM TRACK NUMBER TABLE
  1895.          XRA     A       ;SET UNIT SELECT TO 00
  1896.          STA     UNIT
  1897.          CALL    HEAD1   ;SET HEAD SELECT TO LOWER SURFACE
  1898.          MVI     C,007H  ;OUTPUT A "BELL" TO INDICATE THE
  1899.                          ; START OF A PASS
  1900.          CALL    CO
  1901.          LXI     H,MSG1  ;OUTPUT "PASS=" TO CONSOLE
  1902.          CALL    MSG
  1903.          LHLD    PCTR    ;OUTPUT PASS NUMBER TO CONSOLE
  1904.          MOV     A,H
  1905.          CALL    BYTEO
  1906.  
  1907.          MOV     A,L
  1908.          CALL    BYTEO
  1909.          LXI     H,MSG16         ;OUTPUT "ERROR TOTAL=" TO CONSOLE
  1910.          CALL    MSG
  1911.          LHLD    ECTR    ;OUTPUT ERROR NUMBER TO CONSOLE
  1912.          MOV     A,H
  1913.          CALL    BYTEO
  1914.          MOV     A,L
  1915.          CALL    BYTEO
  1916. SYSWI:   CALL    RWCI    ;GO INITIALIZE FOR SYSTEM TEST
  1917.          IN      DATAI   ;GET STATUS FROM THE SELECTED UNIT
  1918.          ANI     010H    ;MASK WRITE PROTECT
  1919.          JNZ     MNTR    ;GO TO THE COMMAND MONITOR,IF WRITE PROTECTED 
  1920.          CALL    UFLIP   ;SELECT THE NEXT UNIT
  1921.          JNZ     SYSWI   ;RESTORE AND CHECK IT ALSO 
  1922.          CALL    WPRT    ;CHECK FOR OPERATOR REQUESTED WRITE PROTECTION
  1923.          JNZ     SYSRO   ;DO "READ ONLY" PASSES IF REQUESTED 
  1924. SYSW:    CALL    CRLF
  1925.          LXI     H,MSG2  ;OUTPUT "WRITE" TO CONSOLE
  1926.          CALL    MSG
  1927.          CALL    CRLF
  1928. SYSW1:   CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1929.          CALL    WMK     ;WRITE A DELETED DATA MARK ON SECTOR 01 ONLY 
  1930.          CALL    SECCK   ;BUMP THE SECTOR NUMBER
  1931.          CALL    XMTUS   ;TRANSMIT NEXT SECTOR TO CONTROLLER
  1932. SYSW2:   CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1933.          CALL    SYSWS   ;GO WRITE A SECTOR
  1934.          CALL    SECCK   ;GO CHECK FOR PROPER SECTOR NUMBER
  1935.          JZ      SYSW3   ;GO TO A NEW TRACK IF FINISHED 
  1936.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR
  1937.                          ; COMMAND,TO CONTROLLER
  1938.          JMP     SYSW2   ;GO WRITE NEXT SECTOR
  1939. SYSW3:   CALL    UFLIP   ;SELECT NEW UNIT
  1940.          JNZ     SYSW1   ;DO A WRITE ON UNIT 01,IF NOT UNIT 00 
  1941.          CALL    INCTN   ;INCREMENT TRACK NUMBER
  1942.          JZ      SYSW5   ;GO DO A RESTORE,AND ATTEMPT TO
  1943.                          ; WRITE UPPER SURFACE,IF ALL TRACKS HAVE BEEN
  1944.                          ; WRITTEN ON THE LOWER 
  1945. SYSW4:   CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR COMMAND,
  1946.                          ; TO CONTROLLER
  1947.          CALL    XMTTK   ;TRANSMIT LOAD TRACK NUMBER TO CONTROLLER
  1948.                          ; COMMAND TO CONTROLLER
  1949.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND TO CONTROLLER
  1950.          CALL    UFLIP   ;SELECT NEW UNIT
  1951.          JNZ     SYSW4   ;SEEK TO NEXT TRACK ON UNIT 01,
  1952.                          ; IF NOT UNIT 00 
  1953.          JMP     SYSW1   ;GO WRITE SECTOR ON NEW TRACK NUMBER
  1954. SYSW5:   CALL    RSTR    ;TRANSMIT SEEK TRACK 00 COMMAND,
  1955.                          ; TO CONTROLLER
  1956.          CALL    UFLIP   ;SELECT NEW UNIT
  1957.          JNZ     SYSW5   ;DO A RESTORE 0N UNIT 01,IF NOT UNIT 00 
  1958.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1959.          CPI     020H    ;GO READ IF THE UPPER HEAD
  1960.                          ; IS SELECTED
  1961.          JZ      SYSR
  1962.          CALL    DSIDE   ;GO FIND OUT IF IT'S A DOUBLE
  1963.                          ; SIDED DISKETTE,AND SELECT HEAD
  1964.                          ; AS REQUIRED
  1965.          LDA     HDSEL   ;GO GET HEAD SELECT STATUS
  1966.          CPI     000H    ;IS THE LOWER HEAD SELECTED?
  1967.          JNZ     SYSW    ;GO WRITE THE UPPER SURFACE,
  1968.                          ; IF THE UPPER HEAD IS SELECTED 
  1969. SYSR:    CALL    KBINT   ;GO CHECK FOR KEY-BOARD INTERRUPT
  1970.          CALL    HEAD1   ;SELECT LOWER HEAD
  1971.          LDA     BLOOP   ;GET THE STATE OF THE LOOP COMMAND
  1972.          ADI     000H    ;LOOP ON WRITE CONTINUOUS?
  1973.          JNZ     SYSE    ;GO DO ANOTHER WRITE PASS IF SO 
  1974. SYSR1:   CALL    CRLF
  1975.          LXI     H,MSG3  ;OUTPUT "READ" TO CONSOLE
  1976.          CALL    MSG
  1977.          CALL    CRLF
  1978. SYSRI:   CALL    RWCI    ;INITIALIZE TEST FOR READ
  1979.          CALL    UFLIP   ;SELECT NEW UNIT
  1980.          JNZ     SYSRI   ;DO A RESTORE ON UNIT 01,IF NOT UNIT 00 
  1981. SYSR2:   CALL    DENT    ;SET DENSITY AND BYTE COUNT FOR
  1982.                          ; CURRENT TRACK POSITION
  1983.          CALL    RMK     ;CHECK FOR A DELETED DATA MARK ON SECTOR 01 ONLY 
  1984.          CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  1985. SYSR3:   CALL    KBINT   ;GO TEST FOR KEY-BOARD INTERRUPT
  1986.          CALL    DENT    ;GO TEST FOR PROPER DENSITY AND
  1987.                          ; TRANSMIT TO CONTROLLER
  1988.                          ; (RETURN WITH BYTE COUNT IN D&E REGS.)
  1989.          CALL    SYSRS   ;GO READ A SECTOR
  1990.          CALL    SECCK   ;GO CHECK FOR PROPER SECTOR NUMBER
  1991.          JZ      SYSR4   ;GO TO A NEW TRACK IF FINISHED 
  1992.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR COMMAND,
  1993.                          ; TO CONTROLLER
  1994.          JMP     SYSR3   ;GO READ NEXT SECTOR
  1995. SYSR4:   CALL    UFLIP   ;SELECT NEW UNIT
  1996.          CALL    RND     ;GO GET A RANDOM TRACK NUMBER FROM TABLE
  1997.          CALL    SEC01   ;SET SECTOR NUMBER TO 01
  1998.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR COMMAND,
  1999.                          ; TO CONTROLLER
  2000.          CALL    XMTTK   ;TRANSMIT LOAD TRACK COMMAND
  2001.                          ; TO CONTROLLER
  2002.          CALL    SKTRK   ;TRANSMIT SEEK COMMAND TO CONTROLLER
  2003.          JMP     SYSR2   ;GO READ SECTOR ON NEW TRACK NUMBER
  2004. ;
  2005. ;
  2006. ;
  2007. ;SUBROUTINE TO "FLIP" UNIT SELECTS
  2008. ;
  2009. UFLIP:   LDA     UNIT    ;GET THE CURRENT STATE OF UNIT SELECT
  2010.          CMA             ;COMPLEMENT IT 
  2011.          ANI     040H    ;MASK FOR UNIT SELECT 01
  2012.          STA     UNIT    ;PUT NEW UNIT SELECT BACK 
  2013.          CPI     000H    ;UNIT SELECT 00?
  2014.          RET             ;FIND OUT AT THE RETURN   
  2015. ;
  2016. ;
  2017. ;
  2018. ;ROUTINE TO GENERATE RANDOM TRACK NUMBERS INTO TABLE
  2019. ;
  2020. RGEN:    LXI     D,256   ;SET RANDOM TABLE LENGTH TO 256
  2021.          LXI     H,RANTK         ;POINT AT RANDOM TRACK NUMBER TABLE
  2022.          MOV     A,M     ;GET TRASH FROM MEMORY
  2023. CHEW:    STA     SECNO   ;START CHEWING 
  2024.          MOV     B,A     ;PUT IT IN B REG.
  2025.          LDA     TRKNO   ;GET THE CURRENT TRACK NUMBER
  2026.          XRA     B       ;SCREW IT UP 
  2027.          RLC
  2028.          RLC
  2029.          RLC
  2030. CMP4D:   CPI     04DH    ;> TRACK 76?
  2031.          JC      STTRK   ;IF NOT,STORE IT AS NEW TRACK NUMBER
  2032.          RAR             ;SCREW IT UP SOME MORE 
  2033.          JMP     CMP4D
  2034. STTRK:   STA     TRKNO   ;THE NEW TRACK NUMBER 
  2035. CMP1B:   CPI     01BH    ;> SECTOR 26?
  2036.          JC      STSEC   ;IF NOT,STORE IT AS NEW SECTOR NUMBER
  2037.          RAR             ;SCREW THIS ONE UP ALSO 
  2038.          JMP     CMP1B
  2039. STSEC:   STA     SECNO   ;THE NEW SECTOR NUMBER 
  2040.          LDA     TRKNO   ;STUFF THE TRACK NUMBER INTO THE TABLE
  2041.          CPI     000H    ;HAS TRACK 00 BEEN GENERATED?
  2042.          JNZ     STMEM
  2043.          MVI     A,001H  ;YES  CHANGE IT TO TRACK 01 
  2044. STMEM:   MOV     M,A
  2045.          INX     H       ;BUMP THE POINTER
  2046.          DCX     D       ;DECREMENT THE LENGTH
  2047.          MOV     A,E
  2048.          ORA     D
  2049.          JNZ     CHEW    ;GO SCREW-UP THE TRACK NUMBER SOME
  2050.                          ; MORE,IF THE TABLE IS NOT FULL 
  2051.          LXI     H,256   ;SET THE RANDOM SEEK ITERATIONS COUNTER
  2052.                          ; TO 256 RANDOM SEEKS
  2053.          SHLD    RCTR
  2054.          LXI     H,RANTK         ;SET-UP THE TABLE POINTER
  2055.          SHLD    RPNT
  2056.          RET
  2057. ;
  2058. ;
  2059. ;
  2060. ;
  2061. ;
  2062. ;
  2063. ;ROUTINE TO GET A RANDOM TRACK NUMBER FROM THE TABLE
  2064. ;
  2065. RND:     LHLD    RCTR    ;GET THE CURRENT SEEK COUNT
  2066.          XCHG            ;PUT IT IN THE D&E REGS.
  2067.          LHLD    RPNT    ;POINT AT THE RANDOM TRACK TABLE
  2068.          MOV     A,M     ;GET A TRACK NUMBER
  2069.          STA     TRKNO   ;SAVE IT 
  2070.          INX     H       ;BUMP THE POINTER
  2071.          SHLD    RPNT    ;SAVE IT ALSO 
  2072.          DCX     D       ;-1 TO THE RANDOM SEEK ITERATIONS COUNT
  2073.          XCHG            ;SWAP 
  2074.          SHLD    RCTR    ;SAVE THE COUNT
  2075.          XCHG            ;SWAP AGAIN 
  2076.          MOV     A,E
  2077.          ORA     D
  2078.          RNZ             ;GO DO ANOTHER SEEK,IF 256 SEEKS
  2079.                          ; NOT FINISHED 
  2080. SYSE:    LHLD    PCTR    ;UPDATE THE PASS COUNTER
  2081.          INX     H
  2082.          SHLD    PCTR
  2083.          LXI     SP,STACK        ;SET THE STACK POINTER TO RESOLVE
  2084.                                  ; THE UNSATISFIED CALL TO "RND"
  2085.                                  ; AFTER 256 RANDOM SEEKS 
  2086.          JMP     SYSS    ;GO DO THE NEXT PASS
  2087. ;
  2088. ;
  2089. ;
  2090. ;
  2091. ;
  2092. ;
  2093. SYSRO:   CALL    SP1
  2094.          LXI     H,MSG35         ;OUTPUT "WRITE PROTECT" TO CONSOLE
  2095.          CALL    MSG
  2096.          JMP     SYSR    ;GO DO A READ PASS ONLY 
  2097. ;
  2098. ;
  2099. ;
  2100. ;
  2101. ;
  2102. ;
  2103. ;SUBROUTINE TO WRITE A SECTOR IN SYSTEM TEST
  2104. ;
  2105. SYSWS:   CALL    WSEC    ;SET-UP TO WRITE A SECTOR
  2106.          MVI     A,005H  ;TRANSMIT WRITE COMMAND TO CONTROLLER
  2107.          CALL    XMITW
  2108.          CALL    WSTAT   ;GO CHECK STATUS OF WRITE
  2109.          RZ
  2110.          CALL    WERR    ;OOPS CRC ERROR GOT US AGAIN 
  2111.          JMP     SYSW1   ;GO TRY AGAIN 
  2112. ;
  2113. ;
  2114. ;
  2115. ;
  2116. ;
  2117. ;
  2118. ;SUBROUTINE TO READ A SECTOR IN SYSTEM TEST
  2119. ;
  2120. SYSRS:   XRA     A       ;CLEAR OUT OLD "SAVE" STATUS
  2121.          STA     SAVE
  2122.          MVI     A,003H  ;TRANSMIT READ COMMAND
  2123.                          ; TO CONTROLLER
  2124.          CALL    XMITW
  2125.          IN      DATAI   ;GET CONTROLLER STATUS
  2126.          STA     SAVE    ;SAVE IT 
  2127.          ANI     008H    ;HAVE WE GOT A CRC ERROR?
  2128.          CNZ     CLRER   ;GO CLEAR ERROR FLAGS,IF SO 
  2129.          IN      DATAI   ;GET THE STATUS
  2130.          ANI     080H    ;DELETED DATA MARK?
  2131.          CNZ     CLRER   ;CLEAR THE ERROR FLAGS,IF SO 
  2132.          LXI     H,RBUF  ;SET H&L REGS. TO POINT TO FIRST
  2133.                          ; LOCATION IN READ BUFFER
  2134.          MVI     A,040H  ;TRANSMIT READ BUFFER COMMAND,
  2135.                          ; TO CONTROLLER
  2136.          OUT     CNTRL
  2137. RSEC:    IN      DATAI   ;GET A DATA BYTE 
  2138.          MOV     M,A     ;STUFF IT INTO THE READ BUFFER
  2139.          INX     H       ;BUMP THE READ BUFFER POINTER
  2140.          DCX     D       ;-1 TO THE BYTE COUNT
  2141.          XRA     A       ;IS ALL THE DATA IN?
  2142.          ORA     E
  2143.          JNZ     RSEC    ;GO GET ANOTHER DATA BYTE IF NOT DONE 
  2144.          CALL    PTKSC   ;FILL WRITE BUFFER WITH ALTERNATE
  2145.                          ; TRACK AND SECTOR NUMBER,AS DATA
  2146.          CALL    RERR    ;GO DO A BYTE FOR BYTE COMPARE ON DATA,
  2147.                          ; FOR POSSIBLE ERROR IN DATA FIELD
  2148.                          ; (CRC ERROR STATUS REPORT MAY
  2149.                          ; BE BROKEN,AND NOT TELL US)
  2150.          LDA     SAVE    ;GO GET "SAVED" STATUS
  2151.          ANI     008H    ;CRC ERROR?
  2152.          RZ
  2153.          LXI     H,MSG39         ;YES OUTPUT "CRC ERROR" TO CONSOLE
  2154.          CALL    MSG
  2155.          LXI     H,MSG3  ;OUTPUT "READ" TO CONSOLE
  2156.          CALL    MSG
  2157.          CALL    CLRER   ;CLEAR ANY ERROR
  2158.          CALL    TKSEC   ;OUTPUT TRACK AND SECTOR IN ERROR TO CONSOLE
  2159.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  2160.          INX     H
  2161.          SHLD    ECTR
  2162.          JMP     SYSR3
  2163. ;
  2164. ;
  2165. ;
  2166. ;SUBROUTINE TO WRITE AND CHECK A DELETED DATA MARK
  2167. ;
  2168. WMK:     CALL    WSEC    ;SET-UP TO WRITE A SECTOR
  2169.          MVI     A,00FH  ;TRANSMIT A WRITE DELETED DATA MARK COMMAND
  2170.                          ; TO CONTROLLER
  2171.          CALL    XMITW
  2172.          CALL    WSTAT   ;CHECK WRITE STATUS
  2173.          JZ      WMKR    ;GO READ DD MARK AND CRC,IF O.K.
  2174.          CALL    WERR    ;OOPS ANOTHER DAMN CRC ERROR 
  2175.          JMP     SYSW1
  2176. WMKR:    CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  2177.          MVI     A,007H  ;TRANSMIT A READ CRC COMMAND TO CONTROLLER
  2178.          CALL    XMITW
  2179.          IN      DATAI   ;GET THE STATUS
  2180.          ANI     008H    ;CRC ERROR?
  2181.          JZ      WMK1
  2182.          CALL    ERROR   ;YES   
  2183. WMK1:    IN      DATAI   ;GET THE STATUS AGAIN
  2184.          ANI     080H    ;DD MARK?
  2185.          JZ      WMK2
  2186.          CALL    CLRER   ;YES,IT'S WHERE IT SHOULD BE 
  2187.          RET
  2188. WMK2:    CALL    FAIL    ;OOPS  WE ARE MISSING THE DD MARK 
  2189.          LXI     H,MSG2  ;OUTPUT "WRITE" TO CONSOLE
  2190.          CALL    MSG
  2191.          JMP     MKERR
  2192. ;
  2193. ;
  2194. ;
  2195. ;SUBROUTINE TO READ AND CHECK A DELETED DATA MARK
  2196. ;
  2197. RMK:     CALL    SEC01   ;INITIALIZE FOR SECTOR 01
  2198.          MVI     A,007H  ;TRANSMIT A READ CRC COMMAND TO CONTROLLER
  2199.          CALL    XMITW
  2200.          IN      DATAI   ;GET THE STATUS
  2201.          ANI     008H    ;CRC ERROR?
  2202.          JZ      RMK1
  2203.          CALL    ERROR   ;YES   
  2204. RMK1:    IN      DATAI   ;ONE MORE TIME FOR THE STATUS 
  2205.          ANI     080H    ;DD MARK?
  2206.          JZ      RMK2
  2207.          CALL    CLRER   ;YES,IT'S REALLY ON SECTOR 01 
  2208.          RET
  2209. RMK2:    CALL    FAIL    ;OH  OH  NO DD MARK 
  2210.          LXI     H,MSG3  ;OUTPUT "READ " TO CONSOLE
  2211.          CALL    MSG
  2212. MKERR:   LXI     H,MSG44         ;OUTPUT "DD MARK" TO CONSOLE
  2213.          CALL    MSG
  2214.          CALL    TKSEC   ;OUTPUT THE TRACK AND SECTOR IN ERROR 
  2215.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  2216.          INX     H
  2217.          SHLD    ECTR
  2218.  
  2219.          RET
  2220. ;
  2221. ;
  2222. ;
  2223. FAIL:    LXI     H,MSG23         ;OUTPUT "FAILED TO" TO CONSOLE
  2224.          CALL    MSG
  2225.          RET
  2226. ;
  2227. ;
  2228. ;
  2229. ;
  2230. ;
  2231. ;
  2232. ;SUBROUTINE TO INCREMENT TRACK NUMBER
  2233. ;
  2234. INCTN:   MVI     A,001H  ;SET SECTOR NUMBER TO 01
  2235.          STA     SECNO
  2236.          LDA     TRKNO   ;GET PRESENT TRACK NUMBER
  2237.          INR     A       ;+1 TO TRACK NUMBER
  2238.          STA     TRKNO   ;STORE IT 
  2239.          CPI     04DH    ;TRACK NUMBER >76 DECIMAL?
  2240.          RET             ;FIND OUT AT RETURN 
  2241. ;
  2242. ;
  2243. ;
  2244. ;SUBROUTINE TO SEEK TO A TRACK
  2245. ;
  2246. SKTRK:   MVI     C,'.'   ;MAKE A TRACK SEEK INDICATOR FOR CONSOLE
  2247.          CALL    CO
  2248.          CALL    KBINT   ;GO CHECK FOR KEY-BOARD INTERRUPT
  2249.          CALL    DENT    ;ESTABLISH PROPER DENSITY
  2250.          MVI     A,009H  ;TRANSMIT SEEK COMMAND,
  2251.                          ; TO CONTROLLER
  2252.          CALL    XMITW
  2253.          IN      DATAI   ;GO GET CONTROLLER STATUS
  2254.          ANI     008H    ;CRC ERROR?
  2255.          RZ
  2256.          CALL    CLRER   ;CLEAR THE CRC ERROR 
  2257.          LHLD    ECTR    ;UPDATE THE ERROR COUNTER
  2258.          INX     H
  2259.          SHLD    ECTR
  2260.          LXI     H,MSG39         ;OUTPUT "CRC ERROR" TO CONSOLE
  2261.          CALL    MSG
  2262.          CALL    SP1
  2263.          LXI     H,MSG60         ;OUTPUT "SEEK TO TRACK=" TO CONSOLE
  2264.          CALL    MSG
  2265.          LDA     TRKNO   ;GO GET CURRENT TRACK NUMBER
  2266.          STA     NEWTK   ;SAVE IT 
  2267.          CALL    BYTEO   ;OUTPUT IT TO THE CONSOLE 
  2268.          CALL    SP2
  2269.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  2270.          CALL    MSG
  2271.          CALL    AUNIT   ;OUTPUT UNIT NUMBER TO CONSOLE
  2272.          CALL    BYTEO
  2273.          CALL    RSTR    ;TRANSMIT SEEK TRACK 00 COMMAND,
  2274.                          ; TO CONTROLLER
  2275.          LDA     NEWTK   ;O.K NOW PUT IT BACK 
  2276.          STA     TRKNO
  2277.          JMP     SKTRK   ;LET'S TRY SEEKING TO THIS TRACK AGAIN 
  2278. ;
  2279. ;
  2280. ;
  2281. ;
  2282. ;SUBROUTINE TO FILL WRITE BUFFER WITH TRACK AND SECTOR NUMBER DATA
  2283. ;
  2284. PTKSC:   CALL    DENT    ;GO GET BYTE COUNT FOR CURRENT TRACK POSITION
  2285.          LXI     H,WBUF  ;SET-UP POINTER AT WRITE BUFFER
  2286. DPAT:    LDA     TRKNO   ;GO GET THE CURRENT TRACK NUMBER
  2287.          MOV     M,A     ;PUT IT IN THE WRITE BUFFER
  2288.          INX     H       ;BUMP THE WRITE BUFFER POINTER
  2289.          DCX     D       ;-1 TO THE BYTE COUNT
  2290.          XRA     A       ;ALL THE DATA BEEN MOVED?
  2291.          ORA     E
  2292.          RZ              ;RETURN IF SO 
  2293.          LDA     SECNO   ;GO GET THE CURRENT SECTOR NUMBER
  2294.          MOV     M,A     ;PUT IT INTO THE WRITE BUFFER ALSO 
  2295.          INX     H       ;BUMP THE WRITE BUFFER POINTER AGAIN 
  2296.          DCX     D       ;ANOTHER -1 TO THE BYTE COUNT
  2297.          XRA     A       ;DONE YET???
  2298.          ORA     E
  2299.          JNZ     DPAT    ;WELL,IF NOT DONE,GO LOAD A TRACK NUMBER
  2300.          RET             ;AHHHHH  FINALLY DONE  
  2301. ;
  2302. ;
  2303. ;
  2304. ;SUBROUTINE TO DO 26 SEQUENTIAL SECTORS
  2305. ;
  2306. VERSEC:  LDA     TRKNO   ;GET THE CURRENT TRACK NUMBER
  2307.          CPI     000H    ;WE AT TRACK 00?
  2308.          JZ      VER26   ;DO 26 SEQUENTIAL SECTORS IF SO 
  2309.          LDA     XTEND   ;EXTENDED FORMAT?
  2310.          CPI     080H    ;DO 8 SEQUENTIAL SECTORS IF SO
  2311.          JNZ     VER26
  2312.          LDA     SECNO   ;GET THE SECTOR NUMBER
  2313.          INR     A
  2314.          STA     SECNO
  2315.          CPI     009H    ;ALL DONE FOR 8 SECTORS?
  2316.          RET             ;FIND OUT AT THE RETURN 
  2317. VER26:   LDA     SECNO   ;GET THE CURRENT SECTOR NUMBER
  2318.          INR     A       ;BUMP IT 
  2319.          STA     SECNO   ;SAVE IT 
  2320.          CPI     01BH    ;ALL SECTORS DONE?
  2321.          RET             ;FIND OUT AT THE RETURN 
  2322. ;
  2323. ;
  2324. ;
  2325. ;SUBROUTINE TO TRANSMIT THE PROPER SECTOR NUMBER TO THE CONTROLLER
  2326. ;
  2327. SECCK:   LDA     TRKNO   ;GO GET THE CURRENT TRACK NUMBER
  2328.          CPI     000H    ;IF IT'S TRACK 00,GO DO 26 LOGICAL SECTORS
  2329.          JZ      SEC26
  2330.          LDA     XTEND   ;GO GET EXTENDED FORMAT COMMAND
  2331.          CPI     080H    ;IF IT'S EXTENDED FORMAT,GO DO 8 SEQUENTIAL SECTORS
  2332.          JNZ     SEC26
  2333.          LDA     LSN     ;START BUMPING FOR 8 SEQUENTIAL SECTORS
  2334.          INR     A
  2335.          STA     LSN
  2336.          STA     SECNO
  2337.          CPI     009H    ;LAST SECTOR DONE FOR EXTENDED FORMAT?
  2338.          RET             ;FIND OUT AT THE RETURN 
  2339. ;
  2340. ;
  2341. ;
  2342. ;SUBROUTNE TO DO 26 LOGICAL SECTORS
  2343. ;
  2344. SEC26:   CALL    INCSN   ;GO INCREMENT LOGICAL SECTOR NUMBER
  2345.          LDA     LSN     ;IS THE LAST SECTOR DONE,FOR 26 LOGICAL SECTORS?
  2346.          CPI     01BH
  2347.          RET             ;GO FIND OUT AT THE RETURN 
  2348. ;
  2349. ;
  2350. ;
  2351. ;SUBROUTINE TO INITIALIZE FOR SECTOR 01
  2352. ;
  2353. SEC01:   MVI     A,001H  ;SET SECTOR NUMBER TO 01
  2354.          STA     LSN
  2355.          CALL    OSCTR   ;INITIALIZE TO LOGICAL SECTOR CONVERSION
  2356.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR,
  2357.                          ; TO CONTROLLER
  2358.          RET
  2359. ;
  2360. ;
  2361. ;
  2362. ;SUBROUTINE TO INCREMENT LOGICAL SECTOR NUMBER
  2363. ;
  2364. INCSN:   LDA     LSN     ;GO GET PRESENT SECTOR NUMBER
  2365.          INR     A       ;INCREMENT SECTOR NUMBER
  2366.          STA     LSN     ;STORE IT 
  2367.          CALL    OSCTR   ;GO DO LOGICAL SECTOR CONVERSION
  2368.          RET             ;FIND OUT AT RETURN 
  2369. ;
  2370. ;
  2371. ;
  2372. ;
  2373. ;LOGICAL TO PHYSICAL SECTOR NUMBER CONVERSION SUBROUTINE FOR 26 SECTORS
  2374. ;
  2375. OSCTR:   MOV     E,A     ;MOVE LOGICAL SECTOR NUMBER TO E REG.
  2376.          MVI     D,000H  ;CLEAR OUT D REG.
  2377.          LXI     H,LSTBL-1       ;POINT AT LOGICAL SECTOR TABLE
  2378.          DAD     D       ;ADD D&E REGS. TO LOGICAL SECTOR
  2379.          MOV     A,M     ;MOVE LOGICAL SECTOR TO A REG.
  2380.          STA     SECNO   ;STORE LOGICAL NUMBER IN "SECNO"
  2381.          RET
  2382. ;
  2383. ;
  2384. ;
  2385. ;LOGICAL SECTOR TABLE (SKIPS EVERY 5 SECTORS)
  2386. ;
  2387. LSTBL:   DB      001H
  2388.          DB      007H
  2389.          DB      00DH
  2390.          DB      013H
  2391.          DB      019H
  2392.          DB      005H
  2393.          DB      00BH
  2394.          DB      011H
  2395.          DB      017H
  2396.          DB      003H
  2397.          DB      009H
  2398.          DB      00FH
  2399.          DB      015H
  2400.          DB      002H
  2401.          DB      008H
  2402.          DB      00EH
  2403.          DB      014H
  2404.          DB      01AH
  2405.          DB      006H
  2406.          DB      00CH
  2407.          DB      012H
  2408.          DB      018H
  2409.          DB      004H
  2410.          DB      00AH
  2411.          DB      010H
  2412.          DB      016H
  2413. ;
  2414. ;
  2415. ;
  2416. ;SUBROUTINE TO DETERMINE IF DISKETTE IS DOUBLE SIDED,
  2417. ; AND IF SO,SELECT UPPER HEAD
  2418. ;
  2419. DSIDE:   IN      DATAI   ;GO GET STATUS FROM CONTROLLER
  2420.          ANI     040H    ;TEST MEDIA STATUS BIT
  2421.          JNZ     HEAD1   ;GO SELECT LOWER HEAD
  2422.          JMP     HEAD2   ;GO SELECT UPPER HEAD
  2423. ;
  2424. ;
  2425. ;
  2426. ;SUBROUTINE TO SEEK TO TRACK 00 (DO A RESTORE)
  2427. ;
  2428. RSTR:    XRA     A       ;ZERO OUT A REG.
  2429.          STA     TRKNO   ;SET TRACK NUMBER TO 00
  2430.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR TO CONTROLLER
  2431.          MVI     A,0DH   ;TRANSMIT SEEK TO TRACK 00,
  2432.                          ; TO CONTROLLER
  2433.          CALL    XMITW
  2434.          RET
  2435. ;
  2436. ;
  2437. ;
  2438. ;ROUTINE TO ALLOW C.E. ALIGNMENT OF THE FLEXIBLE DISK DRIVE
  2439. ; (NOTE: THIS ROUTINE WILL NOT ALLOW THE OPERATOR TO UTILIZE
  2440. ;  THIS ROUTINE,UNLESS THE DISKETTE IS EITHER WRITE PROTECTED
  2441. ;  OR THE OPERATOR HAS SELECTED WRITE PROTECTION FROM THE COMMAND MONITOR)
  2442. ;
  2443. ALIN:    LXI     H,MSG51         ;OUTPUT "ALIGNMENT," TO THE CONSOLE
  2444.          CALL    MSG
  2445.          XRA     A       ;SET HEAD SELECT TO THE LOWER SURFACE
  2446.          STA     HDSEL
  2447.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR TO CONTROLLER
  2448.          IN      DATAI   ;GO GET STATUS
  2449.          ANI     010H    ;IF IT'S NOT WRITE PROTECTED,
  2450.                          ; FIND OUT IF THE OPERATOR HAS
  2451.                          ; SELECTED WRITE PROTECTION FROM
  2452.                          ; THE COMMAND MONITOR 
  2453.          JZ      ALIN7
  2454. ALIN1:   LXI     H,MSG53         ;OUTPUT "AUTO?" TO CONSOLE
  2455.          CALL    MSG
  2456.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  2457.          CPI     'Y'
  2458.          JZ      ALIN4   ;GO DO AUTO,IF REQUESTED
  2459.          CPI     'N'
  2460.          JZ      ALIN2   ;GO DO SELECTED TRACKS,IF REQUESTED
  2461.          JMP     LER     ;OOPS WRONG KEY-BOARD INPUT
  2462. ALIN2:   CALL    RSTR    ;DO A SEEK TO TRACK 00,THE 
  2463.                          ; C.E. DISKETTE IS WRITE PROTECTED 
  2464.          CALL    CRLF    ;KEEP IT NEAT 
  2465.          CALL    SP1
  2466.          MVI     C,'S'   ;OUTPUT "SEEK TO TRACK=" TO CONSOLE
  2467.          CALL    CO
  2468.          LXI     H,MSG11
  2469.          CALL    MSG
  2470.          CALL    CONI    ;LET'S LOOK FOR A VALID HEX TRACK NUMBER
  2471.          STA     TRKNO   ;STUFF THE KEY-BOARD INPUT INTO TRACK STORAGE
  2472.          CPI     04DH    ;TRACK NUMBER TO LARGE?
  2473.          JNC     INER1   ;EXIT,IF SO 
  2474. ALIN3:   CALL    CLRER   ;GO CLEAR ERROR FLAGS
  2475.          CALL    KBINT   ;GO CHECK FOR A KEY-BOARD INTERRUPT
  2476.          IN      CCTRL   ;NEW TRACK SEEK REQUESTED?
  2477.          ANI     CRRDY
  2478.          JZ      OLDTK   ;GO DO OLD TRACK,IF NOT
  2479.          IN      CDATA
  2480.          ANI     07FH
  2481.          CPI     'S'     ;GOT A SEEK REQUEST?
  2482.          JZ      ALIN8   ;IF YES,LET'EM CHOOSE 
  2483. OLDTK:   CALL    XMTTK   ;TRANSMIT TRACK THE TRACK NUMBER,
  2484.                          ; TO THE CONTROLLER
  2485.          MVI     A,009H  ;TRANSMIT SEEK COMMAND,TO CONTROLLER
  2486.          CALL    XMITW
  2487.          JMP     ALIN3   ;STAY ON THE TRACK WITH THE HEAD(S)
  2488.                          ; LOADED NO MATTER WHAT HAPPENS 
  2489. ALIN4:   CALL    RSTR    ;DO A SEEK TO TRACK 00
  2490.          MVI     A,001H  ;SET-UP TRACK 01
  2491.          STA     TRKNO
  2492.          CALL    ALIN5   ;GO SEEK TO THE TRACK,AND STAY AWHILE 
  2493.          CALL    RSTR    ;DO A SEEK TO TRACK 00
  2494.          MVI     A,04CH  ;SET-UP TRACK 76
  2495.          STA     TRKNO
  2496.          CALL    ALIN5   ;NOW HANG-OUT AT TRACK 76 FOR AWHILE 
  2497.          JMP     ALIN4   ;NOW LET'S DO IT ALL OVER AGAIN 
  2498.                          ; IS'NT THIS FUN          
  2499. ALIN5:   MVI     A,007H  ;SET-UP THE TIMER ITERATIONS COUNT
  2500. ALIN6:   STA     TIMCT
  2501.          CALL    KBINT   ;GO CHECK FOR A KEY-BOARD INTERRUPT
  2502.          CALL    XMTUS   ;TRANSMIT LOAD UNIT/SECTOR,
  2503.                          ; TO CONTROLLER
  2504.          CALL    XMTTK   ;TRANSMIT TRACK NUMBER,
  2505.                          ; TO CONTROLLER
  2506.          MVI     A,009H  ;TRANSMIT SEEK TRACK COMMAND,
  2507.                          ; TO CONTROLLER
  2508.          CALL    XMITW
  2509.          CALL    CLRER   ;TRANSMIT CLEAR ERROR FLAGS,
  2510.                          ; TO CONTROLLER
  2511.          CALL    TIME3   ;GO KILL SOME TIME 
  2512.          LDA     TIMCT   ;GET THE TIMER ITERATIONS COUNTER
  2513.          DCR     A       ;DECREMENT IT 
  2514.          CPI     000H    ;DONE?
  2515.          RZ              ;RETURN,IF SO 
  2516.          JMP     ALIN6   ;NOPE STAY A LITTLE WHILE LONGER 
  2517. ALIN7:   CALL    WPRT    ;GO CHECK FOR OPERATOR REQUESTED
  2518.                          ; WRITE PROTECT
  2519.          JNZ     ALIN1   ;GO DO THE ALIGNMENT ROUTINE,IF SO 
  2520.          CALL    SP2
  2521.          LXI     H,MSG52         ;OUTPUT "NO WRITE PROTECT" TO CONSOLE
  2522.          CALL    MSG
  2523.          CALL    WPMSG
  2524.          JMP     MNTR    ;EXIT TO THE MONITOR,UNTIL THINGS
  2525.                          ; ARE SQUARED AWAY 
  2526. ALIN8:   CALL    TIME1   ;MAKE A DELAY
  2527.          JMP     ALIN2
  2528. ;
  2529. ;
  2530. ;
  2531. ;ROUTINE TO DELAY TIME (PAUSE) AS REQUIRED (DELAY CONSTANT IN H&L REGS.)
  2532. ;
  2533. DLY:     DCX     H
  2534.          MOV     A,L
  2535.          ORA     H
  2536.          JNZ     DLY
  2537.          RET
  2538. ;
  2539. ;
  2540. ;
  2541. XMTUS:   LDA     SECNO   ;TRANSMIT UNIT/SECTOR/HEAD SELECT TO CONTROLLER
  2542.          MOV     B,A
  2543.          LDA     UNIT
  2544.          ORA     B
  2545.          MOV     B,A
  2546.          LDA     HDSEL
  2547.          ORA     B
  2548.          OUT     DATAO
  2549.          MVI     A,21H
  2550.          CALL    XMIT
  2551.          CALL    UNCHK   ;CHECK UNIT CODE BITS FOR MATCH
  2552.                          ; TO SELECTED UNIT
  2553.          RET
  2554. ;
  2555. ;
  2556. ;
  2557. XMTTK:   LDA     TRKNO   ;TRANSMIT TRACK ADDRESS TO CONTROLLER
  2558.          OUT     DATAO
  2559.          MVI     A,11H
  2560.          JMP     XMIT
  2561. ;
  2562. ;
  2563. ;
  2564. XMTCF:   LDA     MTREN   ;TRANSMIT CONFIGURATION (DRIVE MOTOR
  2565.                          ; ENABLE/DENSITY/FORMAT MODE/DOOR LOCK),
  2566.                          ; TO CONTROLLER
  2567.          MOV     B,A
  2568.          LDA     DDSEL
  2569.          ORA     B
  2570.          MOV     B,A
  2571.          LDA     MODE
  2572.          ORA     B
  2573.          MOV     B,A
  2574.          LDA     LOCK
  2575.          ORA     B
  2576.          MOV     B,A
  2577.          LDA     XTEND
  2578.          ORA     B
  2579.          OUT     DATAO
  2580.          MVI     A,015H
  2581.          JMP     XMIT
  2582. ;
  2583. ;
  2584. ;
  2585. XMIT:    OUT     CNTRL
  2586.          XRA     A       ;OUTPUT A "DUMMY" EXAMINE STATUS TO
  2587.                          ; CONTROLLER TO CLEAR DATA OUT INTERFACE
  2588.          OUT     CNTRL
  2589.          CALL    DCHK    ;GO TEST DRIVE FAIL BIT
  2590.          RET
  2591.  
  2592. ;
  2593. ;
  2594. ;
  2595. XMITW:   CALL    XMIT
  2596.          IN      DATAI   ;GET THE CONTROLLER STATUS
  2597.          ANI     001H    ;IS BUSY TRUE?
  2598.          CZ      NORES   ;IF NO BUSY RESPONSE HAS OCCURED
  2599.                          ; DUE TO CURRENT COMMAND,NOTIFY
  2600.                          ; THE OPERATOR 
  2601.          LDA     TIME    ;GO GET TIMER CONTROL COMMAND
  2602.          ADI     000H
  2603.          JNZ     XMITT   ;IF TIMER COMMAND IS SET,GO DO
  2604.                          ; A 2.5 SECOND DELAY AND 
  2605.                          ; DON'T WAIT FOR BUSY STATUS TO
  2606.                          ; GO FALSE 
  2607.          MVI     B,003H  ;SET-UP TIMER CONSTANTS (5 SECONDS)
  2608.          LXI     H,0FFFFH
  2609. BUSYT:   DCX     H       ;START COUNTING DOWN
  2610.          MOV     A,L
  2611.          ORA     H
  2612.          JNZ     BUSY    ;TIMED OUT?
  2613.          DCR     B
  2614.          JNZ     BUSY
  2615.          LXI     H,MSG56         ;OH  OH  "RUN-AWAY" BUSY   
  2616.          CALL    MSG
  2617.          CALL    SCLR    ;DO A SYSTEM CLEAR
  2618.          JMP     MNTR    ;THIS CONTROLLER IS IN SO MUCH TROUBLE,
  2619.                          ; THAT WE MIGHT AS WELL GO BACK TO
  2620.                          ; THE COMMAND MONITOR 
  2621. BUSY:    IN      DATAI   ;TEST BUSY STATUS FROM CONTROLLER
  2622.          RAR
  2623.          JC      BUSYT
  2624.          RET
  2625. ;
  2626. ;
  2627. ;
  2628. NORES:   LXI     H,MSG55         ;OUTPUT "NO BUSY RESPONSE" TO CONSOLE
  2629.          CALL    MSG
  2630.          CALL    SCLR    ;DO A SYSTEM CLEAR
  2631.          JMP     MNTR    ;GIVE UP  IT'S NOT WORKING   
  2632. ;
  2633. ;
  2634. ;
  2635. XMITT:   CALL    TIME1   ;DELAY FOR 2.5 SECONDS.
  2636.          RET
  2637. ;
  2638. ;
  2639. ;
  2640. ;
  2641. ;
  2642. ;
  2643. ;DRIVE READY TEST
  2644. ;
  2645. DCHK:    IN      DATAI   ;GET STATUS FROM CONTROLLER
  2646.          ANI     020H    ;TEST DRIVE FAIL BIT
  2647.          RZ
  2648.          CALL    CRLF
  2649.          CALL    SP1
  2650.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  2651.          CALL    MSG
  2652.          CALL    AUNIT   ;FORM UNIT STORAGE INTO PROPER
  2653.                          ; POSITION FOR CONSOLE OUTPUT
  2654.          CALL    BYTEO
  2655.          CALL    SP1
  2656.          LXI     H,MSG34         ;OUTPUT "DRIVE FAIL" TO CONSOLE
  2657.          CALL    MSG
  2658.          RET
  2659. ;
  2660. ;
  2661. ;
  2662. ;SUBROUTINE TO CHECK UNIT CODE BITS FOR MATCH TO SELECTED UNIT
  2663. ;
  2664. UNCHK:   LDA     UNIT    ;GET THE UNIT NUMBER 
  2665.          RLC
  2666.          RLC
  2667.          RLC
  2668.          MOV     B,A     ;MATCH IT TO BIT POSITION FOR UNIT CODE BITS
  2669.          IN      DATAI   ;GET'EM 
  2670.          ANI     006H    ;MASK'EM 
  2671.          CMP     B       ;GOT A MATCH?
  2672.          RZ
  2673.          CALL    SP1     ;OOPS  NO MATCH   
  2674.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  2675.          CALL    MSG
  2676.          CALL    AUNIT
  2677.          CALL    BYTEO   ;SHOW'EM THE UNIT NUMBER 
  2678.          CALL    SP1     ;KEEP IT NEAT
  2679.          LXI     H,MSG10         ;OUTPUT "UNIT CODE FAIL" TO CONSOLE
  2680.          CALL    MSG
  2681.          RET
  2682. ;
  2683. ;
  2684. ;
  2685. ;WRITE PROTECT TEST SUBROUTINE
  2686. ;
  2687. WPCHK:   IN      DATAI   ;GET STATUS FROM CONTROLLER
  2688.          ANI     010H    ;TEST WRITE PROTECT BIT
  2689.          RZ
  2690.          CALL    SP1
  2691.          LXI     H,MSG31         ;OUTPUT "UNIT=" TO CONSOLE
  2692.          CALL    MSG
  2693.          CALL    AUNIT   ;FORM UNIT NUMBER FROM STORAGE,
  2694.                          ; INTO ACTUAL UNIT NUMBER
  2695.          CALL    BYTEO
  2696. WPMSG:   CALL    SP1
  2697.          LXI     H,MSG35         ;OUTPUT "WRITE PROTECT" TO CONSOLE
  2698.          CALL    MSG
  2699.          CALL    CRLF
  2700.          RET
  2701. ;
  2702. ;
  2703. ;
  2704. ;ROUTINE TO ALLOW THE OPERATOR TO SET "WRITE PROTECT"
  2705. ;
  2706. PROT:    LXI     H,MSG35         ;OUTPUT "WRITE PROTECT" TO CONSOLE
  2707.          CALL    MSG
  2708.          LXI     H,YNMSG         ;OUTPUT "(Y,N)" TO CONSOLE
  2709.          CALL    MSG
  2710.          MVI     C,'?'
  2711.          CALL    CO
  2712.          CALL    SP1
  2713.          CALL    CECHO   ;GO GET KEY-BOARD INPUT
  2714.          CPI     'Y'     ;YES?
  2715.          JZ      PROT1
  2716.          CPI     'N'     ;NO?
  2717.          JZ      PROT2
  2718.          JMP     LER     ;OOPS WRONG ENTRY 
  2719. PROT1:   MVI     A,001H  ;YES WRITE PROTECT THIS DISK 
  2720.          JMP     PROT3
  2721. PROT2:   XRA     A       ;WERE GOING TO WRITE ON IT 
  2722. PROT3:   STA     WPROT
  2723.          JMP     MNTR
  2724. ;
  2725. ;
  2726. ;
  2727. ;
  2728. ;SUBROUTINE TO TEST FOR OPERATOR REQUESTED WRITE PROTECT
  2729. ;
  2730. WPRT:    LDA     WPROT   ;GO GET STATE OF WRITE PROTECT COMMAND
  2731.          ANI     001H    ;GO FIND OUT AT THE RETURN 
  2732.          RET
  2733. ;
  2734. ;
  2735. ;
  2736. ;STORAGE FOR VARIABLES REQUIRED FOR FLEXIBLE DISKETTE DRIVE/CONTROLLER
  2737. ;
  2738. UNIT:    DS      1       ;STORAGE FOR DISKETTE DRIVE "UNIT" NUMBER
  2739. TRKNO:   DS      1       ;STORAGE FOR TRACK/CYLINDER ADDRESS
  2740. LSN:     DS      1       ;STORAGE FOR LOGICAL SECTOR NUMBER
  2741. SECNO:   DS      1       ;STORAGE FOR PHYSICAL SECTOR NUMBER
  2742. DDSEL:   DS      1       ;STORAGE FOR DENSITY SELECT STATE
  2743. DDSAV:   DS      1       ;STORAGE FOR DENSITY SELECT "SAVE" STATE
  2744. XTEND:   DS      1       ;STORAGE FOR EXTENDED FORMAT SELECT STATE
  2745. XTSAV:   DS      1       ;STORAGE FOR EXTENDED FORMAT SELECT "SAVE" STATE
  2746. DBUF:    DS      1       ;STORAGE FOR PATTERN SELECTED DATA BYTE
  2747. BLOOP:   DS      1       ;STORAGE FOR "LOOP" COMMAND
  2748. RDCRC:   DS      1       ;STORAGE FOR "READ CRC" COMMAND
  2749. TRIES:   DS      1       ;STORAGE FOR "ERROR RETRIES"
  2750. SAVE:    DS      1       ;STORAGE FOR "SAVED STATUS"
  2751. RETRY:   DS      1       ;STORAGE FOR "READ ERROR RETRY" COUNTER
  2752. SHDBE:   DS      1       ;STORAGE FOR "S/B" DATA FROM WRITE BUFFER
  2753. WAS:     DS      1       ;STORAGE FOR "WAS" DATA BYTE FROM READ BUFFER
  2754. DCTR:    DS      2       ;STORAGE FOR "BYTE IN ERROR" DATA COUNTER
  2755. ECTR:    DS      2       ;STORAGE FOR "ERROR" COUNTER
  2756. PCTR:    DS      2       ;STORAGE FOR "PASS" COUNTER
  2757. RCTR:    DS      2       ;STORAGE FOR "RANDOM SEEK ITERATIONS" COUNTER
  2758. RPNT:    DS      2       ;STORAGE FOR RANDOM NUMBER TABLE POINTER
  2759. MTREN:   DS      1       ;STORAGE FOR "DRIVE MOTOR ENABLE" COMMAND
  2760. MODE:    DS      1       ;STORAGE FOR "FORMAT" COMMAND
  2761. HDSEL:   DS      1       ;STORAGE FOR "HEAD SELECT" COMMAND
  2762. LOCK:    DS      1       ;STORAGE FOR "DOOR LOCK" COMMAND
  2763. DELET:   DS      1       ;STORAGE FOR "DELETED DATA MARK" COMMAND
  2764. NEWTK:   DS      1       ;STORAGE FOR TRACK NUMBER,IF "LOOP" COMMAND
  2765.                          ; IS ENABLED ON "SEEK TO TRACK" TEST
  2766. TIME:    DS      1       ;STORAGE FOR "TIMER CONTROL" COMMAND
  2767. TIMCT:   DS      1       ;STORAGE FOR TIMER ITERATIONS COUNT
  2768. WPROT:   DS      1       ;STORAGE FOR "WRITE PROTECT" COMMAND
  2769. VFYCM:   DS      1       ;STORAGE FOR "VERIFY" (READ CRC) COMMAND
  2770. ;
  2771. ;
  2772. ;
  2773. ;STORAGE FOR WRITE,READ,RANDOM TRACK,AND STACK BUFFERS
  2774. ;
  2775. RAM      EQU     $             ;EQUATE STORAGE AREA TO PROGRAM COUNTER
  2776. WBUF     EQU     RAM+256         ;STORAGE FOR 256 BYTE WRITE DATA BUFFER
  2777. RBUF     EQU     WBUF+256        ;STORAGE FOR 256 BYTE READ DATA BUFFER
  2778. RANTK    EQU     RBUF+256        ;STORAGE FOR 256 RANDOM TRACK TABLE
  2779. STACK    EQU     RANTK+512       ;STORAGE FOR 256 BYTE STACK POINTER
  2780. ;
  2781. ;
  2782. ;
  2783.          END
  2784.