From 516f10fd35577f9ee7a25ee7997822d8db927587 Mon Sep 17 00:00:00 2001 From: leo72 Date: Thu, 1 Oct 2020 16:27:01 +0200 Subject: [PATCH] New firmware release 3.13.8 --- 12-Home computer/LM80C-firmware-r3138.asm | 90 + 12-Home computer/changelog.txt | 9 + Rom/LM80C-firmware-r3138.rom | Bin 0 -> 19921 bytes include/basic/basic32k-r3138.asm | 6545 +++++++++++++++++++++ include/bootloader/bootloader-r3138.asm | 512 ++ include/psg/psg-r3138.asm | 366 ++ include/vdp/vdp-r3138.asm | 1062 ++++ manuals/LM80C BASIC reference manual.odt | Bin 1799691 -> 1800737 bytes manuals/LM80C BASIC reference manual.pdf | Bin 640671 -> 643302 bytes 9 files changed, 8584 insertions(+) create mode 100644 12-Home computer/LM80C-firmware-r3138.asm create mode 100644 Rom/LM80C-firmware-r3138.rom create mode 100644 include/basic/basic32k-r3138.asm create mode 100644 include/bootloader/bootloader-r3138.asm create mode 100644 include/psg/psg-r3138.asm create mode 100644 include/vdp/vdp-r3138.asm diff --git a/12-Home computer/LM80C-firmware-r3138.asm b/12-Home computer/LM80C-firmware-r3138.asm new file mode 100644 index 0000000..2e11a26 --- /dev/null +++ b/12-Home computer/LM80C-firmware-r3138.asm @@ -0,0 +1,90 @@ +; ------------------------------------------------------------------------------ +; LM80C - FIRMWARE - R3.13.8 +; ------------------------------------------------------------------------------ +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. More info at +; www DOT leonardomiliani DOT com +; ------------------------------------------------------------------------------ +; Coding/Editing/Compiling: +; Original init code for MC68B05 by Grant Searle +; Original SIO/CTC/PIO init code by Mario Blunk +; NASCOM BASIC originally modified by Gran Searle +; Code modified and adapted for LM80C by Leonardo Miliani +; +; Edited with Atom Editor +; +; Compiled with ZASM assembler 4.2.4 +; https://k1.spdns.de/Develop/Projects/zasm-4.0/Distributions/ +; ------------------------------------------------------------------------------ +; Copyright notes: +; Parts of the code (c) Grant Searle - free for non commercial use +; Please include this advice and the note to the attribution of the original +; version to Grant Searle if you intend to redistribuite it +; http://searle.hostei.com/grant/index.html +; eMail: home.micros01@btinternet.com +; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; Parts of the code (c) Mario Blunk +; http://www.trainĀ­z.de +; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft +; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3 +; (May-June 1983) to Vol 3, Issue 3 (May-June 1984) +; Adapted for the freeware Zilog Macro Assembler 2.10 to produce +; the original ROM code (checksum A934H). PA +; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. Code and computer schematics are released under +; the therms of the GNU GPL License 3.0 and in the form of "as is", without no +; kind of warranty: you can use them at your own risk. +; You are free to use them for any non-commercial use: you are only asked to +; maintain the copyright notices, include this advice and the note to the +; attribution of the original version to Leonardo Miliani, if you intend to +; redistribuite them. +; https://www.leonardomiliani.com +; +; Please support me by visiting the following links: +; Main project page: https://www.leonardomiliani.com +; Schematics and code: https://github.com/leomil72/LM80C +; Videos about the computer: https://www.youtube.com/user/leomil72/videos +; Hackaday page: https://hackaday.io/project/165246-lm80c-color-computer +; ------------------------------------------------------------------------------ + + +; ------------------------------------------------------------------------------ +; this line instructs the assembler to prepare a file for a ROM target +; meaning that blank cells will be filled up with $FF +#target rom + +; this line instructs the assembler to compile taking account that code +; starts at $0000 (the address reached by Z80 upon reset) +#code BOOT, $0000 + +; ------------------------------------------------------------------------------ +; include the latest version of the bootloader: this sets up the address aliases +; configure the hardware, checks if warm or cold startup and loads the BASIC interpreter +#include "../include/bootloader/bootloader-r3138.asm" + +; incude the latest version of the VDP module +#include "../include/vdp/vdp-r3138.asm" + +; incude the latest version of the PSG module +#include "../include/psg/psg-r3138.asm" + +; include the latest version of the NASCOM BASIC interpreter +#include "../include/basic/basic32k-r3138.asm" + +; include utils +#include "../include/utils/utils-r11.asm" + +; include the latest version of the font sets +#include "../include/vdp/6x8fonts-r16.asm" +#include "../include/vdp/8x8fonts-r18.asm" +#include "../include/vdp/logo-fonts.asm" + +; END OF ASSEMBLY SOURCE +#end + +;------------------------------------------------------------------------------- diff --git a/12-Home computer/changelog.txt b/12-Home computer/changelog.txt index 29b5253..bc659e3 100644 --- a/12-Home computer/changelog.txt +++ b/12-Home computer/changelog.txt @@ -7,6 +7,15 @@ The following file reports the changelog of the LM80C firmware developed by Leonardo Miliani for the LM80C Color Computer. More info at www DOT leonardomiliani DOT com +--------------------------------------------------------------------------------------------- +3.13.8 - 20201001 + +- Fixed a little bug in COLOR statement: it didn't store the foreground color set by the + user +- Now PLOT, CIRCLE, and DRAW statements accept color "0" to draw pixels with background + color, i.e. reset pixels that are on +- Code cleaning + --------------------------------------------------------------------------------------------- 3.13.7 - 20200911 diff --git a/Rom/LM80C-firmware-r3138.rom b/Rom/LM80C-firmware-r3138.rom new file mode 100644 index 0000000000000000000000000000000000000000..7180d4df074b4040164f4d2937607712638761d1 GIT binary patch literal 19921 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 literal 0 HcmV?d00001 diff --git a/include/basic/basic32k-r3138.asm b/include/basic/basic32k-r3138.asm new file mode 100644 index 0000000..8560a42 --- /dev/null +++ b/include/basic/basic32k-r3138.asm @@ -0,0 +1,6545 @@ +; ------------------------------------------------------------------------------ +; LM80C BASIC - R3.13.8 +; ------------------------------------------------------------------------------ +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. Code and computer schematics are released under +; the therms of the GNU GPL License 3.0 and in the form of "as is", without no +; kind of warranty: you can use them at your own risk. +; You are free to use them for any non-commercial use: you are only asked to +; maintain the copyright notices, include this advice and the note to the +; attribution of the original version to Leonardo Miliani, if you intend to +; redistribuite them. +; https://www.leonardomiliani.com +; +; Please support me by visiting the following links: +; Main project page: https://www.leonardomiliani.com +; Schematics and code: https://github.com/leomil72/LM80C +; Videos about the computer: https://www.youtube.com/user/leomil72/videos +; Hackaday page: https://hackaday.io/project/165246-lm80c-color-computer +; ------------------------------------------------------------------------------ +; NASCOM BASIC versions: +; 4.7 - original version by NASCOM +; 4.7b - modified version by Grant Searle (additional commands & functions) +; 4.8 - modified by Leonardo Miliani (new commands/functions) + + +;------------------------------------------------------------------------------ +; B A S I C +;------------------------------------------------------------------------------ + +; GENERAL EQUATES + +NLLCR equ $00 ; null char (used as space/empty char in video prints) +CTRLC equ $03 ; Control "C" +CTRLG equ $07 ; Control "G" +BKSP equ $08 ; Back space +LF equ $0A ; Line feed +CS equ $0C ; Clear screen +CR equ $0D ; Carriage return +CTRLO equ $0F ; Control "O" +CTRLQ equ $11 ; Control "Q" +CTRLR equ $12 ; Control "R" +CTRLS equ $13 ; Control "S" +CTRLU equ $15 ; Control "U" +HOME equ $19 ; Home (cursor at 0,0) +ESC equ $1B ; Escape +SPC equ $20 ; Space +DEL equ $7F ; Delete +; cursor ASCII codes +CRSLFT equ $1C ; cursor left +CRSRGT equ $1D ; cursor right +CRSUP equ $1E ; cursor up +CRSDN equ $1F ; cursor down + + +; BASIC WORK SPACE LOCATIONS +; BY STARTING FROM $805E THE INTERPRETER ALLOCATES THE FOLLOWING RAM CELLS +; TO STORE IMPORTANT VALUES USED FOR SOME SPECIFIC FUNCTIONS: +; THEY CAN BE VECTOR (ADDRESSES) FUNCTIONS, SYSTEM DATAS (I.E. VARIABLES) +; AND SO ON. THE FIRST CELLS ARE FILLED WITH VALUES STORED INTO ROM AT $(INITAB) ADDRESS +WRKSPC equ basicStarted+$01; (3) BASIC Work space +NMIUSR equ WRKSPC+$03 ; (3) NMI exit point routine +USR equ NMIUSR+$03 ; (3) "USR (x)" jump <-- in $8065/8066 the user can store the address of a specific machine language routine +OUTSUB equ USR+$03 ; (1) "out p,n" +OTPORT equ OUTSUB+$01 ; (2) Port (p) +DIVSUP equ OTPORT+$02 ; (1) Division support routine +DIV1 equ DIVSUP+$01 ; (4) <- Values +DIV2 equ DIV1+$04 ; (4) <- to +DIV3 equ DIV2+$04 ; (3) <- be +DIV4 equ DIV3+$03 ; (2) <-inserted +SEED equ DIV4+$02 ; (35) Random number seed <-- starting address of a seed table +LSTRND equ SEED+$23 ; (4) Last random number +INPSUB equ LSTRND+$04 ; (1) #INP (x)" Routine +INPORT equ INPSUB+$01 ; (2) PORT (x) +LWIDTH equ INPORT+$02 ; (1) Terminal width +COMMAN equ LWIDTH+$01 ; (1) Width for commas +NULFLG equ COMMAN+$01 ; (1) Null after input byte flag +CTLOFG equ NULFLG+$01 ; (1) Control "O" flag +CHKSUM equ CTLOFG+$01 ; (2) Array load/save check sum +NMIFLG equ CHKSUM+$02 ; (1) Flag for NMI break routine +BRKFLG equ NMIFLG+$01 ; (1) Break flag +RINPUT equ BRKFLG+$01 ; (3) Input reflection +STRSPC equ RINPUT+$03 ; (2) Bottom of string space +LINEAT equ STRSPC+$02 ; (2) Current line number +HLPLN equ LINEAT+$02 ; (2) Current line with errors +FNKEYS equ HLPLN+$02 ; (128) text of FN keys +BASTXT equ FNKEYS+$80 ; (3) Pointer to start of program <-- actually this is the last value pre-filled by the firmware at startup +BUFFER equ BASTXT+$03 ; (5) Input buffer +STACK equ BUFFER+$05 ; (85) Initial stack +CURPOS equ STACK+$55 ; (1) Character position on line +LCRFLG equ CURPOS+$01 ; (1) Locate/Create flag +TYPE equ LCRFLG+$01 ; (1) Data type flag +DATFLG equ TYPE+$01 ; (1) Literal statement flag +LSTRAM equ DATFLG+$01 ; (2) Last available RAM +TMSTPT equ LSTRAM+$02 ; (2) Temporary string pointer +TMSTPL equ TMSTPT+$02 ; (12) Temporary string pool +TMPSTR equ TMSTPL+$0C ; (4) Temporary string +STRBOT equ TMPSTR+$04 ; (2) Bottom of string space +CUROPR equ STRBOT+$02 ; (2) Current operator in EVAL +LOOPST equ CUROPR+$02 ; (2) First statement of loop +DATLIN equ LOOPST+$02 ; (2) Line of current DATA item +FORFLG equ DATLIN+$02 ; (1) "FOR" loop flag +LSTBIN equ FORFLG+$01 ; (1) Last byte entered +READFG equ LSTBIN+$01 ; (1) Read/Input flag +BRKLIN equ READFG+$01 ; (2) Line of break +NXTOPR equ BRKLIN+$02 ; (2) Next operator in EVAL +ERRLIN equ NXTOPR+$02 ; (2) Line of error +CONTAD equ ERRLIN+$02 ; (2) Where to CONTinue +PROGND equ CONTAD+$02 ; (2) End of program +VAREND equ PROGND+$02 ; (2) End of variables +ARREND equ VAREND+$02 ; (2) End of arrays +NXTDAT equ ARREND+$02 ; (2) Next data item +FNRGNM equ NXTDAT+$02 ; (2) Name of FN argument +FNARG equ FNRGNM+$02 ; (4) FN argument value +FPREG equ FNARG+$04 ; (3) Floating point register +FPEXP equ FPREG+$03 ; (1) Floating point exponent +SGNRES equ FPEXP+$01 ; (1) Sign of result +TMRCNT equ SGNRES+$01 ; (4) TMR counter for 1/100 seconds +CTC0IV equ TMRCNT+$04 ; (3) CTC0 interrupt vector +CTC1IV equ CTC0IV+$03 ; (3) CTC1 interrupt vector +CTC2IV equ CTC1IV+$03 ; (3) CTC2 interrupt vector +CTC3IV equ CTC2IV+$03 ; (3) CTC3 interrupt vector +; - - - - - - - - - - - - - - - - - - - VIDEO REGISTERS - FROM HERE... +SCR_SIZE_W equ CTC3IV+$03 ; (1) screen width (it can be either 40 chars or 32 chars/bytes) +SCR_SIZE_H equ SCR_SIZE_W+$01 ; (1) screen height (it can be 24/48/192: 24 for text, 48 for MC, 192 for graphics) +SCR_MODE equ SCR_SIZE_H+$01 ; (1) screen mode (0=text, 1=G1, 2=G2, 3=MC, 4=ExG2) +SCR_NAM_TB equ SCR_MODE+$02 ; (2) video name table address +SCR_CURS_X equ SCR_NAM_TB+$02 ; (1) cursor X +SCR_CURS_Y equ SCR_CURS_X+$01 ; (1) cursor Y +SCR_CUR_NX equ SCR_CURS_Y+$01 ; (1) new cursor X position +SCR_CUR_NY equ SCR_CUR_NX+$01 ; (1) new cursor Y position +SCR_ORG_CHR equ SCR_CUR_NY+$01 ; (1) original char positioned under the cursor +CRSR_STATE equ SCR_ORG_CHR+$01 ; (1) state of cursor (1=on, 0=off) +LSTCSRSTA equ CRSR_STATE+$01 ; (1) last cursor state +PRNTVIDEO equ LSTCSRSTA+$01 ; (1) print on video buffer (1=on / 0=off) set to off on graphic only modes +CHR4VID equ PRNTVIDEO+$01 ; (1) char for video buffer +FRGNDCLR equ CHR4VID+$01 ; (1) foreground color as set by SCREEN or COLOR commands +BKGNDCLR equ FRGNDCLR+$01 ; (1) background color as set by SCREEN or COLOR commands +TMPBFR1 equ BKGNDCLR+$01 ; (2) word for general purposes use (temp. buffer for 1 or 2 bytes) +TMPBFR2 equ TMPBFR1+$02 ; (2) word for general purposes use (temp. buffer for 1 or 2 bytes) +TMPBFR3 equ TMPBFR2+$02 ; (2) word for general purposes use (temp. buffer for 1 or 2 bytes) +TMPBFR4 equ TMPBFR3+$02 ; (2) word for general purposes use (temp. buffer for 1 or 2 bytes) +VIDEOBUFF equ TMPBFR4+$02 ; (40) buffer used for video scrolling and other purposes +VIDTMP1 equ VIDEOBUFF+$28 ; (2) temporary video word +VIDTMP2 equ VIDTMP1+$02 ; (2) temporary video word +; - - - - - - - - - - - - - - - - - - - ...TO HERE. DO NOT ADD ANYTHING RELATED TO VPD OUT OF THIS RANGE, + ; OTHERWISE YOU WILL HAVE TO CHECK THE POINTER IN "CLR_RAM_REG" FUNCTION +; - - - - - - - - - - - - - - - - - - - SOUND & KEYBOARD REGISTERS - FROM HERE... +CHASNDDTN equ VIDTMP2+$02 ; (2) sound Ch.A duration (1/100s) +CHBSNDDTN equ CHASNDDTN+$02 ; (2) sound Ch.B duration (1/100s) +CHCSNDDTN equ CHBSNDDTN+$02 ; (2) sound Ch.C duration (1/100s) +KBDNPT equ CHCSNDDTN+$02 ; (1) temp cell used to flag if input comes from keyboard +KBTMP equ KBDNPT+$01 ; (1) temp cell used by keyboard scanner +TMPKEYBFR equ KBTMP+$01 ; (1) temp buffer for last key pressed +LASTKEYPRSD equ TMPKEYBFR+$01 ; (1) last key code pressed +CONTROLKEYS equ LASTKEYPRSD+$01 ; (1) flags for control keys (bit#0=SHIFT; bit#1=CTRL; bit#2=C=) +; - - - - - - - - - - - - - - - - - - - ...TO HERE. DO NOT ADD ANYTHING RELATED TO PSG OUT OF THIS RANGE, + ; OTHERWISE YOU WILL HAVE TO CHANGE THE POINTER IN "initPSG" FUNCTION +SERIALS_EN equ CONTROLKEYS+$01 ; (1) serial ports status: bit 0 for Port1(A), bit 1 for Port2(B): 0=OFF, 1=ON +SERABITS equ SERIALS_EN+$01 ; (1) serial port A data bits +PBUFF equ SERABITS+$01 ; (13) Number print buffer +MULVAL equ PBUFF+$0D ; (3) Multiplier +PROGST equ MULVAL+$03 ; (100) Start of program text area +STLOOK equ PROGST+$64 ; Start of memory test + +; BASIC ERROR CODE VALUES +; These values act as an offset to point to the error message into the error table +; must be incremented by 2 because they point to a word address jump +NF equ $00 ; NEXT without FOR +SN equ $02 ; Syntax error +RG equ $04 ; RETURN without GOSUB +OD equ $06 ; Out of DATA +FC equ $08 ; Function call error +OV equ $0A ; Overflow +OM equ $0C ; Out of memory +UL equ $0E ; Undefined line number +BS equ $10 ; Bad subscript +DD equ $12 ; Re-Dimensioned array +DZ equ $14 ; Division by zero (/0) +ID equ $16 ; Illegal direct +TM equ $18 ; Type mis-match +OS equ $1A ; Out of string space +LS equ $1C ; String too long +ST equ $1E ; String formula too complex +CN equ $20 ; Can't continue +UF equ $22 ; Undefined FN function +MO equ $24 ; Missing operand +HX equ $26 ; HEX error +BN equ $28 ; BIN error +GM equ $2A ; No Graphics Mode +SC equ $2C ; Serial configuration +SA equ $2E ; Serial port already open +HP equ $30 ; HELP call + +COLD: jp STARTB ; Jump for cold start +WARM: jp WARMST ; Jump for warm start + +STARTB: jp CSTART ; Jump to initialise + defw DEINT ; Get integer -32768 to 32767 + defw ABPASS ; Return integer in AB +CSTART: ld HL,WRKSPC ; Start of workspace RAM + ld SP,HL ; Set up a temporary stack + jp INITST ; Go to initialise + +INIT: ld HL,INITAB ; Initialise workspace + ld BC,INITBE-INITAB+3; Bytes to copy + ld DE,WRKSPC ; Into workspace RAM + ldir ; Copy data + ex DE,HL ; Copy DE into HL + ld SP,HL ; Temporary stack + call CLREG ; Clear registers and stack + call PRNTCRLF ; Output CRLF + ld (BUFFER+88+1),A ; Mark end of buffer + ld (PROGST),A ; Initialise program area + jr MNOASK ; usually, don't ask for memory top (only when there are errors) +MSIZE: ld HL,MEMMSG ; Point to message + call PRS ; Output "Memory size" + call PROMPT ; Get input with '?' + call GETCHR ; Get next character + or A ; Set flags + jp NZ,TSTMEM ; If number - Test if RAM there +MNOASK: ld HL,STLOOK ; Point to start of RAM +MLOOP: inc HL ; Next byte + ld A,H ; Above address FFFF ? + or L + jp Z,SETTOP ; Yes - 64K RAM + ld A,(HL) ; Get contents + ld B,A ; Save it + cpl ; Flip all bits + ld (HL),A ; Put it back + cp (HL) ; RAM there if same + ld (HL),B ; Restore old contents + jp Z,MLOOP ; If RAM - test next byte + jp SETTOP ; Top of RAM found + +TSTMEM: call ATOH ; Get high memory into DE + or A ; Set flags on last byte + jp NZ,SNERR ; ?SN Error if bad character + ex DE,HL ; Address into HL + dec HL ; Back one byte + ld A,%11011001 ; Test byte + ld B,(HL) ; Get old contents + ld (HL),A ; Load test byte + cp (HL) ; RAM there if same + ld (HL),B ; Restore old contents + jp NZ,MSIZE ; Ask again if no RAM + +SETTOP: dec HL ; Back one byte + ld DE,STLOOK-1 ; See if enough RAM + call CPDEHL ; Compare DE with HL + jp C,MSIZE ; Ask again if not enough RAM + ld DE,0-100 ; 100 Bytes string space + ld (LSTRAM),HL ; Save last available RAM + add HL,DE ; Allocate string space + ld (STRSPC),HL ; Save string space + call CLRPTR ; Clear program area + ld HL,(STRSPC) ; Get end of memory + ld DE,0-17 ; Offset for free bytes + add HL,DE ; Adjust HL + ld DE,PROGST ; Start of program text + ld A,L ; Get LSB + sub E ; Adjust it + ld L,A ; Re-save + ld A,H ; Get MSB + sbc A,D ; Adjust it + ld H,A ; Re-save + push HL ; Save bytes free + ld HL,SIGNON ; Sign-on message + call PRS ; Output string + pop HL ; Get bytes free back + call PRNTHL ; Output amount of free memory + ld HL,BFREE ; " Bytes free" message + call PRS ; Output string + +WARMST: ld SP,STACK ; Temporary stack +BRKRET: call CLREG ; Clear registers and stack + call CURSOR_ON ; enable cursor + jp PRNTOK ; Go to get command line + +BFREE: defb " Bytes free",CR,0 + +SIGNON: defb "Z80 BASIC Ver 4.8",CR + defb "Copyright ",251," 1978" + defb " by Microsoft",CR,0 + +MEMMSG: defb "Memory top",0 + +; The following list reports all the functions supported by the interpreter. +; To add a custom function, the user must first insert the reserved word here, +; then into the list of the reserved words below, and finally must increment the +; ZSGN token value and all the following ones after ZSGN by 1 for every added +; function. + +; FUNCTION ADDRESS TABLE (this is a sort of offset table) +; this list must be coherent with the tokens' functions list. This means that every +; entry here must have the corresponding entry in the tokens list. +FNCTAB: defw SGN + defw TMR ; added by Leonardo Miliani + defw INT + defw ABS + defw USR + defw FRE + defw INP + defw POS + defw SQR + defw RND + defw LOG + defw EXP + defw COS + defw SIN + defw TAN + defw ATN + defw PEEK + defw DEEK + defw VPEEK ; added by Leonardo Miliani + defw VSTAT ; added by Leonardo Miliani + defw SSTAT ; added by Leonardo Miliani + defw INKEY ; added by Leonardo Miliani + defw POINT ; added by Leonardo Miliani + defw INSTR ; added by Leonardo Miliani + defw LEN + defw STR + defw VAL + defw ASC + defw CHR + defw HEX ; added by Grant Searle + defw BIN ; added by Grant Searle + defw LEFT + defw RIGHT + defw MID + +; RESERVED WORD LIST +; Here are all the reserved words used by the interpreter +; To add custom functions/commands, the user must insert the keyword +; in this list, following the schematic +WORDS: defb 'E'+$80,"ND" ; from here the list contains the COMMANDS + defb 'F'+$80,"OR" + defb 'N'+$80,"EXT" + defb 'D'+$80,"ATA" + defb 'I'+$80,"NPUT" + defb 'D'+$80,"IM" + defb 'R'+$80,"EAD" + defb 'L'+$80,"ET" + defb 'G'+$80,"OTO" + defb 'R'+$80,"UN" + defb 'I'+$80,"F" + defb 'R'+$80,"ESTORE" + defb 'G'+$80,"OSUB" + defb 'R'+$80,"ETURN" + defb 'R'+$80,"EM" + defb 'S'+$80,"TOP" + defb 'O'+$80,"UT" + defb 'O'+$80,"N" + defb 'N'+$80,"ULL" + defb 'W'+$80,"AIT" + defb 'D'+$80,"EF" + defb 'P'+$80,"OKE" + defb 'D'+$80,"OKE" + defb 'V'+$80,"POKE" ; added by Leonardo Miliani + defb 'S'+$80,"REG" ; added by Leonardo Miliani + defb 'V'+$80,"REG" ; added by Leonardo Miliani + defb 'S'+$80,"CREEN" ; changed by Leonardo Miliani + defb 'L'+$80,"OCATE" ; added by Leonardo Miliani + defb 'S'+$80,"OUND" ; added by Leonardo Miliani + defb 'V'+$80,"OLUME" ; added by Leonardo Miliani + defb 'P'+$80,"AUSE" ; added by Leonardo Miliani + defb 'C'+$80,"OLOR" ; added by Leonardo Miliani + defb 'P'+$80,"LOT" ; added by Leonardo Miliani + defb 'D'+$80,"RAW" ; added by Leonardo Miliani + defb 'C'+$80,"IRCLE" ; added by Leonardo Miliani + defb 'S'+$80,"ERIAL" ; added by Leonardo Miliani + defb 'H'+$80,"ELP" ; changed by Leonardo Miliani - was LINES + defb 'C'+$80,"LS" ; restored command + defb 'K'+$80,"EY" ; added by Leonardo Miliani + defb 'N'+$80,"MI" ; added by Leonardo Miliani + defb 'G'+$80,"PRINT" ; added by Leonardo Miliani + defb 'W'+$80,"IDTH" + defb 'S'+$80,"YS" ; added by Leonardo Miliani + defb 'R'+$80,"ESET" ; changed by Leonardo Miliani + defb 'P'+$80,"RINT" + defb 'C'+$80,"ONT" + defb 'L'+$80,"IST" + defb 'C'+$80,"LEAR" + defb 'C'+$80,"LOAD" + defb 'C'+$80,"SAVE" + defb 'N'+$80,"EW" + defb 'T'+$80,"AB(" + defb 'T'+$80,"O" + defb 'F'+$80,"N" + defb 'S'+$80,"PC(" + defb 'T'+$80,"HEN" + defb 'N'+$80,"OT" + defb 'S'+$80,"TEP" + ; from here: operators + defb '+'+$80 + defb '-'+$80 + defb '*'+$80 + defb '/'+$80 + defb '%'+$80 + defb '#'+$80 + defb '^'+$80 + defb 'A'+$80,"ND" + defb 'X'+$80,"OR" + defb 'O'+$80,"R" + defb '>'+$80 + defb '='+$80 + defb '<'+$80 + + ; from here there are the tokens' FUNCTIONS list + ; this list must be coherent with the functions list above + defb 'S'+$80,"GN" + defb 'T'+$80,"MR" ; added by Leonardo Miliani + defb 'I'+$80,"NT" + defb 'A'+$80,"BS" + defb 'U'+$80,"SR" + defb 'F'+$80,"RE" + defb 'I'+$80,"NP" + defb 'P'+$80,"OS" + defb 'S'+$80,"QR" + defb 'R'+$80,"ND" + defb 'L'+$80,"OG" + defb 'E'+$80,"XP" + defb 'C'+$80,"OS" + defb 'S'+$80,"IN" + defb 'T'+$80,"AN" + defb 'A'+$80,"TN" + defb 'P'+$80,"EEK" + defb 'D'+$80,"EEK" + defb 'V'+$80,"PEEK" ; added by Leonardo Miliani + defb 'V'+$80,"STAT" ; added by Leonardo Miliani + defb 'S'+$80,"STAT" ; added by Leonardo Miliani + defb 'I'+$80,"NKEY" ; added by Leonardo Miliani + defb 'P'+$80,"OINT" ; added by Leonardo Miliani + defb 'I'+$80,"NSTR" ; added by Leonardo Miliani + defb 'L'+$80,"EN" + defb 'S'+$80,"TR$" + defb 'V'+$80,"AL" + defb 'A'+$80,"SC" + defb 'C'+$80,"HR$" + defb 'H'+$80,"EX$" ; added by Grant Searle + defb 'B'+$80,"IN$" ; added by Grant Searle + defb 'L'+$80,"EFT$" + defb 'R'+$80,"IGHT$" + defb 'M'+$80,"ID$" + defb $80 ; End-of-list marker + +; KEYWORD ADDRESS TABLE +; this list must be coherent with the commands' +; tokens list above +WORDTB: defw PEND + defw FOR + defw NEXT + defw DATA + defw INPUT + defw DIM + defw READ + defw LET + defw GOTO + defw RUN + defw IF + defw RESTOR + defw GOSUB + defw RETURN + defw REM + defw STOP + defw POUT + defw ON + defw REM ; removed - was NULL + defw WAIT + defw DEF + defw POKE + defw DOKE + defw VPOKE ; added by Leonardo Miliani + defw SREG ; added by Leonardo Miliani + defw VREG ; added by Leonardo Miliani + defw SCREEN ; mod function: now it sets up a graphics mode (Leonardo Miliani) + defw LOCATE ; added by Leonardo Miliani + defw SOUND ; added by Leonardo Miliani + defw VOLUME ; added by Leonardo Miliani + defw PAUSE ; added by Leonardo Miliani + defw COLOR ; added by Leonardo Miliani + defw PLOT ; added by Leonardo Miliani + defw DRAW ; added by Leonardo Miliani + defw CIRCLE ; added by Leonardo Miliani + defw SERIAL ; added by Leonardo Miliani + defw HELP ; changed by Leonardo Miliani - was LINES + defw CLS + defw KEY ; added by Leonardo Miliani + defw NMI ; added by Leonardo Miliani + defw GPRINT ; added by Leonardo Miliani + defw WIDTH + defw SYS ; added by Leonardo Miliani + defw RESET ; new behaviour: now it resets the system + defw PRINT + defw CONT + defw LIST + defw CLEAR + defw REM ; not implemented (was CLOAD) + defw REM ; not implemented (was CSAVE) + defw NEW + +; RESERVED WORD TOKEN VALUES +; if you add a function or command you must increment by 1 +; the values below. Pay attention that you must increment only the +; values AFTER the position where you entered the function/command word +; in the "Reserver word list" above. I.E.: VPOKE has been added between +; DOKE and SCREEN, and since REM is the reserved work listed below +; that is before the point where VPOKE has been entered, every entry +; after REM has been incremented. +; Another example: when TMR has been added, since it's a function, every +; entry after & included ZSGN must be checked (read below) + +ZEND equ $80 ; END <-- from here, there are the commands +ZFOR equ $81 ; FOR +ZDATA equ $83 ; DATA +ZGOTO equ $88 ; GOTO +ZGOSUB equ $8C ; GOSUB +ZREM equ $8E ; REM +ZPRINT equ $AC ; PRINT +ZNEW equ $B2 ; NEW + +ZTAB equ $B3 ; TAB +ZTO equ $B4 ; TO +ZFN equ $B5 ; FN +ZSPC equ $B6 ; SPC +ZTHEN equ $B7 ; THEN +ZNOT equ $B8 ; NOT +ZSTEP equ $B9 ; STEP + +ZPLUS equ $BA ; + <-- from here, there are the math operators +ZMINUS equ $BB ; - +ZTIMES equ $BC ; * +ZDIV equ $BD ; / +ZMOD equ $BE ; % +ZDINT equ $BF ; # +ZOR equ $C3 ; OR +ZGTR equ $C4 ; > +ZEQUAL equ $C5 ; M +ZLTH equ $C6 ; < + +ZSGN equ $C7 ; SGN <-- from here, there are the functions +ZPOINT equ $DD ; ZPOINT <-- if the user enters a custom function, between + ; SGN and POINT, he/she must increment this pointer by 1 +ZINSTR equ $DE ; ZINSTR <-- same here +ZLEFT equ $E6 ; LEFT$ <-- if the user enters a custom function anywhere, + ; he/she must increment this pointer by 1 + +; ARITHMETIC PRECEDENCE TABLE +; in the formulas below, is a number stored into the stack that must be retrieved +; with POP BC, POP DE; FPREG is a f.p. number store into the RAM register FPREG +PRITAB: defb $79 ; Precedence value + defw PADD ; FPREG = + FPREG + + defb $79 ; Precedence value + defw PSUB ; FPREG = - FPREG + + defb $7C ; Precedence value + defw MULT ; PPREG = * FPREG + + defb $7C ; Precedence value + defw DIV ; FPREG = / FPREG + + defb $7C ; Precedence value + defw MOD ; FPREG = INT()-(INT(FPREG)*INT(/FPREG)) + + defb $7C ; precedence value + defw DINT ; FPREG = INT( / FPREG ) + + defb $7F ; Precedence value + defw POWER ; FPREG = ^ FPREG + + defb $50 ; Precedence value + defw PAND ; FPREG = AND FPREG + + defb $4A ; Precedence value + defw PXOR ; FPREG = XOR FPREG + + defb $46 ; Precedence value + defw POR ; FPREG = OR FPREG + +; BASIC ERROR CODE LIST + +ERRORS equ $ +NFMSG: defb "NEXT Without FOR",0 +SNMSG: defb "Syntax",0 +RGMSG: defb "RETURN without GOSUB",0 +ODMSG: defb "Out of DATA",0 +FCMSG: defb "Illegal Function Call",0 +OVMSG: defb "Overflow",0 +OMMSG: defb "Out of Memory",0 +ULMSG: defb "Undefined Line",0 +BSMSG: defb "Bad Subscript",0 +DDMSG: defb "Re-Dimensioned Array",0 +DZMSG: defb "Division by Zero",0 +IDMSG: defb "Illegal Direct",0 +TMMSG: defb "Type Mis-match",0 +OSMSG: defb "Out of String Space",0 +LSMSG: defb "String Too Long",0 +STMSG: defb "String Formula Too Complex",0 +CNMSG: defb "Can't Continue",0 +UFMSG: defb "Undefined FN Function",0 +MOMSG: defb "Missing Operand",0 +HXMSG: defb "HEX Format",0 +BNMSG: defb "BIN Format",0 +GMMSG: defb "No Graphics Mode",0 +SCMSG: defb "Serial Configuration",0 +SAMSG: defb "Serial Port Already Open",0 +HPMSG: defb "HELP Call",0 + +ERRTBL equ $ +NFPTR defw NFMSG +SNPTR defw SNMSG +RGPTR defw RGMSG +ODPTR defw ODMSG +FCPTR defw FCMSG +OVPTR defw OVMSG +OMPTR defw OMMSG +ULPTR defw ULMSG +BSPTR defw BSMSG +DDPTR defw DDMSG +DZPTR defw DZMSG +IDPTR defw IDMSG +TMPTR defw TMMSG +OSPTR defw OSMSG +LSPTR defw LSMSG +STPTR defw STMSG +CNPTR defw CNMSG +UFPTR defw UFMSG +MOPTR defw MOMSG +HXPTR defw HXMSG +BNPTR defw BNMSG +GMPRT defw GMMSG +SCPTR defw SCMSG +SAPTR defw SAMSG +HPPTR defw HPMSG + +; INITIALISATION TABLE ------------------------------------------------------- +; these values are copied into RAM at startup +INITAB: jp WARMST ; Warm start jump + defb $ED,$45,$00 ; RETN + NOP for default NMI service routine + jp FCERR ; "USR (X)" jump (Set to Error) + out (0),A ; "out p,n" skeleton + ret + sub $00 ; Division support routine + ld L,A + ld A,H + sbc A,$00 + ld H,A + ld A,B + sbc A,$00 + ld B,A + ld A,$00 + ret + defb $00,$00,$00 ; Random number seed table used by RND + defb $35,$4A,$CA,$99 ;-2.65145E+07 + defb $39,$1C,$76,$98 ; 1.61291E+07 + defb $22,$95,$B3,$98 ;-1.17691E+07 + defb $0A,$DD,$47,$98 ; 1.30983E+07 + defb $53,$D1,$99,$99 ;-2-01612E+07 + defb $0A,$1A,$9F,$98 ;-1.04269E+07 + defb $65,$BC,$CD,$98 ;-1.34831E+07 + defb $D6,$77,$3E,$98 ; 1.24825E+07 + defb $52,$C7,$4F,$80 ; Last random number + in A,($00) ; INP (x) skeleton + ret + defb $FF ; Terminal width (255 = no auto CRLF) + defb $14 ; Width for commas (at reset, 3 columns, for G1 mode) + defb $00 ; No nulls after input bytes + defb $00 ; Output enabled (^O off) + defw $00 ; Array load/save check sum + defb $00 ; Break not by NMI + defb $00 ; Break flag + jp TTYLIN ; Input reflection (set to TTY) + defw STLOOK ; Temp string space + defw -2 ; Current line number (cold) + defw -1 ; Current line with errors (no errors) +DEFFNKS:defm "LIST",13,0,0,0,0,0,0,0,0,0,0,0 ; KEY 1 + defm "RUN",13,0,0,0,0,0,0,0,0,0,0,0,0 ; KEY 2 + defm "SCREEN1",13,0,0,0,0,0,0,0,0 ; KEY 3 + defm "COLOR1,15,5",13,0,0,0,0 ; KEY 4 + defm "SERIAL1,38400",13,0,0 ; KEY 5 + defm "SCREEN2",13,0,0,0,0,0,0,0,0 ; KEY 6 + defm "CONT",13,0,0,0,0,0,0,0,0,0,0,0 ; KEY 7 + defm "HELP",13,0,0,0,0,0,0,0,0,0,0,0 ; KEY 8 (HELP KEY) + defw PROGST+1 ; Start of program text +INITBE: + +; END OF INITIALISATION TABLE --------------------------------------------------- + +ERRMSG: defb " Error",0 +INMSG: defb " in ",0 +ZERBYT equ $-1 ; A zero byte +OKMSG: defb "Ok",CR,0,0 +BRKMSG: defb "Break",0 + +BAKSTK: ld HL,$04 ; Look for "FOR" block with + add HL,SP ; same index as specified +LOKFOR: ld A,(HL) ; Get block ID + inc HL ; Point to index address + cp ZFOR ; Is it a "FOR" token + ret NZ ; No - exit + ld C,(HL) ; BC = Address of "FOR" index + inc HL + ld B,(HL) + inc HL ; Point to sign of STEP + push HL ; Save pointer to sign + ld L,C ; HL = address of "FOR" index + ld H,B + ld A,D ; See if an index was specified + or E ; DE = 0 if no index specified + ex DE,HL ; Specified index into HL + jp Z,INDFND ; Skip if no index given + ex DE,HL ; Index back into DE + call CPDEHL ; Compare index with one given +INDFND: ld BC,16-3 ; Offset to next block + pop HL ; Restore pointer to sign + ret Z ; Return if block found + add HL,BC ; Point to next block + jp LOKFOR ; Keep on looking + +MOVUP: call ENFMEM ; See if enough memory +MOVSTR: push BC ; Save end of source + ex (SP),HL ; Swap source and dest" end + pop BC ; Get end of destination +MOVLP: call CPDEHL ; See if list moved + ld A,(HL) ; Get byte + ld (BC),A ; Move it + ret Z ; Exit if all done + dec BC ; Next byte to move to + dec HL ; Next byte to move + jp MOVLP ; Loop until all bytes moved + +CHKSTK: push HL ; Save code string address + ld HL,(ARREND) ; Lowest free memory + ld B,$00 ; BC = Number of levels to test + add HL,BC ; 2 Bytes for each level + add HL,BC + defb $3E ; Skip "push HL" +ENFMEM: push HL ; Save code string address + ld A,$D0 ; LOW -48 ; 48 Bytes minimum RAM + sub L + ld L,A + ld A,$FF ; HIGH (-48) ; 48 Bytes minimum RAM + sbc A,H + jp C,OMERR ; Not enough - ?OM Error + ld H,A + add HL,SP ; Test if stack is overflowed + pop HL ; Restore code string address + ret C ; Return if enough memory +OMERR: ld E,OM ; ?OM Error + jp ERROR + + +; if in graphics mode, return to text (called by "NOLIN" and "ERROR") +EXITGM: push AF ; store AF + ld A,(SCR_MODE) ; check screen mode + cp $02 ; G2? + jp Z,LDG1 ; yes, back to G1 + cp $03 ; G3? + jr NZ,LDG1ND ; no, so return +LDG1: push HL ; store HL + push DE ; store DE + ld DE,$0001 ; sprites set to defaults, G1 mode + di ; disable INTs + call initVDP ; initialize VDP with mode pointed by E + ei ; re-enable INTs + ld A,$01 ; activate the... + ld (PRNTVIDEO),A ; ...video buffer... + pop DE ; retrieve DE + pop HL ; retrieve HL +LDG1ND: pop AF ; retrieve AF + ret ; return to caller + + +DATSNR: ld HL,(DATLIN) ; Get line of current DATA item + ld (LINEAT),HL ; Save as current line +SNERR: ld E,SN ; ?SN Error + defb $01 ; Skip "ld E,DZ" +DZERR: ld E,DZ ; ?/0 Error + defb $01 ; Skip "ld E,NF" +NFERR: ld E,NF ; ?NF Error + defb $01 ; Skip "ld E,DD" +DDERR: ld E,DD ; ?DD Error + defb $01 ; Skip "ld E,UF" +UFERR: ld E,UF ; ?UF Error + defb $01 ; Skip "ld E,OV +OVERR: ld E,OV ; ?OV Error + defb $01 ; Skip "ld E,TM" +TMERR: ld E,TM ; ?TM Error + +ERROR: call CLREG ; Clear registers and stack + call EXITGM ; exit from graphic modes + ld (CTLOFG),A ; Enable output (A is 0) + call CURSOR_ON ; enable cursor + call STTLIN ; Start new line + ld HL,ERRTBL ; Point to error codes + ld D,A ; D = 0 (A is 0) + ld A,'?' + call OUTC ; Output '?' + add HL,DE ; Offset to correct error code + ld E,(HL) ; load pointer to error message + inc HL ; by loading LSB, + ld D,(HL) ; then MSB + ld HL,DE ; load pointer to HL + call PRS ; Output error message + ld HL,ERRMSG ; "Error" message +ERRIN: call PRS ; Output message + ld HL,(LINEAT) ; Get line of error + ld DE,-2 ; Cold start error if -2 + call CPDEHL ; See if cold start error + jp Z,CSTART ; Cold start error - Restart + ld A,H ; Was it a direct error? + and L ; Line = -1 if direct error + inc A + jp Z,PTLN ; Yes, jump over + push HL ; indirect mode - store HL + ld HL,(LINEAT) ; copy current line number + ld (HLPLN),HL ; save in HELP line register + pop HL ; retrieve HL +PTLN: call NZ,LINEIN ; No - output line of error + + defb $3E ; Skip "pop BC" +POPNOK: pop BC ; Drop address in input buffer + +; run into direct mode: print OK and get command +PRNTOK: xor A ; Output "Ok" and get command + ld (CTLOFG),A ; Enable output + call STTLIN ; Start new line + ld HL,OKMSG ; "Ok" message + call PRS ; Output "Ok" +GETCMD: call CURSOR_ON ; enable cursor + ld HL,-1 ; Flag direct mode + ld (LINEAT),HL ; Save as current line + call GETLIN ; Get an input line + jp C,GETCMD ; Get line again if break + call GETCHR ; Get first character + rla ; 8th bit is copied into carry and original carry is copied into bit 0) + jp C,SNERR ; if char >=128 (8th bit set) then raise an error + rra ; recover original char and Carry + inc A ; Test if end of line + dec A ; Without affecting Carry + jp Z,GETCMD ; Nothing entered - Get another + push AF ; Save Carry status + call CURSOR_OFF ; cursor disabled + call ATOH ; Get line number into DE + push DE ; Save line number + call CRUNCH ; Tokenise rest of line + ld B,A ; Length of tokenised line + pop DE ; Restore line number + pop AF ; Restore Carry + jp NC,EXCUTE ; No line number - Direct mode + push DE ; Save line number + push BC ; Save length of tokenised line + xor A + ld (LSTBIN),A ; Clear last byte input + call GETCHR ; Get next character + or A ; Set flags + push AF ; And save them + call SRCHLN ; Search for line number in DE + jp C,LINFND ; Jump if line found + pop AF ; Get status + push AF ; And re-save + jp Z,ULERR ; Nothing after number - Error + or A ; Clear Carry +LINFND: push BC ; Save address of line in prog + jp NC,INEWLN ; Line not found - Insert new + ex DE,HL ; Next line address in DE + ld HL,(PROGND) ; End of program +SFTPRG: ld A,(DE) ; Shift rest of program down + ld (BC),A + inc BC ; Next destination + inc DE ; Next source + call CPDEHL ; All done? + jp NZ,SFTPRG ; More to do + ld H,B ; HL - New end of program + ld L,C + ld (PROGND),HL ; Update end of program + +INEWLN: pop DE ; Get address of line, + pop AF ; Get status + jp Z,SETPTR ; No text - Set up pointers + ld HL,(PROGND) ; Get end of program + ex (SP),HL ; Get length of input line + pop BC ; End of program to BC + add HL,BC ; Find new end + push HL ; Save new end + call MOVUP ; Make space for line + pop HL ; Restore new end + ld (PROGND),HL ; Update end of program pointer + ex DE,HL ; Get line to move up in HL + ld (HL),H ; Save MSB + pop DE ; Get new line number + inc HL ; Skip pointer + inc HL + ld (HL),E ; Save LSB of line number + inc HL + ld (HL),D ; Save MSB of line number + inc HL ; To first byte in line + ld DE,BUFFER ; Copy buffer to program +MOVBUF: ld A,(DE) ; Get source + ld (HL),A ; Save destinations + inc HL ; Next source + inc DE ; Next destination + or A ; Done? + jp NZ,MOVBUF ; No - Repeat +SETPTR: call RUNFST ; Set line pointers + inc HL ; To LSB of pointer + ex DE,HL ; Address to DE +PTRLP: ld H,D ; Address to HL + ld L,E + ld A,(HL) ; Get LSB of pointer + inc HL ; To MSB of pointer + or (HL) ; Compare with MSB pointer + jp Z,GETCMD ; Get command line if end + inc HL ; To LSB of line number + inc HL ; Skip line number + inc HL ; Point to first byte in line + xor A ; Looking for 00 byte +FNDEND: cp (HL) ; Found end of line? + inc HL ; Move to next byte + jp NZ,FNDEND ; No - Keep looking + ex DE,HL ; Next line address to HL + ld (HL),E ; Save LSB of pointer + inc HL + ld (HL),D ; Save MSB of pointer + jp PTRLP ; Do next line + +SRCHLN: ld HL,(BASTXT) ; Start of program text +SRCHLP: ld B,H ; BC = Address to look at + ld C,L + ld A,(HL) ; Get address of next line + inc HL + or (HL) ; End of program found? + dec HL + ret Z ; Yes - Line not found + inc HL + inc HL + ld A,(HL) ; Get LSB of line number + inc HL + ld H,(HL) ; Get MSB of line number + ld L,A + call CPDEHL ; Compare with line in DE + ld H,B ; HL = Start of this line + ld L,C + ld A,(HL) ; Get LSB of next line address + inc HL + ld H,(HL) ; Get MSB of next line address + ld L,A ; Next line to HL + ccf + ret Z ; Lines found - Exit + ccf + ret NC ; Line not found,at line after + jp SRCHLP ; Keep looking + +NEW: ret NZ ; Return if any more on line +CLRPTR: ld HL,(BASTXT) ; Point to start of program + xor A ; Set program area to empty + ld (HL),A ; Save LSB = 00 + inc HL + ld (HL),A ; Save MSB = 00 + inc HL + ld (PROGND),HL ; Set program end + +RUNFST: ld HL,(BASTXT) ; Clear all variables + dec HL + +INTVAR: ld (BRKLIN),HL ; Initialise RUN variables + ld HL,(LSTRAM) ; Get end of RAM + ld (STRBOT),HL ; Clear string space + xor A + call RESTOR ; Reset DATA pointers + ld HL,(PROGND) ; Get end of program + ld (VAREND),HL ; Clear variables + ld (ARREND),HL ; Clear arrays + +CLREG: pop BC ; Save return address + ld HL,(STRSPC) ; Get end of working RAM + ld SP,HL ; Set stack + ld HL,TMSTPL ; Temporary string pool + ld (TMSTPT),HL ; Reset temporary string ptr + xor A ; A = 00 + ld L,A ; HL = 0000 + ld H,A + ld (CONTAD),HL ; No CONTinue + ld (FORFLG),A ; Clear FOR flag + ld (FNRGNM),HL ; Clear FN argument + push HL ; HL = 0000 + push BC ; Put back return +DOAGN: ld HL,(BRKLIN) ; Get address of code to RUN + ret ; Return to execution driver + +PROMPT: ld A,'?' ; '?' + call OUTC ; Output character + ld A,NLLCR ; null char + call OUTC ; Output character + call CURSOR_ON ; enable cursor + jp RINPUT ; Get input line + +CRUNCH: xor A ; Tokenise line @ HL to BUFFER + ld (DATFLG),A ; Reset literal flag + ld C,2+3 ; 2 byte number and 3 nulls + ld DE,BUFFER ; Start of input buffer +CRNCLP: ld A,(HL) ; Get byte + cp SPC ; Is it a space? + jp Z,MOVDIR ; Yes - Copy direct + ld B,A ; Save character + cp 22H ; '"' ; Is it a quote? + jp Z,CPYLIT ; Yes - Copy literal string + or A ; Is it end of buffer? + jp Z,ENDBUF ; Yes - End buffer + ld A,(DATFLG) ; Get data type + or A ; Literal? + ld A,(HL) ; Get byte to copy + jp NZ,MOVDIR ; Literal - Copy direct + cp '?' ; Is it '?' short for PRINT + ld A,ZPRINT ; "PRINT" token + jp Z,MOVDIR ; Yes - replace it + ld A,(HL) ; Get byte again + cp '0' ; Is it less than '0' + jp C,FNDWRD ; Yes - Look for reserved words + cp $3C ;60; ";"+1 ; Is it "0123456789:;" ? + jp C,MOVDIR ; Yes - copy it direct +FNDWRD: push DE ; Look for reserved words + ld DE,WORDS-1 ; Point to table + push BC ; Save count + ld BC,RETNAD ; Where to return to + push BC ; Save return address + ld B,ZEND-1 ; First token value -1 + ld A,(HL) ; Get byte + cp 'a' ; Less than 'a' ? + jp C,SEARCH ; Yes - search for words + cp 'z'+1 ; Greater than 'z' ? + jp NC,SEARCH ; Yes - search for words + and %01011111 ; Force upper case + ld (HL),A ; Replace byte +SEARCH: ld C,(HL) ; Search for a word + ex DE,HL +GETNXT: inc HL ; Get next reserved word + or (HL) ; Start of word? + jp P,GETNXT ; No - move on + inc B ; Increment token value + ld A,(HL) ; Get byte from table + and %01111111 ; Strip bit 7 + ret Z ; Return if end of list + cp C ; Same character as in buffer? + jp NZ,GETNXT ; No - get next word + ex DE,HL + push HL ; Save start of word + +NXTBYT: inc DE ; Look through rest of word + ld A,(DE) ; Get byte from table + or A ; End of word ? + jp M,MATCH ; Yes - Match found + ld C,A ; Save it + ld A,B ; Get token value + cp ZGOTO ; Is it "GOTO" token ? + jp NZ,NOSPC ; No - Don't allow spaces + call GETCHR ; Get next character + dec HL ; Cancel increment from GETCHR +NOSPC: inc HL ; Next byte + ld A,(HL) ; Get byte + cp 'a' ; Less than 'a' ? + jp C,NOCHNG ; Yes - don't change + and %01011111 ; Make upper case +NOCHNG: cp C ; Same as in buffer ? + jp Z,NXTBYT ; Yes - keep testing + pop HL ; Get back start of word + jp SEARCH ; Look at next word + +MATCH: ld C,B ; Word found - Save token value + pop AF ; Throw away return + ex DE,HL + ret ; Return to "RETNAD" +RETNAD: ex DE,HL ; Get address in string + ld A,C ; Get token value + pop BC ; Restore buffer length + pop DE ; Get destination address +MOVDIR: inc HL ; Next source in buffer + ld (DE),A ; Put byte in buffer + inc DE ; Move up buffer + inc C ; Increment length of buffer + sub ':' ; End of statement? + jp Z,SETLIT ; Jump if multi-statement line + cp ZDATA-$3A ; Is it DATA statement ? + jp NZ,TSTREM ; No - see if REM +SETLIT: ld (DATFLG),A ; Set literal flag +TSTREM: sub ZREM-$3A ; Is it REM? + jp NZ,CRNCLP ; No - Leave flag + ld B,A ; Copy rest of buffer +NXTCHR: ld A,(HL) ; Get byte + or A ; End of line ? + jp Z,ENDBUF ; Yes - Terminate buffer + cp B ; End of statement ? + jp Z,MOVDIR ; Yes - Get next one +CPYLIT: inc HL ; Move up source string + ld (DE),A ; Save in destination + inc C ; Increment length + inc DE ; Move up destination + jp NXTCHR ; Repeat + +ENDBUF: ld HL,BUFFER-1 ; Point to start of buffer + ld (DE),A ; Mark end of buffer (A = 00) + inc DE + ld (DE),A ; A = 00 + inc DE + ld (DE),A ; A = 00 + ret + +DODEL: ld A,(NULFLG) ; Get null flag status + or A ; Is it zero? + ld A,$00 ; Zero A - Leave flags + ld (NULFLG),A ; Zero null flag + jp NZ,ECHDEL ; Set - Echo it + dec B ; Decrement length + jp Z,GETLIN ; Get line again if empty + call OUTC ; Output null character + defb $3E ; Skip "dec B" +ECHDEL: dec B ; Count bytes in buffer + dec HL ; Back space buffer + jp Z,OTKLN ; No buffer - Try again + ld A,(HL) ; Get deleted byte + call OUTC ; Echo it + jp MORINP ; Get more input + +DELCHR: dec B ; Count bytes in buffer + dec HL ; Back space buffer + call OUTC ; Output character in A + jp NZ,MORINP ; Not end - Get more +OTKLN: call OUTC ; Output character in A +KILIN: call PRNTCRLF ; Output CRLF + jp TTYLIN ; Get line again + +GETLIN: +TTYLIN: ld HL,BUFFER ; Get a line by character + ld B,$01 ; Set buffer as empty + xor A + ld (NULFLG),A ; Clear null flag +MORINP: call CLOTST ; Get character and test ^O + ld C,A ; Save character in C + cp DEL ; Delete character? + jp Z,DODEL ; Yes - Process it + ld A,(NULFLG) ; Get null flag + or A ; Test null flag status + jp Z,PROCES ; Reset - Process character + ld A,$00 ; Set a null + call OUTC ; Output null + xor A ; Clear A + ld (NULFLG),A ; Reset null flag +PROCES: ld A,C ; Get character + cp CTRLG ; Bell? + jp Z,PUTCTL ; Yes - Save it + cp CTRLC ; Is it control "C"? + call Z,GMNCR ; Yes - exit from graphic mode & Output CRLF + scf ; Flag break + ret Z ; Return if control "C" + cp CR ; Is it enter? + jp Z,ENDINP ; Yes - Terminate input + cp CTRLU ; Is it control "U"? + jp Z,KILIN ; Yes - Get another line + cp BKSP ; Is it backspace? + jp Z,DELCHR ; Yes - Delete character + cp CTRLR ; Is it control "R"? + jp NZ,PUTBUF ; No - Put in buffer + push BC ; Save buffer length + push DE ; Save DE + push HL ; Save buffer address + ld (HL),$00 ; Mark end of buffer + call OUTNCR ; Output and do CRLF + ld HL,BUFFER ; Point to buffer start + call PRS ; Output buffer + pop HL ; Restore buffer address + pop DE ; Restore DE + pop BC ; Restore buffer length + jp MORINP ; Get another character +GMNCR: call EXITGM ; exit from graphic mode + jp PRNTCRLF ; output CRLF + +PUTBUF: cp SPC ; Is it a control code? + jp C,MORINP ; Yes - Ignore +PUTCTL: ld A,B ; Get number of bytes in buffer + cp $58+$01 ; Test for line overflow + ld A,BKSP ; Set a bell + jp NC,OUTNBS ; Ring bell if buffer full + ld A,C ; Get character + ld (HL),C ; Save in buffer + ld (LSTBIN),A ; Save last input byte + inc HL ; Move up buffer + inc B ; Increment length +OUTIT: jp MORINP ; Get another character + +OUTNBS: call OUTC ; Output bell and back over it + ;ld A,BKSP ; send back space + ;call OUTC ; + jp OUTIT ; get more chars + +CPDEHL: ld A,H ; Get H + sub D ; Compare with D + ret NZ ; Different - Exit + ld A,L ; Get L + sub E ; Compare with E + ret ; Return status + +CHKSYN: ld A,(HL) ; Check syntax of character + ex (SP),HL ; Address of test byte + cp (HL) ; Same as in code string? + inc HL ; Return address + ex (SP),HL ; Put it back + jp Z,GETCHR ; Yes - Get next character + jp SNERR ; Different - ?SN Error + +OUTC: push AF ; Save character + ld A,(CTLOFG) ; Get control "O" flag + or A ; Is it set? + jp NZ,POPAF ; Yes - don't output + pop AF ; Restore character + push BC ; Save buffer length + push AF ; Save character + cp SPC ; Is it a control code? + jp C,DINPOS ; Yes - Don't inc POS(X) + ld A,(LWIDTH) ; Get line width + ld B,A ; To B + ld A,(CURPOS) ; Get cursor position + inc B ; Width 255? + jp Z,INCLEN ; Yes - No width limit + dec B ; Restore width + cp B ; At end of line? + call Z,PRNTCRLF ; Yes - output CRLF +INCLEN: inc A ; Move on one character + ld (CURPOS),A ; Save new position +DINPOS: xor A + ld (KBDNPT),A ; set flag for no char from keyboard + pop AF ; Restore character + pop BC ; Restore buffer length + push AF + call SND2VID ; send char to video + pop AF + call MONOUT ; send char to serial if enabled + ret + +; print char to video if cursor is on +SND2VID:ld (CHR4VID),A ; store A + ld A,(PRNTVIDEO) ; check print-on-video + or A ; is it off? + ret Z ; yes, so return + di ; disable INTs + call CHAR2VID ; cursor is on, so print char on screen + ei ; re-enable INTs + ret ; return to caller + +CLOTST: call GETINP ; Get input character + cp CTRLO ; Is it control "O"? + ret NZ ; No don't flip flag + ld A,(CTLOFG) ; Get flag + cpl ; Flip it + ld (CTLOFG),A ; Put it back + and A ; is output enabled? + call Z,CURSOR_ON ; yes, so cursor on + xor A ; Null character + ret + +; LIST: list the program stored into memory +LIST: pop BC ; rubbish - not needed (legacy from original call of LIST) + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,LSTALL ; list all if nothing follows + cp ZMINUS ; is it '-'? + jr NZ,LST01 ; no, look for a line number + ld DE,$0000 ; yes, set search from 0 + call SRCHLIN ; find address of line number + ld (TMPBFR1),BC ; store address of starting line + call CHKSYN ; skip '-' + defb ZMINUS + call ATOH ; now, look for another number (ASCII number to DE) + call SRCHLIN ; find address of line number + ld (TMPBFR2),BC ; store address of ending line + ld BC,(TMPBFR1) ; retrieve address of starting line + push BC ; store address of line for later use + jp LISTLP ; go listing +LST01: call ATOH ; get a line number (ASCII number to DE) +LST01H: call SRCHLIN ; find address of line number + ld (TMPBFR1),BC ; store address of starting line + ld (TMPBFR2),BC ; same address for ending line (we'll change later if needed) + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,LST06 ; nothing follows, so ending & starting lines are the same + cp ZMINUS ; is it '-'? + jp Z,LST03 ; yes, read ending line +LST04: call SRCHLIN ; find address of line number + ld (TMPBFR2),BC ; set address of ending line +LST06: push BC ; store address for later use + jp LISTLP ; jump to list +LSTALL ld DE,65529 ; set ending line to max. allowed line number + call SRCHLIN ; get address of last line + ld (TMPBFR2),BC ; store it + ld DE,$0000 ; set start to first line in memory + call SRCHLIN ; get address of first line + ld (TMPBFR1),BC ; store it + push BC ; store address of starting line for later use + jp LISTLP ; start printing +LST03: call CHKSYN ; skip '-' + defb ZMINUS + call ATOH ; look for another number (return into DE) + ld A,D + or E ; is line=0? + jr NZ,LST05 ; no, jump over + ld DE,65529 ; yes set last valid line number +LST05: call SRCHLIN ; find address of line number + ld (TMPBFR2),BC ; store address of ending line + ld BC,(TMPBFR1) ; retrieve address of starting line + push BC ; store it for later use +LISTLP: pop HL ; Restore address of line + ld C,(HL) ; Get LSB of next line + inc HL + ld B,(HL) ; Get MSB of next line + inc HL + ld A,B ; BC = 0 (End of program)? + or C + jp Z,PRNTOK ; Yes - Go to command mode + call TSTBRK ; Test for break key + call TSTSPC ; test for space + push BC ; Save address of next line + ld A,(SCR_CURS_X) ; load current X pos of cursor + and A ; is it at the beginning of a new line? + jr NZ,LST08 ; No, jump over + ld A,CR ; yes, so just send a CR + call MONOUT ; to serial if it's open + xor A ; then, set cursor + ld (CURPOS),A ; to position 0 + jr LST07 ; and continue +LST08: call PRNTCRLF ; output CRLF +LST07: ld E,(HL) ; Get LSB of line number + inc HL + ld D,(HL) ; Get MSB of line number + inc HL + push HL ; Save address of line start + ex DE,HL ; Line number to HL + call PRNTHL ; Output line number in decimal + ld A,SPC ; Space after line number + pop HL ; Restore start of line address +LSTLP2: call OUTC ; Output character in A +LSTLP3: ld A,(HL) ; Get next byte in line + or A ; End of line? + inc HL ; To next byte in line + jp Z,NXTLN ; Yes - check next line + jp P,LSTLP2 ; No token - output it + sub ZEND-1 ; Find and output word + ld C,A ; Token offset+1 to C + ld DE,WORDS ; Reserved word list +FNDTOK: ld A,(DE) ; Get character in list + inc DE ; Move on to next + or A ; Is it start of word? + jp P,FNDTOK ; No - Keep looking for word + dec C ; Count words + jp NZ,FNDTOK ; Not there - keep looking +OUTWRD: and %01111111 ; Strip bit 7 + call OUTC ; Output character + ld A,(DE) ; Get next character + inc DE ; Move on to next + or A ; Is it end of word? + jp P,OUTWRD ; No - output the rest + jp LSTLP3 ; Next byte in line +NXTLN: pop DE ; recover address of current line + ld HL,(TMPBFR2) ; address of last line to print + call CMP16 ; check if current line is over last printable line + jp C,PRNTOK ; finish - leave & print OK + push DE ; store address of current line + jp LISTLP ; continue listing +SRCHLIN:push HL ; store HL (this is needed because HL store the pointer to the input buffer) + call SRCHLN ; search for line number in DE + pop HL ; retrieve HL + ret ; return to caller + +; during LISTing, check if PAUSE is pressed, then pause listing and +; wait for another pressing of PAUSE to continue or CTRL-C/BREAK to exit +TSTSPC: ld A,(TMPKEYBFR) ; Get input character + cp SPC ; Is it SPACE? + ret NZ ; No, return +WTSPC call GETINP ; Yes, stop listing and wait for another space or BREAK + cp SPC ; is it SPACE? + jr NZ,CNTWTSP ; no, continue + xor A + ld (TMPKEYBFR),A ; reset key + ret ; return to caller +CNTWTSP:cp CTRLC ; is it CTRL-C/BREAK? + jr NZ,WTSPC ; no, loop + jp BRKRET ; exit and output "Ok" + + +FOR: ld A,$64 ; Flag "FOR" assignment + ld (FORFLG),A ; Save "FOR" flag + call LET ; Set up initial index + pop BC ; Drop RETurn address + push HL ; Save code string address + call DATA ; Get next statement address + ld (LOOPST),HL ; Save it for start of loop + ld HL,$0002 ; Offset for "FOR" block + add HL,SP ; Point to it +FORSLP: call LOKFOR ; Look for existing "FOR" block + pop DE ; Get code string address + jp NZ,FORFND ; No nesting found + add HL,BC ; Move into "FOR" block + push DE ; Save code string address + dec HL + ld D,(HL) ; Get MSB of loop statement + dec HL + ld E,(HL) ; Get LSB of loop statement + inc HL + inc HL + push HL ; Save block address + ld HL,(LOOPST) ; Get address of loop statement + call CPDEHL ; Compare the FOR loops + pop HL ; Restore block address + jp NZ,FORSLP ; Different FORs - Find another + pop DE ; Restore code string address + ld SP,HL ; Remove all nested loops + +FORFND: ex DE,HL ; Code string address to HL + ld C,$08 + call CHKSTK ; Check for 8 levels of stack + push HL ; Save code string address + ld HL,(LOOPST) ; Get first statement of loop + ex (SP),HL ; Save and restore code string + push HL ; Re-save code string address + ld HL,(LINEAT) ; Get current line number + ex (SP),HL ; Save and restore code string + call TSTNUM ; Make sure it's a number + call CHKSYN ; Make sure "TO" is next + defb ZTO ; "TO" token + call GETNUM ; Get "TO" expression value + push HL ; Save code string address + call BCDEFP ; Move "TO" value to BCDE + pop HL ; Restore code string address + push BC ; Save "TO" value in block + push DE + ld BC,$8100 ; BCDE - 1 (default STEP) + ld D,C ; C=0 + ld E,D ; D=0 + ld A,(HL) ; Get next byte in code string + cp ZSTEP ; See if "STEP" is stated + ld A,$01 ; Sign of step = 1 + jp NZ,SAVSTP ; No STEP given - Default to 1 + call GETCHR ; Jump over "STEP" token + call GETNUM ; Get step value + push HL ; Save code string address + call BCDEFP ; Move STEP to BCDE + call TSTSGN ; Test sign of FPREG + pop HL ; Restore code string address +SAVSTP: push BC ; Save the STEP value in block + push DE + push AF ; Save sign of STEP + inc SP ; Don't save flags + push HL ; Save code string address + ld HL,(BRKLIN) ; Get address of index variable + ex (SP),HL ; Save and restore code string +PUTFID: ld B,ZFOR ; "FOR" block marker + push BC ; Save it + inc SP ; Don't save C + +RUNCNT: call TSTBRK ; Execution driver - Test break + ld (BRKLIN),HL ; Save code address for break + ld A,(HL) ; Get next byte in code string + cp ':' ; Multi statement line? + jp Z,EXCUTE ; Yes - Execute it + or A ; End of line? + jp NZ,SNERR ; No - Syntax error + inc HL ; Point to address of next line + ld A,(HL) ; Get LSB of line pointer + inc HL + or (HL) ; Is it zero (End of prog)? + jp Z,ENDPRG ; Yes - Terminate execution + inc HL ; Point to line number + ld E,(HL) ; Get LSB of line number + inc HL + ld D,(HL) ; Get MSB of line number + ex DE,HL ; Line number to HL + ld (LINEAT),HL ; Save as current line number + ex DE,HL ; Line number back to DE +EXCUTE: call GETCHR ; Get key word + ld DE,RUNCNT ; Where to RETurn to + push DE ; Save for RETurn +IFJMP: ret Z ; Go to RUNCNT if end of STMT + +ONJMP: sub ZEND ; Is it a token? + jp C,LET ; No - try to assign it + cp ZNEW+1-ZEND ; END to NEW ? + jp NC,SNERR ; Not a key word - ?SN Error + rlca ; Double it + ld C,A ; BC = Offset into table + ld B,0 + ex DE,HL ; Save code string address + ld HL,WORDTB ; Keyword address table + add HL,BC ; Point to routine address + ld C,(HL) ; Get LSB of routine address + inc HL + ld B,(HL) ; Get MSB of routine address + push BC ; Save routine address + ex DE,HL ; Restore code string address + +; get a char from input buffer: exit with NC if character found is +; not a number; exit with Z if nothing found; char is into A +GETCHR: inc HL ; Point to next character + ld A,(HL) ; Get next code string byte + cp ':' ; Z if ':' + ret NC ; NC if > "9" + cp SPC + jp Z,GETCHR ; Skip over spaces + cp '0' + ccf ; NC if < '0' + inc A ; Test for zero - Leave carry + dec A ; Z if Null + ret + +RESTOR: ex DE,HL ; Save code string address + ld HL,(BASTXT) ; Point to start of program + jp Z,RESTNL ; Just RESTORE - reset pointer + ex DE,HL ; Restore code string address + call ATOH ; Get line number to DE + push HL ; Save code string address + call SRCHLN ; Search for line number in DE + ld H,B ; HL = Address of line + ld L,C + pop DE ; Restore code string address + jp NC,ULERR ; ?UL Error if not found +RESTNL: dec HL ; Byte before DATA statement +UPDATA: ld (NXTDAT),HL ; Update DATA pointer + ex DE,HL ; Restore code string address + ret + + +TSTBRK: rst $18 ; Check input status + ret Z ; No key, go back + rst $10 ; Get the key into A + cp ESC ; Escape key? + jr Z,BRK ; Yes, break + cp CTRLC ; + jr Z,BRK ; Yes, break + cp CTRLS ; Stop scrolling? + ret NZ ; Other key, ignore + + +STALL: rst $10 ; Wait for key + cp CTRLQ ; Resume scrolling? + ret Z ; Release the chokehold + cp CTRLC ; Second break? + jr Z,STOP ; Break during hold exits prog + jr STALL ; Loop until or + +BRK: ld A,$FF ; Set BRKFLG + ld (BRKFLG),A ; Store it + +STOP: ret NZ ; Exit if anything else + defb $F6 ; Flag "STOP" +PEND: ret NZ ; Exit if anything else + ld (BRKLIN),HL ; Save point of break + defb $21 ; Skip "OR 11111111B" +INPBRK: or %11111111 ; Flag "Break" wanted + pop BC ; Return not needed and more +ENDPRG: ld HL,(LINEAT) ; Get current line number + push AF ; Save STOP / END status + ld A,L ; Is it direct break? + and H + inc A ; Line is -1 if direct break + jp Z,NOLIN ; Yes - No line number + ld (ERRLIN),HL ; Save line of break + ld HL,(BRKLIN) ; Get point of break + ld (CONTAD),HL ; Save point to CONTinue +NOLIN: xor A + ld (CTLOFG),A ; Enable output + call STTLIN ; Start a new line + pop AF ; Restore STOP / END status + ld HL,BRKMSG ; "Break" message + jp NZ,ERRINT ; "in line" wanted? + jp PRNTOK ; Go to command mode +ERRINT: call EXITGM ; exit from graphics mode + jp ERRIN ; print message + + +CONT: ld HL,-1 ; reset... + ld (HLPLN),HL ; ...HELP line register + ld HL,(CONTAD) ; Get CONTinue address + ld A,H ; Is it zero? + or L + ld E,CN ; ?CN Error + jp Z,ERROR ; Yes - output "?CN Error" + ex DE,HL ; Save code string address + ld HL,(ERRLIN) ; Get line of last break + ld (LINEAT),HL ; Set up current line number + ex DE,HL ; Restore code string address + ret ; CONTinue where left off + +ACCSUM: push HL ; Save address in array + ld HL,(CHKSUM) ; Get check sum + ld B,$00 ; BC - Value of byte + ld C,A + add HL,BC ; Add byte to check sum + ld (CHKSUM),HL ; Re-save check sum + pop HL ; Restore address in array + ret + +CHKLTR: ld A,(HL) ; Get byte + cp 'A' ; < 'a' ? + ret C ; Carry set if not letter + cp 'Z'+1 ; > 'z' ? + ccf + ret ; Carry set if not letter + +FPSINT: call GETCHR ; Get next character +POSINT: call GETNUM ; Get integer 0 to 32767 +DEPINT: call TSTSGN ; Test sign of FPREG + jp M,FCERR ; Negative - ?FC Error +DEINT: ld A,(FPEXP) ; Get integer value to DE + cp $80+$10 ; Exponent in range (16 bits)? + jp C,FPINT ; Yes - convert it + ld BC,$9080 ; BCDE = -32768 + ld DE,$0000 + push HL ; Save code string address + call CMPNUM ; Compare FPREG with BCDE + pop HL ; Restore code string address + ld D,C ; MSB to D + ret Z ; Return if in range +FCERR: ld E,FC ; ?FC Error + jp ERROR ; Output error- + +ATOH: dec HL ; ASCII number to DE binary +GETLN: ld DE,$0000 ; Get number to DE +GTLNLP: call GETCHR ; Get next character + ret NC ; Exit if not a digit + push HL ; Save code string address + push AF ; Save digit + ld HL,65529/10 ; Largest number 65529 + call CPDEHL ; Number in range? + jp C,SNERR ; No - ?SN Error + ld H,D ; HL = Number + ld L,E + add HL,DE ; Times 2 + add HL,HL ; Times 4 + add HL,DE ; Times 5 + add HL,HL ; Times 10 + pop AF ; Restore digit + sub '0' ; Make it 0 to 9 + ld E,A ; DE = Value of digit + ld D,0 + add HL,DE ; Add to number + ex DE,HL ; Number to DE + pop HL ; Restore code string address + jp GTLNLP ; Go to next character + +CLEAR: jp Z,INTVAR ; Just "CLEAR" Keep parameters + call POSINT ; Get integer 0 to 32767 to DE + dec HL ; Cancel increment + call GETCHR ; Get next character + push HL ; Save code string address + ld HL,(LSTRAM) ; Get end of RAM + jp Z,STORED ; No value given - Use stored + pop HL ; Restore code string address + call CHKSYN ; Check for comma + defb ',' + push DE ; Save number + call POSINT ; Get integer 0 to 32767 + dec HL ; Cancel increment + call GETCHR ; Get next character + jp NZ,SNERR ; ?SN Error if more on line + ex (SP),HL ; Save code string address + ex DE,HL ; Number to DE +STORED: ld A,L ; Get LSB of new RAM top + sub E ; Subtract LSB of string space + ld E,A ; Save LSB + ld A,H ; Get MSB of new RAM top + sbc A,D ; Subtract MSB of string space + ld D,A ; Save MSB + jp C,OMERR ; ?OM Error if not enough mem + push HL ; Save RAM top + ld HL,(PROGND) ; Get program end + ld BC,$28 ; 40 Bytes minimum working RAM + add HL,BC ; Get lowest address + call CPDEHL ; Enough memory? + jp NC,OMERR ; No - ?OM Error + ex DE,HL ; RAM top to HL + ld (STRSPC),HL ; Set new string space + pop HL ; End of memory to use + ld (LSTRAM),HL ; Set new top of RAM + pop HL ; Restore code string address + jp INTVAR ; Initialise variables + +RUN: push HL ; store HL + ld HL,-1 ; reset... + ld (HLPLN),HL ; ...HELP line register + pop HL ; retrieve HL + jp Z,RUNFST ; RUN from start if just RUN + call INTVAR ; Initialise variables + ld BC,RUNCNT ; Execution driver loop + jp RUNLIN ; RUN from line number + +GOSUB: ld C,$03 ; 3 Levels of stack needed + call CHKSTK ; Check for 3 levels of stack + pop BC ; Get return address + push HL ; Save code string for RETURN + push HL ; And for GOSUB routine + ld HL,(LINEAT) ; Get current line + ex (SP),HL ; Into stack - Code string out + ld A,ZGOSUB ; "GOSUB" token + push AF ; Save token + inc SP ; Don't save flags + +RUNLIN: push BC ; Save return address +GOTO: call ATOH ; ASCII number to DE binary + call REM ; Get end of line + push HL ; Save end of line + ld HL,(LINEAT) ; Get current line + call CPDEHL ; Line after current? + pop HL ; Restore end of line + inc HL ; Start of next line + call C,SRCHLP ; Line is after current line + call NC,SRCHLN ; Line is before current line + ld H,B ; Set up code string address + ld L,C + dec HL ; Incremented after + ret C ; Line found +ULERR: ld E,UL ; ?UL Error + jp ERROR ; Output error message + +RETURN: ret NZ ; Return if not just RETURN + ld D,-1 ; Flag "GOSUB" search + call BAKSTK ; Look "GOSUB" block + ld SP,HL ; Kill all FORs in subroutine + cp ZGOSUB ; Test for "GOSUB" token + ld E,RG ; ?RG Error + jp NZ,ERROR ; Error if no "GOSUB" found + pop HL ; Get RETURN line number + ld (LINEAT),HL ; Save as current + inc HL ; Was it from direct statement? + ld A,H + or L ; Return to line + jp NZ,RETLIN ; No - Return to line + ld A,(LSTBIN) ; Any INPUT in subroutine? + or A ; If so buffer is corrupted + jp NZ,POPNOK ; Yes - Go to command mode +RETLIN: ld HL,RUNCNT ; Execution driver loop + ex (SP),HL ; Into stack - Code string out + defb $3E ; Skip "pop HL" +NXTDTA: pop HL ; Restore code string address + +DATA: defb $01,$3A ; ':' End of statement +REM: ld C,$00 ; 00 End of statement + ld B,$00 +NXTSTL: ld A,C ; Statement and byte + ld C,B + ld B,A ; Statement end byte +NXTSTT: ld A,(HL) ; Get byte + or A ; End of line? + ret Z ; Yes - Exit + cp B ; End of statement? + ret Z ; Yes - Exit + inc HL ; Next byte + cp $22 ; '"' ; Literal string? + jp Z,NXTSTL ; Yes - Look for another '"' + jp NXTSTT ; Keep looking + +LET: call GETVAR ; Get variable name + call CHKSYN ; Make sure "=" follows + defb ZEQUAL ; "=" token + push DE ; Save address of variable + ld A,(TYPE) ; Get data type + push AF ; Save type + call EVAL ; Evaluate expression + pop AF ; Restore type + ex (SP),HL ; Save code - Get var addr + ld (BRKLIN),HL ; Save address of variable + rra ; Adjust type + call CHKTYP ; Check types are the same + jp Z,LETNUM ; Numeric - Move value +LETSTR: push HL ; Save address of string var + ld HL,(FPREG) ; Pointer to string entry + push HL ; Save it on stack + inc HL ; Skip over length + inc HL + ld E,(HL) ; LSB of string address + inc HL + ld D,(HL) ; MSB of string address + ld HL,(BASTXT) ; Point to start of program + call CPDEHL ; Is string before program? + jp NC,CRESTR ; Yes - Create string entry + ld HL,(STRSPC) ; Point to string space + call CPDEHL ; Is string literal in program? + pop DE ; Restore address of string + jp NC,MVSTPT ; Yes - Set up pointer + ld HL,TMPSTR ; Temporary string pool + call CPDEHL ; Is string in temporary pool? + jp NC,MVSTPT ; No - Set up pointer + defb $3E ; Skip "pop DE" +CRESTR: pop DE ; Restore address of string + call BAKTMP ; Back to last tmp-str entry + ex DE,HL ; Address of string entry + call SAVSTR ; Save string in string area +MVSTPT: call BAKTMP ; Back to last tmp-str entry + pop HL ; Get string pointer + call DETHL4 ; Move string pointer to var + pop HL ; Restore code string address + ret + +LETNUM: push HL ; Save address of variable + call FPTHL ; Move value to variable + pop DE ; Restore address of variable + pop HL ; Restore code string address + ret + +ON: call GETINT ; Get integer 0-255 + ld A,(HL) ; Get "GOTO" or "GOSUB" token + ld B,A ; Save in B + cp ZGOSUB ; "GOSUB" token? + jp Z,ONGO ; Yes - Find line number + call CHKSYN ; Make sure it's "GOTO" + defb ZGOTO ; "GOTO" token + dec HL ; Cancel increment +ONGO: ld C,E ; Integer of branch value +ONGOLP: dec C ; Count branches + ld A,B ; Get "GOTO" or "GOSUB" token + jp Z,ONJMP ; Go to that line if right one + call GETLN ; Get line number to DE + cp ',' ; Another line number? + ret NZ ; No - Drop through + jp ONGOLP ; Yes - loop + +IF: call EVAL ; Evaluate expression + ld A,(HL) ; Get token + cp ZGOTO ; "GOTO" token? + jp Z,IFGO ; Yes - Get line + call CHKSYN ; Make sure it's "THEN" + defb ZTHEN ; "THEN" token + dec HL ; Cancel increment +IFGO: call TSTNUM ; Make sure it's numeric + call TSTSGN ; Test state of expression + jp Z,REM ; False - Drop through + call GETCHR ; Get next character + jp C,GOTO ; Number - GOTO that line + jp IFJMP ; Otherwise do statement + +MRPRNT: dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character +PRINT: jp Z,PRNTCRLF ; CRLF if just PRINT +PRNTLP: ret Z ; End of list - Exit + cp ZTAB ; "TAB(" token? + jp Z,DOTAB ; Yes - Do TAB routine + cp ZSPC ; "SPC(" token? + jp Z,DOTAB ; Yes - Do SPC routine + push HL ; Save code string address + cp ',' ; Comma? + jp Z,DOCOM ; Yes - Move to next zone + cp ';' ; Semi-colon? + jp Z,NEXITM ; Do semi-colon routine + pop BC ; Code string address to BC + call EVAL ; Evaluate expression + push HL ; Save code string address + ld A,(TYPE) ; Get variable type + or A ; Is it a string variable? + jp NZ,PRNTST ; Yes - Output string contents + call NUMASC ; Convert number to text + call CRTST ; Create temporary string + ld (HL),NLLCR ; Followed by a NULL char (was SPC, space) + ld HL,(FPREG) ; Get length of output + inc (HL) ; Plus 1 for the space + ld HL,(FPREG) ; < Not needed > + ld A,(LWIDTH) ; Get width of line + ld B,A ; To B + inc B ; Width 255 (No limit)? + jp Z,PRNTNB ; Yes - Output number string + inc B ; Adjust it + ld A,(CURPOS) ; Get cursor position + add A,(HL) ; Add length of string + dec A ; Adjust it + cp B ; Will output fit on this line? + call NC,PRNTCRLF ; No - CRLF first +PRNTNB: call PRS1 ; Output string at (HL) + xor A ; Skip call by setting 'z' flag +PRNTST: call NZ,PRS1 ; Output string at (HL) + pop HL ; Restore code string address + jp MRPRNT ; See if more to PRINT + +STTLIN: ld A,(CURPOS) ; Make sure on new line + or A ; Already at start? + ret Z ; Yes - Do nothing + jp PRNTCRLF ; Start a new line + +ENDINP: xor A + ld (KBDNPT),A ; char is not from keyboard + ld (HL),A ; Mark end of buffer + ld HL,BUFFER-1 ; Point to buffer + jr CNTEND +PRNTCRLF:ld A,CR ; Load a CR + call OUTC ; Output character + ld A,LF ; Load a LF + call OUTC ; Output character +CNTEND: xor A ; Set to position 0 + ld (CURPOS),A ; Store it + ret ; return to caller + +DOCOM: ld A,(COMMAN) ; Get comma width + ld B,A ; Save in B + ld A,(SCR_CURS_X) ; Get current position + cp B ; Within the limit? + call NC,PRNTCRLF ; No - output CRLF + jp NC,NEXITM ; Get next item +ZONELP: sub $0A ; Next zone of 10 characters + jp NC,ZONELP ; Repeat if more zones + cpl ; Number of null chars to output + ld C,NLLCR ; null char + jp ASPCS ; Output them + +DOTAB: push AF ; Save token + call FNDNUM ; Evaluate expression + call CHKSYN ; Make sure ")" follows + defb ')' + dec HL ; Back space on to ")" + pop AF ; Restore token + ld C,NLLCR ; for SPC we use NULL char (was SPACE) + sub ZSPC ; Was it "SPC(" ? + push HL ; Save code string address + jp Z,DOSPC ; Yes - Do 'E' spaces + ld A,(SCR_CURS_X) ; Get current X position +DOSPC: cpl ; Number of spaces to print to + add A,E ; Total number to print + jp NC,NEXITM ; TAB < Current POS(X) +ASPCS: inc A ; Output A spaces + ld B,A ; Save number to print +SPCLP: ld A,C ; char to print + call OUTC ; Output character in A + dec B ; Count them + jp NZ,SPCLP ; Repeat if more +NEXITM: pop HL ; Restore code string address + call GETCHR ; Get next character + jp PRNTLP ; More to print + +REDO: defb "?Redo from start",CR,0 + +BADINP: ld A,(READFG) ; READ or INPUT? + or A + jp NZ,DATSNR ; READ - ?SN Error + pop BC ; Throw away code string addr + ld HL,REDO ; "Redo from start" message + call PRS ; Output string + jp DOAGN ; Do last INPUT again + +INPUT: call IDTEST ; Test for illegal direct + ld A,(HL) ; Get character after "INPUT" + cp $22 ; '"' ; Is there a prompt string? + ld A,$00 ; Clear A and leave flags + ld (CTLOFG),A ; Enable output + jp NZ,NOPMPT ; No prompt - get input + call QTSTR ; Get string terminated by '"' + call CHKSYN ; Check for ';' after prompt + defb ";" + push HL ; Save code string address + call PRS1 ; Output prompt string + defb $3E ; Skip "push HL" +NOPMPT: push HL ; Save code string address + call PROMPT ; Get input with "? " prompt + pop BC ; Restore code string address + jp C,INPBRK ; Break pressed - Exit + inc HL ; Next byte + ld A,(HL) ; Get it + or A ; End of line? + dec HL ; Back again + push BC ; Re-save code string address + call CURSOR_OFF ; disable cursor + jp Z,NXTDTA ; Yes - Find next DATA stmt + ld (HL),',' ; Store comma as separator + jp NXTITM ; Get next item + +READ: push HL ; Save code string address + ld HL,(NXTDAT) ; Next DATA statement + defb $F6 ; Flag "READ" +NXTITM: xor A ; Flag "INPUT" + ld (READFG),A ; Save "READ"/"INPUT" flag + ex (SP),HL ; Get code str' , Save pointer + jp GTVLUS ; Get values + +NEDMOR: call CHKSYN ; Check for comma between items + defb ',' +GTVLUS: call GETVAR ; Get variable name + ex (SP),HL ; Save code str" , Get pointer + push DE ; Save variable address + ld A,(HL) ; Get next "INPUT"/"DATA" byte + cp ',' ; Comma? + jp Z,ANTVLU ; Yes - Get another value + ld A,(READFG) ; Is it READ? + or A + jp NZ,FDTLP ; Yes - Find next DATA stmt + ld A,'?' ; More INPUT needed + call OUTC ; Output character + call PROMPT ; Get INPUT with prompt + pop DE ; Variable address + pop BC ; Code string address + jp C,INPBRK ; Break pressed + inc HL ; Point to next DATA byte + ld A,(HL) ; Get byte + or A ; Is it zero (No input) ? + dec HL ; Back space INPUT pointer + push BC ; Save code string address + jp Z,NXTDTA ; Find end of buffer + push DE ; Save variable address +ANTVLU: ld A,(TYPE) ; Check data type + or A ; Is it numeric? + jp Z,INPBIN ; Yes - Convert to binary + call GETCHR ; Get next character + ld D,A ; Save input character + ld B,A ; Again + cp $22 ; '"' ; Start of literal sting? + jp Z,STRENT ; Yes - Create string entry + ld A,(READFG) ; "READ" or "INPUT" ? + or A + ld D,A ; Save 00 if "INPUT" + jp Z,ITMSEP ; "INPUT" - End with 00 + ld D,':' ; "DATA" - End with 00 or ':' +ITMSEP: ld B,',' ; Item separator + dec HL ; Back space for DTSTR +STRENT: call DTSTR ; Get string terminated by D + ex DE,HL ; String address to DE + ld HL,LTSTND ; Where to go after LETSTR + ex (SP),HL ; Save HL , get input pointer + push DE ; Save address of string + jp LETSTR ; Assign string to variable + +INPBIN: call GETCHR ; Get next character + call ASCTFP ; Convert ASCII to FP number + ex (SP),HL ; Save input ptr, Get var addr + call FPTHL ; Move FPREG to variable + pop HL ; Restore input pointer +LTSTND: dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,MORDT ; End of line - More needed? + cp ',' ; Another value? + jp NZ,BADINP ; No - Bad input +MORDT: ex (SP),HL ; Get code string address + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp NZ,NEDMOR ; More needed - Get it + pop DE ; Restore DATA pointer + ld A,(READFG) ; "READ" or "INPUT" ? + or A + ex DE,HL ; DATA pointer to HL + jp NZ,UPDATA ; Update DATA pointer if "READ" + push DE ; Save code string address + or (HL) ; More input given? + ld HL,EXTIG ; "?Extra ignored" message + call NZ,PRS ; Output string if extra given + pop HL ; Restore code string address + ret + +EXTIG: defb "?Extra ignored",CR,0 + +FDTLP: call DATA ; Get next statement + or A ; End of line? + jp NZ,FANDT ; No - See if DATA statement + inc HL + ld A,(HL) ; End of program? + inc HL + or (HL) ; 00 00 Ends program + ld E,OD ; ?OD Error + jp Z,ERROR ; Yes - Out of DATA + inc HL + ld E,(HL) ; LSB of line number + inc HL + ld D,(HL) ; MSB of line number + ex DE,HL + ld (DATLIN),HL ; Set line of current DATA item + ex DE,HL +FANDT: call GETCHR ; Get next character + cp ZDATA ; "DATA" token + jp NZ,FDTLP ; No "DATA" - Keep looking + jp ANTVLU ; Found - Convert input + +NEXT: ld DE,$0000 ; In case no index given +NEXT1: call NZ,GETVAR ; Get index address + ld (BRKLIN),HL ; Save code string address + call BAKSTK ; Look for "FOR" block + jp NZ,NFERR ; No "FOR" - ?NF Error + ld SP,HL ; Clear nested loops + push DE ; Save index address + ld A,(HL) ; Get sign of STEP + inc HL + push AF ; Save sign of STEP + push DE ; Save index address + call PHLTFP ; Move index value to FPREG + ex (SP),HL ; Save address of TO value + push HL ; Save address of index + call ADDPHL ; Add STEP to index value + pop HL ; Restore address of index + call FPTHL ; Move value to index variable + pop HL ; Restore address of TO value + call LOADFP ; Move TO value to BCDE + push HL ; Save address of line of FOR + call CMPNUM ; Compare index with TO value + pop HL ; Restore address of line num + pop BC ; Address of sign of STEP + sub B ; Compare with expected sign + call LOADFP ; BC = Loop stmt,DE = Line num + jp Z,KILFOR ; Loop finished - Terminate it + ex DE,HL ; Loop statement line number + ld (LINEAT),HL ; Set loop line number + ld L,C ; Set code string to loop + ld H,B + jp PUTFID ; Put back "FOR" and continue + +KILFOR: ld SP,HL ; Remove "FOR" block + ld HL,(BRKLIN) ; Code string after "NEXT" + ld A,(HL) ; Get next byte in code string + cp ',' ; More NEXTs ? + jp NZ,RUNCNT ; No - Do next statement + call GETCHR ; Position to index name + call NEXT1 ; Re-enter NEXT routine +; < will not RETurn to here , Exit to RUNCNT or Loop > + +GETNUM: call EVAL ; Get a numeric expression +TSTNUM: defb $F6 ; Clear carry (numeric) +TSTSTR: scf ; Set carry (string) +CHKTYP: ld A,(TYPE) ; Check types match + adc A,A ; Expected + actual + or A ; Clear carry , set parity + ret PE ; Even parity - Types match + jp TMERR ; Different types - Error + +OPNPAR: call CHKSYN ; Make sure "(" follows + defb '(' +EVAL: dec HL ; Evaluate expression & save + ld D,$00 ; Precedence value +EVAL1: push DE ; Save precedence + ld C,$01 + call CHKSTK ; Check for 1 level of stack + call OPRND ; Get next expression value +EVAL2: ld (NXTOPR),HL ; Save address of next operator +EVAL3: ld HL,(NXTOPR) ; Restore address of next opr + pop BC ; Precedence value and operator + ld A,B ; Get precedence value + cp $78 ; "AND", "OR", or "XOR" ? + call NC,TSTNUM ; No - Make sure it's a number + ld A,(HL) ; Get next operator / function + ld D,$00 ; Clear Last relation +RLTLP: sub ZGTR ; ">" Token + jp C,FOPRND ; + - * / ^ AND OR XOR - Test it + cp ZLTH+1-ZGTR ; < = > + jp NC,FOPRND ; Function - Call it + cp ZEQUAL-ZGTR ; "=" + rla ; <- Test for legal + xor D ; <- combinations of < = > + cp D ; <- by combining last token + ld D,A ; <- with current one + jp C,SNERR ; Error if "<<' '==" or ">>" + ld (CUROPR),HL ; Save address of current token + call GETCHR ; Get next character + jp RLTLP ; Treat the two as one + +FOPRND: ld A,D ; < = > found ? + or A + jp NZ,TSTRED ; Yes - Test for reduction + ld A,(HL) ; Get operator token + ld (CUROPR),HL ; Save operator address + sub ZPLUS ; Operator or function? + ret C ; Neither - Exit + cp ZOR+1-ZPLUS ; Is it + - * / ^ AND XOR OR ? + ret NC ; No - Exit + ld E,A ; Coded operator + ld A,(TYPE) ; Get data type + dec A ; FF = numeric , 00 = string + or E ; Combine with coded operator + ld A,E ; Get coded operator + jp Z,CONCAT ; String concatenation + rlca ; Times 2 + add A,E ; Times 3 + ld E,A ; To DE (D is 0) + ld HL,PRITAB ; Precedence table + add HL,DE ; To the operator concerned + ld A,B ; Last operator precedence + ld D,(HL) ; Get evaluation precedence + cp D ; Compare with eval precedence + ret NC ; Exit if higher precedence + inc HL ; Point to routine address + call TSTNUM ; Make sure it's a number + +STKTHS: push BC ; Save last precedence & token + ld BC,EVAL3 ; Where to go on prec' break + push BC ; Save on stack for return + ld B,E ; Save operator + ld C,D ; Save precedence + call STAKFP ; Move value to stack + ld E,B ; Restore operator + ld D,C ; Restore precedence + ld C,(HL) ; Get LSB of routine address + inc HL + ld B,(HL) ; Get MSB of routine address + inc HL + push BC ; Save routine address + ld HL,(CUROPR) ; Address of current operator + jp EVAL1 ; Loop until prec' break + +OPRND: xor A ; Get operand routine + ld (TYPE),A ; Set numeric expected + call GETCHR ; Get next character + ld E,MO ; ?MO Error + jp Z,ERROR ; No operand - Error + jp C,ASCTFP ; Number - Get value + call CHKLTR ; See if a letter + jp NC,CONVAR ; Letter - Find variable + cp '&' ; &H = HEX, &B = BINARY + jr NZ,NOTAMP + call GETCHR ; Get next character + cp 'H' ; Hex number indicated? [function added] + jp Z,HEXTFP ; Convert Hex to FPREG + cp 'B' ; Binary number indicated? [function added] + jp Z,BINTFP ; Convert Bin to FPREG + ld E,SN ; If neither then a ?SN Error + jp Z,ERROR ; +NOTAMP: cp ZPLUS ; '+' Token ? + jp Z,OPRND ; Yes - Look for operand + cp '.' ; '.' ? + jp Z,ASCTFP ; Yes - Create FP number + cp ZMINUS ; '-' Token ? + jp Z,MINUS ; Yes - Do minus + cp $22 ; '"' ; Literal string ? + jp Z,QTSTR ; Get string terminated by '"' + cp ZNOT ; "NOT" Token ? + jp Z,EVNOT ; Yes - Eval NOT expression + cp ZFN ; "FN" Token ? + jp Z,DOFN ; Yes - Do FN routine + sub ZSGN ; Is it a function? + jp NC,FNOFST ; Yes - Evaluate function +EVLPAR: call OPNPAR ; Evaluate expression in "()" + call CHKSYN ; Make sure ")" follows + defb ')' + ret + +MINUS: ld D,$7D ; '-' precedence + call EVAL1 ; Evaluate until prec' break + ld HL,(NXTOPR) ; Get next operator address + push HL ; Save next operator address + call INVSGN ; Negate value +RETNUM: call TSTNUM ; Make sure it's a number + pop HL ; Restore next operator address + ret + +CONVAR: call GETVAR ; Get variable address to DE +FRMEVL: push HL ; Save code string address + ex DE,HL ; Variable address to HL + ld (FPREG),HL ; Save address of variable + ld A,(TYPE) ; Get type + or A ; Numeric? + call Z,PHLTFP ; Yes - Move contents to FPREG + pop HL ; Restore code string address + ret + +FNOFST: ld B,$00 ; Get address of function + rlca ; Double function offset + ld C,A ; BC = Offset in function table + push BC ; Save adjusted token value + call GETCHR ; Get next character + ld A,C ; Get adjusted token value + cp 2*(ZPOINT-ZSGN) ; "POINT" token? + jp Z,POINT ; Yes, do "POINT" + cp 2*(ZINSTR-ZSGN) ; "INSTR" token? + jp Z,INSTR ; Yes, do "INSTR" + cp 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? + jp C,FNVAL ; No - Do function + call OPNPAR ; Evaluate expression (X,... + call CHKSYN ; Make sure ',' follows + defb ',' + call TSTSTR ; Make sure it's a string + ex DE,HL ; Save code string address + ld HL,(FPREG) ; Get address of string + ex (SP),HL ; Save address of string + push HL ; Save adjusted token value + ex DE,HL ; Restore code string address + call GETINT ; Get integer 0-255 + ex DE,HL ; Save code string address + ex (SP),HL ; Save integer,HL = adj' token + jp GOFUNC ; Jump to string function + +FNVAL: call EVLPAR ; Evaluate expression + ex (SP),HL ; HL = Adjusted token value + ld DE,RETNUM ; Return number from function + push DE ; Save on stack +GOFUNC: ld BC,FNCTAB ; Function routine addresses + add HL,BC ; Point to right address + ld C,(HL) ; Get LSB of address + inc HL ; + ld H,(HL) ; Get MSB of address + ld L,C ; Address to HL + jp (HL) ; Jump to function + +SGNEXP: dec D ; Dee to flag negative exponent + cp ZMINUS ; '-' token ? + ret Z ; Yes - Return + cp '-' ; '-' ASCII ? + ret Z ; Yes - Return + inc D ; Inc to flag positive exponent + cp '+' ; '+' ASCII ? + ret Z ; Yes - Return + cp ZPLUS ; '+' token ? + ret Z ; Yes - Return + dec HL ; dec 'cos GETCHR INCs + ret ; Return "NZ" + +; execute OR, AND, and XOR operations +PAND: xor A ; for AND, Z=1 + jr CNTLGC +POR xor A ; for OR, Z=0, S=1 + sub $01 + jr CNTLGC +PXOR: xor A ; for XOR, Z=0, S=0 + inc A +CNTLGC: push AF ; store operand's flags + call TSTNUM ; Make sure it's a number + call DEINT ; Get integer -32768 to 32767 + pop AF ; retrieve operand's flags + ex DE,HL ; <- Get last + pop BC ; <- value + ex (SP),HL ; <- from + ex DE,HL ; <- stack + call FPBCDE ; Move last value to FPREG + push AF ; store operand's flags + call DEINT ; Get integer -32768 to 32767 + pop AF ; retrieve operand's flags + pop BC ; Get value + ld A,C ; Get LSB + ld HL,ACPASS ; Address of save AC as current + jr NZ,POR1 ; if X/OR, jump over +PAND1: and E ; "AND" LSBs + ld C,A ; Save LSB + ld A,B ; Get MSB + and D ; "AND" MSBs + jp (HL) ; Save AC as current (ACPASS) +POR1: jp P,PXOR1 ; if S=0, jump to XOR + or E ; "OR" LSBs + ld C,A ; Save LSB + ld A,B ; Get MSB + or D ; "OR" MSBs + jp (HL) ; Save AC as current (ACPASS) +PXOR1: xor E ; "XOR" LSBs + ld C,A ; Save LSB + ld A,B ; Get MSB + xor D ; "XOR" MSBs + jp (HL) ; Save AC as current (ACPASS) + +TSTRED: ld HL,CMPLOG ; Logical compare routine + ld A,(TYPE) ; Get data type + rra ; Carry set = string + ld A,D ; Get last precedence value + rla ; Times 2 plus carry + ld E,A ; To E + ld D,$64 ; Relational precedence + ld A,B ; Get current precedence + cp D ; Compare with last + ret NC ; Eval if last was rel' or log' + jp STKTHS ; Stack this one and get next + +CMPLOG: defw CMPLG1 ; Compare two values / strings +CMPLG1: ld A,C ; Get data type + or A + rra + pop BC ; Get last expression to BCDE + pop DE + push AF ; Save status + call CHKTYP ; Check that types match + ld HL,CMPRES ; Result to comparison + push HL ; Save for RETurn + jp Z,CMPNUM ; Compare values if numeric + xor A ; Compare two strings + ld (TYPE),A ; Set type to numeric + push DE ; Save string name + call GSTRCU ; Get current string + ld A,(HL) ; Get length of string + inc HL + inc HL + ld C,(HL) ; Get LSB of address + inc HL + ld B,(HL) ; Get MSB of address + pop DE ; Restore string name + push BC ; Save address of string + push AF ; Save length of string + call GSTRDE ; Get second string + call LOADFP ; Get address of second string + pop AF ; Restore length of string 1 + ld D,A ; Length to D + pop HL ; Restore address of string 1 +CMPSTR: ld A,E ; Bytes of string 2 to do + or D ; Bytes of string 1 to do + ret Z ; Exit if all bytes compared + ld A,D ; Get bytes of string 1 to do + sub $01 + ret C ; Exit if end of string 1 + xor A + cp E ; Bytes of string 2 to do + inc A + ret NC ; Exit if end of string 2 + dec D ; Count bytes in string 1 + dec E ; Count bytes in string 2 + ld A,(BC) ; Byte in string 2 + cp (HL) ; Compare to byte in string 1 + inc HL ; Move up string 1 + inc BC ; Move up string 2 + jp Z,CMPSTR ; Same - Try next bytes + ccf ; Flag difference (">" or "<") + jp FLGDIF ; "<" gives -1 , ">" gives +1 + +CMPRES: inc A ; Increment current value + adc A,A ; Double plus carry + pop BC ; Get other value + and B ; Combine them + add A,-1 ; Carry set if different + sbc A,A ; 00 - Equal , FF - Different + jp FLGREL ; Set current value & continue + +EVNOT: ld D,$5A ; Precedence value for "NOT" + call EVAL1 ; Eval until precedence break + call TSTNUM ; Make sure it's a number + call DEINT ; Get integer -32768 - 32767 + ld A,E ; Get LSB + cpl ; Invert LSB + ld C,A ; Save "NOT" of LSB + ld A,D ; Get MSB + cpl ; Invert MSB + call ACPASS ; Save AC as current + pop BC ; Clean up stack + jp EVAL3 ; Continue evaluation + +DIMRET: dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + ret Z ; End of DIM statement + call CHKSYN ; Make sure ',' follows + defb ',' +DIM: ld BC,DIMRET ; Return to "DIMRET" + push BC ; Save on stack + defb $F6 ; Flag "Create" variable +GETVAR: xor A ; Find variable address,to DE + ld (LCRFLG),A ; Set locate / create flag + ld B,(HL) ; Get First byte of name +GTFNAM: call CHKLTR ; See if a letter + jp C,SNERR ; ?SN Error if not a letter + xor A + ld C,A ; Clear second byte of name + ld (TYPE),A ; Set type to numeric + call GETCHR ; Get next character + jp C,SVNAM2 ; Numeric - Save in name + call CHKLTR ; See if a letter + jp C,CHARTY ; Not a letter - Check type +SVNAM2: ld C,A ; Save second byte of name +ENDNAM: call GETCHR ; Get next character + jp C,ENDNAM ; Numeric - Get another + call CHKLTR ; See if a letter + jp NC,ENDNAM ; Letter - Get another +CHARTY: sub '$' ; String variable? + jp NZ,NOTSTR ; No - Numeric variable + inc A ; A = 1 (string type) + ld (TYPE),A ; Set type to string + rrca ; A = 80H , Flag for string + add A,C ; 2nd byte of name has bit 7 on + ld C,A ; Resave second byte on name + call GETCHR ; Get next character +NOTSTR: ld A,(FORFLG) ; Array name needed ? + dec A + jp Z,ARLDSV ; Yes - Get array name + jp P,NSCFOR ; No array with "FOR" or "FN" + ld A,(HL) ; Get byte again + sub '(' ; Subscripted variable? + jp Z,SBSCPT ; Yes - Sort out subscript + +NSCFOR: xor A ; Simple variable + ld (FORFLG),A ; Clear "FOR" flag + push HL ; Save code string address + ld D,B ; DE = Variable name to find + ld E,C + ld HL,(FNRGNM) ; FN argument name + call CPDEHL ; Is it the FN argument? + ld DE,FNARG ; Point to argument value + jp Z,POPHRT ; Yes - Return FN argument value + ld HL,(VAREND) ; End of variables + ex DE,HL ; Address of end of search + ld HL,(PROGND) ; Start of variables address +FNDVAR: call CPDEHL ; End of variable list table? + jp Z,CFEVAL ; Yes - Called from EVAL? + ld A,C ; Get second byte of name + sub (HL) ; Compare with name in list + inc HL ; Move on to first byte + jp NZ,FNTHR ; Different - Find another + ld A,B ; Get first byte of name + sub (HL) ; Compare with name in list +FNTHR: inc HL ; Move on to LSB of value + jp Z,RETADR ; Found - Return address + inc HL ; <- Skip + inc HL ; <- over + inc HL ; <- F.P. + inc HL ; <- value + jp FNDVAR ; Keep looking + +CFEVAL: pop HL ; Restore code string address + ex (SP),HL ; Get return address + push DE ; Save address of variable + ld DE,FRMEVL ; Return address in EVAL + call CPDEHL ; Called from EVAL ? + pop DE ; Restore address of variable + jp Z,RETNUL ; Yes - Return null variable + ex (SP),HL ; Put back return + push HL ; Save code string address + push BC ; Save variable name + ld BC,$0006 ; 2 byte name plus 4 byte data + ld HL,(ARREND) ; End of arrays + push HL ; Save end of arrays + add HL,BC ; Move up 6 bytes + pop BC ; Source address in BC + push HL ; Save new end address + call MOVUP ; Move arrays up + pop HL ; Restore new end address + ld (ARREND),HL ; Set new end address + ld H,B ; End of variables to HL + ld L,C + ld (VAREND),HL ; Set new end address + +ZEROLP: dec HL ; Back through to zero variable + ld (HL),$00 ; Zero byte in variable + call CPDEHL ; Done them all? + jp NZ,ZEROLP ; No - Keep on going + pop DE ; Get variable name + ld (HL),E ; Store second character + inc HL + ld (HL),D ; Store first character + inc HL +RETADR: ex DE,HL ; Address of variable in DE + pop HL ; Restore code string address + ret + +RETNUL: ld (FPEXP),A ; Set result to zero + ld HL,ZERBYT ; Also set a null string + ld (FPREG),HL ; Save for EVAL + pop HL ; Restore code string address + ret + +SBSCPT: push HL ; Save code string address + ld HL,(LCRFLG) ; Locate/Create and Type + ex (SP),HL ; Save and get code string + ld D,A ; Zero number of dimensions +SCPTLP: push DE ; Save number of dimensions + push BC ; Save array name + call FPSINT ; Get subscript (0-32767) + pop BC ; Restore array name + pop AF ; Get number of dimensions + ex DE,HL + ex (SP),HL ; Save subscript value + push HL ; Save LCRFLG and TYPE + ex DE,HL + inc A ; Count dimensions + ld D,A ; Save in D + ld A,(HL) ; Get next byte in code string + cp ',' ; Comma (more to come)? + jp Z,SCPTLP ; Yes - More subscripts + call CHKSYN ; Make sure ")" follows + defb ')' + ld (NXTOPR),HL ; Save code string address + pop HL ; Get LCRFLG and TYPE + ld (LCRFLG),HL ; Restore Locate/create & type + ld E,$00 ; Flag not CSAVE* or CLOAD* + push DE ; Save number of dimensions (D) + defb $11 ; Skip "push HL" and "push AF' + +ARLDSV: push HL ; Save code string address + push AF ; A = 00 , Flags set = Z,N + ld HL,(VAREND) ; Start of arrays + defb $3E ; Skip "add HL,DE" +FNDARY: add HL,DE ; Move to next array start + ex DE,HL + ld HL,(ARREND) ; End of arrays + ex DE,HL ; Current array pointer + call CPDEHL ; End of arrays found? + jp Z,CREARY ; Yes - Create array + ld A,(HL) ; Get second byte of name + cp C ; Compare with name given + inc HL ; Move on + jp NZ,NXTARY ; Different - Find next array + ld A,(HL) ; Get first byte of name + cp B ; Compare with name given +NXTARY: inc HL ; Move on + ld E,(HL) ; Get LSB of next array address + inc HL + ld D,(HL) ; Get MSB of next array address + inc HL + jp NZ,FNDARY ; Not found - Keep looking + ld A,(LCRFLG) ; Found Locate or Create it? + or A + jp NZ,DDERR ; Create - ?DD Error + pop AF ; Locate - Get number of dim'ns + ld B,H ; BC Points to array dim'ns + ld C,L + jp Z,POPHRT ; Jump if array load/save + sub (HL) ; Same number of dimensions? + jp Z,FINDEL ; Yes - Find element +BSERR: ld E,BS ; ?BS Error + jp ERROR ; Output error + +CREARY: ld DE,$0004 ; 4 Bytes per entry + pop AF ; Array to save or 0 dim'ns? + jp Z,FCERR ; Yes - ?FC Error + ld (HL),C ; Save second byte of name + inc HL + ld (HL),B ; Save first byte of name + inc HL + ld C,A ; Number of dimensions to C + call CHKSTK ; Check if enough memory + inc HL ; Point to number of dimensions + inc HL + ld (CUROPR),HL ; Save address of pointer + ld (HL),C ; Set number of dimensions + inc HL + ld A,(LCRFLG) ; Locate of Create? + rla ; Carry set = Create + ld A,C ; Get number of dimensions +CRARLP: ld BC,10+1 ; Default dimension size 10 + jp NC,DEFSIZ ; Locate - Set default size + pop BC ; Get specified dimension size + inc BC ; Include zero element +DEFSIZ: ld (HL),C ; Save LSB of dimension size + inc HL + ld (HL),B ; Save MSB of dimension size + inc HL + push AF ; Save num' of dim'ns an status + push HL ; Save address of dim'n size + call MLDEBC ; Multiply DE by BC to find + ex DE,HL ; amount of mem needed (to DE) + pop HL ; Restore address of dimension + pop AF ; Restore number of dimensions + dec A ; Count them + jp NZ,CRARLP ; Do next dimension if more + push AF ; Save locate/create flag + ld B,D ; MSB of memory needed + ld C,E ; LSB of memory needed + ex DE,HL + add HL,DE ; Add bytes to array start + jp C,OMERR ; Too big - Error + call ENFMEM ; See if enough memory + ld (ARREND),HL ; Save new end of array + +ZERARY: dec HL ; Back through array data + ld (HL),$00 ; Set array element to zero + call CPDEHL ; All elements zeroed? + jp NZ,ZERARY ; No - Keep on going + inc BC ; Number of bytes + 1 + ld D,A ; A=0 + ld HL,(CUROPR) ; Get address of array + ld E,(HL) ; Number of dimensions + ex DE,HL ; To HL + add HL,HL ; Two bytes per dimension size + add HL,BC ; Add number of bytes + ex DE,HL ; Bytes needed to DE + dec HL + dec HL + ld (HL),E ; Save LSB of bytes needed + inc HL + ld (HL),D ; Save MSB of bytes needed + inc HL + pop AF ; Locate / Create? + jp C,ENDDIM ; A is 0 , End if create +FINDEL: ld B,A ; Find array element + ld C,A + ld A,(HL) ; Number of dimensions + inc HL + defb $16 ; Skip "pop HL" +FNDELP: pop HL ; Address of next dim' size + ld E,(HL) ; Get LSB of dim'n size + inc HL + ld D,(HL) ; Get MSB of dim'n size + inc HL + ex (SP),HL ; Save address - Get index + push AF ; Save number of dim'ns + call CPDEHL ; Dimension too large? + jp NC,BSERR ; Yes - ?BS Error + push HL ; Save index + call MLDEBC ; Multiply previous by size + pop DE ; Index supplied to DE + add HL,DE ; Add index to pointer + pop AF ; Number of dimensions + dec A ; Count them + ld B,H ; MSB of pointer + ld C,L ; LSB of pointer + jp NZ,FNDELP ; More - Keep going + add HL,HL ; 4 Bytes per element + add HL,HL + pop BC ; Start of array + add HL,BC ; Point to element + ex DE,HL ; Address of element to DE +ENDDIM: ld HL,(NXTOPR) ; Got code string address + ret + + +; returns the value of the 32-bit system tick counter as +; two 16-bit words +TMR: call TSTNUM ; Make sure it's a number + call DEINT ; Get integer (-32768 to 32767) + ld HL,(TMRCNT) ; load the LSBytes of timer + ld A,E + or D ; is it 0? + jp Z,ENDTMR ; yes, jump over + ld HL,(TMRCNT+2) ; load the MSBytes of timer +ENDTMR: ld B,L ; move bytes... + ld A,H ; ...into AB + jp ABPASS ; return word into AB + + +; returns the free space for BASIC or into the string pool +FRE: ld HL,(ARREND) ; Start of free memory + ex DE,HL ; To DE + ld HL,$0000 ; End of free memory + add HL,SP ; Current stack value + ld A,(TYPE) ; Dummy argument type + or A + jp Z,FRENUM ; Numeric - Free variable space + call GSTRCU ; Current string to pool + call GARBGE ; Garbage collection + ld HL,(STRSPC) ; Bottom of string space in use + ex DE,HL ; To DE + ld HL,(STRBOT) ; Bottom of string space +FRENUM: ld A,L ; Get LSB of end + sub E ; Subtract LSB of beginning + ld C,A ; Save difference if C + ld A,H ; Get MSB of end + sbc A,D ; Subtract MSB of beginning +ACPASS: ld B,C ; Return integer AC +ABPASS: ld D,B ; Return integer AB + ld E,$00 + ld HL,TYPE ; Point to type + ld (HL),E ; Set type to numeric + ld B,$80+$10 ; 16 bit integer + jp RETINT ; Return the integer + +; returns the X position of the cursor during a print +POS: ld A,(CURPOS) ; Get cursor position +PASSA: ld B,A ; Put A into AB + xor A ; Zero A + jp ABPASS ; Return integer AB + +DEF: call CHEKFN ; Get "FN" and name + call IDTEST ; Test for illegal direct + ld BC,DATA ; To get next statement + push BC ; Save address for RETurn + push DE ; Save address of function ptr + call CHKSYN ; Make sure "(" follows + defb '(' + call GETVAR ; Get argument variable name + push HL ; Save code string address + ex DE,HL ; Argument address to HL + dec HL + ld D,(HL) ; Get first byte of arg name + dec HL + ld E,(HL) ; Get second byte of arg name + pop HL ; Restore code string address + call TSTNUM ; Make sure numeric argument + call CHKSYN ; Make sure ")" follows + defb ')' + call CHKSYN ; Make sure "=" follows + defb ZEQUAL ; "=" token + ld B,H ; Code string address to BC + ld C,L + ex (SP),HL ; Save code str , Get FN ptr + ld (HL),C ; Save LSB of FN code string + inc HL + ld (HL),B ; Save MSB of FN code string + jp SVSTAD ; Save address and do function + +DOFN: call CHEKFN ; Make sure FN follows + push DE ; Save function pointer address + call EVLPAR ; Evaluate expression in "()" + call TSTNUM ; Make sure numeric result + ex (SP),HL ; Save code str , Get FN ptr + ld E,(HL) ; Get LSB of FN code string + inc HL + ld D,(HL) ; Get MSB of FN code string + inc HL + ld A,D ; And function DEFined? + or E + jp Z,UFERR ; No - ?UF Error + ld A,(HL) ; Get LSB of argument address + inc HL + ld H,(HL) ; Get MSB of argument address + ld L,A ; HL = Arg variable address + push HL ; Save it + ld HL,(FNRGNM) ; Get old argument name + ex (SP),HL ; Save old , Get new + ld (FNRGNM),HL ; Set new argument name + ld HL,(FNARG+2) ; Get LSB,NLSB of old arg value + push HL ; Save it + ld HL,(FNARG) ; Get MSB,EXP of old arg value + push HL ; Save it + ld HL,FNARG ; HL = Value of argument + push DE ; Save FN code string address + call FPTHL ; Move FPREG to argument + pop HL ; Get FN code string address + call GETNUM ; Get value from function + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp NZ,SNERR ; Bad character in FN - Error + pop HL ; Get MSB,EXP of old arg + ld (FNARG),HL ; Restore it + pop HL ; Get LSB,NLSB of old arg + ld (FNARG+2),HL ; Restore it + pop HL ; Get name of old arg + ld (FNRGNM),HL ; Restore it + pop HL ; Restore code string address + ret + +IDTEST: push HL ; Save code string address + ld HL,(LINEAT) ; Get current line number + inc HL ; -1 means direct statement + ld A,H + or L + pop HL ; Restore code string address + ret NZ ; Return if in program + ld E,ID ; ?ID Error + jp ERROR + +CHEKFN: call CHKSYN ; Make sure FN follows + defb ZFN ; "FN" token + ld A,$80 + ld (FORFLG),A ; Flag FN name to find + or (HL) ; FN name has bit 7 set + ld B,A ; in first byte of name + call GTFNAM ; Get FN name + jp TSTNUM ; Make sure numeric function + +STR: call TSTNUM ; Make sure it's a number + call NUMASC ; Turn number into text +STR1: call CRTST ; Create string entry for it + call GSTRCU ; Current string to pool + ld BC,TOPOOL ; Save in string pool + push BC ; Save address on stack + +SAVSTR: ld A,(HL) ; Get string length + inc HL + inc HL + push HL ; Save pointer to string + call TESTR ; See if enough string space + pop HL ; Restore pointer to string + ld C,(HL) ; Get LSB of address + inc HL + ld B,(HL) ; Get MSB of address + call CRTMST ; Create string entry + push HL ; Save pointer to MSB of addr + ld L,A ; Length of string + call TOSTRA ; Move to string area + pop DE ; Restore pointer to MSB + ret + +MKTMST: call TESTR ; See if enough string space +CRTMST: ld HL,TMPSTR ; Temporary string + push HL ; Save it + ld (HL),A ; Save length of string + inc HL +SVSTAD: inc HL + ld (HL),E ; Save LSB of address + inc HL + ld (HL),D ; Save MSB of address + pop HL ; Restore pointer + ret + +CRTST: dec HL ; dec - INCed after +QTSTR: ld B,$22 ; '"' ; Terminating quote + ld D,B ; Quote to D +DTSTR: push HL ; Save start + ld C,-1 ; Set counter to -1 +QTSTLP: inc HL ; Move on + ld A,(HL) ; Get byte + inc C ; Count bytes + or A ; End of line? + jp Z,CRTSTE ; Yes - Create string entry + cp D ; Terminator D found? + jp Z,CRTSTE ; Yes - Create string entry + cp B ; Terminator B found? + jp NZ,QTSTLP ; No - Keep looking +CRTSTE: cp $22 ; '"' ; End with '"'? + call Z,GETCHR ; Yes - Get next character + ex (SP),HL ; Starting quote + inc HL ; First byte of string + ex DE,HL ; To DE + ld A,C ; Get length + call CRTMST ; Create string entry +TSTOPL: ld DE,TMPSTR ; Temporary string + ld HL,(TMSTPT) ; Temporary string pool pointer + ld (FPREG),HL ; Save address of string ptr + ld A,$01 + ld (TYPE),A ; Set type to string + call DETHL4 ; Move string to pool + call CPDEHL ; Out of string pool? + ld (TMSTPT),HL ; Save new pointer + pop HL ; Restore code string address + ld A,(HL) ; Get next code byte + ret NZ ; Return if pool OK + ld E,ST ; ?ST Error + jp ERROR ; String pool overflow + +PRNUMS: inc HL ; Skip leading space +PRS: call CRTST ; Create string entry for it +PRS1: call GSTRCU ; Current string to pool + call LOADFP ; Move string block to BCDE + inc E ; Length + 1 +PRSLP: dec E ; Count characters + ret Z ; End of string + ld A,(BC) ; Get byte to output + call OUTC ; Output character in A + cp CR ; Return? + call Z,CNTEND ; Yes - Position cursor to 0 + inc BC ; Next byte in string + jp PRSLP ; More characters to output + +TESTR: or A ; Test if enough room + defb $0E ; No garbage collection done +GRBDON: pop AF ; Garbage collection done + push AF ; Save status + ld HL,(STRSPC) ; Bottom of string space in use + ex DE,HL ; To DE + ld HL,(STRBOT) ; Bottom of string area + cpl ; Negate length (Top down) + ld C,A ; -Length to BC + ld B,-1 ; BC = -ve length of string + add HL,BC ; Add to bottom of space in use + inc HL ; Plus one for 2's complement + call CPDEHL ; Below string RAM area? + jp C,TESTOS ; Tidy up if not done else err + ld (STRBOT),HL ; Save new bottom of area + inc HL ; Point to first byte of string + ex DE,HL ; Address to DE +POPAF: pop AF ; Throw away status push + ret + +TESTOS: pop AF ; Garbage collect been done? + ld E,OS ; ?OS Error + jp Z,ERROR ; Yes - Not enough string space + cp A ; Flag garbage collect done + push AF ; Save status + ld BC,GRBDON ; Garbage collection done + push BC ; Save for RETurn +GARBGE: ld HL,(LSTRAM) ; Get end of RAM pointer +GARBLP: ld (STRBOT),HL ; Reset string pointer + ld HL,$0000 + push HL ; Flag no string found + ld HL,(STRSPC) ; Get bottom of string space + push HL ; Save bottom of string space + ld HL,TMSTPL ; Temporary string pool +GRBLP: ex DE,HL + ld HL,(TMSTPT) ; Temporary string pool pointer + ex DE,HL + call CPDEHL ; Temporary string pool done? + ld BC,GRBLP ; Loop until string pool done + jp NZ,STPOOL ; No - See if in string area + ld HL,(PROGND) ; Start of simple variables +SMPVAR: ex DE,HL + ld HL,(VAREND) ; End of simple variables + ex DE,HL + call CPDEHL ; All simple strings done? + jp Z,ARRLP ; Yes - Do string arrays + ld A,(HL) ; Get type of variable + inc HL + inc HL + or A ; "S" flag set if string + call STRADD ; See if string in string area + jp SMPVAR ; Loop until simple ones done + +GNXARY: pop BC ; Scrap address of this array +ARRLP: ex DE,HL + ld HL,(ARREND) ; End of string arrays + ex DE,HL + call CPDEHL ; All string arrays done? + jp Z,SCNEND ; Yes - Move string if found + call LOADFP ; Get array name to BCDE + ld A,E ; Get type of array + push HL ; Save address of num of dim'ns + add HL,BC ; Start of next array + or A ; Test type of array + jp P,GNXARY ; Numeric array - Ignore it + ld (CUROPR),HL ; Save address of next array + pop HL ; Get address of num of dim'ns + ld C,(HL) ; BC = Number of dimensions + ld B,$00 + add HL,BC ; Two bytes per dimension size + add HL,BC + inc HL ; Plus one for number of dim'ns +GRBARY: ex DE,HL + ld HL,(CUROPR) ; Get address of next array + ex DE,HL + call CPDEHL ; Is this array finished? + jp Z,ARRLP ; Yes - Get next one + ld BC,GRBARY ; Loop until array all done +STPOOL: push BC ; Save return address + or $80 ; Flag string type +STRADD: ld A,(HL) ; Get string length + inc HL + inc HL + ld E,(HL) ; Get LSB of string address + inc HL + ld D,(HL) ; Get MSB of string address + inc HL + ret P ; Not a string - Return + or A ; Set flags on string length + ret Z ; Null string - Return + ld B,H ; Save variable pointer + ld C,L + ld HL,(STRBOT) ; Bottom of new area + call CPDEHL ; String been done? + ld H,B ; Restore variable pointer + ld L,C + ret C ; String done - Ignore + pop HL ; Return address + ex (SP),HL ; Lowest available string area + call CPDEHL ; String within string area? + ex (SP),HL ; Lowest available string area + push HL ; Re-save return address + ld H,B ; Restore variable pointer + ld L,C + ret NC ; Outside string area - Ignore + pop BC ; Get return , Throw 2 away + pop AF ; + pop AF ; + push HL ; Save variable pointer + push DE ; Save address of current + push BC ; Put back return address + ret ; Go to it + +SCNEND: pop DE ; Addresses of strings + pop HL ; + ld A,L ; HL = 0 if no more to do + or H + ret Z ; No more to do - Return + dec HL + ld B,(HL) ; MSB of address of string + dec HL + ld C,(HL) ; LSB of address of string + push HL ; Save variable address + dec HL + dec HL + ld L,(HL) ; HL = Length of string + ld H,$00 + add HL,BC ; Address of end of string+1 + ld D,B ; String address to DE + ld E,C + dec HL ; Last byte in string + ld B,H ; Address to BC + ld C,L + ld HL,(STRBOT) ; Current bottom of string area + call MOVSTR ; Move string to new address + pop HL ; Restore variable address + ld (HL),C ; Save new LSB of address + inc HL + ld (HL),B ; Save new MSB of address + ld L,C ; Next string area+1 to HL + ld H,B + dec HL ; Next string area address + jp GARBLP ; Look for more strings + +CONCAT: push BC ; Save prec' opr & code string + push HL ; + ld HL,(FPREG) ; Get first string + ex (SP),HL ; Save first string + call OPRND ; Get second string + ex (SP),HL ; Restore first string + call TSTSTR ; Make sure it's a string + ld A,(HL) ; Get length of second string + push HL ; Save first string + ld HL,(FPREG) ; Get second string + push HL ; Save second string + add A,(HL) ; Add length of second string + ld E,LS ; ?LS Error + jp C,ERROR ; String too long - Error + call MKTMST ; Make temporary string + pop DE ; Get second string to DE + call GSTRDE ; Move to string pool if needed + ex (SP),HL ; Get first string + call GSTRHL ; Move to string pool if needed + push HL ; Save first string + ld HL,(TMPSTR+2) ; Temporary string address + ex DE,HL ; To DE + call SSTSA ; First string to string area + call SSTSA ; Second string to string area + ld HL,EVAL2 ; Return to evaluation loop + ex (SP),HL ; Save return,get code string + push HL ; Save code string address + jp TSTOPL ; To temporary string to pool + +SSTSA: pop HL ; Return address + ex (SP),HL ; Get string block,save return + ld A,(HL) ; Get length of string + inc HL + inc HL + ld C,(HL) ; Get LSB of string address + inc HL + ld B,(HL) ; Get MSB of string address + ld L,A ; Length to L +TOSTRA: inc L ; inc - DECed after +TSALP: dec L ; Count bytes moved + ret Z ; End of string - Return + ld A,(BC) ; Get source + ld (DE),A ; Save destination + inc BC ; Next source + inc DE ; Next destination + jp TSALP ; Loop until string moved + +GETSTR: call TSTSTR ; Make sure it's a string +GSTRCU: ld HL,(FPREG) ; Get current string +GSTRHL: ex DE,HL ; Save DE +GSTRDE: call BAKTMP ; Was it last tmp-str? + ex DE,HL ; Restore DE + ret NZ ; No - Return + push DE ; Save string + ld D,B ; String block address to DE + ld E,C + dec DE ; Point to length + ld C,(HL) ; Get string length + ld HL,(STRBOT) ; Current bottom of string area + call CPDEHL ; Last one in string area? + jp NZ,POPHL ; No - Return + ld B,A ; Clear B (A=0) + add HL,BC ; Remove string from str' area + ld (STRBOT),HL ; Save new bottom of str' area +POPHL: pop HL ; Restore string + ret + +BAKTMP: ld HL,(TMSTPT) ; Get temporary string pool top + dec HL ; Back + ld B,(HL) ; Get MSB of address + dec HL ; Back + ld C,(HL) ; Get LSB of address + dec HL ; Back + dec HL ; Back + call CPDEHL ; String last in string pool? + ret NZ ; Yes - Leave it + ld (TMSTPT),HL ; Save new string pool top + ret + +LEN: ld BC,PASSA ; To return integer A + push BC ; Save address +GETLEN: call GETSTR ; Get string and its length + xor A + ld D,A ; Clear D + ld (TYPE),A ; Set type to numeric + ld A,(HL) ; Get length of string + or A ; Set status flags + ret + +ASC: ld BC,PASSA ; To return integer A + push BC ; Save address +GTFLNM: call GETLEN ; Get length of string + jp Z,FCERR ; Null string - Error + inc HL + inc HL + ld E,(HL) ; Get LSB of address + inc HL + ld D,(HL) ; Get MSB of address + ld A,(DE) ; Get first byte of string + ret + +CHR: ld A,$01 ; One character string + call MKTMST ; Make a temporary string + call MAKINT ; Make it integer A + ld HL,(TMPSTR+2) ; Get address of string + ld (HL),E ; Save character +TOPOOL: pop BC ; Clean up stack + jp TSTOPL ; Temporary string to pool + +LEFT: call LFRGNM ; Get number and ending ")" + xor A ; Start at first byte in string +RIGHT1: ex (SP),HL ; Save code string,Get string + ld C,A ; Starting position in string +MID1: push HL ; Save string block address + ld A,(HL) ; Get length of string + cp B ; Compare with number given + jp C,ALLFOL ; All following bytes required + ld A,B ; Get new length + defb $11 ; Skip "ld C,0" +ALLFOL: ld C,$00 ; First byte of string + push BC ; Save position in string + call TESTR ; See if enough string space + pop BC ; Get position in string + pop HL ; Restore string block address + push HL ; And re-save it + inc HL + inc HL + ld B,(HL) ; Get LSB of address + inc HL + ld H,(HL) ; Get MSB of address + ld L,B ; HL = address of string + ld B,$00 ; BC = starting address + add HL,BC ; Point to that byte + ld B,H ; BC = source string + ld C,L + call CRTMST ; Create a string entry + ld L,A ; Length of new string + call TOSTRA ; Move string to string area + pop DE ; Clear stack + call GSTRDE ; Move to string pool if needed + jp TSTOPL ; Temporary string to pool + + +; INSTR statement - look for a string inside another string +; usage: INSTR(A$,B$) -> search for B$ into A$ +; return 0 if B$ is not contained into A$ or LEN(A$)S2(PT2) THEN TF=0:EXIT +; PT1=PT1+1 +; PT2=PT2+1 +; LOOP UNTIL PT2=LEN(S2) +; IF TF<>0 THEN EXIT +; PT=PT+1 +;LOOP UNTIL PT>=LEN(S1)-LEN(S2) +;IF TF=0 THEN RETURN 0 ELSE RETURN TP +LNS1 equ TMPBFR1 +ADRS1 equ TMPBFR2 +LNS2 equ TMPBFR3 +ADRS2 equ TMPBFR4 +PT equ VIDEOBUFF +PT1 equ VIDEOBUFF+2 +PT2 equ VIDEOBUFF+4 +TP equ VIDEOBUFF+6 +TF equ VIDEOBUFF+8 +INSTR: call CHKSYN ; make sure "(" follows + defb '(' + dec HL ; dec 'cause GETCHR increments + call GETCHR ; check if something follows + jp Z,SNERR ; if nothing else, raise a syntax error + call EVAL ; Evaluate expression + call TSTSTR ; Make sure it's a string + ld (VIDEOBUFF),HL ; store code string pointer into a temp buffer + call GSTRCU ; check that a string follows + call LOADFP ; Move string block to BCDE (BC=pointer, E=length) + ld (LNS1),DE ; store values into + ld (ADRS1),BC ; temp buffers + ld HL,(VIDEOBUFF) ; retrieve code string pointer from temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + dec HL ; dec 'cause GETCHR increments + call GETCHR ; check if something follows + jp Z,SNERR ; if nothing else, raise a syntax error + call EVAL ; Evaluate expression + call TSTSTR ; Make sure it's a string + ld (VIDEOBUFF),HL ; store code string pointer into a temp buffer + call GSTRCU ; check that a string follows + call LOADFP ; Move string block to BCDE (BC=pointer, E=length) + ld (LNS2),DE ; store values into + ld (ADRS2),BC ; temp buffers + ld HL,(VIDEOBUFF) ; retrieve code string pointer from temp buffer + call CHKSYN ; make sure ")" follows + defb ')' + push HL ; store current code string pointer (the point after the ")" ) ... + pop IY ; ...into IY + xor A ; reset 10 RAM cells + ld B,$0A ; (INSTR registers) + ld HL,PT ; first cell +EMPTINS:ld (HL),A ; reset cell + inc HL ; next cell + djnz EMPTINS ; repeat + ld DE,(LNS2) ; load len(S2) into DE + ld HL,(LNS1) ; load len(S1) into HL + call CMP16 ; check that len(S1)>=len(S2) + jp C,RZINSTR ; if len(S2)>len(S1) then return 0 +RPTINST:xor A ; reset... + ld (TP),A ; ...TP... + ld (TF),A ; ...and TF + ld BC,(PT) ; pointer to S1 + ld HL,(ADRS1) ; first cell of S1 + add HL,BC ; get current position into RAM + ld A,(HL) ; load S1(PT) + ld HL,(ADRS2) ; pointer to first char of S2 + cp (HL) ; is S1(PT)=S2(0)? + jr NZ,CNT1INS ; no, continue + ld A,(PT) ; load current PT + ld (TP),A ; TP=PT + ld (PT1),A ; P1=PT + xor A ; set... + ld (PT2),A ; ...PT2=0 + inc A ; + ld (TF),A ; set TF=1 +RP2INST:ld BC,(PT1) ; load pointer PT1 + ld HL,(ADRS1) ; load address of S1 + add HL,BC ; find char of S1 pointed by PT1 + ld A,(HL) ; load S1(PT1) + ld BC,(PT2) ; load pointer PT2 + ld HL,(ADRS2) ; load char of S2 pointed by PT2 + add HL,BC ; find S2(PT2) + cp (HL) ; is S1(PT1)=S2(PT2)? + jr NZ,CNTZIN ; no, exit inner loop + ld HL,PT1 + inc (HL) ; increment PT1 + ld A,(PT2) + inc A ; increment PT2 + ld (PT2),A + jp Z,CNT1INS ; if PT2>255 then exit + ld HL,LNS2 ; len(S2) + cp (HL) ; PT2=len(S2)? + jp C,RP2INST ; no (PT2len(S1)-len(S2) + jp C,RPTINST ; repeat if < + jp Z,RPTINST ; repeat if = +RZINSTR:ld A,(TF) ; current value of TF + and A ; is it 0? + jp Z,LVINSTR ; yes, return 0 + ld A,(TP) ; return TP... + inc A ; ...incremented by 1 +LVINSTR:pop HL ; drop original return point + push IY ; load current string address from IY into stack + ld DE,RETNUM ; Address of Return number from function... + push DE ; ...saved on stack + jp PASSA ; return TP +CNTZIN: xor A ; set... + ld (TF),A ; TF=0 + jp CNT1INS ; continue + + +RIGHT: call LFRGNM ; Get number and ending ")" + pop DE ; Get string length + push DE ; And re-save + ld A,(DE) ; Get length + sub B ; Move back N bytes + jp RIGHT1 ; Go and get sub-string + +MID: ex DE,HL ; Get code string address + ld A,(HL) ; Get next byte ',' or ")" + call MIDNUM ; Get number supplied + inc B ; Is it character zero? + dec B + jp Z,FCERR ; Yes - Error + push BC ; Save starting position + ld E,$FF ; All of string + cp ')' ; Any length given? + jp Z,RSTSTR ; No - Rest of string + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; Get integer 0-255 +RSTSTR: call CHKSYN ; Make sure ")" follows + defb ')' + pop AF ; Restore starting position + ex (SP),HL ; Get string,save code string + ld BC,MID1 ; Continuation of MID$ routine + push BC ; Save for return + dec A ; Starting position-1 + cp (HL) ; Compare with length + ld B,$00 ; Zero bytes length + ret NC ; Null string if start past end + ld C,A ; Save starting position-1 + ld A,(HL) ; Get length of string + sub C ; Subtract start + cp E ; Enough string for it? + ld B,A ; Save maximum length available + ret C ; Truncate string if needed + ld B,E ; Set specified length + ret ; Go and create string + +VAL: call GETLEN ; Get length of string + jp Z,RESZER ; Result zero + ld E,A ; Save length + inc HL + inc HL + ld A,(HL) ; Get LSB of address + inc HL + ld H,(HL) ; Get MSB of address + ld L,A ; HL = String address + push HL ; Save string address + add HL,DE + ld B,(HL) ; Get end of string+1 byte + ld (HL),D ; Zero it to terminate + ex (SP),HL ; Save string end,get start + push BC ; Save end+1 byte + ld A,(HL) ; Get starting byte + cp '$' ; Hex number indicated? [function added] + jp NZ,VAL1 + call HEXTFP ; Convert Hex to FPREG + jr VAL3 +VAL1: cp '%' ; Binary number indicated? [function added] + jp NZ,VAL2 + call BINTFP ; Convert Bin to FPREG + jr VAL3 +VAL2: call ASCTFP ; Convert ASCII string to FP +VAL3: pop BC ; Restore end+1 byte + pop HL ; Restore end+1 address + ld (HL),B ; Put back original byte + ret + +LFRGNM: ex DE,HL ; Code string address to HL + call CHKSYN ; Make sure ")" follows + defb ')' +MIDNUM: pop BC ; Get return address + pop DE ; Get number supplied + push BC ; Re-save return address + ld B,E ; Number to B + ret + +INP: call MAKINT ; Make it integer A + ld (INPORT),A ; Set input port + call INPSUB ; Get input from port + jp PASSA ; Return integer A + +POUT: call SETIO ; Set up port number + jp OUTSUB ; Output data and return + +WAIT: call SETIO ; Set up port number + push AF ; Save AND mask + ld E,$00 ; Assume zero if none given + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,NOXOR ; No XOR byte given + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; Get integer 0-255 to XOR with +NOXOR: pop BC ; Restore AND mask +WAITLP: call INPSUB ; Get input + xor E ; Flip selected bits + and B ; Result non-zero? + jp Z,WAITLP ; No = keep waiting + ret + +SETIO: call GETINT ; Get integer 0-255 + ld (INPORT),A ; Set input port + ld (OTPORT),A ; Set output port + call CHKSYN ; Make sure ',' follows + defb ',' + jp GETINT ; Get integer 0-255 and return + +FNDNUM: call GETCHR ; Get next character +GETINT: call GETNUM ; Get a number from 0 to 255 +MAKINT: call DEPINT ; Make sure value 0 - 255 + ld A,D ; Get MSB of number + or A ; Zero? + jp NZ,FCERR ; No - Error + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + ld A,E ; Get number to A + ret + + +; activate a Non-Maskable Interrupt hooked to VDP interrupt signal +NMI: call GETNUM ; Get memory address + call DEINT ; get integer -32768 to 32767 + ld A,E ; check if address is 0 + or D + jr NZ,NM1 ; no, so jump over +DISNMI: di ; disable INTs + call NMIDINT ; disable VDP INT + push HL ; store HL + ld HL,$45ED ; these are the op-codes for "RETN" + ld (NMIUSR),HL ; store RETN + xor A + ld (NMIUSR+2),A ; "NOP" + jr NMI2 ; execute the last part of code +NM1: push HL ; store current HL + ex DE,HL ; move address argument into HL + di ; disable INTs + call NMIDINT ; disable VDP INT, if enabled + ld A,$C3 ; "jp" instruction + ld (NMIUSR),A ; store it + ld (NMIUSR+1),HL ; store address + call NMIEINT ; re-enable VDP INT +NMI2: ei ; re-enable INTS + nop ; wait for INTs + pop HL ; retrieve HL + ret ; return to caller +; enable VDP INT +NMIEINT:call NMIVR1 ; load default VReg #1 setting + or %00100000 ; enable VDP INT + jr NMIINT ; rest of code is shared +; disable VDP INT +NMIDINT:call NMIVR1 ; load default VReg #1 setting +NMIINT: push DE ; store DE + ld E,A ; move value into E + ld A,$01 ; VREG #1 + di ; disable INTs + call WRITE_VREG ; disable VDP INT + ei ; re-enable INTs + nop ; wait for INTs being enabled + pop DE ; retrieve DE + ret ; return to caller + +; load VREG #1 setting for current screen mode and return it into A +NMIVR1: push HL ; store HL + push DE ; store DE + ld A,(SCR_MODE) ; check screen mode + add A,A ; multiply A by 8... + add A,A ; ...so that reg. A can points.. + add A,A ; to the correct settings + inc A ; need to change VREG 1 + ld E,A ; copy A into E + ld D,$00 ; reset D + ld HL,VDPMODESET ; pointer to register #1 setting... + add HL,DE ; ...for current screen mode + ld A,(HL) ; load current setting + pop DE ; retrieve DE + pop HL ; retrieve HL + ret ; return to caller + +; execute a machine language routine, eventually passing a param into A +SYS: call GETNUM ; Get memory address + call DEINT ; Get integer -32768 to 32767 + ld (TMPBFR2),DE ; store user routine's address + xor A ; reset A + ld (TMPBFR1),A ; store into temp buffer + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; check next character + jr Z,NOSYSPR ; jump if nothing follows + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get byte value (0~255) if something follows + ld (TMPBFR1),A ; store into temp buffer +NOSYSPR:ld A,(TMPBFR1) ; recover A + ld DE,(TMPBFR2) ; recover user routine's address + push HL ; save code string address + ex DE,HL ; move user routine's address into HL + ld DE,SYSRET ; set point of return after the user routine + push DE ; store into stack + jp (HL) ; call user routine +SYSRET: pop HL ; retrieve code string address + ret ; return to caller + + +; read the contents of a byte from RAM +PEEK: call DEINT ; Get memory address into DE + ld A,(DE) ; Read value of memory cell + jp PASSA ; Return into A + +; read the contents of a byte from VRAM +VPEEK: call DEINT ; Get VRAM address into DE + ex DE,HL ; Copy param into HL + di ; Disable interrupts + call READ_VIDEO_LOC ; Read data from VRAM at address HL + ei ; Re-enable interrupts + ex DE,HL ; Restore HL + jp PASSA ; Return value into A + +; recover params for POKE/VPOKE commands +; returns address into DE and byte to be written into A +PKEPRMS:call GETNUM ; Get memory address + call DEINT ; Get integer -32768 to 32767 + ld (TMPBFR1),DE ; Store DE into a temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; Get integer 0-255 + ld DE,(TMPBFR1) ; Restore memory address + ret ; Return to caller + +; write a byte into SRAM +POKE: call PKEPRMS ; Get params: address and value, return into DE and A, resp. + ld (DE),A ; Load it into memory + ret + +; write a byte into VRAM +VPOKE: call PKEPRMS ; Get params: address and value, return into DE and A, resp. + ex DE,HL ; Copy address into HL + di ; Disable interrupts + call WRITE_VIDEO_LOC ; write data into VRAM at address HL + ei ; Re-enable interrupts + ex DE,HL ; Restore HL + ret ; Return to caller + +; position the cursor at a specific X,Y location onto screen +LOCATE: call GETINT ; get the first param into A + push HL ; store HL + ld HL,SCR_SIZE_W ; load address of screen width + ld E,(HL) ; load screen width into E + pop HL ; restore HL + cp E ; compare witdh with param + jp NC,FCERR ; value over the width of the screen, exit with Illegal F.C. error + ld (TMPBFR1),A ; Store X into a temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; Get the second param into A + push HL ; store HL + ld HL,SCR_SIZE_H ; load address of screen width + ld E,(HL) ; load screen width into A + pop HL ; restore HL + cp E ; compare witdh with param + jp NC,FCERR ; value over the height of the screen, exit with Illegal F.C. error + ld (SCR_CUR_NY),A ; store new Y + ld A,(TMPBFR1) ; recover the new X + ld (SCR_CUR_NX),A ; store new X + push HL ; store HL + di ; disable INTs + call MOVCRS ; move cursor to new location + ei ; re-enable INTs + pop HL ; restore HL + ret ; return to caller + +; write a byte into one of the PSG registers +SREG: call GETINT ; Get register number back into A + cp $10 ; check if value >= 16 (PSG registers go from 0 to 15) + jp NC,FCERR ; If yes, exit and raise an Illegal function call Error + ld (TMPBFR1),A ; Store A into a temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get second value (0-255), returned into A + ld E,A ; store value into E + ld A,(TMPBFR1) ; recover VDP register and store into D + di ; disable INTs + ld C,PSG_REG ; output port to access PSG registers + out (C),A ; send register # to PSG + ld C,PSG_DAT ; output port to send data to PSG + out (C),E ; send byte to write into selected register + ei ; re-enable INTs + ret ; return to caller + +; VOLUME ch,vol +; set the volume for the audio channels +; "ch" is 1~3 for corresponding channel, or 0 for all; "vol" is 0~15 (0=OFF, 15=MAX) +VOLUME: call GETINT ; get integer 0-255 (recover channel) + cp $04 ; check if it's in the range 0~3 + jp NC,FCERR ; if not, exit with Illegal function call error + ld (TMPBFR1),A ; Store A into a temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get integer 0-255 (recover channel) + cp $10 ; check if it's in the range 0~15 + jp NC,FCERR ; if not, exit with Illegal funcion call + ld D,A ; store volume into D + ld A,(TMPBFR1) ; retrieve channel + and A ; is it 0? (0=every channel) + jr NZ,VOLCH ; no, jump over + ld B,$03 ; yes, set every channel + ld E,$08 ; register volume of first channel +RPVOLCG:ld C,PSG_REG ; PSG register port + out (C),E ; set register # + ld C,PSG_DAT ; PSG data port + out (C),D ; send volume + inc E ; next register + djnz RPVOLCG ; repeat for each channel + ret ; return to caller +VOLCH: ld C,PSG_REG ; PSG register port + add $07 ; add 7 to A so that we have the correct register (1->8, 2->9, 3->10) + out (C),A ; set register + ld C,PSG_DAT ; PSG data port + out (C),D ; send volume level + ret ; return to caller + +; SOUND ch,tone,dur +; play a tone or noise of "tone" frequency from selected channel "ch" for duration "dur" +; "ch" is 1~6 (0=means sound OFF,1~3 for tone, 4~6 for noise) / "tone" is 1~4,095 (0=means no tone) / +; "dur" is 1~16383 h.o.s.,0.001~163s (0=means non-stop tone) +SOUND: call GETINT ; get integer 0-255 (recover channel) + and A ; is it zero? + jr NZ,CTSNDC ; no, continue with checking of params + push HL ; store HL + di ; disable INTs + call CLRPSGREGS ; yes, it's zero, so reset PSG registers to shut down every sound + ei ; re-enable INTs + pop HL ; retrieve HL + ret ; return to caller +CTSNDC: ld (TMPBFR1),A ; no, continue by storing A into a temp. buffer + cp $04 ; is channel >3? + jp NC,NOISUP ; Yes - check to see if it's a noise channel + call CHKSYN ; No, continue checking by making sure ',' follows + defb ',' + call GETNUM ; Get tone frequency + call DEINT ; Get integer -32768 to 32767 + ld (TMPBFR2),DE ; Store frequency + call CHKSYN ; Make sure ',' follows + defb ',' + call GETNUM ; Get duration + call DEINT ; Get integer -32768 to 32767 + ld (TMPBFR3),DE ; Store duration + ; CHECK CHANNEL + ld A,(TMPBFR1) ; recover channel + cp $01 ; is channel <1? + jp C,FCERR ; Yes - Illegal function call error + ; CHECK FREQUENCY + ld DE,(TMPBFR2) ; restore frequency from temp buffer + ld A,D ; move D into A and check if it is in the range 0~4095... + cp $10 ; ...so D must not be greater than $0F (15) + jp NC,FCERR ; if not in the range, exit with an Illegal function call error + ; CHECK DURATION + ld DE,(TMPBFR3) ; restore duration from temp buffer + ld A,D ; check if it is in the range 0~16383... + and $C0 ; ...(15th & 14th bits must not be set) + jp NZ,FCERR ; if not in the range, exit with an Illegal function call error + ; + ; SET TONE: + ; let's start by setting up the channel + ld A,(TMPBFR1) ; restore channel value + cp $03 ; is it 3? + jr NZ,SND1 ; no, jump over + ld A,%00000100 ; yes, for ch.3, set 3rd bit only (so A=001, B=010, C=100) +SND1: cpl ; complement of A - this is used later to set on the channel into the mixer + call WRTSND ; enable line into mixer of channel stored in A + ; SET FREQUENCY + ; we simply get frequency and subtract from 4096. The result + ; is put into register pair of the corresponding freq tone channel + ld DE,(TMPBFR2) ; restore frequency from temp buffer + push HL ; store HL (it will be used by the subroutine) + ld HL,$1000 ; load 4096 into HL + and A ; reset C flag + sbc HL,DE ; subtract freq from HL - now the frequency is inverted, so we will send the low as high and vice-versa + ld A,(TMPBFR1) ; restore channel value + dec A ; set A into the range 0~2 + add A,A ; double A to find the register pair that correspond to the channel (A->0,1 / B->2,3, C->4,5) + ld C,PSG_REG ; PSG register port + out (C),A ; select first register of the pair + ld C,PSG_DAT ; PSG data port + out (C),L ; send high byte + ld C,PSG_REG ; PSG register support + inc A ; second register of the pair + out (C),A ; select register + ld C,PSG_DAT ; PSG data port + out (C),H ; send low byte + ld DE,(TMPBFR3) ; recover duration + ld A,(TMPBFR1) ; recover channel value + dec A ; set channel into the range 0~2 + add A,A ; double A to find the correct offset + ld HL,CHASNDDTN ; set duration into... + add A,L ; ...the proper... + jr NC,SNDOVR ; (is there a rest? no, jump over + inc H ; yes, increment H) +SNDOVR: ld L,A ; ...register pair... + ld (HL),DE ; ...and store the value + pop HL ; retrieve HL + ret ; Return to caller +NOISUP: cp $07 ; is channel in range 4 to 6 (for a noise)? + jp NC,FCERR ; no, so ILLEGAL FUNCTION CALL + call CHKSYN ; yes, continue checking by making sure ',' follows + defb ',' + call GETINT ; get integer 0-255 (frequency) + cp $20 ; make sure it's in range 0~31 + jp NC,FCERR ; no, so Illegal function call + ld (TMPBFR2),A ; store freq. + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; check that nothing follows + jp NZ,SNERR ; error if no empty line + ld A,(TMPBFR2) ; retrieve freq. + ld E,A ; store freq into E + ld A,(TMPBFR1) ; retrieve channel + sub $03 ; subtract 3 to get channel in range 1~3 + cp $03 ; is it 3? + jr NZ,NOS1 ; no, jump over + ld A,%00000100 ; yes, for ch.3, set 3rd bit only (so A=001, B=010, C=100) +NOS1: add A,A + add A,A + add A,A ; let's move A 3 bits to left + ld B,A ; store channel into B + ld A,E ; check if + and A ; freq is 0 (means that noise reproduction must be halted) + di ; disable INts + jr NZ,NOS2 ; no, so jump over + ld A,$07 ; mixer register + call SETSNDREG ; set mixer register + in A,(C) ; load current mixer value + or B ; disable noise + jr NOS3 ; continue over +NOS2: ld A,B ; recover channel + cpl ; complement of A - this is used to set on the channel into the mixer + call WRTSND ; enable line into mixer of channel stored in A + ld A,$06 ; write into noise register + call SETSNDREG ; set register into PSG + ld A,E ; load value for noise frequency + call WRTSNDREG ; write data into register $06 + ei ; re-enable INTs + ret + ; enable line into mixer of channel stored in A +WRTSND: ld B,A ; move channel into B + ld A,$07 ; mixer register + call SETSNDREG ; set mixer register + in A,(C) ; load current value + and B ; set on the channel into the mixer (remember that 0=ON) + ; example: if channel is A (1), complement of 1 is 254 (11111110). So, 255 (in case + ; the register is still unchanged after reset) is 11111111 and + ; 11111111 AND 11111110 is equal to 11111110 + ; 11111001 AND 11111110 is equal to 11111000 (in case channels B & C are ON) +NOS3: ld B,A ; store new mixer value into B + ld A,$07 ; mixer address + call SETSNDREG ; set register + ld A,B ; retrieve new mixer value from B + call WRTSNDREG ; send new value for the mixer + ei ; re-enable INTs + ret ; return to caller + +; write a byte into one of the VDP registers +VREG: call GETINT ; Get register number back into A + cp $08 ; check if value is equal or greater than 8 (VDP registers are only 8, from 0 to 7) + jp NC,FCERR ; If yes, exit and raise an Illegal function call Error + ld (TMPBFR1),A ; Store A into a temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get value (0-255) + ld E,A ; store value into E + ld A,(TMPBFR1) ; recover VDP register and store into A + di ; disable INTs + call WRITE_VREG ; write value into VDP register + ei ; re-enable INTs + ret ; return to caller + +; read the VDP status register and return it into A +VSTAT: call DEINT ; Get integer -32768 to 32767 (Note: we do NOT use it) + di ; disable INTs + call READ_VSTAT ; read VDP register status + ei ; re-enable INTs + jp PASSA ; Return integer A + +; read from PSG register and return it into A +SSTAT: call DEINT ; get integer -32768 to 32767 + ld A,E ; consider LSB + cp $10 ; check if value >= 16 (PSG registers go from 0 to 15) + jp NC,FCERR ; If yes, exit and raise an Illegal function call Error + di ; disable INts + ld C,PSG_REG ; output port to set PSG register + out (C),A ; send register to read from + in A,(C) ; read register's contents and store into A + ei ; re-enable INTs + jp PASSA ; return A + +; read the temp key buffer and return the value of the current key being pressed +; can wait for the number of 100thds of second before to return +INKEY: call IDTEST ; Test for illegal direct + call DEINT ; get number param (100thds of second to wait) into DE + push BC ; store BC + ld A,(TMRCNT) ; Load current value of system timer + ld B,A ; move it into B +CMP_A: ld A,(TMRCNT) ; make a little delay of 1/100 sec... + cp B ; ...to let the sniffer collect... + jr NZ,CMP_A ; ...at least 1 char before to continue + ld A,D ; check the param + or E ; if DE<>0 then... + jr NZ,INKEY2 ; ...jump over... + ld A,(TMPKEYBFR) ; ...else read the buffer and... + jr ENDINK ; ...return it +INKEY2: ld A,D ; check if param>1023 + cp $04 ; to do this we check if MSB>3 + jp NC,FCERR ; if MSB >=4 then error + push HL ; store HL + ld HL,$0009 ; check if value + call CMP16 ; is < 10 + pop HL ; retrieve HL + jp C,SRTINK ; if value >= 10 then jump over + ld DE,$000A ; else, use 10 (no intervals shorter than 10/100s) +SRTINK: ld A,(TMRCNT) ; Load the first byte of the system timer + ld B,A ; move it into B +CHKINK: ld A,(TMPKEYBFR) ; load char code from buffer + and A ; is it 0? + jr NZ,ENDINK ; no, so we can return it + ld A,(TMRCNT) ; load the first byte of the system timer + cp B ; is it the same value? + jr Z,CHKINK ; yes, so read again + ld B,A ; store new value + dec DE ; no, decrement timer + ld A,D ; check if zero reached + or E ; by ORing D and E + jr NZ,CHKINK ; if not 0, repeat +ENDINK: pop BC ; restore BC + push AF ; store A + di ; disable INTs + xor A ; clear the... + ld (TMPKEYBFR),A ; ...TMP KEY buffer for the next read + ei ; re-enable INTs + pop AF ; retrieve A +ENDINK2:jp PASSA ; return A as ASCII value + +ROUND: ld HL,HALF ; Add 0.5 to FPREG +ADDPHL: call LOADFP ; Load FP at (HL) to BCDE + jp FPADD ; Add BCDE to FPREG + +SUBPHL: call LOADFP ; FPREG = -FPREG + number at HL + defb $21 ; Skip "pop BC" and "pop DE" +PSUB: pop BC ; Get FP number from stack + pop DE +SUBCDE: call INVSGN ; Negate FPREG +FPADD: ld A,B ; Get FP exponent + or A ; Is number zero? + ret Z ; Yes - Nothing to add + ld A,(FPEXP) ; Get FPREG exponent + or A ; Is this number zero? + jp Z,FPBCDE ; Yes - Move BCDE to FPREG + sub B ; BCDE number larger? + jp NC,NOSWAP ; No - Don't swap them + cpl ; Two's complement + inc A ; FP exponent + ex DE,HL + call STAKFP ; Put FPREG on stack + ex DE,HL + call FPBCDE ; Move BCDE to FPREG + pop BC ; Restore number from stack + pop DE +NOSWAP: cp 24+1 ; Second number insignificant? + ret NC ; Yes - First number is result + push AF ; Save number of bits to scale + call SIGNS ; Set MSBs & sign of result + ld H,A ; Save sign of result + pop AF ; Restore scaling factor + call SCALE ; Scale BCDE to same exponent + or H ; Result to be positive? + ld HL,FPREG ; Point to FPREG + jp P,MINCDE ; No - Subtract FPREG from CDE + call PLUCDE ; Add FPREG to CDE + jp NC,RONDUP ; No overflow - Round it up + inc HL ; Point to exponent + inc (HL) ; Increment it + jp Z,OVERR ; Number overflowed - Error + ld L,$01 ; 1 bit to shift right + call SHRT1 ; Shift result right + jp RONDUP ; Round it up + +MINCDE: xor A ; Clear A and carry + sub B ; Negate exponent + ld B,A ; Re-save exponent + ld A,(HL) ; Get LSB of FPREG + sbc A, E ; Subtract LSB of BCDE + ld E,A ; Save LSB of BCDE + inc HL + ld A,(HL) ; Get NMSB of FPREG + sbc A,D ; Subtract NMSB of BCDE + ld D,A ; Save NMSB of BCDE + inc HL + ld A,(HL) ; Get MSB of FPREG + sbc A,C ; Subtract MSB of BCDE + ld C,A ; Save MSB of BCDE +CONPOS: call C,COMPL ; Overflow - Make it positive + +BNORM: ld L,B ; L = Exponent + ld H,E ; H = LSB + xor A +BNRMLP: ld B,A ; Save bit count + ld A,C ; Get MSB + or A ; Is it zero? + jp NZ,PNORM ; No - Do it bit at a time + ld C,D ; MSB = NMSB + ld D,H ; NMSB= LSB + ld H,L ; LSB = VLSB + ld L,A ; VLSB= 0 + ld A,B ; Get exponent + sub $08 ; Count 8 bits + cp -24-8 ; Was number zero? + jp NZ,BNRMLP ; No - Keep normalising +RESZER: xor A ; Result is zero +SAVEXP: ld (FPEXP),A ; Save result as zero + ret + +NORMAL: dec B ; Count bits + add HL,HL ; Shift HL left + ld A,D ; Get NMSB + rla ; Shift left with last bit + ld D,A ; Save NMSB + ld A,C ; Get MSB + adc A,A ; Shift left with last bit + ld C,A ; Save MSB +PNORM: jp P,NORMAL ; Not done - Keep going + ld A,B ; Number of bits shifted + ld E,H ; Save HL in EB + ld B,L + or A ; Any shifting done? + jp Z,RONDUP ; No - Round it up + ld HL,FPEXP ; Point to exponent + add A,(HL) ; Add shifted bits + ld (HL),A ; Re-save exponent + jp NC,RESZER ; Underflow - Result is zero + ret Z ; Result is zero +RONDUP: ld A,B ; Get VLSB of number +RONDB: ld HL,FPEXP ; Point to exponent + or A ; Any rounding? + call M,FPROND ; Yes - Round number up + ld B,(HL) ; B = Exponent + inc HL + ld A,(HL) ; Get sign of result + and %10000000 ; Only bit 7 needed + xor C ; Set correct sign + ld C,A ; Save correct sign in number + jp FPBCDE ; Move BCDE to FPREG + +FPROND: inc E ; Round LSB + ret NZ ; Return if ok + inc D ; Round NMSB + ret NZ ; Return if ok + inc C ; Round MSB + ret NZ ; Return if ok + ld C,$80 ; Set normal value + inc (HL) ; Increment exponent + ret NZ ; Return if ok + jp OVERR ; Overflow error + +PLUCDE: ld A,(HL) ; Get LSB of FPREG + add A,E ; Add LSB of BCDE + ld E,A ; Save LSB of BCDE + inc HL + ld A,(HL) ; Get NMSB of FPREG + adc A,D ; Add NMSB of BCDE + ld D,A ; Save NMSB of BCDE + inc HL + ld A,(HL) ; Get MSB of FPREG + adc A,C ; Add MSB of BCDE + ld C,A ; Save MSB of BCDE + ret + +COMPL: ld HL,SGNRES ; Sign of result + ld A,(HL) ; Get sign of result + cpl ; Negate it + ld (HL),A ; Put it back + xor A + ld L,A ; Set L to zero + sub B ; Negate exponent,set carry + ld B,A ; Re-save exponent + ld A,L ; Load zero + sbc A,E ; Negate LSB + ld E,A ; Re-save LSB + ld A,L ; Load zero + sbc A,D ; Negate NMSB + ld D,A ; Re-save NMSB + ld A,L ; Load zero + sbc A,C ; Negate MSB + ld C,A ; Re-save MSB + ret + +SCALE: ld B,$00 ; Clear underflow +SCALLP: sub $08 ; 8 bits (a whole byte)? + jp C,SHRITE ; No - Shift right A bits + ld B,E ; <- Shift + ld E,D ; <- right + ld D,C ; <- eight + ld C,$00 ; <- bits + jp SCALLP ; More bits to shift + +SHRITE: add A,8+1 ; Adjust count + ld L,A ; Save bits to shift +SHRLP: xor A ; Flag for all done + dec L ; All shifting done? + ret Z ; Yes - Return + ld A,C ; Get MSB +SHRT1: rra ; Shift it right + ld C,A ; Re-save + ld A,D ; Get NMSB + rra ; Shift right with last bit + ld D,A ; Re-save it + ld A,E ; Get LSB + rra ; Shift right with last bit + ld E,A ; Re-save it + ld A,B ; Get underflow + rra ; Shift right with last bit + ld B,A ; Re-save underflow + jp SHRLP ; More bits to do + +UNITY: defb $00,$00,$00,$81 ; 1.00000 + +LOGTAB: defb $03 ; Table used by LOG + defb $AA,$56,$19,$80 ; 0.59898 + defb $F1,$22,$76,$80 ; 0.96147 + defb $45,$AA,$38,$82 ; 2.88539 + +LOG: call TSTSGN ; Test sign of value + or A + jp PE,FCERR ; ?FC Error if <= zero + ld HL,FPEXP ; Point to exponent + ld A,(HL) ; Get exponent + ld BC,$8035 ; BCDE = SQR(1/2) + ld DE,$04F3 + sub B ; Scale value to be < 1 + push AF ; Save scale factor + ld (HL),B ; Save new exponent + push DE ; Save SQR(1/2) + push BC + call FPADD ; Add SQR(1/2) to value + pop BC ; Restore SQR(1/2) + pop DE + inc B ; Make it SQR(2) + call DVBCDE ; Divide by SQR(2) + ld HL,UNITY ; Point to 1. + call SUBPHL ; Subtract FPREG from 1 + ld HL,LOGTAB ; Coefficient table + call SUMSER ; Evaluate sum of series + ld BC,$8080 ; BCDE = -0.5 + ld DE,$0000 + call FPADD ; Subtract 0.5 from FPREG + pop AF ; Restore scale factor + call RSCALE ; Re-scale number +MULLN2: ld BC,$8031 ; BCDE = Ln(2) + ld DE,$7218 + defb $21 ; Skip "pop BC" and "pop DE" + +MULT: pop BC ; Get number from stack + pop DE +FPMULT: call TSTSGN ; Test sign of FPREG + ret Z ; Return zero if zero + ld L,$00 ; Flag add exponents + call ADDEXP ; Add exponents + ld A,C ; Get MSB of multiplier + ld (MULVAL),A ; Save MSB of multiplier + ex DE,HL + ld (MULVAL+1),HL ; Save rest of multiplier + ld BC,$0000 ; Partial product (BCDE) = zero + ld D,B + ld E,B + ld HL,BNORM ; Address of normalise + push HL ; Save for return + ld HL,MULT8 ; Address of 8 bit multiply + push HL ; Save for NMSB,MSB + push HL ; + ld HL,FPREG ; Point to number +MULT8: ld A,(HL) ; Get LSB of number + inc HL ; Point to NMSB + or A ; Test LSB + jp Z,BYTSFT ; Zero - shift to next byte + push HL ; Save address of number + ld L,$08 ; 8 bits to multiply by +MUL8LP: rra ; Shift LSB right + ld H,A ; Save LSB + ld A,C ; Get MSB + jp NC,NOMADD ; Bit was zero - Don't add + push HL ; Save LSB and count + ld HL,(MULVAL+1) ; Get LSB and NMSB + add HL,DE ; Add NMSB and LSB + ex DE,HL ; Leave sum in DE + pop HL ; Restore MSB and count + ld A,(MULVAL) ; Get MSB of multiplier + adc A,C ; Add MSB +NOMADD: rra ; Shift MSB right + ld C,A ; Re-save MSB + ld A,D ; Get NMSB + rra ; Shift NMSB right + ld D,A ; Re-save NMSB + ld A,E ; Get LSB + rra ; Shift LSB right + ld E,A ; Re-save LSB + ld A,B ; Get VLSB + rra ; Shift VLSB right + ld B,A ; Re-save VLSB + dec L ; Count bits multiplied + ld A,H ; Get LSB of multiplier + jp NZ,MUL8LP ; More - Do it +POPHRT: pop HL ; Restore address of number + ret + +BYTSFT: ld B,E ; Shift partial product left + ld E,D + ld D,C + ld C,A + ret + + +; WORKING ā€“ā€“ +DINT: pop BC ; Get number from stack + pop DE + call DVBCDE ; get BCDE/FPREG and store result into FPREG + jp INT ; return INT(FPREG) + + +; A MODULO B - return remainder of the integer division A/B where: +; A is in stack; B is in FPREG +; math is: +; A=INT(A); B=INT(B); R=A-(B*INT(A/B)) +MOD: call INT ; B=INT(B) + call BCDEFP ; copy B (from FPREG) into BCDE + ld (TMPBFR3),DE ; store B into... + ld (TMPBFR4),BC ; ...a temp buffer + pop BC ; recover A... + pop DE ; ...from stack + call FPBCDE ; store A into FPREG + call INT ; get integer part: A=INT(A) + call BCDEFP ; copy A (from FPREG) into BCDE + ld (TMPBFR1),DE ; store A into... + ld (TMPBFR2),BC ; ...a temp buffer + ; begin calculation + ld HL,(TMPBFR3) ; move B... + ld (FPREG),HL ; ...from... + ld HL,(TMPBFR4) ; ...temp buffer... + ld (FPREG+2),HL ; ...into FPREG + call DVBCDE ; compute A/B and store into FPREG + call INT ; get integer part of result: now FPREG = INT(A/B) + ld DE,(TMPBFR3) ; load B... + ld BC,(TMPBFR4) ; ...into BCDE + call FPMULT ; get B*INT(A/B) and store into FPREG + ld DE,(TMPBFR1) ; retrieve A from... + ld BC,(TMPBFR2) ; ...temp buffer + jp SUBCDE ; return result of A-(B*INT(A/B)) + + +DIV10: call STAKFP ; Save FPREG on stack + ld BC,$8420 ; BCDE = 10. + ld DE,$0000 + call FPBCDE ; Move 10 to FPREG + +DIV: pop BC ; Get number from stack + pop DE +DVBCDE: call TSTSGN ; Test sign of FPREG + jp Z,DZERR ; Error if division by zero + ld L,-1 ; Flag subtract exponents + call ADDEXP ; Subtract exponents + inc (HL) ; Add 2 to exponent to adjust + inc (HL) + dec HL ; Point to MSB + ld A,(HL) ; Get MSB of dividend + ld (DIV3),A ; Save for subtraction + dec HL + ld A,(HL) ; Get NMSB of dividend + ld (DIV2),A ; Save for subtraction + dec HL + ld A,(HL) ; Get MSB of dividend + ld (DIV1),A ; Save for subtraction + ld B,C ; Get MSB + ex DE,HL ; NMSB,LSB to HL + xor A + ld C,A ; Clear MSB of quotient + ld D,A ; Clear NMSB of quotient + ld E,A ; Clear LSB of quotient + ld (DIV4),A ; Clear overflow count +DIVLP: push HL ; Save divisor + push BC + ld A,L ; Get LSB of number + call DIVSUP ; Subt' divisor from dividend + sbc A,$00 ; Count for overflows + ccf + jp NC,RESDIV ; Restore divisor if borrow + ld (DIV4),A ; Re-save overflow count + pop AF ; Scrap divisor + pop AF + scf ; Set carry to + defb $D2 ; Skip "pop BC" and "pop HL" + +RESDIV: pop BC ; Restore divisor + pop HL + ld A,C ; Get MSB of quotient + inc A + dec A + rra ; Bit 0 to bit 7 + jp M,RONDB ; Done - Normalise result + rla ; Restore carry + ld A,E ; Get LSB of quotient + rla ; Double it + ld E,A ; Put it back + ld A,D ; Get NMSB of quotient + rla ; Double it + ld D,A ; Put it back + ld A,C ; Get MSB of quotient + rla ; Double it + ld C,A ; Put it back + add HL,HL ; Double NMSB,LSB of divisor + ld A,B ; Get MSB of divisor + rla ; Double it + ld B,A ; Put it back + ld A,(DIV4) ; Get VLSB of quotient + rla ; Double it + ld (DIV4),A ; Put it back + ld A,C ; Get MSB of quotient + or D ; Merge NMSB + or E ; Merge LSB + jp NZ,DIVLP ; Not done - Keep dividing + push HL ; Save divisor + ld HL,FPEXP ; Point to exponent + dec (HL) ; Divide by 2 + pop HL ; Restore divisor + jp NZ,DIVLP ; Ok - Keep going + jp OVERR ; Overflow error + + +ADDEXP: ld A,B ; Get exponent of dividend + or A ; Test it + jp Z,OVTST3 ; Zero - Result zero + ld A,L ; Get add/subtract flag + ld HL,FPEXP ; Point to exponent + xor (HL) ; Add or subtract it + add A,B ; Add the other exponent + ld B,A ; Save new exponent + rra ; Test exponent for overflow + xor B + ld A,B ; Get exponent + jp P,OVTST2 ; Positive - Test for overflow + add A,$80 ; Add excess 128 + ld (HL),A ; Save new exponent + jp Z,POPHRT ; Zero - Result zero + call SIGNS ; Set MSBs and sign of result + ld (HL),A ; Save new exponent + dec HL ; Point to MSB + ret + +OVTST1: call TSTSGN ; Test sign of FPREG + cpl ; Invert sign + pop HL ; Clean up stack +OVTST2: or A ; Test if new exponent zero +OVTST3: pop HL ; Clear off return address + jp P,RESZER ; Result zero + jp OVERR ; Overflow error + +MLSP10: call BCDEFP ; Move FPREG to BCDE + ld A,B ; Get exponent + or A ; Is it zero? + ret Z ; Yes - Result is zero + add A,$02 ; Multiply by 4 + jp C,OVERR ; Overflow - ?OV Error + ld B,A ; Re-save exponent + call FPADD ; Add BCDE to FPREG (Times 5) + ld HL,FPEXP ; Point to exponent + inc (HL) ; Double number (Times 10) + ret NZ ; Ok - Return + jp OVERR ; Overflow error + +TSTSGN: ld A,(FPEXP) ; Get sign of FPREG + or A + ret Z ; RETurn if number is zero + ld A,(FPREG+2) ; Get MSB of FPREG + defb 0FEH ; Test sign +RETREL: cpl ; Invert sign + rla ; Sign bit to carry +FLGDIF: sbc A,A ; Carry to all bits of A + ret NZ ; Return -1 if negative + inc A ; Bump to +1 + ret ; Positive - Return +1 + +SGN: call TSTSGN ; Test sign of FPREG +FLGREL: ld B,$80+8 ; 8 bit integer in exponent + ld DE,0 ; Zero NMSB and LSB +RETINT: ld HL,FPEXP ; Point to exponent + ld C,A ; CDE = MSB,NMSB and LSB + ld (HL),B ; Save exponent + ld B,0 ; CDE = integer to normalise + inc HL ; Point to sign of result + ld (HL),$80 ; Set sign of result + rla ; Carry = sign of integer + jp CONPOS ; Set sign of result + +ABS: call TSTSGN ; Test sign of FPREG + ret P ; Return if positive +INVSGN: ld HL,FPREG+2 ; Point to MSB + ld A,(HL) ; Get sign of mantissa + xor $80 ; Invert sign of mantissa + ld (HL),A ; Re-save sign of mantissa + ret + +STAKFP: ex DE,HL ; Save code string address + ld HL,(FPREG) ; LSB,NLSB of FPREG + ex (SP),HL ; Stack them,get return + push HL ; Re-save return + ld HL,(FPREG+2) ; MSB and exponent of FPREG + ex (SP),HL ; Stack them,get return + push HL ; Re-save return + ex DE,HL ; Restore code string address + ret + +; store F.P. number from BCDE into FPREG +PHLTFP: call LOADFP ; Number at HL to BCDE +FPBCDE: ex DE,HL ; Save code string address + ld (FPREG),HL ; Save LSB,NLSB of number + ld H,B ; Exponent of number + ld L,C ; MSB of number + ld (FPREG+2),HL ; Save MSB and exponent + ex DE,HL ; Restore code string address + ret + +; load F.P. number from FPREG into BCDE +BCDEFP: ld HL,FPREG ; Point to FPREG +LOADFP: ld E,(HL) ; Get LSB of number + inc HL + ld D,(HL) ; Get NMSB of number + inc HL + ld C,(HL) ; Get MSB of number + inc HL + ld B,(HL) ; Get exponent of number +INCHL: inc HL ; Used for conditional "inc HL" + ret + +FPTHL: ld DE,FPREG ; Point to FPREG +DETHL4: ld B,$04 ; 4 bytes to move +DETHLB: ld A,(DE) ; Get source + ld (HL),A ; Save destination + inc DE ; Next source + inc HL ; Next destination + dec B ; Count bytes + jp NZ,DETHLB ; Loop if more + ret + +SIGNS: ld HL,FPREG+2 ; Point to MSB of FPREG + ld A,(HL) ; Get MSB + rlca ; Old sign to carry + scf ; Set MSBit + rra ; Set MSBit of MSB + ld (HL),A ; Save new MSB + ccf ; Complement sign + rra ; Old sign to carry + inc HL + inc HL + ld (HL),A ; Set sign of result + ld A,C ; Get MSB + rlca ; Old sign to carry + scf ; Set MSBit + rra ; Set MSBit of MSB + ld C,A ; Save MSB + rra + xor (HL) ; New sign of result + ret + +CMPNUM: ld A,B ; Get exponent of number + or A + jp Z,TSTSGN ; Zero - Test sign of FPREG + ld HL,RETREL ; Return relation routine + push HL ; Save for return + call TSTSGN ; Test sign of FPREG + ld A,C ; Get MSB of number + ret Z ; FPREG zero - Number's MSB + ld HL,FPREG+2 ; MSB of FPREG + xor (HL) ; Combine signs + ld A,C ; Get MSB of number + ret M ; Exit if signs different + call CMPFP ; Compare FP numbers + rra ; Get carry to sign + xor C ; Combine with MSB of number + ret + +CMPFP: inc HL ; Point to exponent + ld A,B ; Get exponent + cp (HL) ; Compare exponents + ret NZ ; Different + dec HL ; Point to MBS + ld A,C ; Get MSB + cp (HL) ; Compare MSBs + ret NZ ; Different + dec HL ; Point to NMSB + ld A,D ; Get NMSB + cp (HL) ; Compare NMSBs + ret NZ ; Different + dec HL ; Point to LSB + ld A,E ; Get LSB + sub (HL) ; Compare LSBs + ret NZ ; Different + pop HL ; Drop RETurn + pop HL ; Drop another RETurn + ret + +FPINT: ld B,A ; <- Move + ld C,A ; <- exponent + ld D,A ; <- to all + ld E,A ; <- bits + or A ; Test exponent + ret Z ; Zero - Return zero + push HL ; Save pointer to number + call BCDEFP ; Move FPREG to BCDE + call SIGNS ; Set MSBs & sign of result + xor (HL) ; Combine with sign of FPREG + ld H,A ; Save combined signs + call M,DCBCDE ; Negative - Decrement BCDE + ld A,$80+24 ; 24 bits + sub B ; Bits to shift + call SCALE ; Shift BCDE + ld A,H ; Get combined sign + rla ; Sign to carry + call C,FPROND ; Negative - Round number up + ld B,$00 ; Zero exponent + call C,COMPL ; If negative make positive + pop HL ; Restore pointer to number + ret + +DCBCDE: dec DE ; Decrement BCDE + ld A,D ; Test LSBs + and E + inc A + ret NZ ; Exit if LSBs not FFFF + dec BC ; Decrement MSBs + ret + +INT: ld HL,FPEXP ; Point to exponent + ld A,(HL) ; Get exponent + cp $80+24 ; Integer accuracy only? + ld A,(FPREG) ; Get LSB + ret NC ; Yes - Already integer + ld A,(HL) ; Get exponent + call FPINT ; F.P to integer + ld (HL),$80+24 ; Save 24 bit integer + ld A,E ; Get LSB of number + push AF ; Save LSB + ld A,C ; Get MSB of number + rla ; Sign to carry + call CONPOS ; Set sign of result + pop AF ; Restore LSB of number + ret + +MLDEBC: ld HL,$0000 ; Clear partial product + ld A,B ; Test multiplier + or C + ret Z ; Return zero if zero + ld A,$10 ; 16 bits +MLDBLP: add HL,HL ; Shift P.P left + jp C,BSERR ; ?BS Error if overflow + ex DE,HL + add HL,HL ; Shift multiplier left + ex DE,HL + jp NC,NOMLAD ; Bit was zero - No add + add HL,BC ; Add multiplicand + jp C,BSERR ; ?BS Error if overflow +NOMLAD: dec A ; Count bits + jp NZ,MLDBLP ; More + ret + +ASCTFP: cp '-' ; Negative? + push AF ; Save it and flags + jp Z,CNVNUM ; Yes - Convert number + cp '+' ; Positive? + jp Z,CNVNUM ; Yes - Convert number + dec HL ; dec 'cos GETCHR INCs +CNVNUM: call RESZER ; Set result to zero + ld B,A ; Digits after point counter + ld D,A ; Sign of exponent + ld E,A ; Exponent of ten + cpl + ld C,A ; Before or after point flag +MANLP: call GETCHR ; Get next character + jp C,ADDIG ; Digit - Add to number + cp '.' + jp Z,DPOINT ; '.' - Flag point + cp 'E' + jp NZ,CONEXP ; Not 'E' - Scale number + call GETCHR ; Get next character + call SGNEXP ; Get sign of exponent +EXPLP: call GETCHR ; Get next character + jp C,EDIGIT ; Digit - Add to exponent + inc D ; Is sign negative? + jp NZ,CONEXP ; No - Scale number + xor A + sub E ; Negate exponent + ld E,A ; And re-save it + inc C ; Flag end of number +DPOINT: inc C ; Flag point passed + jp Z,MANLP ; Zero - Get another digit +CONEXP: push HL ; Save code string address + ld A,E ; Get exponent + sub B ; Subtract digits after point +SCALMI: call P,SCALPL ; Positive - Multiply number + jp P,ENDCON ; Positive - All done + push AF ; Save number of times to /10 + call DIV10 ; Divide by 10 + pop AF ; Restore count + inc A ; Count divides + +ENDCON: jp NZ,SCALMI ; More to do + pop DE ; Restore code string address + pop AF ; Restore sign of number + call Z,INVSGN ; Negative - Negate number + ex DE,HL ; Code string address to HL + ret + +SCALPL: ret Z ; Exit if no scaling needed +MULTEN: push AF ; Save count + call MLSP10 ; Multiply number by 10 + pop AF ; Restore count + dec A ; Count multiplies + ret + +ADDIG: push DE ; Save sign of exponent + ld D,A ; Save digit + ld A,B ; Get digits after point + adc A,C ; Add one if after point + ld B,A ; Re-save counter + push BC ; Save point flags + push HL ; Save code string address + push DE ; Save digit + call MLSP10 ; Multiply number by 10 + pop AF ; Restore digit + sub '0' ; Make it absolute + call RSCALE ; Re-scale number + pop HL ; Restore code string address + pop BC ; Restore point flags + pop DE ; Restore sign of exponent + jp MANLP ; Get another digit + +RSCALE: call STAKFP ; Put number on stack + call FLGREL ; Digit to add to FPREG +PADD: pop BC ; Restore number + pop DE + jp FPADD ; Add BCDE to FPREG and return + +EDIGIT: ld A,E ; Get digit + rlca ; Times 2 + rlca ; Times 4 + add A,E ; Times 5 + rlca ; Times 10 + add A,(HL) ; Add next digit + sub '0' ; Make it absolute + ld E,A ; Save new digit + jp EXPLP ; Look for another digit + +LINEIN: push HL ; Save code string address + ld HL,INMSG ; Output " in " + call PRS ; Output string at HL + pop HL ; Restore code string address +PRNTHL: ex DE,HL ; Code string address to DE + xor A + ld B,$80+24 ; 24 bits + call RETINT ; Return the integer + ld HL,PRNUMS ; Print number string + push HL ; Save for return +NUMASC: ld HL,PBUFF ; Convert number to ASCII + push HL ; Save for return + call TSTSGN ; Test sign of FPREG + ld (HL),SPC ; Space at start + jp P,SPCFST ; Positive - Space to start + ld (HL),'-' ; '-' sign at start +SPCFST: inc HL ; First byte of number + ld (HL),'0' ; '0' if zero + jp Z,JSTZER ; Return '0' if zero + push HL ; Save buffer address + call M,INVSGN ; Negate FPREG if negative + xor A ; Zero A + push AF ; Save it + call RNGTST ; Test number is in range +SIXDIG: ld BC,$9143 ; BCDE - 99999.9 + ld DE,$4FF8 + call CMPNUM ; Compare numbers + or A + jp PO,INRNG ; > 99999.9 - Sort it out + pop AF ; Restore count + call MULTEN ; Multiply by ten + push AF ; Re-save count + jp SIXDIG ; Test it again + +GTSIXD: call DIV10 ; Divide by 10 + pop AF ; Get count + inc A ; Count divides + push AF ; Re-save count + call RNGTST ; Test number is in range +INRNG: call ROUND ; Add 0.5 to FPREG + inc A + call FPINT ; F.P to integer + call FPBCDE ; Move BCDE to FPREG + ld BC,$0306 ; 1E+06 to 1E-03 range + pop AF ; Restore count + add A,C ; 6 digits before point + inc A ; Add one + jp M,MAKNUM ; Do it in 'E' form if < 1E-02 + cp 6+1+1 ; More than 999999 ? + jp NC,MAKNUM ; Yes - Do it in 'E' form + inc A ; Adjust for exponent + ld B,A ; Exponent of number + ld A,2 ; Make it zero after + +MAKNUM: dec A ; Adjust for digits to do + dec A + pop HL ; Restore buffer address + push AF ; Save count + ld DE,POWERS ; Powers of ten + dec B ; Count digits before point + jp NZ,DIGTXT ; Not zero - Do number + ld (HL),'.' ; Save point + inc HL ; Move on + ld (HL),'0' ; Save zero + inc HL ; Move on +DIGTXT: dec B ; Count digits before point + ld (HL),'.' ; Save point in case + call Z,INCHL ; Last digit - move on + push BC ; Save digits before point + push HL ; Save buffer address + push DE ; Save powers of ten + call BCDEFP ; Move FPREG to BCDE + pop HL ; Powers of ten table + ld B,'0'-1 ; ASCII '0' - 1 +TRYAGN: inc B ; Count subtractions + ld A,E ; Get LSB + sub (HL) ; Subtract LSB + ld E,A ; Save LSB + inc HL + ld A,D ; Get NMSB + sbc A,(HL) ; Subtract NMSB + ld D,A ; Save NMSB + inc HL + ld A,C ; Get MSB + sbc A,(HL) ; Subtract MSB + ld C,A ; Save MSB + dec HL ; Point back to start + dec HL + jp NC,TRYAGN ; No overflow - Try again + call PLUCDE ; Restore number + inc HL ; Start of next number + call FPBCDE ; Move BCDE to FPREG + ex DE,HL ; Save point in table + pop HL ; Restore buffer address + ld (HL),B ; Save digit in buffer + inc HL ; And move on + pop BC ; Restore digit count + dec C ; Count digits + jp NZ,DIGTXT ; More - Do them + dec B ; Any decimal part? + jp Z,DOEBIT ; No - Do 'E' bit +SUPTLZ: dec HL ; Move back through buffer + ld A,(HL) ; Get character + cp '0' ; '0' character? + jp Z,SUPTLZ ; Yes - Look back for more + cp '.' ; A decimal point? + call NZ,INCHL ; Move back over digit + +DOEBIT: pop AF ; Get 'E' flag + jp Z,NOENED ; No 'E' needed - End buffer + ld (HL),'E' ; Put 'E' in buffer + inc HL ; And move on + ld (HL),'+' ; Put '+' in buffer + jp P,OUTEXP ; Positive - Output exponent + ld (HL),'-' ; Put '-' in buffer + cpl ; Negate exponent + inc A +OUTEXP: ld B,'0'-1 ; ASCII '0' - 1 +EXPTEN: inc B ; Count subtractions + sub $0A ; Tens digit + jp NC,EXPTEN ; More to do + add A,'0'+10 ; Restore and make ASCII + inc HL ; Move on + ld (HL),B ; Save MSB of exponent +JSTZER: inc HL ; + ld (HL),A ; Save LSB of exponent + inc HL +NOENED: ld (HL),C ; Mark end of buffer + pop HL ; Restore code string address + ret + +RNGTST: ld BC,$9474 ; BCDE = 999999. + ld DE,$23F7 + call CMPNUM ; Compare numbers + or A + pop HL ; Return address to HL + jp PO,GTSIXD ; Too big - Divide by ten + jp (HL) ; Otherwise return to caller + +HALF: defb $00,$00,$00,$80 ; 0.5 + +POWERS: defb $A0,$86,$01 ; 100000 + defb $10,$27,$00 ; 10000 + defb $E8,$03,$00 ; 1000 + defb $64,$00,$00 ; 100 + defb $0A,$00,$00 ; 10 + defb $01,$00,$00 ; 1 + +NEGAFT: ld HL,INVSGN ; Negate result + ex (SP),HL ; To be done after caller + jp (HL) ; Return to caller + +SQR: call STAKFP ; Put value on stack + ld HL,HALF ; Set power to 1/2 + call PHLTFP ; Move 1/2 to FPREG + +POWER: pop BC ; Get base + pop DE + call TSTSGN ; Test sign of power + ld A,B ; Get exponent of base + jp Z,EXP ; Make result 1 if zero + jp P,POWER1 ; Positive base - Ok + or A ; Zero to negative power? + jp Z,DZERR ; Yes - ?/0 Error +POWER1: or A ; Base zero? + jp Z,SAVEXP ; Yes - Return zero + push DE ; Save base + push BC + ld A,C ; Get MSB of base + or %01111111 ; Get sign status + call BCDEFP ; Move power to BCDE + jp P,POWER2 ; Positive base - Ok + push DE ; Save power + push BC + call INT ; Get integer of power + pop BC ; Restore power + pop DE + push AF ; MSB of base + call CMPNUM ; Power an integer? + pop HL ; Restore MSB of base + ld A,H ; but don't affect flags + rra ; Exponent odd or even? +POWER2: pop HL ; Restore MSB and exponent + ld (FPREG+2),HL ; Save base in FPREG + pop HL ; LSBs of base + ld (FPREG),HL ; Save in FPREG + call C,NEGAFT ; Odd power - Negate result + call Z,INVSGN ; Negative base - Negate it + push DE ; Save power + push BC + call LOG ; Get LOG of base + pop BC ; Restore power + pop DE + call FPMULT ; Multiply LOG by power + +EXP: call STAKFP ; Put value on stack + ld BC,$8138 ; BCDE = 1/Ln(2) + ld DE,$AA3B + call FPMULT ; Multiply value by 1/LN(2) + ld A,(FPEXP) ; Get exponent + cp $80+8 ; Is it in range? + jp NC,OVTST1 ; No - Test for overflow + call INT ; Get INT of FPREG + add A,$80 ; For excess 128 + add A,$02 ; Exponent > 126? + jp C,OVTST1 ; Yes - Test for overflow + push AF ; Save scaling factor + ld HL,UNITY ; Point to 1. + call ADDPHL ; Add 1 to FPREG + call MULLN2 ; Multiply by LN(2) + pop AF ; Restore scaling factor + pop BC ; Restore exponent + pop DE + push AF ; Save scaling factor + call SUBCDE ; Subtract exponent from FPREG + call INVSGN ; Negate result + ld HL,EXPTAB ; Coefficient table + call SMSER1 ; Sum the series + ld DE,$0000 ; Zero LSBs + pop BC ; Scaling factor + ld C,D ; Zero MSB + jp FPMULT ; Scale result to correct value + +EXPTAB: defb $08 ; Table used by EXP + defb $40,$2E,$94,$74 ; -1/7! (-1/5040) + defb $70,$4F,$2E,$77 ; 1/6! ( 1/720) + defb $6E,$02,$88,$7A ; -1/5! (-1/120) + defb $E6,$A0,$2A,$7C ; 1/4! ( 1/24) + defb $50,$AA,$AA,$7E ; -1/3! (-1/6) + defb $FF,$FF,$7F,$7F ; 1/2! ( 1/2) + defb $00,$00,$80,$81 ; -1/1! (-1/1) + defb $00,$00,$00,$81 ; 1/0! ( 1/1) + +SUMSER: call STAKFP ; Put FPREG on stack + ld DE,MULT ; Multiply by "X" + push DE ; To be done after + push HL ; Save address of table + call BCDEFP ; Move FPREG to BCDE + call FPMULT ; Square the value + pop HL ; Restore address of table +SMSER1: call STAKFP ; Put value on stack + ld A,(HL) ; Get number of coefficients + inc HL ; Point to start of table + call PHLTFP ; Move coefficient to FPREG + defb 06H ; Skip "pop AF" +SUMLP: pop AF ; Restore count + pop BC ; Restore number + pop DE + dec A ; Cont coefficients + ret Z ; All done + push DE ; Save number + push BC + push AF ; Save count + push HL ; Save address in table + call FPMULT ; Multiply FPREG by BCDE + pop HL ; Restore address in table + call LOADFP ; Number at HL to BCDE + push HL ; Save address in table + call FPADD ; Add coefficient to FPREG + pop HL ; Restore address in table + jp SUMLP ; More coefficients + +RND: call TSTSGN ; Test sign of FPREG + ld HL,SEED+2 ; Random number seed + jp M,RESEED ; Negative - Re-seed + ld HL,LSTRND ; Last random number + call PHLTFP ; Move last RND to FPREG + ld HL,SEED+2 ; Random number seed + ret Z ; Return if RND(0) + add A,(HL) ; Add (SEED)+2) + and %00000111 ; 0 to 7 + ld B,$00 + ld (HL),A ; Re-save seed + inc HL ; Move to coefficient table + add A,A ; 4 bytes + add A,A ; per entry + ld C,A ; BC = Offset into table + add HL,BC ; Point to coefficient + call LOADFP ; Coefficient to BCDE + call FPMULT ; ; Multiply FPREG by coefficient + ld A,(SEED+1) ; Get (SEED+1) + inc A ; Add 1 + and %00000011 ; 0 to 3 + ld B,$00 + cp $01 ; Is it zero? + adc A,B ; Yes - Make it 1 + ld (SEED+1),A ; Re-save seed + ld HL,RNDTAB-4 ; Addition table + add A,A ; 4 bytes + add A,A ; per entry + ld C,A ; BC = Offset into table + add HL,BC ; Point to value + call ADDPHL ; Add value to FPREG +RND1: call BCDEFP ; Move FPREG to BCDE + ld A,E ; Get LSB + ld E,C ; LSB = MSB + xor %01001111 ; Fiddle around + ld C,A ; New MSB + ld (HL),$80 ; Set exponent + dec HL ; Point to MSB + ld B,(HL) ; Get MSB + ld (HL),$80 ; Make value -0.5 + ld HL,SEED ; Random number seed + inc (HL) ; Count seed + ld A,(HL) ; Get seed + sub $AB ; Do it modulo 171 + jp NZ,RND2 ; Non-zero - Ok + ld (HL),A ; Zero seed + inc C ; Fillde about + dec D ; with the + inc E ; number +RND2: call BNORM ; Normalise number + ld HL,LSTRND ; Save random number + jp FPTHL ; Move FPREG to last and return + +RESEED: ld (HL),A ; Re-seed random numbers + dec HL + ld (HL),A + dec HL + ld (HL),A + jp RND1 ; Return RND seed + +RNDTAB: defb $68,$B1,$46,$68 ; Table used by RND + defb $99,$E9,$92,$69 + defb $10,$D1,$75,$68 + +COS: ld HL,HALFPI ; Point to PI/2 + call ADDPHL ; Add it to PPREG +SIN: call STAKFP ; Put angle on stack + ld BC,$8349 ; BCDE = 2 PI + ld DE,$0FDB + call FPBCDE ; Move 2 PI to FPREG + pop BC ; Restore angle + pop DE + call DVBCDE ; Divide angle by 2 PI + call STAKFP ; Put it on stack + call INT ; Get INT of result + pop BC ; Restore number + pop DE + call SUBCDE ; Make it 0 <= value < 1 + ld HL,QUARTR ; Point to 0.25 + call SUBPHL ; Subtract value from 0.25 + call TSTSGN ; Test sign of value + scf ; Flag positive + jp P,SIN1 ; Positive - Ok + call ROUND ; Add 0.5 to value + call TSTSGN ; Test sign of value + or A ; Flag negative +SIN1: push AF ; Save sign + call P,INVSGN ; Negate value if positive + ld HL,QUARTR ; Point to 0.25 + call ADDPHL ; Add 0.25 to value + pop AF ; Restore sign + call NC,INVSGN ; Negative - Make positive + ld HL,SINTAB ; Coefficient table + jp SUMSER ; Evaluate sum of series + +HALFPI: defb $DB,$0F,$49,$81 ; 1.5708 (PI/2) + +QUARTR: defb $00,$00,$00,$7F ; 0.25 + +SINTAB: defb $05 ; Table used by SIN + defb $BA,$D7,$1E,$86 ; 39.711 + defb $64,$26,$99,$87 ;-76.575 + defb $58,$34,$23,$87 ; 81.602 + defb $E0,$5D,$A5,$86 ;-41.342 + defb $DA,$0F,$49,$83 ; 6.2832 + +TAN: call STAKFP ; Put angle on stack + call SIN ; Get SIN of angle + pop BC ; Restore angle + pop HL + call STAKFP ; Save SIN of angle + ex DE,HL ; BCDE = Angle + call FPBCDE ; Angle to FPREG + call COS ; Get COS of angle + jp DIV ; TAN = SIN / COS + +ATN: call TSTSGN ; Test sign of value + call M,NEGAFT ; Negate result after if -ve + call M,INVSGN ; Negate value if -ve + ld A,(FPEXP) ; Get exponent + cp 81H ; Number less than 1? + jp C,ATN1 ; Yes - Get arc tangnt + ld BC,$8100 ; BCDE = 1 + ld D,C + ld E,C + call DVBCDE ; Get reciprocal of number + ld HL,SUBPHL ; Sub angle from PI/2 + push HL ; Save for angle > 1 +ATN1: ld HL,ATNTAB ; Coefficient table + call SUMSER ; Evaluate sum of series + ld HL,HALFPI ; PI/2 - angle in case > 1 + ret ; Number > 1 - Sub from PI/2 + +ATNTAB: defb $09 ; Table used by ATN + defb $4A,$D7,$3B,$78 ; 1/17 + defb $02,$6E,$84,$7B ;-1/15 + defb $FE,$C1,$2F,$7C ; 1/13 + defb $74,$31,$9A,$7D ;-1/11 + defb $84,$3D,$5A,$7D ; 1/9 + defb $C8,$7F,$91,$7E ;-1/7 + defb $E4,$BB,$4C,$7E ; 1/5 + defb $6C,$AA,$AA,$7F ;-1/3 + defb $00,$00,$00,$81 ; 1/1 + + +ARET: ret ; A RETurn instruction + +GETINP: rst $10 ; input a character + ret + +CLS: push HL + push DE + ld A,(SCR_MODE) ; check screen mode + cp $02 ; G2 mode? + call Z,EMPTYVIDBUF ; yes, reset video buffer + pop DE + pop HL + ld A,CS ; ASCII Clear screen + call SND2VID ; send to screen + jp MONOUT ; Output character + +WIDTH: call GETINT ; Get integer 0-255 + ld A,E ; Width to A + ld (LWIDTH),A ; Set width + ret + + +DEEK: call DEINT ; Get integer -32768 to 32767 + push DE ; Save number + pop HL ; Number to HL +RECWRD: ld B,(HL) ; Get LSB of contents + inc HL + ld A,(HL) ; Get MSB of contents + jp ABPASS ; Return integer AB + +DOKE: call GETNUM ; Get a number + call DEINT ; Get integer -32768 to 32767 + push DE ; Save address + call CHKSYN ; Make sure ',' follows + defb ',' + call GETNUM ; Get a number + call DEINT ; Get integer -32768 to 32767 + ex (SP),HL ; Save value,get address + ld (HL),E ; Save LSB of value + inc HL + ld (HL),D ; Save MSB of value + pop HL ; Restore code string address + ret + +; stop the execution of code for a certain bit of time. The pause +; is between $0000 and $FFFF 100ths of second (0~655.5 secs) +PAUSE: call GETNUM ; Get a number + call DEINT ; Get integer -32768 to 32767 + ld A,D ; load D into A + or E ; are D & E equal to $00? + ret Z ; if yes, then return +DIR_PAU:push BC ; store BC + ld A,(TMRCNT) ; Load current value of system timer + ld B,A ; move it into B +RPTPS: call TSTBRK ; Test for break key + ld A,(TMRCNT) ; Load current value of system timer + cp B ; is it the same value? + jr Z,RPTPS ; yes, so read again + ld B,A ; no, so store the new value + dec DE ; decrement interval + ld A,D ; load D into A + or E ; check if DE is equal to 0 (if D & e are $00 then result is 0) + jr NZ,RPTPS ; no, repeat + pop BC ; yes, recover BC and continue + ret + +; change the screen mode. Usage: SCREEN X[,Y][,Z] +; where X is: 0=text mode (40x24), +; 1=graphic mode 1 (32x24 chars); 2=graphic mode 2 (256x192 pixels); +; 3=multicolor mode (64x48 pixels); 4=extended graphic mode 2 (32x24 chars mixed between G1 and G2) +; Y is: 0=8x8 sprites, 1=16x16 sprites +; Z is: 0=no sprite magnification; 1=sprite magnification x2 (8x8=>16x16, and 16x16=32x32) +; (the latters are accepted only in graphic modes G1, G2, G3, and G4) +SCREEN: xor A + ld (TMPBFR2),A ; sprite size & magnif. byte set to 0 + call GETINT ; Get integer 0-255 + cp $05 ; is it a valid mode (0~4)? + jp NC,FCERR ; No - Illegal function call Error + ld (TMPBFR1),A ; store graphic mode + and A ; is it 0 (text mode)? + jp Z,SCVDP ; yes, ignore other arguments and set mode immediately +SETVDP: call CHKSCAR ; no, check if sprite size follows + jp C,CKMAGN ; no (set to 0 or missing), so jump over + ld A,$02 ; no, so set sprite size + ld (TMPBFR2),A ; ...to 16x16 +CKMAGN: call CHKSCAR ; check if sprite magnification follows + jp C,SCVDP ; no (set to 0 or missing), so jump over + ld A,(TMPBFR2) ; yes, so retrieve sprite attributes... + or $01 ; ...set sprite magnification to 2x... + ld (TMPBFR2),A ; ...and save flags again +SCVDP: di ; disable INTs + push DE ; store DE + push HL ; store HL + ld A,(TMPBFR1) ; recover graphic mode + ld E,A ; and store it into E + ld A,(TMPBFR2) ; recover sprite flags + ld D,A ; and store them into D + push DE ; store D & E + call initVDP ; initialize VDP with mode pointed by E + pop DE ; retrieve D & E + ld A,E ; move graphic mode into A + add A,A + add A,A + add A,A ; multiply A times 8 to get offset of graphic mode + ld E,A ; and pass it into E + push DE ; store sprite flags in E + ld D,$00 ; reset D + ld HL,VDPMODESET+1 ; load address of VDP settings for reg#1 + add HL,DE ; load correct reg#1 setting + pop DE ; retrieve sprite flags from E + ld A,(HL) ; load reg#1 setting + and %11111100 ; reset size & magn. bits + or D ; set size & magn. bits + ld E,A ; value into E + ld A,$01 ; reg #1 + call WRITE_VREG ; send setting to reg #1 + ld HL,(LINEAT) ; Get current line number + inc HL ; -1 means direct statement + ld A,H + or L + call Z,CURSOR_ON ; enable cursor if not in program mode + ei ; re-enable interrupts + pop HL ; restore HL + pop DE ; restore DE + ld A,(SCR_SIZE_H) ; check the screen mode by looking at the screen height + cp $30 ; is it 48 chars or 192 pixels (MC and G2 modes)? + ret NC ; yes, so exit (in graphics 2 and multicolor no print-on-video) + ld A,$01 ; no (we are in Text, G1 or ExG2), so activate the... + ld (PRNTVIDEO),A ; ...video buffer... + ret ; ...and return to caller + +; check an additional argument for SCREEN +CHKSCAR:dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + scf ; set carry flag + ret Z ; return if nothing follows with Carry=1 + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get value + rra ; Carry=bit #0 + ccf ; invert Carry, so Carry=0 if arg. is 1, and Carry=1 otherwise (arg<>1) + ret ; return + + +; change the colors of the screen - Syntax is COLOR a,b,c where: +; a=foreground color / b=background color / c=border color +; a,b,c must be in a range between 1 and 15 (0 is transparent and it's not supported) +COLOR: call GETINT ; get first value + call CHKCLR1 ; check if it's in range 1~15 + ld (TMPBFR1),A ; store it + ld A,(SCR_MODE) ; check screen mode + cp $03 ; is it multicolor mode? + jr NZ,CNTCKCL ; no, continue + ld A,$0F ; white for... + ld (FRGNDCLR),A ; ...foreground (even it's not used in MC) + ld A,(TMPBFR1) ; yes, so we stop here because in MC mode we just support border color + ld (TMPBFR3),A ; move color into temp buffer 3 + jr CLRMC ; jump to set color +CNTCKCL:call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get second value + call CHKCLR1 ; check if it's in range 1~15 + ld (TMPBFR2),A ; store it + ld A,(SCR_MODE) ; check screen mode + and A ; is it text mode? + jr Z,CLRTXT ; yes, stop here because in text mode, background and border colors coincide + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get third value + call CHKCLR1 ; check if it's in range 1~15 + ld (TMPBFR3),A ; store it + push DE ; store DE + ld A,(SCR_MODE) ; check screen mode + cp $01 ; is it G1 mode? + jr Z,CLRG1 ; yes, jump over + cp $02 ; is it G2 mode? + jr Z,CLRG2 ; yes, jump over + jr CLREX2 ; last case can only be ExG2 +CLRTXT: call MIXCLRS ; mix foreground and background color nibbles in 1 byte +CLRMC: ld (TMPBFR3),A ; store color settings (for MC mode, we only set border color) + push DE ; store DE + di ; disable INTs + jr SETBRCL ; set colors and exit +CLRG1: call MIXCLRS ; mix foreground and background color nibbles in 1 byte + ld D,$01 ; repeat 1 time + ld B,$20 ; 32 bytes of colors + jr LOADCLR ; load colors +CLRG2: call MIXCLRS ; mix foreground and background color nibbles in 1 byte + ld D,$18 ; 18 pages of... + ld B,$00 ; ...256 bytes each + jr LOADCLR ; load colors +CLREX2: call MIXCLRS ; mix foreground and background color nibbles in 1 byte + ld D,$08 ; 8 pages of... + ld B,$00 ; ...256 bytes each +LOADCLR:push HL ; store HL + ld HL,$2000 ; color table start: $2000 + di ; disable INTs + call SETVDPADRS + ld C,VDP_DAT ; VDP data mode +RPTLDCL:out (C),A ; after first byte, the VDP autoincrements VRAM pointer + nop + nop + djnz RPTLDCL ; repeat for 256 bytes (1 page) + dec D ; did we fill up all the pages? + jr NZ,RPTLDCL ; no, repeat + ei + pop HL ; retrieve HL +SETBRCL:ld A,(TMPBFR1) ; retrieve foreground color + ld (FRGNDCLR),A ; store it + ld A,(TMPBFR2) ; retrieve background color + ld (BKGNDCLR),A ; store it + ld A,(TMPBFR3) ; recover border color + ld E,A ; move it into E + ld A,$07 ; set VDP register 7 + di + call WRITE_VREG ; send value to VDP: set border color + ei ; re-enable INTs + pop DE ; retrieve DE + ret ; return to caller + + +; mix 2 color nibbles in 1 byte +MIXCLRS:ld A,(TMPBFR2) ; retrieve background color + ld B,A ; move it into B + ld A,(TMPBFR1) ; retrieve foreground color + add A,A ; move foreground color into the high nibble of A + add A,A + add A,A + add A,A + or B ; put background color into the low nibble of A + ret ; return to caller + + +; check if the color is not 0 and into the range 1~15 +CHKCLR1:and A ; is it 0? + jp Z,SNERR ; yes, raise a SN error +CHKCLR0:cp $10 ; is it in range 0~15? + jp NC,SNERR ; no, raise a SN error + ret ; param is OK, can return + + +; check if in graphics 2 mode +CHKG2M: ld A,(SCR_MODE) ; check screen mode + cp $02 ; actually, we can paint only in G2 + jp NZ,GMERR ; no G2, print a No Graphics Mode Error + ret ; return to caller + + +; print a text in screen 2 +; GPRINT text,x,y[,fc[,bc]] +; where "text" is an expression that can be converted into a sequence of ASCII chars, +; x & y are the coordinates (0<=x<=32, 0<=y<=23), fc & bc are foreground and background +; colors (1~15), resp. +; (portions of code are from nippur72) +GX equ TMPBFR3 +GY equ TMPBFR4 +TMPCLR equ TMPBFR2 +MIXCOL equ TMPBFR1 +TMPADR equ VIDEOBUFF +CHRPNT equ VIDEOBUFF+$02 +NUMCHR equ VIDEOBUFF+$04 +TMPHL equ VIDEOBUFF+$06 +GPRINT: call CHKG2M ; check if in graphic mode 2 + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; check if something follows + jp Z,SNERR ; if nothing else, raise a syntax error + ld (VIDEOBUFF),HL ; save current code string pointer + call EVAL ; Evaluate expression + call TSTSTR ; Make sure it's a string + ld (TMPHL),HL ; store code string pointer + call GSTRCU ; Current string to pool + call LOADFP ; Move string block to BCDE (BC=pointer, E=length) + ld (CHRPNT),BC ; store string pointer + ld (NUMCHR),DE ; store string lenght + ld HL,(TMPHL) ; store code string pointer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get X coord. + cp $20 ; is it in rage 0~31? + jp NC,FCERR ; Illegal function call error + ld (GX),A ; store into temp. buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y coord. + cp $18 ; is it in range 0~23? + jp NC,FCERR ; Illegal function call error + ld (GY),A ; store into temp. buffer + ld DE,TMPCLR + ld A,(BKGNDCLR) ; load background color + ld (DE),A ; store into temp buff + ld A,(FRGNDCLR) ; load foreground color + dec DE + dec DE + ld (DE),A ; store into temp buff + call CKCOL ; check color + jp Z,CNTGPT2 ; if anything follows, jump over + inc DE + inc DE + call CKCOL ; check background color +CNTGPT2:call MIXCLRS ; mix foreground & background colors + ld (MIXCOL),A ; store mixed colors + push HL ; store code string address + ld BC,(CHRPNT) ; retrieve string pointer + ld DE,(NUMCHR) ; retrieve string lenght + inc E ; Length + 1 + call GPNT ; print on G2 + pop HL ; recover HL + ret ; return to caller +GPNT: push DE ; store string lenght (E) + ; calculate VRAM address of first char + LD A,(GX) ; load X + ld L,A ; + ld H,0 ; HL = X + add HL,HL ; + add HL,HL ; + add HL,HL ; X=X*8 + ld A,(GY) ; load Y + ld D,A ; move it into D + ld E,0 ; DE =Y*256 + add HL,DE ; address = X*8 + Y*256 + ld (TMPADR),HL ; store VRAM address of first VRAM cell + pop DE ; retrieve # of chars to be printed yet (E) +RPGPNT: dec E ; Count characters + ret Z ; End of string - return + push DE ; store chars counter + ; calculate dest address in color vram + ld HL,(TMPADR) ; recover VRAM address + ld DE,$2000 ; color map address + add HL,DE ; HL = $2000 + XY address + di ; disable INTs + ; send color settings +GPNTCOL:call SETVDPADRS ; set VRAM address for color cell + ld A,(MIXCOL) ; load color settings + ld B,$08 ; repeat for 8 rows + ld C,VDP_DAT ; VDP data mode +GPNTCO1:out (C),A ; send data (VRAM pointer auto-increments) + nop ; wait... + nop ; ...a... + nop ; ...while + djnz GPNTCO1 ; repeat for 8 cells + ; calculate source address + ld HL,(CHRPNT) ; load char pointer + ld A,(HL) ; get char + inc HL ; increment char pointer + ld (CHRPNT),HL ; store char pointer + ld L,A ; + ld H,0 ; char into HL + add HL,HL ; + add HL,HL ; + add HL,HL ; get offset of char into ROM (charcode * 8) + ld DE,CHRST88 ; DE = start of 8x8 fonts in ROM + add HL,DE ; HL = start of characters in ROM + ex DE,HL ; store address into DE +GPCPCHR:ld HL,(TMPADR) ; load VRAM address + call SETVDPADRS ; send it to VDP + ex DE,HL ; restore address into HL + ld B,$08 ; repeat for 8 rows + ld C,VDP_DAT ; VDP data mode +GPCPCH1:outi ; load a byte from ROM and send to VRAM + nop ; wait... + nop ; ...a... + nop ; ...while + jr NZ,GPCPCH1 ; repeat for 8 chars + ei ; re-enable INTs + ld DE,$0008 ; 8 bytes to go to the next video ell + ld HL,(TMPADR) ; load VRAM address + add HL,DE ; get address of next VRAM cell + ld (TMPADR),HL ; store new VRAM address + ld DE,$1800 ; forbidden address + call CMP16 ; check if the printing has gone out of the screen + pop DE ; retrieve number of chars to be printed + ret NC ; if HL>=$1800 then leave + jp RPGPNT ; otherwise, check if more chars to output + +CKCOL: dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + ret Z ; return if nothing follows + call CHKSYN ; Make sure ',' follows + defb ',' + push DE ; store DE + call GETINT ; get value + call CHKCLR1 ; check if color is in range 1~15 + pop DE ; retrieve DE + ld (DE),A ; store color into temp buffer + ret ; return to caller + +; POINT(x,y): return if a pixel is set (1) or reset (0) +POINT: call CHKG2M ; check if in graphic mode 2 + call CHKSYN ; make sure "(" follows + defb '(' + call GETINT ; get X coords. + ld (TMPBFR1),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y coords, + cp $C0 ; check if Y is in range 0~191 + jp NC,FCERR ; no, raise an FC error + ld (TMPBFR2),A ; store into a temp buffer + call CHKSYN ; make sure ")" follows + defb ')' + push HL ; store current string address - the point after the ")" - ... + pop IY ; ...into IY + call XY2HL ; find HL address of pixel at X,Y + ld D,A ; store pixel index + di ; disable INTs + call READ_VIDEO_LOC ; read contents of VRAM cell addressed by HL + ei ; re-enable INTs + and D ; is the pixel ON or OFF? (will be checked later) + pop HL ; drop original return point + push IY ; load current string address from IY into stack + ld DE,RETNUM ; Address of Return number from function... + push DE ; ...saved on stack + LD A,$00 ; A=0 (reset A w/o altering flags) + LD B,A ; and B=0, so integer AB = 0 + jp Z,ABPASS ; if pixel is off, return AB=0 + inc B ; otherwise, return AB=1 +PNTEND: jp ABPASS ; return AB + + +; PLOT X,Y[,color] +; plot a pixel in graphic mode 2 +PLOT: call CHKG2M ; check if in G2 mode + call GETINT ; get X coords. + ld (TMPBFR1),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y coords, + cp $C0 ; check if Y is in range 0~191 + jp NC,FCERR ; no, raise an FC error + ld (TMPBFR2),A ; store into a temp buffer + call CLRPRM ; check if param "color" has been passed +CNTPLOT:push HL ; store HL + push BC ; store BC + push DE ; store DE + call XY2HL ; find VRAM address of byte containing pixel at X,Y & return into HL + jp NC,NOGD ; if carry is reset, there was an error -> so leave + ld D,A ; move pixel value into D + ld A,(TMPBFR3) ; retrieve color + and A ; is it 0? (background, or reset pixel) + jr NZ,CNTPLT1 ; no, continue + di ; yes - so, disable INTs + call READ_VIDEO_LOC ; load original value of VRAM cell pointed by HL + ei ; re-enable INTs + ld E,A ; store value of cell + ld A,D ; retrieve pixel + cpl ; revert bits + ld D,A ; move it again into D + ld A,E ; retrieve value of cell + and D ; set video pixel to off + di ; disable INTs + call WRITE_VIDEO_LOC ; write new value into VRAM cell + ei ; re-enable INTs + jp NOGD ; leave +CNTPLT1:add A,A ; now we move low nibble + add A,A ; in the high nibble + add A,A ; by adding A to itself + add A,A ; 4 times (this is a shift left 4) + ld E,A ; move it into E + di ; disable INTs + call READ_VIDEO_LOC ; load original value of VRAM cell pointed by HL + ei + or D ; plot new pixel preserving original pattern + di + call WRITE_VIDEO_LOC ; write new value into VRAM cell + ei + set 5,H ; set to write into color VRAM (it's like adding $2000 to HL) + di + call READ_VIDEO_LOC ; load original colors of pixel + ei + and %00001111 ; reset high nibble (the foreground color) + or E ; set new foreground color + di + call WRITE_VIDEO_LOC ; write new color settings + ei ; re-enable INTs + nop ; wait for INTs to be enabled again +NOGD: pop DE ; retrieve DE + pop BC ; retrieve BC + pop HL ; retrieve HL + ret ; return to caller +PXLSET: defb $80,$40,$20,$10,$08,$04,$02,$01 ; pixel to be set ON + ; where R(X/8)=> 0=80h, 1=40h, 2=20h, 3=10h, 4=08h, 5=04h, 6=02h, 7=$01 + + +; compute the VRAM address of the byte containing the pixel +; being pointed by X,Y (TMPBFR1,TMPBFR1) +; byte address is returned into HL +; pixel is returned into A +XY2HL: ; formula is: ADDRESS=(INT(X/8))*8 + (INT(Y/8))*256 + R(Y/8) + ; where R(Y/8) is the remainder of (Y/8) + ; the pixel to be set is given by R(X/8), and data is taken from the array + ld A,(TMPBFR2) ; retrieve Y + cp $C0 ; Y>=192? + ret NC ; yes, so leave + ld E,$08 ; load E with divisor + ld D,A ; and store into D (dividend) + call DIV_8_8 ; get Y/8, D is quotient=INT(Y/8), and A is remainder + ld C,A ; store remainder into C + ld B,D ; B=(INT(Y/8))*256 (we simply copy quotient into B) + ld HL,BC ; copy BC into HL: now HL has the VRAM address of the byte being set + ld A,(TMPBFR1) ; retrieve X + ld D,A ; and move it into D (dividend) + call DIV_8_8 ; get X/8, D is quotient=INT(X/8), and A is remainder + ld C,A ; store remainder into C + ld A,D ; move quotient into A + add A,A + add A,A + add A,A ; multiply quotient by 8 + ld E,A ; store result into E + ld D,$00 ; reset D + add HL,DE ; add DE to HL, getting the final VRAM address + ex DE,HL ; move VRAM address into DE + ld HL,PXLSET ; starting address of table for pixel to draw + ld B,$00 ; reset B + add HL,BC ; add C (remainder of X/8) to get address of pixel to turn on + ld A,(HL) ; load pixel data + ex DE,HL ; retrieve VRAM pattern address into HL + scf ; set Carry for normal exit + ret ; return to caller + + +; DRAW X1,Y1,X2,Y2[,color] +; Draw a line using Bresenham's line algorithm from X1,Y1 to X2,Y2 +; X1,Y1 can be either less than or greater than X2,Y2 (meaning that) +; the drawing will be ever done from X1,Y2 to X2,Y2, regardless of +; the values. If color is not specified, the foreground color set +; with COLOR will be used +X1 equ TMPBFR1 +Y1 equ TMPBFR2 +X2 equ VIDEOBUFF +Y2 equ VIDEOBUFF+$02 +ER equ VIDEOBUFF+$04 +E2 equ VIDEOBUFF+$06 +SX equ VIDEOBUFF+$08 +SY equ VIDEOBUFF+$0A +DX equ VIDEOBUFF+$0C +DY equ VIDEOBUFF+$0E +DRAW: call CHKG2M ; check if in G2 mode + call CLRVDBF ; clear VIDEOBUFF + call GETINT ; get X1 coords. + ld (X1),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y1 coords. + cp $C0 ; check if Y1 is in range 0~191 + jp NC,FCERR ; no, raise an FC error + ld (Y1),A ; store into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get X2 coords. + ld (X2),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y2 coords + cp $C0 ; check if Y2 is in range 0~191 + jp NC,FCERR ; no, raise an FC error + ld (Y2),A ; store it into a temp buffer + call CLRPRM ; check for arg. "color" and store it into TMPBFR3 + push HL ; store register we'll use + push DE + push BC + ld DE,(X1) ; load X1 and + ld HL,(X2) ; X2 + or A ; clear CARRY + sbc HL,DE ; DX=X2-X1 + call absHL ; DX=ABS(DX) + ld (DX),HL ; store DX + ld BC,$FFFF ; SX=-1 + ld HL,(X1) + ld DE,(X2) + call CMP16 ; X1X2 + ld BC,$0001 ; yes, so set SX=1 +X1GR: ld (SX),BC ; store SX + ld DE,(Y1) + ld HL,(Y2) + or A ; clear Carry + sbc HL,DE ; DY=Y2-Y1 + call absHL ; DY=ABS(DY) + ld (DY),HL ; store DY + ld BC,$FFFF ; SY=-1 + ld HL,(Y1) + ld DE,(Y2) + call CMP16 ; is Y1Y2 - jump over + ld BC,$0001 ; yes, so set SY=1 +Y1GR: ld (SY),BC ; store SY + ld HL,(DY) ; ER=DY + call negHL ; ER=-DY + ld (ER),HL ; store ER + ld HL,(DX) + ld DE,(DY) + call CMP16 ; DX>DY? + jp Z,ER2 ; no, DX=DY + jp M,ER2 ; no, DXDY, so ER=DX +ER2: ld HL,(ER) ; load ER + sra H ; right shift (and preserve sign)... + rr L ; ...of HL, so ER=INT(ER/2) + bit 7,H ; is the number negative? + jp Z,STRE2 ; no, jump over + inc HL ; yes, add 1 'cos INT of a negative number needs to be incremented +STRE2: ld (ER),HL ; store ER +RPTDRW: call CNTPLOT ; plot first pixel + ld HL,(X1) + ld DE,(X2) + call CMP16 ; X1=X2? + jr NZ,CNTDRW ; no, continue drawing + ld HL,(Y1) ; yes, so check + ld DE,(Y2) ; also Y + call CMP16 ; Y1=Y2? + jp Z,ENDDRAW ; yes, finished drawing: exit +CNTDRW: ld DE,(ER) + ld (E2),DE ; E2=ER + ld HL,(DX) + call negHL ; DX=-DX + ex DE,HL ; invert DE and HL => HL=E2, DE=-DX + call CMP16 ; E2>-DX? + jp Z,DXGR ; no, E2=-DX: jump + jp M,DXGR ; no, E2<-DX: jump + ld HL,(ER) ; yes + ld DE,(DY) + or A ; clear CARRY + sbc HL,DE ; ER=ER-DY + ld (ER),HL + ld HL,(X1) + ld DE,(SX) + add HL,DE ; X1=X1+SX (increment X1) + ld (X1),HL +DXGR: ld HL,(E2) + ld DE,(DY) + call CMP16 ; E2DY: jump + ld HL,(ER) ; yes + ld DE,(DX) + add HL,DE ; ER=ER+DX + ld (ER),HL + ld HL,(Y1) + ld DE,(SY) + add HL,DE ; Y1=Y1+SY (increment Y1) + ld (Y1),HL + jp RPTDRW ; repeat +ENDDRAW:pop BC ; retrieve BC + pop DE ; retrieve DE + pop HL ; retrieve HL + ret ; return to caller + + +; CIRCLE X,Y,R[,C] +; Draw a circle using Bresenham's circle algorithm with center in X,Y +; and radius R, with optional color C. If color is not specified, the +; foreground color set with COLOR will be used +XC equ VIDEOBUFF +YC equ VIDEOBUFF+$02 +RADIUS equ VIDEOBUFF+$04 +XI equ VIDEOBUFF+$06 +YI equ VIDEOBUFF+$08 +DC equ VIDEOBUFF+$0A +CIRCLE: call CHKG2M ; check if in G2 mode + call CLRVDBF ; clear VIDEOBUFF + call GETINT ; get X coords. + ld (XC),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get Y coords, + ld (YC),A ; store it into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get radius + ld (RADIUS),A ; store it into a temp buffer + call CLRPRM ; check if param "color" has been passed + push BC ; store BC + push DE ; store DE + push HL ; store HL + xor A ; clear A, + ld B,A ; B, + ld C,A ; C, + ld D,A ; D, + ld H,A ; and H + ld (XI),BC ; clear XI + ld A,(RADIUS) ; load RADIUS into A + ld L,A ; HL now contains R + ld (YI),HL ; YI=RADIUS + add HL,HL ; R*2 + ex DE,HL ; put HL into DE + ld HL,$0003 ; now HL is 3 + xor A ; clear Carry + sbc HL,DE ; HL=>D=3-(2*R) + ld (DC),HL ; store D + call DRWCRL ; draw initial point +RPTCRL: ld DE,(XI) ; load XI + ld HL,(YI) ; load YI + call CMP16 ; is YIXI + jp ENDCRL ; yes, so we've finished +RPTCL1: ld HL,XI + inc (HL) ; XI=XI+1 + ld HL,(DC) ; load D + ld A,H + or L ; is D=0? Yes, jump over + jp Z,DLSZ + bit 7,H ; is D<0? + jr NZ,DLSZ ; yes, jump over + ld DE,(YI) ; D>0 + dec DE ; so, YI=YI-1 + ld (YI),DE ; store YI + xor A ; clear Carry + ld HL,(XI) + sbc HL,DE ; HL=XI-YI + add HL,HL + add HL,HL ; HL=HL*4 + ld DE,10 + add HL,DE ; HL=HL+10 + ld DE,(DC) ; load D + ex DE,HL ; invert DE and HL, so that HL=4*(XI-YI)+10 and DE=D + add HL,DE ; D=D+4*(XI-YI)+10 + jr PLTCRL ; plot next pixel +DLSZ: ld HL,(XI) ; load XI + add HL,HL + add HL,HL ; XI=XI*4 + ld DE,$0006 + add HL,DE + ld DE,(DC) + ex DE,HL ; HL=D and DE=4*XI+6 + add HL,DE ; D=D+4*XI+6 +PLTCRL: ld (DC),HL ; store new D + call DRWCRL ; plot pixel + jp RPTCRL ; repeat +ENDCRL: pop HL + pop DE + pop BC + ret ; return to caller +DRWCRL: ld HL,(XC) + ld DE,(XI) + add HL,DE ; X=XC+XI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL1 ; if Carry is set, X is not valid + ld HL,(YC) + ld DE,(YI) + add HL,DE ; Y=YC+YI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL1: xor A ; clear Carry + ld HL,(XC) + ld DE,(XI) + sbc HL,DE ; X=XC-XI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL2 ; if Carry is set, X is not valid + ld HL,(YC) + ld DE,(YI) + add HL,DE ; Y=YC+YI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL2: ld HL,(XC) + ld DE,(XI) + add HL,DE ; X=XC+XI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL3 ; if Carry is set, X is not valid + xor A ; clear Carry + ld HL,(YC) + ld DE,(YI) + sbc HL,DE ; Y=YC-YI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL3: xor A ; clear Carry + ld HL,(XC) + ld DE,(XI) + sbc HL,DE ; X=XC-XI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL4 ; if Carry is set, X is not valid + xor A ; clear Carry + ld HL,(YC) + ld DE,(YI) + sbc HL,DE ; Y=YC-YI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL4: ld HL,(XC) + ld DE,(YI) + add HL,DE ; X=XC+YI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL5 ; if Carry is set, X is not valid + ld HL,(YC) + ld DE,(XI) + add HL,DE ; Y=YC+XI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL5: xor A ; clear Carry + ld HL,(XC) + ld DE,(YI) + sbc HL,DE ; X=XC-YI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL6 ; if Carry is set, X is not valid + ld HL,(YC) + ld DE,(XI) + add HL,DE ; Y=YC+XI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL6: ld HL,(XC) + ld DE,(YI) + add HL,DE ; X=XC+YI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + jp C,CNTCL7 ; if Carry is set, X is not valid + xor A ; clear Carry + ld HL,(YC) + ld DE,(XI) + sbc HL,DE ; Y=YC-XI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel +CNTCL7: xor A ; clear Carry + ld HL,(XC) + ld DE,(YI) + sbc HL,DE ; X=XC-YI + ld (X1),HL ; store X + call VALIDX ; check if X is valid (0~255) + ret C ; if Carry is set, X is not valid + xor A ; clear Carry + ld HL,(YC) + ld DE,(XI) + sbc HL,DE ; Y=YC-XI + ld (Y1),HL ; store Y + call VALIDY ; check if Y is valid (0~191) + call NC,CNTPLOT ; if Carry is reset, Y is valid and plot the pixel + ret ; return to caller + +; check if X,Y coordinates are valid: 0<=X<=255 and 0<=Y<=191 +; input: HL (value to check), can be negative +; output: CARRY flag: reset => VALID // set => NOT VALID +; destroys: A +VALIDX: xor A ; reset A + or H ; check if H is 0 (this means that X is in range 0~255 and not negative) + ret Z ; yes, we can return (C is clear) + scf ; set Carry flag to raise error + ret ; return to caller + +VALIDY: xor A ; reset A + or H ; check if H is 0 (this means that Y is in range 0~255 and not negative) + jr Z,CNTVALY ; yes, continue checking + scf ; no, raise error by setting Carry flag + ret ; return to caller +CNTVALY:ld A,L + cp $C0 ; is Y<192? Carry is set if Y<192 + ccf ; invert Carry, so Carry=0 means OK, Carry=1 means ERROR + ret ; return to caller + + +; clear VIDEOBUFF before using it as temp buffer +CLRVDBF:xor A ; clear A + push BC ; store BC + push HL ; store HL + ld HL,TMPBFR1 ; address of 1st cell + ld B,$06 ; 6 cells +RPTCVB1:ld (HL),A ; clear cell + inc HL ; next cell + djnz RPTCVB1 ; repeat + ld B,$28 ; 40 cells + ld HL,VIDEOBUFF ; address of 1st cell +RPTCVB2:ld (HL),A ; clear cell + inc HL ; next cell + djnz RPTCVB2 ; repeat + pop HL ; retrieve HL + pop BC ; retrieve BC + ret ; return to caller + + +; check if a color is passed as argument with PLOT, DRAW, and CIRCLE +; commands. If not present, the default foreground color will be used +CLRPRM: ld A,(FRGNDCLR) ; load foreground color + ld (TMPBFR3),A ; store into temp buffer + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + ret Z ; return if nothing follows + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get value + call CHKCLR0 ; check if color is in range 0~15 + ld (TMPBFR3),A ; store color into temp buffer + ret ; return to caller + + +; no graphics mode error: raised when a graphics command is invoked +; out of graphic 2 mode. +GMERR: ld E,GM ; load Graphics Mode Error flag + jp ERROR ; print error + + +; set a serial port: params are PORT,BPS,DATA,PARITY,STOP +; PORT=1/2; BPS=1,200~57,600 (see below), DATA=5/6/7/8 +; PARITY: 0=no parity; 1=ODD parity; 2=EVEN parity; +; STOP=0/1/2/3: 0=0 bit; 1=1 bit; 2=1.5 bits; 3=2 bits +; PORT 1 acts as a char device; PORT 2 acts as a block device +; DATA,PARITY, and STOP are optional: if nothing follows BPS, +; they are assumed to be 8,0,1 resp. +PRTNUM equ VIDEOBUFF +BPS equ VIDEOBUFF+$01 +DATABT equ BPS+$02 +PARBT equ DATABT+$01 +STPBT equ PARBT+$01 +SIOBFR equ STPBT+$01 +SERIAL: call GETINT ; get port # + and A ; is it zero? + jp Z,FCERR ; yes, error + cp $03 ; is it 1 or 2? + jp NC,SCERR ; no, error + ld (PRTNUM),A ; store port number into a temp buffer + call CHKSYN ; Make sure ',' follows + defb ',' + call ATOH ; get bps (returned into DE) + ld A,D ; move MSB into A + or E ; LSB OR MSB, to check if bps=0 + jr NZ,CNTSER ; no, continue checking + ; if baud rate is 0, then close the serial comm. +RSTSER1:ld A,(PRTNUM) ; yes, so reset the channel. First, load port number + dec A ; subtract 1, so that serial channel is 0=>A and 1=>B + add SIO_CA ; find correct channel + ld C,A ; store serial channel + di ; disable INTs + xor A ; reset A + ld D,$01 ; start from WR1 + ld B,$05 ; 5 registers +RPTRSSR:out (C),D ; select register + out (C),A ; reset register + inc D ; next register + djnz RPTRSSR ; repeat + ld A,%00110000 ; write into WR0: error reset, select WR0 + out (C),A ; send command to serial channel + ld A,%00011000 ; write into WR0: channel reset + out (C),A ; send command to serial channel + ei ; re-enable INTs + push HL ; store HL + ld HL,SERIALS_EN ; serials enabled status byte + in A,(PIO_DB) ; read status LEDs + bit 0,C ; check serial port + jr NZ,SRPT2 ; if bit is set, jump to port 2 + res 6,A ; it's port 1 + res 4,A ; remove possible error LED + res 0,(HL) ; disable port 1 + jp SERLED ; jump over +SRPT2: res 7,A ; it's port 2 + res 5,A ; remove possible error LED + res 1,(HL) ; disable port 2 +SERLED: out (PIO_DB),A ; send new configuration + pop HL ; retrieve HL + ret ; return to caller + ; check if bps=1, meaning reactivate RX on serial +CNTSER: ld A,D + or D ; check if bps<>1 by first checking D=0 + jr NZ,CNTSER2 ; if not, jump over + ld A,E ; then by checking that + cp $01 ; E=1 + jr NZ,CNTSER2 ; if not, jump over + ld A,(PRTNUM) ; load port number + cp $01 ; is it port 1? (currently do NOT support on port 2) + jp NZ,SCERR ; no, raise error and exit + ld D,A ; store port on D + ld A,(SERIALS_EN) ; load address of serial status cell + and D ; check status + jp Z,SCERR ; port not open, raise error + di ; disable INTs + ld A,D ; move port # into A + ld E,A ; store original A into E + add A + add A ; move A to left times 2 + ld D,A ; move value into D + ld A,(SERIALS_EN) ; load serial status byte + or D ; re-enable RX + ld (SERIALS_EN),A ; store new serial status + ld A,E ; recover port # + dec A ; check port + jr NZ,CNTRX2 ; port is #2 + call SIO_A_EI ; re-enable RX on port 1 + in A,(PIO_DB) ; load status LEDs + res 4,A ; remove error LED + jp RXEND ; terminate setting +CNTRX2: call SIO_A_EI ; re-enable RX on port 2 -> CURRENTLY only port 1 is supported + in A,(PIO_DB) ; load status LEDs + res 5,A ; remove error LED +RXEND: out (PIO_DB),A ; set new status for LEDs + ei ; re-enable INTs + ret ; return to caller + ; set serial port comm. +CNTSER2:push DE ; store BPS + ld A,(PRTNUM) ; load port number + ld D,A ; move port # into D + ld A,(SERIALS_EN) ; check if serial port is already open + and D ; by ANDing A with D + pop DE ; retrieve BPS + jp Z,CNTSER3 ; not open, continue + ld E,SA ; already open, so raise a "Serial Port Already Error" + jp ERROR ; and leave +CNTSER3:push HL ; store HL + ld HL,$E100 ; check bps. start with HL=57,600 + call CMP16 ; is bps<=57,600? + pop HL ; but first, recover HL + jp C,SCERR ; no (bps>57,600) then error + ld (BPS),DE ; store bps + dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,DEFSER ; defaults if nothing follows + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get data bits + cp $05 ; is it <5? + jp C,SCERR ; yes, error + cp $09 ; is it >=9? + jp NC,FCERR ; no, error + ld (DATABT),A ; store data bits + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get parity bits + cp A,$03 ; check if parity is in range 0~2 + jp NC,SCERR ; no, error + ld (PARBT),A ; store parity + call CHKSYN ; Make sure ',' follows + defb ',' + call GETINT ; get stop bits + cp $03 ; is it >=3? + jp NC,SCERR ; yes, error + ld (STPBT),A ; store stop bits + jr SETSER ; jump to set serial +DEFSER: ld A,$08 ; 8 bits for data + ld (DATABT),A + xor A ; no parity bit + ld (PARBT),A + inc A ; 1 bit for stop + ld (STPBT),A + ; check if bps are legal +SETSER: push HL ; store HL + push DE ; store DE + push IX ; store IX + ld IX,SUP_BPS ; allowed BPSs + ld B,$0B ; 11 items + ld C,$00 ; reset pointer +CKBPS: ld HL,(BPS) ; load BPS + ld E,(IX+0) ; load LSB of item + ld D,(IX+1) ; load MSB of item + call CMP16 ; is it equal? + jp Z,FNDBPS ; yes, found correspondance + inc IX + inc IX ; no, go to next entry + inc C ; increment pointer + djnz CKBPS ; repeat for 10 entries + jp SCERR1 ; if nothing found, raise an error +FNDBPS: ld A,(PRTNUM) ; check serial port + dec A ; is it port 1? + jp Z,SET_P1 ; yes, set port 1 + jp SCERR1 ; at the moment, only port 1 can be configured +SET_P1: ;init CTC CH0: CH0 provides RX/TX clock to SIO port A + ; TO0 output frequency=INPUT CLK/time constant. Time constant is set to get 16 times + ; the requested baud rate. I.e., if bps is 19,200 then time constast is set to 6 because + ; 1,843,200/6 = 307,200 Hz (that is 19,200 x 16) + di ; disable INTs + ld B,$00 ; reset B + ld HL,CTC_CFG ; address of first CTC divider + add HL,BC ; adjust for correct CTC divider + ld A,%01000111 ; interrupt off, counter mode, prsc=16 (doesn't matter), ext. start, + ; start upon loading time constant, time constant follows, sw reset, command word + out (CTC_CH0),A ; configure CTC channel 0 + ld A,(HL) ; load CTC divider + out (CTC_CH0),A ; send divider + ; configure SIO + ld HL,SIO_A_SETS ; load default settings for SIO + ld DE,SIOBFR ; into a temp buffer + ld BC,$000A ; 10 items to copy + ldir ; copy SIO settings into TEMP buffer + ld A,(SIOBFR+5) ; load WR5 setting + ld B,A ; move it into B + ld A,(DATABT) ; load DATA bits + cp $05 ; is it 5 bits? + jr NZ,BITS6 ; no, jump over + res 6,B + res 5,B ; set D6 & D5 to 0 + jr SETPAR ; jump to set parity +BITS6: cp $06 ; is it 6 bits? + jr NZ,BITS7 ; no, jump over + set 6,B + res 5,B ; set D6 & D5 to 1,0 + jr SETPAR ; jump to set parity +BITS7: cp $07 ; is it 7 bits? + jr NZ,BITS8 ; no, jump over + res 6,B + set 5,B ; set D6 & D5 to 0,1 + jp SETPAR ; jump to set parity +BITS8: set 6,B + set 5,B ; set D6 & D5 to 1,1 +SETPAR: ld A,B + ld (SIOBFR+5),A ; save DATA bits + and %01100000 ; filter only D5&D6 bits + add A,A ; shift left times 1 + ld (SERABITS),A ; store for SIO_A_EI & SIO_A_DI functions + ld A,(STPBT) ; load STOP bits + add A,A + add A,A ; 2 left shifts + ld B,A ; move forming byte into B + ld A,(PARBT) ; load PARITY setting + and A ; is it 0? + jp Z,STRPAR ; yes, jump over + set 0,B ; set PARITY on + dec A ; is parity ODD? + jp Z,STRPAR ; yes, so jump over + set 1,B ; no, it's EVEN so set the corresponding bit +STRPAR: ld A,(SIOBFR+3) ; load WR4 setting + and %11110000 ; reset STOP & PARITY bits + or B ; set new STOP & PARITY bits + ld (SIOBFR+3),A ; store new value + ;set up TX and RX: + ; the followings are settings for channel A + ld HL,SIOBFR ; settings for SIO ch. A + ld B,$06 ; 6 bytes to send + ld C,SIO_CA ; I/O address of SIO ch.A + otir ; send bytes to SIO + ; the following are settings for channel B (don't need to load HL since settings are contigous) + ld B,$04 ; other 4 bytes to send + ld C,SIO_CB ; I/O address of SIO ch.B + otir ; send bytes to SIO + ; the following are settings for channel A + ld A,$01 ; write into WR0: select WR1 + out (SIO_CA),A + ld A,%00011000 ; interrupts on every RX char; parity is no special condition; + ; buffer overrun is special condition + out (SIO_CA),A + call SIO_A_EI ; enable RX on SIO channel A +EXITSER:ld HL,SERIALS_EN + set 0,(HL) ; set serial port 1 status ON + set 2,(HL) ; set serial port 1 RX ON + ; back to normal running + ei ; re-enable INTs + in A,(PIO_DB) ; load status LEDs + set 6,A ; set status LED on + res 4,A ; set error LED off + out (PIO_DB),A ; send new configuration + pop IX ; retrieve IX + pop DE ; retrieve DE + pop HL ; retrieve HL + ret ; return to caller + +; allowed bps (Bauds per second) +SUP_BPS:defw 57600,38400,28800,19200,14400,9600,4800,3600,2400,1200,600 +; corresponding CTC divider +CTC_CFG:defb 2,3,4,6,8,12,24,32,48,96,192 + +; serial configuration error +SCERR1: pop IX ; retrieve IX + pop DE ; retrieve DE + pop HL ; retrieve HL +SCERR: ld E,SC ; Serial Configuration Error + jp ERROR ; print error + +; check for direct mode +DIRMOD: push HL ; Save code string address + ld HL,(LINEAT) ; Get current line number + inc HL ; -1 means direct statement + ld A,H + or L + pop HL ; Restore code string address + jp NZ,HLPERR ; raise error if in indirect mode + ret + + +; HELP lists the line program where an error was found +HELP: call DIRMOD ; check if in direct mode + push HL ; store HL + ld HL,(HLPLN) ; load HELP line + inc HL ; increment HL + ld A,H + or L ; check if there is a line into the HELP reg. + pop HL + jp Z,HLPERR ; no line found, raise error + ld DE,(HLPLN) ; recover line + pop BC ; remove BC from stack since it's not needed anymore for LIST + jp LST01H ; jump to list line +HLPERR: ld E,HP ; HELP call error + jp ERROR ; raise error + + +; KEY command to list/modify function keys +KEY: dec HL ; dec 'cos GETCHR INCs + call GETCHR ; Get next character + jp Z,LSTKEYS ; jump if nothing follows + ; change FN keys + call GETINT ; get a number + and A ; is it 0? + jr NZ,KEYCH ; no, jump over + push HL ; yes - reset FN keys to defaults + push DE ; store HL & DE + ld HL,DEFFNKS ; pointer to default FN keys texts + ld DE,FNKEYS ; pointer to destination + ld BC,$0080 ; 128 chars to be copied + ldir ; restore default texts + pop DE ; retrieve DE + pop HL ; retrieve HL + ret ; return to caller +KEYCH: cp $09 ; is it >= 9? + jp NC,SNERR ; yes - syntax error + dec A ; FN key in range 0~7 + add A,A ; multiply A... + add A,A ; ... times 4... + add A,A ; ... to get the correct... + add A,A ; ... offset fo FN key text + ld (TMPBFR1),A ; store FN key offset... + xor A ; ...in a... + ld (TMPBFR1+1),A ; ...16-bit register + call CHKSYN ; Make sure ',' follows + defb ',' + ld BC,HL ; copy address into BC + call EVAL ; Evaluate expression (in E there is the length) + push HL ; store string pointer + ld A,(TYPE) ; Get variable type + or A ; Is it a string variable? + jp Z,SNERR ; no - syntax error + call GSTRCU ; Current string to pool + call LOADFP ; Move string block data to (BC=pointer, DE=length) + ld A,E ; copy length into A + cp $11 ; is length > 16? + jp C,DECLN1 ; no, jump over + ld E,$10 ; yes, so set length to 16 +DECLN1: ld A,$10 ; calculate how many... + sub E ; ...null chars needed to fill up... + ld D,A ; ...the FN key text + push BC ; store address of string + ld BC,(TMPBFR1) ; load FN key offset + ld HL,FNKEYS ; load address of FN keys texts + add HL,BC ; get corrected address + pop BC ; retrieve address of string chars +CPKEY: ld A,(BC) ; load char from string + cp CR ; return? + jp Z,CPKEY2 ; yes, store char + cp $7B ; if char > "z" ? + jp NC,SNERR ; yes - syntax error + cp $20 ; is char < space? + jp C,SNERR ; yes - syntax error +CPKEY2: cp $61 ; is it >= 'a'? + jp C,CPKEY3 ; no, continue + and %01011111 ; set letters to uppercase +CPKEY3: ld (HL),A ; store char + inc HL ; next string char + inc BC ; next free cell + dec E ; decrement E + jr NZ,CPKEY ; repeat until 0 + xor A ; null char + inc D ; +1 to decrement below +CPKEY1: dec D ; how many null chars to insert? + jp Z,CPKYEND ; no more nulls, so exit + ld (HL),A ; store it + inc HL ; next cell + jr CPKEY1 ; repeat +CPKYEND:pop HL ; retrieve pointer to string + ret ; return to caller + ; list FN keys +LSTKEYS:push HL ; Save code string address + ld HL,(LINEAT) ; Get current line number + inc HL ; -1 means direct statement + ld A,H + or L + pop HL ; Restore code string address + jp NZ,SNERR ; raise error if in indirect mode + push HL ; store HL + push DE ; store DE + ld HL,FNKEYS ; load starting address of FN keys text + ld C,$01 ; 8 function keys +PRTK4: ld B,$10 ; 16 chars each +PRTK2: ld DE,CHKEY1 ; message "KEY " + call PRTCKEY ; print it + ld A,C ; load FN key + add $30 ; get number in ASCI code + call OUTC ; print it + ld DE,CHKEY2 ; message ": "" + call PRTCKEY ; print it + ld A,$01 ; " opened + ld (TMPBFR1),A +LDKEY: ld A,(HL) ; retrieve char + and A ; is it zero? + jp Z,CNTLTK ; yes, go next char + call OPNQT ; check if quotes are opened + cp $22 ; check if char is "? + jp Z,PRTCHR ; yes, print "chr$(" + cp CR ; is it a CR? + jp Z,PRTCHR ; yes, print "chr$(" +PRTK3: call OUTC ; no, just print it +CNTLTK: inc HL ; next char + djnz LDKEY ; continue until finished + call CLSQT ; check if quotes are still open + ld A,CR ; go next line + call OUTC ; print it + inc C ; next FN key + ld A,C ; check if... + cp $09 ; finished keys? + jp C,PRTK4 ; no, repeat 1 more time + pop DE ; retrieve DE + pop HL ; retrieve HL + ret ; return to caller + +PRTCHR: push HL ; store HL + call CLSQT ; check if quotes are closed + ld A,'+' ; '+' char + call OUTC ; print it + ld DE,CHKEY3 ; address of "CHR$(" + call PRTCKEY ; print it + pop HL ; recover HL + inc HL ; next char + dec B ; increment char counter + ld DE,CHKEY4 ; load address of RETURN + ld A,(HL) ; load char + cp CR ; is it a RETURN? + jr NZ,PTCHR1 ; no, jump over + ld DE,CHKEY5 ; yes, load address of " +PTCHR1: call PRTCKEY ; print it + ld A,')' ; char ) + jp PRTK3 ; continue + +CLSQT: push AF ; store A + ld A,(TMPBFR1) ; quote status + and A ; are they closed? + jr Z,CLSQT1 ; if yes, return + ld A,$22 ; no, so close them + call OUTC ; print " + xor A ; set quotes + ld (TMPBFR1),A ; as closed +CLSQT1: pop AF ; retrieve A + ret ; return to caller + +OPNQT: push AF ; store A + ld A,(TMPBFR1) ; quote status + and A ; are they open? + jr NZ,OPNQT1 ; if yes, return + ld A,'+' ; no, so add '+ + call OUTC ; print it + ld A,$22 ; and then open quotes + call OUTC ; print them + ld A,$01 ; set quotes + ld (TMPBFR1),A ; as opened +OPNQT1: pop AF ; retrieve A + ret ; return to caller + +PRTCKEY:push AF ; store original char +PRTK1: ld A,(DE) ; load char + and A ; is it 0? + jp Z,PRTEND ; yes, finished printing + call OUTC ; no, print char + inc DE ; next char + jp PRTK1 ; repeat +PRTEND: pop AF ; retrieve AF + ret ; return to caller + +CHKEY1: defb "KEY ",0 +CHKEY2: defb ":",34,0 +CHKEY3: defb "chr$(",0 +CHKEY4: defb "13",0 +CHKEY5: defb "34",0 + + +; HEX$(nn) Convert 16 bit number to Hexadecimal string +HEX: call TSTNUM ; Verify it's a number + call DEINT ; Get integer -32768 to 32767 + push BC ; Save contents of BC + ld HL,PBUFF ; load address of PBUFF into HL + ld A,D ; Get MSB into A + or A ; OR with LSB to see if param=0 + jr Z,HEX2 ; Skip output if both high digits are zero + call BYT2ASC ; Convert D to ASCII + ld A,B ; cechk if B + cp '0' ; is 0 + jr Z,HEX1 ; Don't store high digit if zero + ld (HL),B ; Store it to PBUFF + inc HL ; Next location +HEX1: ld (HL),C ; Store C to PBUFF+1 + inc HL ; Next location +HEX2: ld A,E ; Get lower byte + call BYT2ASC ; Convert E to ASCII + ld A,D + or A + jr NZ,HEX3 ; If upper byte was not zero then always print lower byte + ld A,B + cp '0' ; If high digit of lower byte is zero then don't print + jr Z,HEX4 +HEX3: ld (HL),B ; to PBUFF+2 + inc HL ; Next location +HEX4: ld (HL),C ; to PBUFF+3 + inc HL ; PBUFF+4 to zero + xor A ; Terminating character + ld (HL),A ; Store zero to terminate + inc HL ; Make sure PBUFF is terminated + ld (HL),A ; Store the double zero there + pop BC ; Get BC back + ld HL,PBUFF ; Reset to start of PBUFF + jp STR1 ; Convert the PBUFF to a string and return it +BYT2ASC ld B,A ; Save original value + and $0F ; Strip off upper nybble + cp $0A ; 0-9? + jr C,ADD30 ; If A-F, add 7 more + add A,$07 ; Bring value up to ASCII A-F +ADD30 add A,$30 ; And make ASCII + ld C,A ; Save converted char to C + ld A,B ; Retrieve original value + rrca ; and Rotate it right + rrca + rrca + rrca + and $0F ; Mask off upper nybble + cp $0A ; 0-9? < A hex? + jr C,ADD301 ; Skip Add 7 + add A,$07 ; Bring it up to ASCII A-F +ADD301 add A,$30 ; And make it full ASCII + ld B,A ; Store high order byte + ret + +; Convert "&Hnnnn" to FPREG +; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +HEXTFP ex DE,HL ; Move code string pointer to DE + ld HL,$0000 ; Zero out the value + call GETHEX ; Check the number for valid hex + jp C,HXERR ; First value wasn't hex, HX error + jr HEXLP1 ; Convert first character +HEXLP call GETHEX ; Get second and addtional characters + jr C,HEXIT ; Exit if not a hex character +HEXLP1 add HL,HL ; Rotate 4 bits to the left + add HL,HL + add HL,HL + add HL,HL + or L ; Add in D0-D3 into L + ld L,A ; Save new value + jr HEXLP ; And continue until all hex characters are in + +GETHEX inc DE ; Next location + ld A,(DE) ; Load character at pointer + cp SPC + jp Z,GETHEX ; Skip spaces + sub $30 ; Get absolute value + ret C ; < "0", error + cp $0A + jr C,NOSUB7 ; Is already in the range 0-9 + sub $07 ; Reduce to A-F + cp $0A ; Value should be $0A-$0F at this point + ret C ; CY set if was : ; < = > ? @ +NOSUB7 cp $10 ; > Greater than "F"? + ccf + ret ; CY set if it wasn't valid hex + +HEXIT ex DE,HL ; Value into DE, Code string into HL + ld A,D ; Load DE into AC + ld C,E ; For prep to + push HL + call ACPASS ; ACPASS to set AC as integer into FPREG + pop HL + ret + +HXERR: ld E,HX ; ?HEX Error + jp ERROR + +; BIN$(NN) Convert integer to a 1-16 char binary string +BIN: call TSTNUM ; Verify it's a number + call DEINT ; Get integer -32768 to 32767 +BIN2: push BC ; Save contents of BC + ld HL,PBUFF + ld B,$11 ; One higher than max char count (16+1) +ZEROSUP: ; Suppress leading zeros + dec B ; Max 16 chars + ld A,B + cp $01 + jr Z,BITOUT ; Always output at least one character + rl E + rl D + jr NC,ZEROSUP + jr BITOUT2 +BITOUT: rl E + rl D ; Top bit now in carry +BITOUT2:ld A,'0' ; Char for '0' + adc A,$00 ; If carry set then '0' --> '1' + ld (HL),A + inc HL + dec B + jr NZ,BITOUT + xor A ; Terminating character + ld (HL),A ; Store zero to terminate + inc HL ; Make sure PBUFF is terminated + ld (HL),A ; Store the double zero there + pop BC + ld HL,PBUFF + jp STR1 + +; Convert "&Bnnnn" to FPREG +; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +BINTFP: ex DE,HL ; Move code string pointer to DE + ld HL,$0000 ; Zero out the value + call CHKBIN ; Check the number for valid bin + jp C,BINERR ; First value wasn't bin, HX error +BINIT: sub '0' + add HL,HL ; Rotate HL left + or L + ld L,A + call CHKBIN ; Get second and addtional characters + jr NC,BINIT ; Process if a bin character + ex DE,HL ; Value into DE, Code string into HL + ld A,D ; Load DE into AC + ld C,E ; For prep to + push HL + call ACPASS ; ACPASS to set AC as integer into FPREG + pop HL + ret + +; Char is in A, NC if char is 0 or 1 +CHKBIN: inc DE + ld A,(DE) + cp SPC + jp Z,CHKBIN ; Skip spaces + cp '0' ; Set C if < '0' + ret C + cp '2' + ccf ; Set C if > '1' + ret + +BINERR: ld E,BN ; ?BIN Error + jp ERROR + + +MONOUT: jp $0008 ; output a char + + +RESET: ld A,(SERIALS_EN) + and $01 ; is serial port #1 open? + call NZ,RSTSER1 ; yes, reset serial 1 + call DISNMI ; disable NMI vector + di ; disable INTs + jp $0000 ; Restart + + +INITST: ld A,$00 ; Clear break flag + ld (BRKFLG),A + jp INIT + + +TSTBIT: push AF ; Save bit mask + and B ; Get common bits + pop BC ; Restore bit mask + cp B ; Same bit set? + ld A,$00 ; Return 0 in A + ret + +OUTNCR: call OUTC ; Output character in A + jp PRNTCRLF ; Output CRLF diff --git a/include/bootloader/bootloader-r3138.asm b/include/bootloader/bootloader-r3138.asm new file mode 100644 index 0000000..9f247a1 --- /dev/null +++ b/include/bootloader/bootloader-r3138.asm @@ -0,0 +1,512 @@ +; ------------------------------------------------------------------------------ +; LM80C - BOOTLOADER - R3.13.8 +; ------------------------------------------------------------------------------ +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. Code and computer schematics are released under +; the therms of the GNU GPL License 3.0 and in the form of "as is", without no +; kind of warranty: you can use them at your own risk. +; You are free to use them for any non-commercial use: you are only asked to +; maintain the copyright notices, include this advice and the note to the +; attribution of the original version to Leonardo Miliani, if you intend to +; redistribuite them. +; https://www.leonardomiliani.com +; +; Please support me by visiting the following links: +; Main project page: https://www.leonardomiliani.com +; Schematics and code: https://github.com/leomil72/LM80C +; Videos about the computer: https://www.youtube.com/user/leomil72/videos +; Hackaday page: https://hackaday.io/project/165246-lm80c-color-computer +; ------------------------------------------------------------------------------ + +; ADDRESS DECODING (bits A6/A5/A4) +; 0000xxxx : PIO +; 0001xxxx : CTC +; 0010xxxx : SIO +; 0011xxxx : VDP +; 0100xxxx : PSG + +; label defining for PIO (Parallel Input/Output) +PIO_DA equ %00000000 +PIO_DB equ %00000001 +PIO_CA equ %00000010 +PIO_CB equ %00000011 + +; label defining for CTC (Counter Timer Circuit) +CTC_CH0 equ %00010000 +CTC_CH1 equ %00010001 +CTC_CH2 equ %00010010 +CTC_CH3 equ %00010011 + +;label defining for SIO (Serial Input/Output) +SIO_CA equ %00100010 +SIO_CB equ %00100011 +SIO_DA equ %00100000 +SIO_DB equ %00100001 + +;label defining for VDP (Video Display Processor) +VDP_DAT equ %00110000 +VDP_SET equ %00110010 + +; label defining for PSG (Programmable Sound Generator) +PSG_REG equ %01000000 +PSG_DAT equ %01000001 + +; Interrupt-driven serial I/O interface lead by the Z80 SIO to run modified +; NASCOM Basic 4.7 - Full input buffering with incoming data hardware handshaking +; Handshake shows full before the buffer is totally filled to allow run-on from the sender + +SER_BUFSIZE equ $58 +SER_FULLSIZE equ $50 +SER_EMPTYSIZE equ $05 + +SERBUF_START equ $8000 ; RAM starts here +serInPtr equ SERBUF_START + SER_BUFSIZE +serRdPtr equ serInPtr+2 +serBufUsed equ serRdPtr+2 +basicStarted equ serBufUsed+1 +bufWrap equ (SERBUF_START + SER_BUFSIZE) & $FF +TEMPSTACK equ CURPOS - 3 ; top of BASIC line input buffer so is "free ram" when BASIC resets + +;------------------------------------------------------------------------------ +; BASE MEMORY - RESET LOCATION - $0000 +; the CPU jumps to 0000h after a reset + org $0000 +RST00: di ; be sure that INTs are disabled + jp INIT_HW ; jump to system initialization + +;------------------------------------------------------------------------------ +; send a character over serial + org $0008 +RST08: jp TXA + +;------------------------------------------------------------------------------ +; interrupt vector when SIO has a char available in its buffer + org $000C + defw RX_CHA_AVAIL + +;------------------------------------------------------------------------------ +; interrupt vector for SIO special conditions (i.e. buf overrun) + org $000E + defw SPEC_RX_CONDITON + +;------------------------------------------------------------------------------ +; receive a character over serial + org $0010 +RST10: jp RXA + +;------------------------------------------------------------------------------ +; check serial status + + org $0018 +RST18: jp CKINCHAR + +;------------------------------------------------------------------------------ +; interrupt vectors for CTC + org $0040 ; for CH0 Timer - unused + defw CTC0IV + + org $0042 ; for CH1 Timer - unused + defw CTC1IV + + org $0044 ; for CH2 timer - unused + defw CTC2IV + + org $0046 ; for CH3 Timer - used for 100ths/s counter + defw CTC3IV + +;------------------------------------------------------------------------------ +; interrupt routine for NMI + org $0066 + jp NMIUSR ; jump to execute NMI service routine + +;------------------------------------------------------------------------------ + + org $0090 + defb $4C,$4D,$38,$30,$43,$20,$43,$4F + defb $4C,$4F,$52,$00,$00,$00,$00,$00 + defb $43,$4F,$4D,$50,$55,$54,$45,$52 + defb $20,$28,$32,$30,$32,$30,$29,$00 + defb $44,$65,$73,$69,$67,$6E,$65,$64 + defb $20,$62,$79,$00,$00,$00,$00,$00 + defb $4C,$65,$6F,$6E,$61,$72,$64,$6F + defb $20,$4D,$69,$6C,$69,$61,$6E,$69 +FWVER: defm 'FW 3.13.8',$20,__date__,$20,__time__,$00 +;------------------------------------------------------------------------------ +; interrupt driven routine to get chars from Z80 SIO + org $0100 +RX_CHA_AVAIL: push AF ; store A + push HL ; and HL + call A_RTS_OFF ; disable RTS line + in A,(SIO_DA) ; read char from RX buffer into A + ld (TMPKEYBFR),A ; store it into the temp key buffer + call CHARINTOBFR ; sub-routine to put the char into the input buffer + jp NC,LVRXCHA ; if buffer is full, then leave without doing anything else + ld A,(TMPKEYBFR) ; retrieve char + ld (CHR4VID),A ; write into buffer for video printing + cp CR ; is it RETURN? + jp Z,CNTRXCHA ; yes, continue + cp $20 ; is it another control char (code < 32)? + jp C,LVRXCHA ; yes, leave w/o printing it on video nor sending back to serial +CNTRXCHA: push AF ; store char + xor A + ld (KBDNPT),A ; a char from serial is like a char printed by BASIC + ld A,(PRNTVIDEO) ; load status of print-on-video + cp $01 ; is the print on video on? + call Z,CHAR2VID ; yes, print on screen + pop AF ; retrieve char + call TXA ; send back to serial +LVRXCHA: pop HL ; retrieve HL + pop AF ; and A + ei ; re-enable interrupts + reti ; and exit + +; put a char into the input buffer, char is into A +; this sub is called both from the ISR "RX_CHA_AVAIL" and when +; the RETURN key is pressed on the keyboard +CHARINTOBFR: push AF ; store it + ld A,(serBufUsed) ; load buffer size + cp SER_BUFSIZE ; if buffer is not full + jp C,NOTFULL ; then store the char + pop AF ; else drop it + ret ; and exit +NOTFULL: ld HL,(serInPtr) ; buffer is not full, can store the char + inc HL ; load pointer to find first free cell + ld A,L ; only check low byte because buffer<256 + cp bufWrap ; check if the pointer is at the last cell + jr NZ,NOTWRAP ; if not then continue + ld HL,SERBUF_START ; else load the address of the first cell +NOTWRAP: ld (serInPtr),HL ; store the new pointer + pop AF ; then recover the char + ld (HL),A ; and store it in the appropriate cell + ld A,(serBufUsed) ; load the size of the input buffer + inc A ; increment it + ld (serBufUsed),A ; and store the new size + cp SER_FULLSIZE ; check if input buffer is full + ret C ; exit if buffer is not full + ld A,(SERIALS_EN) ; check if serial 1 is open + rra ; bit 0 into Carry: if Carry is 1 then serial 0 is open and... + call C,A_RTS_OFF ; ...stop receiving further chars + xor A ; clear Carry to set a buffer full condition + ret + +;------------------------------------------------------------------------------- +; Z80 SIO MANAGEMENT +;------------------------------------------------------------------------------- +; disable RTS: +; by resetting RTS bit (set to 0), the RTS line is disabled (HIGH) +A_RTS_OFF: push AF ; store A + ld A,%00000101 ; write into WR0: select WR5 + out (SIO_CA),A + ld A,(SERABITS) ; load data bits + or %00101000 ; TX enable; RTS disable + out (SIO_CA),A ; send setting + pop AF ; retrieve A + ret ; exit + +; enable RTS +; by setting RTS bit (set to 1), the RTS line is enabled (LOW) +A_RTS_ON: push AF ; store A + ld A,%00000101 ; write into WR0: select WR5 + out (SIO_CA),A + ld A,(SERABITS) ; load data bits + or %00101010 ; TX enable; RTS enable + out (SIO_CA),A ; send setting + pop AF ; retrieve A + ret ; return + +; disable SIO RX channel A +SIO_A_DI: push AF ; store A + ld A,%00000011 ; write into WR0: select WR3 + out (SIO_CA),A + ld A,(SERABITS) ; load the serial bits; RX disabled; auto enable is OFF + out (SIO_CA),A + pop AF ; retrieve A + ret ; return + +; enable SIO RX channel A +SIO_A_EI: push AF ; store A + ld A,%00000011 ; write into WR0: select WR3 + out (SIO_CA),A ; select register + ld A,(SERABITS) ; load the serial data bits + set 0,A ; set RX enabled; auto enable is OFF + out (SIO_CA),A ; send setting to SIO + pop AF ; retrieve A + ret + + +; special SIO condition (i.e., buffer overrun) +; if buffer overruns then show an error, empty the RX buffer and send +; a break char +SPEC_RX_CONDITON: + push AF + push HL + call A_RTS_OFF ; disable RTS + call SIO_A_DI ; disable RX on ch. A + ld A,(SERIALS_EN) ; load serial status + res 2,A ; disable RX on port 1 + ld (SERIALS_EN),A ; store new serial status + in A,(PIO_DB) ; read status LEDs + set 4,A ; set 5th pin ON + out (PIO_DB),A ; send new setting + ld A,%00110000 ; write into WR0: error reset, select WR0 + out (SIO_CA),A ; send command to SIO + ld A,CTRLC + call CHARINTOBFR ; send CTRL-C to BASIC +EMPTYCHABFR: xor A + out (SIO_CA),A ; write to WR0, select RR0 + in A,(SIO_CA) ; read RR0 register + and $01 ; check if input buffer if empty + jp Z,CHABFREMPTY ; if yes (bit 0 = 0) then leave + in A,(SIO_DA) ; read chars + jr EMPTYCHABFR ; repeat +CHABFREMPTY: pop HL + pop AF + ei ; re-enable interrupts + reti ; return from interrupt + +;------------------------------------------------------------------------------ +; retrieve a char from the input buffer +RXA: ld A,(serBufUsed) ; load the buffer size + and A ; check if it's 0 (empty) + jp Z,RXA ; if it's empty, wait for a char + di ; disable interrupts + push HL ; store HL + ld HL,(serRdPtr) ; load pointer to first available char + inc HL ; increment it (go to the next char) + ld A,L ; check if the end of the buffer has been reached + cp bufWrap ; (only check low byte because buffer<256) + jr NZ,NOTRDWRAP ; if not, jump straight + ld HL,SERBUF_START ; else reload the starting address of the buffer +NOTRDWRAP: ld (serRdPtr),HL ; store new pointer to the next char to read + ld A,(serBufUsed) ; load buffer size + dec A ; decrement it + ld (serBufUsed),A ; and store the new size + cp SER_EMPTYSIZE ; check if input buffer can be considered empty + jr NC,RXA_EXIT ; if not empty yet, then exit + call A_RTS_ON ; else re-enable receiving chars +RXA_EXIT: ld A,(HL) ; recover the char and return it into A + pop HL ; retrieve HL + ei ; re-enable interrupts + ret ; return + +;------------------------------------------------------------------------------ +; sends a char over the serial (trick for INTs from WikiTI) +; char is into A +TXA: push AF ; store AF + push BC ; store BC + ld B,A ; store char + ld A,I ; when loading I into A, P/V is set to the value of IFF (P/V is set if INTs enabled) + jp PE,CNTTXA ; if set, jump over + ld A,I ; if not set, test again to fix "false negative" from interrupt occurring at first test +CNTTXA: push AF ; store current P/V flag + di ; disable INTs + ld A,(SERIALS_EN) ; load serial status + cp %00000101 ; check if serial 1 is open and RX/TX is enabled + jr NZ,TXA_EXIT ; no, jump over + ld A,B ; retrieve char + out (SIO_DA),A ; send char to the SIO + call TX_EMP ; wait for outgoing char to be sent +TXA_EXIT: pop AF ; retrieve P/V flag + jp PO,EXTXA ; if P is reset, INTs were disabled so we can leave right now + ei ; INTs were enabled, so re-enable interrupts +EXTXA: pop BC ; retrieve BC + pop AF ; retrieve AF + ret ; return + +;------------------------------------------------------------------------------ +; wait until outgoing serial has been sent +TX_EMP: sub A ; set A to 0 + inc A ; set A to 1 + out (SIO_CA),A ; write to WR0, select RR1 + in A,(SIO_CA) ; read RR1 register + bit 0,A ; check if all chars have been sent + jp Z,TX_EMP ; if not (bit 0 = 0) then retrieve + ret ; else exit + + +;------------------------------------------------------------------------------ +; check if there is some chars into the buffer +CKINCHAR ld A,(serBufUsed) ; load char in buffer + and A ; compare to 0 + ret ; return + +;------------------------------------------------------------------------------ +; print a text from memory, and terminate when $00 is found +RAWPRINT: ld A,(HL) ; load character from memory cell pointed by HL + or A ; is it $00 (end string)? + ret Z ; Yes, then return + ld (CHR4VID),A ; store char + di + call CHAR2VID ; and send it to screen + ei + inc HL ; and select the next one + jr RAWPRINT ; repeat + +;------------------------------------------------- +; Interrupt service routine (ISR) for CH3 timer +; this is used to increment the 100ths of a second counter and for cursor flashing +CH3_TIMER: push AF ; save regs. A, + push BC ; BC, + push DE ; DE, + push HL ; HL + ld HL,TMRCNT ; load starting address of the timer + ld B,$04 ; 4 bytes to check +INCTMR3: inc (HL) ; increment timer + jr NZ,CHKCRSR ; if not zero then exit (finished increment) + inc HL ; if yes, there was an overflow, so increment next byte + djnz INCTMR3 ; repeat for 4 bytes +CHKCRSR: call FLASHCURSOR ; call the flashing cursor routine + call MNGSNDS ; call the tone managemenet + ld A,(TMRCNT) ; check for keyboard management + rra ; bit 0 = 1 ? + call NC,KEYBOARD ; no, so read the keyboard inputs + pop HL ; retrieve HL, + pop DE ; DE, + pop BC ; BC, + pop AF ; and A + ei ; re-enable interrupts + reti ; exit from ISR + +;------------------------------------------------------------------------------ +;------------------------------------------------------------------------------ +; HARDWARE INITIALISATION +; first run - setup HW & SW +; +INIT_HW: ld HL,TEMPSTACK ; load temp stack pointer + ld SP,HL ; set stack to temp stack pointer + ld HL,SERBUF_START ; set beginning of input buffer + ld (serInPtr),HL ; for incoming chars to store into buffer + ld (serRdPtr),HL ; and for chars to be read from buffer + xor A ; reset A + ld (serBufUsed),A ; actual buffer size is 0 + ld (SERIALS_EN),A ; set serial ports status to OFF + call HELLOWRLD ; little serial blink with LEDs + call initCTC ; configure CTC, then... + call initPSG ; ...configure PSG + call SHOW_LOGO ; show computer logo + ld E,$01 ; E chooses the video mode: 1:graphics 1 + call initVDP ; set video display + xor A + ld I,A ; set high byte of interrupt vectors to point to page 0 + im 2 ; interrupt mode 2 + ei ; enable interrupts + ; print system messages + xor A ; A=0 so... + ld (KBDNPT),A ; ...inputs don't come from keyboard + inc A ; A=1... + ld (PRNTVIDEO),A ; ...to activate the print-on-video + ld HL,MSGTXT1 ; sign-on message + call RAWPRINT ; print message + call CURSOR_ON ; enable cursor + ld A,(basicStarted); check if BASIC is already started + cp 'Y' ; to see if this is a power-up + jr NZ,COLDSTART ; if not, then do a COLD start + ld HL,MSGTXT2 ; message to choose kind of start + call RAWPRINT ; print message + xor A + ld (PRNTVIDEO),A ; disable print-on-video +CORW: call RXA ; look for a pressed key + and %11011111 ; only UPPERCASE char + cp 'C' ; cold start? + jr NZ,CHECKWARM ; no, let's check for warm start + call ECHO_CHAR ; echoes the char +COLDSTART: ld A,'Y' ; yes, set the "BASIC started" flag + ld (basicStarted),A + jp COLD ; start BASIC COLD +CHECKWARM: cp 'W' + jr NZ,CORW ; char not recognized, wait again + call ECHO_CHAR ; echoes the char + jp WARM ; start BASIC WARM + +;------------------------------------------------------------------------------- +ECHO_CHAR: ld (CHR4VID),A ; set char for video printing + xor A + ld (KBDNPT),A ; input is not from keyboard + di ; disable INTs + call CHAR2VID ; echoes back the pressed key, + ld A,CR ; then set a CR + ld (CHR4VID),A ; set char for video printing + call CHAR2VID ; and send it to screen + ei ; re-enable INTs + ld A,$01 + ld (PRNTVIDEO),A ; re-enable video printing + ret ; return to caller + +;------------------------------------------------------------------------------- +; little serial blink with LEDs +HELLOWRLD: ld C,$09 ; 8 LEDs to be turned off + 1 more step to turn off the last LED + ld A,%11001111 ; set mode 3 (mode control) + out (PIO_CB),A ; for PIO port B + xor A ; set pins to OUTPUT + out (PIO_CB),A ; for port B + inc A ; LSB on +LEDLIGHT: out (PIO_DB),A ; turn LEDs on/off for a "Supercar" sequence + ld E,$20 ; little delay +DEC_E: ld B,$00 ; count to 256 +COUNTER: djnz COUNTER ; decrement inner counter + dec E ; decrement outer counter + jr NZ,DEC_E ; finish delay + sla A ; shift reg.A to left 1 bit + dec C ; next LED + jr NZ,LEDLIGHT ; all LEDs done? no, repeat + ret ; return to caller + +;------------------------------------------------------------------------------- +; Z80 SIO default settings for channel A +SIO_A_SETS: defb %00110000 ; write into WR0: error reset, select WR0 + defb %00011000 ; write into WR0: channel reset + defb %00000100 ; write into WR0: select WR4 + defb %01000100 ; write into WR4: presc. 16x, 1 stop bit, no parity + defb %00000101 ; write into WR0: select WR5 + defb %11101000 ; write into WR5: DTR on, TX 8 bits, BREAK off, TX on, RTS off +SIO_B_SETS: defb %00000001 ; write into WR0: select WR1 + defb %00000100 ; write into WR1: status affects interrupt vectors + defb %00000010 ; write into WR0: select WR2 + defb %00000000 ; write into WR2: set interrupt vector, but bits D3/D2/D1 of this vector + ; will be affected by the channel & condition that raised the interrupt + ; (see datasheet): in our example, 0x0C for Ch.A receiving A char, 0x0E + ; for special conditions +;------------------------------------------------------------------------------ +; Z80 CTC setting up +initCTC: + ld HL,CTCCONF ; CTC configuration + ld DE,CTC0IV ; CTC interrupt vector table + ld BC,$000C ; 12 bytes + ldir ; copy data +;CH0, CH1, & CH2 disabled + ld A,%00000011 ; interrupt off, timer mode, prescaler=16, don't care ext. TRG edge, + ; start timer on loading constant, no time constant follows, software reset, command word + out (CTC_CH0),A ; set CH0 + out (CTC_CH1),A ; set CH1 + out (CTC_CH2),A ; set CH2 + +;init CH3 +;CH3 divides CPU CLK by 144*256 providing an interrupt signal at 100 Hz (1/100 sec). +;f = CPU_CLK/(144*256) => 3,686,400 / ( 36,864 ) => 100Hz + ld A,%10100111 ; interrupt on; timer mode; prescaler=256; don't care ext; automatic trigger; + ; time constant follows; cont. operation; command word + out (CTC_CH3),A ; send to CH3 + ld A,$90 ; time constant - 90$ (144d) + out (CTC_CH3),A ; send to CH3 + ld A,%01000000 ; D7..D3 provide the first part of the int vector (in our case, $0100), followed by + ; D2..D1, provided by the CTC (they point to the channel), D0=interrupt word + ; so int vector is 01000xx00 + out (CTC_CH0),A ; send to CTC + ; reset cells of 100ths of a second counter + xor A ; reset A + ld HL,TMRCNT ; load TMR pointer + ld B,$04 ; 4 memory cells +RESTMR: ld (HL),A ; reset n-cell of TMR + inc HL ; next cell + djnz RESTMR ; repeat for 4 cells + ret + +CTCCONF: defb $FB,$ED,$4D ; CTC0 interrupt vector (ei; reti) + defb $FB,$ED,$4D ; CTC1 interrupt vector (ei; reti) + defb $FB,$ED,$4D ; CTC2 interrupt vector (ei; reti) + jp CH3_TIMER ; CTC3 interrupt vector (sys tick timer) +;------------------------------------------------------------------------------ +MSGTXT1: defm "LM80C by Leonardo Miliani",CR + defm "Firmware R3.13.8",CR,0 +MSGTXT2: defb CR + defm "old or arm start? ",0 diff --git a/include/psg/psg-r3138.asm b/include/psg/psg-r3138.asm new file mode 100644 index 0000000..0f4678c --- /dev/null +++ b/include/psg/psg-r3138.asm @@ -0,0 +1,366 @@ +; ------------------------------------------------------------------------------ +; LM80C - PSG ROUTINES - R3.13.8 +; ------------------------------------------------------------------------------ +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. Code and computer schematics are released under +; the therms of the GNU GPL License 3.0 and in the form of "as is", without no +; kind of warranty: you can use them at your own risk. +; You are free to use them for any non-commercial use: you are only asked to +; maintain the copyright notices, include this advice and the note to the +; attribution of the original version to Leonardo Miliani, if you intend to +; redistribuite them. +; https://www.leonardomiliani.com +; +; Please support me by visiting the following links: +; Main project page: https://www.leonardomiliani.com +; Schematics and code: https://github.com/leomil72/LM80C +; Videos about the computer: https://www.youtube.com/user/leomil72/videos +; Hackaday page: https://hackaday.io/project/165246-lm80c-color-computer +; ------------------------------------------------------------------------------ +; +; ------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; configure the PSG +initPSG: ld HL,CHASNDDTN ; starting address of sound & keyboard RAM registers + ld B,SERIALS_EN-CHASNDDTN; # of PSG sound & keyboard registers + xor A ; reset A +EMPTSNDBFR: ld (HL),A ; reset RAM register + inc HL ; next register + djnz EMPTSNDBFR ; repeat +CLRPSGREGS: ld B,$10 ; 16 registers to set + ld HL,SNDREGCFG ; starting address of register settings + ld D,$00 ; first register +RSTPSG: ld A,D ; register value + call SETSNDREG ; select register + ld A,(HL) ; load value + call WRTSNDREG ; write to register + inc D ; next register + inc HL ; next value + djnz RSTPSG ; repeat for each register + ret ; return to caller + +SNDREGCFG: defb $00,$00,$00,$00,$00,$00,$00,%10111111 + defb $00,$00,$00,$00,$00,$00,$ff,$ff + ; reg. 7: set I/O ch.A to OUTPUT, I/O ch.B to INPUT; set noise to OFF; set audio to OFF + + +; routine to play a welcome beep on channel C (tone 4010) and to shut it off +WLCMBEEP: ld HL,WLCBPDAT ; data address + jp SENDSND +NOBEEP: ld HL,NOBPDAT ; data address +SENDSND: push BC + ld B,$04 ; 4 pairs +RPTWLCMBP: ld A,(HL) ; read register # + call SETSNDREG + inc HL ; next cell + ld A,(HL) ; read value + call WRTSNDREG + inc HL + djnz RPTWLCMBP ; repeat + pop BC + ret ; return to caller + +WLCBPDAT: defb $07,%01111011,$04,$56,$05,$00,$0A,$0F +NOBPDAT: defb $04,$00,$05,$00,$0A,$00,$07,%01111111 + + +; select register on PSG +SETSNDREG: ld C,PSG_REG ; PSG register port + out (C),A ; set register + ret ; return to caller + +; send data to PSG +WRTSNDREG: ld C,PSG_DAT ; PSG data port + out (C),A ; send data + ret ; return to caller + +; manage the sounds' duration: each time this subroutine is called, it +; decrements the single sound durations (measured in ms) and eventually +; shut off the audio channel whose counter has reached 0. +; (this sub-routine is called by CH3 timer ISR) +MNGSNDS: push IX ; store IX + ld IX,CHASNDDTN ; starting address of tones duration + ld B,$03 ; 3 channels to check + ld H,$01 ; mixer channels: A=>bit 1, B=>bit 2, C=>bit 3 +CHKSNDCH: ld E,(IX+0) ; load LSB into E + ld D,(IX+1) ; load MSB into D + ld A,E ; load E into A + or D ; check that DE=0 + jr Z,CNTCHKSND ; yes, jump over + dec DE ; no, so decrement DE + ld A,E ; reload E into A... + ld (IX+0),E ; store new... + ld (IX+1),D ; ...duration and... + or D ; ...do another check to see if DE=0 + jr NZ,CNTCHKSND ; no, so jump over + ; if yes, let's shut down the corresponding channel + ; to shut down a tone we disable it into the mixer + ; then set 0 into its tone registers + ld D,$07 ; mixer register + ld C,PSG_REG ; PSG register selector port + out (C),D ; set mixer register + in A,(C) ; load current value + or H ; set off the channel into the mixer (remember that 1=OFF) + out (C),D ; select mixer register + ld C,PSG_DAT ; PSG data port + out (C),A ; send new value for the mixer + ld A,$03 ; three channels + sub B ; find current channel (0->A, 1->B, 2->C) + add A,A ; and find first register (A=>0, B=>2, C=>4) + ld C,PSG_REG ; PSG register selector port + out (C),A ; select first tone register of channel + ld L,$00 ; value 0 into L + ld C,PSG_DAT ; PSG data selector port + out (C),L ; write 0 into register + ld C,PSG_REG ; PSG register selector port + inc A ; next tone register + out (C),A ; select second tone register of channel + ld C,PSG_DAT ; PSG data selector port + out (C),L ; write 0 into register +CNTCHKSND: inc IX ; set for... + inc IX ; ...next channel... + sla H ; shift left H 1 bit + djnz CHKSNDCH ; repeat for 3 channels + pop IX ; restore IX + ret ; return to caller + +; read a specific row of the keyboard matrix, set by A +; return read into A +READKBLN: push BC ; store BC + ld B,$0F ; reg #15 + ld C,PSG_REG ; PSG register port + out (C),B ; select reg #15 + ld C,PSG_DAT ; PSG data port + out (C),A ; activate the row + ld B,$0E ; register #14 (port B) + ld C,PSG_REG ; PSG register port + out (C),B ; select reg. 14 (port B) + in A,(C) ; read register #14 + pop BC ; retrieve BC + ret + +; read the keyboard matrix to look for a key pressure +KEYBOARD: ld C,PSG_REG ; PSG register port + ld B,$07 ; set register #7... + out (C),B ; ...to work with + in A,(C) ; read register #7 + set 7,A ; port A set to output + res 6,A ; port B set to input + out (C),B ; set register #7 + ld C,PSG_DAT ; PSG data port + out (C),A ; set I/O ports w/o altering the rest of the mixer + ; check special keys (SHIFT/ALT/CTRL) + ld A,%11111101 ; select SHIFT row + call READKBLN ; read row + bit 3,A ; test if SHIFT key is pressed (4th bit is reset) + jr NZ,CHECKALT ; no, so go on + ld HL,CONTROLKEYS ; control key flags + ld (HL),%00000001 ; set SHIFT flag, reset CTRL & ALT flags (currently multiply control keys are NOT supported) +CHECKALT: ld A,%11111110 ; select ALT row + call READKBLN ; read ALT row + bit 5,A ; test if ALT key is pressed (5th bit is reset) + jr NZ,CHECKCTRL ; no, so go on + ld HL,CONTROLKEYS ; control key flags + ld (HL),%00000100 ; set ALT flag, reset SHIFT & CTRL flag (currently multiply control keys are NOT supported) +CHECKCTRL: ld A,%11111110 ; select CTRL row + call READKBLN ; read CTRL row + bit 2,A ; test if CTRL key is pressed (3rd bit is reset) + jr NZ,CHECKKBD ; no, so make a normal reading + ld HL,CONTROLKEYS ; control key flags + ld (HL),%00000010 ; set CTRL flag, reset SHIFT & ALT flags (currently multiply control keys are NOT supported) +CHECKKBD: ld B,$08 ; 8 lines + ld A,%01111111 ; start from the last line of the matrix +RPTKBDRD: ld D,$0F ; register #15 (port B) + ld C,PSG_REG ; PSG register port + out (C),D ; select reg. #15 + ld C,PSG_DAT ; PSG data port + out (C),A ; activate 1 line (active line is grounded, i.e. with a LOW signal) + ld E,A ; save current line into E + ld D,$0E ; register #14 (port A) + ld C,PSG_REG ; PSG register port + out (C),D ; select reg. 14 (port A) + nop + in A,(C) ; read register #14 + cp $FF ; is there any line set to 0? + jr Z,NOKEYPRSD ; no, go to the next row + ; check control keys + ld (KBTMP),A ; yes, check if a control key was pressed. First, store current row + ld A,B ; copy current row (B) into A + cp $02 ; is it the row of the SHIFT? + jr NZ,TESTALT ; no, continue checking the other control keys + ld A,(KBTMP) ; yes, retrieve current row data + bit 3,A ; check SHIFT bit line + jr NZ,FINDKEY ; no SHIFT, continue checking + set 3,A ; yes, it's the SHIFT. So remove SHIFT bit + cp $FF ; after deleting the SHIFT bit, is there any other bit selected? + jr NZ,FINDKEY ; yes, go to check which one + jr NOKEYPRSD ; no, go to next row +TESTALT: cp $01 ; is it the line of ALT & CTRL? + ld A,(KBTMP) ; retrieve current row data + jr NZ,FINDKEY ; no, continue + bit 5,A ; yes, check ALT bit line + jr NZ,TESTCTRL ; no ALT, continue checking + set 5,A ; yes, it's the ALT. So remove ALT bit +TESTCTRL: bit 2,A ; check CTRL bit line + jr NZ,ENDCTRLCK ; no CTRL, continue checking + set 2,A ; delete CTRL bit flag +ENDCTRLCK: cp $FF ; after deleting the ALT & CTRL bits, is there any other bit selected? + jr NZ,FINDKEY ; yes, go to check which one +NOKEYPRSD: ld A,E ; no key pressed, load current output port + rrca ; rotate right by 1 + djnz RPTKBDRD ; repeat for 8 lines + xor A ; if exit from here, no key has been pressed... + ld (LASTKEYPRSD),A ; ...so reset the last key cell... + ld (CONTROLKEYS),A ; ...reset contro key flags... + ld (KBDNPT),A ; ...no input from keyboard... + ret ; ...and leave +FINDKEY: ld E,$FF ; counter +CHKLN: inc E ; E goes from 0 to 7 + srl A ; is the first bit reset? (we're looking for a "0", meaning grounded line) + jr C,CHKLN ; no, check next bit + ld A,(CONTROLKEYS) ; load control key flags + ld HL,KBMAP ; normal keymap + cp $01 ; SHIFT flag? + jr NZ,CHKCTRL ; no, jump over + ld HL,KBMAP_SFT ; SHIFT keymap + jr LOADMAP ; and load it +CHKCTRL: cp $02 ; CTRL flag? + jr NZ,CHKALT ; no, jump over + ld HL,KBMAP_CTRL ; CTRL map + jr LOADMAP ; and load it +CHKALT: cp $04 ; ALT flag? + jr NZ,LOADMAP ; no, check over + ld HL,KBMAP_ALT ; ALT map +LOADMAP: dec B ; decrement row # (rows go from 0 to 7) + ld C,B ; move B into C and... + sla C ; ...multiply it... + sla C ; ...by 8 to find... + sla C ; ...the current row into the matrix + ld B,$00 ; reset B + add HL,BC ; find the address of the current row + ld D,B ; reset D + add HL,DE ; find the current column + ld A,(LASTKEYPRSD) ; load the last key pressed + cp (HL) ; is it the same key? + jr Z,LVKBRDCHK ; yes, so do nothing + ld A,(HL) ; no, load it... + ld (LASTKEYPRSD),A ; ...store it... + ld (TMPKEYBFR),A ; ...insert it into the INKEY buffer... + ld (CHR4VID),A ; ...and store char for video + cp CTRLC ; is it RUN/STOP? + jr NZ,CNTKBCK ; no, jump over + call CHARINTOBFR ; yes, send directly to buffer and... + jr LVKBRDCHK2 ; ...leave +CNTKBCK: ld BC,$0800 ; 8 FN keys (B), FN key number (C) + ld HL,FNKEYSORD ; FN keys codes +CHKFNK: cp (HL) ; is it an FN key? + jp Z,PRNTFNKEY ; yes, jump over + inc C ; next FN key + inc HL ; next FN key code + djnz CHKFNK ; continue for 8 FN keys +SNDKEYTOBFR: ld A,$01 ; normal key - set input flag + ld (KBDNPT),A ; to keyboard + ld A,(PRNTVIDEO) ; load status of print-on-video + or A ; is the print-on-video disabled? + jp Z,PUTCHRBUF ; yes, so send char to input buffer + ld A,(CRSR_STATE) ; check cursor state + or A ; is it 0 (cursor OFF)? + jr NZ,PNT2VD ; no, print on screen +PUTCHRBUF: xor A + ld (KBDNPT),A ; if send to input buffer, set RETURN as from BASIC + ld A,(TMPKEYBFR) ; retrieve char + call CHARINTOBFR ; cursor off, so send char to buffer... + jp LVKBRDCHK2 ; ...and leave +PNT2VD: call CHAR2VID ; send char to video +LVKBRDCHK2: xor A + ld (CONTROLKEYS),A ; reset control key flags +LVKBRDCHK: ret ; return to caller: the current key code is into TMPKEYBFR + ; manage FN keys +PRNTFNKEY: ld D,A ; copy A into D + ld HL,(LINEAT) ; Get current line number + inc HL ; -1 means direct statement + ld A,H + or L + ld A,D ; retrieve char + jr NZ,SNDKEYTOBFR ; indirect mode - just send FN key code to buffer + ld A,C ; direct mode, so print text - first, get FN key number + add A,A + add A,A + add A,A + add A,A ; FN key number * 16 + ld C,A ; move it into C + ld B,$00 ; reset B, to get offset + ld HL,FNKEYS ; load address of FN keys texts + add HL,BC ; get correct text address + ld B,$10 ; 16 chars +LDFNKEYCHR: ld A,(HL) ; load char + and A ; null char? + jp Z,LVKBRDCHK2 ; yes, so leave + ld D,A ; pass char into D + ld A,(PRNTVIDEO) ; load status of print-on-video + or A ; is the print-on-video disabled? + jp Z,PUTCHRBUF1 ; yes, so send char to input buffer + ld A,(CRSR_STATE) ; check cursor state + or A ; is it 0 (cursor OFF)? + call NZ,PRNTFNK ; no, print on screen +CNTFNK: inc HL ; next char + djnz LDFNKEYCHR ; repeat for max. 16 chars + jp LVKBRDCHK2 ; leave +PUTCHRBUF1: xor A ; if send to input buffer,... + ld (KBDNPT),A ; ...set input as from BASIC + ld A,D ; retrieve char + push HL ; store HL + call CHARINTOBFR ; cursor off, so send char to buffer... + pop HL ; retrieve HL + jp CNTFNK ; repeat +PRNTFNK: ld A,D ; recover char + ld (CHR4VID),A ; store char for printing + ld A,$01 ; normal key - set input flag + ld (KBDNPT),A ; to keyboard + call CHAR2VID ; print on screen + ret ; return to caller + + +;----------------------------------------------------------------------- +FNKEYSORD: defb 1,2,4,5,6,22,23,24 ; order of FN Keys +;----------------------------------------------------------------------- +; key codes +KBMAP: defb '1',25,14,3,' ',16,'q','2' ; 25=HOME 14=CTRL 3=RUN/STOP 16=C= + defb '3','w','a',20,'z','s','e','4' ; 20=SHIFT + defb '5','r','d','x','c','f','t','6' + defb '7','y','g','v','b','h','u','8' + defb '9','i','j','n','m','k','o','0' + defb 31,'p','l',',','.',':','-',30 ; 31=CURSOR DOWN 30=CURSOR UP + defb 28,'*',';','/',27,'=','+',29 ; 28=CURSOR LEFT 27=ESCAPE 29=CURSOR RIGHT + defb 8,13,252,'@',1,2,4,24 ; 8=DEL(backspace) 13=RETURN 252=Ā£ 1=F1 2=F2 4=F3 24=HELP + +; shifted codes - not all the keys have the shifted version +KBMAP_SFT: defb '!',12,14,3,' ',16,'Q',34 ; 12=CLEAR 14=CTRL 3=RUN/STOP 16=C= 34=" + defb '#','W','A',20,'Z','S','E','$' ; 20=SHIFT + defb '%','R','D','X','C','F','T','&' + defb 39,'Y','G','V','B','H','U','(' ; 39=' + defb ')','I','J','N','M','K','O',94 ; 94=^ + defb 31,'P','L','<','>','[','_',30 ; 31=CURSOR DOWN 30=CURSOR UP + defb 28,'*',']','?',27,198,'+',29 ; 28=CURSOR LEFT 27=ESCAPE 29=CURSOR RIGHT + defb 8,13,211,'@',5,6,22,23 ; 211=ā‚¬ 5=F4 6=F5 22=F6 23=F7 + +; ALT (C=) codes - not all the keys have the alt-ed version +KBMAP_ALT: defb '1',12,14,3,' ',16,222,196 ; 12=CLEAR 14=CTRL 3=RUN/STOP 16=C= 34=" + defb '3',221,133,20,131,130,165,'4' ; 20=SHIFT + defb '5',162,166,132,157,163,168,'6' + defb '7',171,169,161,158,172,213,'8' ; + defb '9',214,216,159,160,215,135,195 ; + defb 31,136,138,193,192,123,144,30 ; 31=CURSOR DOWN 123={ 30=CURSOR UP + defb 28,143,125,254,27,209,148,29 ; 28=CURSOR LEFT 125=} 27=ESCAPE 29=CURSOR RIGHT + defb 8,13,224,137,5,6,22,23 ; 8=DEL(backspace) 13=RETURN 252=Ā£ 5=F4 6=F5 22=F6 23=F7 + +; CTRL codes - not all the keys have the control-ed version +KBMAP_CTRL: defb '1',25,14,3,' ',16,154,'2' ; 25=HOME 14=CTRL 3=RUN/STOP 16=C= + defb '3',156,149,20,152,150,153,'4' ; 20=SHIFT + defb '5',155,176,151,177,175,165,'6' + defb '7',166,168,178,179,169,167,'8' + defb '9',184,170,172,171,181,164,'0' + defb 31,163,173,',','.',':',186,30 ; 31=CURSOR DOWN 30=CURSOR UP + defb 28,225,';','/',27,212,185,29 ; 28=CURSOR LEFT 27=ESCAPE 212=Ļ€ 29=CURSOR RIGHT + defb 8,13,189,162,1,2,4,24 ; 8=DEL(backspace) 13=RETURN 252=Ā£ 1=F1 2=F2 4=F3 24=HELP \ No newline at end of file diff --git a/include/vdp/vdp-r3138.asm b/include/vdp/vdp-r3138.asm new file mode 100644 index 0000000..05ca101 --- /dev/null +++ b/include/vdp/vdp-r3138.asm @@ -0,0 +1,1062 @@ +; ------------------------------------------------------------------------------ +; LM80C - VDP ROUTINES - R3.13.8 +; ------------------------------------------------------------------------------ +; The following code is intended to be used with LM80C Z80-based computer +; designed by Leonardo Miliani. Code and computer schematics are released under +; the therms of the GNU GPL License 3.0 and in the form of "as is", without no +; kind of warranty: you can use them at your own risk. +; You are free to use them for any non-commercial use: you are only asked to +; maintain the copyright notices, include this advice and the note to the +; attribution of the original version to Leonardo Miliani, if you intend to +; redistribuite them. +; https://www.leonardomiliani.com +; +; Please support me by visiting the following links: +; Main project page: https://www.leonardomiliani.com +; Schematics and code: https://github.com/leomil72/LM80C +; Videos about the computer: https://www.youtube.com/user/leomil72/videos +; Hackaday page: https://hackaday.io/project/165246-lm80c-color-computer +; ------------------------------------------------------------------------------ +; +;------------------------------------------------------------------------------ +; VDP INITIALISATION +; initialize VDP for a specific graphics mode +; INPUT: E -> contains the graphics mode: +; 0=text; 1=graphics 1; 2=graphics 2; 3=multicolor; 4=extended graphics 2 +initVDP: push DE ; store E + call EMPTY_VRAM ; reset VRAM + call SET_GFX_MODE ; load register settings + call CLR_RAM_REG ; reset RAM registers + pop DE ; restore reg. E + xor A ; reset A + ld B,A ; reset B (will be used later) + ld A,E ; move E into A + ld (SCR_MODE),A ; store screen mode + cp $01 ; is it graphics 1 (A=1)? + jp Z,G1MD ; yes, jump over + cp $02 ; is it graphics 2 (A=2)? + jp Z,G2MD ; yes, jump over + cp $03 ; is it multicolor (A=3)? + jp Z,MCMD ; yes, jump over + cp $04 ; is it extended graphics 2 (A=4)? + jp Z,EXG2MD ; yes, jump over; otherwise, it must be $00 so we assume that it's text mode + + ; LOAD VDP SETTINGS FOR SELECTED VIDEO MODE: + ; TEXT MODE (G0) +TXTMD: ; load charset + ld H,B + ld L,B ; HL=first pattern cell $0000 + call LOADCHARSET ; load patterns into VRAM + ; set cursor & video overlay + xor A ; reset A + ld (SCR_CURS_X),A ; set cursor position at X=0 + ld (SCR_CURS_Y),A ; and Y=0 + ld A,$05 ; light blue + ld (BKGNDCLR),A ; set background/border color + ld A,$28 + ld (SCR_SIZE_W),A ; screen width = 40 cols + ld A,$18 + ld (SCR_SIZE_H),A ; screen height = 24 rows + ld A,$1E + ld (COMMAN),A ; width for commas (4 columns) + ld DE,$0800 + ld (SCR_NAM_TB),DE ; set name table address + jp ENDVDPSET ; execute the rest of the video setting + + ; GRAPHICS 1 MODE (G1) +G1MD: ; load pattern table + ld L,B + ld H,B ; HL=first pattern cell $0000 + call LOADCHARSET ; load patterns into VRAM + ; set cursor & video overlay + xor A ; position cursor + ld (SCR_CURS_X),A ; at X=0 + ld (SCR_CURS_Y),A ; and Y=0 + ld A,$20 + ld (SCR_SIZE_W),A ; screen width = 32 cols + ld A,$18 + ld (SCR_SIZE_H),A ; screen height = 24 rows + ld A,$14 + ld (COMMAN),A ; width for commas (3 columns) + ld DE,$1800 + ld (SCR_NAM_TB),DE ; set name table address + ; load color table + ld HL,$2000 ; color table start: $2000 + call SETVDPADRS + ld A,$01 ; foreground color... + ld (FRGNDCLR),A ; ...set to black + ld A,$0F ; background color... + ld (BKGNDCLR),A ; ...set to white + ld A,$1F ; reg.A loaded with colors for chars: bloack pixels on white background + ld B,$20 ; 32 bytes of colors + ld C,VDP_DAT ; VDP data mode +LDCLRTBMD1: out (C),A ; after first byte, the VDP autoincrements VRAM pointer + nop + nop + djnz LDCLRTBMD1 ; repeat for 32 bytes + jp ENDVDPSET ; execute the rest of the video setting + + ; GRAPHICS 2 MODE (G2) +G2MD: xor A ; position cursor + ld (SCR_CURS_X),A ; at X=0 + ld (SCR_CURS_Y),A ; and Y=0 + ld (SCR_SIZE_W),A ; screen width = 256 pixels (0=256) + inc A ; black on... + ld (FRGNDCLR),A ; ...foreground + ld A,$0F ; white on... + ld (BKGNDCLR),A ; ...background + ld A,$C0 + ld (SCR_SIZE_H),A ; screen height = 192 pixels + ld DE,$1800 + ld (SCR_NAM_TB),DE ; set name table address + jp ENDVDPSET ; execute the rest of the video setting + + ; MULTICOLOR MODE (G3) +MCMD: xor A ; position cursor + ld (SCR_CURS_X),A ; at X=0 + ld (SCR_CURS_Y),A ; and Y=0 + ld A,$0F ; white color for... + ld (BKGNDCLR),A ; ...background and... + ld (FRGNDCLR),A ; ...foreground (even this is not used in MC) + ld A,$40 + ld (SCR_SIZE_W),A ; screen width = 64 blocks + ld A,$30 + ld (SCR_SIZE_H),A ; screen height = 48 blocks + ld DE,$0800 + ld (SCR_NAM_TB),DE ; set name table address + jp ENDVDPSET ; execute the rest of the video setting + + ; EXTENDED GRAPHICS 2 (G4) +EXG2MD: ; load pattern table + ld H,B + ld L,B ; HL=first pattern cell $0000 + call LOADCHARSET ; load patterns into VRAM + ; set cursor & video overlay + xor A ; position cursor + ld (SCR_CURS_X),A ; at X=0 + ld (SCR_CURS_Y),A ; and Y=0 + ld A,$20 + ld (SCR_SIZE_W),A ; screen width = 32 cols + ld A,$18 + ld (SCR_SIZE_H),A ; screen height = 24 rows + ld A,$14 + ld (COMMAN),A ; width for commas (3 columns) + ld DE,$3800 + ld (SCR_NAM_TB),DE ; set name table address + ; load color table + ld HL,$2000 ; color table start: $2000 + call SETVDPADRS + ld A,$01 ; foreground color is... + ld (FRGNDCLR),A ; ...set to black + ld A,$0F ; whitefor... + ld (BKGNDCLR),A ; ...background + ld A,$1F ; reg.A loaded with colors for chars: bloack pixels on white background + ld D,$08 ; 8 pages of + ld B,$00 ; 256 bytes of colors (total of 2,048 cells) + ld C,VDP_DAT ; VDP data mode +LDCLRTBEX2: out (C),A ; after first byte, the VDP autoincrements VRAM pointer + nop + nop + djnz LDCLRTBEX2 ; repeat for 256 bytes + dec D ; did we fill up all the cells? + jr NZ,LDCLRTBEX2 ; no, repeat + ; LAST VDP SETTINGS +ENDVDPSET: call CURSOR_OFF ; disable cursor + call EMPTYVIDBUF ; empty video buffer + xor A + ld (SCR_ORG_CHR),A ; store byte used tochar used to empty the video buffer + ret ; return to caller + + +; show initial logo +SHOW_LOGO: call EMPTY_VRAM ; reset VRAM + ; set VDP for G2 mode + ld B,$07 ; set only the first 7 registers + ld DE,$0010 ; load settings for G2 mode + call SET_GFX_MODE2 ; load register settings + ld D,$01 ; backdrop color set to black + out (C),D ; send data to VDP + out (C),A ; indicate the register to send data to + ; set name table + ld HL,$1800 ; name table address + call SETNAMETABLE ; set name table (load names into table) + call ERASECLRTBL ; erase color table (set foreground & background to black) + ; set colors for logo + ld HL,$2800 ; 2nd page of color table + call SETVDPADRS + ld B,5 ; 5 bands + ld HL,CLRTABLE + ld C,VDP_DAT + ld E,$08 ; 8 pixels each pattern +RPT101: ld D,$40 ; 64 chars each band + ld A,(HL) +RPT102: out (C),A + nop + dec E + jr NZ,RPT102 + ld E,$08 + dec D + jr NZ,RPT102 + inc HL + djnz RPT101 + ; set pattern table + ld HL,$0800 ; address of first cell of 2nd area of pattern table + ld DE,LM80CLOGO ; pointer to logo pattern + ld B,$00 ; 256 bytes, 8 rows +RPT103: call LOADLOGOCHRS + inc DE ; next logo pattern + djnz RPT103 + ld B,$20 ; repeat for another 2 rows +RPT104: call LOADLOGOCHRS + inc DE ; next logo pattern + djnz RPT104 + ; show logo/message, play a beep and wait a while + ld B,$02 + xor A + ld D,A ; 256 times + ld E,A ; x 256 times + ld (TMPBFR1),A ; sound flag set to 0 +DEC_D: nop ; does nothing... + nop + nop + nop + nop + nop + dec E ; decrement E + jr NZ,DEC_D ; repeat until $00 + ld A,D + cp $40 ; ...equal to 64 + call Z,SETBEEP ; if yes, start sound + dec D + jr NZ,DEC_D ; repeat + ld A,(TMPBFR1) + cp $02 + call NZ,BEEPOFF + djnz DEC_D +ERASECLRTBL: ; erase color table + ld A,$11 ; foreground and background set to black + ld D,$0A ; 10 pages + ld B,$00 ; 256 color cells per page + ld HL,$2800 ; first cell of 2nd color table + call SETVDPADRS ; send address + ld C,VDP_DAT ; VDP address for passing data +RPT100: out (C),A ; send data + nop + nop ; little delay + djnz RPT100 ; repeat for entire page + dec D + jr NZ,RPT100 ; repeat for all the pages ($0A00 cells) + ret ; return to caller + +; play a beep +SETBEEP: ld A,(TMPBFR1) ; check the already-beeped flag? + or A ; is it 0? + ret NZ ; no, exit + inc A ; flag to 1 + ld (TMPBFR1),A ; set sound + jp WLCMBEEP ; play a beep & return + +; beep off +BEEPOFF: ld A,$02 ; flag for sound off + ld (TMPBFR1),A ; set flag + jp NOBEEP ; stop beep and return + + +; used to load the chars that will compose the logo of the splash screen +LOADLOGOCHRS: ld A,(DE) ; load a pattern char of the logo + add A,A + add A,A + add A,A ; multiply times 8 to get the offset + push BC + push DE ; store BC and DE + push HL ; store VRAM address to write to + ld HL,LOGOFONT ; start of logo font data + ld E,A + ld D,$00 ; put offset (A) into DE + add HL,DE ; get address of pattern data + ex DE,HL ; move address into DE + pop HL ; retrieve VRAM address + ld B,$08 ; 8 bytes per pattern + call SETVDPADRS ; set VDP address + ld C,VDP_DAT +SNDLOGPT: ld A,(DE) ; load data from RAM + out (C),A ; and send to VRAM + inc DE ; next byte into RAM + inc HL ; next byte into VRAM (used in future iterations) + djnz SNDLOGPT ; repeat 8 times + pop DE + pop BC ; retrieve BC & DE + ret ; return to caller + +CLRTABLE: equ $ + defb $18,$1B,$13,$14,$1D ; colors of background bands of the logo + +; empty video buffer +EMPTYVIDBUF: ld A,(SCR_MODE) ; check screen mode + cp $02 ; is it G2 mode? + jp Z,EMPTYG2 ; yes, jump over + cp $03 ; is it MC mode? + jp Z,EMPTYMC ; yes, jump over + ld A,(SCR_SIZE_H) ; load height of screen + ld B,A ; move rows into B + xor A ; filling char is $00 + ld HL,(SCR_NAM_TB) ; load the name table address + call SETVDPADRS ; send address to VDP + ld C,VDP_DAT ; VDP address for passing data +LDCOLSTOEMPTY: ld E,A ; store filling char into E + ld A,(SCR_SIZE_W) ; load # of cols to empty into A + ld D,A ; move A into D + ld A,E ; recover filling char +RPTEMPTYBUF: out (C),A ; write empty byte into VRAM + nop + dec D ; decr. D + jr NZ,RPTEMPTYBUF ; repeat for the # of cols + djnz LDCOLSTOEMPTY ; repeat for the # of rows + ret ; return to caller +EMPTYG2: ld HL,(SCR_NAM_TB) ; yes, additional setup for G2 - load G2 name table address (usually $1800) + call SETNAMETABLE ; set name table + ld HL,$0000 ; set pattern table + call SETVDPADRS ; send address to VDP + xor A ; empty pattern + ld D,$18 ; 6144 ($1800) cell to clean, 24 pages ($18) + ld B,A ; 256 bytes for page + ld C,VDP_DAT ; VDP data mode +CLRG2PTNTBL: out (C),A ; clear pattern + nop ; little delay + nop + djnz CLRG2PTNTBL ; repeat for 1 page + dec D ; next page + jr NZ,CLRG2PTNTBL ; repeat + ld HL,$2000 ; load the color table address + call SETVDPADRS ; send address to VDP + ld A,(FRGNDCLR) ; load foreground + add A,A + add A,A + add A,A + add A,A ; move to high nibble + ld D,A ; store into D + ld A,(BKGNDCLR) ; load background color + or D ; combine with background color + ld D,$18 ; 6144 ($1800) cells to fill, so 24 pages ($18) + jr STARTEMPTY +EMPTYMC: ld HL,$0800 ; MC name table + call SETNAMETABLE ; set name table + ld HL,$0000 ; color table address + call SETVDPADRS ; send address to VDP + ld A,(BKGNDCLR) ; load background + ld D,A ; store into D + add A,A + add A,A + add A,A + add A,A ; move to high nibble + or D ; set background color for high and low nibble + ld D,$08 ; 2048 ($0800) cells to fill, so 8 pages ($08) +STARTEMPTY: ld C,VDP_DAT ; VDP address for passing data + ld B,$00 ; 256 bytes each page ($00=256) +SNDCLRSET: out (C),A ; send color setting + nop ; wait a while + nop + djnz SNDCLRSET ; repeat for 1 page + dec D ; have we filled all the pages? + jr NZ,SNDCLRSET ; no, repeat + ret ; return to caller + +; set name table for G2 mode (patterns from $00 to $FF for each of the 3 areas of the screen) +SETNAMETABLE: call SETVDPADRS ; send address to VDP + ld C,VDP_DAT ; VDP address for passing data + ld D,$03 ; 3 pages to fill into VRAM (768 cells) + xor A ; starting char name #0 (chars go from 0 to 255) + ld B,A ; reset B +RPTFLL1: out (C),A ; send name to VRAM + nop + inc A ; increment # of name + djnz RPTFLL1 ; repeat for 256 cells (1 page) + dec D ; did we fill all the pages? + jr NZ,RPTFLL1 ; no, continue + ret ; return to caller + +; set an address into VRAM: address is in HL +SETVDPADRS: ld C,VDP_SET ; VDP address mode + set 6,H ; set bit #6 of address, to write to VRAM + out (C),L ; send low and... + out (C),H ; ...high byte of the first cell + ret ; return to caller + +; clear the video buffer and position the cursor at 0,0 +CLEARVIDBUF: call EMPTYVIDBUF ; clear video buffer + xor A ; reset A + ld (SCR_CURS_X),A ; cursor X to 0 + ld (SCR_CURS_Y),A ; cursor Y to 0 + jp POS_CURSOR ; position cursor & return to caller + +; HOME: position the cursor at coords. 0,0 +ATHOME: xor A ; position cursor at 0,0 by storing... + ld (SCR_CUR_NY),A ; ...new Y... + ld (SCR_CUR_NX),A ; ...and new X + jp MOVCRS ; move cursor to new location & return to caller + +; load the char or byte at the VRAM position set by HL +; value is returned into A +READ_VIDEO_LOC: push BC ; store BC + ld C,VDP_SET ; VDP setting mode + ld B,H + res 7,B + res 6,B + out (C),L ; low byte then... + out (C),B ; high byte + ld C,VDP_DAT ; VDP data mode + nop ; wait... + nop ; ...a while + nop + in A,(C) ; read byte at current VRAM location + pop BC ; restore BC + ret ; return to caller + +; write a byte at the VRAM position pointed by HL +; value is in A +WRITE_VIDEO_LOC:push BC ; store BC + ld C,VDP_SET ; VDP setting mode + ld B,H ; copy H into B + res 7,B + set 6,B ; write to VRAM + out (C),L ; low byte then... + out (C),B ; high byte of VRAM address + ld C,VDP_DAT ; VDP data mode + nop ; wait... + nop ; ...a while + nop + out (C),A ; write byte into VRAM + pop BC ; restore BC + ret ; return to caller + +; write a value into a specific VDP register +; value is in E, register is in A +WRITE_VREG: push BC ; store BC + add A,$80 ; set VDP to write to registers + ld C,VDP_SET ; VDP setting mode + out (C),E ; send data to VDP + out (C),A ; select the destination register + pop BC ; restore BC + ret ; return to caller + +; read VDP status register and return value into A +READ_VSTAT: push BC ; store BC + ld C,VDP_SET ; VDP register access + in A,(C) ; read status register + pop BC ; restore BC + ret ; return to caller + +; position the cursor at the current coordinates, preserving underlying char +POS_CURSOR: call LOAD_CRSR_POS ; load the VRAM address of cursor into HL + call READ_VIDEO_LOC ; load the current char at the cursor position (return in A) + ld (SCR_ORG_CHR),A ; store the current char + ret + +; move cursor to new X,Y coordinates +MOVCRS: call RSTCHRCRS ; restore the char in the current cursor position + call NEWCRSRCOORD ; set new cursor's coordinates +MOVSHOWCRS: call POS_CURSOR ; position cursor into new location + ld A,(TMPBFR1) ; load status of cursor flashing + and $20 ; check cursor state + ld (LSTCSRSTA),A ; store the last cursor state + ld A,$FF ; set cursor visible after moved it + jp WRITE_VIDEO_LOC ; write into video cell + + +; set new cursor's coordinates: +NEWCRSRCOORD: ld A,(SCR_CUR_NX) ; load new X + ld (SCR_CURS_X),A ; write new X + ld A,(SCR_CUR_NY) ; load new Y + ld (SCR_CURS_Y),A ; write new Y + ld A,$FF ; delete new values + ld (SCR_CUR_NX),A ; of X + ld (SCR_CUR_NY),A ; and Y + ret + +; recover char under the cursor and prints it onto the screen +RSTCHRCRS: call LOAD_CRSR_POS ; recover old cursor position + ld A,(SCR_ORG_CHR) ; recover old char + jp WRITE_VIDEO_LOC ; write char into VRAM & return + +; retrieve cursor position from either current coordinates or next place +; return address position into HL +LOAD_CRSR_POS: ld A,(SCR_CURS_Y) ; load cursor Y + ld L,A ; move it into reg.L + xor A ; reset A + ld H,A ; reset H + ld B,A ; reset B + add HL,HL ; create offset (each address is 2-bytes long so we need to double HL) + ld DE,POS_TB_CRS_40; load position table address of cursor for 40 cols + ld A,(SCR_SIZE_W) ; load screen width + cp $28 ; is it 40 cols? + jr Z,CONT_POS_CURS ; yes, jump over + ld DE,POS_TB_CRS_32; no, load position table address of cursor for 32 cols +CONT_POS_CURS: add HL,DE ; the correct starting address of the required row is now into HL + ld DE,(HL) ; load starting address of the required row into DE + ld HL,(SCR_NAM_TB) ; load starting address of name table + add HL,DE ; starting address of the current row into name table + ld A,(SCR_CURS_X) ; load cursor X + ld C,A ; transfer A into C + add HL,BC ; add X offset: now HL contains the address of the current cursor position + ret + +; find X,Y coordinates of a screen address pointed in VRAM by HL +; return them into L,A for X,Y +HL2XY: push DE ; store DE + ld DE,(SCR_NAM_TB) ; load starting address of name table into DE + xor A ; clear Carry + sbc HL,DE ; find position relative to screen (from 0,0) + pop DE + ld A,(SCR_SIZE_W) ; load screen width + ld C,A ; move it into C + call DIV_16_8 ; divide position by C: return Y into L and X into A + ret ; return to caller + +;------------------------------------------------------------------------------- +; send current char to video buffer +CHAR2VID: push AF ; store AF + push BC ; store BC + push DE ; store DE + push HL ; store HL + ld A,(CRSR_STATE) ; store cursor state... + push AF ; into stack + call CURSOR_OFF ; cursor off + ld A,(CHR4VID) ; recover char + cp HOME ; is it HOME char ($19)? + jr NZ,CHKCS ; no, check over + call ATHOME ; yes, move the cursor to 0,0 + jp EXITCHAR2VID ; exit +CHKCS: cp CS ; is it the CLEAR char ($0C)? + jr NZ,CHKCR ; no, check over + call CLEARVIDBUF ; yes, clear video buffer and position cursor at 0,0 + jr EXITCHAR2VID ; exit +CHKCR: cp CR ; is it a carriage return ($0D)? + jr NZ,CHKBKSP ; no, jump over + call CRGRETURN ; yes, go to the beginning of the next line + jr EXITCHAR2VID ; exit +CHKBKSP: cp BKSP ; is it the backspace ($08)? + jr NZ,CHKCRSLFT ; no, jump over + call BACKSPACE ; move cursor left 1 position + jr EXITCHAR2VID ; exit +CHKCRSLFT: cp CRSLFT ; is it cursor left? + jr NZ,CHKCRSUP ; no, jump over + call CURSORLEFT ; move cursor left... + jr EXITCHAR2VID ; ...and exit +CHKCRSUP: cp CRSUP ; is it cursor up? + jr NZ,CHKCRSRGT ; no, jump over + call CURSORUP ; move cursor up... + jr EXITCHAR2VID ; ...and exit +CHKCRSRGT: cp CRSRGT ; is it cursor right? + jr NZ,CHKCRSDWN ; no, jump over + call CURSORRIGHT ; move cursor right... + jr EXITCHAR2VID ; ...and exit +CHKCRSDWN: cp CRSDN ; is it cursor down? + jr NZ,CHKLF ; no, jump over + call CURSORDOWN ; move cursor up... + jr EXITCHAR2VID ; ...and exit +CHKLF: cp LF ; is it a line feed ($0A)? + jr Z,EXITCHAR2VID ; CURRENTLY WE DON'T PRINT LF, WE JUST USE CR TO SUBSTITUTE CR+LF COMBINATION + call LOAD_CRSR_POS ; recover position of cursor + ld A,(CHR4VID) ; recover char to print + call WRITE_VIDEO_LOC ; write A into VRAM at (HL) + ld A,(SCR_CURS_Y) ; load cursor Y into A + ld E,A ; store cursor Y into E + ld A,(SCR_CURS_X) ; load cursor X + inc A ; move 1 step to right + ld HL,SCR_SIZE_W ; cell that keeps the width of screen + cp (HL) ; have we reached the most right position? + jr NZ,SETCSRCOORDS ; no, go over + inc E ; yes, increment cursor Y (go to next line) + ld A,E ; move cursor Y into A + ld HL,SCR_SIZE_H ; cell that keeps the height of screen + cp (HL) ; have we reached the bottom of the screen? + jr NZ,SETCRSRY ; no, jump over + push DE + call SCROLLUP ; scroll screen up + pop DE + dec E ; decrement 1 row, to set cursor Y on the last line +SETCRSRY: xor A ; then set cursor X to 0 (go to beginning of line) +SETCSRCOORDS: ld (SCR_CURS_X),A ; store current cursor X + ld A,E ; recover Y + ld (SCR_CURS_Y),A ; store current cursor Y + call POS_CURSOR ; position cursor into new location + ld A,(TMPBFR1) ; load status of cursor flashing + and $20 ; check cursor state + ld (LSTCSRSTA),A ; store the last cursor state +EXITCHAR2VID: xor A ; reset char + ld (CHR4VID),A ; to be sent to screen + pop AF ; recover cursor state + and A ; was it off (A=0)? + call NZ,CURSOR_ON ; no, set cursor on + pop HL ; restore HL + pop DE ; restore DE + pop BC ; restore BC + pop AF ; restore AF + ret ; return to caller + +; flash the cursor at the current position +; (this sub-routine is called by CH3 timer ISR) +FLASHCURSOR: ld A,(CRSR_STATE) ; now, check the cursor + and A ; cursor off (A=0)? + ret Z ; yes, return + ld A,(TMRCNT) ; no, load the first byte of the 100ths of A second's counter + and $20 ; check if it's time to flash the cursor (check bit #6) + ld HL,LSTCSRSTA ; load address of cell that stores the last cursor state + ld B,(HL) ; load last state + cp B ; compare current state with last state + ret Z ; same state, no change required - exit + ld (HL),A ; save new state + push AF ; store A (keep state for later use) + call LOAD_CRSR_POS ; load current cursor position into HL + pop AF ; recover current state + ld B,$FF ; cursor char + cp $20 ; is the cursor on video (A == $20)? + jr Z,PUTCRSCHR ; yes, jump over + ld A,(SCR_ORG_CHR) ; no, load the original char + ld B,A ; move char into B +PUTCRSCHR: ld A,B ; recover char from B + jp WRITE_VIDEO_LOC ; print cursor/char at the current position & return + + +; delete the char at the left of the cursor +BACKSPACE: call MVCRS2LFT ; prepare to move cursor to left + call RSTCHRCRS ; restore char under the cursor + call NEWCRSRCOORD ; set new cursor's coordinates + call LOAD_CRSR_POS ; find address of new video cell + xor A ; null char + call WRITE_VIDEO_LOC ; write into video cell + jp MOVSHOWCRS ; move cursor to the new location and set it ON + + +; move cursor to left +CURSORLEFT: push AF ; store A + ld A,(SCR_CURS_X) ; load cursor X into A + and A ; is it at the most left of the screen (X=0)? + jr Z,CHCKYPOS ; yes, check Y position + dec A ; no, decrement X + ld (SCR_CUR_NX),A ; store new X + ld A,(SCR_CURS_Y) ; load current cursor Y + ld (SCR_CUR_NY),A ; no move over Y axis + jr CONTCRSLFT ; go on moving cursor +CHCKYPOS: ld A,(SCR_CURS_Y) ; load cursor Y + and A ; is it at the most top of the screen (Y=0)? + jr Z,EXITCURSORLEFT; yes, exit doing nothing + dec A ; no, decrement Y + ld (SCR_CUR_NY),A ; store new Y + ld A,(SCR_SIZE_W) ; load current screen width + dec A ; cursor to the most right position (width-0) + ld (SCR_CUR_NX),A ; set new cursor X +CONTCRSLFT: call MOVCRS ; move cursor into new position +EXITCURSORLEFT: pop AF ; restore A + ret ; return to caller + +; move cursor 1 position to the left +MVCRS2LFT: ld A,(SCR_CURS_X) ; load cursor X into A + and A ; is it at the most left of the screen (X=0)? + jr Z,CHKYPOS ; yes, check Y position + dec A ; no, decrement X + ld (SCR_CUR_NX),A ; store new X + ld A,(SCR_CURS_Y) ; load current cursor Y + ld (SCR_CUR_NY),A ; no move over Y axis + ret ; go on moving cursor +CHKYPOS: ld A,(SCR_CURS_Y) ; load cursor Y + and A ; is it at the most top of the screen (Y=0)? + jr Z,EXITCURSORLEFT; yes, exit doing nothing + dec A ; no, decrement Y + ld (SCR_CUR_NY),A ; store new Y + ld A,(SCR_SIZE_W) ; load current screen width + dec A ; cursor to the most right position (width-1) + ld (SCR_CUR_NX),A ; set new cursor X + ret ; return to caller + +; move cursor up +CURSORUP: push AF ; store A + ld A,(SCR_CURS_Y) ; load cursor Y into A + and A ; is it at the most top of the screen (Y=0)? + jr Z,EXITCURSORUP ; yes, exit doing nothing + dec A ; no, decrement Y + ld (SCR_CUR_NY),A ; store new Y + ld A,(SCR_CURS_X) ; load current cursor X + ld (SCR_CUR_NX),A ; set new cursor X + call RSTCHRCRS ; restore char under the cursor and print it + call MOVCRS ; move cursor into new position +EXITCURSORUP: pop AF ; restore A + ret ; return to caller + + +; move cursor to right +CURSORRIGHT: push AF ; store A + push BC ; store B + ld A,(SCR_SIZE_W) ; load current screen width (in text modes it's 32 or 40) + dec A ; decrement it (most right can only be 31 or 39) + ld B,A ; move A into B + ld A,(SCR_CURS_X) ; load cursor X into A + cp B ; is cursor at the most right position on the screen? + jr NC,CHCKYPOS2 ; yes, so jump to check Y position + inc A ; no, so increment X + ld (SCR_CUR_NX),A ; store new X + ld A,(SCR_CURS_Y) ; load current cursor Y + ld (SCR_CUR_NY),A ; no move over Y axis + jr CONTCRSRGT ; go on moving cursor +CHCKYPOS2: ld A,(SCR_SIZE_H) ; load screen height + dec A ; decrement it (last row can only be 23) + ld B,A ; move bottom into B + ld A,(SCR_CURS_Y) ; load cursor Y into A + cp B ; is the cursor at the bottom of the screen? + jr NC,EXITCURSORRGHT; yes, exit doing nothing + inc A ; no, increment Y + ld (SCR_CUR_NY),A ; store new Y + xor A ; move cursor to top left + ld (SCR_CUR_NX),A ; store new X +CONTCRSRGT: call RSTCHRCRS ; restore char under the cursor and print it + call MOVCRS ; move cursor into new position +EXITCURSORRGHT: pop BC ; retrieve BC + pop AF ; restore A + ret ; return to caller + + +; move cursor down +CURSORDOWN: push AF ; store A + push BC ; store B + ld A,(SCR_SIZE_H) ; load current screen height (in text modes it's 24) + dec A ; decrement it (positions can only vary between 0 and 23) + ld B,A ; move X into B + ld A,(SCR_CURS_Y) ; load cursor Y into A + cp B ; is current cursor position < 23? + jr NC,EXITCURSORDOWN; no, exit doing nothing + inc A ; yes, increment Y + ld (SCR_CUR_NY),A ; store new Y + ld A,(SCR_CURS_X) ; load current cursor X + ld (SCR_CUR_NX),A ; set new cursor X + call RSTCHRCRS ; restore char under the cursor and print it + call MOVCRS ; move cursor into new position +EXITCURSORDOWN: pop BC ; retrieve BC + pop AF ; retrieve A + ret ; return to caller + + +; set cursor on (visible on screen) +CURSOR_ON: push AF ; store AF + ld A,(CRSR_STATE) ; load cursor state + cp $01 ; is it on? + jr Z,EXITCURSOR_ON ; yes, so nothing to do + ld A,(SCR_SIZE_H) ; check the video mode + cp $30 ; graphics 2 or 3 (if value>=48)? + jr NC,EXITCURSOR_ON; yes, so exit (no cursor in graphics 2 or 3) + ld A,$01 ; cursor state ON + ld (CRSR_STATE),A ; set state +EXITCURSOR_ON: pop AF ; restore AF + ret ; return to caller + +; set cursor off (invisible on screen) +CURSOR_OFF: push AF ; store AF + xor A ; cursor state OFF + ld (CRSR_STATE),A ; set state + pop AF ; restore AF + ret + +; scroll the screen 1 row up +SCROLLUP: xor A + ld (PRNTVIDEO),A + ld HL,(SCR_NAM_TB) ; start address of the name table + ld (VIDTMP1),HL ; store address of the destination row (1st row of the screen) + ld A,(SCR_SIZE_W) ; load the screen width + ld E,A ; move width into E + ld D,$00 ; reset D + add HL,DE ; HL now contains the address of the source row (2nd row of the screen) + ld (VIDTMP2),HL ; store address of source row + ld A,(SCR_SIZE_H) ; load the screen height + dec A ; decrement the # of rows: now, A contains the # of rows to be moved + ld B,A ; move # of rows into B +SCROLLNXTRW: ld A,(SCR_SIZE_W) ; (re)load the screen width + ld E,A ; move width into E + ld HL,(VIDTMP2) ; load source address + ld C,VDP_SET ; VDP setting mode + out (C),L ; low byte of source + out (C),H ; high byte of source + ld HL,VIDEOBUFF ; load address of the first cell of the video buffer + ld C,VDP_DAT ; VDP data mode +LOADNEXTCOL: in A,(C) ; load char + ld (HL),A ; store char + inc HL ; next cell of the buffer + dec E ; count the chars to be read + jr NZ,LOADNEXTCOL ; repeat until we read the entire row + ld A,(SCR_SIZE_W) ; reload the screen width + ld E,A ; move # of rows into E + ld D,$00 ; reset D + ld HL,(VIDTMP1) ; load address of destination row + push HL ; store HL + ld HL,(VIDTMP2) ; current source will be.. + ld (VIDTMP1),HL ; ..new destination + add HL,DE ; address of new + ld (VIDTMP2),HL ; source row + pop HL ; restore address of current destination row + set 6,H ; writing mode + ld C,VDP_SET ; VDP setting mode + out (C),L ; low byte + out (C),H ; high byte of address + ld HL,VIDEOBUFF ; video buffer address + ld C,VDP_DAT ; VDP data mode +WRITEBUF: ld A,(HL) ; load char + out (C),A ; send char + inc HL ; increment buffer index + dec E ; next row + jr NZ,WRITEBUF ; repeat until 0 + djnz SCROLLNXTRW ; repeat for the entire screen + ld A,(SCR_SIZE_W) ; reload screen width + ld B,A ; cells to empty into B + xor A ; null char + ld C,VDP_SET ; VDP set mode + ld HL,(VIDTMP1) ; load address of the last row + set 6,H ; writing mode + out (C),L ; low byte then.. + out (C),H ; high byte of address + ld C,VDP_DAT ; VDP data mode +RPTEMPTYROW: out (C),A ; empty cell + nop ; delay + nop + djnz RPTEMPTYROW ; repeat until the last row has been cleaned + ld A,$01 + ld (PRNTVIDEO),A ; set print-on-video on + ret ; return to caller + +; carriage return: first, it looks for char $00 at the beginning of the line (look for the first null char), +; then it starts sendind every char it finds on the screen to the terminal buffer of the BASIC interpreter +; until another null char is found. Finally, move to the next line and position the cursor at the beginning +; of the row (equivalent to CR+LF), then gets back control to the screen editor to let it interpret the line +CUR_POS equ TMPBFR1 ; cursor position +SRTTXT equ TMPBFR2 ; start of text line +ENDTXT equ TMPBFR3 ; end of text line +CRGRETURN: ; preliminary: disable cursor if on, and retrieve char under it + ld A,(CRSR_STATE) ; recover cursor state + ld (TMPBFR4),A ; store status + and A ; is cursor on? + call NZ,CURSOR_OFF ; yes, so set cursor off + call RSTCHRCRS ; restore char under it + ; first, check if cursor if off, so that we just interpret return as a new line command + ld A,(KBDNPT) ; check if input from keyboad + and A ; if 0, input is not from keyboard... + jp Z,PRNTRETURN ; ...so just print a carriage return; otherwise, interpret the return + ; first part: look for the beginning of the text line on screen + call LOAD_CRSR_POS ; load cursor position into HL + ld (CUR_POS),HL ; store it + ld DE,(SCR_NAM_TB) ; load VRAM address of top-left cell of screen ("home") +RPTNLLSRC: push HL + call CMP16 ; check if at "home" + pop HL + jp Z,CNTNULL ; yes, exit because there is nothing before + dec HL ; go 1 step back + call READ_VIDEO_LOC ; read char of current position + and A ; is it $00 (null char)? + jr NZ,RPTNLLSRC ; no, continue searching + inc HL ; move 1 step forward to go back to the last cell with something in + ; second part: look for the ending of the text on screen +CNTNULL: ld (SRTTXT),HL ; store beginning of text + ld A,(SCR_SIZE_H) + ld E,A ; load screen height into DE + ld A,(SCR_SIZE_W) + ld L,A ; load screen width into HL + xor A + ld H,A + ld D,A + call MUL16 ; multiply HL times DE to get the screen size + ld DE,(SCR_NAM_TB) ; load screen name table start address into DE + add HL,DE ; get the address... + dec HL ; ...of the "last" video cell + ex DE,HL ; store address into DE + ld HL,(CUR_POS) ; retrieve original cursor position +RPTNLLSRC2: push HL + call CMP16 ; check if at last position on screen (bottom right corner) + pop HL + jp Z,CNTNULL2 ; if yes, exit because these is nothing after + inc HL ; 1 more step forward + call READ_VIDEO_LOC ; read char of current position + and A ; is it $00 (null char)? + jr NZ,RPTNLLSRC2 ; no, continue searching +CNTNULL2: ld (ENDTXT),HL ; store ending of text line + ld DE,(SRTTXT) ; load beginning of text line + and A ; clear Carry + sbc HL,DE ; how many chars? + jr Z,PRNTRETURN ; no chars found (HL-DE=0), so just print return & leave + ;--- central part: send the text on the screen to the interpreter + ld HL,(SRTTXT) ; load beginning of text line + ld DE,(ENDTXT) ; load ending of text line +SNDCHRTOBFR: call READ_VIDEO_LOC ; read char + push HL + call CHARINTOBFR ; send char to buffer + pop HL + inc HL ; go to next char + push HL ; store HL + call CMP16 ; check if DE=HL (finish chars) + pop HL + jr NZ,SNDCHRTOBFR ; no, repeat + ld A,CR ; yes, so now send carriage return + call CHARINTOBFR ; send to buffer + ld HL,(ENDTXT) ; recover address of last char of input text + call HL2XY ; retrieve X,Y from address + ld A,L ; move Y into A (we don't need X anymore) + ld (SCR_CURS_Y),A ; store new Y + ;--- final part: go at the beginning of a new line on the screen +PRNTRETURN: xor A ; move to col 0 + ld (SCR_CURS_X),A ; store new X + ld A,(SCR_CURS_Y) ; load cursor Y into A + inc A ; new row + ld HL,SCR_SIZE_H ; load address of cell that keeps screen height + cp (HL) ; is the cursor over the bottom of the screen? + jr C,ADDNEWLINE ; no, jump over + dec A ; yes, so come back 1 row, then... + push AF ; (store A) + call SCROLLUP ; ...scroll the screen before to... + pop AF ; (retrieve A) +ADDNEWLINE: ld (SCR_CURS_Y),A ; ...store new Y + ld A,(TMPBFR4) ; retrieve cursor state + and A ; was it off (A=0)? + call NZ,CURSOR_ON ; no, set cursor on + jp POS_CURSOR ; position cursor to new location & return to caller + +; ------------------------------------------------------------------------------ + ; this table contains the values of the offsets to be added to + ; the starting address of the name table to find the correct + ; value of the first cell of the corresponding row + ; (by doing so, it's faster than doing a multipication) + ; table for graphics 1 text mode: 32 cols +POS_TB_CRS_32 defw $0000,$0020,$0040,$0060,$0080,$00A0,$00C0,$00E0 + defw $0100,$0120,$0140,$0160,$0180,$01A0,$01C0,$01E0 + defw $0200,$0220,$0240,$0260,$0280,$02A0,$02C0,$02E0 + ; table for pure text mode: 40 cols +POS_TB_CRS_40 defw $0000,$0028,$0050,$0078,$00A0,$00C8,$00F0,$0118 + defw $0140,$0168,$0190,$01B8,$01E0,$0208,$0230,$0258 + defw $0280,$02A8,$02D0,$02F8,$0320,$0348,$0370,$0398 + +; ------------------------------------------------------------------------------ +; reset VRAM +EMPTY_VRAM: xor A ; reg.A cleared: we fill up VRAM with $00 + ld H,A + ld L,A ; reset HL + call SETVDPADRS ; set address of first VRAM cell to $0000 + ld B,$40 ; $40 pages of RAM... + ld D,A ; ...each one with $100 cells (tot. $4000 bytes) + ld C,VDP_DAT ; VDP data mode +EMPTVRM: out (C),A ; after first byte, the VDP autoincrements VRAM pointer + inc D ; next cell + nop + jr NZ,EMPTVRM ; repeat until page is fully cleared + djnz EMPTVRM ; repeat for $40 pages + ret ; return to caller + +; clear video registers in SRAM +CLR_RAM_REG: ld HL,SCR_SIZE_W ; address of first register + xor A ; $00 to clean the registers + ld B,CHASNDDTN-SCR_SIZE_W; how many bytes (registers) to clean (dinamically calculated) +RSTVDPRAMREG: ld (HL),A ; reset register + inc HL ; next register + djnz RSTVDPRAMREG ; repeat + ret ; return to caller + +; ------------------------------------------------------------------------------ +; set a specific graphics mode, passed into reg. E +SET_GFX_MODE: ld B,$08 ; 8 registers means 8 bytes.. + sla E ; multiply E by 8.. + sla E ; so that reg. E can point.. + sla E ; to the correct settings +SET_GFX_MODE2: ld D,$00 ; reset D + ld HL,VDPMODESET ; pointer to register settings | <= here points the SHOW_LOGO sub-routine + add HL,DE ; add offset to get the correct set of values for the required mode + ld A,$80 ; start with REG0 ($80+register number) + ld C,VDP_SET ; VDP set +LDREGVLS: ld D,(HL) ; load register's value + out (C),D ; send data to VDP + out (C),A ; indicate the register to send data to + inc A ; next register + inc HL ; next value + djnz LDREGVLS ; repeat for 8 registers + ret + +; ------------------------------------------------------------------------------ +LOADCHARSET: ; reg. A contains the video mode + ; reg. HL contains address of pattern table into VRAM + ld B,$00 ; 0=256 chars to load (complete charset) + set $06,H ; add $4000 to address to indicate that we want to write into VRAM + ld C,VDP_SET ; load VDP address into C + out (C),L ; send low byte of address + out (C),H ; send high byte + ld HL,CHRST68 ; starting address of 6x8 charset into ROM + and A ; is it text mode (A=0)? + jr Z,NXTCHAR ; yes, so jump to load chars into VRAM + ld HL,CHRST88 ; no, so we change and load the 8x8 charset +NXTCHAR: ld D,$08 ; 8 bytes per pattern char + ld C,VDP_DAT ; VDP data mode +SENDCHRPTRNS: ld A,(HL) ; load byte to send to VDP + out (C),A ; write byte into VRAM + inc HL ; inc byte pointer + dec D ; 8 bytes sents (0 char)? + jr NZ,SENDCHRPTRNS ; no, continue + djnz NXTCHAR ; yes, decrement chars counter and continue for all the chars + ret ; return to caller + +;------------------------------------------------------------------------------ +; NAME TABLE: buffer video - contains the chars to be shown on video +; PATTERN TABLE: charset - contains the chars/tiles to be loaded into the name table +; COLOR TABLE: color settings for chars/tiles + + ; VDP register settings for a text display +VDPMODESET defb %00000000 ; reg.0: external video off + defb %11010000 ; reg.1: 16K VRAM, video on, int. off, text mode (40x24) + defb $02 ; reg.2: name table set to $0800 ($02x$400) + defb $00 ; reg.3: not used in text mode + defb $00 ; reg.4: pattern table set to $0000 + defb $00 ; reg.5: not used in text mode + defb $00 ; reg.6: not used in text mode + defb $f5 ; reg.7: white text on light blue background + +VDPMODESET1 ; VDP register settings for a graphics 1 mode + defb %00000000 ; reg.0: ext. video off + defb %11000000 ; reg.1: 16K Vram; video on, int off, graphics mode 1, sprite size 8x8, sprite magn. 0 + defb $06 ; reg.2: name table address: $1800 + defb $80 ; reg.3: color table address: $2000 + defb $00 ; reg.4: pattern table address: $0000 + defb $36 ; reg.5: sprite attr. table address: $1B00 + defb $07 ; reg.6: sprite pattern table addr.: $3800 + defb $05 ; reg.7: backdrop color (light blue) + +VDPMODESET2 ; VDP register settings for a graphics 2 mode + defb %00000010 ; reg.0: graphics 2 mode, ext. video dis. + defb %11000000 ; reg.1: 16K VRAM, video on, INT off, sprite size 8x8, sprite magn. 0 + defb $06 ; reg.2: name table addr.: $1800 + defb $FF ; reg.3: color table addr.: $2000 + defb $03 ; reg.4: pattern table addr.: $0000 + defb $36 ; reg.5: sprite attr. table addr.: $1B00 + defb $07 ; reg.6: sprite pattern table addr.: $3800 + defb $05 ; reg.7: backdrop color: light blue + +VDPMODESETMC ; VDP register settings for a multicolor mode + defb %00000000 ; reg.0: ext. video dis. + defb %11001011 ; reg.1: 16K VRAM, video on, INT off, multicolor mode, sprite size 8x8, sprite magn. 0 + defb $02 ; reg.2: name table addr.: $0800 + defb $00 ; reg.3: don't care + defb $00 ; reg.4: pattern table addr.: $0000 + defb $36 ; reg.5: sprite attr. table addr.: $1B00 + defb $07 ; reg.6: sprite pattern table addr.: $3800 + defb $0F ; reg.7: backdrop color (white) + +VDPMODESETEX2 ; VDP register settings for an extended graphics 2 mode + defb %00000010 ; reg.0: graphics 2 mode, ext. video dis. + defb %11000000 ; reg.1: 16K VRAM, video on, INT off, sprite size 8x8, sprite magn. 0 + defb $0E ; reg.2: name table addr.: $3800 + defb $9F ; reg.3: color table addr.: $2000 + defb $00 ; reg.4: pattern table addr.: $0000 + defb $76 ; reg.5: sprite attr. table addr.: $3B00 + defb $03 ; reg.6: sprite pattern table addr.: $1800 + defb $05 ; reg.7: backdrop color: light blue + +LM80CLOGO ; patterns to compose the splash screen logo + defb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + defb 0,0,15,10,11,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + defb 0,0,13,23,0,12,0,0,0,1,0,0,0,20,0,0,6,5,6,21,22,7,6,21,22,7,6,1,1,7,0,0 + defb 0,0,13,0,0,12,0,0,0,1,0,0,0,1,20,6,1,5,3,5,3,5,3,5,3,5,3,5,3,5,0,0 + defb 0,0,13,0,0,12,0,0,0,1,0,0,0,1,1,1,1,5,9,20,19,8,3,5,19,5,3,5,0,0,0,0 + defb 0,0,13,0,0,12,0,0,0,1,0,0,0,1,0,8,3,5,6,21,22,7,3,1,22,5,3,5,0,0,0,0 + defb 0,0,13,0,0,12,0,0,0,1,0,0,0,1,0,0,3,5,3,5,3,5,3,5,3,5,3,5,3,5,0,0 + defb 0,0,13,0,0,12,0,0,0,1,4,4,0,1,0,0,3,5,9,20,19,8,9,20,19,8,9,1,1,8,0,0 + defb 0,0,14,18,18,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + defb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/manuals/LM80C BASIC reference manual.odt b/manuals/LM80C BASIC reference manual.odt index fd1b129d12f1a039b2cbf563f1c5db461ea7a032..8c83cf371e80fbba6afaafea90c1aa901174a02c 100644 GIT binary patch delta 72553 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%0D^=5sm2lQkKZjRI+hriB793R6C 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

  • 9VN+gzQs1g{?e65y=@)GNetknBozralzDK+F zG^99t2mmCcm5!6!6YOk2F}fsFZTl9v$Y|ob1$u!EU3{$)5_mJ*up+tUf@&FkD$<4_ z^XO>~DiDum!vq+6w+F`*`(kHZCyoYwu=xlXYVVC8a=n17sN0gw#ykO1nbG@4oX73>VT?M=cKz5 zurr7(ozIeKA+(uAocfEfL}2_SEF2qUx-EQAli7g>-R-f<8aplRWB#w!7EOEKZD{%S z-$_cB=GD$lIzR2K41}1+oT_P(~Z4|waFN*BDe0`rmh}%q`bL} zFa|H&FI!RF`1w7&Pi-?{+pROB(_kRteZEJWbV4?v3w*atD@GIKN`P@ueeos-EfsKX1PlKDh2tH|JWmAO34jM8`!_CYl1X|JSqd8^n6!2WU zZ~Eu_PD2viPVJy#KQo)GOn_^Pwgaz z!(vKli^R4EdmiGo$g?ln$%9MppqWM3AKAh)R}=;zq2yi&7bAT`uep$B^jIH{>g~&%_C9i@L&!z3Hy}c6(=|mCnh`F@xj1yjaBd?n%T`#wjK5?-+W)6%FlWa1Q}Q>+!|OpI;>N2G0g&jAq%Kqq z^5GllmN?_0h5OnxwC*b}xKr-xO42%=a-J!KSizcYqg3v;$@a_bBtno4LsHgF{uV{# z&h)b~HA3g~aL0qdhHaoJ@Flun&E(7(mQf2%fkdVlHF{_ZAfG?Ropk&mph=IyIUD-C zWb zFUF`YljJ%kiqQ{dWT-EHCfn656|I%nspz`@1GgBmOAUKhnV5Vs08p%qX<%~}>7pu| z2wazY6g!GBOPu9sMl*D|&8CSyKY;#o>W(>7To>69?r%Z^^|EieH#1SM<~tZQc7~HB zUn^v@Y7>VSR#o8GVH}==yH2WzC=v9KNp19a24Tra`cO&8gCcvUK@-clhy?RnJyy4zn!g0`^J^(o{ZvrAjG z>8v(sRTmyE94B|R)J;hmg@h~D=itQ)q!v$fH>(?Q(+oLaHk!C*P@cCo385$@}bN%0k7AX2otEJPzYW^xlNbx|pGC=rBaL4T_x)d9Sgw47T;R;Cu9LkyA7ZQsuJlqix z2U6)tX4m_JgZ%Yz|E|p?Y3WhtDuvwgB%a6@1*>L>4Wzj5)}Xbh0Mp9Lm10cSB^OcT zLNsz0R7j|<1FHKb79=TYb@5$_$RX6=kDl)9f=U`l8Z5acQ%ZU(uI`HVJw4IqG^n;3 z{ttyfdcQp1q6z9_-|sXP-um5Q*YA6!SJgccRdWfgScV>Lh@I)ZKx|l+)R~mxvcy4q z>Zt;cx*Sy9XX%0b>QoUZwsgRp)hH)&84lsAMJwsDWGRevY$kuR^-X>yP#HeAgstkq zLOW$_WFUXqL)Ypr-FkxCOm_X@+4C!4hrLa+kx3pTLB}s;qO>UoW%}kC8r`!{jpJ0k zy02M9ZF4B9y=yN->`=+onFWrWQ7wCgr_YXg+F54?qbfDyd-9htMLWZkYrxd_B9Bj3 z(>*VuKMfg3Rg8a4pW@qT3|QHDO-ETVC=uF?x@yMr`6aKRK(iU>Z!Fw_cQSyW7COzU zEPZl%!@>@=>OlmFv=57*pu9fpi@@_sp5r12?R)lPA_!Mz#?`yHjupN{1TOviz+)nC z(|sM-u>u?6Pfy6PPMP_Fx18&NJc>POD6-|hQvj%6_k>Y*Q0wpSzae_`r*ug1+X<#W zPf8e?q8OuRgU0z3|H>_1=GRrDJ+9s3-tAF>`_mBjq|3K^M7u}4+aoOVuR`OVboq9V zY4;Qxd^i0E);*ezmF*TQ=n*vuE=e-Q*ty_Q{hMl&yK(RMq zz4YH7Dao>AIhPTf0!)8Rq=}`?Fosdx{!%|(y+RnQx_vs4Ap_1JO~~Ig^7VyYz@g`> zDec0Q_>Qkky!R$crgezxu&jHSYT4EHDpxc|d(j>)2&_Rcoo`z=(fW`DD2fX4VnCE5~Fu zbMbEvB)LH^AdNy|h`*nVKOgCYB%k`_d_>2v`No{UpLv6?F)T|M&Uivk$UE_aaRvgp zfTWY;$cP@DIN*4K-YSG5%{$R5%f_hU zB1fXi@d|UvpXKx|@&4oX{yq(aogEFBK-smUhG<*U3Qf~~0JL31O9nV~IlehRwY}FW zX+|Qgu^4z|5181|gHVptR2|9uK2jY~-ev!7p>N@vrj~yuI%Q_z-fEnWJ=RAEcPekw z(gtZ{QL-x>t9C`D@iB5&K~W(RT*n^mV{>J;gBB)3VmE@X=ncLsGD)UXDST_oa!OKYWiunTO=4{=wQN;$^4x)Q z72HO!B({G)a1A|z+nR1_vc|saXT_h|R$nZVrBX1B*{)<7Q2X}#kVO{!XxLgHS8nkS znc>3_o;+T%x9qknU0n`J$N2qX6`XsV^;xM3f`p*qBF>eZ!R+TO)hK7ul(si0qc~0J z+e+n%tj|yqNhOB9TK+B*(}IU=1iKW0V5!=QJWPK@Dtm@WILmF^70FHcN%5@@8fiKm ziykJ@(K^PJMABpsnMWaYig9_^#Xzi!i93s50g7ART^Ly^k+mce!z|h4D6D7U`g6?tjtd<^+=w2<$z}s zwzRy>2ixmX zfHI)(JQCIl^TNORX)lNJ&M5hPm_tK5520LWQ?5<7bn*1&lENUK#`@S+ z#9#qOmk&WO+f#fx<%E-V8Y*xY^-;Atf4*@XgZkDO|K;Zcs3UR&-W1{B()Hi!*Umvp zB+J@+ZbqtXW7C4yxYb?2ORV>xHyTf&qZ!Nt=*Hd6kYL|DSf3=q6NhQn7tPOEPUem` zjn4l~#Mm)mNd(?|mzJOcClr7%If(kYoC&Gvo+g6j*Uh+N_5GZ z)0X}`M2U<(YYCBfMXO1lARsf+9)tG80wsWf7ZQ%N$LdH2BmHlGXt!e*Cb;UrI~jEb zzvk~w863_gKIb01@^83fpkqhJpfI@JILWXZ0phAnpXkm6ryCL>2a)Ca?6HX=QGp&{>3qiS-sR_o}loS*I&an)>1ge2~*F@D0mlE4NdY1X=j zGId@iv5q?}Etor_j4;y7Jkzppy{~H!lzn6BQ6|&guBoC?K!mu_oS&m1c22}7Bj&M4 z>t_DCjL4XO6>RCJm=EVo)~pdBk@%fxR6k>zNn0PAf{!0Q}TSDrCeKz zG9`{m1>!qqT+4>vjMIEaFy~w?SzgV#2$$n}tHu72(W(SGQcDOBGPC%u4g;8s%w>mi}wr z>~e85yqy*id!zeq&xCE_UN%uoMKkJ!!5hteBYkUmtGr3%YQ?5^g+(=xJFCk3itsJ7 zORCCT_f}OEjczjIe3x2;e|hht<{-IMw+X{jSm%Y`GW(w;kD zNlP6uBsP72T&G|JFMw1#+pK=gF?T7Jf$RYB(Uz>1+jPB@dg&)*Io ze*K07eg3!0ct-QrsFDDZx+J=}#h}a@(j=8!K@DV+4k_&fmepv6H4ChSh$>oskYGv> zaYK^cR|+7xE;Nno#}%I4(!9eNulVN}z4e<`ZGqGTUN}Btx(AL&tpJD*2&CEiO{-=) z_S;Y#g(byk6-vM0A^##W19HgNY2{LS2xXWdss5du@(-Y)LDF)NqTNum3Koj7MlsH4 z{{w|y8hDq{paK+^_@x320X2sOrUHirrUQosrUZutrUkbJrUu_@e?5=eFbv)ED>N5~ zD$@D{3<0(i58Vz3(4pwoYk>|0dQ1O)NlO06*~wjsBDmP1DC#}(kvXG5{W<(rMj34| zDwmwb;8e7rqX+f!eE9r9{VE>xdHHeZF9#PjDhpQInAGK)`Z!tzs4m~Xw2jXIwuRm_ z`3UrEVm`Xoc!-&neEgae+-D7dTD# zt`I{CNn()+GJjy^WF5qsm;{RTT-_}5 zIFd(TaGY1#f4YYOsdcygSPQgBmfz4aFR9VgX4sbAoAf#LDW`_KY_-dhGD+ez^nKkl zB+a3C^vhkP$`PAd4WE4rriM#%=OFNFjTojf1Ts@qWD_kFQCcYSfz=Ju^&Gk)C_csA zZK@kY4pn|r@3D1aKf`#%5JhFHR7?WlmV{8HH~2F^&Yim(idC z6qlY92Vxf_nN6X$Z38_lJ+i!~n z<1MV{-r#~AyBb>K7*#NjxFT!9&ti)sHqZ-Fk;{$*GO%X&OmJd%<%*oaUXnx z#z`UMGGdgM#1#h-f7U2Ll4f9lgS5$qfy!a2q4KT;Ny0erY|1LNGL@jnpFxt~u%6a* zbfk1};%HEmQPG@?_wBg?OXl^2hEE?VFg3Dko{d9igTDMSpD)W4W3b^|CUpm`eBtCg zOr>EKWYGRcBqi~vj96J<5p#LsyX2WE56Xm|j0-DpP+E&8f1rdH>JHmUshgxq_|b~I z@va4{l((G`y|eL6&S3wEyhn6w>Z%cTDHpSBqVE>L(T%(8vUZKE73&V+s^V+gHx);^ zrFY2D<}(I-5W0hIBa`iv>4Sz~QU3o|F_5?TwpE-Mj2Gc@KaqI3q${xj>0XV?ho$J$ zud@h>{%`NGK$+Z#<<2Hb=bOi4Nn%wN7FTx|IkW3sz}N$MgM#b(x^i%PUx{qKuAj^N z$u|+L|A)|GtG=6mD*CAU+P5DX-ePu@uI6djw`Go4S}(;a=b z3O(odZrVCwF^*h>u`$v1N)HFol(x6$0gM?d4*8x3Mt<2IyLIc1e+a>uL=MTse*gwE z7Ulwfz=%+C7Pj#0&^L7#D<+cl)}$L&T*LY-18lX`YuE;GsKAglj8$l|sL+OS;<0p& zwXk+hRi7IS?n=OP;}!t70$&A}?QpeUgk|p$oO+|Sd;Yy$!DYL>uE#~myt~eCb!z{2XO(H;7^>;KNbiU zm;TBJDVKg02$h$)%LgX6ITr}O0hi~^2QZf?83^;2O3w#ew;GxU%rKYR><0-2F)}nY zH<#$_2Q!x^%LkH|wCx8bx8KVL2?Cc)?*}ip7tRMW0hcQ92VA$>7zgDump&E<375!B z2M?E376>VpO$U*e6Bh_3x3^6PDFT=H7zi-85KsqH0hb#Z2wj(*Tn8S1Uz1MK)#)ri z_B2TZffRwnu!kj(1|ey(kRYUEI)ETb02K)PqKtwpu7D^FE(AqDbR1D|cjkS^1;%X_ zQ5d&Tp)23H)t!)_*i!w%bcD1c5z2qRu|81u z+RG)G2o*bFj>1N$*bzCv!+Qn1r!>xQyY05b5*@s^!TafX!P>yZj<%%;i8s*q`GMP7 zma!WMykCWPp*b+WJ}_ayK!k=TAf#E`5)8pOXhviIK-*hd>s!8m+4e&XymunRErB`= zfApt?B2V8L!g9PqsZwjSI=#VYGFz-RyTch5?@CBaatoehZ%S%fdcXbyGBUHWb8_?Y zeFF;$i*6V+_{JeahZT#%OGb<=ExW0F)aWr|$Bmy*F>%u5DV0;FRr#mSxOwKRYV`m7 zk2}kqMR#ze$cAcvqmT-t_yhZcAr3ZmQ4Be3pDnC}HN z3wL0GYETn*}}$- z(i(sfAJ(Wxct_N$vog_PwFZhBD24lZTMpxX!?0Xn`jrko%pj$XE(<#?4b+7zCRUY> zba_1ftjtkiy?3PCght3yhWQa;g*>IuL_tS?YlXv^r#jYk8qw^U3~imaE^u>Im;_*K z2Py67SQR#9g!_9(hWju1+zC6c4`+HumWDIvtYaqitTX1?k~qwz8offt4+ys7{rY0x znn0|EPc{C4Xfe!;2;)gr9{O{Y0j@hb%Dh5ZM@>hdv#Wi!S1@`z4r{d?Ev0~NR8a+g zQ*?Gczt$BlTjviOYZ~!je{Abzlg5NC6K7O~nbb0&F#t92U$NJ7gUe&;=~MCFnh~G{ zkOLU@cqkgyc8X{=yoB2)Rz=?hG~0Cqi8&emFjGTYPIb4~Drrl5cT3Ok8ZXdx%;c($ zFq=B6&RYr?UmFOw&j#+AO9|sOhV?&xx;)+vvq>0~wz^NGOPb7{y8t z=jOnOKn)PAX{1cdaE`YnZ1tA(P?v&L+BCUJ9ugZCwvGs+n%dZ?a89W#S3+rjN6pA6 z2y`y*#HwS+*LC6WK*9C24-~n7B<*Y;0bG_=+EG>45O&wN>Ok%qgesROEc$`Mes5L1 zpRyfbsQ(3*%p881SEf{rnd}`iaeCDaF+idXbUHS*^tx%hRj%kXz<^<8s#2(8T*MC@ zjZh(!LBU%x1nyx)suC_EAY870rHorLM5w|p)ZH7v2=^CC>qo}=(f2-+a+IA$ly}d@ z(^r^hM7hi3_e6hLnG7@wv4vrTk|MRdy9v}3G$?^TN0iG|6qioQ^g@-l-s|@^3SqIL zitde~N5*mt88Xgew3^cAtrxNYO~?by-7gfG;j#=@Z{&t=lHYq?%dcyH9@X6}bSS-J zCU?-uy|D=qKt3vrC<}`>m|U_hpaSg$-76SDq-BBbI4p`(m>UPvNxY-#I=qvshRD4^ zpWNYELf0~*F?h_BlB`TnZ6$}jc=g1?B3?atdet!__er&s*VX@ zG~`-_*3wG)BG4B)(m>$`4AV!}vuO0JjXR{&MCUaLyGdN!0R4K@d@@IO>GwoXa_9GUGvm zOg@t@FV|=Cn25)J%}QxBelGh5>AkBvxl+kdaAf*A{I6eL zkR2m*ch^O>jGK;JC=KPKx#A$FElZuQORy#DbXmMD9r4IF5Sff7#z5SJF>+3|I(0zm zfRH~mm6%L_?vUT4Ah{twiHo8m!(>K-oH_Et*5_fNZa-QKb~`1;BpjPuW@9Vf;hz z*4F0W5~=;RnOdHJf=Y>^mXR;KT-}+sWvhq9M*5 z$Jj_*98swZA-_sNY`@wx>^A<~teLm=@D^;8?$pS5lNpoI?8!Hi?y@i6oLbC;e|>cQLyv9Vx@Y$`sp>1{Vd*Jp2d>3a@Ju{idRTf4Cu7ouqz|Rfq@S^V z*Uvu#f87eOF9g`_s9r2K8I8O`;Y3=k!-@1pJ!4S0Rg8|)TdVyhlb%IFY~;X@VrU|%&fA&Moh>j@8Q;BUrq*p>L#7ZXO2>jZUn$CEOIa&0XV`VSQOb9 zc7q2$5w3q^(C&MsBht^(7mO26UbZjw!8uPn%IudeNtf1a9xkoJbMa*6uylC%tt%xe zWKRR^CE&B$kO$o$CMIxtz0QtwDA{X`tMHqwMjcYyh`Yki5j!gOQ7jk3;~Hvxz8GeI z)4jkn-ogT?vnqUrK7sURnUXhN{C+y4V4mWiVc8kq;Z@JyzVhDHcWqy_m`RpCm%i-G zZPXU-XTO&G!*6~qa`wWR4?lV5^>^eT4V6gK*fnxQI!JVxReDCRHkveQwaI4Jt5lp( zZ9rUwAJ|4_0>D#_uLnM}%<}+Za(V%O1*8~bAGSM+;I79wWpsX8_Jp;$W@*4Ftem0f zj|)#oH~3FV(=@C2h0F8UoXDLQlA4M6%Bx?Upy6CpPTBDQOFWt&W;zkl@rpQ$MWG|E z1ShKSJDqBy(N^I%8r7u2f1ba@GwnR)c{N2}&diy8g|kPm$aIxaRpij)9^N#6*>Ezi z@G!V!@47iV;&)|!_3%aM=dZr{R!Y5RC&!d0;Qu`Lrhi=4(z|dPHe(HTOP@;To%r2D z_v3O3?+So-6u?X6s-I|$N|ZBBWvKA0j0E7MWR1bpqls}Z>F7hnQCGhH$A2RK`2L$0 z*WABj)22JVAFwrh^-)htvRKRwiXJwY}#Zj_)l~)DLIxyXr#5jPT^6fSgscQ-?-Te%I05gOk zP5*xK0CRNpUC-`_tS6IS9KdA`nsDxg(~%t5cRTERHLRVCa!{Q(ILi=!7jIUkrwc;7 zf#l|y`%Uzl&DsP*Trlo@+@-j#I8FmPB_Y9H;ZHDXy}<5hqMzfGT1qt#!zhMgf(h!R z7wuvor{)*gs3uMKQu3u07*mT1nHR^tS=-Ul(o|rQ z(;KLx>q|Bc^oJcVJy=Y1@QFyTH}D2;ip8c!N}V6qSf59?7h{hZetn0g?_K;VYK?g@(3&3_S0XH{Sd5FR#1_aBc+L)B~I<&}~CRw??Z4UyJ29y+Na%?AIWr zqQb8Wxa2-d&~H`9CwG9nYW6yV9Ea<zPv z4Vq(oWh=LVwU#B_!w%VS#gk>XsH(r-&=%E)r(xcq;LoVgSTP549Is?}qSj!x+Hb%U za5W|dT#SR5XbBc={mU`t6be-BR}c>TnjY-~oZNbije!-wZSnvocx-q%^GM|8ljL@G zzhvGO`HU-n-AUK2g>~zIztT~um~2l^2WQpoPBMUCC#m}N_p%niUA*030m*hpMH^(> z=kr}B-qiE(QP-odlsjxb>U>Zh#Imq^yPFwH-f(fke*RvbNp2ipHO<2G3sx>{*q1lF zWE}I<1Gk@gB(j&v|FYbMnKgBDryqPLl0)nF?Tf5`r*PWT6mYJ#0Z$mY1Yc zf6!+!+X{;;)FB)=jDZ6AHFR|dSs?2-LmSX6@o*l)sp%!{>$rYBmZItNA^lT z4ck+Hi1$g;n&u@hLn>RAu$58RMnNM4k- zd~*_i`p@rQco1*;NqSqljGY_rXNn^)aiuRpJ#+8b_{bCF+<9q0JH<2AxnsZ&8h{px z!_!m1ealQtN>cESloV=pGBVT6CbKEzHvrE8l*E&m=<&pd{2m2Sh5VPIJ!A>y8x%aBXx2I$K&X^dgAnp-4FNOsWicWt}^q>!I*u$>8@_#DHk2uKbt8bFPMmB!u z+AE*R@e!4U_LwXrp$f5|#-&#(S!8j!SUbepZb4&-x5QWbEf&z~W|{k4)qd9e8{yDz zs3L4-y`a-|O@enWesjvY< ziB)$*&aHU`OaF_1i0sssZpUvuiSLwFaHYSzz&@M)zU0T>NA1W2;KfGZ#Y{9>?8kG- z_QV7&LJ4+`&B{*J#*sLo#-ErN#}ZYwUxavt;dx@|;XGdyn}dGk#Ijz26eVHVaAz~= z*@SW(=yiV@r3f}FcymcC+bDhavs5(tSVDN~?nj5uy?f-|HIoK>_u2awGLJhq-64HZ zFk^A)+9lN^({XF(o46r$`GTdbWmPwLO#@0Qn@2zS!nUxdrT&8aD!>o@z4*`r;i0|9osU}jzM(~lblZQAl^pvle+Yx#$lr0ttEZn|vU2-9_uPB; z5+*tFdZ%)i1VVkFkoDC%o2nt|`0Ue{KK$f^S6`Q9Y@<}gCb456ip@b2#SE5^ex_uH zO64}WbMssVYifnxVKwSAEBtD`4S};Ku(>S5vNUSUk1=%5t+#I)MH^M4l%-7t-fMr+ z8MrC~3yXZK6vs=|R1;l@ItilN0ievleO94xFP#%YS+$!&}XH}%>UwGED za!|#cm6qJtaZXwZ&QmO?f;CTcT_!(sQ$Xt$iY`v2Vysq!-C@!K?d?ivhe!z%f(=wH zn0(!0)uY{Eql+Nd@rrlw}T=1)b5 zzSsPTZ}&19U^QgVY38ja8V7&&Bxia=x?6kX_YL6FWUVJFy=0!VGAwu|V1LaizI@iK zpq80uY)0hEM|i`+xx;I`p@H|$-FNKBzW<%t8XpjEX(8?n(ocsEOFwVifK}lzR&BUh zy88F+A1*{)|NJLrm@D@`IeLS(ig8uA4t#9Yyjn4VBHv&I z6TmP#mUA07Ks*wU8pR|X0$<8vMOIfriv=T#(Nbe+v9w!GS$GwZ^Sgp8soY|5I*k>6 zr=6%P{BFfE#YS*8MQDJn8z~QG%)I7tX7r+Sw|Srxv&X1v>n2|}<4r~@F!TL$7ZXky z+ZXQIy7j?%8%!s3i(Xm$Ll zivtwA+Y%qAg+Rr^v+4cZT05~PLg*ad63=Kze7u+5bq5%K^c0%i?Xknj0J|F}F>J~| z-+c2gp52x^wqyP5dg-SPW8Xg$emDLh&25W*n0)i1hc`~b1rHorzScc;!V}_zxZ$IN zlea#0_cCkw=d0{i2-PTqX6o0BKFvrk1a;l+&ughIe2vn=!>{>2X)HLoHo00 zrh0=6!zNg12>3Gz5aB1rBc#(OD6D#GVv;8wgG5e)M(l*?Hr{RgXMtW2_z}O;RN#9Bru`^1ai?RHN z1`QQ|6R}#QfDlrtQXvhi(dxik#|o@8aNsXRGjiQ|^J}~>t2!DdD(G>CiMpF)i?rpg zXP&_yz9)^sZ{qJ}OF{1J)c~WDaw6Md%{KG^JB>X6o4rvKSj6y%S12)JS%xd-gZwg{ z@S@pP&JzQJ83Y~+NFS^+G{@IFLuDzz;H%hw+Q?^DA0yM58_(f~9+0+3o9~zRb#0A7 zqPu$yo?{qdU@?n}Q4lSopRmC?G$@-1w%&LB3PlAfh(KV4>9E3Q58RJ~xcLET);SdY zW=!_o9cYG_r&Q=nMiwKhmDQon1w&x)dGOfoa4FrR@KI z(KX}*g6x#_EPGw@K#kM&SWX|<9mBB2XE!@s*hhYOd-S-B#JojszxU#Nqe;kEa;S7d zp11KuY{kNO{~FaAD5)4dwWusO^QQ5m zD~skY*m9@#j~~2rWzLy1-T4mc?<$dr%88y;0Y928oKBAB^nIea-f}{76#@u!ODMM`3|dP{%Hl-^n+Xwlpty` zLjVkxBXO8IQoUAjfWzKO3XWWT%gSB&C8oP6ytCzaW13h9z7Zm7wE_{Xj)Q2!&E;^6 z0dB=yHMfjA#GU69Zo+ZE7!VbIV}exI&Mx~TXs)So`A9Sxj==R0*&gY~?2Ocb|6jUO zn*M;~+bPpJnuA~m%V(_VqJ<|MK}e(l_1f~#8+}|f*9ls1>G0r zo%t}IhGt4ZNvIW=WeL*o90wL0^o2qVvIU_BiE0bV%e^#(*)b@(gbI6qRa8$) zQhM<;-YtdxgfsDgGg1gYf{#lhnM_76&A^XFzK^_1*Di&%SHaq9G*FC>g;j)6Gg^&` zG4uphw(A0`7@Ni-D>tU6Jj@#(NE2SiTGK#pI<}r+2S>z$&IJpZ(>=5sAm$FmA$sV8h5tC0?M!4G@qcE*8weqHybz&y>?=a&+UvY4rSyjEwwb zJn#u)G#_N=9-MS_8&`T|!=@FahMx9<9}hg|mh+LZa}n%xs^VQHn+?pQ&91X4k>R(` zMX)KF5RWCuneM{|6P`c&&gJ(#8#@>o_VD5(kHUs0?OYt*!-TGXJ{dh5X_k7#Y_=G|!f3CVwmxSLM(UcxK@{4(8+PdDSHJ)8m7zR2r)NO2YR}aQ8(Ws4uUa-p*$g13f@1 z2s*15eY{!v`$>HE8%$0~oj*$VK0yxO@k(<<;z~a_Ek(ZGLSv8&*xz1m97;ub=teYG z98svu)TLQcTnP!5BodeJ$R4QHDYZj}mgZwsKGvW(W1J9wM+_ue?HK5aOUfrI&S>mE z(QhQ4LENB;e#FVKaFcibj_-k~kKam{N-uy*^9`%70pwCVOS3+l)Geb;jrGA@2v=rgXev!lu;&YslV zIVwCh(`w>Y_ffq@i|Rb}UfTuTU`6{t5-&qX^TirRrKvYfw&9)AbP{lSlR} zWX*I-33YS0Y^BcoOW+O())-p<7rDYY%G#fRHMx*0s+H?~*`Va*?r_zG2Pro#ec^f%1L0`@62BXL6iG?Al z4$h&_;Pj%@B98c&-B_6=eR*ureLEMuDE%V~YqYD`N9No$>X&lNbfNN}M%{A@?k~f6 zYwUY}hB#Cq>K!g4r%~I~h(qx%WoOrAF-~VHcRH&5PA8*Of_>9ylq_Se_A}k$(rt$` zP(~l!3NBbGA9W1r!9S%uJvA#VqQc3J`{JL!fX}DIDm*>(M8(_t_u|TtTe77O@%g*& z$00l#&%jfqXK(oXRq5}MPX-9MVh`|lNmqz}y_0(drJzhS5bYBioI*ZfwYL7C7P&05 zN~ugWC%Cd)K)ixN_W;{~kUvk?Ul;NV{rlVagaoI}E(+=8cG2u8x7%%ezLwX5m#s3Y zL{){VM#a&`9#vR%Sp`;--^5{#BfL{SSq04JM2{upO=p<8k6CC{-%N2&sviPTM>N8J zQP{i%DKy#WFr{ZR@<%K_8@xe?lWs~P*h*XU7!RcH!!Ud2;;aS3yL?A=LFf`zALLu&amo zlxmI{Vj;o?KGO>})XQU5o0gbp(`tSBuKv&Y1=rCTLJmCRRLVG(fqkf+FF9&{i+6dJ_Yo^epwHQqKEKE#j=>ufP{i8 zqENC*offGG&tfHOR)YgnOnqX4|qYebqfXAJa#^I07NgdMKbNC}^ z+&MCm!I7nrVrFRMW#%R3t{y#q^oG2CxtK=%7Fa|>^^u0v>ad_OmD50Hq2eCUMp)TP z8%5>6w?YC~Vs^b(xbu}1_b_OsA%ByUOeu5ceklV~Q#G?U^2*i!pxFNR$^Ppw(L=Ya z1TtfWQLA_&q6$=lNHGm5u!4=6SXuqd^mUtA^PqfFkFAv*C+3yoQo=cZyb!mYW6C3) zOgR&YJjm374@snZnP=s5CqXn41o0EYav1HL!BT%OqmPGd@j(CmSS6i-LH9-GQlHUA z#*yb_zgK}gqF%u>gs0!-A;dFCmdyO#Q$S!sFS2e!zYCIWeg6w&9J4I4oLP45+^-a3 zjVduK&S|mOtX2q>?DUg=Kesh5Gvv4NEJWiQhbrcM8f`V`v%?(*1K+zc__l$6AOYc(1NxGyQG*7%UW z+6tkb(aNZa)k;(85d7JSn%}y2l9@DPW|KP{VPY`HD>Rf%eLba?@QQ^hvJ*@Qt5B* zgVMjQ%&7kQ%}slMMl2fhhqL=)vG6kx3-1E{w~8tT!VvaJKle0>`u#l~ocwttb7-qn zh4*d6`@3 z$0mIA@l5Ml!M2S4Zv?uVWa+cNri z`&KwL7TZKN9_oG37*`i&eRIrHpWe}UHfTExxlq>{= z`T11he0@Sr4_MIdiyU|=a_nHF^U#O#kK(Ej=3Wc3?m}*KSe&a&Ot7(5l?i0RY|v|1 zwZ&q!yOR_w?*K%_u}*N!t-RVp;vK}Pb_yOPsABCQen5s>eAUGA>$>lne&crz^M9rZbIfXJP2i!I}8Sjh2-u>)8=Zabp*{(QZ zrTqNp6VOJe$^gXym$$$Nm&f8G^nwk;lRPv6v(gt;%~Pd&r!-GF^S2TI#tMIP6~3ja zx$3=$Sc>P4Aj74X=ShwD5A>Rcht7+Zq{exF(#v=#mBYL7^K2R5h(~#%lVfQzlpvn) z3MD-Y#zxFwmYTnry_IY%fK@Rxf+Yu~qtf$#z)Rl1OY!r>d-Y?o_UZyU_W}Geo6L*_ z+S)~RR6dXS@$s0D4~lZy0dgCDdCeM1uft>(8z0m2KG8`dU7msi7K5RmVH3P_hJv7f zSUA$>Ff__&#Df7dn5o?_{RbB@`SOE18`;7%(~GWg1lDlH*2od<91nBDh7rpuK~rL~ za|VZhwSw=Oaq_^$G|2`k@}~SCv!b&{w$MF?yDpNy0zQo>S9I#l3ORpj0)DIZ8wgQX z(~P*KmnrGNXrC;2ejNSCfc*8{6HlCf^}b+U;D1LtgMYw}yz}=Xr`!wMaU4-a^C_r7 zx`Vw{whICpA*K+$9=S|P2dEqq@g!U0s{K}0p9Hb3-lE}a{M8zWJ$fA>W?T#7Vo?OB zq*$y*fk|V2oz?y0(f;?;7Y&(NdEd*$AAb4k?CvMh-po5&b@$l!zi!91Sp1EDG%v;* z$t*HlrbCjbmuUb2Jw-poejn{YJ%WwBFdfxHdeB38-FgW01E?Zk5zs@Rknn%eL(xy+ zOjr*(Xfx=dX>0lFwLh(u^HMd^y~G^LOXZ633!T`KKf)ny*dA|-(MHp~^S@>D@IcM5D)zG=eI14Y@^%AaN0=$F++o&xg4pkd|9Hf~&2K5WocFJ3lc z#l53aM%}wmlPOlcY$&yJSA#VinAi8crLDjJ){n_?C!{Ccxp<3jPUGuV7_zI;;O z%jb=fv)7rn*HqMf*4;aQa9~W!AIM`A+#&v1mMPe^^z{?W2dlT;vv|qMt!vrQ{_3P< z+QQGT6yl@%ZmGv{*v1q_F1-Jzv*$lP`&X)TEYdXQm`pP}&`f4fgsxffDBT&$W7MF@ zY=m&vm97-_ovyoJj19(c2rSDBU>m_v#4^+hPjGTo^p?nODMH}Fm0oPBkVhQv~fpQAi1skln z9ektlcq*=d=L6tZ6aq8{&|!20g;4|E2vT2ze}sA^>R>E?T~{dP5tl?W@igC8_TT?&N zQq#NUrRE=hErphamV=hFmT#@&t5k_d ze|AXDY-hRi9_Mp$%DCjX!EtkAl&L{OXdEw7+lX?|&EQ%cBPQTN+M0x$d+0Z{hn5%_ z;0?z{DNuc^Oi(R4Hi;vxJ5=vfuK9VGr(8KWdnoY69a^sF~lCTJj= z7b~;Sr#@EZPy)L$R_39+J62Yp@7Wh(WhLsz9g3AzD1rM+tgL3fi?YfG>-(AE@e&Q_1OzFWR938p9yv}FpTnrpMiHqEY&_7%njn}d_;=PZ~P zXdND^t#7WYZxynH>pEQbI<>wvM9cZvxw+YYzH5!wb!`d>0imq`U_hV0HBeVSKhS!M z5NzlRgwR?)rzzA{-wKsY%|d1Nh~R=yQ*(W$u&A-A zwozCVe+UV6^`WLY&Coo1vCwyv0IdPoO>=W_AxyduhPBo=wAP0jo0{hcp+Iv;2-UYX zHN>V6+8P6Gbno-)+gh7y1M}uB2C~g>fuXa3PK%n_8tMA2O#tcm`b7t_yP*LDH2`9T zrui+c!G$uQS)tn2`ub*AFHjel-88SM4d!YLf3yZ_0d0W0rrMB<7Qlwk5@^mUUCBc z4Z-F%7#b7;b#<_JKv=ML!F)KWEE_ z(xey^hl4jT=>gIzTX`A`?EH|OoEK#Ho1jDIbVkS7N`q?!Tvo=2+*%yf2Laq zTI%JuI(b$)cO~?gEcdFAM^Y@b$*VQXy{7!eiW6YP1{hx})3Cc|tvom7h3L#dC^yFN zITvuqg)QiIIWXspd8j58$BC%e@^(_wS?H%K#VrcGUXP=AYB++jbgb$zK7&>n_&$B z$^m)Tf($LiNW*nd2r||JG7X}1pAW5Va^G60p9g=7W70Msa1>p2c1)fY$*U$8{tLbvWZbmHRt?G!)xlqs?okd4 z!q^2e6{C_BWH#*COktwiqn)Wl3q2`LG2I2KO=tpre1;GB@^?pW2x8 zWXE96`TsqR!qp;Uu(y=7_P{b9U>qCM1I<11x1g6KcT-|AXrr;R=4grWPgx9e!gVuH z*|}bO=D~V-*X<(8jZN_0Cc_hwahWaeVGguUfEC6@ed*u*4Nt?9e-Q@HxDro_J*VO+ z5be8hB|P2moPd0IJk*bcCv6{!hT0S zPopk(%WxAO2@}w3e;7qxG$F#xHo>Y z`|_mza~6@SaQ9eX06V@Df26#fyyktFkWl-#<@tfBE@P_ZOchxecG=#Lqr0 za~nRz;-_VH_unp*xldkr>%#d9M7-cDEW1$VbRWl7Gz^D-Z9Bn@uKFYQ~8-A8CJYD?srKd?J)`=Mh%H8eZO<^V+ zJ{5jDOmYqtA7b`A8Ge#E_2k=6GC2o}4>G%-z^4wpeSjIR!v>U(^{@{FcOzT^Tm*Ju z6m7U-XU)!*o#g)e(%gS2OLOOL7q>G2!_)WK6Urzof2#ZRrn0@;hPd|(SK(5K8{PP( z*s~0miv8-`_qw{=hHZzoo!mymZHakh;x@YrZdyZ`VQbFT;;qZJUfRkTp2u1g#9C2c zwyaNcZ=T%cKEDa)Zo=+OIh&Z^re&KLw9&Xx*hu8hnKwEU%7hKM8<+{}tJeqDliYRK zu+F_Me`g&L*BLEk#*3SYfo5tzD7kUNd@#d-bZJ?p1dU zao;n#%f0(e%?j?6(*ci;c{P^*fo(6Cl=gLCQeN4SN2u~K0g+ZElYHdDJyqZbYhn{ z8;=Hhi~_*Q;kpT~LuL4U*`+e3y$n0Bt$Lfr#tUnn40 z2Br^zHibcL86gaI2p%wsE()V@849xlC<<<3zs&O2M(8_9|$RzZIlOzmt7zTCYKzQ2P1#f&u-d4 z5C-tOpTfuV5aFHOv4ez=2n2~k|EQ!7VC;ojD#kL-fw!-}`L?apL!!_2&iKc$>|%S^ z9r|usd>e1gF;4lp>)SEjZy#e5^HaQZedZ)@yJkvP_P@E-L$;V}kB|EluZRA8TdlIi z_xag<8Xx)7roElwr)=?cY~z2}^_TqV$M!g1A3uiSSG>l4%8P8h&f9pN`+Tm4FZDGp ztm^sD&X2q4@jRFOTk!rEVlH;=NNH|uybpB~$GX47Y*iHNe6`=Nv)H%)JzFYEPUq%l zJ5iA;Y9zoWmZkm*p0tq=XdYUx+=(C^`Q^jDabBtL9Ie~CE@{T0>={TuX@G=IETlHY3SFJTb+E6enk zFbMq~eo21JU()eno9ae#|7$ zub6+JUof9QzhIt$es6u!{(&dZFV=^C!JZ8Ci@huPt$&)otx13T$7?JL^1_q^HZ9V-S22Fme-%m|mlAqX+I^Opz90he+sHZuxk zZe(v_Y6=Q8H<$m)2Pl_uLw{XZ^(s01*4bxfG6}T(-240e@%v6V=j_MYueH}+d#$zCIrMaGY9R*FOIRYV zS>M!|^UcS(gpgkm0=6}qdxRN_oYQ|WJV*%hAFZ8h*FX5|WoHTD4iln2ymsBz*54E^ z|0^MeHbRy^+}6_6{0GnRFd=I=tYcCeCj3C!s>b+qjOVqj@3|@>EN#Si9P3=Su47Hp zcjumXm5^p^j~rd!bX8{scQ->w%XW+l8=BU)2$ftN#`_7;Z|>~q?jhJwLNnd%Rh`Y=0mq8aa7lldE`bi zi>%8i@gh9R>Tv$*$)kwVS7=%|m8q^{uV9Wa%+TE!xs$BLs|j%I%pL5ke}bX^@sC|b zj4+nXC)$hUGG)XpeanB8o*fC>}qiupmD#l$#UuIII@4$*9+9HEI>lu?&#$LIQu{H3>Ffu+}z(YC=tQ z#p8t|ctS+T)=`k60x6~;!6Hm2 z)8!^YLgGYqNH_{B7B^t{j_OcMNPJGim(Va*KqE$s2&^ogRaF3?;^dIuF5^nLq=~n3}1F7@{%C&EiOFnwk^Q#SJypzMPy` z@%Xt3Q>dC|k=eA$glcv|O{)~z<*t)m!lCg4J8wT~A*hUQRn(`5|_wh7DbWNUWr zyd_~RN{kIvC&pfV+Jhr+NsJFw*CdMMTIVlGw=;jZNl1V2`IeBd^S=lVC-nJeBU74^ zDXM(Se-SyDU}h&^NkfkO^VK4*ckZkW3AH=pJDZN4?_C`dETNr;42GSZHHdB!ZNMsy zo_~IqFHw7YEMbYa!PHoC=(S7cC+v$?HYAw*TA{58Q}AD9C})Z<$C`$T{0~Ctq0WRORF$4xxmz{uOB-mBWU+)}c7nv$Bugd2HFRAGH9O)oBa!oihsp%s(-BfeV%0LRYc^6@LCwyF=GH_o?rX+%*D5slauQ+;XE+vWXo<;W zhZuhvJLsdt5u>zH-!Ok^X#V0A4O5aGQ8MJ}xcr(?)r1;+N;OD;2~EC6XkdJ73;`{e zAk<B~2If&O@RoFXpzXawVa;%{xO&8>Ule|WEahgIiu_G!&LKkYOO6WsXa(bnlUa6$3E&*hnlAye6D`J@=d_G#z8<-S50R6}f}fP5(4t<5FbyvgKr2D5XyF@^b- zcr4!*!&1AE3m?-=MD1Mx8+j)B23@F-2e zXq2W1W8kAPFhEmEXq1eBsc(PLY|9upL#rUPROeKY*Z5P zM=Fbmr?RNXY9ke%aO0}Wl~5%tdY`5b{cSDh%cXPEiBIwTuz5d z9RR0;%gJY7dhm(2-hb?YmKWbTv-9Df960AWc#vs95&X`Zo_SsRuk(LIs%O8src>g3 zCD$D{4gE@W=O^Vp?vbqW`}#NU%eFsp>nlH(wH$^xP+~mF*P(oGgGTWytI2HUY(|U0 zpjKNr*6uKxtfqL(X0?I^Wgml@GlRJ?rUTnq2b^}mDF+;Lz+ngUJ7BK^wmYE50nHAm zcR;lR${djA0EYuO2mF6e;Vb?{flO$Q!VEZoNjRX-0ec+K>wr!NL>(YHpu_=!11t_0 zq(Gwp7CDj=m!2*BHKyh)^;>oMsNcp>KT;VfvXV$7;;D>8Y!%^15t$H4O{}d#zE@OC zEXjA~luw2TxaB9C!vdQFC!{&|!y7Nb`v->JIJ{%%%q_6%&+vbn@^YN5Z@$y`@Ci3b z*Kut_n`FTj$Zh98W6$ynNHK|tWo}JjfLIHy;RykaW865tF$Ux84jU4lA&;ayO9#kp}G%cL0#^%F8CG%F8B2O5N5_VL>QY z<#Yt_QiXC03U`0a3gti3aQpXXths*2^=oFFdFQd0W`$bsz4^WwYqss!wr0i`gX@03 z4BDRw*X_Q(Zq=;f2~(DDyS(p6k@T1TdF$h|md_X;p0@I)_^a;}Ncov7n+V&Ws*9e_PXf{H<5vq+K7{PyH1kMO&j4)_~Q${#ugu|)a zG9%;};dDlNzY+GPDv77SN+_6v)-x>)z1;{sv?Zk?jy7=82+V*H5=Q8w6+~%ir5Bi| zWMTE01d>Tgqp2uOJ!uH!5lBTIdY2~zDTb1Yy!xGLIC604KXH|N4n}3NkQZ}#7R6ot z`OmmdkS2e8WTu#7Wwl<`o9$Pb8e>EUT2`l1ab7PW4vgDHKU|({CR`aw@*z6)GV|dD zVzrQ*Qnx)+H~~TeW3||j4k{tSs#uluytEfqLBrc;R8@i6=i<`&&;IdQ*Dt5#&r*Hh zfHfe(3Rn}7-v4P)So#m?HR%KCSCc3FLONb4^O=7lyxFjidg3JC7h8$Jpt4%sE>^oV zMp&@0tW$K_qA{o0U^QE#F|*U*2F{IKzzuucz;wDH?uMuvL^lk$A>oET8Wr4NaRYI~ z8JdEinUEtfEu*-R&O;i}B+Fy@bqWcT{E-7w0;hEEV$=ACYsBL5qBy=-)crv6_U(Wo z?jwICE`B%FTU_jA1#dCV1?tl5AKBw1n+%B85xd=^M^@@l`vckDXe`@o$B4@ljp(az>_h;VJpt$qKxY8r z0T2UlG5`ZKqc0;pbMTEDM{%=_3JR>0Rmod1j|=58P^GDj@b znM`Us%ep_af`!7;!!7frJMtJrMTDqe!odNF=o~Y!#)Ylwfh9tf7B$ zBv5C>8L~QXyPWJa0W6F+UUOYbnKdc6jl%@vK=ECzmY%-~8RI&%)90U!aG z8KtvP5&$6pmH?bdO-O2y53_)zIFNrS4Wt+_MLlv_nFGs%L1MHbF$z{EAP3GVD*$fB zwzZS?mXtic{QWn7{W7#m_qBDvU6;Xoww(_|ZTcy}37-M~^;c5s5_ouj|I-i1JYp;k z_1yFQXC+uBIS3?w2NTLIborG{8Mfp}H~!oI^QH8yt8T3135PxG z!hsiZhOAb3yz`LmKIQKqcH$?!;vxs9Ctk0Gvjl>6OEhLj9*ERO)Y*U0nA(Djn_=9G zV~mRgVNNs%Vh~D#AOr#913~DeDM}zt(}(3ync#-kIUOp=T;`P2@>LG@jhwW?@z7kP(1?GJ<>N)uy^~$6|pYqT&dZCc{)Jpdx6h(hI*-C7J4)MI2(V7^O*<#YFQ9Fvp^qg6(0i%Y1tH%P(7O1yC zwFSy7kY@ph1vm?wwZLf$oU*_%3mmpUzXkSMV7mqW1^nRu1is?`WdnT|gD@T{J985c0hNCjw911io+n)wha>lZ z4OI8QWh)%))wlwELtB_#_;eyY;#{#$AwB9TJubGX)qdjky92>2Z8VnUQrT<{2fH}t zuqcEnQes2$tJo6+OArPr{Uw61Cq;!9r%0vu!%Hwtm>G+YDnKEbnaG+CrALQ)QfeI* z6f#op&C`0a>NkJwymn~UZ4g#9-#>8TkMAshYayIDde~_ga$A1KP4E;;iAj4F{^heF z>AwqtlpeiOE&C19V>Wy&p0^t89)l;~Wo%&NYu?!0Q1x5`f$2)~qo7ssNPItr^+1DgbR?2jG9*0K6K2rviYx`dtCoPN7@r zMqW#ya|2+b8~ND){F%bz&VM)n`%>^-0azV?C8>?SAONlue7YZpN7g?IUg^!0uPJo8 zH+xgHil9$;dAzHmV}CpfvRVeVw< z!8jb=D}8-8tXeJIIV;{H)!N>SyQgoypY5b;q=UIzUL)sLKE7w3qJK?8effUWQ|#nY zvBa)c*|b`d%H(wL#B4>ySi_+FZ8D(jZC4v?#0h_uq7wus3_79D39{xTv*bu5Q=l2K z`QQSe9kqraL)hYOIt*_dY&v)Rur&GLLAaNBiu*zq|G%?wN4|S7r4F16D*Gww1AI4? zwOwSA7$7KW8?0`RgKdmC>?Unv%)}9tuS5?B9+XX14ND_w1cEI1+pHE`bPQ|BQS<_V zK>mO4{`|@B-~02YzkQq84b`wfN=O6JD^h~#lYS=s0diqB%mSbEiS#maP$p;9O8X7jZai)VuiGTX+!>LCE22ZXic1!v)PS= z_mRrVkvMg^ofCj5FSAj}jsaioy>usJ-nEzqoqOZ1_StC%t)UR(<<_!{RT$fJJ}b zTv1>9zVrc|(>mnQ8`)P-$IB<{#Y(FtKc5o}1~11J7UbvZau>%uPOB9~2D3G2MX?nn z4UNvF=1_)k5@$3aomkP!1d;+ct94jw~aJt7FF*b6B@K z5RLiV7FLhrVO_oBpmQ9=$3b))2;<<%anLvp7L9`xEBP0;4Mn?4a)KHxTJXE{HtDlAl7nO>5uoUeJDJxyle5YOBUX}0%c0g?R)&TPj9N; zcXgRRr+Q88wY!5S)`z3j6$`UUC(K?>=WL<8ui|)gxDKBeZ?N)u!V|YgV~WN!7RC`p zp$-=yF2z9)L_JXA0gDID(CB|j4-8N(sLum?JkaZbP7lOApsZOeGVM{C6s1WeG}S^g zGRybTl1eeWUp|_@uDXD)rpaOi-R7k9VRcy&M>yr|Q&Qcj-~H}`cYlBQ`kQaswB?5F zz3{$dmHzg{xqtlqcdtG_`0>w{W5frO#FuSd2qS-I{qTYxw)>&S56ylk z@+Z@;Jne^5emLfb!+zLHAuxM>Mwy?`^p&)XgQmZkO2@kD{ZO4spZZr?QNJJdWHeRg zhdc^F{J@;?!=N8d`k~Jcy?*HQgXjmr4;DWpXw*XCM(nwb7u#ts*oiZ8hF4dHvC5q? zpV&j?lSiy5KgfToIc2baeC)Bu@42LEVsUOsW!bmizA16L*oKLPRVN4SC$4dJKKO9` zxvz7Ii*s=8j3I;_PLdUn9{}{HCcW__zhX{Ku$79S|K1>Yz^taUEbZjsEcE zspEqr>Dyx}6x3UD=y2YsVrLE=xPh5J^fX6c#wFibxPGj(3iqjKYM;^)-b73`yN-}i z`;@(WCdgYqa!C{oQSeq(ZM?U3_MWSM@rSmyKS&GeXT1aEz=8_$-mk5{@*mQnFTRkT z{6?2>UkE9G6K3dHAe^h-1=TLdbAiPLoD0sn;IIq&T(H*#+g;E@b4w^dKTT|Q0Tv-H z)Z|=nnnpwyFbE>hIxwf#1#uTdX@-)1(giQmS~08B1&uUu1j#3jgeig_DU!-UhAgv1 zQi5m16CS~S_>dk#DS756mwavk-8`_)H#C9+( zL-#Q^P;E@cp#y2;6PzbM?iyQ(mq1_$9Dl@kOJ7P4vnZZWZ{^OoD8l>NGG!r19)1LCTK zN&6wsc#4xYEDPdAOCA$DdA&}nipI1=J|RGc>^!B1V|qBOhkiZm)x&l@^yr~k4}W=j zaOi>4BcV`;J$h8h^$^!XR1cya2K127Lm!P=^g#4*hDH%C6YQc?lDUBnTkl7i?x91r z823SKZN^xNP#*T;o;VSnlJ!wlc6JUKGX{B|fsK?-oDhvoG>^&2wi=3yilechxyb2N zskBxIRWyA622rQ4lq<;wHMZgsSRRq3{!08B_iooj;=#Rj?5m+4oh(@3~ z0womA5dkg&ZD&$|ha=Dv0Wkt)G#m5IM&SJj3`8J7>)0NF=18&%1;&yBI~jpv5%@_2 z_E4}ZBQPxjLaL1^N&|fnh)1A4)rNzXJWWgPjX*CpFBWCw`)JwIv;$0n0)KSU=CM_C zB&}nPR533m&|F-j94?*#lwl-Gk#%Z;M@Apf4qL{lfzS(S@-{K*e`+nSoxfkK+2p_E zt?DydrDeDGW!2PFI<0p|RlAlgYq;qSY5A5dU}xh+Q_Cufs-(ZBEa(T3adMMpr48ya z|ByFrP^Y{CiGh=SHNE7Rcz=mWtyY99}u5_;izxGH|SH% zu=o-_#^Ni%gt+gd?~G4HFxctagXsg9pw_Uyqvr>nj$K|ypO-9Cp5+zvDdrYUtn<21 z93mE@#%XuTW+9WBWA%2Y3U>zCIGYyFZ0?FQkANclp{gOP!5h1*wtr!?Cbuwc%66rg zTQgDE05`0L1)HR^(9kMvTP{i0G)vpI?1G7K93J%*7rUh|hQ4qka^Rj@q_5ITjj*Ia zs%78fe2A+uBElo$`SIbf+o8&u>7PQz7>%SL#QXeN4(+Tewmceh7ZvGvUqOgtb*xUX z3e%!7!D21NT`T)=6@TbC}3J|!T z0&gD)tU!_~I9mm$De$q8z|9xbS&<3ap90Eko4WuY-K0oigeqVxwAnLNVy@iFleCu! zI;1^xNS##>uYwW^JW?@e{3phli&$nZ4w!M?QQ<-C(|I4guz!Y+-wM?Mh~&stKYIRw z^3>!BP(C>+Sh**=)h-s7SdOfHQbVD9Se;Z&*w$B%EUB$z>n4Hg{<}B*=?4RE)Ws_n zKJv(G&*%39KMd`fJ+^j^w0B(jwY@)jMtXYv%2jRctK-Z~kL@$xWDRWZX@7Xx=Jn-k zYwVYmKQ-^Y2Y>gQbsa@}=ATV5yu&kQD+%4I%P|K(ym`9W78`yF{tRfc7NUXAhJdJLNn+2$}?9%01O9% z%%|Ssa}Rop7Zg^2gK4EqhT3kpHrWRprij01)Ox+u0tSp0WP58#!NDAyf~eYq;Yz#E}K#^j+Lwx@-(QeIi-{B5jM%qm@RLC=AGu5 zvuxjea_}HCo!4Z2*X97Xv`sNH$&S*B{eWMBw11ULCXlt_H2+v@2s2DpPVZLfRpAoW zG(Ky5R(EXtc){T)=#DwmTA@3p^@=4xN?@=A`br>P0vJu{4jIReBdjAyR$NLKAoVh$ z=R$PdDM#U%s()tqwkub5UH9&vr25|Vm#%+v;Q14~uDfM>&*mFvudkcFg@9`;I(w?nK|7+kW)pn|HA#J8!)Hd%Lz?leU@Qm}Q%Z zC>9LcOuAzlHRI@xFfsV-l71*X3006Sot1tn9hCkGAq`vu`M3sN!8PE3>Eef%+-3+Ff4aczf~_I6s%lhHZ3EMF-3U^QjO*#n%hg$OK8fp z^RykM*lwD!h~}N4>4{VujVTp~&@8NIfHtEjLfEx%s*Q_~`6zb(uLQ4@FqIailNE-=$0U1Yb6&H`O<>$NIwjirAnTU!MjUQvT*=^miupR975K97<0Hb9Cflvt7 zM@Y@;yJMZ|UNvJ@gIdjc#qmJK!{B)68xQgEfYA}!b#ndE-dk-Ie_=)6PLY-^>DZOp zt=P1~R6!WGshNs}R3#4+WkkVBR}`E0=Hr(R=&OngchCI(y*uyRy?f)jO}*tk<3m+z z_RN8wK5+YygRuUYUll>ti!Nc${_VG^HA}Rr-WzYZ#_#C|Cd(=v+4Z=?`6G&p!^j7A z@O8LO=8MH@!t;6qe^Fc1f*L7NE$URVR@5D1J)!}K0R|1wXMnf?FgkLUvQE$uQtua3 zT6h$<@~wP%euU`;+fW$n(%;~gGR5PlwyFFN$+KOig0Dpml`Gm<;5mjPcEZE-J|5zH z@GIhal4248L9N;8)1Da_skRoWpDq7bp8HOt#v|e>nXCwarIN78A~x$z-$X zx??sK;{)I37ptg+tNmvGFx7xl#|UdTqrk>ne4D}ke~%!z??)i)KOp_-M?aDVA7`$6 z?Ze-^)%^fB(Y|E!-MwJEW1edwcP;bC&tTS(qtYusdro@o#iJlT|0C(6#~;Un`ysa< z!$U8<^UB+&0xz^j4!kJ+aQc>?7b5?z!Zmsj=huUK)>YyhpPt~(q#~+NontiqnQjoGVDF8gh<3X z>Ils)W5Q;&kPtlwl-H)sE*s_`SFs0Mn5sYh`jdC0FTVNVt+PVHy2*V9wfBGj(3|ko zw^v<%!%bV+{$Kt1baxFRB;(SM_A3)vXl9GY$pfe;(v20JxiSKY}QJwxgm%1`!R=ubq9kg ze-mrkzfx|W<)(!oF9ePd{51schv2OcBtp<1g1sTw9)gu2s1AWI1o{wM@m&Z`hu~BQ z4u_y81kE9sM)SB3oDIR7A@~U`hUsOr((h809-~Dt>&g(+XVf_L6wOOFHJ{d)?#`RE z8206wjFNgs2;v25h$2lT_#4Q%Z9`3r?)&;yl_gV)9(n)nlxo)?Z~KdHoKgy zW{Z%A;9QbL;y9!lR`0f29ohQq+z?KpDLJ3RWW*sdI%Ov&+3v0|yAd=$LUkHRe^~ql zly*ys(q=4y{$Z-)5+lg&()pvP5Qyxp_$lf+K5|NIQR!_)1D|DgcsZZX>tyY`Rc+Mk zvi*Lsskx5xJN!(Zzsz6lZ}xBZ_xq3ePx(*#wQ_nMCdx^NG4ZtjtY25bVVVrK7gJSv z6k5*U{j$BmpHnA4#c^hLo#+RKfA~xM$V|Nso6&5H#&|=PozuF^W}k}FYxU6>qjhHb zVy8_HfQ+K?@}eTe?ogCzcu1Zb$z}$C}2y7#0Tq@S*ba_LM59Jub8 zlQ+PUb<#IbUR+%4hD)SF&f;PV+z)rk23_eZu*k+->3}pr<`Zs0_`7APHVy}*-gtfs8dv)5BJxt0YPQudTO&v$1&bdc; z1hKX64BhjNH1MCz`CE{u3uHjt=1^rB zP~OVP6?}eQW6bZD*?412f6KA%#u#hgoC~eFP@4+{x$t!^{6{XpKrS54h5lUFn+w}> zA({)-xloo1dAY#lLIqxDbK!I@9HVf1GqNqYzzpU>XD-BZLCggqR~h-RIU;jqH>O-e zM(8*sW1S?=2a`_D))7w5NiS=j>-lyM^>l86WoJL0?W=j^%Jby&f3siKA1yfuU*1$( zPzG_Bjo0PVrNMm@%cZxZ*QNKQx5i|{by<@pWy!W(#Mi^r*Wqq4ZZ~*T29-C<#uKF3 z#u#H}wNBI(>|7R9HfKS77F1_JSr+7Ffg=kJXF-1!?9GDhS=ZqAewZ4XuN8QRH3-@!=>jKlixNWU}X#T$Ou<|s?-C8`|;US*a@J7$R-@^}C3ZZR}-?e7?sLH90Rn&2vCFqS2~V4Cqiy zW{+rLpBCD+e-P8cd@XQV_*x5p*2245_^}oq(86t6*s6s|S}4$hOACL|!s}Y-(L$>h zmS_P)EtF_M(1L>&o;sj~!&>OqLa!D&wa~1EdM)H>foS2Z7EWv76wTdBv#@X(&BemU zQbm}!7NS~Mq=hgomLjMOHE+~D+BixJOqoAQPprDUe>9WQB5X*$7;=2(JgEwA{0u1w zf0UAbN{^lY8180YA$sJH3301|5SvQn@jA^9t#n$Hqt#PhIOc`JUg-D2b}#gJq1g+f z7fQU4=LLrsI4@M3r9i!@?0PR$d*Nh8Nx=(@#S6p>XS~qog*{&A^g`SVQCeA=n>J>S zc7$y+f5WygEXAcydaaqKzIWF|!yJv&)sTVw$#XGyv4n>_9vnPyJe=j>G!LhEILt#o58HX@;h~y`y*%{tz;se&E6Rh& z0~Ql_KozXw3=ac54DxW21`<5+nZp9c0rx)eK*|m{ z7HQi}&Wih7Hk-o=pi(*Xtk+{D@mQm^!^#v}fu&C6THb0^X|)#Q1ZvzK(p#J|BYQLE zi=)$W+6$*>dJmnM3ny`J1_jioh(O3Bg3~EDj1SV4Q1oG~NFtQh(_%^6;P&ouOQpVa)A zEDN0fBcDJVn#ixjT?U3@^*Yqu8P;Mp=ontjH^xkAR?pfSEfBQ8mlk-^0^2OG$O4rX zFk9ff1wOJs!UCPt(ScZC+5n9!z7J8Fe_CRJJ=FJDu)rDW8F4ZNqoj9cKnk>$(dfCD z#fKh%XY45MVJ~uUsv*Pgm`~h2^hspsqx+b^VYnCW!4a2defxLbNH>st_Wi8#Bt2b+ zxbTq;Vy(g9059t4T(;j}M`AK`7?@%M5|hDVKw>f&P}Fq9V?Jn%`D~m%9^)7!e^xnn$ezqv*1fz9TA&vD);02K(O}dgsxD%p9}7F zK`YIwb-^ST6i|TnuU+tG7rg6&=Ui~33uJM(nL2iya=}kr@Q@33xsr*Bt4A4i260e; zW7J!upTb1bjv%sgh+>4nfZig_rRjTcou zFX|~W+E+w7yksIt*_>Zhe=hY)50y*Rn{d~JN@y>J%b?_KcyUvZefV5+as@47A3L{- zJwzpRAX}(ibOushmssQXc(hiQ^=a9l;C2#ccT6@{F$Pw4IPhj~j(JroQ+KRW*Q;a9 zI?(Ao1UILa0}!rU@Ugo=CUC?hCJ)wycf7b(X&e+fSM&yTD&FW-~Rou0rwhpyc=-NQWafK=~M*3R&x}A+NHy4k&S&O4FW>Lpu78`Esl_K2=2I=nJNq2O`(>l!vGR_1@ zPDp;czy^vUkRPIJe~0Ur-j+T+eAVM$|7GYK=!RD5N79d_+=B-XGW)>`x!+x*fn4^u z^o(>^N=W;-^f?V9+XdOzP(SjLJlW>u%*|E#ji@8#7hq6u3q3KjJLtwKaJyNZ&ek21 zO`U>?m5rS`HJjBPW4&SlkOCMifW88V7XU_6bMWtMUg?8Af0cZ|QD#fJ-pP}|uv8*R z9*(LlHukmO{QOT}UjOkucimYP%IPe=>xY^j_8)p)TD^7M+Rob^+zEYee~hZlyx+mp z{?Mnl*A$NKRh{>VqTeuIQGGTcUga>TR4%8^7LS=tK@+2s$7JUb zE2!$Q%GpQye|+OSU5rnr&NsHDmfJ@eiD3#k{Y$!NJLu8GTPd%tZB!|4OdeCDSLdi> zi4j}+@H?)yiqc`_M?MHmnFh<@!GjEU|B@fA?OjwAu-A^eJ*o7(dh;8b0%v!*vtA;p z^Ej1*UxKq-Os2p@@mKc3F@7#+vzd6VgqvV4BNKuKf3=zfS+CAq>nqH`2oPJ!||C6?lZ~5lG>#n`|zJVh@Jt|%I-UE`cebtY(4>m0;I?{d_ zH*I0prBkHd*B_U6H|ZaVliu=&E?@G>vrV_Je~H}n%_ucgmz#GL6Zn*Pdj{LAE zucmq4Ks@z+$5Tk#Uh<9jV;AbPZiZ)AjhWB#xt)wf)@HRX4a*t5sMK;)t5q9q{XW>^ zgY7&q706n^uNjUzQHvk zi*<7!k|r@T?v#!W{r#DNq2C~H^d4kx+#ySMk~ox$vctYRrD?;jrw`rATqQF}1+TlP ztoNk2LFaN=wO%h{W&GJ%4{{D|rFM}Pf5l#{mhcw6hUMADn2~3_E-O7ybr4(H%~^JY zK1MyC(~i++{cxH_6(AG|nUfh}p`zjpqhOUnz@@`4izIO{@>SdvIwENd-z6Z=1QTCV)R)`RU}U+~5_o>6@SYt?_pF^Qx;$hrY0GXX~deolyuc7_U&ye}apVo*tw0 z)Gw~%o!Nf7N#?bv9H<;dj4zu%u+0yP{7~r!vmeg;;iHsi zyhuIcr-{_NzL$E53edm*yy-+#2(DIzrr1LW^%cGp!V8%Xa-d^~Hbj^Lt z*aP5#$@}2hy(pxgxPR!ke+Q&Kdict$Vnmsoq}4#lOVSNB&~#1moiFJy-%sE9$|K9g zFtG~;ul(9qet~;;Hjr#2p6pz~o|}s+D>wBLSOE%71t1ha=1X8QYp@(c8cEx7BDM;; zcV75T7%y+2%1i1<8mdt04YBu6|M_?F8)8+kQ2Ksp!?n|wxVMGpe{ATyDX#?8kEfVN zq@PKH5P%w(4L<2(>1F1p(&N$-lJl;a8&+{uI$wD0J`Nh?b8fa8KB4C&Pl{VrxPbI} zn>FKbM6kh^HaKa60UPY52X4d$ZJjo#v|)eYBO4@au+0Y142UqzLbxe!*`RMEP|yZv zZ1A!T_E5MWh08Q8e~z>*W=J2(@yv+tNQ^ps`DFO;W%PlIJcs9xOAFvOI){Gp7x58d zFj!G!4+MullHnJr3%J=Ve~`fJ`z{DC1Yvs+^g&pUk-r9Eeh{Vwp(qGGn)*->b_L;@ zAgrWWWfbOpTI?q@9bu;R1%c_!a26LbJi^oOnkO;<%)t~&e=>HKg?)8gRL%GQM-kYI zfFOd1g80}9%kJI1u@;J**rJGvCQ*AuJzHCB^jwYp?#AGJz4(xp+q zdyglirtA#v-zg_HXF}5&zrQXS>7V$mea6kyA^r6Y8!rFSEAU1?t0oVv%4WZqH+}KU z?GJjLkH`*ImUC{@=xp_E!MbuGlRkXflD#!I%;QP+^Kl+aKOA0`{;*cifJOS`GAGEq z>y2XX^ci0F!{$9}-zhyJvP!k;{pyZ$$1cMgT)l8)b?``^hEnWuICHxPE^h>-X=?=Jot{JZhTt{?Fm9*=@tTzn-c#`%SAU z+b-28C?DJ4UX9}}H-c+7SbtC*8uu`E%Z!PO^{I!~J{|TtF>T&P*7x3z zoS9ViWAwnU7wk#hnb6}= z_|m6m7iT{`pr4R4qs^&7jr^mNlCOEx7=N_?+d*Hf{@vLLr!@Td zs9}@KqjOp&bPBw>zVGsk8NZbMV~3aOZX2R1zx36n`NQ&dUp*{@E!=*G#Em(eU8VN1 zVF&Kv|LvSF6}l?6ihb<)Qo|(Syl8!=E{|tlHYuxyv5zO6fK+7MfmH$Bh~} z`qhz2FYNlCQJ2?^9{5kP|Fe5DkFA-ifA?tQ!y_s0x=tK&Aht((g3Fum3sI5Ezbn3B zGy_8Gt+jvY{j$;CvawH`YPZ^u&{3IMy659dOD{%ko;=O_QR(>oYZkW4KAmrqBR1-A zv)R$M>&4_y)rke|29H1WyVSAl{3BkU3)aMWdFS71cVH)J(7Z=IpC_9;OkEhN%5-Xa z`l`<#eT~{(J|=oRpE2jX(5kb}Sg?lw``rL5u!TanUki3!G zGjQkP&!M5!@)e&H^|KaPx>#JU)O*P$LEY2&_TKwm!QtbN-Pm@2{eHK(y_}q5Y(JeV zn08?6jk8B4jUV-J#*quX8*YfZaBBR-$M(O+pGdVAGJ=ok-TUNvrfC@P zq>lfw%DvOW=P~X}(}Js728LVD?|O@EIAEtsLx+al>m2vk)#F?G*30(Szd4SwnZ7c4 zYvQ%NXtzOe2N9E`LGHA?NA;9(659 zwy>}MS@(OcZKGD}dhClCKCs5gZH%RFzhqV73SsSv_Os_z48LR3ue0mulN;-e8+s>e z!=0T~;nOZsPVC&FpGuZ_Qi3-fG*r)qhTV)gyCTSDoHsdV1v37=?9eyJc;c z9si`casTSRpqFhM?P>gH!QM*Q0WPhpXE5!r41Q5#Zp}J-*NXOOp1ZH#95eJ->`td1 z@2aa$zkawTs(urler~dRWR2*J`EReiWqzbwdU)xkxb>fY^^`m0l4u#;7R z7x#p_Y;Tr4Z2vp2suzwZTc5odx#4cki-7e#4%`mtUD3M1t!zcTR=ZOhJ0^e2nbo`2 zv77}l84>)Ob0aPV-QF)8>r{VVaQK%NHeXkba$RtL-OnwT=9dc_)FA)L^TqA?@mYtf zotiS|TJ?$9R|5Hdjzi|VmyP*&W^6=ohTboSkXWBaqUvj)%4_KQa@l3mUA|P^({%9u zM8Bw2>ezPm2W*~l+;5QgquR%lQ~TtUX^}N9-6sE}=c&y<%gi6RY2k|N+ugjA8&zBM zwP$pXMZ@nq9ogbG=+&Ux1NL-VHR^VD<<{4d>*jMxKJUfMS1+H{;^wK3$DN;b;6RH9 zf0AA%>fie9IK-+0-(36TSUIk#cC_90U~b#p0nawiuheeJC|yr~uT3Gns}9J%+;#Wq z`F-|Hw48GK_|bvC zzg0Zrd;Dm`!2EFGUEk@y#TyUKr{3$YuGX*PY3Bvk*X3;dq5o5Rr+4nC_NV{6-M;bn z(%QfCI}fRx{dB^fPaEs!<+uI%`R3!hLpK%l@6b8#kIl3$Q$MBd8F_nq&tCh^EFnp~ z4z<;9@krhixx;PDu+VGspSJ5^d2~tkAh$n}FPmdpIQ_|YKCx-S$9-JSnA z_oUgj7{Mh|H}U$aKNd@}vM=h7j>(HUzPUs57-vP`<)3XEzx4j+gI|Yz|9o)W|Jh~A zlbIju&2C+*O_hM}0c-Abs@BhLV%~{mSG6a-PB*EQ_oMHU)Zp1`G6J`b>3pJIt37(I zU$Q#lLW9R+d_UAXf22dmzN@^~XVk=)OhgR94VR)>#dCpZo3*e^WolC$EeS7yuR&(y1r{Mu`=!v+5#X4j_f z1Kcmyy`;AhF7!(Ac&T@K>h}S|02- zVPAd^|3{i<;U5a>g-v=e^Zo4eF{whD(+}R&uE6i_8*5j8-u>voa^=`w zZLYn!`aP>$g)bGR^!&H(e&t)QU(3|-%XGr{l(hRHzOEIk#!qOS{_Or*y;cob8Em(=`}08o?K`L%R(f#GDqw@{_Swma8wxh}tfhKi`$DU(H-@hY zcDg!n$hFh2vi?+i;hC}AcKf~aqpzx(cj()XOt!PDLg9Z-{hB<~#7&~tKSng}= zgb^`Y);D(B-#uVvk9*wL#TE50BLXzR&GKKnSoRD^zjOad!j8eYyT)}4I+l!InlyzcETs~jF4-v6$jQ)=wkui9#(TKiWX|8=3h zV^Hqn>$zcB4-#tcXuW*K(w&XH*9XpSzb-1OPeMb!J2x&QFzwjSZ+7mFGv|1R=Z2-v z_U`!DFS7lF{B*mRlTrIrM;A{&*-?zPtK5JOS+hRyQbB4^JgzRdy+m~$| z-m&qgEvfNe#vVU3tWSJI{TmN|cJeyzRvZ6))n8wkPdu|TFd*${%YZva&J4RSgK5{x zK{znK`_`#bhxED}ntu7kJ1)rEyYk^9yI$_PpZg|#^5M9+T?cn@^VKZ^^VdZzbZjyE z*2CDXCqldRYCWXvw=Z{eW#^VUGRuZP)$l?1rRc%`+If3lAG0Ve_qz9+!w!7n!R?vt zCN(ZX{dGj{h_*LclfKD6$CVxRQ@GMC ze!-1Hjppx+tf*Mjz|r@3nywn7>ept)%YPWBRUJLuG8#@!s696R(0cu?+sFCDzsHx_ zQ!96ncfZCHgF5zUqjCH&{QN|xxeu1x-)S4SQfYI4?w-<>X6*_2*n8oaZ!Hqbu-01} zsPyj96|ao2oe*3%?@5a{xt^7;l-agj_a`B)tF3q2Z`+nedo0^}GGLnBgTwzzK5*$# zN|fc%)w^P=Z(h^>V9oW1t9FcG7mW?k?{S$uY?njnx|iNOz5nt3Cvvy*ga*4S$w4>>FCGJBeTvN-2FSL{M`nJA0?fiKYf(<*n$N0?m3s%4LdOAak9g} zx^ouZS;;D+hK5zH)BShLK7D6<#|_Nm#wxol4;%WJ?O2DKFyMsug8TIyGJ|5RugCTs zKH_nj{?nYuQKMf6w3{5iHf|Erk!0c<&}=dvUmaan+_(Gmzh}Ewsu*~<_Lx)Q+D9!u zKJ3swxqDo--eb5s8$bADIIbMLe&y$*Gvbcu9=1Q3@}tI?z?{?T<4%>za2Wb$b#IS{ zaZNwoYjNaY%9p5=+^vVhR8!px!aE*3_I1AV&I9+au8Ey36`=3eK7<-Mk~FTb1owL4(cZ8vAz&^x;t)qXQn ze@gTENz=(08$7np46igiNPo2E;D6rKX`R3}_C2urNrlDy-SmZjm>Yq0BcfIw7=O!y z%iPRn+JuiA@UY|9Cab^h=p1>|GA3->kK8uVZ+1-CQ~M$LI(BMo7n`>=x^;=O4SAoH z#H_a0^t!$-Yu(!AZzF%`gF3zIRr}(Amp}h)_kD2VZ=;)y`8u-Ap@fc=-Uysid;JP) z?=8Q!Y1;Z8Z=1qwAHKZT^`QrKjv4F4;T3GSxRAto-*&HmF{ZTpg+3|$XM1~jUej|w ze5TEdz1@4?);a%+J=bSoZG18KoLg<8&v~&HEv77t={4u(LszodX@FHu%M+DinmA?N zRZn$eZ+bqd|FO^P)QChevBLcFvlW?|4e);4g2AF)hB%^U`M^Us}jqMw40$SlW}I&zY}id-`{j7CTU}(%2Ph2 zBoB#c*`J@5mqkWgB?Ah|YqKJgU){c$xp~60C*M!D8&Y6vn{{Zw?}?+@eb`>9sxtq= z;&Ra|%8k|!sv14T_4ncL7x1sz=ABjMPakLLZE?Qo)uykSzCU|)#<>|9i*--Px5R&b zy}dZ<)~|sdTGsmUW!vuf#@8=>pEXH8%GYUXodSnruYy&+Ri=o)RQb;=oMx6wVamKe z6|WK}zF#}JQr^X*lb1Y5uNds;<*9L)S9WvgP3z4YvS+s+6%eXVwEk$5d0cVGK5=~J zoTzd$@$o|G(KZx3>c}J^J-2bXUU$eAqyimAM`{GxB`olXahOZ}55bx7(|;+kYJTb~T-Z^*%Cw#EG8!?XvELrshST z{OiWxo+_VXEmD$Q&n{THd~opRNtzH|SQo!G`{oaaU8$Chs?2FT?=^98zV5qM-y~_! zG(V@HwbKKg^4e#gIx(@O-?*@uUV%rBK6g0#ePF|PCuViedsVv~;cL7oNc+`7W7R@; zYf-61f0i%melg+HlV=Pk%@BQ7jzvznbj2siXqH7!FmJ@Vd@GZxg~G;CEvk5) zG-;vGkU2{gi=$gAY7%~#qN{$w_bEZPjWgcH=O1(*@^o(C)HWg0B2I<2`JNH-ceiQn zNL=!Utd4=pzU_GW^=sOYV|%`RNL-ea@cu@8HoJc6<|mIYKVO@)e|<*XsnvxNB|C)9=>jjBD7W|L&D~rs_?7 zlk9Cbm)7}upzZg9fZfm2g1W|eE$ngTQEt!Puh;!~;%yVX;l|gSnW~)$b&uDXxxbe8 zJ^S>1OFbH>&P-o=&&{Vt`%*!Bl-!U`zwJ+V4zm20%XIv?WOU;R%@0hCOS%1P!lm~A zx@TUQV3{c8-CSvt&-O`tx8_Y zn>CXTZMo`mE%cY0FioY%OSaSIwI5}Zmn;nZME-XE)aygX6#apkNvWH%zJKU^rRur5 zS>Iz?F0OiP(Z`T}>S+_}XZ4?j?^x-vs{g2i)=3pQ9p7%1R9kQ9G4i|h@h9)fg?`Lh z7ISfx@63m*`k#HqUwxl?E30Czf5G&p=U4get);)UDQj8!ykA{FM(a*n{*)>x^Yi`f z+G)Sfot*J&+vv>8@5`s?Q%J)VifXE;gC8$^ZZmD!sftUg>Q?-knck+r#@6xI3zrWy z*8S-d_KW^HQTz6g_`88P~=(*oX(R|sYvch z#U-L?tq6=i+r|2wbt#b?>TT_UUxx2Nde_@}E^%0f??GDE$J(eGt#)N;J>QRAuQO^;ent!R4WJhg%em-p1_OpgMfCIrz_t2I2@__Wet z3KND}g*nvm{;L%oEl4a;^snTp(a>*h>Wbew<8Q5s{Y zs=S70jZof%#YbOMG$rlK$uS+Jre{`m%lpA&hyO~I29hZQR=v>KL_x~TAt7mp}3rO2$KirY?F*1(&m zmK6-kYgy5Vv-Fr^xRr5mmjuP$=mbT#c>a{4CB`KxPLfeu6-;TB#(+yAPlLz}M8S~X zrxlMF<4hWzaVAnXNinOEi7B0lb)A8APmPW@uJ$WQ!ImnoGsp{2gN*UpNH5W!Q%o|F z((JqDGBy+zg29{x2rATgl zQdA*|uZm%%SvB$escu^K_iiRAVtMP=ghP0pL8T)OKR~y| zZ$*TaR$!GXaZMMdGFkasG1yY81r2LDgGtu{#b66HuQjr~p+K>kB>aI@)%Rg+NU}5I zO#1y%gjuqzPAM7&y#AvIw$Q4KORouIhFh>|&Oqjxugq{OP9rLL<4V&@F~OEI}2u@r53YjjiZ*~vlXk=f_}Px zZp5(+(~IOaVak!~VW9E;Cxr_kWta#{tx9FofXbw%B?hUr0^J?Mpxu@jG~XJ7iWu{< zVnVF6V9cl)Zsd>^6H4{woGs%)IBTXWVHDW!K7;Av z%QDr-2?Y~msa3OPPB{jgdXz0eVm!kPx8zujnXhIxOsFL*6n?&J0}B79V+<=?(=8kJGWpV~t78WEc+lIQl=<>7V=b{Qstt+5Be zAM7wB%E3JQXnQ8m@X>-3b!2)0wj$r28DpWvR*oviEGmuPx9ym!q>2L*MDiW56!b|| z7NqQPp!=hOF%kzyCW6?OXH?{%BNJ}P33Ssu%QFis)H*HIzAEHOdB_-htJK1DotP<5 zT3FX-yh(9l!mvf663(bvd5|1X0qUX=sSq(o6_Q?o=|W-9+Ar`E_(~WZ{c@?pZCVQ+xqFg~83#$hW z!LFd8z?JDz3Id_NVOk|-kfn-Os!i`oyDR$ zdQ3mEaHMgcY{>L+Oj)wC9y5|Ie8dL`b?Y-tNX21L&|^axM-zP;>NEaiXnn@RNP8vY zIHecUl)S0WD9tQx!#~E`XXdO2(H&DH)|^g~8VeniPoeE0alw~TAPHLtxQK%Uo_)K1@AxUZwwph(5Ee#q){8)T0 z$I>CtHv^3iSP-t!8oB>0@I0j36w`_z9dt?Du)Hk_j;Vszzy3zK?E`NIzodxi;Sbe z6*R+txg|d-d_RTnD$6)p!C@#7u)=j%UfIb6r4Gd;_dhx;f0({_sDt(x-Orc?z;4oj z@hQ!*n)r~23W2_6G`%J)wyEXyjY*#v`HC>4MX0ose#`mpj z0#g6&LOgtd__QwOTsRFz6sIK?HiUQ$In@da!-lGsH)hU783Mjr zwVF4zveuXaR^{O&#h^Ka!K!Xk6d0NZd9#R`D-sU_o!#32Zm>2}a&n;!vnWd*zC?s#ptd8 z8SKme8q$TSNM?40v%F5t46s_nq8mkNjE{j`@o`Q!Mj&UqGYV>6Er_B!-WqJGe>W_< zusg$(X@eMRa-kd3lGygZRDFFhHm3(xobnFtV`_KCjx41wU{4;TZw`DVjcY>d7=G6$9{evnOC{=~I_pc&gkRPj`D^-A(kV zX8>THeejeuag0Lx}eevYe50k#?iwTbQGjl#H2p_fmG4q=sI0sX?v9mvRHliQq76)L= z2l|vipT_jZQ=?#@f9{WgXXw+o0f6}q#M|%m>D)l97Zr^4nup-&S1@3gLhyFlKs>b> zgq5H5h0Om9#01v{VS*VUc{kjHHy)Y6QdZBe9$viE*b#`(&$5&Q8b9gIt|&XW-6Ie&HAGm ze`lT-j8mZ$6Ofkiq8fpw(*nlLlmZ|;Y&5WpX(~Gg{B~Z# zSUU^w`p}p{R6$Gg<2^%}%4KKOiOgmo(`JeoQ6pnMlw;nRn(zvH!lvo$78i@d%5*3{W#A-nVyz2CkOr=7%Y)9HpFe;M5nWnMD zXyuWOa>Z%AK7kS4=@wx-SdD2rOyr`}taqT)jbT zKPQ^R=FDavXzl#+<#` z68k7dtjepDDq2}+krC7V6R|H;B!KgxE{IIGMle8<@7Qi>eTE zPU4}-#@f?%3UDcV&V{(hWvF%i***H6c>0C5}S=Wp+-0s47lZ!K$ zrY>3-hn5nJ9oAqPEw53c*sj_dJ7CZPku;de_~V~qnea@)H{$7nd|C{S92=Eqiwp`R7!jy~GfYJ^Dp=w;6|#E(+@i@$ z{Fo*)@DnhbY04RdN`(uTZqO*Lh6>wEC#FZsx+pa^m9N)lL)t7PX>hA%M~OTe%?$Vl z*Fw`QOZv~DQsa5U7P9d9bQQG9v4!M-2GWNrqcwbQ4&(1?Ml-u!BN{j>ZjD3cLMOC{ zXM$lH;6ka9Ls+VkM*aqP&V_iiqM-{@JhETIR5q@ZJdSh_;rp=-u0JW+wI59_) zOyD_dp~r?*5j_pw7J3G~FRroU=2LdfcxFqXcp^!j4@*JeO=c{{{`{Pe{o$~=#*n}o zX5RqwH8KI(Eh=BU*53 zHJP~@El3VZWxs~0qsMs#{qc; zPPxdjQX+vTBOI>WEN)^K!`N7eXzRMgP_jgx^o;p0vUH$AA`>_;wUjJQtCKFr@j6y5 z*&r40bh7!7@tV}MnED~$NqNGInv&`Q1JS{tN)iY(PO6d=j~@LN*A^8I7giER)lVn< z7oya-R6O=eA_a`qsioWjj~;lITo@UMBPabzKe5$h0#?k2~z=2G*4JKpQw{sKgJ65h`0EB zdKGj5F|q_u1?~`MO29A}n_LnGJdIhu&2CJE#7ydnH~}gn**c1c17CfKMc}77xwzCC ziPC^zTwst*DByxbNdmDjr;%{15(JcDW<0&o>#K10MyfOz3}KrQ3-KTaDU229(LMb! zO95kbGLscq>{CfRm0sjTdi9~?U{p3zvjd(W-6k9%$y}3wcvHxonP{DcUgs#jhDyg8 zZfzLkUqm&wPD&vVWy+=FumdG0G?>l|JWdW1G@JwvV-a1YV(@;^Jr%s00jB<)m&@%?gIQQ54ZU9|u1p4Qv!o zSA30d41jj1>D?E}V05uc!YH0JmZKIBrHf!;UK*Sz9{M!CTbaM~crQxh3eKfCneJ(L zPHOu2_j@WC^Qd8@Ap|82a^aHnV=NBSB`%*LO1BKzwjd4b7_5~FiQ;J_+l>qmCAn;2 zUR#J~a`_ZdYFRj1mgdLsFX)^~CZu?UA>0&k)f{R>*)9s$+LFYm^+1#cB^aAL#T5`D zrM?7s(&(y2?j`kMa6($C&jB7zzdThXT)rB;3~2(7!Ms*#S-_KePc;gb|KM2ENw$BeoEqDtkxJ^ihBSw z;$$vGKs=BbA_nss>COO8wlK6)BiVk86^jYOMnzuiU@Gd-brhvMa{_7s$asQ zl15MTR|`u_vqRE|2>BASHCh!qkP@4OpTSQ_fw9mssSsH;&OBrU{?|sKFp-!Ba(NU8 z<~2+;vWMbW~jG`tEKuSAgmquoV`v^c|s=i;Fpc(TX^7+>6E z4L%t_sIY88Q5r{qr<3M&P;*%T0gRQlvH;Ua>q5W~lVqHrr6k)DUXbR57_7s!Z;2F8 z;>s97IVIZ?L1XkE#hfs0)=6V4V6u7-FkYJR0wzjBCSb@gqy&oSlNWRJIq zQ>hrD5f9;C2IGsonOSE<4fl(GVXMov<-SY$4?)TVE9~I%$g|~~@br9EqUk(Z z)iM~`@iG`%voe^}!NPT+dX;kmRgeu9&|jBMh-^#_)5;k^;VH+%Nv@=W3mJ%VP6VBt z6A{I@lo*kfGXnjU;}ykAa|f4Ki?TBqzyvubBE8ll*%BR6B^eC)rwqnQ8PW5&-7M!s zM^7}RiwLr)jAn~8gQvxWv@iyYm1TT5=>yT!{}oG~SX4n$Q$#LYJlUc6m{6YUuxQ9j zGc=SjvSbW3dXZH7m|_%)5os~X!vo7WM#(7W4xL`9?`Lu2quMdVH=VTYfC5KWTLC5y zJpjpy02Wt%q#*^Ja9LD<=QE~N#p4@pVMz~%c$^JM561wLCw@53lO=wv2FG9$Ey2aH z5}Rd+Z)jx60xM31<=nxG%eeawFOD)pmfPcmP}=pTwY*-Iji5;_?ZpBSCu&koIC)S; zqf;wQFK|~)RvuxOO!-`~_y(cMb&(!p$`(d?DTC>xT_heyNV1feg=LgTO=x^$d5x^L zV$lziS~!cMTDCCiU1{=!PPnY7z-f#uC!%dQy^K3S?j+GklLcTF{ZHA#0xzq}SV550 zWjIkWcXo>68!HwDy~1o2J1471&=Hk(FL)MRDQV7*Rn&d4ZKB3#iTH)HBtL2 z)Gc#-15lJ!ljwQN4ucW8WheL)CaqWjgT_gT5z!tf3De_93Km)ts1;F>NVK2Aq%BIo zpf$3wvNRQUtk8#-;2}&yk4nZjT%AI~B16jaD`Glwd|xD#|u!+l6dsUp~!!j zT4Mmhbx9G?hLHqJKxD-i+P;Fc#}1e%C6L2yJJ}j~G_9nr6^5-U);%(wvuNbK84icv zvI%k0AT>`8$3-$?P+?HTG|1m<@9@g#en_MMn6yj)o+$Nt9NI)OMzky%?~?gwbEZhQ zOed7I=^{}Ov~bX&l@7+af<%KkWN1>`MmH6MrDL_|HA`W7h*jczFc@t#DIyF?Dj6IM z$V82sG1Be@+N7dXfjL-{p}9!qUnqW_33mDCr_7=Zf~psD!vNA>$6G?y{{DX-+Dg4>_Dvf+DMz^;dBECqF1eStL_J z9Qc>$GC`6Y)KaE|$gQNF5P0~bY)T;bFA_gJX_HcoZw8S11)Ob2+Yva)lQn7pc->t&{cB0*+iB91C$`hj~f zGRfddhtzUJ0e{$9jAH}CXx$m-E6V?H0|SO9MFb;KdlyBdqcS{=eCu#9EmJtKT!LuG zADw^nL}e3#ZYd16C}dJVBeBGUbUvM|kqDTq4Fwpd)ypWv?LPU0qRi2V$S0+E^sbSV z5gk1%kuU{su?$NtpTLgdmDu>al?^J-rB#7%hoFxCl!f>uKM4j}06{o`$U)hA5?05}$xSuVZkHZxK zGtAWA03xEf8E6W57~>1Xj})`ithzP|6VpN++5-M=B4C!JUHqIm81$-NlzZrNaX7�TxpWakW*O1w{uReF#Bd!7R@pA-WH-rh zwy2YOC$#Tym#^f)fXS|i1BR1f86MYFRz4#RNFx;ni_%NFxOpqf-O$lSjYDo;WSZ*5 z7A@etaEF0w=GTl~$`<@^Yp^A+Zmw;GBS^m{HjVzjD4sz!J}pLuG#@%RBrI}VxTlX+ zY^m0@YSvOMH1lf-s#*!HnhRVjo^OW3kydJzO_L@zkz<3$jGgE>W^kwt=)qMjo0>IS I`nR(AKLwTrvH$=8 delta 187071 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πrqvd5hex+M5E&EH+JQ|e?-v_TJu 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