home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
171.lha
/
travail.asm
< prev
next >
Wrap
Assembly Source File
|
1988-04-28
|
11KB
|
278 lines
************************************************************************
************************************************************************
* travail.asm *
* *
* An assembly language look-alike replacement for AVAIL, *
* the Commodore SW Toolkit utility for showing current memory *
* in-use and available. Reentrant and "pure." *
* *
* Dr. Gerald Hull *
* CREATIVE FOCUS *
* 12 White Street *
* Binghamton, New York 13901 *
* (607) 648-4082 *
* *
************************************************************************
************************************************************************
************************************************************************
* Global register usage
REGS reg d2-d7/a2-a4,a6
OUT equr a2 output handle
DOS equr a3 Doslib handle
FP equr a5 local frame pointer
LVP equr a6 library vector pointer
SP equr a7 stack pointer
************************************************************************
* Include files
nolist
include 'exec/types.i'
include 'exec/lists.i'
include 'exec/memory.i'
include 'exec/execbase.i'
list
************************************************************************
* Library vector offsets
xref _LVOOpenLibrary
xref _LVOCloseLibrary
xref _LVOOutput
xref _LVOWrite
xref _LVOAvailMem
xref _LVOPermit
xref _LVOForbid
************************************************************************
* Equates, macros, etc.
EB equ 4 _AbsEcecBase
MIN_LIB equ $1f minimum library acceptable
LF equ $0a line feed
BASE equ $0a ints to ascii in base 10
PREC equ $08 maximum digits per number
LOKE equ -62 local frame memory needed
LOKEVAR macro allocates local frame space
\1 equ LOKI+\2 (based on a suggestion by
LOKI set \1 Wesley Howe)
endm
LOKI set 0
LOKEVAR CMAX,-4 maximum CHIP memory
LOKEVAR FMAX,-4 " FAST "
LOKEVAR TAVAIL,-4 total available memory
LOKEVAR LARGE,-4 largest block available
LOKI set LOKE+5
LOKEVAR AVAIL,10 -> end+1 for Avail numbers
LOKEVAR INUSE,10 " " " In-Use "
LOKEVAR MAX,10 " " " Maximum "
LOKEVAR LRGST,10 " " " Largest "
************************************************************************
* Program starts here
START link FP,#LOKE allocate local frame
clr.l TAVAIL(FP) initialize
clr.l LARGE(FP) variables
movem.l REGS,-(SP) save needed registers
move.l EB,LVP _AbsExecBase
lea DOSNAME(pc),a1 prepare registers for
moveq #MIN_LIB,d0 OpenLibrary call
jsr _LVOOpenLibrary(LVP) do it
tst.l d0 did it work?
bne.s CONT yes!
BAD moveq #20,d0 no!
movem.l (SP)+,REGS restore registers
rts go home in tears
CONT move.l d0,DOS save DosLib handle
movea.l DOS,LVP and
jsr _LVOOutput(LVP) go for Output handle
move.l d0,OUT save it
movea.l EB,LVP _AbsExecBase
jsr _LVOForbid(LVP) lock out all other tasks
movea.l LVP,a1
move.l MemList(a1),d3 get MemList header
moveq #0,d4 for summing CHIP blocks
moveq #0,d5 " " FAST "
SCAN: move.l d3,a1 get node pointer
move.l LN_SUCC(a1),d3 lookahead
beq.s DUN found last node
btst #MEMB_CHIP,MH_ATTRIBUTES+1(a1) test for CHIP
beq.s FST skip to FAST if not
add.l MH_UPPER(a1),d5 calculate size
sub.l MH_LOWER(a1),d5 of CHIP block
FST btst #MEMB_FAST,MH_ATTRIBUTES+1(a1) test for FAST too!
beq.s SCAN nope
add.l MH_UPPER(a1),d4 calculate size
sub.l MH_LOWER(a1),d4 of FAST block
bra.s SCAN repeat
DUN move.l d4,FMAX(FP) save FAST totals
move.l d5,CMAX(FP) " CHIP "
jsr _LVOPermit(LVP)
lea WRDZ(pc),a0 output column
bsr WRITES headings
moveq #MEMF_CHIP,d6 load registers
lea CHIP(pc),a4 for CHIP values
bsr.s DOTYPE calc & output CHIP values
moveq #MEMF_FAST,d6 load registers
move.l FMAX(FP),d5 for FAST
lea FAST(pc),a4 values
bsr.s DOTYPE calc & output FAST values
lea TOTL(pc),a4 load
move.l TAVAIL(FP),d0 registers
move.l CMAX(FP),d6
add.l FMAX(FP),d6 for total
move.l d6,d5
sub.l d0,d5 values
move.l LARGE(FP),d7
bsr.s DOSTR output totals
move.l LVP,a1 get DosLib handle
movea.l EB,LVP and
jsr _LVOCloseLibrary(LVP) close it up
movem.l (SP)+,REGS
unlk FP release local frame
rts
************************************************************************
* DOTYPE: calculates and outputs memory values per type
*
* in: d6 = memtype
* d5 = Maximum
* a4 -> type string
DOTYPE move.l EB,LVP _AbsExecBase
move.l d6,d1 CHIP or FAST
ori.l #MEMF_LARGEST,d1 look
moveq #0,d0 for
jsr _LVOAvailMem(LVP) biggest chunk
cmp.l LARGE(FP),d0 biggest so far?
ble.s NOTL nope
move.l d0,LARGE(FP) yup; stuff it
NOTL move.l d0,d7 save for DOSTR
move.l d6,d1
moveq #0,d0 memtype again
jsr _LVOAvailMem(LVP) available aggregate
add.l d0,TAVAIL(FP) add to total
move.l d5,d6 Maximum in d6
sub.l d0,d5 In-Use in d5
* fall into DOSTR
************************************************************************
* DOSTR: outputs type string and values
*
* in: a4 -> type string
* d0 = Available
* d5 = In-Use
* d6 = Maximum
* d7 = Largest
DOSTR move.b #' ',d1 fill string
lea LOKE(FP),a1 buffer
moveq #WRDZLEN-2,d2 with
REP move.b d1,(a1)+ blanks
dbra d2,REP and
move.b #LF,(a1) linefeed
lea LOKE(FP),a1 beginning of str buf
moveq #TYPELEN-1,d1 insert
TXT move.b (a4)+,(a1)+ type
dbra d1,TXT string
lea AVAIL(FP),a0 insert Available
bsr.s MAKEDEC number
move.l d5,d0 insert
lea INUSE(FP),a0 In-Use
bsr.s MAKEDEC number
move.l d6,d0 insert
lea MAX(FP),a0 Maximum
bsr.s MAKEDEC number
move.l d7,d0 insert
lea LRGST(FP),a0 Largest
bsr.s MAKEDEC number
lea LOKE(FP),a0 prepare
WRITES move.l OUT,d1 registers
move.l a0,d2 for
moveq #WRDZLEN,d3 Write
movea.l DOS,LVP call
jsr _LVOWrite(LVP) do it
rts
************************************************************************
* MAKEDEC: converts an integer to its decimal representation
*
* in: d0 = value to output
* a0 -> end+1 of string dest
MAKEDEC moveq #PREC-1,d2 set max digits
LDIV moveq #BASE,d1 base for digits
move.w d0,d4 save Z
clr.w d0 d1 from YZ to Y0
swap d0 d1 from Y0 to 0Y
divu d1,d0 d0 = 0Y / X = R1Q1
move.w d0,d3 save Q1
move.w d4,d0 d0 from R1Q1 to R1Z
divu d1,d0 d0 = R1Z / X = R0Q0
SMALL swap d0 d0 = QR or Q0R0
move.l d0,d1 d1 = QR or Q0R0
move.w d3,d0 d0 = Q0 or Q0Q1
swap d0 d0 = 0Q or Q1Q0
add.b #'0',d1 make d1.b ascii
move.b d1,-(a0) put it out
tst.l d0 no more digits?
dbeq d2,LDIV or PREC reached?
rts
************************************************************************
* Data constants
WRDZ dc.b 'Type Available In-Use' column
dc.b ' Maximum Largest',LF headings
WRDZLEN equ *-WRDZ
CHIP dc.b 'chip ' strings
FAST dc.b 'fast ' for
TOTL dc.b 'total' types
TYPELEN equ *-TOTL
DOSNAME dc.b 'dos.library',0 DosLibrary card
END