; 29.8.00
;
; @=$100 ; normal com programm
@=$200 ; batch binary
move.w #$82,r5 ; start after space
movu.bw -2.b(r5.w),r6 ; cmdline length
dec.w r6 ; char after space
_10: dec.w r6 ; char left?
bmi.b _100 ; no
move.b (r5.w),r0 ; next char from cmdline
inc.w r5
cmp.b #' ',r0 ; space ?
beq.b _10 ; yes, ignore
cmp.b #'e',r0 ; echo command?
beq.b echo ; yes
cmp.b #'+',r0 ; incr command
beq.b inc ; yes
_100: rts.w ; no other commands
inc: move.w r6,r2 ; length of number
dec.w r6 ; at least 1
bmi.b _100 ; no
move.w r5,r1 ; adr of first digit
add.w r6,r5 ; adr of last digit
_20: inc.b (r5.w) ; inc last digit
cmp.b #'9',(r5.w) ; now > 9?
bls.b _10 ; no: ok
move.b #'0',(r5.w) ; set 0
dec.w r5 ; go to preceding digit
dec.w r6 ; digits left?
bpl.b _20 ; yes
_10: bsr.w out1 ; all done
_100: rts.w
echo: move.w #buf,r1 ; write buffer
move.w #1,r2 ; write 1 char
_00: dec.w r6 ; chars left?
bmi.b _100 ; no
move.b (r5.w),r0 ; next char from cmdline
inc.w r5
cmp.b #'l',r0 ; lower case subcommand
bne.b _10 ; no
inc.b _200 ; yes: set flag >0
_10: cmp.b #'u',r0 ; upper case subcommand
bne.b _20 ; no
dec.b _200 ; yes: set flag <0
_20: cmp.b #'_',r0 ; space subcommand?
bne.b _21 ; no
inc.b _201 ; yes: set flag >0
_21: cmp.b #'.',r0 ; skip after . subcommand
bne.b _30 ; no
inc.b _202 ; remember number of . to skip
_30: cmp.b #':',r0 ; skip before . subcommand
bne.b _40 ; no
dec.b _202 ; remember number of . to skip
_40: cmp.b #' ',r0 ; space
bne.b _00 ; no: read more subcommands
_50: dec.w r6 ; chars left?
bmi.b _100 ; no
move.b (r5.w),r0 ; get next char
inc.w r5
cmp.b #'$',r0 ; start of hex value or date command
bne.b _60 ; no
cmp.b #'t',(r5.w) ; date command?
bne.b _51 ; no
dec.w r6 ; number of chars left
inc.w r5 ; adr of next char
move.b #$2a,m0 ; get date function
trap #$21 ; call dos
move.w r2,r0 ; year
divu.b c100,m0|r0 ; last 2 digits -> m0
lsr.w #8,r0 ; last 2 digits -> r0
move.w #buf,r3 ; adr of write buffer
bsr.w _500 ; output in write buffer
move.b m1,r0 ; month
bsr.w _500 ; output in write buffer
move.b r1,r0 ; day
bsr.w _500 ; output in write buffer
move.w #buf,r1 ; adr of write buffer
move.w #6,r2 ; write 6 char: yymmdd
bsr.w out1 ; write it
move.w #1,r2 ; restore 1
br.b _50 ; process next char
_51: bsr.w hex2bin ; convert hex to bin
bsr.w hex2bin ; convert hex to bin
_60: bsr.w out ; write it
br.b _50 ; process next char
_100: bsr.w in ; read char from stdin
bcs.b _199 ; if error
or.w r0,r0 ; 1 char read
beq.b _199 ; no
move.b buf,r0 ; read char -> r0
cmp.b #10,r0 ; LF
beq.b _100 ; yes: ignore
cmp.b #13,r0 ; CR
beq.b _198 ; read LF and exit
tst.b #$ff,_200 ; lower/upper case flag
beq.b _103 ; not set
bpl.b _104 ; convert to lower
cmp.b #'a',r0 ; >= a ?
blo.b _103 ; no: nothing to convert
cmp.b #'z',r0 ; <= z ?
bhi.b _103 ; no: nothing to convert
br.b _105 ; convert
_104: cmp.b #'A',r0 ; >= A ?
blo.b _103 ; no: nothing to convert
cmp.b #'Z',r0 ; <= Z ?
bhi.b _103 ; no: nothing to convert
_105: eor.b #$20,r0 ; convert
_103: tst.b #$ff,_201 ; space flag
beq.b _106 ; not set
cmp.b #' ',r0 ; space ?
bne.b _106 ; no: nothing to do
move.b #'_',r0 ; replace by _
_106: tst.b #$ff,_202 ; skip after/before . flag
beq.b _110 ; not set
bpl.b _111 ; skip after .
cmp.b #'.',r0 ; is this char a . ?
bne.b _100 ; no: nothing to do
inc.b _202 ; yes: decr number of . to skip
br.b _100 ; next char
_111: cmp.b #'.',r0 ; is this char a . ?
bne.b _110 ; no: write char
dec.b _202 ; yes: dec number of . to output
bne.b _110 ; if not 0: write .
move.b #$80,_202 ; will skip the next 128 .
br.b _100 ; next char
_110: bsr.w out ; write char to stdout
br.b _100 ; next char
_198: bsr.w in ; read LF
_199: rts.w ; exit
_200: dc.b 0 ; upper/lower flag
_201: dc.b 0 ; space flag
_202: dc.b 0 ; . flag
_500: divu.b c10,m0|r0 ; r0=high m0=low digit
add.w #'00',r0 ; convert to ascii
move.w r0,(r3.w) ; copy in write buffer
inc.w r3 ; inc write pointer
inc.w r3 ; inc write pointer
eor.w r0,r0 ; clear r0
rts.w
c100: dc.b 100 ; constant 100
c10: dc.b 10 ; constant 10
in: move.b #$3f,m0 ; read function
eor.w r3,r3 ; stdin
trap #$21 ; call dos
rts.w
out: move.b r0,buf ; copy char in write buffer
out1: move.b #$40,m0 ; write function
move.w #1,r3 ; stdout
trap #$21 ; call dos
rts.w
hex2bin:dec.w r6 ; decr. number of chars left
move.b (r5.w),m0 ; get next char
inc.w r5 ; incr pointer to next char
or.b #$20,m0 ; convert to lower case (A-F)
sub.b #'a'-10,m0 ; convert ascii to bin
bpl.b _10 ; all done if a-f
add.b #'a'-10-'0',m0 ; correct if 0-9
_10: lsl.b #4,r0 ; shift last nibble
add.b m0,r0 ; add new nibble
rts.w
buf: ; write buffer
file: /Techref/dos/echadd_mac.htm, 7KB, , updated: 2004/5/20 15:44, local time: 2024/11/16 03:51,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/techref/dos/echadd_mac.htm"> echadd.mac</A> |
Did you find what you needed?
|