; 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