Mercurial > hg > Members > kono > nitros9-code
diff 3rdparty/p2mods/os9p3_perr.asm @ 0:6641a883d6b0
Initial revision
author | boisy |
---|---|
date | Thu, 04 Apr 2002 16:34:12 +0000 |
parents | |
children | 1f8438c88938 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/p2mods/os9p3_perr.asm Thu Apr 04 16:34:12 2002 +0000 @@ -0,0 +1,318 @@ +*+ +* O S 9 p 3 . a +* -- printerr functionality for Level II +* +* AUTHOR +* 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 +* +* VERSION +* 01.00.00 (PED) 87/06/23 -- First release +* +* 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...?) +*- + nam OS9p3 + ttl Printerr functionality for Level II + opt w79 +*+ +* C o n s t a n t s +* (so we don't need a level II DEFS file) +*- +*+ +* Service calls +*- + + +Level equ 2 + + ifp1 + use os9defs + endc +*+ +* C o d e +*- +*+ +* Module header +*- +Type set Systm ;System module, 6809 object code +Revs set Reent+1 ;Sharable, first revision +edition set 1 + + mod OS9End,OS9Name,Type,Revs,Entry,256 +OS9Name fcs "OS9p3" ;Name + 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 +OS9End equ * + end