view os9/level2/cmds/cat.asm @ 169:c9dc1be48de4

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 11 Apr 2019 14:09:32 +0900
parents 5aeff8abca9c
children
line wrap: on
line source

*******************************************************************2
* sbc09 emulator * * $Id$ * * Edt/Rev YYYY/MM/DD Modified by
* Comment 
* ------------------------------------------------------------------ 
* 1 2018/08/20 S. Kono * on os9 lv2 

         nam   Cat
         ttl   echo test

         ifp1
         use   defsfile
         endc

* Module header definitions
tylg     set   Prgrm+Objct   
atrv     set   ReEnt+rev
rev      set   $00
edition  set   1

         mod   eom,name,tylg,atrv,start,size

         org   0
ientry  rmb   $80
filepath rmb   2
parmptr  rmb   2
stdin    rmb   1
chksum   rmb   1
bcount   rmb   1
adr      rmb   2
work     rmb   2
readbuff rmb   $100
         org   $400
size     equ   .

name    fcs   /Cat/
        fcb   edition

start   clr         <stdin
        stx         <parmptr         save parameter pointer
        stu         <work            save parameter pointer
        bsr         catloop
        lbsr         noecho
        bsr         catloop
        lbsr         setecho
        bsr         catloop
        ldb         #10
        ldx         <work
        leax        readbuff
        bsr         getline
        clrb
        os9         F$Exit

catloop bsr         getchar
        bsr         putchar
        cmpb        #C$CR
        bne         catloop
        bra         putcr

putchar                        * Output one character in B register.
        PSHS        X,Y
        BRA         OUTCH1
getchar                        * Input one character into B register.
        PSHS        A,B,X,Y
GETCH0
        LDA         #0
        LEAX        1,S
        LDY         #1
        OS9         I$Read
        BCS         GETCH0
        PULS        A,B,X,Y,PC
putcr                          * Output a newline.
        LDB         #C$CR
        bsr         putchar
        LDB         #C$LF
        PSHS        X,Y
OUTCH1  PSHS        A,B
        LEAX        1,S
        LDA         #1
        LDY         #1
        OS9         I$Write
        PULS        A,B,X,Y,PC
getpoll
        PSHS        X,Y,D
        LDA         #0
        LDB         #SS.Ready
        OS9         I$GetStt
        CMPB        #$F6       Not Ready
        BNE         RSENSE
        CLRB
        PULS        X,Y,D,PC
RSENSE
        ORCC        #1        set carry to indicate ready
RNSENSE
        PULS        X,Y,D,PC

getline                        * Input line at address in X, length in B.
        PSHS        A,B,X,Y
GETLN0
        CLRA
        TFR         D,Y
        LDA         <stdin
        OS9         I$ReadLn
        BCS         GETLN0
        LEAY        -1,Y
        TFR         Y,D
*        LDA         D,X
*        CMPA        #C$CR
*        BNE         GETLN1
*        LEAY        -1,Y
GETLN1  STY         ,S
        PULS        A,B,X,Y,PC
putline                        * Output string at address in X, length in B.
        PSHS        A,B,X,Y
        CLRA
        TFR         D,Y
        LDA         <stdin
        OS9         I$WritLn
        PULS        A,B,X,Y,PC

setecho lda          #1
        bra          sss
noecho  clra
sss      pshs         a
        sta          ,s
        LDA         <stdin
        ldb          #SS.Opt
        LDX         <work
        leax        readbuff,X
        OS9         I$GetStt
        bcs         err2
        LDA         ,s
        STA         PD.EKO-PD.OPT,X
setopts
        ldb         #SS.Opt         
        lda         <stdin
        OS9         I$SetStt
err2
        puls        a,pc

delay   PSHS        D,X  * address **$21** 
                         * On input the D register contains the number of timer 
                         * ticks to wait. Each timer tick is 20ms
        TFR         D,X
        OS9         F$Sleep
        PULS        D,X,PC



         emod
eom      equ   *
         end