Files
RomWBW/trunk/Apps/crossdev/METADATA.ASM
2013-02-16 06:42:29 +00:00

523 lines
8.1 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 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 <http://www.gnu.org/licenses/>.
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
meta$debug equ FALSE
meta$sig5a equ 0
meta$siga5 equ 1
meta$prot equ 128-8-1-16-7
meta$updates equ 128-8-1-16-6
meta$rmj equ 128-8-1-16-4
meta$rmn equ 128-8-1-16-3
meta$rup equ 128-8-1-16-2
meta$rtp equ 128-8-1-16-1
meta$label equ 128-8-1-16
meta$term equ 128-8-1
meta$info$loc equ 128-8
meta$cpm$loc equ 128-6
meta$dat$end equ 128-4
meta$cpm$ent equ 128-2
meta$label$len equ meta$term-meta$label
;-----------------------------
crlf db CR,LF,'$'
;-----------------------------
page
public x$u$meta
x$u$meta:
shld x$u$bufptr
; lhld x$u$bufptr
lxi d,meta$prot
dad d
mov a,m
cpi TRUE ; is metadata write protected
jz x$u$proterr ; if so go around update code
; increment the update count
lhld x$u$bufptr
lxi d,meta$updates
dad d
mov e,m ; pick up LO byte into E
inx h
mov d,m ; pick up HO byte into D
inx d ; increment DE
mov m,d
dcx h
mov m,e
; update last written version quad
lhld x$u$bufptr
lxi d,meta$rmj
dad d
mvi a,A$RMJ
mov m,a
inx h
mvi a,A$RMN
mov m,a
inx h
mvi a,A$RUP
mov m,a
inx h
mvi a,A$RTP
mov m,a
lhld x$u$bufptr
lxi d,meta$term
dad d
mov a,m
cpi '$'
jz x$u$end
lhld x$u$bufptr
lxi d,meta$label
dad d
mvi a,' '
mvi c,16
call x$memset
lhld x$u$bufptr
lxi d,meta$term
dad d
mvi a,'$'
mov m,a
x$u$end:
mvi a,SUCCESS
ret
x$u$proterr:
mvi a,FAILURE
ret
x$u$bufptr ds 2
;-----------------------------
page
public x$i$meta
x$i$meta:
shld x$i$bufptr
lhld x$i$bufptr
lxi d,meta$sig5a
dad d
mvi a,05ah
mov m,a
inx h
mvi a,0a5h
mov m,a
lhld x$i$bufptr
lxi d,meta$prot
dad d
mvi a,FALSE
mov m,a
lhld x$i$bufptr
lxi d,meta$updates
dad d
mvi a,0
mov m,a
inx h
mov m,a
lhld x$i$bufptr
lxi d,meta$label
dad d ; hl -> dest
mvi a,' '
mvi c,meta$label$len
call x$memset
lhld x$i$bufptr
lxi d,meta$term
dad d
mvi a,'$'
mov m,a
lhld x$i$bufptr
lxi d,meta$updates
dad d
mvi a,0
mov m,a
inx h
mov m,a
lhld x$i$bufptr
call x$u$meta
ret
x$i$bufptr ds 2
;-------------------------------------------
page
public x$g$meta
x$g$meta;
shld x$g$bufptr ; entry hl has bufptr
mov a,c ; entry c has drivenum
sta x$g$drivenum
; lda x$g$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lhld x$g$bufptr
push h
pop b
call BISETDMA
call BIREAD
lhld x$g$bufptr
lxi d,meta$siga5
dad d
mov a,m
cpi 0a5h
jnz x$g$needs$init
lhld x$g$bufptr
lxi d,meta$sig5a
dad d
mov a,m
cpi 05ah
jnz x$g$needs$init
jmp x$g$fini
x$g$needs$init:
lhld x$g$bufptr
call x$i$meta
mvi c,0 ; default to 0 per Wayne
call BIWRITE
x$g$fini:
mvi c,13
call BDOS
ret
x$g$bufptr ds 2
x$g$drivenum ds 1
;-----------------------------------
page
public x$p$meta
x$p$meta:
shld x$p$bufptr
mov a,c
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
lhld x$p$bufptr ; hl -> buffer
lxi d,meta$updates ; de = offset to updates word
dad d ; hl -> updates word
mov e,m ; e = LO byte of updates
inx h ; hl -> HO byte
mov d,m ; d = HO byte of updates
inx d ; increment DE (updates)
mov m,d ; put back HO byte
dcx h ; back up ptr
mov m,e ; put back LO byte
; update last written version quad
lhld x$p$bufptr
lxi d,meta$rmj
dad d
mvi a,A$RMJ
mov m,a
inx h
mvi a,A$RMN
mov m,a
inx h
mov a,A$RUP
mov m,a
inx h
mvi a,A$RTP
mov m,a
lhld x$p$bufptr
lxi d,meta$prot
dad d
mov a,m
cpi TRUE ; if metadata is write protected
jz x$p$fini ; jump around update code
lda x$p$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lhld x$p$bufptr
push h
pop b
call BISETDMA
mvi c,0 ; default to 0 per Wayne
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:
ret
x$p$bufptr ds 2
x$p$drivenum ds 1
;-----------------------
page
public x$pr$meta
x$pr$meta:
mov a,c
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
lda x$pr$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lxi b,x$pr$buffer
call BISETDMA
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
lxi h,x$pr$buffer
lxi d,meta$prot
dad d
mvi a,TRUE
mov m,a
lxi h,x$pr$buffer
lxi d,meta$updates
dad d
mov e,m
inx h
mov d,m
inx d
mov m,d
dcx h
mov m,e
lda x$pr$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lxi b,x$pr$buffer
call BISETDMA
mvi c,0 ; default to 0 per Wayne
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
mvi c,13
call BDOS
ret
x$pr$drivenum ds 1
x$pr$buffer ds 128
;-----------------------
page
public x$un$meta
x$un$meta:
mov a,c
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
lda x$un$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lxi b,x$un$buffer
call BISETDMA
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
lxi h,x$un$buffer
lxi d,meta$prot
dad d
mvi a,FALSE
mov m,a
lxi h,x$un$buffer
lxi d,meta$updates
dad d
mov e,m
inx h
mov d,m
inx d
mov m,d
dcx h
mov m,e
lda x$un$drivenum
mov c,a
call BISELDSK
lxi b,0
call BISETTRK
lxi b,11
call BISETSEC
lxi b,x$un$buffer
call BISETDMA
mvi c,0 ; default to 0 per Wayne
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
mvi c,13
call BDOS
ret
x$un$drivenum ds 1
x$un$buffer ds 128
;-----------------------
; eof - metadata.asm