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