; metadata.asm 7/30/2012 dwg - set c=0 for BIOS WRITE calls per Wayne ; metadata.asm 2/17/2012 dwg - review for release 1.5.1.0 ; metadata.asm 2/11/2012 dwg - review for release 1.5 ; metadata.asm 2/ 4/2012 dwg - metadata library implementation ; Copyright (C) 2011-2012 Douglas Goodall Licensed under GPL Ver 3. ; ; This file is part of NuBiosDWG and is free software: you can ; redistribute it and/or modify it under the terms of the GNU ; General Public License as published by the Free Software Foundation, ; either version 3 of the License, or (at your option) any later version. ; This file is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with it. If not, see . maclib portab maclib globals maclib cpmbios maclib cpmbdos maclib memory ; has x$memset maclib applvers ; has A$RMJ, A$RMN, A$RUP, A$RTP maclib printers maclib stdlib ; SUCCESS and FAILURE ; metadata.lib 1/31/2012 dwg - macros to manipulate drive metadata ; ; update$meta buffer | x$u$meta hl -> buffer ; init$meta buffer | x$i$meta hl -> buffer ; get$meta drive,buffer | x$g$meta hl -> buffer, c = drivenum ; put$meta drive,buffer | x$p$meta hl -> buffer, c = drivenum ; prot$meta drive | x$pr$meta c = drivenum ; unprot$meta drive | x$un$meta c = drivenum ; ;------------------------------------------- ;meta$debug equ TRUE 0000 = meta$debug equ FALSE 0000 = meta$sig5a equ 0 0001 = meta$siga5 equ 1 0060 = meta$prot equ 128-8-1-16-7 0061 = meta$updates equ 128-8-1-16-6 0063 = meta$rmj equ 128-8-1-16-4 0064 = meta$rmn equ 128-8-1-16-3 0065 = meta$rup equ 128-8-1-16-2 0066 = meta$rtp equ 128-8-1-16-1 0067 = meta$label equ 128-8-1-16 0077 = meta$term equ 128-8-1 0078 = meta$info$loc equ 128-8 007A = meta$cpm$loc equ 128-6 007C = meta$dat$end equ 128-4 007E = meta$cpm$ent equ 128-2 0010 = meta$label$len equ meta$term-meta$label ;----------------------------- 0000 0D0A24 crlf db CR,LF,'$' ;----------------------------- page public x$u$meta x$u$meta: 0003 225F00 shld x$u$bufptr ; lhld x$u$bufptr 0006 116000 lxi d,meta$prot 0009 19 dad d 000A 7E mov a,m 000B FE01 cpi TRUE ; is metadata write protected 000D CA5C00 jz x$u$proterr ; if so go around update code ; increment the update count 0010 2A5F00 lhld x$u$bufptr 0013 116100 lxi d,meta$updates 0016 19 dad d 0017 5E mov e,m ; pick up LO byte into E 0018 23 inx h 0019 56 mov d,m ; pick up HO byte into D 001A 13 inx d ; increment DE 001B 72 mov m,d 001C 2B dcx h 001D 73 mov m,e ; update last written version quad 001E 2A5F00 lhld x$u$bufptr 0021 116300 lxi d,meta$rmj 0024 19 dad d 0025 3E02 mvi a,A$RMJ 0027 77 mov m,a 0028 23 inx h 0029 3E05 mvi a,A$RMN 002B 77 mov m,a 002C 23 inx h 002D 3E00 mvi a,A$RUP 002F 77 mov m,a 0030 23 inx h 0031 3E01 mvi a,A$RTP 0033 77 mov m,a 0034 2A5F00 lhld x$u$bufptr 0037 117700 lxi d,meta$term 003A 19 dad d 003B 7E mov a,m 003C FE24 cpi '$' 003E CA5900 jz x$u$end 0041 2A5F00 lhld x$u$bufptr 0044 116700 lxi d,meta$label 0047 19 dad d 0048 3E20 mvi a,' ' 004A 0E10 mvi c,16 004C CD0000 call x$memset 004F 2A5F00 lhld x$u$bufptr 0052 117700 lxi d,meta$term 0055 19 dad d 0056 3E24 mvi a,'$' 0058 77 mov m,a x$u$end: 0059 3E00 mvi a,SUCCESS 005B C9 ret x$u$proterr: 005C 3E01 mvi a,FAILURE 005E C9 ret 005F x$u$bufptr ds 2 ;----------------------------- page public x$i$meta x$i$meta: 0061 22B300 shld x$i$bufptr 0064 2AB300 lhld x$i$bufptr 0067 110000 lxi d,meta$sig5a 006A 19 dad d 006B 3E5A mvi a,05ah 006D 77 mov m,a 006E 23 inx h 006F 3EA5 mvi a,0a5h 0071 77 mov m,a 0072 2AB300 lhld x$i$bufptr 0075 116000 lxi d,meta$prot 0078 19 dad d 0079 3E00 mvi a,FALSE 007B 77 mov m,a 007C 2AB300 lhld x$i$bufptr 007F 116100 lxi d,meta$updates 0082 19 dad d 0083 3E00 mvi a,0 0085 77 mov m,a 0086 23 inx h 0087 77 mov m,a 0088 2AB300 lhld x$i$bufptr 008B 116700 lxi d,meta$label 008E 19 dad d ; hl -> dest 008F 3E20 mvi a,' ' 0091 0E10 mvi c,meta$label$len 0093 CD0000 call x$memset 0096 2AB300 lhld x$i$bufptr 0099 117700 lxi d,meta$term 009C 19 dad d 009D 3E24 mvi a,'$' 009F 77 mov m,a 00A0 2AB300 lhld x$i$bufptr 00A3 116100 lxi d,meta$updates 00A6 19 dad d 00A7 3E00 mvi a,0 00A9 77 mov m,a 00AA 23 inx h 00AB 77 mov m,a 00AC 2AB300 lhld x$i$bufptr 00AF CD0300 call x$u$meta 00B2 C9 ret 00B3 x$i$bufptr ds 2 ;------------------------------------------- page public x$g$meta x$g$meta; 00B5 220501 shld x$g$bufptr ; entry hl has bufptr 00B8 79 mov a,c ; entry c has drivenum 00B9 320701 sta x$g$drivenum ; lda x$g$drivenum 00BC 4F mov c,a 00BD CD1BE6 call BISELDSK 00C0 010000 lxi b,0 00C3 CD1EE6 call BISETTRK 00C6 010B00 lxi b,11 00C9 CD21E6 call BISETSEC 00CC 2A0501 lhld x$g$bufptr 00CF E5 push h 00D0 C1 pop b 00D1 CD24E6 call BISETDMA 00D4 CD27E6 call BIREAD 00D7 2A0501 lhld x$g$bufptr 00DA 110100 lxi d,meta$siga5 00DD 19 dad d 00DE 7E mov a,m 00DF FEA5 cpi 0a5h 00E1 C2F400 jnz x$g$needs$init 00E4 2A0501 lhld x$g$bufptr 00E7 110000 lxi d,meta$sig5a 00EA 19 dad d 00EB 7E mov a,m 00EC FE5A cpi 05ah 00EE C2F400 jnz x$g$needs$init 00F1 C3FF00 jmp x$g$fini x$g$needs$init: 00F4 2A0501 lhld x$g$bufptr 00F7 CD6100 call x$i$meta 00FA 0E00 mvi c,0 ; default to 0 per Wayne 00FC CD2AE6 call BIWRITE x$g$fini: 00FF 0E0D mvi c,13 0101 CD0500 call BDOS 0104 C9 ret 0105 x$g$bufptr ds 2 0107 x$g$drivenum ds 1 ;----------------------------------- page public x$p$meta x$p$meta: 0108 226001 shld x$p$bufptr 010B 79 mov a,c 010C 326201 sta x$p$drivenum IF meta$debug eq TRUE conout 'x' conout '$' conout 'p' conout '$' printf 'meta called, drive=' lda x$p$drivenum mov l,a mvi h,0 call pr$d$word printf ', buffer=' lhld x$p$bufptr call pr$h$word print crlf ENDIF ; increment the update count 010F 2A6001 lhld x$p$bufptr ; hl -> buffer 0112 116100 lxi d,meta$updates ; de = offset to updates word 0115 19 dad d ; hl -> updates word 0116 5E mov e,m ; e = LO byte of updates 0117 23 inx h ; hl -> HO byte 0118 56 mov d,m ; d = HO byte of updates 0119 13 inx d ; increment DE (updates) 011A 72 mov m,d ; put back HO byte 011B 2B dcx h ; back up ptr 011C 73 mov m,e ; put back LO byte ; update last written version quad 011D 2A6001 lhld x$p$bufptr 0120 116300 lxi d,meta$rmj 0123 19 dad d 0124 3E02 mvi a,A$RMJ 0126 77 mov m,a 0127 23 inx h 0128 3E05 mvi a,A$RMN 012A 77 mov m,a 012B 23 inx h 012C 78 mov a,A$RUP 012D 77 mov m,a 012E 23 inx h 012F 3E01 mvi a,A$RTP 0131 77 mov m,a 0132 2A6001 lhld x$p$bufptr 0135 116000 lxi d,meta$prot 0138 19 dad d 0139 7E mov a,m 013A FE01 cpi TRUE ; if metadata is write protected 013C CA5F01 jz x$p$fini ; jump around update code 013F 3A6201 lda x$p$drivenum 0142 4F mov c,a 0143 CD1BE6 call BISELDSK 0146 010000 lxi b,0 0149 CD1EE6 call BISETTRK 014C 010B00 lxi b,11 014F CD21E6 call BISETSEC 0152 2A6001 lhld x$p$bufptr 0155 E5 push h 0156 C1 pop b 0157 CD24E6 call BISETDMA 015A 0E00 mvi c,0 ; default to 0 per Wayne 015C CD2AE6 call BIWRITE IF meta$debug eq TRUE printf 'return from BIWRITE is ' mov l,a mvi h,0 call pr$h$word print crlf ENDIF x$p$fini: 015F C9 ret 0160 x$p$bufptr ds 2 0162 x$p$drivenum ds 1 ;----------------------- page public x$pr$meta x$pr$meta: 0163 79 mov a,c 0164 32BF01 sta x$pr$drivenum IF meta$debug eq TRUE conout 'x' conout '$' printf 'pr' conout '$' printf 'meta called, drive=' lda x$pr$drivenum mov l,a mvi h,0 call pr$d$word print crlf ENDIF 0167 3ABF01 lda x$pr$drivenum 016A 4F mov c,a 016B CD1BE6 call BISELDSK 016E 010000 lxi b,0 0171 CD1EE6 call BISETTRK 0174 010B00 lxi b,11 0177 CD21E6 call BISETSEC 017A 01C001 lxi b,x$pr$buffer 017D CD24E6 call BISETDMA 0180 CD27E6 call BIREAD IF meta$debug eq TRUE printf 'return from BIREAD is ' mov l,a mvi h,0 call pr$h$word print crlf ENDIF 0183 21C001 lxi h,x$pr$buffer 0186 116000 lxi d,meta$prot 0189 19 dad d 018A 3E01 mvi a,TRUE 018C 77 mov m,a 018D 21C001 lxi h,x$pr$buffer 0190 116100 lxi d,meta$updates 0193 19 dad d 0194 5E mov e,m 0195 23 inx h 0196 56 mov d,m 0197 13 inx d 0198 72 mov m,d 0199 2B dcx h 019A 73 mov m,e 019B 3ABF01 lda x$pr$drivenum 019E 4F mov c,a 019F CD1BE6 call BISELDSK 01A2 010000 lxi b,0 01A5 CD1EE6 call BISETTRK 01A8 010B00 lxi b,11 01AB CD21E6 call BISETSEC 01AE 01C001 lxi b,x$pr$buffer 01B1 CD24E6 call BISETDMA 01B4 0E00 mvi c,0 ; default to 0 per Wayne 01B6 CD2AE6 call BIWRITE IF meta$debug eq TRUE printf 'return from BIWRITE is ' mov l,a mvi h,0 call pr$h$word print crlf ENDIF 01B9 0E0D mvi c,13 01BB CD0500 call BDOS 01BE C9 ret 01BF x$pr$drivenum ds 1 01C0 x$pr$buffer ds 128 ;----------------------- page public x$un$meta x$un$meta: 0240 79 mov a,c 0241 329C02 sta x$un$drivenum IF meta$debug eq TRUE conout 'x' conout '$' printf 'un' conout '$' printf 'meta called, drive=' lda x$un$drivenum mov l,a mvi h,0 call pr$d$word print crlf ENDIF 0244 3A9C02 lda x$un$drivenum 0247 4F mov c,a 0248 CD1BE6 call BISELDSK 024B 010000 lxi b,0 024E CD1EE6 call BISETTRK 0251 010B00 lxi b,11 0254 CD21E6 call BISETSEC 0257 019D02 lxi b,x$un$buffer 025A CD24E6 call BISETDMA 025D CD27E6 call BIREAD IF meta$debug eq TRUE printf 'return from BIREAD is ' mov l,a mvi h,0 call pr$h$word print crlf ENDIF 0260 219D02 lxi h,x$un$buffer 0263 116000 lxi d,meta$prot 0266 19 dad d 0267 3E00 mvi a,FALSE 0269 77 mov m,a 026A 219D02 lxi h,x$un$buffer 026D 116100 lxi d,meta$updates 0270 19 dad d 0271 5E mov e,m 0272 23 inx h 0273 56 mov d,m 0274 13 inx d 0275 72 mov m,d 0276 2B dcx h 0277 73 mov m,e 0278 3A9C02 lda x$un$drivenum 027B 4F mov c,a 027C CD1BE6 call BISELDSK 027F 010000 lxi b,0 0282 CD1EE6 call BISETTRK 0285 010B00 lxi b,11 0288 CD21E6 call BISETSEC 028B 019D02 lxi b,x$un$buffer 028E CD24E6 call BISETDMA 0291 0E00 mvi c,0 ; default to 0 per Wayne 0293 CD2AE6 call BIWRITE IF meta$debug eq TRUE printf 'return from BIWRITE is ' mov l,a mvi h,0 call pr$h$word print crlf ENDIF 0296 0E0D mvi c,13 0298 CD0500 call BDOS 029B C9 ret 029C x$un$drivenum ds 1 029D x$un$buffer ds 128 ;----------------------- ; eof - metadata.asm