********************************************************************************
* *
* 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.