From 827916c85d168c6106f6e28db8f14ca58b82fb31 Mon Sep 17 00:00:00 2001 From: Carsten Strotmann Date: Fri, 17 Jul 2020 23:35:58 +0200 Subject: [PATCH] Block-IO for py65 --- 6502/py65/systemio.fb | 2 +- 6502/py65/systemio.fth | 24 ++++++++++++------------ 6502/py65/vfpy65.bin | Bin 17577 -> 17574 bytes 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/6502/py65/systemio.fb b/6502/py65/systemio.fb index f4a07b9..ada5c41 100644 --- a/6502/py65/systemio.fb +++ b/6502/py65/systemio.fb @@ -1 +1 @@ -\ System depended IO definitions for 6502 target cas 26jan06 \ loadscreen for py65 cas 15juli2020 1 9 +thru \\ The following IO definitions are for the py65 emulator at https://github.com/mnaberez/py65 A char can can be read by memory mapped IO at $f004 A char can be written to memory mapped IO at $f001 \ 65KEY? GETKEY 25JAN85RE) cas 15july2020 CODE 65KEY? ( -- FLAG) $f004 lda $9ff sta push0a jmp end-code CODE GETKEY ( -- 8B) $9ff lda push0a jmp end-code CODE CURON ( --) NEXT JMP END-CODE CODE CUROFF ( --) NEXT JMP END-CODE : 65KEY ( -- 8B) BEGIN PAUSE 65KEY? UNTIL GETKEY ; \ DECODE EXPECT KEYBOARD BP28MAY85) cas 15july202008 CONSTANT #BS 0D CONSTANT #CR &27 CONSTANT #ESC 0A CONSTANT #LF : 65DECODE ( ADDR CNT1 KEY -- ADDR CNT2) #BS CASE? IF DUP IF DEL 1- THEN EXIT THEN #CR CASE? IF DUP SPAN ! EXIT THEN >R 2DUP + R@ SWAP C! R> EMIT 1+ ; : 65EXPECT ( ADDR LEN1 -- ) SPAN ! 0 BEGIN DUP SPAN @ U< WHILE KEY DECODE REPEAT 2DROP SPACE ; INPUT: KEYBOARD [ HERE INPUT ! ] 65KEY 65KEY? 65DECODE 65EXPECT [ \ send? (emit 65emit cas 15july2020 \ | Code send? ( -- flg ) \ $01 # lda push0a jmp end-code Code (emit ( 8b -- ) SP X) lda $f001 sta (drop jmp end-code \ EMIT CR DEL PAGE AT AT? 25JAN85RE) cas 15july2020 | Variable out 0 out ! | &80 Constant c/row : 65emit ( 8b -- ) pause 1 out +! (emit ; : 65CR #CR 65emit #LF 65emit out @ c/row / 1+ c/row * out ! ; : 65DEL #bs 65emit SPACE #bs 65emit -2 out +! ; : 65PAGE .( insert code for page ) out off ; : 65at ( row col -- ) .( insert code for at ) swap c/row * + out ! ; : 65AT? ( -- ROW COL ) out @ c/row /mod &24 min swap ; \ 65type cas 15jul2020 : 65type ( adr len -- ) bounds ?DO I c@ emit LOOP ; \ TYPE DISPLAY (BYE BP 28MAY85RE) er14dez88 OUTPUT: DISPLAY [ HERE OUTPUT ! ] 65EMIT 65CR 65TYPE 65DEL 65PAGE 65AT 65AT? [ | : (bye ; \ B/BLK DRIVE >DRIVE DRVINIT 28MAY85RE) cas 26jan06 $400 CONSTANT B/BLK \ Bytes per physical Sector $0AA CONSTANT BLK/DRV \ number of Blocks per Drive | VARIABLE (DRV 0 (DRV ! | : DISK ( -- DEV.NO ) (DRV @ 8 + ; : DRIVE ( DRV# -- ) BLK/DRV * OFFSET ! ; \ cas 26jan06: >DRIVE ( BLOCK DRV# -- BLOCK' ) BLK/DRV * + OFFSET @ - ; : DRV? ( BLOCK -- DRV# ) OFFSET @ + BLK/DRV / ; : DRVINIT NOOP ; .( for read and write errorhandler is needed ) | : readserial ( adr blk -- ) &27 emit .( rb ) space base push decimal . cr $400 bounds DO key I c! LOOP ; | : writeserial ( adr blk -- ) &27 emit .( wb ) space base push decimal . cr $400 bounds DO I c@ emit LOOP ; \ (r/w er14dez88 : (R/W ( ADR BLK FILE R/WF -- FLAG) swap abort" no file" IF readserial ELSE writeserial THEN false ; ' (R/W IS R/W \ No newline at end of file +\ System depended IO definitions for 6502 target cas 26jan06 \ loadscreen for py65 cas 15juli2020 1 9 +thru \\ The following IO definitions are for the py65 emulator at https://github.com/mnaberez/py65 A char can can be read by memory mapped IO at $f004 A char can be written to memory mapped IO at $f001 \ 65KEY? GETKEY 25JAN85RE) cas 15july2020 CODE 65KEY? ( -- FLAG) $f004 lda $9ff sta push0a jmp end-code CODE GETKEY ( -- 8B) $9ff lda push0a jmp end-code CODE CURON ( --) NEXT JMP END-CODE CODE CUROFF ( --) NEXT JMP END-CODE : 65KEY ( -- 8B) BEGIN PAUSE 65KEY? UNTIL GETKEY ; \ DECODE EXPECT KEYBOARD BP28MAY85) cas 18juli20207F CONSTANT #BS 0D CONSTANT #CR &27 CONSTANT #ESC 0A CONSTANT #LF : 65DECODE ( ADDR CNT1 KEY -- ADDR CNT2) #BS CASE? IF DUP IF DEL 1- THEN EXIT THEN #CR CASE? IF DUP SPAN ! EXIT THEN >R 2DUP + R@ SWAP C! R> EMIT 1+ ; : 65EXPECT ( ADDR LEN1 -- ) SPAN ! 0 BEGIN DUP SPAN @ U< WHILE KEY DECODE REPEAT 2DROP SPACE ; INPUT: KEYBOARD [ HERE INPUT ! ] 65KEY 65KEY? 65DECODE 65EXPECT [ \ send? (emit 65emit cas 15july2020 \ | Code send? ( -- flg ) \ $01 # lda push0a jmp end-code Code (emit ( 8b -- ) SP X) lda $f001 sta (drop jmp end-code \ EMIT CR DEL PAGE AT AT? 25JAN85RE) cas 15july2020 | Variable out 0 out ! | &80 Constant c/row : 65emit ( 8b -- ) pause 1 out +! (emit ; : 65CR #CR 65emit #LF 65emit out @ c/row / 1+ c/row * out ! ; : 65DEL #bs 65emit SPACE #bs 65emit -2 out +! ; : 65PAGE .( insert code for page ) out off ; : 65at ( row col -- ) .( insert code for at ) swap c/row * + out ! ; : 65AT? ( -- ROW COL ) out @ c/row /mod &24 min swap ; \ 65type cas 15jul2020 : 65type ( adr len -- ) bounds ?DO I c@ emit LOOP ; \ TYPE DISPLAY (BYE BP 28MAY85RE) er14dez88 OUTPUT: DISPLAY [ HERE OUTPUT ! ] 65EMIT 65CR 65TYPE 65DEL 65PAGE 65AT 65AT? [ | : (bye ; \ B/BLK DRIVE >DRIVE DRVINIT 28MAY85RE) cas 26jan06 $400 CONSTANT B/BLK \ Bytes per physical Sector $0AA CONSTANT BLK/DRV \ number of Blocks per Drive | VARIABLE (DRV 0 (DRV ! | : DISK ( -- DEV.NO ) (DRV @ 8 + ; : DRIVE ( DRV# -- ) BLK/DRV * OFFSET ! ; \ cas 18juli2020: >DRIVE ( BLOCK DRV# -- BLOCK' ) BLK/DRV * + OFFSET @ - ; : DRV? ( BLOCK -- DRV# ) OFFSET @ + BLK/DRV / ; : DRVINIT NOOP ; : READBLOCK ( ADR BLK ) $f011 ! $f013 ! 01 $f010 c! ; : WRITEBLOCK ( ADR BLK ) $f011 ! $f013 ! 02 $f010 c! ; \ (r/w cas 18juli2020 : (R/W ( ADR BLK FILE R/WF -- FLAG) swap abort" no file" IF readblock ELSE writeblock THEN false ; ' (R/W IS R/W \ No newline at end of file diff --git a/6502/py65/systemio.fth b/6502/py65/systemio.fth index 7f3b627..2d6249b 100644 --- a/6502/py65/systemio.fth +++ b/6502/py65/systemio.fth @@ -58,8 +58,8 @@ CODE CUROFF ( --) NEXT JMP END-CODE \ *** Block No. 3, Hexblock 3 -\ DECODE EXPECT KEYBOARD BP28MAY85) cas 15july2020 -08 CONSTANT #BS 0D CONSTANT #CR &27 CONSTANT #ESC +\ DECODE EXPECT KEYBOARD BP28MAY85) cas 18juli2020 +7F CONSTANT #BS 0D CONSTANT #CR &27 CONSTANT #ESC 0A CONSTANT #LF : 65DECODE ( ADDR CNT1 KEY -- ADDR CNT2) #BS CASE? IF DUP IF DEL 1- THEN EXIT THEN @@ -172,30 +172,30 @@ $0AA CONSTANT BLK/DRV \ number of Blocks per Drive \ *** Block No. 9, Hexblock 9 -\ cas 26jan06 +\ cas 18juli2020 : >DRIVE ( BLOCK DRV# -- BLOCK' ) BLK/DRV * + OFFSET @ - ; : DRV? ( BLOCK -- DRV# ) OFFSET @ + BLK/DRV / ; : DRVINIT NOOP ; -.( for read and write errorhandler is needed ) -| : readserial ( adr blk -- ) - &27 emit .( rb ) space base push decimal . cr - $400 bounds DO key I c! LOOP ; -| : writeserial ( adr blk -- ) - &27 emit .( wb ) space base push decimal . cr - $400 bounds DO I c@ emit LOOP ; +: READBLOCK ( ADR BLK ) + $f011 ! $f013 ! 01 $f010 c! ; + +: WRITEBLOCK ( ADR BLK ) + $f011 ! $f013 ! 02 $f010 c! ; + + \ *** Block No. 10, Hexblock a -\ (r/w er14dez88 +\ (r/w cas 18juli2020 : (R/W ( ADR BLK FILE R/WF -- FLAG) swap abort" no file" - IF readserial ELSE writeserial THEN false ; + IF readblock ELSE writeblock THEN false ; ' (R/W IS R/W diff --git a/6502/py65/vfpy65.bin b/6502/py65/vfpy65.bin index e195c3d013a44410eb5b061a0221a9df9875ed8e..946c79edbee6ae220d3ab41cbc4ba4153219309c 100644 GIT binary patch delta 373 zcmZ44$+)bOae@f%A{Pb*E{4@k8ys1TpKMgzBg1%U^F5g$$k#htI;##f8BnBg1oXfe&+pMT9vSJe|41gFHiAu_|PO zE97D*oIKB1qCV7FMw*48&N)(CM7V}wmNSQ&e^7{ru7&YEEfL{bhJ((Wj={mMzD_=_ zLC16$7-qP9(5Yo$U|obc@w7#JjNgxkiL&YpXNVG32_iMMOfl)edzGRW57+{sAH3 S{@U7WgzFeOH_tKQ6#xKV8)>ir delta 396 zcmZ41$+)tUae@f%QWpjWE{4@k8ys1TpKny$Bg1%g^F5gu*6EKO7Sqfw!1GiN4Q0*SV}|~zsmbkO~USW z5S3gE=FTh{LHgnMw46n(jM?+@71A9Xglib)I@fc!`3Hq~ z=vo-x(-IM`WjNx@=@=aB>g(j=8gxvDfnm1G2c2351_suE&|nWoZS6DCwG6MF*+4u4 zAom)O`_q{P#MRcm3FL6NFa-r@Yb!9+GKjh`g#wvMK&FBVQ!tRJ3S?@#FnI!*IzXnG z3!`7SwzdF5G9BLrxm3XtRN!Uz<$0sbo+G~XC7