home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
back2roots/padua
/
padua.7z
/
padua
/
ftp.vapor.com
/
microdot-1
/
md1_src_02.lzx
/
sup.a
< prev
next >
Wrap
Text File
|
1989-06-24
|
9KB
|
608 lines
section "text",code
; include 'microdot.i'
call MACRO
xref _LVO\1
jsr _LVO\1(a6)
ENDM
xref _SysBase
xdef _asprintf
_asprintf:
movem.l a2/a3/a6,-(sp)
move.l 4*4(sp),a3 ;Get the output string pointer
asl1:
tst.b (a3)+
bne.s asl1
subq.l #1,a3
bra.s xxxx
xdef _sprintf
xref _LocaleBase
_sprintf:
movem.l a2/a3/a6,-(sp)
move.l 4*4(sp),a3 ;Get the output string pointer
xxxx:
IFND MDV20
tst.l _LocaleBase(a4)
bne.s skip
move.l 5*4(sp),a0 ;Get the FormatString pointer
bsr _replacebigd
ENDC
skip:
move.l 5*4(sp),a0 ;Get the FormatString pointer
lea.l 6*4(sp),a1 ;Get the pointer to the DataStream
lea.l stuffChar(pc),a2
move.l _SysBase(a4),a6
jsr -522(a6)
movem.l (sp)+,a2/a3/a6
rts
;------ PutChProc function used by RawDoFmt -----------
stuffChar:
move.b d0,(a3)+ ;Put data to output string
rts
xdef _dofmt
_dofmt:
movem.l a3/a6,-(sp)
move.l a0,a3
move.l a1,a0
move.l a2,a1
IFND MDV20
tst.l _LocaleBase(a4)
bne.s skip2
movem.l a0/a1,-(sp)
bsr _replacebigd
movem.l (sp)+,a0/a1
ENDC
skip2:
lea stuffChar(pc),a2
move.l _SysBase(a4),a6
jsr -522(a6)
movem.l (sp)+,a3/a6
rts
xp: dc.w 0
xdef _dofmtextabs
_dofmtextabs:
movem.l a3/a6,-(sp)
lea xp(pc),a6
clr.w (a6)
move.l a0,a3
move.l a1,a0
move.l a2,a1
lea extab(pc),a2
move.l _SysBase(a4),a6
IFND MDV20
tst.l _LocaleBase(a4)
bne.s skip3
movem.l a0/a1,-(sp)
bsr _replacebigd
movem.l (sp)+,a0/a1
ENDC
skip3:
jsr -522(a6) ; rawdofmt
movem.l (sp)+,a3/a6
rts
extab: ; d0 = byte, a3 = ptr
lea xp(pc),a0
cmp.w #1023,(a0)
bge.s exret
cmp.b #9,d0 ; istab
beq.s existab
addq.w #1,(a0)
move.b d0,(a3)+
exret:
rts
existab:
; movem.l a0/d1,-(sp) ; put spaces until tab is filled
; lea xp(pc),a0
moveq #32,d0
ex1:
move.w (a0),d1
addq.w #1,d1
move.w d1,(a0)
move.b d0,(a3)+ ; put space
and.w #3,d1
bne.s ex1
; movem.l (sp)+,a0/d1
rts
xdef _clnl
_clnl: ; a0 = strptr
moveq #10,d1
clnl1:
move.b (a0)+,d0
beq.s clnl2
sub.b d1,d0
beq.s clnl3
subq.b #3,d0
bne.s clnl1
clnl3:
clr.b -(a0)
clnl2:
rts
xdef _callreg ; a0/a6
_callreg:
addq.l #1,d0
asl.l #2,d0
move.l d0,a0
jmp (a0)
IFND MDV20
xdef _myAllocVec ; d0 = size, d1 = req
_myAllocVec:
movem.l a6/d7,-(sp)
move.l _SysBase(a4),a6
addq.l #4,d0
move.l d0,d7
jsr -198(a6) ; AllocMem
move.l d0,a0
tst.l d0
beq.s mav1
move.l d7,(a0)+
move.l a0,d0
mav1:
movem.l (sp)+,a6/d7
rts
xdef _myFreeVec ; a1 = block
_myFreeVec:
move.l a6,-(sp)
move.l _SysBase(a4),a6
move.l -(a1),d0 ; get back size
jsr -210(a6)
move.l (sp)+,a6
rts
xref _GfxBase
; quick sabd13
xdef _sabd13 ; a1, d0..d2, a6 = gfxbase
_sabd13:
movem.l a2/d3,-(sp)
move.l a1,a2 ; save rp
move.l d1,d3
jsr -342(a6) ; SetAPen
move.l d3,d0
move.l a2,a1
jsr -348(a6) ; SetBPen
move.l d2,d0
move.l a2,a1
jsr -354(a6) ; SetDrMd
movem.l (sp)+,a2/d3
rts
ENDC
; replace sclib __tzset()
xref ___timezone
xref ___daylight
xdef ___tzset
xdef @__tzset
___tzset:
@__tzset:
clr.l ___timezone(a4)
clr.l ___daylight(a4)
rts
; replace sclib time()
xref _DOSBase
xref __CXD33
xdef _time
xdef @time
_time:
MOVEA.L 0004(A7),A0
@time:
SUBA.W #$c,A7
MOVEM.L D2-D3/D7/A5-A6,-(A7)
MOVEA.L A0,A5
LEA $14(A7),A0
MOVE.L A0,D1
MOVEA.L _DOSBase(A4),A6
JSR -192(A6) ; DateStamp
MOVE.L $1C(A7),D0
MOVEQ #$32,D1
JSR __CXD33(PC)
MOVE.L #$b6a,D1
ADD.L $14(A7),D1
MOVE.L D1,D2
ASL.L #4,D2
SUB.L D1,D2
MOVE.L D2,D3
ASL.L #2,D3
SUB.L D2,D3
ASL.L #5,D3
ADD.L $18(A7),D3
MOVE.L D3,D7
ASL.L #4,D7
SUB.L D3,D7
ASL.L #2,D7
ADD.L D0,D7
MOVE.L A5,D0
BEQ.B tns
MOVE.L D7,(A5)
tns:
MOVE.L D7,D0
MOVEM.L (A7)+,D2-D3/D7/A5-A6
ADDA.W #$C,A7
RTS
; tricky dicky char stuff
xdef _skillfirstspace
; a0 = strptr
_skillfirstspace:
moveq #32,d1
move.l d2,a1
moveq #9,d2
skf1:
move.b (a0)+,d0
beq.s skf2
cmp.b d1,d0
beq.s doskf
cmp.b d2,d0
bne.s skf1
doskf:
clr.b -1(a0)
skf2:
move.l a1,d2
rts
xdef _skillatch ; a0 = string, d0 = char
_skillatch:
kl:
move.b (a0)+,d1
beq.s ek
cmp.b d1,d0
bne.s kl
clr.b -(a0)
ek:
rts
; expandtabs( from, to, tabsize )
; a0 a1 d0
xdef _expandtabs
_expandtabs:
movem.l d2/d3/d4/d5/d6,-(sp)
moveq #9,d2 ; TAB, fⁿr Vergleichszwecke
moveq #32,d5 ; space to fill
moveq #0,d1 ; To-Offset
exl:
move.b (a0)+,d3
beq.s exl_end
cmp.b d2,d3 ; isses en tab?
beq.s exl_found
move.b d3,0(a1,d1.w)
addq.w #1,d1
bra.s exl
; tab gefunden
exl_found:
move.l d1,d4 ; aktuelle charpos
divu d0,d4 ; durch tabsize dividieren
swap d4 ; im lowword steht jetzt mod
move.w d0,d6
sub.w d4,d6
bra.s exl_exp
exl_expl:
move.b d5,0(a1,d1.w)
addq.w #1,d1
exl_exp:
dbra d6,exl_expl
bra.s exl
exl_end:
clr.b 0(a1,d1.w)
movem.l (sp)+,d2/d3/d4/d5/d6
rts
IFND MDV20
; CreateProc13 ; a0 = func, a1 = name, d0 = stack, d1 = pri
xdef _CreateProc13
cnop 0,4
fakeseg:
dc.l 16 ; len
dc.l 0 ; nextseg
jmp $7ffffffe
cnop 0,4
_CreateProc13:
movem.l d2-d4/a6,-(sp)
move.l _DOSBase(a4),a6
move.l d0,d4 ; stack
move.l d1,d2 ; pri
move.l a1,d1 ; name
lea fakeseg(pc),a1
move.l a0,10(a1) ; seglist
move.l a1,d3
lsr.l #2,d3 ; BPTR
addq.l #1,d3 ; +1 (actually pointing to nextseg)
jsr -138(a6) ; CreateProc
move.l d0,d1 ; non zero?
beq.s cp13ret
moveq #92,d1
sub.l d1,d0 ; offset MsgPort
cp13ret:
movem.l (sp)+,d2-d4/a6
rts
ENDC
; 2.0-Ersatz fⁿr strlwr & strupr via utility lib
IFD MDV20
xref _UtilityBase
xref _LVOToLower
xref _LVOToUpper
xdef @strlwr
@strlwr:
movem.l a2/a6,-(sp)
move.l _UtilityBase(a4),a6
move.l a0,a2
strlwr1:
move.b (a2),d0
beq.s strlwr2
jsr _LVOToLower(a6)
move.l d0,(a2)+
bra.s strlwr1
strlwr2:
movem.l a2/a6,-(sp)
rts
xdef @strupr
@strupr:
movem.l a2/a6,-(sp)
move.l _UtilityBase(a4),a6
move.l a0,a2
strupr1:
move.b (a2),d0
beq.s strupr2
jsr _LVOToUpper(a6)
move.l d0,(a2)+
bra.s strupr1
strupr2:
movem.l a2/a6,-(sp)
rts
ENDC
fmtint4: ; integer mit 4 stellen ausgeben
; d0 = int, a0 = to, d3 = 10, d4 = '0', d1 = blank
divu.w d3,d0
swap d0
add.b d4,d0
move.b d0,3(a0)
clr.w d0
swap d0
divu.w d3,d0
swap d0
add.b d4,d0
move.b d0,2(a0)
clr.w d0
swap d0
divu.w d3,d0
swap d0
add.b d4,d0
move.b d0,1(a0)
; clr.w d0
swap d0
add.b d4,d0
move.b d0,(a0)
cmp.b (a0),d4
bne.s fmtint4ret
move.b d1,(a0)
cmp.b 1(a0),d4
bne.s fmtint4ret
move.b d1,1(a0)
cmp.b 2(a0),d4
bne.s fmtint4ret
move.b d1,2(a0)
fmtint4ret:
addq #4,a0
rts
xref _brettlist_namesize
xdef _formatbrettline ; a0 = buffer, a1 = mbrett
_formatbrettline:
movem.l a2/d2-d4,-(sp)
moveq #5,d2
moveq #'0',d4
moveq #10,d3
moveq #32,d1
move.l _brettlist_namesize(a4),d0
; zuerst 39 zeichen strncpy viewname
lea 14(a1),a2 ; viewname
fbl1:
move.b (a2)+,(a0)+
dbeq d0,fbl1
bne.s fbl4
subq.l #1,a0
; beq.s fbl2
fbl3:
move.b d1,(a0)+ ; fill
fbl2:
dbra d0,fbl3
fbl4:
move.b d2,(a0)+ ; '|'
move.l 228(a1),d0
bsr.b fmtint4 ; mb->b.mails
move.b d2,(a0)+ ; '|'
move.l 232(a1),d0
bsr.b fmtint4 ; mb->b.newmails
move.b d2,(a0)+ ; '|'
move.l 224(a1),d0 ;
bsr fmtint4 ; mb->b.unreadmails
move.b d2,(a0)+ ; '|'
; 5 bytes lastwrite-datum
lea 96(a1),a2 ; mb->lastwritedate
IFD MDV20
move.l (a2)+,(a0)+
ELSE
move.b (a2)+,(a0)+
move.b (a2)+,(a0)+
move.b (a2)+,(a0)+
move.b (a2)+,(a0)+
ENDC
move.b (a2),(a0)+
move.b d2,(a0)+ ; '|'
lea 184(a1),a2 ; mb->betreff
fbl5:
move.b (a2)+,(a0)+
bne.s fbl5
movem.l (sp)+,a2/d2-d4
rts
; alle %lD durch %ld ersetzen
IFND MDV20
numtab:
dc.b '0123456789-.',0
cnop 0,4
xdef _replacebigd
_replacebigd: ; a0 = string
movem.l d2-d5/a2,-(sp)
lea numtab(pc),a1
moveq #'%',d1
moveq #'l',d2
moveq #'D',d3
rep1:
move.b (a0)+,d4
beq.s repex
repi: ; '%'?
cmp.b d4,d1
bne.s rep1
rep2: ; % gefunden; nun evt. Ziffern ⁿberspringen
move.b (a0)+,d4
beq.s repex
; test auf ziffern
move.l a1,a2 ; a1 = numtab
rep3:
move.b (a2)+,d5
beq.s rep4 ; ende numtab; keine ziffer oder so gefunden
cmp.b d4,d5
bne.s rep3
; ziffer; bingo, einfach ⁿberspringen
bra.s rep2
; keine (weiteren) ziffern: mu▀ 'l'ásein
rep4:
cmp.b d4,d2 ; 'l'
bne.s repi
cmp.b (a0),d3 ; 'D'?
bne.s repi
move.b #'d',(a0)+
bra.s rep1
repex:
movem.l (sp)+,d2-d5/a2
rts
ENDC
;
; Bitfield manipulating functions
;
xdef _setbit
xdef _tstbit
xdef _tstbitfield
_setbit: ; a0 = bitfield, d0 = bitnum
move.l d0,d1
lsr.l #3,d1
and.w #7,d0
bset d0,0(a0,d1.w)
rts
_tstbit: ; a0 = bitfield, d0 = bitnum
move.l d0,d1
lsr.l #3,d1
and.w #7,d0
btst d0,0(a0,d1.w)
sne d0
rts
_tstbitfield: ; a0 = bitfield, d0 = bitcount
moveq #31,d1
add.l d0,d1
lsr.l #5,d1 ; d1 = lw-count
bra.s tsb2
tsb1:
move.l (a0)+,d0
bne.s tsb3
tsb2:
dbf d1,tsb1
tsb3:
rts
xdef _storeselsup
_storeselsup: ; a0 from, d0 new
moveq #126,d1
move.l a0,a1
subq.l #4,a1
sss1:
move.l -(a1),-(a0)
dbf d1,sss1
move.l d0,(a1)
rts
END