]> cloudbase.mooo.com Git - avrcpm.git/blob - cpm/AVRCPM.LIB
* cpm/utils/TIMER.MAC
[avrcpm.git] / cpm / AVRCPM.LIB
1 ; Macro Definitions for CP/M 2.2 BIOS Data Structures.
2 ;
3 ; dtbl <dph0,dph1,...> - drive table
4 ;
5 ; dpb label - disk parameter block
6 ; sectors_per_track,
7 ; block_size,
8 ; disk_size,
9 ; number_dir_entries,
10 ; checked_dir_entries,
11 ; track_offset,
12 ;
13 ; dph disk_parameter_block - disk parameter header
14 ;
15 ; endef - generate the ram data areas
16 ;
17 ;
18 ; These macros do not support sector skew,
19 ; and assume that the first sector is allways 0.
20 ;
21 ;
22 ; Example, where only drive A: and E: are defined, both with
23 ; the avrcpm disk definition (standard ss/sd floppy but without skew):
24 ;
25 ; dphtab: dtbl <dpha, 0, 0, 0, dphe>
26 ; dpb dpb243, 26, 1024, 243, 64, 64, 2
27 ; dpha: dph dpb243
28 ; dphe: dph dpb243
29 ; endef
30 ;
31
32 ; Drive Table. Contains 16 one word entries.
33
34 dtbl macro ?list
35 local ?n,?i
36 ?n set 0
37 irp ?drv,<?list>
38 ifnb <?drv>
39 dw ?drv
40 else
41 dw 0
42 endif
43 ?n set ?n+1
44 endm
45
46 if ?n gt 16
47 .' Too many drives. Max 16 allowed'
48 exitm
49 endif
50
51 if ?n lt 16
52 rept (16-?n)
53 dw 0
54 endm
55 endif
56 ?dn set 0
57 endm
58
59 ddb macro data,messag
60 ;; define a db statement
61 db data messag
62 endm
63 ddw macro data,messag
64 ;; define a dw statement
65 dw data messag
66 endm
67
68 dpb macro pbn,nsec,bls,dks,dir,cks,ofs
69 ;; generate the set statements for later tables
70 als&pbn set (dks)/8 ;;size of allocation vector
71 if ((dks) mod 8) ne 0
72 als&pbn set als&pbn+1
73 endif
74 css&pbn set (cks+3)/4 ;;number of checksum elements
75 ;; generate the block shift value
76 blkval set bls/128 ;;number of sectors/block
77 blkshf set 0 ;;counts right 0's in blkval
78 blkmsk set 0 ;;fills with 1's from right
79 rept 16 ;;once for each bit position
80 if blkval eq 1
81 exitm
82 endif
83 ;; otherwise, high order 1 not found yet
84 blkshf set blkshf+1
85 blkmsk set (blkmsk shl 1) or 1
86 blkval set blkval/2
87 endm
88 ;; generate the extent mask byte
89 blkval set bls/1024 ;;number of kilobytes/block
90 extmsk set 0 ;;fill from right with 1's
91 rept 16
92 if blkval eq 1
93 exitm
94 endif
95 ;; otherwise more to shift
96 extmsk set (extmsk shl 1) or 1
97 blkval set blkval/2
98 endm
99 ;; may be double byte allocation
100 if (dks) gt 256
101 extmsk set (extmsk shr 1)
102 endif
103 ;; now generate directory reservation bit vector
104 dirrem set dir ;;# remaining to process
105 dirbks set bls/32 ;;number of entries per block
106 dirblk set 0 ;;fill with 1's on each loop
107 rept 16
108 if dirrem eq 0
109 exitm
110 endif
111 ;; not complete, iterate once again
112 ;; shift right and add 1 high order bit
113 dirblk set (dirblk shr 1) or 8000h
114 if dirrem gt dirbks
115 dirrem set dirrem-dirbks
116 else
117 dirrem set 0
118 endif
119 endm
120 pbn: ddw %nsec,<;sec per track>
121 ddb %blkshf,<;block shift>
122 ddb %blkmsk,<;block mask>
123 ddb %extmsk,<;extnt mask>
124 ddw %(dks)-1,<;disk size-1>
125 ddw %(dir)-1,<;directory max>
126 ddb %dirblk shr 8,<;alloc0>
127 ddb %dirblk and 0ffh,<;alloc1>
128 ddw %(cks+3)/4,<;check size>
129 ddw %ofs,<;offset>
130 endm
131
132
133 lset macro lb,dn,val
134 lb&dn set val
135 endm
136 ldw macro lb,dn
137 dw lb&dn
138 endm
139
140 dph macro pbn
141 dw 0000h,0000h ;no translate table
142 dw 0000h,0000h ;scratch area
143 dw dirbuf,pbn ;dir buff,parm block
144 ; dw csv&?dn,alv&?dn ;check, alloc vectors
145 ldw csv,%?dn
146 ldw alv,%?dn
147 lset css,%?dn,css&pbn
148 lset als,%?dn,als&pbn
149 ?dn set ?dn+1
150 endm
151
152
153 lds macro lb,dn,val
154 lb&dn: ds val&dn
155 endm
156
157
158 endef macro
159 begdat equ $
160
161 dirbuf: ds 128 ;directory access buffer
162 ?n set 0
163 rept ?dn
164 lds alv,%?n,als
165 lds csv,%?n,css
166 ?n set ?n+1
167 endm
168 enddat equ $
169 datsiz equ $-begdat
170 endm
171