home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / text / examples.arc / IDIR.A < prev    next >
Encoding:
Text File  |  1989-12-01  |  22.5 KB  |  601 lines

  1. ;idir.asm
  2. ;===================================================================
  3. ; Directory for IBM disk                     (C)1988 - Ampere Metal
  4. ;===================================================================
  5. ; idir d:
  6.  
  7. poker       =      $0016            
  8. serial      =      $0a1c            
  9. fstmod      =      $ff47            
  10. primm       =      $ff7d            
  11. readst      =      $ffb7            
  12. talk        =      $ffb4            
  13. listen      =      $ffb1            
  14. untlk       =      $ffab            
  15. unlsn       =      $ffae            
  16. tksa        =      $ff96            
  17. second      =      $ff93            
  18. ciout       =      $ffa8            
  19. acptr       =      $ffa5            
  20. chkin       =      $ffc6            
  21. chkout      =      $ffc9            
  22. clrchn      =      $ffcc            
  23. chrin       =      $ffcf            
  24. chrout      =      $ffd2            
  25.  
  26. int01       =      $1701            
  27. int03       =      $1703            
  28. int04       =      $1704            
  29. int0e       =      $170e            
  30.  
  31.             *      = $070b          
  32.  
  33. byps        *=*+2                   ;Bytes/Sector (redundant)
  34. clsz        *=*+1                   ;Cluster size in sectors (2)
  35. resvd       *=*+2                   ;Number of reserved sectors (1)
  36. cofat       *=*+1                   ;Number of copies of FAT (2)
  37. root        *=*+2                   ;Number of root directory entries ($40 or $70)
  38. tsec        *=*+2                   ;Total sectors on disk, including reserved ones (720)
  39. id          *=*+1                   ;Format ID ($FD=DS 9)
  40. fatsiz      *=*+2                   ;Number of sectors per FAT
  41. trksiz      *=*+2                   ;Number of sectors per track
  42. dsksiz      *=*+2                   ;Number of sides per disk
  43. res2        *=*+2                   ;Number of special reserved sectors
  44.  
  45. star        =      $0b00            
  46.             dw     star
  47.             *      = star           
  48.  
  49.  
  50. idir        ldx    #1               ;Check for d:
  51.             jsr    int04            
  52.             sta    drive            
  53.             bcs    id0              ;Not there use default
  54.             jsr    int03            ;Legal drive?
  55.             bcs    id0              ;No. use default
  56.             lda    drive            
  57.             jmp    id1              
  58.  
  59. id0         jsr    int01            
  60. id1         sta    letter           
  61.             jsr    query            ;Query disk format
  62.             bmi    ibm              ;MFM
  63. exit1       lda    #1               
  64.             jmp    int0e            
  65.  
  66. ibm         lda    spt              ;Make sure 9 sectors/track
  67.             cmp    #9
  68.             beq    ibm1
  69.             cmp    #10
  70.             bne    exit1            
  71. ibm1        lda    bps              ;Make sure 512 bytes/sector
  72.             cmp    #<512            
  73.             bne    exit1            
  74.             lda    bps+1            
  75.             cmp    #>512            
  76.             bne    exit1            
  77. ;           jsr    bpb              ;Get bios parameter block
  78.             jsr    primm            
  79.             db     13,"Directory of "
  80. letter      db     "a:\",13,13,0
  81.             lda    #0               ;Get dir. (0,0,6)
  82.             ldx    #0               
  83.             ldy    #6               
  84.             jsr    getsec           ;Get sector
  85.             jsr    dosec            ;List it
  86.             bcs    exit0            
  87.             lda    #0               ;Repeat for (0,0,7)
  88.             ldx    #0               
  89.             ldy    #7               
  90.             jsr    getsec           
  91.             jsr    dosec            
  92.             bcs    exit0            
  93.             lda    #0               ;Repeat for (0,0,8)
  94.             ldx    #0               
  95.             ldy    #8               
  96.             jsr    getsec           
  97.             jsr    dosec            
  98.             bcs    exit0            
  99.             lda    #0               ;Repeat for (0,0,9)
  100.             ldx    #0               
  101.             ldy    #9               
  102.             jsr    getsec           
  103.             jsr    dosec            
  104. exit0       ldy    #2               
  105. psum        lda    bytes,y          
  106.             sta    len,y            
  107.             dey                     
  108.             bne    psum             
  109.             lda    #13              
  110.             jsr    chrout           
  111.             jsr    h2a              
  112.             lda    #" "             
  113.             jsr    chrout           
  114.             jsr    primm            
  115.             db     "Bytes in ",0
  116.             ldx    files            
  117.             lda    files+1          
  118.             jsr    $8e32            
  119.             jsr    primm            
  120.             db     " Files",13,0
  121.             lda    #0               
  122.             jmp    int0e            
  123.  
  124. files       dw     0
  125. bytes       dw     0,0
  126.  
  127. ;--------------------------------
  128. ; Subroutine: List IBM directory
  129. ;--------------------------------
  130.  
  131. dosec       lda    #<$0400          ;Sector at $0400
  132.             sta    poker            
  133.             lda    #>$0400          
  134.             sta    poker+1          
  135.             lda    #16              ;16 entries per sector
  136.             sta    entry            
  137.             lda    #13              
  138.             jsr    chrout           
  139. dos0        ldy    #0               
  140.             lda    (poker),y        
  141.             bne    dos1             ;End of dir if null
  142.             sec                     
  143.             rts                     
  144.  
  145. dos1        cmp    #$e5             
  146.             bne    dos2             
  147.             jmp    dos6             
  148.  
  149. dos2        jsr    chrout           
  150.             iny                     
  151.             lda    (poker),y        
  152.             cpy    #8               
  153.             bne    dos2             
  154.             lda    #" "             
  155.             jsr    chrout           
  156. dos3        lda    (poker),y        
  157.             jsr    chrout           
  158.             iny                     
  159.             cpy    #11              
  160.             bne    dos3             
  161.             lda    #" "             
  162.             jsr    chrout           
  163.             ldx    #0               
  164.             lda    (poker,x)        
  165.             cmp    #"."             
  166.             bne    dos4             
  167. dos5        jsr    primm            
  168.             db     "<DIR>       ",0
  169.             jmp    dos9             
  170.  
  171. dos4        lda    (poker),y        
  172.             and    #$10             
  173.             bne    dos5             
  174.             ldy    #28              
  175.             clc                     
  176.             lda    (poker),y        
  177.             sta    len              
  178.             adc    bytes            
  179.             sta    bytes            
  180.             iny                     
  181.             lda    (poker),y        
  182.             sta    len+1            
  183.             adc    bytes+1          
  184.             sta    bytes+1          
  185.             iny                     
  186.             lda    (poker),y        
  187.             sta    len+2            
  188.             adc    bytes+2          
  189.             sta    bytes+2          
  190.             jsr    h2a              
  191.             lda    #" "             
  192.             jsr    chrout           
  193.             jsr    chrout           
  194.             inc    files            
  195.             bne    dos9             
  196.             inc    files+1          
  197. dos9        ldy    #24              
  198.             lda    (poker),y        
  199.             tax                     
  200.             iny                     
  201.             lda    (poker),y        
  202.             tay                     
  203.             jsr    $1715            
  204.             lda    #" "             
  205.             jsr    chrout           
  206.             ldy    #22              
  207.             lda    (poker),y        
  208.             tax                     
  209.             iny                     
  210.             lda    (poker),y        
  211.             tay                     
  212.             jsr    ptime            
  213.             lda    #13              
  214.             jsr    chrout           
  215. dos6        clc                     
  216.             lda    poker            
  217.             adc    #32              
  218.             sta    poker            
  219.             bcc    dos7             
  220.             inc    poker+1          
  221. dos7        dec    entry            
  222.             bne    dos8             
  223.             clc                     
  224.             rts                     
  225.  
  226. dos8        jmp    dos0             
  227.  
  228.  
  229. ;-------------------------------
  230. ;output a hex # in ascii decimal
  231. ;-------------------------------
  232.  
  233.  
  234. h2a         ldx    #0               ;initialize indexes
  235.             ldy    #0               
  236.             sty    $02              
  237. loop        lda    #"0"             ;initialize digit
  238.             sta    ascii,x          
  239. loop2       sec                     
  240.             lda    len              
  241.             sbc    table,y          
  242.             pha                     ;increment the digit?
  243.             lda    len+1            
  244.             sbc    table+1,y        
  245.             pha                     
  246.             lda    len+2            
  247.             sbc    table+2,y        
  248.             bcc    nxdigt           ;branch if 'no'
  249.             sta    len+2            
  250.             pla                     
  251.             sta    len+1            
  252.             pla                     ;adjust the hex value
  253.             sta    len              ;and increment the digit
  254.             lda    #$ff             
  255.             sta    $02              
  256.             inc    ascii,x          
  257.             bne    loop2            
  258.  
  259. nxdigt      pla                     
  260.             pla                     
  261.             iny                     ;prepare for next digit
  262.             iny                     
  263.             iny                     
  264.             iny                     
  265.             inx
  266.             bit    $02              
  267.             bmi    nadj             
  268.             lda    #" "             
  269.             sta    ascii-1,x        
  270. nadj        cpx    #8               
  271.             bcc    loop             
  272. npr         nop                     
  273.             ldy    #0               ;prepare to send number
  274. loop3       cpy    #2               
  275.             beq    pcom             
  276.             cpy    #5               
  277.             bne    nocom            
  278. pcom        lda    ascii-1,y        
  279.             cmp    #" "             
  280.             beq    ppcom            
  281.             lda    #","             
  282. ppcom       jsr    chrout           
  283. nocom       lda    ascii,y          
  284.             jsr    chrout           
  285.             iny                     
  286.             cpy    #8               
  287.             bcc    loop3            
  288.             rts                     ;done, return
  289.  
  290.  
  291. table       dw     38528, 152
  292.             dw     16960, 15
  293.             dw     34464, 1
  294.             dw     10000, 0
  295.             dw     1000, 0
  296.             dw     100, 0
  297.             dw     10, 0
  298.             dw     1, 0
  299.  
  300. ;----------------------------------------------------
  301. ; Subroutine: Query disk format. Returns table below
  302. ;----------------------------------------------------
  303. ; Call with drive letter in .a
  304. ; Returns dtype in .a
  305.  
  306. drive       db     0                ;Drive ('0','1',...)
  307. unit        db     0                ;Unit  (8,9,...)
  308. fstat       db     0                ;Save fast serial status
  309. dtype       db     0                ;Disk type. Bit 7=1 if MFM, Bit 6=1 if Fast serial
  310. trk         db     0                ;Current track
  311. bps         dw     0                ;Bytes per sector
  312. spt         db     0                ;Sectors per track
  313. sec0        db     0                ;First sector number
  314. secf        db     0                ;Last sector number
  315. seci        db     0                ;Hard sector interleave
  316. dummy       db     0                ;Don't know what this is
  317.  
  318. ss          dw     0,256,512,1024
  319. u08a0       db     0,$8a,"0u"
  320.  
  321. query       stx    qsx+1            ;Preserve .x and .y
  322.             sty    qsy+1            
  323.             jsr    int03            ;Get unit, drive
  324.             bcc    q0               ;Drive letter was OK.
  325.             rts                     ;Else return SEC=error
  326.  
  327. q0          sta    drive            ;Save drive
  328.             stx    unit             ;And device
  329.             lda    serial           ;Save fast serial flag
  330.             and    #%01000000       
  331.             sta    dtype            
  332.             lda    unit             ;Send 'query disk format' command
  333.             jsr    listen           
  334.             lda    #$6f             
  335.             jsr    second           
  336.             ldy    #3               
  337. q1          lda    u08a0,y          
  338.             jsr    ciout            
  339.             dey                     
  340.             bpl    q1               
  341.             jsr    unlsn            
  342.             sei                     
  343.             bit    serial           
  344.             bvs    q2               
  345. qx          jsr    clrchn           ;Done if not fast serial
  346.             cli                     
  347.             clc                     
  348. qsx         ldx    #0               
  349. qsy         ldy    #0               
  350.             lda    dtype            
  351.             rts                     
  352.  
  353. q2          lda    $dd00            ;ATN low
  354.             and    #$ef             
  355.             sta    $dd00            
  356.             clc                     ;Fast serial for input
  357.             jsr    fstmod           
  358.             bit    $dc0d            ;Clear flags
  359.             lda    $dd00            ;Toggle clock
  360.             eor    #$10             
  361.             sta    $dd00            
  362.             jsr    getbyt           ;Get status
  363.             sta    fstat            ;Save it
  364.             bpl    qx               ;Done if GCR disk
  365.             pha                     
  366.             lda    dtype            
  367.             ora    #$80             
  368.             sta    dtype            
  369.             pla                     
  370.             and    #%00110000       ;Else calculate bytes/sector
  371.             lsr    a                
  372.             lsr    a                
  373.             lsr    a                
  374.             tay                     
  375.             lda    ss,y             
  376.             sta    bps              
  377.             lda    ss+1,y           
  378.             sta    bps+1            
  379.             lda    fstat            
  380.             and    #$0f             
  381.             sta    fstat            
  382.             jsr    getbyt           ;Don't know what this is
  383.             sta    dummy            
  384.             jsr    getbyt           
  385.             sta    spt              
  386.             jsr    getbyt           
  387.             sta    trk              
  388.             jsr    getbyt           
  389.             sta    sec0             
  390.             jsr    getbyt           
  391.             sta    secf             
  392.             jsr    getbyt           
  393.             sta    seci             
  394.             jmp    qx               
  395.  
  396. getbyt      lda    #8               
  397. gb0         bit    $dc0d            
  398.             beq    gb0              
  399. gb1         lda    $dd00            
  400.             eor    #$10             
  401.             sta    $dd00            
  402.             lda    $dc0c            
  403.             rts                     
  404.  
  405. ;-------------------------------------------------------
  406. ; Subroutine: Read MFM (side,track,sector)  (.a, .x, .y)
  407. ;-------------------------------------------------------
  408.  
  409. u064        db     0,1,0,0,64,"0u"
  410.  
  411. getsec      asl    a                ;Convert side (0,1) to (0 or 64)
  412.             asl    a                
  413.             asl    a                
  414.             asl    a                
  415.             asl    a                
  416.             asl    a                
  417.             sta    u064+4           
  418.             stx    u064+3           ;Track
  419.             stx    u064             ;Next track
  420.             sty    u064+2           ;Sector
  421.             lda    unit             
  422.             jsr    listen           
  423.             lda    #$6f             
  424.             jsr    second           
  425.             ldy    #6               
  426. gs0         lda    u064,y           ;Send READ command
  427.             jsr    ciout            
  428.             dey                     
  429.             bpl    gs0              
  430.             jsr    unlsn            
  431.             sei                     
  432.             bit    $dc0d            
  433.             jsr    gb1              ;Dummy read to toggle clock
  434.             jsr    getbyt           ;Get status
  435.             and    #15              ;Mask out all except controller status
  436.             cmp    #2               ;2 or higher is an error
  437.             bcs    gsx              ;Error. Don't do anything
  438.             ldy    #0               
  439. gs2         jsr    getbyt           ;Read loop
  440.             sta    $0400,y          
  441.             iny                     
  442.             bne    gs2              
  443. gs3         jsr    getbyt           
  444.             sta    $0500,y          
  445.             iny                     
  446.             bne    gs3              
  447.             clc                     
  448. gsx         cli                     
  449.             rts                     
  450.  
  451. ;------------------------------------------------------------------
  452. ; Subroutine: Fetch Bios parameter block and set variables from it
  453. ;------------------------------------------------------------------
  454.  
  455. dirsec      db     0                ;First logical sector for the directory
  456. drsize      db     0                ;Number of directory sectors
  457. dtasec      db     0                ;First data sector
  458. secpt       db     0                ;Sectors/Track (both sides)
  459.  
  460. bpb         lda    #0               ;Fetch (side 0, track 0, sector 1)
  461.             ldx    #0               
  462.             ldy    #1               
  463.             jsr    getsec           
  464.             bcc    bpb0             ;OK, continue
  465.             rts                     
  466.  
  467. bpb0        ldy    #30              ;Copy Bios parameter block to a safe place
  468. bpb1        lda    $0400,y          
  469.             sta    $1b40,y          
  470.             dey                     
  471.             bne    bpb1             
  472.             lda    root             ;Number of dir entries
  473.             lsr    a                ;/16=number of dir sectors
  474.             lsr    a                
  475.             lsr    a                
  476.             lsr    a                
  477.             sta    drsize           
  478.             lda    resvd            ;1st dir=resvd+cofat*fatziz+1
  479.             sta    dirsec           
  480.             inc    dirsec           
  481.             ldx    cofat            
  482. bpb2        clc                     
  483.             lda    dirsec           
  484.             adc    fatsiz           
  485.             sta    dirsec           
  486.             dex                     
  487.             bne    bpb2             
  488.             clc                     ;1st data sector=1st dir+dirsize
  489.             adc    drsize           
  490.             sta    dtasec           
  491.             lda    trksiz           ;Sector/Track=sectors/track*number of sides
  492.             sta    secpt            
  493.             lda    dsksiz           
  494.             cmp    #1               
  495.             beq    bpb3             
  496.             asl    secpt            
  497. bpb3        clc                     
  498.             rts                     
  499.  
  500. ;-----------------------------------------------------
  501. ; Subroutine: Convert logical sector into bios sector
  502. ;-----------------------------------------------------
  503.  
  504. t           db     0
  505. s           db     0
  506. z           db     0
  507. l           dw     0
  508.  
  509. csec        stx    l                ;Save logical sector
  510.             sty    l+1              
  511.             lda    #0               ;t=0
  512.             sta    t                ;t=logical sector/secpt
  513.             sta    s                ;s=side=0
  514.             tya                     
  515.             ldy    #8               
  516.             sec                     
  517.             sbc    secpt            
  518. csec0       php                     
  519.             rol    t                
  520.             asl    l                
  521.             rol    a                
  522.             plp                     
  523.             bcc    csec1            
  524.             sbc    secpt            
  525.             jmp    csec2            
  526.  
  527. csec1       adc    secpt            
  528. csec2       dey                     
  529.             bne    csec0            
  530.             bcs    csec3            
  531.             adc    secpt            
  532.             clc                     
  533. csec3       rol    t                
  534.             cmp    trksiz           ;Remainder > sectors/track?
  535.             bcc    csec4            ;on side 1
  536.             beq    csec4            
  537.             inc    s                
  538.             sec                     
  539.             sbc    trksiz           
  540. csec4       sta    z                
  541.             lda    s                
  542.             ldx    t                
  543.             ldy    z                
  544.             rts                     
  545.  
  546.  
  547.  
  548. ascii       db     0,0,0,0,0,0,0,0
  549. len         db     0,0,0
  550. entry       db     0
  551.  
  552. ;------------------------
  553. ; Subroutine: Print time
  554. ;------------------------
  555.  
  556. time        dw     0
  557.  
  558. ptime       stx    time             
  559.             sty    time+1           
  560.             tya                     
  561.             lsr    a                
  562.             lsr    a                
  563.             lsr    a                
  564.             cmp    #12              
  565.             php                     
  566.             sec                     
  567.             sbc    #12              
  568.             tax                     
  569.             cmp    #10              
  570.             bcs    nsp              
  571.             lda    #" "             
  572.             jsr    chrout           
  573. nsp         lda    #0               
  574.             jsr    $8e32            
  575.             lda    #":"             
  576.             jsr    chrout           
  577.             asl    time             
  578.             lda    time+1           
  579.             rol    a                
  580.             asl    time             
  581.             rol    a                
  582.             asl    time             
  583.             rol    a                
  584.             and    #%00111111       
  585.             tax                     
  586.             cmp    #10              
  587.             bcs    nnsp             
  588.             lda    #"0"             
  589.             jsr    chrout           
  590. nnsp        lda    #0               
  591.             jsr    $8e32            
  592.             lda    #"p"             
  593.             plp                     
  594.             bcc    pp               
  595.             lda    #"a"             
  596. pp          jsr    chrout           
  597.             lda    #" "             
  598.             jmp    chrout           
  599.  
  600.             .end                    
  601.