Jump to content

Photo

Stella H/W Monitor Source


3 replies to this topic

#1 Curt Vendel OFFLINE  

Curt Vendel

    River Patroller

  • 4,482 posts
  • Location:Carmel, New York

Posted Sat Sep 10, 2005 11:20 PM

;
;
; NEW MONITOR
;
;
;
; DAVE CRANE FEB 7 1978
;
; LARRY WAGNER COPY PROM TO RAM DEC 18 1978
;
;
;
; PIA AND TIMER (6532) LOCATIONS

SWCHA = $280 P0,P1 JOYSTICKS **A=B DUE TO WIRING IN STELLAX BOARD**
SWCHB = $280 CONSOLE SWITCHES
CTLSWA = $281
CTLSWB = $281
INTIM = $284 ;INTERVAL TIMER IN
TIM8T = $295 ;TIMER 8T WRITE OUT
TIM64T = $296 ;TIMER 64T WRITE OUT
TIM1KT = $297
; STELLA (TIA) REGISTER ADDRESSES

VSYNC = $00 BIT 1 VERTICAL SYNC SET-CLR
VBLANK = $01 BIT 1 VERTICAL BLANK SET-CLR
WSYNC = $02 STROBE WAIT FOR HORIZ BLANK
RSYNC = $03 STROBE RESET HORIZ SYNC COUNTER
NUSIZ0 = $04 BITS 54 210 NUMBER-SIZE PLAYER/MISSILE 0
NUSIZ1 = $05 BITS 54 210 NUMBER-SIZE PLAYER/MISSILE 1
COLUP0 = $06 BITS 7654321 COLOR(4)-LUM(3) PLAYER 0
COLUP1 = $07 BITS 7654321 COLOR(4)-LUM(3) PLAYER 1
COLUPF = $08 BITS 7654321 COLOR(4)-LUM(3) PLAYFIELD
COLUBK = $09 BITS 7654321 COLOR(4)-LUM(3) BACKGROUND
CTRLPF = $0A BITS 7 54 210 PLAYFIELD CONTROL
REFP0 = $0B BIT 3 REFLECT PLAYER 0
REFP1 = $0C BIT 3 REFLECT PLAYER 1
PF0 = $0D BITS 7654 PLAYFIELD REG BYTE 0
PF1 = $0E BITS ALL PLAYFIELD REG BYTE 1
PF2 = $0F BITS ALL PLAYFIELD REG BYTE 2
RESP0 = $10 STROBE RESET PLAYER 0
RESP1 = $11 STROBE RESET PLAYER 1
RESM0 = $12 STROBE RESET MISSILE 0
RESM1 = $13 STROBE RESET MISSILE 1
RESBL = $14 STROBE RESET BALL
AUDC0 = $15 BITS 3210 AUDIO CONTROL 0
AUDC1 = $16 BITS 3210 AUDIO CONTROL 1
AUDF0 = $17 BITS 3210 AUDIO FREQUENCY 0
AUDF1 = $18 BITS 3210 AUDIO FREQUENCY 1
AUDV0 = $19 BITS 3210 AUDIO VOLUME 0
AUDV1 = $1A BITS 3210 AUDIO VOLUME 1
GRP0 = $1B BITS ALL GRAPHICS FOR PLAYER 0
GRP1 = $1C BITS ALL GRAPHICS FOR PLAYER 1
ENAM0 = $1D BIT 1 ENABLE MISSILE 0
ENAM1 = $1E BIT 1 ENABLE MISSILE 1
ENABL = $1F BIT 1 ENABLE BALL
HMP0 = $20 BITS 7654 HORIZ MOTION PLAYER 0
HMP1 = $21 BITS 7654 HORIZ MOTION PLAYER 1
.PAGE
HMM0 = $22 BITS 7654 HORIZ MOTION MISSILE 0
HMM1 = $23 BITS 7654 HORIZ MOTION MISSILE 1
HMBL = $24 BITS 7654 HORIZ MOTION BALL
VDELP0 = $25 BIT 0 VERTICAL DELAY PLAYER 0
VDELP1 = $26 BIT 0 VERTICAL DELAY PLAYER 1
VDELBL = $27 BIT 0 VERTICAL DELAY BALL
RESMP0 = $28 BIT 1 RESET MISSILE TO PLAYER 0
RESMP1 = $29 BIT 1 RESET MISSILE TO PLAYER 1
HMOVE = $2A STROBE ACT ON HORIZ MOTION
HMCLR = $2B STROBE CLEAR ALL HM REGISTERS
CXCLR = $2C STROBE CLEAR COLLISION LATCHES
; READ ADDRESSES - BITS 7 & 6 ONLY
CXM0P = $30
CXM1P = $31
CXP0FB = $32
CXP1FB = $33
CXM0FB = $34
CXM1FB = $35
CXBLPF = $36
CXPPMM = $37
INPT0 = $38
INPT1 = $39
INPT2 = $3A
INPT3 = $3B
INPT4 = $3C
INPT5 = $3D
.PAGE
; RAM PAGE ZERO DEFINITIONS
*=$A0
POINTL *=*+1 LOW MEMORY POINTER
POINTH *=*+1 HIGH MEMORY POINTER
*=$E800
USERAC *=*+1 AC
USERX *=*+1 X REG
USERY *=*+1 Y REG
USERSP *=*+1 STACK POINTER
PCL *=*+1 PC LOW
PCH *=*+1 PC HIGH
STATUS *=*+1 STATUS REG
CHKSUM *=*+1
CHKHI *=*+1
ERRFLG *=*+1
ERR0 *=*+1
ERR1 *=*+1
CNTR *=*+1 OUTPUT COUNTER
INL *=*+1 LOW INPUT BUFFER
INH *=*+1 HIGH INPUT BUFFER
TEMP2 *=*+1
TMPX *=*+1
TMPX1 *=*+1
TMPX2 *=*+1
CHAR *=*+1
CNTL30 *=*+1
CNTH30 *=*+1
TIMH *=*+1
TEMP *=*+1
TEMP1 *=*+1
OFFSET *=*+1 OFFSET FOR MOVING ZERO PAGE
.PAGE
*=$E400
;
;
CTLCON=$282 CONTROL CONSOLE SWITCHES
SWHCON=$283 DATA CONSOLE SWITCHES
;
RST LDA #$04 SET PROM/RAM SWITCH
STA CTLCON TO RAM
LDX #$FF
STX SWHCON
STX USERSP
TXS
JMP START4
START STA USERAC (BREAK ENTRY POINT)
PLA
STA STATUS
SAVE1 PLA (JSR ENTRY POINT)
STA PCL
PLA
STA PCH
SAVE2 STY USERY
STX USERX
TSX
STX USERSP
JSR SWAP
LDA PCL
STA POINTL
LDA PCH
STA POINTH
CLD
JMP BREAK
START4 CLD
SEI
JSR SWAP
START2 LDA #0
STA ERRFLG
START3 LDX #$FF
TXS
LDA #1
STA CNTH30 SET 300 BAUD
LDA #$1C
STA CNTL30
LDA #$3F
STA CTLSWB
PROMPT LDA ERRFLG
BEQ PROMPA
JMP ENDLD2
PROMPA JSR CRLF
PROMP1 LDA #$3E '>'
JSR OUTCH
LDA #0 CLEAR INPUT BUFFER
STA INH
STA INL
STA ERRFLG
GETHEX JSR GETBYT
BEQ GETHEX
CMP #$20 SPACE
BEQ PROC1
CMP #$2E '.'
BEQ PROC2
CMP #$D CARRIAGE RETURN
BEQ PROC3
CMP #$A LINE FEED
BEQ PROC4
CMP #$52 'R' RAM TESTER
BNE GETHE1
JMP RAMTST
GETHE1 CMP #$48 'H'
BEQ HIBAUD
CMP #$4D 'M' TO MOVE PROM TO RAM
BNE GETHE2
JMP COPY
GETHE2 CMP #$4C 'L'
BEQ LOBAU1
CMP #$47 'G'
BEQ PROC5
CMP #$7F RUBOUT
BEQ START2
JMP GETHEX IGNORE ILLEGAL CHARACTERS
PROC1 JSR OPEN OPEN AND DISPLAY CURRENT CELL
JSR TESTLM TEST FOR E0-FF LIMITS
JMP SHOW
PROC2 LDY #0
JSR TESTLM GO GET OFFSET
JSR ADDOFF
LDA INL
STA (POINTL),Y STORE DATA
LDA TEMP2 RESTORE POINTH
STA POINTH
PROC3 JSR INCPT NEXT CELL
JMP SHOW
PROC4 SEC
LDA POINTL DECREMENT POINTER
SBC #1
STA POINTL
BCS PROC4A
DEC POINTH
PROC4A JMP SHOW
PROC5 LDX #$A0 RESTORE RAM
LDA POINTL
STA PCL
LDA POINTH
STA PCH
PROC5A LDA $E800,X
STA $00,X
INX
BNE PROC5A
GOEXEC LDX USERSP
TXS
LDA PCH
PHA
LDA PCL
PHA
LDA STATUS
PHA
LDA #0 RESTORE JOYSTICK PORT TO READ ONLY
STA CTLSWA
LDX USERX
LDY USERY
LDA USERAC
RTI
HIBAUD JSR CRLF
LDA #$44
STA CNTL30
LDA #0
STA CNTH30
JMP LOBAUD
LOBAU1 JSR CRLF
LOBAUD LDY #0
JSR GETCH LOADER ROUTINE
CMP #$3B SEMICOLON
BNE LOBAUD WAIT FOR SEMICOLON
LOAD1 LDA #0 CLR CHKSUM
STA CHKSUM
STA CHKHI
JSR GETTST
TAX PUT BYTE COUNT IN X
BEQ ENDLD IF ZERO BYTE COUNT, GO END
JSR CHK ADD TO CHKSUM
;
JSR GETTST GET HIGH ADDRESS
STA POINTH
JSR CHK
JSR GETTST GET LOW ADDRESS
STA POINTL
JSR CHK
;
LOAD2 JSR GETTST GET DATA
STA (POINTL),Y
JSR CHK
JSR INCPT
LOAD3 DEX
BNE LOAD2
;
LOAD4 JSR GETTST COMPARE CHKSUM
CMP CHKHI
JSR ERROR1
JSR GETTST
CMP CHKSUM
JSR ERROR1
JMP LOBAUD
;
;
GETTST JSR GETBYT
BEQ GETTS1
LDA #1 BIT 0 IS ILLEGAL CHARACTER
ERROR2 STA ERRFLG
LDA POINTL SAVE ERROR ADDRESS
STA ERR0
LDA POINTH
STA ERR1
PLA
PLA
JMP LOBAUD
GETTS1 LDA INL
ERROR3 RTS
ERROR1 BEQ ERROR3
LDA ERRFLG
ORA #2 BIT 1 IS CHECKSUM ERROR
JMP ERROR2
;
ENDLD LDX #2 READ REMAINING ZEROS
ENDLD1 JSR GETTST
DEX
BPL ENDLD1
ENDLD2 JSR CRLF
LDX #9 PRINT ERROR MESSAGE
ENDLD3 LDA MSGTBL,X
JSR OUTCH
DEX
BPL ENDLD3
LDA ERRFLG
JSR PRTBYT
JSR OUTSP
LDA ERR1
JSR PRTBYT
LDA ERR0
JSR PRTBYT
JMP START2
;
;
SHOW JSR CRLF
JSR PRTPNT
JSR OUTSP
JSR ADDOFF
LDY #0
LDA (POINTL),Y
JSR PRTBYT
LDA TEMP2
STA POINTH
JSR OUTSP
JMP PROMP1
;
;
; BEGIN SUBROUTINES
;
.PAGE
;
; ADD OFFSET TO POINTH
;
ADDOFF CLC ADD IT IN
LDA POINTH
STA TEMP2
ADC OFFSET
STA POINTH
RTS
;
; GET CHARACTER
;
GETCH STX TMPX SAVE X
LDY #$7
GET1 BIT SWCHA
BMI GET1 WAIT FOR START BIT
JSR DELAY DELAY 1 BIT
GET5 JSR DEHALF DELAY 1/2 BIT
GET2 LDA SWCHA GET 8 BITS
AND #$80 MASK OFF LOW ORDER BITS
LSR CHAR SHIFT RIGHT CHARACTER
ORA CHAR
STA CHAR
JSR DELAY DELAY 1 BIT TIME
DEY
BNE GET2 GET NEXT CHAR
JSR DEHALF EXIT THIS RTN
;
LDX TMPX
LDA CHAR
LSR A
GET6 RTS
;
;
; PRINT CARRIAGE RETURN AND LINE FEED
;
CRLF STX TMPX1
LDA #$0D CR
JSR OUTCH
LDA #$0A LF
JSR OUTCH
LDX #5 PRINT NULLS
CRLF1 LDA #0
JSR OUTCH
DEX
BPL CRLF1
LDX TMPX1
RTS
;
; PRINT CHARACTER
; X IS PRESERVED Y = $FF
; OUTSP PRINTS 1 SPACE
;
OUTSP LDA #$20
OUTCH STA CHAR
STX TMPX2
LDA #$3F MAKE JOYSTICK PORT READ/WRITE
STA CTLSWB
OUT3 JSR DELAY
LDA SWCHB START BIT
AND #$FE
STA SWCHB
JSR DELAY
LDY #$8
OUT1 LDA SWCHB DATA BIT
AND #$FE
LSR CHAR
ADC #0
STA SWCHB
JSR DELAY
DEY
BNE OUT1
LDA SWCHB STOP BIT
ORA #$1
STA SWCHB
JSR DELAY STOP BIT
LDX TMPX2
LDA #0
STA CTLSWA
RTS
;
; DELAY 1 BIT TIME
;
DELAY LDA CNTH30
STA TIMH
LDA CNTL30
DE2 SEC
DE4 SBC #$1
BCS DE3
DEC TIMH
DE3 LDX TIMH
BPL DE2
RTS
;
; DELAY 1/2 BIT TIME
;
DEHALF LDA CNTH30
STA TIMH
LDA CNTL30
LSR A
LSR TIMH
BCC DE2
ORA #$80
BCS DE4
;
;
;
;
; SUB TO PRINT POINTL,POINTH
;
PRTPNT LDA POINTH
JSR PRTBYT
LDA POINTL
JSR PRTBYT
RTS
;
;
; PRINT 1 HEX BYTE AS TWO ASCII CHARACTERS
;
PRTBYT STA TEMP
LSR A
LSR A
LSR A
LSR A
JSR HEXTA CONVERT TO HEX AND PRINT
LDA TEMP GET BOTTOM HALF
JSR HEXTA
LDA TEMP RESTORE ACCUMULATOR
RTS
;
HEXTA AND #$F MASK
CMP #$A
CLC
BMI HEXTA1
ADC #7 ALPHA HEX
HEXTA1 ADC #$30 DEC HEX
JMP OUTCH
;
;
; SUBROUTINE TO INCREMENT MEMORY POINTER
;
INCPT INC POINTL
BNE INCPT2
INC POINTH
INCPT2 RTS
;
;
; GET 2 HEX CHARACTERS AND PACK THEM INTO
; THE INPUT BUFFER. X IS PRESERVED. ANY NON-HEX
; CHARACTER IS RETURNED IN THE AC. ANY ENTRY
; BETWEEN 0 AND F INCLUSIVE CAUSES A 0 RETURN IN THE AC.
;
GETBYT JSR GETCH
JSR PACK
BNE GETBY1 RETURN IF NON-HEX
JSR GETCH IF HEX, GET SECOND DIGIT
JSR PACK
GETBY1 RTS
;
;
; SHIFT AC INTO INPUT BUFFER
;
PACK CMP #$30 CHECK FOR HEX
BMI UPDAT2
CMP #$47 NOT HEX EXIT
BPL UPDAT2
HEXNUM CMP #$40 CONVERT TO HEX
BMI UPDATE
HEXALP CLC
ADC #$9
UPDATE ROL A
ROL A
ROL A
ROL A
LDY #4 SHIFT INTO BUFFER
UPDAT1 ROL A
ROL INL
ROL INH
DEY
BNE UPDAT1
LDA #0 RETURN 0 IF HEX
UPDAT2 CMP #0 RESTORE FLAGS
RTS
;
;
; OPEN CELL BY MOVING INPUT BUFFER INTO POINTER
;
OPEN LDA INL
STA POINTL
LDA INH
STA POINTH
RTS
;
;
;
; COMPUTE CHKSUM
;
CHK CLC
ADC CHKSUM
STA CHKSUM
LDA CHKHI
ADC #0
STA CHKHI
RTS
;
;
; TEST LIMITS. TEST FOR E0-FF, IF SO, OFFSET=$FC
;
TESTLM LDA #0
STA OFFSET
LDA POINTH
BNE TESTL1
LDA POINTL
CMP #$A0
BCC TESTL1 BRANCH IF POINTH.LT.$E0
LDA #$E8
STA OFFSET
TESTL1 RTS
;
SWAP LDX #$A0 SAVE 80-FF AT E880-E8FF
START1 LDA $00,X
STA $E800,X
INX
BNE START1
RTS
;
;
; PRINT BYTE FOLLOWED BY A SPACE
;
PBYTSP JSR PRTBYT
JMP OUTSP
;
;
;
;
;
;
; BL : R O R R E BL
MSGTBL .BYTE $07,$20,$3A,$20,$52,$4F,$52,$52,$45,$07
.BYTE "PS SP A Y X CP"
;
;
;
; BREAK DISPLAY
;
BREAK JSR CRLF
LDX #$12
BREAK1 LDA MSGTBL+10,X
JSR OUTCH
DEX
BPL BREAK1
JSR CRLF
LDA PCH
JSR PRTBYT
LDA PCL
JSR PBYTSP
LDA USERX
JSR PBYTSP
LDA USERY
JSR PBYTSP
LDA USERAC
JSR PBYTSP
LDA STATUS
JSR PBYTSP
LDA USERSP
JSR PRTBYT
JMP START4
;
;
;
; RAM TESTER: TEST RAM FROM POINTL,H TO INL,H
; REMOVED TO ALLOW COPY
;
RAMTST JMP PROMPT STUB UNTIL MORE ROOM
;
; COPY PROM TO RAM
;
COPY LDA #$04
STA CTLCON
LDA #$E8
STA POINTH
LDA #$00
STA POINTL
TAY
TAX
HOW STX SWHCON
LDA (POINTL),Y
LDX #$FF
STX SWHCON
STA (POINTL),Y
INC POINTL
LDX #$00
CPX POINTL
BNE HOW
INC POINTH
CPX POINTH
BNE HOW
JMP RST
;
;
;
;
;
;
;
;
;
*=$E7FC
.WORD RST
.WORD START
;
;
.END

#2 Bruce Tomlin OFFLINE  

Bruce Tomlin

    River Patroller

  • 3,592 posts
  • CD C9 01
  • Location:Austin, TX

Posted Mon Sep 12, 2005 11:49 AM

Interesting. A joystick-serial monitor, but he used the RIOT timer instead of VSYNC for bit timing.

1978, huh? I'm pretty sure that predates the MAX-232 chip by a few years.

#3 djmips OFFLINE  

djmips

    Dragonstomper

  • 625 posts
  • scrolling
  • Location:Seattle

Posted Sat Dec 3, 2005 7:07 AM

Interesting.  A joystick-serial monitor, but he used the RIOT timer instead of VSYNC for bit timing.

1978, huh?  I'm pretty sure that predates the MAX-232 chip by a few years.

View Post


So this is an RS-232 compliant monitor. Hmmm seems like that would have been useful for debugging back in the day. :) Do you remember the 1488 and 1489?, those were ubiquitous before the MAX-232 but they required +/- voltages.

I've got a tube of MAX-232's, maybe I should see if I can get something to show up on HyperTerm. :P

#4 djmips OFFLINE  

djmips

    Dragonstomper

  • 625 posts
  • scrolling
  • Location:Seattle

Posted Sat Dec 3, 2005 7:51 AM

Here's a DASM formatted version that builds.

Note, that the source as it is written uses 26 bytes of RAM at $E800

Attached Files






0 user(s) are browsing this forum

0 members, 0 guests, 0 anonymous users