.include "c:\avrtools\appnotes\8515def.inc" .device AT90S8515 ; specifies to the assembler which chip we are using ;******Variable definitions for Floating point math**************** .def pgmem =r0 .def max =r3 ;Used to figure out Vp-p, period, and frequency .def min =r4 ;Used to figure out Vp-p, period, and frequency .def num1 =r5 ;first value of floating point result .def num2 =r6 ;second value of floating point result .def num3 =r7 ;third value of floating point result .def QUOT =r9 ; partial product scratch area .def QUOTM =r10 .def QUOTH =r11 .def DEXP =r12 ; Decimal exponent .def MANT1 =r13 ; Accumulator 1 .def MANT1m =r14 .def MANT1h =r15 .def EXP1 =r16 .def SIGN1 =r17 .def MANT2 =r18 ; Accumulator 2 .def MANT2m =r19 .def MANT2h =r20 .def EXP2 =r21 .def SIGN2 =r22 .def MANT1T =r23 ; used to extend 24bit to 32bit ops .def count =r24 ; GP loop counter .def temp =r25 .equ MATHTMP = 0x0240 ;use memory at 480 for scratch for FlToDec conversion ;*********************Variable definitions********************* .def status =r1 ;0x0000000 ::: (0) internal trigger (1) external trigger .def trigger = r2 ;trigger value, global .def save =r8 ;used to save SREG .def savSREG =r8 .def state =r16 ;state of trigger .def cnt =r17 ;misc. counter ;.def Arg1 =r18 ;used in A/D .def tempi =r19 ;interrupt temp .def addrl =r20 ;address .def addrh =r21 ;address .def upload =r22 ;upload status .def Main3 =r23 ;the incoming byte .def done =r24 ;status for communication with other processor ;R25 is temp, defined above, MUST be R25 to avoid FP math routine conflicts .def dataa =r26 .def calculation = r27 ;temp variable used to determine which calculation to perform .def capture =r28 ;used for triggering .def acq =r29 ;used for triggering ;start of memory .equ memstart = 0x0060 .equ displength = 30 ;display length in 6 bit wide characters .equ bytesrec = 4 .equ data = 10 ;# of bytes sent, 9 for fp and 1 for voltage base ;definitions used to upload data to PC .def TXbusy =r24 ;transmit busy flag .def RXchar =r27 ;a received character ;NOTE CHANGE TO BAUD RATE .equ baud96 =51 ;9600 baud constant for 8Mhz crystal .equ go ='g' ;0x67 ascii 'g' .equ stop ='s' ;0x73 ascii 's' .equ azero ='0' ;0x30 ascii '0' ;***********************************16 bit math********************************************** ;adds two 16 bit numbers, takes in add1h, add1l, add2h, add2l .MACRO add16 add @1,@3 ;Add low bytes adc @0,@2 ;Add high bytes with carry .ENDMACRO ;compares two 16 bit numbers, takes in cp1h, cp1l, cp2h, cp2l .MACRO cp16 cp @1,@3 ;Compare low byte cpc @0,@2 ;Compare high byte with carry from ;previous operation .ENDMACRO ;add a 16 bit number to a 16 bit immediate, takes in addh, addl, addi .MACRO addi16 subi @1, low(-@2) ;Add low byte ( x -(-y)) = x + y sbci @0, high(-@2) ;Add high byte with carry .ENDMACRO ;compares a 16 bit number with an immediate, takes in cp1h, cp1l, cpi .MACRO cpi16 cpi @1, low(@2) ;Compare low byte ldi temp, high(@2) ; cpc @0, temp ;Compare high byte .ENDMACRO ;subtract constant from 16 bit number, takes in subh, subl, subi .MACRO subi16 subi @1,low(@2) ;Subtract low bytes sbci @0,high(@2) ;Subtract high byte with carry .ENDMACRO ;*************************************MAIN PROGRAM********************************************* .cseg .org $0000 rjmp RESET ;reset entry vector rjmp inter0 ;external intrerrupt zero used for data sending rjmp inter1 ;external interrupt one used for trigger changes reti reti reti reti reti reti rjmp RXdone ;UART receive done rjmp TXempty ;UART buffer empty rjmp TXdone ;UART transmit done reti RESET: ldi Temp, low(RAMEND) out SPL, Temp ldi Temp, high(RAMEND) out SPH, Temp ;set portA to all inputs for data from A/D ldi temp, 0b00000000 out ddra, temp out porta, temp ;set portB to inputs for Voltage base and output for upload indicator ldi temp, 0b10000000 out DDRB, temp ldi temp, 0b11111111 out PORTB, temp ;initialize trigger ldi temp, 0b00111111 mov trigger, temp ;initialize time base, variable kept in memory ldi R30, low(memstart + displength * 6 + data + 1) ldi R31, high(memstart + displength * 6 + data + 1) ldi temp, 1 st Z, temp ;set port D to input for int0, int1 and output for data ready ldi temp, 0b11000000 out DDRD, temp ldi temp, 0b01000000 ;set WR! to one for A/D out PORTD, temp ;set up to inturrupt on rising edge (must be before enabling inturrupts) ;for both int0 and int1 ldi temp, 0b00001111 out MCUCR, temp ;set up GIMSK to enable int0 ldi temp, 0b01000000 out GIMSK, temp ;initialize status ldi temp, 0x00 mov status, temp ;initialize voltage base ldi ZH, high(memstart + displength * 6 + 9) ldi ZL, low(memstart + displength * 6 + 9) ldi dataa, 0 st Z, dataa ;enable interrupts sei PgLoop: ;scan for voltage base rcall getvoltagebase ;send data to other processor rcall senddata ;get data from A/D rcall acquiredata ;calculate floating point calculations rcall calcdata rjmp PgLoop ;*********************Get Voltage Base********************** ;scan portB for voltage base, if not a valid value, use previous value getvoltagebase: in temp, pinB ldi ZH, high(memstart + displength * 6 + 9) ldi ZL, low(memstart + displength * 6 + 9) ld dataa, Z ori temp, 0b10000000 cpi temp, 0b11111110 brne notzero ldi dataa, 0 notzero:cpi temp, 0b11111101 brne notone ldi dataa, 1 notone:cpi temp, 0b11111011 brne nottwo ldi dataa, 2 nottwo:cpi temp, 0b11110111 brne notthree ldi dataa, 3 notthree:cpi temp, 0b11101111 brne notfour ldi dataa, 4 notfour:cpi temp, 0b11011111 brne notfive ldi dataa, 5 notfive:cpi temp, 0b10111111 brne notfive1 ldi dataa, 5 notfive1: st Z, dataa ret ;******************************SEND DATA************************** ;communicate with other processor senddata: clr done ;initialize done and Z ldi Zl, low(memstart) ldi Zh, high(memstart) ;set portC to outputs to begin sending data ser temp out DDRC, temp ;tell master data is ready in temp, PIND ori temp, 0b10000000 out PORTD, temp ;wait for interrupt to transmit data loop: sei sbrs done, 0 rjmp loop ;after transmitting data, tell master data is no longer ready in temp, PIND andi temp, 0b01111111 out PORTD, temp ;get data from memory rcall consolidate ret ;inturrupt routine for int0 to acquire data inter0: in save, SREG cpi16 R31, R30, memstart + displength * 6 + data brlo send ;branch if lower to send, otherwise recieve clr temp ;set port C to inputs out DDRC, temp nop ;wait for master to send data nop nop in dataa, PINC st Z+, dataa ;store data received rjmp recved send: ld dataa, Z+ ;put data on portC to send out PORTC, dataa recved: ;continue untill add data is sent and received cpi16 R31, R30, memstart + displength * 6 + bytesrec + data brne getmoredata ser done ;tell main loop communication is done getmoredata: out SREG, save ret ;get data from memory and put in appropriate places consolidate: ldi R30, low(memstart + displength * 6 + data) ldi R31, high(memstart + displength * 6 + data) ld trigger, Z+ lsl trigger ld temp, Z+ ld status, Z+ ret ;**************************Acquire data from A/D******************************** ;manage acquiring data from A/D acquiredata: ;load time base from program memory and set up timer 1 ldi R30, low(memstart + displength * 6 + data + 1) ldi R31, high(memstart + displength * 6 + data + 1) ld dataa, Z+ lsl dataa ;multiply by 4 to resolve in program memory lsl dataa ldi R30, low(time * 2) ldi R31, high(time * 2) clr temp ;resolve memory pointer add16 R31, R30, temp, dataa lpm ;get TCCR1B value from program memory out TCCR1B, pgmem addi16 R31, R30, 1 lpm ;get 0CR1AH value from program memory out OCR1AH, pgmem ;write high byte first addi16 R31, R30, 1 lpm ;get 0CR1AL value from program memory out OCR1AL, pgmem ;then write low byte clr temp ;clear Timer 1 counter out TCNT1H, temp out TCNT1L, temp ;enable interrupt for trigger change only when acquiring data ;set up GIMSK to enable int0 and int1 ldi temp, 0b11000000 out GIMSK, temp ;initialize veriables ldi R30, low(memstart) ldi R31, high(memstart) ldi state, 0 ;trigger state ldi acq, 0 ;acquire state clr dataa ;clear capture if trigger mode is capture mov temp, status cpi temp, 0 brne nochange ldi capture, 0 ldi upload, 0 nochange: cpi temp, 2 brne nochange1 ldi capture, 0 nochange1: acquiredloop: ;wait for inturrupt by polling flag in temp, TIFR sbrs temp, 6 rjmp acquiredloop ldi temp, 0b01000000 out TIFR, temp ;on inturrupt clear flag rcall acquiresample ;get sample and increment Z if trigger condition is true cpi16 R31, R30, memstart + displength * 6 ;take in displength * 6 samples brne acquiredloop ;after getting first set, set capture to 1 to indicate first capture has occurred ;this variable is reset by all trigger code that does not use capture (and interrupt?) mov temp, status cpi temp, 1 brne capturesame ldi capture, 1 capturesame: cpi temp, 3 brne capturesame1 ldi capture, 1 capturesame1: ;set up GIMSK to disable int0 and int1 ldi temp, 0b01000000 out GIMSK, temp ret ;*******************************Get data from A/D*************************************** ;get data from MAXIM A/D converter ;code copied from web site acquiresample: ;toggle line on A/D converter, wait, then read data in temp, PIND andi temp, 0b10111111 out portD, temp in temp, PIND ori temp, 0b01000000 out portD, temp nop nop nop nop in main3, pinA ;**********************Trigger Code************************* ;jump table for type of triggering being used mov temp, status cpi temp, 0 breq int cpi temp, 1 breq intH cpi temp, 2 breq ext cpi temp, 3 breq extH ;**** int: ;internal triggering cpi state, 0 breq greaterthan cpi state, 1 breq lessthan greaterthan: cp Main3, trigger brsh statedone ldi state, 1 rjmp statedone lessthan: cp Main3, trigger brlo statedone ldi acq, 1 rjmp statedone statedone: ;after 250 data points take data even if no trigger inc dataa cpi dataa, 250 brlo notrigger ldi acq, 1 notrigger: rjmp trigtabledone ;**** intH: ;internal hold triggering cpi capture, 1 ;if in capture mode, don't capture if already have waveform breq Hstatedone cpi state, 0 breq Hgreaterthan cpi state, 1 breq Hlessthan Hgreaterthan: cp Main3, trigger brsh Hstatedone ldi state, 1 rjmp Hstatedone Hlessthan: cp Main3, trigger brlo Hstatedone ldi acq, 1 rjmp Hstatedone Hstatedone: rjmp trigtabledone ;*** ext: ;external triggering in dataa, PIND andi dataa, 0b00010000 cpi state, 0 breq one cpi state, 1 breq zero one: cpi dataa, 0b00010000 breq Estatedone ldi state, 1 rjmp Estatedone zero: cpi dataa, 0b00000000 breq Estatedone ldi acq, 1 rjmp Estatedone Estatedone: rjmp trigtabledone ;***** extH: ;external hold triggering cpi capture, 1 breq trigtabledone in dataa, PIND andi dataa, 0b00010000 cpi state, 0 breq Hone cpi state, 1 breq Hzero Hone: cpi dataa, 0b00010000 breq EHstatedone ldi state, 1 rjmp EHstatedone Hzero: cpi dataa, 0b00000000 breq EHstatedone ldi acq, 1 rjmp EHstatedone EHstatedone: rjmp trigtabledone trigtabledone: cpi upload, 0xFF brne dontupload rcall uploaddata dontupload: ;if acq = 1 then start taking data, trigger condition has been met cpi acq, 1 brne nodata st Z+, Main3 nodata: sei ret ;*****************Used for testing****************** SETMEM: ldi R30, low(memstart) ldi R31, high(memstart) clr cnt loop1: inc cnt ldi temp, 0b00111010 com temp st Z+, cnt cpi cnt, 240 brne loop1 ret delaying: clr cnt ldi addrl,0 ldi addrh,0 delay1: addi16 addrh, addrl, 1 cpi16 addrh, addrl, 0xFFFF brne delay1 ret ;***********************find frequency, period and Vp-p*************************** ;find floating point values for frequency, period, and Vp-p ;all Vp-p calculations calcdata: ldi R31, high(memstart) ldi R30, low(memstart) ;search data for max value ld max, Z+ maxagain: ld temp, Z+ ;value to test cp temp, max brlo maxnochange mov max, temp maxnochange: cpi16 R31, R30, memstart + displength * 6 brne maxagain ldi R31, high(memstart) ldi R30, low(memstart) ;search data for min value ld min, Z+ minagain: ld temp, Z+ ;value to test cp min, temp brlo minnochange mov min, temp minnochange: cpi16 R31, R30, memstart + displength * 6 brne minagain ;calculate difference sub max, min mov temp, max cpi temp, 0 brne not0 ;zero is not valid for conversion routine, set to one ldi temp, 1 mov max, temp not0: ;set Z to point to appropriate FP voltage value for conversion ldi ZH, high(memstart + displength * 6 + 9) ldi ZL, low(memstart + displength * 6 + 9) ld dataa, Z lsl dataa lsl dataa ldi zl,low(V1*2) ldi zh,high(V1*2) clr temp add16 Zh, Zl, temp, dataa ;resolve address ldi temp, 0 ;set calculation to voltage mode mov calculation, temp rcall convandsend ;store results into memory ldi R31, high(memstart + displength * 6) ldi R30, low(memstart + displength * 6) st Z+, r5 st Z+, r6 st Z+, dexp ;Frequency calculations ;**search for trigger condition, and count how long it takes** ldi R31, high(memstart + 1) ldi R30, low(memstart + 1) clr state ;initialize state ldi temp, 1 mov max, temp ;initialize max, counter for frequency calculation clr acq freqsearch: inc max ld dataa, Z+ cpi state, 0 breq fgreaterthan cpi state, 1 breq flessthan fgreaterthan: cp dataa, trigger brsh fgnochange ldi state, 1 fgnochange: rjmp fstatedone flessthan: cp dataa, trigger brlo flnochange ldi acq, 1 flnochange: fstatedone: cpi acq, 1 breq fdone cpi16 R31, R30, memstart + displength * 6 breq ferror rjmp freqsearch ferror: ser temp mov max, temp fdone: ;max now holds value of period in samples ldi R30, low(memstart + displength * 6 + data + 1) ldi R31, high(memstart + displength * 6 + data + 1) ld dataa, Z ;data now holds time base lsl dataa ;multiply data by 4 lsl dataa ;get FP value to multiply by max ldi zl,low(fptime*2) ldi zh,high(fptime*2) ;get appropriate address for multiplication factor clr temp add16 zh, zl, temp, dataa ;check for trigger condition not met mov temp, max cpi temp, 0b11111111 breq ferror1 ldi temp, 1 ;set calculation to frequency mov calculation, temp rcall convandsend rjmp fnoerror ;if condition not met, send indication ferror1: ser temp mov r5, temp mov r6, temp ldi temp, 0b01111111 mov dexp, temp ;store decimal values to memory fnoerror: ldi R31, high(memstart + displength * 6 + 6) ldi R30, low(memstart + displength * 6 + 6) st Z+, r5 st Z+, r6 st Z+, dexp ;caculate the period ldi R30, low(memstart + displength * 6 + data + 1) ldi R31, high(memstart + displength * 6 + data + 1) ld dataa, Z ;data now holds time base lsl dataa ;multiply data by 4 lsl dataa ;store in memory ldi zl,low(fptime*2) ldi zh,high(fptime*2) ;get appropriate address for multiplication factor clr temp add16 zh, zl, temp, dataa ;check for error condition mov temp, max cpi temp, 0b11111111 breq perror1 ldi temp, 2 ;set calculation to period mov calculation, temp rcall convandsend ;calculate period rjmp pnoerror ;indicate an error perror1: ser temp mov r5, temp mov r6, temp ldi temp, 0b01111111 mov dexp, temp ;store FP results pnoerror: ldi R31, high(memstart + displength * 6 + 3) ldi R30, low(memstart + displength * 6 + 3) st Z+, r5 st Z+, r6 st Z+, dexp ret ;convert max to a 32 bit float and perform calculation convandsend: ;convert to float clr mant1 clr mant1m clr sign1 ldi exp1, 6 mov mant1h, max shiftleft: ;set mantissa and exponent to convet max to float sbrc mant1h, 7 rjmp convdone lsl mant1h dec exp1 rjmp shiftleft convdone: ;convert from work format to IEEE format and store in ACC1 rcall REPACK ;load multiply factor into ACC2 rcall KTOAC2 rcall FMUL mov temp, calculation cpi temp, 2 brne noperiod rcall F1OVERX ;invert for period calculation noperiod: rcall FLTBCD ;convert float to decimal ;put results in correct registers to send swap r5 ;set up R5 ldi temp, 0b11110000 and r5, temp mov min, r6 and min, temp swap min or r5, min swap r6 and r6, temp and r7, temp swap r7 or r6, r7 ret ;*************Upload Data************ ;********************************** ;Upload data to PC uploaddata: cli ;initial conditions ldi TXbusy, 0b01111111 out PORTB, TXbusy ;setup UART -- enable TXempty & RXdone int, and RX, TX pins ldi TXbusy, 0b10111000 out UCR, TXbusy ;set baud rate to 9600 ldi TXbusy, baud96 out UBRR, TXbusy ;intialize text pointer BEFORE turning on interrupts ;because RESET causes the TX empty flag to be SET clr TXbusy ;start out not busy on TX ldi RXchar, 0 ;start out running sei ;now print three strings and wait for incoming character interrupt TXloop: cpi RXchar, go ;wait for go signal - a 'g' on the keyboard brne TXloop ;now the pointer to the variable message in RAM ldi ZL, LOW(memstart) ;ptr to RAM ldi ZH, HIGH(memstart) ld r0,Z out UDR, r0 ;fire off the UART transmit ; clr TXflash ;the string is in RAM ser TXbusy ;and set the TX busy flag sbi UCR, UDRIE ;enable the TXempty interrupt rcall TXwait ;setup ptr for string ; ldi ZL, LOW(crlf<<1) ;shifted becuase pgm memory is words ; ldi ZH, HIGH(crlf<<1) ; lpm ; out UDR, r0 ;trigger the UART TX ; ser TXflash ;text string in flash memory ; ser TXbusy ;and set the TX busy flag ; sbi UCR, UDRIE ;enable the TXempty interrupt ; rcall TXwait cli ldi ZL, low(memstart) ldi ZH, high(memstart) ldi TXbusy, 0b11111111 out PORTB, TXbusy clr upload clr TXbusy out UCR, TXbusy sei ret ;***************************** ;interrupt routines ; UART needs a character TXempty:in savSREG, SREG ;save processor status rjmp TXram ; tst TXflash ;Is the string in flash memory? ; breq TXram ;If not, it is in RAM inc ZL ;get the next char from flash lpm ;and put it in r0 rjmp TXfls TXram: inc ZL ;get the next char from RAM ld r0,Z in temp, pinB ;toggle LED com temp ori temp, 0b01111111 out PORTB, temp TXfls: cpi16 Zh, Zl, memstart + displength * 6 + data + bytesrec breq TXend out UDR, r0 ;otherwise transmit it rjmp TXexit ;exit until next char TXend: clr TXbusy ;no more chars cbi UCR, UDRIE ;clear the TXempty interrupt TXexit: out SREG, savSREG ;restore proc status reti ;back to pgm ; TX done -- buffer is empty -- unused here TXdone: in savSREG, SREG ;save processor status out SREG, savSREG ;restore proc status reti ;back to pgm ; UART read a character RXdone: in savSREG, SREG ;save processor status in RXchar, UDR ;get the character out SREG, savSREG ;restore proc status reti ;back to pgm ;***************************** ;subroutine TXwait: tst TXbusy ;now wait for the tranmission to finish brne TXwait ret ;************************************************************************** ;needed because editor can't handle any more lines of code ;all floating point routines .include "fprout.asm" ;******************************************************************** ;interrupt one used for trigger changes inter1: in save, SREG in tempi, PIND andi tempi, 0b00100000 cpi tempi, 0b00100000 brne noupload ser upload rjmp upload noupload: mov tempi, status cpi tempi, 1 breq updateacq cpi tempi, 3 breq updateacq rjmp noupdateacq updateacq: ldi acq, 1 noupdateacq: ldi capture, 0 ;allow capturing upload: out SREG, save reti ;** Constants used for decimal conversion ** I1E6: .db 0x40,0x42,0x0f,0 ; 1,000,000 I1E5: .db 0xa0,0x86,0x01,0 ; 100,000 I1E4: .db 0x10,0x27,0x00,0 ; 10,000 I1E3: .db 0xe8,0x03,0x00,0 ; 1,000 I1E2: .db 0x64,0x00,0x00,0 ; 100 I1E1: .db 0x0a,0x00,0x00,0 ; 10 ; ;** IEEE format ** PI: .db 0xdb,0x0f,0x49,0x40 ; 3.1415927f Kp1: .db 0xCD,0xCC,0xCC,0x3D ; 0.1f Kp5: .db 0x00,0x00,0x00,0x3F ; 0.5f K1: .db 0x00,0x00,0x80,0x3F ; 1.0f K10: .db 0x00,0x00,0x20,0x41 ;10.0f ; K1E7: .db 0x80,0x96,0x18,0x4b K1E8: .db 0x20,0xbc,0xbe,0x4c K999999p9: .db 0xfe,0x23,0x74,0x49 ; 999999.9f K9999999: .db 0x7f,0x96,0x18,0x4b ;9999999.0f ; ; V1: .db 0xAC, 0xC5, 0xA7, 0x36 .db 0xAC, 0xC5, 0x27, 0x37 .db 0x17, 0xB7, 0xD1, 0x37 .db 0x17, 0xB7, 0x51, 0x38 .db 0x17, 0xB7, 0xD1, 0x38 .db 0x6F, 0x12, 0x83, 0x39 ;Constants for different voltage bases Volt: ;Time/Div Prescale Value Actual time Hex Mult factor ;0.0001 1 40 0.0001 28 0.000005 ;0.0002 1 80 0.0002 50 0.00001 ;0.0005 1 200 0.0005 C8 0.000025 ;0.001 1 400 0.001 190 0.00005 ;0.002 1 800 0.002 320 0.0001 ;0.005 1 2000 0.005 7D0 0.00025 ;0.01 1 4000 0.01 FA0 0.0005 ;0.02 1 8000 0.02 1F40 0.001 ;0.05 1 20000 0.05 4E20 0.0025 ;0.1 8 5000 0.1 1388 0.005 ;0.2 8 10000 0.2 2710 0.01 ;0.5 8 25000 0.5 61A8 0.025 ;prescale, compareA, time/div, placeholder for mult by 4 addressing Time: .db 0b00001001, 0x00, 0x28, 0x00 ;1, 800, .0001 .db 0b00001001, 0x00, 0x50, 0x00 ;1, 1600, .0002 .db 0b00001001, 0x00, 0xC8, 0x00 ;1, 4000, .0005 .db 0b00001001, 0x01, 0x90, 0x00 ;1, 8000, .001 .db 0b00001001, 0x03, 0x20, 0x00 ;1, 16000, .002 .db 0b00001001, 0x07, 0xD0, 0x00 ;1, 40000, .005 .db 0b00001001, 0x0F, 0xA0, 0x00 ;8, 10000, .01 .db 0b00001001, 0x1F, 0x40, 0x00 ;8, 20000, .02 .db 0b00001001, 0x4E, 0x20, 0x00 ;8, 50000, .05 .db 0b00001010, 0x13, 0x88, 0x00 ;64, 12500, .1 .db 0b00001010, 0x27, 0x10, 0x00 ;64, 25000, .2 .db 0b00001010, 0x61, 0xA8, 0x00 ;64, 62500, .5 ;multiplication factor FpTime: .db 0xAC, 0xC5, 0xA7, 0x36 .db 0xAC, 0xC5, 0x27, 0x37 .db 0x17, 0xB7, 0xD1, 0x37 .db 0x17, 0xB7, 0x51, 0x38 .db 0x17, 0xB7, 0xD1, 0x38 .db 0x6F, 0x12, 0x83, 0x39 .db 0x6F, 0x12, 0x03, 0x3A .db 0x6F, 0x12, 0x83, 0x3A .db 0x0A, 0xD7, 0x23, 0x3B .db 0x0A, 0xD7, 0xA3, 0x3B .db 0x0A, 0xD7, 0x23, 0x3C .db 0xCD, 0xCC, 0xCC, 0x3C