Standaard routines voor call commando's Erik Bos, 00-00-00 ; STANDAARD ROUTINE VOOR CALL COMMANDO'S ; Door Erik Bos ; Voorzien van uitleg door Stefan Boer BEGIN: EQU &H9000 ;beginadres ORG BEGIN OFFSET: EQU &H4000-BEGIN ;omrekenwaarde DEFM "AB" DEFW 0 ;geen initialisatie DEFW CAL+OFFSET ;begin statement uitbreiding DEFW 0 ;geen device DEFW 0 ;geen Basic DEFW 0 DEFW 0 DEFW 0 CAL: PUSH HL ;HL wijst naar teken na CALL LD DE,TABEL+OFFSET ;begin van de tabel C_1: LD HL,&HFD89 ;PROCNM bevat naam LD A,(DE) ;lengte van naam AND A ;wis vlaggen JR Z,C_ERR ;einde tabel als A=0 LD B,A INC DE C_2: LD A,(DE) ;vergelijk naam in tabel CP (HL) ;met naam in PROCNM JR NZ,NEXT1 ;naar NEXT1 als verkeerde naam INC DE INC HL DJNZ C_2 LD A,(HL) AND A JR NZ,NEXT2 EX DE,HL ;HL is plaats in tabel LD E,(HL) ;low byte sprongadres INC HL LD D,(HL) ;high byte sprongadres EX DE,HL JP (HL) ;spring naar dat adres NEXT1: LD C,B LD B,0 ;BC=B INC BC INC BC EX DE,HL ADD HL,BC EX DE,HL JR C_1 ;probeer het nog eens NEXT2: INC DE ;sla het sprongadres INC DE ;over JR C_1 ;probeer het nog eens C_ERR: POP HL SCF RET INIT: LD A,(&HF342) ;plaats RAM page 1 LD H,&H40 ;PAGE 1 CALL &H24 ;BIOS routine ENASLT LD HL,&H9000 LD DE,&H4000 LD BC,&H4000 LDIR ;verplaats naar page 1 XOR A ;slot 0-0 MSX1 BASIC LD H,&H40 ;PAGE 1 CALL &H24 ;ENASLT LD HL,&HFCCA ;&HFCC9 + pagenummer (=1) LD BC,&H10 LD A,(&HF342) ;plaats RAM page 1 AND &B00000011 ;primaire gleuf CLUS1: JR Z,CNEXT ADD HL,BC ;tel primair*16 erbij op DEC A JR CLUS1 CNEXT: LD BC,4 LD A,(&HF342) ;plaats RAM page 1 AND A ;wis vlaggen JP P,CEINDE ;is er wel secundair slot AND &B00001100 ;secundaire gleuf * 4 RRCA ;secundaire gleuf * 2 RRCA ;secundaire gleuf CLUS2: JR Z,CEINDE ADD HL,BC ;tel secundair*4 erbij op DEC A JR CLUS2 CEINDE: LD (HL),&H20 ;zet bit 5 aan RET ;einde initialisatie ILLEGA: LD IX,&H475A ;Illegal function call error JP &H0159 ;routine van Basic-ROM SYNTAX: LD IX,&H4055 ;Syntax error routine van JP &H0159 ;Basic-ROM aanroepen R_BYTE: LD IX,&H521C ;Lees een byte van getokenized JP &H0159 ;Basic, resultaat in A R_WORD: LD IX,&H6F0B ;Lees een word van getokenized JP &H0159 ;Basic, resultaat in DE TABEL: DEFB 6 ;lengte CALL commando DEFM "TESTJE" ;de naam DEFW TESTJE+OFFSET ;het adres DEFB 4 DEFM "DSKI" DEFW DSKI+OFFSET DEFB 0 ;afsluiten TESTJE: LD HL,TEXT+OFFSET ;begin tekst T_1: LD A,(HL) ;ASCII teken AND A JR Z,T_2 ;klaar als 0 CALL &HA2 ;teken naar scherm INC HL JR T_1 ;volgende teken T_2: POP HL ;HL is pointer naar tokenized Basic achter cmd XOR A ;wis carry RET TEXT: DEFM "GENIC",0 DSKI: POP HL ;HL is pointer naar tokenized Basic achter cmd LD A,(HL) CP "(" JP NZ,SYNTAX+OFFSET ;syntax error als geen haakje INC HL CALL R_BYTE+OFFSET ;lees drivenummer LD (DRIVE+OFFSET),A LD A,(HL) CP "," JP NZ,SYNTAX+OFFSET ;syntax error als geen komma INC HL CALL R_WORD+OFFSET ;lees start sector LD (SECTOR+OFFSET),DE LD A,(HL) CP "," JP NZ,SYNTAX+OFFSET ;syntax error als geen komma INC HL CALL R_BYTE+OFFSET ;lees aantal sectoren LD (COUNT+OFFSET),A AND A ;wis vlaggen JP Z,ILLEGA+OFFSET ;Illegal function call als 0 sectoren LD A,(HL) CP "," JP NZ,SYNTAX+OFFSET ;syntax error als geen komma INC HL CALL R_WORD+OFFSET ;lees adres LD A,(HL) CP ")" JP NZ,SYNTAX+OFFSET ;syntax error als geen haakje INC HL PUSH HL ;bewaar pointer achter commando LD C,&H1A ;BDOS call SETDMA CALL &HF37D ;stel adres in op DE LD DE,(SECTOR+OFFSET) LD HL,(DRIVE+OFFSET) LD C,&H2F ;BDOS call Absolute Disk Read CALL &HF37D ;lees H sectoren van drive L, begin met sect DE POP HL ;pointer achter commando XOR A ;wis carry RET DRIVE: DEFB 0 COUNT: DEFB 0 SECTOR: DEFW 0 |