;================================================================== ;=== ;=== Name: Console Library ;=== ;=== Author: Bjørn Reese ;=== ;=== This source is Public Domain. ;=== ;================================================================== ;--- Comment ------------------------------------------------------ ; ; TAB = 8 ; POINTER = ^ ; ; Source is rather messy and it could have been better documented ; but I'm really to lazy. ; ; The label convention used in this source is descriped in the ; article "PROGDOC.ART". If you're not in possesion of it just ; ignore the leading lower case letters of the labels. ; ; Keep the code PC-relative and ReEntrant! ; ( i.e. local variables on stack [ with LINK ] ) ; ;------------------------------------------------------------------ ;--- System ------------------------------------------------------- DEBUG = 1 ;0 = No Debugging INCDIR INCLUDE: vir REG d2-d7/a2-a6 ;Very Important Registers all REG d0-d7/a0-a6 TRUE = 0 FALSE = -1 ;--- Include ------------------------------------------------------ INCLUDE exec/resident.i INCLUDE exec/nodes.i INCLUDE exec/lists.i INCLUDE exec/initializers.i INCLUDE exec/libraries.i INCLUDE exec/exec_lib.i INCLUDE exec/ports.i INCLUDE exec/memory.i INCLUDE graphics/text.i INCLUDE libraries/dos_lib.i INCLUDE devices/inputevent.i INCLUDE devices/conunit.i INCLUDE intuition/intuition_lib.i INCLUDE intuition/intuition.i INCLUDE work/con_lib.i ;or whereever you got them. INCLUDE work/con.i _LVORawKeyConvert = -48 ThisTask = 276 CSI = 155 IEQUALIFIER_SHIFT = IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT IEQUALIFIER_COMMAND = IEQUALIFIER_LCOMMAND!IEQUALIFIER_RCOMMAND IEQUALIFIER_ALT = IEQUALIFIER_LALT!IEQUALIFIER_RALT ;--- Macro -------------------------------------------------------- CALL: MACRO ;Call System Function name jsr _LVO\1(a6) ENDM PUSH: MACRO ;Push to stack reg-list movem.l \1,-(sp) ENDM PULL: MACRO ;Pull from stack reg-list movem.l (sp)+,\1 ENDM DLINK: MACRO ;Dynamic Link An, move.l \1,-(sp) move.l sp,\1 suba.w \2,sp ENDM ABSW: MACRO ;Absolute Value Word addq.w #1,\1 and.w #-2,\1 ENDM RETURN: MACRO ;Return { Error [-127..128] } IF NARG=0 moveq #0,d0 ELSE moveq #\1,d0 ENDC rts ENDM ;--- Constant ----------------------------------------------------- cVersion = 2 cRevision = 0 cPriority = 0 cAcceptBufferSize= 30 ;================================================================== ;================================================================== ;=== === ;=== CODE AREA === ;=== === ;================================================================== ;================================================================== SECTION ConLib,CODE IFNE DEBUG start: jmp DebugCode ENDC ;------------------------------------------------------------------ ; @IllegalStart ;------------------------------------------------------------------ ; ; If Library is executed it will perform this procedure, which ; displays an error message on Standard Output Stream. ; ;------------------------------------------------------------------ IllegalStart: move.l $0004.w,a6 ;If Library is executed move.l 378(a6),a0 lea sDosName(pc),a1 CALL FindName ;Find Dos Library move.l d0,a6 CALL Output ;Find Standard Output Stream move.l d0,d1 beq.s .End pea sDosText(pc) move.l (sp)+,d2 move.l #sDosTextEnd-sDosText,d3 CALL Write ;Write Error Text .End RETURN 30 ;Report an error ;================================================================== ;=== ;=== Standard Resident Library Structure ;=== ;================================================================== CNOP 0,4 RomTag: dc.w RTC_MATCHWORD dc.l RomTag dc.l EndLib dc.b RTF_AUTOINIT dc.b cVersion dc.b NT_LIBRARY dc.b cPriority dc.l sLibName dc.l sLibID dc.l Init Init: dc.l con_SIZEOF ;Positive BaseSize dc.l LibFuncTable dc.l LibDataTable dc.l LibInit ;------------------------------------------------------------------ LibFuncTable: dc.l LibOpen ;Open Library dc.l LibClose ;Close Library dc.l LibExpunge ;Remove Library dc.l LibExtFunc ;free for expansion dc.l OpenCon dc.l CloseCon dc.l DoFormat dc.l UserNotes dc.l DefineChars dc.l DisplayRaw dc.l Display dc.l Accept dc.l AcceptString dc.l SetMsgHandler dc.l GetInfo dc.l SetGfx dc.l GotoXY dc.l Cursor dc.l Scroll dc.l Convert dc.l -1 ;------------------------------------------------------------------ LibDataTable: INITBYTE LH_TYPE,NT_LIBRARY INITLONG LN_NAME,sLibName INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED INITWORD LIB_VERSION,cVersion INITWORD LIB_REVISION,cRevision INITLONG LIB_IDSTRING,sLibID dc.l 0 ;================================================================== ;=== ;=== Private Library Functions ;=== ;================================================================== ;------------------------------------------------------------------ ; @LibInit ;------------------------------------------------------------------ ; ; Initialize Library. ; ;------------------------------------------------------------------ ; IN d0.l = ConBase ; a0.l = SegList [ from LoadSeg() ] ; OUT d0.l = ConBase ;------------------------------------------------------------------ LibInit: PUSH all move.l d0,a4 ;--- SET UP LIB VALUES move.l a0,con_SegList(a4) clr.l con_IntBase(a4) lea pSysBase(pc),a1 move.l $0004.w,(a1) move.l pSysBase(pc),a6 moveq #0,d0 ;--- OPEN INTUITION LIBRARY lea sIntName(pc),a1 CALL OpenLibrary move.l d0,con_IntBase(a4) moveq #0,d0 ;--- OPEN MATHFFP LIBRARY lea sMathName(pc),a1 CALL OpenLibrary move.l d0,con_MathBase(a4) lea dWriteReplyPort(pc),a1 ;--- MAKE REPLYPORT CALL AddPort PULL all rts ;------------------------------------------------------------------ ; @LibOpen ;------------------------------------------------------------------ ; ; Open Library. ; ;------------------------------------------------------------------ ; IN a6.l = ConBase ; OUT d0.l = ConBase ;------------------------------------------------------------------ LibOpen: addq.w #1,LIB_OPENCNT(a6) bclr #LIBB_DELEXP,LIB_FLAGS(a6) move.l a6,d0 rts ;------------------------------------------------------------------ ; @LibClose ;------------------------------------------------------------------ ; ; Close Library. ; ; Expunge if (LIB_OPENCNT = 0) AND (LIBB_DELEXP IN LIB_FLAGS) ; ;------------------------------------------------------------------ ; IN a6.l = ConBase ; OUT - ;------------------------------------------------------------------ LibClose: moveq #0,d0 subq.w #1,LIB_OPENCNT(a6) bne.s .Exit btst #LIBB_DELEXP,LIB_FLAGS(a6) beq.s .Exit bra.s LibExpunge .Exit rts ;------------------------------------------------------------------ ; @LibExpunge ;------------------------------------------------------------------ ; ; Expunge Library. ; ; This procedure is called if Exec tries to gain some memory. ; ;------------------------------------------------------------------ ; IN a6 = ConBase ; OUT d0.l = NULL (Stay in memory) ; ! SegList (UnLoadSeg me) ;------------------------------------------------------------------ LibExpunge: PUSH d1-d7/a0-a6 move.l a6,a4 move.l pSysBase(pc),a6 tst.w LIB_OPENCNT(a4) bne.s .DontExpungeYet lea dWriteReplyPort(pc),a1 ;--- REMOVE REPLYPORT CALL RemPort move.l con_MathBase(a4),a1 ;--- CLOSE MATHFFP LIBRARY CALL CloseLibrary move.l con_IntBase(a4),a1 ;--- CLOSE INTUITION LIBRARY CALL CloseLibrary move.l con_SegList(a4),d2 move.l a4,a1 CALL Remove ;--- REMOVE LIB NODE moveq #0,d0 move.l a4,a1 ;--- FREE LIB SPACE move.w LIB_NEGSIZE(a4),d0 suba.l d0,a1 ;PTR = LIBBASE - LIB_NEGSIZE add.w LIB_POSSIZE(a4),d0 ;SIZE = LIB_NEGSIZE + LIB_POSSIZE CALL FreeMem move.l d2,d0 bra.s .Exit .DontExpungeYet bset #LIBB_DELEXP,LIB_FLAGS(a4) moveq #0,d0 .Exit PULL d1-d7/a0-a6 rts ;------------------------------------------------------------------ ; @LibExtFunc ;------------------------------------------------------------------ ; ; Dummy. ; ;------------------------------------------------------------------ LibExtFunc: moveq #0,d0 rts ;================================================================== ;=== ;=== Public Library Functions ;=== ;================================================================== ;------------------------------------------------------------------ ; @OpenCon ;------------------------------------------------------------------ ; ; Open a Console Window. ; ; A Console Window is an Intuition Window with console.device ; attached. ; ;------------------------------------------------------------------ ; IN d0.w = CursorMode ; a0.l = Window Struct ; OUT d0.l = ConHandle ;------------------------------------------------------------------ vpConBase SET -4 vpMyWindow SET vpConBase-4 vpConHandle SET vpMyWindow-4 vwCursor SET vpConHandle-2 vSizeOf SET vwCursor OpenCon: PUSH vir link a4,#vSizeOf move.l a6,vpConBase(a4) move.l a0,vpMyWindow(a4) move.w d0,vwCursor(a4) move.l #MEMF_CLEAR,d1 ;--- ALLOC MEMORY FOR ConHandle & WriteIO move.l #cnh_SIZEOF+IOSTD_SIZE,d0 move.l pSysBase(pc),a6 CALL AllocMem move.l d0,vpConHandle(a4) beq.w .Exit move.l d0,a3 add.l #cnh_SIZEOF,d0 move.l d0,cnh_WriteIO(a3) move.w #256,cnh_ExLength(a3) ;default for ExLength move.w vwCursor(a4),cnh_CursorStatus(a3) move.l vpMyWindow(a4),a0 ;--- OPEN WINDOW move.l nw_IDCMPFlags(a0),d0 and.l #~VANILLAKEY,d0 ;VANILLAKEY not allowed or.l #RAWKEY,d0 ;...we need RAWKEY move.l d0,nw_IDCMPFlags(a0) move.l vpConBase(a4),a6 move.l con_IntBase(a6),a6 CALL OpenWindow move.l d0,cnh_Window(a3) beq.w .Error1 move.l d0,a0 move.l wd_UserPort(a0),cnh_UserPort(a3) move.l cnh_WriteIO(a3),a1 ;--- OPEN CONSOLE DEVICE move.l cnh_Window(a3),IO_DATA(a1) move.l #nw_SIZE,IO_LENGTH(a1) moveq #0,d0 moveq #0,d1 lea sConDevName(pc),a0 move.l pSysBase(pc),a6 CALL OpenDevice tst.l d0 bne.s .Error2 move.l cnh_WriteIO(a3),a0 move.l IO_DEVICE(a0),cnh_CDBase(a3) move.l IO_UNIT(a0),cnh_Unit(a3) move.l cnh_UserPort(a3),a0 ;--- MAKE SIGNAL move.b MP_SIGBIT(a0),d0 moveq #0,d1 bset d0,d1 move.l d1,cnh_Signal(a3) lea cnh_EchoTable(a3),a1 ;--- MAKE ECHOTABLE move.l #DEFMODE_GET+DEFALFANUM,d0 bsr DefineChars move.w vwCursor(a4),d0 move.l vpConHandle(a4),a0 bsr Cursor move.w #' 0',cnh_PadSpace(a3) ;PadSpace & PadZero move.w #'..',cnh_PadGroup(a3) ;PadGroup & PadString move.w #',E',cnh_DecimalPoint(a3) ;DecimalPoint & FloatE move.l vpConHandle(a4),d0 .Exit unlk a4 PULL vir rts .Error2 move.l cnh_Window(a3),a0 ;--- CLOSE WINDOW move.l vpConBase(a4),a6 move.l con_IntBase(a6),a6 CALL CloseWindow .Error1 move.l vpConHandle(a4),a1 ;--- RELEASE ALL MEMORY move.l #cnh_SIZEOF+IOSTD_SIZE,d0 move.l pSysBase(pc),a6 CALL FreeMem moveq #0,d0 bra.s .Exit ;------------------------------------------------------------------ ; @CloseCon ;------------------------------------------------------------------ ; ; Close a Console Window. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; OUT - ;------------------------------------------------------------------ vpConBase SET -4 vpConHandle SET vpConBase-4 vSizeOf SET vpConHandle CloseCon: PUSH vir link a4,#vSizeOf move.l a6,vpConBase(a4) move.l a0,vpConHandle(a4) beq.s .Exit move.l vpConHandle(a4),a3 ;--- CLOSE CONSOLE DEVICE move.l cnh_WriteIO(a3),a1 move.l pSysBase(pc),a6 CALL CloseDevice move.l cnh_Window(a3),a0 ;--- CLOSE WINDOW move.l vpConBase(a4),a6 move.l con_IntBase(a6),a6 CALL CloseWindow move.l vpConHandle(a4),a1 ;--- RELEASE ALL MEMORY move.l #cnh_SIZEOF+IOSTD_SIZE,d0 move.l pSysBase(pc),a6 CALL FreeMem .Exit unlk a4 PULL vir rts ;------------------------------------------------------------------ ; @UserNotes ;------------------------------------------------------------------ ; ; Make a user note. ; ;------------------------------------------------------------------ ; IN d0.w = Note Number ; a0.l = ConHandle ; a1.l = ^String [ NULL terminated ] ; OUT - ;------------------------------------------------------------------ UserNotes: lea cnh_UserNotes(a0),a2 subq.w #1,d0 add.w d0,d0 add.w d0,d0 and.w #$000E,d0 move.l a1,(a2,d0.w) rts ;------------------------------------------------------------------ ; @DoFormat ;------------------------------------------------------------------ ; ; Format a text string. Works much like RawDoFmt() or sprintf(). ; ; DoFormat supports: ; ; \ arguments: ; ; Standard: n t \ f b r v ; Non-Standard: @ B I U C Z[ nnn (* =chr(nnn)* ) ; User-Defined: #n (* n=[1..8] *) ; ; % arguments: ; ; d = signed decimal ; u = unsigned decimal ; x = hex ; c = char ; s = string ; o = octal ; b = binary (NON-STD!!) ; (* e = float (m.nnnnnnE±xx) *) ; (* f = float (mmm.nnnnnn) *) For later versions ; (* g = float (%e or %f) *) ; ; Format: %-0xxx.yyy + [ s | c ] ; Format: %-0xxx.yyyl + [ d | u | x | o | b ] ; ; [xxx|yyy] = * : get number from arg.list ; ( size = word (bit 15-8 unused) ) ; ; (* For later versions: Group specifier = .zzz *) ; ; ; Refer to documentation for further detail. ; ;------------------------------------------------------------------ ; IN d0.l = MaxLen ; a0.l = ConHandle ; a1.l = String ; a2.l = List of Arguments ; a3.l = Text Buffer ; OUT d0.l = Formatted String ;------------------------------------------------------------------ dof_MINUS = 1 dof_ZERO = 2 dof_POINT = 3 dof_GROUP = 4 dof_LONG = 5 dof_NEG = 6 ;Set if decimal is < 0 vpDataStream SET -4 vpLastPosition SET vpDataStream-4 vlMaxLen SET vpLastPosition-4 vlPosition SET vlMaxLen-4 vwFieldSize SET vlPosition-2 vwLenSize SET vwFieldSize-2 vwGroupSize SET vwLenSize-2 vsSmallBuffer SET vwGroupSize-64 vwSuccess SET vsSmallBuffer-2 vSizeOf SET vwSuccess DoFormat: movem.l d1-d7/a0-a3/a5,-(sp) link a4,#vSizeOf move.l d0,vlMaxLen(a4) clr.l vlPosition(a4) move.l a1,vpDataStream(a4) bra.s .Next .Normal bsr.s PutCharFunc .Next clr.w vwSuccess(a4) move.b (a1)+,d0 beq.s .Exit cmp.b #'%',d0 bne.s .NotPct move.l a1,vpLastPosition(a4) bsr DoProcent tst.w vwSuccess(a4) beq.s .Next move.b #'%',d0 bsr.s PutCharFunc move.l vpLastPosition(a4),a1 bra.s .Next .NotPct cmp.b #'\',d0 bne.s .Normal move.l a1,vpLastPosition(a4) bsr DoBackSlash tst.w vwSuccess(a4) bpl.s .Next move.b #'\',d0 bsr.s PutCharFunc move.l vpLastPosition(a4),a1 bra.s .Next .Exit bsr.s PutCharFunc ;Terminating NULL move.l a3,d0 unlk a4 movem.l (sp)+,d1-d7/a0-a3/a5 rts ;------------------------------------------------------------------ PutCharFunc: move.l vlPosition(a4),d1 cmp.l vlMaxLen(a4),d1 bge.s .001 addq.l #1,vlPosition(a4) .001 move.b d0,(a3,d1.l) rts ;------------------------------------------------------------------ ;OUT vwSuccess.w = Success (( -1 = Error )) DoProcent: moveq #0,d3 move.b (a1)+,d0 cmp.b #'%',d0 beq PutCharFunc clr.w vwFieldSize(a4) clr.w vwLenSize(a4) clr.w vwGroupSize(a4) cmp.b #'-',d0 ;left-justify? bne.s .001 bset #dof_MINUS,d3 move.b (a1)+,d0 .001 cmp.b #'0',d0 ;leading zero's? bne.s .002 bset #dof_ZERO,d3 move.b (a1)+,d0 .002 bsr GetNumber ;field width? tst.w d1 bne.s .005 move.w d0,vwFieldSize(a4) move.b (a1)+,d0 .005 cmp.b #'.',d0 ;max len specifier? bne.s .003 bset #dof_POINT,d3 move.b (a1)+,d0 bsr GetNumber ;max len? tst.w d1 bne.s .006 move.w d0,vwLenSize(a4) move.b (a1)+,d0 .006 ; cmp.b #'.',d0 ;group specifier? ; bne.s .003 ; bset #dof_GROUP,d3 ; move.b (a1)+,d0 ; bsr GetNumber ;group? ; tst.w d1 ; bne.s .003 ; move.w d0,vwGroupSize(a4) ; move.b (a1)+,d0 .003 cmp.b #'l',d0 ;long? bne.s .004 bset #dof_LONG,d3 move.b (a1)+,d0 .004 cmp.b #'s',d0 beq.w DopeString cmp.b #'d',d0 beq.w DopeDecimal cmp.b #'x',d0 beq.w DopeHex cmp.b #'u',d0 beq.w DopeUnsigned cmp.b #'b',d0 beq.w DopeBinary cmp.b #'c',d0 beq.w DopeChar cmp.b #'o',d0 beq.w DopeOctal ; cmp.b #'e',d0 ; beq.s DopeEFloat ; cmp.b #'f',d0 ; beq.s DopeFFloat ; cmp.b #'g',d0 ; beq.s DopeGFloat DopeError: move.w #FALSE,vwSuccess(a4) rts ;------------------------------------------------------------------ DopeString: btst #dof_LONG,d3 bne.w DopeError bclr #dof_GROUP,d3 move.l (a2)+,a5 move.l a5,d7 moveq #-1,d0 ;Calc TextLen .Loop tst.b (a5)+ dbeq d0,.Loop neg.w d0 subq.w #1,d0 move.l d7,a5 ;...and fall down through... ;------------------------------------------------------------------ ;IN d0.w = Length of StringPart ; a5.l = ^StringPart to insert StringParty: move.w vwFieldSize(a4),d7 ;Pad Length move.w vwLenSize(a4),d6 ;Put Length beq.s .001 cmp.w d6,d0 bhi.s .002 .001 move.w d0,d6 .002 sub.w d6,d7 bpl.s .003 moveq #0,d7 .003 btst #dof_MINUS,d3 bne.s .202 ;--- Pre Pad move.b cnh_PadSpace(a0),d0 ;DoPadding btst #dof_ZERO,d3 beq.s .101 move.b cnh_PadString(a0),d0 bra.s .101 .PreLoop bsr PutCharFunc .101 dbra d7,.PreLoop bra.s .102 ;DoPutString .PreSLoop move.b (a5)+,d0 beq.s .103 bsr PutCharFunc .102 dbra d6,.PreSLoop .103 rts ;--- Post Pad .PostLoop move.b (a5)+,d0 ;DoPutString beq.s .203 bsr PutCharFunc .202 dbra d6,.PostLoop .203 move.b cnh_PadSpace(a0),d0 ;DoPadding btst #dof_ZERO,d3 beq.s .201 move.b cnh_PadString(a0),d0 bra.s .201 .PostSLoop bsr PutCharFunc .201 dbra d7,.PostSLoop rts ;------------------------------------------------------------------ DopeChar: btst #dof_LONG,d3 bne.w DopeError bclr #dof_GROUP,d3 move.w (a2)+,-(sp) move.l sp,a5 addq.l #1,a5 moveq #1,d0 bsr StringParty addq.l #2,sp rts ;------------------------------------------------------------------ DopeDecimal: move.l a0,-(sp) lea vsSmallBuffer(a4),a5 move.l a5,d6 btst #dof_LONG,d3 bne.s .Long move.w (a2)+,d0 ext.l d0 beq.s .Last bra.s .001 .Long move.l (a2)+,d0 beq.s .Last .001 bmi.s .Neg neg.l d0 bra.s .002 .Neg move.b #'-',(a5)+ .002 lea alDecArray(pc),a0 moveq #0,d1 .OLoop move.l (a0)+,d2 beq.s .Last moveq #-1,d5 .Loop add.l d2,d0 dbgt d5,.Loop sub.l d2,d0 addq.w #1,d5 bne.s .003 tst.w d1 beq.s .OLoop .003 moveq #-1,d1 neg.b d5 add.b #'0',d5 move.b d5,(a5)+ bra.s .OLoop .Last neg.b d0 add.b #'0',d0 move.b d0,(a5)+ clr.b (a5) sub.l a5,d6 neg.w d6 move.w d6,d0 move.l (sp)+,a0 lea vsSmallBuffer(a4),a5 bra PartyDudes ;------------------------------------------------------------------ DopeUnsigned: move.l a0,-(sp) lea vsSmallBuffer(a4),a5 move.l a5,d6 moveq #0,d7 btst #dof_LONG,d3 bne.s .Long moveq #0,d0 move.w (a2)+,d0 beq.s .Last bra.s .001 .Long move.l (a2)+,d0 beq.s .Last bpl.s .001 bclr #31,d0 moveq #-1,d7 .001 neg.l d0 lea alDecArray(pc),a0 moveq #0,d1 .OLoop move.l (a0)+,d2 beq.s .Last moveq #-1,d5 .Loop add.l d2,d0 dbgt d5,.Loop sub.l d2,d0 addq.w #1,d5 ; bne.s .003 ; tst.w d1 ; beq.s .OLoop .003 moveq #-1,d1 neg.b d5 add.b #'0',d5 move.b d5,(a5)+ bra.s .OLoop .Last neg.b d0 add.b #'0',d0 move.b d0,(a5)+ clr.b (a5) sub.l a5,d6 neg.w d6 move.w d6,d0 tst.w d7 beq.s .004 lea abBlackAdder+10(pc),a0 ;Bungled work! moveq #0,d7 move.w d6,d5 subq.w #1,d5 .ALoop move.b -(a0),d1 move.b -(a5),d2 add.b d2,d1 sub.b d7,d1 cmp.b #'9',d1 sgt d7 ble.s .100 sub.b #10,d1 .100 move.b d1,(a5) dbra d5,.ALoop .004 move.l (sp)+,a0 lea vsSmallBuffer(a4),a5 moveq #9-1,d5 .4Loop cmp.b #'0',(a5) ;Skip leading zeroes bne.s .4End addq.l #1,a5 dbra d5,.4Loop .4End bra PartyDudes abBlackAdder: dc.b $02,$01,$04,$07,$04,$08,$03,$06,$04,$08 EVEN ;------------------------------------------------------------------ DopeHex: lea vsSmallBuffer(a4),a5 btst #dof_LONG,d3 bne.s .Long moveq #4-1,d2 move.w (a2)+,d0 beq.s .Zero swap d0 bra.s .ZLoop .Long moveq #8-1,d2 move.l (a2)+,d0 beq.s .Zero .ZLoop rol.l #4,d0 move.b d0,d1 and.w #$000f,d1 bne.s .001 dbra d2,.ZLoop .001 move.w d2,d5 bra.s .Entry .NoZer move.w d2,d5 .Loop rol.l #4,d0 move.b d0,d1 and.w #$000f,d1 .Entry move.b sDopeHexString(pc,d1.w),(a5)+ dbra d2,.Loop lea vsSmallBuffer(a4),a5 move.w d5,d0 addq.w #1,d0 bsr PartyDudes rts .Zero moveq #0,d1 move.w d1,d2 move.w d2,d5 bra.s .Entry sDopeHexString: dc.b '0123456789ABCDEF' EVEN ;------------------------------------------------------------------ DopeOctal: lea vsSmallBuffer(a4),a5 btst #dof_LONG,d3 bne.s .Long moveq #6-1,d2 move.w (a2)+,d0 beq.s .Zero swap d0 rol.l #1,d0 move.b d0,d1 and.w #$0001,d1 bne.s .001 subq.w #1,d2 bra.s .ZLoop .Long moveq #11-1,d2 move.l (a2)+,d0 beq.s .Zero rol.l #2,d0 move.b d0,d1 and.w #$0003,d1 bne.s .001 subq.w #1,d2 .ZLoop rol.l #3,d0 move.b d0,d1 and.w #$0007,d1 bne.s .001 dbra d2,.ZLoop .001 move.w d2,d5 bra.s .Entry .NoZer move.w d2,d5 .Loop rol.l #3,d0 move.b d0,d1 and.w #$0007,d1 .Entry move.b sDopeHexString(pc,d1.w),(a5)+ dbra d2,.Loop lea vsSmallBuffer(a4),a5 move.w d5,d0 addq.w #1,d0 bsr PartyDudes rts .Zero moveq #0,d1 move.w d1,d2 move.w d2,d5 bra.s .Entry ;------------------------------------------------------------------ DopeBinary: lea vsSmallBuffer(a4),a5 btst #dof_LONG,d3 bne.s .Long moveq #16-1,d2 move.w (a2)+,d0 swap d0 bra.s .001 .Long moveq #32-1,d2 move.l (a2)+,d0 .001 btst #dof_ZERO,d3 bne.s .002 .ZLoop rol.l #1,d0 dbcs d2,.ZLoop tst.w d2 bpl.s .003 move.b #'0',(a5)+ moveq #0,d5 bra.s .004 .003 move.w d2,d5 bra.s .005 .002 move.w d2,d5 .Loop rol.l #1,d0 bcs.s .005 move.b #'0',(a5)+ dbra d2,.Loop bra.s .004 .005 move.b #'1',(a5)+ dbra d2,.Loop .004 lea vsSmallBuffer(a4),a5 move.w d5,d0 addq.w #1,d0 bra PartyDudes ;------------------------------------------------------------------ ;DopeEFloat: ; bra DopeError ;DopeFFloat: ; bra DopeError ;DopeGFloat: ; bra DopeError ;------------------------------------------------------------------ ;IN d0.w = StringPart Length ; d3.l = Flags ; a3.l = ^Text ; a5.l = ^StringPart to insert PartyDudes: move.w vwFieldSize(a4),d7 move.w vwLenSize(a4),d6 beq.s .001 cmp.w d6,d0 bhi.s .002 .001 move.w d0,d6 .002 sub.w d6,d7 bpl.s .003 moveq #0,d7 ; d6.w = Put Length ; d7.w = Pad Length .003 btst #dof_MINUS,d3 bne.s PostPad PrePad: move.b cnh_PadSpace(a0),d0 ;DoPadding btst #dof_ZERO,d3 beq.s .001 move.b cnh_PadZero(a0),d0 bra.s .001 .PLoop bsr PutCharFunc .001 dbra d7,.PLoop bra.s .002 ;DoPutString .SLoop move.b (a5)+,d0 beq.s .003 bsr PutCharFunc .002 dbra d6,.SLoop .003 rts PostPad: bra.s .002 ;DoPutString .PLoop move.b (a5)+,d0 beq.s .003 bsr PutCharFunc .002 dbra d6,.PLoop .003 move.b cnh_PadSpace(a0),d0 ;DoPadding btst #dof_ZERO,d3 beq.s .001 move.b cnh_PadZero(a0),d0 bra.s .001 .SLoop bsr PutCharFunc .001 dbra d7,.SLoop rts ;------------------------------------------------------------------ ;OUT d0.w = Success DoBackSlash: move.b (a1)+,d0 cmp.b #'n',d0 ;LineFeed beq.w .LF cmp.b #'t',d0 ;Tabulator beq.w .Tab cmp.b #'\',d0 ;BackSlash beq PutCharFunc cmp.b #'f',d0 ;FormFeed beq.w .FF cmp.b #'b',d0 ;BackSpace beq.w .BS cmp.b #'#',d0 ;Hash beq.w .User cmp.b #'@',d0 ;Plain Style beq.w .Plain cmp.b #'B',d0 ;Bold Style beq.w .Bold cmp.b #'I',d0 ;Italic Style beq.w .Italic cmp.b #'U',d0 ;Underline Style beq.w .Under cmp.b #'C',d0 ;Foreground Color beq.w .FColor cmp.b #'Z',d0 ;Background Color beq .BColor cmp.b #'[',d0 ;Escape beq .Escape cmp.b #'{',d0 ;CSI beq.w .Csi cmp.b #'r',d0 ;Return beq.s .Rtn cmp.b #'v',d0 ;Vert. Tabulator beq.s .Vtab ;--- Examine for ASCII bsr GetNumber tst.w d1 bpl PutCharFunc .Error move.w #FALSE,vwSuccess(a4) .Xit rts .LF move.b #10,d0 bra PutCharFunc .Tab move.b #9,d0 bra PutCharFunc .FF move.b #12,d0 bra PutCharFunc .BS move.b #8,d0 bra PutCharFunc .Rtn move.b #13,d0 bra PutCharFunc .Vtab move.b #11,d0 bra PutCharFunc .User moveq #0,d0 move.b (a1)+,d0 sub.b #'1',d0 blt.s .Error cmp.b #8,d0 bge.s .Error add.w d0,d0 add.w d0,d0 lea cnh_UserNotes(a0),a5 move.l (a5,d0.w),d0 beq.s .Xit move.l d0,a5 bra.s DoCopyString .Plain lea sDoStyle1(pc),a5 bra.s DoCopyString .Bold lea sDoStyle2(pc),a5 bra.s DoCopyString .Italic lea sDoStyle3(pc),a5 bra.s DoCopyString .Under lea sDoStyle4(pc),a5 bra.s DoCopyString .BColor lea sDoBgCol(pc),a5 bra .Color .FColor lea sDoFgCol(pc),a5 .Color move.b (a1)+,3(a5) bra DoCopyString .Escape move.b #27,d0 bra PutCharFunc .Csi move.b #155,d0 bra PutCharFunc ;------------------------------------------------------------------ ;IN a3.l = ^Text ; a5.l = ^StringPart DoCopyString: move.b (a5)+,d0 beq.s .Exit bsr PutCharFunc bra.s DoCopyString .Exit rts ;------------------------------------------------------------------ ;IN d0.b = First Char ; a1.l = ^String ;OUT d0.w = Number ; d1.l = Success GetNumber: cmp.b #'*',d0 ;get number from args? beq.s .Var cmp.b #'0',d0 ;one digit? blt.s .Error cmp.b #'9',d0 bgt.s .Error moveq #0,d1 and.w #$000f,d0 move.w d0,d1 move.b (a1),d0 cmp.b #'0',d0 ;two digits? blt.s .NoMore cmp.b #'9',d0 bgt.s .NoMore addq.l #1,a1 mulu #10,d1 ;use shift *10 and.w #$000f,d0 add.w d0,d1 move.b (a1),d0 cmp.b #'0',d0 ;three digits? blt.s .NoMore cmp.b #'9',d0 bgt.s .NoMore addq.l #1,a1 mulu #10,d1 ;as above and.w #$000f,d0 add.w d0,d1 .NoMore move.w d1,d0 moveq #0,d1 rts .Error moveq #-1,d1 rts .Var move.w (a2)+,d0 and.w #$00ff,d0 moveq #0,d1 rts ;------------------------------------------------------------------ ; @DefineChars ;------------------------------------------------------------------ ; ; Define specified CharTable according to Mode: ; ; CASE Mode OF ; 1: .new ; 2: .add ; 3: .rem ; 4: .get ; OTHERWISE ; .all ; ENDCASE ; ;------------------------------------------------------------------ ; IN d0.l = Mode ; a1.l = ^CharTable ; a2.l = ^ArrayOfChars ; OUT { CharTable modified } ;------------------------------------------------------------------ DefineChars: move.l a2,a0 subq.w #1,d0 beq.s .New subq.w #1,d0 beq.s .Add subq.w #1,d0 beq.s .Rem subq.w #1,d0 beq.s .Get ;------------------------------------------------------------------ .All moveq #0,d0 ;--- DEFMODE_ALL bra.s .Get .Exit rts ;------------------------------------------------------------------ .New move.l a1,d0 ;--- DEFMODE_NEW move.w #[CHARDEFSIZE/4]-1,d1 .NLoop clr.l (a1)+ dbra d1,.NLoop move.l d0,a1 ;continue down though... ;------------------------------------------------------------------ .Add moveq #0,d0 ;--- DEFMODE_ADD move.b (a0)+,d0 beq.s .Exit move.w d0,d1 lsr.w #3,d0 not.w d1 and.w #$0007,d1 bset d1,(a1,d0.w) bra.s .Add ;------------------------------------------------------------------ .Rem moveq #0,d0 ;--- DEFMODE_REM move.b (a0)+,d0 beq.s .Exit move.w d0,d1 lsr.w #3,d0 not.w d1 and.w #$07,d1 bclr d1,(a1,d0.w) bra.s .Rem ;------------------------------------------------------------------ .Get swap d0 ;--- DEFMODE_GET lea awDefDefTable(pc),a0 adda.w (a0,d0.w),a0 REPT CHARDEFSIZE/4 move.l (a0)+,(a1)+ ENDR rts ;------------------------------------------------------------------ ; @Display ;------------------------------------------------------------------ ; ; Format and Display a text string in a Console Window. ; ; Length for DoFormat calculated. ; ; Cursor turn off during display. ; ;------------------------------------------------------------------ ; IN d0.l = MaxLen ; a0.l = ConHandle ; a1.l = ^String ; a2.l = ^List of Arguments ; OUT - ;------------------------------------------------------------------ Display: PUSH d7/a3 move.l d0,d7 move.l a1,a3 ;--- FIND LENGTH OF TEXT moveq #-1,d0 .Loop tst.b (a3)+ dbeq d0,.Loop neg.l d0 subq.w #1,d0 cmp.w d7,d0 ;can't be bigger than MaxLen ble.s .Less move.w d7,d0 .Less add.w cnh_ExLength(a0),d0 ;+ additional space ABSW d0 ;align DLINK a4,d0 ;--- ALLOC SPACE FOR TEXTBUFFER ON STACK move.l sp,a3 ;point to start move.l #$9b302070,(a3)+ ;Cursor off bsr DoFormat ;--- FORMAT STRING AND DISPLAY IT subq.l #4,d0 move.l d0,a1 move.l d7,d0 bsr.s DisplayRaw unlk a4 move.w cnh_CursorStatus(a0),d0 bsr Cursor PULL d7/a3 rts ;------------------------------------------------------------------ ; @DisplayRaw ;------------------------------------------------------------------ ; ; Display an unformatted text string in a Console Window. ; ;------------------------------------------------------------------ ; IN d0.l = MaxLen [ -1 don't care ] ; a0.l = ConHandle ; a1.l = ^Text ; OUT - ;------------------------------------------------------------------ DisplayRaw: PUSH d1/a0/a1/a6 move.l cnh_WriteIO(a0),a6 move.w #CMD_WRITE,IO_COMMAND(a6) move.l a1,IO_DATA(a6) move.l d0,IO_LENGTH(a6) lea dWriteReplyPort(pc),a0 move.l a0,MN_REPLYPORT(a6) move.l a6,a1 move.l pSysBase(pc),a6 CALL DoIO PULL d1/a0/a1/a6 rts ;------------------------------------------------------------------ ; @Accept ;------------------------------------------------------------------ ; ; Accept an input from user. ; ;------------------------------------------------------------------ ; IN d0.l = Flags ; a0.l = ConHandle ; a1.l = ^AcceptStructure ; OUT d0.l = Success ; [ -1 = Error ] ; [ 0 = OK ] ; [ 1 = ExitFlag ] ; [ 2 = ExitChar ] ; ; GLOBALS ; d6.l = Flags ; a2.l = ^AcceptStructure ; a3.l = ConHandle ; a4.l = ^StackBuffer ; a5.l = ^Message ; a6.l = SysBase ; ;------------------------------------------------------------------ ;--- THE ACCEPT STACK BUFFER vsBufferEnd SET 0 vsBuffer SET vsBufferEnd-cAcceptBufferSize vdInputEvent SET vsBuffer-ie_SIZEOF vAcceptSizeOf SET vdInputEvent Accept: PUSH vir ;--- ASSIGN THE GLOBAL REGISTERS link a4,#vAcceptSizeOf ;StackBuffer move.l a0,a3 ;ConHandle move.l a1,a2 ;AcceptStructure move.l d0,d6 ;Flags move.l pSysBase(pc),a6 ;ExecBase and.l #~[RAWKEY!VANILLAKEY],acc_ExitFlags(a2) ;Illegal as ExitFlags bsr.s EraseKeyBuffer ;--- ERASE MESSAGE BUFFER IF REQUIRED bsr.s AcceptKey ;--- GO FOR IT tst.l d0 bpl.s .Exit ;Error? clr.b acc_Char(a2) ;YES! No key .Exit unlk a4 PULL vir rts ;------------------------------------------------------------------ EraseKeyBuffer: btst #ACCB_ERASE,d6 beq.s .Exit .EraseLoop move.l cnh_UserPort(a3),a0 ;Erase keybuffer CALL GetMsg tst.l d0 beq.s .Exit move.l d0,a1 CALL ReplyMsg bra.s .EraseLoop .Exit rts ;------------------------------------------------------------------ ;IN a3.l = ConHandle ; a2.l = AcceptStructure ;OUT d0.l = Success [ see @Accept Header ] AcceptError: ;--- ERROR IN ACCEPT RETURN -1 AcceptKey: ;--- ACCEPT A KEYSTROKE bsr GetMessage beq.s .AccOn bmi.s AcceptError move.l cnh_MsgHandler(a3),d1 ;--- MESSAGE HANDLER beq.s .Exit PUSH d1-d7/a0-a6 move.l a0,d0 move.l d1,a5 jsr (a5) PULL d1-d7/a0-a6 tst.l d0 beq.s AcceptKey .Exit clr.b acc_Char(a2) rts .AccOn bsr KeyWays bmi.s AcceptError beq.s HandleChar HandleRawKey: ;--- HANDLE A RAWKEY clr.b acc_Char(a2) ;RawKey found in acc_Code RETURN HandleChar: bsr ConvertChar ;--- HANDLE CHAR move.b d0,acc_Char(a2) lea acc_ExitTable(a2),a0 ;Is it a ExitChar? bsr TestChar beq.s .Exit lea acc_ValidTable(a2),a0 ;Is it a ValidChar? bsr TestChar bne.w AcceptKey bsr EchoChar RETURN .Exit bsr EchoChar RETURN 2 ;------------------------------------------------------------------ ;OUT d0.l = Success ; -1 = Error [no Msg on ~ACCB_WAIT] ; 0 = OK ; 1 = ExitFlags ; CCR = Success ; a0.l = ^Msg GetMessage: move.l cnh_UserPort(a3),a0 ;--- GET MESSAGE CALL GetMsg tst.l d0 bne.s .GotCha btst #ACCB_WAIT,d6 beq.s .NoWait ;Exit if no message and no wait move.l cnh_Signal(a3),d0 ;--- WAIT FOR MESSAGE CALL Wait bra.s GetMessage .NoWait RETURN -1 .GotCha move.l d0,a0 lea im_Class(a0),a0 ;Copy message lea acc_Class(a2),a1 move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l d0,a1 ;--- REPLY MESSAGE CALL ReplyMsg move.l acc_Class(a2),d0 ;--- WHAT KIND OF MESSAGE cmp.l #RAWKEY,d0 ;Is it RAWKEY? bne.s .001 RETURN .001 and.l acc_ExitFlags(a2),d0 ;Ignore everything else but ExitFlags beq.s GetMessage RETURN 1 ;------------------------------------------------------------------ ;OUT d0.l = Success ; -1 = Error ; 0 = OK (Handle) ; 1 = RawKey ; CCR = Success KeyWays: move.w acc_Code(a2),d0 ;--- MESSAGE IS RAWKEY btst #ACCB_RAWKEY,d6 bne.s .Raw btst #ACCB_DUALKEY,d6 bne.s .Handle tst.b d0 ;--- UPKEY bpl.s .Down btst #ACCB_UPKEY,d6 bne.s .Handle .Error RETURN -1 .Down btst #ACCB_UPKEY,d6 ;wait for key to be released? bne.s .Error .Handle RETURN 0 .Raw RETURN 1 ;------------------------------------------------------------------ EchoChar: btst #ACCB_ECHO,d6 ;--- ECHOCHAR beq.s .Exit lea cnh_EchoTable(a3),a0 bsr TestChar bne.s .Exit lea vsBuffer(a4),a0 moveq #1,d0 move.l a0,a1 ;Text move.l a3,a0 ;ConHandle bra DisplayRaw .Exit rts ;------------------------------------------------------------------ ;IN a0.l = Table to test ;OUT d0.l = Success ; CCR TestChar: moveq #0,d0 move.b acc_Char(a2),d0 moveq #0,d1 move.w d0,d1 lsr.w #3,d0 not.w d1 and.w #$0007,d1 btst d1,(a0,d0.w) ;test appropriate bit beq.s .Error RETURN TRUE .Error RETURN FALSE ;------------------------------------------------------------------ ; IN a0.l = ^Message ; OUT d0.b = Char ; ! Error [ 0 ] abConvertArray: dc.b AKEY_BS,0,0,0,AKEY_ESC,AKEY_DEL,0 dc.b 0,0,0,0,AKEY_ARROWUP,AKEY_ARROWDN,AKEY_ARROWRG,AKEY_ARROWLF dc.b AKEY_F1,AKEY_F2,AKEY_F3,AKEY_F4,AKEY_F5 dc.b AKEY_F6,AKEY_F7,AKEY_F8,AKEY_F9,AKEY_F10 dc.b 0,0,0,0,0,AKEY_HELP EVEN ConvertChar: PUSH d1/a0/a1/a2/a5/a6 move.w acc_Code(a2),d0 and.w #$007f,d0 sub.b #$41,d0 blt.s .Convert cmp.b #$60-$41,d0 bge.s .Error move.b abConvertArray(pc,d0.w),d0 beq.s .Convert bra.s .Exit .Convert lea vdInputEvent(a4),a0 ;InputEvent Structure clr.l ie_NextEvent(a0) move.w #IECLASS_RAWKEY<<8,ie_Class(a0) move.w acc_Code(a2),ie_Code(a0) move.w acc_Qualifier(a2),ie_Qualifier(a0) move.l acc_IAddress(a2),a1 move.l (a1),ie_EventAddress(a0) lea vsBuffer(a4),a1 ;CharBuffer (destination) suba.l a2,a2 ;default keymap moveq #4,d1 ;length move.l cnh_CDBase(a3),a6 CALL RawKeyConvert subq.w #1,d0 ;skip if more than 1 char was converted bne.s .Error lea vsBuffer(a4),a1 move.b (a1),d0 .Exit PULL d1/a0/a1/a2/a5/a6 rts .Error moveq #0,d0 bra.s .Exit ;------------------------------------------------------------------ ; @AcceptString ;------------------------------------------------------------------ ; ; Accept the input of a string from user. ; ;------------------------------------------------------------------ ; IN d0.l = Flags ; a0.l = ConHandle ; a1.l = ^AcceptStructure ; OUT d0.l = Success ; ; GLOBALS ; d6.l = Flags ; a2.l = ^AcceptStructure ; a3.l = ConHandle ; a4.l = ^StackBuffer ; a6.l = SysBase ; ;------------------------------------------------------------------ ;--- EXTENTION OF THE ACCEPT STACK BUFFER vsJustBuffer SET vAcceptSizeOf-16 vwStyle SET vsJustBuffer-2 vwFgCol SET vwStyle-2 vwBgCol SET vwFgCol-2 vSizeOf SET vwBgCol AcceptString: PUSH vir ;--- ASSIGN THE GLOBAL REGISTERS link a4,#vSizeOf ;StackBuffer move.l a0,a3 ;ConHandle move.l a1,a2 ;AcceptStructure move.l d0,d6 ;Flags move.l pSysBase(pc),a6 ;ExecBase and.l #~[RAWKEY!VANILLAKEY],acc_ExitFlags(a2) ;Illegal as ExitFlags move.w cnh_ExLength(a3),d0 ;--- Ensure that ExLength > MaxLength sub.w accs_MaxLength(a2),d0 blt.s .111 neg.w d0 add.w d0,cnh_ExLength(a3) .111 lea -cin_SIZEOF(sp),sp ;Alloc space for info! move.l sp,a1 move.l a3,a0 bsr GetInfo move.l d0,a1 ;--- STORE OLD GFX move.w cin_Styles(a1),vwStyle(a4) move.w cin_FgCol(a1),vwFgCol(a4) move.w cin_BgCol(a1),vwBgCol(a4) tst.w acc_XStart(a2) ;--- SET START POSITION bpl.s .001 move.w cin_XPos(a1),acc_XStart(a2) .001 tst.w acc_YStart(a2) bpl.s .002 move.w cin_YPos(a1),acc_YStart(a2) .002 move.w cin_XSize(a1),d1 ;--- CORRECT MAXLENGTH lea cin_SIZEOF(sp),sp ;Dealloc space! move.w acc_XStart(a2),d0 add.w accs_FieldLen(a2),d0 cmp.w d1,d0 ble.s .003 sub.w acc_XStart(a2),d1 ble.s .Exit ;exit if FieldLen <= 0 move.w d1,accs_FieldLen(a2) .003 move.w acc_Styles(a2),d0 ;--- SET Styles, FgCol and BgCol bpl.s .200 move.w vwStyle(a4),d0 .200 move.w acc_FgCol(a2),d1 bpl.s .201 move.w vwFgCol(a4),d1 .201 move.w acc_BgCol(a2),d2 bpl.s .202 move.w vwBgCol(a4),d2 .202 move.l a3,a0 bsr SetGfx bsr EraseKeyBuffer ;--- ERASE KEYBOARD BUFFER IF REQUIRED bsr AcceptString2 .Exit move.l d0,-(sp) move.w vwStyle(a4),d0 ;--- RESTORE OLD GFX AND LEAVE move.w vwFgCol(a4),d1 move.w vwBgCol(a4),d2 move.l a3,a0 bsr SetGfx move.l (sp)+,d0 unlk a4 PULL vir rts ;------------------------------------------------------------------ ;IN a3.l = ConHandle ; a2.l = AcceptStructure ;OUT d0.l = Success ; -1 = Error ; 0 = OK ; 1 = ExitFlag VALIDQUAL SET $8000!IEQUALIFIER_CAPSLOCK VALIDQUAL SET VALIDQUAL!IEQUALIFIER_REPEAT VALIDQUAL SET VALIDQUAL!IEQUALIFIER_NUMERICPAD VALIDQUAL SET VALIDQUAL!IEQUALIFIER_SHIFT AcceptString2: move.w accs_MaxLength(a2),d0 ;ensure than FieldLen <= MaxLen cmp.w accs_FieldLen(a2),d0 ble.s .001 btst #ACCB_NOSCROLL,d6 beq.s .002 move.w accs_FieldLen(a2),accs_MaxLength(a2) bra.s .002 .001 move.w d0,accs_FieldLen(a2) .002 btst #ACCB_CONTINUE,d6 bne.s .003 clr.w accs_Position(a2) ;--- RESTART STRING clr.w accs_Length(a2) clr.w accs_DispPos(a2) btst #ACCB_NOAMIGA,d6 bne.s .002 move.l accs_InputBuffer(a2),a0 ;--- COPY STRING TO BUFFER move.l accs_WorkBuffer(a2),d0 beq.s .003 move.l d0,a1 move.w accs_MaxLength(a2),d0 subq.w #1,d0 .CopyLoop move.b (a0)+,(a1)+ dbra d0,.CopyLoop .003 or.l #[ACCF_WAIT],d6 and.l #~[ACCF_ECHO!ACCF_UPKEY!ACCF_RAWKEY!ACCF_DUALKEY],d6 bsr PrepareEcho StringLoop: bsr EchoBuffer move.w accs_MaxLength(a2),d1 ;--- TEST LASTEXIT FLAG cmp.w accs_Length(a2),d1 bgt.s StringAgain btst #ACCB_LASTEXIT,d6 bne.w StringExitchar StringAgain: bsr GetMessage beq.s StringGo StringEnd: ;Stop if ExitFlags or Error bmi.s .Exit move.l cnh_MsgHandler(a3),d1 ;Hey, hold on... Let's see if beq.s .Exit ;there's a handler to jump to. PUSH d1-d7/a0-a6 move.l a0,d0 ;message move.l d1,a5 jsr (a5) PULL d1-d7/a0-a6 tst.l d0 beq.s StringAgain .Exit clr.b acc_Char(a2) rts StringGo: bsr KeyWays bmi.s StringAgain bsr ConvertChar move.b d0,acc_Char(a2) beq.s StringAgain ;Back if Qualifier or Error move.w acc_Qualifier(a2),d1 and.w #~VALIDQUAL,d1 bne.s .001 move.w acc_Qualifier(a2),d1 and.w #IEQUALIFIER_SHIFT,d1 bne.s .002 cmp.b #AKEY_BS,d0 ;BackSpace beq KeyBackSpace cmp.b #AKEY_DEL,d0 ;Delete beq KeyDelete cmp.b #AKEY_ARROWRG,d0 ;Cursor Right beq KeyCRight cmp.b #AKEY_ARROWLF,d0 ;Cursor Left beq KeyCLeft bra.s .001 .002 cmp.b #AKEY_ARROWRG,d0 ;Shift Cursor Right beq KeySCRight cmp.b #AKEY_ARROWLF,d0 ;Shift Cursor Left beq KeySCLeft .001 move.w acc_Qualifier(a2),d1 and.w #IEQUALIFIER_COMMAND,d1 beq.s StringConvert btst #ACCB_NOAMIGA,d6 bne.s StringConvert move.b acc_Char(a2),d0 cmp.b #'q',d0 beq KeyRestore cmp.b #'x',d0 beq KeyClearLine btst #ACCB_NOSTDAMIGA,d6 bne.s StringConvert cmp.b #'y',d0 beq KeyClearEOL cmp.b #'a',d0 beq KeyToggle StringConvert: lea acc_ExitTable(a2),a0 ;--- TEST FOR EXITCHAR bsr TestChar beq.s StringExitchar lea acc_ValidTable(a2),a0 ;--- TEST FOR VALIDCHAR bsr TestChar bne StringAgain btst #ACCB_FULLSTOP,d6 ;--- TEST FULLSTOP FLAG beq.s .001 btst #ACCB_OVERWRITE,d6 ;but only if we're in insert mode bne.s .001 move.w accs_Length(a2),d1 cmp.w accs_MaxLength(a2),d1 bge StringAgain .001 bsr CopyChar2Buffer ;--- COPY ValidChar TO BUFFER bra.w StringLoop StringExitchar: RETURN TRUE ;------------------------------------------------------------------ KeyBackSpace: ;--- BackSpace move.l accs_InputBuffer(a2),a0 move.w accs_Position(a2),d0 beq StringAgain subq.w #1,d0 move.w d0,accs_Position(a2) bsr AdjustField move.w accs_Length(a2),d1 bra.s KeyDel KeyDelete: ;--- move.l accs_InputBuffer(a2),a0 move.w accs_Position(a2),d0 move.w accs_Length(a2),d1 cmp.w d1,d0 bge StringAgain KeyDel: cmp.w d1,d0 ;move last part of string bge.s .Found move.b 1(a0,d0.w),(a0,d0.w) addq.w #1,d0 bra.s KeyDel .Found subq.w #1,d1 blt.w StringLoop move.w d1,accs_Length(a2) bra StringLoop KeyCRight: ;--- Cursor Right move.w accs_Position(a2),d0 cmp.w accs_Length(a2),d0 bge.w StringAgain addq.w #1,accs_Position(a2) bsr AdjustField lea sCursorRight(pc),a0 moveq #-1,d0 move.l a0,a1 move.l a3,a0 bsr DisplayRaw bra StringLoop KeyCLeft: ;--- Cursor Left move.w accs_Position(a2),d0 cmp.w #0,d0 ble.w StringAgain subq.w #1,accs_Position(a2) bsr AdjustField lea sCursorLeft(pc),a0 moveq #-1,d0 move.l a0,a1 move.l a3,a0 bsr DisplayRaw bra StringLoop KeySCRight: ;--- + Cursor Right move.w accs_Length(a2),d0 cmp.w accs_Position(a2),d0 beq.w StringAgain move.w d0,accs_Position(a2) bsr AdjustField bra StringLoop KeySCLeft: ;--- + Cursor Left tst.w accs_Position(a2) beq StringAgain clr.w accs_Position(a2) bsr AdjustField bra StringLoop KeyRestore: ;--- + q move.l accs_WorkBuffer(a2),d0 ;copy buffer to string beq StringLoop move.l d0,a0 move.l accs_InputBuffer(a2),a1 move.w accs_MaxLength(a2),d0 subq.w #1,d0 .CopyLoop move.b (a0)+,(a1)+ dbra d0,.CopyLoop clr.w accs_Position(a2) move.l accs_InputBuffer(a2),a0 ;determine length move.w accs_MaxLength(a2),d0 subq.w #1,d0 moveq #0,d1 .TLoop tst.b (a0)+ beq.s .TExit addq.w #1,d1 dbra d0,.TLoop .TExit move.w d1,accs_Length(a2) bsr AdjustField bra StringLoop KeyClearLine: ;--- + x clr.w accs_Position(a2) clr.w accs_Length(a2) bsr AdjustField bra StringLoop KeyClearEOL: ;--- + y move.w accs_Position(a2),accs_Length(a2) bsr AdjustField bra StringLoop KeyToggle: ;--- + a bchg #ACCB_OVERWRITE,d6 bra StringLoop ;------------------------------------------------------------------ AdjustField: move.l d0,-(sp) move.w accs_Position(a2),d0 sub.w accs_FieldLen(a2),d0 bgt.s .001 clr.w d0 .001 move.w d0,accs_DispPos(a2) move.l (sp)+,d0 rts ;------------------------------------------------------------------ CopyChar2Buffer: move.b acc_Char(a2),d1 beq.s .Exit cmp.b #CSI,d1 beq.s .Exit move.l accs_InputBuffer(a2),a1 move.w accs_Position(a2),d0 btst #ACCB_OVERWRITE,d6 bne.s .OverWrite move.w accs_Length(a2),d2 ;adjust length cmp.w accs_MaxLength(a2),d2 bge.s .MLoop addq.w #1,d2 move.w d2,accs_Length(a2) .MLoop cmp.w d0,d2 ;move last part of string ble.s .OverWrite subq.w #1,d2 move.b (a1,d2.w),1(a1,d2.w) bra.s .MLoop .OverWrite move.b d1,(a1,d0.w) ;place new char in string cmp.w accs_MaxLength(a2),d0 bge.s .End addq.w #1,d0 cmp.w accs_Length(a2),d0 ble.s .End move.w d0,accs_Length(a2) .End move.w d0,accs_Position(a2) bsr AdjustField .Exit rts ;------------------------------------------------------------------ EchoBuffer: move.w cnh_CursorStatus(a3),d3 move.w #CURSOROFF,d0 ;cursor off move.l a3,a0 bsr Cursor move.w acc_XStart(a2),d0 ;place cursor move.w acc_YStart(a2),d1 move.l a3,a0 bsr GotoXY move.l a2,-(sp) ;display string move.l accs_InputBuffer(a2),a0 move.w accs_Length(a2),d0 clr.b (a0,d0.w) adda.w accs_DispPos(a2),a0 move.l a0,-(sp) move.l sp,a2 lea vsJustBuffer(a4),a1 move.l a3,a0 moveq #-1,d0 bsr Display addq.l #4,sp move.l (sp)+,a2 btst #ACCB_JUSTIFIED,d6 ;Place cursor beq.s .001 move.w accs_FieldLen(a2),d0 ;; add.w accs_Position(a2),d0 sub.w accs_Length(a2),d0 bra.s .002 .001 move.w accs_Position(a2),d0 .002 sub.w accs_DispPos(a2),d0 add.w acc_XStart(a2),d0 move.w acc_YStart(a2),d1 move.l a3,a0 bsr GotoXY move.w d3,d0 ;restore cursor status move.l a3,a0 bsr Cursor rts ;------------------------------------------------------------------ PrepareEcho: PUSH a2/a3 btst #ACCB_JUSTIFIED,d6 beq.s .001 lea sJEcho(pc),a1 bra.s .002 .001 lea sEcho(pc),a1 .002 move.w accs_FieldLen(a2),d0 move.w d0,-(sp) ;max move.w d0,-(sp) ;min move.l sp,a2 move.l a3,a0 lea vsJustBuffer(a4),a3 moveq #32,d0 ;this should be enough bsr DoFormat ;format text to give the new format text addq.l #4,sp PULL a2/a3 rts ;------------------------------------------------------------------ ; @Convert ;------------------------------------------------------------------ ; ; Convert a string to a value. ; ; Decimal, Hex and Binary supported. ; Octal and Float not supported yet. ; ;------------------------------------------------------------------ ; IN d0.l = Flags ; d1.w = MaxLen (or NULL-term) ; a1.l = ^String ; a2.l = ^Space for Result (Size: 32 bits) ; OUT d0.l = ^Result (0 = Error) ;------------------------------------------------------------------ Convert: PUSH d2-d4/a2-a4 subq.w #1,d0 beq.s ConvertDecimal subq.w #1,d0 beq ConvertHex subq.w #1,d0 beq ConvertOctal subq.w #1,d0 beq ConvertBinary ConvertError: moveq #0,d0 ConvertExit: PULL d2-d4/a2-a4 rts ;------------------------------------------------------------------ ConvertDecimal: move.l a1,a3 .Loop tst.b (a3)+ beq.s .ZeroFound dbra d1,.Loop .ZeroFound ;a3 points behind number subq.l #1,a3 move.l a3,d0 sub.l a1,d0 ;determine numbers of ciffers beq.s ConvertError ;skip if too small cmp.w #10,d0 bgt.s ConvertError ;skip if too large clr.l (a2) lea alDecimalArray(pc),a4 subq.w #1,d0 .DecLoop moveq #0,d3 move.l (a4)+,d2 move.b -(a3),d3 sub.b #'0',d3 blo.s ConvertError cmp.b #9,d3 bhi.s ConvertError move.l d3,d4 mulu d2,d3 swap d2 mulu d2,d4 swap d4 add.l d4,d3 add.l d3,(a2) bcs ConvertError dbra d0,.DecLoop move.l a2,d0 bra.s ConvertExit ;------------------------------------------------------------------ ConvertHex: move.l a1,a3 .Loop tst.b (a3)+ beq.s .ZeroFound dbra d1,.Loop .ZeroFound ;a3 points behind number subq.l #1,a3 move.l a3,d0 sub.l a1,d0 ;determine numbers of ciffers beq ConvertError ;skip if too small cmp.w #8,d0 bgt ConvertError ;skip if too large moveq #0,d3 moveq #0,d1 subq.w #1,d0 .HexLoop move.b (a1)+,d3 sub.b #'0',d3 blt ConvertError cmp.b #9,d3 ble.s .HexNum bclr #5,d3 sub.b #7,d3 cmp.b #$0A,d3 blt ConvertError cmp.b #$0F,d3 bgt ConvertError .HexNum lsl.l #4,d1 or.w d3,d1 dbra d0,.HexLoop move.l d1,(a2) move.l a2,d0 bra ConvertExit ;------------------------------------------------------------------ ConvertOctal: RETURN 0 ;------------------------------------------------------------------ ConvertBinary: move.l a1,a3 .Loop tst.b (a3)+ beq.s .ZeroFound dbra d1,.Loop .ZeroFound ;a3 points behind number subq.l #1,a3 move.l a3,d0 sub.l a1,d0 ;determine numbers of ciffers beq ConvertError ;skip if too small cmp.w #32,d0 bgt ConvertError ;skip if too large clr.l (a2) moveq #0,d1 subq.w #1,d0 .BinLoop move.b (a1)+,d3 sub.b #'0',d3 blt ConvertError cmp.b #1,d3 bgt ConvertError lsr.b #1,d3 roxl.l #1,d1 dbra d0,.BinLoop move.l d1,(a2) move.l a2,d0 bra ConvertExit ;------------------------------------------------------------------ ; @SetMsgHandler ;------------------------------------------------------------------ ; ; Set Message Handler. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; a1.l = ^NewMsgHandler ; OUT d0.l = ^OldMsgHandler ;------------------------------------------------------------------ SetMsgHandler: move.l cnh_MsgHandler(a0),d0 move.l a1,cnh_MsgHandler(a0) rts ;------------------------------------------------------------------ ; @GetInfo ;------------------------------------------------------------------ ; ; Get some information about window. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; a1.l = ^ConInfo ; OUT d0.l = ^ConInfo ;------------------------------------------------------------------ GetInfo: PUSH d1/a2 move.l cnh_Unit(a0),a2 move.w cu_XCCP(a2),cin_XPos(a1) move.w cu_YCCP(a2),cin_YPos(a1) move.w cu_XMax(a2),cin_XSize(a1) move.w cu_YMax(a2),cin_YSize(a1) moveq #0,d0 move.b cu_AlgoStyle(a2),d1 bne.s .001 bset #SGFB_PLAIN,d0 bra.s .004 .001 btst #FSB_BOLD,d1 bne.s .002 bset #SGFB_BOLD,d0 .002 btst #FSB_ITALIC,d1 bne.s .003 bset #SGFB_ITALIC,d0 .003 btst #FSB_UNDERLINED,d1 bne.s .004 bset #SGFB_UNDERLINED,d0 .004 move.w d0,cin_Styles(a1) move.b cu_FgPen(a2),d0 add.w #30,d0 move.w d0,cin_FgCol(a1) move.b cu_BgPen(a2),d0 add.w #40,d0 move.w d0,cin_BgCol(a1) move.l a1,d0 PULL d1/a2 rts ;------------------------------------------------------------------ ; @SetGfx ;------------------------------------------------------------------ ; ; Set styles and colors for window. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; d0.w = Styles ; d1.w = Foreground Color ; d2.w = Background Color ; OUT - ;------------------------------------------------------------------ SetGfx: PUSH a1/a2/a3 move.l sp,a3 move.l #"%dm"<<8,-(sp) ;BgCol move.l #"%-d;",-(sp) ;FgCol btst #SGFB_PLAIN,d0 beq.s .001 move.l #"%-d;",-(sp) .001 btst #SGFB_BOLD,d0 beq.s .002 move.l #"%-d;",-(sp) .002 btst #SGFB_ITALIC,d0 beq.s .003 move.l #"%-d;",-(sp) .003 btst #SGFB_UNDERLINED,d0 beq.s .004 move.l #"%-d;",-(sp) .004 move.w #CSI,-(sp) move.l sp,a1 addq.l #1,a1 move.w d2,-(sp) ;BgCol move.w d1,-(sp) ;FgCol btst #SGFB_PLAIN,d0 beq.s .101 move.w #0,-(sp) .101 btst #SGFB_BOLD,d0 beq.s .102 move.w #1,-(sp) .102 btst #SGFB_ITALIC,d0 beq.s .103 move.w #3,-(sp) .103 btst #SGFB_UNDERLINED,d0 beq.s .104 move.w #4,-(sp) .104 move.l sp,a2 moveq #-1,d0 bsr Display move.l a3,sp PULL a1/a2/a3 rts ;------------------------------------------------------------------ ; @GotoXY ;------------------------------------------------------------------ ; ; Place cursor at (X,Y). ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; d0.w = XPos ; d1.w = YPos ; OUT - ;------------------------------------------------------------------ GotoXY: PUSH a1/a2 lea sGotoXY(pc),a1 move.w d0,-(sp) move.w d1,-(sp) move.l sp,a2 moveq #-1,d0 bsr Display addq.l #4,sp PULL a1/a2 rts ;------------------------------------------------------------------ ; @Scroll ;------------------------------------------------------------------ ; ; Scroll text in window lines. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; d0.w = Step ; OUT - ;------------------------------------------------------------------ Scroll: PUSH a1/a2 tst.w d0 beq.s .Exit bmi.s .001 lea sScrollDn(pc),a1 bra.s .002 .001 lea sScrollUp(pc),a1 .002 move.w d0,-(sp) moveq #-1,d0 move.l sp,a2 bsr Display addq.l #2,sp .Exit PULL a1/a2 rts ;------------------------------------------------------------------ ; @Cursor ;------------------------------------------------------------------ ; ; Set Cursor mode. ; ; Currently only ON and OFF. ; ;------------------------------------------------------------------ ; IN a0.l = ConHandle ; d0.w = Mode ; OUT - ;------------------------------------------------------------------ Cursor: move.l a1,-(sp) move.w d0,cnh_CursorStatus(a0) beq.s .001 lea sCursorOn(pc),a1 bra.s .002 .001 lea sCursorOff(pc),a1 .002 moveq #-1,d0 bsr DisplayRaw move.l (sp)+,a1 rts ;================================================================== ;================================================================== ;=== === ;=== DATA AREA === ;=== === ;================================================================== ;================================================================== ;--- Variable ----------------------------------------------------- pSysBase: dc.l 0 dWriteReplyPort:dcb.b MP_SIZE,0 ;--- Text --------------------------------------------------------- sLibName dc.b 'con.library',0 sLibID dc.b 'Console Library by BReese (31 oct 1991)',13,10,0 sIntName dc.b 'intuition.library',0 sMathName dc.b 'mathffp.library',0 sConDevName dc.b 'console.device',0 sDosName dc.b 'dos.library',0 sDosText dc.b 10,CSI,"1mCon.library",CSI,"0m is " dc.b "a Copyright © 1991 by Bjørn Reese." dc.b 10,"------ You can't execute me, I'm a library ------" dc.b 10,10,0 sDosTextEnd sDoStyle1 dc.b 27,'[0m',0 sDoStyle2 dc.b 27,'[1m',0 sDoStyle3 dc.b 27,'[3m',0 sDoStyle4 dc.b 27,'[4m',0 sDoFgCol dc.b 27,'[30m',0 sDoBgCol dc.b 27,'[40m',0 sEcho dc.b '%%-0%d.%ds',0 sJEcho dc.b '%%0%d.%ds',0 sGotoXY dc.b CSI,'%d;%dH',0 sCursorRight dc.b CSI,'C',0 sCursorLeft dc.b CSI,'D',0 sCursorOn dc.b CSI,' p',0 sCursorOff dc.b CSI,'0 p',0 sScrollUp dc.b CSI,'%dS',0 sScrollDn dc.b CSI,'%dT',0 sClear dc.b 12,0 ;Unused sInsCh dc.b CSI,'%d@',0 ;- sDelCh dc.b CSI,'%dP',0 ;- sInsLn dc.b CSI,'L',0 ;- sDelLn dc.b CSI,'M',0 ;- EVEN ;--- Table -------------------------------------------------------- alDecArray: dc.l 1000000000 dc.l 100000000 dc.l 10000000 dc.l 1000000 dc.l 100000 dc.l 10000 dc.l 1000 dc.l 100 dc.l 10 dc.l 0 alDecimalArray: dc.l 1 dc.l 10 dc.l 100 dc.l 1000 dc.l 10000 dc.l 100000 dc.l 1000000 dc.l 10000000 dc.l 100000000 dc.l 1000000000 awDefDefTable: dc.w alDefAll-awDefDefTable dc.w alDefEmpty-awDefDefTable dc.w alDefAlfanum-awDefDefTable dc.w alDefAlfa-awDefDefTable dc.w alDefNumeric-awDefDefTable dc.w alDefDecimal-awDefDefTable dc.w alDefHex-awDefDefTable dc.w alDefOctal-awDefDefTable dc.w alDefBinary-awDefDefTable dc.w alDefFloat-awDefDefTable alDefAll: dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff dc.l $ffffffff,$ffffffff,$ffffffff,$ffffffff alDefEmpty: dc.l 0,0,0,0,0,0,0,0 alDefAlfanum: dc.l 0 dc.l %11111111111111111111111111111111 ; -> dc.l %11111111111111111111111111111111 ;A -> dc.l %11111111111111111111111111111110 ;a -> minus dc.l 0 dc.l %11111111111111111111111111111111 ; -> dc.l %11111111111111111111111111111111 ;À -> dc.l %11111111111111111111111111111111 ;à -> alDefAlfa: dc.l 0 dc.l %10000000000000000000000000000000 ; dc.l %01111111111111111111111111100000 ;ABCDEFGHIJKLMNOPQRSTUVWXYZ dc.l %01111111111111111111111111100000 ;abcdefghijklmnopqrstuvwxyz dc.l 0 dc.l %10000000000000000000000000000000 ; dc.l %11111111111111111111111011111111 ;À -> minus × dc.l %11111111111111111111111011111111 ;à -> minus ÷ alDefNumeric: dc.l 0 dc.l %00000000000011101111111111000000 ;,-.0123456789 dc.l 0,0,0,0,0,0 alDefDecimal: dc.l 0 dc.l %00000000000001001111111111000000 ;-0123456789 dc.l 0,0,0,0,0,0 alDefHex: dc.l 0 dc.l %00000000000001001111111111000000 ;-0123456789 dc.l %01111110000000000000000000000000 ;ABCDEFG dc.l %01111110000000000000000000000000 ;abcdefg dc.l 0,0,0,0 alDefOctal: dc.l 0 dc.l %00000000000001001111111100000000 ;-01234567 dc.l 0,0,0,0,0,0 alDefBinary: dc.l 0 dc.l %00000000000001001100000000000000 ;-01 dc.l 0,0,0,0,0,0 alDefFloat: dc.l 0 dc.l %00000000000111101111111111000000 ;+,-.0123456789 dc.l %00000100000000000000000000000000 ;E dc.l %00000100000000000000000000000010 ;e^ dc.l 0,0,0,0 ;--- END OF LIBRARY ----------------------------------------------- CNOP 0,4 EndLib: IFNE DEBUG ;================================================================== ;================================================================== ;=== === ;=== DEBUG CODE AREA === ;=== === ;================================================================== ;================================================================== ;--- Comment ------------------------------------------------------ ; ; To execute a function you may use CALL or JSR. ; - CALL is is the normal and correct way to access the function. ; - JSR is used to single-step into the actual library code. ; ;------------------------------------------------------------------ ;--- System ------------------------------------------------------- BASEREG DebugDataArea,a5 ;================================================================== ;=== ;=== @DebugCode ;=== ;================================================================== SECTION ConDebug,CODE DebugCode: lea DebugDataArea(pc),a5 ;Global Data Pointer ;--- Prepare Con Library move.l (_SysBase).w,a6 lea LibFuncTable,a0 lea LibDataTable,a1 lea LibInit,a2 move.l #con_SIZEOF,d0 moveq #0,d1 CALL MakeLibrary move.l d0,pLibrary(a5) beq .Error move.l d0,a1 CALL AddLibrary ;--- Open Con Library moveq #0,d0 lea sConName(a5),a1 CALL OpenLibrary move.l d0,pConBase(a5) ;--- Open ConWindow move.l pConBase(a5),a6 lea dMyWindow(a5),a0 move.w #CURSORON,d0 CALL OpenCon move.l d0,pConHandle(a5) ;--- Test various function move.l pConBase(a5),a6 ;Global for tests bsr TestConvert bsr TestDisplay bsr TestDefineChars bsr TestAcceptString bsr TestAccept ;--- Clean up everything move.l pConBase(a5),a6 move.l pConHandle(a5),a0 CALL CloseCon move.l (_SysBase).w,a6 move.l pConBase(a5),a1 CALL CloseLibrary move.l pLibrary(a5),a1 CALL RemLibrary .Error moveq #0,d0 rts ;------------------------------------------------------------------ ; @TestConvert ;------------------------------------------------------------------ ; ; Convert a number (base determined by CNV_xxx in D0) ; and print it. ; ;------------------------------------------------------------------ TestConvert: move.l #CNV_HEX,d0 moveq #-1,d1 lea sNumber(pc),a1 lea lNumber(pc),a2 jsr Convert tst.l d0 beq.s .NoCnvt move.l d0,a2 move.l pConHandle(pc),a0 lea sNumberText(pc),a1 moveq #-1,d0 CALL Display .NoCnvt rts ;------------------------------------------------------------------ ; @TestDefineChars ;------------------------------------------------------------------ ; ; DefineChars must be called before using Accept/AcceptString to ; be sure that the correct chars are defined. ; ; DEFMODE_GET and DEFMODE_NEW are used to create a table from ; scratch, whereas DEFMODE_ADD and DEFMODE_SUB are used to change ; a table. ; ;------------------------------------------------------------------ TestDefineChars: ;--- Define ValidChars in Input structure lea dInput+acc_ValidTable(pc),a1 move.l #DEFMODE_GET+DEFALFANUM,d0 jsr DefineChars ;--- Define ExitChars in Input structure lea dInput+acc_ExitTable(pc),a1 move.l #DEFMODE_NEW,d0 lea aExitInput(pc),a2 jsr DefineChars ;--- Define ValidChars in Keypress structure lea dKeypress+acc_ValidTable(pc),a1 move.l #DEFMODE_NEW,d0 lea sValidKeypress(pc),a2 jsr DefineChars ;--- Define ExitChars in Keypress structure lea dKeypress+acc_ExitTable(pc),a1 move.l #DEFMODE_NEW,d0 lea aExitKeypress(pc),a2 jsr DefineChars rts ;------------------------------------------------------------------ ; @TestDisplay ;------------------------------------------------------------------ ; ; Nice and simple. ; ;------------------------------------------------------------------ TestDisplay: moveq #-1,d0 move.l pConHandle(pc),a0 lea sGoodDay(pc),a1 lea wGoodArg(pc),a2 jsr Display rts ;------------------------------------------------------------------ ; @TestAcceptString ;------------------------------------------------------------------ ; ; Get an input string and display it. ; ;------------------------------------------------------------------ TestAcceptString: ;--- Get an input string move.l pConHandle(pc),a0 move.l #ACCF_ERASE!ACCF_FULLSTOP,d0 lea dInput(pc),a1 jsr AcceptString ;--- Display the string found in accs_InputBuffer lea lInputArg(pc),a2 lea dInput(pc),a1 move.l accs_InputBuffer(a1),(a2) moveq #-1,d0 move.l pConHandle(pc),a0 lea sInputText(pc),a1 CALL Display rts ;------------------------------------------------------------------ ; @TestAccept ;------------------------------------------------------------------ ; ; Display a message at a certain location and wait until a valid ; char was pressed. ; ; \{ was used in the text, but GotoXY() could have been used as well ; ;------------------------------------------------------------------ TestAccept: ;--- Display message .Again moveq #-1,d0 move.l pConHandle(pc),a0 lea sContinue(pc),a1 CALL Display ;--- Get key move.l pConHandle(pc),a0 move.l #ACCF_WAIT!ACCF_ECHO!ACCF_ERASE,d0 lea dKeypress(pc),a1 jsr Accept ;--- Repeat until a valid key was found cmp.w #2,d0 beq.s .Again tst.w d0 bmi.s .Again rts ;================================================================== ;================================================================== ;=== === ;=== DEBUG DATA AREA === ;=== === ;================================================================== ;================================================================== DebugDataArea: ;--- Variable ----------------------------------------------------- pConHandle dc.l 0 pConBase dc.l 0 pLibrary dc.l 0 lNumber dc.l 0 wGoodArg dc.w 5432 lInputArg dc.l 0 ;--- Text --------------------------------------------------------- sConName dc.b 'con.library',0 sWindowTitle dc.b ' ==== ',0 sNumber dc.b 'ffffffff',0 sNumberText dc.b 'Number was: %lu',10,0 aExitInput dc.b 27,13,AKEY_HELP,0 sValidKeypress dc.b AKEY_F1,13,'Yy',0 aExitKeypress dc.b 27,'Nn',0 sGoodDay dc.b 'This is a test',10,10 dc.b '\Z3\B Here''s a\@ number: %d',10,0 sInputText dc.b 10,10,10,'Input was: "%s"',10,0 sContinue dc.b '\{12;30HContinue\{14;30H(Y/N):',0 EVEN ;--- Table -------------------------------------------------------- ;--- AcceptStructure for a simple keypress dKeypress: dc.w -1,-1 ;XStart,YStart dc.w -1,-1,-1 ;Styles,FgCol,BgCol dc.l CLOSEWINDOW ;ExitFlags dcb.l 7,0 ;Message stuff dc.b 0,0 ;Char,Pad001 dcb.b CHARDEFSIZE,-1 ;ValidTable dcb.b CHARDEFSIZE,-1 ;ExitTable dcb.l 4,0 ;Reserved ;--- AcceptStructure for a input line dInput: dc.w 30,5 ;XStart,YStart dc.w SGFF_BOLD,-1,-1 ;Styles,FgCol,BgCol dc.l CLOSEWINDOW ;ExitFlags dcb.l 7,0 ;Message stuff dc.b 0,0 ;Char,Pad001 dcb.b CHARDEFSIZE,-1 ;ValidTable dcb.b CHARDEFSIZE,-1 ;ExitTable dcb.l 4,0 ;Reserved dc.l sInputBuffer ;InputBuffer dc.l sWorkBuffer ;WorkBuffer dc.w 40,30 ;MaxLength,FieldLen dc.w 0 ;Length dc.w 0,0 ;Position,DispPos dcb.l 2,0 ;Reserved ;--- Intuition NewWindow Structure MyIDCMP SET CLOSEWINDOW MyFlags SET WINDOWSIZING!WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE MyFlags SET MyFlags!SMART_REFRESH!ACTIVATE!NOCAREREFRESH dMyWindow: dc.w 0,11 ;LeftEdge, TopEdge dc.w 640,245 ;Width, Height dc.b 0,1 ;DetailPen, BlockPen dc.l MyIDCMP ;IDCMPFlags dc.l MyFlags ;Flags dc.l 0,0 ;FirstGadget, CheckMark dc.l sWindowTitle ;Title dc.l 0 ;Screen dc.l 0 ;BitMap dc.w 640,30 ;MinWidth, MinHeight dc.w -1,-1 ;MaxWidth, MaxHeight dc.w WBENCHSCREEN ;Type ;--- Buffer ------------------------------------------------------- sInputBuffer: dc.b 'Original buffer',0 dcb.b 80-[*-sInputBuffer],0 sWorkBuffer: dcb.b 80,0 ENDC