Mercurial > hg > Members > kono > nitros9-code
changeset 3174:5fad6ee804ba
Adding Co42 a beautiful and fast 42x24 Hi-Res screen based from CoHR code.
Supports lowercase, reversed and underlined characters.
Making as default for dragon64
author | lfantoniosi |
---|---|
date | Sun, 14 May 2017 00:15:38 -0700 |
parents | adcbab1e0f36 |
children | b67b40d76fb0 |
files | defs/cocovtio.d level1/d64/bootfiles/makefile level1/d64/makefile level1/d64/modules/makefile level1/modules/co42.asm level1/modules/term_42.asm level1/modules/vtio.asm |
diffstat | 7 files changed, 1189 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/defs/cocovtio.d Sat May 13 23:17:11 2017 -0700 +++ b/defs/cocovtio.d Sun May 14 00:15:38 2017 -0700 @@ -108,6 +108,7 @@ V.CoVDGE RMB 2 CoVDG entry point V.CoWPE RMB 2 CoWP entry point V.CoHRE RMB 2 CoHR entry point +V.Co42E RMB 2 Co42 entry point V.Flash RMB 2 Cursor flash routine address. v.FlashCount RMB 1 Cursor flash count @@ -161,6 +162,7 @@ ModCoVDG EQU %00000010 CoVDG, Built-in VDG 32x16. ModCoWP EQU %00000100 CoWP, WordPak, 80x25 ModCoHR EQU %00001000 CoHR, PMODE 4 51x25 text +ModCo42 EQU %00010000 Co42, PMODE 4 42x25 text * * Defs for cursor flash counter
--- a/level1/d64/bootfiles/makefile Sat May 13 23:17:11 2017 -0700 +++ b/level1/d64/bootfiles/makefile Sun May 14 00:15:38 2017 -0700 @@ -56,6 +56,18 @@ $(MD)/clock_60hz $(MD)/clock2_soft \ $(MD)/sysgo_dd +BOOTFILE_CO42_DS40 = $(MD)/ioman \ + $(MD)/rbf.mn $(MD)/ddisk.dr \ + $(MD)/ddd0_40d.dd \ + $(MD)/d0_40d.dd $(MD)/d1_40d.dd \ + $(MD)/d2_40d.dd $(MD)/d3_40d.dd\ + $(MD)/scf.mn \ + $(MD)/vtio.dr $(MD)/co42.io $(MD)/term_42.dt \ + $(MD)/scdpp.dr $(MD)/p_dpp.dd \ + $(MD)/pipeman.mn $(MD)/piper.dr $(MD)/pipe.dd \ + $(MD)/clock_60hz $(MD)/clock2_soft \ + $(MD)/sysgo_dd + BOOTFILE_COVDG_DS80 = $(MD)/ioman \ $(MD)/rbf.mn $(MD)/ddisk.dr \ $(MD)/ddd0_80d.dd \ @@ -80,6 +92,18 @@ $(MD)/clock_60hz $(MD)/clock2_soft \ $(MD)/sysgo_dd +BOOTFILE_CO42_DS80 = $(MD)/ioman \ + $(MD)/rbf.mn $(MD)/ddisk.dr \ + $(MD)/ddd0_80d.dd \ + $(MD)/d0_80d.dd $(MD)/d1_80d.dd \ + $(MD)/d2_80d.dd $(MD)/d3_80d.dd\ + $(MD)/scf.mn \ + $(MD)/vtio.dr $(MD)/co42.io $(MD)/term_42.dt \ + $(MD)/scdpp.dr $(MD)/p_dpp.dd \ + $(MD)/pipeman.mn $(MD)/piper.dr $(MD)/pipe.dd \ + $(MD)/clock_60hz $(MD)/clock2_soft \ + $(MD)/sysgo_dd + BOOTFILE_COVDG_SS40 = $(MD)/ioman \ $(MD)/rbf.mn $(MD)/ddisk.dr \ $(MD)/ddd0_40d.dd \ @@ -104,10 +128,21 @@ $(MD)/clock_60hz $(MD)/clock2_soft \ $(MD)/sysgo_dd +BOOTFILE_CO42_SS40 = $(MD)/ioman \ + $(MD)/rbf.mn $(MD)/ddisk.dr \ + $(MD)/ddd0_40d.dd \ + $(MD)/d0_40s.dd $(MD)/d1_40s.dd \ + $(MD)/d2_40s.dd $(MD)/d3_40s.dd\ + $(MD)/scf.mn \ + $(MD)/vtio.dr $(MD)/co42.io $(MD)/term_42.dt \ + $(MD)/scdpp.dr $(MD)/p_dpp.dd \ + $(MD)/pipeman.mn $(MD)/piper.dr $(MD)/pipe.dd \ + $(MD)/clock_60hz $(MD)/clock2_soft \ + $(MD)/sysgo_dd -BOOTFILES = bootfile_cohr_ds40 bootfile_covdg_ds40 \ - bootfile_cohr_ds80 bootfile_covdg_ds80 \ - bootfile_cohr_ss40 bootfile_covdg_ss40 +BOOTFILES = bootfile_cohr_ds40 bootfile_covdg_ds40 bootfile_co42_ds40 \ + bootfile_cohr_ds80 bootfile_covdg_ds80 bootfile_co42_ds80 \ + bootfile_cohr_ss40 bootfile_covdg_ss40 bootfile_co42_ss40 KERNELS = kernel @@ -124,18 +159,27 @@ bootfile_cohr_ds40: $(BOOTFILE_COHR_DS40) $(DEPENDS) $(MERGE) $(BOOTFILE_COHR_DS40) > $@ +bootfile_co42_ds40: $(BOOTFILE_CO42_DS40) $(DEPENDS) + $(MERGE) $(BOOTFILE_CO42_DS40) > $@ + bootfile_covdg_ds80: $(BOOTFILE_COVDG_DS80) $(DEPENDS) $(MERGE) $(BOOTFILE_COVDG_DS80) > $@ bootfile_cohr_ds80: $(BOOTFILE_COHR_DS80) $(DEPENDS) $(MERGE) $(BOOTFILE_COHR_DS80) > $@ +bootfile_co42_ds80: $(BOOTFILE_CO42_DS80) $(DEPENDS) + $(MERGE) $(BOOTFILE_CO42_DS80) > $@ + bootfile_covdg_ss40: $(BOOTFILE_COVDG_SS40) $(DEPENDS) $(MERGE) $(BOOTFILE_COVDG_SS40) > $@ bootfile_cohr_ss40: $(BOOTFILE_COHR_SS40) $(DEPENDS) $(MERGE) $(BOOTFILE_COHR_SS40) > $@ +bootfile_co42_ss40: $(BOOTFILE_CO42_SS40) $(DEPENDS) + $(MERGE) $(BOOTFILE_CO42_SS40) > $@ + kernel: $(KERNEL) $(DEPENDS) $(MERGE) $(KERNEL)>$@ $(PADROM) 4096 $@
--- a/level1/d64/makefile Sat May 13 23:17:11 2017 -0700 +++ b/level1/d64/makefile Sun May 14 00:15:38 2017 -0700 @@ -33,7 +33,7 @@ # TERMWIDTH can be either VDG or HR, for 32x16 or 51x24 respectivly #NOTE must be lower case. -TERMWIDTH = hr +TERMWIDTH = 42 #Default step rate for floppy drives @@ -58,10 +58,13 @@ BOOTFILE_COVDG = bootfiles/bootfile_covdg_ds40 BOOTFILE_COHR = bootfiles/bootfile_cohr_ds40 +BOOTFILE_CO42 = bootfiles/bootfile_co42_ds40 BOOTFILE_COVDG_DS80 = bootfiles/bootfile_covdg_ds80 BOOTFILE_COHR_DS80 = bootfiles/bootfile_cohr_ds80 +BOOTFILE_CO42_DS80 = bootfiles/bootfile_co42_ds80 BOOTFILE_COVDG_SS40 = bootfiles/bootfile_covdg_ss40 BOOTFILE_COHR_SS40 = bootfiles/bootfile_cohr_ss40 +BOOTFILE_CO42_SS40 = bootfiles/bootfile_co42_ss40 BOOTFILE_DS40 = bootfiles/bootfile_co$(TERMWIDTH)_ds40 BOOTFILE_DS80 = bootfiles/bootfile_co$(TERMWIDTH)_ds80
--- a/level1/d64/modules/makefile Sat May 13 23:17:11 2017 -0700 +++ b/level1/d64/modules/makefile Sun May 14 00:15:38 2017 -0700 @@ -66,10 +66,10 @@ SCF = scf.mn \ vrn.dr scdpp.dr sspak.dr vtio.dr \ - covdg.io cohr.io\ + covdg.io cohr.io co42.io\ nil.dd p_dpp.dd pipe.dd ssp.dd \ term_sc6551.dt t2_sc6551.dt t3_sc6551.dt \ - term_vdg.dt term_hr.dt term_80.dt p1_sc6551dragon.dd + term_vdg.dt term_hr.dt term_42.dt term_80.dt p1_sc6551dragon.dd PIPE = pipeman.mn \ piper.dr \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/co42.asm Sun May 14 00:15:38 2017 -0700 @@ -0,0 +1,1045 @@ +******************************************************************** +* Co42 - Hi-Res 42x24 Graphics Console Output Subroutine for VTIO +* Based from CoHR +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 ????/??/?? +* Original Dragon distribution version +* +* 2003/09/22 Rodney Hamilton +* Recoded fcb arrays, added labels & some comments +* +* 2004/11/15 P.Harvey-Smith +* Added code to turn off the drives on the Dragon Alpha. +* +* 2004/12/01 P.Harvey-Smith +* Began converting drvr51 to CoHR, removed all keyboard +* related code, added symbolic defines for a lot of things. +* +* 2004/12/02 P.Harvey-Smith +* Finished converting to c051 driver, moved all variable +* storage into ccio module (defined in cciodefs). +* +* 2005/04/09 P.Harvey-Smith +* Replaced all ; comment chars with * for benefit of native +* asm. Re-implemented (hopefully) non-destructive cursor which +* is XORed onto the screen. Commented character drawing routines +* and replaced the V51xx names with more meaningful ones. +* +* 2005/04/24 P.Harvey-Smith +* Addded routines to flash the cursor, this is as it was in the +* Dragon Data 51 column driver. +* +* 2017/04/23 Felipe Antoniosi +* Create this driver as 42x24 column +* + nam Co42 + ttl Hi-Res 42x24 Graphics Console Output Subroutine for VTIO + + ifp1 + use defsfile + use cocovtio.d + endc + +tylg set Systm+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + + mod eom,name,tylg,atrv,start,size + +size equ . + + fcb UPDAT. + + +ScreenSize equ $1800 * Screen Size in Bytes + +name fcs /Co42/ + fcb edition + +start lbra Init + lbra Write + lbra GetStat + lbra SetStat + lbra Term + +Init pshs u,a + ldd #ScreenSize+$100 * Request a screenful of ram + $100 bytes + os9 F$SRqMem + bcs InitExit * Error : exit + tfr u,d + ldu $01,s * Restore saved u + tfr d,x + bita #$01 * Check that memory block starts at even page + beq L0066 * Yes base of screen = base of memory block + leax >$0100,x * no Move to next page + bra L0068 +L0066 adda #$18 +L0068 stx V.51ScrnA,u + tfr d,u + ldd #$0100 + os9 F$SRtMem * Return unneeded page to OS + ldu $01,s + + clr V.51CursorOn,u * Flag cursor off + lbsr DoHome + lbsr DoReverseOff + lbsr DoCLS + ldb V.COLoad,u + orb #ModCo42 * set to Co42 found (?) + + leax FlashCursor,pcr * Get address of cursor flash routine + stx V.Flash,u + +InitSaveExit + stb V.COLoad,u + clrb + lda #$FF + sta V.CColr,u * Flag Cursor as not hidden + +InitExit + puls pc,u,a + +InitFlag fcb $00 + +Term pshs y,x + pshs u * save U + ldd #ScreenSize * Graphics memory size + ldu V.51ScrnA,u * get pointer to memory + os9 F$SRtMem * return to system + puls u * restore U + ldb V.COLoad,u + andb #~ModCo42 * Set CoHR unot loaded + bra InitSaveExit + +* Write +* Entry: A = char to write +* Y = path desc ptr + +Write + +L012C inc V.Noflash,u * Flag do not flash cursor + ldb V.51EscSeq,u + bne L0165 + cmpa #$1B * escape? + bne CheckForNormal + inc V.51EscSeq,u * flag ESC seq + +WriteExit2 + clr V.NoFlash,u * Allow cursor to flash + clrb +L0139 rts + + +CheckForNormal + cmpa #$20 + bcs DoCtrlChar * Control charater ? + cmpa #$7F + bcc DoCtrlChar * or upper bit set + bra DoNormalChar + +DoCtrlChar + leax >CtrlCharDispatch,pcr +L0148 tst ,x + bne L0150 +CancelEscSequence + clr V.51EscSeq,u +WriteExit + clr V.NoFlash,u + rts + +L0150 cmpa ,x+ + bne L0161 + ldd ,x + leax >CtrlCharDispatch,pcr + leax d,x + stx V.51CtrlDispatch,u + jsr ,x + bra WriteExit + +L0161 leax $02,x + bra L0148 + +L0165 inc V.51EscSeq,u + leax >EscCharDispatch,pcr + cmpb #$01 + beq L0148 + jmp [V.51CtrlDispatch,u] + +DoNormalChar + pshs y,a +* lbsr DoEraseCursor + puls y,a + inc V.51CursorChanged,u + bsr DrawCharacter + tst V.51UnderlineFlag,u * Are we underlining ? + beq L0185 * no : update cursor + lda #$FC * Yes : do underline, then update cursor + leay <-$20,y + lbsr L0236 + +L0185 lda V.51XPos,u * Get current X pos + inca * increment it + cmpa #42 * past end of line ? + bcs L01A2 * no : continue + clr V.51XPos,u * Yes reset x=0 + lda V.51YPos,u * increment y pos + inca + cmpa #24 * Past last line ? + bcs L019D * No : continue + lbsr SoScrollScreen * Yes : scroll screen one line + bra L01A5 +L019D sta V.51YPos,u * Ypdate Y pos + bra L01A5 + +L01A2 sta V.51XPos,u * Update X pos +L01A5 + ldd V.51XPos,u * Update old Cursor pos + std V.51OldCursorPosX,u + dec V.51CursorChanged,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor * Display cursor + + lbra WriteExit2 + clrb * Flag no error + rts * Return to caller + +* +* Draw the normal character $20..$7f, in the a register +* at position stored in V.51Xpos,V.51Ypos +* + +DrawCharacter + tfr a,b + subb #$20 * Make b an offset into table + lda #5 + leax >CharacterShapes,pcr * point to character shape table + mul * Multiply by 5 (5 bytes / character) + leax d,x * Point X at required character's bitmap + ldb #$06 * Work out pixel X co-ordinate of current cursor + lda V.51XPos,u + mul + pshs b * Save pixel x + lsra * Divide pixel-x by 8, to get byte offset into line + rorb + lsra + rorb + lsra + rorb + puls a * restore pixel X + anda #$07 * Calculate offset within byte where character begins + pshs b + sta V.51BytePixOffset,u + tst V.51XORFlag,u + bne L01FF + tfr a,b * Calculate a mask for character data + lda #$FC * shifts $fc right b times + tstb + beq L01FA * Done all bits ? +L01E5 lsra * shift mask right + decb * decrement count + bhi L01E5 * done all ? + bne L01EE * have we shifted any mask bits off right hand end ? + rorb + bra L01FA + +L01EE pshs b * Save count on stack + ldb #$80 * start to build mask for second byte as well +L01F2 lsra * shift bits from bottom of a to top of b + rorb + dec ,s * decrement count + bne L01F2 * if any shifts left loop again + leas $01,s * drop count + +* When we reach here we should have a pair of bytes in d which indicate where exactly the +* character should be drawn, this may be partly in each + +L01FA coma + comb + std V.51ScreenMask1,u * Save screen mask + +* The code below works out the offset of the character cell to be updated, this works because +* the y co ordinate is loaded into the high byte of d, effectivley multiplying it by 256, since +* each screen line is 32 bytes wide, and each character is 8 pixels tall this works out as 8x32=256 + +L01FF ldy V.51ScrnA,u * Point y at screen memory address + lda V.51YPos,u + ldb ,s+ * Retrieve byte offset from stack + leay d,y * calculate screen address. +* lda #$08 * get character data byte count, 8 bytes +* pshs a + inc V.51CursorChanged,u * flag character at cursor being changed + +* The caracters are packed in 5-bytes following the order +* 00000111 +* 11222223 +* 33334444 +* 45555566 +* 66677777 + +L0211 lda ,x * row 0 + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x+ * row 1 + ldb ,x + lsra + rorb + lsra + rorb + lsra + rorb + tfr b,a + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x * row 2 + lsla + lsla + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x+ * row 3 + ldb ,x + lsra + rorb + tfr b,a + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x+ * row 4 + ldb ,x + lslb + rola + lslb + rola + lslb + rola + lslb + rola + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x * row 5 + lsla + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x+ * row 6 + ldb ,x + lsra + rorb + lsra + rorb + tfr b,a + anda #$F8 * mask out character + bsr L0236 * update screen + + lda ,x * row 7 + lsla + lsla + lsla + anda #$F8 * mask out character + bsr L0236 * update screen + +* dec ,s * Decrement character data byte counter +* bne L0211 * all done ? + dec V.51CursorChanged,u * Flag character update finished + clrb * flag no error + puls pc * return to caller + + +*L0227 ldb V.51BytePixOffset,u +* subb #$04 +* bhi L023B +* beq L0250 +*L0230 lsla +* incb +* bne L0230 +* bra L0250 + +L0236 ldb V.51BytePixOffset,u * Retrieve byte pixel offset + beq L0250 + +L023B lsra * manipulate character data into correct position + decb * in a similar way to the mask above + bhi L023B + bne L0244 + rorb + bra L0250 +L0244 pshs b + ldb #$80 +L0248 lsra + rorb + dec ,s + bne L0248 + leas $01,s + +L0250 tst V.51XORFlag,u * are we XORing data direct to screen ? + bne L0273 * Yes : just do it + tst V.51ReverseFlag,u * are we in reverse mode ? + beq L0262 * no : just output data + coma * set mask up for reverse mode + comb + eora V.51ScreenMask1,u + eorb V.51ScreenMask2,u + +L0262 pshs b,a * combine mask and screen data + ldd V.51ScreenMask1,u + anda ,y + andb $01,y + addd ,s++ + +L026D std ,y * screen update + leay <$20,y + rts + +L0273 eora ,y * XOR onto screen + eorb $01,y + bra L026D + +* +* $07 - BEL (ding!) +* + +DoBell + ldx #$FF20 + ldb #$64 +L027E lda ,x + eora #$C0 + sta ,x + lda #$19 +L0286 deca + nop + nop + bne L0286 + decb + bne L027E + lbra CancelEscSequence +* +* $08 - BS (left arrow) +* +DoBackspace + lbsr DoEraseCursor + dec V.51XPos,u + bpl DoBSUpdateCursor + lda #41 + sta V.51XPos,u + bra DoCursorUp1 +* +* $1b44 - (cursor up) +* +DoCursorUp + lbsr DoEraseCursor +DoCursorUp1 + dec V.51YPos,u + bpl L02A6 + clr V.51YPos,u + lbsr L035E +L02A6 lbsr L0484 + lbra CancelEscSequence + +DoBSUpdateCursor + lbsr L0484 + clr V.51CursorOn,u +* lbsr DoDisplayCursor + rts + +* +* $0a, $1b45 - LF, (cursor down) +* + +DoLineFeed + lbsr DoEraseCursor + lda V.51YPos,u + inca + cmpa #$18 + bcs L02B9 + lbsr SoScrollScreen + bra L02BC +L02B9 sta V.51YPos,u +L02BC + clr V.51CursorOn,u +* lbsr DoDisplayCursor + bra L02A6 + +* +* $0d - CR (return) +* + +DoCarrageReturn + lbsr DoEraseCursor + clr V.51XPos,u + bra L02A6 + +* +* $0c - FF (clear screen) +* +DoCLS + ldy V.51ScrnA,u + leay >$0080,y + lda #$18 + pshs a + inc V.51CursorChanged,u +L02D2 bsr L0314 + dec ,s + bne L02D2 + leas $01,s + clra + clrb + std V.51OldCursorPosX,u + std V.51XPos,u + dec V.51CursorChanged,u + ldx #$FF20 + lda $02,x + ora #$F0 + sta $02,x + ldx #$FFC0 + lda #$06 + ldb #$03 + bsr L0305 + lda V.51ScrnA,u + lsra + ldb #$07 + bsr L0305 + clr V.51CursorOn,u * Flag cursor is off +** lbsr DoDisplayCursor * Display cursor + lbra CancelEscSequence + +L0305 lsra + bcc L030E + leax $01,x + sta ,x+ + bra L0310 +L030E sta ,x++ +L0310 decb + bne L0305 + rts + +L0314 lda #$10 +L0316 pshs a + lda V.51ReverseFlag,u + tfr a,b +L031D std <-$80,y + std <-$60,y + std <-$40,y + std <-$20,y + std <$20,y + std <$40,y + std <$60,y + std ,y++ + dec ,s + bne L031D + leay >$00E0,y + puls pc,b + +SoScrollScreen + ldy V.51ScrnA,u + inc V.51CursorChanged,u + pshs u + leau >$0100,y + lda #$10 + bsr L037C + puls u + dec V.51OldCursorPosY,u + +L0354 leay >$0080,y + bsr L0314 + dec V.51CursorChanged,u + rts + +L035E ldy V.51ScrnA,u + leay >$17F0,y + inc V.51CursorChanged,u + pshs u + leau >-$0100,y + lda #$F0 + bsr L037C + leay ,u + puls u + inc V.51OldCursorPosY,u + bra L0354 + +L037C ldb #$17 + pshs b +L0380 ldb #$10 + +L0382 ldx ,u + stx ,y + ldx $02,u + stx $02,y + ldx $04,u + stx $04,y + ldx $06,u + stx $06,y + ldx $08,u + stx $08,y + ldx $0A,u + stx $0A,y + ldx $0C,u + stx $0C,y + ldx $0E,u + stx $0E,y + leay a,y + leau a,u + decb + bne L0382 + dec ,s + bne L0380 + puls pc,b + +DelLine + clrb + stb V.51XPos,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor +* +* $1b42 - clear to end of line +* +DoClrEOL + inc V.51CursorChanged,u + bsr L03BA + dec V.51CursorChanged,u + lbra CancelEscSequence +L03BA + ldb V.51XPos,u + pshs b + bitb #$07 + bne L03CB + lda #$05 + mul + bra L03F3 +L03CB lda #$01 + pshs a +L03CF lda #$20 + lbsr DrawCharacter + lda V.51XPos,u + inca + sta V.51XPos,u + cmpa #42 + bcs L03E3 + leas $01,s + bra L040D +L03E3 dec ,s + bpl L03CF + lda V.51XPos,u + ldb #$05 + mul + bitb #$08 + bne L03CF + leas $01,s +L03F3 lsrb + lsrb + lsrb + ldy V.51ScrnA,u + lda V.51YPos,u + leay d,y + leay >$0080,y + lda #$20 + pshs b + suba ,s+ + lsra + lbsr L0316 +L040D puls a + sta V.51XPos,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor + rts +* +* $1b4A - clear to end of screen +* +DoClearEOS + inc V.51CursorChanged,u + bsr L03BA + lda #$17 + suba V.51YPos,u + bls L042A + pshs a +L0421 lbsr L0314 + dec ,s + bne L0421 + leas $01,s +L042A dec V.51CursorChanged,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor + lbra CancelEscSequence + +* +*$0b - (cursor home) +* +DoHome + lbsr DoEraseCursor + clr V.51XPos,u + clr V.51YPos,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor + lbra L02A6 + +* +* $05 XX - set cursor off/on/color per XX-32 from COVDG (only on/off supported) +* +SetCrsr ldb #$01 need additional byte + leax <CrsrSw,pcr + bra L01E5V +CrsrSw lda <V.NChr2,u get next char + suba #C$SPAC take out ASCII space + bne L01BBV branch if not zero - show cursor + clr V.CColr,u + lbra CancelEscSequence +L01BBV + ldb #$FF + stb V.CColr,u + lbra CancelEscSequence + +* +* $02 XX YY - move cursor to col XX-32, row YY-32 from COVDG +* +CurXY ldb #$02 we want to claim next two chars + leax <DoCurXY,pcr point to processing routine +L01E5V stx <V.RTAdd,u store routine to return to + stb <V.NGChr,u get two more chars + clrb + rts + +DoCurXY lbsr DoEraseCursor hide cursor + ldb <V.NChr2,u get ASCII Y-pos + subb #C$SPAC take out ASCII space + stb V.51YPos,u + ldb <V.NChar,u get X-pos + subb #C$SPAC take out ASCII space + stb V.51XPos,u + clr V.51CursorOn,u +* lbsr DoDisplayCursor + lbra L02A6 + +* +* $1b41xxyy - move cursor to col xx (0-50) row yy (0-23) +* +DoGotoXY + lbsr DoEraseCursor + ldb V.51EscSeq,u + subb #$02 + bne L0442 + clrb + rts +L0442 decb + bne L0450 + cmpa #42 + bcs L044B + lda #41 +L044B sta V.51XPos,u +L044D clrb + rts +L0450 cmpa #24 + bcs L0456 + lda #23 +L0456 sta V.51YPos,u +L0459 + clr V.51CursorOn,u +* lbsr DoDisplayCursor + lbra L02A6 + +* +* $1b43 - (cursor right) +* +DoCursorRight + lbsr DoEraseCursor + inc V.51XPos,u + lda V.51XPos,u + cmpa #42 + bcs L0459 + clr V.51XPos,u + lbra DoLineFeed +* +* $1b46 - reverse on +* +DoReverseOn + lda #$FF + coma +L046F sta V.51ReverseFlag,u + lbra CancelEscSequence + +* +* $1b47 - reverse off +* +DoReverseOff + lda #$FF + bra L046F + +* +* $1b48 - underline on +* +DoUnderlineOn + lda #$FF +L047B sta V.51UnderlineFlag,u + lbra CancelEscSequence + +* +* $1b49 - underline off +* +DoUnderlineOff + clra + bra L047B + + +L0484 ldd V.51XPos,u + inc V.51CursorChanged,u + std V.51OldCursorPosX,u + bra L04B9 + +L0494 pshs b,a + ldd V.51OldCursorPosX,u + inc V.51XORFlag,u + tstb + bmi L04AB + cmpb #$18 + bcc L04AB + std V.51XPos,u + lda #$7F + lbsr DrawCharacter + +L04AB puls b,a + std V.51XPos,u + std V.51OldCursorPosX,u + dec V.51XORFlag,u +L04B9 dec V.51CursorChanged,u + clrb + rts + +* +* Display and Erase cursor routines, work by xoring cursor character onto the +* screen, the variable V.51CursorOn, is implemented such that it prevents +* multiple calls to these routines from acting as an inverse, so that they +* may be called from any code, irispective of if the cursor is already on/off. +* + +* +* Display Cursor. +* +DoDisplayCursor + tst V.CColr,u + beq NoCrsr + inc V.NoFlash,u * Flag in flash + tst V.51CursorOn,u * Get cursor on flag + bne DoCursorOnEnd * Yes : don't re-display + bsr DoCursorCommon * Display cursor + inc V.51CursorOn,u * Flag cursor on +DoCursorOnEnd + dec V.NoFlash,u * Flag flash done +NoCrsr rts +* +* Erase cursor +* +DoEraseCursor + inc V.NoFlash,u * Flag in Flash + tst V.51Cursoron,u * Get cursor on flag + beq DoEraseCursorEnd * no : don't atempt to turn off + bsr DoCursorCommon * Hide cursor + clr V.51CursorOn,u * Flag cursor off +DoEraseCursorEnd + dec V.NoFlash,u * Flag Flash done + rts + +DoCursorCommon + lda #$7f * Cursor character $7f = block + inc V.51XORFlag,u * Flag xor on screen + lbsr DrawCharacter * Draw it + dec V.51XORFlag,u * Flag no xor on screen + rts + +L04CA clrb + rts +GetStat + cmpa #$06 + beq L04CA + cmpa #$02 + bne SetStat + ldx $06,y + ldd V.51ScrnA,u + std $04,x + clrb + rts + +SetStat comb + ldb #E$UnkSvc + rts + +* +* Flash cursor, called by IRQ routine from VTIO +* + +FlashCursor + tst V.NoFlash,u * Should we flash ? + bne FlashExit * No: just return + tst V.51CursorOn,u * Is cursor on ? + bne FlashOff * Yep : turn off + bra DoDisplayCursor * Else turn it on +FlashOff + bra DoEraseCursor +FlashExit + rts + + +* control characters dispatch table +CtrlCharDispatch + fcb $01 + fdb DoHome-CtrlCharDispatch * COVDG CurHome + fcb $02 + fdb CurXY-CtrlCharDispatch * COVDG CURSOR XY + fcb $03 + fdb DelLine-CtrlCharDispatch * COVDG ERASE LINE + fcb $04 + fdb DoClrEOL-CtrlCharDispatch * COVDG ErEOLine + fcb $05 + fdb SetCrsr-CtrlCharDispatch * COVDG CURSOR ON/OFF + fcb $06 + fdb DoCursorRight-CtrlCharDispatch * COVDG CurRght + fcb $07 BEL * (beep) + fdb DoBell-CtrlCharDispatch $FC0B + fcb $08 BS * (left arrow) + fdb DoBackspace-CtrlCharDispatch * $FC23 + fcb $09 + fdb DoCursorUp-CtrlCharDispatch * COVDG CurUp + fcb $0A LF * (down arrow) + fdb DoLineFeed-CtrlCharDispatch * $FC3E + fcb $0D CR * (return) + fdb DoCarrageReturn-CtrlCharDispatch *$FC50 + fcb $0C FF * (clear screen) + fdb DoCLS-CtrlCharDispatch $FC55 + fcb $0B * (cursor home) +* Since few applications use CoHR $0B, support COVDG $0B instead +* fdb DoHome-CtrlCharDispatch $FDC2 * Was CoHR DoHome + fdb DoClearEOS-CtrlCharDispatch * COVDG ErEOScrn + fcb $00 + +* escape sequences dispatch table +EscCharDispatch + fcb $41 * cursor xy + fdb DoGotoXY-CtrlCharDispatch * $FDCB + fcb $42 * clear EOL + fdb DoClrEOL-CtrlCharDispatch * $FD41 + fcb $43 * cursor right + fdb DoCursorRight-CtrlCharDispatch * $FDEE + fcb $44 * cursor up + fdb DoCursorUp-CtrlCharDispatch * $FC2D + fcb $45 * cursor down + fdb DoLineFeed-CtrlCharDispatch * $FC3E + fcb $46 * reverse on + fdb DoReverseOn-CtrlCharDispatch * $FDFE + fcb $47 * reverse off + fdb DoReverseOff-CtrlCharDispatch * $FE07 + fcb $48 * underline on + fdb DoUnderlineOn-CtrlCharDispatch * $FE0B + fcb $49 * underline off + fdb DoUnderlineOff-CtrlCharDispatch * $FE13 + fcb $4A * clear EOS + fdb DoClearEOS-CtrlCharDispatch * $FDA5 + fcb $00 + +CharacterShapes + + fcb $00,$00,$00,$00,$00 ' ' + fcb $21,$08,$40,$00,$80 '!' + fcb $52,$94,$00,$00,$00 '"' + fcb $52,$be,$af,$a9,$40 '#' + fcb $23,$e8,$e2,$f8,$80 '$' + fcb $c6,$44,$44,$4c,$60 '%' + fcb $45,$11,$59,$4d,$80 '&' + fcb $11,$10,$00,$00,$00 ''' + fcb $11,$10,$84,$10,$40 '(' + fcb $41,$04,$21,$11,$00 ')' + fcb $25,$5c,$47,$54,$80 '*' + fcb $01,$09,$f2,$10,$00 '+' + fcb $00,$00,$00,$10,$88 ',' + fcb $00,$00,$f0,$00,$00 '-' + fcb $00,$00,$00,$31,$80 '.' + fcb $00,$02,$22,$22,$00 '/' + fcb $74,$67,$5c,$c5,$c0 '0' + fcb $23,$28,$42,$13,$e0 '1' + fcb $74,$42,$26,$43,$e0 '2' + fcb $74,$42,$60,$c5,$c0 '3' + fcb $11,$95,$2f,$88,$40 '4' + fcb $fc,$38,$20,$8b,$80 '5' + fcb $32,$21,$e8,$c5,$c0 '6' + fcb $fc,$44,$42,$10,$80 '7' + fcb $74,$62,$e8,$c5,$c0 '8' + fcb $74,$62,$f0,$89,$80 '9' + fcb $00,$08,$00,$10,$00 ':' + fcb $00,$08,$00,$10,$88 ';' + fcb $19,$99,$86,$18,$60 '<' + fcb $00,$3e,$0f,$80,$00 '=' + fcb $c3,$0c,$33,$33,$00 '>' + fcb $74,$42,$22,$00,$80 '?' + fcb $74,$42,$da,$d5,$c0 '@' + fcb $22,$a3,$1f,$c6,$20 'A' + fcb $f2,$52,$e4,$a7,$c0 'B' + fcb $32,$61,$08,$24,$c0 'C' + fcb $e2,$92,$94,$ab,$80 'D' + fcb $fc,$21,$e8,$43,$e0 'E' + fcb $fc,$21,$e8,$42,$00 'F' + fcb $74,$61,$78,$c5,$c0 'G' + fcb $8c,$63,$f8,$c6,$20 'H' + fcb $71,$08,$42,$11,$c0 'I' + fcb $38,$84,$29,$49,$80 'J' + fcb $8c,$a9,$8a,$4a,$20 'K' + fcb $84,$21,$08,$43,$e0 'L' + fcb $8e,$eb,$58,$c6,$20 'M' + fcb $8e,$73,$59,$ce,$20 'N' + fcb $74,$63,$18,$c5,$c0 'O' + fcb $f4,$63,$e8,$42,$00 'P' + fcb $74,$63,$1a,$c9,$a0 'Q' + fcb $f4,$63,$ea,$4a,$20 'R' + fcb $74,$60,$e0,$c5,$c0 'S' + fcb $f9,$08,$42,$10,$80 'T' + fcb $8c,$63,$18,$c5,$c0 'U' + fcb $8c,$63,$15,$28,$80 'V' + fcb $8c,$63,$5a,$ee,$20 'W' + fcb $8c,$54,$45,$46,$20 'X' + fcb $8c,$62,$e2,$10,$80 'Y' + fcb $f8,$44,$44,$43,$e0 'Z' + fcb $72,$10,$84,$21,$c0 '[' + fcb $00,$20,$82,$08,$20 '\' + fcb $70,$84,$21,$09,$c0 ']' + fcb $22,$a2,$00,$00,$00 '^' + fcb $00,$00,$00,$03,$e0 '_' + fcb $41,$04,$00,$00,$00 '`' + fcb $00,$1c,$17,$c5,$e0 'a' + fcb $84,$2d,$98,$e6,$c0 'b' + fcb $00,$1d,$18,$45,$c0 'c' + fcb $08,$5b,$38,$cd,$a0 'd' + fcb $00,$1d,$1f,$c1,$c0 'e' + fcb $11,$49,$f2,$10,$80 'f' + fcb $00,$1b,$39,$b4,$2e 'g' + fcb $84,$3d,$18,$c6,$20 'h' + fcb $20,$18,$42,$11,$c0 'i' + fcb $10,$0c,$21,$0a,$4c 'j' + fcb $42,$12,$a6,$29,$20 'k' + fcb $61,$08,$42,$11,$c0 'l' + fcb $00,$35,$5a,$d6,$a0 'm' + fcb $00,$2d,$98,$c6,$20 'n' + fcb $00,$1d,$18,$c5,$c0 'o' + fcb $00,$2d,$9c,$da,$10 'p' + fcb $00,$1b,$39,$b4,$21 'q' + fcb $00,$2d,$98,$42,$00 'r' + fcb $00,$1f,$0f,$07,$c0 's' + fcb $42,$3c,$84,$24,$c0 't' + fcb $00,$25,$29,$49,$a0 'u' + fcb $00,$23,$18,$a8,$80 'v' + fcb $00,$23,$5a,$d5,$40 'w' + fcb $00,$22,$a2,$2a,$20 'x' + fcb $00,$23,$19,$b4,$2e 'y' + fcb $00,$3e,$22,$23,$e0 'z' + fcb $19,$08,$82,$10,$60 '{' + fcb $21,$08,$02,$10,$80 '|' + fcb $c1,$08,$22,$13,$00 '}' + fcb $45,$44,$00,$00,$00 '~' + fcb $ff,$ff,$ff,$ff,$ff 'cursor' + + emod +eom equ * + end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/term_42.asm Sun May 14 00:15:38 2017 -0700 @@ -0,0 +1,74 @@ +******************************************************************** +* TERM - Hi-Res 40x24 Device Descriptor +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* ????/??/?? +* From Tandy OS-9 Level One VR 02.00.00 +* +* Modified from 51 col driver to suit 40 column software +* driver from Dragon Data OS-9, 2004-12-02 P.Harvey-Smith. +* + + + + nam TERM + ttl Hi-Res 42x24 Device Descriptor + +* Disassembled 98/08/23 17:19:25 by Disasm v1.6 (C) 1988 by RML + + ifp1 + use defsfile +; use scfdefs + use cocovtio.d + endc + +tylg set Devic+Objct +atrv set ReEnt+rev +rev set $00 + + mod eom,name,tylg,atrv,mgrnam,drvnam + + fcb UPDAT. mode byte + fcb HW.Page extended controller address + fdb $C000 physical controller address + fcb initsize-*-1 initilization table size + fcb DT.SCF device type:0=scf,1=rbf,2=pipe,3=scf + fcb $00 case:0=up&lower,1=upper only + fcb $01 backspace:0=bsp,1=bsp then sp & bsp + fcb $00 delete:0=bsp over line,1=return + fcb $01 echo:0=no echo + fcb $01 auto line feed:0=off + fcb $00 end of line null count + fcb $01 pause:0=no end of page pause + fcb 24 lines per page + fcb C$BSP backspace character + fcb C$DEL delete line character + fcb C$CR end of record character + fcb C$EOF end of file character + fcb C$RPRT reprint line character + fcb C$RPET duplicate last line character + fcb C$PAUS pause character + fcb C$INTR interrupt character + fcb C$QUIT quit character + fcb C$BSP backspace echo character + fcb C$BELL line overflow character (bell) + fcb ModCo42 init value for dev ctl reg + fcb $00 baud rate + fdb name copy of descriptor name address + fcb $00 acia xon char + fcb $00 acia xoff char + fcb 42 (szx) number of columns for display + fcb 24 (szy) number of rows for display +initsize equ * + +name fcs /TERM/ +mgrnam fcs /SCF/ +drvnam fcs /VTIO/ + + emod +eom equ * + end
--- a/level1/modules/vtio.asm Sat May 13 23:17:11 2017 -0700 +++ b/level1/modules/vtio.asm Sun May 14 00:15:38 2017 -0700 @@ -699,7 +699,8 @@ GrfDrv fcs /GrfDrv/ CoVDG fcs /CoVDG/ CoWP fcs /CoWP/ -CoHR fcs /CoHR/ +CoHR fcs /CoHR/ +Co42 fcs /Co42/ * GetStat * @@ -963,7 +964,7 @@ bra SetupCoModule GoCoWP bita #ModCoWP ; CoWP needed ? - beq GoCoHR + beq GOCo42 lda #ModCoWP 'CoWP is loaded' bit ldx #$5018 80x24 pshs u,y,x,a @@ -976,7 +977,18 @@ stx <V.Col,u save screen size sta <V.CurCo,u current module in use? ($02=CoVDG, $04=C080) L0600 rts - + +GOCo42 bita #ModCo42 + beq GOCoHR + ldb #$10 + stb <V.CFlag,u + clr <V.Caps,u + lda #ModCo42 'Co42 is loaded' bit + ldx #$2A18 42x24 + pshs u,y,x,a + leax >Co42,pcr + bra SetupCoModule + GOCoHR ldb #$10 stb <V.CFlag,u clr <V.Caps,u