home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol136 / bbscan.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.9 KB  |  324 lines

  1. ;    BIGBOARD SCAN PROGRAM    VER. 2    19/11/82
  2. ;
  3.     BDOS    EQU 0005H
  4.     STREG    EQU 010H    ;STATUS REG.
  5.     TREG    EQU 011H    ;TRACK REG.
  6.     SEREG    EQU 012H    ;SECTOR REG.
  7.     IOPTR    EQU 0FF71H    ;LABEL 'IOPTR' IN PFM
  8.     SECVAL    EQU 0FF6EH    ;LABEL 'SECTOR' IN PFM
  9.     RTYCT    EQU 0FF70H    ;LABEL 'RETRY' IN PFM
  10.     CMDTYP    EQU 0FF6FH    ;LABEL 'CMDTYP' IN PFM
  11.     RW1    EQU 0F73CH    ;LABEL 'RW1' IN PFM
  12.     SELECT    EQU 0F6B1H    ;LABEL 'SELECT' IN PFM
  13.     BIOS    EQU 0E800H    ;START OF BIOS
  14.     HOME    EQU BIOS+24    ;HOME VECTOR
  15.     SETTRK    EQU BIOS+30    ;SET TRACK VECTOR
  16. ;
  17. ;
  18.     ORG    100H
  19. SAVCUR:    MVI    C,25        ;GET LOGGED DISK #
  20.     CALL    BDOS
  21.     STA    LDSK        ;SAVE IT
  22. ;
  23. DRSEL:    LDA    05DH
  24.     CPI    ' '        ;CHECK FOR EXPLICIT DRIVE REQ.
  25.     JNZ    SEL1        ;YES, GO SEE IF VALID
  26.     XRA    A
  27.     STA    DRV        ;SET UP TO USE CURRENT DRIVE
  28.     JMP    START
  29. ;
  30. SEL1:    ANI    05FH        ;CONVERT TO UPPER CASE
  31.     CPI    'A'
  32.     JC    SELERR
  33.     CPI    'D'+1
  34.     JNC    SELERR
  35.     SUI    'A'-1        ;CONVERT TO BINARY
  36.     STA    DRV        ;SAVE DRIVE CODE
  37. ;
  38. START:    MVI    C,9
  39.     LXI    D,MSG1        ;PRINT MOUNT MSG
  40.     CALL    BDOS
  41.     MVI    C,1
  42.     CALL    BDOS        ;WAIT FOR RESPONSE
  43.     ANI    'G'        ;CONV. TO UPPER CASE
  44.     CPI    'G'
  45.     JNZ    EXIT
  46. ;
  47.     LDA    DRV        ;GET DRIVE CODE
  48.     ORA    A
  49.     JZ    STEP1        ;USE CURRENT DRIVE
  50.     DCR    A        ;CONVT TO TRUE CODE
  51.     MOV    C,A
  52.     CALL    SELECT        ;GO SELECT DRIVE
  53.     ORA    A        ;SET FLAGS
  54.     JZ    STEP1        ;JUMP IF SELECT OK
  55.     LXI    D,NRDY
  56.     MVI    C,9
  57.     CALL    BDOS        ;PRINT NOT READY MSG
  58. RESP:    MVI    C,1
  59.     CALL    BDOS        ;GET RESPONSE
  60.     JMP    SEL1
  61. ;
  62. SELERR:    LXI    D,SELMSG
  63.     MVI    C,9
  64.     CALL    BDOS        ;PRINT INV SELECTION MSG
  65.     JMP    RESP        ;GO ASK FOR DRIVE CODE
  66. ;
  67. STEP1:    MVI    C,2        ;PREPARE TO READ DIRECTORY
  68.     CALL    SETTRK        ;SEEK TO TRACK 2
  69.     LXI    H,VTOC        ;INIT BUFFER ADDRESS
  70.     SHLD    BUFAD
  71.     MVI    A,1        ;INIT SECTOR VALUE
  72.     STA    SECT
  73. LOOP1:    LHLD    BUFAD
  74.     MOV    B,H
  75.     MOV    C,L
  76.     CALL    SETDMA
  77.     LDA    SECT
  78.     MOV    C,A
  79.     CALL    SETSEC
  80.     MVI    A,10        ;SET RETRY COUNT TO 10
  81.     CALL    READ
  82.     LHLD    BUFAD
  83.     LXI    D,80H
  84.     DAD    D
  85.     SHLD    BUFAD
  86.     LDA    SECT
  87.     CPI    14
  88.     JZ    STEP2
  89.     ADI    6
  90.     CPI    31
  91.     JNZ    TEST2
  92.     MVI    A,5
  93. TEST2:    CPI    29
  94.     JNZ    TEST3
  95.     MVI    A,3
  96. TEST3:    CPI    27
  97.     JNZ    STSEC
  98.     MVI    A,2
  99. STSEC:    STA    SECT
  100.     JMP    LOOP1
  101. BUFAD:    DS    2
  102. MSG1:    DB 0DH,0AH,'MOUNT DESIRED DISK AND TYPE ''G''',0DH,0AH,'$'
  103. STEP2:    CALL HOME
  104.     MVI A,0        ;INITIALIZE TRACK COUNTER
  105.     STA TRK
  106.     MVI A,1        ; INITIALIZE SECTOR COUNTER
  107.     STA SECT
  108. LOOP2:    LDA TRK        ; GET TRACK NO.
  109.     CPI 77        ; LAST TRACK?
  110.     JZ FIN
  111.     MOV C,A        ; TRACK NO. TO C
  112.     CALL SETTRK    ; GO SEEK
  113. LOOP3:    LDA SECT    ; GET SECTOR NO.
  114.     CPI 27        ; LAST SECTOR?
  115.     JZ NXTRK    ; IF YES, INCR. TRK
  116.     MOV C,A
  117.     CALL SETSEC    ; SET SECTOR
  118.     MVI C,80H
  119.     MVI B,0
  120.     CALL SETDMA    ; SET DMA ADDR.
  121.     MVI    A,1    ;DISABLE RETRIES BY PFM
  122.     CALL READ    ; GO READ SECTOR
  123.     CNZ ERR        ; PROCESS STATUS IF NON-ZERO
  124.     LXI H,SECT
  125.     INR M        ; INCR. SECTOR COUNT
  126.     JMP LOOP3
  127. NXTRK:    LXI H,TRK
  128.     INR M        ; INCR. TRACK COUNT
  129.     MVI A,1
  130.     STA SECT    ; RESET SECTOR COUNT
  131.     JMP LOOP2
  132. FIN:    LXI D,COMP    ; PRINT ENDING MSG
  133.     MVI C,9
  134.     CALL BDOS
  135.     JMP START    ; REQUEST ANOTHER DISKETTE
  136.             ;
  137.             ;
  138. TRK:    DB 0
  139. SECT:    DB 1
  140.             ;
  141. ERR:    CALL CONVT    ; CONVERT TO ASCII
  142.     SHLD STATUS
  143.     IN TREG        ; READ 1771 TRACK REG
  144.     CALL CONVT
  145.     SHLD TRACK
  146.     IN SEREG    ; READ 1771 SECTOR REG
  147.     CALL CONVT
  148.     SHLD SECTOR
  149.     IN TREG
  150.     SUI 2
  151.     JM PRTCPM    ;ERROR IS IN CPM AREA
  152.     MOV B,A
  153.     RLC        ;MULTIPLY
  154.     ANI 0FEH    ;TRACK
  155.     ADD B        ;BY 3
  156.     MOV C,A        ;SAVE IN C
  157.     MOV A,B
  158.     RRC        ;DIVIDE
  159.     RRC        ;TRACK BY 4
  160.     MOV B,A        ;SAVE IN B
  161.     ANI 3FH        ;CLEAR EXCESS BITS
  162.     ADD C        ;A=INT(TRACK*3.25)
  163.     STA BLK1    ;SAVE IT
  164.     MOV A,B
  165.     ANI 0C0H        ;A=FRAC(TRACK*3.25)
  166.     STA BLK2    ;SAVE IT
  167.     LXI H,STABL    ;SET UP SECTOR TABLE ADDRESS
  168.     LXI B,20H    ;B-C SET TO 1/8 OF A BLOCK
  169.     IN SEREG    ;CURRENT SECTOR IN A
  170. TEST5:    CMP M        ;DOES CURRENT SECT.= SECTOR IN TABLE?
  171.     JZ SCH        ;IF SO, GO FIND FILENAME
  172.     INX H        ;INCR. POINTER TO SECTOR TABLE
  173.     XCHG        ;SAVE IN D-E
  174.     LHLD BLK2    ;BLOCK NO. TO H-L
  175.     DAD B        ;INCR. BY 1/8
  176.     SHLD BLK2    ;SAVE RESULT
  177.     XCHG        ;RESTORE H-L FROM D-E
  178.     JMP TEST5    ;GO COMPARE NEXT TABLE ENTRY
  179. STABL:    DB 1,7,13,19
  180.     DB 25,5,11,17
  181.     DB 23,3,9,15
  182.     DB 21,2,8,14
  183.     DB 20,26,6,12
  184.     DB 18,24,4,10
  185.     DB 16,22
  186. BLK2:    DS 1
  187. BLK1:    DS 1
  188. SCH:    LDA BLK1
  189.     CPI 0
  190.     JZ PRTDIR
  191.     CPI 1
  192.     JZ PRTDIR
  193.     LXI H,VTOC
  194.     LXI D,20H
  195.     MVI A,0E5H
  196.     MVI B,64
  197. LOOP4:    SHLD ASAVE
  198.     CMP M
  199.     JNZ MATCH
  200.     DAD D
  201. COUNT:    DCR B
  202.     JNZ LOOP4
  203.     LXI H,MSG4
  204.     SHLD MSG3
  205.     JMP ERENT
  206. MATCH:    LXI D,10H
  207.     DAD D
  208.     LDA BLK1
  209. TEST7:    CMP M
  210.     JZ FOUND
  211.     INX H
  212.     DCR E
  213.     JNZ TEST7
  214.     MVI A,0E5H
  215.     LXI D,20H
  216.     JMP COUNT
  217. FOUND:    LHLD ASAVE
  218.     INX H
  219.     LXI D,MSG5
  220.     MVI B,8
  221.     CALL LOOP5
  222.     INX D
  223.     MVI B,3
  224.     CALL LOOP5
  225.     LXI H,MSG5
  226.     SHLD MSG3
  227.     JMP ERENT
  228. LOOP5:    MOV A,M
  229.     STAX D
  230.     DCR B
  231.     INX H
  232.     INX D
  233.     JNZ LOOP5
  234.     RET
  235. PRTCPM:    LXI H,MSG6
  236.     SHLD MSG3
  237.     JMP ERENT
  238. PRTDIR:    LXI H,MSG7
  239.     SHLD MSG3
  240. ERENT:    XRA A
  241. RETRY:    STA ERRCT    ; INIT RETRY COUNT
  242.     MVI A,1        ;DISABLE RETRY BY PFM
  243.     CALL READ    ; RE-READ SECTOR
  244.     JZ TMP        ; IF OK IT'S TEMPORARY
  245.     LDA ERRCT    ; GET RETRY COUNT
  246.     INR A
  247.     CPI 9        ; LIMIT REACHED ?
  248.     JNZ RETRY    ; TRY AGAIN IF NOT
  249.     LXI D,PERM    ; PRINT PERM. ERROR
  250.     MVI C,9
  251.     CALL BDOS
  252.     JMP PRINT    ; GO PRINT STATUS INFO
  253. TMP:    LXI D,TEMP    ; PRINT TEMP. ERROR
  254.     MVI C,9
  255.     CALL BDOS
  256. PRINT:    LXI D,MSG2
  257.     MVI C,9
  258.     CALL BDOS    ; GO PRINT MSG
  259.     LHLD MSG3
  260.     XCHG
  261.     MVI C,9
  262.     CALL BDOS
  263.     RET
  264. CONVT:    MOV C,A
  265.     CALL CONV1
  266.     MOV H,A
  267.     MOV A,C
  268.     RAR
  269.     RAR
  270.     RAR
  271.     RAR
  272.     CALL CONV1
  273.     MOV L,A
  274.     RET
  275. CONV1:    ANI 0FH        ; STRIP OFF HIGH 4 BITS
  276.     ORI 30H        ; ADD ASCII PREFIX
  277.     CPI 3AH        ; IS IT 0-9 ?
  278.     RM        ; FINISHED IF YES
  279.     ADI 7        ; MODIFY PREFIX FOR A-F
  280.     RET
  281. ERRCT    DB 0
  282. ASAVE:    DS 2
  283. MSG3:    DS 2
  284. PTR:    DS 2
  285. OFFS1:    DS 2
  286. OFFS2:    DS 2
  287. ;
  288. SETSEC:    MOV    A,C
  289.     STA    SECVAL        ;SET UP PFM'S SECTOR VALUE
  290.     RET
  291. SETDMA:    MOV    L,C
  292.     MOV    H,B        ;DMA ADDRESS TO H-L
  293.     SHLD    IOPTR        ;SET UP PFM'S BUFFER POINTER
  294.     RET
  295. READ:    STA    RTYCT        ;SET UP RETRY COUNT FOR PFM
  296.     MVI    A,88H        ;READ COMMAND
  297.     STA    CMDTYP        ;PASS IT TO PFM
  298.     JMP    RW1        ;GO TO PFM TO READ & RETURN
  299. ;
  300. EXIT:    LDA    LDSK        ;RESTORE LOGGED DISK
  301.     MOV    C,A
  302.     JMP    SELECT        ;SELECT IT & GO TO CP/M
  303. ;
  304. LDSK:    DS 1
  305. ;
  306. DRV:    DS 1        ;DRIVE SELECT CODE
  307. NRDY:    DB 0DH,0AH,'DRIVE NOT READY '
  308.     DB 0DH,0AH,'MAKE IT READY OR SELECT ANOTHER, '
  309.     DB 0DH,0AH,'THEN REPLY WITH DRIVE NUMBER : $'
  310. SELMSG:    DB 0DH,0AH,'INVALID DRIVE NUMBER. RE-ENTER (A-D) : $'
  311. TEMP:    DB 0DH,0AH,'TEMP $'
  312. PERM:    DB 0DH,0AH,'PERM $'
  313. MSG2:    DB 'ERROR AT TRACK '
  314. TRACK:    DB 0,0,', SECTOR '
  315. SECTOR:    DB 0,0,'. STATUS = '
  316. STATUS:    DB 0,0,'     $'
  317. MSG4:    DB 'UNALLOCATED $'
  318. MSG5:    DB '            $'
  319. MSG6:    DB 'CP/M REGION $'
  320. MSG7:    DB 'DIRECTORY   $'
  321. COMP:    DB 0DH,0AH,'SCAN COMPLETE$'
  322. VTOC:    DS    2048    ;DIRECTORY BUFFER AREA
  323.     END    100H
  324.