Mercurial > hg > Members > kono > nitros9-code
view level2/modules/krnp3_perr.asm @ 2758:e4a0f58a5f9b
Found that people who do not have the envirornment variable NITROS9DIR set before building the project get a error missing file "/rules.mak". Found this is caused do to the fact that the code to set this envirornment variable is in the rules.mak which can't get loaded.
To fix this the code needed to set the envirornment variable that is in the rules.mak is now in the makefile(s) right before the include for the rules.mak file. This should fix the problem for those who do not have the NITROS9DIR envirornment variable preset.
author | drencor-xeen |
---|---|
date | Mon, 14 Jan 2013 14:37:46 -0600 |
parents | 949d4df97cca |
children | 00dc1ef6a7aa |
line wrap: on
line source
******************************************************************** * krnp3 - Printerr functionality for Level 2 * * $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 2 manual. Tandy deserves praise for * including examples such as this one in their manuals. * * NOTE * There is something funny about KrnP3 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... KrnP3 will look for * a module called KrnP4, 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 KrnP11 comes around...?) * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 1 1987/06/23 Peter E. Durham * First release. nam krnp3 ttl Printerr functionality for Level 2 ifp1 use defsfile endc type set Systm ;System module, 6809 object code revs set 0 ; edition set 1 mod eom,name,type,ReEnt+revs,entry,256 name fcs "KrnP3" 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 KrnP4 leax P4Name,pcr ;Get name for KrnP4 os9 F$Link ;Try to link to it bcs Exit ;If not found, exit jsr ,y ;Go execute it! Exit rts ;Return to KrnP2 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 #C$CR ;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 "krnp4" fcb C$CR ErrMsg fcc "Error #000" ErrLen equ *-ErrMsg FilNam fcc "/dd/sys/errmsg" fcb C$CR FilLen equ *-FilNam emod eom equ * end