Mercurial > hg > Members > kono > nitros9-code
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