Skip to content

Instantly share code, notes, and snippets.

@ThorstenBr
Forked from xk/cassette-scope.s
Last active June 12, 2019 21:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ThorstenBr/bdca3bdbefbc47bb3ca9251958f785ac to your computer and use it in GitHub Desktop.
Save ThorstenBr/bdca3bdbefbc47bb3ca9251958f785ac to your computer and use it in GitHub Desktop.
Apple II cassette-scope
;APPLE II CASSETTE-SCOPE
;2017-09 JORGE@JORGECHAMORRO.COM
;2019-06 BREHMT@GMAIL.COM
;SIMPLE 1-CHANNEL DIGITAL SCOPE
;USING THE APPLE II CASSETTE PORT
;KEYS:
;(T)RIGGER ON / OFF
;(SPACE) RUN / STOP
;(O)NE SHOT TRIGGER ON /OFF
;(A)UTO TRIGGER ON / OFF
;Any other key quits
; VARIABLES
POINTER = $06
HGR_BASE = $E6
SAMPLES = $F0
STACK = $100
TRIGGER = $2FF
S_SAVE = $2FE
X_CORD = $2FD
FLIP = $2FC
ONESHOT = $2FB
AUTOTRIGGER = $2FA
; GRAPHICS
X0 = 4
Y_HI = 88
Y_LO = 104
BLACK = 0
WHITE = 3
; APPLE I/O REGISTERS
KEYBD = $C000 ; READ KEYBOARD (0x80=key pending, ASCII:bits 0-6)
KEYBD_STROBE = $C010 ; ACKNOWLEDGE KEYBOARD DATA
GAME_STROBE = $C040 ; GAME PIN STROBE
TAPEIN = $C060 ; READ TAPE INPUT SIGNAL
PAGE1 = $C054 ; GRAPHICS PAGE1
PAGE2 = $C055 ; GRAPHICS PAGE2
; APPLE KERNEL ROUTINES
COUT = $FDED ; character out sub
CROUT = $FD8E ; CR out sub
PRBYTE = $FDDA ; prints hex value of A
HOME = $FC58 ; home/clear screen
WARM = $FF69 ; back to monitor
SETCOLOR = $F6F0
DRAW = $F457
ROM_HGR2 = $F3D4 ; HGR2
HGR = $F3DE ; HGR
CLR_HIRES = $F3F2 ; Clear HI-RES screen to Black
CLR_HCOLOR = $F3F6 ; Clear HI-RES screen to recent HCOLOR
TEXT_MODE = $FB39 ; Set screen to text mode
ENDBAS = $80C ; END OF BASIC
START:
.org ENDBAS
JSR CROUT
JSR PRINT_TITLE
LDA PAGE1
JSR HOME
LDA PAGE2
JSR HOME
BOOT: JSR ROM_HGR2
JSR GRATICULA
JSR CLR_HIRES
JSR GRATICULA
LDA PAGE2
LDA #$20
STA HGR_BASE
JSR CLR_HIRES
LDA PAGE1
LDA #$40
STA HGR_BASE
JSR CLR_HIRES
LDA #$20
STA HGR_BASE
LDX #0
STX FLIP
STX ONESHOT
INX
STX TRIGGER
STX AUTOTRIGGER
STA KEYBD_STROBE ; clear any pending keypress
ENTRY: TSX
STX S_SAVE
ENTRY2: LDX #SAMPLES
TXS
LDA TRIGGER
BEQ NO_EDGE
FIND_EDGE: LDX #SAMPLES
EDGE1: DEX
BEQ NONE
LDA TAPEIN
BMI EDGE1
PHA
LDX #SAMPLES
EDGE2: DEX
BEQ NONE
LDA TAPEIN
BPL EDGE2
BMI GO
NONE: LDX ONESHOT
BEQ NONE2
JMP ENTRY2
NONE2:
LDX AUTOTRIGGER
BNE NO_EDGE
PHA
TSX
BPL NONE2
JMP REST_S
NO_EDGE:
;LDA GAME_STROBE
LDA TAPEIN
PHA
LDA TAPEIN
GO: PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
LDA TAPEIN
PHA
REST_S: ;LDA GAME_STROBE
LDX S_SAVE
TXS
PAINT: LDA #X0
STA X_CORD
LDA #SAMPLES
STA S_SAVE
LOOP_PAINT: LDX S_SAVE
LDA STACK,X
BMI HI
LO:
LDX #BLACK
JSR SETCOLOR
LDX X_CORD
LDY #0
LDA #Y_HI
JSR DRAW
LDX #WHITE
JSR SETCOLOR
LDX X_CORD
LDY #0
LDA #Y_LO
JSR DRAW
JMP NXTSMP
HI:
LDX #WHITE
JSR SETCOLOR
LDX X_CORD
LDY #0
LDA #Y_HI
JSR DRAW
LDX #BLACK
JSR SETCOLOR
LDX X_CORD
LDY #0
LDA #Y_LO
JSR DRAW
NXTSMP: INC X_CORD
DEC S_SAVE
LDA S_SAVE
CMP #$FF
BNE LOOP_PAINT
LDA FLIP
BNE HGR2
LDA PAGE1
LDA #1
STA FLIP
LDA #$40
STA HGR_BASE
JMP END
HGR2: LDA PAGE2
LDA #0
STA FLIP
LDA #$20
STA HGR_BASE
END: LDA ONESHOT
BEQ GETKEY
OSHOTW: LDA KEYBD
BPL OSHOTW
BMI CHECK_KEY
GETKEY: LDA KEYBD
BMI CHECK_KEY
JMP ENTRY
CHECK_KEY:
KEY_SPACE: STA KEYBD_STROBE
CMP #160 ; KEY ' ' - PAUSE
BNE KEY_T
LDA ONESHOT
BNE JMPENTRY0
PAUSE: LDA KEYBD
BPL PAUSE
STA KEYBD_STROBE
JMPENTRY0: JMP ENTRY
KEY_T: CMP #212 ; KEY 'T' - TRIGGER
BNE KEY_AUTO
DEC TRIGGER
BEQ JMPENTRY1
KEY22: LDA #1
STA TRIGGER
JMPENTRY1: JMP ENTRY
KEY_AUTO: CMP #193 ; KEY 'A' - AUTOTRIGGER
BNE KEY_O
DEC AUTOTRIGGER
BEQ JMPENTRY2
LDA #1
STA AUTOTRIGGER
JMPENTRY2: JMP ENTRY
KEY_O: CMP #207 ; KEY 'O' - ONE SHOT
BNE KEY4
DEC ONESHOT
BEQ JMPENTRY3
KEY32: LDA #1
STA ONESHOT
JMPENTRY3: JMP ENTRY
KEY4: CMP #205 ; KEY 'M' - MEASUREMENT
BEQ MEASUREMENT_MODE
QUIT: STA KEYBD_STROBE
LDA PAGE1
JSR TEXT_MODE
JSR PRINT_TITLE
JMP WARM
RTS
GRATICULA: RTS
MEASUREMENT_MODE:
STA KEYBD_STROBE
LDA PAGE1
JSR TEXT_MODE
CAPTURE_START:
LDY #0
PSYNC1: BIT TAPEIN
BMI PSYNC1
PSYNC2: BIT TAPEIN
BPL PSYNC2
PSYNC: BIT TAPEIN
BMI PSYNC
PLOOP: INY ; 2 cycles
BIT TAPEIN ; 4 cycles
BPL PLOOP ; 2 +1 if branch, +1 if in another page
TYA
BMI PSYNC ; don't show values > 128
JSR PRBYTE
JSR CROUT
LDA KEYBD
BPL CAPTURE_START
STA KEYBD_STROBE
CMP #160 ; KEY ' ' - PAUSE
BEQ WAIT_KEY
JMP ENDBAS ; RESTART GRAPHICS MODE
WAIT_KEY: LDA KEYBD
BPL WAIT_KEY
STA KEYBD_STROBE
JMP CAPTURE_START
PRINT_TITLE:
LDA #<TITLE_MSG1
LDY #>TITLE_MSG1
JSR PRINT
JSR CROUT
LDA #<TITLE_MSG2
LDY #>TITLE_MSG2
JMP PRINT ; RTS/returns from there
PRINT:
STA POINTER
STY POINTER+1
LDY #0
LDA (POINTER),y ; load initial char
PRINT1: ORA #$80
JSR COUT
INY
LDA (POINTER),y
BNE PRINT1
RTS
TITLE_MSG1: .asciiz "APPLE II CASSETTE-SCOPE"
TITLE_MSG2: .asciiz "by JORGE CHAMORRO, THORSTEN BREHM"
@xk
Copy link

xk commented Jun 12, 2019

Very cool! With credits and all! Where are you from, thorsten?

@ThorstenBr
Copy link
Author

Germany... Still firing up and messing a bit with my very first computer every now and then. An Apple IIe - which still just works, after all these years...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment