From 6cf4a6d9890e0ac9bd6f421c00890cfc81db1fee Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 9 May 2023 15:25:45 +0200 Subject: [PATCH] Better C64 wait --- C64/lib/C64_ATARISYS.ASM | 282 +-------------------------------------- scorchC64.asm | 11 +- scorchC64.prg | Bin 39711 -> 39695 bytes 3 files changed, 3 insertions(+), 290 deletions(-) diff --git a/C64/lib/C64_ATARISYS.ASM b/C64/lib/C64_ATARISYS.ASM index 656ae8a..bb343bb 100644 --- a/C64/lib/C64_ATARISYS.ASM +++ b/C64/lib/C64_ATARISYS.ASM @@ -5,251 +5,8 @@ FAKEADDR EQU $0002 - -; -; OPERATING SYSTEM EQUATE FILE -; -; MODULE ORIGIN TABLE -; -; VECTOR TABLE -; -; HANDLER ENTRY POINTS ARE CALL- -; ED OUT IN THE FOLLOWING VECTOR -; TABLE. THESE ARE THE ADDRESSES -; MINUS ONE. -; -; EXAMPLE FOR EDITOR -; -; E400 OPEN -; 2 CLOSE -; 4 GET -; 6 PUT -; 8 STATUS -; A SPECIAL -; C JUMP TO POWER ON INIT -; F NOT USED -; -EDITRV EQU $E400 ;EDITOR -SCRENV EQU $E410 ;TV SCREEN -KEYBDV EQU $E420 ;KEYBOARD -PRINTV EQU $E430 ;PRINTER -CASETV EQU $E440 ;CASSETTE -; -; JUMP VECTOR TABLE -; -; THE FOLLOWING IS A TABLE OF -; JUMP INSTRUCTIONS TO VARIOUS -; ENTRY POINTS IN THE OPERATING -; SYSTEM -; -DISKIV EQU $E450 ;DISK INITIALIZATION -DSKINV EQU $E453 ;DISK INTERFACE -CIOV EQU $E456 ;CENTRAL I/O ROUTINE -SIOV EQU $E459 ;SERIAL I/O ROUTINE -SETVBV EQU $E45C ;SET SYSTEM TIMERS -SYSVBV EQU $E45F ;VBLANK CALCULATIONS -XITVBV EQU $E462 ;EXIT VBLANK -SIOINV EQU $E465 ;SIO INITIALIZATION -SENDEV EQU $E468 ;SEND ENABLE ROUTINE -INTINV EQU $E46B ;INTRPT HANDLER INIT -CIOINV EQU $E46E ;CIO INITIALIZATION -BLKBDV EQU $E471 ;BLACKBOARD MODE -WARMSV EQU $E474 ;WARM START VECTOR -COLDSV EQU $E477 ;COLD START VECTOR -RBLOKV EQU $E47A ;CASSETTE READ BLOCK -CSOPIV EQU $E47D ;CASSETTE INPUT OPEN -; -; VECTORS ADDED FOR 800XL -; -PUPDIV EQU $E480 ;POWER UP DISPLAY -SLFTSV EQU $E483 ;SELF TEST PROGRAM -PHENTV EQU $E486 ;UPLOADED HANDLER ENTER -PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK -PHINIV EQU $E48C ;UPLOADED HANDLER INIT -; -; OPERATING SYSTEM EQUATES -; -; COMMAND CODES FOR IOCBS -; -OPEN EQU $03 ;OPEN FOR I/O -GETREC EQU $05 ;GET RECORD (TEXT) -GETCHR EQU $07 ;GET CHARACTER(S) -PUTREC EQU $09 ;PUT RECORD (TEXT) -PUTCHR EQU $0B ;PUT CHARACTER(S) -CLOSE EQU $0C ;CLOSE DEVICE -STATIS EQU $0D ;STATUS REQUEST -SPECIL EQU $0E ;SPECIAL ENTRY COMMAND -; -; SPECIAL ENTRY COMMANDS -; -DRAWLN EQU $11 ;DRAW LINE -FILLIN EQU $12 ;FILL -RENAME EQU $20 ;RENAME DISK FILE -DELETE EQU $21 ;DELETE DISK FILE -FORMAT EQU $22 ;FORMAT DISK -LOCKFL EQU $23 ;LOCK FILE -UNLOCK EQU $24 ;UNLOCK FILE -POINT EQU $25 ;POINT SECTOR -NOTE EQU $26 ;NOTE SECTOR -IOCFRE EQU $FF ;IOCB "FREE" -; -; AUX1 EQUATES -; () INDICATES WHICH DEVICES -; -APPEND EQU $01 ;WR APPEND(D)-SCN RD(E) -DIRECT EQU $02 ;OPEN DIRECTORY(D) -OPNIN EQU $04 ;OPEN FOR INPUT(ALL) -OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL) -OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL) -MXDMOD EQU $10 ;OPEN MIXED MODE(E,S) -INSCLR EQU $20 ;OPEN W/O CLEAR(E,S) -; -; DEVICE NAMES -; -SCREDT EQU 'E' ;SCREEN EDITOR (R/W) -KBD EQU 'K' ;KEYBOARD (R ONLY) -DISPLY EQU 'S' ;SCREEN DISPLAY (R/W) -PRINTR EQU 'P' ;PRINTER (W ONLY) -CASSET EQU 'C' ;CASSETTE (R/W) -RS232 EQU 'R' ;MODEM (R/W) -DISK EQU 'D' ;DISK (R/W) -; -; -; -; OPERATING SYSTEM STATUS CODES -; -SUCCES EQU $01 ;SUCCESSFUL OPERATION -BRKABT EQU $80 ;BREAK KEY ABORT -PRVOPN EQU $81 ;IOCB ALREADY OPEN -NONDEV EQU $82 ;NON-EXISTANT DEVICE -WRONLY EQU $83 ;IOCB OPEN FOR W ONLY -NVALID EQU $84 ;INVALID COMMAND -NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN -BADIOC EQU $86 ;INVALID IOCB # -RDONLY EQU $87 ;IOCB OPEN FOR R ONLY -EOFERR EQU $88 ;END OF FILE -TRNRCD EQU $89 ;TRUNCATED RECORD -TIMOUT EQU $8A ;PERIPHERAL TIMEOUT -DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE -FRMERR EQU $8C ;SERIAL BUS FRAME ERR -CRSROR EQU $8D ;CURSOR OVERRANGE -OVRRUN EQU $8E ;SERIAL DATA OVERRUN -CHKERR EQU $8F ;SERIAL CHECKSUM ERR -DERRER EQU $90 ;PERIPHRAL DEVICE ERR -BADMOD EQU $91 ;BAD SCREEN MODE # -FNCNOT EQU $92 ;NONEXISTANT FUNCTION -SCRMEM EQU $93 ;SCREEN MEM TOO SMALL -; -; PAGE ZERO RAM ASSIGNMENTS -; -LNFLG EQU $00 ;LINBUG RAM -NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG -; -; THESE LOCATIONS NOT CLEARED -; -CASINI EQU $02 ;CASSETTE INIT LOC -RAMLO EQU $04 ;RAM POINTER MEM TST -TRAMSZ EQU $06 ;TEMP REG RAM SIZE -TSTDAT EQU $07 ;RAM TEST DATA REG -; -;CLEARED ON COLDSTART ONLY -; -WARMST EQU $08 ;WARM START FLAG -BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG -DOSVEC EQU $0A ;DOS START VECTOR -DOSINI EQU $0C ;DOS INIT ADDRESS -APPMHI EQU $0E ;APPL MEM HI LIMIT -; -;CLEARED ON COLD OR WARM START -; -POKMSK EQU $10 ;MASK POKEY IRQ -BRKKEY EQU $11 ;BREAK KEY FLAG +ATRACT EQU FAKEADDR RTCLOK EQU $12 ;REAL TIME CLOCK -BUFADR EQU $15 ;INDIRECT BUFF ADDR -ICCOMT EQU $17 ;COMMAND FOR VECTOR -DSKFMS EQU $18 ;FMS POINTER -DSKUTL EQU $1A ;DISK UTILITIES PTR -ABUFPT EQU $1C ;RESERVED -ICHIDZ EQU $20 ;HANDLER INDEX # -ICDNOZ EQU $21 ;DEVICE NUMBER -ICCOMZ EQU $22 ;COMMAND CODE -ICSTAZ EQU $23 ;STATUS RETURN -ICBALZ EQU $24 ;BUFFER ADDRESS -ICBAHZ EQU $25 -ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1 -ICPTHZ EQU $27 -ICBLLZ EQU $28 ;BUFFER LENGTH -ICBLHZ EQU $29 -ICAX1Z EQU $2A ;AUXILIARY BYTES -ICAX2Z EQU $2B -ICSPRZ EQU $2C ;SPARE BYTES -ICIDNO EQU $2E ;IOCB # X 16 -CIOCHR EQU $2F ;CIO CHARACTER BYTE -STATUS EQU $30 ;INTERNAL STATUS -CHKSUM EQU $31 ;CHECKSUM -BUFRLO EQU $32 ;DATA BUFFER LO BYTE -BUFRHI EQU $33 ;DATA BUFFER HI BYTE -BFENLO EQU $34 ;NEXT BYTE PAST DATA -BFENHI EQU $35 ;BUFFER (HI & LO) -LTEMP EQU $36 ;LOADER TEMP -BUFRFL EQU $38 ;DATA BUFFR FULL FLG -RECVDN EQU $39 ;RECIEVE DONE FLAG -XMTDON EQU $3A ;XMIT DONE FLAG -CHKSNT EQU $3B ;CHECKSUM SENT FLAG -NOCKSM EQU $3C ;NO CHKSUM SENT FLAG -;BPTR EQU $3D ;CASSETTE DATA INDEX -FTYPE EQU $3E ;INTERRECORD GAP TYPE -FEOF EQU $3F ;END OF FILE FLAG -FREQ EQU $40 ;BEEP COUNT -SOUNDR EQU $41 ;NOISY I/O FLAG -CRITIC EQU $42 ;CRITICAL MODE -FMSZPG EQU $43 ;FMS ZERO PAGE -ZCHAIN EQU $4A ;HANDLER LOADER TEMP -DSTAT EQU $4C ;DISPLAY STATUS -ATRACT EQU $4D ;ATTRACT FLAG -DRKMSK EQU $4E ;DARK ATTRACT MASK -COLRSH EQU $4F ;COLOR SHIFTER -TMPCHR EQU $50 ;TEMP STORAGE -HOLD1 EQU $51 ;TEMP STORAGE -LMARGN EQU $52 ;LEFT MARGIN (1) -RMARGN EQU $53 ;RIGHT MARGIN (38) -ROWCRS EQU $54 ;CURSOR COUNTERS -COLCRS EQU $55 -DINDEX EQU $57 ;DISPLAY MODE # -SAVMSC EQU $58 ;SCREEN MEM ADDR -OLDROW EQU $5A ;DRAW START POSIT -OLDCOL EQU $5B -OLDCHR EQU $5D ;DATA UNDER CURSOR -OLDADR EQU $5E ;CURSOR MEM ADDR -FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER -PALNTS EQU $62 ;PAL/NTSC FLAG -LOGCOL EQU $63 ;COL IN LOGICAL LINE -ADRESS EQU $64 ;TEMP STORAGE -MLTEMP EQU $66 ;TEMP STORAGE -SAVADR EQU $68 ;TEMP STORAGE -RAMTOP EQU $6A ;AVAILABLE RAM PAGES -BUFCNT EQU $6B ;BUFFER COUNT -BUFSTR EQU $6C ;EDITOR GETCH POINTR -BITMSK EQU $6E ;BIT MASK -SHFAMT EQU $6F ;PIXEL JUSTIFICATION -ROWAC EQU $70 ;ROW ACCUMULATOR -COLAC EQU $72 ;COLUMN ACCUMULATOR -ENDPT EQU $74 ;LINE LENGTH -DELTAR EQU $76 ;DELTA ROW -DELTAC EQU $77 ;DELTA COLUMN -KEYDEF EQU $79 ;KEY DEFEAT POINTER -SWPFLG EQU $7B ;SPLIT SCN CURS CNTL -HOLDCH EQU $7C ;KB CHAR TEMP HOLD -INSDAT EQU $7D ;TEMP STORAGE -COUNTR EQU $7E ;DRAW ITERATION CNT -; -; 80-FF ARE RESERVED FOR USER -; -; NOTE: SEE FLOATING POINT -; SUBROUTINE AREA FOR ZERO -; PAGE CELLS -; -; PAGE 1 - HARDWARE STACK ; ; PAGE TWO RAM ASSIGNMENTS ; @@ -524,44 +281,7 @@ MODE4 EQU $04 ; display list mode 4 MODE8 EQU $08 ; display list mode 8 MODEE EQU $0E ; display list mode E MODEF EQU $0F ; display list mode F -; --------------------------------------------------------------------------- -; ENUMS -; --------------------------------------------------------------------------- -.enum @dmactl - blank = %00 - narrow = %01 - standard= %10 - wide = %11 - missiles= %100 - players = %1000 - lineX1 = %10000 - lineX2 = %00000 - dma = %100000 -.ende - -scr48 = @dmactl(wide|dma|players|missiles|lineX1) -scr40 = @dmactl(standard|dma|players|missiles|lineX1) -scr32 = @dmactl(narrow|dma|players|missiles|lineX1) - -.enum @pmcntl - missiles= %1 - players = %10 - trigs = %100 -.ende - -.enum @gtictl - prior0 = %0 - prior1 = %1 - prior2 = %10 - prior4 = %100 - prior8 = %1000 - ply5 = %10000 ; Fifth Player Enable - mlc = %100000 ; Multiple Color Player Enable - mode9 = %01000000 - mode10 = %10000000 - mode11 = %11000000 -.ende ; --------------------------------------------------------------------------- ; KBCODEs ; --------------------------------------------------------------------------- diff --git a/scorchC64.asm b/scorchC64.asm index 12f0d09..9eed48d 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -181,7 +181,7 @@ FirstSTART DisplayCopyPurchaseStart = 0 displayC64 = $2000 ; graphics screen memory start -; SEI ; disable IRQ + SEI ; disable IRQ LDA #$36 STA $0001 ; Turn Off BASIC ROM LDA #0 - no ;-------------------------------------------------- - lda SKSTAT - and #%00000100 - beq @+ lda #1 -@ and STRIG0 rts .endp ;-------------------------------------------------- @@ -308,7 +301,7 @@ MakeDarkScreen ;-------------------------------------------------- .proc WaitOneFrame ;-------------------------------------------------- - seq:wait ; or waitRTC ? + wait ; or waitRTC ? rts .endp diff --git a/scorchC64.prg b/scorchC64.prg index a06710be9ccfa98cca47c1b8bf9d04d1babccdf0..ae26d50655259b73b0b5b8de3a16270621bfd630 100644 GIT binary patch delta 6095 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