home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv005.ark / 3712DIAG.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  72.3 KB  |  2,306 lines

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