From cfc36d98c01fa82cdf82e9690f5bd0d734636ec7 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 20 Apr 2018 15:54:13 -0400 Subject: [PATCH] chiptune_debug: add the code I'm using to debug the problem --- chiptune_debug/Makefile | 36 +++++ chiptune_debug/NOTES | 19 +++ chiptune_debug/chiptune_empty.dsk | Bin 0 -> 143360 bytes chiptune_debug/chiptune_player.s | 134 +++++++++++++++ chiptune_debug/interrupt_handler.s | 164 +++++++++++++++++++ chiptune_debug/mockingboard_a.s | 144 +++++++++++++++++ chiptune_debug/sdemo.raw | Bin 0 -> 10752 bytes chiptune_debug/zp.inc | 251 +++++++++++++++++++++++++++++ 8 files changed, 748 insertions(+) create mode 100644 chiptune_debug/Makefile create mode 100644 chiptune_debug/NOTES create mode 100644 chiptune_debug/chiptune_empty.dsk create mode 100644 chiptune_debug/chiptune_player.s create mode 100644 chiptune_debug/interrupt_handler.s create mode 100644 chiptune_debug/mockingboard_a.s create mode 100644 chiptune_debug/sdemo.raw create mode 100644 chiptune_debug/zp.inc diff --git a/chiptune_debug/Makefile b/chiptune_debug/Makefile new file mode 100644 index 00000000..f4a51d18 --- /dev/null +++ b/chiptune_debug/Makefile @@ -0,0 +1,36 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +PNG2GR = ../gr-utils/png2gr + +all: chiptune_debug.dsk + +chiptune_debug.dsk: CHIPTUNE_IRQ CHIPTUNE_NOIRQ ./sdemo.raw + cp chiptune_empty.dsk chiptune_debug.dsk + $(DOS33) -y chiptune_debug.dsk BSAVE -a 0x0C00 CHIPTUNE_IRQ + $(DOS33) -y chiptune_debug.dsk BSAVE -a 0x0C00 CHIPTUNE_NOIRQ + + +CHIPTUNE_IRQ: chiptune_irq.o + ld65 -o CHIPTUNE_IRQ chiptune_irq.o -C ../linker_scripts/apple2_c00.inc + +chiptune_irq.o: chiptune_player.s \ + mockingboard_a.s \ + interrupt_handler.s \ + zp.inc + ca65 -o chiptune_irq.o chiptune_player.s -l chiptune_irq.lst + +CHIPTUNE_NOIRQ: chiptune_noirq.o + ld65 -o CHIPTUNE_NOIRQ chiptune_noirq.o -C ../linker_scripts/apple2_c00.inc + +chiptune_noirq.o: chiptune_player.s \ + mockingboard_a.s \ + interrupt_handler.s \ + zp.inc + ca65 -D NOIRQ=1 -o chiptune_noirq.o chiptune_player.s -l chiptune_noirq.lst + + +clean: + rm -f *~ TITLE.GR *.o *.lst \ + CHIPTUNE_PLAYER CHIPTUNE_IRQ CHIPTUNE_NOIRQ + diff --git a/chiptune_debug/NOTES b/chiptune_debug/NOTES new file mode 100644 index 00000000..dee528be --- /dev/null +++ b/chiptune_debug/NOTES @@ -0,0 +1,19 @@ +note: pausing writes out zeros, doesn't restore previous values + which is noticable + + +doubling length of writes: still issue +removing rasterbars: still issue +removing volume bars: still issue +remove time update: still issue +remove dead code: still issue +remove title screen: still issue +remove all graphics calls: still issue +remove memory shuffling in back:still issue +remove keyboard: still issue +remove all non-irq code: still issue +remove all text print code still issue +remove multi file (down to 973) still issue +remove dos33 code still issue +remove lz4 code still issue +remove interrupt driven still issue!? diff --git a/chiptune_debug/chiptune_empty.dsk b/chiptune_debug/chiptune_empty.dsk new file mode 100644 index 0000000000000000000000000000000000000000..e3e2418275c6d7c4b5535241a364778f29c87819 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/chiptune_debug/chiptune_player.s b/chiptune_debug/chiptune_player.s new file mode 100644 index 00000000..61d6f90d --- /dev/null +++ b/chiptune_debug/chiptune_player.s @@ -0,0 +1,134 @@ +; VMW Chiptune Player + +.include "zp.inc" + + ;============================= + ; Setup + ;============================= + + ; init variables + + lda #0 + sta DONE_PLAYING + sta MB_CHUNK_OFFSET + + jsr mockingboard_detect_slot4 ; call detection routine + + ;============================ + ; Init the Mockingboard + ;============================ + + jsr mockingboard_init + jsr reset_ay_both + jsr clear_ay_both + + ;========================= + ; Setup Interrupt Handler + ;========================= + ; Vector address goes to 0x3fe/0x3ff + ; FIXME: should chain any existing handler + +.ifdef NOIRQ +.else + lda #interrupt_handler + sta $03ff +.endif + + ;============================ + ; Enable 50Hz clock on 6522 + ;============================ +.ifdef NOIRQ +.else + sei ; disable interrupts just in case + + lda #$40 ; Continuous interrupts, don't touch PB7 + sta $C40B ; ACR register + lda #$7F ; clear all interrupt flags + sta $C40E ; IER register (interrupt enable) + + lda #$C0 + sta $C40D ; IFR: 1100, enable interrupt on timer one oflow + sta $C40E ; IER: 1100, enable timer one interrupt + + lda #$E7 + sta $C404 ; write into low-order latch + lda #$4f + sta $C405 ; write into high-order latch, + ; load both values into counter + ; clear interrupt and start counting + + ; 4fe7 / 1e6 = .020s, 50Hz +.endif + + ;================== + ; load first song + ;================== + + jsr new_song + + ;============================ + ; Enable 6502 interrupts + ;============================ + +.ifdef NOIRQ +.else + cli ; clear interrupt mask +.endif + + ;============================ + ; Loop forever + ;============================ +main_loop: + +.ifdef NOIRQ + jsr interrupt_handler + + lda #85 + jsr WAIT ; wait 20ms-xms +.else +.endif + jmp main_loop + + + ;================= + ; load a new song + ;================= + +new_song: + + ;========================= + ; Init Variables + ;========================= + + lda #$0 + sta MB_CHUNK_OFFSET + lda #3 + sta CHUNKSIZE + + ;=========================== + ; Load in KRW file + ;=========================== + + lda #UNPACK_BUFFER + sta INH + + ; Decompress first chunks + + lda #$3 + sta CHUNKSIZE + + rts + +;========= +;routines +;========= +.include "mockingboard_a.s" +.include "interrupt_handler.s" + +.align 256 +UNPACK_BUFFER: +.incbin "sdemo.raw" diff --git a/chiptune_debug/interrupt_handler.s b/chiptune_debug/interrupt_handler.s new file mode 100644 index 00000000..8c30f67d --- /dev/null +++ b/chiptune_debug/interrupt_handler.s @@ -0,0 +1,164 @@ + ;================================ + ;================================ + ; mockingboard interrupt handler + ;================================ + ;================================ + +interrupt_handler: + pha ; save A ; 3 + ; Should we save X and Y too? + +.ifdef NOIRQ +.else + bit $C404 ; clear 6522 interrupt by reading T1C-L ; 4 +.endif + +mb_play_music: + + + ;====================================== + ; Write frames to Mockingboard + ;====================================== + ; actually plays frame loaded at end of + ; last interrupt, so 20ms behind? + +mb_write_frame: + + + ldx #0 ; set up reg count ; 2 + ;============ + ; 2 + + ;================================== + ; loop through the 14 registers + ; reading the value, then write out + ;================================== + ; inlined "write_ay_both" to save up to 156 (12*13) cycles + ; unrolled + +mb_write_loop: + lda REGISTER_DUMP,X ; load register value ; 4 + cmp REGISTER_OLD,X ; compare with old values ; 4 + beq mb_no_write ; 3/2nt + ;============= + ; typ 11 + + ; special case R13. If it is 0xff, then don't update + ; otherwise might spuriously reset the envelope settings + + cpx #13 ; 2 + bne mb_not_13 ; 3/2nt + cmp #$ff ; 2 + beq mb_skip_13 ; 3/2nt + ;============ + ; typ 5 +mb_not_13: + + + ; address + stx MOCK_6522_ORA1 ; put address on PA1 ; 4 + stx MOCK_6522_ORA2 ; put address on PA2 ; 4 + lda #MOCK_AY_LATCH_ADDR ; latch_address for PB1 ; 2 + sta MOCK_6522_ORB1 ; latch_address on PB1 ; 4 + sta MOCK_6522_ORB2 ; latch_address on PB2 ; 4 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_ORB1 ; 4 + sta MOCK_6522_ORB2 ; 4 + + ; value + lda REGISTER_DUMP,X ; load register value ; 4 + sta MOCK_6522_ORA1 ; put value on PA1 ; 4 + sta MOCK_6522_ORA2 ; put value on PA2 ; 4 + lda #MOCK_AY_WRITE ; ; 2 + sta MOCK_6522_ORB1 ; write on PB1 ; 4 + sta MOCK_6522_ORB2 ; write on PB2 ; 4 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_ORB1 ; 4 + sta MOCK_6522_ORB2 ; 4 + ;=========== + ; 62 +mb_no_write: + inx ; point to next register ; 2 + cpx #14 ; if 14 we're done ; 2 + bmi mb_write_loop ; otherwise, loop ; 3/2nt + ;============ + ; 7 +mb_skip_13: + + + ;===================================== + ; Copy registers to old + ;===================================== + ldx #13 ; 2 +mb_reg_copy: + lda REGISTER_DUMP,X ; load register value ; 4 + sta REGISTER_OLD,X ; compare with old values ; 4 + dex ; 2 + bpl mb_reg_copy ; 2nt/3 + ;============= + ; 171 + + ;=================================== + ; Load all 14 registers in advance + ;=================================== + ; note, assuming not cross page boundary, not any slower + ; then loading from zero page? + +mb_load_values: + + ldx #0 ; set up reg count ; 2 + ldy MB_CHUNK_OFFSET ; get chunk offset ; 3 + ;============= + ; 5 + +mb_load_loop: + lda (INL),y ; load register value ; 5 + sta REGISTER_DUMP,X ; 4 + ;============ + ; 9 + ;==================== + ; point to next page + ;==================== + + clc ; point to next interleaved ; 2 + lda INH ; page by adding CHUNKSIZE (3/1); 3 + adc CHUNKSIZE ; 3 + sta INH ; 3 + + inx ; point to next register ; 2 + cpx #14 ; if 14 we're done ; 2 + bmi mb_load_loop ; otherwise, loop ; 3/2nt + ;============ + ; 18 + + + + ;============================================== + ; incremement offset. If 0 move to next chunk + ;============================================== + +increment_offset: + + inc MB_CHUNK_OFFSET ; increment offset ; 5 + + lda #0 ; 2 + clc ; 2 + adc #>UNPACK_BUFFER ; in proper chunk 1 or 2 ; 2 + sta INH ; update r0 pointer ; 3 + + + + ;================================= + ; Finally done with this interrupt + ;================================= + +done_interrupt: + pla ; restore a ; 4 +.ifdef NOIRQ + rts +.else + rti ; return from interrupt ; 6 +.endif + +REGISTER_OLD: + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/chiptune_debug/mockingboard_a.s b/chiptune_debug/mockingboard_a.s new file mode 100644 index 00000000..926bb29c --- /dev/null +++ b/chiptune_debug/mockingboard_a.s @@ -0,0 +1,144 @@ +; left speaker +MOCK_6522_ORB1 EQU $C400 ; 6522 #1 port b data +MOCK_6522_ORA1 EQU $C401 ; 6522 #1 port a data +MOCK_6522_DDRB1 EQU $C402 ; 6522 #1 data direction port B +MOCK_6522_DDRA1 EQU $C403 ; 6522 #1 data direction port A + +; right speaker +MOCK_6522_ORB2 EQU $C480 ; 6522 #2 port b data +MOCK_6522_ORA2 EQU $C481 ; 6522 #2 port a data +MOCK_6522_DDRB2 EQU $C482 ; 6522 #2 data direction port B +MOCK_6522_DDRA2 EQU $C483 ; 6522 #2 data direction port A + +; AY-3-8910 commands on port B +; RESET BDIR BC1 +MOCK_AY_RESET EQU $0 ; 0 0 0 +MOCK_AY_INACTIVE EQU $4 ; 1 0 0 +MOCK_AY_READ EQU $5 ; 1 0 1 +MOCK_AY_WRITE EQU $6 ; 1 1 0 +MOCK_AY_LATCH_ADDR EQU $7 ; 1 1 1 + + + ;======================== + ; Mockingboard Init + ;======================== + ; Initialize the 6522s + ; set the data direction for all pins of PortA/PortB to be output + +mockingboard_init: + lda #$ff ; all output (1) + sta MOCK_6522_DDRB1 + sta MOCK_6522_DDRA1 + sta MOCK_6522_DDRB2 + sta MOCK_6522_DDRA2 + rts + + ;====================== + ; Reset Left AY-3-8910 + ;====================== +reset_ay_both: + lda #MOCK_AY_RESET + sta MOCK_6522_ORB1 + lda #MOCK_AY_INACTIVE + sta MOCK_6522_ORB1 + + ;====================== + ; Reset Right AY-3-8910 + ;====================== +;reset_ay_right: + lda #MOCK_AY_RESET + sta MOCK_6522_ORB2 + lda #MOCK_AY_INACTIVE + sta MOCK_6522_ORB2 + rts + + +; Write sequence +; Inactive -> Latch Address -> Inactive -> Write Data -> Inactive + + ;========================================= + ; Write Right/Left to save value AY-3-8910 + ;========================================= + ; register in X + ; value in MB_VALUE + +write_ay_both: + ; address + stx MOCK_6522_ORA1 ; put address on PA1 ; 3 + stx MOCK_6522_ORA2 ; put address on PA2 ; 3 + lda #MOCK_AY_LATCH_ADDR ; latch_address on PB1 ; 2 + sta MOCK_6522_ORB1 ; latch_address on PB1 ; 3 + sta MOCK_6522_ORB2 ; latch_address on PB2 ; 3 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_ORB1 ; 3 + sta MOCK_6522_ORB2 ; 3 + + ; value + lda MB_VALUE ; 3 + sta MOCK_6522_ORA1 ; put value on PA1 ; 3 + sta MOCK_6522_ORA2 ; put value on PA2 ; 3 + lda #MOCK_AY_WRITE ; ; 2 + sta MOCK_6522_ORB1 ; write on PB1 ; 3 + sta MOCK_6522_ORB2 ; write on PB2 ; 3 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_ORB1 ; 3 + sta MOCK_6522_ORB2 ; 3 + + rts ; 6 + ;=========== + ; 53 + ;======================================= + ; clear ay -- clear all 14 AY registers + ; should silence the card + ;======================================= +clear_ay_both: + ldx #14 + lda #0 + sta MB_VALUE +clear_ay_left_loop: + jsr write_ay_both + dex + bpl clear_ay_left_loop + rts + + + + ;======================================= + ; Detect a Mockingboard card in Slot4 + ;======================================= + ; Based on code from the French Touch "Pure Noise" Demo + ; Attempts to time an instruction sequence with a 6522 + ; + ; MB_ADDRL:MB_ADDRH has address of Mockingboard + ; returns X=0 if not found, X=1 if found + +mockingboard_detect_slot4: + lda #0 + sta MB_ADDRL + +mb4_detect_loop: ; self-modifying + lda #$04 ; we're only looking in Slot 4 + ora #$C0 ; make it start with C + sta MB_ADDRH + ldy #04 ; $CX04 + ldx #02 ; 2 tries? +mb4_check_cycle_loop: + lda (MB_ADDRL),Y ; timer 6522 (Low Order Counter) + ; count down + sta TEMP ; 3 cycles + lda (MB_ADDRL),Y ; + 5 cycles = 8 cycles + ; between the two accesses to the timer + sec + sbc TEMP ; subtract to see if we had 8 cycles + cmp #$f8 ; -8 + bne mb4_not_in_this_slot + dex ; decrement, try one more time + bne mb4_check_cycle_loop ; loop detection + inx ; Mockingboard found (X=1) +done_mb4_detect: + rts ; return + +mb4_not_in_this_slot: + ldx #00 + beq done_mb4_detect + diff --git a/chiptune_debug/sdemo.raw b/chiptune_debug/sdemo.raw new file mode 100644 index 0000000000000000000000000000000000000000..dafe98567a78a4b6bef591a6f3688d25b12d0214 GIT binary patch literal 10752 zcmeH~KW@S>6vhjLkiYF5AyLFov2-z_>JUVwu+hPcbm>ugl%AnNojX>jhv*3^)DuuA zu3Tg18ITe}#rx#gU*5ByrJo6sqv%ilPE>fi>O`fselIGuUH76wTEE-QZzV9753yAE ztaz#LS@A;Pvm*KMyX`X+5=p=K~tS1hhbjE3aBP zEwF8Yl3y$qFYI}RMlhi)czk+(`&?g+)v=;u$8C|oK?&3{)qmCam1WIhLPvzg0~!;f z7Zdg~_c57{$TS{IV`B7T!hU9!5IP|=8PJ3ny_m3{c}U27LgvX}o)DuK6Y|Y$JfwF+ zI=-Rf;f6>46Vr(pnak&rk3CzSrZ$*MXK~Pv5H~{tNB{{SfukXCi$Ve?OrWq2u_jdl ze63OE*O0WAeBElK_Y&Uo8;ax`O)I^v@IJe@Sa#DAl6k&R-_qchcIlIeV<_hNQzpXF*YSC6eAPB-R zU>^%Kf(dAW5?5Zea#~>90wu4!YUQ-RwgpOFdDY5k0boIR!E~M~+!PB0B`U=F8C{42 i6ff#Xus$aVaj4)g54S`DNB{{Sfny-BMj?UICGZ0;az_9F literal 0 HcmV?d00001 diff --git a/chiptune_debug/zp.inc b/chiptune_debug/zp.inc new file mode 100644 index 00000000..fff64073 --- /dev/null +++ b/chiptune_debug/zp.inc @@ -0,0 +1,251 @@ +.define EQU = + +LZ4_SRC EQU $00 +LZ4_DST EQU $02 +LZ4_END EQU $04 +COUNT EQU $06 +DELTA EQU $08 + +;; Zero page monitor routines addresses + +WNDLFT EQU $20 +WNDWDTH EQU $21 +WNDTOP EQU $22 +WNDBTM EQU $23 +CH EQU $24 +CV EQU $25 +GBASL EQU $26 +GBASH EQU $27 +BASL EQU $28 +BASH EQU $29 +H2 EQU $2C +V2 EQU $2D +MASK EQU $2E +COLOR EQU $30 + ;INVFLG EQU $32 + +; dos33 zero page = 26-2f, 35-38, 3e 3f 40-4d +; overlap applesoft 67-6a,6f,70,af,b0,ca-cd,d8 + + +; DOS33: Confirmed kills $68 + +RWTSL EQU $60 +RWTSH EQU $61 +DOSBUFL EQU $62 +DOSBUFH EQU $63 +FILEML EQU $64 +FILEMH EQU $65 + ;TURNING EQU $60 + ;SCREEN_X EQU $61 ; not used? + ;SCREEN_Y EQU $62 + + + ;ANGLE EQU $63 + ;HORIZ_SCALE_I EQU $64 + ;HORIZ_SCALE_F EQU $65 + ;FACTOR_I EQU $66 + ;FACTOR_F EQU $67 + ;DX_I EQU $68 + ;DX_F EQU $69 + ;SPACEX_I EQU $6A + ;SPACEX_F EQU $6B + ;CX_I EQU $6C + ;CX_F EQU $6D + ;DY_I EQU $6E + ;DY_F EQU $6F + +REGISTER_DUMP EQU $70 +A_FINE_TONE EQU $70 +A_COARSE_TONE EQU $71 +B_FINE_TONE EQU $72 +B_COARSE_TONE EQU $73 +C_FINE_TONE EQU $74 +C_COARSE_TONE EQU $75 +NOISE EQU $76 +ENABLE EQU $77 +A_VOLUME EQU $78 +B_VOLUME EQU $79 +C_VOLUME EQU $7A +ENVELOPE_FINE EQU $7B +ENVELOPE_COARSE EQU $7C +ENVELOPE_SHAPE EQU $7D +COPY_OFFSET EQU $7E +DECODER_STATE EQU $7F + ;SPACEY_I EQU $70 + ;SPACEY_F EQU $71 + ;CY_I EQU $72 + ;CY_F EQU $73 + ;TEMP_I EQU $74 + ;TEMP_F EQU $75 + ;DISTANCE_I EQU $76 + ;DISTANCE_F EQU $77 + ;SPACEZ_I EQU $78 + ;SPACEZ_F EQU $79 + ;DRAW_SPLASH EQU $7A + ;SPEED EQU $7B + ;SPLASH_COUNT EQU $7C + ;OVER_LAND EQU $7D + ;NUM1L EQU $7E + ;NUM1H EQU $7F +CHUNKSIZE EQU $80 +LZ4_DONE EQU $81 +DECODE_ERROR EQU $82 + +A_COLOR EQU $83 +B_COLOR EQU $84 +C_COLOR EQU $85 +COPY_TIME EQU $86 +DECOMPRESS_TIME EQU $87 +TIME_TAKEN EQU $88 +SCREEN_Y EQU $89 +WHICH_FILE EQU $8A + ;NUM2L EQU $80 + ;NUM2H EQU $81 + ;RESULT EQU $82 ; 83,84,85 + ;NEGATE EQU $86 ; UNUSED? + ;LAST_SPACEX_I EQU $87 + ;LAST_SPACEY_I EQU $88 + ;LAST_MAP_COLOR EQU $89 + ;DRAW_SKY EQU $8A +COLOR_MASK EQU $8B +RASTERBARS_ON EQU $8C + ;KEY_COUNT EQU $8C + ;KEY_OFFSET EQU $8D + ;DRAW_BLUE_SKY EQU $8E +RANDOM_POINTER EQU $8F +FRAME_COUNT EQU $90 +MB_VALUE EQU $91 +;MB_CHUNK EQU $92 +MB_ADDRL EQU $91 +MB_ADDRH EQU $92 +DONE_PLAYING EQU $93 +;MB_FRAME_DIFF EQU $94 +MB_CHUNK_OFFSET EQU $94 + ;LZSS_RL EQU $95 + ;LZSS_RH EQU $96 + ;LZSS_COUNT EQU $97 + ;LZSS_MASK EQU $98 + ;LZSS_ENDL EQU $99 + ;LZSS_ENDH EQU $9A + ;MB_FRAME_DIFF2 EQU $9F + +; More zero-page addresses +; we try not to conflict with anything DOS, MONITOR or BASIC related + + ;COLOR1 EQU $E0 +COLOR2 EQU $E1 + ;MATCH EQU $E2 +XX EQU $E3 + ;YY EQU $E4 + ;SHIPY EQU $E4 + ;YADD EQU $E5 + ;LOOP EQU $E6 + ;MEMPTRL EQU $E7 + ;MEMPTRH EQU $E8 + ;NAMEL EQU $E9 + ;NAMEH EQU $EA + ;NAMEX EQU $EB + ;CHAR EQU $EC +DISP_PAGE EQU $ED +DRAW_PAGE EQU $EE + + ;FIRST EQU $F0 +LASTKEY EQU $F1 + ;PADDLE_STATUS EQU $F2 +XPOS EQU $F3 +YPOS EQU $F4 +TEMP EQU $FA + ;RUN EQU $FA + ;TEMP2 EQU $FB +TEMPY EQU $FB +INL EQU $FC +INH EQU $FD +OUTL EQU $FE +OUTH EQU $FF + + + +KEYPRESS EQU $C000 +KEYRESET EQU $C010 + +;; SOFT SWITCHES +CLR80COL EQU $C000 ; PAGE0/PAGE1 normal +SET80COL EQU $C001 ; PAGE0/PAGE1 switches PAGE0 in Aux instead +EIGHTYCOL EQU $C00D +SPEAKER EQU $C030 +SET_GR EQU $C050 +SET_TEXT EQU $C051 +FULLGR EQU $C052 +TEXTGR EQU $C053 +PAGE0 EQU $C054 +PAGE1 EQU $C055 +LORES EQU $C056 ; Enable LORES graphics +HIRES EQU $C057 ; Enable HIRES graphics +AN3 EQU $C05E ; Annunciator 3 + +PADDLE_BUTTON0 EQU $C061 +PADDL0 EQU $C064 +PTRIG EQU $C070 + +;; BASIC ROUTINES + +NORMAL EQU $F273 + +;; MONITOR ROUTINES + +HLINE EQU $F819 ;; HLINE Y,$2C at A +VLINE EQU $F828 ;; VLINE A,$2D at Y +CLRSCR EQU $F832 ;; Clear low-res screen +CLRTOP EQU $F836 ;; clear only top of low-res screen +SETCOL EQU $F864 ;; COLOR=A +TEXT EQU $FB36 +TABV EQU $FB5B ;; VTAB to A +BASCALC EQU $FBC1 ;; +VTAB EQU $FC22 ;; VTAB to CV +HOME EQU $FC58 ;; Clear the text screen +WAIT EQU $FCA8 ;; delay 1/2(26+27A+5A^2) us +SETINV EQU $FE80 ;; INVERSE +SETNORM EQU $FE84 ;; NORMAL +COUT EQU $FDED ;; output A to screen +COUT1 EQU $FDF0 ;; output A to screen + + + + + + +COLOR_BLACK EQU 0 +COLOR_RED EQU 1 +COLOR_DARKBLUE EQU 2 +COLOR_PURPLE EQU 3 +COLOR_DARKGREEN EQU 4 +COLOR_GREY EQU 5 +COLOR_MEDIUMBLUE EQU 6 +COLOR_LIGHTBLUE EQU 7 +COLOR_BROWN EQU 8 +COLOR_ORANGE EQU 9 +COLOR_GREY2 EQU 10 +COLOR_PINK EQU 11 +COLOR_LIGHTGREEN EQU 12 +COLOR_YELLOW EQU 13 +COLOR_AQUA EQU 14 +COLOR_WHITE EQU 15 + +COLOR_BOTH_BLACK EQU $00 +COLOR_BOTH_RED EQU $11 +COLOR_BOTH_DARKBLUE EQU $22 +COLOR_BOTH_DARKGREEN EQU $44 +COLOR_BOTH_GREY EQU $55 +COLOR_BOTH_MEDIUMBLUE EQU $66 +COLOR_BOTH_LIGHTBLUE EQU $77 +COLOR_BOTH_BROWN EQU $88 +COLOR_BOTH_ORANGE EQU $99 +COLOR_BOTH_PINK EQU $BB +COLOR_BOTH_LIGHTGREEN EQU $CC +COLOR_BOTH_YELLOW EQU $DD +COLOR_BOTH_AQUA EQU $EE +COLOR_BOTH_WHITE EQU $FF + +AUX_BOTH_MEDIUMBLUE EQU $33 ; 0011 0011 +AUX_BOTH_GREY EQU $AA ; 1010 1010