Annotation of coco/zstring.src, revision 1.1.1.2

1.1       root        1:        PAGE
1.1.1.2 ! root        2:        ;SBTTL "--- Z-STRING HANDLERS ---"
1.1       root        3: 
                      4:        ; -----------------
                      5:        ; POINT TO Z-STRING
                      6:        ; -----------------
                      7: 
                      8: SETSTR:        CLRA
                      9:        ASL     TEMP+1
                     10:        ROL     TEMP
                     11:        ROLA
                     12:        STA     MPCH
                     13:        LDD     TEMP
                     14:        STD     MPCM
                     15:        CLR     MPCFLG
                     16: ZSTEX: RTS
                     17: 
                     18:        ; --------------
                     19:        ; PRINT Z-STRING
                     20:        ; --------------
                     21: 
                     22: PZSTR: CLR     CSPERM          ; PERMANENT CHARSET
                     23:        CLR     STBYTF          ; RESET STRING BYTE FLAG
                     24:        LDA     #$FF
                     25:        STA     CSTEMP          ; NO TEMP CHARSET ACTIVE
                     26: 
                     27: PZSTRL:        JSR     GETZCH          ; GET A Z-CHARACTER
                     28:        BCS     ZSTEX           ; END OF STRING IF CARRY SET
                     29:        STA     MASK            ; SAVE CHAR HERE
                     30:        BEQ     PZSTRS          ; O = SPACE CHAR
                     31:        CMPA    #4              ; IS THIS AN F-WORD?
                     32:        BLO     PZSTRF          ; APPARENTLY SO
                     33:        CMPA    #6              ; SHIFT CHAR?
                     34:        BLO     PZSTRT          ; YES, CHANGE CHARSET
                     35: 
                     36:        JSR     GETMOD
                     37:        TSTA                    ; IS THIS CHARSET 0?
                     38:        BNE     PZSTR1          ; NOPE
                     39: 
                     40:        ; PRINT LOWER-CASE CHAR (CHARSET 0)
                     41: 
                     42:        LDA     #$61-6          ; ASCII "a" MINUS Z-OFFSET
                     43: PZSTP0:        ADDA    MASK            ; ADD CHARACTER
                     44: PZSTP1:        JSR     COUT            ; PRINT RESULT
                     45:        BRA     PZSTRL          ; AND FETCH ANOTHER Z-CHAR
                     46: 
                     47:        ; CHARSET 1 OR 2?
                     48: 
                     49: PZSTR1:        CMPA    #1              ; SET 1?
                     50:        BNE     PZSTR2          ; NOPE, IT'S SET 2
                     51: 
                     52:        ; PRINT UPPER-CASE CHAR (CHARSET 1)
                     53: 
                     54:        LDA     #$41-6          ; ASCII "A" MINUS Z-OFFSET
                     55:        BRA     PZSTP0          ; AND SO ON ...
                     56: 
                     57:        ; DECODE/PRINT CHARSET 2
                     58: 
                     59: PZSTR2:        LDB     MASK            ; RETRIEVE Z-CHAR
                     60:        SUBB    #6              ; CONVERT TO ZERO-ALIGNED INDEX
                     61:        BEQ     PZSTRA          ; IF ZERO, IT'S "DIRECT" ASCII
                     62:        LDX     #CHRTBL         ; ELSE GET BASE OF DECODE TABLE
                     63:        LDA     B,X             ; GET CHAR FROM TABLE
                     64:        BRA     PZSTP1          ; AND PRINT IT!
                     65: 
                     66:        ; DECODE/PRINT A "DIRECT" ASCII CHAR
                     67: 
                     68: PZSTRA:        JSR     GETZCH          ; GET NEXT Z-BYTE
                     69:        ASLA                    ; SHIFT INTO POSITION
                     70:        ASLA
                     71:        ASLA
                     72:        ASLA
                     73:        ASLA
                     74:        STA     MASK            ; SAVE MSB
                     75:        JSR     GETZCH          ; FETCH LSB
                     76:        STA     MASK+1          ; SAVE THAT, TOO
                     77:        LDA     MASK            ; GET MSB
                     78:        ORA     MASK+1          ; SUPERIMPOSE LSB
                     79:        BRA     PZSTP1          ; AND PRINT RESULT
                     80: 
                     81:        ; PRINT A SPACE
                     82: 
                     83: PZSTRS:        LDA     #$20
                     84:        BRA     PZSTP1
                     85: 
                     86:        ; CHANGE CHARACTER SETS
                     87: 
                     88: PZSTRT:        SUBA    #3              ; CONVERT TO 1 OR 2
                     89:        TFR     A,B
                     90:        BSR     GETMOD
                     91:        BNE     PZSTRP          ; NO, DO PERMANENT SHIFT
                     92:        STB     CSTEMP          ; JUST A TEMP-SHIFT
                     93:        BRA     PZSTRL
                     94: 
                     95: PZSTRP:        STB     CSPERM          ; PERMANENT SHIFT
                     96:        CMPA    CSPERM          ; NEW SET SAME AS OLD?
                     97:        BEQ     PZSTRL          ; YES, EXIT
                     98:        CLR     CSPERM          ; ELSE BACK TO SET 0
                     99:        BRA     PZSTRL          ; BEFORE FINISHING
                    100: 
                    101:        ; HANDLE AN F-WORD
                    102: 
                    103: PZSTRF:        DECA                    ; CONVERT TO 0-2
                    104:        LDB     #64             ; TIMES 64
                    105:        MUL
                    106:        STB     PZSTFO          ; SAVE FOR LATER
                    107:        JSR     GETZCH          ; GET F-WORD INDEX
                    108:        TFR     A,B             ; MOVE IT
                    109:        ASLB                    ; FORM WORD-ALIGNED INDEX
                    110:        ADDB    PZSTFO          ; ADD OFFSET
                    111:        LDX     FWORDS          ; GET BASE ADDR OF FWORDS TABLE
                    112:        ABX                     ; ADD THE OFFSET
                    113:        LDD     ,X              ; GET THE FWORD POINTER
                    114:        STD     TEMP            ; AND SAVE IT
                    115: 
                    116:        ; SAVE THE STATE OF CURRENT Z-PRINT
                    117: 
                    118:        LDA     MPCH
                    119:        PSHS    A
                    120:        LDA     CSPERM
                    121:        LDB     STBYTF
                    122:        LDX     MPCM
                    123:        LDY     ZSTWRD
                    124:        PSHS    Y,X,B,A
                    125: 
                    126:        JSR     SETSTR          ; PRINT THE F-WORD
                    127:        JSR     PZSTR           ; POINTED TO BY [TEMP]
                    128: 
                    129:        ; RESTORE THE OLD Z-STRING
                    130: 
                    131:        PULS    Y,X,B,A
                    132:        STY     ZSTWRD
                    133:        STX     MPCM
                    134:        STB     STBYTF
                    135:        STA     CSPERM
                    136:        PULS    A
                    137:        STA     MPCH
                    138: 
                    139:        LDA     #$FF
                    140:        STA     CSTEMP          ; DISABLE TEMP CHARSET
                    141:        CLR     MPCFLG          ; MPC HAS CHANGED!
                    142:        JMP     PZSTRL          ; CONTINUE INNOCENTLY
                    143: 
                    144:        ; ----------------------
                    145:        ; RETURN CURRENT CHARSET
                    146:        ; ----------------------
                    147: 
                    148: GETMOD:        LDA     CSTEMP
                    149:        BPL     GM
                    150:        LDA     CSPERM
                    151:        RTS
                    152: 
                    153: GM:    LDB     #$FF
                    154:        STB     CSTEMP
                    155:        RTS
                    156: 
                    157:        ; ---------------
                    158:        ; GET NEXT Z-CHAR
                    159:        ; ---------------
                    160: 
                    161: GETZCH:        LDA     STBYTF          ; WHICH BYTE?
                    162:        BPL     GTZ0
                    163:        COMB                    ; SET CARRY
                    164:        RTS                     ; TO INDICATE "NO MORE CHARS"
                    165: 
                    166: GTZ0:  BNE     GETZH1          ; NOT FIRST CHAR
                    167:        INC     STBYTF
                    168:        JSR     GETWRD
                    169:        LDD     TEMP
                    170:        STD     ZSTWRD
                    171:        LSRA
                    172:        LSRA
                    173: GTEXIT:        ANDA    #%00011111
                    174:        CLRB                    ; CLEAR CARRY
                    175:        RTS
                    176: 
                    177: GETZH1:        DECA
                    178:        BNE     GETZH2          ; MUST BE LAST CHAR
                    179:        LDA     #2
                    180:        STA     STBYTF
                    181:        LDD     ZSTWRD
                    182:        LSRA
                    183:        RORB
                    184:        LDA     ZSTWRD
                    185:        LSRA
                    186:        LSRA
                    187:        RORB
                    188:        LSRB
                    189:        LSRB
                    190:        LSRB
                    191: GETZH3:        TFR     B,A             ; EXPECTED HERE
                    192:        BRA     GTEXIT
                    193: 
                    194: GETZH2:        CLR     STBYTF
                    195:        LDD     ZSTWRD
                    196:        BPL     GETZH3
                    197:        COM     STBYTF          ; INDICATE END OF STRING
                    198:        BRA     GETZH3
                    199: 
                    200:        ; -------------------
                    201:        ; CONVERT TO Z-STRING
                    202:        ; -------------------
                    203: 
                    204: CONZST:        LDD     #$0505          ; FILL OUTPUT BUFFER
                    205:        STD     ZSTBUO          ; WITH PAD CHARS
                    206:        STD     ZSTBUO+2
                    207:        STD     ZSTBUO+4
                    208: 
                    209:        INCA                    ; = 6
                    210:        STA     MASK            ; INIT CHAR COUNT
                    211: 
                    212:        CLR     VAL             ; RESET OUTPUT AND
                    213:        CLR     TEMP            ; INPUT INDEXES
                    214: 
                    215: CNZSL1:        LDB     TEMP
                    216:        INC     TEMP
                    217:        LDX     #ZSTBUI         ; POINT TO INPUT BUFFER
                    218:        LDA     B,X             ; GRAB NEXT CHAR
                    219:        STA     MASK+1          ; SAVE IT HERE
                    220:        BNE     CNZSL2          ; IF CHAR WAS ZERO,
                    221:        LDA     #5              ; USE A Z-PAD
                    222:        BRA     CNZSLO
                    223: 
                    224: CNZSL2:        LDA     MASK+1
                    225:        JSR     ZCHRCS          ; WHICH CHARSET TO USE?
                    226:        TSTA
                    227:        BEQ     CNZSLC          ; IF CHARSET 0, USE LOWER CASE
                    228:        ADDA    #3
                    229:        LDB     VAL             ; OUTPUT A TEMP SHIFT
                    230:        LDX     #ZSTBUO
                    231:        STA     B,X
                    232:        INC     VAL
                    233:        DEC     MASK
                    234:        LBEQ    CNZSLE
                    235: 
                    236: CNZSLC:        LDA     MASK+1
                    237:        JSR     ZCHRCS
                    238:        DECA
                    239:        BPL     CNZSC1          ; NOT CHARSET 0!
                    240:        LDA     MASK+1
                    241:        SUBA    #$61-6          ; ASCII "a" MINUS 6
                    242: 
                    243: CNZSLO:        LDB     VAL
                    244:        LDX     #ZSTBUO
                    245:        STA     B,X
                    246:        INC     VAL
                    247:        DEC     MASK
                    248:        BEQ     CNZSLE          ; ALL FINISHED
                    249:        BRA     CNZSL1          ; ELSE LOOP BACK FOR MORE
                    250: 
                    251: CNZSC1:        BNE     CNZSC3          ; MUST BE CHARSET 3
                    252:        LDA     MASK+1
                    253:        SUBA    #$41-6          ; ASCII "A" MINUS 6
                    254:        BRA     CNZSLO
                    255: 
                    256: CNZSC3:        LDA     MASK+1
                    257:        JSR     CNZS2M          ; IS IT IN TABLE?
                    258:        BNE     CNZSLO          ; YES, OUTPUT THE CHAR
                    259:        LDA     #6              ; ELSE IT'S A "DIRECT" ASCII CHAR
                    260:        LDB     VAL
                    261:        LDX     #ZSTBUO
                    262:        STA     B,X             ; SEND "DIRECT" TO OUTPUT
                    263:        INC     VAL
                    264:        DEC     MASK
                    265:        BEQ     CNZSLE          ; NO MORE ROOM!
                    266: 
                    267:        ; CONVERT CHAR TO 2-BYTE DIRECT ASCII
                    268: 
                    269:        LDA     MASK+1
                    270:        LSRA
                    271:        LSRA
                    272:        LSRA
                    273:        LSRA
                    274:        LSRA
                    275:        ANDA    #%00000011
                    276:        LDB     VAL
                    277:        LDX     #ZSTBUO
                    278:        STA     B,X
                    279:        INC     VAL
                    280:        DEC     MASK
                    281:        BEQ     CNZSLE          ; NO MORE ROOM!
                    282:        LDA     MASK+1
                    283:        ANDA    #%00011111      ; FORM 2ND Z-BYTE
                    284:        BRA     CNZSLO          ; AND OUTPUT IT
                    285: 
                    286:        ; ----------------------
                    287:        ; SEARCH CHARSET 3 TABLE
                    288:        ; ----------------------
                    289: 
                    290: CNZS2M:        LDX     #CHRTBL
                    291:        LDB     #25
                    292: CNLOOP:        CMPA    B,X
                    293:        BEQ     CNOK
                    294:        DECB
                    295:        BNE     CNLOOP
                    296:        RTS                     ; RETURN ZERO IN B IF NO MATCH
                    297: 
                    298: CNOK:  TFR     B,A             ; EXPECTED IN [A]
                    299:        ADDA    #6              ; CONVERT TO Z-CHAR
                    300:        RTS
                    301: 
                    302:        ; -------------------------
                    303:        ; DETERMINE CHARSET OF CHAR
                    304:        ; -------------------------
                    305: 
                    306: ZCHRCS:        CMPA    #$61            ; ASCII "a"
                    307:        BLO     ZCHR1
                    308:        CMPA    #$7B            ; ASCII "z"+1
                    309:        BHS     ZCHR1
                    310:        CLRA                    ; IT'S CHARSET 0
                    311:        RTS
                    312: 
                    313: ZCHR1: CMPA    #$41            ; ASCII "A"
                    314:        BLO     ZCHR2
                    315:        CMPA    #$5B            ; ASCII "Z"+1
                    316:        BHS     ZCHR2
                    317:        LDA     #1              ; IT'S CHARSET 1
                    318:        RTS
                    319: 
                    320: ZCHR2: TSTA
                    321:        BEQ     ZCHRX           ; EXIT IF ZERO
                    322:        BMI     ZCHRX           ; OR NEGATIVE
                    323:        LDA     #2              ; ELSE IT'S CHARSET 2
                    324: ZCHRX: RTS
                    325: 
                    326:        ; ---------------
                    327:        ; CRUSH 6 Z-CHARS
                    328:        ; ---------------
                    329: 
                    330: CNZSLE:        LDD     ZSTBUO          ; HANDLE 1ST TRIPLET
                    331:        ASLB
                    332:        ASLB
                    333:        ASLB
                    334:        ASLB
                    335:        ROLA
                    336:        ASLB
                    337:        ROLA
                    338:        ORB     ZSTBUO+2
                    339:        STD     ZSTBUO
                    340: 
                    341:        LDD     ZSTBUO+3        ; HANDLE 2ND TRIPLET
                    342:        ASLB
                    343:        ASLB
                    344:        ASLB
                    345:        ASLB
                    346:        ROLA
                    347:        ASLB
                    348:        ROLA
                    349:        ORB     ZSTBUO+5
                    350:        ORA     #%10000000      ; SET SIGN BIT OF LAST Z-BYTE
                    351:        STD     ZSTBUO+2
                    352:        RTS
                    353: 
                    354:        ; ----------------------
                    355:        ; CHARSET 2 DECODE TABLE
                    356:        ; ----------------------
                    357: 
1.1.1.2 ! root      358: CHRTBL:        .DB     0               ; DUMMY BYTE
        !           359:        .DB     $0D             ; CARRIAGE RETURN
        !           360:        .STR    "0123456789.,!?_#"
        !           361:        .DB     $27             ; SINGLE QUOTE
        !           362:        .DB     $22             ; DOUBLE QUOTE
        !           363:        .STR    "/\-:()"
1.1       root      364: 
1.1.1.2 ! root      365:        ;END
1.1       root      366: 

unix.superglobalmegacorp.com