update to 23+FPS, self-loading

This commit is contained in:
Charles Mangin 2019-01-08 15:17:35 -05:00 committed by GitHub
parent 21aa3ef6eb
commit 4525ff15b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 181 additions and 100 deletions

View File

@ -4,11 +4,8 @@
* Low res monochrome image display
*
* to do:
* detect virtualII vs openemu or real hardware
* (or other emulator)
*
* further optimization, to speed up framerate
*
* determine frame length from data length
**************************************************
* Variables
**************************************************
@ -27,6 +24,7 @@ IMGHI EQU $CE ; image data addres, HI
IMGLO EQU $CD ; image data addres, LO
FRAMENUM EQU $1D ; which frame of the anim
FRAMES EQU $1E ; total frames
**************************************************
* Apple Standard Memory Locations
@ -51,7 +49,7 @@ RAMWRTMAIN EQU $C004
SETAN3 EQU $C05E ;Set annunciator-3 output to 0
SET80VID EQU $C00D ;enable 80-column display mode (WR-only)
CLR80VID EQU $C00C
HOME EQU $FC58 ; clear the text screen
HOME EQU $FC58 ; clear the text screen
CH EQU $24 ; cursor Horiz
CV EQU $25 ; cursor Vert
VTAB EQU $FC22 ; Sets the cursor vertical position (from CV)
@ -62,14 +60,22 @@ STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low
ALTTEXT EQU $C055
ALTTEXTOFF EQU $C054
ROMINIT EQU $FB2F
ROMSETKBD EQU $FE89
ROMSETVID EQU $FE93
ROMINIT EQU $FB2F
ROMSETKBD EQU $FE89
ROMSETVID EQU $FE93
ALTCHAR EQU $C00F ; enables alternative character set - mousetext
ALTCHAR EQU $C00F ; enables alternative character set - mousetext
BLINK EQU $F3
SPEED EQU $F1
BLINK EQU $F3
SPEED EQU $F1
BELL EQU $FF3A ; Monitor BELL routine
CROUT EQU $FD8E ; Monitor CROUT routine
PRBYTE EQU $FDDA ; Monitor PRBYTE routine
MLI EQU $BF00 ; ProDOS system call
OPENCMD EQU $C8 ; OPEN command index
READCMD EQU $CA ; READ command index
CLOSECMD EQU $CC ; CLOSE command index
**************************************************
@ -78,6 +84,10 @@ SPEED EQU $F1
ORG $2000 ; PROGRAM DATA STARTS AT $2000
JSR BLOAD ; BLOAD DATA
JSR HOWMANYFRAMES ; how big is the animation data?
JSR ROMSETVID ; Init char output hook at $36/$37
JSR ROMSETKBD ; Init key input hook at $38/$39
JSR ROMINIT ; GR/HGR off, Text page 1
@ -94,35 +104,35 @@ SPEED EQU $F1
JSR CLRLORES ; clear screen
JMP MAIN
END STA STROBE
STA ALTTEXTOFF
STA TXTSET
JSR HOME
RTS ; END
JSR EMULATORCHECK ; check for Virtual II
JMP MAIN ; running in VII, go ahead.
JSR COLORSWAP ; otherwise, swap the color table
*** to do
**************************************************
* MAIN LOOP
**************************************************
MAIN
LDA #$40 ; image data starts at $4000
LDA DATAHI ; image data starts at end of code.
STA IMGHI
LDA #$00
LDA DATALO
STA IMGLO
LDA #$0
STA FRAMENUM ; frame #0
NEXTFRAME LDA #$00
STA PLOTROW
TAY ; Y IS PLOTCOLUMN
LDY #$27 ; Y IS PLOTCOLUMN
MAINLOOP
LDA (IMGLO) ; load byte at IMGLO,IMGHI
LDA (IMGLO),Y ; load byte at IMGLO,IMGHI + COLUMN
; look up color from lookup table
TAX
LDA COLORTABLEV2,X
LDA COLORTABLE,X
STA CHAR ; put that converted BYTE into CHAR
PLOTCHAR
@ -135,27 +145,137 @@ LOADQUICK
LDA CHAR
STA ($0),Y ; store byte at LINE + COLUMN
INC IMGLO ; increment IMGLO
BNE INCCOLUMN ; not rolled over, skip
INC IMGHI ; if IMGLO == 0 increment IMGHI
INCCOLUMN ; next column of 2 pixels
INY ; Y IS PLOTCOLUMN
CPY #$28 ; loop at col 40
BNE MAINLOOP
LDY #$0 ; reset to col 0
DEY ; Y IS PLOTCOLUMN
BPL MAINLOOP
LDY #$27 ; reset to col 0
INCROW INC PLOTROW
LDA PLOTROW
LDA IMGLO
CLC
ADC #$28
STA IMGLO
BCS INCHI
CMPROW LDA PLOTROW
CMP #$18
BNE MAINLOOP
LOOPTY INC FRAMENUM
LDA FRAMENUM
CMP #$08 ; *** how many frames? ***
BEQ MAIN
JMP NEXTFRAME ; wait for input...
CMP FRAMES ; *** how many frames? ***
BEQ MAIN ; start over at frame 1
JMP NEXTFRAME ; next frame in sequence
INCHI INC IMGHI
BCS CMPROW
**************************************************
* Check to see if I'm running in Virtual II or
* real hardware (or a different emulator)
* CARRY SET == running in VII
**************************************************
EMULATORCHECK
LDX #$00
CLC
CHKVII
INX
BEQ FOUNDVII
LDA $C04F
BEQ CHKVII
CLC ;set return value: no Virtual II
RTS
FOUNDVII
SEC ;set return value: found Virtual II
RTS
**************************************************
* Swap the color table with one for real
* hardware/OpenEmulator
**************************************************
COLORSWAP
LDX #$00
SWAPLOOP LDA ALTCOLORTABLE,X
STA COLORTABLE,X
INX
BNE SWAPLOOP
RTS
**************************************************
* Load "banana" into memory
*
**************************************************
BLOAD JSR OPEN ;open "DATA"
JSR READ
JSR ERROR
JSR CLOSE
JSR ERROR
RTS ;Otherwise done
OPEN JSR MLI ;Perform call
DB OPENCMD ;CREATE command number
DW OPENLIST ;Pointer to parameter list
JSR ERROR ;If error, display it
LDA REFERENCE
STA READLIST+1
STA CLOSELIST+1
RTS
READ JSR MLI
DB READCMD
DW READLIST
RTS
CLOSE JSR MLI
DB CLOSECMD
DW CLOSELIST
RTS
ERROR JSR PRBYTE ;Print error code
JSR BELL ;Ring the bell
JSR CROUT ;Print a carriage return
RTS
OPENLIST DB $03 ; parameter list for OPEN command
DW FILENAME
DB $00,$08 ; buffer at $800 ?
REFERENCE DB $00 ; reference to opened file
READLIST DB $04
DB $00 ; REFERENCE written here after OPEN
DB <BEGINDATA,>BEGINDATA ; write to end of code
DB $FF,$FF ; read as much as $FFFF - should error out with EOF before that.
TRANSFERRED DB $00,$00
CLOSELIST DB $01
DB $00
FILENAME DB ENDNAME-NAME ;Length of name
NAME ASC '/GREENSCALE/DATA' ;followed by the name
ENDNAME EQU *
**************************************************
* How many frames have transferred?
* up to 32 ($20) based on TRANSFERRED+1
**************************************************
HOWMANYFRAMES LDX #$00 ; X=0
LDA TRANSFERRED+1 ; LDA TRANSFERRED amt hi byte
HOWMANYLOOP CMP FRAMESTABLE,X ; compare A to FRAMESTABLE,X
BEQ HOWMANYSET ; if equal, X frames loaded.
INX
CPX $20
BEQ HOWMANYSET ; max 32 frames
JMP HOWMANYLOOP ; otherwise, INX, Loop
HOWMANYSET INX
STX FRAMES
RTS
**************************************************
* Data Tables
@ -167,7 +287,7 @@ LOOPTY INC FRAMENUM
*
**************************************************
COLORTABLEV2 HEX 00,02,06,01,04,05,08,03,0C,09,07,0A,0B,0E,0D,0F ; Low res colors from darkest to lightest for Virtual ][
COLORTABLE HEX 00,02,06,01,04,05,08,03,0C,09,07,0A,0B,0E,0D,0F ; Low res colors from darkest to lightest for Virtual ][
HEX 20,22,26,21,24,25,28,23,2C,29,27,2A,2B,2E,2D,2F
HEX 60,62,66,61,64,65,68,63,6C,69,67,6A,6B,6E,6D,6F
HEX 10,12,16,11,14,15,18,13,1C,19,17,1A,1B,1E,1D,1F
@ -184,14 +304,26 @@ COLORTABLEV2 HEX 00,02,06,01,04,05,08,03,0C,09,07,0A,0B,0E,0D,0F ; Low res colo
HEX D0,D2,D6,D1,D4,D5,D8,D3,DC,D9,D7,DA,DB,DE,DD,DF
HEX F0,F2,F6,F1,F4,F5,F8,F3,FC,F9,F7,FA,FB,FE,FD,FF
COLORTABLE HEX 00,02,01,04,08,03,06,0C,09,05,0A,07,0B,0E,0D,0F ; Same, for OpenEmulator, real hardware.
ALTCOLORTABLE HEX 00,02,01,04,08,03,06,0C,09,05,0A,07,0B,0E,0D,0F ; Same, for OpenEmulator, real hardware.
HEX 20,22,21,24,28,23,26,2C,29,25,2A,27,2B,2E,2D,2F
HEX 10,12,11,14,18,13,16,1C,19,15,1A,17,1B,1E,1D,1F
HEX 40,42,41,44,48,43,46,4C,49,45,4A,47,4B,4E,4D,4F
HEX 80,82,81,84,88,83,86,8C,89,85,8A,87,8B,8E,8D,8F
HEX 30,32,31,34,38,33,36,3C,39,35,3A,37,3B,3E,3D,3F
HEX 60,62,61,64,68,63,66,6C,69,65,6A,67,6B,6E,6D,6F
HEX C0,C2,C1,C4,C8,C3,C6,CC,C9,C5,CA,C7,CB,CE,CD,CF
HEX 90,92,91,94,98,93,96,9C,99,95,9A,97,9B,9E,9D,9F
HEX 50,52,51,54,58,53,56,5C,59,55,5A,57,5B,5E,5D,5F
HEX A0,A2,A1,A4,A8,A3,A6,AC,A9,A5,AA,A7,AB,AE,AD,AF
HEX 70,72,71,74,78,73,76,7C,79,75,7A,77,7B,7E,7D,7F
HEX B0,B2,B1,B4,B8,B3,B6,BC,B9,B5,BA,B7,BB,BE,BD,BF
HEX E0,E2,E1,E4,E8,E3,E6,EC,E9,E5,EA,E7,EB,EE,ED,EF
HEX D0,D2,D1,D4,D8,D3,D6,DC,D9,D5,DA,D7,DB,DE,DD,DF
HEX F0,F2,F1,F4,F8,F3,F6,FC,F9,F5,FA,F7,FB,FE,FD,FF
FRAMESTABLE HEX 03,07,0B,0F,12,16,1A,1E,21,25,29,2D,30,34,38,3C ; how many frames transferred? HI byte lookup table
HEX 3F,43,47,4B,4E,52,56,5A,5D,61,65,69,6C,70,74,78
**************************************************
* Lores/Text lines
@ -223,36 +355,6 @@ Lo22 equ $6d0
Lo23 equ $750
Lo24 equ $7d0
; alt text page lines
Alt01 equ $800
Alt02 equ $880
Alt03 equ $900
Alt04 equ $980
Alt05 equ $A00
Alt06 equ $A80
Alt07 equ $B00
Alt08 equ $B80
Alt09 equ $828
Alt10 equ $8a8
Alt11 equ $928
Alt12 equ $9a8
Alt13 equ $A28
Alt14 equ $Aa8
Alt15 equ $B28
Alt16 equ $Ba8
Alt17 equ $850
Alt18 equ $8d0
Alt19 equ $950
Alt20 equ $9d0
* the "plus four" lines
Alt21 equ $A50
Alt22 equ $Ad0
Alt23 equ $B50
Alt24 equ $Bd0
LoLineTable da Lo01,Lo02,Lo03,Lo04
da Lo05,Lo06,Lo07,Lo08
da Lo09,Lo10,Lo11,Lo12
@ -260,14 +362,6 @@ LoLineTable da Lo01,Lo02,Lo03,Lo04
da Lo17,Lo18,Lo19,Lo20
da Lo21,Lo22,Lo23,Lo24
; alt text page
AltLineTable da Alt01,Alt02,Alt03,Alt04
da Alt05,Alt06,Alt07,Alt08
da Alt09,Alt10,Alt11,Alt12
da Alt13,Alt14,Alt15,Alt16
da Alt17,Alt18,Alt19,Alt20
da Alt21,Alt22,Alt23,Alt24
** Here we split the table for an optimization
** We can directly get our line numbers now
@ -289,20 +383,7 @@ LoLineTableL db <Lo01,<Lo02,<Lo03
db <Lo19,<Lo20,<Lo21
db <Lo22,<Lo23,<Lo24
; alt text page
AltLineTableH db >Alt01,>Alt02,>Alt03
db >Alt04,>Alt05,>Alt06
db >Alt07,>Alt08,>Alt09
db >Alt10,>Alt11,>Alt12
db >Alt13,>Alt14,>Alt15
db >Alt16,>Alt17,>Alt18
db >Alt19,>Alt20,>Alt21
db >Alt22,>Alt23,>Alt24
AltLineTableL db <Alt01,<Alt02,<Alt03
db <Alt04,<Alt05,<Alt06
db <Alt07,<Alt08,<Alt09
db <Alt10,<Alt11,<Alt12
db <Alt13,<Alt14,<Alt15
db <Alt16,<Alt17,<Alt18
db <Alt19,<Alt20,<Alt21
db <Alt22,<Alt23,<Alt24
DATALO DB <BEGINDATA
DATAHI DB >BEGINDATA
BEGINDATA EQU *