******************************************************************************** * * * Videoterm Interface * * Firmware v. 2.4 * * * * Written by Darrel Aldrich * * (c) 1981 Videx * * * ******************************************************************************** * 6502bench SourceGen v1.8.4-dev1 * ******************************************************************************** MON_CH .eq $24 ;cursor horizontal displacement MON_CV .eq $25 ;cursor vertical displacement MON_BASL .eq $28 ;base address for text output (lo) XSAVE .eq $35 ;not used by monitor? MON_CSWL .eq $36 ;character output hook (lo) MON_CSWH .eq $37 ;character output hook (hi) MON_KSWL .eq $38 ;character input hook (lo) MON_KSWH .eq $39 ;character input hook (hi) MON_RNDL .eq $4e ;low byte of KEYIN "random" value MON_RNDH .eq $4f ;high byte of KEYIN "random" value IN .eq $0200 CRFLAG .eq $0478 ;temp BASEL .eq $047b ;Screen base address low ASAV1 .eq $04f8 ;temp BASEH .eq $04fb ;Screen base address high CHORZ .eq $057b ;Cursor horizontal position TEMPX .eq $05f8 ;temp CVERT .eq $05fb ;Cursor vertical position OLDCHAR .eq $0678 ;temp BYTE .eq $067b ;I/O byte for Pascal entries START .eq $06fb ;Screen start address POFF .eq $077b ;Power off and lead in counter FLAGS .eq $07fb ;Video set up flags KBD .eq $c000 ;R last key pressed + 128 KBDSTRB .eq $c010 ;RW keyboard strobe SPKR .eq $c030 ;RW toggle speaker SETAN0 .eq $c058 ;RW annunciator 0 off CLRAN0 .eq $c059 ;RW annunciator 0 on BUTN2 .eq $c063 ;R switch input 2 / shift key DEV0 .eq $c0b0 ;CRTC Address Register DEV1 .eq $c0b1 ;CRTC Data Registers DISP0 .eq $cc00 DISP1 .eq $cd00 CLRROM .eq $cfff ;disable slot C8 ROM MON_VTAB .eq $fc22 ;tab to row specified in CV MON_SETKBD .eq $fe89 ;reset char input handler to ROM MON_SETVID .eq $fe93 ;reset char output handler to ROM IORTS .eq $ffcb ******************************************************************************** * * * Set up CRTC and clear screen * * * ******************************************************************************** .addrs $c800 c800: ad 7b 07 SETUP lda POFF ;Get power off flag c803: 29 f8 and #$f8 ;Strip off lead in counters c805: c9 30 cmp #$30 ;Has power been turned off? c807: f0 21 beq SETEXIT c809: a9 30 RESTART lda #$30 c80b: 8d 7b 07 sta POFF ;Set defaults for flags c80e: 8d fb 07 sta FLAGS c811: a9 00 lda #$00 c813: 8d fb 06 sta START c816: 20 61 c9 jsr CLSCRN c819: a2 00 ldx #$00 c81b: 8a LOOP txa c81c: 8d b0 c0 sta DEV0 ;For the CRTC address c81f: bd a1 c8 lda TABLE,x ;Get parameter c822: 8d b1 c0 sta DEV1 ;Store into CRTC c825: e8 inx c826: e0 10 cpx #$10 c828: d0 f1 bne LOOP ;Continue loop until done c82a: 8d 59 c0 SETEXIT sta CLRAN0 c82d: 60 rts c82e: ad fb 07 EXIT lda FLAGS c831: 29 08 and #$08 c833: f0 09 beq NORMOUT c835: 20 93 fe jsr MON_SETVID c838: 20 22 fc jsr MON_VTAB c83b: 20 89 fe jsr MON_SETKBD c83e: 68 NORMOUT pla ;Recover registers c83f: a8 tay c840: 68 pla c841: aa tax c842: 68 pla c843: 60 rts ******************************************************************************** * * * Get character from keyboard * ******************************************************************************** c844: 20 d1 c8 RDKEY jsr CSRMOV ;Position cursor c847: e6 4e KEYIN inc MON_RNDL ;Update basic random number c849: d0 02 bne KEYIN2 c84b: e6 4f inc MON_RNDH c84d: ad 00 c0 KEYIN2 lda KBD ;Poll keyboard c850: 10 f5 bpl KEYIN ;Loop until key is struck c852: 20 5c c8 jsr KEYSTAT c855: 90 f0 bcc KEYIN c857: 2c 10 c0 NOKEY bit KBDSTRB ;Clear keyboard stroke c85a: 18 clc c85b: 60 rts c85c: c9 8b KEYSTAT cmp #$8b ;Check for control X c85e: d0 02 bne NOTK ;Skip if not c860: a9 db lda #$db ;Substitute a right bracket c862: c9 81 NOTK cmp #$81 ;Check for control A c864: d0 0a bne NTSHFT ;Skip if not c866: ad fb 07 lda FLAGS c869: 49 40 eor #$40 c86b: 8d fb 07 sta FLAGS ;Toggle upr/lwr case flag c86e: b0 e7 bcs NOKEY ;Get next key c870: 48 NTSHFT pha ;Save character c871: ad fb 07 lda FLAGS c874: 0a asl A c875: 0a asl A ;Check upr/lwr case conversion flag c876: 68 pla ;Restore character c877: 90 1f bcc INDONE ;Don't convert if flag clear c879: c9 b0 cmp #$b0 c87b: 90 1b bcc INDONE ;Don't convert special characters c87d: 2c 63 c0 bit BUTN2 c880: 30 14 bmi NOSHIFT c882: c9 b0 cmp #‘0’ | $80 c884: f0 0e beq ZERO c886: c9 c0 cmp #‘@’ | $80 c888: d0 02 bne NOTAT c88a: a9 d0 lda #‘P’ | $80 c88c: c9 db NOTAT cmp #‘[’ | $80 c88e: 90 08 bcc INDONE c890: 29 cf and #$cf c892: d0 04 bne INDONE c894: a9 dd ZERO lda #‘]’ | $80 c896: 09 20 NOSHIFT ora #$20 c898: 48 INDONE pha ;Duplicate character c899: 29 7f and #$7f ;Strip off high bit c89b: 8d 7b 06 sta BYTE ;Save for Pascal c89e: 68 pla ;Recover for Basic c89f: 38 sec c8a0: 60 rts ******************************************************************************** * These are the CRTC initialization values, each one sent to a different * * internal register. * ******************************************************************************** c8a1: 7a TABLE .dd1 $7a ;R0 - Horizontal Total Register c8a2: 50 .dd1 $50 ;R1 - Horizontal Displayed Register c8a3: 5e .dd1 $5e ;R2 - Horizontal Sync Position Register c8a4: 2f .dd1 $2f ;R3 - Horizontal Sync Width Register c8a5: 22 .dd1 $22 ;R4 - Vertical Total Register c8a6: 00 .dd1 $00 ;R5 - Vertical Total Adjust Register c8a7: 18 .dd1 $18 ;R6 - Vertical Displayed Register c8a8: 1d .dd1 $1d ;R7 - Vertical Sync Position Register c8a9: 00 .dd1 $00 ;R8 - Interlace Mode Register c8aa: 08 .dd1 $08 ;R9 - Maximum Scan Line Register c8ab: e0 .dd1 $e0 ;R10 - Cursor End Register c8ac: 08 .dd1 $08 ;R11 - Cursor End Register c8ad: 00 .dd1 $00 ;R12 - Start Address Register (H) c8ae: 00 .dd1 $00 ;R13 - Start Address Register (L) c8af: 00 .dd1 $00 ;R14 - Cursor Register (H) c8b0: 00 .dd1 $00 ;R15 - Cursor Register (L) ******************************************************************************** * * * Secondary basic output routine * * * ******************************************************************************** c8b1: 8d 7b 06 BASOUT1 sta BYTE c8b4: a5 25 lda MON_CV c8b6: cd fb 05 cmp CVERT c8b9: f0 06 beq CVOK c8bb: 8d fb 05 sta CVERT c8be: 20 04 ca jsr VTAB c8c1: a5 24 CVOK lda MON_CH ;Perform HTab c8c3: cd 7b 05 cmp CHORZ c8c6: 90 03 bcc PSCLOUT c8c8: 8d 7b 05 sta CHORZ c8cb: ad 7b 06 PSCLOUT lda BYTE ;Get character c8ce: 20 89 ca jsr OUTPT1 ;Output character c8d1: a9 0f CSRMOV lda #$0f ;Set up CRTC address c8d3: 8d b0 c0 sta DEV0 ;for cursor low address c8d6: ad 7b 05 lda CHORZ ;Calculate address c8d9: c9 50 cmp #80 c8db: b0 13 bcs RTS6 c8dd: 6d 7b 04 adc BASEL c8e0: 8d b1 c0 sta DEV1 ;Save address c8e3: a9 0e lda #$0e ;Set up CRTC address c8e5: 8d b0 c0 sta DEV0 ;for cursor high address c8e8: a9 00 lda #$00 ;Calculate address c8ea: 6d fb 04 adc BASEH c8ed: 8d b1 c0 sta DEV1 ;Save address c8f0: 60 RTS6 rts ******************************************************************************** * * * Perform escape functions * ******************************************************************************** c8f1: 49 c0 ESC1 eor #$c0 c8f3: c9 08 cmp #$08 c8f5: b0 1d bcs RTS3 c8f7: a8 tay c8f8: a9 c9 lda #>BELL c8fa: 48 pha c8fb: b9 f2 cb lda ESCTBL,y c8fe: 48 pha c8ff: 60 rts c900: ea nop c901: ac 7b 05 CLREOL ldy CHORZ ;Put cursor horizontal into Y c904: a9 a0 CLEOLZ lda #$a0 ;Use a space c906: 20 71 ca CLEOL2 jsr CHRPUT ;Put character on screen c909: c8 iny c90a: c0 50 cpy #80 ;Continue until c90c: 90 f8 bcc CLEOL2 ;Y >= 80 c90e: 60 rts c90f: a9 34 LEADIN lda #$34 ;Set lead in bit c911: 8d 7b 07 PSAVE sta POFF c914: 60 RTS3 rts c915: a9 32 GOXY1 lda #$32 ;Set lead in count to 2 c917: d0 f8 bne PSAVE c919: a0 c0 BELL ldy #$c0 ;Beep the speaker c91b: a2 80 BELL1 ldx #$80 c91d: ca BELL2 dex c91e: d0 fd bne BELL2 c920: ad 30 c0 lda SPKR c923: 88 dey c924: d0 f5 bne BELL1 c926: 60 rts ******************************************************************************** * Store character on screen and advance cursor * ******************************************************************************** c927: ac 7b 05 STOADV ldy CHORZ c92a: c0 50 cpy #80 c92c: 90 05 bcc NOT81 c92e: 48 pha c92f: 20 b0 c9 jsr CRLF c932: 68 pla c933: ac 7b 05 NOT81 ldy CHORZ c936: 20 71 ca jsr CHRPUT ;Place character on screen c939: ee 7b 05 ADVANCE inc CHORZ ;Increment cursor horizontal index c93c: 2c 78 04 bit CRFLAG c93f: 10 07 bpl RTS8 c941: ad 7b 05 lda CHORZ c944: c9 50 cmp #80 c946: b0 68 bcs CRLF c948: 60 RTS8 rts ******************************************************************************** * Clear to end of page * ******************************************************************************** c949: ac 7b 05 CLREOP ldy CHORZ ;Get cursor horizontal into Y c94c: ad fb 05 lda CVERT ;Get cursor vertical into A c94f: 48 CLEOP1 pha ;Save current line on stack c950: 20 07 ca jsr VTABZ ;Calculate base address c953: 20 04 c9 jsr CLEOLZ ;Clear to end of line, set carry c956: a0 00 ldy #$00 ;Clear from horizontal index 0 c958: 68 pla c959: 69 00 adc #$00 ;Increment current line (C=1) c95b: c9 18 cmp #24 ;Done to bottom of window? c95d: 90 f0 bcc CLEOP1 ;If not keep clearing lines c95f: b0 23 bcs JVTAB ;Vertical tab to cursor position ******************************************************************************** * Clear screen * ******************************************************************************** c961: 20 67 c9 CLSCRN jsr HOME ;Home cursor c964: 98 tya c965: f0 e8 beq CLEOP1 ;Clear to end of page ******************************************************************************** * Home cursor * ******************************************************************************** c967: a9 00 HOME lda #$00 ;Set cursor position to 0,0 c969: 8d 7b 05 sta CHORZ c96c: 8d fb 05 sta CVERT c96f: a8 tay c970: f0 12 beq JVTAB ;Vertical tab to cursor position c972: ce 7b 05 BS dec CHORZ ;Decrement cursor horizontal index c975: 10 9d bpl RTS3 ;If pos, OK. Else move up c977: a9 4f lda #79 ;Set cursor horizontal to c979: 8d 7b 05 sta CHORZ ;rightmost screen position ******************************************************************************** * Move cursor up * ******************************************************************************** c97c: ad fb 05 UP lda CVERT ;Get cursor vertical index c97f: f0 93 beq RTS3 ;If top line then return c981: ce fb 05 dec CVERT ;Decrement cursor vertical index c984: 4c 04 ca JVTAB jmp VTAB ;Vertical tab to cursor position c987: a9 30 NOTGOXY lda #$30 ;Clear lead in bits c989: 8d 7b 07 sta POFF c98c: 68 pla ;Recover character c98d: 09 80 ora #$80 c98f: c9 b1 cmp #‘1’ | $80 c991: d0 67 bne NOT0 c993: a9 08 lda #$08 c995: 8d 58 c0 sta SETAN0 c998: d0 5b bne FLGSET c99a: c9 b2 NOT1 cmp #‘2’ | $80 c99c: d0 51 bne NOT2 c99e: a9 fe LOLITE lda #$fe c9a0: 2d fb 07 FLGCLR and FLAGS c9a3: 8d fb 07 FLGSAV sta FLAGS c9a6: 60 rts ******************************************************************************** * * * Pascal output entry point * * * ******************************************************************************** c9a7: 8d 7b 06 PSOUT sta BYTE c9aa: 4e 78 04 lsr CRFLAG c9ad: 4c cb c8 jmp PSCLOUT ;Jump for Pascal entry ******************************************************************************** * * * CR LF routine * ******************************************************************************** c9b0: 20 27 ca CRLF jsr CR c9b3: ee fb 05 LF inc CVERT ;Increment cursor vertical c9b6: ad fb 05 lda CVERT c9b9: c9 18 cmp #24 ;Off screen? c9bb: 90 4a bcc VTABZ ;If not move cursor c9bd: ce fb 05 dec CVERT ;If so decrement cursor vertical ; c9c0: ad fb 06 lda START ;Increment the start address c9c3: 69 04 adc #$04 ;by one line c9c5: 29 7f and #$7f c9c7: 8d fb 06 sta START c9ca: 20 12 ca jsr BASCLC1 ;Calculate the start address c9cd: a9 0d lda #$0d ;Set up CRTC address c9cf: 8d b0 c0 sta DEV0 ;for start low address c9d2: ad 7b 04 lda BASEL ;Get start low c9d5: 8d b1 c0 sta DEV1 ;Save start low c9d8: a9 0c lda #$0c ;Set up CRTC address c9da: 8d b0 c0 sta DEV0 ;for start high address c9dd: ad fb 04 lda BASEH ;Get start high c9e0: 8d b1 c0 sta DEV1 ;Save start high c9e3: a9 17 lda #23 ;Put window bottom-1 into A c9e5: 20 07 ca jsr VTABZ ;Calculate base address c9e8: a0 00 ldy #$00 c9ea: 20 04 c9 jsr CLEOLZ ;Clear bottom line c9ed: b0 95 bcs JVTAB ;Move cursor back ; c9ef: c9 b3 NOT2 cmp #‘3’ | $80 c9f1: d0 0e bne JSTOADV c9f3: a9 01 HILITE lda #$01 c9f5: 0d fb 07 FLGSET ora FLAGS c9f8: d0 a9 bne FLGSAV ******************************************************************************** * * * Basic initial I/O entry point * * * * * ******************************************************************************** c9fa: c9 b0 NOT0 cmp #‘0’ | $80 c9fc: d0 9c bne NOT1 c9fe: 4c 09 c8 jmp RESTART ca01: 4c 27 c9 JSTOADV jmp STOADV ca04: ad fb 05 VTAB lda CVERT ;Get cursor vertical ca07: 8d f8 04 VTABZ sta ASAV1 ;Multiply A by 5 ca0a: 0a asl A ca0b: 0a asl A ca0c: 6d f8 04 adc ASAV1 ca0f: 6d fb 06 adc START ;Add start ca12: 48 BASCLC1 pha ;Save A ca13: 4a lsr A ;Calculate BASEH ca14: 4a lsr A ca15: 4a lsr A ca16: 4a lsr A ca17: 8d fb 04 sta BASEH ca1a: 68 pla ;Recover A ca1b: 0a asl A ;Calculate BASEL ca1c: 0a asl A ca1d: 0a asl A ca1e: 0a asl A ca1f: 8d 7b 04 sta BASEL ca22: 60 RTS2 rts ca23: c9 0d VIDOUT cmp #$0d ca25: d0 06 bne VDOUT1 ca27: a9 00 CR lda #$00 ca29: 8d 7b 05 sta CHORZ ca2c: 60 rts ca2d: 09 80 VDOUT1 ora #$80 ;Set high bit ca2f: c9 a0 cmp #$a0 ca31: b0 ce bcs JSTOADV ;If not control print it ca33: c9 87 cmp #$87 ca35: 90 08 bcc RTS4 ;CTRL @ - F ca37: a8 tay ca38: a9 c9 lda #>BELL ca3a: 48 pha ca3b: b9 b9 c9 lda CTLTBL-135,y ca3e: 48 pha ca3f: 60 RTS4 rts ca40: 18 CTLTBL .dd1 <BELL-1 ca41: 71 .dd1 <BS-1 ca42: 13 .dd1 <RTS3-1 ca43: b2 .dd1 <LF-1 ca44: 48 .dd1 <CLREOP-1 ca45: 60 .dd1 <CLSCRN-1 ca46: af .dd1 <CRLF-1 ca47: 9d .dd1 <LOLITE-1 ca48: f2 .dd1 <HILITE-1 ca49: 13 .dd1 <RTS3-1 ca4a: 13 .dd1 <RTS3-1 ca4b: 13 .dd1 <RTS3-1 ca4c: 13 .dd1 <RTS3-1 ca4d: 13 .dd1 <RTS3-1 ca4e: 13 .dd1 <RTS3-1 ca4f: 13 .dd1 <RTS3-1 ca50: 13 .dd1 <RTS3-1 ca51: 13 .dd1 <RTS3-1 ca52: 66 .dd1 <HOME-1 ca53: 0e .dd1 <LEADIN-1 ca54: 13 .dd1 <RTS3-1 ca55: 38 .dd1 <ADVANCE-1 ca56: 00 .dd1 <CLREOL-1 ca57: 14 .dd1 <GOXY1-1 ca58: 7b .dd1 <UP-1 ******************************************************************************** * Calculate screen address and switch in correct page * * * ******************************************************************************** ca59: 18 PSNCALC clc ca5a: 98 tya ca5b: 6d 7b 04 adc BASEL ca5e: 48 pha ca5f: a9 00 lda #$00 ;Calculate screen address high ca61: 6d fb 04 adc BASEH ca64: 48 pha ca65: 0a asl A ca66: 29 0c and #$0c ;Use bit 0 and 1 for paging ca68: aa tax ca69: bd b0 c0 lda DEV0,x ;Set correct screen page ca6c: 68 pla ca6d: 4a lsr A ca6e: 68 pla ca6f: aa tax ca70: 60 rts ******************************************************************************** * * * Put a character at CVERT, CHORZ * * * ******************************************************************************** ca71: 0a CHRPUT asl A ca72: 48 pha ;Save shifted character ca73: ad fb 07 lda FLAGS ;Get character set flag ca76: 4a lsr A ;Shift it into carry ca77: 68 pla ;Recover shifted character ca78: 6a ror A ;Rotate carry into character ca79: 48 pha ;Save character ca7a: 20 59 ca jsr PSNCALC ;Set up screen address ca7d: 68 pla ;Recover character ca7e: b0 05 bcs WRITE1 ;Select memory range ca80: 9d 00 cc sta DISP0,x ;Store character on screen ca83: 90 03 bcc WSKIP ;Skip ca85: 9d 00 cd WRITE1 sta DISP1,x ;Store character on screen ca88: 60 WSKIP rts ;Recover X register ******************************************************************************** * * * General output routine * * * ******************************************************************************** ca89: 48 OUTPT1 pha ;Save character ca8a: a9 f7 lda #$f7 ca8c: 20 a0 c9 jsr FLGCLR ca8f: 8d 59 c0 sta CLRAN0 ca92: ad 7b 07 lda POFF ca95: 29 07 and #$07 ;Check for lead in ca97: d0 04 bne LEAD ;Branch for lead in ca99: 68 pla ;Recover character ca9a: 4c 23 ca jmp VIDOUT ;Output character ca9d: 29 04 LEAD and #$04 ;Check for go to XY ca9f: f0 03 beq GOXY3 ;If not skip caa1: 4c 87 c9 jmp NOTGOXY caa4: 68 GOXY3 pla ;Recover character caa5: 38 sec caa6: e9 20 sbc #$20 ;Subtract 32 caa8: 29 7f and #$7f ;Strip off unneeded bits caaa: 48 pha ;Save A caab: ce 7b 07 dec POFF ;Decrement lead in counter caae: ad 7b 07 lda POFF cab1: 29 03 and #$03 ;Get count cab3: d0 15 bne GOXY2 ;Skip if count not zero cab5: 68 pla ;Recover A cab6: c9 18 cmp #24 ;If A > window bottom cab8: b0 03 bcs BADY ;Then don't move cursor vertical caba: 8d fb 05 sta CVERT cabd: ad f8 05 BADY lda TEMPX ;Get cursor horizontal parameter cac0: c9 50 cmp #80 ;If A > 80 then cac2: b0 03 bcs BADX ;don't move cursor horizontal cac4: 8d 7b 05 sta CHORZ cac7: 4c 04 ca BADX jmp VTAB ;Vertical tab to cursor position caca: 68 GOXY2 pla ;Recover A cacb: 8d f8 05 sta TEMPX ;Save cursor horizontal parameter cace: 60 rts ******************************************************************************** * * * Stop list routine * * * ******************************************************************************** cacf: ad 00 c0 STPLST lda KBD cad2: c9 93 cmp #$93 cad4: d0 0f bne STPDONE cad6: 2c 10 c0 bit KBDSTRB cad9: ad 00 c0 STPLOOP lda KBD cadc: 10 fb bpl STPLOOP cade: c9 83 cmp #$83 cae0: f0 03 beq STPDONE cae2: 2c 10 c0 bit KBDSTRB cae5: 60 STPDONE rts cae6: a8 ESCNOW tay cae7: b9 31 cb lda XLTBL-201,y caea: 20 f1 c8 jsr ESC1 caed: 20 44 c8 ESCNEW jsr RDKEY caf0: c9 ce cmp #$ce caf2: b0 08 bcs ESC2 caf4: c9 c9 cmp #$c9 caf6: 90 04 bcc ESC2 caf8: c9 cc cmp #$cc cafa: d0 ea bne ESCNOW cafc: 4c f1 c8 ESC2 jmp ESC1 caff: ea nop ******************************************************************************** * * * * * * * * * Basic initial I/O entry point * * * ******************************************************************************** cb00: 2c cb ff bit IORTS ;Set VFlag on initial entry cb03: 70 31 bvs ENTR cb05: 38 INFAKE sec ;Fake input entry C=0 cb06: 90 .dd1 $90 cb07: 18 OUTENTR clc ;Output entry C=1 cb08: b8 clv cb09: 50 2b bvc ENTR cb0b: 01 .dd1 $01 cb0c: 82 .dd1 $82 cb0d: 11 .dd1 <INIT cb0e: 14 .dd1 <READ cb0f: 1c .dd1 <WRITE cb10: 22 .dd1 <STATUS cb11: 4c 00 c8 INIT jmp SETUP cb14: 20 44 c8 READ jsr RDKEY cb17: 29 7f and #$7f cb19: a2 00 ldx #$00 cb1b: 60 rts cb1c: 20 a7 c9 WRITE jsr PSOUT cb1f: a2 00 ldx #$00 cb21: 60 rts cb22: c9 00 STATUS cmp #$00 cb24: f0 09 beq STEXIT cb26: ad 00 c0 lda KBD cb29: 0a asl A cb2a: 90 03 bcc STEXIT cb2c: 20 5c c8 jsr KEYSTAT cb2f: a2 00 STEXIT ldx #$00 cb31: 60 rts ******************************************************************************** * Basic input entry point * ******************************************************************************** cb32: 91 28 INENTR sta (MON_BASL),y ;Replace flashing cursor cb34: 38 sec cb35: b8 clv cb36: 8d ff cf ENTR sta CLRROM ;Turn off co-resident memory ******************************************************************************** * * * * * Save registers, set up NO and CN * * * ******************************************************************************** cb39: 48 WHERE pha ;Save registers on stack cb3a: 85 35 sta XSAVE cb3c: 8a txa cb3d: 48 pha cb3e: 98 tya cb3f: 48 pha cb40: a5 35 lda XSAVE ;Save character cb42: 86 35 stx XSAVE ;Save input buffer index cb44: a2 c3 ldx #$c3 cb46: 8e 78 04 stx CRFLAG cb49: 48 pha cb4a: 50 10 bvc IO ;Go to IO if not initial entry ******************************************************************************** * * * Basic initialize * * * ******************************************************************************** cb4c: a9 32 lda #<INENTR cb4e: 85 38 sta MON_KSWL cb50: 86 39 stx MON_KSWH cb52: a9 07 lda #<OUTENTR cb54: 85 36 sta MON_CSWL cb56: 86 37 stx MON_CSWH cb58: 20 00 c8 jsr SETUP cb5b: 18 clc cb5c: 90 6f IO bcc BASOUT ******************************************************************************** * * * Basic input routine * * * ******************************************************************************** cb5e: 68 BASINP pla ;Pop stack cb5f: a4 35 ldy XSAVE ;Get input buffer index cb61: f0 1f beq GETLN ;If zero assume GETLN cb63: 88 dey cb64: ad 78 06 lda OLDCHAR ;Get last character from GETLN cb67: c9 88 cmp #$88 ;If BS assume GETLN cb69: f0 17 beq GETLN cb6b: d9 00 02 cmp IN,y cb6e: f0 12 beq GETLN cb70: 49 20 eor #$20 cb72: d9 00 02 cmp IN,y ;If same as character in input cb75: d0 3b bne NTGETLN ;buffer then assume GETLN cb77: ad 78 06 lda OLDCHAR ;Get last character from GETLN cb7a: 99 00 02 sta IN,y ;Fix input buffer cb7d: b0 03 bcs GETLN ;Go to GETLN cb7f: 20 ed ca ESC jsr ESCNEW ;Perform escape function cb82: a9 80 GETLN lda #$80 ;Set GETLN flag cb84: 20 f5 c9 jsr FLGSET cb87: 20 44 c8 jsr RDKEY ;Get character from keyboard cb8a: c9 9b cmp #$9b ;Check for escape cb8c: f0 f1 beq ESC cb8e: c9 8d cmp #$8d ;Check for CR cb90: d0 05 bne NOTCR ;If not skip cb92: 48 pha ;Save character cb93: 20 01 c9 jsr CLREOL ;Clear to end of line cb96: 68 pla ;Recover character cb97: c9 95 NOTCR cmp #$95 ;Check for pick cb99: d0 12 bne NOTPICK ;If not skip cb9b: ac 7b 05 ldy CHORZ ;Get cursor horizontal position cb9e: 20 59 ca jsr PSNCALC ;Set up screen address cba1: b0 05 bcs READ1 ;Read character from screen cba3: bd 00 cc lda DISP0,x cba6: 90 03 bcc RSKIP cba8: bd 00 cd READ1 lda DISP1,x cbab: 09 80 RSKIP ora #$80 ;Set high bit cbad: 8d 78 06 NOTPICK sta OLDCHAR ;Save character in OLDCHAR cbb0: d0 08 bne DONE ;Exit cbb2: 20 44 c8 NTGETLN jsr RDKEY ;Get character from keyboard cbb5: a0 00 ldy #$00 ;Clear OLDCHARacter cbb7: 8c 78 06 sty OLDCHAR cbba: ba DONE tsx ;Put character into stack cbbb: e8 inx cbbc: e8 inx cbbd: e8 inx cbbe: 9d 00 01 sta $0100,x cbc1: a9 00 OUTDONE1 lda #$00 ;Set CH = 00 cbc3: 85 24 OUTDONE sta MON_CH cbc5: ad fb 05 lda CVERT ;Set CV = CVERT cbc8: 85 25 sta MON_CV cbca: 4c 2e c8 jmp EXIT ******************************************************************************** * * * Primary Basic output routine * * * ******************************************************************************** cbcd: 68 BASOUT pla ;Recover character cbce: ac fb 07 ldy FLAGS ;Check GETLN flags cbd1: 10 08 bpl BOUT ;If clear then skip cbd3: ac 78 06 ldy OLDCHAR ;Get last character from GETLN cbd6: c0 e0 cpy #$e0 ;If it is lower case then use it cbd8: 90 01 bcc BOUT cbda: 98 tya cbdb: 20 b1 c8 BOUT jsr BASOUT1 ;Output character cbde: 20 cf ca jsr STPLST cbe1: a9 7f lda #$7f ;Clear the GETLN flag cbe3: 20 a0 c9 jsr FLGCLR cbe6: ad 7b 05 lda CHORZ ;Get cursor horizontal cbe9: e9 47 sbc #$47 cbeb: 90 d4 bcc OUTDONE1 cbed: 69 1f adc #$1f cbef: 18 FIXCH clc cbf0: 90 d1 bcc OUTDONE cbf2: 60 ESCTBL .dd1 <CLSCRN-1 cbf3: 38 .dd1 <ADVANCE-1 cbf4: 71 .dd1 <BS-1 cbf5: b2 .dd1 <LF-1 cbf6: 7b .dd1 <UP-1 cbf7: 00 .dd1 <CLREOL-1 cbf8: 48 .dd1 <CLREOP-1 cbf9: 66 .dd1 <HOME-1 cbfa: c4 XLTBL .dd1 $c4 cbfb: c2 .dd1 $c2 cbfc: c1 .dd1 $c1 cbfd: ff .dd1 $ff cbfe: c3 .dd1 $c3 cbff: ea .dd1 $ea .adrend ↑ $c800
No exported symbols found.