{"action":"created","comment":{"url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/comments/132262551","pull_request_review_id":55324472,"id":132262551,"diff_hunk":"@@ -1,6 +1,1709 @@\n-.export vt100_init_terminal         = $1000\n-.export vt100_exit_terminal         = $1000\n-.export vt100_process_inbound_char  = $1000\n-.export vt100_process_outbound_char = $1000\n+.feature labels_without_colons\n+.feature leading_dot_in_identifiers\n+.feature loose_char_term\n+.define .asc .byt\n+\n+.export vt100_init_terminal         = InitTerminal\n+.export vt100_exit_terminal         = ExitTerminal\n+.export vt100_process_inbound_char  = ProcIn\n+.export vt100_process_outbound_char = ProcOut\n .exportzp vt100_screen_cols         = 40\n .exportzp vt100_screen_rows         = 24\n+\n+.import beep\n+.import telnet_close\n+.import telnet_send_char\n+.import telnet_send_string\n+\n+Cols    = vt100_screen_cols\n+Rows    = vt100_screen_rows\n+putRS   = telnet_send_char\n+SendStr = telnet_send_string\n+\n+; *************************************\n+; *                                   *\n+; *             C a T e r             *\n+; *                                   *\n+; *           Copyright by            *\n+; *         Lars Stollenwerk          *\n+; *                                   *\n+; *           2001 - 2003             *\n+; *                                   *\n+; * This file is part of CaTer.       *\n+; *                                   *\n+; * CaTer is provided under the terms *\n+; * of GNU General Public License.    *\n+; *                                   *\n+; * For more information see the      *\n+; * README file.                      *\n+; *                                   *\n+; *************************************\n+\n+; *************************************\n+; *\n+; * Constant declaration\n+; *\n+; *************************************\n+\n+.include \"atari.inc\"\n+\n+; *************************************\n+; *\n+; * Zeropage\n+; *\n+; *************************************\n+\n+.include \"zeropage.inc\"\n+\n+; --- Vector ---\n+; four vectors in zeropage for\n+; temporary use.\n+zVector = ptr1\n+xVector = ptr2\n+\n+; --- vector for PrnScr ---\n+vVector = ptr3\n+\n+; *************************************\n+; *\n+; * Variables\n+; *\n+; *************************************\n+\n+.bss\n+\n+; --- esc mode ---\n+; $00 = normal\n+; $0f = esc mode\n+; $fd = esc ( mode\n+; $fe = esc ) mode\n+; $ff = esc [ mode\n+; $f0 = ignore one char\n+EMode .res 1\n+\n+; --- esc buffer ---\n+EBuf .res $100\n+\n+; --- esc buffer length ---\n+; points on first free position\n+EBufL .res 1\n+\n+; --- esc parameter ---\n+; numeric parameter in esc sequence\n+EPar .res 1\n+\n+; --- scroll region ---\n+SRS .res 1     ; first line number\n+SRE .res 1     ; last line number\n+\n+; --- ANSI font attributes ---\n+; contains three bits\n+; bit 0 = reverse\n+; bit 1 = bold\n+; bit 2 = underline\n+Font .res 1\n+\n+; --- line drawing ---\n+; contains four bits\n+; bit 0 = G0 is line drawing\n+; bit 1 = G1 is iine drawing\n+; bit 6 = do line drawing\n+; bit 7 = G1 is invoked\n+Draw .res 1\n+\n+; --- crsr save area ---\n+; here is crsr info saved with ESC 7\n+; and restored from with ESC 8\n+SaveF .res 1   ; font\n+SaveR .res 1   ; reverse mode\n+SaveD .res 1   ; line drawing\n+SaveRow .res 1 ; row\n+SaveCol .res 1 ; column\n+\n+; --- Linebreak pending ---\n+; 0 = not pending, ff = pending\n+lbPending .res 1\n+\n+; --- crsr invisible ---\n+; 0 = visible, !0 = invisible\n+civis .res 1\n+\n+; --- char under crsr ---\n+sCrsrChar .res 1\n+\n+; --- reverse mode ---\n+; 0 = normal, !0 = revers\n+Rvs .res 1\n+\n+; --- buffer for addDecDig ---\n+mul10buf .res 1\n+\n+; --- system settings at entry, restored at termination time ---\n+LMARGN_save .res 1\n+SHFLOK_save .res 1\n+INVFLG_save .res 1\n+\n+\n+; *************************************\n+; *\n+; * Code\n+; *\n+; *************************************\n+\n+.code\n+\n+; -------------------------------------\n+; init terminal\n+;\n+; -------------------------------------\n+\n+InitTerminal\n+        jsr InitVar ; memory variables\n+        jsr InitChar; init font\n+        jsr InitScr ; init screen\n+        rts\n+\n+; -------------------------------------\n+; exit terminal\n+;\n+; -------------------------------------\n+\n+ExitTerminal\n+        jsr ExitChar; exit font\n+        jsr ExitScr ; exit screen\n+        rts\n+\n+; *************************************\n+; *\n+; * imcoming data\n+; *\n+; *************************************\n+\n+; -------------------------------------\n+; process incoming data\n+;\n+; char in Y\n+; -------------------------------------\n+\n+ProcIn  lda EMode   ; handle esc mode\n+        bne PIEsc\n+        cpy #$20    ; control?\n+        bcc Special\n+        tya\n+        jsr CPrnChr ; print to screen\n+        rts\n+\n+; to far for branch\n+PIEsc   jmp Esc\n+\n+; -------------------------------------\n+; special incoming char\n+;\n+; -------------------------------------\n+\n+Special tya         ; restore char\n+; --- CR ---\n+        cmp #$0d    ; CR?\n+        bne D1\n+CRhnd   jsr clPending\n+        ldx ROWCRS  ; get row\n+        ldy #$00    ; set col=0\n+        jsr CPlot   ; set crsr\n+        rts\n+; --- BS ---\n+D1      cmp #$08    ; BS?\n+        bne D2\n+BS      jsr clPending\n+        ldy COLCRS  ; get col\n+        beq D1rts   ; stop @ left margin\n+        dey         ; dec column\n+        ldx ROWCRS  ; get row\n+        jsr CPlot   ; set crsr\n+D1rts   rts\n+; --- ESC ---\n+D2      cmp #$1b    ; esc?\n+        bne D3\n+        lda #$0f    ; set esc mode\n+        sta EMode\n+        rts\n+; --- BEL ---\n+D3      cmp #$07    ; BEL?\n+        bne D4\n+        jsr beep\n+        rts\n+; --- LF ---\n+D4      cmp #$0a    ; LF?\n+        bne D5\n+LF      jsr clPending\n+        ldx ROWCRS  ; crsr line\n+        cpx SRE     ; end scroll region?\n+        bne D4a     ;  no -> branch\n+        jsr CUScrl  ;  yes -> scroll up\n+        rts\n+D4a     cpx #Rows-1 ; end of screen?\n+        bne D4b     ;  no -> branch\n+        rts         ;  yes -> do nothing\n+D4b     inx         ; next line\n+        ldy COLCRS  ; get col\n+        jsr CPlot   ; set crsr\n+        rts\n+; --- TAB ---\n+D5      cmp #$09    ; TAB?\n+        bne D6\n+        ; don't clear pending\n+        ; don't set pending\n+        lda COLCRS  ; crsr col\n+        and #$f8    ; (col DIV 8) * 8\n+        clc         ; col + 8\n+        adc #$08\n+        cmp #Cols\n+        bne D5a     ; no -> skip\n+        lda #$4f    ; yes -> col=79\n+D5a     tay         ; col to y\n+        ldx ROWCRS  ; line to x\n+        jsr CPlot   ; set crsr\n+        rts\n+; --- SO ---\n+D6      cmp #$0e    ; SO?\n+        bne D7\n+        asl Draw\n+        sec         ; set G1 invoked\n+        ror Draw\n+        jmp SLD\n+; --- SI ---\n+D7      cmp #$0f    ; SI?\n+        bne D8\n+        asl Draw\n+        clc         ; clear G1 invoked\n+        ror Draw\n+        jmp SLD\n+\n+D8      rts\n+\n+; -------------------------------------\n+; esc mode\n+;\n+; char in Y\n+; EMode != $00 in A\n+; -------------------------------------\n+\n+Esc     tax         ; save EMode\n+        and #$0f    ; EMode = $0f?\n+        bne E1\n+\n+; --- throw mode --- EMode = $f0\n+;     throw away char\n+        lda #$00    ; reset EMode\n+        sta EMode\n+        rts\n+\n+E1      txa         ; restore EMode\n+        and #$f0    ; EMode = $ff?\n+        beq SEsc    ; no -> short Emode\n+        jmp LEsc    ; yes -> long Emode\n+\n+; -------------------------------------\n+; short esc mode\n+;\n+; EMode = $0f\n+; process first char\n+; -------------------------------------\n+\n+SEsc    tya         ; restore char\n+        ; --- [ ---\n+        cmp #$5b  ; [ ?\n+        bne E2\n+        lda #$ff    ; set esc [ mode\n+        sta EMode\n+        rts\n+        ; --- ( ---\n+E2      cmp #$28    ; ( ?\n+        bne E3\n+        lda #$fd    ; set esc ( mode\n+        sta EMode\n+        rts\n+        ; --- ) ---\n+E3      cmp #$29    ; ) ?\n+        bne E4\n+        lda #$fe    ; set esc ) mode\n+        sta EMode\n+        rts\n+        ; --- # ---\n+E4      cmp #$23    ; # ?\n+        bne E5\n+        jmp sThrow\n+        ; --- D --- index\n+E5      cmp #$44    ; D ?\n+        bne E6\n+        jsr LF      ; same as LF\n+        jmp Eend\n+        ; --- M --- reverse index\n+E6      cmp #$4d    ; M ?\n+        bne E7\n+        jsr clPending\n+        ldx ROWCRS  ; get crsr row\n+        cpx SRS     ; top os scroll reg?\n+        bne E6a\n+        jsr CDScrl  ; yes -> scroll down\n+        jmp Eend\n+E6a     cpx #$00    ; top of screen?\n+        bne E6b\n+        jmp Eend    ; yes -> do nothing\n+E6b     dex         ; one line up\n+        ldy COLCRS  ; get crsr col\n+        jsr CPlot   ; set crsr\n+        jmp Eend\n+        ; --- E --- next line\n+E7      cmp #$45    ; E ?\n+        bne E8\n+        jsr CRhnd\n+        jsr LF\n+        jmp Eend\n+        ; --- 7 --- save crsr\n+E8      cmp #$37    ; 7 ?\n+        bne E9\n+        lda Font    ; save font\n+        sta SaveF\n+        lda Rvs     ; save reverse mode\n+        sta SaveR\n+        lda Draw    ; save line drawing\n+        sta SaveD\n+        ldx ROWCRS  ; save position\n+        ldy COLCRS\n+        stx SaveRow\n+        sty SaveCol\n+        jmp Eend\n+        ; --- 8 --- restore crsr\n+E9      cmp #$38    ; 8 ?\n+        bne E10\n+        jsr clPending\n+        ldx SaveRow ; restore pos\n+        ldy SaveCol\n+        jsr CPlot\n+        lda SaveD   ; restore line drawing\n+        sta Draw\n+        lda SaveR   ; restore ..\n+        sta Rvs     ; .. reverse mode\n+        ldx SaveF   ; restore font\n+        stx Font\n+        jmp Eend\n+\n+        ; --- unknown ---\n+E10\n+\n+        ; --- reset ESC mode ---\n+Eend    lda #$00    ; reset EMode\n+        sta EMode\n+        rts\n+\n+        ; --- set Throw mode ---\n+sThrow  lda #$f0    ; set esc mode $f0\n+        sta EMode\n+        rts\n+\n+; -------------------------------------\n+; [ or ( or ) esc modes\n+;\n+; EMode = $ff or $fd or $fe\n+; -------------------------------------\n+\n+LEsc    lda EMode\n+        cmp #$ff\n+        beq LE1b\n+        jmp SCS     ; ( esc or ) esc\n+\n+LE1b    tya         ; restore char\n+\n+        ldy EBufL\n+        sta EBuf,y  ; store char\n+        iny\n+        sty EBufL   ; inc esc buffer\n+\n+        jsr TestL   ; test letter\n+        bcs LE1     ; process command\n+        rts\n+\n+; --- process esc command ---\n+; A = last char\n+; Y = EBufL\n+; X conunts processed command chars\n+LE1     ldx #$00    ; first char\n+\n+; --- A --- crsr up\n+        cmp #$41    ; A ?\n+        bne LE2\n+        jsr clPending\n+        jsr GetNum  ; get argument\n+        lda EPar    ; EPar = 0...\n+        bne LE1c\n+        inc EPar    ; .. means 1\n+LE1c    lda ROWCRS  ; get crsr row\n+        sec\n+        sbc EPar    ; row = row - up\n+        cmp SRS     ; stop at top of ..\n+        bpl LE1a    ; ..scroll region\n+        lda SRS\n+LE1a    tax         ; x is row\n+        ldy COLCRS  ; y is col\n+        jsr CPlot   ; set crsr\n+        jmp LEend\n+\n+; --- B --- crsr down\n+LE2     cmp #$42    ; B ?\n+        bne LE3\n+        jsr clPending\n+        jsr GetNum  ; get argument\n+        lda EPar    ; EPar = 0...\n+        bne LE2c\n+        inc EPar    ; .. means 1\n+LE2c    lda ROWCRS  ; get crsr row\n+        clc\n+        adc EPar    ; row = row + down\n+        cmp SRE     ; outside scrregion?\n+        bcs LE2d    ; yes -> branch\n+        tax         ; x is row\n+        jmp LE2a\n+LE2d    ldx SRE     ; x = row = SRE\n+LE2a    ldy COLCRS  ; y is col\n+        jsr CPlot   ; set crsr\n+        jmp LEend\n+\n+; --- C --- crsr right\n+LE3     cmp #$43    ; C ?\n+        bne LE4\n+        jsr clPending\n+        jsr GetNum  ; get argument\n+        lda EPar    ; EPar = 0...\n+        bne LE3c\n+        inc EPar    ; .. means 1\n+LE3c    lda COLCRS  ; get crsr col\n+        clc\n+        adc EPar    ; col = col + right\n+        cmp #$4f    ; outside screen?\n+        bcs LE3d    ; yes -> branch\n+        tay\n+        jmp LE3a\n+LE3d    ldy #$4f    ; y=col=left margin\n+LE3a    ldx ROWCRS  ; x is row\n+        jsr CPlot   ; set crsr\n+        jmp LEend\n+\n+; --- D --- crsr left\n+LE4     cmp #$44    ; D ?\n+        bne LE5\n+        jsr clPending\n+        jsr GetNum  ; get argument\n+        lda EPar    ; EPar = 0...\n+        bne LE4c\n+        inc EPar    ; .. means 1\n+LE4c    lda COLCRS  ; get crsr col\n+        sec\n+        sbc EPar    ; col = col - left\n+        bpl LE4a    ; stop at left..\n+        lda #$00    ; ..margin\n+LE4a    tay         ; y is col\n+        ldx ROWCRS  ; x is row\n+        jsr CPlot   ; set crsr\n+        jmp LEend\n+\n+; --- m ---  font attributes\n+LE5     cmp #$6d    ; m ?\n+        beq LE5a\n+        jmp LE6     ; too far to branch\n+LE5a    jsr GetNum\n+        pha         ; save nondigit char\n+        lda Font    ; font to A\n+        ldy EPar    ; parameter to Y\n+        ; -- 0 --\n+        bne LE5b    ; 0 ?\n+        tya         ; set font = vanilla\n+        jmp LE5nx\n+        ; -- 1 -- bold\n+LE5b    cpy #$01\n+        bne LE5c\n+        ora #$02    ; bit 1 = bold\n+        jmp LE5nx\n+        ; -- 4 -- underline\n+LE5c    cpy #$04\n+        bne LE5d\n+        ora #$04    ; bit 2 = underline\n+        jmp LE5nx\n+        ; -- 7 -- reverse\n+LE5d    cpy #$07\n+        bne LE5nx\n+        ora #$01    ; bit 0 = reverse\n+LE5nx   ; -- next char --\n+        sta Font\n+        pla         ; get nondigit char\n+        cmp #$3b    ; is semicolon?\n+        beq LE5a    ; then next param\n+        ; set ANSI font attributes\n+        lda Font\n+        ldx #0      ; reverse off\n+        lsr         ; reverse?\n+        bcc LE5k\n+        ldx #$80    ; reverse on\n+LE5k    stx Rvs     ; set reverse mode\n+        jmp LEend\n+\n+; --- K --- erase line\n+LE6     cmp #$4b      ; K ?\n+        bne LE7\n+        jsr GetNum    ; get parameter\n+        lda EPar      ; in A\n+        ; -- 0 -- crsr to end of line\n+        bne LE6b\n+        jsr ErEnLn    ; erase end line\n+        jmp LEend\n+        ; -- 1 -- begin to crsr\n+LE6b    cmp #$01\n+        bne LE6d\n+        jsr ErBeLn    ; erase beg line\n+        jmp LEend\n+        ; -- 2 -- whole line\n+LE6d    cmp #$02\n+        bne LE6e      ; par undefined\n+        ldx ROWCRS    ; line in X\n+        jsr ErLn      ; erase line\n+        sta sCrsrChar ; del char ..\n+                      ; ..under crsr\n+        jsr COn\n+LE6e    jmp LEend\n+\n+\n+; --- f --- same as H\n+LE7     cmp #$66\n+        bne LE8\n+        jmp LE7a      ; same as H\n+\n+; --- H --- cursor position\n+LE8     cmp #$48\n+        bne LE9\n+LE7a    jsr clPending\n+        cpy #$01    ; no par means home\n+        bne LE8a\n+        ; -- home --\n+        ldx #$00\n+        ldy #$00\n+        jsr CPlot   ; set crsr\n+        jmp LEend\n+        ; -- row, col --\n+LE8a    jsr GetNum\n+        cmp #$3b    ; is ;?\n+        bne LE8d    ; no -> error\n+        ; -- prepare row --\n+        ldy EPar    ; get row\n+        bne LE8b    ; 0 means 1\n+        iny\n+LE8b    dey         ; line 1 -> line 0\n+        cpy #Rows   ; >= 24?..\n+        bcs LE8d    ; ..error!\n+        sty xVector ; save row\n+        ; -- prepare col\n+        jsr GetNum\n+        ldy EPar    ; get col\n+        bne LE8c    ; 0 means 1\n+        iny\n+LE8c    dey         ; col 1 -> col 0\n+        cpy #Cols\n+        bcs LE8d    ; ..error!\n+        ldx xVector ; restore row to X\n+        jsr CPlot   ; set crsr\n+LE8d    jmp LEend\n+\n+; --- J --- erase screen\n+LE9     cmp #$4a      ; J ?\n+        bne LE10\n+        jsr GetNum    ; get parameter\n+        lda EPar      ; in A\n+        ; -- 0 -- crsr to end\n+        bne LE9a\n+        jsr ErEnLn    ; del rest of line\n+        ldx ROWCRS    ; get crsr line\n+LE9b    inx           ; next line\n+        cpx #Rows     ; line 24?\n+        bcs LE9f      ; then end\n+        txa\n+        pha           ; save X\n+        jsr ErLn      ; erase line\n+        pla\n+        tax           ; restore X\n+        jmp LE9b      ; next line\n+        ; -- 1 -- beg of screen to crsr\n+LE9a    cmp #$01\n+        bne LE9e\n+        jsr ErBeLn    ; del start of ln\n+        ldx ROWCRS    ; get crsr line\n+LE9c    dex           ; previous line\n+        bmi LE9f      ; neg line -> end\n+        txa\n+        pha           ; save X\n+        jsr ErLn      ; erase line\n+        pla\n+        tax           ; restore X\n+        jmp LE9c\n+        ; -- 2 -- del screen\n+LE9e    cmp #$02      ; unknown?\n+        bne LE9f      ; then ingnore\n+        ldx #Rows-1   ; start at last line\n+LE9d    txa\n+        pha           ; save X\n+        jsr ErLn      ; erase line\n+        pla\n+        tax           ; restore X\n+        dex           ; previous line\n+        bpl LE9d\n+LE9f    jmp LEend\n+\n+; --- r ---  set scroll region\n+LE10    cmp #$72    ; r ?\n+        bne LE11\n+        ; -- prepare top --\n+        jsr GetNum\n+        cmp #$3b    ; is ;?\n+        bne LE10e   ; no -> error\n+        ldy EPar    ; get top\n+        dey         ; line 1 -> line 0\n+        cpy #Rows\n+        bcs LE10e   ; ..error!\n+        sty xVector ; save top\n+        ; -- prepare bottom --\n+        jsr GetNum\n+        ldy EPar    ; get bottom\n+        dey         ; line 1 -> line 0\n+        cpy #Rows\n+        bcs LE10e   ; ..error!\n+        sty zVector ; save bottom\n+        ; -- validate lines --\n+        lda xVector ; restore top\n+        cmp zVector ; >= bottom?..\n+        bcs LE10e   ; ..error!\n+        sta SRS     ; top -> SRStart\n+        sty SRE     ; bottom -> SREnd\n+        ; -- home crsr\n+        jsr clPending\n+        ldx #$00\n+        ldy #$00\n+        jsr CPlot\n+LE10e   jmp LEend\n+\n+; --- l --- set crsr invisible\n+LE11    cmp #$6c    ; l ?\n+        bne LE12\n+        lda EBuf    ; first char ..\n+        cmp #$3f    ; .. is '?' ?\n+        bne LE11a\n+        inx         ; at second char ..\n+        jsr GetNum\n+        lda EPar\n+        cmp #25     ; .. 25 ?\n+        bne LE11a\n+        jsr COff    ; switch crsr off\n+        sta civis   ; mark invisible\n+LE11a   jmp LEend\n+\n+; --- h --- set crsr visible\n+LE12    cmp #$68    ; h ?\n+        bne LE13\n+        lda EBuf    ; first char ..\n+        cmp #$3f    ; ... is '?' ?\n+        bne LE12a\n+        inx         ; at second char ..\n+        jsr GetNum\n+        lda EPar\n+        cmp #25     ; .. 25 ?\n+        bne LE12a\n+        lda #$00\n+        sta civis   ; mark visible\n+        jsr COn     ; switch crsr off\n+LE12a   jmp LEend\n+\n+LE13\n+; --- unknown esc seqence ---\n+LEend   lda #$00\n+        sta EBufL   ; reset esc buffer\n+        sta EMode   ; reset esc mode\n+        rts\n+\n+; -------------------------------------\n+; ( or ) esc modes (select char set)\n+;\n+; EMode = $fd or $fe in A\n+; -------------------------------------\n+\n+SCS     and #$03    ; $01 or $02\n+        cpy #'0'    ; line drawing?\n+        bne SCS1\n+        ora Draw    ; set Gx line drawing\n+        jmp SCS2\n+SCS1    eor #$ff    ; $fe or $fd\n+        and Draw    ; clear Gx line drawing\n+SCS2    sta Draw\n+        jsr SLD\n+        jmp LEend\n+\n+; -------------------------------------\n+; SLD - set line drawing\n+;\n+; set bit 6 based on bits 0, 1, 7\n+;--------------------------------------\n+\n+SLD     lda Draw\n+        bmi SLD1    ; G1 is invoked?\n+        and #$01    ; no -> G0..\n+        jmp SLD2\n+SLD1    and #$02    ; yes -> G1..\n+SLD2    beq SLD3    ; ..is line drawing?\n+        lda #$40    ; yes -> set..\n+        ora Draw    ; ..line drawing\n+        jmp SLD4\n+SLD3    lda #$bf    ; no -> clear..\n+        and Draw    ; ..line drawing\n+SLD4    sta Draw\n+        rts\n+\n+; -------------------------------------\n+; GetNum - get decimal number from\n+;          esc sequence\n+;\n+; params: esc sequence in EBuf\n+;         first index to process in X\n+; affects: A, X, Y\n+; return: number in EPar\n+;         first non digit char in  A\n+;         next index to process in X\n+; -------------------------------------\n+\n+GetNum  lda #$00    ; init value\n+        sta EPar\n+GN2     lda EBuf,x  ; get next char\n+        inx\n+        jsr TestD   ; digit?\n+        bcc GN1     ; no -> return\n+        tay         ; digit to Y\n+        lda EPar\n+        jsr addDecDig\n+        sta EPar\n+        jmp GN2     ; next char\n+\n+GN1     rts\n+\n+; -------------------------------------\n+; TestL - Test letter\n+;\n+; params: char in A\n+; affects: none\n+; return: c = 1 for letter\n+;         c = 0 for no letter\n+; -------------------------------------\n+\n+TestL   cmp #$41    ; smaller then A?\n+        bcs TL1     ; no -> go on\n+        rts         ; return no letter\n+\n+TL1     cmp #$5b    ; smaller then Z+1?\n+        bcs TL2     ; no -> go on\n+        sec         ; return letter\n+        rts\n+\n+TL2     cmp #$61    ; smaller then a?\n+        bcs TL3     ; no -> go on\n+        rts         ; return no letter\n+\n+TL3     cmp #$7b    ; smaller then z+1?\n+        bcs TL4     ; no -> go on\n+        sec         ; return letter\n+        rts\n+\n+TL4     clc         ; return no letter\n+        rts\n+\n+; -------------------------------------\n+; TestD - test digit\n+;\n+; params: char in A\n+; affects: none\n+; return: c = 1 for digit\n+;         c = 0 for no digit\n+; -------------------------------------\n+\n+TestD   cmp #$30    ; smaller then 0?\n+        bcs TD1     ; no -> go on\n+        rts         ; return no digit\n+\n+TD1     cmp #$3a    ; smaller then 9+1?\n+        bcs TD2     ; no -> go on\n+        sec         ; return digit\n+        rts\n+\n+TD2     clc         ; return no digit\n+        rts\n+\n+; -------------------------------------\n+; addDecDig - add decimal digit\n+;\n+; multiply A * 10, add Y\n+;\n+; param: present number in A\n+;        new digit in Y (may be ASCII digit)\n+; affects: A\n+; return: 10 times the number in A + Y\n+;         c = 1 overflow occured,\n+;               number invalid\n+;         c = 0 no overflow\n+; -------------------------------------\n+\n+addDecDig\n+        ; --- inc value ---\n+        ; old value * 10\n+        ; 10a = ( 4a + a ) * 2\n+        sta mul10buf\n+        clc\n+        asl           ; ( 4a\n+        bcs aDDigE\n+        asl\n+        bcs aDDigE\n+        adc mul10buf  ; + a )\n+        bcs aDDigE\n+        asl           ; *2\n+        bcs aDDigE\n+        sta mul10buf\n+        ; --- add Y ---\n+        tya\n+        and #$0f      ; digit to val\n+        adc mul10buf\n+\n+aDDigE  rts\n+\n+; *************************************\n+; *\n+; * outgoing data\n+; *\n+; *************************************\n+\n+; -------------------------------------\n+; process outgoing key\n+;\n+; params: key in Y\n+; -------------------------------------\n+\n+ProcOut\n+        lda kta,y   ; keyboard to ASCII\n+        cmp #$81\n+        beq POrts   ; ignore key\n+        cmp #$80\n+        beq CmdKey  ; command key\n+        jsr putRS\n+POrts   rts\n+\n+; -------------------------------------\n+; outgoing command key\n+;\n+; -------------------------------------\n+\n+ScrsrU .byt $1b, $4f, $41, $00 ; esc O A\n+ScrsrD .byt $1b, $4f, $42, $00 ; esc O B\n+ScrsrR .byt $1b, $4f, $43, $00 ; esc O C\n+ScrsrL .byt $1b, $4f, $44, $00 ; esc O D\n+\n+CmdKey  tya         ; restore character\n+\n+; --- crsr L ---\n+        cmp #ATLRW\n+        bne C0\n+\n+crsrL   ldx #<ScrsrL\n+        ldy #>ScrsrL\n+        jsr SendStr\n+        rts\n+\n+; --- crsr D ---\n+C0      cmp #ATDRW\n+        bne C1\n+\n+crsrD   ldx #<ScrsrD\n+        ldy #>ScrsrD\n+        jsr SendStr\n+        rts\n+\n+; --- crsr U ---\n+C1      cmp #ATURW\n+        bne C2\n+\n+crsrU   ldx #<ScrsrU\n+        ldy #>ScrsrU\n+        jsr SendStr\n+        rts\n+\n+; --- crsr R ---\n+C2      cmp #ATRRW\n+        bne C3\n+\n+crsrR   ldx #<ScrsrR\n+        ldy #>ScrsrR\n+        jsr SendStr\n+        rts\n+\n+; ---  Option h H ---\n+; print help\n+C3      cmp #$82     ; special value for HELP key\n+        beq Help\n+        cmp #$68     ; h\n+        beq C31\n+        cmp #$48     ; H\n+        bne C4\n+C31     lda CONSOL\n+        and #4\n+        beq Help     ; \"Option\" pressed\n+        tya\n+        jsr putRS    ; send h or H\n+        rts\n+\n+; ---  Option q Q ---\n+; quit CaTer\n+C4      cmp #$71     ; q\n+        beq C41\n+        cmp #$51     ; Q\n+        bne C5\n+C41     lda CONSOL\n+        and #4\n+        beq Cquit    ; \"Option\" pressed\n+        tya\n+        jsr putRS    ; send q or Q\n+        rts\n+\n+        ; quit CaTer\n+Cquit   jsr telnet_close\n+        rts\n+\n+; --- unknown character ---\n+C5      rts\n+\n+; -------------------------------------\n+; Help - print help screen\n+;\n+; calledom outgoing data loop\n+; returns with rts\n+; -------------------------------------\n+Help    jsr CRhnd    ; next screen line\n+        jsr LF\n+        ldx #<HelpStr1\n+        ldy #>HelpStr1\n+        jsr CPrnStrNL\n+        ldx #<HelpStr2\n+        ldy #>HelpStr2\n+        jsr CPrnStrNL\n+        ldx #<HelpStr3\n+        ldy #>HelpStr3\n+        jsr CPrnStrNL\n+        rts\n+\n+HelpStr1;\".........1.........2.........3.........4\"\n+.asc     \"O-H            Help (this text)         \"\n+.asc     \"O-Q            Quit Telnet session      \"\n+.asc     \"C-8, S-C-8     Send C-@                 \"\n+.asc     \"C-,, S-C-,     Send C-[                 \"\n+.asc     \"C-., S-C-.     Send C-]                 \"\n+.asc     \"C-/, S-C-/     Send C-\\\"\n+.byt $00\n+HelpStr2;\".........1.........2.........3.........4\"\n+.asc     \"C-7            Send C-^                 \"\n+.asc     \"S-C-7          Send `                   \"\n+.asc     \"S-C--          Send C-_                 \"\n+.asc     \"C-9, S-C-9     Send {                   \"\n+.asc     \"C-0, S-C-0     Send }                   \"\n+.asc     \"S-C-T, S-C-2   Send ~\"\n+.byt $00\n+HelpStr3;\".........1.........2.........3.........4\"\n+.asc     \"   C: Control   O: Option   S: Shift    \"\n+.byt $00\n+\n+; *************************************\n+; *\n+; * screen handling\n+; *\n+; *************************************\n+\n+; -------------------------------------\n+; COff - switch cursor off\n+;\n+; affects: none\n+;\n+; Switch cursor off and restore char.\n+; This has to be done before every crsr\n+; movement.\n+; After movement COn has to be called.\n+; -------------------------------------\n+\n+COff    pha            ; save registers\n+        tya\n+        pha\n+\n+        lda civis      ; invisible?\n+        bne CO2        ; -> do nothing\n+        ldy COLCRS     ; get column\n+        lda sCrsrChar  ; restore char\n+        sta (ADRESS),y\n+\n+CO2     pla            ; restore registers\n+        tay\n+        pla\n+        rts\n+\n+; -------------------------------------\n+; COn - switch crsr on\n+;\n+; affects: none\n+;\n+; opposite of COff\n+; -------------------------------------\n+\n+COn     pha\n+        tya\n+        pha\n+\n+        lda civis        ; invisible?\n+        bne COn4         ; -> do nothing\n+        ldy COLCRS       ; get column\n+        lda (ADRESS),y   ; save chr\n+        sta sCrsrChar\n+        eor #$80\n+        sta (ADRESS),y\n+\n+COn4    pla\n+        tay\n+        pla\n+        rts\n+\n+; -------------------------------------\n+; CPlot - move cursor\n+;\n+; params: coumn in Y\n+;         line in X\n+; affects: A, X, Y\n+;\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+\n+CPlot   jsr COff\n+        jsr Plot\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; Plot - move cursor\n+;\n+; params: coumn in Y\n+;         line in X\n+; affects: A, X, Y\n+; -------------------------------------\n+\n+Plot    stx ROWCRS      ; set row\n+        sty COLCRS      ; set col\n+        jsr SLV\n+        ldx xVector     ; set screen line\n+        ldy xVector+1\n+        stx ADRESS\n+        sty ADRESS+1\n+        rts\n+\n+; -------------------------------------\n+; CPrnChr - print char to screen\n+;\n+; params: chr in A, $ff means no output\n+; affects: A\n+; uses: xVector\n+;\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+\n+CPrnChr jsr COff\n+        jsr PrnChr\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; PrnChr - print char to screen\n+;\n+; params: chr in A, $80 means no output\n+; affects: A\n+; uses: xVector\n+; -------------------------------------\n+\n+PrnChr  sta xVector     ; save char\n+        txa             ; save registers\n+        pha\n+        tya\n+        pha\n+        lda xVector     ; restore char\n+\n+        ; -- $80-$ff -- non-ASCII\n+        bmi PCend       ; no output\n+\n+        ; -- handle line drawing --\n+        bit Draw        ; line drawing?\n+        bvc PCreg\n+        cmp #$60        ; line drawing char?\n+        bcc PCreg\n+        tax\n+        lda ltsc,x      ; line drawing to ScreenCode\n+        eor Rvs\n+        jmp PCput\n+\n+PCreg   tay\n+        rol a\n+        rol a\n+        rol a\n+        rol a\n+        and #3\n+        tax\n+        tya\n+        and #$9f\n+        ora ataint,x\n+        eor Rvs\n+\n+PCput   ldx lbPending   ; need new line?\n+        beq PC2         ; no -> skip\n+        ldx #$00        ; clear pending\n+        stx lbPending\n+        jsr NewLn\n+PC2     ldy COLCRS      ; get crsr col\n+        sta (ADRESS),y  ; char to screen\n+\n+        ; -- move on crsr --\n+        cpy #Cols-1     ; col = last one?\n+        bne PC8         ; no -> skip\n+        lda #$ff        ; yes -> set..\n+        sta lbPending   ; ..pending\n+        bne PCend\n+PC8     iny             ; move on crsr\n+        sty COLCRS\n+\n+PCend   pla             ; restore registers\n+        tay\n+        pla\n+        tax\n+        rts\n+\n+; -------------------------------------\n+; NewLn - move crsr to next line\n+;\n+; affects: X, Y\n+;\n+; --- INTERNAL ---\n+; subtask of PrnChr\n+; -------------------------------------\n+\n+NewLn   pha         ; save char\n+        ldx ROWCRS  ; get crsr row\n+        cpx SRE     ; end of scroll reg?\n+        beq NL1     ; yes -> branche\n+        cpx #Rows-1 ; last line\n+        beq NLend   ; yes -> crsr stays\n+        ; --- normal wrap ---\n+        inx         ; increase line\n+        ldy #$00    ; begin of line\n+        jsr Plot\n+        jmp NLend\n+        ; --- scroll up ---\n+NL1     jsr UScrl\n+        ldy #$00    ; begin of line\n+        sty COLCRS\n+NLend   pla         ; restore char\n+        rts\n+\n+; -------------------------------------\n+; DEL - move crsr to the left and\n+;       delete char\n+;\n+; Can move through left margin.\n+;\n+; affects: A, X, Y\n+; -------------------------------------\n+\n+DEL     jsr COff\n+        ldy COLCRS\n+        lda lbPending\n+        beq DEL1\n+        ; pending\n+        jsr clPending\n+        jmp DELe\n+\n+DEL1    dey\n+        bmi DEL2\n+        ; middle of line\n+        sty COLCRS\n+        jmp DELe\n+\n+DEL2    ; first col\n+        ldx ROWCRS\n+        beq DELee ; odd: top left corner\n+        dex\n+        ldy #Cols-1\n+        jsr Plot\n+        ldy COLCRS\n+\n+DELe    ldx ROWCRS\n+        jsr SLV\n+        lda #$00\n+        sta (xVector),y ; clear char\n+DELee   jsr COn\n+        rts\n+\n+; -------------------------------------\n+; clPending - clear pending flag\n+;\n+; affects: none\n+;\n+; Must be called in all crsr movement\n+; commands.\n+; -------------------------------------\n+\n+clPending\n+        pha\n+        lda #$00\n+        sta lbPending\n+        pla\n+        rts\n+\n+; -------------------------------------\n+; CUScrl - scroll up scrollregion\n+;\n+; affects: A, X, Y\n+;\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+\n+CUScrl  jsr COff\n+        jsr UScrl\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; UScrl - scroll up scrollregion\n+;\n+; affects: A, X, Y\n+; uses: xVector, zVector\n+; -------------------------------------\n+\n+UScrl   ldx SRS     ; get first line\n+        ; --- scroll one line ---\n+US1     ; -- new line: --\n+        ; -- zVector --\n+        jsr SLV\n+        lda xVector ; screen line\n+        ldy xVector+1\n+        sta zVector\n+        sty zVector+1\n+        ; -- old line: --\n+        ; -- xVector --\n+        inx             ; old line\n+        jsr SLV\n+        ; -- copy line --\n+        ldy #Cols-1\n+US2     lda (xVector),y ; copy char\n+        sta (zVector),y\n+        dey\n+        bpl US2\n+        cpx SRE         ; last line?\n+        bne US1         ; no -> go on\n+        jsr ErLn_       ; del last line\n+\n+        rts\n+\n+; -------------------------------------\n+; CDScrl - scroll down scrollregion\n+;\n+; affects: A, X, Y\n+;\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+\n+CDScrl  jsr COff\n+        jsr DScrl\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; DScrl - scroll down scrollregion\n+;\n+; affects: A, X, Y\n+; uses: xVector, zVector\n+; -------------------------------------\n+\n+DScrl   ldx SRE     ; get last line\n+        ; --- scroll one line ---\n+DS1     ; -- new line: --\n+        ; -- zVector --\n+        jsr SLV\n+        lda xVector ; screen line\n+        ldy xVector+1\n+        sta zVector\n+        sty zVector+1\n+        ; -- old line: --\n+        ; -- xVector --\n+        dex             ; old line\n+        jsr SLV\n+        ; -- copy line --\n+        ldy #Cols-1\n+DS2     lda (xVector),y ; copy char\n+        sta (zVector),y\n+        dey\n+        bpl DS2\n+        cpx SRS         ; first line?\n+        bne DS1         ; no -> go on\n+        jsr ErLn_       ; del first line\n+\n+        rts\n+\n+; -------------------------------------\n+; CPrnStrNL - print string to sceen,\n+;             followed by CR NL\n+;\n+; string: chars, terminated by $00\n+; params: string ptr lo in X\n+;         string ptr hi in y\n+; affects: A, X, Y\n+;\n+; The string must be smaller than\n+; 255 chrs.\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+CPrnStrNL\n+        jsr CPrnStr\n+        jsr CRhnd\n+        jsr LF\n+        rts\n+\n+; -------------------------------------\n+; CPrnStr - print string to screen\n+;\n+; string: chars, terminated by $00\n+; params: string ptr lo in X\n+;         string ptr hi in y\n+; affects: A\n+;\n+; The string must be smaller than\n+; 255 chrs.\n+; The crsr ist turned off during\n+; operation (COff - COn)\n+; -------------------------------------\n+CPrnStr stx vVector   ; store string ptr\n+        sty vVector+1\n+        jsr COff\n+\n+        ldy #$00\n+L1      lda (vVector),y\n+        beq L2      ; string ends at $00\n+        jsr PrnChr\n+        ; -- put char to screen --\n+        iny\n+        jmp L1\n+\n+L2      jsr COn\n+        rts\n+\n+; -------------------------------------\n+; ErLn - erase screen line\n+;\n+; params: line number in X\n+; affects: A, X, Y\n+; return: $00 (space screen code) in A\n+;\n+; For internal use:\n+; ErLn_ needs line ptr in xVector\n+; -------------------------------------\n+\n+ErLn    jsr SLV ; line start in xVector\n+ErLn_   ldy #Cols-1\n+        lda #$00\n+EL1     sta (xVector),y ; clear char\n+        dey\n+        bpl EL1\n+\n+        rts\n+\n+; -------------------------------------\n+; ErEnLn - erase to end of line\n+;\n+; affects: A, X, Y\n+;\n+; erase screen line from crsr to end of line\n+; -------------------------------------\n+\n+ErEnLn  ldx ROWCRS\n+        jsr SLV\n+        ldy COLCRS\n+        lda #$00\n+EEL1    sta (xVector),y\n+        iny\n+        cpy #Cols\n+        bne EEL1\n+        sta sCrsrChar ; del char ..\n+                      ; ..under crsr\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; ErBeLn - erase from begin of line\n+;\n+; affects: A, X, Y\n+;\n+; erase screen line up to crsr\n+; -------------------------------------\n+\n+ErBeLn  ldx ROWCRS\n+        jsr SLV\n+        ldy COLCRS\n+        lda #$00\n+EBL1    sta (xVector),y\n+        dey\n+        bpl EBL1\n+        sta sCrsrChar ; del char ..\n+                      ; ..under crsr\n+        jsr COn\n+        rts\n+\n+; -------------------------------------\n+; SLV - set line vector\n+; --- INTERNAL ---\n+;\n+; params: line no in X\n+; affects: A, Y\n+; return: screen line ptr in xVector\n+; -------------------------------------\n+\n+SLV     lda     SAVMSC\n+        clc\n+        adc     LineOffsLo,x\n+        sta     xVector\n+        lda     SAVMSC+1\n+        adc     LineOffsHi,x\n+        sta     xVector+1\n+        rts\n+\n+LineOffsLo\n+        .repeat Rows, i\n+        .byt    (Cols * i) & $ff\n+        .endrepeat\n+LineOffsHi\n+        .repeat Rows, i\n+        .byt    (Cols * i) >> 8\n+        .endrepeat\n+\n+; *************************************\n+; *\n+; * Init routines\n+; *\n+; *************************************\n+\n+; -------------------------------------\n+; init memory\n+;\n+; -------------------------------------\n+\n+InitVar lda #$00\n+        sta EMode\n+        sta EBufL\n+        sta SRS\n+        sta Font\n+        sta Draw\n+        sta SaveF\n+        sta SaveR\n+        sta SaveD\n+        sta SaveRow\n+        sta SaveCol\n+        sta lbPending\n+        sta civis\n+        sta Rvs\n+\n+        lda #Rows-1 ; last line\n+        sta SRE     ; = Rows-1\n+\n+        rts\n+\n+; -------------------------------------\n+; Init char\n+;\n+; -------------------------------------\n+\n+InitChar\n+        rts\n+\n+; -------------------------------------\n+; Exit char\n+;\n+; -------------------------------------\n+\n+ExitChar\n+        rts\n+\n+; -------------------------------------\n+; Init Screen\n+;\n+; -------------------------------------\n+\n+InitScr\n+        lda LMARGN\n+        sta LMARGN_save\n+        lda SHFLOK\n+        sta SHFLOK_save\n+        lda INVFLG\n+        sta INVFLG_save\n+        lda #0\n+        sta LMARGN\n+        sta SHFLOK\n+        sta INVFLG\n+InitScr1              ; called from ExitScr\n+        ldx #Rows-1\n+IS1     txa\n+        pha           ; save X\n+        jsr ErLn      ; erase line\n+        pla\n+        tax           ; restore X\n+        dex           ; previous line\n+        bpl IS1\n+        ; --- put crsr ---\n+        ldx #$00\n+        ldy #$00\n+        sty COLCRS+1  ; sanity\n+        jsr Plot\n+\n+        rts\n+\n+; -------------------------------------\n+; Exit Screen\n+;\n+; -------------------------------------\n+\n+ExitScr\n+        lda LMARGN_save\n+        sta LMARGN\n+        lda SHFLOK_save\n+        sta SHFLOK\n+        lda INVFLG_save\n+        sta INVFLG\n+        jmp InitScr1\n+\n+; *************************************\n+; *\n+; * ASCII and ScreenCode tables\n+; *\n+; *************************************\n+\n+; -------------------------------------\n+; table line drawing to ScreenCode\n+;\n+; This tabel is used to convert incoming\n+; line drawing chars.\n+; -------------------------------------\n+\n+ltsc;_0  _1  _2  _3  _4  _5  _6  _7  _8  _9  _a  _b  _c  _d  _e  _f\n+\n+; --- unused -------------------------------------------------------\n+.byt $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00  ; 0_\n+.byt $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00  ; 1_\n+\n+; --- reverse ------------------------------------------------------\n+;     ◆   ▒   ␉   ␌   ␍   ␊   °   ±   ␤   ␋   ┘   ┐   ┌   └   ┼   ⎺\n+;    ' '  ▒  ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  |  ' ' ' '  |   |   _\n+.byt $20,$57,$20,$20,$20,$20,$20,$20,$20,$20,$7c,$20,$20,$7c,$7c,$1f  ; 2_\n+;     ⎻   ─   ⎼   ⎽   ├   ┤   ┴   ┬   │   ≤   ≥   π   ≠   £   ·  ' '\n+;     _   _   _   _   |   |   _   _   |  ' ' ' ' ' ' ' ' ' ' ' ' ' '\n+.byt $1f,$1f,$1f,$1f,$7c,$7c,$1f,$1f,$7c,$20,$20,$20,$20,$20,$20,$20  ; 3_\n+\n+; --- unused -------------------------------------------------------\n+.byt $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00  ; 4_\n+.byt $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00  ; 5_\n+\n+; --- normal -------------------------------------------------------\n+;     ◆   ▒   ␉   ␌   ␍   ␊   °   ±   ␤   ␋   ┘   ┐   ┌   └   ┼   ⎺\n+;     ◆   ▒  ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  ⎸  ' '  _   ⎿   ⎿   ⎺\n+;.byt $5b,$56,$a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0,$5f,$a0,$9f,$54,$54,$4c  ; 6_\n+.byt $5b,$56,$a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0,$43,$45,$51,$5a,$54,$4c  ; 6_\n+;     ⎻   ─   ⎼   ⎽   ├   ┤   ┴   ┬   │   ≤   ≥   π   ≠   £   ·  ' '\n+;     ─   _   _   _   ⎿   ⎸   ⎿   _   ⎸  ' ' ' ' ' ' ' ' ' ' ' ' ' '\n+;.byt $53,$9f,$9f,$9f,$54,$5f,$54,$9f,$5f,$a0,$a0,$a0,$a0,$a0,$a0,$a0  ; 7_\n+.byt $53,$52,$9f,$9f,$54,$5f,$54,$9f,$7c,$a0,$a0,$a0,$a0,$a0,$a0,$a0  ; 7_\n+\n+; -------------------------------------\n+; table keyboard to ASCII\n+;\n+; This table is used to prepare keyboard\n+; input for sending over the serial\n+; line.\n+;\n+; ascii = $82 means HELP key\n+; ascii = $81 means ignore key\n+; ascii = $80 means do something\n+;             complicated (command key)","path":"drivers/atrvt100.s","position":1648,"original_position":1648,"commit_id":"8ab3fa6756e2fca2a7c348eef69d90be75877ee6","original_commit_id":"8ab3fa6756e2fca2a7c348eef69d90be75877ee6","user":{"login":"oliverschmidt","id":2664009,"avatar_url":"https://avatars0.githubusercontent.com/u/2664009?v=4","gravatar_id":"","url":"https://api.github.com/users/oliverschmidt","html_url":"https://github.com/oliverschmidt","followers_url":"https://api.github.com/users/oliverschmidt/followers","following_url":"https://api.github.com/users/oliverschmidt/following{/other_user}","gists_url":"https://api.github.com/users/oliverschmidt/gists{/gist_id}","starred_url":"https://api.github.com/users/oliverschmidt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oliverschmidt/subscriptions","organizations_url":"https://api.github.com/users/oliverschmidt/orgs","repos_url":"https://api.github.com/users/oliverschmidt/repos","events_url":"https://api.github.com/users/oliverschmidt/events{/privacy}","received_events_url":"https://api.github.com/users/oliverschmidt/received_events","type":"User","site_admin":false},"body":"Is there a special reason why you moved away from using $ff, $fe, ... downwards for special purposes? If not I'd appreciate if you would stick to the original approach used on the C64 and Apple II.","created_at":"2017-08-09T18:10:51Z","updated_at":"2017-08-09T18:10:51Z","html_url":"https://github.com/oliverschmidt/ip65/pull/3#discussion_r132262551","pull_request_url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3","_links":{"self":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/comments/132262551"},"html":{"href":"https://github.com/oliverschmidt/ip65/pull/3#discussion_r132262551"},"pull_request":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3"}}},"pull_request":{"url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3","id":133813204,"html_url":"https://github.com/oliverschmidt/ip65/pull/3","diff_url":"https://github.com/oliverschmidt/ip65/pull/3.diff","patch_url":"https://github.com/oliverschmidt/ip65/pull/3.patch","issue_url":"https://api.github.com/repos/oliverschmidt/ip65/issues/3","number":3,"state":"open","locked":false,"title":"Add VT100 driver for Atari.","user":{"login":"groessler","id":4138182,"avatar_url":"https://avatars2.githubusercontent.com/u/4138182?v=4","gravatar_id":"","url":"https://api.github.com/users/groessler","html_url":"https://github.com/groessler","followers_url":"https://api.github.com/users/groessler/followers","following_url":"https://api.github.com/users/groessler/following{/other_user}","gists_url":"https://api.github.com/users/groessler/gists{/gist_id}","starred_url":"https://api.github.com/users/groessler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/groessler/subscriptions","organizations_url":"https://api.github.com/users/groessler/orgs","repos_url":"https://api.github.com/users/groessler/repos","events_url":"https://api.github.com/users/groessler/events{/privacy}","received_events_url":"https://api.github.com/users/groessler/received_events","type":"User","site_admin":false},"body":"A special font will be needed for best user experience. This is not\r\nincluded yet, but will come soon...","created_at":"2017-08-02T21:29:44Z","updated_at":"2017-08-09T18:10:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fa4743528ed144961a35a8a3836d435df4678973","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3/commits","review_comments_url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3/comments","review_comment_url":"https://api.github.com/repos/oliverschmidt/ip65/pulls/comments{/number}","comments_url":"https://api.github.com/repos/oliverschmidt/ip65/issues/3/comments","statuses_url":"https://api.github.com/repos/oliverschmidt/ip65/statuses/8ab3fa6756e2fca2a7c348eef69d90be75877ee6","head":{"label":"groessler:something_to_pull","ref":"something_to_pull","sha":"8ab3fa6756e2fca2a7c348eef69d90be75877ee6","user":{"login":"groessler","id":4138182,"avatar_url":"https://avatars2.githubusercontent.com/u/4138182?v=4","gravatar_id":"","url":"https://api.github.com/users/groessler","html_url":"https://github.com/groessler","followers_url":"https://api.github.com/users/groessler/followers","following_url":"https://api.github.com/users/groessler/following{/other_user}","gists_url":"https://api.github.com/users/groessler/gists{/gist_id}","starred_url":"https://api.github.com/users/groessler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/groessler/subscriptions","organizations_url":"https://api.github.com/users/groessler/orgs","repos_url":"https://api.github.com/users/groessler/repos","events_url":"https://api.github.com/users/groessler/events{/privacy}","received_events_url":"https://api.github.com/users/groessler/received_events","type":"User","site_admin":false},"repo":{"id":22143435,"name":"ip65","full_name":"groessler/ip65","owner":{"login":"groessler","id":4138182,"avatar_url":"https://avatars2.githubusercontent.com/u/4138182?v=4","gravatar_id":"","url":"https://api.github.com/users/groessler","html_url":"https://github.com/groessler","followers_url":"https://api.github.com/users/groessler/followers","following_url":"https://api.github.com/users/groessler/following{/other_user}","gists_url":"https://api.github.com/users/groessler/gists{/gist_id}","starred_url":"https://api.github.com/users/groessler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/groessler/subscriptions","organizations_url":"https://api.github.com/users/groessler/orgs","repos_url":"https://api.github.com/users/groessler/repos","events_url":"https://api.github.com/users/groessler/events{/privacy}","received_events_url":"https://api.github.com/users/groessler/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/groessler/ip65","description":"IP65 - a TCP/IP stack for 6502 based computers -","fork":true,"url":"https://api.github.com/repos/groessler/ip65","forks_url":"https://api.github.com/repos/groessler/ip65/forks","keys_url":"https://api.github.com/repos/groessler/ip65/keys{/key_id}","collaborators_url":"https://api.github.com/repos/groessler/ip65/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/groessler/ip65/teams","hooks_url":"https://api.github.com/repos/groessler/ip65/hooks","issue_events_url":"https://api.github.com/repos/groessler/ip65/issues/events{/number}","events_url":"https://api.github.com/repos/groessler/ip65/events","assignees_url":"https://api.github.com/repos/groessler/ip65/assignees{/user}","branches_url":"https://api.github.com/repos/groessler/ip65/branches{/branch}","tags_url":"https://api.github.com/repos/groessler/ip65/tags","blobs_url":"https://api.github.com/repos/groessler/ip65/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/groessler/ip65/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/groessler/ip65/git/refs{/sha}","trees_url":"https://api.github.com/repos/groessler/ip65/git/trees{/sha}","statuses_url":"https://api.github.com/repos/groessler/ip65/statuses/{sha}","languages_url":"https://api.github.com/repos/groessler/ip65/languages","stargazers_url":"https://api.github.com/repos/groessler/ip65/stargazers","contributors_url":"https://api.github.com/repos/groessler/ip65/contributors","subscribers_url":"https://api.github.com/repos/groessler/ip65/subscribers","subscription_url":"https://api.github.com/repos/groessler/ip65/subscription","commits_url":"https://api.github.com/repos/groessler/ip65/commits{/sha}","git_commits_url":"https://api.github.com/repos/groessler/ip65/git/commits{/sha}","comments_url":"https://api.github.com/repos/groessler/ip65/comments{/number}","issue_comment_url":"https://api.github.com/repos/groessler/ip65/issues/comments{/number}","contents_url":"https://api.github.com/repos/groessler/ip65/contents/{+path}","compare_url":"https://api.github.com/repos/groessler/ip65/compare/{base}...{head}","merges_url":"https://api.github.com/repos/groessler/ip65/merges","archive_url":"https://api.github.com/repos/groessler/ip65/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/groessler/ip65/downloads","issues_url":"https://api.github.com/repos/groessler/ip65/issues{/number}","pulls_url":"https://api.github.com/repos/groessler/ip65/pulls{/number}","milestones_url":"https://api.github.com/repos/groessler/ip65/milestones{/number}","notifications_url":"https://api.github.com/repos/groessler/ip65/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/groessler/ip65/labels{/name}","releases_url":"https://api.github.com/repos/groessler/ip65/releases{/id}","deployments_url":"https://api.github.com/repos/groessler/ip65/deployments","created_at":"2014-07-23T11:37:56Z","updated_at":"2016-06-13T20:47:58Z","pushed_at":"2017-08-02T21:28:58Z","git_url":"git://github.com/groessler/ip65.git","ssh_url":"git@github.com:groessler/ip65.git","clone_url":"https://github.com/groessler/ip65.git","svn_url":"https://github.com/groessler/ip65","homepage":"http://oliverschmidt.github.io/ip65/","size":1887,"stargazers_count":0,"watchers_count":0,"language":"Assembly","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"oliverschmidt:master","ref":"master","sha":"aae9eadf05a07ba7a9ba6ffbcc27d27a70db8aef","user":{"login":"oliverschmidt","id":2664009,"avatar_url":"https://avatars0.githubusercontent.com/u/2664009?v=4","gravatar_id":"","url":"https://api.github.com/users/oliverschmidt","html_url":"https://github.com/oliverschmidt","followers_url":"https://api.github.com/users/oliverschmidt/followers","following_url":"https://api.github.com/users/oliverschmidt/following{/other_user}","gists_url":"https://api.github.com/users/oliverschmidt/gists{/gist_id}","starred_url":"https://api.github.com/users/oliverschmidt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oliverschmidt/subscriptions","organizations_url":"https://api.github.com/users/oliverschmidt/orgs","repos_url":"https://api.github.com/users/oliverschmidt/repos","events_url":"https://api.github.com/users/oliverschmidt/events{/privacy}","received_events_url":"https://api.github.com/users/oliverschmidt/received_events","type":"User","site_admin":false},"repo":{"id":15172765,"name":"ip65","full_name":"oliverschmidt/ip65","owner":{"login":"oliverschmidt","id":2664009,"avatar_url":"https://avatars0.githubusercontent.com/u/2664009?v=4","gravatar_id":"","url":"https://api.github.com/users/oliverschmidt","html_url":"https://github.com/oliverschmidt","followers_url":"https://api.github.com/users/oliverschmidt/followers","following_url":"https://api.github.com/users/oliverschmidt/following{/other_user}","gists_url":"https://api.github.com/users/oliverschmidt/gists{/gist_id}","starred_url":"https://api.github.com/users/oliverschmidt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oliverschmidt/subscriptions","organizations_url":"https://api.github.com/users/oliverschmidt/orgs","repos_url":"https://api.github.com/users/oliverschmidt/repos","events_url":"https://api.github.com/users/oliverschmidt/events{/privacy}","received_events_url":"https://api.github.com/users/oliverschmidt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/oliverschmidt/ip65","description":"IP65 - a TCP/IP stack for 6502 based computers —","fork":false,"url":"https://api.github.com/repos/oliverschmidt/ip65","forks_url":"https://api.github.com/repos/oliverschmidt/ip65/forks","keys_url":"https://api.github.com/repos/oliverschmidt/ip65/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oliverschmidt/ip65/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oliverschmidt/ip65/teams","hooks_url":"https://api.github.com/repos/oliverschmidt/ip65/hooks","issue_events_url":"https://api.github.com/repos/oliverschmidt/ip65/issues/events{/number}","events_url":"https://api.github.com/repos/oliverschmidt/ip65/events","assignees_url":"https://api.github.com/repos/oliverschmidt/ip65/assignees{/user}","branches_url":"https://api.github.com/repos/oliverschmidt/ip65/branches{/branch}","tags_url":"https://api.github.com/repos/oliverschmidt/ip65/tags","blobs_url":"https://api.github.com/repos/oliverschmidt/ip65/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oliverschmidt/ip65/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oliverschmidt/ip65/git/refs{/sha}","trees_url":"https://api.github.com/repos/oliverschmidt/ip65/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oliverschmidt/ip65/statuses/{sha}","languages_url":"https://api.github.com/repos/oliverschmidt/ip65/languages","stargazers_url":"https://api.github.com/repos/oliverschmidt/ip65/stargazers","contributors_url":"https://api.github.com/repos/oliverschmidt/ip65/contributors","subscribers_url":"https://api.github.com/repos/oliverschmidt/ip65/subscribers","subscription_url":"https://api.github.com/repos/oliverschmidt/ip65/subscription","commits_url":"https://api.github.com/repos/oliverschmidt/ip65/commits{/sha}","git_commits_url":"https://api.github.com/repos/oliverschmidt/ip65/git/commits{/sha}","comments_url":"https://api.github.com/repos/oliverschmidt/ip65/comments{/number}","issue_comment_url":"https://api.github.com/repos/oliverschmidt/ip65/issues/comments{/number}","contents_url":"https://api.github.com/repos/oliverschmidt/ip65/contents/{+path}","compare_url":"https://api.github.com/repos/oliverschmidt/ip65/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oliverschmidt/ip65/merges","archive_url":"https://api.github.com/repos/oliverschmidt/ip65/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oliverschmidt/ip65/downloads","issues_url":"https://api.github.com/repos/oliverschmidt/ip65/issues{/number}","pulls_url":"https://api.github.com/repos/oliverschmidt/ip65/pulls{/number}","milestones_url":"https://api.github.com/repos/oliverschmidt/ip65/milestones{/number}","notifications_url":"https://api.github.com/repos/oliverschmidt/ip65/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oliverschmidt/ip65/labels{/name}","releases_url":"https://api.github.com/repos/oliverschmidt/ip65/releases{/id}","deployments_url":"https://api.github.com/repos/oliverschmidt/ip65/deployments","created_at":"2013-12-13T20:00:36Z","updated_at":"2017-07-20T06:50:25Z","pushed_at":"2017-08-02T21:29:45Z","git_url":"git://github.com/oliverschmidt/ip65.git","ssh_url":"git@github.com:oliverschmidt/ip65.git","clone_url":"https://github.com/oliverschmidt/ip65.git","svn_url":"https://github.com/oliverschmidt/ip65","homepage":"http://oliverschmidt.github.io/ip65/","size":1874,"stargazers_count":32,"watchers_count":32,"language":"Assembly","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":32,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3"},"html":{"href":"https://github.com/oliverschmidt/ip65/pull/3"},"issue":{"href":"https://api.github.com/repos/oliverschmidt/ip65/issues/3"},"comments":{"href":"https://api.github.com/repos/oliverschmidt/ip65/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/oliverschmidt/ip65/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/oliverschmidt/ip65/statuses/8ab3fa6756e2fca2a7c348eef69d90be75877ee6"}}}}
{"actor":{"display_login":"oliverschmidt"}}