; Decode GSTrans string ; --------------------- ; On entry, r0=>source string ; On exit, r0=>converted string ; r1= length of converted string ; .GSTrans_SV mov #SV_INPUT,r1 ; Use SV_INPUT for dest string .GSTrans mov r1,-(sp) ; Save start of dest string jsr pc,GSTrans_Spc ; Skip spaces cmpb (r0)+,#&22 ; Leading quote? beq GSTrans_Pre ; CC=leading quote dec r0 ; Balance increment sec ; CS=no leading quote .GSTrans_Pre ror r2 ; b15=leading quote .GSTrans_Lp bic #&00FF,r2 ; Clear bit7 mask .GSTrans_Lp2 movb (r0)+,r3 ; Get character cmpb r3,#ASC" " bcs GSTrans_End ; Control char, end of line cmpb r3,#&22 bne GSTrans_NotQuote cmpb (r0)+,#&22 beq GSTrans_Store ; "" -> " dec r0 ; Balance increment tst r2 bpl GSTrans_Store ; Not waiting for terminating quote jsr pc,GSTrans_Spc ; Skip spaces .GSTrans_End movb #13,(r1) ; Put a terminator in mov (sp)+,r0 ; r0=>dest string sub r0,r1 ; r1=length of string rts pc .GSTrans_NotQuote cmpb r3,#ASC"|" bne GSTrans_Store ; Not bar prefix movb (r0)+,r3 bmi GSTrans_Store ; >127 -> ignore bar cmpb r3,#ASC"|" beq GSTrans_Store ; || -> | cmpb r3,#ASC"!" bne GSTrans_Char bis #&80,r2 ; |! -> set bit 7 bra GSTrans_Lp2 ; Get next encoding .GSTrans_Char cmpb r3,#ASC"?" bcs GSTrans_Store ; Not |? or |letter, ignore bar xor #&40,r3 cmp r3,#127 beq GSTrans_Store ; |? -> del bic #&E0,r3 ; |char -> control character .GSTrans_Store bis r2,r3 ; Add in bit 7 movb r3,(r1)+ ; Store in output string bra GS_TransLp .GSTrans_Spc cmpb (r0)+,#ASC" " beq GS_TransSpc ; Skip any leading spaces dec r0 ; Balance increments rts pc