Mercurial > hg > Members > kono > nitros9-code
changeset 621:f5faeb8929ff
Added exmode utility
author | boisy |
---|---|
date | Tue, 03 Dec 2002 16:07:00 +0000 |
parents | be4e1a676e45 |
children | 18b0ab24a828 |
files | level2/cmds/exmode.asm level2/cmds/makefile |
diffstat | 2 files changed, 682 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/cmds/exmode.asm Tue Dec 03 16:07:00 2002 +0000 @@ -0,0 +1,681 @@ +******************************************************************** +* EXMode - Extended SCF device descriptor utility +* +* $Id$ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 1 Bruce Isted version released to PD BRI 89/06/21 + + nam EXMode + ttl Extended SCF device descriptor utility + + ifp1 + use defsfile + endc + +BuffSize equ 10 max. CHAR string length +Edtn equ 1 +MaxSize equ $80 maximum module size +NameSize equ 4 maximum module name length +Vrsn equ 1 + + org 0 +Count rmb 1 number of option bytes +DataPtr rmb 2 current option ptr +HexIn rmb 2 2 byte hex number +ModAddr rmb 2 module address +ModSize rmb 2 module size +OptEnd rmb 2 option table end offset +ParmPtr rmb 2 next name DataPtr +PathNmbr rmb 1 file path +TxtPtr rmb 2 option name ptr +Buffer rmb BuffSize miscellaneous output buffer +ModBuff rmb MaxSize module work copy buffer +stack rmb $0200 stack and parameter space +MemSize equ . + + mod Size,Name,Prgrm+Objct,ReEnt+Vrsn,Entry,MemSize + +Name fcs "EXMode" + fcb Edtn edition number + +OptTable + fcc " nam" option name + fcb Sign+M$Name,NameSize offset to string offset & max. byte count to change + fcc " mgr" + fcb Sign+M$FMgr,0 offset to string offset & no changes allowed + fcc " ddr" + fcb Sign+M$PDev,0 + fcc " hpn" + fcb M$Port,1 option offset & byte count + fcc " hpa" + fcb M$Port+1,2 + fcc " upc" + fcb IT.UPC,1 + fcc " bso" + fcb IT.BSO,1 + fcc " dlo" + fcb IT.DLO,1 + fcc " eko" + fcb IT.EKO,1 + fcc " alf" + fcb IT.ALF,1 + fcc " nul" + fcb IT.NUL,1 + fcc " pau" + fcb IT.PAU,1 + fcc " pag" + fcb IT.PAG,1 + fcc " bsp" + fcb IT.BSP,1 + fcc " del" + fcb IT.DEL,1 + fcc " eor" + fcb IT.EOR,1 + fcc " eof" + fcb IT.EOF,1 + fcc " rpr" + fcb IT.RPR,1 + fcc " dup" + fcb IT.DUP,1 + fcc " psc" + fcb IT.PSC,1 + fcc " int" + fcb IT.INT,1 + fcc " qut" + fcb IT.QUT,1 + fcc " bse" + fcb IT.BSE,1 + fcc " ovf" + fcb IT.OVF,1 + fcc " par" + fcb IT.PAR,1 + fcc " bau" + fcb IT.BAU,1 + fcc " xon" + fcb IT.XON,1 + fcc " xof" + fcb IT.XOFF,1 + fcc " col" + fcb IT.COL,1 + fcc " row" + fcb IT.ROW,1 + fcc " xtp" + fcb IT.XTYP,1 + fcc " wnd" + fcb IT.WND,1 + fcc " val" + fcb IT.VAL,1 + fcc " sty" + fcb IT.STY,1 + fcc " cpx" + fcb IT.CPX,1 + fcc " cpy" + fcb IT.CPY,1 + fcc " fgc" + fcb IT.FGC,1 + fcc " bgc" + fcb IT.BGC,1 + fcc " bdc" + fcb IT.BDC,1 +TablOpts equ (*-OptTable)/6 number of table entries + fcb $80 end of option table + +UseMsg + fcb C$LF + fcc "Usage: EXMode [/<device> || -<pathlist> || -?] [option] [option] [...]" + fcb C$LF,C$LF + fcc "Purpose: To report or alter current option settings of SCF device" + fcb C$LF + fcc " descriptors in memory or on disk in single module files." + fcb C$LF,C$LF + fcc "Options: nam, mgr, ddr, hpn, hpa, upc, bso, dlo, eko, alf, nul, pau," + fcb C$LF + fcc " pag, bsp, del, eor, eof, rpr, dup, psc, int, qut, bse, ovf," + fcb C$LF + fcc " par, bau, xon, xof, col, row, xtp, wnd, val, sty, cpx, cpy," + fcb C$LF + fcc " fgc, bgc, bdc" + fcb C$LF,C$LF + fcc "Examples: exmode /t2" + fcb C$LF + fcc " Prints the current option settings of the /T2 descriptor" + fcb C$LF + fcc " in memory." + fcb C$LF + fcc " exmode -modules/t4.dd nam=T2 bau=6 hpa=ff6c eof=1B" + fcb C$LF + fcc " Changes the module name in the MODULES/T4.dd file to T2," + fcb C$LF + fcc " sets the baud rate code to 6, the hardware port address" + fcb C$LF + fcc " to $FF6C, and the end of file character to $1B." + fcb C$LF + fcc " exmode -?" + fcb C$LF + fcc " Prints more complete information on all of the options." + fcb C$CR +UseLen equ *-UseMsg + +HelpMsg + fcb C$LF + fcc "The NAM option accepts only a legal OS-9 module name with a maximum of" + fcb C$LF + fcc "4 characters. It is up to the user to ensure that there is adequate" + fcb C$LF + fcc "room for the module name, and if required to rename the disk file to" + fcb C$LF + fcc "suit the new module name. The MGR and DDR options can't be changed." + fcb C$LF + fcc "All other options require hexadecimal numbers (0 through FFFF). XTP is" + fcb C$LF + fcc "for certain ACIA descriptors only. WND, VAL, STY, CPX, CPY, FGC, BGC," + fcb C$LF + fcc "and BDC are for window descriptors only." + fcb C$LF,C$LF + fcc "nam Device Name mgr File Manager Name ddr Device Driver Name" + fcb C$LF + fcc "hpn H'ware Page Number hpa H'ware Port Address upc Case Lock Flag" + fcb C$LF + fcc "bso Backspace Method dlo Delete Line Method eko Screen Echo Flag" + fcb C$LF + fcc "alf Auto Linefeed Flag nul End Of Line Nulls pau Page Pause Flag" + fcb C$LF + fcc "pag Page Length bsp Backspace Character del Delete Line Char" + fcb C$LF + fcc "eor End Of Record Char eof End Of File Char rpr Reprint Line Char" + fcb C$LF + fcc "dup Duplicate Line Char psc Pause Character int Interrupt Character" + fcb C$LF + fcc "qut Quit Character bse Backspace Echo Char ovf Overflow Character" + fcb C$LF + fcc "par Type (Parity) Code bau Baud Rate Code xon XON Character" + fcb C$LF + fcc "xof XOFF Character col Display Columns row Display Rows" + fcb C$LF + fcc "xtp Extended Type Code wnd Window Number val Valid Window Flag" + fcb C$LF + fcc "sty Window Screen Type cpx X Corner Position cpy Y Corner Position" + fcb C$LF + fcc "fgc Foreground Colour bgc Background Colour bdc Border Colour" + fcb C$CR +HelpLen equ *-HelpMsg + +Equal fcc "=" + +TypeMsg + fcb C$LF + fcc "Not an SCF descriptor!" +CR fcb C$CR +TypeLen equ *-TypeMsg + +Sizemsg + fcb C$LF + fcc "Module size out of range!" + fcb C$CR +Sizelen equ *-Sizemsg + +SynMsg + fcb C$LF + fcc "Syntax error: " +SynLen equ *-SynMsg + +**************** +* miscellaneous error and help routines + +MuchHelp + leax HelpMsg,pc + ldy #HelpLen + bra Helpprnt + +BadSize + leax Sizemsg,pc + ldy #Sizelen + bra AddHelp + +BadType + leax TypeMsg,pc + ldy #TypeLen +AddHelp + lda #2 + os9 I$WritLn +Help + leax UseMsg,pc + ldy #UseLen +Helpprnt + lda #2 + os9 I$WritLn + lbra OkayEnd2 + +**************** +Entry + ldd #0 + std <ModAddr zero mod flag + sta <PathNmbr zero file flag + ldd ,x+ check for device name + cmpa #'- file option? + bne Link + cmpb #'? help option? + beq MuchHelp +* Use Filename to Get Desc: + lda #Updat. open path to module file + os9 I$Open + bcs Help + stx <ParmPtr + sta <PathNmbr save path number + ldy #MaxSize max size + leax ModBuff,u module buff + os9 I$Read get it + lbcs Error + ldb M$Opt,x + clra [D] = option table size + addd #M$DTyp add options start offset + std <OptEnd save options end offset + ldd M$Size,x get module size + cmpd #MaxSize module size OK? + bhi BadSize no, go return error... + std <ModSize + bra GotIt + +Link + cmpa #'/ else must be /<devicename> + bne Help + pshs u + lda #Devic + os9 F$Link link to module + bcs Help + stx <ParmPtr update after name + tfr u,x + puls u + stx <ModAddr + ldb M$Opt,x + clra [D] = option table size + addd #M$DTyp add options start offset + std <OptEnd save options end offset + ldd M$Size,x get module size + cmpd #MaxSize module size OK? + lbhi BadSize no, go report error... + std <ModSize + tfr d,y copy module size... + pshs u save data area pointer + leau ModBuff,u + +GetModLp + lda ,x+ + sta ,u+ + leay -1,y + bne GetModLp + puls u recover data area pointer + +GotIt + ldd <OptEnd get option table end offset + cmpd <ModSize is option table size OK? + lbhs BadSize no, go report error... + leax ModBuff,u + lda M$DTyp,x get device type + lbne BadType SCF = $00 + ldx <ParmPtr point to input parms + lbsr SkipSpac go skip leading spaces... + cmpa #C$CR no options? + lbeq Info ..yes, give info + leax -1,x + +**************** +* X=ParmPtr +* Find and Set Options: + +FindLp10 + lbsr SkipSpac get next input param + stx <ParmPtr save for syntax error use + cmpa #C$CR end? + lbeq Verify ..yes, update module CRC + leay OptTable-6,pc ready option table ptr + pshs u + ldu ,x++ get next two chars + ora #$20 convert 1st param char to lower case + exg d,u move [U] where we can convert param chars + ora #$20 convert 2nd param char... + orb #$20 convert 3rd... + exg d,u move back again + +FindLp20 + leay 6,y next option entry + tst ,y last entry? + bmi Syntax ..yes, bad option + cmpa 1,y + bne FindLp20 same name? + cmpu 2,y + bne FindLp20 ..no, loop +* Found Option + puls u + sty <TxtPtr + ldd ,x+ must be followed by "=", leave [X] pointing at char after "=" + cmpa #'= + bne Syntax + cmpb #C$CR rest of option missing? + beq Syntax yes, go report error + cmpb #C$SPAC rest of option missing? + beq Syntax yes, go report error + ldb 5,y get # of bytes + beq Syntax 0 bytes, not allowed to change this option + stb <Count + ldb 4,y get option offset or offset to option offset + bpl NumOpt option offset, go set hexadecimal option +* Get CHAR input and set option: + andb #^Sign clear sign bit of offset to string offset + clra [D] = offset to string offset within module + cmpd <ModSize is it OK? + bhs Syntax no, go report error... + leay ModBuff,u point to module + ldd b,y get offset to string + cmpd <ModSize is it OK? + bhs Syntax no, go report error... + leay d,y point to option + pshs y save option pointer + os9 F$PrsNam valid OS-9 name? + puls y recover option pointer (end of name pointer lost) + bcs Syntax no, go report error + cmpa #C$SPAC space delimiter char? + beq ChkLen yes, go check name length... + cmpa #C$CR <CR> delimiter char? + bne Syntax no, go report error + +ChkLen + cmpb <Count name length OK? + bhi Syntax no, go report error... + +SetChrLp + lda ,x+ get character + sta ,y+ save it to module copy + decb done yet? + bne SetChrLp no, go copy another char... + lda -1,y get last char + ora #Sign set sign bit + sta -1,y save last char + lbra FindLp10 go do next... + +* Syntax Error: +Syntax + leax SynMsg,pc + ldy #SynLen + lda #2 + os9 I$Write + ldx <ParmPtr + leax -1,x + pshs x + ldy #0 + +CntLoop + leay 1,y + lda ,x+ + cmpa #C$CR + beq SynSay + cmpa #C$SPAC + bne CntLoop + +SynSay + puls x + lda #2 + os9 I$Write output err + lbra OkayEnd + +* Get Hex Input and Set Option: +NumOpt + clra [D] = option offset within module + cmpd <OptEnd is it OK? + bhs Syntax no, go report error... + clr <HexIn zero hex input bytes + clr <HexIn+1 + +SetNumLp + lda ,x+ get next # + cmpa #C$SPAC end of number? + beq SetNum2 ..yes, set option + cmpa #C$CR end of line? + beq SetNum1 ..yes, set option +* Convert ASCII Hex-->Byte: + suba #$30 make number from ASCII + bmi Syntax + cmpa #10 is it number? + bcs Num + anda #$5F make uppercase + suba #$11-$0A make hex $A-$F + cmpa #$0A + bcs Syntax + cmpa #$10 not hex char? + bcc Syntax + +Num + ldb #16 fancy asl *4 + mul + pshs b save top 4 bits + ldd <HexIn + rol ,s + rolb + rola + rol ,s + rolb + rola + rol ,s + rolb + rola + rol ,s + rolb + rola + std <HexIn + puls b drop temp + bra SetNumLp ..loop + +SetNum1 + leax -1,x reset so can find <CR> + +SetNum2 + ldb 4,y get option offset + leay ModBuff,u point to module + leay b,y point to option + ldd <HexIn pick up hex input + dec <Count + beq SetOne + std ,y set two byte option + lbra FindLp10 + +SetOne + tsta + lbne Syntax + stb ,y set one byte option + +SetNDone + lbra FindLp10 + +* -------------- +* Skip Spaces: +SkipSpac + lda ,x+ + cmpa #C$SPAC + beq SkipSpac + rts + +* -------------- +* Update Module CRC: +Verify + pshs u save data ptr + leau ModBuff,u + tfr u,x X is mod address + ldy M$Size,x Y is mod size + leay -3,y beginning of chksum + tfr y,d Y is byte count + leau d,u set U to chksum + lda #$FF init chksum + sta ,u + sta 1,u + sta 2,u + pshs u + os9 F$CRC calc new crc + puls u + com ,u+ fix it up right + com ,u+ + com ,u + lda <PathNmbr was it file? + beq MemMod ..no, in memory + ldx #0 + tfr x,u + os9 I$Seek go back to file begin + bcs Error + puls u + leax ModBuff,u + ldy <ModSize + os9 I$Write update module file + bra OkayEnd + +MemMod + ldu ,s get data area pointer + leax ModBuff,u + ldy <ModSize + ldu <ModAddr + +PutModLp + lda ,x+ + sta ,u+ + leay -1,y + bne PutModLp + puls u recover data area pointer + bra OkayEnd2 + +OkayEnd + bsr OutCR + +OkayEnd2 + clrb okay + +Error + pshs b,cc + ldu <ModAddr + beq Bye + os9 F$UnLink + +Bye + puls b,cc + os9 F$Exit we're done... + +* -------------- +* Print a <CR>: +OutCR + leax CR,pc + ldy #1 + lda #1 + os9 I$WritLn + rts + +**************** +* Output Current Desc Info: +Info + bsr OutCR do a <CR> + ldb #TablOpts number of table entries + pshs b save counter + leax OptTable,pc point to text table + stx <TxtPtr + +InfoLoop + ldx <TxtPtr + ldy #4 + lbsr OutPut print option name + leax Equal,pc + ldy #1 + lbsr OutPut print = + ldx <TxtPtr + ldb 4,x get offset to HEX option; if minus, offset to option offset + bpl PrintHex go do simple offset to HEX option + andb #^Sign clear sign bit + clra [D] = offset to string offset within module + cmpd <ModSize is it OK? + bhs MovePtr no, skip this option... + leay ModBuff,u point [Y] to module work copy + ldd b,y get string offset within module + cmpd <ModSize is string offset OK? + bhs MovePtr no, skip this option... + leay d,y point [Y] to CHAR string + lda #BuffSize get max. chars to print + leax Buffer,u point [X] to CHAR string buffer + clr <Count init counter + +CharCopy ldb ,y+ get char + bpl NotLast sign bit clear so not last, go on... + andb #^Sign clear sign bit + lda #1 set up as last char + +NotLast stb ,x+ + inc <Count count chars in string + deca done yet? + bne CharCopy no, go do another char... + ldb <Count get chars in string ([A]=0, so [D]=char count) + tfr d,y module name length into [Y] + leax Buffer,u point [X] to CHAR string copy + bsr OutPut print CHAR string + bra MovePtr skip HEX output routine + +* Print Hex Option Values: +PrintHex + ldx <TxtPtr + ldb 5,x get # of digits + stb <Count + ldb 4,x get option offset in module + clra [D] = option offset within module + cmpd <OptEnd is option offset OK? + bhs MovePtr no, skip this option... + leax ModBuff,u point [X] to module work copy + abx point [X] to option + stx <DataPtr + +* Print One Byte: +NumLoop + ldx <DataPtr + lda ,x+ + stx <DataPtr + pshs a + lsra + lsra + lsra + lsra + bsr OutOne + puls a + anda #$0F + bsr OutOne + dec <Count + bne NumLoop + +MovePtr + ldx <TxtPtr + leax 6,x + stx <TxtPtr + dec ,s + lbeq OkayEnd done... + ldb ,s + bitb #$07 # of options remaining evenly divisible by eight? + lbne InfoLoop no, go print next option on same line + lbsr OutCR <CR> after every 8th option + lbra InfoLoop ..loop + +* -------------- +* Print 1/2 Byte Hex Char: +OutOne + cmpa #10 + bcs Number + adda #$11-10 make alpha + +Number + adda #$30 make ASCII + sta <Buffer + leax Buffer,u + ldy #1 + +OutPut + lda #1 std out + os9 I$Write + lbcs Error + rts + + emod +Size equ * + end +
--- a/level2/cmds/makefile Tue Dec 03 14:48:59 2002 +0000 +++ b/level2/cmds/makefile Tue Dec 03 16:07:00 2002 +0000 @@ -3,7 +3,7 @@ DEPENDS = ./Makefile CMDS = asm attr backup binex build cmp cobbler copy date \ - deiniz del deldir dir display dsave dump echo edit error exbin format \ + deiniz del deldir dir display dsave dump echo edit error exbin exmode format \ free grfdrv help ident iniz link list load login makdir mdir \ merge mfree modpatch montype os9gen procs pwd pxd rename runb save \ setime shell_21 shellplus sleep tee tmode tsmon unlink \