1849 lines
56 KiB
NASM
1849 lines
56 KiB
NASM
.MLIB "TROGMACS.LIB"
|
||
.FILE 'TROGTEXT.ASM'
|
||
.TITLE " <<< T R O G ---- TEXT PROCESSING ROUTINES >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
|
||
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
* GET THE SYSTEM STUFF
|
||
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
|
||
.INCLUDE "DISPEQU.ASM" ;Display processor equates
|
||
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
|
||
.INCLUDE "SYSINC.ASM" ;Zunit system equates
|
||
.INCLUDE "TROGEQU.ASM"
|
||
.INCLUDE "IMGTBL.GLO" ;Image Equates and Globals
|
||
.INCLUDE "STRING.H"
|
||
.INCLUDE "TROGTEXT.TBL"
|
||
.INCLUDE "TROGSEQU.ASM" ; COLOR DEFS
|
||
|
||
; ASCII Character String Definition
|
||
; ---------------------------------
|
||
;
|
||
; An ASCII string is n consecutive bytes terminated by a 0.
|
||
;
|
||
; A string may contain:
|
||
;
|
||
; 1. Printable ASCII characters 20h - 7fh.
|
||
;
|
||
; 2. Command character denoted by a leading \.
|
||
;
|
||
; 3. Format specifier denoted by a leading %.
|
||
;
|
||
; Command Characters:
|
||
;
|
||
; A command character is identified by a preceding '\'. These
|
||
; are used to embed command characters and the correct arguments
|
||
; in the string.
|
||
;
|
||
; Arguments follow the string definition in the order that they,
|
||
; along with format arguments, appear in the string.
|
||
;
|
||
; To insert a single '\' into the string use '\\'.
|
||
;
|
||
; Character Argument Size
|
||
; --------- -------- ----
|
||
; a Sleep time to embed .WORD
|
||
; b Print color to embed .WORD
|
||
; c DMA control word to embed .WORD
|
||
; d Font to embed .LONG
|
||
; e [Y,X] Position to embed .LONG
|
||
; f [DY,DX] Position delta to embed .LONG
|
||
; i [Y,X] Spacing to embed .LONG
|
||
; n newline -
|
||
; p Use new palette, by I.D. .LONG
|
||
; u Turn underlining on
|
||
; v Turn underlining off
|
||
;
|
||
; Inserting a '*' between the \ and the command character will
|
||
; cause the argument to be indirected through the specified pointer.
|
||
;
|
||
; Example:
|
||
; .string "switch \*b color",0
|
||
; .long color_ptr
|
||
; The color that would be inserted is pointed to by color_ptr.
|
||
;
|
||
; Format Specifiers: (Note: if a string contains format specifiers
|
||
; then you must call stringf before
|
||
; passing it to the string routines.)
|
||
;
|
||
; %[flags][width][{h|l|L}]type
|
||
;
|
||
; flags - Used for justification of output and printing of
|
||
; signs, blanks and hexadecimal prefixes
|
||
;
|
||
; flag Meaning Default
|
||
; ---- ------- -------
|
||
; + Prefix the output value with a sign Sign only for
|
||
; + or - if it is of signed type. negatives
|
||
; # Prefix x,X with 0x,0X. no prefix
|
||
; , Used with d,u to print commas no commas
|
||
;
|
||
; width - A non-negative decimal integer controlling the
|
||
; minimum number of characters printed. If width
|
||
; is prefixed with a 0, zeros are added until the
|
||
; minimum width is reached.
|
||
;
|
||
; Prefix Use
|
||
; ------ ---
|
||
; h Used as a prefix with d,u,x,X and c to specify
|
||
; that the argument is a short (byte).
|
||
; l,L Used as a prefix with d,u,x and X to specify
|
||
; that the argument is a long.
|
||
;
|
||
; If the % format character is followed by another % then no
|
||
; format field is taken, rather a single % is written.
|
||
;
|
||
; type Size Output Format
|
||
; ---- ---- -------------
|
||
; b word Pointer to Binary Coded Decimal (bcd) integer
|
||
; d word Pointer to Signed decimal integer
|
||
; u word Pointer to Unsigned decimal integer
|
||
; x word Pointer to Unsigned hex integer using 'abcdef'
|
||
; X word Pointer to Unsigned hex integer using 'ABCDEF'
|
||
; c word Pointer to Single character
|
||
; p long Pointer to a null terminated string
|
||
; s long Address of a null terminated string
|
||
;
|
||
; Arguments - Must follow the string specification in order.
|
||
;
|
||
; Examples:
|
||
; ---------
|
||
; This will print the string verbatim,
|
||
; .string "Let's print a string",0
|
||
;
|
||
; This will put 'count' at the beginning of the string.
|
||
; .string "%d This is item number %d",0
|
||
; .long count ;pointer to int count
|
||
; .long count ;pointer to int count
|
||
;
|
||
; This will print 'short_item' as a short and 'long_item' as a long.
|
||
; .string "%hd This item is a long %ld",0
|
||
; .long short_item ;pointer to int count
|
||
; .long long_item ;pointer to long long_item
|
||
;
|
||
; Note: Strings may be nested as deep as defined by NUMSFBUFS
|
||
; Also, these parameters have limits, i.e. width, it would
|
||
; not be wise to specify a width of 30 or greater, and so on.
|
||
;
|
||
; Commas are not recognized on lead zero fills.
|
||
|
||
.REF DICT_LOOKUP
|
||
|
||
NUMSFBUFS EQU 5 ;NUMBER OF BUFFERS FOR STRINGF
|
||
SFBUFSIZE EQU 50*16 ;STRINGF BUFFERS ARE 99 CHARACTERS + TERMINATOR
|
||
|
||
.BSS STRNGRAM,30*16 ;RAM FOR BUILDING OF STRINGS BY CONVERSION ROUTINES
|
||
.BSS STRINGF_RAM,NUMSFBUFS*SFBUFSIZE ;RESERVE STRINGF BUFFERS
|
||
.BSS SFINDEX,16 ;INDEX OF NEXT USABLE STRINGF BUFFER
|
||
.BSS STRING1,32 ;TEMP PTR FOR NESTED STRINGS, ANYONE CAN USE
|
||
.BSS STRING2,32
|
||
.BSS STRING3,32
|
||
.BSS STRING_SHADOW,16
|
||
.BSS STRING_UNDERLINE,16 ; UNDERLINE FLAG
|
||
|
||
.EVEN
|
||
.TEXT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ANY OF THE FOLLOWING STRING PRINT ROUTINES REQUIRE *
|
||
* THESE ARGUMENTS. PLUS ANY OTHERS SPECIFIED. *
|
||
* *
|
||
* A0 = SLEEP TIME BETWEEN CHARACTERS *
|
||
* A4 = DMA CONTROL *
|
||
* A5 = [COLOR,PALETTE] *
|
||
* A8 = PTR TO STRING *
|
||
* A9 = [Y,X] SCREEN ADDRESS *
|
||
* A10 = [Y,X] SPACING *
|
||
* A11 = PTR TO FONT TABLE *
|
||
* *
|
||
* THEY ALL RETURN THESE VALUES INTACT, HOWEVER, ANY CHANGES *
|
||
* INCURRED FROM CONTROL BYTES WILL REMAIN. *
|
||
* ALSO RETURNED: *
|
||
* *
|
||
* A8 = POINTS TO THE NEXT BYTE AFTER THE STRING TERMINATOR *
|
||
* A9 = NEXT CURSOR POSITION *
|
||
* *
|
||
* NOTE: CALL ALL OF THEM WITH JSRP *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PRINTF - FORMAT AND PRINT A STRING. *
|
||
* A1 = ROUTINE TO CALL FOR OUTPUT *
|
||
* A8 = PTR TO STRING *
|
||
* RETURNS: *
|
||
* A1 = INTACT *
|
||
* A8 = POINTING TO WORD AFTER THE LAST ARGUMENT OF THIS STRING *
|
||
* *
|
||
* NOTE: CALL WITH JSRP *
|
||
* *
|
||
**************************************************************************
|
||
PRINTF
|
||
CALLR STRINGF
|
||
MMTM A12,A1,A3 ;SAVE ROUTINE AND NEXT STRING PTR
|
||
JSRPR A1
|
||
MMFM A12,A1,A8 ;RESTORE ROUTINE AND NEXT STRING (A8)
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRLNRM - PRINT STRING WITH: *
|
||
* LEFT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRLNRM
|
||
MOVI DMACNZ,A4
|
||
CLR A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRCNRM - PRINT STRING WITH: *
|
||
* CENTER JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRCNRM
|
||
MOVI DMACNZ,A4
|
||
MOVK 1,A14
|
||
JRUC STRINGER
|
||
**************************************************************************
|
||
* *
|
||
* STRRNRM - PRINT STRING WITH: *
|
||
* RIGHT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRRNRM
|
||
MOVI DMACNZ,A4
|
||
MOVK 2,A14
|
||
JRUC STRINGER
|
||
**************************************************************************
|
||
* *
|
||
* STRLNRMO - PRINT STRING WITH: *
|
||
* LEFT JUSTIFY, NORMAL, INSERT ON OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRLNRMO
|
||
MOVI DMACNZ|M_NOSCROLL,A4
|
||
MOVI 10000H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRCNRMO - PRINT STRING WITH: *
|
||
* CENTER JUSTIFY, NORMAL, INSERT ON OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRCNRMO
|
||
MOVI DMACNZ|M_NOSCROLL,A4
|
||
MOVI 10001H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRRNRMO - PRINT STRING WITH: *
|
||
* RIGHT JUSTIFY, NORMAL, INSERT ON THE OBJECT LIST *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRRNRMO
|
||
MOVI DMACNZ,A4
|
||
MOVI 10002H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRLNC - PRINT STRING WITH: *
|
||
* LEFT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* NO CONSTANT SUBSTITUTE *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRLNC:
|
||
MOVI DMAWNZ,A4
|
||
CLR A14
|
||
JRUC STRINGER
|
||
**************************************************************************
|
||
* *
|
||
* STRCNC - PRINT STRING WITH: *
|
||
* CENTER JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* NO CONSTANT SUBSTITUTE *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRCNC:
|
||
MOVI DMAWNZ,A4
|
||
MOVK 1,A14
|
||
JRUC STRINGER
|
||
**************************************************************************
|
||
* *
|
||
* STRRNC - PRINT STRING WITH: *
|
||
* RIGHT JUSTIFY, NORMAL, NOT PUT ON THE OBJECT LIST *
|
||
* NO CONSTANT SUBSTITUTE *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRRNC:
|
||
MOVI DMAWNZ,A4
|
||
MOVK 2,A14
|
||
JRUC STRINGER
|
||
**************************************************************************
|
||
* *
|
||
* STRLNCO - PRINT STRING WITH: *
|
||
* LEFT JUSTIFY, NORMAL, INSERT ON OBJECT LIST *
|
||
* NO CONSTANT SUBSTITUTE *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRLNCO
|
||
MOVI DMAWNZ|M_NOSCROLL,A4
|
||
MOVI 10000H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRCNCO - PRINT STRING WITH: *
|
||
* CENTER JUSTIFY, NORMAL, INSERT ON OBJECT LIST *
|
||
* NO CONSTANT SUBSTITUTE *
|
||
* TRASHES A4 & A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRCNCO:
|
||
MOVI DMAWNZ|M_NOSCROLL,A4
|
||
MOVI 10001H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SHADOW ROUTINES -- IDENTICAL TO ABOVE EXCEPT YOU HAVE TO TACK *
|
||
* AN "S" ON THE END OF THE ROUTINE NAME *
|
||
* *
|
||
**************************************************************************
|
||
|
||
STRLNRMS
|
||
MOVI DMACNZ,A4
|
||
MOVI 8000H,A14
|
||
JRUC STRINGER
|
||
|
||
STRCNRMS
|
||
MOVI DMACNZ,A4
|
||
MOVI 8001H,A14
|
||
JRUC STRINGER
|
||
|
||
STRRNRMS
|
||
MOVI DMACNZ,A4
|
||
MOVI 8002H,A14
|
||
JRUC STRINGER
|
||
|
||
STRCNRMOS
|
||
MOVI DMACNZ|M_NOSCROLL,A4
|
||
MOVI 18001H,A14
|
||
JRUC STRINGER
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRINGER - OUTPUT A TEXT STRING, THIS IS A PROCESS! *
|
||
* A14 = FLAGS - INSERT:JUSTIFY *
|
||
* BIT 16 = 1 INSERT ON OBJECT LIST, 0 JUST QUEUE THE DMA *
|
||
* BIT 15 = 1 SHADOW THE CHARACTERS THAT GET KICKED OUT, TOO *
|
||
* JUSTIFY = 0 LEFT JUSTIFY *
|
||
* 1 CENTER JUSTIFY *
|
||
* 2 RIGHT JUSTIFY *
|
||
* *
|
||
* NOTE: CALL WITH JSRP *
|
||
**************************************************************************
|
||
STRINGER
|
||
CLR B0
|
||
MOVE B0,@STRING_UNDERLINE,W ; CLEAR OUT UNDERLINING
|
||
BTST 15,A14
|
||
JRZ STRINGER_NOSHAD
|
||
MOVK 1,B0
|
||
STRINGER_NOSHAD
|
||
MOVE B0,@STRING_SHADOW,W
|
||
CALLR SPACING ;CALCULATE THE SPACING FOR THIS FONT
|
||
|
||
MOVE A9,A3 ;KEEP INITIAL POSITION FOR NEWLINES
|
||
|
||
CALLR JUSTIFY ;JUSTIFY THE POSITION CORRECTLY
|
||
|
||
.IF YUNIT
|
||
CLR A7
|
||
MOVX A5,A7
|
||
CMPI 0F0FH,A7 ;ARE WE ALREADY ADJUSTED?
|
||
JRHI STRINGR2 ;BR = YES!
|
||
SLL 4,A7 ;DO THE YUNIT SHUFFLE
|
||
MOVX A7,A5
|
||
.ENDIF
|
||
|
||
STRINGR2
|
||
MOVB *A8,A7 ;GET A CHARACTER
|
||
SLL 24,A7
|
||
SRL 24,A7 ;MAKE SURE WE'RE POSITIVE
|
||
JREQ STRINGRX ;BR = STRING BE GONE BROTHA
|
||
ADDK 8,A8 ;NEXT BYTE
|
||
CLR B0 ; NOT A SPACE, YET
|
||
|
||
CMPI ' ',A7
|
||
JRHI STRNCHAR ;BR = IT'S KOSH BABY
|
||
JRLO STRNCONT ;AHHHH SO VEE HAF CONTROLLL
|
||
|
||
CLR A7
|
||
MOVE A9,B2 ; SAVE IT AWAY
|
||
MOVX A6,A7 ;ADD X SPACE
|
||
ADDXY A7,A9 ;AND ADD IT IN
|
||
ADDXY A10,A9 ;ADD SPACING
|
||
|
||
MOVE @STRING_UNDERLINE,B1 ; CHECK FOR UNDERLINE
|
||
JRZ STRINGR2 ; NOPE -- DON'T DO ANYTHING
|
||
MOVE B2,B0
|
||
MOVE A9,B2
|
||
MOVE B0,A9 ; SWAP THE LOCATIONS
|
||
MOVK 1,B0
|
||
MOVI 'A',A7 ; SET TO AN 'A' FOR APPEARANCES
|
||
JRUC STRNCHAR ; PROCESS IT
|
||
|
||
*
|
||
*CHECK HERE FOR CONTROL CHARACTERS
|
||
*
|
||
STRNCONT:
|
||
CMPI NEW_SLEEP,A7
|
||
JRNE STRCC1
|
||
MOVE *A8+,A0,W ;NEW SLEEP TIME
|
||
JRUC STRINGR2
|
||
STRCC1:
|
||
CMPI NEW_PCOLOR,A7
|
||
JRNE STRCC2
|
||
MOVE *A8+,A1,W ;NEW PRINT COLOR
|
||
SLL 16,A1
|
||
MOVY A1,A5 ;THE CORRECT POSITION PLEASE
|
||
JRUC STRINGR2
|
||
STRCC2:
|
||
CMPI NEW_CONTROL,A7
|
||
JRNE STRCC3
|
||
MOVE *A8+,A4,W ;NEW DMA FLAGS
|
||
JRUC STRINGR2
|
||
STRCC3:
|
||
CMPI NEW_FONT,A7
|
||
JRNE STRCC4
|
||
MOVE *A8+,A11,L ;NEW FONT
|
||
CALLR SPACING ;RE-CALCULATE SPACING FOR THIS FONT
|
||
JRUC STRINGR2
|
||
STRCC4:
|
||
CMPI NEW_XY,A7
|
||
JRNE STRCC5
|
||
MOVE *A8+,A9,L ;NEW POSITION
|
||
JRUC STRINGR2
|
||
STRCC5:
|
||
CMPI NEW_SPACING,A7
|
||
JRNE STRCC6
|
||
MOVE *A8+,A10,L ;NEW SPACING
|
||
JRUC STRINGR2
|
||
STRCC6:
|
||
CMPI ASCII_CR,A7
|
||
JRNE STRCC7
|
||
MOVE A3,A9 ;GET BACK TO WHERE YOU ONCE BELONGED
|
||
CLR A7
|
||
MOVY A6,A7
|
||
ADDXY A7,A9 ;NEXT LINE DOWN
|
||
MOVE A9,A3 ;STORE THIS POSITION
|
||
CALLR JUSTIFY ;AND REJUSTIFY YOUR POSITION
|
||
JRUC STRINGR2
|
||
STRCC7:
|
||
CMPI ADD_DYDX,A7
|
||
JRNE STRCC8
|
||
MOVE *A8+,A1,L ;GET DELTAS
|
||
ADDXY A1,A9 ;AND ADD THEM
|
||
JRUC STRINGR2
|
||
STRCC8:
|
||
CMPI NEW_PALETTE,A7
|
||
JRNE STRCC9
|
||
MOVE A0,A1
|
||
MOVE *A8+,A0,L ;GET PALETTE I.D.
|
||
CALLA FINDPAL ;FIND IT'S SPOT
|
||
MOVX A0,A5
|
||
MOVE A1,A0
|
||
JRUC STRINGR2
|
||
STRCC9:
|
||
CMPI UNDERLINE_ON,A7 ; UNDERLINING TURNED ON?
|
||
JRNE STRCC10
|
||
MOVK 1,B0
|
||
MOVE B0,@STRING_UNDERLINE,W
|
||
JRUC STRINGR2
|
||
|
||
STRCC10:
|
||
CMPI UNDERLINE_OFF,A7
|
||
JRNE STRCC11
|
||
CLR B0
|
||
MOVE B0,@STRING_UNDERLINE,W
|
||
JRUC STRINGR2
|
||
|
||
STRCC11:
|
||
*ADD NEW CONTROL CHARACTERS HERE
|
||
JRUC STRINGR2
|
||
|
||
*OUTPUT A CHARACTER
|
||
STRNCHAR:
|
||
MMTM SP,A0,A2,A3,A4,A6,A10,A14
|
||
|
||
MOVE A11,A1 ;ESCAPE TO THE OTHER SIDE
|
||
|
||
SUBI 21H,A7 ;GET A BASE
|
||
SLL 5,A7
|
||
ADD A7,A1
|
||
MOVE *A1,A1,L ;LOAD THE ADDRESS OF THE IMAGE HEADER
|
||
CALLA GSAGOF
|
||
CALLA GANIOF
|
||
|
||
BTST 16,A14
|
||
JREQ STRNQDMA ;BR = DO NORMAL DMA OF STRING
|
||
|
||
*CREATE THE CHARACTER AS AN OBJECT, HERE
|
||
|
||
CALLA GETOBJ
|
||
JREQ STRNGDUN ;BR = NO OBJECT
|
||
MOVE A1,*A0(OIMG),L
|
||
MOVE A5,*A0(OPAL),L
|
||
MOVE A0,A14
|
||
ADDI OSIZE+20H,A14
|
||
MMTM A14,A2,A3,A4 ;STUFF VITAL SHIT
|
||
CLR A14
|
||
ADDI OZVEL+20H,A0
|
||
MOVK 6,A4
|
||
STRNGOL
|
||
MOVE A14,-*A0,L
|
||
DSJS A4,STRNGOL ;ZERO OUT THE VELS & POSITIONS
|
||
SUBI 64,A0 ;BACK TO NORMAL
|
||
MOVI TEXTOID,A14
|
||
MOVE A14,*A0(OID),W ;STUFF A FINDABLE I.D.
|
||
MOVE A9,A14
|
||
SRL 16,A6
|
||
MOVY A7,A6
|
||
SUBXY A6,A14 ;ADJUST FOR ANIMATION POINT
|
||
MOVE A14,*A0(OXPOS),W
|
||
SRL 16,A14
|
||
MOVE A14,*A0(OYPOS),W ;STUFF POSITIONS
|
||
MOVI 7FFF000AH,A14
|
||
MOVE A14,*A0(OZVAL),L
|
||
MOVE *A0(OFLAGS),A4,W
|
||
BTST B_NOSCROLL,A4 ;IS THIS GUY A SCROLLING STRING?
|
||
JRNE STRN_NOWC ;BR = NO, SKIP WORLD COORDS.
|
||
CALLA ADJSTWTL ;PUT US IN THE WORLD
|
||
STRN_NOWC:
|
||
MOVE B0,B0
|
||
JRNZ STRN_NO_INS_OBJECT
|
||
CALLA INSOBJ ;STUFF THIS SHEEEEEEET
|
||
STRN_NO_INS_OBJECT
|
||
;
|
||
; CHECK FOR UNDERLINING
|
||
;
|
||
MOVE @STRING_UNDERLINE,A14,W
|
||
JRZ STR_NO_UNDERLINE_OBJECT
|
||
CMPI RD7FONT,A11 ; ONLY UNDERLINES 7 POINT
|
||
JRNZ STR_NO_UNDERLINE_OBJECT
|
||
PUSH A0 ; SAVE OBJECT FOR SHADOWING
|
||
PUSH A8 ; SAVE TEXT POINTER
|
||
MOVE A0,A14
|
||
CALLA GETOBJ
|
||
JRZ STR_OBJ_UNDERLINE_DONE
|
||
MOVE A14,A8 ; OBJECT TO COPY
|
||
CALLA COPY_OBJ ; DUPE THE OLD OBJECT
|
||
MOVE A0,A8
|
||
MOVI FONT8UNDERLINE,A1
|
||
MOVI DMACAL,A4 ; CONSTANT
|
||
CALLA ANI ; PRESTO
|
||
MOVE *A8(OXPOS),A14,W
|
||
SUBK 1,A14
|
||
MOVE A14,*A8(OXPOS),W
|
||
MOVE B0,B0 ; CHECK TO SEE IF IT IS A SPACE
|
||
JRNZ STR_OBJ_UNDERLINE_DONE
|
||
CALLA INSOBJ ; GET IT UP
|
||
STR_OBJ_UNDERLINE_DONE
|
||
PULL A8 ; RESTORE TEXT POINTER
|
||
PULL A0 ; GRAB OBJECT BACK FOR SHADOWING
|
||
STR_NO_UNDERLINE_OBJECT
|
||
;
|
||
; CHECK FOR SHADOWING
|
||
;
|
||
MOVE @STRING_SHADOW,A14,W
|
||
JRZ STR_NO_SHADOW_OBJECT
|
||
MOVE A0,A14 ; ORIGINAL OBJECT
|
||
CALLA GETOBJ
|
||
JREQ STRNGDUN ; BR = COULDN'T GET AN OBJECT
|
||
PUSH A8 ; GOTTA PRESERVE A8, DUDES!
|
||
MOVE A14,A8
|
||
CALLA COPY_OBJ ; DUPE THE OLD OBJECT
|
||
MOVK 2,A8 ; ASSUME [2,2] OFFSET
|
||
CMPI RD5FONT,A11
|
||
JRZ STRN_SPAC1
|
||
CMPI RD7FONT,A11 ; 7 PT FONT GETS [1,1] OFFSET
|
||
JRNZ STRN_SPAC2
|
||
STRN_SPAC1
|
||
MOVK 1,A8
|
||
STRN_SPAC2
|
||
MOVE *A0(OXPOS),A14,W
|
||
ADD A8,A14
|
||
MOVE A14,*A0(OXPOS),W
|
||
MOVE *A0(OYPOS),A14,W ; STUFF POSITIONS
|
||
ADD A8,A14
|
||
MOVE A14,*A0(OYPOS),W ; STUFF POSITIONS
|
||
MOVI 7FFF0009H,A14 ; JUST UNDER THE REAL THING
|
||
MOVE A14,*A0(OZVAL),L ; PUT IT UNDER REGULAR STUFF
|
||
MOVI TROG_PBLACK,A14
|
||
MOVE A14,*A0(OPAL),L
|
||
BTST B_NOSCROLL,A4 ;IS THIS GUY A SCROLLING STRING?
|
||
JRNE SHAD_STRN_NOWC ;BR = NO, SKIP WORLD COORDS.
|
||
CALLA ADJSTWTL ;PUT US IN THE WORLD
|
||
SHAD_STRN_NOWC:
|
||
CALLA INSOBJ
|
||
PULL A8
|
||
|
||
STR_NO_SHADOW_OBJECT:
|
||
JRUC STRNGDUN
|
||
|
||
*SIMPLY DMA THE SUCKER, HERE
|
||
STRNQDMA
|
||
MOVE A1,A10
|
||
MOVE A5,A1 ;CONSTANT:PALETTE
|
||
MOVE A4,A5 ;OFFSET:CONTROL
|
||
MOVE A3,A4 ;SAG
|
||
|
||
MOVE A9,A3
|
||
SRL 16,A6
|
||
MOVY A7,A6
|
||
SUBXY A6,A3 ;ANIMATION PNT ADJUSTED DAG
|
||
|
||
MOVE @STRING_SHADOW,A14,W
|
||
JRZ NO_DMA_SHADOW
|
||
MMTM SP,A1,A3
|
||
MOVI TROG_PBLACK,A1 ; BLACK OUT OF DUXPAL
|
||
ADDI [1,1],A3 ; [1,1] FOR THE 7 PT FONT
|
||
CMPI RD5FONT,A11
|
||
JRZ STRNQD_SPAC1
|
||
CMPI RD7FONT,A11
|
||
JRZ STRNQD_SPAC1
|
||
ADDI [1,1],A3 ; ANOTHER FOR THE BIGGER FONTS
|
||
STRNQD_SPAC1
|
||
CALLA DMAN
|
||
MMFM SP,A1,A3
|
||
NO_DMA_SHADOW
|
||
MOVE B0,B0 ; CHECK FOR SPACE
|
||
JRNZ DMA_SPACE
|
||
CALLA DMAN
|
||
DMA_SPACE
|
||
;
|
||
; CHECK FOR UNDERLINING
|
||
;
|
||
MOVE @STRING_UNDERLINE,A14,W
|
||
JRZ NO_DMA_UNDERLINE
|
||
PUSH A1
|
||
MOVI FONT8UNDERLINE,A1
|
||
MOVI DMACAL,A4
|
||
CALLA GSAGOF
|
||
CALLA GANIOF
|
||
PULL A1
|
||
MOVE A4,A5 ;OFFSET:CONTROL
|
||
MOVE A3,A4 ;SAG
|
||
MOVE A9,A3
|
||
SRL 16,A6
|
||
MOVY A7,A6
|
||
SUBXY A6,A3 ;ANIMATION PNT ADJUSTED DAG
|
||
SUBK 1,A3 ; SHIFT OVER 1 MORE
|
||
CALLA DMAN
|
||
NO_DMA_UNDERLINE
|
||
MOVE A1,A5
|
||
MOVE A10,A1
|
||
STRNGDUN
|
||
MOVE B0,B0 ; CHECK TO SEE IF CHAR IS A SPACE
|
||
JRZ STRNG_DUN_NO_SPACE
|
||
MOVE B2,A9 ; SETUP THE NEW SPACING
|
||
MMFM SP,A2,A3,A4,A6,A10,A14
|
||
JRUC STRNG_BYPASS_1
|
||
STRNG_DUN_NO_SPACE
|
||
MOVE *A1(ISIZE),A6,W ;GET THE VISIBLE HORIZONTAL SIZE
|
||
ADDXY A6,A9 ;GET TO THE OTHER SIDE OF THE CHARACTER
|
||
|
||
MMFM SP,A2,A3,A4,A6,A10,A14
|
||
ADDXY A10,A9 ;ADD IN SPACING
|
||
STRNG_BYPASS_1
|
||
MOVE *SP+,A0,L
|
||
JREQ STRINGR2 ;BR = NO SLEEP
|
||
MMTM A12,A0,A3,A4,A5,A6,A14
|
||
CALLA PRCSLP
|
||
MMFM A12,A0,A3,A4,A5,A6,A14
|
||
JRUC STRINGR2
|
||
STRINGRX
|
||
ADDK 8,A8 ;GET TO THE NEXT BYTE
|
||
MOVE A5,A6
|
||
SRL 16,A6 ;RETURN THE COLOR CORRECTLY
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* END OF PRINT ROUTINES. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PRINT FORMAT AND UTILITY ROUTINES *
|
||
* *
|
||
**************************************************************************
|
||
*
|
||
*NULL STRING FOR DUMMIES
|
||
*
|
||
DUMSTRNG .WORD 0
|
||
*
|
||
*EQUATES FOR STRINGF
|
||
B_LJUSTIFY EQU 0 ;LEFT JUSTIFY WITHIN FIELD
|
||
B_CJUSTIFY EQU 1 ;CENTER JUSTIFY WITHIN FIELD
|
||
B_PSIGN EQU 2 ;PRINT SIGN IF SIGNED
|
||
B_COMMAS EQU 3 ;PRINT COMMAS
|
||
B_PHEX EQU 4 ;PRINT HEX PREFIX
|
||
B_ZPRINT EQU 5 ;FILL UNUSED WIDTH WITH ZEROS
|
||
B_SIGNED EQU 6 ;THIS VALUE IS OF SIGNED TYPE
|
||
B_CAP EQU 7 ;USE CAPITAL LETTERS FOR HEX DIGITS
|
||
*
|
||
*SIZE EQUATES
|
||
TYPE_SHORT EQU 8
|
||
TYPE_INT EQU 16
|
||
TYPE_LONG EQU 32
|
||
**************************************************************************
|
||
* *
|
||
* STRINGF - STRING FORMAT ROUTINE. *
|
||
* SEE "ASCII Character String Definition" AT THE TOP OF FILE. *
|
||
* A8 = PTR TO STRING TO FORMAT. *
|
||
* RETURNS: *
|
||
* A3 = PTR TO .EVEN WORD AFTER THE LAST ARGUMENT OF THE STRING *
|
||
* A8 = PTR TO FORMATTED STRING *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
STRINGF:
|
||
CLRM @SFINDEX,W ;CLEAR THE STRING BUILD MEMORY INDEX
|
||
STRINGF_RECURSE: ;RECURSION ENTRY POINT
|
||
MMTM SP,A0,A1,A2,A4,A5,A6,A7
|
||
MOVE @SFINDEX,A7,W ;GET THE INDEX OF THE NEXT BUFFER TO USE
|
||
CMPI NUMSFBUFS,A7
|
||
JRLO SFALLOC ;MORE BUFFERS TO BE HAD
|
||
MOVI DUMSTRNG,A8 ;POINT TO A NULL STRING WHEN OUT OF MAMMARY
|
||
JRUC STRINGFX
|
||
*ALLOCATE A BUFFER IN WHICH TO BUILD THE STRING
|
||
SFALLOC
|
||
INCM @SFINDEX,W ;INCREMENT THE INDEX FOR NEXT MAM GRAB
|
||
MOVI SFBUFSIZE,A0
|
||
MPYU A0,A7 ;OFFSET TO NEW ARRAY
|
||
ADDI STRINGF_RAM,A7 ;ADD OFFSET, A7 POINTS TO OUR BUILD SPACE
|
||
MOVE A7,A5 ;STORE PTR TO BOS HERE
|
||
MOVE A8,A6
|
||
SFARGLP:
|
||
MOVB *A6,A0 ;FIND THE ARGUMENT LIST
|
||
ADDK 8,A6 ;AND PNT A6 AT IT
|
||
MOVE A0,A0
|
||
JRNZ SFARGLP ;SEARCHING FOR NULL TERMINATOR
|
||
ADDK 0FH,A6 ;DO OUR OWN .EVEN TO MATCH ASSEMBLER
|
||
SRL 4,A6
|
||
SLL 4,A6 ;MASK FRACTIONAL WORD
|
||
SFBUILDLP:
|
||
CALLR GETCHAR
|
||
JRNC SFBUILDCH ;WE RECIEVED A NORMAL CHARACTER
|
||
MOVB A0,*A7 ;PASS THE CONTROL
|
||
ADDK 8,A7
|
||
SFBUILDARG:
|
||
MOVE A1,A1
|
||
JRZ SFBUILDLP ;FINISHED
|
||
MOVB *A8,*A7
|
||
ADDK 8,A8
|
||
ADDK 8,A7 ;TRANSFER ARGS
|
||
DEC A1 ;DEC ARG COUNT
|
||
JRUC SFBUILDARG
|
||
SFBUILDCH:
|
||
BTST 7,A0 ; CHECK THE HIGH BIT
|
||
JRZ SFVALIDCH
|
||
MOVE A8,A1 ; SAVE IT AWAY
|
||
CALLA DICT_LOOKUP ; LOOKUP THE WORD IN A0
|
||
JRNZ SFA8TOA7 ; IF THERE IS SOMETHING, USE IT
|
||
MOVE A1,A8 ; IF BAD RETURN
|
||
SFVALIDCH
|
||
CMPI '%',A0
|
||
JRNE SFCONTROL ;NOT A FORMAT CHARACTER, HOW ABOUT CONTROL
|
||
*PARSE STRINGF FORMAT SPECIFIER HERE
|
||
CALLR GETCHARI ;NO SPECIAL CHARACTERS ALLOWED IN FORMAT
|
||
CMPI '%',A0
|
||
JREQ SFXFER ;JUST PRINT A PERCENT SIGN
|
||
|
||
CALLR FFLAGS ;GET THE FORMAT FLAGS IF THERE ARE ANY
|
||
CALLR FWIDTH ;GET FORMAT WIDTH NEXT
|
||
CALLR FTYPE ;GET THE FORMAT TYPE
|
||
SFTYPE_LP:
|
||
CMPI 's',A0 ;SEE IF IT'S A STRING
|
||
JRNE SFTYPE0
|
||
MOVE A8,A1 ;STORE A8
|
||
MOVE *A6+,A8,L ;GET THE ADDRESS OF THE STRING(ALWAYS LONG)
|
||
CALLR STRINGF_RECURSE
|
||
JRUC SFA8TOA7 ;TRANSFER THE NEW #
|
||
SFTYPE0:
|
||
CMPI 'p',A0 ;SEE IF IT'S A POINTER TO A STRING
|
||
JRNE SFTYPE1
|
||
MOVE A8,A1 ;STORE A8
|
||
MOVE *A6+,A8,L ;GET THE PTR TO THE STRING(IT'S ALWAYS LONG)
|
||
MOVE *A8,A8,L ;NOW GET THE ADDRESS
|
||
CALLR STRINGF_RECURSE
|
||
JRUC SFA8TOA7 ;TRANSFER THE NEW #
|
||
SFTYPE1:
|
||
MOVE A8,A1 ;SAVE A8
|
||
CALLR GETARGI
|
||
CMPI 'b',A0
|
||
JRNE SFTYPE5 ;BCD
|
||
CALLR BCD_TO_ASCII_DEC ;CONVERT
|
||
JRUC SFA8TOA7
|
||
SFTYPE5:
|
||
CMPI 'd',A0 ;SIGNED DECIMAL
|
||
JRNE SFTYPE6
|
||
BSET B_SIGNED,A4
|
||
CMPI TYPE_INT,A2 ;SIGN EXTEND LITTLE BROTHER
|
||
JRNE SFTYPE5A
|
||
SEXT A8
|
||
JRUC SFTYPE5B
|
||
SFTYPE5A:
|
||
CMPI TYPE_SHORT,A2 ;AND THE YOUNGEST
|
||
JRNE SFTYPE5B
|
||
SLL 24,A8
|
||
SRA 24,A8
|
||
SFTYPE5B:
|
||
CALLR HEX_TO_ASCII_DEC ;CONVERT
|
||
JRUC SFA8TOA7
|
||
SFTYPE6:
|
||
CMPI 'u',A0 ;UNSIGNED DECIMAL
|
||
JRNE SFTYPE7
|
||
CALLR HEX_TO_ASCII_DEC
|
||
JRUC SFA8TOA7
|
||
SFTYPE7:
|
||
CMPI 'x',A0 ;UNSIGNED HEXADECIMAL WITH 'abcdef'
|
||
JRNE SFTYPE8
|
||
CALLR HEX_TO_ASCII_HEX
|
||
JRUC SFA8TOA7
|
||
SFTYPE8:
|
||
CMPI 'X',A0 ;UNSIGNED HEXADECIMAL WITH 'ABCDEF'
|
||
JRNE SFTYPE9
|
||
BSET B_CAP,A4
|
||
CALLR HEX_TO_ASCII_HEX
|
||
JRUC SFA8TOA7
|
||
SFTYPE9:
|
||
CMPI 'c',A0 ;SINGLE CHARACTER
|
||
JRNE SFTYPE10
|
||
MOVB A8,*A7
|
||
ADDK 8,A7
|
||
MOVE A1,A8
|
||
JRUC SFBUILDLP
|
||
SFTYPE10:
|
||
*ADD NEW type SPECIFIERS HERE
|
||
JRUC SFBUILDLP
|
||
*TRANSFER NEW FORMAT STRING TO THE STRING WE ARE BUILDING
|
||
SFA8TOA7:
|
||
MOVB *A8,A0
|
||
JRZ SFA8A7DONE
|
||
ADDK 8,A8
|
||
MOVB A0,*A7
|
||
ADDK 8,A7
|
||
JRUC SFA8TOA7
|
||
SFA8A7DONE:
|
||
MOVE A1,A8
|
||
JRUC SFBUILDLP
|
||
*
|
||
*CHECK FOR A CONTROL CHARACTER
|
||
SFCONTROL:
|
||
CMPI '\',A0
|
||
JRNE SFXFER ;JUST ANOTHER CHARACTER
|
||
CALLR GETCHARI ;NOW GET THE CONTROL CHARACTER
|
||
CMPI '\',A0
|
||
JREQ SFXFER ;OH! HE WANTS TO PRINT THIS
|
||
CLR A3 ;ASSUME NO INDIRECTION
|
||
CMPI '*',A0 ;IS THERE INDIRECTION HERE?
|
||
JRNE SFCONTROL_IMM ;BR = NO
|
||
MOVK 1,A3 ;CONTROL INDIRECT FLAG
|
||
CALLR GETCHARI ;THIS TIME GET THE CONTROL CHARACTER FOR REAL!
|
||
|
||
SFCONTROL_IMM:
|
||
CMPI 'a',A0
|
||
JRNE SFC1
|
||
MOVI NEW_SLEEP,A0 ;NEW SLEEP TIME
|
||
MOVI TYPE_INT,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC1:
|
||
CMPI 'b',A0
|
||
JRNE SFC2
|
||
MOVI NEW_PCOLOR,A0 ;NEW PRINT COLOR
|
||
MOVI TYPE_INT,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC2:
|
||
CMPI 'c',A0
|
||
JRNE SFC3
|
||
MOVI NEW_CONTROL,A0 ;NEW DMA CONTROL WORD
|
||
MOVI TYPE_INT,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC3:
|
||
CMPI 'd',A0
|
||
JRNE SFC4
|
||
MOVI NEW_FONT,A0 ;NEW FONT
|
||
MOVI TYPE_LONG,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC4:
|
||
CMPI 'e',A0
|
||
JRNE SFC5
|
||
MOVI NEW_XY,A0 ;NEW [Y,X] CURSOR POSITION
|
||
MOVI TYPE_LONG,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC5:
|
||
CMPI 'i',A0
|
||
JRNE SFC6
|
||
MOVI NEW_SPACING,A0 ;NEW SPACING
|
||
MOVI TYPE_LONG,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC6:
|
||
CMPI 'n',A0
|
||
JRNE SFC7
|
||
MOVI ASCII_CR,A0 ;NEWLINE
|
||
JRUC SFXFER
|
||
SFC7:
|
||
CMPI 'f',A0
|
||
JRNE SFC8
|
||
MOVI ADD_DYDX,A0 ;ADD [DY,DX]
|
||
MOVI TYPE_LONG,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC8:
|
||
CMPI 'p',A0
|
||
JRNE SFC9
|
||
MOVI NEW_PALETTE,A0 ;USE A NEW PALETTE
|
||
MOVI TYPE_LONG,A2
|
||
CALLR PUTCARG ;GET THE CONTROL ARG
|
||
JRUC SFBUILDLP
|
||
SFC9:
|
||
CMPI 'u',A0 ; UNDERLINING ACTIVATED?
|
||
JRNE SFC10
|
||
MOVI UNDERLINE_ON,A0
|
||
JRUC SFXFER
|
||
SFC10:
|
||
CMPI 'v',A0 ; UNDERLINING DE-ACTIVATED?
|
||
JRNE SFC11
|
||
MOVI UNDERLINE_OFF,A0
|
||
JRUC SFXFER
|
||
SFC11:
|
||
*ADD NEW CONTROL CHARACTERS HERE
|
||
JRUC SFBUILDLP
|
||
SFXFER:
|
||
MOVB A0,*A7
|
||
ADDK 8,A7
|
||
MOVE A0,A0
|
||
JRNZ SFBUILDLP ;ADD ON ANOTHER CHARACTER
|
||
*STRING IS DONE
|
||
MOVE A5,A8 ;PASS BACK THE PTR TO THE NEW
|
||
DECM @SFINDEX,W ;FREE THIS BUFFER
|
||
STRINGFX
|
||
MOVE A6,A3 ;RETURN END
|
||
MMFM SP,A0,A1,A2,A4,A5,A6,A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* JUSTIFY - JUSTIFY THE STRING STARTING POINT FROM THE GIVEN POSITION *
|
||
* BASED ON THE JUSTIFICATION BYTE *
|
||
* A8 = PTR TO STRING *
|
||
* A9 = STRING POSITION *
|
||
* A14 = JUSTIFICATION BYTE *
|
||
* 0 = LEFT *
|
||
* 1 = CENTER *
|
||
* 2 = RIGHT *
|
||
* RETURNS: *
|
||
* A9 = JUSTIFIED STARTING POSITION *
|
||
* *
|
||
**************************************************************************
|
||
JUSTIFY:
|
||
PUSH A7
|
||
CLR A7
|
||
MOVX A14,A7
|
||
SLL 30,A7
|
||
SRL 30,A7 ; MASK OFF THE SHADOW BIT
|
||
DEC A7
|
||
JRN JUSTIFYX ;NORMAL LEFT JUSTIFY
|
||
JREQ JUSTIFYC ;CENTER JUSTIFY
|
||
*RIGHT JUSTIFY
|
||
CALLR STRNGLEN ;GET THE STRING LENGTH
|
||
JRUC JUSTIFYA
|
||
*CENTER JUSTIFY
|
||
JUSTIFYC:
|
||
CALLR STRNGLEN
|
||
SRL 1,A7 ;STRNGLEN/2
|
||
JUSTIFYA:
|
||
SUBXY A7,A9 ;ADJUST STRING STARTING POSITION
|
||
JUSTIFYX:
|
||
PULL A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SPACING - CALCULATE SPACING FOR THIS FONT *
|
||
* A11 = PTR TO CURRENT FONT TABLE *
|
||
* RETURNS: *
|
||
* A6 = [Y,X] SPACING *
|
||
* *
|
||
**************************************************************************
|
||
SPACING:
|
||
PUSH A7
|
||
MOVI 'H' - 21H,A6 ;USE 'H' FOR SPACE AND NEWLINE STUFF
|
||
SLL 5,A6
|
||
ADD A11,A6
|
||
MOVE *A6,A6,L ;LOAD THE ADDRESS OF THE IMAGE HEADER
|
||
MOVE *A6(ISIZE),A6,L ;GET THE VISIBLE SIZE OF 'H'
|
||
MOVY A6,A7
|
||
ZEXT A6
|
||
SRL 1,A6 ;(X SIZE OF 'H')/2 = X SPACING
|
||
MOVY A7,A6
|
||
SRL 17,A7
|
||
SLL 16,A7
|
||
ADDXY A7,A6 ;(Y SIZE OF 'H') + (Y SIZE OF 'H')/2 = Y SPACE
|
||
PULL A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FFLAGS - PARSE THE FORMAT flags (IF THERE ARE ANY). *
|
||
* SETS THE APPROPRIATE BITS IN THE FLAG REGISTER. *
|
||
* A0 = CURRENT CHARACTER FROM STRING *
|
||
* A8 = PTR TO STRING AFTER *A0 *
|
||
* RETURNS: *
|
||
* A0 = NEXT CHARACTER AFTER flags OR SAME IF NO flags PRESENT *
|
||
* A4 = FLAG REGISTER WITH APPROPRIATE BITS SET OR CLEARED *
|
||
* A8 = PTR TO NEXT CHARACTER *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
FFLAGS:
|
||
CLR A4 ;CLEAR FLAG REGISTER TO START
|
||
FFLAG_LP:
|
||
CMPI '-',A0 ;CHECK FOR LEFT JUSTIFY FLAG
|
||
JRNE FFLAGP1
|
||
BSET B_LJUSTIFY,A4
|
||
BCLR B_CJUSTIFY,A4
|
||
JRUC FFLAG_NXT
|
||
FFLAGP1:
|
||
CMPI '^',A0 ;CHECK FOR CENTER JUSTIFY FLAG
|
||
JRNE FFLAGP2
|
||
BSET B_CJUSTIFY,A4
|
||
BCLR B_LJUSTIFY,A4
|
||
JRUC FFLAG_NXT
|
||
FFLAGP2:
|
||
CMPI '+',A0 ;CHECK FOR PRINT SIGN FLAG
|
||
JRNE FFLAGP3
|
||
BSET B_PSIGN,A4
|
||
JRUC FFLAG_NXT
|
||
FFLAGP3:
|
||
CMPI ',',A0 ;CHECK FOR COMMA FLAG
|
||
JRNE FFLAGP4
|
||
BSET B_COMMAS,A4
|
||
JRUC FFLAG_NXT
|
||
FFLAGP4:
|
||
CMPI '#',A0 ;CHECK FOR HEX PREFIX FLAG
|
||
JRNE FFLAGP5
|
||
BSET B_PHEX,A4
|
||
JRUC FFLAG_NXT
|
||
FFLAGP5:
|
||
*ADD NEW FLAGS HERE
|
||
JRUC FFLAGX
|
||
FFLAG_NXT:
|
||
CALLR GETCHARI
|
||
JRUC FFLAG_LP
|
||
FFLAGX
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FWIDTH - GRAB THE FORMAT width FROM THE CURRENT STRING (IF PRESENT). *
|
||
* SETS ZPRINT FLAG IS FLAG REGISTER IF NECESSARY *
|
||
* A0 = CURRENT CHARACTER FROM STRING *
|
||
* A4 = FLAG REGISTER *
|
||
* A8 = PTR TO STRING AFTER *A0 *
|
||
* RETURNS: *
|
||
* A0 = NEXT CHARACTER AFTER width OR SAME IF NO width PRESENT *
|
||
* A3 = width , 0 = NO width SPECIFIED *
|
||
* A4 = FLAG REGISTER WITH ZPRINT FLAG SET IF NECESSARY *
|
||
* A8 = PTR TO NEXT CHARACTER *
|
||
* *
|
||
**************************************************************************
|
||
FWIDTH:
|
||
PUSH A1
|
||
MOVK 10,A1 ;DECIMAL MULTIPLIER
|
||
CLR A3 ;FIELD width WILL BE HERE
|
||
CMPI '0',A0 ;CHECK FOR LEADING ZERO PRINT FLAG
|
||
JRNE FWIDTH_LP
|
||
BSET B_ZPRINT,A4
|
||
CALLR GETCHARI ;GET THE NEXT
|
||
FWIDTH_LP:
|
||
CMPI '0',A0
|
||
JRLT FWIDTHX ;NOT A NUMBER
|
||
CMPI '9',A0
|
||
JRGT FWIDTHX ;NOT A NUMBER
|
||
SUBI '0',A0 ;ASCII TO DECIMAL
|
||
MPYU A1,A3 ;UP IT BY 10
|
||
ADD A0,A3 ;AND ADD IN THE NEW
|
||
CALLR GETCHARI
|
||
JRUC FWIDTH_LP
|
||
FWIDTHX
|
||
PULL A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FTYPE - RETURN THE FORMAT TYPE, I.E. SHORT, INT OR LONG. *
|
||
* A0 = PTR TO CURRENT CHARACTER TO CHECK *
|
||
* A8 = PTR TO STRING THAT IS BEING FORMATTED *
|
||
* RETURNS: *
|
||
* A0 = NEXT CHARACTER TO PROCESS AFTER type OR SAME IF NO TYPE SPECIFIED *
|
||
* A8 = PTR TO NEXT CHARACTER *
|
||
* DEFAULT RETURN IS INT *
|
||
* *
|
||
**************************************************************************
|
||
FTYPE:
|
||
MOVK TYPE_INT,A2
|
||
FTYPE_LP:
|
||
CMPI 'h',A0 ;CHECK FOR TYPE SHORT
|
||
JRNE FTYPEP1
|
||
MOVK TYPE_SHORT,A2
|
||
JRUC FTYPE_NXT
|
||
FTYPEP1:
|
||
CMPI 'l',A0 ;CHECK FOR TYPE LONG
|
||
JRNE FTYPEP2
|
||
MOVK TYPE_LONG,A2
|
||
JRUC FTYPE_NXT
|
||
FTYPEP2:
|
||
CMPI 'L',A0 ;CHECK FOR TYPE LONG
|
||
JRNE FTYPEP3
|
||
MOVK TYPE_LONG,A2
|
||
JRUC FTYPE_NXT
|
||
FTYPEP3:
|
||
*ADD NEW TYPE HERE
|
||
JRUC FTYPEX
|
||
FTYPE_NXT:
|
||
CALLR GETCHARI
|
||
JRUC FTYPE_LP
|
||
FTYPEX
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETCHAR - GET NEXT CHARACTER FROM A STRING. *
|
||
* MASKS THE HIGH 24 BITS OF THE LONG WORD. *
|
||
* A8 = PTR STRING *
|
||
* RETURNS: *
|
||
* C = CONTROL BYTE, ARGS FOLLOW, A1 = # OF BYTE ARGUMENTS *
|
||
* NC = NORMAL CHARACTER OR TERMINATOR. *
|
||
* Z = BYTE IS A TERMINATOR *
|
||
* A0 = CHARACTER *
|
||
* A8 = PTR TO NEXT *
|
||
* *
|
||
**************************************************************************
|
||
GETCHAR:
|
||
MOVB *A8,A0
|
||
SLL 24,A0
|
||
SRL 24,A0 ;MAKE SURE THIS NUMBER IS POSITIVE
|
||
ADDK 8,A8 ;POINT TO NEXT CHARACTER
|
||
CMPI 0,A0
|
||
JREQ GETCHARX ;TERMINATOR
|
||
CMPI ' ',A0
|
||
JRNC GETCHARX ;SAME AS JRHS
|
||
MOVE A0,A1
|
||
DEC A1
|
||
SLL 3,A1
|
||
ADDI CONTROL_TAB,A1
|
||
MOVB *A1,A1 ;GET NUMBER OF BYTES
|
||
SETC
|
||
GETCHARX:
|
||
MOVE A0,A0
|
||
RETS
|
||
|
||
*
|
||
*NUMBER OF ARGUMENT BYTES FOR CONTROL CHARACTER (1-1F)
|
||
CONTROL_TAB
|
||
.BYTE 2,2,2,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
.EVEN
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETCHARI - GET NEXT CHARACTER, SKIP COMMAND BYTES AND ARGUMENTS. *
|
||
* USED WITH STRGNLEN, FFLAGS, FWIDTH, FTYPE, ETC. *
|
||
* A8 = PTR TO STRING *
|
||
* RETURNS: *
|
||
* Z = CHARACTER IS A TERMINATOR *
|
||
* A0 = CHARACTER OR TERMINATOR *
|
||
* A8 = PTR TO NEXT *
|
||
* *
|
||
**************************************************************************
|
||
GETCHARI:
|
||
PUSH A1
|
||
GETCHARI_LP:
|
||
CALLR GETCHAR
|
||
JRNC GETCHARIX ;VALID CHARACTER OR TERMINATOR
|
||
SLL 3,A1
|
||
ADD A1,A8 ;SKIP ARGS
|
||
JRUC GETCHARI_LP
|
||
GETCHARIX:
|
||
PULL A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GETARGI - GET NEXT ARGUMENT INDIRECT IN THE ARGUMENT LIST. *
|
||
* NEXT ARG IS A LONG PTR TO ARGUMENT TYPE. *
|
||
* A2 = ARGUMENT TYPE, I.E. SHORT, INT OR LONG *
|
||
* A6 = PTR TO ARGUMENT *
|
||
* RETURNS: *
|
||
* A6 = PTR TO NEXT ARGUMENT *
|
||
* A8 = UNSIGNED ARGUMENT *
|
||
* *
|
||
**************************************************************************
|
||
GETARGI:
|
||
MOVE *A6+,A8,L ;GET THE POINTER
|
||
CMPI TYPE_INT,A2 ;GET THE VALUE FOR PRINTING NOW
|
||
JRNE GETARG1
|
||
MOVE *A8,A8,W ;AH AND INT
|
||
ZEXT A8
|
||
JRUC GETARGX
|
||
GETARG1:
|
||
CMPI TYPE_LONG,A2
|
||
JRNE GETARG2
|
||
MOVE *A8,A8,L ;IT'S VERY LONG
|
||
JRUC GETARGX
|
||
GETARG2:
|
||
MOVB *A8,A8 ;ARE YOU SMALL? SMALL! HAH! LIKE FRENCH BREAD!
|
||
SLL 24,A8
|
||
SRL 24,A8 ;ZEXTB A8
|
||
GETARGX:
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PUTCARG - GET THE CONTROL ARGUMENT FROM THE ARG LIST AND TRANSFER *
|
||
* CURRENT STRING UNDER CONSTRUCTION. FIRST IT WILL TRANSFER *
|
||
* THE CONTROL BYTE. *
|
||
* A0 = CONTROL BYTE *
|
||
* A2 = ARG TYPE *
|
||
* A3 = INDIRECTION FLAG, IF <> 0 THEN INDIRECT ARGUMENT *
|
||
* A7 = PTR TO LIST UNDER CONSTRUCTION *
|
||
* RETURNS: *
|
||
* A7 NEXT BYTE IN STRING *
|
||
* A0 & A2 PRESERVED *
|
||
* A3 IS TRASHED IF ARGUMENT IS INDIRECT *
|
||
* *
|
||
**************************************************************************
|
||
PUTCARG:
|
||
MOVB A0,*A7
|
||
ADDK 8,A7
|
||
MOVE A3,A3 ;SHOULD WE HANDLE INDIRECTION
|
||
JRNE PUTCARGI ;BR = YES
|
||
*GET ARGUMENT IMMEADIATELY
|
||
CMPI TYPE_INT,A2
|
||
JRNE PUTCLARG
|
||
MOVE *A6+,*A7+,W
|
||
JRUC PUTCARGX
|
||
PUTCLARG:
|
||
MOVE *A6+,*A7+,L ;ARGUMENT IS LONG
|
||
PUTCARGX:
|
||
RETS
|
||
*GET ARGUMENT VIA INDIRECTION
|
||
PUTCARGI:
|
||
MOVE *A6+,A3,L ;GET POINTER
|
||
CMPI TYPE_INT,A2
|
||
JRNE PUTCLARGI
|
||
MOVE *A3+,*A7+,W
|
||
JRUC PUTCARGX
|
||
PUTCLARGI:
|
||
MOVE *A3+,*A7+,L
|
||
JRUC PUTCARGX
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRNGLEN - RETURNS THE LENGTH, IN PIXELS, OF A GIVEN STRING *
|
||
* A8 = PTR TO STRING *
|
||
* A10 = [Y,X] SPACING OF STRING *
|
||
* A11 = PTR TO FONT TABLE *
|
||
* RETURNS: *
|
||
* A7 = LENGTH OF STRING *
|
||
* Z BIT SET IF LENGTH IS ZERO *
|
||
* *
|
||
**************************************************************************
|
||
STRNGLEN
|
||
MMTM SP,A0,A1,A2,A6,A8,A10
|
||
CLR A2
|
||
MOVI 'H' - 21H,A6 ;USE 'H' FOR SPACE
|
||
SLL 5,A6
|
||
ADD A11,A6
|
||
MOVE *A6,A6,L ;LOAD THE ADDRESS OF THE IMAGE HEADER
|
||
MOVE *A6(ISIZE),A6,W ;GET THE VISIBLE SIZE OF 'H'
|
||
SRL 1,A6 ;(X SIZE OF H)/2 = X SPACING
|
||
|
||
STRNLEN:
|
||
CALLR GETCHAR
|
||
JRZ STRNLENX ;END O' STRING. FOR REAL!
|
||
JRNC STRNLEN0 ;REAL CHARACTER
|
||
|
||
CMPI ASCII_CR,A0
|
||
JREQ STRNLENX ;O.K. THAT'S IT!
|
||
CMPI NEW_SPACING,A0
|
||
JRNE STRNLEN_SKIP
|
||
MOVE *A8+,A10,L ;GET THE NEW SPACING, 'CAUSE WE CARE
|
||
JRUC STRNLEN
|
||
STRNLEN_SKIP:
|
||
SLL 3,A1
|
||
ADD A1,A8 ;SKIP ARGS
|
||
JRUC STRNLEN
|
||
STRNLEN0:
|
||
CMPI ' ',A0 ;LOOK FOR A SPACE, MAN
|
||
JRNE STRNLEN1
|
||
ADDXY A6,A2 ;ADD A SPACE
|
||
JRUC STRNLEN3
|
||
STRNLEN1:
|
||
SUBI 21H,A0 ;GET A BASE
|
||
SLL 5,A0
|
||
ADD A11,A0 ;A7 = PTR TO CORRECT CHARACTER HEADER
|
||
MOVE *A0,A0,L
|
||
MOVE *A0(ISIZE),A0,W ;GET THE ACTUAL X LENGTH
|
||
STRNLEN2
|
||
ADDXY A0,A2 ;ADD DIGIT LENGTH
|
||
MOVX A10,A0
|
||
ADDXY A0,A2 ;ADD SPACE LENGTH
|
||
STRNLEN3:
|
||
JRUC STRNLEN
|
||
STRNLENX
|
||
MOVE A2,A7 ;PASS RETURN VALUE IN A7
|
||
MMFM SP,A0,A1,A2,A6,A8,A10
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HEXTOASC - CONVERTS A 32 BIT HEX # TO AN ASCII STRING TERMINATED *
|
||
* BY 0 WITH COMMAS. *
|
||
* A8 = HEX # *
|
||
* RETURNS: *
|
||
* A8 PTR TO THE STRING *
|
||
* *
|
||
**************************************************************************
|
||
HEXTOASC
|
||
MMTM SP,A3,A4,A14
|
||
CLR A3
|
||
CLR A4
|
||
BSET B_COMMAS,A4
|
||
CALLR HEX_TO_ASCII_DEC
|
||
MMFM SP,A3,A4,A14
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HEX_TO_ASCII_DEC - FORMAT A HEXADECIMAL # TO AN DECIMAL ASCII STRING. *
|
||
* USES THE flags AND width IN A4 AND A3. *
|
||
* A3 = width, MINIMUM # OF CHARACTERS TO OUTPUT *
|
||
* A4 = flags, USES: B_COMMAS - PUT COMMAS IN THE NUMBER *
|
||
* B_ZPRINT - IF width IS NOT REACHED, FILL WITH 0's *
|
||
* NOT SPACES. *
|
||
* B_SIGNED - PASSED NUMBER IS SIGNED *
|
||
* B_PSIGN - PRINT SIGN IF NUMBER IS OF SIGNED TYPE *
|
||
* A8 = HEXADECIMAL # *
|
||
* RETURNS: *
|
||
* A8 = PTR TO STRING *
|
||
* A3 & A4 PRESERVED *
|
||
* *
|
||
**************************************************************************
|
||
HEX_TO_ASCII_DEC:
|
||
MMTM SP,A1,A2,A3,A5,A9
|
||
CLR A5 ;CLR NEGATIVE FLAG
|
||
BTST B_SIGNED,A4
|
||
JREQ HEXTNOS ;NOT A SIGNED NUMBER
|
||
MOVE A8,A8
|
||
JRNN HEXTNOS ;NOT A NEGATIVE NUMBER
|
||
NEG A8
|
||
INC A5
|
||
HEXTNOS:
|
||
CLR A1
|
||
CLR A2 ;COMMA COUNT
|
||
MOVE A1,-*SP,W ;HERE'S THE NULL TERMINATOR
|
||
MOVK 10,A1 ;DIVISOR FOR DECIMAL
|
||
MOVE A8,A9
|
||
HEXTASC2
|
||
CLR A8
|
||
DIVU A1,A8
|
||
ADDI '0',A9 ;MAKE THE REMAINDER ASCII
|
||
MOVE A9,-*SP,W ;SAVE HERE
|
||
DEC A3 ;DECREMENT THE WIDTH
|
||
MOVE A8,A9
|
||
JRZ HEXTASC3 ;BR = DONE!
|
||
|
||
BTST B_COMMAS,A4
|
||
JREQ HEXTASC2 ;BR = DON'T WORRY ABOUT COMMAS
|
||
|
||
INC A2
|
||
CMPI 3,A2 ;COMMA CHECK
|
||
JRLO HEXTASC2 ;BR = NO COMMA
|
||
MOVI ',',A2
|
||
MOVE A2,-*SP,W ;STUFF A COMMA
|
||
CLR A2
|
||
JRUC HEXTASC2
|
||
HEXTASC3
|
||
MOVE A3,A3
|
||
JRZ HEXTASC3A ;WIDTH HAS BEEN FULFILLED
|
||
JRN HEXTASC3A ;THANX TI
|
||
BTST B_ZPRINT,A4
|
||
JRNE HEXTASC30 ;YES, FILL width WITH ZEROS
|
||
MOVI ' ',A2
|
||
JRUC HEXTASC31
|
||
HEXTASC30:
|
||
MOVI '0',A2
|
||
HEXTASC31:
|
||
MOVE A2,-*SP,W ;STUFF THE LEADER
|
||
DSJS A3,HEXTASC31
|
||
HEXTASC3A:
|
||
BTST B_SIGNED,A4
|
||
JREQ HEXTASC3D ;THIS IS NOT A SIGNED NUMBER
|
||
MOVE A5,A5
|
||
JRNZ HEXTASC3B ;NUMBER IS NEGATIVE
|
||
BTST B_PSIGN,A4
|
||
JREQ HEXTASC3D ;DOESN'T WANT THE SIGN PRINTED
|
||
MOVI '+',A2
|
||
JRUC HEXTASC3C
|
||
HEXTASC3B:
|
||
MOVI '-',A2
|
||
HEXTASC3C:
|
||
MOVE A2,-*SP,W ;STUFF THE SIGN
|
||
HEXTASC3D
|
||
MOVI STRNGRAM,A1 ;STORE HERE FOR BLOW OUT
|
||
MOVE A1,A8
|
||
HEXTASC4
|
||
MOVE *SP+,A9,W
|
||
MOVB A9,*A1
|
||
ADDK 8,A1
|
||
MOVE A9,A9
|
||
JRNZ HEXTASC4
|
||
MMFM SP,A1,A2,A3,A5,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HTOHXASC - CONVERT A 32 BIT HEXADECIMAL # TO A NULL TERMINATED *
|
||
* HEXADECIMAL ASCII STRING. USES 'ABCDEF' AND NO Ox PREFIX *
|
||
* OR COMMAS. *
|
||
* A8 = HEX # *
|
||
* RETURNS: *
|
||
* A8 = PTR TO ASCII HEX STRING *
|
||
* *
|
||
**************************************************************************
|
||
HTOHXASC
|
||
MMTM SP,A3,A4,A14
|
||
CLR A3
|
||
CLR A4
|
||
BSET B_CAP,A4
|
||
CALLR HEX_TO_ASCII_HEX
|
||
MMFM SP,A3,A4,A14
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HEX_TO_ASCII_HEX - CONVERTS A 32 BIT HEX # TO A NULL TERMINATED *
|
||
* ASCII STRING. *
|
||
* A3 = width, MINIMUM # OF CHARACTERS CONVERTED *
|
||
* A4 = flags, USES: B_COMMAS - PUT COMMAS IN THE NUMBER *
|
||
* B_ZPRINT - IF width IS NOT REACHED, FILL WITH 0's *
|
||
* NOT SPACES. *
|
||
* B_CAP - USE 'ABCDEF' *
|
||
* B_PHEX - PREFIX WITH HEX SPECIFIER 0x OR 0X *
|
||
* A8 = HEX # *
|
||
* RETURNS: *
|
||
* A8 PTR TO THE STRING *
|
||
* A3 & A4 ARE PRESERVED *
|
||
* *
|
||
**************************************************************************
|
||
HEX_TO_ASCII_HEX
|
||
MMTM SP,A1,A2,A3,A9
|
||
CLR A1
|
||
CLR A2 ;COMMA COUNT
|
||
MOVE A1,-*SP,W ;HERE'S THE NULL TERMINATOR
|
||
MOVK 16,A1 ;DIVISOR FOR HEX
|
||
MOVE A8,A9
|
||
HEXTASCH2
|
||
CLR A8
|
||
DIVU A1,A8
|
||
ADDI '0',A9 ;MAKE THE REMAINDER ASCII
|
||
CMPI '9',A9 ;IS IT IN A-F RANGE?
|
||
JRLS HHH1
|
||
BTST B_CAP,A4 ;ARE WE IN CAPITAL MODE
|
||
JRNE HHH0 ;YES
|
||
ADDI 'a' - ':',A9 ;MAKE alpha!
|
||
JRUC HHH1
|
||
HHH0:
|
||
ADDI 'A' - ':',A9 ;MAKE ALPHA!
|
||
HHH1:
|
||
DEC A3 ;DECREMENT THE WIDTH
|
||
MOVE A9,-*SP,W ;SAVE HERE
|
||
MOVE A8,A9
|
||
JRZ HEXTASCH3 ;BR = DONE!
|
||
INC A2
|
||
CMPI 3,A2 ;COMMA CHECK
|
||
JRLO HEXTASCH2 ;BR = NO COMMA
|
||
*
|
||
* SEE IF WE'RE DOING COMMAS
|
||
*
|
||
BTST B_COMMAS,A4 ;COMMAS?
|
||
JREQ HEXTASCH2 ;NOPE....IGNORE!
|
||
|
||
MOVI ',',A2
|
||
MOVE A2,-*SP,W ;STUFF A COMMA
|
||
CLR A2
|
||
JRUC HEXTASCH2
|
||
HEXTASCH3:
|
||
MOVE A3,A3
|
||
JRZ HEXTASCH3A ;WIDTH HAS BEEN FULFILLED
|
||
JRN HEXTASCH3A ;THANX TI
|
||
BTST B_ZPRINT,A4
|
||
JRNE HEXTASCH30 ;YES, FILL width WITH ZEROS
|
||
MOVI ' ',A2
|
||
JRUC HEXTASCH31
|
||
HEXTASCH30:
|
||
MOVI '0',A2
|
||
HEXTASCH31:
|
||
MOVE A2,-*SP,W ;STUFF THE LEADER
|
||
DSJS A3,HEXTASCH31
|
||
HEXTASCH3A:
|
||
*CHECK FOR 0x PREFIX
|
||
BTST B_PHEX,A4
|
||
JREQ HEXTASCH3D ;NO PREFIX NECESSARY
|
||
BTST B_CAP,A4
|
||
JRNE HEXTASCH3B ;PRINT A CAPITAL X
|
||
MOVI 'x',A2
|
||
JRUC HEXTASCH3C
|
||
HEXTASCH3B:
|
||
MOVI 'X',A2
|
||
HEXTASCH3C:
|
||
MOVE A2,-*SP,W
|
||
MOVI '0',A2
|
||
MOVE A2,-*SP,W
|
||
HEXTASCH3D:
|
||
*DUMP THE STRING AND PASS IT BACK
|
||
MOVI STRNGRAM,A1 ;STORE HERE FOR BLOW OUT
|
||
MOVE A1,A8
|
||
HEXTASCH4:
|
||
MOVE *SP+,A9,W
|
||
MOVB A9,*A1
|
||
ADDK 8,A1
|
||
MOVE A9,A9
|
||
JRNZ HEXTASCH4
|
||
MMFM SP,A1,A2,A3,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BCDTOASC - CONVERT A 32 BIT HEXADECIMAL # TO A NULL TERMINATED *
|
||
* HEXADECIMAL ASCII STRING. COMMAS AND LEAD ZERO BLANKING *
|
||
* ARE ASSERTED. *
|
||
* A8 = BCD # *
|
||
* RETURNS: *
|
||
* A8 = PTR TO ASCII HEX STRING *
|
||
* *
|
||
**************************************************************************
|
||
BCDTOASC
|
||
MMTM SP,A3,A4,A14
|
||
CLR A3
|
||
CLR A4
|
||
BSET B_COMMAS,A4
|
||
CALLR BCD_TO_ASCII_DEC
|
||
MMFM SP,A3,A4,A14
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BCD_TO_ASCII_DEC - CONVERTS A BCD NUMBER INTO A NULL TERMINATED *
|
||
* ASCII DECIMAL STRING. *
|
||
* A3 = width, MINIMUM # OF CHARACTERS CONTAINED IN THE STRING *
|
||
* A4 = flags, USES: B_COMMAS - PUT COMMAS IN THE NUMBER *
|
||
* B_ZPRINT - IF width IS NOT REACHED, FILL WITH 0's *
|
||
* NOT SPACES. *
|
||
* A8 = BCD # *
|
||
* RETURNS: *
|
||
* A8 PTR TO THE STRING *
|
||
* A3 & A4 ARE PRESERVED *
|
||
* *
|
||
**************************************************************************
|
||
BCD_TO_ASCII_DEC:
|
||
MMTM SP,A1,A2,A3,A5,A9
|
||
MOVE A8,A1
|
||
MOVK 1,A2
|
||
MOVE A2,A5 ;DIGIT COUNT
|
||
SRL 4,A1 ;WE WILL ALWAYS PRINT THE FIRST DUDE
|
||
BCDZLP:
|
||
MOVE A1,A9
|
||
SRL 4,A1 ;SLIDE DIGIT OFF THE END
|
||
INC A2 ;KNOCK UP ANOTHER DIGIT
|
||
SLL 28,A9
|
||
SRL 28,A9
|
||
JREQ BCDZ ;IT'S A ZERO
|
||
MOVE A2,A5 ;UPDATE VALID DIGIT COUNT
|
||
BCDZ:
|
||
CMPI 8,A2
|
||
JRLO BCDZLP ;MORE DIGITS TO CHECK
|
||
*O.K. LET'S STRING THIS BITCH
|
||
CLR A2 ;COMMA COUNT
|
||
MOVE A2,-*SP,W ;HERE'S THE NULL TERMINATOR
|
||
BCDCLP:
|
||
MOVE A8,A9
|
||
SRL 4,A8 ;SHIT THIS DIGIT
|
||
SLL 28,A9
|
||
SRL 28,A9 ;ISOLATE
|
||
ADDI '0',A9 ;MAKE ASCII
|
||
CMPI '9',A9
|
||
JRLS BCDISNUM ;IT'S A VALID NUMBER.
|
||
MOVI ' ',A9 ;SUBSTITUTE A SPACE FOR ERROR
|
||
BCDISNUM:
|
||
MOVE A9,-*SP,W ;PUSH ON MY MAN
|
||
DEC A3 ;DECREMENT width
|
||
DEC A5 ;DIGIT COUNT
|
||
JRZ BCDDONE ;WE HAVE FINISHED
|
||
*COMMA SHIT
|
||
INC A2
|
||
CMPI 3,A2 ;COMMA CHECK
|
||
JRLO BCDCLP ;BR = NO COMMA
|
||
BTST B_COMMAS,A4 ;PRINT COMMAS?
|
||
JREQ BCDCLP ;NOPE....IGNORE!
|
||
MOVI ',',A2
|
||
MOVE A2,-*SP,W ;STUFF A COMMA
|
||
CLR A2
|
||
JRUC BCDCLP
|
||
BCDDONE:
|
||
MOVE A3,A3
|
||
JRZ BCDXFER ;WIDTH HAS BEEN FULFILLED
|
||
JRN BCDXFER ;THANX TI
|
||
BTST B_ZPRINT,A4
|
||
JRNE BCDZP1 ;YES, FILL width WITH ZEROS
|
||
MOVI ' ',A2
|
||
JRUC BCDZP2
|
||
BCDZP1:
|
||
MOVI '0',A2
|
||
BCDZP2:
|
||
MOVE A2,-*SP,W ;STUFF THE LEADER
|
||
DSJS A3,BCDZP2
|
||
BCDXFER:
|
||
*DUMP THE STRING AND PASS IT BACK
|
||
MOVI STRNGRAM,A1 ;STORE HERE FOR BLOW OUT
|
||
MOVE A1,A8
|
||
BCDXFER_LP:
|
||
MOVE *SP+,A9,W
|
||
MOVB A9,*A1
|
||
ADDK 8,A1
|
||
MOVE A9,A9
|
||
JRNZ BCDXFER_LP
|
||
|
||
MMFM SP,A1,A2,A3,A5,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* L_MESS *
|
||
* *
|
||
* A8 POINTS AT MESS_MAC FOLLOWED BY MESSAGE TEXT. *
|
||
* POP ALL REGGIES LEAVING A8 POINTING AT TEXT. *
|
||
* AND JUMP TO THE TEXT PROCESSOR! *
|
||
* *
|
||
* THE MMFM POPS THE ROUTINE TO CALL INTO A1. *
|
||
* *
|
||
* YOU ***MUST*** USE JSRP TO GET HERE. *
|
||
* *
|
||
**************************************************************************
|
||
L_MESS_LOOP
|
||
ADDI 8,A8 ;PUSH BEYOND THIS BYTE
|
||
L_MESS
|
||
ADDI 0FH,A8 ;IF IT ENDS IN OTHER THAN ZERO..
|
||
* ;KICK TO NEXT WORD (I.E. .EVEN)
|
||
SRL 4,A8
|
||
SLL 4,A8 ;MASK FRACTIONAL WORD
|
||
|
||
MMFM A8,A1,A5,A9,A10,A11 ;LOAD UP REGGIES FROM A8.
|
||
MMFM A8,A0 ;YOU MAY SLEEP
|
||
|
||
JSRPR A1 ;JSRP TO THE ROUTINE
|
||
MOVB *A8,A0 ;CHECK NEXT BYTE 0=DONE...1=MORE.
|
||
JRNZ L_MESS_LOOP
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* LM_SETUP *
|
||
* *
|
||
* THIS IS CALLED TO SETUP THE WORLD FOR A STRING *
|
||
* OPERATION, BUT NOT PHYSICALLY MAKE THE CALL. *
|
||
* *
|
||
* THIS ALLOWS TWEAKING OF REGGIES BEFORE THE CALL. *
|
||
* *
|
||
* LM_FINIS *
|
||
* *
|
||
* THIS IS CALLED ONCE THE MODIFICATIONS ARE MADE! *
|
||
* *
|
||
* *
|
||
**************************************************************************
|
||
LM_SETUP MMFM A8,A1,A5,A9,A10,A11 ;LOAD UP REGGIES FROM A8.
|
||
MMFM A8,A0 ;SLEEPY TIME
|
||
RETS
|
||
LM_FINIS
|
||
JUMP A1 ;THIS RUNS ROUTINE AND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* LM_PRINTF - THIS ROUTINE COMBINES LM_SETUP WITH PRINTF, USE IF YOU *
|
||
* DON'T NEED TO TWEAK THE REGISTERS *
|
||
* A8 = MESS_MAC FOLLOWED BY STRING. *
|
||
* NOTE: CALL WITH JSRP *
|
||
* *
|
||
**************************************************************************
|
||
LM_PRINTF:
|
||
CALLR LM_SETUP
|
||
JRUC PRINTF
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLRTEXT - CLEAR ALL TEXT ON THE OBJECT LIST. *
|
||
* *
|
||
**************************************************************************
|
||
CLRTEXT
|
||
MMTM SP,A0,A1
|
||
MOVI TEXTOID,A0
|
||
CLR A1
|
||
NOT A1
|
||
CALLA KILOBJ
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
.DATA
|
||
**************************************************************************
|
||
* *
|
||
* FONT TABLES STARTING AT ASCII $21 *
|
||
* *
|
||
**************************************************************************
|
||
*
|
||
*5 POINT FONT.
|
||
*
|
||
RD5FONT
|
||
.LONG FONT5EXC,FONT5APOS,FONT5EXC,FONT5EXC,FONT5EXC,FONT5EXC
|
||
.LONG FONT5APOS,FONT5EXC,FONT5EXC,FONT5EXC,FONT5EXC
|
||
.LONG FONT5EXC,FONT5MIN,FONT5PER,FONT5SLA,FONT50,FONT51
|
||
.LONG FONT52,FONT53,FONT54,FONT55,FONT56,FONT57,FONT58,FONT59
|
||
.LONG FONT5COLON,FONT5EXC,FONT5EXC,FONT5EXC,FONT5EXC
|
||
.LONG FONT5EXC,FONT5EXC
|
||
.LONG FONT5A,FONT5B,FONT5C,FONT5D,FONT5E,FONT5F,FONT5G,FONT5H
|
||
.LONG FONT5I,FONT5J,FONT5K,FONT5L,FONT5M,FONT5N,FONT5O,FONT5P
|
||
.LONG FONT5Q,FONT5R,FONT5S,FONT5T,FONT5U,FONT5V,FONT5W,FONT5X
|
||
.LONG FONT5Y,FONT5Z
|
||
.LONG FONT5EXC,FONT5EXC,FONT5EXC,FONT5EXC,FONT5EXC
|
||
.LONG FONT5EXC
|
||
.LONG FONT5A,FONT5B,FONT5C,FONT5D,FONT5E,FONT5F,FONT5G,FONT5H
|
||
.LONG FONT5I,FONT5J,FONT5K,FONT5L,FONT5M,FONT5N,FONT5O,FONT5P
|
||
.LONG FONT5Q,FONT5R,FONT5S,FONT5T,FONT5U,FONT5V,FONT5W,FONT5X
|
||
.LONG FONT5Y,FONT5Z
|
||
.LONG FONT5EXC,FONT5EXC,FONT5EXC
|
||
|
||
*
|
||
*7 POINT FONT.
|
||
*
|
||
RD7FONT
|
||
.LONG FONT8EXC,FONT8APOS,FONT8NUM,FONT8DOLL,FONT8PERC,FONT8AND
|
||
.LONG FONT8APOS,FONT8LPAREN,FONT8RPAREN,FONT8ASTR,FONT8PLUS
|
||
.LONG FONT8COMM,FONT8MIN,FONT8PER,FONT8SLA,FONT80,FONT81
|
||
.LONG FONT82,FONT83,FONT84,FONT85,FONT86,FONT87,FONT88,FONT89
|
||
.LONG FONT8COLON,FONT8SMCOL,FONT8LPAREN,FONT8EQL,FONT8RPAREN
|
||
.LONG FONT8QUEST,FONT8MIN
|
||
.LONG FONT8A,FONT8B,FONT8C,FONT8D,FONT8E,FONT8F,FONT8G,FONT8H
|
||
.LONG FONT8I,FONT8J,FONT8K,FONT8L,FONT8M,FONT8N,FONT8O,FONT8P
|
||
.LONG FONT8Q,FONT8R,FONT8S,FONT8T,FONT8U,FONT8V,FONT8W,FONT8X
|
||
.LONG FONT8Y,FONT8Z
|
||
.LONG FONT8LPAREN,FONT8ARRW,FONT8RPAREN,FONT8EXC,FONT8MIN
|
||
.LONG FONT8APOS
|
||
.LONG FONT8A,FONT8B,FONT8C,FONT8D,FONT8E,FONT8F,FONT8G,FONT8H
|
||
.LONG FONT8I,FONT8J,FONT8K,FONT8L,FONT8M,FONT8N,FONT8O,FONT8P
|
||
.LONG FONT8Q,FONT8R,FONT8S,FONT8T,FONT8U,FONT8V,FONT8W,FONT8X
|
||
.LONG FONT8Y,FONT8Z
|
||
.LONG FONT8LPAREN,FONT8EXC,FONT8RPAREN,FONT8BLK
|
||
.LONG FONT8UNDERLINE, FONT8BLK, FONT8BLK, FONT8POU
|
||
|
||
*
|
||
*15 POINT FONT. @ is missing (GNP 10/20/88)
|
||
*
|
||
RD15FONT
|
||
.LONG FONT15EXC,FON15quote,FON15poun,FONT15DOLL,FON15perc,FON15and
|
||
.LONG FONT15APOS,FONT15LPAREN,FONT15RPAREN,FON15ast,FONT15PLUS
|
||
.LONG FONT15COMMA,FONT15MINUS,FONT15PER,FONT15SLASH,FONT150,FONT151
|
||
.LONG FONT152,FONT153,FONT154,FONT155,FONT156,FONT157,FONT158,FONT159
|
||
.LONG FONT15COLON,FON15semicol,FON15less,FON15equal,FON15more
|
||
.LONG FONT15QUEST,FONT15QUEST
|
||
.LONG FONT15A,FONT15B,FONT15C,FONT15D,FONT15E,FONT15F,FONT15G,FONT15H
|
||
.LONG FONT15I,FONT15J,FONT15K,FONT15L,FONT15M,FONT15N,FONT15O,FONT15P
|
||
.LONG FONT15Q,FONT15R,FONT15S,FONT15T,FONT15U,FONT15V,FONT15W,FONT15X
|
||
.LONG FONT15Y,FONT15Z
|
||
.LONG FON15brackl,FONT15ARRW,FON15brackr,FON15carr,FON15line
|
||
.LONG FON15apos1
|
||
.LONG FONT15A,FONT15B,FONT15C,FONT15D,FONT15E,FONT15F,FONT15G,FONT15H
|
||
.LONG FONT15I,FONT15J,FONT15K,FONT15L,FONT15M,FONT15N,FONT15O,FONT15P
|
||
.LONG FONT15Q,FONT15R,FONT15S,FONT15T,FONT15U,FONT15V,FONT15W,FONT15X
|
||
.LONG FONT15Y,FONT15Z
|
||
.LONG FON15paren2l,FON15break,FON15paren2r
|
||
.LONG RD15SP,RD15RUB,RD15END,FON15rquote,FON15engPOUN,FON15CR
|
||
|
||
*
|
||
*20 POINT FONT. Much is missing (GNP 10/25/89)
|
||
*
|
||
RD20FONT
|
||
.LONG FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC
|
||
.LONG FONT20EXC,FONT20LPAREN,FONT20RPAREN,FONT20EXC,FONT20EXC
|
||
.LONG FONT20COM,FONT20MIN,FONT20PER,FONT20SLA,FONT200,FONT201
|
||
.LONG FONT202,FONT203,FONT204,FONT205,FONT206,FONT207,FONT208,FONT209
|
||
.LONG FONT20COLON,FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC
|
||
.LONG FONT20QUEST,FONT20EXC
|
||
.LONG FONT20A,FONT20B,FONT20C,FONT20D,FONT20E,FONT20F,FONT20G,FONT20H
|
||
.LONG FONT20I,FONT20J,FONT20K,FONT20L,FONT20M,FONT20N,FONT20O,FONT20P
|
||
.LONG FONT20Q,FONT20R,FONT20S,FONT20T,FONT20U,FONT20V,FONT20W,FONT20X
|
||
.LONG FONT20Y,FONT20Z
|
||
.LONG FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC
|
||
.LONG FONT20EXC
|
||
.LONG FONT20A,FONT20B,FONT20C,FONT20D,FONT20E,FONT20F,FONT20G
|
||
.LONG FONT20H,FONT20I,FONT20J,FONT20K,FONT20L,FONT20M,FONT20N
|
||
.LONG FONT20o,FONT20P,FONT20Q,FONT20R,FONT20S,FONT20T,FONT20U
|
||
.LONG FONT20V,FONT20W,FONT20X,FONT20Y,FONT20Z
|
||
.LONG FONT20EXC,FONT20EXC,FONT20EXC,FONT20EXC,FONT20BACKSP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TROG SPECIAL CHARACTER DEFINITIONS *
|
||
* *
|
||
**************************************************************************
|
||
FONT8BLK:
|
||
.WORD 4,4,2,-2
|
||
.LONG >2000000
|
||
|
||
FONT8UNDERLINE:
|
||
.WORD 6,1,0,-9
|
||
.LONG >2000000
|
||
|
||
.END
|
||
|