home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / A / BIOS-R62.LZH / CXRAMDSK.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  6KB  |  262 lines

  1. ; equate has been added to set the proper drive name in this module
  2. ; (used to remove the drive from DRVTBL if the ramdisk is not present)
  3. ;-------------------------------------------------------------------------
  4. ; CHANGES by Randy Winchester, 6 May 89
  5. ;
  6. ; RAM disk is now drive M: again.
  7. ;
  8. ; Disk Label for the RAM disk has been changed back to ERTWINE VON from
  9. ;   RAMDISK RAM.  Not only do I believe in honoring programmers rather
  10. ;   than hardware, there was no need to fuss with it in the first place.
  11. ;   No need to tempt fate.
  12. ;-------------------------------------------------------------------------
  13. ;
  14.     title    'C128 Ram Disk support   6 May   89'
  15.  
  16.  
  17.     maclib    cpm3
  18.  
  19.     maclib    z80
  20.  
  21.     maclib    cxequ
  22.  
  23.     maclib    x6502
  24.  
  25.  
  26. ; Utility routines in standard BIOS
  27.     extrn    ?pmsg        ; print message @<HL> up to 00
  28.                 ; saves <BC> & <DE>
  29.     extrn    ?pdec        ; print binary number in <A> from 0 to 99.
  30.     extrn    ?pderr        ; print BIOS disk error header
  31.     extrn    ?conin,?cono    ; con in and out
  32.     extrn    ?const        ; get console status
  33.     extrn    @dtbl        ; DMA ram bank
  34.  
  35.     public    RMdsk
  36.  
  37.     extrn    ?fun65
  38.     extrn    ?dkmov
  39.  
  40. drive$name    equ    'M'
  41. ;
  42.     page
  43. ;
  44.     CSEG        ; place code in common memory
  45.  
  46. ;
  47. ; Extended Disk Parameter Headers (XPDHs)
  48. ;
  49.     dw    RM$write
  50.     dw    RM$read
  51.     dw    RM$login
  52.     dw    RM$init
  53.     db    0        ; relative drive zero
  54.     db    0        ; format type byte
  55. RMdsk:        ;    dph    0,dpb$RM$512
  56.     DW    0            ; TRANSLATE TABLE ADDRESS
  57.     DB    0,0,0,0,0,0,0,0,0    ; BDOS SCRATCH AREA
  58.          DB    0            ; MEDIA FLAG
  59. DPB$ptr:
  60.     DW    DPB$RM$512        ; DISK PARAMETER BLOCK
  61.     DW    00000h            ; CHECKSUM VECTOR ALLOCATED BY
  62.     DW    0FFFEh            ; ALLOC VECTOR ALLOCATED BY GENCPM
  63.     DW    0FFFEh            ; DIRBCB
  64.     DW    0FFFEh            ; DTABCB
  65.     DW    0FFFEh            ; HASH ALLOC'D
  66.     DB    0            ; HASH BANK
  67.  
  68.  
  69.                 ;
  70.                 ; DPB FOR RAM disk
  71.                 ;
  72.  
  73. dpb$RM$128:    ;    dpb    256,1,512,1024,64,0
  74.     DW    0002        ; 128 BYTE RECORDS PER TRACK
  75.     DB    03,07        ; BLOCK SHIFT AND MASK
  76.     DB    00        ; EXTENT MASK
  77.     DW    007Fh        ; MAXIMUM BLOCK NUMBER
  78.     DW    003Fh        ; MAXIMUM DIRECTORY ENTRY NUMBER
  79.     DB    0C0h,00h    ; ALLOC VECTOR FOR DIRECTORY
  80.     DW    8000h        ; CHECKSUM SIZE
  81.     DW    0        ; OFFSET FOR SYSTEM TRACKS
  82.     DB    1,1        ; PHYSICAL SECTOR SIZE SHIFT
  83.  
  84. dpb$RM$512:    ;    dpb    256,1,2048,2048,128,0
  85.     DW    0002        ; 128 BYTE RECORDS PER TRACK
  86.     DB    04,0Fh        ; BLOCK SHIFT AND MASK
  87.     DB    01        ; EXTENT MASK
  88.     DW    00FFh        ; MAXIMUM BLOCK NUMBER
  89.     DW    007Fh        ; MAXIMUM DIRECTORY ENTRY NUMBER
  90.     DB    0C0h,00h    ; ALLOC VECTOR FOR DIRECTORY
  91.     DW    8000h        ; CHECKSUM SIZE
  92.     DW    0        ; OFFSET FOR SYSTEM TRACKS
  93.     DB    1,1        ; PHYSICAL SECTOR SIZE SHIFT
  94.  
  95.     page
  96. ;
  97. ;
  98. ;
  99.     dseg
  100. RM$write:
  101.     mvi    d,VIC$RM$wr
  102.     lda    @dbnk        ; get disk bank
  103.     ana    a
  104.     lhld    @dma
  105.     jrz    RM$do$rd$wr
  106.     call    ?dkmov+3    ; A<>0 transfers data from local$DMA to buffer
  107.     mvi    d,VIC$RM$wr
  108.     jr    RM$do$rd$wr$buf
  109. ;
  110. ;
  111. ;
  112. RM$read:
  113.     mvi    d,VIC$RM$rd
  114.     lda    @dbnk        ; get disk bank
  115.     ana    a        ; is it bank zero
  116.     lhld    @dma
  117.     jrz    RM$do$rd$wr    ; yes, go read it
  118.  
  119.     call    RM$do$rd$wr$buf    ; no,  transfer through buffer
  120.     lhld    @dma
  121.     call    ?dkmov+3    ; A=0 transfers data from buffer to local$DMA
  122.     xra    a
  123.     ret
  124. ;
  125. ;
  126. ;
  127. RM$do$rd$wr$buf:
  128.     lxi    h,@buffer
  129. RM$do$rd$wr:
  130.     lxi    b,RM$128$low
  131.     outp    l
  132.     inr    c        ; RM$128$mid
  133.     outp    h
  134.     inr    c        ; RM$ext$low
  135.     xra    a
  136.     outp    a
  137.     lhld    @trk
  138.     inr    c        ; RM$ext$mid
  139.     outp    l
  140.     inr    c        ; RM$ext$hi
  141.     outp    h
  142.     lxi    h,256
  143.     inr    c        ; RM$count$low
  144.     outp    l
  145.     inr    c        ; RM$count$hi
  146.     outp    h
  147.     mov    a,d        ; get rd/wr command
  148.     call    ?fun65
  149.     xra    a        ; set no errors
  150.     ret
  151.  
  152.     page
  153. ;
  154. ;
  155. ;
  156.     dseg
  157. RM$init:
  158.     lxi    b,RM$control
  159.     xra    a
  160.     outp    a            ; increment both addresses
  161.     dcr    c            ; point to interrupt control register
  162.     outp    a            ; disable interrupts
  163.  
  164.     lxi    h,0            ; point to track 0
  165.     shld    @trk
  166.     xra    a
  167.     sta    @dbnk            ; set DMA bank to zero
  168.     lxi    h,@buffer        ; 
  169.     shld    @dma
  170.  
  171. test$device$present:
  172.     mov    m,l            ; place a pattern in the directory
  173.     inr    l            ; ..buffer area
  174.     jrnz    test$device$present    ; 
  175.  
  176.     call    RM$read            ; read track 0 to DMA buffer
  177.     lxi    h,@buffer        ; ..(buffer not changed if
  178.     lxi    d,dir$label        ; ..device is not present)
  179.     lxi    b,12            ; test if KEY has been installed
  180. test$next$key:
  181.     ldax    d
  182.     inx    d
  183.     cci
  184.     jrnz    no$match        ; KEY missing, test device present
  185.     jpe    test$next$key
  186.     jr    set$size        ; KEY is in RAM DISK, go set size
  187.  
  188.     page
  189. ;
  190. ;    test if device is present, remove vector if not
  191. ;
  192. no$match:
  193.     mvi    l,0            ; start back at the buffer beginning
  194. test$for$ram$dsk:
  195.     mov    a,m
  196.     cmp    l            ; buffer changed?
  197.     jrnz    device$is$present    ; yes, then device is present
  198.     inr    l            ; no, buffer end?
  199.     jrnz    test$for$ram$dsk    ; no, test rest of buffer
  200.                     ; yes, L=0
  201. ;
  202. ;    device is missing, remove vector
  203. ;
  204.     mov    h,l            ; remove vector to RAM disk
  205. ;**********************************************
  206.     shld    @dtbl+(drive$name-'A')*2    ; .. (drive D:)
  207. ;*****************************************************
  208.     ret
  209. ;
  210. ;    initialize directory buffer
  211. ;
  212. device$is$present:
  213.     call    init$buffer        ; fill buffer with E5`s
  214.     lxi    h,dir$label
  215.     lxi    d,@buffer
  216.     lxi    b,32
  217.     ldir                ; install directory label in 1st record
  218.     lxi    h,0
  219.     shld    @trk            ; set track=0
  220.  
  221. clear$dir:
  222.     call    RM$write        ; erase director sectors
  223.     call    init$buffer        ; fill buffer with E5`s
  224.     lda    @trk
  225.     inr    a
  226.     sta    @trk
  227.     cpi    16            ; 16 for 512K Ram disk
  228.     jrnz    clear$dir
  229.  
  230. set$size:
  231.     lxi    h,dpb$RM$128
  232.     lxi    b,RM$status
  233.     inp    a
  234.     ani    10h            ; mask of size bit (0=128K)
  235.     jrz    set$128K
  236.     lxi    h,dpb$RM$512
  237. set$128K:
  238.     shld    dpb$ptr    
  239. RM$login:
  240.     ret
  241.  
  242.     page
  243. ;
  244. ;
  245. ;
  246. init$buffer:
  247.     lxi    h,@buffer
  248.     mvi    m,0E5h
  249.     lxi    d,@buffer+1
  250.     lxi    b,256-1
  251.     ldir
  252.     ret
  253.  
  254. ;
  255. ;
  256. ;
  257. dir$label:    ;123456789012  3 4 5 6
  258.     db    ' ERTWINE VON',1,0,0,0
  259.     dw    0,0,0,0
  260.     dw    date$hex,0
  261.     dw    date$hex,0
  262.