changeset 747:27033c1dd023

Moved os9p3 and os9p4 to OS-9 Level Two distribution
author boisy
date Wed, 08 Jan 2003 03:40:21 +0000
parents b2d917ea47fc
children d876b4806c66
files level2/modules/krnp3_perr.asm level2/modules/krnp4_regdump.asm level2/modules/makefile
diffstat 3 files changed, 646 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/krnp3_perr.asm	Wed Jan 08 03:40:21 2003 +0000
@@ -0,0 +1,320 @@
+********************************************************************
+* OS9p3 - Printerr functionality for Level II
+*
+* $Id$
+*
+*    Peter E. Durham
+*    The New Wentworth Timesharing System
+*    summer: 6 Twin Brook Circle        school: Quincy House D-24
+*            Andover, MA 01810                  58 Plympton St.
+*            (617) 475-4243                     Cambridge, MA 02138
+*                                               (617) 498-3209
+*    cis:    73177,1215                 delphi: PEDXING
+*    unix:   harvard!husc4!durham_2     intnet: durham_2@husc4.harvard.edu 
+*
+*  COPYRIGHT (C) 1987 by Peter Durham
+*    Permission is given to all members of the OS-9 community to use,
+*    modify, and share this program for their personal enjoyment.
+*    Commercial use of this program, which was written for fun to share with
+*    the community, is prohibited without the consent of the author.
+*    Please share any extensions or modifications with the author, who
+*    would be interested in hearing about them.
+*
+*  NOTE
+*    Quick poll... how does the above sound as a copyright notice?  Clearly,
+*    authors like to share their work while maintaining some control on it.
+*    And it doesn't seem fair for someone else to make $ from something
+*    someone else made for fun.  I think the above conditions are what most
+*    people want.  Let me know what you think.
+*
+*  NOTE
+*    The inspiration for this utility was the os9p3 example in
+*    the Tandy Level II manual.  Tandy deserves praise for
+*    including examples such as this one in their manuals.
+*
+*  NOTE
+*    There is something funny about OS9p3 modules... some versions
+*    are not liked, others are.  When developing this module, often
+*    a version would fail... but if I added a "leas 0,s" right before
+*    the "rts" in PrinBuf, it would work!  Probably the location and
+*    operation are not significant.  This version here has never failed
+*    to boot on my system; however, if it does on yours (or you change
+*    it), try putting such things in.
+*
+*  NOTE
+*    For those people who just can't have enough... OS9p3 will look for
+*    a module called OS9p4, and link to it, and execute it.  Thanks to
+*    Kev for this idea.  Now we can keep additions to the kernel in nice
+*    separate chunks.  (How long 'til OS9p11 comes around...?)
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*   1    First release                                  PED 87/06/23
+         nam   OS9p3
+         ttl   Printerr functionality for Level II
+
+         ifp1
+         use   defsfile
+         endc  
+
+type     set   Systm      ;System module, 6809 object code
+revs     set   ReEnt+1    ;Sharable, first revision
+edition  set   1
+
+         mod   eom,name,type,revs,entry,256
+
+name     fcs   "OS9p3"
+         fcb   edition
+
+*+
+*  Initialization routine and table
+*-
+Entry    equ   *
+         leay  SvcTbl,pcr ;Get address of table
+         os9   F$SSvc     ;Install services in table
+         lda   #Type      ;Get system module type for OS9p4
+         leax  P4Name,pcr ;Get name for OS9p4
+         os9   F$Link     ;Try to link to it
+         bcs   Exit       ;If not found, exit
+         jsr   ,y         ;Go execute it!
+Exit     rts              ;Return to os9p2
+
+SvcTbl   equ   *
+         fcb   F$PErr     ;System call number
+         fdb   PErr-*-2   ;Offset to code
+         fcb   $80        ;End of table
+
+*+
+*  The new F$Perr service call
+*-
+*+
+*  Data (in user space!)
+*-
+BufLen   equ   80
+Buf      rmb   BufLen
+HunDig   equ   Buf+7
+TenDig   equ   Buf+8
+OneDig   equ   Buf+9
+DataMem  equ   .
+
+*+
+*  FUNCTION     PErr
+*  PURPOSE      Top level routine
+*  REGISTERS    B = Error code (after Setup)
+*               U = User memory area (after Setup)
+*               Y = User process descriptor (after Setup)
+*               A = Error file path number (after OpenFil)
+*               X = Pointer to strings
+*-
+PErr     equ   *
+         bsr   Setup      ;Go set up registers
+         leax  ErrMsg,pcr ;Get pointer to "Error #000"
+         bsr   MoveBuf    ;Go copy it over
+         bsr   WritNum    ;Go copy the number into it
+         lbsr  PrinMsg    ;Go print the message
+         bcs   PErrBye    ;If error, abort
+         leax  FilNam,pcr ;Get pointer to "/dd/sys/errmsg"
+         bsr   MoveBuf    ;Go copy it over
+         lbsr  OpenFil    ;Go open the file
+         bcs   PErrBye    ;If error, abort
+Loop     lbsr  RdBuf      ;Go read a line from the file
+         bcs   Error      ;If error, print CR, and abort
+         pshs  b          ;Save error code
+         pshs  b          ;Save error code again for compare
+         bsr   CalcNum    ;What number is on this line?
+         cmpb  ,s+        ;Is this line the right line?
+         puls  b          ;Restore error code
+         bne   Loop       ;If not right line, loop again
+         lbsr  PrinBuf    ;If right line, write line out
+         bra   Close      ;Done, so close the file
+Error    lbsr  DoCR       ;Go print a carriage return
+Close    lbsr  ClosFil    ;Go close the file
+PErrBye  rts              ;Return from system call
+
+*+
+*  FUNCTION     SetUp
+*  PURPOSE      Sets up registers
+*  GIVES        B = Error code
+*               U = Pointer to data memory on user stack in user space
+*               Y = Pointer to user process descriptor in system space
+*-
+SetUp    equ   *
+         ldb   R$B,u      ;Get error code
+         ldy   D.Proc     ;Get user's process descriptor
+         ldu   P$SP,y     ;Get user's stack pointer
+         leau  -DataMem,u ;Reserve a little space
+         rts   
+
+*+
+*  FUNCTION     MoveBuf
+*  PURPOSE      Copies string to user space
+*  TAKES        X = location of string in system space
+*-
+MoveBuf  equ   *
+         pshs  u,y,d      ;Save registers
+         lda   D.SysTsk   ;Get system process task number
+         ldb   P$Task,y   ;Get user process task number
+         leau  Buf,u      ;Get pointer to destination buffer
+         ldy   #BufLen    ;Copy BufLen characters over (extras, oh well)
+         os9   F$Move     ;Move string to user space
+         puls  d,y,u,pc   ;Restore registers and return
+
+*+
+*  FUNCTION     WriteNum
+*  PURPOSE      Puts the ASCII value of the error code in user space
+*  TAKES        B = error code
+*-
+WritNum  equ   *
+         pshs  x,d        ;Save registers
+         clra             ;Start A as 0
+Huns     cmpb  #100       ;Is B >= 100?
+         blo   HunDone    ;If not, go do Tens
+         inca             ;Increment hundreds digit
+         subb  #100       ;Subtract 100 from B
+         bra   Huns       ;Go do again
+HunDone  leax  HunDig,u   ;Where to put digit
+         bsr   WritDig    ;Go put it there
+         clra             ;Start A again as 0
+Tens     cmpb  #10        ;Is B >= 10?
+         blo   TenDone    ;If not, go do Ones
+         inca             ;Increment hundreds digit
+         subb  #10        ;Subtract 10 from B
+         bra   Tens       ;Go do again
+TenDone  leax  TenDig,u   ;Where to put digit
+         bsr   WritDig    ;Go put it there
+         tfr   b,a        ;Get ones digit
+         leax  OneDig,u   ;Where to put digit
+         bsr   WritDig    ;Go put it there
+         puls  d,x,pc     ;Restore registers and return
+
+*+
+*  FUNCTION     WritDig
+*  PURPOSE      Copy digit into user space
+*  TAKES        A = digit to copy (not in ASCII yet)
+*               X = where to put digit
+*-
+WritDig  equ   *
+         pshs  d          ;Save registers
+         adda  #'0        ;Convert A to ASCII
+         ldb   P$Task,y   ;Get task number
+         os9   F$StABX    ;Write that digit to user space
+         puls  d,pc       ;Restore registers and return
+
+*+
+*  FUNCTION     CalcNum
+*  PURPOSE      Converts ASCII number in user space to binary
+*  TAKES        Buf (in user space) = ASCII number
+*  GIVES        B = number converted
+*               X = points to first nonnumeric character
+*-
+CalcNum  equ   *
+         pshs  a          ;Save register
+         leax  Buf,u      ;Get pointer to buffer
+         clrb             ;Set accumulator to zero
+NextDig  bsr   LoadDig    ;Get digit from user space
+         suba  #'0        ;Convert to binary; is it less than zero?
+         bmi   CalcBye    ;If so, return
+         cmpa  #9         ;Is the digit more than nine?
+         bhi   CalcBye    ;If so, return
+         pshs  a          ;Save the digit while we multiply
+         lda   #10        ;Multiply current number by 10
+         mul              ;Do it
+         addb  ,s+        ;Add new digit to number
+         leax  1,x        ;Advance X to next digit
+         bra   NextDig    ;Go get the next digit
+CalcBye  puls  a,pc       ;Restore register and return
+
+*+
+*  FUNCTION     LoadDig
+*  PURPOSE      Get digit from user space
+*  TAKES        X = pointer to digit in user space
+*  GIVES        A = digit in user space
+*-
+LoadDig  equ   *
+         pshs  b          ;Save register
+         ldb   P$Task,y   ;Get user process task number
+         os9   F$LdABX    ;Get digit
+         puls  b,pc       ;Restore register and return
+
+*+
+*  FUNCTION     PrinMsg
+*  PURPOSE      Prints out the Error #xxx message
+*-
+PrinMsg  equ   *
+         pshs  y,x,a      ;Save registers
+         lda   P$Path+2,y ;Get StdErr path number
+         leax  Buf,u      ;Get pointer to message
+         ldy   #ErrLen    ;Maximum ErrLen characters to print
+         os9   I$Write    ;Write out error message
+         puls  a,x,y,pc   ;Restore registers and return
+
+*+
+*  FUNCTION     DoCR
+*  PURPOSE      Prints a carriage return
+*-
+DoCR     equ   *
+         pshs  x,d        ;Save registers
+         ldb   P$Task,y   ;Get user task number
+         lda   #$0D       ;Load A with a CR
+         leax  Buf,u      ;Get pointer to buffer
+         os9   F$StABX    ;Move the CR to the buffer
+         bsr   PrinBuf    ;Go print it
+         puls  d,x,pc     ;Restore registers and return
+
+*+
+*  FUNCTION     PrinBuf
+*  PURPOSE      Prints out the string from user space
+*  TAKES        X (in user space) = String to print
+*-
+PrinBuf  equ   *
+         pshs  y,a        ;Save registers
+         lda   P$Path+2,y ;Get StdErr path number
+         ldy   #BufLen    ;Maximum BufLen characters to print
+         os9   I$WritLn   ;Write out message
+         puls  a,y,pc     ;Restore registers and return
+
+*+
+*  FUNCTION     RdBuf
+*  PURPOSE      Reads in a string from file to user space
+*  TAKES        A = path number
+*  GIVES        Buf (in user space) = String read in
+*-
+RdBuf    equ   *
+         pshs  y,x        ;Save registers
+         leax  Buf,u      ;Get pointer to buffer
+         ldy   #BufLen    ;Maximum BufLen characters to read
+         os9   I$ReadLn   ;Read in line from file
+         puls  x,y,pc     ;Restore registers and return
+
+*+
+*  FUNCTION     OpenFil
+*  PURPOSE      Open path to error message file
+*  TAKES        Buf (in user space) = name of file
+*  GIVES        A = Path number
+*-
+OpenFil  equ   *
+         pshs  x          ;Save register
+         lda   #READ.     ;Open path for read access
+         leax  Buf,u      ;Get pointer to string
+         os9   I$Open     ;Open path
+         puls  x,pc       ;Restore registers and return A
+
+*+
+*  FUNCTION     ClosFil
+*  PURPOSE      Close path to error message file
+*  TAKES        A = Path number
+*-
+ClosFil  equ   *
+         os9   I$Close    ;Close file
+         rts              ;Return
+P4Name   fcc   "OS9p4"
+         fcb   $D
+ErrMsg   fcc   "Error #000"
+ErrLen   equ   *-ErrMsg
+FilNam   fcc   "/dd/sys/errmsg"
+         fcb   $D
+FilLen   equ   *-FilNam
+
+         emod  
+eom      equ   *
+         end   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/krnp4_regdump.asm	Wed Jan 08 03:40:21 2003 +0000
@@ -0,0 +1,325 @@
+********************************************************************
+* OS9p4 - User Register Dump System Call for OS9 Level Two
+*
+* $Id$
+*
+* Copyright February,1989 by Ron Lammardo
+*
+* This system call can be used in an application program to dump the
+* current contents of all user registers in Hex,Decimal,Binary and Ascii 
+* (Registers "A" and "B" Only). This module MUST be present in the
+* bootfile. If no OS9P3 module is found,change the "mname" and "nextname"
+* as appropriate.
+*
+* If there is a conflict with the code used for this system called, it can
+* be changed by resetting the equate at "F$RegDmp"
+*
+* NOTE: All registers EXCEPT 'CC' are preserved....OS9 internally resets
+*       the condition code register upon service call exit.
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*   1    Started                                        RL  89/02/??
+
+         nam   os9p4 
+         ttl   User Register Dump System Call for OS9 Level Two
+
+         ifp1  
+         use   defsfile
+         endc  
+
+tylg     set   systm+objct
+atrv     set   reent+revision
+revision set   1
+edition  set   1
+
+         mod   eom,name,tylg,atrv,start,0
+
+name     fcs   /OS9p4/    name of this module
+         fcb   edition
+
+svctabl  fcb   F$RegDmp   F$RegDmp code
+         fdb   regdmp-*-2 offset to actual code
+         fcb   $80        end of table
+
+start    leay  <svctabl,pcr point to service table
+         os9   F$SSvc     insert the new op code in the table
+         lda   #tylg      get next module type (same as this one!)
+         leax  <nextname,pcr get address of next module name
+         os9   F$Link     attempt to link to it
+         bcs   endsetup   no good...skip this
+         jsr   ,y         else go execute it
+endsetup rts              return back to previous module
+
+nextname fcc   /OS9P5/    next module name to link to
+         fcb   $0d
+
+regdmp   equ   *
+         IFNE  H6309
+         pshs  cc,a,b,e,f,dp,x,y,u save all registers
+         ELSE
+         pshs  cc,a,b,dp,x,y,u save all registers
+         ENDC
+         tfr   u,y        transfer addresses
+         leas  -60,s      back up for some variable storage
+         leau  4,s        buffer starts here
+         clr   ,u+        set flag to print ascii char
+         lda   #$20       get a space
+         ldb   #50        number of chars to clear
+         tfr   u,x        set register for loop
+
+clrloop  sta   ,x+        initialize a space
+         decb             decrement counter
+         bne   clrloop    if more..loop back & clear another
+         lbsr  reg060     send a <cr>
+         leax  reg080,pcr point to start of control table
+         clra             clear msb of register
+         ldb   R$A,y      get register from stack
+         bsr   reg000     dump register A
+         ldb   R$B,y      get register from stack
+         bsr   reg000     dump register B
+         IFNE  H6309
+         ldb   R$E,y      get register from stack
+         bsr   reg000     dump register E
+         ldb   R$F,y      get register from stack
+         bsr   reg000     dump register F
+         ENDC
+         inc   -1,u       turn off ascii char print flag
+         ldd   R$X,y      get register from stack
+         bsr   reg000     dump register X
+         ldd   R$Y,y      get register from stack
+         bsr   reg000     dump regisetr Y
+         ldd   R$U,y      get register from stack
+         bsr   reg000     dump register U
+         ldb   R$CC,y     get register from stack
+         bsr   reg000     dump register CC
+         ldb   R$DP,y     get register from stack
+         bsr   reg000     dump register DP
+         ldd   R$PC,y     get user Task Number
+         bsr   reg000     dump register PC
+         ldy   <D.Proc    get address of users process descriptor
+         ldd   P$SP,y     get users stack address
+         IFNE  H6309
+         addd  #14        add on for registers which were saved
+         ELSE
+         addd  #12        add on for registers which were saved
+         ENDC
+         bsr   reg000     dump register S
+         lbsr  reg060     send a <CR>
+         leas  60,s       restore stack pointer
+         IFNE  H6309
+         puls  cc,a,b,e,f,dp,x,y,u,pc restore all registers and return
+         ELSE
+         puls  cc,a,b,dp,x,y,u,pc restore all registers and return
+         ENDC
+
+* Dump a register in "D"
+* X = Control Table Location
+* U = Output buffer Location
+
+reg000   pshs  y          save y register
+         tfr   d,y        register in y
+         lda   ,x         # of bytes
+         leax  3,x        point past table entry
+         pshs  a,x,y,u    save registers
+         ldd   -2,x       get register name
+         std   ,u++       move to buffer
+         ldd   #"=$       get chars
+         std   ,u++       move to buffer
+         ldd   3,s        get reg
+         lbsr  gethex     convert to hex
+         tst   0,s        1 byte ?
+         bne   reg010     no...skip this
+         ldd   2,u        get 2 lsb's
+         std   ,u         store in msb's
+         ldd   #$2020     get two blanks
+         std   2,u        store in lsb's
+
+reg010   ldd   #$2023     get a space and  "#"
+         std   4,u        move in two spaces
+         leau  6,u        point to start of decimal output buffer
+         ldd   3,s        get register
+         lbsr  getdec     convert to decimal
+         tst   0,s        is it one byte
+         bne   reg020     no..skip this
+         ldd   2,u        else get third & fourth chars
+         std   ,u         store as first two
+         lda   4,u        get fifth char
+         sta   2,u        store as third
+         ldd   #$2020     get two spaces
+         std   3,u        store as 4th & 5th chars
+
+reg020   ldd   #$2025     get a blank & "%"
+         std   5,u        move it to buffer
+         leau  7,u        point to start of binary output area
+         tfr   a,b        space in 'b'
+         std   16,u       space out ascii char
+         ldd   3,s        get register
+         bsr   getbin     convert to binary
+         tst   0,s        check byte count
+         bne   reg040     skip if two bytes
+         ldb   #8         loop counter
+
+reg030   lda   8,u        get two chars from second 8 digits
+         sta   ,u+        store in first 8 digits
+         lda   #$20       get two blanks
+         sta   7,u        store in second 8 digits
+         decb             decrement counter
+         bne   reg030     loop back if not done
+         leau  -8,u       back up to beginning of binary digit output
+         ldb   4,s        get lsb of register
+         tst   -18,u      check if we want to print ascii char
+         bne   reg040     nope..skip this
+         cmpb  #$20       compare char with space
+         blo   reg040     if lower..skip this
+         cmpb  #'z        compare with last alpha char
+         bhi   reg040     if higher..skip this
+         stb   17,u       else store the char
+
+reg040   lda   #C$CR      get a <cr>
+         sta   18,u       and store it
+         leax  -17,u      back up to buffer start
+         bsr   reg070     send it
+         clra             clear msb for next reg
+         puls  b,x,y,u    restore registers
+         puls  y,pc       restore y & return
+
+reg050   fcb   $0d
+
+reg060   leax  <reg050,pcr point to <cr>
+
+reg070   pshs  x,y,u,a,b  save registers
+         ldy   <D.Proc    get process descriptor address
+         lda   P$Path+2,y get user error path number
+         pshs  a          save it
+         ldu   P$SP,y     get user stack address
+         leau  -50,u      back off to make room
+         lda   <D.SysTsk  get system task number
+         ldb   P$Task,y   get users task number
+         ldy   #40        chars to move
+         os9   F$Move     move from system to user space
+         tfr   u,x        restore buffer address
+         puls  a          restore user error path number
+         os9   I$WritLn   send it
+         puls  x,y,u,a,b,pc restore registers & return
+
+* Control  Table - Format is :
+*      Byte count    (0=1,1=2)
+*      Register name (Two chars)
+
+reg080   fcb   0
+         fcc   /a /
+         fcb   0
+         fcc   /b /
+         IFNE  H6309
+         fcb   0
+         fcc   /e /
+         fcb   0
+         fcc   /f /
+         ENDC
+         fcb   1
+         fcc   /x /
+         fcb   1
+         fcc   /y /
+         fcb   1
+         fcc   /u /
+         fcb   0
+         fcc   /cc/
+         fcb   0
+         fcc   /dp/
+         fcb   1
+         fcc   /pc/
+         fcb   1
+         fcc   /s /
+
+
+* Convert "D" to binary digits in buffer "U"
+
+getbin   pshs  u,b        save 'u', second byte of register
+         bsr   bin010     convert first byte
+         puls  a          get second byte
+         bsr   bin010     convert it
+         puls  u,pc       restore 'u' and return
+
+bin010   bita  #%10000000 check bit
+         bsr   bin020     print result
+         bita  #%01000000
+         bsr   bin020
+         bita  #%00100000
+         bsr   bin020
+         bita  #%00010000
+         bsr   bin020
+         bita  #%00001000
+         bsr   bin020
+         bita  #%00000100
+         bsr   bin020
+         bita  #%00000010
+         bsr   bin020
+         bita  #%00000001
+
+bin020   beq   bin030     skip this if bit was set
+         ldb   #'1        else get an ascii '1'
+         bra   bin040     skip next
+
+bin030   ldb   #'0        bit not set...get an ascii '0'
+
+bin040   stb   ,u+        store the ascii char
+         rts   
+
+* Convert "D" to 4 hex digits in buffer "U"
+
+gethex   pshs  u,b        save 'u',second register byte
+         bsr   gth010     convert first byte
+         puls  a          restore second byte
+         bsr   gth010     convert it
+         puls  u,pc       restore 'u' and return
+
+gth010   pshs  a          save the byte
+         lsra             shift left 4 bits to right
+         lsra  
+         lsra  
+         lsra  
+         bsr   gth020     convert to hex digit
+         puls  a          restore the byte
+         anda  #$0f       strip off high 4 digits
+
+gth020   adda  #'0        make it ascii
+         cmpa  #$3a       is it a letter
+         blt   gth030     nope..skip this
+         adda  #7         else add bias
+
+gth030   sta   ,u+        store the ascii character
+         rts              return
+
+* Convert "D" to 5 decimal digits in buffer at "U"
+getdec   pshs  x,y,u      save registers
+         ldx   #10000     get decimal number for subtraction
+         bsr   gtd010     get the decimal digit
+         ldx   #01000
+         bsr   gtd010
+         ldx   #00100
+         bsr   gtd010
+         ldx   #00010
+         bsr   gtd010
+         ldx   #00001
+         bsr   gtd010
+         puls  x,y,u,pc   restore registers & return
+
+gtd010   pshs  x,a        save x register & extra byte
+         clr   ,s         clear counter
+
+gtd020   cmpd  1,s        compare 'd' with 'x' on stack
+         blo   gtd030     less...skip this
+         subd  1,s        else subtract number on stack
+         inc   ,s         increment digit counter
+         bra   gtd020     and loop back
+
+gtd030   std   1,s        save remainder of number
+         ldb   ,s+        get counter
+         addb  #$30       make it ascii
+         stb   ,u+        and move it as output
+         puls  d,pc       restore remainder & return
+
+         emod  
+eom      equ   *
+         end   
--- a/level2/modules/makefile	Tue Jan 07 04:10:24 2003 +0000
+++ b/level2/modules/makefile	Wed Jan 08 03:40:21 2003 +0000
@@ -17,7 +17,7 @@
 OS9P2		= os9p2
 REL		= rel
 ROMMODS         = rominfo rom_vectors cc3go_rom pakrom
-SYSMODS		= ioman init cc3go
+SYSMODS		= ioman init cc3go os9p3_perr os9p4_regdump
 CLOCKS          = clock_elim clock_disto2 clock_disto4 clock_bnb \
 		clock_smart clock_harris clock_tc3 clock_soft
 FMGRS		= scf.mn rbf.mn pipeman.mn pipeman_named.mn